Skip to content
Snippets Groups Projects
Commit 5d7084d7 authored by Tim Repke's avatar Tim Repke
Browse files

added option to define achievement conditions

parent 0e91e7aa
No related branches found
No related tags found
No related merge requests found
......@@ -2,7 +2,12 @@ function Achievements() {
this.achievements = {
'started_game': 'Bestes Anmeldesystem gestartet',
'first_step': 'Erster Schritt getan',
'some_water': 'An frischem Brunnenwasser gerochen',
'some_water': {
message: 'An frischem Brunnenwasser gerochen',
condition: function(context) {
return euclidianDistance(Game.char.translation[0], Game.char.translation[1], context.x, context.y) < 150;
}
},
'saw_devs1': 'Wilde Informatiker auf Wiese gesehen',
// TODO: add more!
'achievement42': 'You just found the answer to everything!'
......@@ -54,15 +59,30 @@ Achievements.prototype.logMessage = function (message) {
list.insertBefore(newElem, list.childNodes[0]);
};
Achievements.prototype.triggerAchievement = function (achievementId) {
Achievements.prototype.getMessage = function (achievementId) {
if (typeof this.achievements[achievementId] === 'object') {
return this.achievements[achievementId].message;
}
return this.achievements[achievementId];
};
Achievements.prototype.isTriggerable = function (achievementId, context) {
var achievement = this.achievements[achievementId];
if (typeof achievement === 'object' && 'condition' in achievement){
return achievement.condition(context);
}
return true;
};
Achievements.prototype.triggerAchievement = function (achievementId, context) {
if (!this.achievements[achievementId]){
console.error("No such achievement: " + achievementId);
}
else if (! (this.achievedAchievements.indexOf(achievementId) >= 0)) {
else if (this.achievedAchievements.indexOf(achievementId) < 0 && this.isTriggerable(achievementId, context)) {
this.achievedAchievements.push(achievementId);
this.updateStatusBar();
this.updateStatusText();
this.logMessage(this.achievements[achievementId]);
this.logMessage(this.getMessage(achievementId));
}
// else console.warn("Achievement already achieved: " + achievementId);
......
......@@ -41,7 +41,7 @@ EventHandler.prototype.getEventOn = function(trigger, x, y) {
EventHandler.prototype.triggerEventOn = function (trigger, x, y) {
var event = this.getEventOn(trigger, x, y);
if (event) this.handleEvent(event);
if (event) this.handleEvent(event, {trigger: trigger, x: x, y: y});
};
/**
......@@ -55,10 +55,10 @@ EventHandler.prototype.triggerEventOn = function (trigger, x, y) {
*
* @param event
*/
EventHandler.prototype.handleEvent = function (event) {
EventHandler.prototype.handleEvent = function (event, context) {
switch (event.type) {
case 'achievement':
Game.achievements.triggerAchievement(event.id);
Game.achievements.triggerAchievement(event.id, context);
break;
}
......
......@@ -12,6 +12,9 @@ function getTranslation(svg, node) {
return [matrix.e, matrix.f];
}
function euclidianDistance(a_x, a_y, b_x, b_y){
return Math.sqrt((a_x-b_x)*(a_x-b_x) + (a_y-b_y)*(a_y-b_y));
}
function Path(svgPathData, offset) {
this.edges = [];
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment