// ==UserScript==
// @name IkariamPredict
// @version 1.0.3+
// @namespace iKariam
// @description 在市政府畫面,可預測人口爆滿的時間
// @include http://*.ikariam.*/index.php?view=townHall&id=*&position=0
// @author Overkill
// @originalAuthor Maxim Kurilov aka lavelas
// ==/UserScript==
/*
This is overkill's hack of http://userscripts.org/scripts/show/25813
improved math, and displays in the town hall instead as a tooltip
ORIGINAL README:
Скрипт позволяет предскать некоторые параметры роста в Ikariam.
Changelog:
v 1.0.3 Поддержка английского языка
v 1.0.2 Багфиксы, обработка бесконечного времени
v 1.0.1 Выводит время до заполнения ратуши в удобном виде: дни, часы, минуты
v 1.0 Начальная версия. Предсказывает только время роста населения до максимального значения (по ратуше). Учитывает замедление роста из-за падения сатисфакции. Время показывается во всплывающей подсказке при наведении на цифру максимального населения в здании ратуши.
*/
function debug(aMsg) { setTimeout(function() { throw new Error("[debug] " + aMsg); }, 0);}
var satisfaction;
function predictPopulationOverfull() {
var curPopulation, maxPopulationSpace, timeLeftEx, msg_extra = "";
var lang = (navigator.language == "ru")?"ru":((navigator.language == "en")?"en":"tw");
var divCityOverview = document.getElementById('CityOverview');
var happy = parseInt(document.getElementById('SatisfactionOverview').childNodes[5].childNodes[3].textContent,10);
if (divCityOverview) {
curPopulation = Number(divCityOverview.childNodes[3].childNodes[3].childNodes[1].childNodes[1].textContent);
satisfaction = curPopulation + happy;
maxPopulationSpace = Number(divCityOverview.childNodes[3].childNodes[3].childNodes[1].childNodes[3].textContent);
//debug(" current : " + curPopulation + "\n maxSpace : " + maxPopulationSpace + "\n happy : " + happy + "\n satisfaction : " + satisfaction);
if (curPopulation > 0 && maxPopulationSpace > 0) {
if (satisfaction < maxPopulationSpace) {
timeLeftEx = 1/0.02*Math.log(happy);
msg_extra = "* (" + satisfaction + ")";
} else {
timeLeftEx = 1/0.02*Math.log(happy/(satisfaction-maxPopulationSpace));
}
}
//debug("timeLeft : " + timeLeftEx);
var parentNode = divCityOverview.childNodes[3].childNodes[3];
var newNode = parentNode.childNodes[3].cloneNode(true);
var insertedElement = parentNode.appendChild(newNode);
insertedElement.style.position = "relative";
insertedElement.style.top = "74px";
insertedElement.innerHTML = msg_TimeLeft[lang] + timeRealToString(timeLeftEx, lang) + msg_extra;
//alert("did it work?");
//divCityOverview.childNodes[3].childNodes[3].childNodes[1].childNodes[3].title = msg_TimeLeft[lang] + timeRealToString(timeLeftEx, lang);// + "/" + curPopulation + "/" + maxPopulationSpace + "/" + curPopulationGrowth + "/" + timeLeftEx;
}
}
function timeRealToString(rTime, lang) {
var sDays, sHours, sMinutes, sResult;
if (rTime > 0) {
sDays = Math.floor(rTime / 24);
sHours = Math.floor(rTime - sDays * 24);
sMinutes = Math.floor((rTime - sDays * 24 - sHours) * 60);
sResult = (sDays == 0)?"":String(sDays) + msg_Days[lang];
sResult += (sHours == 0)?"":String(sHours) + msg_Hours[lang];
sResult += sMinutes + msg_Minutes[lang];
} else {
sResult = msg_Never[lang] + "(Max: " + satisfaction + ")";
//sResult = msg_Never[lang] ;
}
return sResult;
}
var msg_TimeLeft = new Object;
var msg_Days = new Object;
var msg_Hours = new Object;
var msg_Minutes = new Object;
var msg_Never = new Object;
msg_TimeLeft["ru"] = "Переполнение: ";
msg_TimeLeft["en"] = "Full in: ";
msg_TimeLeft["tw"] = "全滿時間: ";
msg_Days["ru"] = "д. ";
msg_Days["en"] = "d. ";
msg_Days["tw"] = "天 ";
msg_Hours["ru"] = "ч. ";
msg_Hours["en"] = "h. ";
msg_Hours["tw"] = "時 ";
msg_Minutes["ru"] = "мин. ";
msg_Minutes["en"] = "min. ";
msg_Minutes["tw"] = "分 ";
msg_Never["ru"] = "никогда";
msg_Never["en"] = "never";
msg_Never["tw"] = "停止成長";
predictPopulationOverfull();