HWM_HuntingExpirience

calculations expiriance for hunting

As of 2015-10-20. See the latest version.

// ==UserScript==
// @name           HWM_HuntingExpirience
// @author         Pahan https://greasyfork.org/uk/users/18377-pahan
// @namespace      hwm_pahan
// @description    calculations expiriance for hunting
// @homepage       https://greasyfork.org/en/users/18377-pahan
// @icon           http://dcdn.heroeswm.ru/avatars/30/nc-5/30547.gif
// @version        1.0
// @encoding 	   utf-8
// @include        http://*heroeswm.ru/home.php*
// @include        http://*heroeswm.ru/map.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
// ==/UserScript==

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;
	}
}

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];
}

// -----------------------------------------------
var GlobalCultureName = location.href.match('lordswm') ? "en-US" : "ru-RU",
    GlobalStrings = {
        "ru-RU" : {
//            Sell : "Пр-ь:",
        },
        "en-US" : {
//            Sell : "Sell:",
        }
    },
    GlobalLocalizedString = GlobalStrings[GlobalCultureName];
// -----------------------------------------------

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);
  };
}

var
  LMinExp = 999999;
  
function ExperienceProcess(AValue, ALink)
{
  if (LMinExp > AValue)
    LMinExp = AValue;
  ALink.parentNode.innerHTML +=
    '<br><spans style="color:red">Опыт: ' + Math.ceil(AValue) + '</span>';
}

function ExperienceCalculate(AMobExp, ACount, ALevel)
{
  var LExp = parseInt(AMobExp * ACount / 5);
  var LExpCoef = parseFloat(GM_getValue('exp_coef', '1'));
  if (ALevel >=3)
    LExp = Math.max(LExp, ALevel * 70) * LExpCoef;
  return LExp;
}

function Run(ALevel, ALink)
{
  var
    LMonster = ALink.href.split('=')[1],
    LArr = ALink.parentNode.innerHTML.split('('),
    LMonsterCount = -1,
    LExperience;

  if (LArr.length < 2)
    return;
    
  LMonsterCount = parseInt(LArr[1]);  
  var LExperience = GM_getValue(LMonster, ''); 
  if (LExperience == '')
  {
    Ajax('GET', ALink.href, null,
      function(AHTML)
      {
        var
          LIndex = 0,
          LPage = document.body.appendChild(document.createElement('div')),
          LParams = '';
        LPage.style.position = 'absolute';
        LPage.style.width = '0px';
        LPage.style.height = '0px';
        LPage.style.overflow = 'hidden';
        LPage.innerHTML = AHTML;
  
        LParams = LPage.querySelector('param[value*="M001"]').getAttribute('value').split('|')[1];
        LIndex = LParams.length - 1;
        while (isNaN(parseInt(LParams[LIndex])))
          LIndex--;
        LExperience = Number(LParams.substring(LIndex - 4, LIndex));
        GM_setValue(LMonster, LExperience);      
        LParams = ExperienceCalculate(LExperience, LMonsterCount, ALevel);
        ExperienceProcess(LParams, ALink);
      }
    );
  }
  else
  {
    var
      LParams = ExperienceCalculate(LExperience, LMonsterCount, ALevel);
    ExperienceProcess(LParams, ALink);
  }
}

function links_process(ALinks)
{
  for(var i = 0; i < ALinks.length; i++)
  {
    var LLink = ALinks[i];
    Run(parseInt(GM_getValue('level', '0')), LLink);
  }
  var LSkipExp = parseInt(GM_getValue('skip_exp', '0'));
  if ((LMinExp != 999999) && (LSkipExp > 0) && (LMinExp > LSkipExp))
    document.location.href = 'http://www.heroeswm.ru/map.php?action=skip';
}
                      
           
function setCheck(ch) {
    if( GM_getValue( ch ) && GM_getValue( ch ) == 1 )
        GM_setValue( ch , 0 );
    else
        GM_setValue( ch , 1 );
}
    
function close_setting_form() {
    bg = $('#bgOverlay1') ;
    bgc = $('#bgCenter1') ;
    if( bg ) {
        bg.style.display = bgc.style.display = 'none' ;
    }
}

function recalc_coef()
{
  var LExpCoef = parseFloat(GM_getValue('exp_coef', '1'));
  var LScriptExp = parseInt($('#id_script_exp').value);
  var LRealExp = parseInt($('#id_real_exp').value);
  var LNewExpCoef = LRealExp / (LScriptExp / LExpCoef);
  GM_setValue('exp_coef', LNewExpCoef.toFixed(3));
  open_setting_form();
}

function save_skip_exp()
{
  var LSkiptExp = parseInt($('#id_skip_exp').value);
  GM_setValue('skip_exp', LSkiptExp);
}
             
