Files
cardsforscience/js/app.js
T
2016-02-26 14:21:01 +08:00

298 lines
9.6 KiB
JavaScript

/**
* Define the angular app
*/
'use strict';
var app = (function () {
Helpers.validateSaveVersion();
var app = angular.module('scienceAlchemy', ['ngDragDrop', 'ui.grid']);
// directives
// factories to provide services. They serve shared game objects
// app.factory('elements', function () {
// var elements = Helpers.loadFile('json/elements.json');
// elements = elements.map(
// function (r) {
// return new GameObjects.Card(r);
// });
// // put in extended array with helper methods
// Card = new GameObjects.Cards();
// Card.push.apply(Card,elements);
// return Card;
// });
function game($http, $q, lab) {
var game = new Game();
game.lab=lab;
var promise = game.load($http, $q);
// return promise;
return game;
};
game.$inject = ['$http', '$q'];
app.factory('game', game);
function lab() {
if (!this.lab) this.lab = new GameObjects.Lab();
return this.lab;
};
app.factory('lab', lab);
function detector() {
var detector = new Detector();
detector.init(400);
return detector;
}
app.factory('detector', detector);
// add helpers as filters
function niceNumber($filter) {
return Helpers.formatNumberPostfix;
};
niceNumber.$inject = ['$filter'];
app.filter('niceNumber', niceNumber);
function niceTime($filter) {
return Helpers.formatTime;
};
niceTime.$inject = ['$filter'];
app.filter('niceTime', niceTime);
function currency($filter) {
return function (input) {
return 'JTN ' + $filter('niceNumber')(input);
};
};
currency.$inject = ['$filter'];
app.filter('currency', currency);
function reverse($filter) {
return function (items) {
if (items instanceof Array)
return items.slice().reverse();
else
return items;
};
};
reverse.$inject = ['$filter'];
app.filter('reverse', reverse);
// controllers
app.controller('ElementController', ElementController);
ElementController.$inject = ['$scope', '$compile', 'game', 'detector', 'lab'];
function ElementController($scope, $compile, game, detector, lab) {
var vm = this;
vm.dragOptions = {
revert: true, //"invalid",
zIndex: 100,
// helper: "clone", // drags a clone
// opacity: 0.75,
// start: vm.onRuneDrop.bind(vs),
// stop: vm.onRuneDrop.bind(vs),
cancel: false,
// containment:false
};
vm.elements = game.elements;
vm.isVisible = function (item) {
return item.isVisible(lab);
};
vm.isAvailable = function (item) {
return item.isAvailable(lab);
};
vm.onDrop = function (event, ui) {
// store the dropped element
var draggable = angular.element(ui.draggable);
var key = draggable.data('element');
if (!draggable.hasClass('element-store')) {
var Card = vm.elements.get(key);
var i = _.findIndex(vm.elements,{$$hashKey:draggable.data('hashkey')});
detector.elements.splice(i, 1);
Card.state.amount += 1;
}
};
};
function DetectorController($scope, game, detector, lab) {
var vm = this;
vm.elements = detector.elements;
vm.dropOptions = {
// accept: ".rune",
addClasses: true,
// greedy: true,
// tolerance: "pointer",
activeClass: "ui-state-hover",
hoverClass: "ui-state-active",
};
vm.dragOptions = {
revert: "invalid",
zIndex: 100,
// helper: "clone", // drags a clone
// opacity: 0.75,
// start: this.onRuneDrop.bind(this),
// stop: this.onRuneDrop.bind(this),
cancel: false,
// containment:false
};
vm.onDrop = function (event, ui) {
var result = detector.onDrop(event, ui, game);
if (result)
lab.observe(result);
};
vm.click = function () {
lab.clickDetector();
detector.addEvent();
UI.showUpdateValue("#update-data", lab.state.detector);
game.elements.addKnownToStore();
return false;
};
vm.toggleFlameFuel = function () {
// console.log('toggleFlameFuel');
// detector.flamer.toggleFuel();
};
vm.clearAll = function () {
detector.clearAll(game);
};
};
DetectorController.$inject = ['$scope', 'game', 'detector', 'lab'];
app.controller('DetectorController', DetectorController);
function LabController($interval, game, detector, lab) {
// todo give workers instead of game
var vm = this;
vm.lab = lab;
vm.showDetectorInfo = function () {
if (!vm._detectorInfo) {
vm._detectorInfo = Helpers.loadFile('html/detector.html');
}
UI.showModal('Detector', vm._detectorInfo);
};
$interval(function () { // one tick
var grant = lab.getGrant();
UI.showUpdateValue("#update-funding", grant);
var sum = 0;
for (var i = 0; i < game.workers.length; i++) {
sum += game.workers[i].state.hired * game.workers[i].state.rate;
}
if (sum > 0) {
lab.acquireData(sum);
UI.showUpdateValue("#update-data", sum);
detector.addEventExternal(game.workers.map(function (w) {
return w.state.hired;
}).reduce(function (a, b) {
return a + b;
}, 0));
}
}, 1000);
};
LabController.$inject = ['$interval', 'game', 'detector', 'lab'];
app.controller('LabController', LabController);
function ObservationsController($scope, game, lab) {
var vm = this;
vm.observations = lab.state.observations;
vm.gridOptions = {
enableFiltering: true,
columnDefs: [{
field: 'inputs',
filter: {
type: 'select',
selectOptions: _(game.elements).filter({state:{discovered:true}}).map(function(e){return {value:e.key,label:e.key};}).value(),
},
visible: true
}, {
field: 'reactants',
visible: false
}, {
field: 'results',
filter: {
type: 'select',
selectOptions: _(game.elements).filter({state:{discovered:true}}).map(function(e){return {value:e.key,label:e.key};}).value(),
},
visible: true,
sort: {
direction: 'asc'
}
}, {
field: 'catalysts',
visible: false
}, {
field: 'conditions',
visible: false
}, ],
data: vm.observations
};
};
ObservationsController.$inject = ['$scope', 'game', 'lab'];
app.controller('ObservationsController', ObservationsController);
function UpgradesController($scope, game, lab) {
var vm = this;
vm.upgrades = game.upgrades;
vm.isVisible = function (upgrade) {
return upgrade.isVisible(lab, game.allObjects);
};
vm.isAvailable = function (upgrade) {
return upgrade.isAvailable(lab, game.allObjects);
};
vm.upgrade = function (upgrade) {
if (upgrade.buy(lab, game.allObjects)) {
UI.showUpdateValue("#update-funding", upgrade.cost);
}
};
};
UpgradesController.$inject = ['$scope', 'game', 'lab'];
app.controller('UpgradesController', UpgradesController);
function AchievementsController($scope, game, lab) {
var vm = this;
vm.achievements = game.achievements;
vm.progress = function () {
return game.achievements.filter(function (a) {
return a.validate(lab, game.allObjects, game.lastSaved);
}).length;
};
};
AchievementsController.$inject = ['$scope', 'game', 'lab'];
app.controller('AchievementsController', AchievementsController);
function SaveController($scope, $interval, $window, game, lab) {
var vm = this;
game.lastSaved = new Date().getTime();
vm.lastSaved = game.lastSaved;
vm.saveNow = function () {
var saveTime = new Date().getTime();
lab.state.time += saveTime - game.lastSaved;
game.save();
game.lastSaved = saveTime;
vm.lastSaved = game.lastSaved;
};
vm.restart = function () {
if ($window.confirm(
'Do you really want to restart the game? All progress will be lost.'
)) {
ObjectStorage.clear();
$window.location.reload(true);
}
};
$interval(vm.saveNow, 10000);
};
SaveController.$inject = ['$scope', '$interval', '$window', 'game', 'lab'];
app.controller('SaveController', SaveController);
function StatsController($scope, lab) {
var vm = this;
vm.lab = lab;
};
StatsController.$inject = ['$scope', 'lab'];
app.controller('StatsController', StatsController);
analytics.init();
analytics.sendScreen(analytics.screens.main);
})();