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