var achievements = { list: [], listSpecial: [], listSummary: [], startTime: new Date().getTime(), lastSave: new Date().getTime(), count: { clicks: 0, data: 0, money: 0, reputation: 0, workers: 0, dataSpent: 0, moneyWorkers: 0, moneyUpgrades: 0 }, workers: {}, research: {}, setList: function(list) { for (var i = 0; i < list.length; i++) { if (list[i].type == list[i].target) { achievements.listSpecial.push(list[i]); for (var item in achievements[list[i].type]) { var a = $.extend(true, {}, list[i]); a.target = item; if (list[i].type == 'workers' && list[i].threshold == 1) { a.description = a.description.replace('${name}', item.substring(0, item.length - 1)); } else { a.description = a.description.replace('${name}', item); } achievements.list.push(a); } } else { achievements.list.push(list[i]); } } achievements.list.map(function(item) { item.completed = false; item.alerted = false; item.is_visible = function() { return this.completed; }; }); }, restore: function() { achievements = $.extend({}, achievements, ObjectStorage.load('achievements')); achievements.startTime = new Date().getTime() - (achievements.lastSave - achievements.startTime); }, addWorkers: function(list) { for (var i = 0; i < list.length; i++) { achievements.workers[list[i].name] = 0; } }, addResearch: function(list) { for (var i = 0; i < list.length; i++) { achievements.research[list[i].name] = 0; } }, update: function(type, subtype, val) { achievements[type][subtype] += val; for (var i = 0; i < achievements.list.length; i++) { if (achievements.list[i].type == type && achievements.list[i].target == subtype && achievements[type][subtype] >= achievements.list[i].threshold ) { achievements.list[i].completed = true; achievements.displayAchievement(i); } } }, displayAchievement: function(i) { var alert = '