// ==UserScript==
// @name iks:virtonomic kvala_personal_indicator_zarplaty
// @version 1.64
// @namespace virtonomica
// @description Отображение максимального числа сотрудников, которое держит топ, а также максимальной технологии установленной в подразделении. Показ процентного соотношения зарплаты от среднегородской.
// @include http://*virtonomic*.*/*/main/unit/view/*
// @exclude http://*virtonomic*.*/*/main/unit/view/*/supply
// @exclude http://*virtonomic*.*/*/main/unit/view/*/manufacture
// @exclude http://*virtonomic*.*/*/main/unit/view/*/animals
// @exclude http://*virtonomic*.*/*/main/unit/view/*/sale
// @exclude http://*virtonomic*.*/*/main/unit/view/*/finans_report
// @exclude http://*virtonomic*.*/*/main/unit/view/*/technology/*
// ==/UserScript==
// Кнопки
var strBut = '<div class="popup scriptIks_cur"><a id="bootNewData" class="popup scriptIks_cur"><u>Показать по новым эффективностям</u></a></div>'
+'<div id="calcTop"><a id="calcToBloc" class="popup scriptIks_cur"><u>Калькулятор топ-1</u></a></div>';
// Справочные данные по новым эффективностям
var run = function(){
$('#bootNewData').click(function() {
$('body').append( '<div id="divBlock" style="background-color: #ccc; position: fixed; top: 0px; left: 0px; right: 0; bottom: 0; z-index: 9999; opacity: 0.5"></div>' );
var p = true;
if( $(this).html().indexOf('Показать') + 1 ) {
$(this).html('Обновить по новым эффективностям');
p = false;
}
var oID = {
i: ['Эффективность персонала', 'Эффективность оборудования', 'Эффективность животных', 'Эффективность топ-менеджера', 'Эффективность работы', 'Уровень управленческой нагрузки'],
v: ['Эффективность персонала', 'Эффективность оборудования', 'Эффективность оборудования', 'Эффективность топ-менеджера', 'Эффективность работы', 'Уровень управленческой нагрузки']
}
$.ajax({
url: $('td > a:contains("Эффективность работы")').attr("href"),
success: function(data){
$('#divBlock').remove();
for (var j = 0; j < 6; j++) {
var id = $("td:contains("+oID.i[j]+")");
if( id ) {
if(p) $(id).next().find('table:nth-child(2)').remove();
$(id).next().append( $(data).find('td:contains('+oID.v[j]+')').next().html().replace('%', '% (по новым эффективностям)') );
if( $(id).next().find('span:nth-child(2)') ) $(id).next().find('span:nth-child(2)').remove();
}
}
}
});
});
}
// Калькулятор
var run1 = function() {
var o = iksCalWork, str;
$( 'img[src*="812223"]' ).each ( function()
{
o.mode='Crocuta'; // алмазы
});
// o.mode='Crocuta';// офисная мистика
var k = o.getK( o.type );// 0;
if( k==0 ) return;
//////////////////////////////////
var total = parseInt( $('td:contains("Суммарное")').next().html().replace(/\s+/g, '') );
o.cur_pers = o.getPersonal( o.type );
var kv = parseInt( $('td:contains("Квалификация игрока")').next().html() );
$('#calcTopKv').val(kv);
// топ-3
$("td:contains('Суммарное')").next().each(function() {
var type_1 = o.type;
if (o.type == 'orchard') type_1 = 'farm';
pers = o.calcPersonalTop3(kv, type_1);
$('#calcTop3').html(pers);
var pers_next = o.calcPersonalTop3(kv+1, type_1);
o.overload = o.procVal(pers, total);
if(o.overload < 51) {
o.pP = 144.4;
$('#calcTopRab_MaxImp').val( o.pP );
}
str = ' <br><font color=' + ( (o.overload <= 100)?'green':(o.overload < 102)?'blue':'red' ) + '>Предельная нагрузка по квале: <b>';
str += pers+ '</b>'+' (на след.уровне: '+'<b>'+pers_next+'</b>)';
str += '<br>Загрузка топ-3: <b> ' + o.overload + ' %</b>';
if( o.overload<100 ) str += '<br>Свободно рабов: <b>' + (pers-total) + '</b>';
else if( o.overload>100 ) str += '<br>Перебор рабов: <b>' + (total-pers) + '</b>';
str += '</b></font>';
$(this).append( str );
});
// Количество работников
var nofp = o.getPersonal( o.type );
var emp_count = 0;
// топ-1
var kvp = 0;
$("td:contains('Уровень квалификации')").next().each(function() {
str = $(this).html();
num = str.match(/-?\d+(?:\.\d+)?/g, '');
kvp = num[0];
$('#calcTopKvRab').val(kvp);
if( num[0]*1 < num[2]*1 ) str = '<font color="red" title="Квалификация меньше требуемой по технологии">' + str + '</font>';
emp_count = o.calcPersonalTop1(kv, kvp, o.type);
$('#calcTopRabMax').html( emp_count );
$('#calcTopKolRab').val( o.cur_pers );
emp_count_next = o.calcPersonalTop1(kv+1, kvp, o.type);
var maxq = o.calcQualTop1(kv, o.cur_pers, o.type).toFixed(2);
$('#calcTopRab').html(maxq);
str += '<br><font color=gray>Максимальная квала для 100% по топ-1: <b>' + maxq + '</b></font>';
var num = Math.floor(emp_count/100*o.pP);
font = (emp_count >= nofp)?'green':(num >= nofp)?'orange':'red';
str += '<br>(<font color=' + font + '>Макс. кол. рабов: <b>' + (emp_count) + '</b></font>) ';
if( o.overload < 81 ) str += '<br>(<font color=' + font + '>'+o.pP+'% количества рабов: <b>' + num + '</b></font>)';
$('#calcTopRab_Max').html(num);
// процент загрузки по топ-1
var num = o.procVal(emp_count, nofp);
str += '<br><font color=' + ( (num <= 100)?'green':(num > o.pP)?'red':'orange' ) + '>Нагрузка по топ-1: <b>' + num + '%</b></font>';
///////////
str += '<br>(<font color=gray>На квале ' + (kv+1) + ' (следующий уровень): <b>' + (emp_count_next) + '</b></font>)';
if(o.mode=='Crocuta'){
var p5 = Math.floor(pers/5);
var k5 = o.calcQualTop1(kv, p5, o.type);
var e5 = o.calcEqQualMax(k5);
str += '<br>(<font color=olive>Special 05: <b>5 *' + p5 + '--' + k5.toFixed(2) + '(' + e5 + ')</b></font>)';
p5 = Math.floor(pers/10);
k5 = o.calcQualTop1(kv, p5, o.type);
e5 = o.calcEqQualMax(k5);
str += '<br>(<font color=olive>Special 10: <b>10*' + p5 + '--' + k5.toFixed(2) + '(' + e5 + ' )</b></font>)';
}
$(this).html( str );
});
// техна
var techn = 0;
var max_techn = 0;
$("td:contains('Уровень технологии')").next().each(function() {
techn = parseInt( $(this).html() );
$('#calcTopTehImp').val(techn);
max_techn = o.calcTechMax(kv);
$('#calcTopTeh').html(Math.floor(max_techn));
$(this).append( ' <br>(<font color=' + ( (max_techn < techn)?'red':'green' ) + '>Макс. технология: <b>' + (max_techn) + '</b></font>)' );
});
// Процент зарплаты
$("td:contains('Зарплата')").next().each(function() {
str = $(this).html();
zarp = str.replace(/\s+/g,'').match(/-?\d+(?:\.\d+)?/g, '');
zzz = zarp[0].replace(/[^\d\.]/g,'')/zarp[1].replace(/[^\d\.]/g,'')*100;
$(this).html( '<font color=' + ( (zzz > 90)?'blue':(zzz < 80)?'red':'green' ) + '>' + str + ' → ' + zzz.toFixed(2) + '%</font>' );
});
//оборудование
var eq, max_eq = 0;
$("td:contains('Качество'):first").next().each(function() {
eq = parseFloat( $(this).html() );
max_eq = o.calcEqQualMax(kvp);
$('#calcTopOb').html(max_eq);
$(this).append( ' <br>(<font color=' + ( (eq > max_eq)?'red':'green' ) + '>Макс. по персоналу: <b>' + (max_eq) + '</b></font>)' );
});
// реклама
$("td:contains('Расходы на рекламу'):first").next().each(function() {
$(this).append('<br>$'
+ (parseFloat( $(this).html().replace(/\s+/g,'').replace('\$','') )*7).toFixed(2).replace(/(\d)(?=(\d\d\d)+([^\d]|$))/g, '$1 ')
+ ' за реальную неделю');
});
}
// Окно калькулятора
var strCss = '#calcTop1 { background-color: white; position:fixed; right:10px; top:10px; margin:0; padding:0; width:230px; display:none;'
+' border: 2px solid #b4b4b4; box-shadow: 0 0 0 2px #708090, 0 0 0 4px #b4b4b4; border-radius:11px; -webkit-border-radius:11px; -moz-border-radius:11px; -khtml-border-radius:13px}'
+' .scriptIks_imp { border: 2px solid #708090; border-radius:50%; background:#e1e1e1; text-align:right }'
+' .scriptIks_cur { cursor: pointer }'
+' .scriptIks_exit {background: url("data:image/svg+xml;utf8,<svg xmlns=\'http://www.w3.org/2000/svg\' width=\'10\' height=\'10\'><path fill=\'none\' stroke=\'rgb(142,143,143)\' stroke-width=\'2\' d=\'M0,0 L10,10 M0,10 L10,0\' /></svg>") no-repeat;'
+' position: absolute; top:0; right:0; margin:0; padding:0; width:10px; height:10px; border: 4px solid gray; border-radius:50%; font-size:18px; color:darkred }'
+' .scriptIks_but { color:white; border:1px solid #708090; border-radius: 10px; background: #708090;'
+' background: linear-gradient(top, #e1e1e1, #708090, #e1e1e1);'
+' background: -webkit-linear-gradient(top, #e1e1e1, #708090, #e1e1e1);'
+' background: -moz-linear-gradient(top, #e1e1e1, #708090, #e1e1e1);'
+' background: -ms-linear-gradient(top, #e1e1e1, #708090, #e1e1e1);'
+' background: -o-linear-gradient(top, #e1e1e1, #708090, #e1e1e1) }';
strCal = '<div id="calcTop1"><div style="position:relative; margin:0; padding:0">'
+'<table style="width: 100%">'
+'<tr><td align="center" style="color: #708090; cursor: move" title="Переместить"><b><h1>Калькулятор</h1><b><hr></td></tr>'
+'<tr><td><table>'
+'<tr><td>Квалификация ТОПа</td> <td><input id="calcTopKv" type="text" size="4" class="scriptIks_imp"></td></tr>'
+'<tr><td>Технология</td> <td><input id="calcTopTehImp" type="text" size="4" class="scriptIks_imp"></td></tr>'
+'<tr><td>Количество работников</td> <td><input id="calcTopKolRab" type="text" size="4" class="scriptIks_imp"></td></tr>'
+'<tr><td>Квалификация работников</td> <td><input id="calcTopKvRab" type="text" size="4" class="scriptIks_imp"></td></tr>'
+'<tr><td align="center" colspan="2"><input id="calcButton" type="button" value="Расчитать" class="scriptIks_cur scriptIks_but"></td></tr>'
+'<tr><td align="center" colspan="2"><hr></td></tr>'
+'<tr><td>Максимальная технология<br>по данной квалификации</td> <td id="calcTopTeh" style="text-align: right;"></td></tr>'
+'<tr><td align="center" colspan="2"><hr></td></tr>'
+'<tr><td>Максимальное количество<br>персонала при<br>данной квалификации</td> <td id="calcTopRabMax" style="text-align: right;"></td></tr>'
+'<tr><td><input id="calcTopRab_MaxImp" value="120" type="text" size="4" class="scriptIks_imp" title="Укажите процент на какой расчитать">'
+' %</td> <td id="calcTopRab_Max" style="text-align: right;"></td></tr>'
+'<tr><td align="center" colspan="2"><hr></td></tr>'
+'<tr><td>Максимальная квалификация<br>персонала при данном количестве<hr></td> <td id="calcTopRab" style="text-align: right;"></td></tr>'
+'<tr><td>Минимальная квалификация<br>по данной технолигии</td> <td id="calcTopRabTeh" style="text-align: right;"></td></tr>'
+'<tr><td align="center" colspan="2"><hr></td></tr>'
+'<tr><td>Максимальное качество<br>оборудования при данной<br>квалификации персонала<hr></td> <td id="calcTopOb" style="text-align: right;"></td></tr>'
+'<tr><td>Качество оборудования<br>по данной технолигии</td> <td id="calcTopObTeh" style="text-align: right;"></td></tr>'
+'<tr><td align="center" colspan="2"><hr></td></tr>'
+'<tr><td>Максимальное количество<br>персонала в отрасли</td> <td id="calcTop3" style="text-align: right;"></td></tr>'
+'<tr><td align="center" colspan="2"><hr></td></tr>'
+'<tr><td align="right" colspan="2"><a href="http://calc.atlantis-corp.ru/" class="popup" title="Так-же расчет нагрузки ТОП-1 и многое другое..." target="_blank">'
+'<small>Калькулятор от DeMonyan</small></a></td></tr>'
+'</table></td></tr>'
+'<table>'
+'<div class="scriptIks_exit scriptIks_cur" id="calcExitBloc" title="Закрыть"></div>'
+'</div></div>';
// Работа с окном калькулятора
var run2 = function() {
var o = iksCalWork,
coordinatesCalc = {
'set': function(){
window.localStorage.setItem('coordinatesCalc',
JSON.stringify( {'top': $('#calcTop1').css('top'),
'left': $('#calcTop1').css('left') } ))
},
'get': function(){
if( window.localStorage.getItem('coordinatesCalc') ) return ( JSON.parse( window.localStorage.getItem('coordinatesCalc') ) );
else return ( { 'top': '10px', 'left': $('body').width() - $('#calcTop1').width() -10 + 'px' } );
}
},
coordinates = coordinatesCalc.get(),
calcTopGet = function()
{
var p = false;
if($('#calcTopTeh').html() != '') p = true;
// Максимум рабов ТОП-3
var kv = $('#calcTopKv').val();
var type_1 = o.type;
if ( o.type == 'orchard' ) type_1 = 'farm';
$('#calcTop3').html( o.calcPersonalTop3(kv, type_1) );
// Максимальная техна
if(p) $('#calcTopTeh').html( Math.floor( o.calcTechMax(kv) ) );
// Максимальное кол. рабов ТОП-1
var kvp = $('#calcTopKvRab').val();
var emp_count = o.calcPersonalTop1(kv, kvp, o.type);
$('#calcTopRabMax').html(emp_count);
var kvpTeh = o.kvTeh[$('#calcTopTehImp').val()];
$('#calcTopRabTeh').html(kvpTeh);
//-----
var maxRab = $('#calcTopRab_MaxImp').val();
$('#calcTopRab_Max').html( Math.floor(emp_count/100*maxRab) );
// Макс. квала рабов
o.cur_pers = $('#calcTopKolRab').val();
$('#calcTopRab').html( o.calcQualTop1( kv, o.cur_pers, o.type ).toFixed(2) );
// Макс. оборудование
var max_eq = o.calcEqQualMax(kvp);
$('#calcTopOb').html(max_eq);
if(p) $('#calcTopObTeh').html( o.calcEqQualMax( kvpTeh ) );
else $('#calcTopObTeh').html('');
}
calcTopGet();
$('#calcButton').click(function(){ calcTopGet() });
$('#calcTop1').css('calcTop1', 'none');
$('#calcToBloc').click(function(){
$('#calcTop').css('display', 'none');
$('#calcTop1').css('display', 'block');
});
$('#calcExitBloc').click(function(){
$('#calcTop').css('display', 'block');
$('#calcTop1').css('display', 'none');
});
$('#calcTop1').css({
'top': coordinates.top,
'left': coordinates.left
}).draggable({
cancel: '#calcTop1 table table',
containment: 'body',
cursor: 'move',
snap: 'body'
});
$('#calcTop1 h1').mouseup( coordinatesCalc.set );
}
// Функции
var fun = function() {
return({
'type': 'unknow', 'pP': 120, 'cur_pers': '', 'overload': 0, 'mode': '',
'kvTeh': [0, 1, 1.74, 2.41, 3.03, 3.62, 4.19, 4.74, 5.28, 5.8,
6.31, 6.81, 7.3, 7.78, 8.26, 8.73, 9.19, 9.65, 10.1, 10.54,
10.99, 11.42, 11.86, 12.29, 12.71, 13.13, 13.55, 13.97, 14.38, 14.79,
15.19, 15.6, 16, 16.4, 16.8, 17.19, 17.58, 17.97, 18.36, 18.74,
19.13],
///////////////////////////////////////////////////////////////////////////
//function calcPersonalTop3(q, type)
// q - квалификация игрока
//вычисляет максимальное кол-во работающих на предприятиях отрасли для заданной квалификации игрока (топ-3)
'calcPersonalTop3': function( q, type) {
return (2*q*q + 6*q)*this.getK(type);
},//end calcPersonalTop3()
///////////////////////////////////////////////////////////////////////////
//function calcPersonalTop1(q, qp,type)
// q - квалификация игрока
// qp - квалификация персонала
//вычисляет максимальное кол-во работающих с заданной квалификацией на предприятиии для заданной квалификации игрока (топ-1)
'calcPersonalTop1': function(q, qp, type) {
if((this.mode=='Crocuta')&&(type=='office')){return Math.floor(14*q*q/Math.pow(1.4, qp)/4.15);}
return Math.floor(0.2*this.getK(type)*14*q*q/Math.pow(1.4, qp));
},//end calcPersonalTop1()
///////////////////////////////////////////////////////////////////////////
//function calcQualTop1(q, p, type)
// q - квалификация игрока
// p - численность персонала
//вычисляет максимальное квалификацию работающих при заданных их численности и квалификации игрока (обратна calcPersonalTop1())
'calcQualTop1': function(q, p, type) {
if(p==0) return 0.00;
if((this.mode=='Crocuta')&&(type=='office')){return Math.log(14/4.15*q*q/p)/Math.log(1.4);}
return Math.log(0.2*14*this.getK(type)*q*q/p)/Math.log(1.4);
},//end calcQualTop1()
///////////////////////////////////////////////////////////////////////////
//function calcTechMax(q)
// q - квалификация игрока
//вычисляет максимальный уровень технологии для заданной квалификации игрока
'calcTechMax': function(q) {
return Math.round(10*Math.pow(q/0.0064, 1/3))/10 ;
},//end calcTechMax()
///////////////////////////////////////////////////////////////////////////
//function calcEqQualMax(q)
// qp - квалификация игрока
//вычисляет максимальное качество оборудования/животных для заданной квалификации персонала
'calcEqQualMax': function( qp ) {
return Math.floor(100*Math.pow(qp, 1.5))/100 ;
},//end calcEqQualMax
///////////////////////////////////////////////////////////////////////////
//getK(type)
//возвращает к для расчётов нагрузки по типу
'getK': function (type) {
switch(type) {
case('shop'):
case('restaurant'):
case('lab'):
return 5;
break;
case('workshop'):
case('mill'):
case('sawmill'):
return 50;
break;
case('animalfarm'):
return 7.5;
break;
case('medicine'):
case('fishingbase'):
return 12.5;
break;
case('farm'):
return 20;
break;
case('orchard'):
return 18;
break;
case('mine'):
return 100;
break;
case('office'):
//if(mode=='Crocuta') return
return 1;
break;
case('service'):
return 1.5;
break;
case('repair'):
case('fuel'):
return 2.5;
break;
case('power'):
return 75;
break;
case('villa'):
case('warehouse'):
case('unknown'):
default:
return 0;
}//end switch
},//end getType()
///////////////////////////////////////////////////////////////////////////
//getPersonal(type)
//возвращает кол-во работников на предприятии (по типу)
'getPersonal': function(type) {
var temp = this.getPersonal_1(type);
if(temp=='' || temp== -1) return (-1); //error
return parseInt($('td:contains('+temp+')').next().html().replace(/\s+/g, ''));
},//end getPersonal()
'getPersonal_1': function(type) {
switch(type) {
case('lab'):
return 'Количество учёных';
break;
case('workshop'):
case('mill'):
case('mine'):
case('fishingbase'):
case('sawmill'):
case('power'):
return 'Количество рабочих';
break;
case('animalfarm'):
case('orchard'):
case('farm'):
return 'Количество работников';
break;
case('medicine'):
case('office'):
case('shop'):
case('restaurant'):
case('service'):
case('fuel'):
case('repair'):
return 'Количество сотрудников';
break;
case('villa'):
case('warehouse'):
case('unknown'):
default:
return (-1);
break;
}//end switch
},//end getPersonal_1()
///////////////////////////////////////////////////////////////////////////
//function procVal(num, val)
//возвращает процент от val по отношению к nun
'procVal': function(num, val) {
num = val/(num/100);
if (num) return num.toFixed(2);
else return '0.00';
}//end procVal()
});
}
// Расчет количества поситителей в ресторанах, сервисах, медцентрах
var run3 = function(){
// максмальное количество поситетилей по персоналу
var d,
persKol = $("td:contains('Количество сотрудников')").next().html().replace(/\s+/g, '').match(/\d[.\s\d]*(?=)/g),
spec = $("td:contains('Специализация')").next().html();
if(persKol[0] > persKol[1]) persKol[0] = persKol[1];
switch(spec) {
case('Больница'):
d = 0.2;
break;
case('Стоматологическая клиника'):
d = 0.5;
break;
case('Фитнес'):
case('Йога'):
case('Бодибилдинг'):
case('Группы здоровья'):
case('Профессиональный спорт'):
case('Скалолазание'):
case('Диагностический центр'):
case('Поликлиника'):
d = 5;
break;
case('Прачечная'):
case('Химчистка'):
case('Прачечная самообслуживания'):
case('SPA-салон'):
d = 10;
break;
case('Косметический салон'):
d = 20;
break;
case('Рыбный ресторан'):
case('Устричный ресторан'):
d = 30;
break;
case('Парикмахерская'):
case('Сырный ресторан'):
d = 40;
break;
case('Стейк ресторан'):
case('Вегетарианский ресторан'):
case('Ресторан мексиканской кухни'):
d = 50;
break;
case('Пивной ресторан'):
case('Ресторан итальянской кухни'):
case('Ресторан греческой кухни'):
d = 60;
break;
case('Фастфуд'):
d = 70;
break;
case('Кафе-мороженое'):
case('Кафе-кондитерская'):
case('Кофейня'):
case('Блинная'):
d = 80;
break;
default:
d = 1;
}
var maxPer = persKol[0] * d;
$("td:contains('Количество посетителей')").next().each(function() {
var str = $(this).html(),
pos = str.replace(/\s+/g, '').match(/\d[.\s\d]*(?=)/g),
proc = Math.round(pos[0]/(maxPer/100));
if(!proc) proc = 0;
$(this).append( '<br>Макс. по персоналу: ' + maxPer.toFixed(0).toString().replace(/(\d)(?=(\d\d\d)+([^\d]|$))/g, '$1 ')
+'<br>Посещаемость: ' + proc.toFixed(0) + '%' );
});
}
if(window.top == window) {
var type = $("#unitImage img").attr('src').replace('\/img\/v2\/units\/', '').replace('_light', '');
type = type.substr(0,type.length-6);
switch(type) {
case 'shop':
case 'workshop':
case 'mill':
case 'animalfarm':
case 'medicine':
case 'restaurant':
case 'orchard':
case 'farm':
case 'mine':
case 'lab':
case 'villa':
// case 'warehouse':
case 'fishingbase':
case 'office':
case 'sawmill':
case 'service':
case 'power':
case 'repair':
case 'fuel':
{
$('head').append( '<style type="text/css"> ' + strCss + ' </style>'
+' <script type="text/javascript"> var iksCalWork = (' + fun.toString() + ')(); </script>' );
iksCalWork.type = type;
$('#unit_subtab').append( '<br>' + strBut );
$('body').append( strCal );
$('head').append( '<script type="text/javascript">'
+' ('+run.toString()+')();'
+' ('+run1.toString()+')();'
+' ('+run2.toString()+')();'
+( (type == 'restaurant' || type == 'service' || type == 'medicine') ? ( ' ('+run3.toString()+')();' ) : '' )
+' </script>' );
}
break;
default:
return;
}
}