您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Can calculate various important statistics for the browsergame Supremacy 1914.
- // ==UserScript==
- // @name Supremacy Ressource Helper
- // @version 0.1
- // @description Can calculate various important statistics for the browsergame Supremacy 1914.
- // @match http://www.supremacy1914.de/play.php?L=1&gameID=*
- // @copyright 2014, Zahlii
- // @namespace https://greasyfork.org/users/6229
- // ==/UserScript==
- function addGlobalStyle(css) {
- var head, style;
- head = document.getElementsByTagName('head')[0];
- if (!head) { return; }
- style = document.createElement('style');
- style.type = 'text/css';
- style.innerHTML = css;
- head.appendChild(style);
- }
- function clone(item) {
- if (!item) { return item; } // null, undefined values check
- var types = [ Number, String, Boolean ],
- result;
- // normalizing primitives if someone did new String('aaa'), or new Number('444');
- types.forEach(function(type) {
- if (item instanceof type) {
- result = type( item );
- }
- });
- if (typeof result == "undefined") {
- if (Object.prototype.toString.call( item ) === "[object Array]") {
- result = [];
- item.forEach(function(child, index, array) {
- result[index] = clone( child );
- });
- } else if (typeof item == "object") {
- // testing that this is DOM
- if (item.nodeType && typeof item.cloneNode == "function") {
- var result = item.cloneNode( true );
- } else if (!item.prototype) { // check that this is a literal
- if (item instanceof Date) {
- result = new Date(item);
- } else {
- // it is an object literal
- result = {};
- for (var i in item) {
- result[i] = clone( item[i] );
- }
- }
- } else {
- // depending what you would like here,
- // just keep the reference, or create new object
- if (false && item.constructor) {
- // would not advice to do that, reason? Read below
- result = new item.constructor();
- } else {
- result = item;
- }
- }
- } else {
- result = item;
- }
- }
- return result;
- }
- addGlobalStyle('td, th { text-align:center; }');
- function handleGameSite() {
- var GAME_ID = location.href.match(/gameID=(\d+)/)[1];
- function ArmyCalculator() {
- var mainDiv;
- var mainDocument;
- var mapContainer;
- var ressourceContainer;
- var newspaperContainer;
- var diplomacyTable;
- var diplomacyContainer;
- var provinceContainer;
- var _this = this;
- var hideOverriddenContainer = function() {
- newspaperContainer.style.display = 'none';
- newspaperContainer.style.zIndex = '-1000';
- ressourceContainer.style.display = 'block';
- diplomacyContainer.style.display = 'none';
- };
- this.init = function(main, cont) {
- mainDiv = main;
- mainDocument = cont;
- mapContainer = mainDocument.getElementById('mapContainer');
- ressourceContainer = mainDocument.getElementById('resource_bar');
- newspaperContainer = mainDocument.getElementById('newspaperContainer');
- diplomacyContainer = mainDocument.getElementById('diplomacyContainer');
- provinceContainer = mainDocument.getElementById('provinceListContainer');
- window.setTimeout(function() {
- //mainDocument.getElementById('func_btn_diplomacy').click();
- //diplomacyTable = mainDocument.getElementById('func_diplomacy_table');
- //_this.getDiplomacyData();
- }, 1000);
- _this.Ressources = new Ressources();
- _this.Provinces = new Provinces();
- };
- /*
- var data = [{
- num:30,
- moral:89
- },{
- num:80,
- moral:76
- },{
- num:70,
- moral:89
- }];
- function calcValForPlayer(x) {
- var res = data[x].num * (16 * data[x].moral/100 - 4);
- console.log(x,res);
- return res;
- }
- function calcForPlayer(x) {
- var sum = 0;
- for(var i=0,l=data.length;i<l;i++) {
- sum += calcValForPlayer(i);
- }
- console.log(sum);
- return calcValForPlayer(x)/sum*2000;
- }
- alert(calcForPlayer(2));
- */
- var diplomacyData = [];
- this.getDiplomacyData = function() {
- var r = diplomacyTable.getElementsByClassName('func_player_row');
- var detail;
- var i = 0;
- function handleNext() {
- if (i >= r.length) {
- handleStop();
- return;
- }
- var td = r[i].getElementsByTagName('td');
- i++;
- td[10].getElementsByClassName('info_button')[0].click();
- window.setTimeout(function() {
- detail = mainDocument.getElementById('playerDetailContainer');
- var ent = detail.getElementsByClassName('detail_entry');
- var ind = ent.length > 6 ? 5 : 3;
- diplomacyData.push({
- playerCountryFlag: td[0].getElementsByTagName('img')[0].src,
- playerCountryName: td[1].textContent,
- playerName: td[3].textContent,
- playerProvinceCount: parseInt(td[4].textContent, 10),
- playerPowerIndex: parseInt(td[6].textContent),
- playerIsKI: (td[7].innerHTML.match(/inactive/) ? true : false),
- playerAvgMoral: parseFloat(ent[ind].getElementsByClassName('sg_float_l')[0].textContent.replace(/%/, ''))
- });
- handleNext();
- }, 200);
- }
- function handleStop() {
- window.setTimeout(function() {
- console.log(diplomacyData);
- detail.getElementsByClassName('close_button')[0].click();
- diplomacyContainer.getElementsByClassName('close_button')[0].click();
- }, 100);
- }
- handleNext();
- };
- var stringFill = function(x, n) {
- var s = '';
- for (;;) {
- if (n & 1)
- s += x;
- n >>= 1;
- if (n)
- x += x;
- else
- break;
- }
- return s;
- };
- var pad = function(n, l, p) {
- if (l == null)
- l = 2;
- if (p == null)
- p = '0';
- n = '' + n;
- return stringFill(p, l - n.length) + n;
- };
- var formatInterval = function(time) {
- if (time < 0)
- return '-';
- if(time == Number.POSITIVE_INFINITY)
- return '∞';
- var days = Math.floor(time / (24 * 3600 * 1000));
- time -= days * (24 * 3600 * 1000);
- var hours = Math.floor(time / (3600 * 1000));
- time -= hours * (3600 * 1000);
- var minutes = Math.floor(time / (60 * 1000));
- time -= minutes * (60 * 1000);
- var seconds = Math.floor(time / 1000);
- var dayS = (days > 1 ? days + ' Tage, ' : (days > 0 ? '1 Tag, ' : ''));
- var hoursS = hours > 0 ? pad(hours) + 'h ' : '';
- var minS = minutes > 0 ? pad(minutes) + 'm ' : '';
- var secS = pad(seconds) + 's';
- return dayS + hoursS + minS + secS;
- }
- var formatTime = function(date) {
- if (date == null)
- date = new Date();
- return pad(date.getDate()) + '.' + pad(date.getMonth() + 1) + '.' + date.getFullYear() + ' ' + pad(date.getHours()) + ':' + pad(date.getMinutes()) + ':' + pad(date.getSeconds());
- };
- var formatNumber = function(n) {
- return number_format(n, 0, ',', '.');
- };
- var getTime = function(dateStr) {
- var parts = dateStr.split(/[\.\s:]/);
- return new Date(parts[2], parts[1] == 0 ? 11 : parts[1] - 1, parts[0], parts[3], parts[4], parts[5]);
- };
- this.displayOverriddenContainer = function(title, content) {
- var html = ' <div class="main_popup_container">' +
- ' <div class="dialog_background_layer_80" id="func_modal_dialog"></div>' +
- ' <div class="metal_panel metal_dialog_header popup_shadow">' +
- ' <div class="metal_dialog_header_deco">' +
- ' <div class="deco-Scharnier"></div>' +
- ' </div>' +
- ' <div class="wooden_panel">' +
- ' <h1 class="capitals autoResizeLine">' + title + '</h1>' +
- ' </div>' +
- ' <div class="metal_dialog_close_area">' +
- ' <div class="close_button metal_dialog_close_button func_close_button">' +
- ' </div>' +
- ' </div>' +
- ' </div>' +
- ' <div class="metal_panel metal_dialog_body popup_shadow_bottom">' +
- ' <div class="wooden_panel">' +
- ' <div class="wooden_panel_content">' +
- ' <div class="paper_panel">' +
- ' <div class="paper_panel_content func_dialog_content">' +
- content +
- ' </div>' +
- ' </div>' +
- ' </div>' +
- ' </div>' +
- ' </div>' +
- ' </div>';
- ressourceContainer.style.display = 'none';
- newspaperContainer.style.display = 'block';
- newspaperContainer.innerHTML = html;
- newspaperContainer.style.zIndex = 1005;
- window.setTimeout(function() {
- newspaperContainer.getElementsByClassName('metal_dialog_close_area')[0].addEventListener('click', hideOverriddenContainer);
- }, 100);
- };
- // type IN 'date', 'interval', 'number'
- this.format = function(n, type, symbol) {
- var symbol = symbol === null ? '' : symbol;
- switch (type) {
- case 'date':
- return formatTime(n);
- case 'interval':
- return formatInterval(n);
- case 'number':
- return formatNumber(n) + symbol;
- }
- }
- function Provinces() {
- var self = this;
- var provinces;
- var sumInfo;
- var table;
- var extract = function() {
- provinces = [];
- var tr = table.getElementsByTagName('tr');
- var slots = 0;
- for (var i = 0, l = tr.length; i < l; i++) {
- var t = tr[i];
- var td = t.getElementsByTagName('td');
- var res = td[0].innerHTML.match(/icons-resource_(\d+)(_double)?/);
- var buildings = td[2].getElementsByClassName('prov_list_building_slot');
- var bName = ['Festung', 'Hafen', 'Eisenbahn', 'Wehramt', 'Kaserne', 'Fabrik'];
- var bInfo = {};
- for (var j = 0, k = buildings.length; j < k; j++) {
- var b = buildings[j];
- if (b.innerHTML == ' ') {
- bInfo[bName[j]] = {
- buildingType: bName[j],
- buildingLevel: 0,
- buildingIsActive: false,
- buildingProgress: 0
- };
- } else {
- var level = b.getElementsByClassName('upgrade_level')[0] ? parseInt(b.getElementsByClassName('upgrade_level')[0].textContent, 10) : 1;
- var progress = b.innerHTML.match(/condition_(\d+)/) ? parseInt(b.innerHTML.match(/condition_(\d+)/)[1], 10) : 100;
- bInfo[bName[j]] = {
- buildingType: bName[j],
- buildingLevel: level,
- buildingIsActive: level > 1 || progress == 100,
- buildingProgress: progress
- };
- }
- }
- var data = {
- provinceID: parseInt(t.getAttribute('province_id'), 10),
- provinceRessourceID: parseInt(res[1], 10),
- provinceIsDouble: (res[2] == '_double'),
- provinceName: td[1].textContent.trim(),
- provinceIsCapital: (td[1].innerHTML.match(/non_capital/) ? false : true),
- provinceBuildings: bInfo,
- provinceIsBuilding: td[3].innerHTML.match(/icons-infoicon_building/) ? false : true,
- provinceIsProducing: td[4].innerHTML.match(/icons-infoicon_production/) ? false : true,
- };
- var prod = data.provinceIsDouble ? 3136 * 2 : 3136;
- var tax = data.provinceIsDouble ? 2598 * 2 : 2598;
- var inc_prod = prod;
- if (data.provinceBuildings.Hafen.buildingActive) {
- inc_prod += 0.25 * prod;
- }
- if (data.provinceBuildings.Eisenbahn.buildingActive) {
- inc_prod += 0.33 * prod;
- }
- data.provinceMaxProduction = Math.floor(inc_prod, 0);
- data.provinceMaxTax = tax;
- data.provinceMightProduce = data.provinceBuildings.Fabrik.buildingIsActive && !data.provinceIsProducing;
- if (data.provinceMightProduce)
- slots++;
- provinces.push(data);
- }
- var mapping = {
- 0:'Nahrung',
- 1:'Nahrung',
- 2:'Baumaterial',
- 3:'Baumaterial',
- 4:'Energie',
- 5:'Energie',
- 6:'Energie',
- 20:'Geld'
- };
- var totalConsume = {
- 'Geld': 0,
- 'Nahrung': 0,
- 'Baumaterial': 0,
- 'Energie': 0
- }, baseConsume = {
- 'Geld': 0,
- 'Nahrung': 0,
- 'Baumaterial': 0,
- 'Energie': 0
- }, totalProduce = {
- 'Geld': 0,
- 'Nahrung': 0,
- 'Baumaterial': 0,
- 'Energie': 0
- }, totalResult = {
- 'Geld': {},
- 'Nahrung': {},
- 'Baumaterial': {},
- 'Energie': {}
- };
- for (var y = 0, o = provinces.length; y < o; y++) {
- var d = provinces[y];
- var id = d.provinceRessourceID;
- var am = d.provinceMaxProduction;
- totalProduce[mapping[id]] += am;
- totalProduce['Geld'] += d.provinceMaxTax;
- totalConsume['Geld'] += 250;
- totalConsume['Nahrung'] += 800;
- totalConsume['Baumaterial'] += 800;
- totalConsume['Energie'] += 800;
- /*baseConsume['Geld'] += 250;
- baseConsume['Nahrung'] += 800;
- baseConsume['Baumaterial'] += 800;
- baseConsume['Energie'] += 800;*/
- if (d.provinceBuildings.Kaserne.buildingIsActive) {
- totalConsume['Nahrung'] += 1000 * d.provinceBuildings.Kaserne.buildingLevel;
- totalConsume['Geld'] += 500 * d.provinceBuildings.Kaserne.buildingLevel;
- }
- if (d.provinceBuildings.Eisenbahn.buildingIsActive) {
- totalConsume['Energie'] += 500;
- }
- }
- var k = ['Geld','Nahrung','Baumaterial','Energie'];
- for(var i=0,l=k.length;i<l;i++) {
- var ck = k[i];
- var dif = totalProduce[ck] - totalConsume[ck];
- totalResult[ck] = {
- amountPerDay:dif,
- amountPerHour:Math.round(dif/24,2)
- };
- }
- console.log(totalResult);
- sumInfo = {
- provinceCount: tr.length,
- freeProducingSlots: slots
- };
- };
- var init = function() {
- table = mainDocument.getElementById('province_table');
- extract();
- }
- init();
- };
- function Ressources() {
- var self = this;
- var ressources = [];
- var buildingQueue = [];
- this.addBuildingToQueue = function(type) {
- buildingQueue.push({
- buildingType: type,
- buildingPosition: buildingQueue.length,
- buildingRequirements: neededMap[type],
- buildingInfo:{}
- });
- self.recalculateQueue();
- };
- this.removeFromBuildingQueue = function(index) {
- if(index < 0 || index >= buildingQueue.length)
- return;
- buildingQueue.splice(index,1);
- self.recalculateQueue();
- };
- this.recalculateQueue = function() {
- var currentRes = clone(ressources);
- for(var i=0,l=buildingQueue.length;i<l;i++) {
- var e = buildingQueue[i];
- var n = e.buildingRequirements;
- var t = self.getTimeNeededForRessource(n, currentRes);
- for(var prop in n) {
- if(!n.hasOwnProperty(prop))
- continue;
- prop = parseInt(prop,10);
- self.getRessourceById(prop, currentRes).ressourceAmount -= n[prop];
- }
- buildingQueue[i].buildingInfo = t;
- }
- }
- var ressourceIdMap = {
- 20: 'Geld',
- 0: 'Getreide',
- 1: 'Fisch',
- 2: 'Eisenerz',
- 3: 'Holz',
- 4: 'Kohle',
- 5: 'Öl',
- 6: 'Gas'
- };
- var lastChosenQueueItem = '';
- this.displayBuildingQueue = function() {
- var img = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACV0lEQVQ4T4WTzW8SQRiH3wUsGNKFXRCwH5hqldoEq0TiB22RIuXixavXGtN40z/EkzFooiaePHlqpQlfbWlSlR6qoiJtNWnV8jml1MpSdl13sLM0gHGS3U1m3ueZ3+zMULDf7gMYhjznE+lEcmLiJxcj/Qe/T7Va38mLg4E3kYTzLgDCYxR+YXj42mi676yNRZm8EH0+42uWYNhzYzzImI3KteVPhdmpBRuWUBh2+S+nj5/uZ8lsxVxBiL2I+ia4v0meabX+0eueacbIKknNWjJdmA2/slHxc4Nfzjjtfc2Ri3kkxIJxX4dSVI/43VOMkZFhUvs28W6FeqzReK64L4QMhoZdTlJEgoJSAMPqW+Ai2uKj4YWx+j+oS5yOEMs0FYoiiLU9gBoPoiAA/JYeqa9Y3uGjHz57J3l+vi4gErfdHmJpWinWagAcB+KeBEvAwYZ2d/nw6urYbYC4vAuyRKXyDHdZQ6zqUEtkXIO4ijD3Y917C2COMHIC3PEEwO8y9UzrOzTtBVVOiOe/tRc8BBgfMfe81P0DJjMiSbKYa0jqCQIAPpe5N0j/ByaSUrUivN6XUI8ArjrN1hla3Rp7WyrEkE59uGVJeGwpu+Glgp36lROsqb/5IJWrFX4ps+FVSMfdYemN0G0kaZRNUfcAWDtjSnXrmCNEUuYq/HJm3TsJMI/7HgC4HRZrhNY0knwvoWyylB+QL9Mp1pyy6BjjDveLf7/ZgIkUS4aOHot0SpLNbZT9iHIDdwBK8jbiS9VN6xez5dJNMnPzsrCki2YCX8tblzCMx/8AF+H3pjKo/BIAAAAASUVORK5CYII=';
- function getIcons() {
- var s = '';
- for(var prop in ressourceIdMap) {
- if(!ressourceIdMap.hasOwnProperty(prop))
- continue;
- s += '<th>' + self.getRessourceById(parseInt(prop,10)).ressourceIcon +'</th>';
- }
- return s;
- }
- function getQueue() {
- var s = '';
- for(var i=0,l=buildingQueue.length;i<l;i++) {
- var b = buildingQueue[i];
- s += '<tr><td>' + (i+1) +'</td><td>' + b.buildingType +'</td>';
- for(var prop in ressourceIdMap) {
- if(!ressourceIdMap.hasOwnProperty(prop))
- continue;
- var t = typeof b.buildingRequirements[prop];
- var a = t !== 'undefined' ? _this.format(b.buildingRequirements[prop],'number',self.getRessourceById(parseInt(prop,10)).ressourceSymbol) : '-';
- s += '<td>' + a + '</td>';
- }
- var cls = b.buildingInfo.isPossible ? 'resource_bar_rate_positive' : 'resource_bar_rate_negative';
- s += '<td class="'+cls+'">' + b.buildingInfo.possibleFromString +'</td><td class="'+cls+'">' + b.buildingInfo.possibleUntilString +'</td>';
- s += '<td><img class="remove_building_queue" id="remove-' + i +'" src="'+img+'" style="cursor:pointer;" alt="X" /></td>';
- }
- return s +'</tr>';
- };
- var tbl = '<table class="full" id="building-queue" style="width:800px"><thead><tr><th>#</th><th>Typ</th>' + getIcons() + '<th>Möglich ab</th><th>Möglich bis</th><th> </th></tr></thead><tbody>'+getQueue()+'</tbody></table>';
- var sel = '<select id="select_projects">';
- for(var prop in neededMap) {
- if(!neededMap.hasOwnProperty(prop))
- continue;
- var issel = lastChosenQueueItem == prop ? 'selected="selected"' : '';
- sel += '<option value="'+prop+'" '+issel+'>'+prop+'</option>';
- }
- sel += '</select><div id="input_queue_submit" class="default_button">Einreihen</div>';
- _this.displayOverriddenContainer('Bauwarteschlange','<h2>Folgende Projekte sind eingereiht</h2>'+tbl+sel);
- window.setTimeout(function() {
- var sub = mainDocument.getElementById('input_queue_submit');
- sub.addEventListener('click',function() {
- var v = mainDocument.getElementById('select_projects').value;
- lastChosenQueueItem = v;
- self.addBuildingToQueue(v);
- self.displayBuildingQueue();
- });
- var t = mainDocument.getElementsByClassName('remove_building_queue');
- for(var i=0, l=t.length;i<l;i++) {
- var x = t[i];
- x.addEventListener('click', function(event) {
- var e = event.target || event.srcElement;
- var index = parseInt(e.id.split('-')[1],10);
- self.removeFromBuildingQueue(index);
- self.displayBuildingQueue();
- });
- }
- },100);
- }
- var neededMap = {
- 'Wehramt': {
- 20: 1000,
- 2: 250,
- 3: 250
- },
- 'Werkstatt': {
- 20: 1000,
- 2: 500,
- 3: 500,
- 5: 500
- },
- 'Kaserne': {
- 20: 4000,
- 0: 1500,
- 3: 1500
- },
- 'Festung': {
- 20: 4000,
- 2: 2000
- },
- 'Hafen': {
- 20: 10000,
- 3: 10000
- },
- 'Eisenbahn': {
- 20: 10000,
- 3: 5000,
- 2: 3000,
- 4: 1000
- },
- 'Fabrik': {
- 20: 10000,
- 2: 2500,
- 3: 2500,
- 5: 2500
- },
- 'Panzerwagen': {
- 20: 7000,
- 2: 2000,
- 5: 1500
- },
- 'Artillerie': {
- 20: 10000,
- 2: 3000,
- 5: 2000
- },
- 'Panzer': {
- 20: 20000,
- 2: 5000,
- 5: 3000
- },
- 'EBG': {
- 20: 50000,
- 2: 10000,
- 3: 5000,
- 4: 5000,
- 5: 10000
- },
- 'Schlachtschiff': {
- 20: 50000,
- 2: 15000,
- 3: 5000,
- 4: 10000,
- 5: 5000
- }
- };
- var lastInput = {};
- var extract = function() {
- ressources = [];
- var li = ressourceContainer.getElementsByTagName('li');
- for (var i = 0, l = li.length; i < l; i++) {
- var liE = li[i];
- var amnt = liE.getElementsByClassName('resource_bar_amount')[0];
- if (typeof amnt === 'undefined')
- continue;
- var entry = amnt.parentNode;
- var rate = entry.getElementsByTagName('div')[1];
- var resID = parseInt(liE.getAttribute('resource_id'));
- amnt = parseInt(amnt.textContent.replace(/\./, ''), 10);
- rate = parseInt(rate.textContent.replace(/\./, '').replace(/\s\/h/, ''), 10);
- var time = (rate >= 0 ? -1 : amnt / Math.abs(rate) * 3600 * 1000);
- ressources.push({
- ressourceName: ressourceIdMap[resID],
- ressourceBarEntry: entry,
- ressourceID: resID,
- ressourceAmount: amnt,
- ressourceRate: rate,
- ressourceTimeLeft: time,
- ressourceTimeLeftText: _this.format(time, 'interval'),
- ressourceSymbol: resID === 20 ? '£' : 't',
- ressourceIcon: '<div class="icons-resource_' + resID + ' resource_bar_icon"></div>'
- });
- }
- }
- this.getRessourceInfo = function() {
- return ressources;
- }
- this.getRessourceById = function(id, res) {
- res = res == null ? ressources : res;
- for (var i = 0, l = res.length; i < l; i++) {
- if (res[i].ressourceID === id)
- return res[i];
- }
- }
- this.getRessourceByName = function(name, res) {
- res = res == null ? ressources : res;
- for (var i = 0, l = res.length; i < l; i++) {
- if (res[i].ressourceName === name)
- return res[i];
- }
- }
- this.updateTimeLeftDisplay = function() {
- for (var i = 0, l = ressources.length; i < l; i++) {
- var res = ressources[i];
- if (mainDocument.getElementById('time_left_for_' + res.ressourceID) == null) {
- res.ressourceBarEntry.innerHTML += '<div id="time_left_for_' + res.ressourceID + '"></div>';
- }
- var timeLeft = mainDocument.getElementById('time_left_for_' + res.ressourceID);
- timeLeft.className = res.ressourceTimeLeft > 0 ? 'resource_bar_rate_negative' : 'resource_bar_rate_positive';
- timeLeft.innerHTML = res.ressourceTimeLeftText;
- }
- };
- this.getTimeNeededForRessource = function(need, base) {
- var mintime = Number.NEGATIVE_INFINITY; // from when to
- var maxtime = Number.POSITIVE_INFINITY; // when can it be built
- var isPossible = true;
- for (var prop in need) {
- if (!need.hasOwnProperty(prop))
- continue;
- var r = self.getRessourceById(parseInt(prop, 10), base);
- var dif = need[prop] - r.ressourceAmount;
- var time = dif / r.ressourceRate * 3600 * 1000;
- if (need[prop] <= 0) {
- continue;
- } else {
- if (dif < 0 && r.ressourceRate < 0) {// mehr da, nimmt aber ab
- if(time < maxtime)
- maxtime = time;
- }
- if (dif < 0 && r.ressourceRate > 0) {// mehr da, nimmt zu
- continue;
- }
- if (dif > 0 && r.ressourceRate < 0) {// weniger da, nimmt ab
- isPossible = false;
- break;
- }
- if (dif > 0 && r.ressourceRate > 0) {// weniger da, nimmt zu
- if(time > mintime)
- mintime = time;
- }
- }
- }
- mintime = Math.max(0,mintime);
- maxtime = Math.max(0,maxtime);
- return {
- isPossible:isPossible,
- possibleFrom:mintime,
- possibleFromString:_this.format(mintime +'','interval'),
- possibleUntil:Math.max(0,maxtime),
- possibleUntilString:_this.format(maxtime +'','interval'),
- };
- };
- var addTimeButton = function() {
- var ul = ressourceContainer.getElementsByTagName('ul')[0];
- if (mainDocument.body.innerHTML.indexOf('time_button"') === -1) {
- ul.innerHTML += '<li><input type="button" value="Ressourcen zu Zeitpunkt" id="time_button" class="default_button" /></li>';
- }
- window.setTimeout(function() {
- mainDocument.getElementById('time_button').addEventListener('click', function() {
- var dn = new Date();
- _this.displayOverriddenContainer('Ressourcen zu Zeitpunkt', '<h1>Bitte das Datum eingeben, für das Du die Ressourcen hochrechnen möchtest</h1>' + '<input type="text" value="' + formatTime() + '" id="input_date" /><div id="input_date_submit" class="default_button">Hochrechnen</div><br />' + '<table class="full" id="input_date_result" style="width:500px;">' + '<thead>' + '<tr><th> </th><th>Ressource</th><th>Vorrat</th><th>Veränderung</th></tr>' + '</thead>' + '<tbody>' + '</tbody>' + '</table>');
- window.setTimeout(function() {
- mainDocument.getElementById('input_date_submit').addEventListener('click', function() {
- var d = mainDocument.getElementById('input_date').value;
- d = getTime(d);
- var time_dif = d.getTime() - (new Date()).getTime();
- var tbody = mainDocument.getElementById('input_date_result').getElementsByTagName('tbody')[0];
- tbody.innerHTML = '';
- for (var i = 0, l = ressources.length; i < l; i++) {
- var r = ressources[i];
- var c = time_dif / (3600 * 1000) * r.ressourceRate;
- var a = r.ressourceAmount + c;
- var txt = _this.format(a, 'number', r.ressourceSymbol);
- var chng = _this.format(c, 'number', r.ressourceSymbol);
- var cls = c < 0 ? 'resource_bar_rate_negative' : 'resource_bar_rate_positive';
- var rowHtml = '<tr><td>' + r.ressourceIcon + '</td><td>' + r.ressourceName + '</td><td>' + txt + '</td><td><div class="' + cls + '">' + chng + '</div></td></tr>';
- tbody.innerHTML += rowHtml;
- }
- });
- }, 100);
- });
- }, 100);
- }
- var addRessourceButton = function() {
- var ul = ressourceContainer.getElementsByTagName('ul')[0];
- if (mainDocument.body.innerHTML.indexOf('time_button_2"') === -1) {
- ul.innerHTML += '<li><input type="button" value="Zeit für Ressourcen" id="time_button_2" class="default_button" /></li>';
- }
- window.setTimeout(function() {
- mainDocument.getElementById('time_button_2').addEventListener('click', function() {
- var selStr = '<table style="width:500px;" id="input_projects"><thead><tr><th>Projekt</th><th>Anzahl</th></tr></thead><tbody>';
- for (var prop in neededMap) {
- if (!neededMap.hasOwnProperty(prop))
- continue;
- selStr += '<tr><td>' + prop + '</td><td><input type="number" style="width:50px;" name="amount_' + prop + '" size="3" value="'+(lastInput[prop] ? lastInput[prop] : 0) +'" min="0" class="project"/></td></tr>';
- }
- selStr += '</tbody></table>';
- _this.displayOverriddenContainer('Zeit für Ressourcen', '<h1>Wähle aus folgenden Bauprojekten:</h1>' + selStr +
- '<br /><div id="input_date_submit_2" class="default_button">Zeitbedarf berechnen</div><br />' + '<table class="full" id="result_total_need" style="width:500px;">' + '<thead>' + '<tr><th> </th><th>Ressource</th><th>Insgesamt Benötigt</th><th>Zeit verbleibend</th></tr>' + '</thead>' + '<tbody>' + '</tbody>' + '</table>');
- window.setTimeout(function() {
- mainDocument.getElementById('input_date_submit_2').addEventListener('click', function() {
- var el = mainDocument.getElementById('input_projects').getElementsByClassName('project');
- var need = {};
- for (var i = 0, l = el.length; i < l; i++) {
- var descr = el[i].name.split('_')[1];
- var n = neededMap[descr];
- var am = parseInt(el[i].value, 10);
- lastInput[descr] = am;
- if (!n)
- alert(n);
- for (var prop in n) {
- if (!n.hasOwnProperty(prop))
- continue;
- if (!need[prop])
- need[prop] = 0;
- need[prop] += am * n[prop];
- }
- }
- var tbody = mainDocument.getElementById('result_total_need').getElementsByTagName('tbody')[0];
- tbody.innerHTML = '';
- for (var prop in need) {
- if (!need.hasOwnProperty(prop))
- continue;
- var r = self.getRessourceById(parseInt(prop, 10));
- var dif = need[prop] - r.ressourceAmount;
- var time = dif / r.ressourceRate * 3600 * 1000;
- var str = '', cls = '';
- if (need[prop] <= 0) {
- str = 'Nicht benötigt.';
- cls = 'resource_bar_rate_positive';
- } else {
- if (dif < 0 && r.ressourceRate < 0) {// mehr da, nimmt aber ab
- str = 'Möglich bis in ' + _this.format(time, 'interval') + '.';
- cls = 'resource_bar_rate_positive';
- }
- if (dif < 0 && r.ressourceRate > 0) {// mehr da, nimmt zu
- str = 'Vorhanden.';
- cls = 'resource_bar_rate_positive';
- }
- if (dif > 0 && r.ressourceRate < 0) {// weniger da, nimmt ab
- str = 'Nicht möglich.';
- cls = 'resource_bar_rate_negative';
- }
- if (dif > 0 && r.ressourceRate > 0) {// weniger da, nimmt zu
- str = 'Möglich ab ' + _this.format(time, 'interval') + '.';
- cls = 'resource_bar_rate_negative';
- }
- }
- var rowHtml = '<tr><td>' + r.ressourceIcon + '</td><td>' + r.ressourceName + '</td><td>' + _this.format(need[prop], 'number', r.ressourceSymbol) + '</td><td><div class="'+cls+'">' + str + '</div></td></tr>';
- tbody.innerHTML += rowHtml;
- }
- });
- }, 100);
- });
- }, 100);
- }
- var addQueueButton = function() {
- var ul = ressourceContainer.getElementsByTagName('ul')[0];
- if (mainDocument.body.innerHTML.indexOf('queue_button"') === -1) {
- ul.innerHTML += '<li><input type="button" class="default_button" value="Bauwarteschlange" id="queue_button" /></li>';
- }
- window.setTimeout(function() {
- mainDocument.getElementById('queue_button').addEventListener('click', function() {
- self.displayBuildingQueue();
- });
- });
- };
- var init = function() {
- hideOverriddenContainer(); //nicer layout
- addTimeButton();
- addRessourceButton();
- addQueueButton();
- extract();
- self.updateTimeLeftDisplay();
- };
- init();
- var run = function() {
- extract();
- self.updateTimeLeftDisplay();
- };
- window.setInterval(run, 2000);
- }
- };
- var intervalStart = window.setInterval(handle, 500);
- function number_format(number, decimals, dec_point, thousands_sep) {
- number = (number + '')
- .replace(/[^0-9+\-Ee.]/g, '');
- var n = !isFinite(+number) ? 0 : +number,
- prec = !isFinite(+decimals) ? 0 : Math.abs(decimals),
- sep = (typeof thousands_sep === 'undefined') ? ',' : thousands_sep,
- dec = (typeof dec_point === 'undefined') ? '.' : dec_point,
- s = '',
- toFixedFix = function(n, prec) {
- var k = Math.pow(10, prec);
- return '' + (Math.round(n * k) / k)
- .toFixed(prec);
- };
- // Fix for IE parseFloat(0.55).toFixed(0) = 0;
- s = (prec ? toFixedFix(n, prec) : '' + Math.round(n))
- .split('.');
- if (s[0].length > 3) {
- s[0] = s[0].replace(/\B(?=(?:\d{3})+(?!\d))/g, sep);
- }
- if ((s[1] || '')
- .length < prec) {
- s[1] = s[1] || '';
- s[1] += new Array(prec - s[1].length + 1)
- .join('0');
- }
- return s.join(dec);
- }
- function handle() {
- var ifm = document.getElementById('ifm');
- if (ifm == null || typeof ifm === 'undefined' || ifm.contentWindow == null || ifm.contentWindow.document == null)
- return;
- var contWind = ifm.contentWindow.document;
- var main = contWind.getElementById('s1914');
- if (main == null || typeof main === 'undefined' || main.innerHTML == null)
- return;
- if (~main.innerHTML.indexOf('Global')) {
- window.clearInterval(intervalStart);
- (new ArmyCalculator()).init(main, contWind);
- }
- }
- }
- handleGameSite();