From 5d7084d76e210d8ca1ecb1958dca4ffbb6e943ef Mon Sep 17 00:00:00 2001 From: Tim Repke <timmothey@gmx.de> Date: Sat, 22 Aug 2015 01:00:27 +0200 Subject: [PATCH] added option to define achievement conditions --- .../view/signups/game1/js/achievements.js | 28 ++++++++++++++++--- .../view/signups/game1/js/events.js | 6 ++-- .../view/signups/game1/js/svgUtils.js | 3 ++ 3 files changed, 30 insertions(+), 7 deletions(-) diff --git a/registration-system/view/signups/game1/js/achievements.js b/registration-system/view/signups/game1/js/achievements.js index a85e8c2..6ed22f4 100644 --- a/registration-system/view/signups/game1/js/achievements.js +++ b/registration-system/view/signups/game1/js/achievements.js @@ -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); diff --git a/registration-system/view/signups/game1/js/events.js b/registration-system/view/signups/game1/js/events.js index 0c73e37..710c1e5 100644 --- a/registration-system/view/signups/game1/js/events.js +++ b/registration-system/view/signups/game1/js/events.js @@ -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; } diff --git a/registration-system/view/signups/game1/js/svgUtils.js b/registration-system/view/signups/game1/js/svgUtils.js index 3714798..03b8f95 100644 --- a/registration-system/view/signups/game1/js/svgUtils.js +++ b/registration-system/view/signups/game1/js/svgUtils.js @@ -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 = []; -- GitLab