From 9f00bdee562b03ec262c4f2ce7fa04ed92ab469c Mon Sep 17 00:00:00 2001
From: Tim Repke <timmothey@gmx.de>
Date: Fri, 21 Aug 2015 19:15:26 +0200
Subject: [PATCH] added achievement system corpus

---
 .../view/signups/game1/index.php              |  7 +-
 .../view/signups/game1/js/achievements.js     | 94 +++++++++++++++++++
 .../view/signups/game1/js/game.js             |  6 +-
 .../view/signups/game1/test.html              |  6 +-
 4 files changed, 103 insertions(+), 10 deletions(-)
 create mode 100644 registration-system/view/signups/game1/js/achievements.js

diff --git a/registration-system/view/signups/game1/index.php b/registration-system/view/signups/game1/index.php
index 2429610..7f441b8 100644
--- a/registration-system/view/signups/game1/index.php
+++ b/registration-system/view/signups/game1/index.php
@@ -20,7 +20,7 @@ class Game1SignupMethod extends SignupMethod {
 
     public function getJSDependencies() {
         return ['jslib/d3.min.js', 'jslib/priority-queue.min.js', 'jslib/checkLineIntersection.js',
-            'js/svgUtils.js', 'js/pathFinder.js', 'js/vector.js', 'js/character.js','js/camera.js',
+            'js/achievements.js', 'js/svgUtils.js', 'js/pathFinder.js', 'js/vector.js', 'js/character.js','js/camera.js',
             'js/game.js'];
     }
 
@@ -53,10 +53,7 @@ class Game1SignupMethod extends SignupMethod {
                         <div class="sidebar-section-head">Achievements</div>
                         <div class="status-bar" id="achievement-progress" style="margin-bottom: 0.5em"><span style="width:25%" class="status-bar-bar"></span> <div class="status-bar-text">5/43</div> </div>
                         <div class="sidebar-log"><div>
-                            <ul id="achievement-log">
-                                <li>Five clicks in 2 seconds!</li>
-                                <li>Took first step!</li>
-                            </ul>
+                            <ul id="achievement-log"></ul>
                         </div></div>
                     </div>
                 </div>
diff --git a/registration-system/view/signups/game1/js/achievements.js b/registration-system/view/signups/game1/js/achievements.js
new file mode 100644
index 0000000..80d8260
--- /dev/null
+++ b/registration-system/view/signups/game1/js/achievements.js
@@ -0,0 +1,94 @@
+function Achievements() {
+    this.achievements = {
+        'started_game': {
+            message: "Bestes Anmeldesystem gestartet"
+        },
+        'first_step': {
+            message: "Erster Schritt getan"
+        }
+    };
+    this.achievedAchievements = [];
+
+    this.logElem        = null;
+    this.statusBarElem  = null;
+    this.statusTextElem = null;
+
+    this.triggerAchievement('started_game');
+}
+
+Achievements.prototype.getLogElem = function () {
+    if(!this.logElem)
+        this.logElem = document.getElementById('achievement-log');
+    return this.logElem;
+};
+
+Achievements.prototype.getStatusBarElem = function () {
+    if(!this.statusBarElem)
+        this.statusBarElem = document.getElementById('achievement-progress').getElementsByClassName('status-bar-bar')[0];
+    return this.statusBarElem;
+};
+
+Achievements.prototype.getStatusTextElem = function () {
+    if(!this.statusTextElem)
+        this.statusTextElem = document.getElementById('achievement-progress').getElementsByClassName('status-bar-text')[0];
+    return this.statusTextElem;
+};
+
+Achievements.prototype.updateStatusBar = function () {
+    var percent = Math.ceil((this.numCompletedAchievements() / this.numTotalAchievements())*100);
+    this.getStatusBarElem().style.width = percent + '%';
+};
+
+Achievements.prototype.updateStatusText = function () {
+    var text = this.numCompletedAchievements() + '/' + this.numTotalAchievements();
+    this.getStatusTextElem().innerText = text;
+};
+
+Achievements.prototype.numTotalAchievements = function() {
+    return Object.keys(this.achievements).length;
+};
+
+Achievements.prototype.numCompletedAchievements = function() {
+    return Object.keys(this.achievedAchievements).length;
+};
+
+/**
+ * returns status about a specific achievementId
+ * @param achievementId
+ * @returns {number} -1 = does not exist, 0 = achievable, 1 = already completed
+ */
+Achievements.prototype.achievementStatus = function(achievementId) {
+    if (!this.achievements[achievementId])
+        return -1;
+    if (!this.achievedAchievements.indexOf(achievementId) >= 0)
+        return 0;
+    return 1;
+};
+
+Achievements.prototype.logMessage = function (message) {
+    var list = this.getLogElem();
+
+    var newElem = document.createElement('li');
+    var newElemText = document.createTextNode(message);
+    newElem.appendChild(newElemText);
+
+    list.insertBefore(newElem, list.childNodes[0]);
+};
+
+Achievements.prototype.getAchievementMessage = function (achievementId) {
+    return this.achievements[achievementId].message;
+};
+
+Achievements.prototype.triggerAchievement = function (achievementId) {
+    var status = this.achievementStatus(achievementId);
+    if (status === 0) {
+        this.achievedAchievements.push(achievementId);
+        this.updateStatusBar();
+        this.updateStatusText();
+        this.logMessage(this.getAchievementMessage(achievementId));
+    }
+    else if (status === -1)
+        console.error("No such achievement: " + achievementId);
+    else
+        console.warn("Achievement already achieved: " + achievementId);
+};
\ No newline at end of file
diff --git a/registration-system/view/signups/game1/js/game.js b/registration-system/view/signups/game1/js/game.js
index 63ddd00..1378bce 100644
--- a/registration-system/view/signups/game1/js/game.js
+++ b/registration-system/view/signups/game1/js/game.js
@@ -3,6 +3,8 @@ function Game(config) {
 	if (Game.instance) throw "'Game' already constructed";
 	Game.config = config;
 	Game.instance = this;
+
+	this.achievements = new Achievements();
 }
 Game.eventLayers = ['CLICKABLE', 'WALK', 'NOWALK', 'EVENT'];
 Game.prototype.run = function() {
@@ -50,4 +52,6 @@ Game.prototype.run = function() {
 			char.setMoveTarget(d3.event.pageX, d3.event.pageY);
 		});
 	});
