您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Отображение максимального числа сотрудников, которое держит топ, а также максимальной технологии установленной в подразделении. Показ процентного соотношения зарплаты от среднегородской.
当前为
// ==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; } }