mirror of
https://github.com/wassname/cardsforscience.git
synced 2026-06-27 17:15:11 +08:00
298 lines
9.6 KiB
JavaScript
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);
|
|
})();
|