Track the gameplay time of achievements

This commit is contained in:
Tadej Novak
2014-11-29 17:46:20 +01:00
parent 321477f20c
commit 00e52c679a
6 changed files with 60 additions and 24 deletions
+2 -2
View File
@@ -203,10 +203,10 @@
<div class="modal-body">
<p class="text-center"><strong>Progress</strong> <span class="label label-info">{{ progress() }} / {{ achievements.length }}</span></p>
<ul class="list-group">
<li class="list-group-item" ng-repeat="a in achievements | orderBy:'state.dateAchieved' | reverse" ng-show="a.isAchieved()">
<li class="list-group-item" ng-repeat="a in achievements | orderBy:'state.timeAchieved' | reverse" ng-show="a.isAchieved()">
<i class="fa {{ a.icon }}"></i>
{{ a.description }}
<span class="badge">{{ a.state.dateAchieved | date }}</span>
<span class="badge">{{ a.state.timeAchieved | niceTime }}</span>
</li>
</ul>
</div>
+12 -3
View File
@@ -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(
+2 -5
View File
@@ -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];
+17 -13
View File
@@ -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 {
+26
View File
@@ -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: ''
};
+1 -1
View File
@@ -94,7 +94,7 @@
<div class="tab-pane" id="achievements" ng-controller="AchievementsController as ac">
<p class="text-center"><strong>Progress</strong> <span class="label label-info">{{ ac.achievements.length }} / {{ ac.achievementsAll.length }}</span></p>
<ul class="list-group">
<li class="list-group-item" ng-repeat="a in achievements | orderBy:'state.dateAchieved' | reverse">
<li class="list-group-item" ng-repeat="a in achievements | orderBy:'state.timeAchieved' | reverse">
<span class="badge">{{ a.time }}</span>
<span class="glyphicon {{ a.icon }}"></span>
{{ a.description }}