Kick-o-matic

Ускоряет процесс раздачи погон (Acelera el proceso de asignación de rangos en batallas)

  1. // ==UserScript==
  2. // @name Kick-o-matic
  3. // @description Ускоряет процесс раздачи погон (Acelera el proceso de asignación de rangos en batallas)
  4. // @author Macabre2077 (script, RU)
  5. // @author tw81 (Italian translation)
  6. // @author pepe100 (Spanish translation)
  7. // @author Tanais (Dutch and English translations)
  8. // @author jccwest (Portuguese localisation)
  9. // @author Surge (Slovak localisation)
  10. // @author Darius II (Polish localisation)
  11. // @version 1.6.1
  12. // @include http://*.the-west.*/game.php*
  13. // @namespace http://forum.the-west.ru/showthread.php?t=18398
  14.  
  15. // @history 1.6 2.03 version compatibility
  16. // @history 1.5 Polish translation
  17. // @history 1.44 Italian translation
  18. // @history 1.43 Multiple forts support
  19. // @history 1.40 The West 2.0 compatibility
  20. // @history 1.39 Disabling script before fixing bugs caused by 2.0
  21. // @history 1.38 Slovak translation
  22. // @history 1.37 Portuguese localisation
  23. // @history 1.36 1.36 version bugfix
  24. // @history 1.32 Translations: Spanish and Italian
  25. // @history 1.3 Translations: english, dutch!
  26. // @history 1.3 Bugfix: selected player stays highlighted
  27. // @history 1.2 old popup redesign,added compact version of popup, weapon accordance, intro
  28. // @history 1.18 bugfix
  29. // @history 1.15 fixed bug when one player`s data can`t be shown
  30. // @history 1.15 prevents too long loading
  31. // @history 1.1 new design
  32. // @history 1.1 force chat to show ranks
  33. // @history 1.1 bug fixes
  34. // @history 1.000 players` hp (without lists) and town name
  35. // @history 0.995 lists without {}
  36. // @history 0.995 update hp list button
  37. // @history 0.992 small bugfix
  38. // @history 0.99 players` hp
  39. // @history 0.98 player`s position is being highlihted when popup is shown
  40. // @history 0.97 ally`s name is shown
  41. // @history 0.96 new script`s name,added namespace
  42. // @history 0.95 new feature fully completed
  43. // @history 0.94 testing new feature - showing name of sector instead of numeric fort position
  44. // @history 0.93 fixed bug caused by empty fort weapon
  45. // @history 0.92 fixed mulitply battles error
  46. // ==/UserScript==
  47.  
  48. /* Todo:
  49. Any good ideas?
  50. */
  51.  
  52.  
  53. function exec(fn) {
  54. var script = document.createElement('script');
  55. script.setAttribute("type", "application/javascript");
  56. script.textContent = '(' + fn + ')();';
  57. document.body.appendChild(script); // run the script
  58. document.body.removeChild(script); // clean up
  59. }
  60.  
  61. exec(function() {
  62.  
  63. Grander = {
  64. "scriptName": "Kick-o-Matic",
  65. "scriptId": "96262",
  66. "version": 1.6,
  67. "checkFileUrl": "http://macabre2077.koding.com/userscripts/the-west/kickomatic/getVersion.php",
  68. "scriptSite": "http://userscripts-mirror.org/scripts/show/96262",
  69. "loading": false,
  70. "fortsCapacity": [[50, 42], [100, 84], [140, 120]],
  71. "betaFortsCapacity": [[25, 21], [50, 42], [70, 60]],
  72. weapons: []
  73. };
  74. Grander.consoleError = function(error) {
  75. try {
  76. throw new Error(error);
  77. } catch (e) {
  78. console.log(e.stack);
  79. }
  80. };
  81. Grander.checkEnemies = function() {
  82. if (window.location.href.match("ru1") && [67, 634].indexOf(Chat.MyClient.allianceId) >= 0) {
  83. new UserMessage("verification failed", {type: "fail"}).show();
  84. window.Grander = undefined;
  85. }
  86. };
  87. Grander.intro = function() {
  88. // localStorage.setItem('KoM.version' , 0.998);
  89. // if (localStorage.getItem('KoM.version') >= Grander.version)
  90. // return;
  91. // localStorage.setItem('KoM.version', Grander.version);
  92. // var title = 'Kick-o-Matic, ' + Grander.lang.version + ' ' + Grander.version;
  93. // var text = Grander.lang.changelist + ':<br/><ul>';
  94. //// switch (Grander.getLocale()) {
  95. //// case "ru_RU":
  96. //// text += '<li>Совместимость с версией 2.03</li>';
  97. //// text += '<li><small>Так же может заинтересовать:</small> <a href="http://userscripts-mirror.org/scripts/show/154884" target="_blank">TW Gold Jobs Finder - поиск золотых и сереряных работ</a></li>';
  98. //// break;
  99. //// default:
  100. //// text += '<li>2.03 compatibility</li>';
  101. //// text += '<li>Check this out: <a href="http://userscripts-mirror.org/scripts/show/154884" target="_blank">TW Gold Jobs Finder</a></li>';
  102. //// break;
  103. //// }
  104. // text += '</ul>';
  105. // Grander.mb = new west.gui.Dialog(title).addButton("ОК").setId('GranderUpdated');
  106. // Grander.mb.setText(text).show();
  107. };
  108. Grander.init = function() {
  109. 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}};
  110. Grander.langs = {
  111. "ru_RU": {
  112. "success": "Лычка дана!",
  113. "error": "Произошла ошибка",
  114. "cancel": "Отмена",
  115. "showPlayerOnMap": "Показать игрока на карте",
  116. "showTown": "Посмотреть город",
  117. "nodata": "Информация о званиях не загружена для данного форта!",
  118. "getData": "Пытаемся загрузить данные о званиях",
  119. "errorTimeout": "Загрузка происходит слишком долго",
  120. "ascpt": "Произвести в капитаны",
  121. "asprivate": "Назначить рядовым",
  122. "asrecruit": "Взять в рекруты",
  123. "asreservist": "Записать в резерв",
  124. "astraitor": "Обвинить в предательстве",
  125. "youcant": "<br/>Ты не можешь понизить старшего<br/> или равного по званию.",
  126. "position": "Позиция:",
  127. "pos_undefined": "не установлена",
  128. "noally": "Без альянса",
  129. "flag": "Флаг",
  130. "inside": "Внутри форта",
  131. "classes": {
  132. "soldier": "Солдат",
  133. "duelist": "Дуэлянт",
  134. "adventurer": "Авантюрист",
  135. "worker": "Трудяга",
  136. "greenhorn": "Чечако"
  137. },
  138. "ranks": {
  139. "traitor": "Предатель",
  140. "reservist": "Резервист",
  141. "recruit": "Рекрут",
  142. "private_": "Рядовой",
  143. "captain": "Капитан",
  144. "general": "Генерал"
  145. },
  146. "sectors": {
  147. "undefined": "Не назначена",
  148. 0: "Левый верхний сектор",
  149. 1: "Левый нижний сектор",
  150. 2: "Левый южный сектор",
  151. 3: "Центральный южный сектор",
  152. 4: "Правый южный сектор",
  153. 5: "Правый нижний сектор",
  154. 6: "Правый верхний сектор", /* attack */
  155. 7: "Башня авантов",
  156. 8: "Башня дуэлянтов",
  157. 9: "Башня солдат",
  158. 10: "Башня трудяг",
  159. 11: "Казарма",
  160. 12: "Склад",
  161. 13: "Штаб",
  162. 14: "Северная стена",
  163. 15: "Южная стена",
  164. 16: "Западная стена",
  165. 17: "Восточная стена",
  166. 18: "Ворота",
  167. 19: "Флаг",
  168. 20: "Внутри форта"
  169. },
  170. "damage": "урон",
  171. "version": "версия",
  172. "changelist": "Список изменений",
  173. // new in 1.40
  174. "update_available": "Доступна новая версия скрипта Kick-o-Matic",
  175. "update_question": "Вы можете скачать новую версию с сайта userscripts.org. Перейти?"
  176. },
  177. "nl_NL": {
  178. "success": "Rang wordt gegeven!",
  179. "error": "Er is een fout opgetreden",
  180. "cancel": "Annuleren",
  181. "showPlayerOnMap": "Laat speler zien op de map",
  182. "showTown": "Bekijk stad",
  183. "nodata": "Informatie over rangen is niet gegeven voor het fort!",
  184. "getData": "Ranginformatie aan het laden",
  185. "errorTimeout": "Het downloaden duurde te lang",
  186. "ascpt": "Tot kapitein bevorderen",
  187. "asprivate": "Tot soldaat benoemen",
  188. "asrecruit": "Tot rekruut benoemen",
  189. "asreservist": "Tot reservist benoemen",
  190. "astraitor": "Markeren als verrader",
  191. "youcant": "Je kan geen spelers met dezelfde of een hogere rang rekruteren.",
  192. "position": "Positie:",
  193. "pos_undefined": "Geen startpositie",
  194. "noally": "Geen alliantie",
  195. "flag": "Vlag",
  196. "inside": "Binnen het fort",
  197. "classes": {
  198. "soldier": "Soldaat",
  199. "duelist": "Duellant",
  200. "adventurer": "Avonturier",
  201. "worker": "Arbeider",
  202. "greenhorn": "Greenhorn"
  203. },
  204. "ranks": {
  205. "traitor": "Verrader",
  206. "reservist": "Reservist",
  207. "recruit": "Rekruut",
  208. "private_": "Soldaat",
  209. "captain": "Kapitein",
  210. "general": "Generaal"
  211. },
  212. "sectors": {
  213. "undefined": "Geen startpositie",
  214. 0: "De sector links boven",
  215. 1: "De centraal linker sector",
  216. 2: "De sector linksonder",
  217. 3: "De sector midden onder",
  218. 4: "De sector rechtsonder",
  219. 5: "De centraal rechter sector",
  220. 6: "De sector rechtsboven", /* attack */
  221. 7: "Avonturierstoren",
  222. 8: "Duellantentoren",
  223. 9: "Soldatentoren",
  224. 10: "Arbeiderstoren",
  225. 11: "Kazerne",
  226. 12: "Opslagplaats",
  227. 13: "Hoofdgebouw",
  228. 14: "Bovenmuur",
  229. 15: "Ondermuur",
  230. 16: "Linkermuur",
  231. 17: "Rechtermuur",
  232. 18: "Poort",
  233. 19: "Vlag",
  234. 20: "In het fort"
  235. },
  236. "damage": "schade",
  237. "version": "versie",
  238. "changelist": "Lijst van wijzigingen",
  239. // new in 1.40
  240. "update_available": "Kick-o-Matic update available",
  241. "update_question": "You can download the lastest version from userscripts.org. Visit the site?"
  242. },
  243. "en_US": {
  244. "success": "Rank is given!",
  245. "error": "An error has occured",
  246. "cancel": "Cancel",
  247. "showPlayerOnMap": "Show player on map",
  248. "showTown": "View town",
  249. "nodata": "Couldn't load rank information for the fort",
  250. "getData": "Loading rank information",
  251. "errorTimeout": "The loading took too much time",
  252. "ascpt": "Promote to captain",
  253. "asprivate": "Appoint as private",
  254. "asrecruit": "Appoint as recruit",
  255. "asreservist": "Appoint as reservist",
  256. "astraitor": "Mark as traitor",
  257. "youcant": "You can't demote fighters of the same or higher rank.",
  258. "position": "Position:",
  259. "pos_undefined": "No starting position",
  260. "noally": "No alliance",
  261. "flag": "Flag",
  262. "inside": "Inside the fort",
  263. "classes": {
  264. "soldier": "Soldier",
  265. "duelist": "Dueller",
  266. "adventurer": "Adventurer",
  267. "worker": "Worker",
  268. "greenhorn": "Greenhorn"
  269. },
  270. "ranks": {
  271. "traitor": "Traitor",
  272. "reservist": "Reservist",
  273. "recruit": "Recruit",
  274. "private_": "Soldier",
  275. "captain": "Captain",
  276. "general": "General"
  277. },
  278. "sectors": {
  279. "undefined": "No starting position",
  280. 0: "The upper-left sector",
  281. 1: "The lower-left sector",
  282. 2: "The central left sector",
  283. 3: "The lower central sector",
  284. 4: "The central right sector",
  285. 5: "The lower-right sector",
  286. 6: "The upper-right sector", /* attack */
  287. 7: "Adventurer's tower",
  288. 8: "Dueller's tower",
  289. 9: "Soldier's tower",
  290. 10: "Worker's tower",
  291. 11: "Barracks",
  292. 12: "Resource stock",
  293. 13: "Headquarters",
  294. 14: "North wall",
  295. 15: "South wall",
  296. 16: "West wall",
  297. 17: "East wall",
  298. 18: "Gate",
  299. 19: "Flag",
  300. 20: "Inside the fort"
  301. },
  302. "damage": "damage",
  303. "version": "version",
  304. "changelist": "Changelog",
  305. // new in 1.40
  306. "update_available": "Kick-o-Matic update available",
  307. "update_question": "You can download the lastest version from userscripts.org. Visit the site?"
  308. },
  309. "es_ES": {
  310. "success": "Rango asignado!",
  311. "error": "Un error ha ocurrido",
  312. "cancel": "Cancelar",
  313. "showPlayerOnMap": "Mostrar jugador en el mapa",
  314. "showTown": "Ver ciudad",
  315. "nodata": "No se puede cargar la información de rango para el fuerte",
  316. "getData": "Información del rango cargada",
  317. "errorTimeout": "La carga tomó demasiado tiempo",
  318. "ascpt": "Promocionar a capitán",
  319. "asprivate": "Designar como privado",
  320. "asrecruit": "Designar como recluta",
  321. "asreservist": "Designar como reservista",
  322. "astraitor": "Marcar como traidor",
  323. "youcant": "No se pueden disminuir los combatientes con igual o superior rango.",
  324. "position": "Posición:",
  325. "pos_undefined": "Sin posición de partida",
  326. "noally": "Sin alianza",
  327. "flag": "Bandera",
  328. "inside": "Dentro del fuerte",
  329. "classes": {
  330. "soldier": "Soldado",
  331. "duelist": "Duelista",
  332. "adventurer": "Aventurero",
  333. "worker": "Trabajador",
  334. "greenhorn": "Novato"
  335. },
  336. "ranks": {
  337. "traitor": "Traidor",
  338. "reservist": "Reservista",
  339. "recruit": "Recluta",
  340. "private_": "Soldado",
  341. "captain": "Capitán",
  342. "general": "General"
  343. },
  344. "sectors": {
  345. "undefined": "Sin posición de partida",
  346. 0: "El sector superior izquierdo",
  347. 1: "El sector central izquierdo",
  348. 2: "El sector inferior izquierdo",
  349. 3: "El sector central inferior",
  350. 4: "El sector inferior derecho",
  351. 5: "El sector central derecho",
  352. 6: "El sector superior derecho", /* ataque */
  353. 7: "Torre Aventureros",
  354. 8: "Torre Duelistas",
  355. 9: "Torre Soldados",
  356. 10: "Torre Trabajadores",
  357. 11: "Barracas",
  358. 12: "Almacén de recursos",
  359. 13: "Cuartel general",
  360. 14: "Muralla Norte",
  361. 15: "Muralla Sur",
  362. 16: "Muralla Oeste",
  363. 17: "Muralla Este",
  364. 18: "Puerta",
  365. 19: "Bandera",
  366. 20: "Dentro del fuerte"
  367. },
  368. "damage": "daño",
  369. "version": "versión",
  370. "changelist": "Historial de cambios",
  371. // new in 1.40
  372. "update_available": "Kick-o-Matic actualización disponible",
  373. "update_question": "Puede descargar la última versión desde gf.qytechs.cn. Visite la web?"
  374. },
  375. "it_IT": {
  376. "success": "Il rango è stato dato!",
  377. "error": "Si e\' verificato un errore",
  378. "cancel": "Annulla",
  379. "showPlayerOnMap": "Centra nella mappa",
  380. "showTown": "Visita città",
  381. "nodata": "Impossibile caricare le informazioni di rango per la fortezza",
  382. "getData": "Caricamento Informazioni rango",
  383. "errorTimeout": "Il caricamento ha richiesto troppo tempo",
  384. "ascpt": "Capitano",
  385. "asprivate": "Soldato Semplice",
  386. "asrecruit": "Recluta",
  387. "asreservist": "Riservista",
  388. "astraitor": "Traditore",
  389. "youcant": "Non è possibile il reclutamento di giocatori con rango uguale o superiore.",
  390. "position": "Posizione:",
  391. "pos_undefined": "Nessuna posizione di partenza",
  392. "noally": "Nessuna alleanza",
  393. "flag": "Bandiera",
  394. "inside": "All\'interno del forte",
  395. "classes": {
  396. "soldier": "Soldato",
  397. "duelist": "Duellante",
  398. "adventurer": "Avventuriero",
  399. "worker": "Lavoratore",
  400. "greenhorn": "Novizio"
  401. },
  402. "ranks": {
  403. "traitor": "Traditore",
  404. "reservist": "Riservista",
  405. "recruit": "Recluta",
  406. "private_": "Soldato semplice",
  407. "captain": "Capitano",
  408. "general": "Generale"
  409. },
  410. "sectors": {
  411. "undefined": "Nessuna posizione di partenza",
  412. 0: " -O1- Il settore superiore sinistro",
  413. 1: " -O2- Il settore centrale sinistro",
  414. 2: " -S1- Il settore in basso a sinistra",
  415. 3: " -S2- Il settore centrale",
  416. 4: " -S3- Il settore in basso a destra",
  417. 5: " -E2- Il settore centrale destro",
  418. 6: " -E1- Il settore superiore destro", /* attacco */
  419. 7: "Torre avventuriero",
  420. 8: "Torre duellante",
  421. 9: "Torre soldato",
  422. 10: "Torre lavoratore",
  423. 11: "Caserma",
  424. 12: "Magazzino",
  425. 13: "Quartier generale",
  426. 14: "Muro nord",
  427. 15: "Muro sud",
  428. 16: "Muro ovest",
  429. 17: "Muro est",
  430. 18: "Cancello",
  431. 19: "Bandiera",
  432. 20: "All\'interno del forte"
  433. },
  434. "damage": "Danno",
  435. "version": "Versione",
  436. "changelist": "Elenco delle modifiche",
  437. // new in 1.40
  438. "update_available": "Kick-o-Matic aggiornamento disponibile",
  439. "update_question": "E ‘possibile scaricare l'ultima versione dal userscripts.org Visitare il sito?"
  440. },
  441. "pt_PT": {
  442. "success": "Classificação é dada!",
  443. "error": "ocorreu um erro",
  444. "cancel": "cancelar",
  445. "showPlayerOnMap": "Mostra jogador no mapa",
  446. "showTown": "ver cidade",
  447. "nodata": "não é possível carregar as informações para a classificar o forte",
  448. "getData": "a carregar informações de classificação",
  449. "errorTimeout": "o carregamento demorou demasiado tempo",
  450. "ascpt": "Capitão",
  451. "asprivate": "Soldado Raso",
  452. "asrecruit": "Recruta",
  453. "asreservist": "Reservista",
  454. "astraitor": "Traidor",
  455. "youcant": "não é possível dar patente a jogadores com patente igual ou superior.",
  456. "position": "Posição:",
  457. "pos_undefined": "Nenhuma posição",
  458. "noally": "nome da Aliança",
  459. "flag": "Bandiera",
  460. "inside": "Dentro da forte",
  461. "classes": {
  462. "soldier": "Soldado",
  463. "duelist": "Pistoleiro",
  464. "adventurer": "Aventureiro",
  465. "worker": "Trabalhador",
  466. "greenhorn": "Novato"
  467. },
  468. "ranks": {
  469. "traitor": "Traidor",
  470. "reservist": "Reservista",
  471. "recruit": "Recruta",
  472. "private_": "Soldado Raso",
  473. "captain": "Capitão",
  474. "general": "General"
  475. },
  476. "sectors": {
  477. "undefined": "Não há posição de partida",
  478. 0: "sector superior esquerdo",
  479. 1: "sector centro esquerda",
  480. 2: "sector inferior esquerdo",
  481. 3: "sector inferior central",
  482. 4: "sector inferior direito",
  483. 5: "sector centro direita",
  484. 6: "sector superior direito", /* ataque */
  485. 7: "torre dos Aventureiros",
  486. 8: "torre dos Pistoleiros ",
  487. 9: "torre dos soldados",
  488. 10: "torre dos Trabalhadores",
  489. 11: "Quartel ",
  490. 12: "Armazém",
  491. 13: "Quartel Geral ",
  492. 14: "Muro norte",
  493. 15: "Muro sul",
  494. 16: "Muro esquerdo",
  495. 17: "Muro direito",
  496. 18: "Portão",
  497. 19: "Bandeira",
  498. 20: "Dentro do forte"
  499. },
  500. "damage": "Concluído",
  501. "version": "versão",
  502. "changelist": "Lista de mudanças",
  503. // new in 1.40
  504. "update_available": "Kick-o-Matic update available",
  505. "update_question": "You can download the lastest version from userscripts.org. Visit the site?"
  506. },
  507. "sk_SK": {
  508. "success": "Hodnosti boli udelené!",
  509. "error": "Vyskytol sa problém",
  510. "cancel": "Zavrieť",
  511. "showPlayerOnMap": "Ukázať hráča na mape",
  512. "showTown": "Ukázať mesto",
  513. "nodata": "Informácie pre pevnosť sa nedali načítať",
  514. "getData": "Načítavanie informácií",
  515. "errorTimeout": "Načítavanie trvalo príliš dlho",
  516. "ascpt": "Povýšiť na kapitána",
  517. "asprivate": "Vymenovať za slobodníka",
  518. "asrecruit": "Vymenovať za nováčika",
  519. "asreservist": "Vymenovať za záložnika",
  520. "astraitor": "Označiť ako zradcu",
  521. "youcant": "Nemôžeš degradovať bojovníkov s rovnakou alebo vyššou hodnosťou.",
  522. "position": "Pozícia:",
  523. "pos_undefined": "nemá zadanú pozíciu",
  524. "noally": "Bez aliancie",
  525. "flag": "Vlajka",
  526. "inside": "V pevnosti",
  527. "classes": {
  528. "soldier": "Vojak",
  529. "duelist": "Duelant",
  530. "adventurer": "Dobrodruh",
  531. "worker": "Pracovník",
  532. "greenhorn": "Zelenáč"
  533. },
  534. "ranks": {
  535. "traitor": "Zradca",
  536. "reservist": "Záložník",
  537. "recruit": "Nováčik",
  538. "private_": "Slobodník",
  539. "captain": "Kapitán",
  540. "general": "Generál"
  541. },
  542. "sectors": {
  543. "undefined": "nemá zadanú pozíciu",
  544. 0: "Horný ľavý sektor",
  545. 1: "Stredný ľavý sektor",
  546. 2: "Spodný ľavý sektor",
  547. 3: "Spodný stredný sektor",
  548. 4: "Spodný pravý sektor",
  549. 5: "Stredný pravý sektor",
  550. 6: "Horný pravý sektor", /* útok */
  551. 7: "Veža dobrodruhov",
  552. 8: "Veža duelantov",
  553. 9: "Veža vojakov",
  554. 10: "Veža pracovníkov",
  555. 11: "Kasárne",
  556. 12: "Sklad",
  557. 13: "Hlavná budova",
  558. 14: "Severná hradba",
  559. 15: "Južná hradba",
  560. 16: "Západná hradba",
  561. 17: "Východná hradba",
  562. 18: "Brána",
  563. 19: "Vlajka",
  564. 20: "V pevnosti"
  565. },
  566. "damage": "poškodenie",
  567. "version": "verzia",
  568. "changelist": "Zmeny",
  569. // new in 1.40
  570. "update_available": "Kick-o-Matic update available",
  571. "update_question": "You can download the lastest version from userscripts.org. Visit the site?"
  572. },
  573. "pl_PL": {
  574. "success": "Ranga została zmieniona!",
  575. "error": "Wystąpił błąd",
  576. "cancel": "Anuluj",
  577. "showPlayerOnMap": "Pokaż gracza na mapie",
  578. "showTown": "Pokaż miasto",
  579. "nodata": "Nie można załadować danych fortu",
  580. "getData": "Pobieranie danych o rangach",
  581. "errorTimeout": "Zbyt długie ładowanie danych",
  582. "ascpt": "Awansuj na kapitana",
  583. "asprivate": "Mianowanie na rezerwistę",
  584. "asrecruit": "Mianowanie na rekruta",
  585. "asreservist": "Mianowanie na rezerwistę",
  586. "astraitor": "Nadaj zdrejcę",
  587. "youcant": "Nie można zmienić ragi, posiadasz niższą lub taką samą rangę.",
  588. "position": "Pozycja:",
  589. "pos_undefined": "Źle ustawiony",
  590. "noally": "Bez sojuszu",
  591. "flag": "Flaga",
  592. "inside": "W forcie",
  593. "classes": {
  594. "soldier": "Żołnierz",
  595. "duelist": "Zawadiaka",
  596. "adventurer": "Poszukiwacz",
  597. "worker": "Budowniczy",
  598. "greenhorn": "Nowicjusz"
  599. },
  600. "ranks": {
  601. "traitor": "Zdrajca",
  602. "reservist": "Rezerwista",
  603. "recruit": "Rekrut",
  604. "private_": "Szeregowiec",
  605. "captain": "Kapitan",
  606. "general": "Generał"
  607. },
  608. "sectors": {
  609. "undefined": "Źle ustawiony",
  610. 0: "Lewy górny - 7",
  611. 1: "Lewy dolny - 6",
  612. 2: "Dolny lewy - 5",
  613. 3: "Dolny środkowy - 4",
  614. 4: "Dolny Prawy - 3",
  615. 5: "Prawy dolny - 2",
  616. 6: "Prawy górny - 1", /* atak */
  617. 7: "Baszta poszukiwaczy",
  618. 8: "Baszta zawadiaków",
  619. 9: "Baszta żołnierzy",
  620. 10: "Baszta budowniczych",
  621. 11: "Koszary",
  622. 12: "Magazyn",
  623. 13: "Budynek główny",
  624. 14: "Górny mur",
  625. 15: "Dolny mur",
  626. 16: "Lewy mur",
  627. 17: "Prawy mur",
  628. 18: "Brama",
  629. 19: "Flaga",
  630. 20: "W środku fortu"
  631. },
  632. "damage": "obrażenia",
  633. "version": "wersja",
  634. "changelist": "Zmiany",
  635. // new in 1.40
  636. "update_available": "Kick-o-Matic - dostępna aktualizacja",
  637. "update_question": "Można pobrać najnowszą wersje ze strony userscripts.org. Wejść na stronę?"
  638. }
  639. };
  640. Grander.is_beta = window.location.href.match(/beta/);
  641. if (Grander.is_beta) {
  642. Grander.fortsCapacity = Grander.betaFortsCapacity;
  643. }
  644.  
  645. var lang = Grander.getLang();
  646. Grander.lang = Grander.langs[lang];
  647. Grander.sectors = Grander.langs[lang].sectors;
  648. // Названия алов
  649. Grander.allianceName = {};
  650. // ID фортов, в которых подсвечены клетки
  651. Grander.highlightedFortCells = {};
  652. // Размеры фортов
  653. Grander.fortSize = {};
  654. Grander.fortSizeLoading = {};
  655. // Координаты фортов
  656. Grander.fortCoordinates = {};
  657. Grander.fortCoordinatesLoading = {};
  658. // Где стоят игроки на форте (additionalinfo.idx)
  659. Grander.playersPosition = {};
  660. // Лычки игроков
  661. Grander.playerRank = {};
  662. // Более подробная информация об игроках, чем в чате
  663. Grander.playersData = {};
  664. Grander.playersDataLoading = {};
  665. // Список игроков, которым надо раздать лычки
  666. ChatWindow.Client.onClickOrigin = ChatWindow.Client.onClick;
  667. ChatWindow.Client.onClick = function(args, id) {
  668. if (args[0].target.className.indexOf('chat_servicegrade') !== 0) {
  669. ChatWindow.Client.onClickOrigin(args, id);
  670. }
  671. };
  672. // Grander.queue = {};
  673. };
  674. Grander.getLang = function() {
  675. return Grander.langs.hasOwnProperty(Grander.getLocale()) ? Game.locale : "en_US";
  676. };
  677. Grander.getLocale = function() {
  678. return Game.locale;
  679. };
  680. Grander.between = function(s, prefix, suffix) {
  681. var i = s.indexOf(prefix);
  682. if (i >= 0) {
  683. s = s.substring(i + prefix.length);
  684. } else {
  685. return '';
  686. }
  687. if (suffix) {
  688. i = s.indexOf(suffix);
  689. if (i >= 0) {
  690. s = s.substring(0, i);
  691. } else {
  692. return '';
  693. }
  694. }
  695. return s;
  696. };
  697. Grander.highlightFortCell = function(idx, fortId) {
  698. if (idx == null || idx == -1)
  699. return;
  700. var battlegroundEl = $('#fort_battle_' + fortId + '_battleground');
  701. var pos = $('.cell-' + idx).position();
  702. $('.battleground_marker', battlegroundEl).css(pos);
  703. Grander.highlightedFortCells[fortId] = true;
  704. };
  705. Grander.unhighlightFortCell = function(fortId) {
  706. var battlegroundEl = $('#fort_battle_' + fortId + '_battleground');
  707. var pos = {
  708. top: '',
  709. left: ''
  710. };
  711. $('.battleground_marker', battlegroundEl).css(pos);
  712. if (!Grander.highlightedFortCells[fortId])
  713. return;
  714. };
  715. Grander.isFortHighlighted = function(fortId) {
  716. return Grander.highlightedFortCells[fortId];
  717. };
  718. Grander.hidePopup = function() {
  719. Grander.mb.hide();
  720. for (var fortId in Grander.highlightedFortCells) {
  721. Grander.unhighlightFortCell(fortId);
  722. }
  723. };
  724. Grander.getAllianceName = function(id) {
  725. return Grander.allianceName.hasOwnProperty(id) ? Grander.allianceName[id] : null;
  726. };
  727. Grander.getAllianceId = function(name) {
  728. for (var id in Grander.allianceName) {
  729. if (Grander.allianceName[id] == name) {
  730. return id;
  731. }
  732. }
  733. return null;
  734. };
  735. Grander.obtainAllianceName = function(id) {
  736. Ajax.remoteCallMode(
  737. "alliance",
  738. "get_data",
  739. {alliance_id: id},
  740. function(result) {
  741. Grander.allianceName[id] = result.data.allianceName;
  742. }
  743. );
  744. };
  745. Grander.obtainAllianceId = function(name) {
  746. Grander.parseBbString(
  747. "[alliance]" + name + "[/alliance]",
  748. function(parsed) {
  749. var id = Grander.between(parsed, "open(", ")");
  750. Grander.allianceName[id] = name;
  751. }
  752. );
  753. };
  754. Grander.parseBbString = function(str, callback) {
  755. Ajax.remoteCall("settings", "get_parsed_text", {
  756. text: str
  757. }, function(resp) {
  758. callback.call(this, resp.parsed_text);
  759. });
  760. };
  761. Grander.pushChatSystemMessage = function(str) {
  762. Chat.pushSystemMessage(str);
  763. };
  764. Grander.updatePrivilege = function(fortId, westId, rank) {
  765. var list = {};
  766. list[westId] = rank;
  767. var data = {fort_id: fortId, privileges: list};
  768. Ajax.remoteCall('fort_battlepage', 'updatePrivileges', data, function(response) {
  769. if (response.hasOwnProperty("playerlist") && response.playerlist.length > 0) {
  770. new UserMessage(Grander.lang.success, {type: "success"}).show();
  771. }
  772. Grander.setPlayerRank(fortId, westId, rank);
  773. Grander.hidePopup();
  774. });
  775. };
  776. Grander.makeRankRow = function(rank, westId, fortId) {
  777. var rankList = {"-2": "traitor", "-1": "reservist", "0": "recruit", "1": "private", "2": "captain", "3": "general"};
  778. var rankTranslation = {
  779. "-2": Grander.lang.ranks.traitor,
  780. "-1": Grander.lang.ranks.reservist,
  781. "0": Grander.lang.ranks.recruit,
  782. "1": Grander.lang.ranks.private_,
  783. "2": Grander.lang.ranks.captain,
  784. "3": Grander.lang.ranks.general
  785. };
  786. var rankText = {
  787. "-2": Grander.lang.astraitor,
  788. "-1": Grander.lang.asreservist,
  789. "0": Grander.lang.asrecruit,
  790. "1": Grander.lang.asprivate,
  791. "2": Grander.lang.ascpt,
  792. "3": Grander.lang.ranks.general
  793. };
  794. function rankLink(image, fortId, westId, rank) {
  795. var a = $("<a/>");
  796. a.attr("onclick", "Grander.updatePrivilege(" + fortId + ", " + westId + ", " + rank + ");");
  797. a.append(image);
  798. a.append(rankText[rank] || rank);
  799. return a;
  800. }
  801. function rankImage(rank) {
  802. var img = $("<img/>");
  803. img.attr("src", '/images/chat/servicegrade_' + (rankList[rank] || rank) + '.png');
  804. img.attr("title", '<strong>' + (rankTranslation[rank] || rank) + '</strong>');
  805. return img;
  806. }
  807.  
  808. return rankLink(rankImage(rank), fortId, westId, rank);
  809. };
  810. Grander.makeRankUpdateHtml = function(myRank, playerRank, westId, fortId) {
  811. var span = $("<span/>");
  812. var div = $("<div/>");
  813. function appendError(text) {
  814. var d = $("<div/>");
  815. // d.css("width", "200px");
  816. d.css("padding", "4px");
  817. d.css("text-align", "center");
  818. d.html(text);
  819. span.append(d);
  820. }
  821.  
  822. if (myRank >= 2 && playerRank < myRank) {
  823. var fromRank = myRank == 3 ? 2 : 1;
  824. for (var rank = fromRank; rank >= -2; rank--) {
  825. if (rank == playerRank)
  826. continue;
  827. var row = Grander.makeRankRow(rank, westId, fortId);
  828. div.append(row);
  829. div.append($("<br/>"));
  830. }
  831. } else {
  832. appendError(Grander.lang.youcant)
  833. }
  834.  
  835. span.append(div);
  836. return span;
  837. };
  838. Grander.getPlayerAdditionalInfo = function(westId) {
  839. return Grander.playersData.hasOwnProperty(westId) ? Grander.playersData[westId] : null;
  840. };
  841. Grander.getPlayerFortPosition = function(fortId, westId) {
  842. if (!Grander.playersPosition.hasOwnProperty(fortId))
  843. return;
  844. return Grander.playersPosition[fortId].hasOwnProperty(westId) ? Grander.playersPosition[fortId][westId] : null;
  845. };
  846. Grander.setPlayerFortPosition = function(fortId, westId, pos) {
  847. if (!Grander.playersPosition.hasOwnProperty(fortId)) {
  848. Grander.playersPosition[fortId] = {};
  849. }
  850. Grander.playersPosition[fortId][westId] = pos;
  851. };
  852. Grander.makeSmallTitle = function(playerName, westId, playerX, playerY) {
  853. var span = $("<span/>");
  854. span.attr("onclick", "PlayerProfileWindow.open(" + westId + ")");
  855. span.html(playerName);
  856. var a = $("<a/>");
  857. a.attr("onclick", "Map.center(" + playerX + ", " + playerY + ")");
  858. a.attr("title", Grander.lang.showPlayerOnMap);
  859. a.css("width", "15px");
  860. a.css("height", "15px");
  861. a.css("display", "inline-block");
  862. a.css("background", "url(/images/tw2gui/window/window2_title_divider.jpg) no-repeat");
  863. span.append("&nbsp;");
  864. span.append(a);
  865. return span;
  866. };
  867. Grander.getPlayerRank = function(fortId, westId) {
  868. if (!Grander.playerRank.hasOwnProperty(fortId) || !Grander.playerRank[fortId].hasOwnProperty(westId)) {
  869. return null;
  870. }
  871. return Grander.playerRank[fortId][westId];
  872. };
  873. Grander.getFortRanks = function(fortId) {
  874. return Grander.playerRank.hasOwnProperty(fortId) ? Grander.playerRank[fortId] : null;
  875. };
  876. Grander.setPlayerRank = function(fortId, westId, rank) {
  877. if (!Grander.playerRank.hasOwnProperty(fortId)) {
  878. Grander.playerRank[fortId] = {};
  879. }
  880. Grander.playerRank[fortId][westId] = rank;
  881. };
  882. Grander.smallPopUp = function(e) {
  883. try {
  884. Grander.checkEnemies();
  885. if (Grander.loading)
  886. return;
  887. Grander.loading = true;
  888. var x = e.clientX || 500;
  889. var y = e.clientY || 500;
  890. var westId = Grander.westId;
  891. var r, rooms = Chat.Resource.Manager.getRooms();
  892. for (r in rooms) {
  893. var room = Chat.Resource.Manager.getRoom(r);
  894. if (!(room instanceof Chat.Resource.RoomFortBattle) || room.id != Grander.fortRoom) {
  895. continue;
  896. }
  897.  
  898. var fortId = room.fortId;
  899. var playerRank = Grander.getPlayerRank(fortId, westId);
  900. var myId = Chat.MyId.match(/[0-9]+/);
  901. var myRank = Grander.getPlayerRank(fortId, myId);
  902. var playerInfo = Grander.getPlayerAdditionalInfo(westId);
  903. var playerName = playerInfo.name;
  904. var playerX = playerInfo.coords.x;
  905. var playerY = playerInfo.coords.y;
  906. var title = Grander.makeSmallTitle(playerName, westId, playerX, playerY);
  907. Grander.mb = new west.gui.Dialog(title.outerHTML()).addButton(Grander.lang.cancel).setId('GranderPopUp').setModal(true, true);
  908. Grander.mb.setText(Grander.makeRankUpdateHtml(myRank, playerRank, westId, fortId)).setX(x).setY(y - 50).show();
  909. break;
  910. }
  911. Grander.loading = false;
  912. } catch (e) {
  913. Grander.loading = false;
  914. alert(Grander.lang.error + e);
  915. Grander.consoleError(e);
  916. }
  917. };
  918. Grander.makePopupHtml = function(fortId, fortX, fortY, fortName, defense,
  919. distanceImage, playerPositionName, rankHtml,
  920. weaponName, weaponMinDamage, weaponMaxDamage, weaponOkImage,
  921. currentHp, maxHp,
  922. townName, townId, townRights,
  923. playerClass) {
  924. var capacityDiv = Grander.makeCapacityDiv(fortId, defense);
  925. var fillPx = Math.floor(currentHp / maxHp * 194);
  926. return '\
  927. <div class="txcenter">\
  928. <div style="background:url(http://s18.postimage.org/xmndhv7vd/health_bar.png) right top; width: 210px;height:14px;display:inline-block;padding:2px;margin:0;font-size:8pt; text-align:left;">\
  929. <div style="background: url(&quot;images/character_bars/filler.png&quot;) repeat scroll 0% 0% transparent; width: ' + fillPx + 'px; height: 14px; padding: 0pt; margin: 0pt; position: absolute;" id="recruit_healthbar">\
  930. </div>\
  931. <div id="recruit_health" style="position:absolute; color:white;width: 194px;text-align:center">' + currentHp + '/' + maxHp + '</div>\
  932. </div>\
  933. <br>\
  934. <div>' + weaponName + ' ( ' + weaponMinDamage + ' - ' + weaponMaxDamage + ') \
  935. </div>\
  936. <span style = "font-size:16px; text-align: center;" > \
  937. <div style = "display:inline-block;" > <img src="http://westru.innogamescdn.com/images/class_choose/class_' + playerClass + '.png">\
  938. <a style = "display:inline;padding:0;" class = "profile_link_town_overview" title = "' + Grander.lang.showTown + '" href = "#" > ' + townName + ' </a>\
  939. </span>\
  940. <br > \
  941. </div>\
  942. <br > \
  943. <a href = "javascript:void(FortWindow.open(' + fortId + ', ' + fortX + ', ' + fortY + '))" > \
  944. ' + distanceImage.outerHTML() + ' &nbsp; ' + fortName + '\
  945. <p > \
  946. ' + capacityDiv + '\
  947. </p>\
  948. <p > </p>\
  949. </a>\
  950. <p > \
  951. <a href = "#" > ' + Grander.lang.position + ' ' + playerPositionName + ' </a>\
  952. </p>\
  953. <img src = "../images/fort/battle/divider.png" > \
  954. <br > ' + rankHtml.outerHTML() + ' <br > \
  955. </div>';
  956. };
  957. Grander.makeDistanceImage = function(fortX, fortY, playerX, playerY) {
  958. var diffX = fortX - playerX;
  959. var diffY = fortY - playerY;
  960. var image = $("<img/>");
  961. if (!diffX && !diffY) {
  962. image.attr("src", '/images/town/cityhall/green.png');
  963. } else if (Math.abs(diffX) <= 50 && Math.abs(diffY) <= 50) {
  964. image.attr("src", '/images/town/cityhall/yellow.png');
  965. } else {
  966. image.attr("src", '/images/town/cityhall/red.png');
  967. }
  968.  
  969. return image;
  970. };
  971. Grander.popUp = function(e) {
  972. try {
  973. Grander.checkEnemies();
  974. if (Grander.loading)
  975. return;
  976. Grander.loading = true;
  977. var x = e.clientX || 500;
  978. var y = e.clientY || 500;
  979. var westId = Grander.westId;
  980. var r, rooms = Chat.Resource.Manager.getRooms();
  981. for (r in rooms) {
  982. var room = Chat.Resource.Manager.getRoom(r);
  983. if (!(room instanceof Chat.Resource.RoomFortBattle) || room.id != Grander.fortRoom) {
  984. continue;
  985. }
  986.  
  987. var fortId = room.fortId;
  988. var fortName = room.title;
  989. var fortCoords = Grander.getFortCoordinates(fortId);
  990. var fortSize = Grander.getFortSize(fortId);
  991. var defense = (room.id.indexOf("def") != -1);
  992. var playerRank = Grander.getPlayerRank(fortId, westId);
  993. var myId = Chat.MyId.match(/[0-9]+/);
  994. var myRank = Grander.getPlayerRank(fortId, myId);
  995. var playerInfo = Grander.getPlayerAdditionalInfo(westId);
  996. var playerName = playerInfo.name;
  997. var playerLevel = playerInfo.level;
  998. var playerX = playerInfo.coords.x;
  999. var playerY = playerInfo.coords.y;
  1000. var playerPos = Grander.getPlayerFortPosition(fortId, westId);
  1001. var playerClass = playerInfo.class;
  1002. var currentHp = playerInfo.currhealth;
  1003. var maxHp = playerInfo.maxhealth;
  1004. // TODO: where is player ally id?!
  1005. var playerAllianceId = 1;
  1006. if ($('.fortbattle-' + fortId).length) {
  1007. Grander.highlightFortCell(playerPos, fortId);
  1008. }
  1009.  
  1010. var positionName;
  1011. if (playerPos == null || playerPos == -1) {
  1012. positionName = Grander.sectors["undefined"];
  1013. } else if (defense) {
  1014. positionName = Grander.sectors[Grander.coords[fortSize][playerPos]];
  1015. if (playerPos == -1) {
  1016. positionName = Grander.sectors["undefined"];
  1017. } else if (positionName == undefined) {
  1018. positionName = Grander.lang.inside;
  1019. }
  1020. } else {
  1021. positionName = Grander.sectors[Grander.coords.attack[playerPos]];
  1022. if (positionName == undefined) {
  1023. positionName = Grander.lang.inside;
  1024. }
  1025. }
  1026.  
  1027. var weaponMinDamage = playerInfo['weapon_damage']['min'];
  1028. var weaponMaxDamage = playerInfo['weapon_damage']['max'];
  1029. var weaponName = playerInfo['weapon'];
  1030. // var weaponImage = Grander.getWeaponImage(weaponName);
  1031. var weaponOkImage = Grander.checkWeapon(weaponMinDamage, weaponMaxDamage, playerClass == "soldier", playerLevel);
  1032. var townId = playerInfo['town_id'];
  1033. var townRights;
  1034. var town = playerInfo['townname'];
  1035. switch (playerInfo['town_rights']) {
  1036. case 1:
  1037. townRights = "norights";
  1038. break;
  1039. case 2:
  1040. townRights = "councillor";
  1041. break;
  1042. case 3:
  1043. townRights = "founder";
  1044. break;
  1045. default:
  1046. townRights = "norights";
  1047. break;
  1048. }
  1049.  
  1050. var distanceImage = Grander.makeDistanceImage(fortCoords.x, fortCoords.y, playerX, playerY);
  1051. var rankHtml = Grander.makeRankUpdateHtml(myRank, playerRank, westId, fortId);
  1052. var text = Grander.makePopupHtml(fortId, fortCoords.x, fortCoords.y, fortName, defense, distanceImage, positionName, rankHtml,
  1053. weaponName, weaponMinDamage, weaponMaxDamage, weaponOkImage,
  1054. currentHp, maxHp,
  1055. town, townId, townRights, playerClass);
  1056. var title = Grander.makeSmallTitle(playerName, westId, playerX, playerY);
  1057. Grander.mb = new west.gui.Dialog(title.outerHTML(), text).addButton(Grander.lang.cancel).setId('GranderPopUp').setModal(true, true).setX(x).setY(y - 50);
  1058. Grander.mb.modalframe.mousedown(function() {
  1059. Grander.hidePopup();
  1060. });
  1061. Grander.mb.show();
  1062. $("#GranderPopUp").css("min-width", "0");
  1063. $("#GranderPopUp .messagedialog_content").css("padding-bottom", "5px");
  1064. break;
  1065. }
  1066.  
  1067. Grander.loading = false;
  1068. } catch (e) {
  1069. console.log(e.stack);
  1070. Grander.loading = false;
  1071. alert(Grander.lang.cancel + e);
  1072. }
  1073. };
  1074. Grander.getWeapons = function() {
  1075. if (Grander.weapons.length > 0)
  1076. return;
  1077. var itemId = 100,
  1078. result = {};
  1079. while (result != null) {
  1080. result = ItemManager.get(itemId++);
  1081. Grander.weapons.push(result);
  1082. }
  1083. };
  1084. Grander.getWeaponImage = function(weaponName) {
  1085. Grander.getWeapons();
  1086. for (var itemId in Grander.weapons) {
  1087. var w = Grander.weapons[itemId];
  1088. if (weaponName == w.name) {
  1089. return w.image;
  1090. }
  1091. }
  1092. };
  1093. Grander.getFortSize = function(fortId) {
  1094. return Grander.fortSize.hasOwnProperty(fortId) ? Grander.fortSize[fortId] : null;
  1095. };
  1096. Grander.obtainFortSize = function(x, y) {
  1097. if (Grander.fortSizeLoading.hasOwnProperty(x + "" + y) && Grander.fortSizeLoading[x + "" + y] == true)
  1098. return;
  1099. Grander.fortSizeLoading[x + "" + y] = true;
  1100. if (x == undefined || y == undefined) {
  1101. console.log("x or y is undefined");
  1102. return;
  1103. }
  1104.  
  1105. Ajax.remoteCallMode("fort", "display", {x: x, y: y}, function(data) {
  1106. Grander.fortSize[data.data.fortid] = data.data.type;
  1107. Grander.fortSizeLoading[x + "" + y] = false;
  1108. });
  1109. };
  1110. Grander.getFortCoordinates = function(fortId) {
  1111. return Grander.fortCoordinates.hasOwnProperty(fortId) ? Grander.fortCoordinates[fortId] : null;
  1112. };
  1113. Grander.obtainFortCoordinates = function(fortId) {
  1114. if (Grander.fortCoordinatesLoading.hasOwnProperty(fortId) && Grander.fortCoordinatesLoading[fortId] == true)
  1115. return;
  1116. Grander.fortCoordinatesLoading[fortId] = true;
  1117. // console.log("fortId: " + fortId);
  1118.  
  1119. Ajax.remoteCallMode('fort_building_headquarter', 'index', {fort_id: fortId}, function(data) {
  1120. Grander.fortCoordinates[fortId] = {
  1121. "x": data.x,
  1122. "y": data.y
  1123. };
  1124. Grander.fortCoordinatesLoading[fortId] = false;
  1125. });
  1126. };
  1127. Grander.getPlayersData = function() {
  1128. return Grander.playersData;
  1129. };
  1130. Grander.obtainPlayersData = function(fortId) {
  1131. if (Grander.playersDataLoading.hasOwnProperty(fortId) && Grander.playersDataLoading[fortId] == true)
  1132. return;
  1133. Grander.playersDataLoading[fortId] = true;
  1134. Ajax.remoteCall('fort_battlepage&fort_id=' + fortId, '', {}, function(data) {
  1135. var playerList = data.playerlist;
  1136. for (i in playerList) {
  1137. Grander.playersData[playerList[i].player_id] = playerList[i];
  1138. Grander.setPlayerRank(fortId, playerList[i].player_id, playerList[i].privilege);
  1139. Grander.setPlayerFortPosition(fortId, playerList[i].player_id, playerList[i].idx);
  1140. }
  1141. Grander.playersDataLoading[fortId] = false;
  1142. });
  1143. };
  1144. Grander.interval = function() {
  1145. Grander.bindClickFunctions();
  1146. try {
  1147. var r,
  1148. room,
  1149. rooms = Chat.Resource.Manager.getRooms();
  1150. for (r in rooms) {
  1151. room = Chat.Resource.Manager.getRoom(r);
  1152. if (!room.hasOwnProperty("room") || room.room != "fortbattle") {
  1153. continue;
  1154. }
  1155.  
  1156. var fortId = room.fortId;
  1157. if (Grander.getFortSize(fortId) == null) {
  1158. if (Grander.getFortCoordinates(fortId) == null) {
  1159. Grander.obtainFortCoordinates(fortId);
  1160. } else {
  1161. var coords = Grander.getFortCoordinates(fortId);
  1162. Grander.obtainFortSize(coords.x, coords.y);
  1163. }
  1164. }
  1165. }
  1166. } catch (e) {
  1167. console.log(e.stack);
  1168. }
  1169. };
  1170. Grander.dataInterval = function() {
  1171. var r,
  1172. room,
  1173. rooms = Chat.Resource.Manager.getRooms();
  1174. for (r in rooms) {
  1175. room = Chat.Resource.Manager.getRoom(r);
  1176. if (!room.hasOwnProperty("room") || room.room != "fortbattle") {
  1177. continue;
  1178. }
  1179.  
  1180. var fortId = room.fortId;
  1181. Grander.obtainPlayersData(fortId);
  1182. }
  1183. };
  1184. Grander.bindClickFunctions = function() {
  1185. var fContacts = function(e) {
  1186. Grander.westId = $(this).parent().attr('class').match(/[0-9]+/);
  1187. var lastElement = $(this);
  1188. for (var i = 0; i < 10; i++) {
  1189. lastElement = lastElement.parent();
  1190. }
  1191. var room = lastElement.attr('class').match(/(room_fortbattle_(att|def)_[0-9]+)/);
  1192. Grander.fortRoom = room[1];
  1193. if (e.ctrlKey) {
  1194. Grander.smallPopUp(e);
  1195. } else {
  1196. Grander.popUp(e);
  1197. }
  1198. };
  1199. var fMessages = function(e) {
  1200. Grander.westId = $(this).parent().attr("class").match(/[0-9]+/);
  1201. var lastElement = $(this);
  1202. for (var i = 0; i < 12; i++) {
  1203. lastElement = lastElement.parent();
  1204. }
  1205. var room = lastElement.attr('class').match(/(room_fortbattle_(att|def)_[0-9]+)/);
  1206. Grander.fortRoom = room[1];
  1207. if (e.ctrlKey) {
  1208. Grander.smallPopUp(e);
  1209. } else {
  1210. Grander.popUp(e);
  1211. }
  1212. };
  1213. var classes = ["chat_servicegrade_general", "chat_servicegrade_captain", "chat_servicegrade_private",
  1214. "chat_servicegrade_recruit", "chat_servicegrade_reservist", "chat_servicegrade_traitor"];
  1215. $.each(classes, function(k, v) {
  1216. $(".chat_contacts ." + v).unbind('click');
  1217. $(".chat_contacts ." + v).bind('click', fContacts);
  1218. $(".chat_messages ." + v).unbind('click');
  1219. $(".chat_messages ." + v).bind('click', fMessages);
  1220. });
  1221. };
  1222. Grander.findWeapon = function(min, max, level) {
  1223. var result = -1;
  1224. for (var i in Grander.weapons) {
  1225. if (Grander.weapons[i]["min"] == min && Grander.weapons[i]["max"] == max && Grander.weapons[i]["level"] <= level) {
  1226. result = i;
  1227. break;
  1228. }
  1229. }
  1230. return result;
  1231. };
  1232. Grander.checkWeapon = function(min, max, soldier, level) {
  1233. var avg = (min + max) / 2;
  1234. level -= (soldier ? 3 : 0);
  1235. Grander.getWeapons();
  1236. for (var itemId in Grander.weapons) {
  1237. var w = Grander.weapons[itemId];
  1238. if (w.level <= level && w.traderlevel <= 15) {
  1239. var weaponDamage = (w.damage.damage_max + w.damage.damage_min) / 2;
  1240. if (weaponDamage <= avg) {
  1241. return "positive";
  1242. } else {
  1243. return "negative";
  1244. }
  1245. }
  1246. }
  1247. return "positive";
  1248. };
  1249. Grander.checkUpdate = function() {
  1250. var url = Grander.checkFileUrl;
  1251. url += "?name=" + Character.name;
  1252. url += "&world=" + location.href;
  1253. url += "&callback=?";
  1254. $.getScript(url);
  1255. };
  1256. Grander.compareVersions = function(actualVersion) {
  1257. if (parseFloat(Grander.version) >= parseFloat(actualVersion))
  1258. return;
  1259. try {
  1260. new west.gui.Dialog(Grander.lang.update_available, "", west.gui.Dialog.SYS_WARNING)
  1261. .setText(Grander.lang.update_question)
  1262. .addButton("OK", function() {
  1263. window.open(Grander.scriptSite, '_blank');
  1264. })
  1265. .addButton("cancel")
  1266. .show();
  1267. } catch (e) {
  1268. window.open(Grander.SCRIPT_SITE, '_blank');
  1269. }
  1270. };
  1271. Grander.makeCapacityDiv = function(fortId, defense) {
  1272. var ranks = [1, 2, 3];
  1273. var fortCapacity = Grander.fortsCapacity[Grander.fortSize[fortId]][(defense ? 1 : 0)];
  1274. var count = Grander.countPlayersWithRanks(fortId, ranks);
  1275. var color;
  1276. if (count < fortCapacity) {
  1277. color = "green";
  1278. } else if (count == fortCapacity) {
  1279. color = "yellow";
  1280. } else {
  1281. color = "red";
  1282. }
  1283. return '<span>\
  1284. <span style="color:' + color + ';" id="fortCapacity' + fortId + '">' + count + '/' + fortCapacity + '</span>\
  1285. <p></p>\
  1286. </span>';
  1287. };
  1288. Grander.countPlayersWithRanks = function(fortId, ranks) {
  1289. function isArray(a) {
  1290. return (typeof a == "object") && (a instanceof Array);
  1291. }
  1292. if (!(isArray(ranks))) {
  1293. ranks = [ranks];
  1294. }
  1295.  
  1296. var result = 0;
  1297. var fortRanks = Grander.getFortRanks(fortId);
  1298. if (ranks == null) {
  1299. return 0;
  1300. }
  1301. for (var westId in fortRanks) {
  1302. if (ranks.indexOf(fortRanks[westId]) != -1) {
  1303. result++;
  1304. }
  1305. }
  1306. return result;
  1307. };
  1308. Grander.thatWouldntHappendIfZetWasStillWorkingOnTheWest = function() {
  1309. Chat.Resource.RoomFactory = function(data) {
  1310. var room = null;
  1311. if (data instanceof Chat.Resource.Client) {
  1312. room = new Chat.Resource.RoomClient(data);
  1313. } else {
  1314. switch (data.room) {
  1315. case "town":
  1316. room = new Chat.Resource.RoomTown(data.townid, data.x, data.y);
  1317. break;
  1318. case "general":
  1319. room = new Chat.Resource.RoomGeneral(data.general_id);
  1320. break;
  1321. case "maneuver":
  1322. room = new Chat.Resource.RoomManeuver(data.fortid, data.xy);
  1323. break;
  1324. case "fortbattle":
  1325. room = new Chat.Resource.RoomFortBattle(data.fortid);
  1326. break;
  1327. default:
  1328. room = new Chat.Resource.Room();
  1329. }
  1330. }
  1331. room.init();
  1332. return room;
  1333. };
  1334. };
  1335. $.fn.outerHTML = function() {
  1336. return $('<div />').append(this.eq(0).clone()).html();
  1337. };
  1338. // Grander.checkUpdate();
  1339. Grander.init();
  1340. Grander.intro();
  1341. Grander.interval();
  1342. Grander.dataInterval();
  1343. Grander.thatWouldntHappendIfZetWasStillWorkingOnTheWest();
  1344. setInterval(Grander.interval, 1000);
  1345. setInterval(Grander.dataInterval, 10000);
  1346. });

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址