From 00e52c679af4800a235afab924ccfedd5507520d Mon Sep 17 00:00:00 2001 From: Tadej Novak Date: Sat, 29 Nov 2014 17:46:20 +0100 Subject: [PATCH] Track the gameplay time of achievements --- index.html | 4 ++-- js/app.js | 15 ++++++++++++--- js/game.js | 7 ++----- js/gameobjects.js | 30 +++++++++++++++++------------- js/helpers.js | 26 ++++++++++++++++++++++++++ mobile.html | 2 +- 6 files changed, 60 insertions(+), 24 deletions(-) diff --git a/index.html b/index.html index 5478168..7e7d108 100644 --- a/index.html +++ b/index.html @@ -203,10 +203,10 @@ diff --git a/js/app.js b/js/app.js index 6b14532..cd94e4e 100644 --- a/js/app.js +++ b/js/app.js @@ -9,6 +9,7 @@ var upgrades = game.upgrades; var achievements = game.achievements; var allObjects = game.allObjects; + var lastSaved; UI.validateVersion(lab.version); @@ -18,6 +19,10 @@ return Helpers.formatNumberPostfix; }]); + app.filter('niceTime', ['$filter', function($filter) { + return Helpers.formatTime; + }]); + app.filter('currency', ['$filter', function($filter) { return function(input) { return 'JTN ' + $filter('niceNumber')(input); @@ -124,16 +129,20 @@ app.controller('AchievementsController', function($scope) { $scope.achievements = achievements; $scope.progress = function() { - return achievements.filter(function(a) { return a.isAchieved(); }).length; + return achievements.filter(function(a) { return a.validate(lab, allObjects, lastSaved); }).length; }; }); app.controller('SaveController', ['$scope', '$interval', function($scope, $interval) { - $scope.lastSaved = new Date(); + lastSaved = new Date().getTime(); + $scope.lastSaved = lastSaved; $scope.saveNow = function() { + var saveTime = new Date().getTime(); + game.lab.state.time += saveTime - lastSaved; game.save(); - $scope.lastSaved = new Date(); + lastSaved = saveTime; + $scope.lastSaved = lastSaved; }; $scope.restart = function() { if (window.confirm( diff --git a/js/game.js b/js/game.js index 37baac2..ebf4753 100644 --- a/js/game.js +++ b/js/game.js @@ -40,11 +40,8 @@ var Game = (function() { function(w) { return makeGameObject(GameObjects.Worker, w); }); this.upgrades = this.upgrades.map( function(u) { return makeGameObject(GameObjects.Upgrade, u); }); - this.achievements = this.achievements.map(function(a) { - var _a = makeGameObject(GameObjects.Achievement, a); - _a.setRefAllGameObjects(_this.allObjects); - return _a; - }); + this.achievements = this.achievements.map( + function(a) { return makeGameObject(GameObjects.Achievement, a); }); // Load states from local store for (var key in this.allObjects) { var o = this.allObjects[key]; diff --git a/js/gameobjects.js b/js/gameobjects.js index 91b96d1..607eada 100644 --- a/js/gameobjects.js +++ b/js/gameobjects.js @@ -33,7 +33,8 @@ var GameObjects = (function() { moneyCollected : 0, moneySpent : 0, dataCollected : 0, - dataSpent : 0 + dataSpent : 0, + time: 0 } }]); }; @@ -232,30 +233,33 @@ var GameObjects = (function() { */ var Achievement = function(obj) { GameObject.apply(this, [obj]); - this.state.dateAchieved = null; - this._allObjects = {}; + this.state.timeAchieved = null; }; Achievement.prototype = Object.create(GameObject.prototype); - Achievement.prototype.setRefAllGameObjects = function (allGameObjects) { - this._allObjects = allGameObjects; - }; - - Achievement.prototype.isAchieved = function() { - if (this.state.dateAchieved) { + Achievement.prototype.validate = function(lab, allObjects, saveTime) { + if (this.state.timeAchieved) { return true; } - if (this._allObjects.hasOwnProperty(this.targetKey) && - this._allObjects[this.targetKey].state.hasOwnProperty(this.targetProperty) && - this._allObjects[this.targetKey].state[this.targetProperty] >= this.threshold) { - this.state.dateAchieved = new Date().getTime(); + if (allObjects.hasOwnProperty(this.targetKey) && + allObjects[this.targetKey].state.hasOwnProperty(this.targetProperty) && + allObjects[this.targetKey].state[this.targetProperty] >= this.threshold) { + this.state.timeAchieved = lab.state.time + new Date().getTime() - saveTime; UI.showAchievement(this); return true; } return false; }; + Achievement.prototype.isAchieved = function() { + if (this.state.timeAchieved) { + return true; + } else { + return false; + } + }; + // Expose classes in module. return { diff --git a/js/helpers.js b/js/helpers.js index ffc0455..1f23f39 100644 --- a/js/helpers.js +++ b/js/helpers.js @@ -37,10 +37,36 @@ var Helpers = (function() { } return number; } + + var formatTime = function(msec) { + var totals = Math.ceil(msec / 1000); + var days = Math.floor(totals / (24 * 60 * 60)); + var hours = Math.floor((totals % (24 * 60 * 60)) / (60 * 60)); + var totalmin = (totals % (24 * 60 * 60)) % (60 * 60); + var mins = Math.floor(totalmin / 60); + var secs = totalmin % 60; + + var str = []; + if (days > 0) { + str.push(days + ' day' + (days % 100 == 1 ? '' : 's')); + } + if (hours > 0) { + str.push(hours + ' h'); + } + if (mins > 0) { + str.push(mins + ' min'); + } + if (secs > 0) { + str.push(secs + ' s'); + } + + return str.join(', '); + } return { loadFile: loadFile, formatNumberPostfix: formatNumberPostfix, + formatTime: formatTime, version: '0.4', analytics: '' }; diff --git a/mobile.html b/mobile.html index 7dcdc8b..3d98f26 100644 --- a/mobile.html +++ b/mobile.html @@ -94,7 +94,7 @@

Progress {{ ac.achievements.length }} / {{ ac.achievementsAll.length }}