-}
+
+
+};
diff --git a/registration-system/view/signups/game1/test.html b/registration-system/view/signups/game1/test.html
index 5eb2d5f..0065a1d 100644
--- a/registration-system/view/signups/game1/test.html
+++ b/registration-system/view/signups/game1/test.html
@@ -7,6 +7,7 @@
 <script src="jslib/priority-queue.min.js" type="text/javascript"></script>
 <script src="jslib/checkLineIntersection.js" type="text/javascript"></script>
 <script src="../../js/api.js" type="text/javascript"></script>
+<script src="js/achievements.js" type="text/javascript"></script>
 <script src="js/svgUtils.js" type="text/javascript"></script>
 <script src="js/pathFinder.js" type="text/javascript"></script>
 <script src="js/vector.js" type="text/javascript"></script>
@@ -34,10 +35,7 @@
 			<div class="sidebar-section-head">Achievements</div>
 			<div class="status-bar" id="achievement-progress" style="margin-bottom: 0.5em"><span style="width:25%" class="status-bar-bar"></span> <div class="status-bar-text">5/43</div> </div>
 			<div class="sidebar-log"><div>
-				<ul id="achievement-log">
-					<li>Five clicks in 2 seconds!</li>
-					<li>Took first step!</li>
-				</ul>
+				<ul id="achievement-log"></ul>
 			</div></div>
 		</div>
 	</div>
-- 
GitLab