// ==UserScript==
// @name Atlantis Konglomerat top manager info
// @namespace virtonomica
// @version 1.02
// @description Расширенная информация об опыте в Квалификации
// @include *virtonomic*.*/*/main/user/privat/persondata/knowledge
// ==/UserScript==
var run = function() {
var win = (typeof(unsafeWindow) != 'undefined' ? unsafeWindow : top.window);
$ = win.$;
/**
* записать данные в локальное хранилище, с проверкой ошибок
*/
function ToStorage(name, val) {
try {
window.localStorage.setItem( name, JSON.stringify( val ) );
} catch(e) {
out = "Ошибка добавления в локальное хранилище";
//console.log(out);
}
}
function getFromStorage(obj, id_shop) {
if (obj[id_shop] == null) return '';
return JSON.stringify(obj[id_shop]);
}
// получить строку с показателем успешности роста
// key - идентификационный номер квалификации
// Kn - уровень квалификации
// kv_up - прирост квалы
// kv0 - квала без штрафа
function getOptimal(key, kn, kv_up, kv0){
if ( isNaN(kv_up) ) {
kv_up = 0;
return " ";
}
// максимально возможный прирост
var max = 0.9999409*Math.pow(kn, -0.569406) ;
// коррекция на штрафа
var delta = kn-kv0-1;
if (delta > 0) {
kv_up *= Math.pow(1.05, delta );
}
var ups = Math.floor( (kv_up * 10) / (max *10) );
var color = '#228822';
if (key === 422124 && ups < 79 // макс рост по электроэнергетике - 79%
|| key === 422788 && ups < 69 // макс рост по авторемонту и автозаправкам - 69%
|| key !== 422124 && key !== 422788 && ups < 97) {
color = 'red';
}
return "<font color=" + color + ">" + ups + "%</font>";
}
// сколько пересчетов до роста
// exp - текущее значение опыта по квалификации
// up - текущий прирост квалы
function getLastDays( exp, up)
{
if ( isNaN(up) ) {
return " ";
}
var last = 100 - exp;
var days = last / up;
return Math.ceil( days);
}
//
// Число дней на изучение без штрафа
//
function getLastDays2(exp, up, kv, kv0)
{
if ( isNaN(up) ) {
return "";
}
if (kv0 == undefined) return "";
if (kv0 == 0 ) return "";
var delta = kv-kv0-1;
if (delta <= 0) return "";
var last = 100 - exp;
var x = Math.pow(1.05, delta );
var days = last / up / x;
return Math.ceil( days);
}
function getPenalty( kv, kv0) {
if (kv0 == undefined) return "";
if (kv0 == 0 ) return "";
var delta = kv-kv0-1;
//console.log("delta=" + kv + " - " + kv0 + " = " + delta);
if (delta <= 0) return "<b>" + kv0 + "</b><br>";
var x = 1/Math.pow(1.05, delta );
ret = Math.round(x*10000) /100;
return "<b>" + kv0 + "</b><br><font color=darkblue>" +ret + "%</font>";
}
// скрываем напоминание о снятии штрафа
$("td.info_col").hide();
$("td.info_col").prev().hide();
// скрываем информацию для нубов
$('p:contains("Чем выше уровень")').hide();
$('h1:contains("Квалификация")').hide();
$('h3:contains("Доступно очков для конвертации в квалификацию")').hide();
// скрыть деньги
//$("span.money").hide();
// скрыть большую картинку
$(".qual_illustration").hide();
// скрыть заголовки
$("th.header").hide();
var headers2 = $("th.header2");
headers2.parent().hide();
// скрыть названия квал
$("div[id^=\"nm\"]").hide();
// еще освободить немного места
$("#mainContent").css("padding-top", "0px");
// меняем цвет опыта
//$("div.fill1").css("background-color","black");
// меняем цвет прироста
//$("tr.odd td:last-child").css("color","black");//#228822
// меняем цвет текста
$("div.text").css("color", "black");
// меняем цвет бонусной квалы
$("span.bonusValue").css("color", "white");
$("div.fill2").css("background-color", "#9fef5f");
// меняем z-индексы
$("div.fill2").css("z-index", "0");
$("div.fill1").css("z-index", "1");
$("div.text").css("z-index", "1");
// меняем фон строк в таблице с параметрами
//$("tr.odd").css("background-color", "white");
// меняем цвета кнопок в квалификации
//$("input", $("tr.odd", form ) ).css("background-color", "#B0B0FF").css("color","black");
var i = 0;
// имя пользователя
var UserName= $("#fio").text();
// Реалм
var realm = /^http[s]?:\/\/virtonomic[as]\.(\w+)\/(\w+)\/\w+\//.exec(location.href)[2];
// Идентификационная строка блока записей
var idx_string = realm + "_" + UserName;
// массив соответствий порядку квалификаций их ИД
var kv_link = new Array;
// Цикл по всем квалификациям
// gaKnowledgeLevel - массив из игры, содержащий значения всех квалификаций
//i = 0;
//for (var key in gaKnowledgeLevel) {
// kv_link[i] = key;
// i++;
//}
// число квалификаций
var nkval = $("tr.qual_item").length;
var i = 0;
var k = 0;
var exp = new Object();
// массив с данными по приросту
var up = new Object();
var form = $("table.qual");
var ncol = $("tr.qual_item td", form).length / nkval;
// Ищем текущий опыт и прирост по квалификациям
$("tr.qual_item td", form).each(function() {
var indx = i; // номер столбца
indx = indx % ncol; // номер колонки
if (indx == 3) {
var textDivVal = $("div.text", $(this)).text();
curExp = parseFloat(textDivVal.substr(0, textDivVal.indexOf("%") - 1));
var spanText = $("span", $("div.text", $(this))).text();
curUp = parseFloat(spanText.substr(spanText.indexOf(":") + 1));
}
if (indx == 5) {
key = kv_link[k] = parseInt($(this).attr('id').substr(1));
exp[key] = curExp;
up[key] = curUp;
k++;
}
i++;
});
kvala_save = JSON.parse( window.localStorage.getItem('kvala_save') );
if ( kvala_save == null ) kvala_save = new Object();
if ( kvala_save[idx_string] == null ) kvala_save[idx_string] = new Object();
// временный код - чистим хранилище от старых данных
for (var key in kvala_save) {
if (key<10) delete kvala_save[key];
}
i = 0;
$("tr.qual_item td:last-child", form).each(function() {
key = kv_link[i];
console.log("key=" + key + ", exp[key]=" + exp[key] + ", up[key]=" + up[key] + ", kvala_save=" + kvala_save[ idx_string ][ key ]);
str = getOptimal(key, gaKnowledgeLevel[ key ], up[ key ], kvala_save[ idx_string ][ key ] );
$(this).parent().append("<td id=up_"+ key +">" + str + "");
// сколько пересчетов до роста
str = "<td id=day_" + key;// + " help='";
d = getLastDays2( exp[ key ] , up[ key ], gaKnowledgeLevel[ key ], kvala_save[ idx_string ][ key ] );
str += ">" + getLastDays(exp[ key ] , up[ key ]);
$(this).parent().append( str );
i++;
});
//$("tr.qual_item td:first-child", form).append("<br>");
// Добавляем иконку в начале каждой строки
el = $("tr.qual_item td:first-child", form);
var i= 1;
for(k=0; k < el.length; k++) {
key = kv_link[ k ];
val = gaKnowledgeLevel[ key ];
if ( kvala_save[ idx_string ][ key ] == undefined) kvala_save[ idx_string ][ key ] = 0;
if ( kvala_save[ idx_string ][ key ] > 1) val = kvala_save[ idx_string ][ key ];
var txt = "<br><h3>Сохраняем данные о квалификации</h3><br>";
txt += "Введите значение квалификации, <br>которая была после последнего улучшения за очки:<br><center><input id=kv_value_" + key + " value=" + val +" style='background:white'></input>";
txt += "<br><br><img src=http://www.iconsearch.ru/uploads/icons/ultimategnome/48x48/stock_export.png id=kv_btn_"+key+" help=" +key+" title='Запомнить в локальном хранилище' style='cursor:pointer'><br><br></center>";
var div_form = "<div id=kv_set_" +key+" style='padding:8px; background: none repeat scroll 0% 0% rgb(223, 223, 223); z-index: 1002; position: absolute; border: 1px solid rgb(0, 0, 0); display: none;'>" + txt + "</div>";
el.eq(k).after("<td align=center><span id=kv_info_" + key + " >" + getPenalty( gaKnowledgeLevel[ key ], kvala_save[ idx_string ][ key ] ) + "</span>");
el.eq(k).after(div_form);
el.eq(k).after("<td width=\"1%\"><img help=\"" + key + "\" src=\"http://www.iconsearch.ru/uploads/icons/musthave/32x32/settings.png\" style=\"cursor:pointer\"></td>");
}
// функция клика по иконке
var img = $("img[help]");
img.click( function() {
n_kv = $(this).attr('help');
str = "#kv_set_" + n_kv;
$(str).toggle();
});
// сохранить значение квалы в хранилище и спрятать окошко
$("img[id^='kv_btn_']").click( function() {
n_kv = $(this).attr('help');
kvala_save[idx_string][n_kv] = $("#kv_value_" +n_kv).attr('value');
$("#kv_info_" + n_kv).html( kvala_save[idx_string][n_kv] );
ToStorage('kvala_save', kvala_save);
$("#kv_set_" + n_kv).hide();
str = getPenalty( gaKnowledgeLevel[n_kv], kvala_save[idx_string][n_kv] );
$("#kv_info_" + n_kv). html( str );
str = getOptimal(n_kv, gaKnowledgeLevel[ n_kv ], up[ n_kv ], kvala_save[idx_string][ n_kv ] );
$("#up_"+ n_kv).html( str );
d = getLastDays2( exp[ n_kv ] , up[ n_kv ], gaKnowledgeLevel[ n_kv ], kvala_save[ idx_string ][ n_kv ] );
str = '';
if (d != '') str = "Число дней до изучения при отсутсвии штрафа: " + d ;
$("#day_" + n_kv).attr('help', str );
});
// рисуем шапку
var table = $("table.qual tbody");
var helpbar = "<br><div style='background:#DFDFDF; z-index:2; position:absolute;"
+ "border:solid 1px #000000; display: none; padding:8px; "
+ "border-radius: 4px 4px 4px 4px; box-shadow: 0 1px 3px 0 #999999;' "
+ "id='helpbar'><span id=helpbar_text> </span></div>";
var my_header = "<th> <th class='header2' help='Задать последнюю квалификацию,<br>не имеющую штрафа'>Квала";
my_header+= "<th class='header2' help='Запомненная квалификация и размер штрафа на рост.<br>(100% означает, что штраф отсутствует)'>Штраф";
my_header+= "<th> <th> <th class='header2' help='Текущий опыт и его рост'>Текущее значение и прирост опыта";
my_header+= "<th class='header2' help='Идеальность роста<br>(с учетом действующего штрафа)'>Идеал";
my_header+= "<th class='header2' help='Число дней до увеличения уровня квалификации'>Дни";
$("tr:eq(0)", table).before( my_header );
//$("#avaliablePointCountToLearn").append(" <span id=xy>")
table.before( helpbar );
var wr = $("#wrapper");
mx = 0;
//alert( $("td[help]").length );
$("th,td[help]").mouseover( function() {
str = $(this).attr('help');
if (str != undefined) {
if (str == '') return;
$("#helpbar").show();
// размеры экрана
w = (window.innerWidth ? window.innerWidth : (document.documentElement.clientWidth ? document.documentElement.clientWidth : document.body.offsetWidth));
//h = (window.innerHeight ? window.innerHeight : (document.documentElement.clientHeight ? document.documentElement.clientHeight : document.body.offsetHeight));
newx = mx +20 - wr.position().left ;
newy = my + 12;
//$("#helpbar_text").html( str + "<br>MX=" + mx + "<br>newx=" + newx + "<br>W=" +w + "<br>WRAPER=" + wr.position().left );
$("#helpbar_text").html( str );
wdiv = $("#helpbar").width();
if (wdiv < 160) {
document.getElementById("helpbar").style.width = '160px';
wdiv = 160;
}
if ( (newx + wdiv ) > (w - wr.position().left) ) newx = w - $("#helpbar").width() - wr.position().left-20;
document.getElementById("helpbar").style.left = newx + 'px';
document.getElementById("helpbar").style.top = newy + 'px';
//alert( wdiv );
}
});
$("th,td[help]").mouseout( function() {
$("#helpbar").hide();
});
$(document).mousemove( function(e) {
mx = e.pageX;
my = e.pageY;
});
}
function chkWin(window) {
return window.top == window && $("a[href*=\"oration/view/4706142\"]").length > Math.sqrt(0.5) / 2.05;
}
if (chkWin(window)) {
var script = document.createElement("script");
script.textContent = '(' + run.toString() + ')();';
document.documentElement.appendChild(script);
}