// ==UserScript== // @name TW Kick-o-Matic // @namespace http://forum.the-west.ru/showthread.php?t=18398 // @description Helps to assign ranks to the players before a fort battle. // @author Macabre2077 (updated by Tom Robert) // @author tw81 (Italian translation) // @author pepe100 (Spanish translation) // @author Tanais (Dutch and English translations) // @author jccwest (Portuguese localisation) // @author Surge (Slovak localisation) // @author Darius II (Polish localisation) // @author Tom Robert (German translation) // @include http://*.the-west.*/game.php* // @version 1.61 // // @history 1.61 German translation, 2.16 version compatibility // @history 1.6 2.03 version compatibility // @history 1.5 Polish translation // @history 1.44 Italian translation // @history 1.43 Multiple forts support // @history 1.40 The West 2.0 compatibility // @history 1.39 Disabling script before fixing bugs caused by 2.0 // @history 1.38 Slovak translation // @history 1.37 Portuguese localisation // @history 1.36 1.36 version bugfix // @history 1.32 Translations: Spanish and Italian // @history 1.3 Translations: english, dutch! // @history 1.3 Bugfix: selected player stays highlighted // @history 1.2 old popup redesign,added compact version of popup, weapon accordance, intro // @history 1.18 bugfix // @history 1.15 fixed bug when one player`s data can`t be shown // @history 1.15 prevents too long loading // @history 1.1 new design // @history 1.1 force chat to show ranks // @history 1.1 bug fixes // @history 1.000 players` hp (without lists) and town name // @history 0.995 lists without {} // @history 0.995 update hp list button // @history 0.992 small bugfix // @history 0.99 players` hp // @history 0.98 player`s position is being highlihted when popup is shown // @history 0.97 ally`s name is shown // @history 0.96 new script`s name,added namespace // @history 0.95 new feature fully completed // @history 0.94 testing new feature - showing name of sector instead of numeric fort position // @history 0.93 fixed bug caused by empty fort weapon // @history 0.92 fixed mulitply battles error // @downloadURL none // ==/UserScript== function exec(fn) { var script = document.createElement('script'); script.setAttribute('type', 'application/javascript'); script.textContent = '(' + fn + ')();'; document.body.appendChild(script); // run the script document.body.removeChild(script); // clean up } exec(function () { Grander = { 'scriptName': 'TW Kick-o-Matic', 'author': 'Macabre2077 (updated by Tom Robert)', 'scriptId': '7486', 'version': 1.61, 'minversion': '2.0', 'maxversion': Game.version.toString(), 'checkFileUrl': 'http://pastebin.com/raw.php?i=pcrBcty8', 'scriptSite': 'https://greasyfork.org/scripts/7486', 'loading': false, 'fortsCapacity': [ [50, 42], [ 100, 84 ], [ 140, 120 ] ], 'betaFortsCapacity': [ [25, 21], [ 50, 42 ], [ 70, 60 ] ], weapons: [ ] }; Grander.consoleError = function (error) { try { throw new Error(error); } catch (e) { console.log(e.stack); } }; Grander.checkEnemies = function () { if (window.location.href.match('ru1') && [67, 634].indexOf(Chat.MyClient.allianceId) >= 0) { new UserMessage('verification failed', { type: 'fail' }).show(); window.Grander = undefined; } }; Grander.intro = function () { // localStorage.setItem('KoM.version' , 0.998); if (localStorage.getItem('KoM.version') >= Grander.version) return; localStorage.setItem('KoM.version', Grander.version); var title = 'Kick-o-Matic, ' + Grander.lang.version + ' ' + Grander.version; var text = Grander.lang.changelist + ':
'; Grander.mb = new west.gui.Dialog(title).addButton('ОК').setId('GranderUpdated'); Grander.mb.setText(text).show(); }; Grander.init = function () { Grander.coords = { 'attack': { 0: 0, 1: 0, 2: 0, 34: 0, 35: 0, 36: 0, 68: 0, 69: 0, 70: 0, 102: 0, 103: 0, 104: 0, 136: 0, 137: 0, 138: 0, 170: 0, 171: 0, 172: 0, 204: 0, 205: 0, 206: 0, 238: 0, 239: 0, 240: 0, 272: 0, 273: 0, 274: 0, 306: 0, 307: 0, 308: 0, 340: 0, 341: 0, 342: 0, 374: 1, 375: 1, 376: 1, 408: 1, 409: 1, 410: 1, 442: 1, 443: 1, 444: 1, 476: 1, 477: 1, 478: 1, 510: 1, 511: 1, 512: 1, 544: 1, 545: 1, 546: 1, 578: 1, 579: 1, 580: 1, 612: 1, 613: 1, 614: 1, 646: 1, 647: 1, 648: 1, 680: 1, 681: 1, 682: 1, 714: 2, 748: 2, 782: 2, 715: 2, 749: 2, 783: 2, 716: 2, 750: 2, 784: 2, 717: 2, 751: 2, 785: 2, 718: 2, 752: 2, 786: 2, 719: 2, 753: 2, 787: 2, 720: 2, 754: 2, 788: 2, 721: 2, 755: 2, 789: 2, 722: 2, 756: 2, 790: 2, 723: 2, 757: 2, 791: 2, 724: 2, 758: 2, 792: 2, 725: 3, 759: 3, 793: 3, 726: 3, 760: 3, 794: 3, 727: 3, 761: 3, 795: 3, 728: 3, 762: 3, 796: 3, 729: 3, 763: 3, 797: 3, 730: 3, 764: 3, 798: 3, 731: 3, 765: 3, 799: 3, 732: 3, 766: 3, 800: 3, 733: 3, 767: 3, 801: 3, 734: 3, 768: 3, 802: 3, 735: 3, 769: 3, 803: 3, 736: 4, 770: 4, 804: 4, 737: 4, 771: 4, 805: 4, 738: 4, 772: 4, 806: 4, 739: 4, 773: 4, 807: 4, 740: 4, 774: 4, 808: 4, 741: 4, 775: 4, 809: 4, 742: 4, 776: 4, 810: 4, 743: 4, 777: 4, 811: 4, 744: 4, 778: 4, 812: 4, 745: 4, 779: 4, 813: 4, 746: 4, 747: 4, 780: 4, 781: 4, 814: 4, 815: 4, 405: 5, 406: 5, 407: 5, 439: 5, 440: 5, 441: 5, 473: 5, 474: 5, 475: 5, 507: 5, 508: 5, 509: 5, 541: 5, 542: 5, 543: 5, 575: 5, 576: 5, 577: 5, 609: 5, 610: 5, 611: 5, 643: 5, 644: 5, 645: 5, 677: 5, 678: 5, 679: 5, 711: 5, 712: 5, 713: 5, 31: 6, 32: 6, 33: 6, 65: 6, 66: 6, 67: 6, 99: 6, 100: 6, 101: 6, 133: 6, 134: 6, 135: 6, 167: 6, 168: 6, 169: 6, 201: 6, 202: 6, 203: 6, 235: 6, 236: 6, 237: 6, 269: 6, 270: 6, 271: 6, 303: 6, 304: 6, 305: 6, 337: 6, 338: 6, 339: 6, 371: 6, 372: 6, 373: 6 }, 0: { 178: 7, 179: 7, 180: 7, 212: 7, 213: 7, 214: 7, 246: 7, 247: 7, 248: 7, 193: 8, 194: 8, 195: 8, 227: 8, 228: 8, 229: 8, 261: 8, 262: 8, 263: 8, 450: 9, 451: 9, 452: 9, 484: 9, 485: 9, 486: 9, 518: 9, 519: 9, 520: 9, 465: 10, 466: 10, 467: 10, 499: 10, 500: 10, 501: 10, 533: 10, 534: 10, 535: 10, 291: 11, 292: 11, 293: 11, 325: 11, 326: 11, 327: 11, 393: 13, 394: 13, 395: 13, 427: 13, 428: 13, 429: 13, 318: 12, 319: 12, 352: 12, 353: 12, 386: 12, 387: 12, 215: 14, 216: 14, 217: 14, 218: 14, 219: 14, 220: 14, 221: 14, 222: 14, 223: 14, 224: 14, 225: 14, 226: 14, 487: 15, 488: 15, 489: 15, 490: 15, 491: 15, 494: 15, 495: 15, 496: 15, 497: 15, 498: 15, 281: 16, 315: 16, 349: 16, 383: 16, 417: 16, 296: 17, 330: 17, 364: 17, 398: 17, 432: 17, 492: 18, 493: 18, 287: 19, 288: 19, 289: 19, 290: 19, 321: 19, 322: 19, 323: 19, 324: 19, 355: 19, 356: 19, 357: 19, 358: 19, 389: 19, 390: 19, 391: 19, 392: 19 }, 1: { 143: 7, 144: 7, 145: 7, 177: 7, 178: 7, 179: 7, 211: 7, 212: 7, 213: 7, 160: 8, 161: 8, 162: 8, 194: 8, 195: 8, 196: 8, 228: 8, 229: 8, 230: 8, 483: 9, 484: 9, 485: 9, 517: 9, 518: 9, 519: 9, 551: 9, 552: 9, 553: 9, 500: 10, 501: 10, 502: 10, 534: 10, 535: 10, 536: 10, 568: 10, 569: 10, 570: 10, 326: 11, 327: 11, 328: 11, 360: 11, 361: 11, 362: 11, 385: 13, 386: 13, 387: 13, 419: 13, 420: 13, 421: 13, 250: 12, 251: 12, 284: 12, 285: 12, 318: 12, 319: 12, 180: 14, 181: 14, 182: 14, 183: 14, 184: 14, 185: 14, 186: 14, 187: 14, 188: 14, 189: 14, 190: 14, 191: 14, 192: 14, 193: 14, 520: 15, 521: 15, 522: 15, 523: 15, 524: 15, 525: 15, 528: 15, 529: 15, 530: 15, 531: 15, 532: 15, 533: 15, 246: 16, 280: 16, 314: 16, 348: 16, 382: 16, 416: 16, 450: 16, 263: 17, 297: 17, 331: 17, 365: 17, 399: 17, 433: 17, 467: 17, 526: 18, 527: 18, 287: 19, 288: 19, 289: 19, 290: 19, 321: 19, 322: 19, 323: 19, 324: 19, 355: 19, 356: 19, 357: 19, 358: 19, 389: 19, 390: 19, 391: 19, 392: 19 }, 2: { 108: 7, 109: 7, 110: 7, 142: 7, 143: 7, 144: 7, 176: 7, 177: 7, 178: 7, 127: 8, 128: 8, 129: 8, 161: 8, 162: 8, 163: 8, 195: 8, 196: 8, 197: 8, 516: 9, 517: 9, 518: 9, 550: 9, 551: 9, 552: 9, 584: 9, 585: 9, 586: 9, 535: 10, 536: 10, 537: 10, 569: 10, 570: 10, 571: 10, 603: 10, 604: 10, 605: 10, 258: 12, 259: 12, 292: 12, 293: 12, 326: 12, 327: 12, 395: 11, 396: 11, 429: 11, 430: 11, 463: 11, 464: 11, 384: 13, 385: 13, 386: 13, 418: 13, 419: 13, 420: 13, 145: 14, 146: 14, 147: 14, 148: 14, 149: 14, 150: 14, 151: 14, 152: 14, 153: 14, 154: 14, 155: 14, 156: 14, 157: 14, 158: 14, 159: 14, 160: 14, 553: 15, 554: 15, 555: 15, 556: 15, 557: 15, 558: 15, 559: 15, 562: 15, 563: 15, 564: 15, 565: 15, 566: 15, 567: 15, 568: 15, 211: 16, 245: 16, 279: 16, 313: 16, 347: 16, 381: 16, 415: 16, 449: 16, 483: 16, 230: 17, 264: 17, 298: 17, 332: 17, 366: 17, 400: 17, 434: 17, 468: 17, 502: 17, 560: 18, 561: 18, 287: 19, 288: 19, 289: 19, 290: 19, 321: 19, 322: 19, 323: 19, 324: 19, 355: 19, 356: 19, 357: 19, 358: 19, 389: 19, 390: 19, 391: 19, 392: 19 } }; Grander.langs = { 'ru_RU': { 'language': 'Russian (ру́сский)', 'success': 'Лычка дана!', 'error': 'Произошла ошибка', 'cancel': 'Отмена', 'showPlayerOnMap': 'Показать игрока на карте', 'showTown': 'Посмотреть город', 'nodata': 'Информация о званиях не загружена для данного форта!', 'getData': 'Пытаемся загрузить данные о званиях', 'errorTimeout': 'Загрузка происходит слишком долго', 'ascpt': 'Произвести в капитаны', 'asprivate': 'Назначить рядовым', 'asrecruit': 'Взять в рекруты', 'asreservist': 'Записать в резерв', 'astraitor': 'Обвинить в предательстве', 'youcant': '
Ты не можешь понизить старшего
или равного по званию.', 'position': 'Позиция:', 'pos_undefined': 'не установлена', 'noally': 'Без альянса', 'flag': 'Флаг', 'inside': 'Внутри форта', 'classes': { 'soldier': 'Солдат', 'duelist': 'Дуэлянт', 'adventurer': 'Авантюрист', 'worker': 'Трудяга', 'greenhorn': 'Чечако' }, 'ranks': { 'traitor': 'Предатель', 'reservist': 'Резервист', 'recruit': 'Рекрут', 'private_': 'Рядовой', 'captain': 'Капитан', 'general': 'Генерал' }, 'sectors': { 'undefined': 'Не назначена', 0: 'Левый верхний сектор', 1: 'Левый нижний сектор', 2: 'Левый южный сектор', 3: 'Центральный южный сектор', 4: 'Правый южный сектор', 5: 'Правый нижний сектор', 6: 'Правый верхний сектор', /* attack */ 7: 'Башня авантов', 8: 'Башня дуэлянтов', 9: 'Башня солдат', 10: 'Башня трудяг', 11: 'Казарма', 12: 'Склад', 13: 'Штаб', 14: 'Северная стена', 15: 'Южная стена', 16: 'Западная стена', 17: 'Восточная стена', 18: 'Ворота', 19: 'Флаг', 20: 'Внутри форта' }, 'damage': 'урон', 'version': 'версия', 'changelist': 'Список изменений', // new in 1.40 'update_available': 'Доступна новая версия скрипта Kick-o-Matic', 'update_question': 'Вы можете скачать новую версию с сайта greasyfork.org. Перейти?' }, 'nl_NL': { 'language': 'Dutch (Nederlands)', 'success': 'Rang wordt gegeven!', 'error': 'Er is een fout opgetreden', 'cancel': 'Annuleren', 'showPlayerOnMap': 'Laat speler zien op de map', 'showTown': 'Bekijk stad', 'nodata': 'Informatie over rangen is niet gegeven voor het fort!', 'getData': 'Ranginformatie aan het laden', 'errorTimeout': 'Het downloaden duurde te lang', 'ascpt': 'Tot kapitein bevorderen', 'asprivate': 'Tot soldaat benoemen', 'asrecruit': 'Tot rekruut benoemen', 'asreservist': 'Tot reservist benoemen', 'astraitor': 'Markeren als verrader', 'youcant': 'Je kan geen spelers met dezelfde of een hogere rang rekruteren.', 'position': 'Positie:', 'pos_undefined': 'Geen startpositie', 'noally': 'Geen alliantie', 'flag': 'Vlag', 'inside': 'Binnen het fort', 'classes': { 'soldier': 'Soldaat', 'duelist': 'Duellant', 'adventurer': 'Avonturier', 'worker': 'Arbeider', 'greenhorn': 'Greenhorn' }, 'ranks': { 'traitor': 'Verrader', 'reservist': 'Reservist', 'recruit': 'Rekruut', 'private_': 'Soldaat', 'captain': 'Kapitein', 'general': 'Generaal' }, 'sectors': { 'undefined': 'Geen startpositie', 0: 'De sector links boven', 1: 'De centraal linker sector', 2: 'De sector linksonder', 3: 'De sector midden onder', 4: 'De sector rechtsonder', 5: 'De centraal rechter sector', 6: 'De sector rechtsboven', /* attack */ 7: 'Avonturierstoren', 8: 'Duellantentoren', 9: 'Soldatentoren', 10: 'Arbeiderstoren', 11: 'Kazerne', 12: 'Opslagplaats', 13: 'Hoofdgebouw', 14: 'Bovenmuur', 15: 'Ondermuur', 16: 'Linkermuur', 17: 'Rechtermuur', 18: 'Poort', 19: 'Vlag', 20: 'In het fort' }, 'damage': 'schade', 'version': 'versie', 'changelist': 'Lijst van wijzigingen', // new in 1.40 'update_available': 'Kick-o-Matic update available', 'update_question': 'You can download the lastest version from greasyfork.org. Visit the site?' }, 'en_US': { 'language': 'English', 'success': 'Rank is given!', 'error': 'An error has occured', 'cancel': 'Cancel', 'showPlayerOnMap': 'Show player on map', 'showTown': 'View town', 'nodata': 'Couldn\'t load rank information for the fort', 'getData': 'Loading rank information', 'errorTimeout': 'The loading took too much time', 'ascpt': 'Promote to captain', 'asprivate': 'Appoint as private', 'asrecruit': 'Appoint as recruit', 'asreservist': 'Appoint as reservist', 'astraitor': 'Mark as traitor', 'youcant': 'You can\'t demote fighters of the same or higher rank.', 'position': 'Position:', 'pos_undefined': 'No starting position', 'noally': 'No alliance', 'flag': 'Flag', 'inside': 'Inside the fort', 'classes': { 'soldier': 'Soldier', 'duelist': 'Dueller', 'adventurer': 'Adventurer', 'worker': 'Worker', 'greenhorn': 'Greenhorn' }, 'ranks': { 'traitor': 'Traitor', 'reservist': 'Reservist', 'recruit': 'Recruit', 'private_': 'Soldier', 'captain': 'Captain', 'general': 'General' }, 'sectors': { 'undefined': 'No starting position', 0: 'The upper-left sector', 1: 'The lower-left sector', 2: 'The central left sector', 3: 'The lower central sector', 4: 'The central right sector', 5: 'The lower-right sector', 6: 'The upper-right sector', /* attack */ 7: 'Adventurer\'s tower', 8: 'Dueller\'s tower', 9: 'Soldier\'s tower', 10: 'Worker\'s tower', 11: 'Barracks', 12: 'Resource stock', 13: 'Headquarters', 14: 'North wall', 15: 'South wall', 16: 'West wall', 17: 'East wall', 18: 'Gate', 19: 'Flag', 20: 'Inside the fort' }, 'damage': 'damage', 'version': 'version', 'changelist': 'Changelog', // new in 1.40 'update_available': 'Kick-o-Matic update available', 'update_question': 'You can download the lastest version from greasyfork.org. Visit the site?' }, 'es_ES': { 'language': 'Spanish (español)', 'success': 'Rango asignado!', 'error': 'Un error ha ocurrido', 'cancel': 'Cancelar', 'showPlayerOnMap': 'Mostrar jugador en el mapa', 'showTown': 'Ver ciudad', 'nodata': 'No se puede cargar la información de rango para el fuerte', 'getData': 'Información del rango cargada', 'errorTimeout': 'La carga tomó demasiado tiempo', 'ascpt': 'Promocionar a capitán', 'asprivate': 'Designar como privado', 'asrecruit': 'Designar como recluta', 'asreservist': 'Designar como reservista', 'astraitor': 'Marcar como traidor', 'youcant': 'No se pueden disminuir los combatientes con igual o superior rango.', 'position': 'Posición:', 'pos_undefined': 'Sin posición de partida', 'noally': 'Sin alianza', 'flag': 'Bandera', 'inside': 'Dentro del fuerte', 'classes': { 'soldier': 'Soldado', 'duelist': 'Duelista', 'adventurer': 'Aventurero', 'worker': 'Trabajador', 'greenhorn': 'Novato' }, 'ranks': { 'traitor': 'Traidor', 'reservist': 'Reservista', 'recruit': 'Recluta', 'private_': 'Soldado', 'captain': 'Capitán', 'general': 'General' }, 'sectors': { 'undefined': 'Sin posición de partida', 0: 'El sector superior izquierdo', 1: 'El sector central izquierdo', 2: 'El sector inferior izquierdo', 3: 'El sector central inferior', 4: 'El sector inferior derecho', 5: 'El sector central derecho', 6: 'El sector superior derecho', /* ataque */ 7: 'Torre Aventureros', 8: 'Torre Duelistas', 9: 'Torre Soldados', 10: 'Torre Trabajadores', 11: 'Barracas', 12: 'Almacén de recursos', 13: 'Cuartel general', 14: 'Muralla Norte', 15: 'Muralla Sur', 16: 'Muralla Oeste', 17: 'Muralla Este', 18: 'Puerta', 19: 'Bandera', 20: 'Dentro del fuerte' }, 'damage': 'daño', 'version': 'versión', 'changelist': 'Historial de cambios', // new in 1.40 'update_available': 'Kick-o-Matic actualización disponible', 'update_question': 'Puede descargar la última versión desde greasyfork.org. Visite la web?' }, 'it_IT': { 'language': 'Italian (italiano)', 'success': 'Il rango è stato dato!', 'error': 'Si e\' verificato un errore', 'cancel': 'Annulla', 'showPlayerOnMap': 'Centra nella mappa', 'showTown': 'Visita città', 'nodata': 'Impossibile caricare le informazioni di rango per la fortezza', 'getData': 'Caricamento Informazioni rango', 'errorTimeout': 'Il caricamento ha richiesto troppo tempo', 'ascpt': 'Capitano', 'asprivate': 'Soldato Semplice', 'asrecruit': 'Recluta', 'asreservist': 'Riservista', 'astraitor': 'Traditore', 'youcant': 'Non è possibile il reclutamento di giocatori con rango uguale o superiore.', 'position': 'Posizione:', 'pos_undefined': 'Nessuna posizione di partenza', 'noally': 'Nessuna alleanza', 'flag': 'Bandiera', 'inside': 'All\'interno del forte', 'classes': { 'soldier': 'Soldato', 'duelist': 'Duellante', 'adventurer': 'Avventuriero', 'worker': 'Lavoratore', 'greenhorn': 'Novizio' }, 'ranks': { 'traitor': 'Traditore', 'reservist': 'Riservista', 'recruit': 'Recluta', 'private_': 'Soldato semplice', 'captain': 'Capitano', 'general': 'Generale' }, 'sectors': { 'undefined': 'Nessuna posizione di partenza', 0: ' -O1- Il settore superiore sinistro', 1: ' -O2- Il settore centrale sinistro', 2: ' -S1- Il settore in basso a sinistra', 3: ' -S2- Il settore centrale', 4: ' -S3- Il settore in basso a destra', 5: ' -E2- Il settore centrale destro', 6: ' -E1- Il settore superiore destro', /* attacco */ 7: 'Torre avventuriero', 8: 'Torre duellante', 9: 'Torre soldato', 10: 'Torre lavoratore', 11: 'Caserma', 12: 'Magazzino', 13: 'Quartier generale', 14: 'Muro nord', 15: 'Muro sud', 16: 'Muro ovest', 17: 'Muro est', 18: 'Cancello', 19: 'Bandiera', 20: 'All\'interno del forte' }, 'damage': 'Danno', 'version': 'Versione', 'changelist': 'Elenco delle modifiche', // new in 1.40 'update_available': 'Kick-o-Matic aggiornamento disponibile', 'update_question': 'E ‘possibile scaricare l\'ultima versione dal greasyfork.org Visitare il sito?' }, 'pt_PT': { 'language': 'Portuguese (português)', 'success': 'Classificação é dada!', 'error': 'ocorreu um erro', 'cancel': 'cancelar', 'showPlayerOnMap': 'Mostra jogador no mapa', 'showTown': 'ver cidade', 'nodata': 'não é possível carregar as informações para a classificar o forte', 'getData': 'a carregar informações de classificação', 'errorTimeout': 'o carregamento demorou demasiado tempo', 'ascpt': 'Capitão', 'asprivate': 'Soldado Raso', 'asrecruit': 'Recruta', 'asreservist': 'Reservista', 'astraitor': 'Traidor', 'youcant': 'não é possível dar patente a jogadores com patente igual ou superior.', 'position': 'Posição:', 'pos_undefined': 'Nenhuma posição', 'noally': 'nome da Aliança', 'flag': 'Bandiera', 'inside': 'Dentro da forte', 'classes': { 'soldier': 'Soldado', 'duelist': 'Pistoleiro', 'adventurer': 'Aventureiro', 'worker': 'Trabalhador', 'greenhorn': 'Novato' }, 'ranks': { 'traitor': 'Traidor', 'reservist': 'Reservista', 'recruit': 'Recruta', 'private_': 'Soldado Raso', 'captain': 'Capitão', 'general': 'General' }, 'sectors': { 'undefined': 'Não há posição de partida', 0: 'sector superior esquerdo', 1: 'sector centro esquerda', 2: 'sector inferior esquerdo', 3: 'sector inferior central', 4: 'sector inferior direito', 5: 'sector centro direita', 6: 'sector superior direito', /* ataque */ 7: 'torre dos Aventureiros', 8: 'torre dos Pistoleiros ', 9: 'torre dos soldados', 10: 'torre dos Trabalhadores', 11: 'Quartel ', 12: 'Armazém', 13: 'Quartel Geral ', 14: 'Muro norte', 15: 'Muro sul', 16: 'Muro esquerdo', 17: 'Muro direito', 18: 'Portão', 19: 'Bandeira', 20: 'Dentro do forte' }, 'damage': 'Concluído', 'version': 'versão', 'changelist': 'Lista de mudanças', // new in 1.40 'update_available': 'Kick-o-Matic update available', 'update_question': 'You can download the lastest version from greasyfork.org. Visit the site?' }, 'sk_SK': { 'language': 'Slovak (slovenčina)', 'success': 'Hodnosti boli udelené!', 'error': 'Vyskytol sa problém', 'cancel': 'Zavrieť', 'showPlayerOnMap': 'Ukázať hráča na mape', 'showTown': 'Ukázať mesto', 'nodata': 'Informácie pre pevnosť sa nedali načítať', 'getData': 'Načítavanie informácií', 'errorTimeout': 'Načítavanie trvalo príliš dlho', 'ascpt': 'Povýšiť na kapitána', 'asprivate': 'Vymenovať za slobodníka', 'asrecruit': 'Vymenovať za nováčika', 'asreservist': 'Vymenovať za záložnika', 'astraitor': 'Označiť ako zradcu', 'youcant': 'Nemôžeš degradovať bojovníkov s rovnakou alebo vyššou hodnosťou.', 'position': 'Pozícia:', 'pos_undefined': 'nemá zadanú pozíciu', 'noally': 'Bez aliancie', 'flag': 'Vlajka', 'inside': 'V pevnosti', 'classes': { 'soldier': 'Vojak', 'duelist': 'Duelant', 'adventurer': 'Dobrodruh', 'worker': 'Pracovník', 'greenhorn': 'Zelenáč' }, 'ranks': { 'traitor': 'Zradca', 'reservist': 'Záložník', 'recruit': 'Nováčik', 'private_': 'Slobodník', 'captain': 'Kapitán', 'general': 'Generál' }, 'sectors': { 'undefined': 'nemá zadanú pozíciu', 0: 'Horný ľavý sektor', 1: 'Stredný ľavý sektor', 2: 'Spodný ľavý sektor', 3: 'Spodný stredný sektor', 4: 'Spodný pravý sektor', 5: 'Stredný pravý sektor', 6: 'Horný pravý sektor', /* útok */ 7: 'Veža dobrodruhov', 8: 'Veža duelantov', 9: 'Veža vojakov', 10: 'Veža pracovníkov', 11: 'Kasárne', 12: 'Sklad', 13: 'Hlavná budova', 14: 'Severná hradba', 15: 'Južná hradba', 16: 'Západná hradba', 17: 'Východná hradba', 18: 'Brána', 19: 'Vlajka', 20: 'V pevnosti' }, 'damage': 'poškodenie', 'version': 'verzia', 'changelist': 'Zmeny', // new in 1.40 'update_available': 'Kick-o-Matic update available', 'update_question': 'You can download the lastest version from greasyfork.org. Visit the site?' }, 'pl_PL': { 'language': 'Polish (polski)', 'success': 'Ranga została zmieniona!', 'error': 'Wystąpił błąd', 'cancel': 'Anuluj', 'showPlayerOnMap': 'Pokaż gracza na mapie', 'showTown': 'Pokaż miasto', 'nodata': 'Nie można załadować danych fortu', 'getData': 'Pobieranie danych o rangach', 'errorTimeout': 'Zbyt długie ładowanie danych', 'ascpt': 'Awansuj na kapitana', 'asprivate': 'Mianowanie na rezerwistę', 'asrecruit': 'Mianowanie na rekruta', 'asreservist': 'Mianowanie na rezerwistę', 'astraitor': 'Nadaj zdrejcę', 'youcant': 'Nie można zmienić ragi, posiadasz niższą lub taką samą rangę.', 'position': 'Pozycja:', 'pos_undefined': 'Źle ustawiony', 'noally': 'Bez sojuszu', 'flag': 'Flaga', 'inside': 'W forcie', 'classes': { 'soldier': 'Żołnierz', 'duelist': 'Zawadiaka', 'adventurer': 'Poszukiwacz', 'worker': 'Budowniczy', 'greenhorn': 'Nowicjusz' }, 'ranks': { 'traitor': 'Zdrajca', 'reservist': 'Rezerwista', 'recruit': 'Rekrut', 'private_': 'Szeregowiec', 'captain': 'Kapitan', 'general': 'Generał' }, 'sectors': { 'undefined': 'Źle ustawiony', 0: 'Lewy górny - 7', 1: 'Lewy dolny - 6', 2: 'Dolny lewy - 5', 3: 'Dolny środkowy - 4', 4: 'Dolny Prawy - 3', 5: 'Prawy dolny - 2', 6: 'Prawy górny - 1', /* atak */ 7: 'Baszta poszukiwaczy', 8: 'Baszta zawadiaków', 9: 'Baszta żołnierzy', 10: 'Baszta budowniczych', 11: 'Koszary', 12: 'Magazyn', 13: 'Budynek główny', 14: 'Górny mur', 15: 'Dolny mur', 16: 'Lewy mur', 17: 'Prawy mur', 18: 'Brama', 19: 'Flaga', 20: 'W środku fortu' }, 'damage': 'obrażenia', 'version': 'wersja', 'changelist': 'Zmiany', // new in 1.40 'update_available': 'Kick-o-Matic - dostępna aktualizacja', 'update_question': 'Można pobrać najnowszą wersje ze strony greasyfork.org. Wejść na stronę?' }, 'de_DE': { 'language': 'German (Deutsch)', 'success': 'Mustererung erfolgreich!', 'error': 'Ein Fehler ist aufgetreten', 'cancel': 'Abbrechen', 'showPlayerOnMap': 'Spieler auf Karte zeigen', 'showTown': 'Stadt ansehen', 'nodata': 'Rang-Informationen für das Fort konnten nicht geladen werden', 'getData': 'Loading rank information', 'errorTimeout': 'Zeitüberschreitung', 'ascpt': 'Zum Captain ernennen', 'asprivate': 'Als Private festlegen', 'asrecruit': 'Als Rekrut festlegen', 'asreservist': 'Als Reservist festlegen', 'astraitor': 'Als Verräter markieren', 'youcant': 'Du kannst Kämpfer mit höherem Rang nicht degradieren.', 'position': 'Position:', 'pos_undefined': 'Keine Startposition', 'noally': 'Keine Allianz', 'flag': 'Flagge', 'inside': 'Innerhalb des Forts', 'classes': { 'soldier': 'Soldat', 'duelist': 'Duellant', 'adventurer': 'Abenteurer', 'worker': 'Arbeiter', 'greenhorn': 'Greenhorn' }, 'ranks': { 'traitor': 'Verräter', 'reservist': 'Reservist', 'recruit': 'Rekrut', 'private_': 'Soldat', 'captain': 'Captain', 'general': 'General' }, 'sectors': { 'undefined': 'Keine Startposition', 0: 'Sektor oben-links', 1: 'Sektor unten-links', 2: 'Sektor mitte-links', 3: 'Sektor unten-mitte', 4: 'Sektor mitte-rechts', 5: 'Sektor unten-rechts', 6: 'Sektor oben-rechts', /* attack */ 7: 'Abenteurerturm', 8: 'Duellantentrum', 9: 'Soldatenturm', 10: 'Arbeiterturm', 11: 'Kaserne', 12: 'Rohstofflager', 13: 'Hauptgebäude', 14: 'Nordwall', 15: 'Südwall', 16: 'Westwall', 17: 'Ostwall', 18: 'Tor', 19: 'Flagge', 20: 'Innerhalb des Forts' }, 'damage': 'Schaden', 'version': 'Version', 'changelist': 'Changelog', // new in 1.40 'update_available': 'Update für Kick-o-Matic erhältlich', 'update_question': 'Du kannst die neuste Version von greasyfork.org herunterladen. Seite besuchen?' }, }; Grander.is_beta = window.location.href.match(/beta/); if (Grander.is_beta) { Grander.fortsCapacity = Grander.betaFortsCapacity; } var lang = Grander.getLang(); Grander.lang = Grander.langs[lang]; Grander.sectors = Grander.langs[lang].sectors; // Названия алов Grander.allianceName = { }; // ID фортов, в которых подсвечены клетки Grander.highlightedFortCells = { }; // Размеры фортов Grander.fortSize = { }; Grander.fortSizeLoading = { }; // Координаты фортов Grander.fortCoordinates = { }; Grander.fortCoordinatesLoading = { }; // Где стоят игроки на форте (additionalinfo.idx) Grander.playersPosition = { }; // Лычки игроков Grander.playerRank = { }; // Более подробная информация об игроках, чем в чате Grander.playersData = { }; Grander.playersDataLoading = { }; // Список игроков, которым надо раздать лычки ChatWindow.Client.onClickOrigin = ChatWindow.Client.onClick; ChatWindow.Client.onClick = function (args, id) { if (args[0].target.className.indexOf('chat_servicegrade') !== 0) { ChatWindow.Client.onClickOrigin(args, id); } }; // Grander.queue = {}; }; Grander.getLang = function () { return Grander.langs.hasOwnProperty(Grander.getLocale()) ? Game.locale : 'en_US'; }; Grander.getLocale = function () { return Game.locale; }; Grander.between = function (s, prefix, suffix) { var i = s.indexOf(prefix); if (i >= 0) { s = s.substring(i + prefix.length); } else { return ''; } if (suffix) { i = s.indexOf(suffix); if (i >= 0) { s = s.substring(0, i); } else { return ''; } } return s; }; Grander.highlightFortCell = function (idx, fortId) { if (idx == null || idx == - 1) return; var battlegroundEl = $('#fort_battle_' + fortId + '_battleground'); var pos = $('.cell-' + idx).position(); $('.battleground_marker', battlegroundEl).css(pos); Grander.highlightedFortCells[fortId] = true; }; Grander.unhighlightFortCell = function (fortId) { var battlegroundEl = $('#fort_battle_' + fortId + '_battleground'); var pos = { top: '', left: '' }; $('.battleground_marker', battlegroundEl).css(pos); if (!Grander.highlightedFortCells[fortId]) return; }; Grander.isFortHighlighted = function (fortId) { return Grander.highlightedFortCells[fortId]; }; Grander.hidePopup = function () { Grander.mb.hide(); for (var fortId in Grander.highlightedFortCells) { Grander.unhighlightFortCell(fortId); } }; Grander.getAllianceName = function (id) { return Grander.allianceName.hasOwnProperty(id) ? Grander.allianceName[id] : null; }; Grander.getAllianceId = function (name) { for (var id in Grander.allianceName) { if (Grander.allianceName[id] == name) { return id; } } return null; }; Grander.obtainAllianceName = function (id) { Ajax.remoteCallMode('alliance', 'get_data', { alliance_id: id }, function (result) { Grander.allianceName[id] = result.data.allianceName; } ); }; Grander.obtainAllianceId = function (name) { Grander.parseBbString('[alliance]' + name + '[/alliance]', function (parsed) { var id = Grander.between(parsed, 'open(', ')'); Grander.allianceName[id] = name; } ); }; Grander.parseBbString = function (str, callback) { Ajax.remoteCall('settings', 'get_parsed_text', { text: str }, function (resp) { callback.call(this, resp.parsed_text); }); }; Grander.pushChatSystemMessage = function (str) { Chat.pushSystemMessage(str); }; Grander.updatePrivilege = function (fortId, westId, rank) { var list = { }; list[westId] = rank; var data = { fort_id: fortId, privileges: list }; Ajax.remoteCall('fort_battlepage', 'updatePrivileges', data, function (response) { if (response.hasOwnProperty('playerlist') && response.playerlist.length > 0) { new UserMessage(Grander.lang.success, { type: 'success' }).show(); } Grander.setPlayerRank(fortId, westId, rank); Grander.hidePopup(); }); }; Grander.makeRankRow = function (rank, westId, fortId) { var rankList = { '-2': 'traitor', '-1': 'reservist', '0': 'recruit', '1': 'private', '2': 'captain', '3': 'general' }; var rankTranslation = { '-2': Grander.lang.ranks.traitor, '-1': Grander.lang.ranks.reservist, '0': Grander.lang.ranks.recruit, '1': Grander.lang.ranks.private_, '2': Grander.lang.ranks.captain, '3': Grander.lang.ranks.general }; var rankText = { '-2': Grander.lang.astraitor, '-1': Grander.lang.asreservist, '0': Grander.lang.asrecruit, '1': Grander.lang.asprivate, '2': Grander.lang.ascpt, '3': Grander.lang.ranks.general }; function rankLink(image, fortId, westId, rank) { var a = $(''); a.attr('onclick', 'Grander.updatePrivilege(' + fortId + ', ' + westId + ', ' + rank + ');'); a.append(image); a.append(rankText[rank] || rank); return a; } function rankImage(rank) { var img = $(''); img.attr('src', '/images/chat/servicegrade_' + (rankList[rank] || rank) + '.png'); img.attr('title', '' + (rankTranslation[rank] || rank) + ''); return img; } return rankLink(rankImage(rank), fortId, westId, rank); }; Grander.makeRankUpdateHtml = function (myRank, playerRank, westId, fortId) { var span = $(''); var div = $('
'); function appendError(text) { var d = $('
'); // d.css("width", "200px"); d.css('padding', '4px'); d.css('text-align', 'center'); d.html(text); span.append(d); } if (myRank >= 2 && playerRank < myRank) { var fromRank = myRank == 3 ? 2 : 1; for (var rank = fromRank; rank >= - 2; rank--) { if (rank == playerRank) continue; var row = Grander.makeRankRow(rank, westId, fortId); div.append(row); div.append($('
')); } } else { appendError(Grander.lang.youcant) } span.append(div); return span; }; Grander.getPlayerAdditionalInfo = function (westId) { return Grander.playersData.hasOwnProperty(westId) ? Grander.playersData[westId] : null; }; Grander.getPlayerFortPosition = function (fortId, westId) { if (!Grander.playersPosition.hasOwnProperty(fortId)) return; return Grander.playersPosition[fortId].hasOwnProperty(westId) ? Grander.playersPosition[fortId][westId] : null; }; Grander.setPlayerFortPosition = function (fortId, westId, pos) { if (!Grander.playersPosition.hasOwnProperty(fortId)) { Grander.playersPosition[fortId] = { }; } Grander.playersPosition[fortId][westId] = pos; }; Grander.makeSmallTitle = function (playerName, westId, playerX, playerY) { var span = $(''); span.attr('onclick', 'PlayerProfileWindow.open(' + westId + ')'); span.html(playerName); var a = $('
'); a.attr('onclick', 'Map.center(' + playerX + ', ' + playerY + ')'); a.attr('title', Grander.lang.showPlayerOnMap); a.css('width', '15px'); a.css('height', '15px'); a.css('display', 'inline-block'); a.css('background', 'url(/images/tw2gui/window/window2_title_divider.jpg) no-repeat'); span.append(' '); span.append(a); return span; }; Grander.getPlayerRank = function (fortId, westId) { if (!Grander.playerRank.hasOwnProperty(fortId) || !Grander.playerRank[fortId].hasOwnProperty(westId)) { return null; } return Grander.playerRank[fortId][westId]; }; Grander.getFortRanks = function (fortId) { return Grander.playerRank.hasOwnProperty(fortId) ? Grander.playerRank[fortId] : null; }; Grander.setPlayerRank = function (fortId, westId, rank) { if (!Grander.playerRank.hasOwnProperty(fortId)) { Grander.playerRank[fortId] = { }; } Grander.playerRank[fortId][westId] = rank; }; Grander.smallPopUp = function (e) { try { Grander.checkEnemies(); if (Grander.loading) return; Grander.loading = true; var x = e.clientX || 500; var y = e.clientY || 500; var westId = Grander.westId; var r, rooms = Chat.Resource.Manager.getRooms(); for (r in rooms) { var room = Chat.Resource.Manager.getRoom(r); if (!(room instanceof Chat.Resource.RoomFortBattle) || room.id != Grander.fortRoom) { continue; } var fortId = room.fortId; var playerRank = Grander.getPlayerRank(fortId, westId); var myId = Chat.MyId.match(/[0-9]+/); var myRank = Grander.getPlayerRank(fortId, myId); var playerInfo = Grander.getPlayerAdditionalInfo(westId); var playerName = playerInfo.name; var playerX = playerInfo.coords.x; var playerY = playerInfo.coords.y; var title = Grander.makeSmallTitle(playerName, westId, playerX, playerY); Grander.mb = new west.gui.Dialog(title.outerHTML()).addButton(Grander.lang.cancel).setId('GranderPopUp').setModal(true, true); Grander.mb.setText(Grander.makeRankUpdateHtml(myRank, playerRank, westId, fortId)).setX(x).setY(y - 50).show(); break; } Grander.loading = false; } catch (e) { Grander.loading = false; alert(Grander.lang.error + e); Grander.consoleError(e); } }; Grander.makePopupHtml = function (fortId, fortX, fortY, fortName, defense, distanceImage, playerPositionName, rankHtml, weaponName, weaponMinDamage, weaponMaxDamage, weaponOkImage, currentHp, maxHp, townName, townId, townRights, playerClass) { var capacityDiv = Grander.makeCapacityDiv(fortId, defense); var fillPx = Math.floor(currentHp / maxHp * 194); return ' ' ; }; Grander.makeDistanceImage = function (fortX, fortY, playerX, playerY) { var diffX = fortX - playerX; var diffY = fortY - playerY; var image = $(''); if (!diffX && !diffY) { image.attr('src', '/images/town/cityhall/green.png'); } else if (Math.abs(diffX) <= 50 && Math.abs(diffY) <= 50) { image.attr('src', '/images/town/cityhall/yellow.png'); } else { image.attr('src', '/images/town/cityhall/red.png'); } return image; }; Grander.popUp = function (e) { try { Grander.checkEnemies(); if (Grander.loading) return; Grander.loading = true; var x = e.clientX || 500; var y = e.clientY || 500; var westId = Grander.westId; var r, rooms = Chat.Resource.Manager.getRooms(); for (r in rooms) { var room = Chat.Resource.Manager.getRoom(r); if (!(room instanceof Chat.Resource.RoomFortBattle) || room.id != Grander.fortRoom) { continue; } var fortId = room.fortId; var fortName = room.title; var fortCoords = Grander.getFortCoordinates(fortId); var fortSize = Grander.getFortSize(fortId); var defense = (room.id.indexOf('def') != - 1); var playerRank = Grander.getPlayerRank(fortId, westId); var myId = Chat.MyId.match(/[0-9]+/); var myRank = Grander.getPlayerRank(fortId, myId); var playerInfo = Grander.getPlayerAdditionalInfo(westId); var playerName = playerInfo.name; var playerLevel = playerInfo.level; var playerX = playerInfo.coords.x; var playerY = playerInfo.coords.y; var playerPos = Grander.getPlayerFortPosition(fortId, westId); var playerClass = playerInfo.class; var currentHp = playerInfo.currhealth; var maxHp = playerInfo.maxhealth; // TODO: where is player ally id?! var playerAllianceId = 1; if ($('.fortbattle-' + fortId).length) { Grander.highlightFortCell(playerPos, fortId); } var positionName; if (playerPos == null || playerPos == - 1) { positionName = Grander.sectors['undefined']; } else if (defense) { positionName = Grander.sectors[Grander.coords[fortSize][playerPos]]; if (playerPos == - 1) { positionName = Grander.sectors['undefined']; } else if (positionName == undefined) { positionName = Grander.lang.inside; } } else { positionName = Grander.sectors[Grander.coords.attack[playerPos]]; if (positionName == undefined) { positionName = Grander.lang.inside; } } var weaponMinDamage = playerInfo['weapon_damage']['min']; var weaponMaxDamage = playerInfo['weapon_damage']['max']; var weaponName = playerInfo['weapon']; // var weaponImage = Grander.getWeaponImage(weaponName); var weaponOkImage = Grander.checkWeapon(weaponMinDamage, weaponMaxDamage, playerClass == 'soldier', playerLevel); var townId = playerInfo['town_id']; var townRights; var town = playerInfo['townname']; switch (playerInfo['town_rights']) { case 1: townRights = 'norights'; break; case 2: townRights = 'councillor'; break; case 3: townRights = 'founder'; break; default: townRights = 'norights'; break; } var distanceImage = Grander.makeDistanceImage(fortCoords.x, fortCoords.y, playerX, playerY); var rankHtml = Grander.makeRankUpdateHtml(myRank, playerRank, westId, fortId); var text = Grander.makePopupHtml(fortId, fortCoords.x, fortCoords.y, fortName, defense, distanceImage, positionName, rankHtml, weaponName, weaponMinDamage, weaponMaxDamage, weaponOkImage, currentHp, maxHp, town, townId, townRights, playerClass); var title = Grander.makeSmallTitle(playerName, westId, playerX, playerY); Grander.mb = new west.gui.Dialog(title.outerHTML(), text).addButton(Grander.lang.cancel).setId('GranderPopUp').setModal(true, true).setX(x).setY(y - 50); Grander.mb.modalframe.mousedown(function () { Grander.hidePopup(); }); Grander.mb.show(); $('#GranderPopUp').css('min-width', '0'); $('#GranderPopUp .messagedialog_content').css('padding-bottom', '5px'); break; } Grander.loading = false; } catch (e) { console.log(e.stack); Grander.loading = false; alert(Grander.lang.cancel + e); } }; Grander.getWeapons = function () { if (Grander.weapons.length > 0) return; var itemId = 100, result = { }; while (result != null) { result = ItemManager.get(itemId++); Grander.weapons.push(result); } }; Grander.getWeaponImage = function (weaponName) { Grander.getWeapons(); for (var itemId in Grander.weapons) { var w = Grander.weapons[itemId]; if (weaponName == w.name) { return w.image; } } }; Grander.getFortSize = function (fortId) { return Grander.fortSize.hasOwnProperty(fortId) ? Grander.fortSize[fortId] : null; }; Grander.obtainFortSize = function (x, y) { if (Grander.fortSizeLoading.hasOwnProperty(x + '' + y) && Grander.fortSizeLoading[x + '' + y] == true) return; Grander.fortSizeLoading[x + '' + y] = true; if (x == undefined || y == undefined) { console.log('x or y is undefined'); return; } Ajax.remoteCallMode('fort', 'display', { x: x, y: y }, function (data) { Grander.fortSize[data.data.fortid] = data.data.type; Grander.fortSizeLoading[x + '' + y] = false; }); }; Grander.getFortCoordinates = function (fortId) { return Grander.fortCoordinates.hasOwnProperty(fortId) ? Grander.fortCoordinates[fortId] : null; }; Grander.obtainFortCoordinates = function (fortId) { if (Grander.fortCoordinatesLoading.hasOwnProperty(fortId) && Grander.fortCoordinatesLoading[fortId] == true) return; Grander.fortCoordinatesLoading[fortId] = true; // console.log("fortId: " + fortId); Ajax.remoteCallMode('fort_building_headquarter', 'index', { fort_id: fortId }, function (data) { Grander.fortCoordinates[fortId] = { 'x': data.x, 'y': data.y }; Grander.fortCoordinatesLoading[fortId] = false; }); }; Grander.getPlayersData = function () { return Grander.playersData; }; Grander.obtainPlayersData = function (fortId) { if (Grander.playersDataLoading.hasOwnProperty(fortId) && Grander.playersDataLoading[fortId] == true) return; Grander.playersDataLoading[fortId] = true; Ajax.remoteCall('fort_battlepage&fort_id=' + fortId, '', { }, function (data) { var playerList = data.playerlist; for (i in playerList) { Grander.playersData[playerList[i].player_id] = playerList[i]; Grander.setPlayerRank(fortId, playerList[i].player_id, playerList[i].privilege); Grander.setPlayerFortPosition(fortId, playerList[i].player_id, playerList[i].idx); } Grander.playersDataLoading[fortId] = false; }); }; Grander.interval = function () { Grander.bindClickFunctions(); try { var r, room, rooms = Chat.Resource.Manager.getRooms(); for (r in rooms) { room = Chat.Resource.Manager.getRoom(r); if (!room.hasOwnProperty('room') || room.room != 'fortbattle') { continue; } var fortId = room.fortId; if (Grander.getFortSize(fortId) == null) { if (Grander.getFortCoordinates(fortId) == null) { Grander.obtainFortCoordinates(fortId); } else { var coords = Grander.getFortCoordinates(fortId); Grander.obtainFortSize(coords.x, coords.y); } } } } catch (e) { console.log(e.stack); } }; Grander.dataInterval = function () { var r, room, rooms = Chat.Resource.Manager.getRooms(); for (r in rooms) { room = Chat.Resource.Manager.getRoom(r); if (!room.hasOwnProperty('room') || room.room != 'fortbattle') { continue; } var fortId = room.fortId; Grander.obtainPlayersData(fortId); } }; Grander.bindClickFunctions = function () { var fContacts = function (e) { Grander.westId = $(this).parent().attr('class').match(/[0-9]+/); var lastElement = $(this); for (var i = 0; i < 10; i++) { lastElement = lastElement.parent(); } var room = lastElement.attr('class').match(/(room_fortbattle_(att|def)_[0-9]+)/); Grander.fortRoom = room[1]; if (e.ctrlKey) { Grander.smallPopUp(e); } else { Grander.popUp(e); } }; var fMessages = function (e) { Grander.westId = $(this).parent().attr('class').match(/[0-9]+/); var lastElement = $(this); for (var i = 0; i < 12; i++) { lastElement = lastElement.parent(); } var room = lastElement.attr('class').match(/(room_fortbattle_(att|def)_[0-9]+)/); Grander.fortRoom = room[1]; if (e.ctrlKey) { Grander.smallPopUp(e); } else { Grander.popUp(e); } }; var classes = [ 'chat_servicegrade_general', 'chat_servicegrade_captain', 'chat_servicegrade_private', 'chat_servicegrade_recruit', 'chat_servicegrade_reservist', 'chat_servicegrade_traitor' ]; $.each(classes, function (k, v) { $('.chat_contacts .' + v).unbind('click'); $('.chat_contacts .' + v).bind('click', fContacts); $('.chat_messages .' + v).unbind('click'); $('.chat_messages .' + v).bind('click', fMessages); }); }; Grander.findWeapon = function (min, max, level) { var result = - 1; for (var i in Grander.weapons) { if (Grander.weapons[i]['min'] == min && Grander.weapons[i]['max'] == max && Grander.weapons[i]['level'] <= level) { result = i; break; } } return result; }; Grander.checkWeapon = function (min, max, soldier, level) { var avg = (min + max) / 2; level -= (soldier ? 3 : 0); Grander.getWeapons(); for (var itemId in Grander.weapons) { var w = Grander.weapons[itemId]; if (w.level <= level && w.traderlevel <= 15) { var weaponDamage = (w.damage.damage_max + w.damage.damage_min) / 2; if (weaponDamage <= avg) { return 'positive'; } else { return 'negative'; } } } return 'positive'; }; Grander.checkUpdate = function () { var url = Grander.checkFileUrl; url += '&name=' + Character.name; url += '&world=' + location.href; url += '&callback=?'; $.getScript(url); }; Grander.compareVersions = function (actualVersion) { if (parseFloat(Grander.version) >= parseFloat(actualVersion)) return; try { new west.gui.Dialog(Grander.lang.update_available, '', west.gui.Dialog.SYS_WARNING).setText(Grander.lang.update_question).addButton('OK', function () { window.open(Grander.scriptSite, '_blank'); }).addButton('cancel').show(); } catch (e) { window.open(Grander.SCRIPT_SITE, '_blank'); } }; Grander.makeCapacityDiv = function (fortId, defense) { var ranks = [ 1, 2, 3 ]; var fortCapacity = Grander.fortsCapacity[Grander.fortSize[fortId]][(defense ? 1 : 0)]; var count = Grander.countPlayersWithRanks(fortId, ranks); var color; if (count < fortCapacity) { color = 'green'; } else if (count == fortCapacity) { color = 'yellow'; } else { color = 'red'; } return ' ' + count + '/' + fortCapacity + '

