Ikariam Imperator

Overview tables for Ikariam 0.5.0+ desktop versions in the style of Ikariam Empire Board or Ikariam ExMachina. Rule your empire with ease!

  1. // ==UserScript==
  2. // @name Ikariam Imperator
  3. // @namespace aubergineanodyne
  4. // @description Overview tables for Ikariam 0.5.0+ desktop versions in the style of Ikariam Empire Board or Ikariam ExMachina. Rule your empire with ease!
  5. // @author AubergineAnodyne (Turkish translation edit by tuncayerguden)
  6. //
  7. // @grant GM_getValue
  8. // @grant GM_setValue
  9. // @grant GM_addStyle
  10. // @grant GM_xmlhttpRequest
  11. // @include http://s*.*.ikariam.*/*
  12. // @include http://s*.ikariam.gameforge.com/*
  13. // @require http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js
  14. // @require https://greasyfork.org/scripts/3622-ikariam-developer-tools-v0-5-0/code/Ikariam Developer Tools V050+.user.js
  15. //
  16. // @version 0.29
  17. //
  18. // @history 0.29 Added new ikariam domain url. (ikariam.gameforge.com)
  19. // @history 0.28 Added Turkish translation (by tuncayerguden).
  20. // @history 0.27 Fixed pillage of crystal not showing up.
  21. // @history 0.26 Fixed colonization init-for-pirating implementation.
  22. // @history 0.26 Fixed display of garrison table headers in Chrome.
  23. // @history 0.25 Added espionage overview (FarmList reimplementation).
  24. // @history 0.25 Removed "upgrade hover box" that shows only time for buildings that have already reached their max level.
  25. // @history 0.25 Added option to initialize colonization missions for pirate raiding.
  26. // @history 0.24 Added option to prevent destruction of non-mobile colonies (any town with a palace or governors residence).
  27. // @history 0.24 Added option to show owner name next to city name on city view.
  28. // @history 0.24 Added prompt to have script completely demolish building when downgrading by one level.
  29. // @history 0.24 Added Hungarian translation (by Toroco).
  30. // @history 0.24 Updated for Ikariam changes in 5.3.2.
  31. // @history 0.23 Added support for Pirate Fortress (v0.5.3 new building).
  32. // @history 0.23 Added Spanish translation (by Rada974).
  33. // @history 0.23 Added French translation (by HéliOGraph).
  34. // @history 0.22 Added debug setting to reset all data to default.
  35. // @history 0.22 Fixed column separators on military overview table (misaligned by 1).
  36. // @history 0.22 Fixed labels on links to barracks and shipyard in military overview table.
  37. // @history 0.22 Changed building tooltip to show costs for next level when upgrading.
  38. // @history 0.21 Updated German translation (from Cherry).
  39. // @history 0.21 Fixed a bug preventing mine links from working.
  40. // @history 0.20 Updated Polish translation (from pitmm).
  41. // @history 0.20 Added Bosnian translation (from Scavenger).
  42. // @history 0.20 Added debug panel.
  43. // @history 0.19 Made a couple tweaks to alert functionality for Chrome.
  44. // @history 0.18 Added desktop alert functionality for building upgrades and transport/deploy army,navy/pillage missions.
  45. // @history 0.17 Added quick loading buttons for transports and donations (basically the x500 payloads script).
  46. // @history 0.17 Updated German translation.
  47. // @history 0.17 Added Polish translation (by pitmm).
  48. // @history 0.17 Fixed a bug that incoming trade/pillage mission resources did not show up in overview.
  49. // @history 0.16 Switched to new version of dependent scripts.
  50. // @history 0.15 Fixed translation of settings not being applied.
  51. // @history 0.15 Updated German translation.
  52. // @history 0.14 Reworked impelentation of auto daily bonus form submit for Chrome.
  53. // @history 0.13 Fix for Chrome (hopefully).
  54. // @history 0.12 Added support for localization (and German translation from Cherry).
  55. // @history 0.12 Added option to automatically submit daily bonus form.
  56. // @history 0.12 Added features to hide various minor parts of the interface (chat, friends list, facebook button, ads).
  57. // @history 0.12 Show loading pillage missions in incoming transport.
  58. // @history 0.11 Small tweak to work with TamperMonkey in Google Chrome.
  59. // @history 0.10 Initial version.
  60. // ==/UserScript==
  61.  
  62. $.extend(String.prototype, {
  63. format: function() {
  64. var pattern = /%s/g
  65. return function format() {
  66. var args = arguments;
  67. var itemIndex = 0;
  68. var str = this.replace(pattern, function replacer(match, key) {
  69. return args[itemIndex++];
  70. });
  71. return str;
  72. }
  73. }(),
  74. format2: function() {
  75. var pattern = /%{([a-zA-Z_0-9]+)}/g
  76. return function format2(args) {
  77. var str = this.replace(pattern, function replacer(match, key) {
  78. return args[key];
  79. });
  80. return str;
  81. }
  82. }(),
  83. });
  84.  
  85. var Imperator = function Imperator() {
  86. var localizations = {
  87. en: {
  88. misc: {
  89. resource_overview: 'Resource Overview',
  90. buildings_overview: 'Buildings Overview',
  91. military_overview: 'Military Overview',
  92. espionage_overview: 'Espionage Overview',
  93. upkeep: "Upkeep",
  94. growth: "Growth",
  95. trade_good: "Trade Good",
  96. city_name: "City",
  97. action_points: "Action Points",
  98. actions: "Actions",
  99. research: "Research",
  100. building_spots: "Building Spots",
  101.  
  102. constructing: "Constructing",
  103. summary: "Summary:",
  104. population: "Population",
  105. population_growth: "Growth",
  106. resources: 'Resources',
  107. buildings: 'Buildings',
  108. military: 'Military',
  109. espionage: 'Espionage',
  110. resource_overview: 'Resources Overview',
  111. buildings_overview: 'Buildings Overview',
  112. military_overview: 'Military Overview',
  113. resource_cost: 'Cost',
  114. next_level_cost: 'Next Level Cost',
  115. missing: 'Missing',
  116. full: 'Full',
  117. time_to_full: 'To Full',
  118. time_to_empty: 'To Empty',
  119. maximum_capacity: 'Capacity',
  120. safe_capacity: 'Safe',
  121. employed: 'Employed',
  122. satisfaction: 'Satisfaction',
  123. tavern_wine_serving_level: 'Tavern Level',
  124. cultural_goods: 'Cultural Goods',
  125. units: 'Units',
  126. training: 'Training',
  127. deploying: 'Deploying',
  128. plundering: 'Plundering',
  129. in_transit: 'Transporting',
  130. none: 'None',
  131. },
  132. tweaks: {
  133. transport_minus_500: '-',
  134. transport_plus_500: '+500',
  135. transport_plus_1000: '+1k',
  136. transport_plus_5000: '+5k',
  137. transport_minus_500_text: 'Remove 500 goods',
  138. transport_plus_500_text: 'Add 500 goods',
  139. transport_plus_1000_text: 'Add 1000 goods',
  140. transport_plus_5000_text: 'Add 5000 goods',
  141. donate_plus_1000: '+1k',
  142. donate_plus_10000: '+10k',
  143. donate_plus_100000: '+100k',
  144. donate_plus_1000_text: 'Add 1000 wood to donation',
  145. donate_plus_10000_text: 'Add 10000 wood to donation',
  146. donate_plus_100000_text: 'Add 100000 wood to donation',
  147. completely_demolish_building_prompt: 'Do you want to completely demolish this building?',
  148. destroy_non_mobile_colony_prompt:
  149. 'Demolition of non-mobile colony blocked by "Ikariam Imperator"! If you really ' +
  150. 'want to demolish this town, first turn off the protection option in ' +
  151. '"Ikariam Imperator" options.',
  152. },
  153. actions: {
  154. deploy_army: 'Deploy Army',
  155. deploy_navy: 'Deploy Navy',
  156. transport_goods: 'Transport Goods',
  157. to_town_hall: 'To Town Hall',
  158. to_city_view: 'View City',
  159. to_island_view: 'View Island',
  160. to_barracks: 'To Barracks',
  161. to_shipyard: 'To Shipyard',
  162. spy_mission: 'Spy Mission',
  163. blockade: 'Blockade',
  164. pillage: 'Pillage',
  165. occupy: 'Occupy',
  166. send_spy: 'Send Spy',
  167. view_high_score: 'View Score',
  168. view_alliance_page: 'View Alliance Page',
  169. },
  170. resources: {
  171. wood: 'Wood',
  172. wine: 'Wine',
  173. marble: 'Marble',
  174. glass: 'Crystal',
  175. sulfur: 'Sulfur',
  176. },
  177. buildings: {
  178. townHall: 'Town Hall',
  179. palace: 'Palace',
  180. palaceColony: 'Governor\'s Residence',
  181. tavern: 'Tavern',
  182. museum: 'Museum',
  183. academy: 'Academy',
  184. workshop: 'Workshop',
  185. temple: 'Temple',
  186. embassy: 'Embassy',
  187. warehouse: 'Warehouse',
  188. dump: 'Dump',
  189. port: 'Trading Port',
  190. branchOffice: 'Trading Post',
  191. wall: 'Wall',
  192. safehouse: 'Hideout',
  193. barracks: 'Barracks',
  194. shipyard: 'Shipyard',
  195. pirateFortress: 'Pirate Fortress',
  196. forester: 'Forester',
  197. carpentering: 'Carpenter',
  198. winegrower: 'Winegrower',
  199. vineyard: 'Wine Press',
  200. stonemason: 'Stonemason',
  201. architect: 'Architect',
  202. glassblowing: 'Glassblower',
  203. optician: 'Optician',
  204. alchemist: 'Alchemist\'s Tower',
  205. fireworker: 'Firework Test Area',
  206. },
  207. units: {
  208. phalanx: 'Hoplite',
  209. steamgiant: 'Steam Giant',
  210. spearman: 'Spearman',
  211. swordsman: 'Swordsman',
  212. slinger: 'Slinger',
  213. archer: 'Archer',
  214. marksman: 'Sulphur Carabineer',
  215. ram: 'Ram',
  216. catapult: 'Catapult',
  217. mortar: 'Mortar',
  218. gyrocopter: 'Gyrocopter',
  219. bombardier: 'Balloon-Bombadier',
  220. cook: 'Cook',
  221. medic: 'Doctor',
  222. ship_ram: 'Ram Ship',
  223. ship_flamethrower: 'Fire Ship',
  224. ship_steamboat: 'Steam Ram',
  225. ship_ballista: 'Ballista Ship',
  226. ship_catapult: 'Catapult Ship',
  227. ship_mortar: 'Mortar Ship',
  228. ship_submarine: 'Diving Boat',
  229. ship_paddlespeedship: 'Paddle Speedboat',
  230. ship_ballooncarrier: 'Balloon Carrier',
  231. ship_tender: 'Tender',
  232. ship_rocketship: 'Rocker Ship',
  233. },
  234. alerts: {
  235. building_upgrade_complete: 'Building upgrade complete',
  236. building_upgrade_complete_text: '%{building} in %{city} upgraded to level %{level}',
  237. mission_update: 'Mission update',
  238. loading: '%{type} has finished loading in %{city}',
  239. en_route: '%{type} has arrived in %{city}',
  240. returning: '%{type} has returned to %{city}',
  241. deployarmy: 'Army deployment',
  242. deploynavy: 'Navy deployment',
  243. plunder: 'Pillage',
  244. transport: 'Transport',
  245. },
  246. espionage: {
  247. player: 'Player',
  248. townhall_level: 'Town Hall Level',
  249. wall_level: 'Wall Level',
  250. travel_time: 'Travel Time',
  251. resources_lootable: 'Lootable',
  252. resources_looted: 'Looted',
  253. combats: 'Combats',
  254. military_score: 'Military Score',
  255. location: 'Location',
  256. view_island: 'View Island',
  257. occupied_by: 'Occupied by',
  258. blockaded_by: 'Blockaded by',
  259. time_since: 'Time Since',
  260. remove_target: 'Remove Target',
  261. },
  262. settings: {
  263. general: 'General',
  264. language: 'Language',
  265. overviews: 'Overviews',
  266. tweaks: 'Tweaks',
  267. auto_accept_daily_bonus: 'Automatically submit daily bonus form',
  268. hide_ads: 'Hide ads',
  269. hide_facebook: 'Hide facebook button',
  270. hide_friends_bar: 'Hide friends bar',
  271. hide_chat: 'Hide chat',
  272. transport_buttons: 'Add transport buttons: -500, +500, +1k, +5k',
  273. donation_buttons: 'Add donation buttons: +1k, +10k, +100k',
  274. show_city_owners: 'Show city owner next to city name (island view)',
  275. prevent_accidental_colony_destruction: 'Prevent destruction of non-mobile colonies',
  276. initialize_colonization_missions_for_pirate_raiding:
  277. 'Initialize colonization missions with wood and marble to build level 1 pirate fortress and use max draft speed',
  278. alerts: 'Alerts',
  279. do_test: 'Test',
  280. test_desktop_alert: 'Test desktop notification',
  281. test_desktop_alert_title: 'Test notification',
  282. test_desktop_alert_text: 'Successful notification! Click to dismiss.',
  283. desktop_alerts_not_supported:
  284. 'Desktop alerts not supported by your browser. You can try the HTML Desktop' +
  285. 'Notification extension for Firefox ' +
  286. '(https://addons.mozilla.org/en-us/firefox/addon/html-notifications/) ' +
  287. 'or switching to Chrome (www.google.com/chrome/).',
  288. building_completion_alert_desktop: 'Desktop notification: building upgrade complete',
  289. transport_loaded_alert_desktop: 'Desktop notification: transport mission loaded',
  290. transport_arrived_alert_desktop: 'Desktop notification: transport mission arrived',
  291. transport_returned_alert_desktop: 'Desktop notification: transport mission returned',
  292. deploy_army_loaded_alert_desktop: 'Desktop notification: deploy army loaded',
  293. deploy_army_arrived_alert_desktop: 'Desktop notification: deploy army arrived',
  294. deploy_army_returned_alert_desktop: 'Desktop notification: deploy army returned',
  295. deploy_navy_arrived_alert_desktop: 'Desktop notification: deploy navy arrived',
  296. deploy_navy_returned_alert_desktop: 'Desktop notification: deploy navy returned',
  297. pillage_loaded_alert_desktop: 'Desktop notification: pillage loaded',
  298. pillage_arrived_alert_desktop: 'Desktop notification: pillage arrived',
  299. pillage_returned_alert_desktop: 'Desktop notification: pillage returned',
  300. debug: 'Debug',
  301. },
  302. },
  303. ba: {
  304. misc: {
  305. resource_overview: 'Pregled resursa',
  306. buildings_overview: 'Pregled zgrada',
  307. military_overview: 'Pregled vojske',
  308. upkeep: "Zadovoljstvo",
  309. growth: "Rast",
  310. trade_good: "Trade Good",
  311. city_name: "Grad",
  312. action_points: "Akcijski bodovi",
  313. actions: "Akcije",
  314. research: "Istraživanje",
  315. building_spots: "Gradilište",
  316.  
  317. constructing: "Izgradnja",
  318. summary: "Ukupno:",
  319. population: "Populacija",
  320. population_growth: "Rast",
  321. resources: 'Resursi',
  322. buildings: 'Zgrade',
  323. military: 'Trupe',
  324. resource_overviewTab: 'Resursi',
  325. buildings_overviewTab: 'Zgrade',
  326. military_overviewTab: 'Trupe',
  327. resource_cost: 'Cijena',
  328. missing: 'Nedostaje',
  329. full: 'Puno',
  330. time_to_full: 'do popune',
  331. time_to_empty: 'do pražnjenja',
  332. maximum_capacity: 'Kapaciet',
  333. safe_capacity: 'Sigurno',
  334. employed: 'Radnici',
  335. satisfaction: 'Zadovoljstvo',
  336. tavern_wine_serving_level: 'Nivo Taverne',
  337. cultural_goods: 'Kulturna dobra',
  338. units: 'Jedinice',
  339. training: 'Regrutirano',
  340. deploying: 'Stacioniranje',
  341. plundering: 'Pljačka',
  342. in_transit: 'Transport',
  343. },
  344. tweaks: {
  345. transport_minus_500: '-',
  346. transport_plus_500: '+500',
  347. transport_plus_1000: '+1k',
  348. transport_plus_5000: '+5k',
  349. transport_minus_500_text: 'Ukloni 500 dobra',
  350. transport_plus_500_text: 'Dodaj 500 dobra',
  351. transport_plus_1000_text: 'Dodaj 1000 dobra',
  352. transport_plus_5000_text: 'Dodaj 5000 dobra',
  353. donate_plus_1000: '+1k',
  354. donate_plus_10000: '+10k',
  355. donate_plus_100000: '+100k',
  356. donate_plus_1000_text: 'Dodaj 1000 drva za donaciju',
  357. donate_plus_10000_text: 'Dodaj 10000 drva za donaciju',
  358. donate_plus_100000_text: 'Dodaj 100000 drva za donaciju',
  359. },
  360. actions: {
  361. deploy_army: 'Stacioniraj trupe',
  362. deploy_navy: 'Stacioniraj flotu',
  363. transport_goods: 'Prevezi dobra',
  364. to_town_hall: 'U Vječnicu',
  365. to_city_view: 'Prikaži grad',
  366. },
  367. resources: {
  368. wood: 'Drva',
  369. wine: 'Vino',
  370. marble: 'Mramor',
  371. glass: 'Kristal',
  372. sulfur: 'Sumpor',
  373. },
  374. buildings: {
  375. townHall: 'Gradska vječnica',
  376. palace: 'Palača',
  377. palaceColony: 'Guvernerova palača',
  378. tavern: 'Taverna',
  379. museum: 'Muzej',
  380. academy: 'Akademija',
  381. workshop: 'Radionica',
  382. temple: 'Hram',
  383. embassy: 'Veleposlanstvo',
  384. warehouse: 'Skladište',
  385. dump: 'Depo',
  386. port: 'Trgovačka luka',
  387. branchOffice: 'Market',
  388. wall: 'Zid',
  389. safehouse: 'Sklonište',
  390. barracks: 'Barake',
  391.  
  392.  
  393. shipyard: 'Brodogradilište',
  394. forester: 'Lugarova kuća',
  395. carpentering: 'Stolarija',
  396. winegrower: 'Vinarija',
  397. vineyard: 'Vinska preša',
  398. stonemason: 'Klesar',
  399. architect: 'Arhitektov ured',
  400. glassblowing: 'Staklarnica',
  401. optician: 'Optičar',
  402. alchemist: 'Alkemičarev toranj',
  403. fireworker: 'Radionica vatrometa',
  404. },
  405. units: {
  406. phalanx: 'Kopljanik',
  407. steamgiant: 'Željezni Div',
  408. spearman: 'Bacač koplja',
  409. swordsman: 'Mačevalac',
  410. slinger: 'Praćkar',
  411. archer: 'Strijelac',
  412. marksman: 'Sumforni Mušketar',
  413. ram: 'Ovan',
  414. catapult: 'Katapult',
  415. mortar: 'Minobacač',
  416. gyrocopter: 'Girokopter',
  417. bombardier: 'Balloon Bombarder',
  418. cook: 'Kuhar',
  419. medic: 'Doktor',
  420. ship_ram: 'Brod Ovan',
  421. ship_flamethrower: 'Vatreni Brod',
  422. ship_steamboat: 'Parni Ovan',
  423. ship_ballista: 'Brod Kopljar',
  424. ship_catapult: 'Brod Katapult',
  425. ship_mortar: 'Brod Minobacač',
  426. ship_submarine: 'Podmornica',
  427. ship_paddlespeedship: 'Parni gliser',
  428. ship_ballooncarrier: 'Nosač balona',
  429. ship_tender: 'Tender',
  430. ship_rocketship: 'Raketni brod',
  431. },
  432. alerts: {
  433. building_upgrade_complete: 'Nadogradnja zgrade završena',
  434. building_upgrade_complete_text: '%{building} u %{city} nadograđena na nivo %{level}',
  435. mission_update: 'Izvještaj misije',
  436. loading: 'utovar %{type} završio u gradu %{city}',
  437. en_route: '%{type} je stigao u grad %{city}',
  438. returning: '%{type} se vratio u grad %{city}',
  439. deployarmy: 'Trupe stacionirane',
  440. deploynavy: 'Flota stacionirana',
  441. plunder: 'Pljačka',
  442. transport: 'Transport',
  443. },
  444. settings: {
  445. general: 'Općenito',
  446. language: 'Jezik',
  447. overviews: 'Pregledi',
  448. tweaks: 'Podešavanja',
  449. auto_accept_daily_bonus: 'Automatski dodijeli dnevni bonus',
  450. hide_ads: 'Sakrij oglase',
  451. hide_facebook: 'Sakrij Facebook gumb',
  452. hide_friends_bar: 'Sakrij popis prijatelja',
  453. hide_chat: 'Sakrij chat',
  454. transport_buttons: 'Dodaj gumbe za transport: -500, +500, +1k, +5k',
  455. donation_buttons: 'Dodaj gumbe za donacije: +1k, +10k, +100k',
  456. alerts: 'Obavijesti',
  457. do_test: 'Test',
  458. test_desktop_alert: 'Test za obavijesti radne površine',
  459. test_desktop_alert_title: 'Testna obavijest',
  460. test_desktop_alert_text: 'Uspješno ste obaviješteni! Kliknite za zatvaranje.',
  461. desktop_alerts_not_supported:
  462. 'Vaš preglednik ne podržava obavijesti radne površine. Možete pokušati sa HTML obavijestima' +
  463. 'radnog stola za Firefox ' +
  464. '(https://addons.mozilla.org/en-us/firefox/addon/html-notifications/) ' +
  465. 'ili se prebacite na Chrome (www.google.com/chrome/).',
  466. building_completion_alert_desktop: 'Obavijest: nadogradnja zgrade završena',
  467. transport_loaded_alert_desktop: 'Obavijest: Utovar dobara završio',
  468. transport_arrived_alert_desktop: 'Obavijest: Transport dobara stigao',
  469. transport_returned_alert_desktop: 'Obavijest: Brodovi su se vratili iz transporta dobara',
  470. deploy_army_loaded_alert_desktop: 'Obavijest: Trupe za stacioniranje su se ukrcale',
  471. deploy_army_arrived_alert_desktop: 'Obavijest: Trupe stacionirane',
  472. deploy_army_returned_alert_desktop: 'Obavijest: Trupe su se vratile',
  473. deploy_navy_arrived_alert_desktop: 'Obavijest: Flota stigla na odredište',
  474. deploy_navy_returned_alert_desktop: 'Obavijest: Flota se vratila',
  475. pillage_loaded_alert_desktop: 'Obavijest: Jedinice za pljačku ukrcane',
  476. pillage_arrived_alert_desktop: 'Obavijest: Pljačka stigla na odredište',
  477. pillage_returned_alert_desktop: 'Obavijest: Brodovi su se vratili iz pljačke',
  478. },
  479. },
  480. de: {
  481. misc: {
  482. upkeep: "Unterhalt",
  483. growth: "Wachstum",
  484. trade_good: "Handelsgüter",
  485. city_name: "Stadt",
  486. action_points: "Aktionspunkte",
  487. actions: "Aktionen",
  488. research: "Forschung",
  489. building_spots: "freie Bauplätze",
  490.  
  491. constructing: "im Bau befindlich",
  492. summary: "Summe:",
  493.  
  494. population: "Bevölkerung",
  495. population_growth: "Wachstum",
  496.  
  497. resources: 'Ressourcen',
  498. buildings: 'Gebäude',
  499. military: 'Militär',
  500.  
  501. resource_overview: 'Ressourcenübersicht',
  502. buildings_overview: 'Gebäudeübersicht',
  503. military_overview: 'Militärübersicht',
  504.  
  505. resource_cost: 'Kosten',
  506. next_level_cost: 'Kosten nächstes Level',
  507. missing: 'fehlt',
  508.  
  509. full: 'voll',
  510. time_to_full: 'bis voll',
  511. time_to_empty: 'bis leer',
  512.  
  513. maximum_capacity: 'Kapazität',
  514. safe_capacity: 'Sicher',
  515. employed: 'Forscher',
  516.  
  517. satisfaction: 'Zufriedenheit',
  518. tavern_wine_serving_level: 'Tavernen Level',
  519. cultural_goods: 'Kulturgüter',
  520.  
  521. units: 'Einheiten',
  522. training: 'Ausbildung',
  523. deploying: 'im Einsatz',
  524. plundering: 'Plünderung',
  525.  
  526. in_transit: 'Transport',
  527. },
  528. tweaks: {
  529. transport_minus_500: '-',
  530. transport_plus_500: '+500',
  531. transport_plus_1000: '+1k',
  532. transport_plus_5000: '+5k',
  533.  
  534. transport_minus_500_text: 'Entferne 500 Waren',
  535. transport_plus_500_text: 'Addiere 500 Waren',
  536. transport_plus_1000_text: 'Addiere 1000 Waren',
  537. transport_plus_5000_text: 'Addiere 5000 Waren',
  538.  
  539. donate_plus_1000: '+1k',
  540. donate_plus_10000: '+10k',
  541. donate_plus_100000: '+100k',
  542.  
  543. donate_plus_1000_text: 'Addiere 1000 Holz zur Spende',
  544. donate_plus_10000_text: 'Addiere 10000 Holz zur Spende',
  545. donate_plus_100000_text: 'Addiere 100000 Holz zur Spende',
  546.  
  547. },
  548. actions: {
  549. deploy_army: 'Armee hier her verlegen',
  550. deploy_navy: 'Kriegsschiffe hier her verlegen',
  551. transport_goods: 'Waren hier her transportieren',
  552. to_town_hall: 'gehe ins Rathaus',
  553. to_city_view: 'zeige Stadtansicht',
  554. to_barracks: 'gehe zur Kaserne',
  555. to_shipyard: 'gehe zur Werft',
  556. },
  557. resources: {
  558. wood: 'Holz',
  559. wine: 'Wein',
  560. marble: 'Mamor',
  561. glass: 'Kristall',
  562. sulfur: 'Schwefel',
  563. },
  564. buildings: {
  565. townHall: 'Rathaus',
  566. palace: 'Palast',
  567. palaceColony: 'Stadthaltersitz',
  568. tavern: 'Taverne',
  569. museum: 'Museum',
  570. academy: 'Akademie',
  571. workshop: 'Erfinderwerkstatt',
  572. temple: 'Tempel',
  573. embassy: 'Botschaft',
  574. warehouse: 'Lagerhaus',
  575. dump: 'Halde',
  576. port: 'Handelshafen',
  577. branchOffice: 'Kontor',
  578. wall: 'Mauer',
  579. safehouse: 'Versteck',
  580. barracks: 'Kaserne',
  581. shipyard: 'Kriegswerft',
  582. forester: 'Forsthaus',
  583. carpentering: 'Zimmerei',
  584. winegrower: 'Winzerei',
  585. vineyard: 'Taverne',
  586. stonemason: 'Steinmetz',
  587. architect: 'Architekt',
  588. glassblowing: 'Glasbläser',
  589. optician: 'Optiker',
  590. alchemist: 'Alchimistenturm',
  591. fireworker: 'Feuerwerksplatz',
  592. },
  593. units: {
  594. phalanx: 'Hoplit',
  595. steamgiant: 'Dampfgigant',
  596. spearman: 'Speerträger',
  597. swordsman: 'Schwertkämpfer',
  598. slinger: 'Steinschleuderer',
  599. archer: 'Bogenschütze',
  600. marksman: 'Schwefelbüchsenschütze',
  601. ram: 'Rammbock',
  602. catapult: 'Katapult',
  603. mortar: 'Mörser',
  604. gyrocopter: 'Gyrocopter',
  605. bombardier: 'Balloon-Bombadier',
  606. cook: 'Koch',
  607. medic: 'Doktor',
  608.  
  609. ship_ram: 'Rammschiff',
  610. ship_flamethrower: 'Feuerschiff',
  611. ship_steamboat: 'Dampframme',
  612. ship_ballista: 'Ballistaschiff',
  613. ship_catapult: 'Katapultschiff',
  614. ship_mortar: 'Mörserschiff',
  615. ship_submarine: 'Tauchboot',
  616. ship_paddlespeedship: 'Schaufelschnellboot',
  617. ship_ballooncarrier: 'Ballonträger',
  618. ship_tender: 'Tender',
  619. ship_rocketship: 'Raketenschiff',
  620. },
  621. alerts: {
  622. building_upgrade_complete: 'Gebäudeausbau abgeschlossen',
  623. building_upgrade_complete_text: '%{building} in %{city} ausgebaut auf Stufe %{level}',
  624.  
  625. mission_update: 'Mission update',
  626.  
  627. loading: '%{type} ist fertig mit beladen in %{city}',
  628. en_route: '%{type} ist angekommen in %{city}',
  629. returning: '%{type} ist zurück gekommen nach %{city}',
  630.  
  631. deployarmy: 'Armeeaufträge',
  632. deploynavy: 'Flottenaufträge',
  633. plunder: 'Plündern',
  634. transport: 'Transport',
  635.  
  636. },
  637. settings: {
  638. general: 'Allgemein',
  639. language: 'Sprache',
  640. overviews: 'Übersichten',
  641. tweaks: 'Sonstiges',
  642. auto_accept_daily_bonus: 'Automatisches senden des täglichen Login-Bonus',
  643. hide_ads: 'Werbung ausblenden',
  644. hide_facebook: 'Facbookbutton ausblenden',
  645. hide_friends_bar: 'Freundesliste ausblenden',
  646. hide_chat: 'Chat ausblenden',
  647. transport_buttons: 'Aanzeige Transport Buttons: -500, +500, +1k, +5k',
  648. donation_buttons: 'Anzeige Spende Buttons: +1k, +10k, +100k',
  649.  
  650. alerts: 'Alarm',
  651. do_test: 'Test',
  652. test_desktop_alert: 'Test Desktop Benachrichtigung',
  653. test_desktop_alert_title: 'Test Benachrichtigung',
  654. test_desktop_alert_text: 'Test erfogreich! Klicke hier zum beenden.',
  655. desktop_alerts_not_supported:
  656. 'Desktop Alarm wird von deinem Browser nicht unterstützt. Versuche HTML Desktop' +
  657. 'Benachrichtigungserweiterung für Firefox ' +
  658. '(https://addons.mozilla.org/de/firefox/addon/html-notifications/) ' +
  659. 'oder wechsle zu Chrome (www.google.com/chrome/).',
  660.  
  661. building_completion_alert_desktop: 'Benachrichtigung: Gebäudeausbau abgeschlossen',
  662. transport_loaded_alert_desktop: 'Benachrichtigung: Transport Mission beladen',
  663. transport_arrived_alert_desktop: 'Benachrichtigung: Transport Mission angekommen',
  664. transport_returned_alert_desktop: 'Benachrichtigung: Transport Mission zurück gekommen',
  665. deploy_army_loaded_alert_desktop: 'Benachrichtigung: eingesetzte Armee beladen',
  666. deploy_army_arrived_alert_desktop: 'Benachrichtigung: eingesetzte Armee angekommen',
  667. deploy_army_returned_alert_desktop: 'Benachrichtigung: eingesetzte Armee zurück gekommen',
  668. deploy_navy_arrived_alert_desktop: 'Benachrichtigung: eingesetzte Flotte angekommen',
  669. deploy_navy_returned_alert_desktop: 'Benachrichtigung: eingesetzte Flotte zurück gekommen',
  670. pillage_loaded_alert_desktop: 'Benachrichtigung: Plündergut beladen',
  671. pillage_arrived_alert_desktop: 'Benachrichtigung: Plündergut angekommen',
  672. pillage_returned_alert_desktop: 'Benachrichtigung: Plündergut zurück gekommen',
  673.  
  674. debug: 'Debug',
  675. },
  676. },
  677. es: {
  678. misc: {
  679. resource_overview: 'Tabla de recursos',
  680. buildings_overview: 'Tabla de edificios',
  681. military_overview: 'Tabla Militar',
  682.  
  683. upkeep: "Mantenimiento",
  684. growth: "Crecimiento",
  685. trade_good: "Bien de Lujo",
  686. city_name: "Ciudad",
  687. action_points: "Puntos de accion",
  688. actions: "Accion",
  689. research: "Investigacion",
  690. building_spots: "Lugares disponibles",
  691. constructing: "Construyendo",
  692. summary: "Resumen:",
  693.  
  694. population: "Poblacion",
  695. population_growth: "Crecimiento",
  696.  
  697. resources: 'Recursos',
  698. buildings: 'Edificios',
  699. military: 'Militar',
  700.  
  701. resource_overview: 'Resumen de recursos',
  702. buildings_overview: 'Resumen de edificios',
  703. military_overview: 'Resumen Militar',
  704.  
  705. resource_cost: 'Costos',
  706. next_level_cost: 'Costos Proximo nivel',
  707. missing: 'Faltante',
  708.  
  709. full: 'Lleno',
  710. time_to_full: 'Tiempo para llenar',
  711. time_to_empty: 'Tiempo para vaciar',
  712.  
  713. maximum_capacity: 'Capacidad',
  714. safe_capacity: 'Seguro',
  715. employed: 'Empleado',
  716.  
  717. satisfaction: 'Satisfaccion',
  718. tavern_wine_serving_level: 'Vino servido',
  719. cultural_goods: 'Bienes Culturales',
  720.  
  721. units: 'Unidades',
  722. training: 'Entrenando',
  723. deploying: 'Desplegando',
  724. plundering: 'Saqueando',
  725.  
  726. in_transit: 'En transito',
  727. },
  728. tweaks: {
  729. transport_minus_500: '-500',
  730. transport_plus_500: '+500',
  731. transport_plus_1000: '+1k',
  732. transport_plus_5000: '+5k',
  733. transport_minus_500_text: 'reduce 500',
  734. transport_plus_500_text: 'Aumenta 500',
  735. transport_plus_1000_text: 'Aumenta 1000',
  736. transport_plus_5000_text: 'Aumenta 5000',
  737. donate_plus_1000: '+1k',
  738. donate_plus_10000: '+10k',
  739. donate_plus_100000: '+100k',
  740. donate_plus_1000_text: 'Aumenta 1000',
  741. donate_plus_10000_text: 'Aumenta 10000',
  742. donate_plus_100000_text: 'Aumenta 100000',
  743. },
  744. actions: {
  745. deploy_army: 'Desplegar Tropas',
  746. deploy_navy: 'Despplegar Flotas',
  747. transport_goods: 'Transportar Bienes',
  748. to_town_hall: 'ir a la intendencia',
  749. to_city_view: 'ver ciudad',
  750. to_barracks: 'ir al cuartel',
  751. to_shipyard: 'ir al astillero',
  752. },
  753. resources: {
  754. wood: 'Madera',
  755. wine: 'Vino',
  756. marble: 'Marmol',
  757. glass: 'Cristal',
  758. sulfur: 'Azufre',
  759. },
  760. buildings: {
  761. townHall: 'Intendencia',
  762. palace: 'Palacio',
  763. palaceColony: 'Residencia del Gobernador',
  764. tavern: 'Taberna',
  765. museum: 'Museo',
  766. academy: 'Academia',
  767. workshop: 'Taller de mejoras',
  768. temple: 'Templo',
  769. embassy: 'Embajada',
  770. warehouse: 'Deposito',
  771. dump: 'Vertedero',
  772. port: 'Puerto',
  773. branchOffice: 'Tienda',
  774. wall: 'Muralla',
  775. safehouse: 'Escondite',
  776. barracks: 'Cuartel',
  777. shipyard: 'Astillero',
  778. forester: 'Cabaña del guardabosques',
  779. carpentering: 'Carpinteria',
  780. winegrower: 'Vinicultor',
  781. vineyard: 'Prensa de Vino',
  782. stonemason: 'Cantero',
  783. architect: 'Oficina del arquitecto',
  784. glassblowing: 'Soplador de Vidrio',
  785. optician: 'Optica',
  786. alchemist: 'Alquimista',
  787. fireworker: 'Zona de pruebas pirotecnicas',
  788. },
  789. units: {
  790. phalanx: 'Hoplita',
  791. steamgiant: 'Gigante a vapor',
  792. spearman: 'Lancero',
  793. swordsman: 'Espadachin',
  794. slinger: 'Hondero',
  795. archer: 'Arquero',
  796. marksman: 'Fusilero',
  797. ram: 'Ariete',
  798. catapult: 'Catapulta',
  799. mortar: 'Mortero',
  800. gyrocopter: 'Gyrocoptero',
  801. bombardier: 'Bombardero',
  802. cook: 'Cocinero',
  803. medic: 'Medico',
  804. ship_ram: 'Barco Espolon',
  805. ship_flamethrower: 'Barco Lanzallamas',
  806. ship_steamboat: 'Barco Espolon a vapor',
  807. ship_ballista: 'Barco Ballesta',
  808. ship_catapult: 'Barco Catapulta',
  809. ship_mortar: 'Barco mortero',
  810. ship_submarine: 'Submarino',
  811. ship_paddlespeedship: 'Lancha de palas',
  812. ship_ballooncarrier: 'Porta-Globos',
  813. ship_tender: 'Barco de mantenimiento',
  814. ship_rocketship: 'Barco lanza-misiles',
  815. },
  816. alerts: {
  817. building_upgrade_complete: 'Expansion de edificio completa',
  818. building_upgrade_complete_text: '%{building} nivel %{level} completado(a) en%{city}',
  819. mission_update: 'Actualizar Mision',
  820. loading: 'Carga %{type} completa en %{city}',
  821. en_route: '%{type} en camino a %{city}',
  822. returning: '%{type} retornando desde %{city}',
  823. deployarmy: 'Desplegando tropas',
  824. deploynavy: 'Desplegando Flotas',
  825. plunder: 'Saquear',
  826. transport: 'Transportar',
  827. },
  828. settings: {
  829. general: 'Optciones generales',
  830. language: 'Idioma',
  831. overviews: 'Tablas',
  832. tweaks: 'Ajustes',
  833. auto_accept_daily_bonus: 'Aceptar automaticamente el bono diario',
  834. hide_ads: 'Ocultar Publicidad',
  835. hide_facebook: 'Ocultar Facebook',
  836. hide_friends_bar: 'Ocultar barra de amigos',
  837. hide_chat: 'Ocultar chat',
  838. transport_buttons: 'Botones de transporte: -500, +500, +1k, +5k',
  839. donation_buttons: 'Botones para donaciones: +1k, +10k, +100k',
  840. alerts: 'Alertas',
  841. do_test: 'Probar',
  842. test_desktop_alert: 'Notificacion en el escritorio',
  843. test_desktop_alert_title: 'Titulo de la notificacion',
  844. test_desktop_alert_text: 'Mensaje de la notificacion.',
  845. building_completion_alert_desktop: 'Alerta: Ampliacion de edificio completa',
  846. transport_loaded_alert_desktop: 'Alerta: Carga completa',
  847. transport_arrived_alert_desktop: 'Alerta: Transporte arribó',
  848. transport_returned_alert_desktop: 'Alerta: trasnsporte volvió',
  849. deploy_army_loaded_alert_desktop: 'Alerta: Carga de Tropas completa',
  850. deploy_army_arrived_alert_desktop: 'Alerta: Tropas desplegadas',
  851. deploy_army_returned_alert_desktop: 'Alerta: Retorno de tropas',
  852. deploy_navy_arrived_alert_desktop: 'Alerta: Flotas desplegadas',
  853. deploy_navy_returned_alert_desktop: 'Alerta: Retorno de Flotas',
  854. pillage_loaded_alert_desktop: 'Alerta: Cargando saqueo',
  855. pillage_arrived_alert_desktop: 'Alerta: Saqueo en curso',
  856. pillage_returned_alert_desktop: 'Alerta: Retorno del saqueo',
  857. debug: 'Debug',
  858. },
  859. },
  860. fr: {
  861. misc: {
  862. resource_overview: 'Vue générale des Ressources',
  863. buildings_overview: 'Vue générale des Bâtiments',
  864. military_overview: 'Vue générale des Troupes',
  865.  
  866. upkeep: "Entretien",
  867. growth: "Croissance",
  868. trade_good: "Trade Good",
  869. city_name: "Cité",
  870. action_points: "Points d'Action",
  871. actions: "Actions",
  872. research: "Recherche",
  873. building_spots: "Emplacement de Construction",
  874.  
  875. constructing: "En cours de construction",
  876. summary: "Résumé:",
  877.  
  878. population: "Population",
  879. population_growth: "Croissance",
  880.  
  881. resources: 'Ressources',
  882. buildings: 'Bâtiments',
  883. military: 'Armée',
  884.  
  885. resource_overview: 'Vue générale des Ressources',
  886. buildings_overview: 'Vue générale des Bâtiments',
  887. military_overview: 'Vue générale des Troupes',
  888.  
  889. resource_cost: 'Coût',
  890. next_level_cost: 'Coût du prochain niveau',
  891. missing: 'Manquant',
  892.  
  893. full: 'Plein',
  894. time_to_full: 'Jusqu\'au maximum',
  895. time_to_empty: 'Jusqu\'au minimum',
  896.  
  897. maximum_capacity: 'Capacité',
  898. safe_capacity: 'Sécurisé',
  899. employed: 'Utilisé',
  900.  
  901. satisfaction: 'Satisfaction',
  902. tavern_wine_serving_level: 'Niveau de la Taverne',
  903. cultural_goods: 'Biens Culturels',
  904.  
  905. units: 'Unités',
  906. training: 'Formation',
  907. deploying: 'Déploiement',
  908. plundering: 'Pillage',
  909.  
  910. in_transit: 'En transit',
  911. },
  912. tweaks: {
  913. transport_minus_500: '-',
  914. transport_plus_500: '+500',
  915. transport_plus_1000: '+1k',
  916. transport_plus_5000: '+5k',
  917.  
  918. transport_minus_500_text: 'Enlever 500 unités',
  919. transport_plus_500_text: 'Ajouter 500 unités',
  920. transport_plus_1000_text: 'Ajouter 1000 unités',
  921. transport_plus_5000_text: 'Ajouter 5000 unités',
  922.  
  923. donate_plus_1000: '+1k',
  924. donate_plus_10000: '+10k',
  925. donate_plus_100000: '+100k',
  926.  
  927. donate_plus_1000_text: 'Ajouter 1000 unités de bois en donation',
  928. donate_plus_10000_text: 'Ajouter 10000 unités de bois en donation',
  929. donate_plus_100000_text: 'Ajouter 100000 unités de bois en donation',
  930. },
  931. actions: {
  932. deploy_army: 'Déployer Troupes',
  933. deploy_navy: 'Déployer Flottes',
  934. transport_goods: 'Transporter des Marchandises',
  935. to_town_hall: 'Montrer l\'Hôtel de Ville',
  936. to_city_view: 'Montrer la Ville',
  937. to_barracks: 'Montrer la Caserne',
  938. to_shipyard: 'Montrer le Chantier Naval',
  939. },
  940. resources: {
  941. wood: 'Bois',
  942. wine: 'Vin',
  943. marble: 'Marbre',
  944. glass: 'Cristal',
  945. sulfur: 'Souffre',
  946. },
  947. buildings: {
  948. townHall: 'Hôtel de Ville',
  949. palace: 'Palais',
  950. palaceColony: 'Résidence du Gouverneur',
  951. tavern: 'Taverne',
  952. museum: 'Musée',
  953. academy: 'Académie',
  954. workshop: 'Atelier',
  955. temple: 'Temple',
  956. embassy: 'Ambassade',
  957. warehouse: 'Entrepôt',
  958. dump: 'Dépôt',
  959. port: 'Port commercial',
  960. branchOffice: 'Comptoir',
  961. wall: 'Mur d\'enceinte',
  962. safehouse: 'Cachette',
  963. barracks: 'Caserne',
  964. shipyard: 'Chantier naval',
  965. forester: 'Maison Forestière',
  966. carpentering: 'Menuisier',
  967. winegrower: 'Pressoir à vin',
  968. vineyard: 'Cave à vin',
  969. stonemason: 'Tailleur de pierres',
  970. architect: 'Bureau de l\'architecte',
  971. glassblowing: 'Verrier',
  972. optician: 'Opticien',
  973. alchemist: 'Tour des alchimistes',
  974. fireworker: 'Zone de test des artificiers',
  975. },
  976. units: {
  977. phalanx: 'Phalange',
  978. steamgiant: 'Géant à vapeur',
  979. spearman: 'Lancier',
  980. swordsman: 'Epéiste',
  981. slinger: 'Lance-pierre',
  982. archer: 'Archer',
  983. marksman: 'Tireur d`élite',
  984. ram: 'Bélier',
  985. catapult: 'Catapulte',
  986. mortar: 'Mortier',
  987. gyrocopter: 'Gyrocoptère',
  988. bombardier: 'Bombardier',
  989. cook: 'Cuisinier',
  990. medic: 'Médecin',
  991.  
  992. ship_ram: 'Bateau bélier',
  993. ship_flamethrower: 'Lance-flammes',
  994. ship_steamboat: 'Bélier à vapeur',
  995. ship_ballista: 'Bateau Baliste',
  996. ship_catapult: 'Bateau à catapulte',
  997. ship_mortar: 'Bateau à mortier',
  998. ship_submarine: 'Bateau de plongée',
  999. ship_paddlespeedship: 'Bateau de soutien',
  1000. ship_ballooncarrier: 'Porte-ballons',
  1001. ship_tender: 'Bateau rapide à aubes',
  1002. ship_rocketship: 'Bateau lance-missiles',
  1003. },
  1004. alerts: {
  1005. building_upgrade_complete: 'Expansion du bâtiment terminée',
  1006. building_upgrade_complete_text: '%{building} niveau %{level} terminé(e) à%{city}',
  1007.  
  1008. mission_update: 'Mission mise à jour',
  1009.  
  1010. loading: 'Chargement de %{type} terminé à %{city}',
  1011. en_route: '%{type} sont arrivés à %{city}',
  1012. returning: '%{type} sont retournés à %{city}',
  1013.  
  1014. deployarmy: 'Déploiement de l’Armée',
  1015. deploynavy: 'Déploiement de la Flotte',
  1016. plunder: 'Pillage',
  1017. transport: 'Transport',
  1018. },
  1019. settings: {
  1020. general: 'Options générales',
  1021. language: 'Language',
  1022.  
  1023. overviews: 'Vues',
  1024.  
  1025. tweaks: 'Tweaks',
  1026. auto_accept_daily_bonus: 'Soumettre automatiquement sous forme de bonus quotidien',
  1027. hide_ads: 'Masquer les publicités',
  1028. hide_facebook: 'Masquer le bouton Facebook',
  1029. hide_friends_bar: 'Masquer la barre de contact',
  1030. hide_chat: 'Masquer le chat',
  1031. transport_buttons: 'Ajouter boutons de transport: -500, +500, +1k, +5k',
  1032. donation_buttons: 'Ajouter boutons de donation: +1k, +10k, +100k',
  1033.  
  1034. alerts: 'Alertes',
  1035. do_test: 'Test',
  1036. test_desktop_alert: 'Tester la notification bureau',
  1037. test_desktop_alert_title: 'Tester le titre de la notification',
  1038. test_desktop_alert_text: 'Notification Réussie ! Cliquez pour fermer.',
  1039. desktop_alerts_not_supported: 'Les alertes ne sont pas supportées par votre navigateur. Vous pouvez essayer d\'intégrer l\'add-on HTML-Desktop-Notifications' + 'Notification extension for Firefox ' + '(https://addons.mozilla.org/en-us/firefox/addon/...) ' + 'ou passer à Chrome (www.google.com/chrome/).',
  1040.  
  1041. building_completion_alert_desktop: 'Notification: Expansion du Bâtiment terminée',
  1042. transport_loaded_alert_desktop: 'Notification: Chargement terminé',
  1043. transport_arrived_alert_desktop: 'Notification: Transport terminé',
  1044. transport_returned_alert_desktop: 'Notification: Retour terminé',
  1045. deploy_army_loaded_alert_desktop: 'Notification: Chargement de Troupes terminé',
  1046. deploy_army_arrived_alert_desktop: 'Notification: Troupes déployées',
  1047. deploy_army_returned_alert_desktop: 'Notification: Retour des Troupes',
  1048. deploy_navy_arrived_alert_desktop: 'Notification: Flottes déployées',
  1049. deploy_navy_returned_alert_desktop: 'Notification: Retour des Flottes',
  1050. pillage_loaded_alert_desktop: 'Notification: Chargement pillage',
  1051. pillage_arrived_alert_desktop: 'Notification: Pillage en cours',
  1052. pillage_returned_alert_desktop: 'Notification: Retour du pillage',
  1053.  
  1054. debug: 'Debug',
  1055. },
  1056. },
  1057. hu: {
  1058. misc: {
  1059. resource_overview: 'Nyersanyagok listája',
  1060. buildings_overview: 'Épületek listája',
  1061. military_overview: 'Egységek listája',
  1062.  
  1063. upkeep: "Fenntartási költség",
  1064. growth: "Növekedés",
  1065. trade_good: "Nyersanyagok küldése",
  1066. city_name: "Város",
  1067. action_points: "Műveleti pontok",
  1068. actions: "Műveletek",
  1069. research: "Kutatás",
  1070. building_spots: "Építési helyek",
  1071.  
  1072. constructing: "Építés",
  1073. summary: "Összegzés:",
  1074.  
  1075. population: "Népesség",
  1076. population_growth: "Népesség növekedés",
  1077.  
  1078. resources: 'Nyersanyagok',
  1079. buildings: 'Épületek',
  1080. military: 'Egységek',
  1081.  
  1082. resource_overview: 'Nyersanyagok listája',
  1083. buildings_overview: 'Épületek listája',
  1084. military_overview: 'Egységek listája',
  1085.  
  1086. resource_cost: 'Nyersanyag szükséglet',
  1087. next_level_cost: 'Következős szinthez szükséges',
  1088. missing: 'Hiányzik',
  1089.  
  1090. full: 'Tele',
  1091. time_to_full: 'Tele',
  1092. time_to_empty: 'Üres',
  1093.  
  1094. maximum_capacity: 'Kapacitás',
  1095. safe_capacity: 'Védett',
  1096. employed: 'Tudósok',
  1097.  
  1098. satisfaction: 'Elégedettség',
  1099. tavern_wine_serving_level: 'Fogadó szintje',
  1100. cultural_goods: 'Kulturális egyezmény',
  1101.  
  1102. units: 'Egységek',
  1103. training: 'Képzés',
  1104. deploying: 'Csapat mozgás',
  1105. plundering: 'Fosztás',
  1106.  
  1107. in_transit: 'Szállítás',
  1108. },
  1109. tweaks: {
  1110. transport_minus_500: '-',
  1111. transport_plus_500: '+500',
  1112. transport_plus_1000: '+1k',
  1113. transport_plus_5000: '+5k',
  1114.  
  1115. transport_minus_500_text: 'Elvesz 500 nyersanyagot',
  1116. transport_plus_500_text: 'Hozzáad 500 nyersanyagot',
  1117. transport_plus_1000_text: 'Hozzáad 1000 nyersanyagot',
  1118. transport_plus_5000_text: 'Hozzáad 5000 nyersanyagot',
  1119.  
  1120. donate_plus_1000: '+1k',
  1121. donate_plus_10000: '+10k',
  1122. donate_plus_100000: '+100k',
  1123.  
  1124. donate_plus_1000_text: '1000 fát adományoz',
  1125. donate_plus_10000_text: '10000 fát adományoz',
  1126. donate_plus_100000_text: '100000 fát adományoz',
  1127. },
  1128. actions: {
  1129. deploy_army: 'Katonák küldése',
  1130. deploy_navy: 'Hajók küldése',
  1131. transport_goods: 'Nyersanyagok szállítása',
  1132. to_town_hall: 'Ugrás városházához',
  1133. to_city_view: 'Ugrás a városhoz',
  1134. to_barracks: 'Ugrás a barakkhoz',
  1135. to_shipyard: 'Ugrás a hajógyárhoz',
  1136. },
  1137. resources: {
  1138. wood: 'Fa',
  1139. wine: 'Bor',
  1140. marble: 'Márvány',
  1141. glass: 'Kristály',
  1142. sulfur: 'Kén',
  1143. },
  1144. buildings: {
  1145. townHall: 'Városháza',
  1146. palace: 'Palota',
  1147. palaceColony: 'Helytartó székhelye',
  1148. tavern: 'Fogadó',
  1149. museum: 'Múzeum',
  1150. academy: 'Akadémia',
  1151. workshop: 'Műhely',
  1152. temple: 'Templom',
  1153. embassy: 'Nagykövetség',
  1154. warehouse: 'Raktár',
  1155. dump: 'Depó',
  1156. port: 'Kereskedelmi kikötő',
  1157. branchOffice: 'Kereskedő poszt',
  1158. wall: 'Fal',
  1159. safehouse: 'Rejtekhely',
  1160. barracks: 'Barakk',
  1161. shipyard: 'Hajógyár',
  1162. pirateFortress: 'Kalóz erőd',
  1163. forester: 'Erdész',
  1164. carpentering: 'Ácsmester',
  1165. winegrower: 'Bortermelő',
  1166. vineyard: 'Szőlőprés',
  1167. stonemason: 'Kőműves',
  1168. architect: 'Építész irodája',
  1169. glassblowing: 'Üvegfúvó',
  1170. optician: 'Optikus',
  1171. alchemist: 'Alkimista torony',
  1172. fireworker: 'Tűzszerész',
  1173. },
  1174. units: {
  1175. phalanx: 'Hoplita',
  1176. steamgiant: 'Gőzóriás',
  1177. spearman: 'Dárdás',
  1178. swordsman: 'Kardforgató',
  1179. slinger: 'Parittyás',
  1180. archer: 'Íjász',
  1181. marksman: 'Kén Karabélyos',
  1182. ram: 'Faltörő Kos',
  1183. catapult: 'Katapult',
  1184. mortar: 'Ágyú',
  1185. gyrocopter: 'Gyrokopter',
  1186. bombardier: 'Ballonos-Bombázó',
  1187. cook: 'Séf',
  1188. medic: 'Felcser',
  1189.  
  1190. ship_ram: 'Törő-hajó',
  1191. ship_flamethrower: 'Lánghajó',
  1192. ship_steamboat: 'Gőzkos',
  1193. ship_ballista: 'Balliszta Hajó',
  1194. ship_catapult: 'Katapult Hajó',
  1195. ship_mortar: 'Ágyú Hajó',
  1196. ship_submarine: 'Búvárhajó',
  1197. ship_paddlespeedship: 'Lapátkerekes Gyorshajó',
  1198. ship_ballooncarrier: 'Léghajó hordozó',
  1199. ship_tender: 'Úszó bázis',
  1200. ship_rocketship: 'Rakétás Hajó',
  1201. },
  1202. alerts: {
  1203. building_upgrade_complete: 'Az épület fejlesztése befejeződött',
  1204. building_upgrade_complete_text: 'A(z) %{building}, %{city}-ban/ben fejlesztve lett a(z) %{level}. szintre.',
  1205.  
  1206. mission_update: 'Küldetés Lista',
  1207.  
  1208. loading: '%{type} befejezte a rakodást itt: %{city}',
  1209. en_route: '%{type} megérkezett ide: %{city}',
  1210. returning: '%{type} visszatért ide: %{city}',
  1211.  
  1212. deployarmy: 'Sereg küldés',
  1213. deploynavy: 'Hajó küldés',
  1214. plunder: 'Fosztás',
  1215. transport: 'Szállítás',
  1216. },
  1217. settings: {
  1218. general: 'Általános',
  1219. language: 'Nyelv választás',
  1220.  
  1221. overviews: 'Listák',
  1222.  
  1223. tweaks: 'Egyéb',
  1224. auto_accept_daily_bonus: 'Automatikus napi bónusz elfogadás',
  1225. hide_ads: 'Hírdetések elrejtése',
  1226. hide_facebook: 'Facebook gomb elrejtése',
  1227. hide_friends_bar: 'Barátlista elrejtése',
  1228. hide_chat: 'Chat elrejtése',
  1229. transport_buttons: 'Szállítási gombok hozzáadása: -500, +500, +1k, +5k',
  1230. donation_buttons: 'Adományozás gombok hozzáadása: +1k, +10k, +100k',
  1231.  
  1232. alerts: 'Riasztások',
  1233. do_test: 'Teszt',
  1234. test_desktop_alert: 'Értesítés tesztelése',
  1235. test_desktop_alert_title: 'Teszt értesítés',
  1236. test_desktop_alert_text: 'Sikeres értesítés! Kattincs a bezáráshoz.',
  1237. desktop_alerts_not_supported: 'Az értesítéseket nem támogatja a böngésződ. Próbáld a HTML Desktop ' + 'Notification extension for Firefox ' + '(https://addons.mozilla.org/en-us/firefox/addon/...) ' + 'vagy telepítsd a Chrome-ot (www.google.com/chrome/).',
  1238.  
  1239. building_completion_alert_desktop: 'Értesítés: Épület fejlesztés elkészült',
  1240. transport_loaded_alert_desktop: 'Értesítés: Kereskedő hajók rakodása befejeződött',
  1241. transport_arrived_alert_desktop: 'Értesítés: Kereskedő hajók megérkeztek',
  1242. transport_returned_alert_desktop: 'Értesítés: Kereskedő hajók visszatértek',
  1243. deploy_army_loaded_alert_desktop: 'Értesítés: Egységeid elindultak',
  1244. deploy_army_arrived_alert_desktop: 'Értesítés: Egységeid megérkeztek',
  1245. deploy_army_returned_alert_desktop: 'Értesítés: Egységeid visszatértek',
  1246. deploy_navy_arrived_alert_desktop: 'Értesítés: A hajóid megérkeztek',
  1247. deploy_navy_returned_alert_desktop: 'Értesítés: A hajóid visszatértek',
  1248. pillage_loaded_alert_desktop: 'Értesítés: A fosztogatók elindultak',
  1249. pillage_arrived_alert_desktop: 'Értesítés: A fosztogatás elkezdődött',
  1250. pillage_returned_alert_desktop: 'Értesítés: A fosztogatók visszatértek',
  1251.  
  1252. debug: 'Debug',
  1253. },
  1254. },
  1255. pl: {
  1256. misc: {
  1257. resource_overview: 'Podglad - Zasoby',
  1258. buildings_overview: 'Podglad - Budynki',
  1259. military_overview: 'Podglad - Wojsko',
  1260. upkeep: "Utrzymanie",
  1261. growth: "Wzrost",
  1262. trade_good: "Handel",
  1263. city_name: "Miasto",
  1264. action_points: "Punkty Akcji",
  1265. actions: "Akcja",
  1266. research: "Badania",
  1267. building_spots: "Miejsca pod Budowe",
  1268.  
  1269. constructing: "Budowa",
  1270. summary: "Razem:",
  1271. population: "Populacja",
  1272. population_growth: "Przyrost",
  1273. resources: 'Zasoby',
  1274. buildings: 'Budynki',
  1275. military: 'Wojsko',
  1276. resource_overview: 'Podglad: Zasoby',
  1277. buildings_overview: 'Podglad: Budynki',
  1278. military_overview: 'Podglad: Wojsko',
  1279. resource_cost: 'Koszt',
  1280. missing: 'Zagubiony',
  1281. full: 'Pelno',
  1282. time_to_full: 'Pelno za',
  1283. time_to_empty: 'Pusto za',
  1284. maximum_capacity: 'Pojemnosc',
  1285. safe_capacity: 'Bezpieczne',
  1286. employed: 'Zatrudnieni',
  1287. satisfaction: 'Zadowolenie',
  1288. tavern_wine_serving_level: 'Poziom Tawerny',
  1289. cultural_goods: 'Dobra Kulturowe',
  1290. units: 'Jednostki',
  1291. training: 'Szkolenie',
  1292. deploying: 'Deploying',
  1293. plundering: 'Pladrowanie',
  1294. in_transit: 'Transport',
  1295. },
  1296. actions: {
  1297. deploy_army: 'Wyslij Armie',
  1298. deploy_navy: 'Wyslij Flote',
  1299. transport_goods: 'Transport Surowców',
  1300. to_town_hall: 'Ratusz',
  1301. to_city_view: 'Podglad Miasta',
  1302. },
  1303. resources: {
  1304. wood: 'Drewno',
  1305. wine: 'Wino',
  1306. marble: 'Marmur',
  1307. glass: 'Krysztal',
  1308. sulfur: 'Siarka',
  1309. },
  1310. buildings: {
  1311. townHall: 'Ratusz',
  1312. palace: 'Palac',
  1313. palaceColony: 'Rezydencja Gubernatora',
  1314. tavern: 'Tawerna',
  1315. museum: 'Muzeum',
  1316. academy: 'Akademia',
  1317. workshop: 'Warsztat',
  1318. temple: 'Swiatynia',
  1319. embassy: 'Ambasada',
  1320. warehouse: 'Magazyn',
  1321. dump: 'Skladowisko',
  1322. port: 'Port',
  1323. branchOffice: 'Bazar',
  1324. wall: 'Mur',
  1325. safehouse: 'Kryjówka',
  1326. barracks: 'Koszary',
  1327. shipyard: 'Stocznia',
  1328. forester: 'Lesniczówka',
  1329. carpentering: 'Ciesla',
  1330. winegrower: 'Winnica',
  1331. vineyard: 'Tlocznia Win',
  1332. stonemason: 'Kamieniarz',
  1333. architect: 'Architekt',
  1334. glassblowing: 'Huta Szkla',
  1335. optician: 'Optyk',
  1336. alchemist: 'Alchemik',
  1337. fireworker: 'Pirotechnik',
  1338. },
  1339. units: {
  1340. phalanx: 'Hoplita',
  1341. steamgiant: 'Gigant Parowy',
  1342. spearman: 'Oszczepnik',
  1343. swordsman: 'Wojownik',
  1344. slinger: 'Procarz',
  1345. archer: 'Lucznik',
  1346. marksman: 'Strzelec',
  1347. ram: 'Taran',
  1348. catapult: 'Katapulta',
  1349. mortar: 'Mozdzierz',
  1350. gyrocopter: 'Zyrokopter',
  1351. bombardier: 'Balonowy Bombardier',
  1352. cook: 'Kucharz',
  1353. medic: 'Medyk',
  1354. ship_ram: 'Taran',
  1355. ship_flamethrower: 'Miotacz Ognia',
  1356. ship_steamboat: 'Taran Parowy',
  1357. ship_ballista: 'Balista',
  1358. ship_catapult: 'Okret z Katapulta',
  1359. ship_mortar: 'Okret z Mozdzierzem',
  1360. ship_submarine: 'Okret Podwodny',
  1361. ship_paddlespeedship: 'Smigacz z Napedem Kolowym',
  1362. ship_ballooncarrier: 'Balonowiec',
  1363. ship_tender: 'Statek Pomocniczy',
  1364. ship_rocketship: 'Krazownik Rakietowy',
  1365. },
  1366. settings: {
  1367. general: 'Ogólne',
  1368. language: 'Jezyk',
  1369. overviews: 'Podglad',
  1370. tweaks: 'Ustawienia',
  1371. auto_accept_daily_bonus: 'Automatyczne zatwierdzenie dziennego bonusa',
  1372. hide_ads: 'Ukryj dodatki',
  1373. hide_facebook: 'Ukryj guzik facebook',
  1374. hide_friends_bar: 'Ukryj listę przyjaciól',
  1375. hide_chat: 'Ukryj czat',
  1376. transport_buttons: 'Dodaj przyciski załadunku: -500, +500, +1k, +5k',
  1377. donation_buttons: 'Dodaj przyciski wpłat: +1k, +10k, +100k',
  1378. alerts: 'Powiadomienia',
  1379. do_test: 'Test',
  1380. test_desktop_alert: 'Testuj powiadomienia',
  1381. test_desktop_alert_title: 'Test powiadomienia',
  1382. test_desktop_alert_text: 'Test zakończony powodzeniem! Kliknij aby wyjść',
  1383. desktop_alerts_not_supported:
  1384. 'Twoja przeglądarka nie obsługuje powiadomień. ' +
  1385. 'Zainstaluj powiadomienia dla Firefox ' +
  1386. '(https://addons.mozilla.org/en-us/firefox/addon/html-notifications/) ' +
  1387. 'albo przejdź na Chrome (www.google.com/chrome/).',
  1388. building_completion_alert_desktop: 'Powiadomienie o ukończeniu modernizacji budynku',
  1389. transport_loaded_alert_desktop: 'Powiadomienie o zakończeniu załadunku towarów',
  1390. transport_arrived_alert_desktop: 'Powiadomienie o przybyciu statków handlowych',
  1391. transport_returned_alert_desktop: 'Powiadomienie o powrocie statków handlowych',
  1392. deploy_army_loaded_alert_desktop: 'Powiadomienie o załadowaniu wojsk',
  1393. deploy_army_arrived_alert_desktop: 'Powiadomienie o przybyciu wojsk',
  1394. deploy_army_returned_alert_desktop: 'Powiadomienie o powrocie wojsk',
  1395. deploy_navy_arrived_alert_desktop: 'Powiadomienie o dopłynięciu okrętów wojennych',
  1396. deploy_navy_returned_alert_desktop: 'Powiadomienie o powrocie okrętów wojennych',
  1397. pillage_loaded_alert_desktop: 'Powiadomienie o grabieży',
  1398. pillage_arrived_alert_desktop: 'Powiadomienie o rozpoczęciu grabieży',
  1399. pillage_returned_alert_desktop: 'Powiadomienie o powrocie z grabieży',
  1400. },
  1401. },
  1402. tr: {
  1403. misc: {
  1404. resource_overview: 'Kaynak Durumu',
  1405. buildings_overview: 'Binaların Durumu',
  1406. military_overview: 'Orduya Bakış',
  1407. espionage_overview: 'Casusluk Sistemi',
  1408. upkeep: "Bakım",
  1409. growth: "Büyüme",
  1410. trade_good: "Ticaret",
  1411. city_name: "Şehir",
  1412. action_points: "Aksiyon Puanı",
  1413. actions: "Aksiyonlar",
  1414. research: "Araştırma",
  1415. building_spots: "Bina Noktaları",
  1416.  
  1417. constructing: "İnşaat",
  1418. summary: "Özet:",
  1419. population: "Nüfus",
  1420. population_growth: "Büyüme",
  1421. resources: 'Kaynaklar',
  1422. buildings: 'Binalar',
  1423. military: 'Ordu',
  1424. espionage: 'Casusluk',
  1425. resource_overview: 'Kaynak Durumu',
  1426. buildings_overview: 'Binaların Durumu',
  1427. military_overview: 'Orduya Bakış',
  1428. resource_cost: 'Maliyet',
  1429. next_level_cost: 'Sonraki Seviye Maliyeti',
  1430. missing: 'Kayıp',
  1431. full: 'Dolu',
  1432. time_to_full: 'Dolacak',
  1433. time_to_empty: 'Boşalacak',
  1434. maximum_capacity: 'Kapasite',
  1435. safe_capacity: 'Korunan',
  1436. employed: 'Mevcut',
  1437. satisfaction: 'Memnuniyet',
  1438. tavern_wine_serving_level: 'Taverna Seviyesi',
  1439. cultural_goods: 'Kültürel Ürünler',
  1440. units: 'Birimler',
  1441. training: 'Eğitimde',
  1442. deploying: 'Dağılmış',
  1443. plundering: 'Seferde',
  1444. in_transit: 'Yüklenen',
  1445. none: 'Yok',
  1446. },
  1447. tweaks: {
  1448. transport_minus_500: '-',
  1449. transport_plus_500: '+500',
  1450. transport_plus_1000: '+1k',
  1451. transport_plus_5000: '+5k',
  1452. transport_minus_500_text: '-500',
  1453. transport_plus_500_text: '+500',
  1454. transport_plus_1000_text: '+1000',
  1455. transport_plus_5000_text: '+5000',
  1456. donate_plus_1000: '+1k',
  1457. donate_plus_10000: '+10k',
  1458. donate_plus_100000: '+100k',
  1459. donate_plus_1000_text: '+1000',
  1460. donate_plus_10000_text: '+10000',
  1461. donate_plus_100000_text: '+100000',
  1462. completely_demolish_building_prompt: 'Bu binayı tamamen yıkmak istiyor musunuz?',
  1463. destroy_non_mobile_colony_prompt:
  1464. 'Mobil olmayan koloninin yıkımı "Ikariam Imperator" tarafından bloke edildi! Eğer gerçekten ' +
  1465. 'bu şehri yıkmak istiyorsanız, önce "Ikariam Imperator" şeçeneklerindeki koruma ' +
  1466. 'seçeneğini kapatınız.',
  1467. },
  1468. actions: {
  1469. deploy_army: 'Asker Gönder',
  1470. deploy_navy: 'Gemi Gönder',
  1471. transport_goods: 'Malzeme Gönder',
  1472. to_town_hall: 'Belediye Binasına Git',
  1473. to_city_view: 'Şehir Görünümü',
  1474. to_island_view: 'Ada Görünümü',
  1475. to_barracks: 'Kışla',
  1476. to_shipyard: 'Tersane',
  1477. spy_mission: 'Görev Seç',
  1478. blockade: 'Limanı Fethet',
  1479. pillage: 'Yağmala',
  1480. occupy: 'Şehri İşgalet',
  1481. send_spy: 'Casus Yolla',
  1482. view_high_score: 'Puan Bilgileri',
  1483. view_alliance_page: 'İttifak Sayfasına Bak',
  1484. },
  1485. resources: {
  1486. wood: 'Odun',
  1487. wine: 'Üzüm',
  1488. marble: 'Mermer',
  1489. glass: 'Kristal',
  1490. sulfur: 'Sülfür',
  1491. },
  1492. buildings: {
  1493. townHall: 'Belediye',
  1494. palace: 'Saray',
  1495. palaceColony: 'Valilik',
  1496. tavern: 'Taverna',
  1497. museum: 'Müze',
  1498. academy: 'Akademi',
  1499. workshop: 'Mucit Atölyesi',
  1500. temple: 'Tapınak',
  1501. embassy: 'Büyük Elçilik',
  1502. warehouse: 'Depo',
  1503. dump: 'Yığın Sahası',
  1504. port: 'Ticaret Limanı',
  1505. branchOffice: 'Ticaret Merkezi',
  1506. wall: 'Sur',
  1507. safehouse: 'İstihbarat Merkezi',
  1508. barracks: 'Kışla',
  1509. shipyard: 'Donanma Tersanesi',
  1510. pirateFortress: 'Korsan Kalesi',
  1511. forester: 'Ormancı Kulübesi',
  1512. carpentering: 'Marangoz Atölyesi',
  1513. winegrower: 'Bağ Evi',
  1514. vineyard: 'Şarap Mahzeni',
  1515. stonemason: 'Mermer Atölyesi',
  1516. architect: 'Mimarlık Bürosu',
  1517. glassblowing: 'Cam Eşya Atölyesi',
  1518. optician: 'Optician',
  1519. alchemist: 'Simya Kulesi',
  1520. fireworker: 'Fişekçi',
  1521. },
  1522. units: {
  1523. phalanx: 'Hoplit',
  1524. steamgiant: 'Buhar Devi',
  1525. spearman: 'Mızrakçı',
  1526. swordsman: 'Kılıççı',
  1527. slinger: 'Slinger',
  1528. archer: 'Okçu',
  1529. marksman: 'Sülfür Tüfekçisi',
  1530. ram: 'Şahmerdan',
  1531. catapult: 'Mancınık',
  1532. mortar: 'Topçu',
  1533. gyrocopter: 'Gyrokopter',
  1534. bombardier: 'Balon Bombardımancısı',
  1535. cook: 'Aşçı',
  1536. medic: 'Doktor',
  1537. ship_ram: 'Şahmerdan Gemisi',
  1538. ship_flamethrower: 'Alev Gemisi',
  1539. ship_steamboat: 'Buharlı Şahmerdan',
  1540. ship_ballista: 'Ballista Ship',
  1541. ship_catapult: 'Mancınık Gemisi',
  1542. ship_mortar: 'Havantopu Gemisi',
  1543. ship_submarine: 'Diving Boat',
  1544. ship_paddlespeedship: 'Süratli Kürekbotu',
  1545. ship_ballooncarrier: 'Balon Taşıyıcı',
  1546. ship_tender: 'Tender',
  1547. ship_rocketship: 'Füze Gemisi',
  1548. },
  1549. alerts: {
  1550. building_upgrade_complete: 'Bina inşaası tamamlandı',
  1551. building_upgrade_complete_text: '%{city} şehrindeki %{building} binası %{level} seviyeye yükseltildi.',
  1552. mission_update: 'Görev Güncelleştirme',
  1553. loading: '%{city} şehrindeki %{type} yüklemesi tamamlandı',
  1554. en_route: '%{type} has arrived in %{city}',
  1555. returning: '%{type} has returned to %{city}',
  1556. deployarmy: 'Asker Gönderme',
  1557. deploynavy: 'Donanma Gönderme',
  1558. plunder: 'Yağmala',
  1559. transport: 'Transport',
  1560. },
  1561. espionage: {
  1562. player: 'Oyuncu',
  1563. townhall_level: 'Belediye Seviyesi',
  1564. wall_level: 'Sur Seviyesi',
  1565. travel_time: 'Varış Zamanı',
  1566. resources_lootable: 'Lootable',
  1567. resources_looted: 'Looted',
  1568. combats: 'Savaşlar',
  1569. military_score: 'General Puanı',
  1570. location: 'Koordinat',
  1571. view_island: 'Ada Görünümü',
  1572. occupied_by: 'İşgalde',
  1573. blockaded_by: 'Limanı İşgalde',
  1574. time_since: 'beri',
  1575. remove_target: 'Listeden Çıkar',
  1576. },
  1577. settings: {
  1578. general: 'Genel',
  1579. language: 'Dil',
  1580. overviews: 'Genel Bakış',
  1581. tweaks: 'Tweaks',
  1582. auto_accept_daily_bonus: 'Günlük Bonusları otomatik onayla',
  1583. hide_ads: 'Reklamları gizle',
  1584. hide_facebook: 'Facebook butonunu gizle',
  1585. hide_friends_bar: 'Arkadaşlar çubuğunu gizle',
  1586. hide_chat: 'Sohbeti gizle',
  1587. transport_buttons: 'Add transport buttons: -500, +500, +1k, +5k',
  1588. donation_buttons: 'Add donation buttons: +1k, +10k, +100k',
  1589. show_city_owners: 'Şehir adının yanında şehir sahibi göster (ada görünümünde)',
  1590. prevent_accidental_colony_destruction: 'Mobil olmayan kolonilerin imhasını önle',
  1591. initialize_colonization_missions_for_pirate_raiding:
  1592. 'Ahşap ve mermer ile seviye 1 korsan kale inşa etmek ve kolonizasyon misyonları başlatmak için maksimum taslak hızı kullanın',
  1593. alerts: 'Bildirimler',
  1594. do_test: 'Test',
  1595. test_desktop_alert: 'Masaüstü bildirimlerini test et',
  1596. test_desktop_alert_title: 'Test Bildirimi',
  1597. test_desktop_alert_text: 'Bildirim başarılı! Kapatmak için tıklayın.',
  1598. desktop_alerts_not_supported:
  1599. 'Masaüstü bildirimleri tarayıcınız tarafından desteklenmiyor. You can try the HTML Desktop' +
  1600. 'Firefox için bir HTML masaüstü bildirim uzantısı indirin ' +
  1601. '(https://addons.mozilla.org/en-us/firefox/addon/html-notifications/) ' +
  1602. 'veya Chrome\'dan giriş yapın (www.google.com/chrome/).',
  1603. building_completion_alert_desktop: 'Bina yükseltmesi tamamlandı',
  1604. transport_loaded_alert_desktop: 'Kaynaklar yüklendi',
  1605. transport_arrived_alert_desktop: 'Kaynaklar hedefe vardı',
  1606. transport_returned_alert_desktop: 'Nakliye gemileri geri döndü',
  1607. deploy_army_loaded_alert_desktop: 'Ordu yüklendi',
  1608. deploy_army_arrived_alert_desktop: 'Ordu hedefe vardı',
  1609. deploy_army_returned_alert_desktop: 'Ordu geri döndü',
  1610. deploy_navy_arrived_alert_desktop: 'Donanma hedefe vardı',
  1611. deploy_navy_returned_alert_desktop: 'Donanma geri döndü',
  1612. pillage_loaded_alert_desktop: 'Yağma yüklendi',
  1613. pillage_arrived_alert_desktop: 'Yağma geldi',
  1614. pillage_returned_alert_desktop: 'Yağma geri döndü',
  1615. debug: 'Debug',
  1616. },
  1617. },
  1618. };
  1619. var localizer = new IkaTools.Intl.Localizer(localizations);
  1620. function addStyles() {
  1621. GM_addStyle('\
  1622. /*-------------------------main board ----------------------*/ \
  1623. \
  1624. .imperator_overview { \
  1625. //width: 990px; \
  1626. //margin: 0 auto; \
  1627. //padding: 15px 0; \
  1628. } \
  1629. \
  1630. .imperator_overview.ltr, \
  1631. .imperator_overview.ltr * { \
  1632. direction: ltr; \
  1633. } \
  1634. \
  1635. .imperator_overview.rtl, \
  1636. .imperator_overview.rtl * { \
  1637. direction: rtl; \
  1638. } \
  1639. \
  1640. /*************************************************************/ \
  1641. /* Generic */ \
  1642. \
  1643. .nowrap { \
  1644. white-space: nowrap; \
  1645. } \
  1646. \
  1647. /*************************************************************/ \
  1648. /* Main overview table formatting */ \
  1649. \
  1650. .imperator_overview table.overview { \
  1651. width: 851px !important; \
  1652. margin-bottom: 3px; \
  1653. background-color: #FAF3D7 \
  1654. border-collapse: collapse; \
  1655. border: 1px solid #E4B873; \
  1656. color: #542C0F; \
  1657. \
  1658. height: auto; \
  1659. line-height: 12px; \
  1660. font-size: 11px; \
  1661. min-width: 10px; \
  1662. vertical-align: top; \
  1663. text-align: right; \
  1664. \
  1665. cursor:default; \
  1666. overflow-x: scroll; \
  1667. } \
  1668. \
  1669. .imperator_overview a, \
  1670. .imperator_overview p { \
  1671. line-height: 12px; \
  1672. font-size: 11px; \
  1673. } \
  1674. \
  1675. .imperator_overview table.overview tbody tr { \
  1676. min-height: 22px; \
  1677. height: 22px; \
  1678. } \
  1679. \
  1680. .imperator_overview table.overview colgroup { \
  1681. border-left: 2px solid #DEC285; \
  1682. border-right: 2px solid #DEC285; \
  1683. } \
  1684. \
  1685. .imperator_overview table.overview td { \
  1686. padding: 1px 2px; \
  1687. min-width: 11px; \
  1688. } \
  1689. \
  1690. .imperator_overview table.overview tbody td { \
  1691. vertical-align: top; \
  1692. } \
  1693. \
  1694. .imperator_overview table.overview col { \
  1695. border-left: 1px dashed #ECCF8E; \
  1696. border-right: 1px dashed #ECCF8E; \
  1697. min-width: 20px; \
  1698. } \
  1699. \
  1700. .imperator_overview table.overview col { \
  1701. border-left: 1px dashed #ECCF8E; \
  1702. border-right: 1px dashed #ECCF8E; \
  1703. min-width: 20px; \
  1704. } \
  1705. \
  1706. .imperator_overview table.overview col.city_name { \
  1707. border-left: none; \
  1708. text-align: left; \
  1709. width: 95px; \
  1710. } \
  1711. \
  1712. .imperator_overview table.overview td.city_name { \
  1713. text-align: left; \
  1714. } \
  1715. \
  1716. .imperator_overview table.overview col.city_tradegood { \
  1717. border-right: none; \
  1718. width: 20px; \
  1719. } \
  1720. \
  1721. .imperator_overview table.overview td.city_tradegood img { \
  1722. height: 12pt; \
  1723. } \
  1724. \
  1725. .imperator_overview table.overview thead { \
  1726. background: #F8E7B3 url(skin/input/button.png) repeat-x scroll 0 bottom; \
  1727. } \
  1728. \
  1729. .imperator_overview table.overview tfoot { \
  1730. background: #E7C680 url(skin/input/button.png) repeat-x scroll 0 0; \
  1731. border-top: 2px solid #CB9B6A; \
  1732. vertical-align: top; \
  1733. } \
  1734. \
  1735. .imperator_overview table.overview tbody tr { \
  1736. border-top: 1px solid #ECCF8E; \
  1737. } \
  1738. \
  1739. .imperator_overview table.overview tbody tr:nth-child(odd) { \
  1740. background-color: #FAEEC0; \
  1741. } \
  1742. \
  1743. .imperator_overview table.overview td.city_name, \
  1744. .imperator_overview table.overview th.city_name { \
  1745. width: 95px; \
  1746. max-width: 95px; \
  1747. overflow: hidden; \
  1748. } \
  1749. \
  1750. .imperator_overview table.overview tbody tr.current { \
  1751. background-color: #FAE0BB; \
  1752. } \
  1753. \
  1754. .imperator_overview table.overview tbody tr:hover { \
  1755. background-color: #FAF7EB; \
  1756. border:1px solid #CB9B6A; \
  1757. } \
  1758. \
  1759. .imperator_overview table.overview tfoot tr { \
  1760. } \
  1761. \
  1762. .imperator_overview table.overview th { \
  1763. height: 22px; \
  1764. width: auto; \
  1765. padding: 1px; \
  1766. padding-bottom: 2px; \
  1767. padding-left: 3px; \
  1768. text-align: center; \
  1769. font-weight: bold; \
  1770. } \
  1771. \
  1772. .imperator_overview table.overview th.city_name, \
  1773. .imperator_overview table.overview td.city_name { \
  1774. overflow: hidden; \
  1775. } \
  1776. \
  1777. .imperator_overview table.overview td.totals_sigma_cell:after { \
  1778. content: url("skin/layout/sigma.png"); \
  1779. } \
  1780. \
  1781. /**************************************************************/ \
  1782. /* Tool tip formatting */ \
  1783. \
  1784. .tool_tip_container { \
  1785. background-color: #FAF3D7; \
  1786. border: 1px solid #CB9B6A; \
  1787. font-size: 11px; \
  1788. position: absolute; \
  1789. text-align: left; \
  1790. z-index: 110000; \
  1791. white-space: nowrap; \
  1792. } \
  1793. \
  1794. .tool_tip_container * { \
  1795. padding: 2px 3px; \
  1796. } \
  1797. \
  1798. .tool_tip_container thead, \
  1799. .imperator_tool_tip_title { \
  1800. background: #F8E7B3 url("skin/input/button.png") repeat-x scroll 0 bottom; \
  1801. white-space: nowrap; \
  1802. border-bottom: 1px solid #CB9B6A; \
  1803. } \
  1804. \
  1805. .tool_tip_container tfoot { \
  1806. background: #E7C680 url("skin/input/button.png") repeat-x scroll 0 0; \
  1807. border-top: 1px solid #CB9B6A; \
  1808. } \
  1809. \
  1810. table.building_upgrade_costs { \
  1811. width: 100%; \
  1812. } \
  1813. \
  1814. table.building_upgrade_costs td *, \
  1815. table.lootable_resources td *, \
  1816. table.target_military_garrison tfoot td *, \
  1817. table.combat_looted td * { \
  1818. padding: 0px 2px; \
  1819. } \
  1820. \
  1821. table.espionage_combats > tbody > tr:nth-child(even), \
  1822. table.travel_time tr:nth-child(even) { \
  1823. background-color: #FAEEC0; \
  1824. } \
  1825. \
  1826. table.building_upgrade_costs td.resource_icon img, \
  1827. table.building_upgrade_costs td.resource_missing img, \
  1828. table.lootable_resources td.resource_icon img, \
  1829. table.combat_looted td.resource_icon img { \
  1830. height: 11px; \
  1831. } \
  1832. \
  1833. table.resource_use_tool_tip, \
  1834. table.lootable_resources tbody td.resource_lootable, \
  1835. table.target_military_garrison tbody td { \
  1836. text-align: right; \
  1837. } \
  1838. \
  1839. table.resource_use_tool_tip col { \
  1840. border-left: 1px dashed #ECCF8E; \
  1841. border-right: 1px dashed #ECCF8E; \
  1842. } \
  1843. \
  1844. table.resource_use_tool_tip col:first-of-type { \
  1845. border-left: none; \
  1846. } \
  1847. \
  1848. table.resource_use_tool_tip col:last-of-type { \
  1849. border-right: none; \
  1850. } \
  1851. \
  1852. table.building_upgrade_costs td.resource_missing { \
  1853. color: #AA0303; \
  1854. text-align: right; \
  1855. } \
  1856. \
  1857. table.building_upgrade_costs td.resource_cost { \
  1858. text-align: right; \
  1859. } \
  1860. \
  1861. table.resources_in_transit_tool_tip img, \
  1862. table.resource_use_tool_tip img { \
  1863. padding: 0px 0px; \
  1864. padding-top: 1px; \
  1865. } \
  1866. \
  1867. table.resources_in_transit_tool_tip .resource_count, \
  1868. table.training_units_tool_tip .training_count, \
  1869. table.deploying_units_tool_tip .deploying_count \
  1870. table.plundering_units_tool_tip .plundering_count{ \
  1871. text-align: right; \
  1872. } \
  1873. \
  1874. div.combat_type_blockade, \
  1875. div.combat_type_plunder { \
  1876. max-width: 25px; \
  1877. width: 25px; \
  1878. height: 15px; \
  1879. max-height: 15px; \
  1880. background-size: 25px auto; \
  1881. background-position: left top; \
  1882. background-repeat: no-repeat; \
  1883. background-position: 0px 0px; \
  1884. } \
  1885. div.combat_type_blockade { \
  1886. background-image: url("skin/actions/blockade.jpg"); \
  1887. } \
  1888. div.combat_type_plunder { \
  1889. background-image: url("skin/actions/plunder.jpg"); \
  1890. } \
  1891. \
  1892. /**************************************************************/ \
  1893. /* Resource table specific formatting */ \
  1894. \
  1895. #ImperatorOverviewResourceTable .resource_consumption, \
  1896. #ImperatorOverviewResourceTable .resource_consumption a { \
  1897. font-size: 9px; \
  1898. } \
  1899. \
  1900. #ImperatorOverviewResourceTable .resources_transporting { \
  1901. font-size: 9px; \
  1902. line-height: 10px; \
  1903. color: #4455EB; \
  1904. } \
  1905. \
  1906. #ImperatorOverviewResourceTable .is_under_safe_limit:before { \
  1907. content: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAJCAYAAAD+WDajAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAEFJREFUeNpi/P//PwMIhOrzQhhAsPriZ0YQzYQugcxnQhaE6YABxhA9HhRdyICJAQ/AayzxOtFdzYRuFLIVAAEGANwqFwuukYKqAAAAAElFTkSuQmCC"); \
  1908. float: left; \
  1909. } \
  1910. \
  1911. #ImperatorOverviewResourceTable .resource_current { \
  1912. white-space: nowrap; \
  1913. } \
  1914. \
  1915. #ImperatorOverviewResourceTable td.research, \
  1916. #ImperatorOverviewResourceTable td.population, \
  1917. #ImperatorOverviewResourceTable td.population_growth { \
  1918. text-align: center;; \
  1919. } \
  1920. \
  1921. #ImperatorOverviewResourceTable td.population_growth_icon img { \
  1922. width: 18px; \
  1923. } \
  1924. \
  1925. #ImperatorOverviewResourceTable a.transport_goods, \
  1926. #ImperatorOverviewResourceTable a.to_town_hall, \
  1927. #ImperatorOverviewBuildingsTable a.transport_goods, \
  1928. #ImperatorOverviewBuildingsTable a.to_city_view, \
  1929. #ImperatorOverviewMilitaryTable a.deploy_army, \
  1930. #ImperatorOverviewMilitaryTable a.deploy_navy, \
  1931. #ImperatorOverviewMilitaryTable a.to_barracks, \
  1932. #ImperatorOverviewMilitaryTable a.to_shipyard, \
  1933. #ImperatorOverviewEspionageTable a.spy_mission, \
  1934. #ImperatorOverviewEspionageTable a.pillage_mission, \
  1935. #ImperatorOverviewEspionageTable a.blockade_mission, \
  1936. #ImperatorOverviewEspionageTable a.occupy_mission, \
  1937. #ImperatorOverviewEspionageTable a.send_spy_mission, \
  1938. #ImperatorOverviewEspionageTable a.remove_espionage_target { \
  1939. \
  1940. max-width: 25px; \
  1941. width: 25px; \
  1942. height: 17px; \
  1943. display: inline-block; \
  1944. background-size: 25px auto; \
  1945. background-position: left top; \
  1946. background-repeat: no-repeat; \
  1947. background-position: 0px 0px; \
  1948. } \
  1949. \
  1950. #ImperatorOverviewResourceTable a.transport_goods, \
  1951. #ImperatorOverviewBuildingsTable a.transport_goods { \
  1952. background-image: url("skin/actions/transport.jpg"); \
  1953. margin-left: 2px; \
  1954. } \
  1955. \
  1956. #ImperatorOverviewResourceTable a.to_town_hall, \
  1957. #ImperatorOverviewBuildingsTable a.to_city_view { \
  1958. background-image: url("skin/layout/icon-city2.png"); \
  1959. } \
  1960. \
  1961. #ImperatorOverviewResourceTable a.transport_goods:hover, \
  1962. #ImperatorOverviewBuildingsTable a.transport_goods:hover, \
  1963. #ImperatorOverviewMilitaryTable a.deploy_navy:hover, \
  1964. #ImperatorOverviewMilitaryTable a.deploy_army:hover, \
  1965. #ImperatorOverviewEspionageTable a.pillage_mission:hover, \
  1966. #ImperatorOverviewEspionageTable a.blockade_mission:hover, \
  1967. #ImperatorOverviewEspionageTable a.occupy_mission:hover, \
  1968. #ImperatorOverviewEspionageTable a.send_spy_mission:hover { \
  1969. background-position: 0px -17px; \
  1970. } \
  1971. \
  1972. #ImperatorOverviewResourceTable tr.current a.transport_goods, \
  1973. #ImperatorOverviewBuildingsTable tr.current a.transport_goods, \
  1974. #ImperatorOverviewMilitaryTable tr.current a.deploy_navy, \
  1975. #ImperatorOverviewMilitaryTable tr.current a.deploy_army { \
  1976. background-position: 0px -34px; \
  1977. } \
  1978. \
  1979. #ImperatorOverviewResourceTable.city_type_deployedCities a.transport_goods, \
  1980. #ImperatorOverviewResourceTable.city_type_occupiedCities a.transport_goods, \
  1981. #ImperatorOverviewBuildingsTable.city_type_deployedCities a.transport_goods, \
  1982. #ImperatorOverviewBuildingsTable.city_type_occupiedCities a.transport_goods { \
  1983. background-position: 0px -34px; \
  1984. } \
  1985. \
  1986. .imperator_overview table.overview td.actions { \
  1987. text-align: left; \
  1988. } \
  1989. \
  1990. #ImperatorOverviewResourceTable th.actions, \
  1991. #ImperatorOverviewBuildingsTable th.actions, \
  1992. #ImperatorOverviewBuildingsTable td.actions, \
  1993. #ImperatorOverviewMilitaryTable th.actions { \
  1994. width: 52px !important; \
  1995. max-width: 52px !important; \
  1996. min-width: 52px !important; \
  1997. } \
  1998. \
  1999. /************************************************************/ \
  2000. /* Percent bars and warning indications */ \
  2001. \
  2002. .imperator_overview .percent_bar { \
  2003. border-radius: 2px; \
  2004. height: 3px; \
  2005. background-color: !transparent; \
  2006. border: 1px solid #B07D56; \
  2007. overflow: hidden; \
  2008. min-width: 45px; \
  2009. margin-top: 1px; \
  2010. } \
  2011. \
  2012. .imperator_overview .percent_bar .percent_bar_active { \
  2013. height: 100%; \
  2014. border-top-left-radius: 2px; \
  2015. border-bottom-left-radius: 2px; \
  2016. background-color: #481010; \
  2017. } \
  2018. \
  2019. .imperator_overview .percent_bar.expiration_forseeable .percent_bar_active { \
  2020. background-color: #7F1D1A; \
  2021. } \
  2022. \
  2023. .imperator_overview .percent_bar.expiration_soon .percent_bar_active { \
  2024. background-color: #B42521; \
  2025. } \
  2026. \
  2027. .imperator_overview .percent_bar.expiration_imminent .percent_bar_active, \
  2028. .imperator_overview .percent_bar.expiration_now .percent_bar_active { \
  2029. background-color: #FF0000; \
  2030. } \
  2031. \
  2032. .imperator_overview .percent_bar.percent_bar_desire_filled.percent_bar_filled \
  2033. .percent_bar_active { \
  2034. background-color: #285E28; \
  2035. } \
  2036. \
  2037. .imperator_overview .expiration_now, \
  2038. .imperator_overview .expiration_imminent { \
  2039. font-weight: bold; \
  2040. color: red; \
  2041. } \
  2042. \
  2043. .imperator_overview .expiration_soon { \
  2044. font-weight: bold; \
  2045. color: #B42521; \
  2046. } \
  2047. \
  2048. .imperator_overview .expiration_forseeable { \
  2049. color: #8F1D1A; \
  2050. } \
  2051. \
  2052. .imperator_overview .imperator_warning { \
  2053. color: red; \
  2054. } \
  2055. \
  2056. /***************************************************************/ \
  2057. /* Buildings table specific formatting */ \
  2058. \
  2059. #ImperatorOverviewBuildingsTable tbody td{ \
  2060. vertical-align: middle; \
  2061. } \
  2062. \
  2063. #ImperatorOverviewBuildingsTable th { \
  2064. max-width: 15px; \
  2065. width: 15px; \
  2066. overflow: hidden; \
  2067. cursor: default; \
  2068. height: 36px; \
  2069. } \
  2070. \
  2071. #ImperatorOverviewBuildingsTable td { \
  2072. width: 15px; \
  2073. } \
  2074. #ImperatorOverviewBuildingsTable th.building[colspan="2"] { max-width: 20px; } \
  2075. #ImperatorOverviewBuildingsTable th.building[colspan="3"] { max-width: 35px;} \
  2076. #ImperatorOverviewBuildingsTable th.building[colspan="4"] { max-width: 45px;} \
  2077. #ImperatorOverviewBuildingsTable th.building[colspan="5"] { max-width: 55px;} \
  2078. #ImperatorOverviewBuildingsTable th.building[colspan="6"] { max-width: 65px;} \
  2079. #ImperatorOverviewBuildingsTable th.building[colspan="7"] { max-width: 75px;} \
  2080. #ImperatorOverviewBuildingsTable th.building[colspan="8"] { max-width: 85px;} \
  2081. #ImperatorOverviewBuildingsTable th.building[colspan="9"] { max-width: 95px;} \
  2082. #ImperatorOverviewBuildingsTable th.building[colspan="10"] { max-width: 100px;} \
  2083. #ImperatorOverviewBuildingsTable th.building[colspan="11"] { max-width: 105px;} \
  2084. #ImperatorOverviewBuildingsTable th.building[colspan="12"] { max-width: 110px;} \
  2085. \
  2086. \
  2087. #ImperatorOverviewBuildingsTable td.building_upgrading a { \
  2088. font-weight: bold; \
  2089. color: green; \
  2090. } \
  2091. \
  2092. #ImperatorOverviewBuildingsTable col.building.building_additional { \
  2093. border-left: none; \
  2094. } \
  2095. \
  2096. #ImperatorOverviewBuildingsTable col.building { \
  2097. border-right: none; \
  2098. } \
  2099. \
  2100. /**************************************************************/ \
  2101. /* Military table specific formatting */ \
  2102. \
  2103. #ImperatorOverviewMilitaryTable thead { \
  2104. height: 36px; \
  2105. cursor: default; \
  2106. } \
  2107. \
  2108. #ImperatorOverviewMilitaryTable th { \
  2109. overflow: hidden; \
  2110. max-width: 23px; \
  2111. } \
  2112. \
  2113. #ImperatorOverviewMilitaryTable a.deploy_army { \
  2114. background-image: url("skin/actions/move_army.jpg"); \
  2115. } \
  2116. \
  2117. #ImperatorOverviewMilitaryTable a.deploy_navy { \
  2118. background-image: url("skin/actions/move_fleet.jpg"); \
  2119. margin-left: 2px; \
  2120. } \
  2121. \
  2122. #ImperatorOverviewMilitaryTable a.to_barracks { \
  2123. background-image:url("skin/img/city/barracks_l.png"); \
  2124. background-size: 30px auto; \
  2125. background-position: bottom left; \
  2126. } \
  2127. \
  2128. #ImperatorOverviewMilitaryTable a.to_shipyard { \
  2129. background-image:url("skin/img/city/shipyard_l.png"); \
  2130. } \
  2131. \
  2132. #ImperatorOverviewMilitaryTable a.to_barracks+a.to_shipyard { \
  2133. margin-left: 2px; \
  2134. } \
  2135. \
  2136. #ImperatorOverviewMilitaryTable .military_training { \
  2137. font-size: 9px; \
  2138. line-height: 10px; \
  2139. color: green; \
  2140. } \
  2141. \
  2142. #ImperatorOverviewMilitaryTable .military_deploying { \
  2143. font-size: 9px; \
  2144. line-height: 10px; \
  2145. color: #4455EB; \
  2146. } \
  2147. \
  2148. #ImperatorOverviewMilitaryTable .military_plundering { \
  2149. font-size: 9px; \
  2150. line-height: 10px; \
  2151. color: #8302A3; \
  2152. } \
  2153. /**************************************************************/ \
  2154. /* Espionage table specific formatting */ \
  2155. \
  2156. #ImperatorOverviewEspionageTable td.city_tradegood { \
  2157. width: auto; \
  2158. min-width: 50px; \
  2159. text-align: left; \
  2160. } \
  2161. #ImperatorOverviewEspionageTable td.actions { \
  2162. min-width: 160px; \
  2163. } \
  2164. #ImperatorOverviewEspionageTable a.spy_mission { \
  2165. /*background-image: url("skin/friends/citymenu.png"); \
  2166. background-position: 0px -129px; */\
  2167. background-image: url("skin/layout/icon-mission.png"); \
  2168. } \
  2169. #ImperatorOverviewEspionageTable a.pillage_mission { \
  2170. background-image: url("skin/actions/plunder.jpg"); \
  2171. margin-left: 2px; \
  2172. } \
  2173. #ImperatorOverviewEspionageTable a.blockade_mission { \
  2174. background-image: url("skin/actions/blockade.jpg"); \
  2175. margin-left: 2px; \
  2176. } \
  2177. #ImperatorOverviewEspionageTable a.occupy_mission { \
  2178. background-image: url("skin/actions/occupy.jpg"); \
  2179. margin-left: 2px; \
  2180. } \
  2181. #ImperatorOverviewEspionageTable a.send_spy_mission { \
  2182. background-image: url("skin/actions/espionage.jpg"); \
  2183. margin-left: 2px; \
  2184. } \
  2185. #ImperatorOverviewEspionageTable a.remove_espionage_target { \
  2186. background-image: url("skin/actions/defend.jpg"); \
  2187. background-position: 0px -34px; \
  2188. margin-left: 2px; \
  2189. } \
  2190. #ImperatorOverviewEspionageTable a.player_state_inactive { \
  2191. color: grey; \
  2192. } \
  2193. #ImperatorOverviewEspionageTable a.player_state_vacation { \
  2194. color: green; \
  2195. } \
  2196. #ImperatorOverviewEspionageTable tbody td { \
  2197. vertical-align: middle; \
  2198. } \
  2199. #ImperatorOverviewEspionageTable td.player, \
  2200. #ImperatorOverviewEspionageTable td.location { \
  2201. text-align: left; \
  2202. } \
  2203. .espionage_blockader, \
  2204. .espionage_occupier { \
  2205. margin-left: 1pt; \
  2206. margin-right: 1pt; \
  2207. } \
  2208. .target_military_garrison thead th { \
  2209. height: 36px; \
  2210. cursor: default; \
  2211. } \
  2212. .target_military_garrison th { \
  2213. overflow: hidden; \
  2214. max-width: 23px; \
  2215. } \
  2216. .target_military_garrison th.military { \
  2217. background-size: auto 33px; \
  2218. } \
  2219. .target_military_garrison th.military_phalanx { \
  2220. background-image:url("skin/characters/military/x60_y60/y60_phalanx_faceright.png"); \
  2221. } \
  2222. .target_military_garrison th.military_steamgiant { \
  2223. background-image:url("skin/characters/military/x60_y60/y60_steamgiant_faceright.png"); \
  2224. } \
  2225. .target_military_garrison th.military_spearman { \
  2226. background-image:url("skin/characters/military/x60_y60/y60_spearman_faceright.png"); \
  2227. } \
  2228. .target_military_garrison th.military_swordsman { \
  2229. background-image:url("skin/characters/military/x60_y60/y60_swordsman_faceright.png"); \
  2230. } \
  2231. .target_military_garrison th.military_slinger { \
  2232. background-image:url("skin/characters/military/x60_y60/y60_slinger_faceright.png"); \
  2233. } \
  2234. .target_military_garrison th.military_archer { \
  2235. background-image:url("skin/characters/military/x60_y60/y60_archer_faceright.png"); \
  2236. } \
  2237. .target_military_garrison th.military_marksman { \
  2238. background-image:url("skin/characters/military/x60_y60/y60_marksman_faceright.png"); \
  2239. } \
  2240. .target_military_garrison th.military_ram { \
  2241. background-image:url("skin/characters/military/x60_y60/y60_ram_faceright.png"); \
  2242. background-size: auto 18px; \
  2243. } \
  2244. .target_military_garrison th.military_catapult { \
  2245. background-image:url("skin/characters/military/x60_y60/y60_catapult_faceright.png"); \
  2246. background-size: auto 23px; \
  2247. } \
  2248. .target_military_garrison th.military_mortar { \
  2249. background-image:url("skin/characters/military/x60_y60/y60_mortar_faceright.png"); \
  2250. background-size: auto 22px; \
  2251. } \
  2252. .target_military_garrison th.military_gyrocopter { \
  2253. background-image:url("skin/characters/military/x60_y60/y60_gyrocopter_faceright.png"); \
  2254. background-size: auto 21px; \
  2255. } \
  2256. .target_military_garrison th.military_bombardier { \
  2257. background-image:url("skin/characters/military/x60_y60/y60_bombardier_faceright.png"); \
  2258. } \
  2259. .target_military_garrison th.military_cook { \
  2260. background-image:url("skin/characters/military/x60_y60/y60_cook_faceright.png"); \
  2261. } \
  2262. .target_military_garrison th.military_medic { \
  2263. background-image:url("skin/characters/military/x60_y60/y60_medic_faceright.png"); \
  2264. } \
  2265. .target_military_garrison th.military_ship_flamethrower { \
  2266. background-image:url("skin/characters/fleet/60x60/ship_flamethrower_faceright.png"); \
  2267. background-size: 33px auto; \
  2268. } \
  2269. .target_military_garrison th.military_ship_steamboat { \
  2270. background-image:url("skin/characters/fleet/60x60/ship_steamboat_faceright.png"); \
  2271. background-size: 33px auto; \
  2272. } \
  2273. .target_military_garrison th.military_ship_ram { \
  2274. background-image:url("skin/characters/fleet/60x60/ship_ram_faceright.png"); \
  2275. background-size: 33px auto; \
  2276. } \
  2277. .target_military_garrison th.military_ship_ballista { \
  2278. background-image:url("skin/characters/fleet/60x60/ship_ballista_faceright.png"); \
  2279. background-size: 33px auto; \
  2280. } \
  2281. .target_military_garrison th.military_ship_catapult { \
  2282. background-image:url("skin/characters/fleet/60x60/ship_catapult_faceright.png"); \
  2283. background-size: 33px auto; \
  2284. } \
  2285. .target_military_garrison th.military_ship_mortar { \
  2286. background-image:url("skin/characters/fleet/60x60/ship_mortar_faceright.png"); \
  2287. background-size: 33px auto; \
  2288. } \
  2289. .target_military_garrison th.military_ship_submarine { \
  2290. background-image:url("skin/characters/fleet/60x60/ship_submarine_faceright.png"); \
  2291. background-size: 33px auto; \
  2292. } \
  2293. .target_military_garrison th.military_ship_paddlespeedship { \
  2294. background-image:url("skin/characters/fleet/60x60/ship_paddlespeedship_faceright.png"); \
  2295. background-size: 33px auto; \
  2296. } \
  2297. .target_military_garrison th.military_ship_ballooncarrier { \
  2298. background-image:url("skin/characters/fleet/60x60/ship_ballooncarrier_faceright.png"); \
  2299. background-size: 33px auto; \
  2300. } \
  2301. .target_military_garrison th.military_ship_tender { \
  2302. background-image:url("skin/characters/fleet/60x60/ship_tender_faceright.png"); \
  2303. background-size: 33px auto; \
  2304. } \
  2305. .target_military_garrison th.military_ship_rocketship { \
  2306. background-image:url("skin/characters/fleet/60x60/ship_rocketship_faceright.png"); \
  2307. background-size: 33px auto; \
  2308. } \
  2309. \
  2310. /*****************************************************************/ \
  2311. /* Image styling for table headers */ \
  2312. \
  2313. #ImperatorOverviewBuildingsTable th.building, \
  2314. #ImperatorOverviewMilitaryTable th.military, \
  2315. .imperator_overview table.overview th.action_points, \
  2316. #ImperatorOverviewResourceTable th.population, \
  2317. #ImperatorOverviewResourceTable th.population_growth, \
  2318. #ImperatorOverviewResourceTable th.research, \
  2319. #ImperatorOverviewResourceTable th.resource, \
  2320. #ImperatorOverviewEspionageTable th.location, \
  2321. #ImperatorOverviewEspionageTable th.travel_time, \
  2322. #ImperatorOverviewEspionageTable th.townhall_level, \
  2323. #ImperatorOverviewEspionageTable th.wall_level, \
  2324. #ImperatorOverviewEspionageTable th.resources_lootable, \
  2325. #ImperatorOverviewEspionageTable th.combats, \
  2326. #ImperatorOverviewEspionageTable th.military_score, \
  2327. .target_military_garrison th.military \
  2328. { \
  2329. -webkit-user-select: none; \
  2330. -khtml-user-select: none; \
  2331. -moz-user-select: none; \
  2332. -o-user-select: none; \
  2333. user-select: none; \
  2334. cursor: default; \
  2335. color: transparent; \
  2336. background-repeat: no-repeat; \
  2337. background-attachment: center; \
  2338. background-position: center; \
  2339. } \
  2340. \
  2341. .imperator_overview table.overview td.action_points, \
  2342. .imperator_overview table.overview th.action_points { \
  2343. max-width: 20px; \
  2344. width: 20px; \
  2345. overflow: hidden; \
  2346. } \
  2347. \
  2348. .imperator_overview table.overview th.action_points { \
  2349. background-image:url("skin/resources/icon_actionpoints.png"); \
  2350. max-width: 20px; \
  2351. } \
  2352. .imperator_overview table.overview td.action_points { \
  2353. max-width: 20px; \
  2354. } \
  2355. \
  2356. #ImperatorOverviewResourceTable th.population { \
  2357. background-image:url("skin/resources/icon_population.png"); \
  2358. } \
  2359. \
  2360. #ImperatorOverviewResourceTable th.population_growth { \
  2361. background-image:url("skin/icons/growth_positive.png"); \
  2362. } \
  2363. \
  2364. #ImperatorOverviewResourceTable th.research { \
  2365. background-image:url("skin/layout/bulb-on.png"); \
  2366. } \
  2367. \
  2368. #ImperatorOverviewResourceTable th.resource_wood { \
  2369. background-image:url("skin/resources/icon_wood.png"); \
  2370. } \
  2371. \
  2372. #ImperatorOverviewResourceTable th.resource_wine { \
  2373. background-image:url("skin/resources/icon_wine.png"); \
  2374. } \
  2375. \
  2376. #ImperatorOverviewResourceTable th.resource_marble { \
  2377. background-image:url("skin/resources/icon_marble.png"); \
  2378. } \
  2379. \
  2380. #ImperatorOverviewResourceTable th.resource_crystal { \
  2381. background-image:url("skin/resources/icon_crystal.png"); \
  2382. } \
  2383. \
  2384. #ImperatorOverviewResourceTable th.resource_sulfur { \
  2385. background-image:url("skin/resources/icon_sulfur.png"); \
  2386. } \
  2387. \
  2388. #ImperatorOverviewBuildingsTable th.building { \
  2389. background-size: 55px; \
  2390. } \
  2391. \
  2392. #ImperatorOverviewBuildingsTable th.building_spots { \
  2393. background-image:url("skin/img/city/flag_red.png"); \
  2394. background-size: 25px; \
  2395. } \
  2396. \
  2397. #ImperatorOverviewBuildingsTable th.building_townHall { \
  2398. background-image:url("skin/img/city/townhall_l.png"); \
  2399. } \
  2400. \
  2401. #ImperatorOverviewBuildingsTable th.building_palace { \
  2402. background-image:url("skin/img/city/palace_l.png"); \
  2403. } \
  2404. \
  2405. #ImperatorOverviewBuildingsTable th.building_palaceColony { \
  2406. background-image:url("skin/img/city/palaceColony_l.png"); \
  2407. } \
  2408. \
  2409. #ImperatorOverviewBuildingsTable th.building_tavern { \
  2410. background-image:url("skin/img/city/taverne_r.png"); \
  2411. } \
  2412. \
  2413. #ImperatorOverviewBuildingsTable th.building_museum { \
  2414. background-image:url("skin/img/city/museum_r.png"); \
  2415. } \
  2416. \
  2417. #ImperatorOverviewBuildingsTable th.building_academy { \
  2418. background-image:url("skin/img/city/academy_l.png"); \
  2419. } \
  2420. \
  2421. #ImperatorOverviewBuildingsTable th.building_workshop { \
  2422. background-image:url("skin/img/city/workshop_l.png"); \
  2423. } \
  2424. \
  2425. #ImperatorOverviewBuildingsTable th.building_temple { \
  2426. background-image:url("skin/img/city/temple_l.png"); \
  2427. } \
  2428. \
  2429. #ImperatorOverviewBuildingsTable th.building_embassy { \
  2430. background-image:url("skin/img/city/embassy_l.png"); \
  2431. } \
  2432. \
  2433. #ImperatorOverviewBuildingsTable th.building_warehouse { \
  2434. background-image:url("skin/img/city/warehouse_l.png"); \
  2435. } \
  2436. \
  2437. #ImperatorOverviewBuildingsTable th.building_dump { \
  2438. background-image:url("skin/img/city/dump_l.png"); \
  2439. } \
  2440. \
  2441. #ImperatorOverviewBuildingsTable th.building_branchOffice { \
  2442. background-image:url("skin/img/city/branchoffice_l.png"); \
  2443. } \
  2444. \
  2445. #ImperatorOverviewBuildingsTable th.building_port { \
  2446. background-image:url("skin/img/city/port_l.png"); \
  2447. } \
  2448. \
  2449. #ImperatorOverviewBuildingsTable th.building_wall { \
  2450. background-image:url("skin/img/city/wall.png"); \
  2451. } \
  2452. \
  2453. #ImperatorOverviewBuildingsTable th.building_safehouse { \
  2454. background-image:url("skin/img/city/safehouse_l.png"); \
  2455. background-size: 65px; \
  2456. } \
  2457. \
  2458. #ImperatorOverviewBuildingsTable th.building_barracks { \
  2459. background-image:url("skin/img/city/barracks_l.png"); \
  2460. } \
  2461. \
  2462. #ImperatorOverviewBuildingsTable th.building_shipyard { \
  2463. background-image:url("skin/img/city/shipyard_l.png"); \
  2464. background-size: 45px; \
  2465. } \
  2466. \
  2467. #ImperatorOverviewBuildingsTable th.building_pirateFortress { \
  2468. background-image:url("skin/img/city/pirateFortress_l.png"); \
  2469. background-size: 45px; \
  2470. } \
  2471. \
  2472. #ImperatorOverviewBuildingsTable th.building_forester { \
  2473. background-image:url("skin/img/city/forester_l.png"); \
  2474. } \
  2475. \
  2476. #ImperatorOverviewBuildingsTable th.building_carpentering { \
  2477. background-image:url("skin/img/city/carpentering_l.png"); \
  2478. } \
  2479. \
  2480. #ImperatorOverviewBuildingsTable th.building_winegrower { \
  2481. background-image:url("skin/img/city/winegrower_l.png"); \
  2482. } \
  2483. \
  2484. #ImperatorOverviewBuildingsTable th.building_vineyard { \
  2485. background-image:url("skin/img/city/vineyard_l.png"); \
  2486. } \
  2487. \
  2488. #ImperatorOverviewBuildingsTable th.building_stonemason { \
  2489. background-image:url("skin/img/city/stonemason_l.png"); \
  2490. } \
  2491. \
  2492. #ImperatorOverviewBuildingsTable th.building_architect { \
  2493. background-image:url("skin/img/city/architect_l.png"); \
  2494. } \
  2495. \
  2496. #ImperatorOverviewBuildingsTable th.building_glassblowing { \
  2497. background-image:url("skin/img/city/glassblowing_l.png"); \
  2498. } \
  2499. \
  2500. #ImperatorOverviewBuildingsTable th.building_optician { \
  2501. background-image:url("skin/img/city/optician_l.png"); \
  2502. } \
  2503. \
  2504. #ImperatorOverviewBuildingsTable th.building_alchemist { \
  2505. background-image:url("skin/img/city/alchemist_l.png"); \
  2506. } \
  2507. \
  2508. #ImperatorOverviewBuildingsTable th.building_fireworker { \
  2509. background-image:url("skin/img/city/fireworker_l.png"); \
  2510. } \
  2511. \
  2512. #ImperatorOverviewMilitaryTable th.military { \
  2513. background-size: auto 33px; \
  2514. } \
  2515. \
  2516. #ImperatorOverviewMilitaryTable th.military_phalanx { \
  2517. background-image:url("skin/characters/military/x60_y60/y60_phalanx_faceright.png"); \
  2518. } \
  2519. #ImperatorOverviewMilitaryTable th.military_steamgiant { \
  2520. background-image:url("skin/characters/military/x60_y60/y60_steamgiant_faceright.png"); \
  2521. } \
  2522. #ImperatorOverviewMilitaryTable th.military_spearman { \
  2523. background-image:url("skin/characters/military/x60_y60/y60_spearman_faceright.png"); \
  2524. } \
  2525. #ImperatorOverviewMilitaryTable th.military_swordsman { \
  2526. background-image:url("skin/characters/military/x60_y60/y60_swordsman_faceright.png"); \
  2527. } \
  2528. #ImperatorOverviewMilitaryTable th.military_slinger { \
  2529. background-image:url("skin/characters/military/x60_y60/y60_slinger_faceright.png"); \
  2530. } \
  2531. #ImperatorOverviewMilitaryTable th.military_archer { \
  2532. background-image:url("skin/characters/military/x60_y60/y60_archer_faceright.png"); \
  2533. } \
  2534. #ImperatorOverviewMilitaryTable th.military_marksman { \
  2535. background-image:url("skin/characters/military/x60_y60/y60_marksman_faceright.png"); \
  2536. } \
  2537. #ImperatorOverviewMilitaryTable th.military_ram { \
  2538. background-image:url("skin/characters/military/x60_y60/y60_ram_faceright.png"); \
  2539. background-size: auto 18px; \
  2540. } \
  2541. #ImperatorOverviewMilitaryTable th.military_catapult { \
  2542. background-image:url("skin/characters/military/x60_y60/y60_catapult_faceright.png"); \
  2543. background-size: auto 23px; \
  2544. } \
  2545. #ImperatorOverviewMilitaryTable th.military_mortar { \
  2546. background-image:url("skin/characters/military/x60_y60/y60_mortar_faceright.png"); \
  2547. background-size: auto 22px; \
  2548. } \
  2549. #ImperatorOverviewMilitaryTable th.military_gyrocopter { \
  2550. background-image:url("skin/characters/military/x60_y60/y60_gyrocopter_faceright.png"); \
  2551. background-size: auto 21px; \
  2552. } \
  2553. #ImperatorOverviewMilitaryTable th.military_bombardier { \
  2554. background-image:url("skin/characters/military/x60_y60/y60_bombardier_faceright.png"); \
  2555. } \
  2556. #ImperatorOverviewMilitaryTable th.military_cook { \
  2557. background-image:url("skin/characters/military/x60_y60/y60_cook_faceright.png"); \
  2558. } \
  2559. #ImperatorOverviewMilitaryTable th.military_medic { \
  2560. background-image:url("skin/characters/military/x60_y60/y60_medic_faceright.png"); \
  2561. } \
  2562. #ImperatorOverviewMilitaryTable th.military_ship_flamethrower { \
  2563. background-image:url("skin/characters/fleet/60x60/ship_flamethrower_faceright.png"); \
  2564. background-size: 33px auto; \
  2565. } \
  2566. #ImperatorOverviewMilitaryTable th.military_ship_steamboat { \
  2567. background-image:url("skin/characters/fleet/60x60/ship_steamboat_faceright.png"); \
  2568. background-size: 33px auto; \
  2569. } \
  2570. #ImperatorOverviewMilitaryTable th.military_ship_ram { \
  2571. background-image:url("skin/characters/fleet/60x60/ship_ram_faceright.png"); \
  2572. background-size: 33px auto; \
  2573. } \
  2574. #ImperatorOverviewMilitaryTable th.military_ship_ballista { \
  2575. background-image:url("skin/characters/fleet/60x60/ship_ballista_faceright.png"); \
  2576. background-size: 33px auto; \
  2577. } \
  2578. #ImperatorOverviewMilitaryTable th.military_ship_catapult { \
  2579. background-image:url("skin/characters/fleet/60x60/ship_catapult_faceright.png"); \
  2580. background-size: 33px auto; \
  2581. } \
  2582. #ImperatorOverviewMilitaryTable th.military_ship_mortar { \
  2583. background-image:url("skin/characters/fleet/60x60/ship_mortar_faceright.png"); \
  2584. background-size: 33px auto; \
  2585. } \
  2586. #ImperatorOverviewMilitaryTable th.military_ship_submarine { \
  2587. background-image:url("skin/characters/fleet/60x60/ship_submarine_faceright.png"); \
  2588. background-size: 33px auto; \
  2589. } \
  2590. #ImperatorOverviewMilitaryTable th.military_ship_paddlespeedship { \
  2591. background-image:url("skin/characters/fleet/60x60/ship_paddlespeedship_faceright.png"); \
  2592. background-size: 33px auto; \
  2593. } \
  2594. #ImperatorOverviewMilitaryTable th.military_ship_ballooncarrier { \
  2595. background-image:url("skin/characters/fleet/60x60/ship_ballooncarrier_faceright.png"); \
  2596. background-size: 33px auto; \
  2597. } \
  2598. #ImperatorOverviewMilitaryTable th.military_ship_tender { \
  2599. background-image:url("skin/characters/fleet/60x60/ship_tender_faceright.png"); \
  2600. background-size: 33px auto; \
  2601. } \
  2602. #ImperatorOverviewMilitaryTable th.military_ship_rocketship { \
  2603. background-image:url("skin/characters/fleet/60x60/ship_rocketship_faceright.png"); \
  2604. background-size: 33px auto; \
  2605. } \
  2606. #ImperatorOverviewEspionageTable th.location { \
  2607. background-image: url("skin/layout/icon-island.png"); \
  2608. } \
  2609. #ImperatorOverviewEspionageTable th.travel_time { \
  2610. background-image: url("skin/resources/icon_time.png"); \
  2611. } \
  2612. #ImperatorOverviewEspionageTable th.townhall_level { \
  2613. background-image:url("skin/img/city/townhall_l.png"); \
  2614. background-size: auto 100%; \
  2615. } \
  2616. #ImperatorOverviewEspionageTable th.wall_level { \
  2617. background-image:url("skin/img/city/wall.png"); \
  2618. background-size: auto 100%; \
  2619. } \
  2620. #ImperatorOverviewEspionageTable th.resources_lootable { \
  2621. background-image: url("skin/characters/fleet/40x40/ship_transport_r_40x40.png"); \
  2622. background-size: auto 100%; \
  2623. } \
  2624. #ImperatorOverviewEspionageTable th.combats { \
  2625. background-image: url("skin/minimized/plunder.png"); \
  2626. background-size: auto 120%; \
  2627. } \
  2628. #ImperatorOverviewEspionageTable th.military_score { \
  2629. background-image: url("skin/characters/military/x60_y60/y60_phalanx_faceright.png"); \
  2630. background-size: auto 100%; \
  2631. } \
  2632. \
  2633. /********************** Settings dialog *************************/ \
  2634. #options .tabmenu .tab { \
  2635. width: auto; \
  2636. } \
  2637. '
  2638. );
  2639. }
  2640. var settings = new IkaTools.Settings.Settings('ImperatorSettings');
  2641. var localizedLanguage = settings.choice(
  2642. 'language',
  2643. '',
  2644. {
  2645. 'Automatic': '',
  2646. 'Türkçe': 'tr',
  2647. 'English': 'en',
  2648. 'Bosnian': 'ba',
  2649. 'Spanish': 'es',
  2650. 'French': 'fr',
  2651. 'German': 'de',
  2652. 'Hungarian': 'hu',
  2653. 'Polish': 'pl',
  2654. },
  2655. localizer.delayedLocalize('settings','language'));
  2656. var showResourceOverview = settings.boolean(
  2657. 'show_resource_overview',
  2658. true,
  2659. localizer.delayedLocalize('misc','resource_overview'));
  2660. var showBuildingsOverview = settings.boolean(
  2661. 'show_buildings_overview',
  2662. true,
  2663. localizer.delayedLocalize('misc','buildings_overview'));
  2664. var showMilitaryOverview = settings.boolean(
  2665. 'show_military_overview',
  2666. true,
  2667. localizer.delayedLocalize('misc','military_overview'));
  2668. var showEspionageOverview = settings.boolean(
  2669. 'show_espionage_overview',
  2670. true,
  2671. localizer.delayedLocalize('misc','espionage_overview'));
  2672. var autoAcceptDailyBonus = settings.boolean(
  2673. 'auto_accept_daily_bonus',
  2674. true,
  2675. localizer.delayedLocalize('settings','auto_accept_daily_bonus'));
  2676. var hideAds = settings.boolean(
  2677. 'hide_ads',
  2678. true,
  2679. localizer.delayedLocalize('settings','hide_ads'));
  2680. var hideFacebook = settings.boolean(
  2681. 'hide_facebook',
  2682. true,
  2683. localizer.delayedLocalize('settings','hide_facebook'));
  2684. var hideFriendsBar = settings.boolean(
  2685. 'hide_friends_bar',
  2686. false,
  2687. localizer.delayedLocalize('settings','hide_friends_bar'));
  2688. var hideChat = settings.boolean(
  2689. 'hide_chat',
  2690. false,
  2691. localizer.delayedLocalize('settings','hide_chat'));
  2692. var transportButtons = settings.boolean(
  2693. 'transport_buttons',
  2694. true,
  2695. localizer.delayedLocalize('settings','transport_buttons'));
  2696. var donationButtons = settings.boolean(
  2697. 'donation_buttons',
  2698. true,
  2699. localizer.delayedLocalize('settings','donation_buttons'));
  2700. var showCityOwners = settings.boolean(
  2701. 'show_city_owners',
  2702. false,
  2703. localizer.delayedLocalize('settings', 'show_city_owners'));
  2704. var preventAccidentalColonyDestruction = settings.boolean(
  2705. 'prevent_accidental_colony_destruction',
  2706. true,
  2707. localizer.delayedLocalize('settings', 'prevent_accidental_colony_destruction'));
  2708. var initializeColonizationMissionsForPirateRaiding = settings.boolean(
  2709. 'initialize_colonization_missions_for_pirate_raiding',
  2710. false,
  2711. localizer.delayedLocalize('settings', 'initialize_colonization_missions_for_pirate_raiding'));
  2712. var testDesktopAlert = settings.html(
  2713. function desktopAlertHtml() {
  2714. return '<a id="DesktopAlertTest" class="button">%s</a>'.format(
  2715. localizer.localize('settings','do_test'));
  2716. },
  2717. function desktopAlertPostRender() {
  2718. function showTestDesktopAlert() {
  2719. if (window.webkitNotifications) {
  2720. if (window.webkitNotifications.checkPermission() == 0) { // PERMISSION_ALLOWED
  2721. var notification = window.webkitNotifications.createNotification(
  2722. 'http://' + document.domain + '/skin/layout/advisors/general_alert.png',
  2723. localizer.localize('settings','test_desktop_alert_title'),
  2724. localizer.localize('settings','test_desktop_alert_text'));
  2725. notification.onclick = IkaTools.Logging.debuggable(
  2726. 'Imperator.testDesktopAlert.dismiss',
  2727. function closeNotification() {
  2728. notification.cancel();
  2729. });
  2730. notification.show();
  2731. return true;
  2732. }
  2733. } else {
  2734. alert(localizer.localize('settings','desktop_alerts_not_supported'));
  2735. }
  2736. return false;
  2737. }
  2738. $('#DesktopAlertTest').click(IkaTools.Logging.debuggable(
  2739. 'Imperator.testDesktopAlert',
  2740. function testDesktopAlert() {
  2741. if (!showTestDesktopAlert()) {
  2742. window.webkitNotifications.requestPermission(
  2743. IkaTools.Logging.debuggable(
  2744. 'Imperator.testDesktopAlert.requestPermission',
  2745. showTestDesktopAlert));
  2746. }
  2747. }));
  2748. },
  2749. localizer.delayedLocalize('settings','test_desktop_alert'));
  2750. var buildingCompletionAlert_Desktop = settings.boolean(
  2751. 'building_completion_alert_desktop',
  2752. false,
  2753. localizer.delayedLocalize('settings','building_completion_alert_desktop'));
  2754. var transportMissionLoaded_Desktop = settings.boolean(
  2755. 'transport_loaded_alert_desktop',
  2756. false,
  2757. localizer.delayedLocalize('settings','transport_loaded_alert_desktop'));
  2758. var transportMissionArrived_Desktop = settings.boolean(
  2759. 'transport_arrived_alert_desktop',
  2760. false,
  2761. localizer.delayedLocalize('settings','transport_arrived_alert_desktop'));
  2762. var transportMissionReturned_Desktop = settings.boolean(
  2763. 'transport_returned_alert_desktop',
  2764. false,
  2765. localizer.delayedLocalize('settings','transport_returned_alert_desktop'));
  2766. var deployArmyLoaded_Desktop = settings.boolean(
  2767. 'deploy_army_loaded_alert_desktop',
  2768. false,
  2769. localizer.delayedLocalize('settings','deploy_army_loaded_alert_desktop'));
  2770. var deployArmyArrived_Desktop = settings.boolean(
  2771. 'deploy_army_arrived_alert_desktop',
  2772. false,
  2773. localizer.delayedLocalize('settings','deploy_army_arrived_alert_desktop'));
  2774. var deployArmyReturned_Desktop = settings.boolean(
  2775. 'deploy_army_returned_alert_desktop',
  2776. false,
  2777. localizer.delayedLocalize('settings','deploy_army_returned_alert_desktop'));
  2778. var deployNavyArrived_Desktop = settings.boolean(
  2779. 'deploy_navy_arrived_alert_desktop',
  2780. false,
  2781. localizer.delayedLocalize('settings','deploy_navy_arrived_alert_desktop'));
  2782. var deployNavyReturned_Desktop = settings.boolean(
  2783. 'deploy_navy_returned_alert_desktop',
  2784. false,
  2785. localizer.delayedLocalize('settings','deploy_navy_returned_alert_desktop'));
  2786. var pillageLoaded_Desktop = settings.boolean(
  2787. 'pillage_loaded_alert_desktop',
  2788. false,
  2789. localizer.delayedLocalize('settings','pillage_loaded_alert_desktop'));
  2790. var pillageArrived_Desktop = settings.boolean(
  2791. 'pillage_arrived_alert_desktop',
  2792. false,
  2793. localizer.delayedLocalize('settings','pillage_arrived_alert_desktop'));
  2794. var pillageReturned_Desktop = settings.boolean(
  2795. 'pillage_returned_alert_desktop',
  2796. false,
  2797. localizer.delayedLocalize('settings','pillage_returned_alert_desktop'));
  2798. var ignoredHostileMissions = settings.text(
  2799. 'ignored_hostile_missions',
  2800. '[]',
  2801. localizer.delayedLocalize('settings', 'ignored_hostile_missions'));
  2802. var debugSetting = settings.html(
  2803. function debugHtml() {
  2804. return '<input id="EmpireDataDebug" type="text" style="width:100%"/>';
  2805. },
  2806. function debugPostRender() {
  2807. $('#EmpireDataDebug').val(IkaTools.EmpireData.getDebugString());
  2808. },
  2809. IkaTools.Utils.fixedFunction('Empire data'));
  2810. var resetData = settings.html(
  2811. function resetDataHtml() {
  2812. return '<a id="ResetImperatorData" class="button">Reset</a>';
  2813. },
  2814. function resetDataPostRender() {
  2815. $('#ResetImperatorData').click(function resetDataClicked() {
  2816. IkaTools.EmpireData.resetData();
  2817. window.location.reload();
  2818. });
  2819. },
  2820. IkaTools.Utils.fixedFunction('Reset data'));
  2821. var espionageDebugSetting = settings.html(
  2822. function debugHtml() {
  2823. return '<input id="EspionageDataDebug" type="text" style="width:100%"/>';
  2824. },
  2825. function debugPostRender() {
  2826. $('#EspionageDataDebug').val(IkaTools.EmpireData.Espionage.getDebugString());
  2827. },
  2828. IkaTools.Utils.fixedFunction('Espionage data'));
  2829. var resetEspionageData = settings.html(
  2830. function resetDataHtml() {
  2831. return '<a id="ResetEspionageData" class="button">Reset Espionage</a>';
  2832. },
  2833. function resetDataPostRender() {
  2834. $('#ResetEspionageData').click(function resetDataClicked() {
  2835. IkaTools.EmpireData.Espionage.resetData();
  2836. window.location.reload();
  2837. });
  2838. },
  2839. IkaTools.Utils.fixedFunction('Reset espionage data'));
  2840. var exceptionLogSetting = settings.html(
  2841. function exceptionLogHtml() {
  2842. return '<input id="ExceptionLog" type="text" style="width:100%"/>';
  2843. },
  2844. function exceptionLogPostRender() {
  2845. $('#ExceptionLog').val(JSON.stringify(IkaTools.Logging.getExceptionLog()));
  2846. },
  2847. IkaTools.Utils.fixedFunction('Errors'));
  2848.  
  2849. function addSettingsLink() {
  2850. var settingsWindow = new IkaTools.UI.SettingsWindow(
  2851. 'ImperatorSettings',
  2852. 'Imparatorluk',
  2853. settings,
  2854. [new IkaTools.UI.SettingsWindow.Group(localizer.localize('settings','general'),
  2855. [localizedLanguage]),
  2856. new IkaTools.UI.SettingsWindow.Group(localizer.localize('settings','overviews'),
  2857. [showResourceOverview, showBuildingsOverview, showMilitaryOverview,
  2858. showEspionageOverview]),
  2859. new IkaTools.UI.SettingsWindow.Group(localizer.localize('settings','tweaks'),
  2860. [autoAcceptDailyBonus, hideAds, hideFacebook, hideFriendsBar, hideChat,
  2861. transportButtons, donationButtons, showCityOwners,
  2862. preventAccidentalColonyDestruction, initializeColonizationMissionsForPirateRaiding
  2863. ]),
  2864. new IkaTools.UI.SettingsWindow.Group(localizer.localize('settings','alerts'),
  2865. [testDesktopAlert, buildingCompletionAlert_Desktop,
  2866. transportMissionLoaded_Desktop, transportMissionArrived_Desktop,
  2867. transportMissionReturned_Desktop, deployArmyLoaded_Desktop,
  2868. deployArmyArrived_Desktop, deployArmyReturned_Desktop,
  2869. deployNavyArrived_Desktop, deployNavyReturned_Desktop,
  2870. pillageLoaded_Desktop, pillageArrived_Desktop, pillageReturned_Desktop,
  2871. /*ignoredHostileMissions*/]),
  2872. new IkaTools.UI.SettingsWindow.Group(localizer.localize('settings','debug'),
  2873. [debugSetting, resetData, espionageDebugSetting, resetEspionageData,
  2874. exceptionLogSetting]),
  2875. ]);
  2876. settingsWindow.registerSavedSettingsHandler(function reloadOnSavedSettings() {
  2877. window.location.reload();
  2878. });
  2879. settingsWindow.addAsScriptOptionsLink();
  2880. }
  2881. function Updateable(container, permanent, ids) {
  2882. this.container = container;
  2883. this.ids = $.makeArray(ids);
  2884. this.elements = [];
  2885. if (!this.ids.length) {
  2886. this.ids[0] = IkaTools.Utils.nextId("updateable_");
  2887. }
  2888. this.permanent = permanent;
  2889. this.events = {};
  2890. }
  2891.  
  2892. $.extend(Updateable.prototype, {
  2893. getElement: function getElement(index) {
  2894. var element = this.elements[index];
  2895. if (!element || !element.length) {
  2896. element = $(document.getElementById(this.ids[index]));
  2897. this.elements[index] = element;
  2898. }
  2899. return element;
  2900. },
  2901. getElements: function getElements() {
  2902. for (var i = 0; i < this.ids.length; i++) {
  2903. this.getElement(i);
  2904. }
  2905. return this.elements;
  2906. },
  2907. destroy: function destroy() {
  2908. return this.container.destroy(this);
  2909. },
  2910. getId: function getId(index) {
  2911. return this.ids[index];
  2912. },
  2913. getIdentifier: function getIdentifier() {
  2914. return this.ids.join(',');
  2915. },
  2916. isPermanent: function isPermanent() {
  2917. return this.permanent;
  2918. },
  2919. registerUpdate: function registerUpdate(eventName, f) {
  2920. this.events[eventName] = f;
  2921. return this;
  2922. },
  2923. updateForEvent: function updateForEvent(eventName) {
  2924. var f = this.events[eventName];
  2925. if (f) {
  2926. f.apply(this, this.getElements());
  2927. }
  2928. },
  2929. registerTickerUpdate: function registerTickerUpdate(f) {
  2930. return this.registerUpdate('ticker', f);
  2931. },
  2932. registerFastTickerUpdate: function registerFastTickerUpdate(f) {
  2933. return this.registerUpdate('fastTicker', f);
  2934. },
  2935. });
  2936. function Updateables(name) {
  2937. this.name = name;
  2938. this.active = false;
  2939. this.undispatchedEvents = {};
  2940. this.updateables = {};
  2941. }
  2942. $.extend(Updateables.prototype, {
  2943. create: function create() {
  2944. var updateable = new Updateable(this, false, arguments);
  2945. this.updateables[updateable.getIdentifier()] = updateable;
  2946. return updateable;
  2947. },
  2948. createPermanent: function createPermanent() {
  2949. var updateable = new Updateable(this, true, arguments)
  2950. this.updateables[updateable.getIdentifier()] = updateable;
  2951. return updateable;
  2952. },
  2953. destroy: function destroy(updateable) {
  2954. delete this.updateables[updateable.getIdentifier()];
  2955. },
  2956. activate: function activate() {
  2957. $.each(this.updateables, function (key, updateable) {
  2958. updateable.getElements();
  2959. });
  2960. if (!this.tickerEvent) {
  2961. this.tickerEvent = setInterval(IkaTools.Logging.debuggable(
  2962. { label: 'Imperator.Updateable.tickerUpdate[' + this.name + ']', },
  2963. this.updateForEvent.bind(this, 'ticker')),
  2964. 4000);
  2965. }
  2966. if (!this.fastTickerEvent) {
  2967. this.fastTickerEvent = setInterval(IkaTools.Logging.debuggable(
  2968. {label: 'Imperator.Updateable.fastTickerUpdate[' + this.name + ']', },
  2969. this.updateForEvent.bind(this, 'fastTicker')),
  2970. 1000);
  2971. }
  2972. this.active = true;
  2973. $.each(this.undispatchedEvents, this.updateForEvent.bind(this));
  2974. this.undispatchedEvents = {};
  2975. },
  2976. deactivate: function deactivate() {
  2977. this.active = false;
  2978. if (this.tickerEvent) {
  2979. clearInterval(this.tickerEvent);
  2980. delete this.tickerEvent;
  2981. }
  2982. if (this.fastTickerEvent) {
  2983. clearInterval(this.fastTickerEvent);
  2984. delete this.fastTickerEvent;
  2985. }
  2986. },
  2987. updateForEvent: function updateForEvent(eventName) {
  2988. if (this.active) {
  2989. $.each(this.updateables, function(id, updateable) {
  2990. updateable.updateForEvent(eventName);
  2991. });
  2992. } else {
  2993. this.undispatchedEvents[eventName] = true;
  2994. }
  2995. },
  2996. clear: function clear() {
  2997. var that = this;
  2998. $.each(this.updateables, function(id, updateable) {
  2999. if (!updateable.isPermanent()) {
  3000. delete that.updateables[id];
  3001. }
  3002. });
  3003. this.undispatchedEvents = {};
  3004. },
  3005. });
  3006. var clickHandler = function() {
  3007. var idToHandlerMap = {};
  3008.  
  3009. return {
  3010. register: function register(id, f) {
  3011. idToHandlerMap[id] = f;
  3012. },
  3013. dispatch: function(element) {
  3014. var handler = idToHandlerMap[element.id];
  3015. if (handler) {
  3016. handler();
  3017. return true;
  3018. } else {
  3019. IkaTools.Logging.debug("No registered handler for ", element.id, element);
  3020. return false;
  3021. }
  3022. },
  3023. }
  3024. }();
  3025. $('#container').on('click.imperator_link_handler', '.imperator_link',
  3026. IkaTools.Logging.debuggable('Imperator.overview.imperator_link.clicked',
  3027. function(e) {
  3028. if (clickHandler.dispatch(e.currentTarget)) {
  3029. e.preventDefault();
  3030. }
  3031. }));
  3032.  
  3033. function Link(id) {
  3034. this.id = id;
  3035. }
  3036.  
  3037. $.extend(Link.prototype, {
  3038. getId: function getId() {
  3039. return this.id;
  3040. },
  3041. toFunction: function toFunction(f, predicate) {
  3042. clickHandler.register(this.id, function() {
  3043. if (!predicate || predicate()) {
  3044. f();
  3045. }
  3046. });
  3047. return this;
  3048. },
  3049. toCitysIslandView: function toCitysIslandView(city, view, params, predicate) {
  3050. clickHandler.register(this.id, function() {
  3051. if (!predicate || predicate()) {
  3052. IkaTools.View.goToCitysIslandView(city, view, params);
  3053. }
  3054. });
  3055. return this;
  3056. },
  3057. /*toIslandView: function toIslandView(islandId, view, params, predicate) {
  3058. clickHandler.register(this.id,
  3059. function() {
  3060. if (!predicate || predicate()) {
  3061. IkaTools.View.goToIslandView(
  3062. IkaTools.View.getCurrentCity(), islandId, view, params);
  3063. }
  3064. });
  3065. return this;
  3066. },*/
  3067. toLocalView: function toLocalView(view, params, predicate) {
  3068. clickHandler.register(this.id, function() {
  3069. if (!predicate || predicate()) {
  3070. IkaTools.View.goToLocalView(view, params);
  3071. }
  3072. });
  3073. return this;
  3074. },
  3075. toCityView: function toCityView(city, view, params, predicate) {
  3076. clickHandler.register(this.id, function() {
  3077. if (!predicate || predicate()) {
  3078. IkaTools.View.goToCityView(city, view, params);
  3079. }
  3080. });
  3081. return this;
  3082. },
  3083. toCityActivation: function toCityActivation(city, predicate) {
  3084. clickHandler.register(this.id, function() {
  3085. if (!predicate || predicate(this)) {
  3086. IkaTools.View.activateCity(city);
  3087. }
  3088. });
  3089. return this;
  3090. },
  3091. toIkariamPage: function toIkariamPage(params, anchor, predicate) {
  3092. clickHandler.register(this.id, function() {
  3093. if (!predicate || predicate(this)) {
  3094. IkaTools.View.goToIkariamFullPage(params, anchor);
  3095. }
  3096. });
  3097. return this;
  3098. },
  3099. });
  3100. var toolTips = new IkaTools.UI.ToolTipHandler(
  3101. 'imperator_tool_tip', $('<div class="tool_tip_container"/>'));
  3102. toolTips.startHandling($('body'));
  3103. function overviewTables() {
  3104. function Tab(name, tabText, tabContentHolder, tabContentId, init, renderer) {
  3105. this.updateables = new Updateables(name);
  3106. var render = renderer.bind(this);
  3107. this.mainUpdateable = this.updateables.createPermanent(tabContentId);
  3108. this.mainUpdateable.registerUpdate('redraw', function(element) {
  3109. element.removeClass(
  3110. 'city_type_ownCity city_type_deployedCities city_type_occupiedCities');
  3111. element.addClass('city_type_' + IkaTools.View.getCurrentCity().getType());
  3112. element.html(render());
  3113. });
  3114. this.mainUpdateable.registerUpdate('cityChanged', function updateTabTableType(table) {
  3115. table.removeClass(
  3116. 'city_type_ownCity city_type_deployedCities city_type_occupiedCities');
  3117. table.addClass('city_type_' + IkaTools.View.getCurrentCity().getType());
  3118. });
  3119.  
  3120. this.isActive = false;
  3121. this.needsRedraw = true;
  3122. //this.render = renderer;
  3123.  
  3124. var tab = this;
  3125. this.initFirstTime = IkaTools.Utils.thunk(function() {
  3126. IkaTools.View.registerIkariamAjaxResponseCallback(function tab_CityChanged() {
  3127. tab.updateables.updateForEvent('cityChanged');
  3128. });
  3129. init.call(tab);
  3130. });
  3131.  
  3132. this.tab = new IkaTools.UI.TabPane.Tab(
  3133. $('<b>%s</b>'.format(tabText)),
  3134. tabContentHolder,
  3135. {
  3136. activatedCallback: function() {
  3137. this.isActive = true;
  3138. this.maybeRedraw();
  3139. this.initFirstTime();
  3140. this.updateables.activate();
  3141. }.bind(this),
  3142. deactivatedCallback: function() {
  3143. this.isActive = false;
  3144. this.updateables.deactivate();
  3145. }.bind(this),
  3146. });
  3147. }
  3148.  
  3149. $.extend(Tab.prototype, {
  3150. maybeRedraw: function maybeRedraw(redraw) {
  3151. this.needsRedraw = this.needsRedraw || redraw;
  3152. if (this.isActive && this.needsRedraw) {
  3153. this.updateables.clear();
  3154. this.mainUpdateable.updateForEvent('redraw');
  3155. this.needsRedraw = false;
  3156. }
  3157. },
  3158. getTab: function getTab() {
  3159. return this.tab;
  3160. }
  3161. });
  3162. function makeCityNameCells(table, city, excludeTradeGood) {
  3163. var cityLink = new Link('CityLink_%s_%s'.format(table, city.getId()))
  3164. .toCityActivation(city);
  3165. return ('%s' +
  3166. '<td class="city_name">' +
  3167. '<a class="imperator_link" id="%s" href="javascript:void(0)">%s</a>' +
  3168. '</td>').format(
  3169. (excludeTradeGood ? '' : ('<td class="city_tradegood imperator_link ">' +
  3170. '<img src="skin/resources/icon_%s.png">' +
  3171. '</td>').format(city.getTradeGoodType())),
  3172. cityLink.getId(),
  3173. city.getName());
  3174. }
  3175. function makeCityNameColGroup(extraCols, excludeTradeGood) {
  3176. return ('<colgroup class="city_name">' +
  3177. '%s' +
  3178. '<col class="city_name">' +
  3179. '%s' +
  3180. '</colgroup>').format(
  3181. excludeTradeGood ? '' : '<col class="city_tradegood">',
  3182. extraCols || '');
  3183. }
  3184. function makeCityNameHeaderCells(excludeTradeGood) {
  3185. return '<th class="city_name" colspan="%s">%s</th>'.format(
  3186. excludeTradeGood ? '1' : '2',
  3187. localizer.localize('misc','city_name'));
  3188. }
  3189. function makeResourceTab() {
  3190. function makeResourceUseTableRow(displaySign, usePerHour, usePerDay, usePerWeek) {
  3191. return makeResourceUseTableRowRaw(
  3192. displaySign,
  3193. IkaTools.Intl.formatInteger(usePerHour),
  3194. IkaTools.Intl.formatInteger(usePerDay ||
  3195. usePerHour * IkaTools.Constants.Time.HOURS_PER_DAY),
  3196. IkaTools.Intl.formatInteger(usePerWeek ||
  3197. usePerHour * IkaTools.Constants.Time.HOURS_PER_WEEK));
  3198. }
  3199. function makeResourceUseTableRowRaw(displaySign, usePerHour, usePerDay, usePerWeek) {
  3200. return '<tr><td>%s</td><td>%s</td><td>%s</td><td>%s</td></tr>'.format(
  3201. displaySign, usePerHour, usePerDay, usePerWeek);
  3202. }
  3203. function makeResourceUseToolTip(icon, rows, footerRows) {
  3204. return ('<table class="resource_use_tool_tip">' +
  3205. '<colgroup><col/><col/><col/><col/></colgroup>' +
  3206. '<thead>' +
  3207. '<tr>' +
  3208. '<th><img src="%s" height="12"/></th>' +
  3209. '<th>%s</th>' +
  3210. '<th>%s</th>' +
  3211. '<th>%s</th>' +
  3212. '</tr>' +
  3213. '</thead>' +
  3214. '<tbody>%s</tbody>' +
  3215. '<tfoot>%s</tfoot>' +
  3216. '</table>').format(
  3217. icon,
  3218. IkaTools.Intl.localizer.localize('timeunits','long','hour'),
  3219. IkaTools.Intl.localizer.localize('timeunits','long','day'),
  3220. IkaTools.Intl.localizer.localize('timeunits','long','week'),
  3221. rows.join(''),
  3222. footerRows ? footerRows.join('') : '')
  3223. }
  3224. function makeTableContent() {
  3225. var updateables = this.updateables;
  3226. var civData = IkaTools.EmpireData.getCivilizationData();
  3227. function getResourceData(resource) {
  3228. var current = resource.getCurrent();
  3229. var capacity = resource.getCapacity();
  3230.  
  3231. var millisUntilFull = Math.ceil(resource.getTimeUntilFull());
  3232. var millisUntilEmpty = Math.ceil(resource.getTimeUntilEmpty());
  3233.  
  3234. var fullClass = '';
  3235. if (millisUntilFull < 1 * IkaTools.Constants.Time.MILLIS_PER_HOUR) {
  3236. fullClass = 'expiration_now';
  3237. } else if (millisUntilFull <= 6 * IkaTools.Constants.Time.MILLIS_PER_HOUR) {
  3238. fullClass = 'expiration_imminent';
  3239. } else if (millisUntilFull <= 24 * IkaTools.Constants.Time.MILLIS_PER_HOUR) {
  3240. fullClass = 'expiration_soon';
  3241. } else if (millisUntilFull <= 48 * IkaTools.Constants.Time.MILLIS_PER_HOUR) {
  3242. fullClass = 'expiration_forseeable';
  3243. }
  3244.  
  3245. var emptyClass = '';
  3246. if (millisUntilEmpty < 1 * IkaTools.Constants.Time.MILLIS_PER_HOUR) {
  3247. emptyClass = 'expiration_now';
  3248. } else if (millisUntilEmpty <= 6 * IkaTools.Constants.Time.MILLIS_PER_HOUR) {
  3249. emptyClass = 'expiration_imminent';
  3250. } else if (millisUntilEmpty <= 24 * IkaTools.Constants.Time.MILLIS_PER_HOUR) {
  3251. emptyClass = 'expiration_soon';
  3252. } else if (millisUntilEmpty <= 48 * IkaTools.Constants.Time.MILLIS_PER_HOUR) {
  3253. emptyClass = 'expiration_forseeable';
  3254. }
  3255. return {
  3256. current: current,
  3257. max: capacity.maximum,
  3258. percent: current / capacity.maximum * 100,
  3259. safe: capacity.safe,
  3260. fullClass: fullClass,
  3261. emptyClass: emptyClass,
  3262. };
  3263. }
  3264. function makeResourceCells(movements, city, resourceName) {
  3265. var resource = city.getResource(resourceName);
  3266. var cityId = city.getId();
  3267. var currentUpdateable = updateables.create(
  3268. IkaTools.Utils.nextId('resource_current_'),
  3269. IkaTools.Utils.nextId('resource_current_percent_bar_'),
  3270. IkaTools.Utils.nextId('resource_current_percent_bar_active_'));
  3271. var resourceLink = new Link('Resource_%s_%s'.format(city.getId(), resourceName));
  3272. if (resourceName == IkaTools.Constants.Resources.WOOD) {
  3273. resourceLink.toCitysIslandView(
  3274. city, IkaTools.Constants.View.RESOURCE, { type: 'resource' });
  3275. } else if (resourceName == city.getTradeGoodType()) {
  3276. resourceLink.toCitysIslandView(
  3277. city, IkaTools.Constants.View.TRADE_GOOD,
  3278. { type: IkaTools.Constants.TradeGoodOrdinals[city.getTradeGoodType()] });
  3279. }
  3280. var data = getResourceData(resource);
  3281. var inTransit = 0;
  3282. function isCountableMovement(movement) {
  3283. if (movement.getResource(resourceName) > 0) {
  3284. if (movement.getMission() == IkaTools.Constants.Movements.Mission.PLUNDER) {
  3285. return movement.getOriginCityId() == cityId;
  3286. }
  3287. if (movement.getStage() == IkaTools.Constants.Movements.Stage.LOADING ||
  3288. movement.getStage() == IkaTools.Constants.Movements.Stage.EN_ROUTE) {
  3289. return movement.getTargetCityId() == cityId;
  3290. }
  3291. if (movement.getStage() == IkaTools.Constants.Movements.Stage.RETURNING) {
  3292. return movement.getOriginCityId() == cityId;
  3293. }
  3294. }
  3295. return false;
  3296. }
  3297. $.each(movements, function totalMovements(index, movement) {
  3298. var mission = movement.getMission();
  3299. var stage = movement.getStage();
  3300. if (isCountableMovement(movement)) {
  3301. inTransit += movement.getResource(resourceName) || 0;
  3302. }
  3303. });
  3304. var inTransitDivId = 'ResourcesInTransit_%s_%s'.format(city.getId(), resourceName);
  3305. if (inTransit) {
  3306. toolTips.registerRefreshable(inTransitDivId, function() {
  3307. return ('<table class="resources_in_transit_tool_tip">' +
  3308. '<thead>' +
  3309. '<tr>' +
  3310. '<th>' +
  3311. '<img src="skin/resources/icon_%s.png" height="12"/>' +
  3312. '</th>' +
  3313. '<th>%s</th>' +
  3314. '</tr>' +
  3315. '</thead>' +
  3316. '<tbody>%s</tbody>' +
  3317. '</table').format(
  3318. resourceName,
  3319. localizer.localize('misc','in_transit'),
  3320. $.map(movements, function makeResourcesInTransitRow(movement) {
  3321. var count = movement.getResource(resourceName);
  3322. if (isCountableMovement(movement)) {
  3323. return '<tr><td class="resource_count">%s</td><td>%s</td></tr>'.format(
  3324. IkaTools.Intl.formatInteger(count, true),
  3325. IkaTools.Intl.formatRemainingTime(
  3326. movement.getArrivalTime() - IkaTools.View.gameTimeNow()));
  3327. } else {
  3328. return '';
  3329. }
  3330. }).join(''));
  3331. });
  3332. } else {
  3333. toolTips.deregister(inTransitDivId);
  3334. }
  3335. toolTips.registerRefreshable(currentUpdateable.getId(1), function() {
  3336. var timeToFull = resource.getTimeUntilFull();
  3337. var timeToEmpty = resource.getTimeUntilEmpty();
  3338. var timeRow = '';
  3339. if (isFinite(timeToFull)) {
  3340. timeRow = '<tr><td>%s:</td><td>%s</td>'.format(
  3341. localizer.localize('misc','time_to_full'),
  3342. IkaTools.Intl.formatRemainingTime(timeToFull,
  3343. localizer.localize('misc','full')));
  3344. } else if (isFinite(timeToEmpty)) {
  3345. timeRow = '<tr><td>%s:</td><td>%s</td>'.format(
  3346. localizer.localize('misc','time_to_empty'),
  3347. IkaTools.Intl.formatRemainingTime(timeToEmpty,
  3348. localizer.localize('misc','empty')));
  3349. }
  3350. var capacity = city.getResourceCapacity();
  3351. return ('<table>' +
  3352. '<colgroup><col/><col/></colgroup>' +
  3353. '<tbody>' +
  3354. '<tr><td>%s:</td><td>%s</td></tr>' +
  3355. '<tr><td>%s:</td><td>%s</td></tr>' +
  3356. '%s' +
  3357. '<tbody>' +
  3358. '<table>').format(
  3359. localizer.localize('misc','maximum_capacity'),
  3360. IkaTools.Intl.formatInteger(data.max),
  3361. localizer.localize('misc','safe_capacity'),
  3362. IkaTools.Intl.formatInteger(data.safe),
  3363. timeRow);
  3364. });
  3365.  
  3366. var currentContent = '?';
  3367. if (data.current) {
  3368. currentContent = (
  3369. '<div id="%s" class="resource_current %s %s">%s</div>' +
  3370. '<div id="%s" class="resources_transporting imperator_tool_tip">%s</div>' +
  3371. '<div id="%s" class="percent_bar imperator_tool_tip %s">' +
  3372. '<div id="%s" class="percent_bar_active" style="width: %s%;" />' +
  3373. '</div>').format(
  3374. currentUpdateable.getId(0),
  3375. data.emptyClass,
  3376. data.current <= data.safe ? 'is_under_safe_limit' : '',
  3377. IkaTools.Intl.formatInteger(data.current),
  3378. inTransitDivId,
  3379. inTransit ? IkaTools.Intl.formatInteger(inTransit, true)
  3380. : '-',
  3381. currentUpdateable.getId(1),
  3382. data.fullClass,
  3383. currentUpdateable.getId(2),
  3384. data.percent);
  3385.  
  3386. currentUpdateable.registerTickerUpdate(function(amount, percentBar, activeBar) {
  3387. var data = getResourceData(resource);
  3388. if (data.current <= data.safe) {
  3389. amount.addClass('is_under_safe_limit');
  3390. } else {
  3391. amount.removeClass('is_under_safe_limit');
  3392. }
  3393. amount.html(IkaTools.Intl.formatInteger(data.current));
  3394. amount.removeClass(
  3395. 'expiration_now expiration_imminent expiration_soon expiration_forseeable');
  3396. amount.addClass(data.emptyClass);
  3397. percentBar.removeClass(
  3398. 'expiration_now expiration_imminent expiration_soon expiration_forseeable');
  3399. percentBar.addClass(data.fullClass);
  3400. activeBar.css('width', '%s%'.format(data.percent));
  3401. });
  3402. }
  3403. var productionContent = '&nbsp;';
  3404. var production = resource.getProduction();
  3405. if (production !== undefined) {
  3406. var productionPerHour = production * IkaTools.Constants.Time.SECONDS_PER_HOUR;
  3407. productionContent = IkaTools.Intl.formatInteger(productionPerHour, true);
  3408. toolTips.registerSimple(resourceLink.getId(),
  3409. makeResourceUseToolTip('skin/resources/icon_%s.png'.format(resourceName),
  3410. [makeResourceUseTableRow('+', productionPerHour)]));
  3411. }
  3412.  
  3413. var consumptionContent = '';
  3414. var consumption = resource.getConsumption();
  3415. var tavernLink = new Link('WineConsumptionTavern_%s'.format(city.getId()));
  3416. var tavern = city.getBuildingByType(IkaTools.Constants.Buildings.TAVERN);
  3417. if (tavern) {
  3418. tavernLink.toCityView(city, IkaTools.Constants.Buildings.TAVERN,
  3419. { position: tavern.getPosition(), cityId: city.getId() });
  3420. }
  3421. if (tavern && consumption !== undefined) {
  3422. var consumptionPerHour =
  3423. Math.round(consumption * IkaTools.Constants.Time.SECONDS_PER_HOUR);
  3424. toolTips.registerSimple(tavernLink.getId(),
  3425. makeResourceUseToolTip('skin/resources/icon_%s.png'.format(resourceName),
  3426. [makeResourceUseTableRow('-', consumptionPerHour)]));
  3427. consumptionContent =
  3428. ('<a id="%s" class="imperator_link imperator_tool_tip" ' +
  3429. 'href="javascript:void(0);">%s</a>').format(
  3430. tavernLink.getId(),
  3431. IkaTools.Intl.formatInteger(-consumptionPerHour, true));
  3432. }
  3433. return ('<td class="resource resource_%s">%s</td>' +
  3434. '<td class="resource resource_%s resource_change">' +
  3435. '<div class="resource_production">' +
  3436. '<a id="%s" class="imperator_link imperator_tool_tip" ' +
  3437. 'href="javascript:void(0);">%s</a>' +
  3438. '</div>' +
  3439. '<div class="resource_consumption">%s</div>' +
  3440. '</td>').format(
  3441. resourceName,
  3442. currentContent,
  3443. resourceName,
  3444. resourceLink.getId(),
  3445. productionContent,
  3446. consumptionContent);
  3447. }
  3448. function makeResearchCell(city) {
  3449. var scientists = city.getScientists();
  3450. var academy = city.getBuildingByType('academy');
  3451. if (academy) {
  3452. var research = city.getResearch();
  3453. var link = new Link('ResearchTableAcademy_%s'.format(city.getId()))
  3454. .toCityView(city, IkaTools.Constants.Buildings.ACADEMY,
  3455. { position: academy.getPosition(), cityId: city.getId() });
  3456. var maxScientists = IkaTools.Constants.BuildingData[
  3457. IkaTools.Constants.Buildings.ACADEMY].maxScientists[academy.getLevel()];
  3458. var percent = scientists / maxScientists * 100;
  3459. var percentBarId = IkaTools.Utils.nextId('research_percent_bar');
  3460. toolTips.registerSimple(link.getId(),
  3461. makeResourceUseToolTip('skin/layout/bulb-on.png',
  3462. [makeResourceUseTableRow('+', research)]));
  3463. toolTips.registerSimple(percentBarId,
  3464. ('<table><tbody>' +
  3465. '<tr><td>%s:</td><td>%s</td></tr>' +
  3466. '<tr><td>%s:</td><td>%s</td></tr>' +
  3467. '</tbody></table>').format(
  3468. localizer.localize('misc','employed'),
  3469. scientists,
  3470. localizer.localize('misc','maximum_capacity'),
  3471. maxScientists));
  3472. return ('<td class="research">' +
  3473. '<div>' +
  3474. '<a id="%s" href="javascript:void(0)" ' +
  3475. 'class="imperator_link imperator_tool_tip">%s</a>' +
  3476. '</div>' +
  3477. '<div id ="%s" class="percent_bar imperator_tool_tip percent_bar_desire_filled %s">' +
  3478. '<div class="percent_bar_active" style="width: %s%;" />' +
  3479. '</div>' +
  3480. '</td>').format(
  3481. link.getId(),
  3482. IkaTools.Intl.formatInteger(research, true),
  3483. percentBarId,
  3484. percent == 100 ? 'percent_bar_filled' : '',
  3485. percent);
  3486. }
  3487. return '<td class="research"></td>';
  3488. }
  3489. function getPopulationData(city) {
  3490. var populationData = city.getPopulationData();
  3491. var icon = 'neutral';
  3492. if (populationData.happiness < -50) {
  3493. icon = 'outraged';
  3494. } else if (populationData.happiness < -.50) {
  3495. icon = 'sad';
  3496. } else if (populationData.happiness > 300) {
  3497. icon = 'ecstatic';
  3498. } else if (populationData.happiness > 50) {
  3499. icon = 'happy';
  3500. }
  3501. var percent = populationData.population / populationData.max * 100;
  3502. return $.extend({
  3503. icon: "skin/smilies/%s_x25.png".format(icon),
  3504. percent: percent,
  3505. percentClass: percent == 100 ? 'percent_bar_filled' : '',
  3506. happinessClass: percent == 100 && populationData.happiness >= 60
  3507. && city.getTavernWineLevel() > 0
  3508. ? 'imperator_warning' : '',
  3509. }, populationData);
  3510. }
  3511. function makePopulationCells(city) {
  3512. var populationData = getPopulationData(city);
  3513. if (!populationData.population) {
  3514. return ('<td class="population">%s</td>' +
  3515. '<td class="population_growth_icon"></td>' +
  3516. '<td class="population_growth"/>').format(
  3517. IkaTools.Intl.formatInteger(populationData.population));
  3518. }
  3519. var updateable = updateables.create(
  3520. IkaTools.Utils.nextId('population_current_'),
  3521. IkaTools.Utils.nextId('population_current_percent_bar_'),
  3522. IkaTools.Utils.nextId('population_current_percent_bar_active_'),
  3523. IkaTools.Utils.nextId('population_growth_icon_'),
  3524. IkaTools.Utils.nextId('population_growth_'));
  3525. updateable.registerTickerUpdate(
  3526. function(population, percentBar, activeBar, icon, growth) {
  3527. var populationData = getPopulationData(city);
  3528. population.html(IkaTools.Intl.formatInteger(
  3529. Math.floor(populationData.population)));
  3530. percentBar.removeClass('percent_bar_filled');
  3531. percentBar.addClass(populationData.percentClass);
  3532. activeBar.css('width', '%s%'.format(populationData.percent));
  3533. icon.attr('src', populationData.icon);
  3534. growth.removeClass('imperator_warning');
  3535. growth.addClass(populationData.happinessClass);
  3536. growth.html(
  3537. IkaTools.Intl.formatDecimal(populationData.growth, 2, true));
  3538. });
  3539. toolTips.registerRefreshable(updateable.getId(3), function() {
  3540. var data = city.getPopulationData();
  3541. var tavern = city.getBuildingByType(IkaTools.Constants.Buildings.TAVERN);
  3542. var museum = city.getBuildingByType(IkaTools.Constants.Buildings.MUSEUM);
  3543. var culturalGoods = city.getCulturalGoods();
  3544. var tavernWineLevel = city.getTavernWineLevel();
  3545. return ('<table>' +
  3546. '<tbody>' +
  3547. '<tr><td>%s:</td><td>%s</td></tr>' +
  3548. '<tr><td>%s:</td><td>%s/%s</td></tr>' +
  3549. '<tr><td>%s:</td><td>%s/%s</td></tr>' +
  3550. '<tbody>' +
  3551. '</table>').format(
  3552. localizer.localize('misc','satisfaction'),
  3553. IkaTools.Intl.formatInteger(data.happiness, true),
  3554. localizer.localize('misc','cultural_goods'),
  3555. IkaTools.Intl.formatInteger(culturalGoods),
  3556. IkaTools.Intl.formatInteger(museum ? museum.getLevel() : 0),
  3557. localizer.localize('misc','tavern_wine_serving_level'),
  3558. IkaTools.Intl.formatInteger(tavernWineLevel),
  3559. IkaTools.Intl.formatInteger(tavern ? tavern.getLevel() : 0));
  3560. });
  3561. toolTips.registerRefreshable(updateable.getId(4), function() {
  3562. var data = city.getPopulationData();
  3563. function growthIn(hours) {
  3564. var growth = data.happiness * ( 1 - Math.pow(Math.E, -hours / 50));
  3565. if (growth + data.population > data.max) {
  3566. growth = data.max - data.population;
  3567. }
  3568. return growth;
  3569. }
  3570.  
  3571. return makeResourceUseToolTip(
  3572. data.happiness >= 0 ? 'skin/icons/growth_positive.png'
  3573. : 'skin/icons/growth_negative.png',
  3574. [makeResourceUseTableRowRaw(data.happiness >= 0 ? '+' : '-',
  3575. IkaTools.Intl.formatDecimal(growthIn(1), 2),
  3576. IkaTools.Intl.formatDecimal(growthIn(24), 2),
  3577. IkaTools.Intl.formatDecimal(growthIn(168), 2))]);
  3578. });
  3579. toolTips.registerRefreshable(updateable.getId(1), function() {
  3580. var data = city.getPopulationData();
  3581. var timeToFull = Number.POSITIVE_INFINITY;
  3582. if (data.population == data.max) {
  3583. timeToFull = 0;
  3584. } else if (data.population + data.happiness > data.max) {
  3585. var finalHappiness = data.population + data.happiness - data.max;
  3586. timeToFull = (Math.log(data.happiness) - Math.log(finalHappiness)) *
  3587. 50 * IkaTools.Constants.Time.MILLIS_PER_HOUR;
  3588. }
  3589. return ('<table>' +
  3590. '<tbody>' +
  3591. '<tr><td>%s:</td><td>%s</td></tr>' +
  3592. '<tr><td>%s:</td><td>%s</td></tr>' +
  3593. '<tbody>' +
  3594. '<table>').format(
  3595. localizer.localize('misc','maximum_capacity'),
  3596. IkaTools.Intl.formatInteger(data.max),
  3597. localizer.localize('misc','time_to_full'),
  3598. IkaTools.Intl.formatRemainingTime(timeToFull,
  3599. localizer.localize('misc','full')));
  3600. });
  3601. return ('<td class="population">' +
  3602. '<div id="%s">%s</div>' +
  3603. '<div id="%s" ' +
  3604. 'class="percent_bar percent_bar_desire_filled imperator_tool_tip %s">' +
  3605. '<div id="%s"class="percent_bar_active" style="width: %s%;" />' +
  3606. '</div>' +
  3607. '</td>' +
  3608. '<td class="population_growth_icon nowrap">' +
  3609. '<img id="%s" class="imperator_tool_tip" src="%s" />' +
  3610. '</td>'+
  3611. '<td class="population_growth %s">' +
  3612. '<span id="%s" class="imperator_tool_tip">%s</span>' +
  3613. '</td>'
  3614. ).format(
  3615. updateable.getId(0),
  3616. IkaTools.Intl.formatInteger(Math.floor(populationData.population)),
  3617. updateable.getId(1),
  3618. populationData.percentClass,
  3619. updateable.getId(2),
  3620. populationData.percent,
  3621. updateable.getId(3),
  3622. populationData.icon,
  3623. populationData.happinessClass,
  3624. updateable.getId(4),
  3625. IkaTools.Intl.formatDecimal(populationData.growth, 2, true));
  3626. }
  3627. function makeRow(movements, city) {
  3628. var transportLink = new Link('TransportGoods_%s'.format(city.getId())).toLocalView(
  3629. IkaTools.Constants.View.TRANSPORT,
  3630. {
  3631. templateView: IkaTools.Constants.View.CITY_DETAIL,
  3632. destinationCityId: city.getId(),
  3633. },
  3634. function() {
  3635. var go = !IkaTools.View.isActiveCity(city) &&
  3636. IkaTools.View.getCurrentCity().isOwn();
  3637. if (go) {
  3638. openResourcesTabOnTransportClose = true;
  3639. }
  3640. return go;
  3641. });
  3642. var cityLink = new Link('ResourceTabToTownHall_%s'.format(city.getId()))
  3643. .toCityView(city, IkaTools.Constants.View.TOWN_HALL,
  3644. { position: 0, cityId: city.getId() });
  3645. var rowUpdateable = updateables.create('ResourceTableRow_%s'.format(city.getId()))
  3646. .registerUpdate('cityChanged',
  3647. function(element) {
  3648. if (IkaTools.View.isActiveCity(city)) {
  3649. element.addClass('current');
  3650. } else {
  3651. element.removeClass('current');
  3652. }
  3653. });
  3654. return ('<tr id="%s" class="%s">' +
  3655. '%s' +
  3656. '<td class="action_points">%s</td>' +
  3657. '<td class="actions">' +
  3658. '<a id="%s" class="imperator_link to_town_hall" ' +
  3659. 'title="%s" href="javascript:void(0);"/>' +
  3660. '<a id="%s" class="imperator_link transport_goods" ' +
  3661. 'title="%s" href="javascript:void(0);"/>' +
  3662. '</td>' +
  3663. '%s' +
  3664. '%s' +
  3665. '%s%s%s%s%s' +
  3666. '</tr>'
  3667. ).format(
  3668. rowUpdateable.getId(0),
  3669. IkaTools.View.isActiveCity(city) ? 'current' : '',
  3670. makeCityNameCells('resources', city),
  3671. IkaTools.Intl.formatInteger(city.getActionPoints()),
  3672. cityLink.getId(),
  3673. localizer.localize('actions','to_town_hall'),
  3674. transportLink.getId(),
  3675. localizer.localize('actions','transport_goods'),
  3676. makePopulationCells(city),
  3677. makeResearchCell(city),
  3678. makeResourceCells(movements, city, IkaTools.Constants.Resources.WOOD),
  3679. makeResourceCells(movements, city, IkaTools.Constants.Resources.WINE),
  3680. makeResourceCells(movements, city, IkaTools.Constants.Resources.MARBLE),
  3681. makeResourceCells(movements, city, IkaTools.Constants.Resources.GLASS),
  3682. makeResourceCells(movements, city, IkaTools.Constants.Resources.SULFUR));
  3683. }
  3684. function makeTotalsRow(cities) {
  3685. function makeResourceCells(cities, resourceName) {
  3686. var currentUpdateable =
  3687. updateables.create(IkaTools.Utils.nextId('resource_current_total'));
  3688. function makeCurrentContent() {
  3689. var total = 0;
  3690. $.each(cities, function(index, city) {
  3691. var resource = city.getResource(resourceName);
  3692. total += resource.getCurrent() || 0;
  3693. });
  3694. return IkaTools.Intl.formatInteger(total);
  3695. }
  3696. currentUpdateable.registerTickerUpdate(function(element) {
  3697. element.html(makeCurrentContent());
  3698. });
  3699. var production = 0;
  3700. var consumption = 0;
  3701.  
  3702. $.each(cities, function(index, city) {
  3703. var resource = city.getResource(resourceName);
  3704. production += resource.getProduction() || 0;
  3705. consumption += resource.getConsumption() || 0;
  3706. });
  3707. var rows = [makeResourceUseTableRow('+',
  3708. production * IkaTools.Constants.Time.SECONDS_PER_HOUR)];
  3709. var footer = null;
  3710. if (consumption) {
  3711. rows.push(makeResourceUseTableRow('-',
  3712. consumption * IkaTools.Constants.Time.SECONDS_PER_HOUR));
  3713. footer = [makeResourceUseTableRow('&sum;',
  3714. (production - consumption) * IkaTools.Constants.Time.SECONDS_PER_HOUR)];
  3715. }
  3716. toolTips.registerSimple('ResourceProductionTotal_' + resourceName,
  3717. makeResourceUseToolTip(
  3718. 'skin/resources/icon_%s.png'.format(resourceName), rows, footer));
  3719. return ('<td><span id="%s">%s</span></td>' +
  3720. '<td id="ResourceProductionTotal_%s" class="imperator_tool_tip">' +
  3721. '<div class="resource_production">%s</div>' +
  3722. '<div class="resource_consumption">%s</div>' +
  3723. '</td>').format(
  3724. currentUpdateable.getId(0),
  3725. makeCurrentContent(),
  3726. resourceName,
  3727. IkaTools.Intl.formatInteger(
  3728. production * IkaTools.Constants.Time.SECONDS_PER_HOUR, true),
  3729. consumption ? IkaTools.Intl.formatInteger(
  3730. -consumption * IkaTools.Constants.Time.SECONDS_PER_HOUR) : '');
  3731. }
  3732. function makeResearchCell(cities) {
  3733. var total = 0;
  3734. var culturalGoods = 0;
  3735. var isDemocracy = IkaTools.Constants.Government.DEMOCRACY ==
  3736. IkaTools.EmpireData.getCivilizationData().getGovernment();
  3737.  
  3738. $.each(cities, function(index, city) {
  3739. total += city.getResearch() || 0;
  3740. if (isDemocracy) {
  3741. culturalGoods += city.getCulturalGoods();
  3742. }
  3743. });
  3744. var rows = [makeResourceUseTableRow('+', total)];
  3745. var footer = undefined;
  3746. if (isDemocracy) {
  3747. rows.push(makeResourceUseTableRow(
  3748. '<img src="skin/museum/icon32_culturalgood.png" height="10"/>', culturalGoods));
  3749. footer = [makeResourceUseTableRow('&sum;', total + culturalGoods)];
  3750. }
  3751. toolTips.registerSimple('ResearchTotal',
  3752. makeResourceUseToolTip(
  3753. 'skin/layout/bulb-on.png', rows, footer));
  3754. return ('<td id="ResearchTotal" class="research imperator_tool_tip">%s</td>')
  3755. .format(IkaTools.Intl.formatInteger(total + culturalGoods, true));
  3756. }
  3757. function makePopulationCells(cities) {
  3758. function getData() {
  3759. var population = 0;
  3760. var growth = 0;
  3761. $.each(cities, function(index, city) {
  3762. var populationData = city.getPopulationData();
  3763. population += populationData.population || 0;
  3764. growth += populationData.growth;
  3765. });
  3766. return {
  3767. population: population,
  3768. growth: growth,
  3769. }
  3770. }
  3771. var updateable = updateables.create('population_total', 'population_growth_total');
  3772. updateable.registerTickerUpdate(function(populationCell, growthCell) {
  3773. var data = getData();
  3774. populationCell.html(IkaTools.Intl.formatInteger(data.population));
  3775. growthCell.html(IkaTools.Intl.formatDecimal(data.growth, 2, true));
  3776. });
  3777. var data = getData();
  3778. return ('<td id="%s" class="population">%s</td>' +
  3779. '<td/>' +
  3780. '<td id="%s" class="population_growth">%s</td>').format(
  3781. updateable.getId(0),
  3782. IkaTools.Intl.formatInteger(data.population),
  3783. updateable.getId(1),
  3784. IkaTools.Intl.formatDecimal(data.growth, 2, true));
  3785. }
  3786. return ('<tr><td colspan="4" class="totals_sigma_cell"/>' +
  3787. '%s%s%s%s%s%s%s</tr>').format(
  3788. makePopulationCells(cities),
  3789. makeResearchCell(cities),
  3790. makeResourceCells(cities, IkaTools.Constants.Resources.WOOD),
  3791. makeResourceCells(cities, IkaTools.Constants.Resources.WINE),
  3792. makeResourceCells(cities, IkaTools.Constants.Resources.MARBLE),
  3793. makeResourceCells(cities, IkaTools.Constants.Resources.GLASS),
  3794. makeResourceCells(cities, IkaTools.Constants.Resources.SULFUR));
  3795. }
  3796. function makeResourceColGroup(resource) {
  3797. return ('<colgroup class="resource resource_%s">' +
  3798. '<col class="resource_on_hand resource_%s"/>' +
  3799. '<col class="resource_use resource_%s"/>' +
  3800. '</colgroup>').format(
  3801. resource, resource, resource);
  3802. }
  3803. function makeCols() {
  3804. return ('%s' +
  3805. '<colgroup class="actions">' +
  3806. '<col class="actions"/>' +
  3807. '</colgroup>' +
  3808. '<colgroup class="population">' +
  3809. '<col class="population"/>' +
  3810. '<col class="population_growth_icon"/>' +
  3811. '<col class="population_growth"/>' +
  3812. '</colgroup>' +
  3813. '<colgroup class="research">' +
  3814. '<col class="research"/>' +
  3815. '</colgroup>' +
  3816. //'<colgroup class="financial">' +
  3817. // '<col class="financial"/>' +
  3818. //'</colgroup>' +
  3819. '%s%s%s%s%s')
  3820. .format(makeCityNameColGroup('<col class="action_points">'),
  3821. makeResourceColGroup('wood'),
  3822. makeResourceColGroup('wine'),
  3823. makeResourceColGroup('marble'),
  3824. makeResourceColGroup('crystal'),
  3825. makeResourceColGroup('sulfur'));
  3826. }
  3827. function makeTableHead() {
  3828. toolTips.registerSimple('ResourcePopulationHeader',
  3829. '<div class="nowrap">%s</div>'.format(
  3830. localizer.localize('misc','population')));
  3831. toolTips.registerSimple('ResourcePopulationGrowthHeader',
  3832. '<div class="nowrap">%s</div>'.format(
  3833. localizer.localize('misc','population_growth')));
  3834. toolTips.registerSimple('ResourceResearchHeader',
  3835. '<div class="nowrap">%s</div>'.format(
  3836. localizer.localize('misc','research')));
  3837. toolTips.registerSimple('ResourceTableActionPoints',
  3838. '<div class="nowrap">%s</div>'.format(
  3839. localizer.localize('misc','action_points')));
  3840. toolTips.registerSimple('ResourceWoodHeader',
  3841. '<div class="nowrap">%s</div>'.format(
  3842. localizer.localize('resources','wood')));
  3843. toolTips.registerSimple('ResourceWineHeader',
  3844. '<div class="nowrap">%s</div>'.format(
  3845. localizer.localize('resources','wine')));
  3846. toolTips.registerSimple('ResourceMarbleHeader',
  3847. '<div class="nowrap">%s</div>'.format(
  3848. localizer.localize('resources','marble')));
  3849. toolTips.registerSimple('ResourceCrystalHeader',
  3850. '<div class="nowrap">%s</div>'.format(
  3851. localizer.localize('resources','glass')));
  3852. toolTips.registerSimple('ResourceSulfurHeader',
  3853. '<div class="nowrap">%s</div>'.format(
  3854. localizer.localize('resources','sulfur')));
  3855. return ('<thead>' +
  3856. '<tr>%s' +
  3857. '<th id="ResourceTableActionPoints" ' +
  3858. 'class="action_points imperator_tool_tip">%s</th>' +
  3859. '<th class="actions">%s</th>' +
  3860. '<th colspan="1" id="ResourcePopulationHeader" ' +
  3861. 'class="population imperator_tool_tip">%s</th>' +
  3862. '<th colspan="2" id="ResourcePopulationGrowthHeader" ' +
  3863. 'class="population_growth imperator_tool_tip">%s</th>' +
  3864. '<th colspan="1" id="ResourceResearchHeader" ' +
  3865. 'class="research imperator_tool_tip">%s</th>' +
  3866. '<th colspan="2" id="ResourceWoodHeader" ' +
  3867. 'class="resource resource_wood imperator_tool_tip">%s</th>' +
  3868. '<th colspan="2" id="ResourceWineHeader" ' +
  3869. 'class="resource resource_wine imperator_tool_tip">%s</th>' +
  3870. '<th colspan="2" id="ResourceMarbleHeader" ' +
  3871. 'class="resource resource_marble imperator_tool_tip">%s</th>' +
  3872. '<th colspan="2" id="ResourceCrystalHeader" ' +
  3873. 'class="resource resource_crystal imperator_tool_tip">%s</th>' +
  3874. '<th colspan="2" id="ResourceSulfurHeader" ' +
  3875. 'class="resource resource_sulfur imperator_tool_tip">%s</th>' +
  3876. '</tr>' +
  3877. '</thead>').format(
  3878. makeCityNameHeaderCells(),
  3879. localizer.localize('misc','action_points'),
  3880. localizer.localize('misc','actions'),
  3881. localizer.localize('misc','population'),
  3882. localizer.localize('misc','population_growth'),
  3883. localizer.localize('misc','research'),
  3884. localizer.localize('resources','wood'),
  3885. localizer.localize('resources','wine'),
  3886. localizer.localize('resources','marble'),
  3887. localizer.localize('resources','glass'),
  3888. localizer.localize('resources','sulfur'));
  3889. }
  3890. var cities = IkaTools.EmpireData.getOwnCities();
  3891. var movements = IkaTools.EmpireData.getCivilizationData().getMovements();
  3892. return '%s%s<tbody>%s</tbody><tfoot>%s</tfoot>'.format(
  3893. makeCols(),
  3894. makeTableHead(),
  3895. $.map(cities, makeRow.bind(null, movements)).join(''),
  3896. makeTotalsRow(cities));
  3897. }
  3898. var tab = new Tab('resources', localizer.localize('misc','resources'), $(
  3899. '<div class="imperator_overview">' +
  3900. '<table class="overview" id="ImperatorOverviewResourceTable"/>' +
  3901. '</div>'),
  3902. 'ImperatorOverviewResourceTable',
  3903. function() {
  3904. IkaTools.EmpireData.registerResourcesChangedHandler(function(changes) {
  3905. tab.maybeRedraw(true);
  3906. });
  3907. IkaTools.EmpireData.registerBuildingsChangedHandler(function(changes) {
  3908. var redraw = false;
  3909. $.each(changes, function(index, change) {
  3910. var type = change.building.getType();
  3911. if (type == IkaTools.Constants.Buildings.TAVERN ||
  3912. type == IkaTools.Constants.Buildings.MUSEUM ||
  3913. type == IkaTools.Constants.Buildings.ACADEMY ||
  3914. type == IkaTools.Constants.Buildings.TOWN_HALL) {
  3915. redraw = true;
  3916. }
  3917. });
  3918. tab.maybeRedraw(redraw);
  3919. });
  3920. IkaTools.EmpireData.registerCivilizationDataChangedHandler(function(changes) {
  3921. tab.maybeRedraw(true);
  3922. });
  3923. IkaTools.EmpireData.registerMovementsChangedHandler(function(changes) {
  3924. var redraw = false;
  3925. $.each(changes, function(index, change) {
  3926. var mission = change.movement.mission;
  3927. if (mission == IkaTools.Constants.Movements.Mission.TRANSPORT ||
  3928. mission == IkaTools.Constants.Movements.Mission.PLUNDER) {
  3929. redraw = true;
  3930. }
  3931. });
  3932. tab.maybeRedraw(redraw);
  3933. });
  3934. },
  3935. makeTableContent);
  3936. return tab.getTab();
  3937. }
  3938. function makeBuildingsTab() {
  3939. var BUILDING_ORDER = [
  3940. { name: 'growth',
  3941. buildings: [IkaTools.Constants.Buildings.TOWN_HALL,
  3942. IkaTools.Constants.Buildings.PALACE,
  3943. IkaTools.Constants.Buildings.GOVERNORS_RESIDENCE,
  3944. IkaTools.Constants.Buildings.TAVERN,
  3945. IkaTools.Constants.Buildings.MUSEUM] },
  3946. { name: 'research',
  3947. buildings: [IkaTools.Constants.Buildings.ACADEMY,
  3948. IkaTools.Constants.Buildings.WORKSHOP,
  3949. IkaTools.Constants.Buildings.TEMPLE] },
  3950. { name: 'diplomacy',
  3951. buildings: [IkaTools.Constants.Buildings.EMBASSY] },
  3952. { name: 'trading',
  3953. buildings: [IkaTools.Constants.Buildings.WAREHOUSE,
  3954. IkaTools.Constants.Buildings.DUMP,
  3955. IkaTools.Constants.Buildings.TRADING_PORT,
  3956. IkaTools.Constants.Buildings.TRADING_POST] },
  3957. { name: 'military',
  3958. buildings: [IkaTools.Constants.Buildings.WALL,
  3959. IkaTools.Constants.Buildings.HIDEOUT,
  3960. IkaTools.Constants.Buildings.BARRACKS,
  3961. IkaTools.Constants.Buildings.SHIPYARD,
  3962. IkaTools.Constants.Buildings.PIRATE_FORTRESS] },
  3963. { name: 'wood',
  3964. buildings: [IkaTools.Constants.Buildings.FORESTER,
  3965. IkaTools.Constants.Buildings.CARPENTER] },
  3966. { name: 'wine',
  3967. buildings: [IkaTools.Constants.Buildings.WINERY,
  3968. IkaTools.Constants.Buildings.WINE_PRESS] },
  3969. { name: 'marble',
  3970. buildings: [IkaTools.Constants.Buildings.STONEMASON,
  3971. IkaTools.Constants.Buildings.ARCHITECT] },
  3972. { name: 'crystal',
  3973. buildings: [IkaTools.Constants.Buildings.GLASSBLOWER,
  3974. IkaTools.Constants.Buildings.OPTICIAN] },
  3975. { name: 'sulfur',
  3976. buildings: [IkaTools.Constants.Buildings.ALCHEMISTS_TOWER,
  3977. IkaTools.Constants.Buildings.FIREWORK_TEST_AREA] },
  3978. ];
  3979. function makeTableContent() {
  3980. var updateables = this.updateables;
  3981. var empireBuildingCounts = {};
  3982. $.each(IkaTools.EmpireData.getOwnCities(), function(index, city) {
  3983. var cityBuildingCounts = {};
  3984. $.each(city.getBuildings(), function(index, building) {
  3985. if (!building.isEmpty()) {
  3986. cityBuildingCounts[building.getType()] =
  3987. (cityBuildingCounts[building.getType()] || 0) + 1;
  3988. }
  3989. });
  3990. $.each(cityBuildingCounts, function(key, value) {
  3991. empireBuildingCounts[key] = Math.max(
  3992. empireBuildingCounts[key] || 0, cityBuildingCounts[key]);
  3993. });
  3994. });
  3995. function makeCols(type) {
  3996. var count = empireBuildingCounts[type];
  3997. if (count) {
  3998. var html = '<col class="building building_%s"/>'.format(type);
  3999. for (var i = 1; i < count; i++) {
  4000. html += '<col class="building building_additional building_%s"/>'.format(type);
  4001. }
  4002. return html;
  4003. } else {
  4004. return '';
  4005. }
  4006. }
  4007. function makeColGroup(info) {
  4008. var group = $.map(info.buildings, makeCols).join('');
  4009. return !group ? '' :
  4010. '<colgroup class="buildings buildings_%s">%s</colgroup>'.format(
  4011. info.name, group);
  4012. }
  4013. function makeTableHeaderCells(type) {
  4014. var count = empireBuildingCounts[type];
  4015. var displayName = localizer.localize('buildings', type);
  4016. var toolTip = toolTips.registerSimple('ImperatorBuildingHeader_' + type,
  4017. $('<div class="nowrap">%s</div>'.format(displayName)));
  4018. return !count ? '' :
  4019. ('<th class="building building_%s imperator_tool_tip" ' +
  4020. 'id="ImperatorBuildingHeader_%s" colspan="%s">%s</td>').format(
  4021. type,
  4022. type,
  4023. count,
  4024. displayName);
  4025. }
  4026. function makeTableHeadContent() {
  4027. var displayName = localizer.localize('misc','building_spots');
  4028. toolTips.registerSimple('ImperatorBuildingHeaderBuildingSpots',
  4029. '<div class="nowrap">%s</div>'.format(displayName));
  4030. return ('%s' +
  4031. '<th class="actions">%s</th>' +
  4032. '<th class="building building_spots imperator_tool_tip" ' +
  4033. 'id="ImperatorBuildingHeaderBuildingSpots">%s</th>' +
  4034. '%s').format(
  4035. makeCityNameHeaderCells(),
  4036. localizer.localize('misc','actions'),
  4037. displayName,
  4038. $.map(BUILDING_ORDER, function(info) {
  4039. return $.map(info.buildings, makeTableHeaderCells);
  4040. }).join(''));
  4041. }
  4042. function makeTableCell(city, building) {
  4043. var link = new Link('Building_%s_%s'.format(city.getId(), building.getPosition()))
  4044. .toCityView(city, building.getType(),
  4045. { position: building.getPosition(), cityId: city.getId() });
  4046. var isUpgrading = building.isUpgrading();
  4047. var toolTip = '';
  4048. if (!isUpgrading && building.isMaxLevel()) {
  4049. toolTips.deregister(link.getId());
  4050. } else if (!building.isMaxLevel()) {
  4051. toolTips.registerRefreshable(link.getId(), function() {
  4052. function makeCostRow(resource) {
  4053. var required = costs[resource];
  4054. if (!required) {
  4055. return '';
  4056. }
  4057.  
  4058. var onHand = city.getResource(resource).getCurrent();
  4059.  
  4060. return ('<tr>' +
  4061. '<td class="resource_icon">' +
  4062. '<img src="skin/resources/icon_%s.png">' +
  4063. '</td>' +
  4064. '<td class="resource_cost">%s</td>' +
  4065. '<td class="resource_missing">%s</td>' +
  4066. '</tr>').format(
  4067. resource,
  4068. IkaTools.Intl.formatInteger(required),
  4069. onHand >= required
  4070. ? '<img src="skin/interface/check_mark_17px.png"/>'
  4071. : IkaTools.Intl.formatInteger(onHand - required, true));
  4072. }
  4073. var upgradingHtml = '';
  4074. if (isUpgrading) {
  4075. upgradingHtml = ('<div class="imperator_tool_tip_title">%s</div>' +
  4076. '<div class="nowrap">%s (%s)</div>').format(
  4077. localizer.localize('misc','constructing'),
  4078. IkaTools.Intl.formatRemainingTime(
  4079. building.getRemainingUpgradeTime()),
  4080. IkaTools.Intl.formatAbsoluteTime(
  4081. building.getCompletionTime()));
  4082. }
  4083. var costs = building.getUpgradeCosts();
  4084. return ('%s<table class="building_upgrade_costs">' +
  4085. '<thead class="imperator_tool_tip_title">' +
  4086. '<tr><th colspan="3">%s</th></tr>' +
  4087. '</thead>' +
  4088. '<tbody>' +
  4089. '%s%s%s%s%s' +
  4090. '</tbody>' +
  4091. '<tfoot>' +
  4092. '<tr>' +
  4093. '<td class="resource_icon">' +
  4094. '<img src="skin/resources/icon_time.png"/>' +
  4095. '</td>' +
  4096. '<td class="nowrap" colspan="2">%s</td>' +
  4097. '</tr>' +
  4098. '</tfoot>' +
  4099. '<table>')
  4100. .format(
  4101. upgradingHtml,
  4102. isUpgrading ?
  4103. localizer.localize('misc','next_level_cost') :
  4104. localizer.localize('misc','resource_cost'),
  4105. makeCostRow(IkaTools.Constants.Resources.WOOD),
  4106. makeCostRow(IkaTools.Constants.Resources.WINE),
  4107. makeCostRow(IkaTools.Constants.Resources.MARBLE),
  4108. makeCostRow(IkaTools.Constants.Resources.GLASS),
  4109. makeCostRow(IkaTools.Constants.Resources.SULFUR),
  4110. IkaTools.Intl.formatRemainingTime(costs.time));
  4111. });
  4112. }
  4113. return ('<td class="%s">%s' +
  4114. '<a id="%s" class="imperator_link imperator_tool_tip" ' +
  4115. 'href="javascript:void(0);">' +
  4116. '%s%s' +
  4117. '</a>' +
  4118. '</td>').format(
  4119. isUpgrading ? 'building_upgrading' : '',
  4120. toolTip,
  4121. link.getId(),
  4122. building.getLevel(),
  4123. isUpgrading ? ('&raquo;' + (building.getLevel() + 1)) : '');
  4124. }
  4125. function makeTableCells(city, type) {
  4126. var count = empireBuildingCounts[type];
  4127. var html = '';
  4128. if (count) {
  4129. var buildings = city.getBuildingsByType(type);
  4130. for (var i = 0; i < count; i++) {
  4131. if (i < buildings.length) {
  4132. html += makeTableCell(city, buildings[i]);
  4133. } else {
  4134. html += '<td/>';
  4135. }
  4136. }
  4137. }
  4138. return html;
  4139. }
  4140. function makeRow(city) {
  4141. var buildingSpots = city.getBuildingsByType('').length;
  4142. var rowUpdateable = updateables.create('BuildingsTableRow_%s'.format(city.getId()))
  4143. .registerUpdate('cityChanged',
  4144. function(element) {
  4145. if (IkaTools.View.isActiveCity(city)) {
  4146. element.addClass('current');
  4147. } else {
  4148. element.removeClass('current');
  4149. }
  4150. });
  4151. var cityLink = new Link('BuildingTabToCity_%s'.format(city.getId()))
  4152. .toCityView(city, undefined, { },
  4153. function() {
  4154. makePopup().close();
  4155. return true;
  4156. });
  4157. var transportLink = new Link('BuildingTabTransportGoods_%s'.format(city.getId()))
  4158. .toLocalView(
  4159. IkaTools.Constants.View.TRANSPORT,
  4160. {
  4161. templateView: IkaTools.Constants.View.CITY_DETAIL,
  4162. destinationCityId: city.getId(),
  4163. },
  4164. function() {
  4165. var go = !IkaTools.View.isActiveCity(city) &&
  4166. IkaTools.View.getCurrentCity().isOwn();
  4167. if (go) {
  4168. openBuildingsTabOnTransportClose = true;
  4169. }
  4170. return go;
  4171. });
  4172. return ('<tr id="%s" class="%s">%s' +
  4173. '<td class="actions">' +
  4174. '<a id="%s" class="imperator_link to_city_view" ' +
  4175. 'title="%s" href="javascript:void(0);"/>' +
  4176. '<a id="%s" class="imperator_link transport_goods" ' +
  4177. 'title="%s" href="javascript:void(0);"/>' +
  4178. '</td>' +
  4179. '<td class="building building_spots">%s</td>' +
  4180. '%s' +
  4181. '</tr>').format(
  4182. rowUpdateable.getId(0),
  4183. (IkaTools.View.isActiveCity(city) ? 'current' : ''),
  4184. makeCityNameCells('buildings', city),
  4185. cityLink.getId(),
  4186. localizer.localize('actions','to_city_view'),
  4187. transportLink.getId(),
  4188. localizer.localize('actions','transport_goods'),
  4189. buildingSpots > 0 ? buildingSpots : '',
  4190. $.map(BUILDING_ORDER, function(info) {
  4191. return $.map(info.buildings, makeTableCells.bind(null, city));
  4192. }).join(''));
  4193. }
  4194. return ('%s<colgroup class="actions"><col class="actions"/></colgroup>' +
  4195. '%s<thead>%s</thead><tbody>%s</tbody>').format(
  4196. makeCityNameColGroup('<col class="building building_spots">'),
  4197. $.map(BUILDING_ORDER, makeColGroup).join(''),
  4198. makeTableHeadContent(),
  4199. $.map(IkaTools.EmpireData.getOwnCities(), makeRow).join(''));
  4200. }
  4201. var tab = new Tab('buildings', localizer.localize('misc','buildings'), $(
  4202. '<div class="imperator_overview">' +
  4203. '<table class="overview" id="ImperatorOverviewBuildingsTable"/>' +
  4204. '</div>'),
  4205. 'ImperatorOverviewBuildingsTable',
  4206. function() {
  4207. IkaTools.EmpireData.registerBuildingsChangedHandler(function(changes) {
  4208. tab.maybeRedraw(true);
  4209. });
  4210. },
  4211. makeTableContent);
  4212. return tab.getTab();
  4213. }
  4214.  
  4215. var UNIT_ORDER = [
  4216. { name: 'army_front_line',
  4217. units: [IkaTools.Constants.Military.HOPLITE,
  4218. IkaTools.Constants.Military.STEAM_GIANT]},
  4219. { name: 'army_flank',
  4220. units: [IkaTools.Constants.Military.SPEARMAN,
  4221. IkaTools.Constants.Military.SWORDSMAN]},
  4222. { name: 'army_ranged',
  4223. units: [IkaTools.Constants.Military.SLINGER,
  4224. IkaTools.Constants.Military.ARCHER,
  4225. IkaTools.Constants.Military.GUNNER]},
  4226. { name: 'army_seige',
  4227. units: [IkaTools.Constants.Military.BATTERING_RAM,
  4228. IkaTools.Constants.Military.CATAPULT,
  4229. IkaTools.Constants.Military.MORTAR]},
  4230. { name: 'army_flying',
  4231. units: [IkaTools.Constants.Military.GYROCOPTER,
  4232. IkaTools.Constants.Military.BALLOON_BOMBADIER]},
  4233. { name: 'army_support',
  4234. units: [IkaTools.Constants.Military.COOK,
  4235. IkaTools.Constants.Military.DOCTOR]},
  4236. { name: 'navy_front_line',
  4237. units: [IkaTools.Constants.Military.FLAME_THROWER,
  4238. IkaTools.Constants.Military.STEAM_RAM]},
  4239. { name: 'navy_flank',
  4240. units: [IkaTools.Constants.Military.RAM_SHIP]},
  4241. { name: 'navy_ranged',
  4242. units: [IkaTools.Constants.Military.BALLISTA_SHIP,
  4243. IkaTools.Constants.Military.CATAPULT_SHIP,
  4244. IkaTools.Constants.Military.MORTAR_SHIP]},
  4245. { name: 'navy_seige',
  4246. units: [IkaTools.Constants.Military.SUBMARINE,
  4247. IkaTools.Constants.Military.ROCKET_SHIP]},
  4248. { name: 'navy_flying',
  4249. units: [IkaTools.Constants.Military.PADDLE_SPEED_SHIP,
  4250. IkaTools.Constants.Military.BALLOON_CARRIER]},
  4251. { name: 'navy_support',
  4252. units: [IkaTools.Constants.Military.TENDER]}
  4253. ];
  4254. function makeMilitaryTab() {
  4255. function makeTableContent() {
  4256. var cities = IkaTools.EmpireData.getCities();
  4257. var updateables = this.updateables;
  4258. var empireHasTroopType = {};
  4259. $.each(cities, function(index, city) {
  4260. $.each(city.getMilitary().getPresent().getCounts(), function(unit, count) {
  4261. if (count) {
  4262. empireHasTroopType[unit] = true;
  4263. }
  4264. });
  4265. $.each(city.getMilitary().getTrainingBatches(), function(index, batch) {
  4266. $.each(batch.getUnits().getCounts(), function(unit, count) {
  4267. if (count) {
  4268. empireHasTroopType[unit] = true;
  4269. }
  4270. });
  4271. });
  4272. });
  4273. $.each(IkaTools.EmpireData.getCivilizationData().getMovements(),
  4274. function(index, movement) {
  4275. $.each(movement.getUnits().getCounts(), function(unit, count) {
  4276. if (count) {
  4277. empireHasTroopType[unit] = true;
  4278. }
  4279. });
  4280. });
  4281. function makeCol(type) {
  4282. return !empireHasTroopType[type] ? '' :
  4283. '<col class="military military_%s"/>'.format(type);
  4284. }
  4285. function makeColGroup(info) {
  4286. var group = $.map(info.units, makeCol).join('');
  4287. return !group ? '' :
  4288. '<colgroup class="military military_%s">%s</colgroup>'.format(
  4289. info.name, group);
  4290. }
  4291. function makeTableHeaderCell(type) {
  4292. var displayName = localizer.localize('units', type);
  4293. var toolTip = toolTips.registerSimple('ImperatorMilitaryHeader_' + type,
  4294. '<div class="nowrap">%s</div>'.format(displayName));
  4295. return !empireHasTroopType[type] ? '' :
  4296. ('<th class="military military_%s imperator_tool_tip" ' +
  4297. 'id="ImperatorMilitaryHeader_%s">%s</td>').format(
  4298. type,
  4299. type,
  4300. displayName);
  4301. }
  4302. function makeTableHeadContent() {
  4303. toolTips.registerSimple('MilitaryTableActionPoints',
  4304. '<div class="nowrap">%s</div>'.format(
  4305. localizer.localize('misc','action_points')));
  4306. return ('%s<th id="MilitaryTableActionPoints" ' +
  4307. 'class="action_points imperator_tool_tip">%s</th>' +
  4308. '<th class="actions">%s</th>%s').format(
  4309. makeCityNameHeaderCells(true),
  4310. localizer.localize('misc','action_points'),
  4311. localizer.localize('misc','actions'),
  4312. $.map(UNIT_ORDER, function(info) {
  4313. return $.map(info.units, makeTableHeaderCell);
  4314. }).join(''));
  4315. }
  4316. function makeTableCell(city, military, movements, type) {
  4317. var cityId = city.getId();
  4318. var count = military.getPresent().getCount(type);
  4319.  
  4320. function isDeploymentCountableMovement(movement) {
  4321. if (movement.getUnits().getCount(type) > 0) {
  4322. var mission = movement.getMission();
  4323. var stage = movement.getStage();
  4324. if (mission == IkaTools.Constants.Movements.Mission.DEPLOY_ARMY ||
  4325. mission == IkaTools.Constants.Movements.Mission.DEPLOY_NAVY) {
  4326. if (stage == IkaTools.Constants.Movements.Stage.LOADING ||
  4327. stage == IkaTools.Constants.Movements.Stage.EN_ROUTE) {
  4328. return movement.getTargetCityId() == cityId;
  4329. }
  4330. if (stage == IkaTools.Constants.Movements.Stage.RETURNING) {
  4331. return movement.getOriginCityId() == cityId;
  4332. }
  4333. }
  4334. }
  4335. return false;
  4336. }
  4337. function isPlunderCountableMovement(movement) {
  4338. if (movement.getUnits().getCount(type) > 0) {
  4339. var mission = movement.getMission();
  4340. if (mission == IkaTools.Constants.Movements.Mission.PLUNDER) {
  4341. return movement.getOriginCityId() == cityId;
  4342. }
  4343. }
  4344. return false;
  4345. }
  4346. var trainingBatches = military.getTrainingBatches();
  4347. var trainingCount = 0;
  4348. $.each(trainingBatches, function countTraining(index, batch) {
  4349. trainingCount += batch.getUnits().getCount(type) || 0;
  4350. });
  4351.  
  4352. var hasIncomingDeployments = false;
  4353. $.each(movements, function isIncomingDeployment(index, movement) {
  4354. var mission = movement.getMission();
  4355. var stage = movement.getStage();
  4356. if (mission == IkaTools.Constants.Movements.Mission.DEPLOY_ARMY ||
  4357. mission == IkaTools.Constants.Movements.Mission.DEPLOY_NAVY) {
  4358. if (stage == IkaTools.Constants.Movements.Stage.LOADING ||
  4359. stage == IkaTools.Constants.Movements.Stage.EN_ROUTE) {
  4360. hasIncomingDeployments = true;
  4361. }
  4362. if (stage == IkaTools.Constants.Movements.Stage.RETURNING) {
  4363. hasIncomingDeployments = true;
  4364. }
  4365. }
  4366. });
  4367. var deployingCount = 0;
  4368. $.each(movements, function countDeploying(index, movement) {
  4369. if (isDeploymentCountableMovement(movement)) {
  4370. deployingCount += movement.getUnits().getCount(type) || 0;
  4371. }
  4372. });
  4373. var plunderingCount = 0;
  4374. $.each(movements, function countPlundering(index, movement) {
  4375. if (isPlunderCountableMovement(movement)) {
  4376. plunderingCount += movement.getUnits().getCount(type) || 0;
  4377. }
  4378. });
  4379. var trainingDivId = 'MilitaryTraining_%s_%s'.format(city.getId(), type);
  4380. if (trainingCount) {
  4381. var isArmy = IkaTools.Constants.UnitData[type].isArmy;
  4382. toolTips.registerRefreshable(trainingDivId, function() {
  4383. return ('<table class="training_units_tool_tip">' +
  4384. '<thead>' +
  4385. '<tr>' +
  4386. '<th>' +
  4387. '<img src="skin/characters/%s%s_faceright.png" ' +
  4388. '%s="15" />' +
  4389. '</th>' +
  4390. '<th>%s</th>' +
  4391. '</tr>' +
  4392. '</thead>' +
  4393. '<tbody>%s</tbody>' +
  4394. '</table').format(
  4395. isArmy ? 'military/x60_y60/y60_' : 'fleet/60x60/',
  4396. type,
  4397. isArmy ? 'height' : 'width',
  4398. localizer.localize('misc','training'),
  4399. $.map(trainingBatches, function makeTrainingToolTipRow(batch) {
  4400. var count = batch.getUnits().getCount(type);
  4401. if (count) {
  4402. return '<tr><td class="training_count">%s</td><td>%s</td></tr>'.format(
  4403. IkaTools.Intl.formatInteger(count, true),
  4404. IkaTools.Intl.formatRemainingTime(
  4405. batch.getCompletionTime() - IkaTools.View.gameTimeNow()));
  4406. } else {
  4407. return '';
  4408. }
  4409. }).join(''));
  4410. });
  4411. } else {
  4412. toolTips.deregister(trainingDivId);
  4413. }
  4414. var deployingDivId = 'MilitaryDeployment_%s_%s'.format(city.getId(), type);
  4415. if (deployingCount) {
  4416. var isArmy = IkaTools.Constants.UnitData[type].isArmy;
  4417. toolTips.registerRefreshable(deployingDivId, function() {
  4418. return ('<table class="deploying_units_tool_tip">' +
  4419. '<thead>' +
  4420. '<tr>' +
  4421. '<th>' +
  4422. '<img src="skin/characters/%s%s_faceright.png" ' +
  4423. '%s="15" />' +
  4424. '</th>' +
  4425. '<th>%s</th>' +
  4426. '</tr>' +
  4427. '</thead>' +
  4428. '<tbody>%s</tbody>' +
  4429. '</table').format(
  4430. isArmy ? 'military/x60_y60/y60_' : 'fleet/60x60/',
  4431. type,
  4432. isArmy ? 'height' : 'width',
  4433. localizer.localize('misc','deploying'),
  4434. $.map(movements, function makeDeployingToolTipRow(movement) {
  4435. var count = movement.getUnits().getCount(type);
  4436. if (isDeploymentCountableMovement(movement)) {
  4437. return '<tr><td class="deploying_count">%s</td><td>%s</td></tr>'.format(
  4438. IkaTools.Intl.formatInteger(count, true),
  4439. IkaTools.Intl.formatRemainingTime(
  4440. movement.getArrivalTime() - IkaTools.View.gameTimeNow()));
  4441. } else {
  4442. return '';
  4443. }
  4444. }).join(''));
  4445. });
  4446. } else {
  4447. toolTips.deregister(deployingDivId);
  4448. }
  4449. var plunderingDivId = 'MilitaryPludering_%s_%s'.format(city.getId(), type);
  4450. if (plunderingCount) {
  4451. var isArmy = IkaTools.Constants.UnitData[type].isArmy;
  4452. toolTips.registerRefreshable(plunderingDivId, function() {
  4453. return ('<table class="plundering_units_tool_tip">' +
  4454. '<thead>' +
  4455. '<tr>' +
  4456. '<th>' +
  4457. '<img src="skin/characters/%s%s_faceright.png" ' +
  4458. '%s="15" />' +
  4459. '</th>' +
  4460. '<th>%s</th>' +
  4461. '</tr>' +
  4462. '</thead>' +
  4463. '<tbody>%s</tbody>' +
  4464. '</table').format(
  4465. isArmy ? 'military/x60_y60/y60_' : 'fleet/60x60/',
  4466. type,
  4467. isArmy ? 'height' : 'width',
  4468. localizer.localize('misc','plundering'),
  4469. $.map(movements, function makeDeployingToolTipRow(movement) {
  4470. var count = movement.getUnits().getCount(type);
  4471. if (isPlunderCountableMovement(movement)) {
  4472. return '<tr><td class="plundering_count">%s</td><td>%s</td></tr>'.format(
  4473. IkaTools.Intl.formatInteger(count, true),
  4474. IkaTools.Intl.formatRemainingTime(
  4475. movement.getArrivalTime() - IkaTools.View.gameTimeNow()));
  4476. } else {
  4477. return '';
  4478. }
  4479. }).join(''));
  4480. });
  4481. } else {
  4482. toolTips.deregister(plunderingDivId);
  4483. }
  4484. return !empireHasTroopType[type] ? '' :
  4485. ('<td class="military military_%s">' +
  4486. '<div>%s</div>' +
  4487. '<div id="%s" class="military_training imperator_tool_tip">%s</div>' +
  4488. '<div id="%s" class="military_deploying imperator_tool_tip">%s</div>' +
  4489. '<div id="%s" class="military_plundering imperator_tool_tip">%s</div>' +
  4490. '</td>').format(
  4491. type,
  4492. count ? IkaTools.Intl.formatInteger(count) : '&nbsp;',
  4493. trainingDivId,
  4494. trainingCount ? IkaTools.Intl.formatInteger(trainingCount, true)
  4495. : (trainingBatches.length ? '&nbsp;' : ''),
  4496. deployingDivId,
  4497. deployingCount ? IkaTools.Intl.formatInteger(deployingCount, true)
  4498. : (hasIncomingDeployments ? '&nbsp;' : ''),
  4499. plunderingDivId,
  4500. plunderingCount ?
  4501. IkaTools.Intl.formatInteger(plunderingCount, true) : '');
  4502. }
  4503. function makeActionsCell(city) {
  4504. var deployTroopsLink = new Link('DeployArmy_%s'.format(city.getId())).toLocalView(
  4505. IkaTools.Constants.View.DEPLOY,
  4506. {
  4507. templateView: IkaTools.Constants.View.CITY_DETAIL,
  4508. destinationCityId: city.getId(),
  4509. deploymentType: 'army',
  4510. },
  4511. function() {
  4512. var go = !IkaTools.View.isActiveCity(city);
  4513. if (go) {
  4514. openMilitaryTabOnDeploymentClose = true;
  4515. }
  4516. return go;
  4517. });
  4518. var deployNavyLink = new Link('DeployNavy_%s'.format(city.getId())).toLocalView(
  4519. IkaTools.Constants.View.DEPLOY,
  4520. {
  4521. templateView: IkaTools.Constants.View.CITY_DETAIL,
  4522. destinationCityId: city.getId(),
  4523. deploymentType: 'fleet',
  4524. },
  4525. function() {
  4526. var go = !IkaTools.View.isActiveCity(city);
  4527. if (go) {
  4528. openMilitaryTabOnDeploymentClose = true;
  4529. }
  4530. return go;
  4531. });
  4532. var barracksLinkHtml = ''
  4533. var shipyardLinkHtml = '';
  4534. var barracks = city.getBuildingByType(IkaTools.Constants.Buildings.BARRACKS);
  4535. var shipyard = city.getBuildingByType(IkaTools.Constants.Buildings.SHIPYARD);
  4536. if (city.isOwn() && barracks) {
  4537. var barracksLink = new Link('MilitaryBarracks_%s'.format(city.getId()))
  4538. .toCityView(city, IkaTools.Constants.View.BARRACKS,
  4539. { position: barracks.getPosition(), cityId: city.getId() });
  4540. barracksLinkHtml = ('<a id="%s" class="imperator_link to_barracks" ' +
  4541. 'title="%s" href="javascript:void(0);"></a>').format(
  4542. barracksLink.getId(),
  4543. localizer.localize('actions','to_barracks'));
  4544. }
  4545. if (city.isOwn() && shipyard) {
  4546. var shipyardLink = new Link('MilitaryShipyard_%s'.format(city.getId()))
  4547.  
  4548. .toCityView(city, IkaTools.Constants.View.SHIPYARD,
  4549. { position: shipyard.getPosition(), cityId: city.getId() });
  4550. shipyardLinkHtml = ('<a id="%s" class="imperator_link to_shipyard" ' +
  4551. 'title="%s" href="javascript:void(0);"></a>').format(
  4552. shipyardLink.getId(),
  4553. localizer.localize('actions','to_shipyard'));
  4554. }
  4555. return ('<td class="actions">' +
  4556. '<a id="%s" class="imperator_link deploy_army" ' +
  4557. 'title="%s" href="javascript:void(0);"></a>' +
  4558. '<a id="%s" class="imperator_link deploy_navy" ' +
  4559. 'title="%s" href="javascript:void(0);"></a>' +
  4560. '%s%s' +
  4561. '</td>').format(
  4562. deployTroopsLink.getId(),
  4563. localizer.localize('actions','deploy_army'),
  4564. deployNavyLink.getId(),
  4565. localizer.localize('actions','deploy_navy'),
  4566. barracksLinkHtml,
  4567. shipyardLinkHtml);
  4568. }
  4569. function makeRow(movements, city) {
  4570. var rowUpdateable = updateables.create('MilitaryTableRow_%s'.format(city.getId()))
  4571. .registerUpdate('cityChanged',
  4572. function(element) {
  4573. if (IkaTools.View.isActiveCity(city)) {
  4574. element.addClass('current');
  4575. } else {
  4576. element.removeClass('current');
  4577. }
  4578. });
  4579. return ('<tr id="%s" class="%s">' +
  4580. '%s' +
  4581. '<td class="action_points">%s</td>' +
  4582. '%s' +
  4583. '%s' +
  4584.  
  4585. '</tr>')
  4586. .format(
  4587. rowUpdateable.getId(0),
  4588. (IkaTools.View.isActiveCity(city) ? 'current' : ''),
  4589. makeCityNameCells('military', city, true),
  4590. IkaTools.Intl.formatInteger(city.getActionPoints()),
  4591. makeActionsCell(city),
  4592. $.map(UNIT_ORDER, function(info) {
  4593. return $.map(info.units, makeTableCell.bind(
  4594. null, city, city.getMilitary(), movements));
  4595. }).join(''));
  4596. }
  4597. function makeSummaryCell(type) {
  4598. if (!empireHasTroopType[type]) {
  4599. return '';
  4600. }
  4601. var count = 0;
  4602. $.each(cities, function(index, city) {
  4603. count += city.getMilitary().getPresent().getCount(type) || 0;
  4604. });
  4605. return '<td>%s</td>'.format(IkaTools.Intl.formatInteger(count));
  4606. }
  4607. function makeSummaryRow(cities) {
  4608. return '<tr><td colspan="3" class="totals_sigma_cell"/>%s</tr>'.format(
  4609. $.map(UNIT_ORDER, function(info) {
  4610. return $.map(info.units, makeSummaryCell);
  4611. }).join(''));
  4612. }
  4613. return '%s%s%s<thead>%s</thead><tbody>%s</tbody><tfoot>%s</tfoot>'.format(
  4614. makeCityNameColGroup('<col class="action_points">', true),
  4615. '<colgroup class="actions"><col class="actions"/></colgroup>',
  4616. $.map(UNIT_ORDER, makeColGroup).join(''),
  4617. makeTableHeadContent(),
  4618. $.map(cities, makeRow.bind(
  4619. null, IkaTools.EmpireData.getCivilizationData().getMovements())).join(''),
  4620. makeSummaryRow(cities));
  4621. }
  4622. var tab = new Tab('military', localizer.localize('misc','military'), $(
  4623. '<div class="imperator_overview">' +
  4624. '<table class="overview" id="ImperatorOverviewMilitaryTable"/>' +
  4625. '</div>'),
  4626. 'ImperatorOverviewMilitaryTable',
  4627. function() {
  4628. IkaTools.EmpireData.registerMilitaryChangedHandler(function(changes) {
  4629. tab.maybeRedraw(true);
  4630. });
  4631. IkaTools.EmpireData.registerResourcesChangedHandler(function(changes) {
  4632. var redraw = false;
  4633. $.each(changes, function(index, change) {
  4634. if (change.type == IkaTools.Constants.Resources.ACTION_POINTS) {
  4635. redraw = true;
  4636. }
  4637. });
  4638. tab.maybeRedraw(redraw);
  4639. });
  4640. IkaTools.EmpireData.registerMovementsChangedHandler(function(changes) {
  4641. var redraw = false;
  4642. $.each(changes, function(index, change) {
  4643. var mission = change.movement.getMission();
  4644. if (mission == IkaTools.Constants.Movements.Mission.DEPLOY_ARMY ||
  4645. mission == IkaTools.Constants.Movements.Mission.DEPLOY_NAVY ||
  4646. mission == IkaTools.Constants.Movements.Mission.PLUNDER) {
  4647. redraw = true;
  4648. }
  4649. });
  4650. tab.maybeRedraw(redraw);
  4651. });
  4652. },
  4653. makeTableContent);
  4654. return tab.getTab();
  4655. }
  4656.  
  4657. function makeEspionageTab() {
  4658. function makeTableContent() {
  4659. var updateables = this.updateables;
  4660.  
  4661. function renderTarget(target) {
  4662. var player = target.getPlayer();
  4663. var alliance = player.getAlliance();
  4664.  
  4665. // TODO: Add predicate when no spies.
  4666. var cityLink = new Link('EspionageCityLink_%s'.format(target.getId()))
  4667. .toIkariamPage({ view: IkaTools.Constants.BaseView.CITY, cityId: target.getId() });
  4668. var cityLinkHtml = ('<a id="%s" class="imperator_link espionage_to_city_view player_state_%s" ' +
  4669. 'title="%s" href="javascript:void(0);">%s</a>').format(
  4670. cityLink.getId(),
  4671. player.getState(),
  4672. localizer.localize('actions','to_city_view'),
  4673. target.getName());
  4674. var occupierHtml = '';
  4675. if (target.getOccupier()) {
  4676. occupierHtml = ('<img id="EspionageOccupier_%s" ' +
  4677. ' class="espionage_occupier imperator_tool_tip" ' +
  4678. ' src="skin/img/island/soldat_red.png" />').format(
  4679. target.getId());
  4680. toolTips.registerSimple('EspionageOccupier_%s'.format(target.getId()),
  4681. '<div class="nowrap">%s %s</div>'.format(
  4682. localizer.localize('espionage','occupied_by'), target.getOccupier().getName()));
  4683. }
  4684.  
  4685. var blockaderHtml = '';
  4686. if (target.getBlockader()) {
  4687. blockaderHtml = ('<img id="EspionageBlockader_%s" ' +
  4688. ' class="espionage_blockader imperator_tool_tip" ' +
  4689. ' src="skin/img/island/schiff_red.png" />').format(
  4690. target.getId());
  4691. toolTips.registerSimple('EspionageBlockader_%s'.format(target.getId()),
  4692. '<div class="nowrap">%s %s</div>'.format(
  4693. localizer.localize('espionage','blockaded_by'), target.getBlockader().getName()));
  4694. }
  4695.  
  4696. var allianceLinkHtml = '';
  4697. if (alliance) {
  4698. var allianceLink = new Link('EspionageAllianceLink_%s'.format(target.getId()))
  4699. .toLocalView(IkaTools.Constants.View.ALLIANCE_PAGE, { allyId: alliance.getId()});
  4700. var allianceLinkHtml = ('[<a id="%s" class="imperator_link" ' +
  4701. 'title="%s" href="javascript:void(0);">%s</a>]').format(
  4702. allianceLink.getId(),
  4703. localizer.localize('actions','view_alliance_page'),
  4704. alliance.getName());
  4705. }
  4706. var playerLink = new Link('EspionagePlayerLink_%s'.format(target.getId()))
  4707. .toLocalView(IkaTools.Constants.View.HIGH_SCORE, { searchUser: player.getName() });
  4708. var playerLinkHtml = ('<a id="%s" class="imperator_link player_state_%s" ' +
  4709. 'title="%s" href="javascript:void(0);">%s</a> %s').format(
  4710. playerLink.getId(),
  4711. player.getState(),
  4712. localizer.localize('actions','view_high_score'),
  4713. player.getName(),
  4714. allianceLinkHtml);
  4715. var islandLink = new Link('EspionageIslandLink_%s'.format(target.getId()))
  4716. .toIkariamPage({ view: IkaTools.Constants.BaseView.ISLAND, cityId: target.getId() });
  4717. var islandLinkHtml = ('<a id="%s" class="imperator_link espionage_to_island_view" ' +
  4718. 'title="%s" href="javascript:void(0);">[%s:%s]</a>').format(
  4719. islandLink.getId(),
  4720. localizer.localize('actions','to_island_view'),
  4721. target.getIslandCoordinates()[0], target.getIslandCoordinates()[1]);
  4722.  
  4723. var spyActionLink = new Link('EspionageSpyActionLink_%s'.format(target.getId()))
  4724. .toIkariamPage(
  4725. { view : IkaTools.Constants.BaseView.CITY, cityId: target.getId() },
  4726. IkaTools.View.makeIkariamLoadLocalPageAnchor(
  4727. { view: IkaTools.Constants.View.SPY_MISSION, targetCityId: target.getId() }));
  4728. var spyActionLinkHtml = ('<a id="%s" class="imperator_link spy_mission" ' +
  4729. 'title="%s" href="javascript:void(0);"></a>').format(
  4730. spyActionLink.getId(),
  4731. localizer.localize('actions','spy_mission'));
  4732. var pillageLink = new Link('EspionagePillageLink_%s'.format(target.getId()))
  4733. .toIkariamPage(
  4734. { view: IkaTools.Constants.BaseView.ISLAND, cityId: target.getId() },
  4735. IkaTools.View.makeIkariamLoadLocalPageAnchor(
  4736. { view: IkaTools.Constants.View.PILLAGE, destinationCityId: target.getId() }, true));
  4737. var pillageLinkHtml = ('<a id="%s" class="imperator_link pillage_mission" ' +
  4738. 'title="%s" href="javascript:void(0);"></a>').format(
  4739. pillageLink.getId(),
  4740. localizer.localize('actions','pillage'));
  4741. var blockadeLink = new Link('EspionageBlockageLink_%s'.format(target.getId()))
  4742. .toIkariamPage(
  4743. { view: IkaTools.Constants.BaseView.ISLAND, cityId: target.getId() },
  4744. IkaTools.View.makeIkariamLoadLocalPageAnchor(
  4745. { view: IkaTools.Constants.View.BLOCKADE, destinationCityId: target.getId() }, true));
  4746. var blockadeLinkHtml = ('<a id="%s" class="imperator_link blockade_mission" ' +
  4747. 'title="%s" href="javascript:void(0);"></a>').format(
  4748. blockadeLink.getId(),
  4749. localizer.localize('actions','blockade'));
  4750.  
  4751. var sendSpyLink = new Link('EspionageSendSpyLink_%s'.format(target.getId()))
  4752. .toLocalView(IkaTools.Constants.View.SEND_SPY,
  4753. { isMission: 1, destinationCityId: target.getId() });
  4754. var sendSpyLinkHtml = ('<a id="%s" class="imperator_link send_spy_mission" ' +
  4755. 'title="%s" href="javascript:void(0);"></a>').format(
  4756. sendSpyLink.getId(),
  4757. localizer.localize('actions','send_spy'));
  4758.  
  4759. var occupyLink = new Link('EspionageOccupyLink_%s'.format(target.getId()))
  4760. .toIkariamPage(
  4761. { view: IkaTools.Constants.BaseView.ISLAND, cityId: target.getId() },
  4762. IkaTools.View.makeIkariamLoadLocalPageAnchor(
  4763. { view: IkaTools.Constants.View.OCCUPY, destinationCityId: target.getId() }, true));
  4764. var occupyLinkHtml = ('<a id="%s" class="imperator_link occupy_mission" ' +
  4765. 'title="%s" href="javascript:void(0);"></a>').format(
  4766. occupyLink.getId(),
  4767. localizer.localize('actions','occupy'));
  4768. var removeTargetLink = new Link('EspionageRemoveTarget_%s'.format(target.getId()))
  4769. .toFunction(function removeTarget() {
  4770. target.remove();
  4771. });
  4772. var removeTargetHtml = ('<a id="%s" class="imperator_link remove_espionage_target" ' +
  4773. 'title="%s" href="javascript:void(0);"></a>').format(
  4774. removeTargetLink.getId(),
  4775. localizer.localize('espionage','remove_target'));
  4776.  
  4777. function renderTravelTime(city) {
  4778. return IkaTools.Intl.formatRemainingTime(
  4779. IkaTools.EmpireData.calculateTravelTime(
  4780. city.getIslandCoordinates(), target.getIslandCoordinates(), null, 1),
  4781. false, 3);
  4782. }
  4783.  
  4784. var travelTimeUpdateable = updateables.create('EspionageTravelTime_%s'.format(target.getId()));
  4785. travelTimeUpdateable.registerUpdate('cityChanged',
  4786. function updateTravelTimeOnCityChange(travelTime) {
  4787. travelTime.html(renderTravelTime(IkaTools.View.getCurrentCity()));
  4788. });
  4789.  
  4790. function makeTravelTimeTable() {
  4791. var cities = IkaTools.EmpireData.getCities();
  4792. cities.sort(function(city1, city2) {
  4793. return IkaTools.EmpireData.calculateTravelTime(
  4794. city1.getIslandCoordinates(), target.getIslandCoordinates()) -
  4795. IkaTools.EmpireData.calculateTravelTime(
  4796. city2.getIslandCoordinates(), target.getIslandCoordinates());
  4797. });
  4798. return ('<table class="travel_time">' +
  4799. '<thead><tr><td>%s</td><td>%s</td></tr></head>' +
  4800. '<tbody>%s</tbody>' +
  4801. '</table>').format(
  4802. localizer.localize('misc','city_name'),
  4803. localizer.localize('espionage','travel_time'),
  4804. $.map(cities, function(city) {
  4805. if (city.isOwn()) {
  4806. return '<tr><td>%s</td><td>%s</td></tr>'.format(
  4807. city.getName(),
  4808. renderTravelTime(city));
  4809. } else {
  4810. return '';
  4811. }
  4812. }).join(''));
  4813. }
  4814. toolTips.register('EspionageTravelTime_%s'.format(target.getId()),
  4815. makeTravelTimeTable);
  4816.  
  4817. var lootableResources = NaN;
  4818. if (target.hasResourceInfo()) {
  4819. lootableResources =
  4820. target.getLootableResources(IkaTools.Constants.Resources.WOOD) +
  4821. target.getLootableResources(IkaTools.Constants.Resources.WINE) +
  4822. target.getLootableResources(IkaTools.Constants.Resources.MARBLE) +
  4823. target.getLootableResources(IkaTools.Constants.Resources.GLASS) +
  4824. target.getLootableResources(IkaTools.Constants.Resources.SULFUR);
  4825. function makeResourceTable() {
  4826. function makeLootableRow(resource) {
  4827. return ('<tr>' +
  4828. '<td class="resource_icon">' +
  4829. '<img src="skin/resources/icon_%s.png">' +
  4830. '</td>' +
  4831. '<td class="resource_lootable">%s</td>' +
  4832. '</tr>').format(
  4833. resource,
  4834. IkaTools.Intl.formatInteger(target.getLootableResources(resource)));
  4835. }
  4836. return ('<table class="lootable_resources">' +
  4837. '<thead class="imperator_tool_tip_title">' +
  4838. '<tr><th colspan="2">%s</th></tr>' +
  4839. '</thead>' +
  4840. '<tbody>' +
  4841. '%s%s%s%s%s' +
  4842. '</tbody>' +
  4843. '<tfoot>' +
  4844. '<tr>' +
  4845. '<td><img src="skin/layout/icon-status-small.png" height="11"/></td>' +
  4846. '<td>%s</td>' +
  4847. '</tr>' +
  4848. '</tfoot>' +
  4849. '<table>')
  4850. .format(
  4851. localizer.localize('espionage', 'resources_lootable'),
  4852. makeLootableRow(IkaTools.Constants.Resources.WOOD),
  4853. makeLootableRow(IkaTools.Constants.Resources.WINE),
  4854. makeLootableRow(IkaTools.Constants.Resources.MARBLE),
  4855. makeLootableRow(IkaTools.Constants.Resources.GLASS),
  4856. makeLootableRow(IkaTools.Constants.Resources.SULFUR),
  4857. IkaTools.Intl.formatRemainingTime(
  4858. IkaTools.View.gameTimeNow() - target.getResourcesSpyTime()));
  4859. }
  4860. toolTips.register('EspionageLootableResources_%s'.format(target.getId()),
  4861. makeResourceTable);
  4862. } else {
  4863. toolTips.deregister('EspionageLootableResources_%s'.format(target.getId()));
  4864. }
  4865.  
  4866. if (target.hasMilitaryInfo()) {
  4867. var military = target.getMilitary();
  4868. var otherMilitary = target.getOtherMilitary();
  4869. function makeGarrisonTableHeaderCell(type) {
  4870. var displayName = localizer.localize('units', type);
  4871. return (military.getCount(type) || otherMilitary.getCount(type)) ?
  4872. ('<th class="military military_%s">%s</th>').format(type, displayName) :
  4873. '';
  4874. }
  4875.  
  4876. function makeGarrisonTableBodyCell(type) {
  4877. var count = military.getCount(type);
  4878. var otherCount = otherMilitary.getCount(type);
  4879. if (!(count || otherCount)) {
  4880. return '';
  4881. }
  4882. var countDisplay = '';
  4883. if (count) {
  4884. countDisplay = IkaTools.Intl.formatInteger(count);
  4885. }
  4886. if (otherCount) {
  4887. countDisplay = '%s (%s)'.format(
  4888. countDisplay, IkaTools.Intl.formatInteger(otherCount));
  4889. }
  4890. return '<td>%s</td>'.format(countDisplay);
  4891. }
  4892. function makeGarrisonTable() {
  4893. var header = $.map(UNIT_ORDER, function(info) {
  4894. return $.map(info.units, makeGarrisonTableHeaderCell);
  4895. }).join('') || '<th>%s</th>'.format(localizer.localize('misc','none'));
  4896. return ('<table class="target_military_garrison">' +
  4897. '<thead><tr>%s</tr></thead>' +
  4898. '<tbody><tr>%s</tr></tbody>' +
  4899. '<tfoot>' +
  4900. '<tr>' +
  4901. '<td colspan="100"><img src="skin/layout/icon-status-small.png"/ height="11">%s</td>' +
  4902. '</tr>' +
  4903. '</tfoot>' +
  4904. '</table>').format(
  4905. header,
  4906. $.map(UNIT_ORDER, function(info) {
  4907. return $.map(info.units, makeGarrisonTableBodyCell);
  4908. }).join(''),
  4909. IkaTools.Intl.formatRemainingTime(
  4910. IkaTools.View.gameTimeNow() - target.getMilitarySpyTime()));
  4911. }
  4912.  
  4913. toolTips.register('EspionageMilitaryReport_%s'.format(target.getId()),
  4914. makeGarrisonTable);
  4915. } else {
  4916. toolTips.deregister('EspionageMilitaryReport_%s'.format(target.getId()));
  4917. }
  4918.  
  4919. var combats = target.getCombats(7 * IkaTools.Constants.Time.MILLIS_PER_DAY);
  4920. if (combats.length) {
  4921. function makeCombatsTable() {
  4922. function makeLootedRow(combat, resource) {
  4923. var looted = combat.getLooted(resource);
  4924. if (looted) {
  4925. return ('<tr>' +
  4926. '<td class="resource_icon">' +
  4927. '<img src="skin/resources/icon_%s.png">' +
  4928. '</td>' +
  4929. '<td class="resource_looted">%s</td>' +
  4930. '</tr>').format(
  4931. resource,
  4932. IkaTools.Intl.formatInteger(looted));
  4933. } else {
  4934. return '';
  4935. }
  4936. }
  4937. function makeCombatRow(combat) {
  4938. return ('<tr>' +
  4939. '<td>' +
  4940. '<div class="combat_type_%s"/>' +
  4941. '</td>' +
  4942. '<td>%s</td>' +
  4943. '<td><table class="combat_looted"><tbody>%s%s%s%s%s</tbody></table></td>' +
  4944. '</tr>').format(
  4945. combat.getType(),
  4946. IkaTools.Intl.formatRemainingTime(
  4947. IkaTools.View.gameTimeNow() - combat.getTime()),
  4948. makeLootedRow(combat, IkaTools.Constants.Resources.WOOD),
  4949. makeLootedRow(combat, IkaTools.Constants.Resources.WINE),
  4950. makeLootedRow(combat, IkaTools.Constants.Resources.MARBLE),
  4951. makeLootedRow(combat, IkaTools.Constants.Resources.GLASS),
  4952. makeLootedRow(combat, IkaTools.Constants.Resources.SULFUR));
  4953. }
  4954. return ('<table class="espionage_combats">' +
  4955. '<thead>' +
  4956. '<tr>' +
  4957. '<th></th>' +
  4958. '<th>%s</th>' +
  4959. '<th>%s</th>' +
  4960. '</tr>' +
  4961. '</thead>' +
  4962. '<tbody>' +
  4963. '%s' +
  4964. '</tbody>' +
  4965. '<table>').format(
  4966. localizer.localize('espionage','time_since'),
  4967. localizer.localize('espionage','resources_looted'),
  4968. $.map(combats, makeCombatRow).join(''));
  4969. }
  4970. toolTips.register('EspionageMilitaryActions_%s'.format(target.getId()),
  4971. makeCombatsTable);
  4972. } else {
  4973. toolTips.deregister('EspionageMilitaryActions_%s'.format(target.getId()));
  4974. }
  4975. return ('<tr>' +
  4976. '<td class="city_tradegood"><img src="skin/resources/icon_%s.png"/>%s%s</td>' +
  4977. '<td class="city_name nowrap">%s</td>' +
  4978. '<td class="player nowrap">%s</td>' +
  4979. '<td class="location">%s</td>' +
  4980. '<td class="actions">%s%s%s%s%s%s</td>' +
  4981. '<td id="%s" class="travel_time imperator_tool_tip">%s</td>' +
  4982. '<td class="townhall_level">%s</td>' +
  4983. '<td class="wall_level">%s</td>' +
  4984. '<td id="EspionageLootableResources_%s" class="resources_lootable imperator_tool_tip">%s</td>' +
  4985. '<td id="EspionageMilitaryActions_%s" class="combats imperator_tool_tip">%s</td>' +
  4986. '<td id="EspionageMilitaryReport_%s" class="military_score imperator_tool_tip">%s</td>' +
  4987. '</tr>').format(
  4988. target.getTradeGoodType(),
  4989. occupierHtml, blockaderHtml, cityLinkHtml,
  4990. playerLinkHtml,
  4991. islandLinkHtml,
  4992. spyActionLinkHtml, pillageLinkHtml, blockadeLinkHtml, occupyLinkHtml, sendSpyLinkHtml, removeTargetHtml,
  4993. travelTimeUpdateable.getId(0),
  4994. IkaTools.Intl.formatRemainingTime(
  4995. IkaTools.EmpireData.calculateTravelTime(
  4996. IkaTools.View.getCurrentCity().getIslandCoordinates(), target.getIslandCoordinates(), null, 1),
  4997. false, 3),
  4998. IkaTools.Intl.formatInteger(target.getTownLevel()),
  4999. IkaTools.Intl.formatInteger(target.getWallLevel()),
  5000. target.getId(),
  5001. IkaTools.Intl.formatInteger(Math.ceil(
  5002. lootableResources / IkaTools.Constants.GamePlay.RESOURCES_PER_TRANSPORT)),
  5003. target.getId(), combats.length ? IkaTools.Intl.formatInteger(combats.length) : '-',
  5004. target.getId(), IkaTools.Intl.formatInteger(player.getMilitaryScore()));
  5005. }
  5006. function makeTableHead() {
  5007. toolTips.registerSimple('EspionageLocationHeader',
  5008. '<div class="nowrap">%s</div>'.format(
  5009. localizer.localize('espionage','location')));
  5010. toolTips.registerSimple('EspionageTravelTimeHeader',
  5011. '<div class="nowrap">%s</div>'.format(
  5012. localizer.localize('espionage','travel_time')));
  5013. toolTips.registerSimple('EspionageTownHallLevelHeader',
  5014. '<div class="nowrap">%s</div>'.format(
  5015. localizer.localize('espionage','townhall_level')));
  5016. toolTips.registerSimple('EspionageWallLevelHeader',
  5017. '<div class="nowrap">%s</div>'.format(
  5018. localizer.localize('espionage','wall_level')));
  5019. toolTips.registerSimple('EspionageResourcesLootableHeader',
  5020. '<div class="nowrap">%s</div>'.format(
  5021. localizer.localize('espionage','resources_lootable')));
  5022. toolTips.registerSimple('EspionageCombatsHeader',
  5023. '<div class="nowrap">%s</div>'.format(
  5024. localizer.localize('espionage','combats')));
  5025. toolTips.registerSimple('EspionageMilitaryScoreHeader',
  5026. '<div class="nowrap">%s</div>'.format(
  5027. localizer.localize('espionage','military_score')));
  5028. return ('<thead>' +
  5029. '<tr>' +
  5030. '%s' +
  5031. '<th colspan="1" id="EspionagePlayerHeader" ' +
  5032. 'class="player imperator_tool_tip">%s</th>' +
  5033. '<th colspan="1" id="EspionageLocationHeader" ' +
  5034. 'class="location imperator_tool_tip">%s</th>' +
  5035. '<th colspan="1" id="EspionageActionsHeader" ' +
  5036. 'class="actions imperator_tool_tip">%s</th>' +
  5037. '<th colspan="1" id="EspionageTravelTimeHeader" ' +
  5038. 'class="travel_time imperator_tool_tip">%s</th>' +
  5039. '<th colspan="1" id="EspionageTownHallLevelHeader" ' +
  5040. 'class="townhall_level imperator_tool_tip">%s</th>' +
  5041. '<th colspan="1" id="EspionageWallLevelHeader" ' +
  5042. 'class="wall_level imperator_tool_tip">%s</th>' +
  5043. '<th colspan="1" id="EspionageResourcesLootableHeader" ' +
  5044. 'class="resources_lootable imperator_tool_tip">%s</th>' +
  5045. '<th colspan="1" id="EspionageCombatsHeader" ' +
  5046. 'class="combats imperator_tool_tip">%s</th>' +
  5047. '<th colspan="1" id="EspionageMilitaryScoreHeader" ' +
  5048. 'class="military_score imperator_tool_tip">%s</th>' +
  5049. '</tr>' +
  5050. '</thead>').format(
  5051. makeCityNameHeaderCells(),
  5052. localizer.localize('espionage','player'),
  5053. localizer.localize('espionage','location'),
  5054. localizer.localize('misc','actions'),
  5055. localizer.localize('espionage','travel_time'),
  5056. localizer.localize('espionage','townhall_level'),
  5057. localizer.localize('espionage','wall_level'),
  5058. localizer.localize('espionage','resources_lootable'),
  5059. localizer.localize('espionage','combats'),
  5060. localizer.localize('espionage','military_score'));
  5061. }
  5062. var targets = IkaTools.EmpireData.Espionage.getTargets();
  5063. return '%s<tbody>%s</tbody>'.format(
  5064. makeTableHead(),
  5065. $.map(targets, renderTarget).join(''));
  5066. }
  5067. var tab = new Tab('espionage', localizer.localize('misc','espionage'), $(
  5068. '<div class="imperator_overview">' +
  5069. '<table class="overview" id="ImperatorOverviewEspionageTable"/>' +
  5070. '</div>'),
  5071. 'ImperatorOverviewEspionageTable',
  5072. function() {
  5073. IkaTools.EmpireData.Espionage.registerEspionageChangedHandler(function(changes) {
  5074. tab.maybeRedraw(true);
  5075. });
  5076. },
  5077. makeTableContent);
  5078. return tab.getTab();
  5079. }
  5080. var openResourcesTabOnTransportClose = false;
  5081. var openBuildingsTabOnTransportClose = false;
  5082. var openMilitaryTabOnDeploymentClose = false;
  5083. var makePopup = IkaTools.Utils.thunk(function makePopup() {
  5084. var resourceTab = makeResourceTab();
  5085. var buildingsTab = makeBuildingsTab();
  5086. var militaryTab = makeMilitaryTab();
  5087. var espionageTab = makeEspionageTab();
  5088. var tabPane = new IkaTools.UI.TabPane(
  5089. [resourceTab, buildingsTab, militaryTab, espionageTab],
  5090. {
  5091. tabActivatedCallback: function() {
  5092. IkaTools.UI.resizePopup();
  5093. },
  5094. });
  5095. var popup = new IkaTools.UI.PopupWindow(
  5096. 'cityBuildings',
  5097. $('<div>Imperator Overview</div>'),
  5098. tabPane.getContainer(),
  5099. { oversized:true,
  5100. deactivatedCallback: function() {
  5101. resourceTab.deactivated();
  5102. buildingsTab.deactivated();
  5103. militaryTab.deactivated();
  5104. espionageTab.deactivated();
  5105. },
  5106. }
  5107. );
  5108. function displayResources() {
  5109. popup.display(true);
  5110. resourceTab.activate();
  5111. }
  5112. function displayBuildings() {
  5113. popup.display(true);
  5114. buildingsTab.activate();
  5115. }
  5116. function displayMilitary() {
  5117. popup.display(true);
  5118. militaryTab.activate();
  5119. }
  5120. function displayEspionage() {
  5121. popup.display(true);
  5122. espionageTab.activate();
  5123. }
  5124. IkaTools.View.registerIkariamAjaxResponseCallback(
  5125. function resetReopenTabVars(response) {
  5126. IkaTools.Utils.iterateIkariamAjaxResponse(response,
  5127. function lookForChangeView(index, name, data) {
  5128. if (name == IkaTools.Constants.IkariamAjaxResponseType.CHANGE_VIEW) {
  5129. var view = data[0];
  5130. if (view == IkaTools.Constants.View.CITY_DETAIL) {
  5131. if (openResourcesTabOnTransportClose) {
  5132. popup.display(true);
  5133. resourceTab.activate();
  5134. }
  5135. if (openBuildingsTabOnTransportClose) {
  5136. popup.display(true);
  5137. buildingsTab.activate();
  5138. }
  5139. if (openMilitaryTabOnDeploymentClose) {
  5140. popup.display(true);
  5141. militaryTab.activate();
  5142. }
  5143. }
  5144. if (view != IkaTools.Constants.View.TRANSPORT) {
  5145. openResourcesTabOnTransportClose = false;
  5146. openBuildingsTabOnTransportClose = false;
  5147. }
  5148. if (view != IkaTools.Constants.View.DEPLOY) {
  5149. openMilitaryTabOnDeploymentClose = false;
  5150. }
  5151. }
  5152. });
  5153. });
  5154. return {
  5155. displayResources: displayResources,
  5156. displayBuildings: displayBuildings,
  5157. displayMilitary: displayMilitary,
  5158. displayEspionage: displayEspionage,
  5159. close: popup.close.bind(popup),
  5160. };
  5161. });
  5162. var leftMenuResourceContent =
  5163. $(('<li>' +
  5164. '<div class="image" ' +
  5165. 'style="background-image: url(\'/skin/layout/btn_world.jpg\'); ' +
  5166. 'background-position: -27px -1px;">' +
  5167. '</div>' +
  5168. '<div class="name"><span class="namebox">%s</span></div>' +
  5169. '</li>').format(localizer.localize('misc','resource_overview')));
  5170. var leftMenuBuildingsContent =
  5171. $(('<li>' +
  5172. '<div class="image" ' +
  5173. 'style="background-image: url(\'/skin/layout/btn_city.png\'); ' +
  5174. 'background-position: -22px -1px;">' +
  5175. '</div>' +
  5176. '<div class="name"><span class="namebox">%s</span></div>' +
  5177. '</li>').format(localizer.localize('misc','buildings_overview')));
  5178. var leftMenuArmyContent =
  5179. $(('<li>' +
  5180. '<div class="image" ' +
  5181. 'style="background-image: url(\'skin/characters/military/x40_y40/y40_phalanx_faceright.png\'); ' +
  5182. 'background-position: 0px -4px;">' +
  5183. '</div>' +
  5184. '<div class="name"><span class="namebox">%s</span></div>' +
  5185. '</li>').format(localizer.localize('misc','military_overview')));
  5186. var leftMenuEspionageContent =
  5187. $(('<li>' +
  5188. '<div class="image" ' +
  5189. 'style="background-image: url(\'/skin/characters/military/120x100/spy_120x100.png\'); ' +
  5190. 'background-position: 1px 3px;' +
  5191. 'background-repeat: no-repeat;' +
  5192. 'background-size: 100% auto;">' +
  5193. '</div>' +
  5194. '<div class="name"><span class="namebox">%s</span></div>' +
  5195. '</li>').format(localizer.localize('misc','espionage_overview')));
  5196. menuItems = [];
  5197. if (showResourceOverview.isEnabled()) {
  5198. menuItems.push(new IkaTools.UI.LeftMenu.Item(leftMenuResourceContent));
  5199. }
  5200. if (showBuildingsOverview.isEnabled()) {
  5201. menuItems.push(new IkaTools.UI.LeftMenu.Item(leftMenuBuildingsContent));
  5202. }
  5203. if (showMilitaryOverview.isEnabled()) {
  5204. menuItems.push(new IkaTools.UI.LeftMenu.Item(leftMenuArmyContent));
  5205. }
  5206. if (showEspionageOverview.isEnabled()) {
  5207. menuItems.push(new IkaTools.UI.LeftMenu.Item(leftMenuEspionageContent));
  5208. }
  5209. var leftMenu = new IkaTools.UI.LeftMenu(menuItems, { atTop: true });
  5210. leftMenu.display();
  5211. return function overviewReady() {
  5212. if (showResourceOverview.isEnabled()) {
  5213. leftMenuResourceContent.mousedown(IkaTools.Logging.debuggable(
  5214. { label: 'Imperator.overview.showResourceTable.mousedown',
  5215. alwaysTime: true, profile: true },
  5216. function() {
  5217. makePopup().displayResources();
  5218. }));
  5219. }
  5220. if (showBuildingsOverview.isEnabled()) {
  5221. leftMenuBuildingsContent.mousedown(IkaTools.Logging.debuggable(
  5222. { label: 'Imperator.overview.showBuildingsTable.mousedown',
  5223. alwaysTime: true, profile: true },
  5224. function() {
  5225. makePopup().displayBuildings();
  5226. }));
  5227. }
  5228. if (showMilitaryOverview.isEnabled()) {
  5229. leftMenuArmyContent.mousedown(IkaTools.Logging.debuggable(
  5230. { label: 'Imperator.overview.showMilitaryTable.mousedown',
  5231. alwaysTime: true, profile: true },
  5232. function() {
  5233. makePopup().displayMilitary();
  5234. }));
  5235. }
  5236. if (showEspionageOverview.isEnabled()) {
  5237. IkaTools.EmpireData.Espionage.startTracking();
  5238. leftMenuEspionageContent.mousedown(IkaTools.Logging.debuggable(
  5239. { label: 'Imperator.overview.showEspionageTable.mousedown',
  5240. alwaysTime: true, profile: true},
  5241. function() {
  5242. makePopup().displayEspionage();
  5243. }));
  5244. }
  5245. };
  5246. }
  5247. function registerLoggingEventHandlers() {
  5248. IkaTools.EmpireData.registerResourcesChangedHandler(function(changes) {
  5249. IkaTools.Logging.debug('Resources changed: ', changes);
  5250. });
  5251. IkaTools.EmpireData.registerBuildingsChangedHandler(function(changes) {
  5252. IkaTools.Logging.debug('Buildings changed: ', changes);
  5253. });
  5254. IkaTools.EmpireData.registerMilitaryChangedHandler(function(changes) {
  5255. IkaTools.Logging.debug('Military changed: ', changes);
  5256. });
  5257. IkaTools.EmpireData.registerCivilizationDataChangedHandler(function(changes) {
  5258. IkaTools.Logging.debug('CivilizationData changed: ', changes);
  5259. });
  5260. IkaTools.EmpireData.registerMovementsChangedHandler(function(changes) {
  5261. IkaTools.Logging.debug('Movements changed: ', changes);
  5262. });
  5263. IkaTools.EmpireData.Espionage.registerEspionageChangedHandler(function(changes) {
  5264. IkaTools.Logging.debug('Espionage changed: ', changes);
  5265. });
  5266. }
  5267.  
  5268. function fireFakeKeyboardEvent(input) {
  5269. // fake event so Ikariam handlers update related sliders and stuff
  5270. var e = document.createEvent("KeyboardEvent");
  5271. if (e.initKeyboardEvent) {
  5272. e.initKeyboardEvent(
  5273. 'keyup', true, true, window, false, false, false, false, 13, 0);
  5274. } else {
  5275. e.initKeyEvent('keyup', true, true, window, false, false, false, false, 13, 0);
  5276. }
  5277. input.dispatchEvent(e);
  5278. }
  5279. function initQuickGoodsButtons() {
  5280. function createButton(input, textName, increment) {
  5281. var button = $('<a class="button" title="%s">%s</a>'.format(
  5282. localizer.localize('tweaks',textName + '_text'),
  5283. localizer.localize('tweaks',textName)));
  5284. button.click(IkaTools.Logging.debuggable(
  5285. 'Imperator.quickGoodsSelectIncrement[' + increment + ']',
  5286. function incrementSelectedGoods() {
  5287. var current = parseInt(input.val()) || 0;
  5288. var newValue =
  5289. Math.ceil((current + (increment > 0 ? 1 : -1)) / increment) * increment;
  5290. input.val(newValue);
  5291. fireFakeKeyboardEvent(input.get(0));
  5292. }));
  5293. return button;
  5294. }
  5295. function addChangeGoodsButtons(input) {
  5296. var span = $('<span class="quick_goods_select"/>');
  5297. var minus500Button = createButton(input, 'transport_minus_500', -500);
  5298. var plus500Button = createButton(input, 'transport_plus_500', 500);
  5299. var plus1000Button = createButton(input, 'transport_plus_1000', 1000);
  5300. var plus5000Button = createButton(input, 'transport_plus_5000', 5000);
  5301. span.append(minus500Button, plus500Button, plus1000Button, plus5000Button);
  5302. input.after(span);
  5303. }
  5304. var stylesToAdd =
  5305. '.quick_goods_select a, .quick_goods_select a:active {' +
  5306. 'margin: 3px; padding: 1px 3px; font-size: 10px; font-weight:normal;' +
  5307. '}' +
  5308. '#transport .quick_goods_select {' +
  5309. 'position: absolute;' +
  5310. 'top: 6px;' +
  5311. 'left: 468px;' +
  5312. '}' +
  5313. '.quick_goods_select {' +
  5314. '-webkit-user-select: none;' +
  5315. '-khtml-user-select: none;' +
  5316. '-moz-user-select: none;' +
  5317. '-o-user-select: none;' +
  5318. 'user-select: none;' +
  5319. '}';
  5320. if (transportButtons.isEnabled()) {
  5321. stylesToAdd +=
  5322. '#mission ul.resourceAssign { width: 640px; }' +
  5323. '#mission .resourceAssign li { padding:0px; background-position:0 center;}' +
  5324. '#mission .resourceAssign .sliderinput { margin:0 0 0 30px; width:400px;}' +
  5325. '#mission .resourceAssign input.textfield {' +
  5326. 'position:relative;top:-26px;margin-left:-5px;' +
  5327. '}';
  5328. IkaTools.View.registerIkariamAjaxResponseCallback(
  5329. function addTransportButtons(response) {
  5330. IkaTools.Utils.iterateIkariamAjaxResponse(response,
  5331. function lookForChangeView(index, name, data) {
  5332. if (name == IkaTools.Constants.IkariamAjaxResponseType.CHANGE_VIEW) {
  5333. var view = data[0];
  5334. if (view == IkaTools.Constants.View.TRANSPORT ||
  5335. view == IkaTools.Constants.View.COLONIZE) {
  5336. $('#transportForm ul.resourceAssign li input').each(
  5337. function(index, node) {
  5338. addChangeGoodsButtons($(node));
  5339. });
  5340. } else if (view == IkaTools.Constants.View.TAKE_OFFER) {
  5341. $('#transportForm td.input input').each(
  5342. function(index, node) {
  5343. addChangeGoodsButtons($(node));
  5344. });
  5345. } else if (view == IkaTools.Constants.View.BRANCH_OFFICE) {
  5346. $('#branchOffice form[name=formkontor] tr input').filter(':even').each(
  5347. function(index, node) {
  5348. addChangeGoodsButtons($(node));
  5349. });
  5350. }
  5351. }
  5352. });
  5353. }, true);
  5354. }
  5355. if (donationButtons.isEnabled()) {
  5356. stylesToAdd +=
  5357. '#donateForm input.textfield {' +
  5358. 'margin-bottom: 6px;' +
  5359. '}';
  5360. IkaTools.View.registerIkariamAjaxResponseCallback(
  5361. function addTransportButtons(response) {
  5362. IkaTools.Utils.iterateIkariamAjaxResponse(response,
  5363. function lookForChangeView(index, name, data) {
  5364. if (name == IkaTools.Constants.IkariamAjaxResponseType.CHANGE_VIEW) {
  5365. var view = data[0];
  5366. if (view == IkaTools.Constants.View.RESOURCE ||
  5367. view == IkaTools.Constants.View.TRADE_GOOD ) {
  5368. var input = $('#donateForm input.textfield');
  5369. var span = $('<span class="quick_goods_select"/>');
  5370. var plus1kButton = createButton(input, 'donate_plus_1000', 1000);
  5371. var plus10kButton = createButton(input, 'donate_plus_10000', 10000);
  5372. var plus100kButton = createButton(input, 'donate_plus_100000', 100000);
  5373. span.append(plus1kButton, plus10kButton, plus100kButton);
  5374. input.after(span);
  5375. }
  5376. }
  5377. });
  5378. }, true);
  5379. }
  5380. return stylesToAdd;
  5381. }
  5382. function initBuildingDemolitionHandler() {
  5383. var activeDemolitionInfo = null;
  5384. IkaTools.View.registerIkariamAjaxResponseCallback(
  5385. IkaTools.Utils.forEachIkariamAjaxResponseFunction(
  5386. function demolitionHandler(index, name, value) {
  5387. if (name == IkaTools.Constants.IkariamAjaxResponseType.ADD_WINDOW &&
  5388. value[0] == 'buildings_demolition') {
  5389. var demolitionButton = $('#buildings_demolition a.button');
  5390. var hrefMatch = demolitionButton.attr('href').match(
  5391. /function=demolishBuilding&level=(\d+)&cityId=(\d+)&position=(\d+)/);
  5392. var level = parseInt(hrefMatch[1]);
  5393. var cityId = parseInt(hrefMatch[2]);
  5394. var position = parseInt(hrefMatch[3]);
  5395. if (activeDemolitionInfo &&
  5396. activeDemolitionInfo.level == level &&
  5397. activeDemolitionInfo.cityId == cityId &&
  5398. activeDemolitionInfo.position == position) {
  5399. activeDemolitionInfo.level = level - 1;
  5400. demolitionButton[0].click();
  5401. } else {
  5402. if (confirm(localizer.localize('tweaks', 'completely_demolish_building_prompt'))) {
  5403. if (level > 1) {
  5404. activeDemolitionInfo = { level: level - 1, cityId: cityId, position: position };
  5405. demolitionButton[0].click();
  5406. } else {
  5407. activeDemolitionInfo = null;
  5408. }
  5409. }
  5410. }
  5411. } else if (name == IkaTools.Constants.IkariamAjaxResponseType.CHANGE_VIEW) {
  5412. var demolitionButton = $('#buildingUpgrade .downgrade .action_btn');
  5413. if (demolitionButton.length > 0) {
  5414. var hrefMatch = demolitionButton.attr('href').match(
  5415. /view=buildings_demolition&cityId=(\d+)&position=(\d+)&level=(\d+)/);
  5416. if (hrefMatch) {
  5417. var level = parseInt(hrefMatch[3]);
  5418. var cityId = parseInt(hrefMatch[1]);
  5419. var position = parseInt(hrefMatch[2]);
  5420. if (activeDemolitionInfo &&
  5421. activeDemolitionInfo.level == level &&
  5422. activeDemolitionInfo.cityId == cityId &&
  5423. activeDemolitionInfo.position == position) {
  5424. demolitionButton[0].click();
  5425. }
  5426. }
  5427. }
  5428. }
  5429. }));
  5430. }
  5431. function initTweaks() {
  5432. if (autoAcceptDailyBonus.isEnabled()) {
  5433. function submitDailyActivityBonus() {
  5434. $('#dailyActivityBonus form').submit();
  5435. }
  5436. if (IkaTools.Utils.isChrome()) {
  5437. // Who knows why you would send back a page that then immediately turns around
  5438. // and queries the server it came from. But then, you are not an Ikariam developer.
  5439. // In all likelihood you posess at least a single brain cell (a sufficient but
  5440. // not necessary condition).
  5441. // In any case, the fact is that in Chrome this starts an ajax call before we
  5442. // have had a chance to hook in any of the ajax handler overrides in developer
  5443. // tools. So to counteract the stupid things Ikariam developers did we have to
  5444. // do this the bruteforce way.
  5445. setTimeout(submitDailyActivityBonus, 500);
  5446. setTimeout(submitDailyActivityBonus, 1000);
  5447. setTimeout(submitDailyActivityBonus, 2000);
  5448. setTimeout(submitDailyActivityBonus, 5000);
  5449. } else {
  5450. IkaTools.View.registerIkariamAjaxResponseCallback(
  5451. IkaTools.Utils.forEachIkariamAjaxResponseFunction(
  5452. function findDailyBonusWindow(index, name, value) {
  5453. if (name == IkaTools.Constants.IkariamAjaxResponseType.ADD_WINDOW &&
  5454. value[0] == 'dailyActivityBonus') {
  5455. submitDailyActivityBonus();
  5456. }
  5457. }));
  5458. }
  5459. }
  5460. var addedStyles = '';
  5461. if (hideAds.isEnabled()) {
  5462. addedStyles += '.ad_banner { display: none; } ';
  5463. }
  5464. if (hideFacebook.isEnabled()) {
  5465. addedStyles += '#facebook_button * { display: none !important; } ';
  5466. }
  5467. if (hideFriendsBar.isEnabled()) {
  5468. addedStyles += '#js_viewFriends { display: none; } ';
  5469. }
  5470. if (hideChat.isEnabled()) {
  5471. addedStyles += '#js_viewChat { display: none; } ';
  5472. }
  5473. addedStyles += initQuickGoodsButtons();
  5474. initBuildingDemolitionHandler();
  5475. if (showCityOwners.isEnabled() && IkaTools.View.viewIsIsland()) {
  5476. function doLabelCities(data) {
  5477. for (var i = 0; i < 17; i++) {
  5478. var cityData = data.cities[i];
  5479. if (cityData.type != 'buildplace') {
  5480. $('#js_cityLocation' + i + 'TitleText').append(' (' + cityData.ownerName + ')');
  5481. }
  5482. }
  5483. }
  5484.  
  5485. addedStyles += '#island .city .scroll_img .center { overflow: hidden; width: 175px; } ' +
  5486. '#island .city .scroll_img .after { left: 175px; } ';
  5487. IkaTools.View.registerIkariamAjaxResponseCallback(
  5488. function labelCityOwners(response) {
  5489. IkaTools.Utils.iterateIkariamAjaxResponse(response, function(index, name, data) {
  5490. if (name == IkaTools.Constants.IkariamAjaxResponseType.UPDATE_BACKGROUND_DATA) {
  5491. doLabelCities(data);
  5492. } else if (name == IkaTools.Constants.IkariamAjaxResponseType.UPDATE_GLOBAL_DATA) {
  5493. doLabelCities(data['backgroundData'] || data[11]);
  5494. }
  5495. });
  5496. }, true);
  5497. }
  5498.  
  5499. if (preventAccidentalColonyDestruction.isEnabled()) {
  5500. IkaTools.View.registerIkariamAjaxResponseCallback(
  5501. function preventAccidentalColonyDestruction(response) {
  5502. IkaTools.Utils.iterateIkariamAjaxResponse(response, function(index, name, data) {
  5503. if (name == IkaTools.Constants.IkariamAjaxResponseType.CHANGE_VIEW) {
  5504. if (data[0] == IkaTools.Constants.View.ABOLISH_CITY) {
  5505. var cityId = parseInt($('#abolishCity input[name=cityId]').val());
  5506. var city = IkaTools.EmpireData.getCity(cityId);
  5507. var palace = city.getBuildingByType(IkaTools.Constants.Buildings.PALACE);
  5508. var governorsResidence = city.getBuildingByType(
  5509. IkaTools.Constants.Buildings.GOVERNORS_RESIDENCE);
  5510. if (palace || governorsResidence) {
  5511. unsafeWindow.ikariam.TemplateView.destroyTemplateView();
  5512. alert(localizer.localize('tweaks', 'destroy_non_mobile_colony_prompt'));
  5513. }
  5514. }
  5515. }
  5516. });
  5517. }, true);
  5518. }
  5519.  
  5520. if (initializeColonizationMissionsForPirateRaiding.isEnabled()) {
  5521. IkaTools.View.registerIkariamAjaxResponseCallback(
  5522. function initializeColonizationMissionsForPirateRaiding(response) {
  5523. IkaTools.Utils.iterateIkariamAjaxResponse(response, function(index, name, data) {
  5524. if (name == IkaTools.Constants.IkariamAjaxResponseType.CHANGE_VIEW) {
  5525. if (data[0] == IkaTools.Constants.View.COLONIZE) {
  5526. var woodInput = $('#textfield_wood');
  5527. var marbleInput = $('#textfield_marble');
  5528. var civData = IkaTools.EmpireData.getCivilizationData();
  5529. var multiplier = 1.0;
  5530. multiplier -= civData.hasResearched(
  5531. IkaTools.Constants.Research.Economy.PULLEY) ? .02 : 0;
  5532. multiplier -= civData.hasResearched(
  5533. IkaTools.Constants.Research.Economy.GEOMETRY) ? .04 : 0;
  5534. multiplier -= civData.hasResearched(
  5535. IkaTools.Constants.Research.Economy.SPIRIT_LEVEL) ? .08 : 0;
  5536.  
  5537. woodInput.val(Math.ceil(multiplier *
  5538. IkaTools.Constants.BuildingData[IkaTools.Constants.Buildings.PIRATE_FORTRESS].wood[0]) - 250);
  5539. marbleInput.val(Math.ceil(multiplier *
  5540. IkaTools.Constants.BuildingData[IkaTools.Constants.Buildings.PIRATE_FORTRESS].marble[0]));
  5541.  
  5542. // Have to give time for Ikariam javascript that processes the click
  5543. // to be registered.
  5544. setTimeout(function() {$('#slider_capacity_min').get(0).click();}, 0);
  5545. }
  5546. }
  5547. });
  5548. }, true);
  5549. }
  5550. GM_addStyle(addedStyles);
  5551. }
  5552. function initAlerts() {
  5553. function showDesktopNotification(icon, title, text, audio) {
  5554. if (window.webkitNotifications &&
  5555. window.webkitNotifications.checkPermission() == 0) {
  5556. if (audio) {
  5557. var audioNode = $('<audio autoplay="autoplay" loop="loop"><source src="http://soundjax.com/reddo/67560%5Ealarma.mp3" type="audio/mp3" />');
  5558. $('body').append(audioNode);
  5559. }
  5560. var notification = window.webkitNotifications.createNotification(icon, title, text);
  5561. notification.onclick = IkaTools.Logging.debuggable(
  5562. 'Imperarator.buildingCompletionAlert.desktopAlertClicked',
  5563. function buildingDesktopAlertClicked() {
  5564. notification.cancel();
  5565. window.focus();
  5566. });
  5567. notification.onclose = IkaTools.Logging.debuggable(
  5568. 'Imperator.buildingCompletionAlert.desktopAlertClosed',
  5569. function buildingDesktopAlertClosed() {
  5570. if (audio) {
  5571. audioNode.remove();
  5572. }
  5573. });
  5574. notification.show();
  5575. }
  5576. }
  5577. if (buildingCompletionAlert_Desktop.isEnabled()) {
  5578. IkaTools.EmpireData.registerBuildingsChangedHandler(
  5579. function alertBuildingCompletion(changes) {
  5580. $.each(changes, function forEachBuildingChange(index, change) {
  5581. if (change.type == IkaTools.Constants.BuildingEventType.UPGRADE_COMPLETE) {
  5582. showDesktopNotification(
  5583. 'http://' + IkaTools.View.getDomain() + '/' +
  5584. IkaTools.Constants.BuildingData[change.building.getType()].icon,
  5585. localizer.localize('alerts','building_upgrade_complete'),
  5586. localizer.localize('alerts','building_upgrade_complete_text').format2(
  5587. {
  5588. building: localizer.localize('buildings', change.building.getType()),
  5589. city: change.city.getName(),
  5590. level: IkaTools.Intl.formatInteger(change.building.getLevel())
  5591. }));
  5592. }
  5593. });
  5594. });
  5595. }
  5596. var missionAlerts = {
  5597. 'transport:loading': transportMissionLoaded_Desktop.isEnabled(),
  5598. 'transport:en_route': transportMissionArrived_Desktop.isEnabled(),
  5599. 'transport:returning': transportMissionReturned_Desktop.isEnabled(),
  5600. 'deployarmy:loading': deployArmyLoaded_Desktop.isEnabled(),
  5601. 'deployarmy:en_route': deployArmyArrived_Desktop.isEnabled(),
  5602. 'deployarmy:returning': deployArmyReturned_Desktop.isEnabled(),
  5603. 'deploynavy:loading': false,
  5604. 'deploynavy:en_route': deployNavyArrived_Desktop.isEnabled(),
  5605. 'deploynavy:returning': deployNavyReturned_Desktop.isEnabled(),
  5606. 'plunder:loading': pillageLoaded_Desktop.isEnabled(),
  5607. 'plunder:en_route': pillageArrived_Desktop.isEnabled(),
  5608. 'plunder:returning': pillageReturned_Desktop.isEnabled(),
  5609. }
  5610. IkaTools.EmpireData.registerMovementsChangedHandler(function alertMissions(changes) {
  5611. $.each(changes, function forEachMissionChange(index, change) {
  5612. if (change.type == IkaTools.Constants.Movements.EventType.STAGE_CHANGED ||
  5613. change.type == IkaTools.Constants.Movements.EventType.COMPLETED) {
  5614. var mission = change.movement.getMission();
  5615. var stage = change.previousStage;
  5616. var cityName = IkaTools.Intl.localizer.localize('formatting','unknown');
  5617. if (stage == IkaTools.Constants.Movements.Stage.EN_ROUTE) {
  5618. var city = change.movement.getTargetCity();
  5619. if (city) {
  5620. cityName = city.getName();
  5621. }
  5622. } else {
  5623. var city = change.movement.getOriginCity();
  5624. if (city) {
  5625. cityName = city.getName();
  5626. }
  5627. }
  5628. if (missionAlerts[mission + ':' + stage]) {
  5629. showDesktopNotification(
  5630. 'http://' + IkaTools.View.getDomain() + '/' +
  5631. IkaTools.Constants.Movements.MissionData[mission].icon,
  5632. localizer.localize('alerts','mission_update'),
  5633. localizer.localize('alerts', stage).format2({
  5634. type: localizer.localize('alerts', mission),
  5635. city: cityName,
  5636. }));
  5637. }
  5638. }
  5639. });
  5640. });
  5641.  
  5642. /* var underAttack = $('#advMilitary a').eq(0).hasClass('normalalert');
  5643. console.log("Under attack at start: ", underAttack, $('#advMilitary a').eq(0));
  5644. var lastMovementUpdateTime = 0;
  5645. var parsedIgnoredHostileMissions = JSON.parse(ignoredHostileMissions.getValue());
  5646. IkaTools.View.registerIkariamAjaxResponseCallback(
  5647. function enhancedMilitaryAdvisor(response) {
  5648. IkaTools.Utils.iterateIkariamAjaxResponse(response, function(index, name, data) {
  5649. if (name == IkaTools.Constants.IkariamAjaxResponseType.UPDATE_GLOBAL_DATA) {
  5650. //console.log('DATA:::::', data['headerData']['advisors']['military']);
  5651. if (data.headerData.advisors.military.cssclass.indexOf('normalalert') >= 0) {
  5652. //console.log('Under attack');
  5653. if (!underAttack) {
  5654. showDesktopNotification('http://' + document.domain + '/skin/layout/advisors/general_alert.png',
  5655. 'Under attack', 'New attack detected', true);
  5656. underAttack = true;
  5657. } else {
  5658. function onMovementUpdate(response) {
  5659. var movements = IkaTools.EmpireData.getCivilizationData().getMovements();
  5660. var foundUnignoredHostile = false;
  5661.  
  5662. $.each(movements, function(index, movement) {
  5663. //console.log('Movement:', movement, parsedIgnoredHostileMissions.indexOf(movement.getId()));
  5664. if (movement.isHostile() && parsedIgnoredHostileMissions.indexOf(movement.getId()) < 0) {
  5665. foundUnignoredHostile = true;
  5666. }
  5667. });
  5668. if (foundUnignoredHostile) {
  5669. showDesktopNotification('http://' + document.domain + '/skin/layout/advisors/general_alert.png',
  5670. 'Under attack 2', 'New attack detected 2', true);
  5671. } else {
  5672. //console.log('Only normal attacks');
  5673. var advMilitaryNode = $('#advMilitary a').eq(0);
  5674. advMilitaryNode.removeClass('normalalert');
  5675. advMilitaryNode.addClass('probablysafealert');
  5676. }
  5677. }
  5678. IkaTools.EmpireData.updateMovements(onMovementUpdate);
  5679. }
  5680. } else {
  5681. underAttack = false;
  5682. }
  5683. }
  5684. });
  5685. }, true);*/
  5686. GM_addStyle('#advisors #advMilitary a.probablysafealert { background-image: url(http://www.clker.com/cliparts/3/7/6/d/1256186461796715642question-mark-icon.svg); background-size: 90px 90px; background-repeat:no-repeat;}');
  5687. }
  5688. function configureLocalization() {
  5689. var language = localizedLanguage.getValue();
  5690. if (!language) {
  5691. var hostParts = document.location.host.split('\.');
  5692. language = hostParts[hostParts.length - 1];
  5693. if (language == "com" && hostParts.length == 4) {
  5694. //for example: http://s1.en.ikariam.com
  5695. language = hostParts[1];
  5696. }
  5697. if ((language == 'com') || (language == 'org') || (language == 'net')) {
  5698. language = 'tr';
  5699. }
  5700. if ((language == 've') || (language == 'mx') || (language == 'ar') ||
  5701. (language == 'co') || (language == 'cl')) {
  5702. language = 'es';
  5703. }
  5704. }
  5705. if (language) {
  5706. localizer.setPreferredLanguage(language);
  5707. IkaTools.Intl.localizer.setPreferredLanguage(language);
  5708. }
  5709. }
  5710.  
  5711. function initPirating() {
  5712. }
  5713. function init() {
  5714. configureLocalization();
  5715. IkaTools.Logging.setAndSaveOptionsFromPageAnchor();
  5716. addStyles();
  5717. overviewTablesReady = overviewTables();
  5718. $(document).ready(function() {
  5719. var readyAction = IkaTools.Logging.debuggable(
  5720. {label: "Imperator.documentReady", group: true, alwaysTime: true, swallowException: true},
  5721. function imperatorDocumentReady() {
  5722. registerLoggingEventHandlers();
  5723. initTweaks();
  5724. initAlerts();
  5725. initPirating();
  5726. IkaTools.initialize();
  5727. overviewTablesReady();
  5728. addSettingsLink();
  5729. });
  5730.  
  5731. if (IkaTools.Utils.isChrome()) {
  5732. // In Chrome sometimes we randomly execute before the ikariam "on-ready" scripts
  5733. // which won't work because the stuff IkaTools.init needs will not be in the
  5734. // javascript objects. Move this setup to the end of the line.
  5735. setTimeout(readyAction, 500);
  5736. } else {
  5737. readyAction();
  5738. }
  5739. });
  5740. }
  5741. return {
  5742. init: init,
  5743. }
  5744. }();
  5745.  
  5746. IkaTools.Logging.debuggable( {label: "Imperator.init", group: true, alwaysTime: true, swallowException: true},
  5747. Imperator.init)();
  5748.  
  5749. //IkaTools.EmpireData.resetData();
  5750. unsafeWindow.IkaTools = IkaTools;
  5751. /*unsafeWindow.realConsole = console;
  5752. $(document).ready(function() {
  5753. //unsafeWindow.console = console;
  5754. });
  5755. //unsafeWindow.$ = $;*/