Greasy Fork is available in English.
Получение волн и сфер по логу боя в ТНВ
// ==UserScript== // @name GN_TnvGetter // @namespace Gradient // @description Получение волн и сфер по логу боя в ТНВ // @include /^https{0,1}:\/\/(www\.heroeswm\.ru|178\.248\.235\.15)\/battle.php\?lastturn=-1&warid=\d+/ // @include /^https{0,1}:\/\/(www\.heroeswm\.ru|178\.248\.235\.15)\/battle.php\?warid=\d+&lastturn=-1/ // @version 1.2.6 // ==/UserScript== "use strict"; //----------------------------------------------------------------------------// var script_name = 'GN_TnvGetter'; // Enter your script name here //----------------------------------------------------------------------------// (function(){ try{ // wrapper start //----------------------------------------------------------------------------// // UnifiedLibrary 1.7.0 start //----------------------------------------------------------------------------// //----------------------------------------------------------------------------// // SysUtils //----------------------------------------------------------------------------// var GN_SysUtils = new SysUtils(script_name); var SU = GN_SysUtils; //----------------------------------------------------------------------------// function SysUtils(name){ // wrapper start //----------------------------------------------------------------------------// this.show_error = function(error_string, use_alert){ if(use_alert) alert(error_string); throw new Error(error_string); }; if(arguments.length != 1) this.show_error('Wrong SysUtils arguments'); if(!arguments[0]) this.show_error('Empty SysUtils argument'); //----------------------------------------------------------------------------// this.load_value = function(value, def){ var div = document.getElementById('GN_GM_Handler'); div.setAttribute('desc', value); div.setAttribute('operation', 'load'); div.click(); if(div.getAttribute('state') != 'complete') this.show_error('Ошибка при загрузке значения'); return (div.getAttribute('is_null') == 'true' ? def : div.getAttribute('value')); }; //----------------------------------------------------------------------------// var current_id = null; //----------------------------------------------------------------------------// function check_mandatory_scripts(alerter){ var persistent_storage_sign = document.getElementById('GN_GM_Handler'); var common_values_sign = document.getElementById('GN_CommonValuesSign'); var alert_sign = document.getElementById('GN_AlertSign'); if(!alert_sign){ alert_sign = document.createElement('div'); alert_sign.id = 'GN_AlertSign'; alert_sign.setAttribute('alerted', 'false'); document.body.appendChild(alert_sign); } var alerted = alert_sign.getAttribute('alerted') != 'false'; if(!persistent_storage_sign){ alert_sign.setAttribute('alerted', 'true'); alerter('Скрипт ' + name + ' требует для своей работы скрипт управления данными (GN_PersistentStorage), который должен стоять первым в порядке выполнения скриптов.\n' + 'Подробнее здесь: "https://greasyfork.org/ru/scripts/14049-Как-устанавливать-скрипты-читать-здесь"', !alerted); } if(!common_values_sign){ alert_sign.setAttribute('alerted', 'true'); alerter('Скрипт ' + name + ' требует для своей работы скрипт, хранящий данные (GN_CommonValuesFiller), который должен стоять вторым в порядке выполнения скриптов.\n' + 'Подробнее здесь: "https://greasyfork.org/ru/scripts/14049-Как-устанавливать-скрипты-читать-здесь"', !alerted); } } this.check_login = function(){ var re = /.*?pl_id=(\d+)[^\d]*?/gmi; var matches = re.exec(document.cookie.toString()); if(matches){ current_id = +matches[1]; check_mandatory_scripts(this.show_error); } }; //----------------------------------------------------------------------------// this.check_login(); //----------------------------------------------------------------------------// } // wrapper end //----------------------------------------------------------------------------// // CommonValues //----------------------------------------------------------------------------// var GN_CommonValues = new CommonValues(); //----------------------------------------------------------------------------// function CommonValues(){ // wrapper start //----------------------------------------------------------------------------// // Creatures //----------------------------------------------------------------------------// this.creatures = JSON.parse(SU.load_value('GN_CommonValues_Creatures', '[]')); //----------------------------------------------------------------------------// } // wrapper end //----------------------------------------------------------------------------// // UnifiedLibrary end //----------------------------------------------------------------------------// var CV = GN_CommonValues; //----------------------------------------------------------------------------// var M_objects = []; var enum_sphere = { unknown: 0, call: 1, r###rrection: 2, shots: 3, mana: 4, attack: 5, defence: 6, speed: 9, initiative: 10, health: 11 }; var spheres = [ { id: enum_sphere.unknown, name: 'Неизвестная сфера' }, { id: enum_sphere.call, name: 'Призыв' }, { id: enum_sphere.r###rrection, name: 'Воскрешение' }, { id: enum_sphere.shots, name: 'Выстрелы' }, { id: enum_sphere.mana, name: 'Мана' }, { id: enum_sphere.attack, name: 'Атака' }, { id: enum_sphere.defence, name: 'Защита' }, { id: enum_sphere.speed, name: 'Скорость' }, { id: enum_sphere.initiative, name: 'Инициатива' }, { id: enum_sphere.health, name: 'Здоровье' } ]; var enum_align = { unknown: 0, left: 1, up: 2, right: 3, down: 4 }; var aligns = [ { id: enum_align.unknown, name: 'Сфера' }, { id: enum_align.left, name: 'Лево' }, { id: enum_align.up, name: 'Верх' }, { id: enum_align.right, name: 'Право' }, { id: enum_align.down, name: 'Низ' } ]; start_work(); //----------------------------------------------------------------------------// function start_work(){ parse_content(); if(M_objects.length) print_content(); } //----------------------------------------------------------------------------// function parse_content(){ var content = document.body.innerHTML; if(content.indexOf('bonusani') == -1) // regexp catastrophic backtracking return; var re = /.+?M(\d+?):.+bonusani/; var matches = re.exec(content); if(!matches) return; var M = matches[1]; var is_next = false; do{ var M_next = next_M(M); re = new RegExp('M' + M + '(.+)M' + M_next); is_next = (matches = re.exec(content)); if(!is_next){ re = new RegExp('M' + M + '([^<]+)'); is_next = (matches = re.exec(content)); } if(is_next) parse_row(matches[1]); M = M_next; } while(is_next); } //----------------------------------------------------------------------------// function next_M(M){ var M_next = +M + 1; if(M_next < 10) M_next = '00' + M_next; else if(M_next >= 10 && M_next < 100) M_next = '0' + M_next; return M_next; } //----------------------------------------------------------------------------// function parse_row(row){ if(/\^sum1/.test(row)) //gate return; var descriptors = row.split('|'); var M_obj = { is_boss: false, def: 0, hp: 0, type: '', name: '', bossname: '', count: 0, is_bonus: /bonusani/.test(row), bonus: enum_sphere.unknown, bnc: 0, bni: 0, align: enum_align.unknown }; if(M_obj.is_bonus){ var matches = /.+~\^BNc1(\d+)BNi1(\d+)BNg/.exec(row); if(matches){ M_obj.bonus = enum_sphere.call; M_obj.bnc = +matches[1]; M_obj.bni = +matches[2]; } else { M_obj.bonus = /~\^BNb1(\d+)sum/.exec(row); M_obj.bonus = M_obj.bonus ? +M_obj.bonus[1] : enum_sphere.unknown; } } else{ M_obj.is_boss = /\^bos/.test(row); if(M_obj.is_boss){ M_obj.def = /:([0-9-]+)/.exec(descriptors[0]); if(M_obj.def) M_obj.def = +M_obj.def[1].substr(-6*6, 6); M_obj.hp = /:([0-9-]+)/.exec(descriptors[0]); if(M_obj.hp) M_obj.hp = +M_obj.hp[1].substr(-2*6, 6); M_obj.count = 1; } else{ var matches = /:([0-9-]+)/.exec(descriptors[0]); if(matches){ M_obj.count = +matches[1].substr(11*6, 6); M_obj.bnc = M_obj.count; M_obj.bni = +matches[1].substr(1*6, 6); } } M_obj.type = /:[0-9-]+([^0-9-]+)/.exec(descriptors[0]); if(M_obj.type){ M_obj.type = M_obj.type[1]; var creature = get_creature(M_obj.type); if(creature) M_obj.bossname = creature.name; } M_obj.name = /(.+?)#/.exec(descriptors[2]); if(M_obj.name) M_obj.name = M_obj.name[1]; M_obj.align = /:([0-9-]+)/.exec(descriptors[0]); M_obj.align = parse_align(M_obj.align); } M_objects.push(M_obj); } //----------------------------------------------------------------------------// function parse_align(matches){ if(!matches) return enum_align.unknown; matches = matches[1].substr(-11*6, 12); if(matches == '-00005000006') return enum_align.left; if(matches == '000017000006') return enum_align.right; if(matches == '000006-00005') return enum_align.up; if(matches == '000006000017') return enum_align.down; return enum_align.unknown; } //----------------------------------------------------------------------------// function print_content(){ var rows = []; var row = []; var end_wave = false; var calls = []; while(M_objects.length){ if(end_wave){ rows.push(row); end_wave = false; row = []; } var obj = M_objects.shift(); end_wave = obj.is_bonus; if(obj.is_bonus){ var sphere = get_sphere(obj.bonus); if(sphere.id == enum_sphere.call){ var call = get_called(obj.bnc, obj.bni, M_objects); if(call) calls.push(call); } } row.push(obj); } if(row.length) rows.push(row); var row_aligns = [ enum_align.left, enum_align.up, enum_align.right, enum_align.down, enum_align.unknown /*sphere*/ ]; var printed_rows = []; var header = []; row_aligns.forEach(function(current){ var align = get_align(current); header.push(align.name); }); printed_rows.push(header.join(' - ')); var wave = 0; rows.forEach(function(curr_row){ var ordered = []; row_aligns.forEach(function(c){ ordered.push('пусто'); }); curr_row.forEach(function(obj){ var idx = row_aligns.indexOf(obj.align); if(idx != -1){ if(!obj.is_bonus) ordered[idx] = obj.is_boss ? (obj.name + '(Тип: ' + obj.bossname + ', ХП: ' + obj.hp + ', защита: ' + obj.def + ')') : (obj.count + ' ' + obj.name); else{ var sphere = get_sphere(obj.bonus); var call = null; if(sphere.id == enum_sphere.call){ call = get_called(obj.bnc, obj.bni, calls); var creature = get_uid_creature(obj.bni); ordered[idx] = '(' + sphere.name + ': ' + (creature ? (obj.bnc + ' ' + creature.name) : '') + (call ? ', ' + get_align(call.align).name : '') + ')'; } else ordered[idx] = '(' + sphere.name + ')'; } } }); printed_rows.push(++wave + ') ' + ordered.join(' - ')); }); alert(printed_rows.join('\n')); } //----------------------------------------------------------------------------// function get_creature(flash){ for(var i = 0; i < CV.creatures.length; ++i) if(CV.creatures[i].flash == flash) return CV.creatures[i]; return null; } //----------------------------------------------------------------------------// function get_uid_creature(uid){ for(var i = 0; i < CV.creatures.length; ++i) if(CV.creatures[i].uid == uid) return CV.creatures[i]; return null; } //----------------------------------------------------------------------------// function get_align(id){ for(var i = 0; i < aligns.length; ++i) if(aligns[i].id == id) return aligns[i]; throw new Error('Logic error, align id = [' + id + ']'); } //----------------------------------------------------------------------------// function get_sphere(id){ for(var i = 0; i < spheres.length; ++i) if(spheres[i].id == id) return spheres[i]; throw new Error('Logic error, sphere id = [' + id + ']'); } //----------------------------------------------------------------------------// function get_called(bnc, bni, arr_){ for(var i = 0; i < arr_.length; ++i){ var x = arr_[i]; if(x.bnc == bnc && x.bni == bni){ arr_.splice(i, 1); return x; } } return null; } //----------------------------------------------------------------------------// } catch(e){ alert('Ошибка в скрипте ' + script_name + ', обратитесь к разработчику:\n' + e); throw e; }}()); // wrapper end //----------------------------------------------------------------------------//