您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Fort battle tools for The West!
// ==UserScript== // @name The West Fortbattle Tool // @namespace The West Fortbattle Tool // @author westernblumi (updated by Tom Robert) // @description Fort battle tools for The West! // @include https://*.the-west.*/game.php* // @version 1.20 // @grant none // ==/UserScript== // translation:westernblumi(German & English),pepe100(Spanish),Ruslan Jackson(Italiano) (function (fn) { var script = document.createElement('script'); script.setAttribute('type', 'application/javascript'); script.textContent = '(' + fn.toString() + ')();'; document.body.appendChild(script); document.body.removeChild(script); })(function () { TWFBT = { version: '1.20', name: 'TW Fortbattle Tool', website: '//greasyfork.org/scripts/22880', url: '//tomrobert.safe-ws.de/', langs: { en: { attack: 'Attack', bonusByClothes: 'Bonus by Clothes', bonusBySets: 'Bonus by Sets', bonusBySkill: 'Bonus by skill', bonusDefault: 'Defaultbonus', bonusTotal: 'Total', calcBonus: 'Calculate fort battle bonus', calculator: 'Calculator', clear: 'Clear Window', clothes: 'Clothes', damageBonus: 'Damage', defense: 'Defense', newFormula: 'new formula', oldFormula: 'old formula', pa: 'Premium (soldier and worker fort battle bonus)', pitfall: 'Setting traps', resistance: 'Resistance', scriptName: 'The West Fortbattle Tool', showFurtherStatistics: 'Show more statistics', team: 'Team', player: 'Player', playerCount: 'Number of players', survivingPlayerCount: 'Surviving players', offlinePlayerCount: 'Offline players', maxhp: 'Maximum healthpoints', starthp: 'Health at the start of the battle', finishedhp: 'Health at the end of the battle', totalcauseddamage: 'Total damage inflicted', hitcount: 'Hits', misscount: 'Misses', dodgecount: 'Dodges', takenhits: 'Hits taken', crithits: 'Critical Hits', diedwhen: 'Average lifetime', onlinecount: 'Average online rounds', takendamage: 'Taken damage', charlevel: 'Average level', criticalHits: 'Critical hits', points: 'Points', ranking: 'Ranking', town: 'Town', attacker: 'Attacker', defender: 'Defender', charclass: 'Class', side: 'Side', playerName: 'Player name', offliner: 'Offline players', totalShots: 'Total shots', hitPercentage: 'Hits in %', dodgePercentage: 'Dodges in %', damagePerHit: 'Damage per hit', averageWeaponDamage: 'Average weapon damage', shotsPerPlayer: 'Shots', order: 'Order of movement', rank: 'Rank', weapons: 'Weapons', weapon: 'Weapon', damageBuff: 'Damage buff', noBuff: 'No damage buff', sectorBonus: 'Sector bonus', timeOfDeath: 'Time of death', round: 'Round', kos: 'KO\'s', damage: 'Damage', lifepointsAtRoundEnd: 'Lifepoints at the end of the round', passedOutDuringFight: 'Enemys passed out during that round', rounds: 'Rounds', importBattle: 'Import battle', importSuccessfull: 'Import successfull', importError: 'Import not successfull, the text contains errors', exportBattle: 'Export battle', overview: 'Overview', exportWeapons: 'Export weapons', exportRanking: 'Export ranking', exportOrderOfMovement: 'Export order of movement', exportTimeOfDeath: 'Export time of death', statistic: 'Statistic', pasteExport: 'Paste the text you got at the battle export', exportRounds: 'Export rounds', export: 'Export', exportBattleDescription: 'Here you can export the battle and e.g. import it at a later time', exportSingleStatisticDescription: 'Here you can export various statastics for using it in Excel', playdeadcount: 'Active adventurer bonus (invisibility)', }, de: { attack: 'Angriff', bonusByClothes: 'Bonus durch Kleidung', bonusBySets: 'Bonus durch Sets', bonusBySkill: 'Bonus durch Skillung', bonusDefault: 'Grundbonus', bonusTotal: 'Gesamt', calcBonus: 'Berechne Fortkampfbonus', calculator: 'Rechner', clear: 'Lösche Berechnungen', clothes: 'Kleidung', damageBonus: 'Schaden', defense: 'Verteidigung', newFormula: 'neue Formel', oldFormula: 'alte Formel', pa: 'Premium (Soldaten und Arbeiterbonus)', pitfall: 'Fallen stellen', resistance: 'Widerstand', scriptName: 'The West FK Tool', showFurtherStatistics: 'Zeige weitere Statistiken', team: 'Team', player: 'Spieler', playerCount: 'Spielerzahl', survivingPlayerCount: 'Überlebende Spieler', offlinePlayerCount: 'Offliner', maxhp: 'Maximale Lebenspunkte', starthp: 'Lebenspunkte am Anfang', finishedhp: 'Lebenspunkte am Ende', totalcauseddamage: 'Schaden', hitcount: 'Treffer', misscount: 'Fehlschüsse', dodgecount: 'Ausweicher', takenhits: 'Eingesteckte Treffer', crithits: 'Kritische Treffer', diedwhen: 'Durchschnittliche Lebensdauer', onlinecount: 'Durchschnittliche Anzahl an Onlinerunden', takendamage: 'Eingesteckter Schaden', charlevel: 'Level', criticalHits: 'Kritische Treffer', points: 'Punktzahl', ranking: 'Rangliste', town: 'Stadt', attacker: 'Angreifer', defender: 'Verteidiger', charclass: 'Klasse', side: 'Seite', playerName: 'Spielername', offliner: 'Offliner', totalShots: 'Abgegebene Schüsse', hitPercentage: 'Treffer in %', dodgePercentage: 'Ausweicher in %', damagePerHit: 'Schaden pro Treffer', averageWeaponDamage: 'Durchschnittlicher Waffenschaden', shotsPerPlayer: 'Abgegebene Schüsse', order: 'Zugreihenfolge', rank: 'Rang', weapons: 'Waffen', weapon: 'Waffe', damageBuff: 'Schadensbuff', noBuff: 'Kein Schadensbuff', sectorBonus: 'Sektorbonus', timeOfDeath: 'Todeszeitpunkt', round: 'Runde', kos: 'KO\'s', damage: 'Schaden', lifepointsAtRoundEnd: 'Lebenspunkte am Ende der Runde', passedOutDuringFight: 'Ko geschossen in dieser Runde', rounds: 'Runden', importBattle: 'Kampf importieren', importSuccessfull: 'Das Importieren war erfolgreich', importError: 'Das Importieren war nicht möglich, da der Text fehlerhaft ist', exportBattle: 'Kampf exportieren', overview: 'Übersicht', exportWeapons: 'Waffen exportieren', exportRanking: 'Rangliste exportieren', exportOrderOfMovement: 'Zugreihenfolge exportieren', exportTimeOfDeath: 'Todeszeitpunkte exportieren', statistic: 'Statistik', pasteExport: 'Füge hier den Text ein, den du beim Exportieren erhalten hast', exportRounds: 'Runden exportieren', export: 'Export', exportBattleDescription: 'Hier kannst du den Kampf exportieren und z.B. für den FK Player verwenden oder ihn später wieder Importieren', exportSingleStatisticDescription: 'Hier kannst du verschiedenen Einzelstatistiken exportieren und in Excel verwenden', playdeadcount: 'Aktiver Abenteurer-Bonus (Ghost)', }, es: { attack: 'Ataque', bonusByClothes: 'Bono por Ropas', bonusBySets: 'Bono por Conjuntos', bonusBySkill: 'Bono por Habilidad', bonusDefault: 'Bono por Defecto', bonusTotal: 'Total', calcBonus: 'Calcular Bono de Batalla', calculator: 'Calculadora', clear: 'Limpiar Ventana', clothes: 'Ropa', damageBonus: 'Daño', defense: 'Defensa', newFormula: 'fórmula nueva', oldFormula: 'fórmula antigua', pa: 'Premium (bonus Soldado/Trabajador)', pitfall: 'Poner trampas', resistance: 'Resistencia', scriptName: 'The West Fortbattle Tool', showFurtherStatistics: 'Mostrar más estadísticas', team: 'Equipo', player: 'Jugador', playerCount: 'Número de jugadores', survivingPlayerCount: 'Jugadores supervivientes', offlinePlayerCount: 'Jugadores Off', maxhp: 'Puntos de salud máximos', starthp: 'Vida al inicio de la batalla', finishedhp: 'Vida al final de la batalla', totalcauseddamage: 'Total daño causado', hitcount: 'Aciertos realizados', misscount: 'Fallos', dodgecount: 'Eludidos', takenhits: 'Aciertos recibidos', crithits: 'Críticos', diedwhen: 'Tiempo de vida promedio', onlinecount: 'Media de rondas On', takendamage: 'Daño recibido', charlevel: 'Nivel medio', criticalHits: 'Críticos', points: 'Puntos', ranking: 'Ranking', town: 'Ciudad', attacker: 'Atacante', defender: 'Defensor', charclass: 'Clase', side: 'Lado', playerName: 'Nombre jugador', offliner: 'Jugadores Off', totalShots: 'Total disparos', hitPercentage: '% Aciertos', dodgePercentage: '% Eludidos', damagePerHit: 'Daño por acierto', averageWeaponDamage: 'Daño medio arma', shotsPerPlayer: 'Disparos', order: 'Orden de movimientos', rank: 'Rango', weapons: 'Armas', weapon: 'Arma', damageBuff: 'Buff de Daño', noBuff: 'Sin Buff de Daño', sectorBonus: 'Bonus de Sector', timeOfDeath: 'Hora de la muerte', round: 'Ronda', kos: 'Desmayos', damage: 'Daño', lifepointsAtRoundEnd: 'Puntos de vida al final de la ronda', passedOutDuringFight: 'Enemigos desmayados durante esa ronda', rounds: 'Rondas', importBattle: 'Importar batalla', importSuccessfull: 'Importación correcta', importError: 'Importación incorrecta, el texto contiene errores', exportBattle: 'Exportar batalla', overview: 'Resumen', exportWeapons: 'Exportar armas', exportRanking: 'Exportar clasificación', exportOrderOfMovement: 'Exportar orden de movimientos', exportTimeOfDeath: 'Exportar Hora de la muerte', statistic: 'Estadística', pasteExport: 'Paste the text you got at the battle export', exportRounds: 'Exportar rondas', export: 'Exportar', exportBattleDescription: 'Aquí puedes exportar la batalla para, por ejemplo, importarla más tarde', exportSingleStatisticDescription: 'Aquí puedes exportar varias estadísticas para usarlas en Excel', playdeadcount: 'Bono de aventurero activo (Invisibilidad)', }, it: { language: 'Italiano', attack: 'Attaco', bonusByClothes: 'Bonus dei Vestiti', bonusBySets: 'Bonus dei Set Sets', bonusBySkill: 'Bonus delle skill', bonusDefault: 'Bonus di default', bonusTotal: 'Totale', calcBonus: 'Calcola il bonus batalgie forti', calculator: 'Calcolatrice', clear: 'Axxera Finestra', clothes: 'Vestiti', damageBonus: 'Danno', defense: 'Bonus difesa', newFormula: 'nuova formula', oldFormula: 'vecchia formula', pa: 'Premium (Bonus bataglia forte per il soldato e lavoratore)', pitfall: 'Trappole', resistance: 'Resistenza', scriptName: 'The West Tool per le Batagli Forti', showFurtherStatistics: 'Show more statistics', team: 'Team', player: 'Player', playerCount: 'Number of players', survivingPlayerCount: 'Surviving players', offlinePlayerCount: 'Offline players', maxhp: 'Maximum healthpoints', starthp: 'Health at the start of the battle', finishedhp: 'Health at the end of the battle', totalcauseddamage: 'Total damage inflicted', hitcount: 'Hits', misscount: 'Misses', dodgecount: 'Dodges', takenhits: 'Hits taken', crithits: 'Critical Hits', diedwhen: 'Average lifetime', onlinecount: 'Average online rounds', takendamage: 'Taken damage', charlevel: 'Average level', criticalHits: 'Kritische Treffer', points: 'Points', ranking: 'Ranking', town: 'Town', attacker: 'Attacker', defender: 'Defender', charclass: 'Class', side: 'Side', playerName: 'Player name', offliner: 'Offline players', totalShots: 'Total shots', hitPercentage: 'Hits in %', dodgePercentage: 'Dodges in %', damagePerHit: 'Damage per hit', averageWeaponDamage: 'Average weapon damage', shotsPerPlayer: 'Shots', order: 'Order of movement', rank: 'Rank', weapons: 'Weapons', weapon: 'Weapon', damageBuff: 'Damage buff', noBuff: 'No damage buff', sectorBonus: 'Sector bonus', timeOfDeath: 'Time of death', round: 'Round', kos: 'KO\'s', damage: 'Damage', lifepointsAtRoundEnd: 'Lifepoints at the end of the round', passedOutDuringFight: 'Enemys passed out during that round', rounds: 'Rounds', importBattle: 'Import battle', importSuccessfull: 'Import successfull', importError: 'Import not successfull, the text contains errors', exportBattle: 'Export battle', overview: 'Overview', exportWeapons: 'Export weapons', exportRanking: 'Export ranking', exportOrderOfMovement: 'Export order of movement', exportTimeOfDeath: 'Export time of death', statistic: 'Statistic', pasteExport: 'Paste the text you got at the battle export', exportRounds: 'Export rounds', export: 'Export', exportBattleDescription: 'Here you can export the battle and e.g. import it at a later time', exportSingleStatisticDescription: 'Here you can export various statastics for using it in Excel', playdeadcount: 'Active adventurer bonus (invisibility)', }, }, side: 'attack', formula: 'newFormula', Images: { settings: 'data:image/jpeg;base64,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', charClasses: 'data:image/png;base64,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', }, updateLang: function () { var lgs = TWFBT.langs, lg = [localStorage.getItem('scriptsLang'), Game.locale.substr(0, 2)]; TWFBT.lang = lgs[lg[0]] ? lg[0] : lgs[lg[1]] ? lg[1] : 'en'; TWFBTlang = lgs[TWFBT.lang]; }, }; TWFBT.updateLang(); TWFBT.Skript = { init: function () { TWFBT.Statistics.init(); TWFBT.PreBattleChars.init(); var styling = $('<style>').text('.TWFBT_left { position: relative; left: 28px; top: 20px;} .TWFBT_textarea {left: 20px; top: 25px;} .TWFBT_button {left: 25px; top: 30px;}'); $('head').append(styling); var menuContainer = $('<div class="menulink" onClick="TWFBT.GUI.openTWFBTWindow();" title="' + TWFBTlang.scriptName + '">').css('background-image', 'url(' + TWFBT.Images.settings + ')').css('background-position', '0px 0px').on("mouseenter", function () { $(this).css('background-position', '-25px 0px'); }).on('mouseleave', function () { $(this).css('background-position', '0px 0px'); }); $('#ui_menubar').append($('<div id="TWFBT_menubutton" class="ui_menucontainer">').append(menuContainer).append('<div class="menucontainer_bottom">')); }, }; var charclasses = { '-1': 'greenhorn', '0': 'adventurer', '1': 'duelist', '2': 'worker', '3': 'soldier', }; TWFBT.GUI = { openTWFBTWindow: function () { TWFBT.GUI.open(); TWFBT.GUI.calcSkill(); }, open: function () { TWFBT.GUI.window = wman.open('TWFBT', TWFBTlang.scriptName, 'noreload nocloseall').setMiniTitle(TWFBT.name); TWFBT.GUI.window.dontCloseAll = true; TWFBT.GUI.window.addTab(TWFBTlang.calculator, 'TWFBTCalcSkill', TWFBT.GUI.calcSkill); TWFBT.GUI.window.addTab(TWFBTlang.importBattle, 'TWFBTBattleImporterTab', TWFBT.GUI.showBattleImporter); }, getDefault: function (tab) { TWFBT.GUI.window.clearContentPane().activateTab(tab); }, showBattleImporter: function () { TWFBT.GUI.getDefault('TWFBTBattleImporterTab'); var input = new west.gui.Textarea().setId("TWFBTbattleImporterInput").setWidth(635).setHeight(260); var importButton = new west.gui.Button(TWFBTlang.importBattle, function () { try { TWFBT.Statistics.stats.result = JSON.parse(input.getContent()); MessageSuccess(TWFBTlang.importSuccessfull).show(); TWFBT.Statistics.openStatsGUIOpen(); } catch (err) { MessageError(TWFBTlang.importError).show(); } }).getMainDiv(); $(importButton).addClass("TWFBT_button"); $(TWFBT.GUI.window.getContentPane()).append($("<span class='TWFBT_left strong'>" + TWFBTlang.pasteExport + ":<br></span>"), input.getMainDiv().addClass('TWFBT_textarea'), importButton); }, calcSkill: function () { TWFBT.GUI.getDefault('TWFBTCalcSkill'); var featScroll = new west.gui.Scrollpane(); $(featScroll.getMainDiv()).css({ 'margin-top': '10px' }); var calcButton = new west.gui.Button(TWFBTlang.calcBonus, function () { TWFBT.Calculator.getLoader(); }); var clearButton = new west.gui.Button(TWFBTlang.clear, function () { clearTable(); }); if (TWFBT.pa === undefined) TWFBT.pa = Premium.hasBonus('character'); if (TWFBT.characterClass === undefined) TWFBT.characterClass = Character.charClass; var paCheckbox = new west.gui.Checkbox().setLabel(TWFBTlang.pa).setCallback(function (t) { TWFBT.pa = t; }).setSelected(TWFBT.pa, 1); var charClassBox = new west.gui.Combobox(); for (var p in charclasses) { p = charclasses[p]; charClassBox.addItem(p, Game.InfoHandler.getLocalString4Charclass(p)); } charClassBox.addListener(function (val) { TWFBT.characterClass = val; }).select(TWFBT.characterClass); var modeBox = new west.gui.Combobox() .addItem('attack', TWFBTlang.attack) .addItem('defense', TWFBTlang.defense) .addListener(function (val) { TWFBT.side = val; }).select(TWFBT.side); featScroll.appendContent([modeBox.getMainDiv(), ' ', paCheckbox.getMainDiv(), ' ', charClassBox.getMainDiv(), '<br>', calcButton.getMainDiv(), clearButton.getMainDiv(), '<table border="1" id="TWFBTCalculatorTable"></table>']); $(TWFBT.GUI.window.getContentPane()).append(featScroll.getMainDiv()); var clearTable = function () { $('#TWFBTCalculatorTable').empty(); }; }, }; TWFBT.Calculator = { resetValues: function () { TWFBT.Calculator.values = { offense_defaultbonus: 25, defense_defaultbonus: 10, offense_fortbattlebonus: 0, defense_fortbattlebonus: 0, offense_setbonus: 0, defense_setbonus: 0, damageSector: 0, resistance: 0, }; }, getLoader: function () { if (!window.BattleCalc) $.getScript('//tw-calc.net/js/battle-calculator-core.js', function () { TWFBT.Calculator.calcSkills(); }).fail(function () { alert('TWFBT error: ' + JSON.stringify(arguments)) }); else this.calcSkills(); }, calcSkills: function () { this.resetValues(); if (!BattleCalc.getItemBonus_twfbt) { BattleCalc.getItemBonus_twfbt = BattleCalc.getItemBonus; BattleCalc.getItemBonus = function () { var b = BattleCalc.getItemBonus_twfbt.apply(this, arguments), tcv = TWFBT.Calculator.values; tcv.offense_fortbattlebonus += b.offense || 0; tcv.defense_fortbattlebonus += b.defense || 0; tcv.damageSector += b.damage || 0; tcv.resistance += b.resistance || 0; return b; }; BattleCalc.getSetBonus_twfbt = BattleCalc.getSetBonus; BattleCalc.getSetBonus = function () { var c = BattleCalc.getSetBonus_twfbt.apply(this, arguments), tcw = TWFBT.Calculator.values; tcw.offense_setbonus += c.offense || 0; tcw.defense_setbonus += c.defense || 0; tcw.damageSector += c.damage || 0; tcw.resistance += c.resistance || 0; return c; }; } this.input = { charClass: TWFBT.characterClass, premium: TWFBT.pa, level: Character.level, skills: { health: CharacterSkills.skills.health.getPointsWithBonus(), leadership: CharacterSkills.skills.leadership.getPointsWithBonus(), pitfall: CharacterSkills.skills.pitfall.getPointsWithBonus(), hide: CharacterSkills.skills.hide.getPointsWithBonus(), dodge: CharacterSkills.skills.dodge.getPointsWithBonus(), aim: CharacterSkills.skills.aim.getPointsWithBonus() }, map_position: 0, bonus: {} }; this.result = BattleCalc.coreCalc(this.input, 1); this.showData(); }, showData: function () { var CSkN = CharacterSkills.keyNames, trs = this.result[TWFBT.side], tv = this.values, side = TWFBT.side == 'attack' ? 'hide' : 'pitfall'; content = $('<tr></tr>'); content.append('<th colspan="9">' + TWFBTlang[TWFBT.side] + '</th>'); $('#TWFBTCalculatorTable').append(content); content = $('<tr><th>' + CSkN.leadership + '</th><th>' + CSkN[side] + '</th><th>' + CSkN.aim + '</th><th>' + CSkN.dodge + '</th><th>' + TWFBTlang.bonusBySkill + '</th><th>' + TWFBTlang.bonusByClothes + '</th><th>' + TWFBTlang.bonusBySets + '</th><th>' + TWFBTlang.bonusDefault + '</th><th>' + TWFBTlang.bonusTotal + '</th></tr>'); $('#TWFBTCalculatorTable').append(content); content = $('<tr></tr>'); content.append('<td align="center">' + this.input.skills.leadership + '</td>' + '<td align="center">' + this.input.skills[side] + '</td>' + '<td align="center">' + this.input.skills.aim + '</td>' + '<td align="center">' + this.input.skills.dodge + '</td>' + '<td align="center">' + Math.round((trs.hit - tv.offense_defaultbonus - tv.offense_setbonus - tv.offense_fortbattlebonus) * 100) / 100 + '<br>' + Math.round((trs.dodge - tv.defense_defaultbonus - tv.defense_setbonus - tv.defense_fortbattlebonus) * 100) / 100 + '</td>' + '<td align="center">' + tv.offense_fortbattlebonus + '<br>' + tv.defense_fortbattlebonus + '</td>' + '<td align="center">' + tv.offense_setbonus + '<br>' + tv.defense_setbonus + '</td>' + '<td align="center">' + tv.offense_defaultbonus + '<br>' + tv.defense_defaultbonus + '</td>' + '<td align="center">' + trs.hit + '<br>' + trs.dodge + '</td>'); $('#TWFBTCalculatorTable').append(content); content = $('<tr></tr>'); content.append('<th>' + TWFBTlang.damageBonus + '</th><td align="center" style="vertical-align:middle;" colspan="2">' + this.result.damage + '<br>(' + tv.damageSector + ' ' + TWFBTlang.sectorBonus + ')</td>' + '<th colspan="2">' + TWFBTlang.resistance + '</th><td align="center" style="vertical-align:middle;">' + trs.resistance + '<br>(' + tv.resistance + ' ' + TWFBTlang.clothes + ')</td>' + '<th colspan="2">' + CSkN.health + '</th><td align="center" style="vertical-align:middle;">' + this.result.health + '</td>'); $('#TWFBTCalculatorTable').append(content); content = $('<tr></tr>'); var item_string = ''; for (var item in Wear.wear) { var item_obj = Wear.wear[item].obj; var popup = new ItemPopup(item_obj, { character: { level: Character.level } }).popup; item_string += '<a class="itemlink hasMousePopup" href="javascript:void(0)" title="' + popup.getXHTML().escapeHTML() + '">' + item_obj.name + '<img width="15" height="15" src="' + item_obj.image + '"> </a>'; } content.append('<th>' + TWFBTlang.clothes + '</th><td align="left" colspan="8">' + item_string + '</td>'); $('#TWFBTCalculatorTable').append(content); }, }; TWFBT.Statistics = { openStatsGUIOpen: function () { TWFBT.Statistics.openStatsGUI(); TWFBT.Statistics.showOverviewTab(); }, openStatsGUI: function () { TWFBT.Statistics.window = wman.open('TWFBT_2', TWFBTlang.scriptName, 'noreload').setMiniTitle(TWFBT.name) .addTab(TWFBTlang.overview, 'TWFBTOverviewTab', TWFBT.Statistics.showOverviewTab) .addTab(TWFBTlang.team, 'TWFBTTesterTab1', TWFBT.Statistics.showTeamStatsTab) .addTab(TWFBTlang.player, 'TWFBTTesterTab2', TWFBT.Statistics.showPerPlayerStatsTab) .addTab(TWFBTlang.ranking, 'TWFBTTesterTab3', TWFBT.Statistics.showRankingTab) .addTab(TWFBTlang.order, 'TWFBTTesterTab4', TWFBT.Statistics.showOrderTab) .addTab(TWFBTlang.weapons, 'TWFBTTesterTab5', TWFBT.Statistics.showWeaponsTab) .addTab(TWFBTlang.timeOfDeath, 'TWFBTTesterTab6', TWFBT.Statistics.showTimeOfDeathTab) .addTab(TWFBTlang.rounds, 'TWFBTTesterTab7', TWFBT.Statistics.showRoundStatsTab); }, getDefault: function (tab) { TWFBT.Statistics.window.clearContentPane().activateTab(tab); }, showOverviewTab: function () { TWFBT.Statistics.getDefault('TWFBTOverviewTab'); var showTeamStatsButton = new west.gui.Button(TWFBTlang.team, TWFBT.Statistics.showTeamStatsTab).getMainDiv(), showPerPlayerStatsButton = new west.gui.Button(TWFBTlang.player, TWFBT.Statistics.showPerPlayerStatsTab).getMainDiv(), showRankingButton = new west.gui.Button(TWFBTlang.ranking, TWFBT.Statistics.showRankingTab).getMainDiv(), showOrderButton = new west.gui.Button(TWFBTlang.order, TWFBT.Statistics.showOrderTab).getMainDiv(), showWeaponsButton = new west.gui.Button(TWFBTlang.weapons, TWFBT.Statistics.showWeaponsTab).getMainDiv(), showTimeOfDeathButton = new west.gui.Button(TWFBTlang.timeOfDeath, TWFBT.Statistics.showTimeOfDeathTab).getMainDiv(), showRoundStatsButton = new west.gui.Button(TWFBTlang.rounds, TWFBT.Statistics.showRoundStatsTab).getMainDiv(), input = new west.gui.Textarea().setId("TWFBTbattleExporterInput").setWidth(450).setHeight(200), exportAllButton = new west.gui.Button(TWFBTlang.exportBattle, function () { TWFBT.Statistics.exportFunction(input, JSON.stringify(TWFBT.Statistics.stats.result)); }).getMainDiv(), exportRankingButton = new west.gui.Button(TWFBTlang.exportRanking, function () { TWFBT.Statistics.exportFunction(input, TWFBT.Statistics.exportRankingStatistics()); }).getMainDiv(), exportOrderOfMovementButton = new west.gui.Button(TWFBTlang.exportOrderOfMovement, function () { TWFBT.Statistics.exportFunction(input, TWFBT.Statistics.exportOrderOfMovementStatistics()); }).getMainDiv(), exportWeaponsButton = new west.gui.Button(TWFBTlang.exportWeapons, function () { TWFBT.Statistics.exportFunction(input, TWFBT.Statistics.exportWeaponStatistics()); }).getMainDiv(), exportTimeOfDeathButton = new west.gui.Button(TWFBTlang.exportTimeOfDeath, function () { TWFBT.Statistics.exportFunction(input, TWFBT.Statistics.exportTimeOfDeathStatistics()); }).getMainDiv(), exportRoundsButton = new west.gui.Button(TWFBTlang.exportRounds, function () { TWFBT.Statistics.exportFunction(input, TWFBT.Statistics.exportRoundStatistics()); }).getMainDiv(); $(TWFBT.Statistics.window.getContentPane()).append($("<span class='TWFBT_left strong'>" + TWFBTlang.statistic + ' ' + TWFBTlang.overview + ":<br></span>"), showTeamStatsButton, showPerPlayerStatsButton, showRankingButton, showOrderButton, '<br><br>', showWeaponsButton, showTimeOfDeathButton, showRoundStatsButton, '<br><br>', $("<span class='TWFBT_left strong'>" + TWFBTlang.export + ":<br></span>"), "<span class='TWFBT_left'>" + TWFBTlang.exportBattleDescription + ":<br></span>", exportAllButton, "<br><br><br><span class='TWFBT_left'>" + TWFBTlang.exportSingleStatisticDescription + ":<br></span>", exportRankingButton, exportOrderOfMovementButton, exportWeaponsButton, '<br><br>', exportTimeOfDeathButton, exportRoundsButton); $('.TWFBT_2 .tw2gui_button').addClass("TWFBT_button"); }, showTeamStatsTab: function () { var that = TWFBT.Statistics; that.getDefault('TWFBTTesterTab1'); var featScroll = new west.gui.Scrollpane(); $(featScroll.getMainDiv()).css({ 'margin-top': '5px' }); featScroll.appendContent([that.getProgressBar(that.stats.result.attackerlist.length, that.stats.result.defenderlist.length, TWFBTlang.playerCount), that.getPBv(that.getOffliner()), that.getPBv(that.getSurvivingPlayer()), that.getPBv(that.getValueSums('totalcauseddamage')), that.getPBv(that.getTotalShots()), that.getPBv(that.getValueSums('crithits')), that.getPBv(that.getValueSums('playdeadcount')), that.getPBv(that.getValueSums('maxhp')), that.getPBv(that.getValueSums('starthp')), that.getPBv(that.getValueSums('finishedhp')), that.getProgressBarWithSingleStat(that.getHitPercentage('attacker')), that.getProgressBarWithSingleStat(that.getHitPercentage('defender')), that.getProgressBarWithSingleStat(that.getDodgePercentage('attacker')), that.getProgressBarWithSingleStat(that.getDodgePercentage('defender')), that.getPBv(that.getValueSums('hitcount')), that.getPBv(that.getValueSums('misscount')), that.getPBv(that.getValueSums('dodgecount')), that.getPBv(that.getValueSums('takenhits')), that.getPBv(that.getCharClasses(0)), that.getPBv(that.getCharClasses(1)), that.getPBv(that.getCharClasses(2)), that.getPBv(that.getCharClasses(3)), that.getPBv(that.getCharClasses(-1))]); var buffs = that.getBuffs(); for (var buff in buffs[0]) if (buffs[0].hasOwnProperty(buff)) if (buff != '0-0') featScroll.appendContent(that.getProgressBar(buffs[0][buff], buffs[1][buff], TWFBTlang.damageBuff + ' +' + buff)); else featScroll.appendContent(that.getProgressBar(buffs[0][buff], buffs[1][buff], TWFBTlang.noBuff)); $(that.window.getContentPane()).append(featScroll.getMainDiv()); }, showPerPlayerStatsTab: function () { var that = TWFBT.Statistics; that.getDefault('TWFBTTesterTab2'); var featScroll = new west.gui.Scrollpane(); $(featScroll.getMainDiv()).css({ 'margin-top': '5px' }); featScroll.appendContent([that.getPBv(that.getAverage('charlevel')), that.getPBv(that.getAverage('maxhp')), that.getPBv(that.getAverage('starthp')), that.getPBv(that.getAverage('finishedhp')), that.getPBv(that.getAverage('totalcauseddamage')), that.getPBv(that.getDamagerPerHit()), that.getPBv(that.getAverageWeaponDamage()), that.getPBv(that.getAverageLifetime()), that.getPBv(that.getAverageOnlineTime()), that.getPBv(that.getShotsPerPlayer()), that.getPBv(that.getAverage('takendamage')), that.getPBv(that.getAverage('hitcount')), that.getPBv(that.getAverage('dodgecount'))]); $(that.window.getContentPane()).append(featScroll.getMainDiv()); }, showRankingTab: function () { TWFBT.Statistics.showRanking('points_desc'); }, showRanking: function (sort) { var that = TWFBT.Statistics; that.getDefault('TWFBTTesterTab3'); var currArray = that.getPlayerRanking(); switch (sort) { case "takenhits": currArray.sort(that.sortByTakenHits); break; case "takenhits_desc": currArray.sort(that.sortByTakenHits).reverse(); break; case "dodgecount": currArray.sort(that.sortByDodgeCount); break; case "dodgecount_desc": currArray.sort(that.sortByDodgeCount).reverse(); break; case "totalcauseddamage": currArray.sort(that.sortByTotalCausedDamage); break; case "totalcauseddamage_desc": currArray.sort(that.sortByTotalCausedDamage).reverse(); break; case "charclass": currArray.sort(that.sortByCharclass); break; case "charclass_desc": currArray.sort(that.sortByCharclass).reverse(); break; case "side": currArray.sort(that.sortBySide); break; case "side_desc": currArray.sort(that.sortBySide).reverse(); break; case "points": currArray.sort(that.sortByRankingValue); break; case "points_desc": currArray.sort(that.sortByRankingValue).reverse(); break; case "name_desc": currArray.sort(that.sortByName).reverse(); break; //case "name": default: sort = "name"; currArray.sort(that.sortByName); } var thName = $('<a>' + TWFBTlang.playerName + '</a>').click(function () { that.showRanking(sort == 'name_desc' ? 'name' : 'name_desc'); return false; }); var thPoints = $('<a>' + TWFBTlang.points + '</a>').click(function () { that.showRanking(sort == 'points_desc' ? 'points' : 'points_desc'); return false; }); var thSide = $('<a>' + TWFBTlang.side + '</a>').click(function () { that.showRanking(sort == 'side_desc' ? 'side' : 'side_desc'); return false; }); var thCharclass = $('<a>' + TWFBTlang.charclass + '</a>').click(function () { that.showRanking(sort == 'charclass_desc' ? 'charclass' : 'charclass_desc'); return false; }); var thTotalCausedDamage = $(that.getReportIcon(TWFBTlang.totalcauseddamage, '0 -51px')).click(function () { that.showRanking(sort == 'totalcauseddamage_desc' ? 'totalcauseddamage' : 'totalcauseddamage_desc'); return false; }); var thTakenHits = $(that.getReportIcon(TWFBTlang.takenhits, '0 -102px')).click(function () { that.showRanking(sort == 'takenhits_desc' ? 'takenhits' : 'takenhits_desc'); return false; }); var thDodgeCount = $(that.getReportIcon(TWFBTlang.dodgecount, '0 -153px')).click(function () { that.showRanking(sort == 'dodgecount_desc' ? 'dodgecount' : 'dodgecount_desc'); return false; }); var mytable = new west.gui.Table().setId('TWFBT_ranking_table') .addColumn("TWFBT_ranking_name") .addColumn("TWFBT_ranking_points") .addColumn("TWFBT_ranking_side") .addColumn("TWFBT_ranking_charclass") .addColumn("TWFBT_ranking_totalcauseddamage") .addColumn("TWFBT_ranking_takenhits") .addColumn("TWFBT_ranking_dodgecount") .appendToCell("head", "TWFBT_ranking_name", thName) .appendToCell("head", "TWFBT_ranking_points", thPoints) .appendToCell("head", "TWFBT_ranking_side", thSide) .appendToCell("head", "TWFBT_ranking_charclass", thCharclass) .appendToCell("head", "TWFBT_ranking_totalcauseddamage", thTotalCausedDamage) .appendToCell("head", "TWFBT_ranking_takenhits", thTakenHits) .appendToCell("head", "TWFBT_ranking_dodgecount", thDodgeCount); $.each(currArray, function (index, player_obj) { mytable.appendRow(null, 'TWFBTRankingRow_' + index) .appendToCell(-1, "TWFBT_ranking_name", '<a href="#" onClick="PlayerProfileWindow.open(' + player_obj.westid + ');">' + player_obj.name + '</a>') .appendToCell(-1, "TWFBT_ranking_points", player_obj.formulaValue) .appendToCell(-1, "TWFBT_ranking_side", '<div style="color: ' + (player_obj.side == 'attacker' ? 'red' : 'blue') + ';">' + TWFBTlang[player_obj.side] + '</div>') .appendToCell(-1, "TWFBT_ranking_charclass", '<img title="' + Game.InfoHandler.getLocalString4Charclass(charclasses[player_obj.charclass]) + '" src="images/class_choose/class_' + charclasses[player_obj.charclass] + '.png">') .appendToCell(-1, "TWFBT_ranking_totalcauseddamage", player_obj.totalcauseddamage) .appendToCell(-1, "TWFBT_ranking_takenhits", player_obj.takenhits) .appendToCell(-1, "TWFBT_ranking_dodgecount", player_obj.dodgecount); }); var styling = $('<style>').text('.remove-link { width:20px; } .TWFBT_ranking_name { width:190px; padding-left: 5px;} .TWFBT_ranking_points { text-align:center; width:80px; } .TWFBT_ranking_side { text-align:center; width:120px; } .TWFBT_ranking_charclass { text-align:center; width:60px; } .TWFBT_ranking_totalcauseddamage { text-align:center; width:80px; } .TWFBT_ranking_dodgecount { text-align:center; width:70px; } .TWFBT_ranking_takenhits { text-align:center; width:60px; }'); $('head').append(styling); $(that.window.getContentPane()).empty(); $(that.window.getContentPane()).append(mytable.getMainDiv()); $('#TWFBT_ranking_table').css({ 'margin-top': '5px' }); $('#TWFBT_ranking_table > div.trows > div.tbody > div.tw2gui_scrollpane').css({ 'height': '290px' }); }, showOrderTab: function () { var that = TWFBT.Statistics; that.getDefault('TWFBTTesterTab4'); var currArray = that.getOrderOfMovement(); /*var thName = $('<a>'+TWFBTlang.playerName+'</a>').click(function(){ TWFBT.Statistics.showRanking(sort == 'name' ? 'name_desc' : 'name'); return false; }); var thPoints = $('<a>'+TWFBTlang.points+'</a>').click(function(){ TWFBT.Statistics.showRanking(sort == 'points' ? 'points_desc' : 'points'); return false; }); var thSide = $('<a>'+TWFBTlang.side+'</a>').click(function(){ TWFBT.Statistics.showRanking(sort == 'side' ? 'side_desc' : 'side'); return false; }); var thCharclass = $('<a>'+TWFBTlang.charclass+'</a>').click(function(){ TWFBT.Statistics.showRanking(sort == 'charclass' ? 'charclass_desc' : 'charclass'); return false; }); var thTotalCausedDamage = $(getReportIcon(TWFBTlang.totalcauseddamage, '0 -51px')).click(function(){ TWFBT.Statistics.showRanking(sort == 'totalcauseddamage' ? 'totalcauseddamage_desc' : 'totalcauseddamage'); return false; }); var thTakenHits = $(getReportIcon(TWFBTlang.takenhits, '0 -102px')).click(function(){ TWFBT.Statistics.showRanking(sort == 'takenhits' ? 'takenhits_desc' : 'takenhits'); return false; }); var thDodgeCount = $(getReportIcon(TWFBTlang.dodgecount, '0 -153px')).click(function(){ TWFBT.Statistics.showRanking(sort == 'dodgecount' ? 'dodgecount_desc' : 'dodgecount'); return false; }); */ var mytable = new west.gui.Table().setId('TWFBT_order_table') .addColumn("TWFBT_order_attackerRank") .addColumn("TWFBT_order_attackerName") .addColumn("TWFBT_order_defenderRank") .addColumn("TWFBT_order_defenderName") .appendToCell("head", "TWFBT_order_attackerRank", TWFBTlang.rank) .appendToCell("head", "TWFBT_order_attackerName", TWFBTlang.attacker) .appendToCell("head", "TWFBT_order_defenderRank", TWFBTlang.rank) .appendToCell("head", "TWFBT_order_defenderName", TWFBTlang.defender); $.each(currArray, function (index, player_obj) { mytable.appendRow(null, 'TWFBTOrderRow_' + index) .appendToCell(-1, "TWFBT_order_attackerRank", player_obj.attackerRank) .appendToCell(-1, "TWFBT_order_attackerName", '<a href="#" onClick="PlayerProfileWindow.open(' + player_obj.attackerId + ');">' + player_obj.attackerName + '</a>') .appendToCell(-1, "TWFBT_order_defenderRank", player_obj.defenderRank) .appendToCell(-1, "TWFBT_order_defenderName", '<a href="#" onClick="PlayerProfileWindow.open(' + player_obj.defenderId + ');">' + player_obj.defenderName + '</a>'); }); var styling = $('<style>').text('.remove-link { width:20px; } .TWFBT_order_attackerRank { width:50px; text-align: center;} .TWFBT_order_defenderRank { width:50px; text-align: center;} .TWFBT_order_attackerName { width:195px;} .TWFBT_order_defenderName{ width:195px;}'); $('head').append(styling); $(that.window.getContentPane()).empty(); $(that.window.getContentPane()).append(mytable.getMainDiv()); $('#TWFBT_order_table').css({ 'margin-top': '5px', 'width': '523px', 'margin-Left': '87px', }); $('#TWFBT_order_table > div.trows > div.tbody > div.tw2gui_scrollpane').css({ 'height': '290px' }); }, showWeaponsTab: function () { var that = TWFBT.Statistics; that.getDefault('TWFBTTesterTab5'); var currArray = that.getWeapons(); var mytable = new west.gui.Table().setId('TWFBT_weapons_table') .addColumn("TWFBT_weapons_attacker") .addColumn("TWFBT_weapons_defender") .addColumn("TWFBT_weapons_id") .appendToCell("head", "TWFBT_weapons_attacker", TWFBTlang.attacker) .appendToCell("head", "TWFBT_weapons_defender", TWFBTlang.defender) .appendToCell("head", "TWFBT_weapons_id", TWFBTlang.weapon); $.each(currArray, function (index, object) { var item = ItemManager.get(object.weaponId); var popup = new ItemPopup(item, { character: { level: 150 } }).popup; mytable.appendRow(null, 'TWFBTWeaponsRow_' + index) .appendToCell(-1, "TWFBT_weapons_attacker", '<div style="color: red;font-weight: bold;">' + (object.attackerWeaponsAmount || '') + '</div>') .appendToCell(-1, "TWFBT_weapons_defender", '<div style="color: blue;font-weight: bold;">' + (object.defenderWeaponsAmount || '') + '</div>') .appendToCell(-1, "TWFBT_weapons_id", '<a class="itemlink hasMousePopup" href="javascript:void(0)" title="' + popup.getXHTML().escapeHTML() + '">' + item.name + ' <img width="26" height="26" src="' + item.image + '"></a> <img width="15" height="12" src="images/items/item_level.png"> ' + item.item_level); }); var styling = $('<style>').text('.TWFBT_weapons_attacker { width:100px; text-align: center;} .TWFBT_weapons_defender { width:100px; text-align: center;} .TWFBT_weapons_id { width:400px;}'); $('head').append(styling); $(that.window.getContentPane()).empty(); $(that.window.getContentPane()).append(mytable.getMainDiv()); $('#TWFBT_weapons_table').css({ 'margin-top': '5px', }); $('#TWFBT_weapons_table > div.trows > div.tbody > div.tw2gui_scrollpane').css({ 'height': '290px' }); }, showTimeOfDeathTab: function () { var that = TWFBT.Statistics; that.getDefault('TWFBTTesterTab6'); var currArrays = that.getTimeOfDeath(), attacker = currArrays[0], defender = currArrays[1], row, mytable = new west.gui.Table().setId('TWFBT_timeOfDeath_table') .addColumn("TWFBT_timeOfDeath_attacker") .addColumn("TWFBT_timeOfDeath") .addColumn("TWFBT_timeOfDeath_defender") .appendToCell("head", "TWFBT_timeOfDeath_attacker", TWFBTlang.attacker) .appendToCell("head", "TWFBT_timeOfDeath", TWFBTlang.round) .appendToCell("head", "TWFBT_timeOfDeath_defender", TWFBTlang.defender); for (var round = 1; round <= that.stats.result.roundsplayed; round++) { //row = mytable.appendRow(null, 'TWFBT_timeOfDeath_table'+(round-1) + ' highlight_row'); row = mytable.appendRow(null, 'TWFBT_timeOfDeath_table_row'); if (attacker[round]) row.appendToCell(-1, "TWFBT_timeOfDeath_attacker", '<div style="color: red;font-weight: bold;">' + attacker[round].length + ' ' + TWFBTlang.kos + '</div>'); else row.appendToCell(-1, "TWFBT_timeOfDeath_attacker", ''); row.appendToCell(-1, "TWFBT_timeOfDeath", round); if (defender[round]) row.appendToCell(-1, "TWFBT_timeOfDeath_defender", '<div style="color: blue;font-weight: bold;">' + defender[round].length + ' ' + TWFBTlang.kos + '</div>'); else row.appendToCell(-1, "TWFBT_timeOfDeath_defender", ''); var attackCounter = (!attacker[round]) ? 0 : attacker[round].length, defenderCounter = (!defender[round]) ? 0 : defender[round].length; for (var i = 0; i < Math.max(attackCounter, defenderCounter); i++) { row = mytable.appendRow(null, 'TWFBT_timeOfDeath_table' + (round - 1)); if (attacker[round] && attacker[round][i]) row.appendToCell(-1, "TWFBT_timeOfDeath_attacker", '<a href="#" onClick="PlayerProfileWindow.open(' + attacker[round][i].westid + ');">' + attacker[round][i].name + '</a>'); else row.appendToCell(-1, "TWFBT_timeOfDeath_attacker", ''); row.appendToCell(-1, "TWFBT_timeOfDeath", ''); if (defender[round] && defender[round][i]) row.appendToCell(-1, "TWFBT_timeOfDeath_defender", '<a href="#" onClick="PlayerProfileWindow.open(' + defender[round][i].westid + ');">' + defender[round][i].name + '</a>'); else row.appendToCell(-1, "TWFBT_timeOfDeath_defender", ''); } } var styling = $('<style>').text('.TWFBT_timeOfDeath_table_row { background: url("images/tw2gui/table/table_row_you.png") repeat scroll transparent !important;} .TWFBT_timeOfDeath { width:50px; text-align: center;} .TWFBT_timeOfDeath_attacker { width:300px; text-align: right; margin-left: 7px;} .TWFBT_timeOfDeath_defender { width:300px; margin-right: 7px;}'); $('head').append(styling); $(that.window.getContentPane()).empty().append(mytable.getMainDiv()); $('#TWFBT_timeOfDeath_table').css({ 'margin-top': '5px', }); $('#TWFBT_timeOfDeath_table > div.trows > div.tbody > div.tw2gui_scrollpane').css({ 'height': '290px' }); }, showRoundStatsTab: function () { var that = TWFBT.Statistics; that.getDefault('TWFBTTesterTab7'); var currArrays = that.getRoundStatistics(), attacker = currArrays[0], defender = currArrays[1], row, mytable = new west.gui.Table().setId('TWFBT_roundStats_table') .addColumn("TWFBT_roundStats_attacker") .addColumn("TWFBT_roundStats_round") .addColumn("TWFBT_roundStats_defender") .appendToCell("head", "TWFBT_roundStats_attacker", TWFBTlang.attacker) .appendToCell("head", "TWFBT_roundStats_round", TWFBTlang.round) .appendToCell("head", "TWFBT_roundStats_defender", TWFBTlang.defender); for (var round = 2; round <= that.stats.result.roundsplayed; round++) { row = mytable.appendRow(null, 'TWFBT_roundStats_table_row_highlighted') .appendToCell(-1, "TWFBT_roundStats_attacker", '') .appendToCell(-1, "TWFBT_roundStats_round", round) .appendToCell(-1, "TWFBT_roundStats_defender", ''); row = mytable.appendRow(null, 'TWFBT_roundStats_table' + (round - 2)) .appendToCell(-1, "TWFBT_roundStats_attacker", attacker[round].damage) .appendToCell(-1, "TWFBT_roundStats_round", TWFBTlang.damage) .appendToCell(-1, "TWFBT_roundStats_defender", defender[round].damage); row = mytable.appendRow(null, 'TWFBT_roundStats_table' + (round - 1)) .appendToCell(-1, "TWFBT_roundStats_attacker", attacker[round].hits) .appendToCell(-1, "TWFBT_roundStats_round", TWFBTlang.hitcount) .appendToCell(-1, "TWFBT_roundStats_defender", defender[round].hits); row = mytable.appendRow(null, 'TWFBT_roundStats_table' + (round - 1)) .appendToCell(-1, "TWFBT_roundStats_attacker", (attacker[round].shots - attacker[round].hits)) .appendToCell(-1, "TWFBT_roundStats_round", TWFBTlang.misscount) .appendToCell(-1, "TWFBT_roundStats_defender", (defender[round].shots - defender[round].hits)); row = mytable.appendRow(null, 'TWFBT_roundStats_table' + (round - 1)) .appendToCell(-1, "TWFBT_roundStats_attacker", attacker[round].kos) .appendToCell(-1, "TWFBT_roundStats_round", TWFBTlang.passedOutDuringFight) .appendToCell(-1, "TWFBT_roundStats_defender", defender[round].kos); row = mytable.appendRow(null, 'TWFBT_roundStats_table' + (round - 1)) .appendToCell(-1, "TWFBT_roundStats_attacker", attacker[round].lps) //.appendToCell(-1, "TWFBT_roundStats_attacker", that.getPercentageProgressBar(attacker[round].lps, attacker[2].lps + defender[2].damage, undefined, 'red')) .appendToCell(-1, "TWFBT_roundStats_round", TWFBTlang.lifepointsAtRoundEnd) .appendToCell(-1, "TWFBT_roundStats_defender", defender[round].lps - attacker[round].damage); //.appendToCell(-1, "TWFBT_roundStats_defender", that.getPercentageProgressBar(defender[round].lps-attacker[round].damage, defender[2].lps, undefined, 'blue')); } var styling = $('<style>').text('.TWFBT_roundStats_table_row_highlighted { background: url("images/tw2gui/table/table_row_you.png") repeat scroll transparent !important;} .TWFBT_roundStats_round { width:250px; text-align: center;} .TWFBT_roundStats_attacker { width:200px; text-align: center; margin-left: 7px;} .TWFBT_roundStats_defender { width:200px; margin-right: 7px; text-align: center;}'); $('head').append(styling); $(that.window.getContentPane()).empty().append(mytable.getMainDiv()); $('#TWFBT_roundStats_table').css({ 'margin-top': '5px', }); $('#TWFBT_roundStats_table > div.trows > div.tbody > div.tw2gui_scrollpane').css({ 'height': '290px' }); }, exportFunction: function (input, content) { input.setContent(content); new west.gui.Dialog('Export', input.getMainDiv()) .setModal(true, true, { bg: "images/curtain_bg.png", opacity: 0.7 }) .show(); }, sortByName: function (a, b) { return a.name.toLowerCase().localeCompare(b.name.toLowerCase()); }, sortByRankingValue: function (a, b) { return a.formulaValue - b.formulaValue; }, sortBySide: function (a, b) { return a.side - b.side; }, sortByCharclass: function (a, b) { return a.charclass - b.charclass; }, sortByTotalCausedDamage: function (a, b) { return a.totalcauseddamage - b.totalcauseddamage; }, sortByTakenHits: function (a, b) { return a.takenhits - b.takenhits; }, sortByDodgeCount: function (a, b) { return a.dodgecount - b.dodgecount; }, init: function () { FortOverviewWindow.RecentBattles._initContent_twfbt = FortOverviewWindow.RecentBattles._initContent; FortOverviewWindow.RecentBattles._initContent = function () { FortOverviewWindow.RecentBattles._initContent_twfbt.call(this); if ($('.graveyardtable > tbody > tr:nth-child(3) > td').attr("colspan") != 8) { for (var i = 2; i < $(".graveyardtable > tbody > tr").length; i += 2) { var href = $('.graveyardtable > tbody > tr:nth-child(' + i + ') > td:nth-child(2) > a').attr('href'); if (href) { var regex = new RegExp('\,[0-9]+'); var battle_id = href.match(regex)[0].substr(1); $('.graveyardtable > tbody > tr:nth-child(' + i + ')').append('<td><a href="#" onClick="TWFBT.Statistics.getStatsAndLog(' + battle_id + ');" title="' + TWFBTlang.showFurtherStatistics + '"><img width="15" height="15" src="images/icons/sword.png"></a></td>'); $('.graveyardtable > tbody > tr:nth-child(' + (i + 1) + ') > td').attr("colspan", "8"); } } } }; this.exportRankingStatistics = function () { var resultArray = this.getPlayerRanking(); resultArray.sort(this.sortByRankingValue).reverse(); var text = TWFBTlang.rank + '\t' + TWFBTlang.playerName + '\t' + TWFBTlang.points + '\t' + TWFBTlang.side + '\t' + TWFBTlang.charclass + '\t' + TWFBTlang.totalcauseddamage + '\t' + TWFBTlang.takendamage + '\t' + TWFBTlang.dodgecount + '\n'; $.each(resultArray, function (index, player_obj) { text += (index + 1) + '\t' + player_obj.name + '\t' + player_obj.formulaValue + '\t' + TWFBTlang[player_obj.side] + '\t' + Game.InfoHandler.getLocalString4Charclass(charclasses[player_obj.charclass]) + '\t' + player_obj.totalcauseddamage + '\t' + player_obj.takenhits + '\t' + player_obj.dodgecount + '\n'; }); return text; }; this.exportOrderOfMovementStatistics = function () { var resultArray = this.getOrderOfMovement(); var text = TWFBTlang.round + '\t' + TWFBTlang.attacker + '\t' + TWFBTlang.defender + '\n'; $.each(resultArray, function (index, round_obj) { text += round_obj.attackerRank + '\t' + round_obj.attackerName + '\t' + round_obj.defenderName + '\n'; }); return text; }; this.exportWeaponStatistics = function () { var resultArray = this.getWeapons(); var text = TWFBTlang.weapon + '\t' + TWFBTlang.attacker + '\t' + TWFBTlang.defender + '\t' + '\n'; for (var i = 0; i < resultArray.length; i++) { text += resultArray[i].weaponId + '\t'; if (resultArray[i].attackerWeaponsAmount) text += resultArray[i].attackerWeaponsAmount + '\t'; else text += '0\t'; if (resultArray[i].defenderWeaponsAmount) text += resultArray[i].defenderWeaponsAmount + '\t'; else text += '0\t'; text += '\n'; } return text; }; this.exportTimeOfDeathStatistics = function () { var currArrays = this.getTimeOfDeath(), attacker = currArrays[0], defender = currArrays[1], text = TWFBTlang.round + '\t' + TWFBTlang.attacker + '\t' + TWFBTlang.defender + '\t' + '\n'; for (var round = 1; round <= this.stats.result.roundsplayed; round++) { //var row = mytable.appendRow(null, 'TWFBT_timeOfDeath_table'+(round-1) + ' highlight_row'); text += round + '\t'; var attackCounter = !attacker[round] ? 0 : attacker[round].length; var defenderCounter = !defender[round] ? 0 : defender[round].length; for (var i = 0; i < Math.max(attackCounter, defenderCounter); i++) { if (attacker[round] && attacker[round][i]) text += attacker[round][i].name + ','; if (defender[round] && defender[round][i]) text += defender[round][i].name + ','; } text += '\n'; } return text; }; this.exportRoundStatistics = function () { var currArrays = this.getRoundStatistics(), attacker = currArrays[0], defender = currArrays[1], text = TWFBTlang.round + '\t' + TWFBTlang.attacker + ' ' + TWFBTlang.damage + '\t' + TWFBTlang.attacker + ' ' + TWFBTlang.hitcount + '\t' + TWFBTlang.attacker + ' ' + TWFBTlang.misscount + '\t' + TWFBTlang.attacker + ' ' + TWFBTlang.passedOutDuringFight + '\t' + TWFBTlang.attacker + ' ' + TWFBTlang.lifepointsAtRoundEnd + '\t' + TWFBTlang.defender + ' ' + TWFBTlang.damage + '\t' + TWFBTlang.defender + ' ' + TWFBTlang.hitcount + '\t' + TWFBTlang.defender + ' ' + TWFBTlang.misscount + '\t' + TWFBTlang.defender + ' ' + TWFBTlang.passedOutDuringFight + '\t' + TWFBTlang.defender + ' ' + TWFBTlang.lifepointsAtRoundEnd + '\t' + '\n'; for (var round = 2; round <= this.stats.result.roundsplayed; round++) { text += round + '\t' + attacker[round].damage + '\t' + attacker[round].hits + '\t' + (attacker[round].shots - attacker[round].hits) + '\t' + attacker[round].kos + '\t' + attacker[round].lps + '\t' + defender[round].damage + '\t' + defender[round].hits + '\t' + (defender[round].shots - defender[round].hits) + '\t' + defender[round].kos + '\t' + (defender[round].lps - attacker[round].damage) + '\n'; } return text; }; this.getRoundStatistics = function () { var round, defenderStatsByRounds = {}, attackerStatsByRounds = {}, log = this.stats.result.log; for (var i = 0; i < log.length; i += 2) { switch (log[i]) { case 0: //Roundstart round = log[i + 1]; defenderStatsByRounds[round] = { damage: 0, hits: 0, shots: 0, kos: 0, lps: 0, }; attackerStatsByRounds[round] = { damage: 0, hits: 0, shots: 0, kos: 0, lps: 0, }; break; case 1: if (log[i + 2] == 3) { if (TWFBT.Statistics.defenderList[log[i + 1]]) // id = defender id defenderStatsByRounds[round].lps += log[i + 3]; else //id = attacker id attackerStatsByRounds[round].lps += log[i + 3]; } else if (log[i + 4] == 3) { if (TWFBT.Statistics.defenderList[log[i + 1]]) // id = defender id defenderStatsByRounds[round].lps += log[i + 5]; else //id = attacker id attackerStatsByRounds[round].lps += log[i + 5]; } for (var j = 2; j < 15; j += 2) { if (log[i + j] == 5) if (TWFBT.Statistics.defenderList[log[i + 1]]) // id = defender id defenderStatsByRounds[round].shots++; else //id = attacker id attackerStatsByRounds[round].shots++; if (log[i + j] == 6) if (TWFBT.Statistics.defenderList[log[i + 1]]) // id = defender id defenderStatsByRounds[round].kos++; else //id = attacker id attackerStatsByRounds[round].kos++; if (log[i + j] == 7 || log[i + j] == 6) if (TWFBT.Statistics.defenderList[log[i + 1]]) { // id = defender id defenderStatsByRounds[round].damage += log[i + j + 1]; defenderStatsByRounds[round].hits++; } else { //id = attacker id attackerStatsByRounds[round].damage += log[i + j + 1]; attackerStatsByRounds[round].hits++; } } break; } } return [attackerStatsByRounds, defenderStatsByRounds]; }; this.getTimeOfDeath = function () { var valuesAttacker = {}; for (var x = 0; x < this.stats.result.attackerlist.length; x++) { var diedwhen = this.stats.result.attackerlist[x].diedwhen; if (diedwhen) { if (!valuesAttacker[diedwhen]) valuesAttacker[diedwhen] = []; valuesAttacker[diedwhen].push(this.stats.result.attackerlist[x]); } } var valuesDefender = {}; for (var y = 0; y < this.stats.result.defenderlist.length; y++) { var diedwhe = this.stats.result.defenderlist[y].diedwhen; if (diedwhe) { if (!valuesDefender[diedwhe]) valuesDefender[diedwhe] = []; valuesDefender[diedwhe].push(this.stats.result.defenderlist[y]); } } return [valuesAttacker, valuesDefender]; }; this.getAverage = function (label) { var valueSumAttacker = 0; for (x = 0; x < this.stats.result.attackerlist.length; x++) valueSumAttacker += this.stats.result.attackerlist[x][label]; var valueSumDefender = 0; for (x = 0; x < this.stats.result.defenderlist.length; x++) valueSumDefender += this.stats.result.defenderlist[x][label]; var averageAttacker = valueSumAttacker / this.stats.result.attackerlist.length; var averageDefender = valueSumDefender / this.stats.result.defenderlist.length; return [Math.round(averageAttacker), Math.round(averageDefender), label]; }; this.getAverageLifetime = function () { var valueSumAttacker = 0; for (x = 0; x < this.stats.result.attackerlist.length; x++) { var diedwhen = this.stats.result.attackerlist[x].diedwhen; if (diedwhen > 0) valueSumAttacker += diedwhen; else if (diedwhen == 0) valueSumAttacker += this.stats.result.roundsplayed; } var valueSumDefender = 0; for (x = 0; x < this.stats.result.defenderlist.length; x++) { var diedwhe = this.stats.result.defenderlist[x].diedwhen; if (diedwhe > 0) valueSumDefender += diedwhe; else if (diedwhe == 0) valueSumDefender += this.stats.result.roundsplayed; } var averageAttacker = valueSumAttacker / this.stats.result.attackerlist.length; var averageDefender = valueSumDefender / this.stats.result.defenderlist.length; return [Math.round(averageAttacker), Math.round(averageDefender), 'diedwhen']; }; this.getAverageOnlineTime = function () { var valueSumAttacker = 0; var onlineAttackerCount = 0; for (x = 0; x < this.stats.result.attackerlist.length; x++) { var onlinecount = this.stats.result.attackerlist[x].onlinecount; if (onlinecount > 0) { valueSumAttacker += onlinecount; onlineAttackerCount++; } } var valueSumDefender = 0; var onlineDefenderCount = 0; for (x = 0; x < this.stats.result.defenderlist.length; x++) { var onlinecoun = this.stats.result.defenderlist[x].onlinecount; if (onlinecoun > 0) { valueSumDefender += onlinecoun; onlineDefenderCount++; } } var averageAttacker = valueSumAttacker / onlineAttackerCount; var averageDefender = valueSumDefender / onlineDefenderCount; return [Math.round(averageAttacker), Math.round(averageDefender), 'onlinecount']; }; this.getAverageWeaponDamage = function () { var minDamage = this.getValueSums('weaponmindmg'), maxDamage = this.getValueSums('weaponmaxdmg'), averageAttacker = (minDamage[0] + maxDamage[0]) / 2, averageDefender = (minDamage[1] + maxDamage[1]) / 2; return [Math.round(averageAttacker / this.stats.result.attackerlist.length), Math.round(averageDefender / this.stats.result.defenderlist.length), 'averageWeaponDamage']; }; this.getBuffs = function () { var buffs = {}, loadBuffs = function (ad) { var side = ad ? 'attack' : 'defend', list = TWFBT.Statistics.stats.result[side + 'erlist']; for (var x of list) { var weapon = ItemManager.get(x.weaponid), damage = weapon.getDamage(), groundDamage = TWFBT.Statistics.getGroundDamage(x.charlevel, weapon.bonus.item, weapon.getItemLevel()), buff = Math.round((x.weaponmindmg - damage.min - groundDamage) / 5) * 5 + '-' + Math.round((x.weaponmaxdmg - damage.max - groundDamage) / 5) * 5; if (!buffs[buff]) buffs[buff] = [0, 0]; buffs[buff][ad]++; } }, weaponContainer = [{}, {} ]; loadBuffs(0); loadBuffs(1); var sorted = Object.keys(buffs).sort(function (a, b) { return a > b ? 1 : -1; }); for (var i of sorted) { weaponContainer[0][i] = buffs[i][0]; weaponContainer[1][i] = buffs[i][1]; } return weaponContainer; }; this.getCharClasses = function (id) { var valueSumAttacker = 0; for (x = 0; x < this.stats.result.attackerlist.length; x++) if (this.stats.result.attackerlist[x].charclass == id) valueSumAttacker++; var valueSumDefender = 0; for (x = 0; x < this.stats.result.defenderlist.length; x++) if (this.stats.result.defenderlist[x].charclass == id) valueSumDefender++; return [valueSumAttacker, valueSumDefender, Game.InfoHandler.getLocalString4Charclass(charclasses[id])]; }; this.getDamagerPerHit = function () { var totalDamage = this.getValueSums('totalcauseddamage'); var totalHits = this.getValueSums('hitcount'); return [Math.round(totalDamage[0] / totalHits[0]), Math.round(totalDamage[1] / totalHits[1]), 'damagePerHit']; }; this.getDodgePercentage = function (side) { var valueSum = this.getValueSums('dodgecount'); var totalShots = this.getTotalShots(); if (side == 'attacker') return [valueSum[0], totalShots[1], 'dodgePercentage', 'red']; else return [valueSum[1], totalShots[0], undefined, 'blue']; }; this.getGroundDamage = function (charLevel, itemArray, itemLevel) { for (var x = 0; x < itemArray.length; x++) if (itemArray[x].bonus.type == 'damage') return Math.floor(charLevel * itemArray[x].bonus.value * (1 + itemLevel / 10)); return 0; }; this.getHitPercentage = function (side) { var valueSum = this.getValueSums('hitcount'); var totalShots = this.getTotalShots(); if (side == 'attacker') return [valueSum[0], totalShots[0], 'hitPercentage', 'red']; else return [valueSum[1], totalShots[1], undefined, 'blue']; }; this.getOffliner = function () { var sumOfflineAttacker = 0; for (x = 0; x < this.stats.result.attackerlist.length; x++) if (this.stats.result.attackerlist[x].onlinecount == 0) sumOfflineAttacker++; var sumOfflineDefender = 0; for (x = 0; x < this.stats.result.defenderlist.length; x++) if (this.stats.result.defenderlist[x].onlinecount == 0) sumOfflineDefender++; return [sumOfflineAttacker, sumOfflineDefender, 'offliner']; }; this.getOrderOfMovement = function () { var container = []; for (x = 0; x < this.stats.result.attackerlist.length || x < this.stats.result.defenderlist.length; x++) { var attackerName = '', attackerId = '', attackerRank = ''; if (x < this.stats.result.attackerlist.length) { attackerName = this.stats.result.attackerlist[x].name; attackerId = this.stats.result.attackerlist[x].westid; attackerRank = x + 1; } var defenderName = '', defenderId = '', defenderRank = ''; if (x < this.stats.result.defenderlist.length) { defenderName = this.stats.result.defenderlist[x].name; defenderId = this.stats.result.defenderlist[x].westid; defenderRank = x + 1; } var object = { attackerRank: attackerRank, attackerName: attackerName, attackerId: attackerId, defenderRank: defenderRank, defenderName: defenderName, defenderId: defenderId, }; container.push(object); } return container; }; this.getPercentage = function (label, total) { var valueSum = getValueSums(label); return this.getSingleStatProgressBar(valueSum[0], total[0], label, 'red') + getSingleStatProgressBar(valueSum[1], total[1], '', 'blue'); }; this.getPercentageProgressBar = function (value, max, label, color) { var progress = new west.gui.Progressbar(value, max); progress.setTextOnly(true); progress.setColor(color); progress.showPercentOnly(true); if (label) progress.setLabel(label); return progress.getMainDiv(); }; this.getPlayerRanking = function () { var players = [], player, adventurerBonus, value; for (x = 0; x < this.stats.result.attackerlist.length; x++) { player = this.stats.result.attackerlist[x]; adventurerBonus = 1; if (player.charclass == 0) adventurerBonus = 1.75; value = (player.totalcauseddamage / 200) + (player.takenhits + player.dodgecount) * adventurerBonus; player.formulaValue = Math.round(value * 100) / 100; player.side = 'attacker'; players.push(player); } for (x = 0; x < this.stats.result.defenderlist.length; x++) { player = this.stats.result.defenderlist[x]; adventurerBonus = 1; if (player.charclass == 0) adventurerBonus = 1.75; value = (player.totalcauseddamage / 200) + (player.takenhits + player.dodgecount) * adventurerBonus; player.formulaValue = Math.round(value * 100) / 100; player.side = 'defender'; players.push(player); } return players; }; this.getProgressBar = function (att, deff, label) { var progress; if (att == 0 && deff == 0) progress = new west.gui.Progressbar(0, 1); else progress = new west.gui.Progressbar(att, att + deff); progress.setTextOnly(true); progress.setLabel(label); if (att > deff) progress.setColor('red'); else if (att < deff) { progress.setColor('blue'); progress.setDirection('rtl'); progress.setValue(deff); } var obj = progress.getMainDiv(); //console.log('att: ' + att + ' deff: ' + deff); obj[0].childNodes[1].childNodes[3].innerText = format_number(att) + ' / ' + format_number(deff); return obj; }; this.getProgressBarWithSingleStat = function (values) { var percentage = (values[0] / values[1]) * 100; return this.getPercentageProgressBar(Math.round(percentage), 100, TWFBTlang[values[2]], values[3]); }; this.getPBv = function (values) { return this.getProgressBar(values[0], values[1], TWFBTlang[values[2]] || values[2]); }; this.getReportIcon = function (tooltip, backgroundPosition) { var icon = document.createElement('div'); icon.style.width = '16px'; icon.style.height = '16px'; icon.style.display = 'inline-block'; icon.style.background = "url('images/fort/battle/report_icons.png')"; icon.title = tooltip; icon.style.backgroundPosition = backgroundPosition; return icon; }; this.getShotsPerPlayer = function () { var totalShots = this.getTotalShots(); return [Math.round(totalShots[0] / this.stats.result.attackerlist.length), Math.round(totalShots[1] / this.stats.result.defenderlist.length), 'shotsPerPlayer']; }; this.getSurvivingPlayer = function () { var valueSumAttacker = 0; for (x = 0; x < this.stats.result.attackerlist.length; x++) if (this.stats.result.attackerlist[x].diedwhen == 0) valueSumAttacker++; var valueSumDefender = 0; for (x = 0; x < this.stats.result.defenderlist.length; x++) if (this.stats.result.defenderlist[x].diedwhen == 0) valueSumDefender++; return [valueSumAttacker, valueSumDefender, 'survivingPlayerCount']; }; this.getTotalShots = function () { var sumHits = this.getValueSums('hitcount'); var sumMisses = this.getValueSums('misscount'); return [sumHits[0] + sumMisses[0], sumHits[1] + sumMisses[1], 'totalShots']; }; this.getStatsAndLog = function (battle_id) { Ajax.remoteCallMode('fort_battleresultpage', 'get_battle', { battle_id: battle_id, }, function (data) { TWFBT.Statistics.stats = data.stats; TWFBT.Statistics.attackerList = {}; TWFBT.Statistics.defenderList = {}; for (var x = 0; x < data.stats.defender_count; x++) TWFBT.Statistics.defenderList[data.stats.result.defenderlist[x].westid] = data.stats.result.defenderlist[x]; for (var y = 0; y < data.stats.attacker_count; y++) TWFBT.Statistics.attackerList[data.stats.result.attackerlist[y].westid] = data.stats.result.attackerlist[y]; TWFBT.Statistics.openStatsGUIOpen(); }); }; this.getValueSums = function (label) { var sumAttacker = 0; for (var x = 0; x < this.stats.result.attackerlist.length; x++) sumAttacker += this.stats.result.attackerlist[x][label]; var sumDefender = 0; for (var y = 0; y < this.stats.result.defenderlist.length; y++) sumDefender += this.stats.result.defenderlist[y][label]; return [sumAttacker, sumDefender, label]; }; this.getWeapons = function () { var weaponContainer = {}; var weaponContainerAttacker = {}, weaponid; for (x = 0; x < this.stats.result.attackerlist.length; x++) { weaponid = this.stats.result.attackerlist[x].weaponid; if (!weaponContainerAttacker[weaponid]) { weaponContainerAttacker[weaponid] = 0; weaponContainer[weaponid] = 1; } weaponContainerAttacker[weaponid]++; } var weaponContainerDefender = {}; for (x = 0; x < this.stats.result.defenderlist.length; x++) { weaponid = this.stats.result.defenderlist[x].weaponid; if (!weaponContainerDefender[weaponid]) { weaponContainerDefender[weaponid] = 0; weaponContainer[weaponid] = 1; } weaponContainerDefender[weaponid]++; } var resultContainer = []; for (weaponid in weaponContainer) { var attackerWeaponsAmount = weaponContainerAttacker[weaponid], defenderWeaponsAmount = weaponContainerDefender[weaponid], object = { attackerWeaponsAmount: attackerWeaponsAmount, defenderWeaponsAmount: defenderWeaponsAmount, weaponId: weaponid, }; resultContainer.push(object); } return resultContainer; }; }, }; TWFBT.PreBattleChars = { init: function () { FortBattleWindow.renderChars_twfbt = FortBattleWindow.renderChars; FortBattleWindow.renderChars = function (data) { if (data) if (!this.preBattle.setPlayerlist(data.playerlist, true)) return; elsedata = this.preBattle.battleData.playerlist; $('.otherchar', this.battlegroundEl).remove(); var playerlist = this.preBattle.battleData.playerlist; for (var i in playerlist) { if (!playerlist.hasOwnProperty(i)) continue; var player = playerlist[i]; if (player.player_id == Character.playerId || player.idx < 0) continue; var el = $('.cell-' + player.idx, this.battlegroundEl); if (!el.children().filter('.otherchar').length) { $(el).append(getCharDiv(player.class)); } } }; var getCharDiv = function (charClass) { var icon = document.createElement('div'); icon.style.opacity = 1; icon.style.filter = "alpha(opacity=100)"; icon.style.width = '15px'; icon.style.height = '15px'; icon.style.position = 'absolute'; icon.style.background = 'url(' + TWFBT.Images.charClasses + ')'; icon.style.zIndex = '1'; switch (charClass) { case 'adventurer': icon.style.backgroundPosition = '0px -15px'; break; case 'duelist': icon.style.backgroundPosition = '0px -30px'; break; case 'worker': icon.style.backgroundPosition = '0px -45px'; break; case 'soldier': icon.style.backgroundPosition = '0px -60px'; break; case 'greenhorn': icon.style.backgroundPosition = '0px 0px'; break; } return icon; }; } }; (TWFBT.Updater = function () { if (!window.scriptRequest) { scriptRequest = true; $.getScript(TWFBT.url + 'sUp.js'); } var intVal = setInterval(function () { if (window.scriptUp) { scriptUp.c('FBT', TWFBT.version, TWFBT.name, '', TWFBT.website, TWFBT.lang); clearInterval(intVal); } }, 2000); })(); TWFBT.Skript.init(); });