//
// ==UserScript==
// @name hwm_work_find
// @author Pahan https://greasyfork.org/uk/users/18377-pahan
// @namespace hwm_pahan
// @description Поиск места работы с любой страницы игры
// @homepage https://greasyfork.org/uk/scripts/13911-hwm-work-find
// @icon http://dcdn.heroeswm.ru/avatars/30/nc-5/30547.gif
// @version 2.17
// @encoding utf-8
// @include http://www.heroeswm.ru/*
// @include http://qrator.heroeswm.ru/*
// @include http://178.248.235.15/*
// @include http://www.lordswm.com/*
// @exclude */rightcol.php*
// @exclude */ch_box.php*
// @exclude */chat*
// @exclude */ticker.html*
// @exclude */frames*
// @exclude */brd.php*
// @grant GM_deleteValue
// @grant GM_getValue
// @grant GM_listValues
// @grant GM_setValue
// @grant GM_addStyle
// @grant GM_log
// @grant GM_openInTab
// @grant GM_xmlhttpRequest
// @grant GM_setClipboard
// ==/UserScript==
(function() {
var version = '2.17';
var idn = 'work_find';
var str_url = 'https://greasyfork.org/ru/scripts/13911-hwm-work-find';
var str_script_name = 'Поиск места работы';
var str_url_aut = '/sms-create.php?mailto=Pahan&subject=Скрипт: '+str_script_name+' v'+version+'. Найдена ошибка:';
var str_url_sps = '/transfer.php?pahan_sps=' + encodeURIComponent('Подарок. Спасибо за скрипт: '+str_script_name+' v'+version+'.');
if (typeof GM_deleteValue != 'function') {
this.GM_getValue=function (key,def) {return localStorage[key] || def;};
this.GM_setValue=function (key,value) {return localStorage[key]=value;};
this.GM_deleteValue=function (key) {return delete localStorage[key];};
this.GM_addStyle=function (key) {
var style = document.createElement('style');
style.textContent = key;
document.querySelector("head").appendChild(style);
};
}
if (typeof GM_listValues != 'function') {
this.GM_listValues=function () {
var values = [];
for (var i=0; i<localStorage.length; i++) {
values.push(localStorage.key(i));
}
return values;
}
}
if (typeof GM_setClipboard != 'function') {
this.GM_setClipboard=function (key) {}
}
GM_addStyle('.dialog {background-color: #F6F3EA; border-radius: 5px; box-sizing: border-box; box-shadow: 0 0 0px 12px rgba(200, 200, 200, 0.5); left: calc(50% - 300px); max-height: calc(100% - 100px); overflow: auto; padding: 15px; position: fixed; top: 50px; z-index: 1105;}');
GM_addStyle('.dialogOverlay {background-color: rgba(0, 0, 0, 0.7); height: 100%; left: 0; position: fixed; top: 0; width: 100%;}');
GM_addStyle('.btn_close {position:absolute;left:calc(100% - 45px);float:right;border:1px solid #abc;width:15px;height:15px;text-align:center;cursor:pointer;}');
GM_addStyle('.btn_settings {text-decoration:underline;cursor:pointer;font-weight:bold;font-size:10px;width:500px;}');
GM_addStyle('.small_text {font-weight:bold;font-size:10px;}');
GM_addStyle('.blue {color:#0070FF;}');
GM_addStyle('.blueRef {text-decoration:underline;cursor:pointer;font-weight:bold;font-size:12px;width:500px;color:#0070FF;}');
function addEvent(elem, evType, fn) {
// elem["on" + evType] = fn;
if (elem.addEventListener) {
elem.addEventListener(evType, fn, false);
}
else if (elem.attachEvent) {
elem.attachEvent("on" + evType, fn);
}
else {
elem["on" + evType] = fn;
}
}
function $(id) { return document.querySelector(id); }
function URLAttrValueGet(attr_name, aurl)
{
attr_name = attr_name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
var regexS = "[\\?&]" + attr_name + "=([^&#]*)";
var regex = new RegExp( regexS );
var results = regex.exec( aurl );
if( results == null )
return "";
else
return results[1];
}
function Ajax(AMethod, AURL, AParams, ACallBackFunc)
{
var LRequest = new XMLHttpRequest();
LRequest.open(AMethod, AURL, true);
LRequest.overrideMimeType('text/html; charset=windows-1251');
LRequest.send(AParams);
LRequest.onreadystatechange = function()
{
if (LRequest.readyState == 4)
{
ACallBackFunc(LRequest.responseText, AURL);
}
};
}
function Trim(AText)
{
return AText.replace(/^\s+|\s+$|^( )+|( )+$/g, '');
}
function DeleteCRLF(AText)
{
return AText.replace(/[\n\r]/g, ' ').replace(/\s{2,}/g, ' ');
}
function Assert(ACondition, AMessage)
{
if (ACondition)
return;
alert('ERROR: ' + AMessage);
throw new Error(AMessage);
}
function FloatFormat(AFloat)
{
return Math.round(AFloat).toString();
}
function IntFormatWithThouthandSeparator(num){
var
n = num.toString(),
p = n.indexOf('.');
return n.replace(/\d(?=(?:\d{3})+(?:\.|$))/g, function($0, i){
return p<0 || i<p ? ($0+',') : $0;
});
}
// ------------------ dialog
function close_setting_form (){
var bg = $('#bgOverlay' + idn) ;
var bgc = $('#bgCenter' + idn) ;
if( bg ) {
bg.style.display = bgc.style.display = 'none' ;
}
}
function clear_all_params()
{
if (confirm("Вы действительно хотите скинуть все сохраненные настройки?"))
{
var keys = GM_listValues();
for (var i=0, key=null; key=keys[i]; i++) {
GM_deleteValue(key);
}
close_find_work_info();
}
}
function setCheck(ch)
{
if( GM_getValueExt( ch ) && GM_getValueExt( ch ) == 1 )
GM_setValueExt( ch , 0 );
else
GM_setValueExt( ch , 1 );
}
function setEdit(id, key)
{
var LValue = parseInt($('#' + id).value);
GM_setValueExt(key, LValue);
}
function show_dialog_base(ASettingsHTML)
{
var bg = $('#bgOverlay' + idn) ;
var bgc = $('#bgCenter' + idn) ;
if( !bg ) {
bg = document.createElement('div') ;
bg.id = 'bgOverlay' + idn;
document.body.appendChild( bg );
bg.className = 'dialogOverlay';
addEvent(bg, 'click', close_setting_form);
bgc = document.createElement('div') ;
bgc.id = 'bgCenter' + idn ;
document.body.appendChild( bgc );
bgc.className = 'dialog';
bgc.innerHTML =
'<div style="border:1px solid #abc;padding:5px;margin:2px;">' +
' <div class="btn_close" id="bt_close'+idn+'" title="Закрыть">x</div>' +
' <center>' +
' <table>' +
' <tr>' +
' <td><b>'+str_script_name+' <b class="blue">'+version+'</b></b></td>' +
' </tr>' +
' <tr><td><hr/></td></tr>' +
' <tr>' +
' <td><div id="dialog_content'+idn+'">(Empty)</div></td>' +
' </tr>' +
' <tr><td><hr/></td></tr>' +
' <tr>' +
' <td class="small_text" >' +
' <a class="small_text" href="'+str_url+'">Обновить</a> ' +
' <a class="small_text" href="'+str_url_aut+'">Нашли ошибку?</a> ' +
' <a class="small_text" href="'+str_url_sps+'">Сказать спасибо</a> ' +
' <a class="small_text" style="left:calc(50% - 100px);" href="javascript:void(0);" id="settings_reset'+idn+'">Скинуть все настройки</a> ' +
' </td>' +
' </tr>' +
' <tr>' +
' <td class="small_text" >' +
' Автор: <a class="small_text" href="/pl_info.php?id=30547">Pahan.</a>' +
' </td>' +
' </tr>' +
' </table>' +
' </center>' +
'</div>';
addEvent($('#bt_close' + idn), 'click', close_setting_form);
addEvent($('#settings_reset' + idn), 'click', clear_all_params);
}
bg.style.display = bgc.style.display = 'block' ;
$('#dialog_content'+idn).innerHTML = ASettingsHTML;
}
function show_settings_base(ASettingsHTML)
{
show_dialog_base('<div><b>Настройки:</b></div>' + ASettingsHTML);
}
// ------------------ dialog
function SpsProcess()
{
if (location.href.indexOf('/transfer.php') > -1)
{
var LSps = decodeURIComponent(URLAttrValueGet('pahan_sps', location.href));
if (LSps != '')
{
document.forms.f.nick.value = 'Pahan';
document.forms.f.gold.value = '500';
document.forms.f.desc.value = LSps;
}
}
}
SpsProcess();
//----------------------------------- GM_ValueExt
var gUserID = '';
function SaveUserID()
{
var LLinks = document.querySelectorAll('a[href*="pl_hunter_stat.php?id="]');
if (LLinks && (LLinks.length > 0))
{
gUserID = URLAttrValueGet('id', LLinks[0].href);
GM_setValue('gUserID', gUserID);
}
else
gUserID = GM_getValue('gUserID', '');
}
SaveUserID();
function GM_getValueExt(key, def)
{
return GM_getValue(key + gUserID, def);
};
function GM_setValueExt(key, value)
{
return GM_setValue(key + gUserID, value);
};
function GM_deleteValueExt(key)
{
return GM_deleteValue(key + gUserID);
};
//------------------
// cX_Y координаты по карте
Pahan_locX =
{
c50_50: 1, //Empire Capital
c51_50: 2, //East River
c50_49: 3, //Tiger's Lake
c51_49: 4, //Rogue's Wood
c50_51: 5, //Wolf's Dale
c50_48: 6, //Peaceful Camp
c49_51: 7, //Lizard's Lowland
c49_50: 8, //Green Wood
c49_48: 9, //Eagle's Nest //Inferno portal 2
c50_52: 10, //Portal Ruins //Inferno portal 1
c51_51: 11, //Dragon's Caves
c49_49: 12, //Shining Spring
c48_49: 13, //Sunny City
c52_50: 14, //Magma Mines
c52_49: 15, //Bear' Mountain
c52_48: 16, //Fairy Trees
c53_50: 17, //Harbour City
c53_49: 18, //Mythril Coast //Inferno portal 3
c51_52: 19, //Great Wall
c51_53: 20, //Titans' Valley
c52_53: 21, //Fishing Village
c52_54: 22, //Kingdom Castle
c48_48: 23, //Ungovernable Steppe
c51_48: 24, //Crystal Garden
c49_52: 25, //Empty //East Island (Old Location)
c49_52: 26, //The Wilderness
c48_50: 27 //Sublime Arbor
}
// Массив локаций
var Pahan_locArr = new Array(
// 0i 1x 2y 3r 4ne 5nr
[] ,
[ 1 , 50 , 50 , 1 , 'Empire Capital' , 'Столица Империи' , 300,210,180],
[ 2 , 51 , 50 , 1 , 'East River' , 'Восточная Река' , 170,160,210],
[ 3 , 50 , 49 , 1 , 'Tiger\'s Lake' , 'Тигриное Озеро' , 170,210,210],
[ 4 , 51 , 49 , 1 , 'Rogue\'s Wood' , 'Лес Разбойников', 171,210,210],
[ 5 , 50 , 51 , 1 , 'Wolf\'s Dale' , 'Долина Волков' , 170,205,210],
[ 6 , 50 , 48 , 1 , 'Peaceful Camp' , 'Мирный Лагерь' , 172,205,215],
[ 7 , 49 , 51 , 1 , 'Lizard\'s Lowland' , 'Равнина Ящеров' , 171,205,210],
[ 8 , 49 , 50 , 1 , 'Green Wood' , 'Зелёный Лес' , 170,205,210],
[ 9 , 49 , 48 , 1 , 'Eagle\'s Nest' , 'Орлиное Гнездо' , 174,205,210],
[ 10 , 50 , 52 , 1 , 'Portal\'s ruins' , 'Руины Портала' , 172,205,210],
[ 11 , 51 , 51 , 1 , 'Dragon\'s Caves' , 'Пещеры Драконов' , 190,0, 215],
[ 12 , 49 , 49 , 1 , 'Shining Spring' , 'Сияющий Родник' , 171,206,210],
[ 13 , 48 , 49 , 1 , 'Sunny City' , 'Солнечный Город' , 174,206,211],
[ 14 , 52 , 50 , 1 , 'Magma Mines' , 'Магма Шахты' , 190,200,210],
[ 15 , 52 , 49 , 1 , 'Bear\' Mountain' , 'Медвежья Гора' , 190,205,210],
[ 16 , 52 , 48 , 1 , 'Fairy Trees' , 'Магический Лес' , 175,205,211],
[ 17 , 53 , 50 , 1 , 'Harbour City ' , 'Портовый Город' , 175,0, 220],
[ 18 , 53 , 49 , 1 , 'Mythril Coast' , 'Мифриловый Берег' , 176,210,210],
[ 19 , 51 , 52 , 1 , 'Great Wall' , 'Великая Стена' , 174,205,220],
[ 20 , 51 , 53 , 1 , 'Titans\' Valley' , 'Равнина Титанов' , 176,210,215],
[ 21 , 52 , 53 , 1 , 'Fishing Village' , 'Рыбачье Село' , 177,200,220],
[ 22 , 52 , 54 , 1 , 'Kingdom Castle' , 'Замок Королевства' , 180,205,215],
[ 23 , 48 , 48 , 1 , 'Ungovernable Steppe', 'Непокорная Степь' , 190,0, 215],
[ 24 , 51 , 48 , 1 , 'Crystal Garden' , 'Кристальный Сад' , 0, 205,220],
[] ,
[ 26 , 49 , 52 , 1 , 'The Wilderness' , 'Дикие Земли' , 0, 0, 210],
[ 27 , 48 , 50 , 1 , 'Sublime Arbor' , 'Великое Древо' , 0, 0, 210]
)
// location error
// сначала путь берёт диагональ, а потом катет
Pahan_locP =
{
l1_14: 11 ,
l1_17: 11 ,
l1_26: 5 ,
l1_27: 8 ,
l2_14: 15 ,
l2_17: 15 ,
l2_18: 15 ,
l2_21: 11 ,
l2_22: 11 ,
l2_27: 1 ,
l3_14: 4 ,
l3_16: 4 ,
l3_17: 4 ,
l3_26: 1 ,
l3_27: 12 ,
l4_14: 15 ,
l4_16: 15 ,
l4_17: 15 ,
l4_21: 2 ,
l4_22: 2 ,
l4_26: 2 ,
l4_27: 3 ,
l5_14: 11 ,
l5_17: 11 ,
l5_19: 10 ,
l5_20: 10 ,
l5_21: 10 ,
l5_22: 10 ,
l5_27: 8 ,
l6_2: 4 ,
l6_16: 4 ,
l6_26: 3 ,
l6_27: 12 ,
l7_13: 8 ,
l7_14: 5 ,
l7_17: 5 ,
l7_23: 8 ,
l7_26: 5 ,
l8_14: 5 ,
l8_17: 5 ,
l8_26: 5 ,
l9_16: 3 ,
l9_26: 3 ,
l10_27: 5 ,
l11_3: 2 ,
l11_6: 2 ,
l11_9: 2 ,
l11_21: 19 ,
l11_22: 19 ,
l11_26: 10 ,
l11_27: 5 ,
l12_14: 3 ,
l12_16: 3 ,
l12_17: 3 ,
l12_26: 1 ,
l13_14: 12 ,
l13_16: 12 ,
l13_17: 12 ,
l14_1: 11 ,
l14_2: 15 ,
l14_3: 15 ,
l14_4: 15 ,
l14_6: 15 ,
l14_8: 11 ,
l14_9: 15 ,
l14_12: 15 ,
l14_13: 15 ,
l14_18: 15 ,
l14_21: 11 ,
l14_22: 11 ,
l14_23: 15 ,
l14_24: 15 ,
l14_27: 11 ,
// l15_6: 4 ,
// l15_9: 4 ,
l15_23: 24 ,
l15_26: 2 ,
l15_27: 4 ,
l16_1: 15 ,
l16_2: 15 ,
l16_3: 15 ,
l16_4: 15 ,
l16_5: 15 ,
l16_6: 15 ,
l16_7: 15 ,
l16_8: 15 ,
l16_9: 15 ,
l16_10: 15 ,
l16_11: 15 ,
l16_12: 15 ,
l16_13: 15 ,
l16_19: 15 ,
l16_20: 15 ,
l16_23: 15 ,
l16_24: 15 ,
l16_26: 15 ,
l16_27: 15 ,
l17_2: 15 ,
l17_5: 14 ,
l17_7: 14 ,
l17_10: 14 ,
l17_11: 14 ,
l17_19: 14 ,
l17_20: 14 ,
l17_21: 14 ,
l17_22: 14 ,
l17_26: 14 ,
l17_27: 14 ,
l18_1: 15 ,
l18_2: 15 ,
l18_5: 15 ,
l18_6: 15 ,
l18_7: 15 ,
l18_8: 15 ,
l18_9: 15 ,
l18_10: 17 ,
l18_11: 17 ,
l18_14: 17 ,
l18_19: 17 ,
l18_20: 17 ,
l18_21: 17 ,
l18_22: 17 ,
l18_23: 15 ,
l18_24: 15 ,
l18_26: 17 ,
l18_27: 15 ,
l19_1: 11 ,
l19_3: 11 ,
l19_5: 10 ,
l19_6: 11 ,
l19_7: 10 ,
l19_8: 10 ,
l19_9: 11 ,
l19_12: 10 ,
l19_13: 10 ,
l19_14: 11 ,
l19_15: 11 ,
l19_16: 11 ,
l19_17: 11 ,
l19_18: 11 ,
l19_23: 10 ,
l19_27: 10 ,
l20_14: 19 ,
l20_15: 19 ,
l20_16: 19 ,
l20_17: 19 ,
l20_18: 19 ,
l20_27: 10 ,
l21_14: 19 ,
l21_15: 19 ,
l21_16: 19 ,
l21_17: 19 ,
l21_18: 19 ,
l21_27: 19 ,
l22_17: 21 ,
l22_18: 21 ,
l22_27: 20 ,
l23_16: 15 ,
l23_26: 1 ,
l23_27: 13 ,
l24_16: 15 ,
l24_21: 2 ,
l24_22: 2 ,
l24_26: 2 ,
l24_27: 3 ,
l26_7: 5 ,
l26_8: 5 ,
l26_9: 5 ,
l26_11: 10 ,
l26_12: 5 ,
l26_13: 5 ,
l26_14: 10 ,
l26_17: 10 ,
l26_20: 10 ,
l26_21: 10 ,
l26_22: 10 ,
l26_23: 5 ,
l26_24: 5 ,
l26_27: 5 ,
l27_1: 8 ,
l27_2: 8 ,
l27_3: 12 ,
l27_4: 12 ,
l27_5: 7 ,
l27_6: 12 ,
l27_9: 12 ,
l27_10: 7 ,
l27_11: 7 ,
l27_14: 11 ,
l27_15: 4 ,
l27_16: 15 ,
l27_17: 15 ,
l27_18: 12 ,
l27_19: 10 ,
l27_20: 10 ,
l27_21: 20 ,
l27_22: 20 ,
l27_23: 13 ,
l27_24: 12 ,
l27_26: 8
}
var Pahan_trtime = new Array( 120 , 84 , 60 , 36 , 24 , 12 ) ; // время перемещения по прямой
var Pahan_trtimed = new Array( 169 , 118 , 84 , 50 , 33 , 16 ) ; // время перемещения по диагонали
function getMoveTimeL(cz , mz , t ) {
/* cz текущий сектор обсчёта
mz конечный сектор обсчёта
t сумма времени
*/
// если прибыли в конечный пункт
if( mz == cz ) {
// var myT = new Date(t*1000)
// myTs = myT.getSeconds()
// return myT.getMinutes() + ':' + ( myTs < 10 ? '0' : '' ) + myTs ;
return t;
}
var nz = 0; // следующий сектор, к которому надо действительно двигаться
var kC = Pahan_locArr[cz]; //координаты текущие
if(kC == undefined) return 0;
var kM = Pahan_locArr[mz]; //координаты назначения
var id1 = eval( 'Pahan_locP.l' + cz + '_' + mz ) //id исключение
// если есть исключения, следующий сектор будет равен ид исключения
if( id1 && id1 > 0 ) {
nz = id1 ;
}
// если исключения, то переназначаем координаты назначения
if( nz != 0 )
var kM = Pahan_locArr[nz] ;
var tx = kM[1] > kC[1] ? 1 : ( kM[1] == kC[1] ? 0 : -1 ) ;
var ty = kM[2] > kC[2] ? 1 : ( kM[2] == kC[2] ? 0 : -1 ) ;
var nx = parseInt( kC[1] ) + tx ;
var ny = parseInt( kC[2] ) + ty ;
// t = ( ty == 0 || tx == 0 ) ? t + 120 : t + 169 ;
t = ( ty == 0 || tx == 0 ) ? t + Pahan_trtime[0] : t + Pahan_trtimed[0] ;
var id = eval( 'Pahan_locX.c' + nx + '_' + ny ) ;
// t = t + ' ' + id + '(' + nz + ')' ;
return getMoveTimeL( id , mz , t );
}
function GetCurrLocation(AHTML)
{
//!! var re = /<[^>]*href='([^']*)'[^>]*>»»»<\/a>/gim;
var re = /<param[^>]*\/map.swf[^>]*>\s*<param[^>]*value="([^"]*)"[^>]*>/gim;
var res;
if ((res = re.exec(AHTML)) != null)
{
return res[1].split('=')[1].split(':')[1];
}
else
return 1;
}
function GetSortedLocations(LCurrLocation)
{
var LLocs = new Array();
for (var i = 0; i < Pahan_locArr.length; i++)
{
var LLoc = Pahan_locArr[i];
if (LLoc && (LLoc.length == 9))
{
LLoc[9] = getMoveTimeL(LCurrLocation, LLoc[0], 0);
LLocs.push(LLoc);
}
}
LLocs.sort(function(a, b) {
return a[9] - b[9];
});
return LLocs;
}
// ---------------------------------
var WorkResultFound = false;
var SortedLocations = null;
var GoldSumm = 0;
var WorkCountSumm = 0;
var ObjectsSumm = new Array();
function show_settings()
{
WorkResultFound = true;
var LStr =
' <table>' +
' <tr>' +
' <td>' +
' <label style="cursor:pointer;"><input type="checkbox" id="id_return_after_work" title=""> Возвращатся на страницу после установки на работу</lable>' +
' </td>' +
' </tr>' +
' <tr>' +
' <td>' +
' <label style="cursor:pointer;"><input type="checkbox" id="id_last_code_buffer_copy" title=""> Запоминать предыдущий код в буфер обмена</lable>' +
' </td>' +
' </tr>' +
' <tr>' +
' <td>' +
' <div><input type="text" style="width:40;" id="id_min_zp"> Минимальная зарплата, не предлагать меньшую </div>' +
' <div>Значение "0" - подходит любая зарплата</div>' +
' </td>' +
' </tr>' +
' <tr>' +
' <td>' +
' <label style="cursor:pointer;"><input type="checkbox" id="id_scan_other_locations" title=""> Искать на других локациях (только с транспортом)</lable>' +
' </td>' +
' </tr>' +
' <tr>' +
' <td>' +
' <div><input type="text" style="width:40;" id="id_max_loc_count"> Количество соседних локаций для сканирования</div>' +
' <div>Значение "0" - сканировать все локации на карте</div>' +
' </td>' +
' </tr>' +
' <tr>' +
' <td>' +
' <label style="cursor:pointer;"><input type="checkbox" id="id_show_settled_window" title=""> ' +
' Показывать после установки окно с надписью "Вы устроены на работу."</label">' +
' </td>' +
' </tr>' +
' <tr>' +
' <td>' +
' <div><input type="text" style="width:80;" id="id_min_obj_work_count"> Пропускать объект если свободных рабочих мест меньшe</div>' +
' <div><input type="text" style="width:80;" id="id_min_obj_gold_count"> Пропускать объект если золота меньше</div>' +
' <div><input type="text" style="width:80;" id="id_min_loc_work_count"> Пропускать локацию если свободных рабочих мест меньшe</div>' +
' <div><input type="text" style="width:80;" id="id_min_loc_gold_count"> Пропускать локацию если золота меньше</div>' +
' </td>' +
' </tr>' +
' </table>';
show_settings_base(LStr);
var check_return = $('#id_return_after_work');
check_return.checked = GM_getValueExt('return_after_work', 0) == 1 ? 'checked' : '' ;
addEvent(check_return, 'click', function(){setCheck('return_after_work')});
var Lmin_zp = $("#id_min_zp");
Lmin_zp.value = parseInt(GM_getValueExt('min_zp', '0'));
Lmin_zp.addEventListener( "change", function(){setEdit('id_min_zp', 'min_zp')}, false );
Lmin_zp.addEventListener( "keyup", function(){setEdit('id_min_zp', 'min_zp')}, false );
Lmin_zp.addEventListener( "paste", function(){setEdit('id_min_zp', 'min_zp')}, false );
var check_other_locations = $('#id_scan_other_locations');
check_other_locations.checked = GM_getValueExt('scan_other_locations', 0) == 1 ? 'checked' : '' ;
addEvent(check_other_locations, 'click', function(){setCheck('scan_other_locations')});
var Lmax_loc_count = $("#id_max_loc_count");
Lmax_loc_count.value = parseInt(GM_getValueExt('max_loc_count', '0'));
Lmax_loc_count.addEventListener( "change", function(){setEdit('id_max_loc_count', 'max_loc_count')} , false );
Lmax_loc_count.addEventListener( "keyup", function(){setEdit('id_max_loc_count', 'max_loc_count')} , false );
Lmax_loc_count.addEventListener( "paste", function(){setEdit('id_max_loc_count', 'max_loc_count')} , false );
var check_settled_window = $('#id_show_settled_window');
check_settled_window.checked = GM_getValueExt('show_settled_window', 0) == 1 ? 'checked' : '' ;
addEvent(check_settled_window, 'click', function(){setCheck('show_settled_window')});
var Lmin_obj_work_count = $("#id_min_obj_work_count");
Lmin_obj_work_count.value = parseInt(GM_getValueExt('min_obj_work_count', '0'));
Lmin_obj_work_count.addEventListener( "change", function(){setEdit('id_min_obj_work_count', 'min_obj_work_count')} , false );
Lmin_obj_work_count.addEventListener( "keyup", function(){setEdit('id_min_obj_work_count', 'min_obj_work_count')} , false );
Lmin_obj_work_count.addEventListener( "paste", function(){setEdit('id_min_obj_work_count', 'min_obj_work_count')} , false );
var Lmin_obj_gold_count = $("#id_min_obj_gold_count");
Lmin_obj_gold_count.value = parseInt(GM_getValueExt('min_obj_gold_count', '0'));
Lmin_obj_gold_count.addEventListener( "change", function(){setEdit('id_min_obj_gold_count', 'min_obj_gold_count')} , false );
Lmin_obj_gold_count.addEventListener( "keyup", function(){setEdit('id_min_obj_gold_count', 'min_obj_gold_count')} , false );
Lmin_obj_gold_count.addEventListener( "paste", function(){setEdit('id_min_obj_gold_count', 'min_obj_gold_count')} , false );
var Lmin_loc_work_count = $("#id_min_loc_work_count");
Lmin_loc_work_count.value = parseInt(GM_getValueExt('min_loc_work_count', '0'));
Lmin_loc_work_count.addEventListener( "change", function(){setEdit('id_min_loc_work_count', 'min_loc_work_count')} , false );
Lmin_loc_work_count.addEventListener( "keyup", function(){setEdit('id_min_loc_work_count', 'min_loc_work_count')} , false );
Lmin_loc_work_count.addEventListener( "paste", function(){setEdit('id_min_loc_work_count', 'min_loc_work_count')} , false );
var Lmin_loc_gold_count = $("#id_min_loc_gold_count");
Lmin_loc_gold_count.value = parseInt(GM_getValueExt('min_loc_gold_count', '0'));
Lmin_loc_gold_count.addEventListener( "change", function(){setEdit('id_min_loc_gold_count', 'min_loc_gold_count')} , false );
Lmin_loc_gold_count.addEventListener( "keyup", function(){setEdit('id_min_loc_gold_count', 'min_loc_gold_count')} , false );
Lmin_loc_gold_count.addEventListener( "paste", function(){setEdit('id_min_loc_gold_count', 'min_loc_gold_count')} , false );
var Llast_code_buffer_copy = $('#id_last_code_buffer_copy');
Llast_code_buffer_copy.checked = GM_getValueExt('last_code_buffer_copy', 0) == 1 ? 'checked' : '' ;
addEvent(Llast_code_buffer_copy, 'click', function(){setCheck('last_code_buffer_copy')});
}
function cancel_scan_work()
{
WorkResultFound = true;
}
function ShowFindWorkHTML(AFindWorkHTML, AIsResult)
{
if (WorkResultFound)
return;
WorkResultFound = AIsResult;
show_dialog_base(
'<div>' + AFindWorkHTML + '</div>' +
'<div><hr/></div>' +
'<div class="btn_settings" id="fw_settings"><b>Открыть настройки</b></div>'
);
addEvent($('#bt_close' + idn), 'click', cancel_scan_work);
addEvent($('#bgOverlay' + idn), 'click', cancel_scan_work);
addEvent($("#fw_settings"), 'click', show_settings);
}
function GetObjectInfo(AObjHTML)
{
AObjHTML = DeleteCRLF(AObjHTML);
var re = /(<table[^>]*><tr[^>]*><td[^>]*>Тип: .*)Список рабочих/gim;
var LInfo = (res = re.exec(AObjHTML)) ? res[1] : '';
re = /Свободных мест: <b>\d+<\/b>/gim;
LInfo += (res = re.exec(AObjHTML)) ? res[0] : '';
return LInfo;
}
function CheckResExists(AHTML)
{
// <td class="wb"><font color="red">0.01</font> / 50</td>
var re = /<td[^>]*><font[^>]*color=red[^>]*>([0-9]*\.?[0-9]*)<\/font>\s*\/\s*([0-9]*\.?[0-9]*)<\/td>/gim;
var res;
if ((res = re.exec(AHTML)) != null)
{
return false;
}
return true;
}
function ObjectProcess(ALocation, AObjLink, AObjHTML)
{
AObjHTML = DeleteCRLF(AObjHTML);
var re = /Вы уже устроены\./gim;
var re2 = /Прошло меньше часа с последнего устройства на работу\. Ждите\./gim;
var res;
if (((res = re.exec(AObjHTML)) != null) || (res = re2.exec(AObjHTML)) != null)
{
ShowFindWorkHTML(res[0], true);
return;
}
re = /Свободных мест\: <b>(\d+)<\/b>/gim;
if ((res = re.exec(AObjHTML)) == null)
return;
var LWorkCount = parseInt(res[1]);
var LWorkCountMin = Math.max(parseInt(GM_getValueExt('min_obj_work_count', 0)), 1);
if (LWorkCount < LWorkCountMin)
return;
re = /<tr><td>Баланс: <\/td><td><b><table[^>]*><tr><td><img[^>]*gold\.gif[^>]*><\/td><td><b>([\d,]+)<\/b><\/td><\/tr><\/table><\/b><\/td><\/tr>/gim;
if ((res = re.exec(AObjHTML)) == null)
return;
var LGold = parseInt(res[1].replace(/,/g, ''));
var LGoldMin = Math.max(parseInt(GM_getValueExt('min_obj_gold_count', 0)), 20);
if (LGold < LGoldMin)
return;
if (!CheckResExists(AObjHTML))
return;
if (ALocation == 0)
{
// e = /<form[^>]*name="working"[^>]*>.*<\/form>/gim;
re = /<form[^>]*name=working[^>]*>.*<\/form>/gim;
if ((res = re.exec(AObjHTML)) != null)
{
GM_setValueExt('LastURL', location.href);
var LLastCode = GM_getValueExt('last_code', '');
var LLastCodeInfo = '';
if (LLastCode != '')
{
LLastCodeInfo = '<div><font color="red"><b>Последний введенный код: ' + LLastCode + '</b></font></div>';
if (GM_getValueExt('last_code_buffer_copy', 0) == 1)
GM_setClipboard(LLastCode);
}
ShowFindWorkHTML(GetObjectInfo(AObjHTML) + LLastCodeInfo + res[0], true);
AddRealZPInfo();
}
}
else
{
GoldSumm += LGold;
WorkCountSumm += LWorkCount;
ObjectsSumm.push(AObjLink);
}
}
function FindWorkObject(ALocation, APlaceIndex, AObjIndex, APlaceHTML)
{
if (APlaceHTML.indexOf('i/index2012/enter0.jpg') > -1)
{
ShowFindWorkHTML('Вы не залогированы.<br>' +
'Перезайдите в игру.', true
);
return;
}
var re = /<b>(\d+)<\/b> <\/td><td[^>]*> <a[^>]*href='([^']*)'[^>]*>»»»<\/a>/gim;
var res;
var LLink;
var LZP, LMinZP;
var LFindCount = 0;
while ((res = re.exec(APlaceHTML)) != null)
{
LZP = parseInt(res[1]);
LLink = res[2];
LMinZP = parseInt(GM_getValueExt('min_zp', '0'));
if ((LMinZP == 0) || (LZP >= LMinZP))
{
if (LFindCount == AObjIndex)
{
Ajax('GET', LLink, null,
function(AObjHTML, AURL)
{
ObjectProcess(ALocation, AURL, AObjHTML);
if (!WorkResultFound)
FindWorkObject(ALocation, APlaceIndex, AObjIndex + 1, APlaceHTML);
}
);
}
LFindCount++;
}
}
// $("#find_work").innerHTML = $("#find_work").innerHTML + '<br>' +
// 'AObjIndex: ' + AObjIndex + ', LFindCount: ' + LFindCount;
if (!WorkResultFound && (AObjIndex >= LFindCount))
FindWorkProcess(ALocation, APlaceIndex + 1);
}
function GetObjectsSummStr()
{
var LRes = '';
ObjectsSumm.forEach(function(item, i, arr) {
if (LRes != '')
LRes += ', ';
LRes += '<a href="' + item + '">' + URLAttrValueGet('id', item) + '</a>';
});
return LRes;
}
function FindWorkProcess(ALocation, APlaceIndex)
{
var PlaceCodes = ['sh', 'fc', 'mn'];
var PlaceNames = ['Производства', 'Обработка', 'Добыча'];
if (APlaceIndex < PlaceCodes.length)
{
if (APlaceIndex == 0)
{
GoldSumm = 0;
WorkCountSumm = 0;
ObjectsSumm = new Array();
}
if ((ALocation != 0) || (APlaceIndex != 0))
{
var LMinZP = parseInt(GM_getValueExt('min_zp', '0'));
if (LMinZP > 0)
{ /*
alert(
'PlaceIndex: ' + APlaceIndex +
', MinZP: ' + LMinZP +
', SortedLocations[ALocation][8]: ' + SortedLocations[ALocation][8] +
', SortedLocations[ALocation][7]: ' + SortedLocations[ALocation][7] +
', SortedLocations[ALocation][6]: ' + SortedLocations[ALocation][6]
); */
if ((APlaceIndex == 0) && (LMinZP > SortedLocations[ALocation][8])
|| (APlaceIndex == 1) && (LMinZP > SortedLocations[ALocation][7])
|| (APlaceIndex == 2) && (LMinZP > SortedLocations[ALocation][6])
)
{
FindWorkProcess(ALocation, APlaceIndex + 1);
return;
}
}
}
var LLocXY = '';
if (ALocation != 0)
LLocXY = 'cx=' + SortedLocations[ALocation][1] + '&cy=' + SortedLocations[ALocation][2] + '&';
var LURL = '/map.php?' + LLocXY + 'st=' + PlaceCodes[APlaceIndex];
Ajax('GET', LURL, null,
function(AHTML)
{
if (!SortedLocations)
SortedLocations = GetSortedLocations(GetCurrLocation(DeleteCRLF(AHTML)));
ShowFindWorkHTML('Сканирование локации ' + SortedLocations[ALocation][5] +
' ' + PlaceNames[APlaceIndex] + '...<br>', false);
FindWorkObject(ALocation, APlaceIndex, 0, AHTML);
}
);
}
else
{
var LWorkCountSummMin = Math.max(parseInt(GM_getValueExt('min_loc_work_count', 0)), 5);
var LGoldSummMin = Math.max(parseInt(GM_getValueExt('min_loc_gold_count', 0)), 2000);
if ((ALocation > 0) && (WorkCountSumm >= LWorkCountSummMin) && (GoldSumm >= LGoldSummMin))
{
var LURL = '/move_sector.php?id=' + SortedLocations[ALocation][0];
ShowFindWorkHTML('На локации ' + SortedLocations[ALocation][5] + ' найдено:<br>' +
'Объектов (' + ObjectsSumm.length + '): ' + GetObjectsSummStr() + '<br>' +
'Рабочих мест: <b>' + WorkCountSumm + '</b><br>' +
'Доступное для зарплаты золото: <b>' + IntFormatWithThouthandSeparator(GoldSumm) + '</b><br>' +
'Перейти: <a class="blueRef" href="' + LURL + '">' + SortedLocations[ALocation][5] + '</a>', true
);
}
else
{
var LMaxLocCount = -1;
if (GM_getValueExt('scan_other_locations', 0) == 1)
LMaxLocCount = parseInt(GM_getValueExt('max_loc_count', '0'));
ALocation++;
if ((LMaxLocCount == 0) && (SortedLocations.length > ALocation)
|| (ALocation <= LMaxLocCount)
)
FindWorkProcess(ALocation, 0);
else
ShowFindWorkHTML('Поиск работы завершен.<br>' +
'Все места заняты или недостаточно золота на объектах.<br>' +
'Смените локацию, или попробуйте позже.', true
);
}
}
}
function StartScan()
{
WorkResultFound = false;
GM_deleteValueExt('LastURL');
ShowFindWorkHTML('Сканирование локации...<br>', false);
FindWorkProcess(0, 0);
}
function AddWorkFindHref()
{
var LLinks = document.querySelectorAll('a[href*="map.php"]');
var LLink;
if (LLinks)
{
for(var i = 0; i < LLinks.length; i++)
{
LLink = LLinks[i];
if (LLink.innerHTML == '<b>Карта</b>')
{
var LColor = '#f5c137';
if (GM_getValueExt('IsWorking', true) == false)
LColor = 'red';
LNewHref = document.createElement('a');
LNewHref.href = 'javascript:void(0)';
LNewHref.style = 'text-decoration: none;color: ' + LColor + ';'
LNewHref.innerHTML = '<b>ГР</b>';
LNewHref.title = 'Найти место работы';
LNewHref.id = 'find_work';
LLink.parentNode.appendChild(LNewHref);
addEvent($("#find_work"), "click", StartScan);
}
}
}
}
function ProcessReturn()
{
var LCode = URLAttrValueGet('code', location.href);
if ((LCode == '') && (GM_getValueExt('IsProcessReturn', false) === false))
return;
GM_deleteValueExt('IsProcessReturn');
var LLastURL = GM_getValueExt('LastURL', '');
var LCmd = parseInt(GM_getValueExt('cmd', 0));
if (LCmd == 0)
{
if (LLastURL == '')
return;
// <font color="red"><b>Введен неправильный код.</b></font>
var re = /<font[^>]*><b>(Введен неправильный код\.)<\/b><\/font>/gim;
var re2 = /<font[^>]*><b>(На объекте недостаточно золота\.)<\/b><\/font>/gim;
var re3 = /<font[^>]*><b>(Нет рабочих мест\.)<\/b><\/font>/gim;
var re4 = /<center>(Вы устроены на работу\.)<\/center>/gim;
var res;
if ((res = re.exec(document.body.innerHTML)) != null)
LCmd = 1;
else
if (((res = re2.exec(document.body.innerHTML)) != null)
|| ((res = re3.exec(document.body.innerHTML)) != null)
)
LCmd = 2;
else
if ((res = re4.exec(document.body.innerHTML)) != null)
LCmd = 3;
if (LCmd == 0)
{
GM_deleteValueExt('last_code');
GM_deleteValueExt('last_work_info');
GM_deleteValueExt('cmd');
}
else
{
GM_setValueExt('last_code', LCode);
GM_setValueExt('last_work_info', res[1]);
GM_setValueExt('cmd', LCmd);
}
if (LLastURL != '')
{
GM_deleteValueExt('LastURL');
if (GM_getValueExt('return_after_work', 0) == 1)
{
GM_setValueExt('IsProcessReturn', true);
location.href = LLastURL;
return;
}
}
}
if (LCmd != 0)
{
var LWorkInfo = GM_getValueExt('last_work_info', '');
GM_deleteValueExt('last_work_info');
GM_deleteValueExt('cmd');
if (LCmd == 1)
{
var LStr = '<font color="red">' + LWorkInfo + '</font><br>' +
'<div class="blueRef" id="fw_restart_scan">Сканировать заново</div>';
ShowFindWorkHTML(LStr, true);
addEvent($("#fw_restart_scan"), 'click', StartScan);
}
else
if (LCmd == 2)
{
var LStr = '<font color="red">' + LWorkInfo + '</font><br>' +
'<div class="btn_settings" id="fw_restart_scan">Сканировать заново</div>';
ShowFindWorkHTML(LStr, true);
addEvent($("#fw_restart_scan"), 'click', StartScan);
}
else
if (LCmd == 3)
{
GM_deleteValueExt('last_code');
if (GM_getValueExt('show_settled_window', 0) == 1)
ShowFindWorkHTML('<font color="#0070FF">' + LWorkInfo + '</font>', true);
}
else
{
GM_deleteValueExt('last_code');
GM_deleteValueExt('last_work_info');
GM_deleteValueExt('cmd');
}
}
else
{
GM_deleteValueExt('last_code');
GM_deleteValueExt('last_work_info');
GM_deleteValueExt('cmd');
}
}
function AddRealZPInfo()
{
var LCoefsGR = new Array(1.0, 1.1, 1.2, 1.4, 1.6, 1.8, 2.0, 2.2, 2.4, 2.6, 2.8, 3.0, 3.2, 3.4, 3.6, 3.8, 4.0);
var LTD = null;
var LTDels = document.getElementsByTagName('td');
for( var i = 0; i < LTDels.length; i++ )
if (LTDels[i].innerHTML == 'Зарплата: ')
{
LTD = LTDels[i];
var LBels = LTD.parentNode.getElementsByTagName('b');
var LB = null;
var re = /^([\d,]+)$/gim;
var res;
for( var j = 0; j < LBels.length; j++ )
if ((res = re.exec(LBels[j].innerHTML)) != null)
{
LB = LBels[j];
var LZP = parseInt(res[1].replace(/,/g, ''));
var LLevel = parseInt(GM_getValueExt('LevelGR', 0));
var LCoefGR = LCoefsGR[LLevel];
var LCoefFine = 1;
var re2 = /<b> \* (\d+\.\d+) штраф трудоголика\.<\/b>/gim;
var res2;
if ((res2 = re2.exec(LTD.parentNode.innerHTML)) != null)
LCoefFine = parseFloat(res2[1]);
var LRealZP = FloatFormat(LZP * LCoefGR * LCoefFine);
var LTitle =
'Зарплата: ' + LZP + '\n' +
'Реальная зарплата: ' + LRealZP + '\n' +
'Уровень ГР: ' + LLevel + '\n' +
'Коэффициент ГР: ' + LCoefGR + '\n' +
'Штраф трудоголика: ' + ((LCoefFine == 1) ? 'Отсутствует' : LCoefFine);
LB.innerHTML = LB.innerHTML +
' (<font style="font-size:12px" color="red" title="' + LTitle + '">' + LRealZP + '</font>)';
}
}
}
function SaveLevelGR()
{
//var re = /^([\d]+)$/gim;
var re = /Гильдия Рабочих: ([\d]+) /gim;
var res;
if ((res = re.exec(document.body.innerHTML)) != null)
GM_setValueExt('LevelGR', res[1]);
}
function InitIsWorking()
{
var b = document.querySelector("body");
if (location.pathname=='/home.php' && document.querySelector("img[src$='i/s_defence.gif']"))
{
var work_unemployed = '\u0412\u044B \u043D\u0438\u0433\u0434\u0435 \u043D\u0435 \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442\u0435';
// vychislenie vremeni servera (s podderzkoj scripta time_seconds)
var time_home = /\u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0443\u0441\u0442\u0440\u043e\u0438\u0442\u044c\u0441\u044f \u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0443 \u0447\u0435\u0440\u0435\u0437 (\d+)/;
var time_home2 = / \u0441 (\d+):(\d+)<\/td>/;
var LIsWorking = true;
// podhvatyvanie vremeni okonchaniya raboty s home.php i ego proverka
if ( time_home.exec( b.innerHTML ) )
LIsWorking = true;
else if ( time_home2.exec( b.innerHTML ) )
LIsWorking = true;
else
if ( b.innerHTML.match( work_unemployed ) )
LIsWorking = false;
GM_setValueExt('IsWorking', LIsWorking);
}
if ( location.pathname=='/object_do.php' )
{
var work_obj_do = '\u0412\u044b \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u044b \u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0443';
if ( b.innerHTML.match( work_obj_do ) )
GM_setValueExt('IsWorking', true);
}
}
function ProcessMain()
{
InitIsWorking();
AddWorkFindHref();
ProcessReturn();
if (location.href.indexOf('/object-info.php') > -1)
AddRealZPInfo();
if (location.href.indexOf('/home.php') > -1)
SaveLevelGR();
}
ProcessMain();
})();