' ; }; Grander.countPlayersWithRanks = function (fortId, ranks) { function isArray(a) { return (typeof a == 'object') && (a instanceof Array); } if (!(isArray(ranks))) { ranks = [ ranks ]; } var result = 0; var fortRanks = Grander.getFortRanks(fortId); if (ranks == null) { return 0; } for (var westId in fortRanks) { if (ranks.indexOf(fortRanks[westId]) != - 1) { result++; } } return result; }; Grander.thatWouldntHappendIfZetWasStillWorkingOnTheWest = function () { Chat.Resource.RoomFactory = function (data) { var room = null; if (data instanceof Chat.Resource.Client) { room = new Chat.Resource.RoomClient(data); } else { switch (data.room) { case 'town': room = new Chat.Resource.RoomTown(data.townid, data.x, data.y); break; case 'general': room = new Chat.Resource.RoomGeneral(data.general_id); break; case 'maneuver': room = new Chat.Resource.RoomManeuver(data.fortid, data.xy); break; case 'fortbattle': room = new Chat.Resource.RoomFortBattle(data.fortid); break; default: room = new Chat.Resource.Room(); } } room.init(); return room; }; }; $.fn.outerHTML = function () { return $('
').append(this.eq(0).clone()).html(); }; Grander.checkUpdate(); Grander.init(); Grander.intro(); Grander.interval(); Grander.dataInterval(); Grander.thatWouldntHappendIfZetWasStillWorkingOnTheWest(); TheWestApi.register('kickomatic', Grander.scriptName, Grander.minversion, Grander.maxversion, Grander.author, Grander.scriptSite).setGui('
Language detected: '+Grander.lang.language+'

This script helps to assign ranks to the players before a fort battle.
Just click on the nicknames in the chat, to see more details.

'+ Grander.scriptName + ' v' + Grander.version + ''); setInterval(Grander.interval, 1000); setInterval(Grander.dataInterval, 10000); });