function open_setting_form()
{
  bg = $('#bgOverlay1') ;
  bgc = $('#bgCenter1') ;
  if( !bg ) {
      bg = document.createElement('div') ;
      bg.id = 'bgOverlay1' ;
      document.body.appendChild( bg );
      bg.style.position = 'absolute' ;
      bg.style.left = '0';
      bg.style.width = '100%';
      bg.style.height = '100%';
      bg.style.background = "#000000";
      bg.style.opacity = "0.5";
      bg.addEventListener( "click", close_setting_form , false );

      bgc = document.createElement('div') ;
      bgc.id = 'bgCenter1' ;
      document.body.appendChild( bgc );
      bgc.style.position = 'absolute' ;
      bgc.style.width = '400px';
      bgc.style.background = "#F6F3EA";
      bgc.style.left = ( ( document.body.offsetWidth - 400 ) / 2 ) + 'px' ;
      bgc.style.zIndex = "1105";
  }
  
  bgc.innerHTML = 
    '<div style="border:1px solid #abc;padding:5px;margin:2px;">' +
    '  <div style="float:right;border:1px solid #abc;width:15px;height:15px;text-align:center;cursor:pointer;" id="bt_close" title="Закрыть">x</div>' +
    '  <center>' +
    '    <table>' +
    '      <tr>' +
    '        <td><b>Настройки:</b></td>' +
    '      </tr>' +
    '      <tr>' +
    '        <td>' +
    '          <div>Если вы перекач и опыт показывает не верно</div>' +
    '          <div>для поднастройки калькулятора заполните поля</div>' +
    '          <div>и нажмите Пересчитать</div>' + 
    '          <div>Ваш коэфициент увеличения опыта: ' + parseFloat(GM_getValue('exp_coef', '1')) + '</div>' + 
    '          <div><input type="text" style="width:80;" id="id_script_exp"> Опыт который посчитал вам скрипт</div>' +
    '          <div><input type="text" style="width:80;" id="id_real_exp"> Реально полученый опыт</div>' +
    '          <div><input type="button" id="id_recalc_coef" value="Пересчитать"></div>' +
    '          <br>' +
    '          <div>Ведите опыт, что б автоматически попускать охоты</div>' +
    '          <div>Значение "0" - не пропускать охоты автоматически</div>' +
    '          <div><input type="text" style="width:80;" id="id_skip_exp"> Опыт для автоматического пропуска </div>' +
    '        </td>' +
    '      </tr>' +
    '    </table>' +
    '  </center>' +
    '</div>';  
  
  $("#bt_close").addEventListener( "click", close_setting_form , false );
  $("#id_recalc_coef").addEventListener( "click", recalc_coef , false );
  
  var Lskip_exp = $("#id_skip_exp");
  Lskip_exp.value = parseInt(GM_getValue('skip_exp', '0'));
  Lskip_exp.addEventListener( "change", save_skip_exp , false );
  Lskip_exp.addEventListener( "keyup", save_skip_exp , false );
  Lskip_exp.addEventListener( "paste", save_skip_exp , false );
                                                      
  bg.style.top = (-document.body.scrollTop)+'px';
  bgc.style.top = ( document.body.scrollTop + 100 ) + 'px';
  bg.style.display = bgc.style.display = 'block' ;    
}

function add_settings()
{
  var LLinks = document.querySelectorAll('a[href^="ecostat.php"]');
  if (LLinks && (LLinks.length > 0))
  {
    var LLink = LLinks[0];
    LDiv = document.createElement('div');
    LDiv.innerHTML = '<div style="text-decoration:underline;cursor:pointer;font-weight:bold;font-size:10px;" id="hwm_hant_options">Настройки калькулятора опыта охоты';
    LLink.parentNode.appendChild(LDiv);
    $("#hwm_hant_options").addEventListener( "click", open_setting_form , false );
  }
}

function calc_hant()
{
  var LLinks = document.querySelectorAll('a[href^="army_info.php"]');
  var LLink; 
  if (LLinks)
    links_process(LLinks);  
  add_settings();  
}

function save_level()
{
  var list = document.getElementsByTagName("b");
  for(var i = 0; i < list.length; i++)
  {
    var elem = list[i];
    
    if (elem.innerHTML.indexOf('\u0411\u043E\u0435\u0432\u043E\u0439\u0020\u0443\u0440\u043E\u0432\u0435\u043D\u044C') === 0)
    {
      var regex = /(\d+)/;
      var regex_res = regex.exec(elem.innerHTML);
      if (regex_res)
      {
        var LLevel = parseInt(regex_res[1]);
        if (LLevel)
          GM_setValue('level', LLevel);
      }
      return;
    }
  }  
}

function ProcessMain()
{            
  if (location.href.indexOf('/map.php') > -1)
    calc_hant();
  else
  if (location.href.indexOf('/home.php') > -1)
    save_level();
}

ProcessMain();