// ==UserScript== // @name TACS (Tiberium Alliances Combat Simulator) // @description Allows you to simulate combat before actually attacking. // @namespace https://*.alliances.commandandconquer.com/*/index.aspx* // @include https://*.alliances.commandandconquer.com/*/index.aspx* // @version 3.53b // @author KRS_L | Contributions/Updates by WildKatana, CodeEcho, PythEch, Matthias Fuchs, Enceladus, TheLuminary, Panavia2, Da Xue, MrHIDEn, TheStriker, JDuarteDJ, null, g3gg0.de // @translator TR: PythEch | DE: Matthias Fuchs, Leafy & sebb912 | PT: JDuarteDJ & Contosbarbudos | IT: Hellcco | NL: SkeeterPan | HU: Mancika | FR: Pyroa & NgXAlex | FI: jipx | RO: MoshicVargur // @grant none // ==/UserScript== window.TACS_version = GM_info.script.version; (function () { 'use strict'; var TASuite_mainFunction = function () { console.log("TACS: Simulator loaded"); /* not used function compare(a, b) { return a - b; } function sort_and_unique(my_array) { my_array.sort(compare); for (var i = 1; i < my_array.length; i++) { if (my_array[i] === my_array[i - 1]) { my_array.splice(i--, 1); } } return my_array; }*/ var locale = null; var languages = ["tr_TR", "de_DE", "pt_PT", "it_IT", "nl_NL", "hu_HU", "fr_FR", "fi_FI", "ro_RO"]; //en is default var translations = { "Stats" : ["İstatistik", "Statistik", "Estatística", "Statistiche", "Statistieken", "Statisztika", "Statistiques", "Tiedot", "Statistici"], "Enemy Base:" : ["Düşman Üssü:", "Feindliche Basis:", "Base Inimiga:", "Base Nemica:", "Vijandelijke Basis:", "Ellenséges bázis:", "Base Ennemie:", "Vihollisen tukikohta:", "Baza inamică"], "Defences:" : ["Savunma Üniteleri:", "Verteidigung:", "Defesas:", "Difesa:", "Verdediging:", "Védelem:", "Défenses:", "Puolustus:", "Apărare"], "Buildings:" : ["Binalar:", "Gebäude:", "Edifícios:", "Strutture:", "Gebouwen:", "Épületek:", "Bâtiments:", "Rakennelmat:", "Clădiri"], "Construction Yard:" : ["Şantiye:", "Bauhof:", "Estaleiro:", "Cantiere:", "Bouwplaats:", "Központ:", "Chantier De Construction:", "Rakennustukikohta:", "Șantierul de construcții"], "Defense Facility:" : ["Savunma Tesisi:", "Verteidigungseinrichtung:", "Instalações de Defesa:", "Stazione di Difesa:", "Defensiefaciliteit:", "Védelmi Bázis:", "Complexe De Défense:", "Puolustuslaitos:", "Unitate de apărare"], "Command Center:" : ["Komuta Merkezi:", "Kommandozentrale:", "Centro de Comando:", "Centro di Comando:", "Commandocentrum:", "Parancsnoki központ:", "Centre De Commandement:", "Komentokeskus:", "Centrul de comandă"], "Available Repair:" : ["Mevcut Onarım:", "Verfügbare Reparaturen", "", "", "", "", "", "Korjausaikaa jäljellä:", "Timp de reparare disponibil"], "Available Attacks:" : ["Mevcut Saldırılar:", "Verfügbare Angriffe", "", "", "", "", "", "Hyökkäyksiä:", "Atacuri disponibile"], "Overall:" : ["Tüm Birlikler:", "Gesamt:", "Geral:", "Totale:", "Totaal:", "Áttekintés:", "Total:", "Yhteensä:", "Ansamblu"], "Infantry:" : ["Piyadeler:", "Infanterie:", "Infantaria:", "Fanteria:", "Infanterie:", "Gyalogság:", "Infanterie:", "Jalkaväki:", "Infanterie"], "Vehicle:" : ["Motorlu Birlikler:", "Fahrzeuge:", "Veículos:", "Veicoli:", "Voertuigen:", "Jármu:", "Véhicules:", "Ajoneuvot:", "Vehicule"], "Aircraft:" : ["Hava Araçları:", "Flugzeuge:", "Aviões:", "Velivoli:", "Vliegtuigen:", "Légiero:", "Avions:", "Lentokoneet:", "Aviație"], "Outcome:" : ["Sonuç:", "Ergebnis:", "Resultado:", "Esito:", "Uitkomst:", "Eredmény:", "Résultat:", "Lopputulos:", "Rezultat"], "Unknown" : ["Bilinmiyor", "Unbekannt", "Desconhecido", "Sconosciuto", "Onbekend", "Ismeretlen", "Inconnu", "Tuntematon", "Necunoscut"], "Battle Time:" : ["Savaş Süresi:", "Kampfdauer:", "Tempo de Batalha:", "Tempo di Battaglia:", "Gevechtsduur:", "Csata ideje:", "Durée Du Combat:", "Taistelun kesto:", "Timp de atac"], "Layouts" : ["Diziliş", "Layouts", "Formações", "Formazione", "Indelingen", "Elrendezés", "Dispositions", "Asetelmat", "Scheme"], "Load" : ["Yükle", "Laden", "Carregar", "Carica", "Laad", "Töltés", "Charger", "Lataa", "Încarcă"], "Load this saved layout." : ["Kayıtlı dizilişi yükle.", "Gespeichertes Layout laden.", "Carregar esta formação guardada.", "Carica questa formazione salvata.", "Laad deze opgeslagen indeling.", "Töltsd be ezt az elmentett elrendezést.", "Charger Cette Disposition.", "Lataa valittu asetelma.", "Încarcă acest formație salvată."], "Delete" : ["Sil", "Löschen", "Apagar", "Cancella", "Verwijder", "Törlés", "Effacer", "Poista", "Șterge"], "Name: " : ["İsim: ", "Name: ", "Nome: ", "Nome: ", "Naam: ", "Név: ", "Nom: ", "Nimi: ", "Nume: "], "Delete this saved layout." : ["Kayıtlı dizilişi sil.", "Gewähltes Layout löschen.", "Apagar esta formação guardada.", "Cancella questa formazione salvata.", "Verwijder deze opgeslagen indeling.", "Töröld ezt az elmentett elrendezést.", "Effacer Cette Disposition.", "Poista valittu asetelma.", "Șterge acest formație salvat."], "Save" : ["Kaydet", "Speichern", "Guardar", "Salva", "Opslaan", "Mentés", "Sauvegarder", "Tallenna", "Salvează"], "Save this layout." : ["Bu dizilişi kaydet.", "Layout speichern.", "Guardar esta formação.", "Salva questa formazione.", "Deze indeling opslaan.", "Mentsd el ezt az elrendezést.", "Sauvegarder Cette Disposition.", "Tallenna nykyinen asetelma.", "Salvează acest formație "], "Info" : ["Bilgi", "Info", "Info", "Info", "Info", "Info", "Infos", "Tietoa", "Info"], "Forums" : ["Forum", "Forum", "Fóruns", "Forum", "Forums", "Fórum", "Forums", "Keskustelupalsta", "Forum"], "Spoils" : ["Ganimetler", "Rohstoffausbeute", "Espólios", "Bottino", "Opbrengst", "Zsákmény", "Butin", "Sotasaalis", "Pradă"], "Options" : ["Seçenekler", "Optionen", "Opções:", "Opzioni:", "Opties:", "Opciók:", "Options:", "Asetukset", "Opțiuni"], "TACS Options": ["TACS Seçenekleri", "TACS Optionen", "", "", "", "", "", "", "Opțiuni TACS: "], "Auto display stats" : ["İstatistik penceresini otomatik olarak göster", "Dieses Fenster automatisch öffnen", "Mostrar esta caixa automaticamente", "Apri automaticamente la finestra Strumenti", "Dit venster automatisch weergeven", "Ezen ablak autómatikus megjelenítése", "Affich. Auto. de cette Fenêtre", "Näytä simuloinnin tiedot automaattisesti", "Afișează automat statisticile"], // need to change translations "Show shift buttons" : ["Kaydırma tuşlarını göster", "Bewegungstasten anzeigen", "Mostrar botões de deslocamento", "Mostra i pulsanti di spostamento", "Verschuifknoppen weergeven", "Eltoló gombok megjelenítése", "Affich. Auto. Boutons de Déplacement", "Näytä armeijan siirtopainikkeet", "Afișează butoanele de deplasare"], "Warning!" : ["Uyarı!", "Warnung!", "Aviso!", "Attenzione!", "Waarschuwing!", "Figyelem!", "Attention!", "Varoitus!", "Atenție!"], "Simulate" : ["Simule et", "Simulieren", "Simular", "Simula", "Simuleer", "Szimuláció", "Simuler", "Simuloi", "Simulează"], "Start Combat Simulation" : ["Savaş Simulasyonunu Başlat", "Kampfsimulation starten", "Começar a simalação de combate", "Avvia simulazione", "Start Gevechtssimulatie", "Csata szimuláció elindítása", "Démarrer La Simulation Du Combat", "Aloita taistelun simulaatio", "Începe simularea luptei"], "Setup" : ["Düzen", "Aufstellung", "Configuração", "Setup", "Opzet", "Elrendezés", "Organisation", "Takaisin", "Pregătire"], "Return to Combat Setup" : ["Ordu düzenini göster", "Zurück zur Einheitenaufstellung", "Voltar à configuração de combate", "Ritorna alla configurazione", "Keer terug naar Gevechtsopzet", "Vissza az egységek elrendezéséhez", "Retourner à l'Organisation Des Troupes", "Return to Combat Setup", "Întoarcere la ecranul pentru pregătirea luptei"], "Unlock" : ["Kilidi aç", "Freigabe", "Desbloquear", "Sblocca", "Ontgrendel", "Felold", "Debloquer", "Avaa", "Descuie"], //"Tools" : ["Araçlar", "Extras", "Ferramentas", "Strumenti", "Gereedschap", "Eszközök", "Outils", "Työkalut"], "Open Simulator Tools" : ["Simulatör Araçlarını Göster", "Extras öffnen", "Abrir as ferramentas do simulador", "Apri strumenti", "Open Simulator Gereedschap", "Megnyitja a szimulátor információs ablakát", "Ouvrir Les Réglages Du Simulateur", "Avaa simulaattorin työkalut", "Deschide opțiunile simulatorului"], "Shift units left" : ["Birlikleri sola kaydır", "Einheiten nach links bewegen", "Deslocar as unidades para a esquerda", "Spostare le unità a sinistra", "Verschuif eenheden links", "Egységek eltolása balra", "Déplacer Les Unités Vers La Gauche", "Siirtää yksikköjä vasemmalle", "Deplasează unitățile la stânga"], "Shift units right" : ["Birlikleri sağa kaydır", "Einheiten nach rechts bewegen", "Deslocar as unidades para a direita", "Spostare le unità a destra", "Verschuif eenheden rechts", "Egységek eltolása jobbra", "Déplacer Les Unités Vers La Droite", "Siirtää yksikköjä oikealle", "Deplasează unitățile la dreapta"], "Shift units up" : ["Birlikleri yukarı kaydır", "Einheiten nach oben bewegen", "Deslocar as unidades para cima", "Spostare le unità in alto", "Verschuif eenheden omhoog", "Egységek eltolása fel", "Déplacer Les Unités Vers Le Haut", "Siirtää yksikköjä ylös", "Deplasează unitățile mai sus"], "Shift units down" : ["Birlikleri aşağı kaydır", "Einheiten nach unten bewegen", "Deslocar as unidades para baixo", "Spostare le unità in basso", "Verschuif eenheden omlaag", "Egységek eltolása le", "Déplacer Les Unités Vers Le Bas", "Siirtää yksikköjä alas", "Deplasează unitățile mai jos"], //"Battle Simulator" : ["Savaş Simulatörü", "Kampfsimulator", "Simulador de Combate", "Simulatore", "Gevechtssimulator", "Csata szimulátor", "Simulateur De Combat", "Taistelusimulaattori"], "Total Victory" : ["Mutlak Zafer", "Gesamtsieg", "Vitória Total", "Vittoria Totale", "Totale Overwinning", "Teljes gyozelem", "Victoire Totale", "Totaalinen Voitto","Victorie totală"], "Victory" : ["Zafer", "Sieg", "Vitória", "Vittoria", "Overwinning", "Gyozelem", "Victoire", "Voitto", "Victorie"], "Total Defeat" : ["Mutlak Yenilgi", "Totale Niederlage", "Derrota total", "Sconfitta Totale", "Totale Nederlaag", "Teljes vereség", "Défaite Totale", "Total Tappio", "Înfrângere totală"], "Support lvl " : ["Takviye seviyesi ", "Stufe Supportwaffe ", "Nível do Suporte ", "Supporto lvl ", "Ondersteuningsniveau ", '"Support" épület szintje ', "Lvl. Du Support ", "Tukitykistön taso ", "Nivelul suportului "], "Refresh" : ["Yenile", "Erfrischen", "Actualizar", "Rinfrescare", "Verversen", "Felfrissít", "Actualiser", "Päivitä", "Împrospătează"], //google translate non-PT langs "Refresh Stats" : ["İstatistikleri Yenile", "Erfrischen Statistik", "Estatística", "Rinfrescare Statistiche", "Verversen Statistieken", "Frissítés Stats", "Actualiser Les Stats", "Päivitä tiedot", "Împrospătează statisticile"], //google translate non-PT langs 'refresh' + statistics label "Side:" : ["Taraf:", "Seite", "Lado:", "", "Zijde", "", "Côté", "Sijainti:", "Lateral"], "Left" : ["Sol", "Links", "Esquerda", "", "Links", "", "Gauche", "Vasen", "Stânga"], "Right" : ["Sağ", "Rechts", "Direita", "", "Rechts", "", "Droite", "Oikea", "Dreapta"], "Locks:" : ["Kilitler:", "Freigabe", "Bloquear:", "", "Vergrendelingen:", "", "Vérouiller:", "Varmistimet:", "Blochează:"], "Attack" : ["Saldırı", "Angriff", "Atacar", "", "Aanvallen", "", "Attaquer", "Hyökkäys", "Atacă "], "Repair" : ["Onarım", "Reparatur", "Reparar", "", "Repareren", "", "Réparer", "Korjaus", "Reparare"], "Reset" : ["Sıfırla", "Zurücksetzen", "", "", "", "", "", "Palauta", "Resetare"], "Simulation will be based on most recently refreshed stats!" : ["Simulasyon en son güncellenen istatistiklere göre yapılacaktır!", "Die Simulation basiert auf den zuletzt aktualisierten Stand", "A simulação vai ser baseada na mais recente data!", "", "Simulatie zal gebaseerd worden op meest recentelijke ververste statistieken!", "", "La Simulation sera basée en fonction des dernières stats actualisées !", "Simulaatio suoritetaan viimeisimmän päivityksen tiedoilla!", "Simularea se va baza pe cele mai recente statistici!"], "Unlock Attack Button" : ["Saldırı Düğmesinin Kilidini Aç", "Angriffsbutton freigeben", "Desbloquear o botão de ataque", "Sblocca pulsante d'attacco", "Ontgrendel Aanvalsknop", "a Támadás gomb feloldása", "Débloquer Le Bouton d'Attaque", "Poista hyökkäusnapin lukitus", "Descuie butonul de atac"], "Unlock Repair Button" : ["Onarım Düğmesinin Kilidini Aç", "Reparaturbutton freigeben", "Desbloquear botão de reparação", "", "Ontgrendel Repareerknop", "", "Débloquer Le Bouton de Réparation", "Poista korjausnapin lukitus", "Descuie butonul de reparare"], "Unlock Reset Button" : ["Sıfırlama Düğmesinin Kilidini Aç", "", "", "", "", "", "", "Avaa Tyhjennä nappi", "Descuie butonul de resetare"], "SKIP": ["ATLA", "Überspringen", "", "", "", "", "", "", ""], "Skip to end" : ["Simulasyonu atla", "Zum Ende Vorspringen", "", "", "", "", "", "Mene loppuun", "Sari la final"], "Reset Formation" : ["Dizilişi Sıfırla", "Formation zurücksetzen", "", "", "", "", "", "Palauta armeijan oletusasetelma", "Resetează formația"], "Flip Horizontal" : ["Yatay Çevir", "Horizontal Spiegeln", "", "", "", "", "", "Käännä vaakasuunnassa", "Întoarce orizontal"], "Flip Vertical" : ["Dikey Çevir", "Vertikal Spiegeln", "", "", "", "", "", "Käännä pystysuunnassa", "Întoarce vertical"], "Activate All" : ["Hepsini Aktifleştir", "Alle Aktivieren", "", "", "", "", "", "Aktivoi kaikki", "Activează totul"], "Deactivate All" : ["Hepsini Deaktifleştir", "Alle Deaktivieren", "", "", "", "", "", "Poista kaikki käytöstä", "Dezactivează totul"], "Activate Infantry" : ["Piyadeleri Aktifleştir", "Infanterie Aktivieren", "", "", "", "", "", "Aktivoi jalkaväki", "Activează infanteria"], "Deactivate Infantry" : ["Piyadeleri Deaktifleştir", "Infanterie Deaktivieren", "", "", "", "", "", "Poista jalkaväki käytöstä", "Dezactivează infanteria"], "Activate Vehicles" : ["Motorlu Birlikleri Aktifleştir", "Fahrzeuge Aktivieren", "", "", "", "", "", "Aktivoi ajoneuvot", "Activează vehiculele"], "Deactivate Vehicles" : ["Motorlu Birlikleri Deaktifleştir", "Fahrzeuge Deaktivieren", "", "", "", "", "", "Poista ajoneuvot käytöstä", "Dezactivează vehiculele"], "Activate Air" : ["Hava Araçlarını Aktifleştir", "Flugzeuge Aktivieren", "", "", "", "", "", "Aktivoi lentokoneet", "Activează avioanele"], "Deactivate Air" : ["Hava Araçlarını Deaktifleştir", "Flugzeuge Deaktivieren", "", "", "", "", "", "Poista lentokoneet käytöstä", "Dezactivează avioanele"], "Activate Repair Mode" : ["Onarım Modunu Aç", "Reparatur Modus Aktivieren", "", "", "", "", "", "Aktivoi korjaustila", "Activează modul de reparare"], "Deactivate Repair Mode" : ["Onarım Modunu Kapat", "Reparatur Modus Deaktivieren", "", "", "", "", "", "Poista korjaustila käytöstä", "Dezactivează modul de reparare"], "Version: " : ["Sürüm: ", "", "", "", "", "", "", "Versio: ", "Versiunea: "], "Mark saved targets on region map" : ["Kaydedilmiş hedefleri haritada işaretle", "Gespeicherte Ziele auf der Karte Markieren", "", "", "", "", "", "Merkitse tallennetut kohteet alue kartalle", "Marchează țintele salvate pe harta regiunii"], // region view "Enable 'Double-click to (De)activate units'" : ["Çift-tıklama ile birlikleri (de)aktifleştirmeyi etkinleştir", "Doppel-Klick zum Einheiten (De)-Aktivieren ", "", "", "", "", "", "Tuplaklikkaus aktivoi/deaktivoi yksiköt", "Activează \"Dublu click pentru a (De)activa unitățile\""], "Show Loot Summary" : ["", "Zeige Beute-Zusammenfassung", "", "", "", "", "", "", "Afișează rezumatul prăzii"], "Show Resource Layout Window" : ["", "", "", "", "", "", "", "", "Afișează fereastra cu schema resurselor"], "Show Stats During Attack" : ["İstatistikleri saldırı sırasında göster", "Zeige Statistik während des Angriffs", "", "", "", "", "", "Näytä tiedot -ikkuna hyökkäyksen aikana", "Afișează statisticile în timpul atacului"], "Show Stats During Simulation" : ["İstatistikleri simulasyondayken göster", "Zeige Statistik während der Simulation", "", "", "", "", "", "Näytä tiedot -ikkuna simuloinnin aikana", "Afișează statisticile în timpul simulării"], "Skip Victory-Popup After Battle" : ["Savaş Bitiminde Zafer Bildirimini Atla", "Siegesbildschirm überspringen", "", "", "", "", "", "Ohita taistelun jälkeinen voittoruutu", "Sari peste popup-ul victoriei după luptă"], "Stats Window Opacity" : ["İstatistik Penceresi Saydamlığı", "Transparenz des Statistik-Fenster", "", "", "", "", "", "Tiedot -ikkunan läpinäkyvyys", "Opacitatea ferestrei de statistici"], "Disable Unit Tooltips In Army Formation Manager" : ["Ordu Dizilişi Yöneticisinde Birlik İpuçlarını Gizle", "", "", "", "", "", "", "Poista käytöstä yksiköiden työkaluvihjeet armeijan muodostamisikkunassa", "Dezactivează tooltip-urile unităților în managerul formației armatei"], "Disable Tooltips In Attack Preparation View" : ["Saldırı Hazırlık Görünümünde İpuçlarını Gizle", "", "", "", "", "", "", "Poista työkaluvihjeet käytöstä hyökkäyksen valmisteluikkunassa", "Dezactivează tooltip-urile unităților în ecranul preparării armatei"], "Undo" : ["Geri Al", "", "", "", "", "", "", "Kumoa", "Anulează"], "Redo" : ["İleri Al", "", "", "", "", "", "", "Tee uudelleen", "Refă"], "Open Stats Window" : ["İstatistik Penceresini Aç", "Statistik öffnen", "", "", "", "", "", "Avaa tiedot -ikkuna", "Deschide fereastra de statistici"] }; function lang(text) { try { if (languages.indexOf(locale) > -1) { var translated = translations[text][languages.indexOf(locale)]; if (translated !== "") { return translated; } else { return text; } } else { return text; } } catch (e) { console.log(e); //console.log("Text is undefined: "+text); return text; } } function CreateTweak() { var TASuite = {}; qx.Class.define("TACS", { type : "singleton", extend : qx.core.Object, members : { // Default settings saveObj : { // section.option section : { option : "foo" }, bounds : { battleResultsBoxLeft : 125, battleResultsBoxTop : 125, resourceLayoutWindowLeft : 125, resourceLayoutWindowTop : 550 }, checkbox : { showLootSummary : true, showResourceLayoutWindow : true, showStatsDuringAttack : true, showStatsDuringSimulation : true, skipVictoryPopup : false, disableArmyFormationManagerTooltips : false, disableAttackPreparationTooltips : false }, audio : { playRepairSound : true }, slider : { statsOpacity : 100 } }, buttons : { attack : { layout : { save : null, // buttonLayoutSave load : null // buttonLayoutLoad }, simulate : null, // buttonSimulateCombat unlock : null, // buttonUnlockAttack repair : null, // buttonUnlockRepair unlockReset : null, // buttonUnlockReset tools : null, // buttonTools refreshStats : null, // buttonRefreshStats formationReset : null, // buttonResetFormation flipVertical : null, // buttonFlipVertical flipHorizontal : null, // buttonFlipHorizontal activateInfantry : null, // buttonActivateInfantry activateVehicles : null, // buttonActivateVehicles activateAir : null, // buttonActivateAir activateAll : null, // buttonActivateAll repairMode : null, // buttonToggleRepairMode toolbarRefreshStats : null, // buttontoolbarRefreshStats toolbarShowStats : null, toolbarUndo : null, toolbarRedo : null, options : null // buttonOptions }, simulate : { back : null, // buttonReturnSetup skip : null // buttonSkipSimulation }, shiftFormationUp : null, shiftFormationDown : null, shiftFormationLeft : null, shiftFormationRight : null, optionStats : null }, stats : { spoils : { tiberium : null, // tiberiumSpoils crystal : null, // crystalSpoils credit : null, // creditSpoils research : null // researchSpoils }, health : { infantry : null, // lastInfantryPercentage vehicle : null, // lastVehiclePercentage aircraft : null, // lastAirPercentage overall : null // lastPercentage }, repair : { infantry : null, // lastInfantryRepairTime vehicle : null, // lastVehicleRepairTime aircraft : null, // lastAircraftRepairTime overall : null, // lastRepairTime available : null, // storedRepairTime max : null // maxRepairCharges }, attacks : { availableCP : null, attackCost : null, availableAttacksCP: null, availableAttacksAtFullStrength: null, availableAttacksWithCurrentRepairCharges: null }, damage : { units : { overall : null // lastEnemyUnitsPercentage }, structures : { construction : null, // lastCYPercentage defense : null, // lastDFPercentage command : null, // lastCCPercentage support : null, overall : null // lastEnemyBuildingsPercentage }, overall : null // lastEnemyPercentage }, resourcesummary : { research : null, credits : null, crystal : null, tiberium : null }, time : null, supportLevel : null }, labels : { health : { infantry : null, // infantryTroopStrengthLabel vehicle : null, // vehicleTroopStrengthLabel aircraft : null, // airTroopStrengthLabel overall : null // simTroopDamageLabel }, repair : { available : null }, repairinfos : { infantry : null, vehicle : null, aircraft : null, available : null }, attacks : { available : null }, damage : { units : { overall : null // enemyUnitsStrengthLabel }, structures : { construction : null, // CYTroopStrengthLabel defense : null, // DFTroopStrengthLabel command : null, // CCTroopStrengthLabel support : null, // enemySupportStrengthLabel overall : null // enemyBuildingsStrengthLabel }, overall : null, // enemyTroopStrengthLabel outcome : null // simVictoryLabel }, resourcesummary : { research : null, credits : null, crystal : null, tiberium : null }, time : null, // simTimeLabel supportLevel : null, // enemySupportLevelLabel countDown : null // countDownLabel }, view : { playerCity : null, playerCityDefenseBonus : null, ownCity : null, ownCityId : null, targetCityId : null, lastUnits : null, lastUnitList : null }, layouts : { label : null, list : null, all : null, current : null, restore : null }, options : { autoDisplayStats : null, showShift : null, sideLabel : null, locksLabel : null, leftSide : null, rightSide : null, attackLock : null, repairLock : null, markSavedTargets : null, dblClick2DeActivate : null, showLootSummary : null, showResourceLayoutWindow : null, showStatsDuringAttack : null, showStatsDuringSimulation : null, skipVictoryPopup : null, statsOpacityLabel : null, statsOpacity : null, statsOpacityOutput: null, disableArmyFormationManagerTooltips : null, disableAttackPreparationTooltips : null }, audio : { soundRepairImpact : null, soundRepairReload : null }, _Application : null, _MainData : null, _Cities : null, _VisMain : null, _ActiveView : null, _PlayArea : null, _armyBarContainer : null, _armyBar : null, attacker_modules : null, defender_modules : null, resourceSummaryVerticalBox : null, battleResultsBox : null, optionsWindow : null, resourceLayoutWindow : null, statsPage : null, lastSimulation : null, count : null, counter : null, statsOnly : null, simulationWarning : null, warningIcon : null, userInterface : null, infantryActivated : null, vehiclesActivated : null, airActivated : null, allActivated : null, toolBar : null, toolBarParent : null, TOOL_BAR_LOW : 113, // hidden TOOL_BAR_HIGH : 155, // popped-up TOOL_BAR_WIDTH : 740, resourceLayout : null, repairInfo : null, repairButtons : [], repairButtonsRedrawTimer : null, armybarClickCount : null, armybarClearnClickCounter : null, repairModeTimer : null, curPAVM : null, curViewMode : null, DEFAULTS : null, undoCache : [], ts1 : null, //timestamps ts2 : null, attackUnitsLoaded : null, loadData : function () { var str = localStorage.getItem("TACS"); var temp; // this needs to be thoroughly checked if (str != null) { //previous options found temp = JSON.parse(str); for (var i in this.saveObj) { if (typeof temp[i] == "object") { for (var j in this.saveObj[i]) { if (typeof temp[i][j] == "object") { //recurse deeper? } else if (typeof temp[i][j] == "undefined") { // create missing option console.log("Creating missing save option: " + i + "." + j); temp[i][j] = this.saveObj[i][j]; } } } else if (typeof temp[i] == "undefined") { // create missing option section console.log("Creating missing option section: " + i); temp[i] = this.saveObj[i]; } } this.saveObj = temp; this.saveData(); } }, saveData : function () { var obj = this.saveObj || window.TACS.getInstance().saveObj; var str = JSON.stringify(obj); localStorage.setItem("TACS", str); }, initialize : function () { try { this.loadData(); locale = ClientLib.Config.Main.GetInstance().GetConfig(ClientLib.Config.Main.CONFIG_LANGUAGE); this.targetCityId = "0"; // Store references this._Application = qx.core.Init.getApplication(); this._MainData = ClientLib.Data.MainData.GetInstance(); this._VisMain = ClientLib.Vis.VisMain.GetInstance(); this._ActiveView = this._VisMain.GetActiveView(); this._PlayArea = this._Application.getPlayArea(); this._armyBarContainer = this._Application.getArmySetupAttackBar(); this._armyBar = this._Application.getUIItem(ClientLib.Data.Missions.PATH.BAR_ATTACKSETUP); if (PerforceChangelist >= 443425) { // 16.1 patch for (var i in this._armyBarContainer) { if (typeof this._armyBarContainer[i] == "object" && this._armyBarContainer[i] != null) { if (this._armyBarContainer[i].objid == "btn_disable") { console.log(this._armyBarContainer[i].objid); var nativeSimBarDisableButton = this._armyBarContainer[i]; } if (this._armyBarContainer[i].objid == "cnt_controls" || this._armyBarContainer[i].objid == "btn_toggle") { this._armyBarContainer[i].setVisibility("excluded"); } } } var armyBarChildren = this._armyBar.getChildren(); for (var i in armyBarChildren) { if (armyBarChildren[i].$$user_decorator == "pane-armysetup-right") { console.log(armyBarChildren[i].$$user_decorator) var armySetupRight = armyBarChildren[i]; armySetupRight.removeAt(1); armySetupRight.addAt(nativeSimBarDisableButton, 1); break; } } } // Fix Defense Bonus Rounding for (var key in ClientLib.Data.City.prototype) { if (typeof ClientLib.Data.City.prototype[key] === 'function') { var strFunction = ClientLib.Data.City.prototype[key].toString(); if (strFunction.indexOf("Math.floor(a.adb)") > -1) { ClientLib.Data.City.prototype[key] = this.fixBonusRounding(ClientLib.Data.City.prototype[key], "a"); break; } } } // Event Handlers phe.cnc.Util.attachNetEvent(ClientLib.API.Battleground.GetInstance(), "OnSimulateBattleFinished", ClientLib.API.OnSimulateBattleFinished, this, this.onSimulateBattleFinishedEvent); phe.cnc.Util.attachNetEvent(ClientLib.API.Battleground.GetInstance(), "OnSimulateCombatReport", ClientLib.API.OnSimulateCombatReport, this, this.OnSimulateCombatReportEvent); phe.cnc.Util.attachNetEvent(this._VisMain, "ViewModeChange", ClientLib.Vis.ViewModeChange, this, this.viewChangeHandler); phe.cnc.Util.attachNetEvent(this._MainData.get_Cities(), "CurrentOwnChange", ClientLib.Data.CurrentOwnCityChange, this, this.ownCityChangeHandler); // Setup Button this.buttons.simulate.back = new qx.ui.form.Button(lang("Setup")); this.buttons.simulate.back.set({ width : 80, height : 24, appearance : "button-addpoints", toolTipText : lang("Return to Combat Setup") }); this.buttons.simulate.back.addListener("click", this.returnSetup, this); // Skip to end Button this.buttons.simulate.skip = new qx.ui.form.Button(); this.buttons.simulate.skip.set({ width : 35, height : 24, appearance : "button-addpoints", icon : "FactionUI/icons/icon_replay_skip.png", toolTipText : lang("Skip to end") }); this.buttons.simulate.skip.addListener("click", this.skipSimulation, this); var replayBar = this._Application.getReportReplayOverlay(); replayBar.add(this.buttons.simulate.back, { top : 21, left : 185 }); if (typeof(CCTAWrapper_IsInstalled) != 'undefined' && CCTAWrapper_IsInstalled) { replayBar.add(this.buttons.simulate.skip, { top : 21, left : 435 }); } // Unlock Button this.buttons.attack.unlock = new qx.ui.form.Button(lang("Unlock")); this.buttons.attack.unlock.set({ width : 54, height : 37, padding : 0, appearance : "button-text-small", toolTipText : lang("Unlock Attack Button") }); this.buttons.attack.unlock.addListener("click", this.unlockAttacks, this); this.buttons.attack.unlock.setOpacity(0.5); var temp = localStorage.ta_sim_attackLock; if (temp) { temp = JSON.parse(localStorage.ta_sim_attackLock); } else { temp = true; } if (temp) { this._armyBar.add(this.buttons.attack.unlock, { top : 108, right : 10 }); } // Unlock Repair this.buttons.attack.repair = new qx.ui.form.Button(lang("Unlock")); this.buttons.attack.repair.set({ width : 54, height : 44, padding : 0, appearance : "button-text-small", toolTipText : lang("Unlock Repair Button") }); this.buttons.attack.repair.addListener("click", this.unlockRepairs, this); this.buttons.attack.repair.setOpacity(0.5); var temp = localStorage.ta_sim_repairLock; if (temp) { temp = JSON.parse(localStorage.ta_sim_repairLock); } else { temp = true; } if (temp) { this._armyBar.add(this.buttons.attack.repair, { top : 23, right : 10 }); } var battleUnitData = ClientLib.Data.CityPreArmyUnit.prototype; if (!battleUnitData.set_Enabled_Original) { battleUnitData.set_Enabled_Original = battleUnitData.set_Enabled; } battleUnitData.set_Enabled = function (a) { this.set_Enabled_Original(a); window.TACS.getInstance().formationChangeHandler(); }; if (!battleUnitData.MoveBattleUnit_Original) { battleUnitData.MoveBattleUnit_Original = battleUnitData.MoveBattleUnit; } battleUnitData.MoveBattleUnit = function (a, b) { var _this = window.TACS.getInstance(); if (_this.options.dblClick2DeActivate.getValue()) { if (_this.armybarClickCount >= 2) { if (this.get_CoordX() === a && this.get_CoordY() === b) { var enabledState = this.get_Enabled(); enabledState ^= true; this.set_Enabled_Original(enabledState); } } } this.MoveBattleUnit_Original(a, b); _this.formationChangeHandler(); _this.armybarClickCount = 0; clearInterval(_this.armybarClearnClickCounter); }; this.loadLayouts(); // The Options Window this.optionsWindow = new qx.ui.window.Window(lang("Options"), "FactionUI/icons/icon_forum_properties.png").set({ contentPaddingTop : 1, contentPaddingBottom : 8, contentPaddingRight : 8, contentPaddingLeft : 8, //width : 400, height : 400, showMaximize : false, showMinimize : false, allowMaximize : false, allowMinimize : false, resizable : false }); this.optionsWindow.getChildControl("icon").set({ scale : true, width : 25, height : 25 }); this.optionsWindow.setLayout(new qx.ui.layout.VBox()); var optionsWindowTop = localStorage.ta_sim_options_top; if (optionsWindowTop) { optionsWindowTop = JSON.parse(localStorage.ta_sim_options_top); var optionsWindowLeft = JSON.parse(localStorage.ta_sim_options_left); this.optionsWindow.moveTo(optionsWindowLeft, optionsWindowTop); } else { this.optionsWindow.center(); } this.optionsWindow.addListener("close", function () { localStorage.ta_sim_options_top = JSON.stringify(this.optionsWindow.getLayoutProperties().top); localStorage.ta_sim_options_left = JSON.stringify(this.optionsWindow.getLayoutProperties().left); this.saveData(); }, this); // Resource Layout Window this.resourceLayoutWindow = new qx.ui.window.Window().set({ contentPaddingTop : 1, contentPaddingBottom : 8, contentPaddingRight : 8, contentPaddingLeft : 8, width : 185, showMaximize : false, showMinimize : false, allowMaximize : false, allowMinimize : false, resizable : false }); /*this.resourceLayoutWindow.getChildControl("icon").set({ scale : true, width : 25, height : 25 });*/ this.resourceLayoutWindow.setLayout(new qx.ui.layout.HBox()); this.resourceLayoutWindow.moveTo(this.saveObj.bounds.resourceLayoutWindowLeft, this.saveObj.bounds.resourceLayoutWindowTop); this.resourceLayoutWindow.addListener("move", function () { this.saveObj.bounds.resourceLayoutWindowLeft = this.resourceLayoutWindow.getBounds().left; this.saveObj.bounds.resourceLayoutWindowTop = this.resourceLayoutWindow.getBounds().top; this.saveData(); }, this); this.resourceLayoutWindow.addListener("close", function () { localStorage.ta_sim_layout_top = JSON.stringify(this.resourceLayoutWindow.getLayoutProperties().top); localStorage.ta_sim_layout_left = JSON.stringify(this.resourceLayoutWindow.getLayoutProperties().left); }, this); // The Battle Simulator box this.battleResultsBox = new qx.ui.window.Window("TACS", "FactionUI/icons/icon_res_plinfo_command_points.png").set({ contentPaddingTop : 0, contentPaddingBottom : 2, contentPaddingRight : 2, contentPaddingLeft : 6, showMaximize : false, showMinimize : false, allowMaximize : false, allowMinimize : false, resizable : false }); this.battleResultsBox.getChildControl("icon").set({ scale : true, width : 20, height : 20, alignY: "middle" }); this.battleResultsBox.setLayout(new qx.ui.layout.HBox()); this.battleResultsBox.moveTo(this.saveObj.bounds.battleResultsBoxLeft, this.saveObj.bounds.battleResultsBoxTop); this.battleResultsBox.addListener("move", function () { this.saveObj.bounds.battleResultsBoxLeft = this.battleResultsBox.getBounds().left; this.saveObj.bounds.battleResultsBoxTop = this.battleResultsBox.getBounds().top; this.saveData(); }, this); this.battleResultsBox.addListener("appear", function () { this.battleResultsBox.setOpacity(this.saveObj.slider.statsOpacity/100); }, this); var tabView = new qx.ui.tabview.TabView().set({ contentPaddingTop : 3, contentPaddingBottom : 6, contentPaddingRight : 7, contentPaddingLeft : 3 }); this.battleResultsBox.add(tabView); this.initializeStats(tabView); this.initializeLayout(tabView); this.initializeInfo(tabView); this.initializeOptions(); this.setupInterface(); this.createHasAttackFormationFunction(); this.createBasePlateFunction(ClientLib.Vis.Region.RegionNPCCamp); this.createBasePlateFunction(ClientLib.Vis.Region.RegionNPCBase); this.createBasePlateFunction(ClientLib.Vis.Region.RegionCity); // Fix armyBar container divs, the mouse has a horrible offset in the armybar when this is enabled // if this worked it would essentially fix a layout bug, shame... using zIndex instead // Abort, Retry, Fail? /* this._armyBar.getLayoutParent().getContentElement().getParent().setStyles({ height : "155px" }); this._armyBar.getLayoutParent().getContentElement().setStyles({ height : "155px" }); this._armyBar.getLayoutParent().setLayoutProperties({ bottom : 0 }); this._armyBar.getLayoutParent().setHeight(155); this._armyBar.setLayoutProperties({ top : -5 }); */ // putting overlays in front so we have 19 layers to work with behind them // zIndex 5 is reserved for Shiva this.gameOverlaysToFront(); } catch (e) { console.log(e); } }, fixBonusRounding: function (bonus, data) { try { if (data == null) data = ""; var strFunction = bonus.toString(); strFunction = strFunction.replace("floor", "round"); var functionBody = strFunction.substring(strFunction.indexOf("{") + 1, strFunction.lastIndexOf("}")); var fn = Function(data, functionBody); return fn; } catch (e) { console.log("fixBonusRounding error: ", e); } }, initializeStats : function (tabView) { try { ////////////////// Stats //////////////////// this.statsPage = new qx.ui.tabview.Page(lang("Stats")); this.statsPage.setLayout(new qx.ui.layout.VBox(1)); tabView.add(this.statsPage); // Refresh Vertical Box var container = new qx.ui.container.Composite(); var layout = new qx.ui.layout.Grid(); layout.setColumnAlign(0, "left", "middle"); layout.setColumnAlign(1, "right", "middle"); layout.setColumnFlex(0, 1); layout.setRowHeight(0, 15); container.setLayout(layout); container.setThemedFont("bold"); container.setThemedBackgroundColor("#eef"); this.statsPage.add(container); // Countdown for next refresh this.labels.countDown = new qx.ui.basic.Label(""); this.labels.countDown.set({ width : 0, height : 10, marginLeft : 5, backgroundColor : "#B40404" }); container.add(this.labels.countDown, { row : 0, column : 0 }); this.buttons.attack.refreshStats = new qx.ui.form.Button(lang("Refresh")); this.buttons.attack.refreshStats.set({ width : 58, appearance : "button-text-small", toolTipText : lang("Refresh Stats") }); this.buttons.attack.refreshStats.addListener("click", this.refreshStatistics, this); container.add(this.buttons.attack.refreshStats, { row : 0, column : 1 }); // The Enemy Vertical Box var container = new qx.ui.container.Composite(); var layout = new qx.ui.layout.Grid(); layout.setColumnAlign(1, "right", "middle"); layout.setColumnFlex(0, 1); container.setLayout(layout); container.setThemedFont("bold"); container.setThemedBackgroundColor("#eef"); this.statsPage.add(container); // The Enemy Troop Strength Label container.add(new qx.ui.basic.Label(lang("Enemy Base:")), { row : 0, column : 0 }); this.labels.damage.overall = new qx.ui.basic.Label("100"); container.add(this.labels.damage.overall, { row : 0, column : 1 }); // Units container.add(new qx.ui.basic.Label(lang("Defences:")), { row : 1, column : 0 }); this.labels.damage.units.overall = new qx.ui.basic.Label("100"); container.add(this.labels.damage.units.overall, { row : 1, column : 1 }); // Buildings container.add(new qx.ui.basic.Label(lang("Buildings:")), { row : 2, column : 0 }); this.labels.damage.structures.overall = new qx.ui.basic.Label("100"); container.add(this.labels.damage.structures.overall, { row : 2, column : 1 }); // Command Center container.add(new qx.ui.basic.Label(lang("Construction Yard:")), { row : 3, column : 0 }); this.labels.damage.structures.construction = new qx.ui.basic.Label("100"); container.add(this.labels.damage.structures.construction, { row : 3, column : 1 }); // Defense Facility container.add(new qx.ui.basic.Label(lang("Defense Facility:")), { row : 4, column : 0 }); this.labels.damage.structures.defense = new qx.ui.basic.Label("100"); container.add(this.labels.damage.structures.defense, { row : 4, column : 1 }); // Command Center container.add(new qx.ui.basic.Label(lang("Command Center:")), { row : 5, column : 0 }); this.labels.damage.structures.command = new qx.ui.basic.Label("100"); container.add(this.labels.damage.structures.command, { row : 5, column : 1 }); // The Support Horizontal Box this.labels.supportLevel = new qx.ui.basic.Label(""); container.add(this.labels.supportLevel, { row : 6, column : 0 }); this.labels.damage.structures.support = new qx.ui.basic.Label(""); container.add(this.labels.damage.structures.support, { row : 6, column : 1 }); // The Troops Vertical Box container = new qx.ui.container.Composite(); layout = new qx.ui.layout.Grid(); layout.setColumnAlign(1, "right", "middle"); layout.setColumnFlex(0, 1); container.setLayout(layout); container.setThemedFont("bold"); container.setThemedBackgroundColor("#eef"); this.statsPage.add(container); // The Troop Strength Label container.add(new qx.ui.basic.Label(lang("Overall:")), { row : 0, column : 0 }); this.labels.health.overall = new qx.ui.basic.Label("100"); container.add(this.labels.health.overall, { row : 0, column : 1 }); // The Infantry Troop Strength Label container.add(new qx.ui.basic.Label(lang("Infantry:")), { row : 1, column : 0 }); this.labels.health.infantry = new qx.ui.basic.Label("100"); container.add(this.labels.health.infantry, { row : 1, column : 1 }); // The Vehicle Troop Strength Label container.add(new qx.ui.basic.Label(lang("Vehicle:")), { row : 2, column : 0 }); this.labels.health.vehicle = new qx.ui.basic.Label("100"); container.add(this.labels.health.vehicle, { row : 2, column : 1 }); // The Air Troop Strength Label container.add(new qx.ui.basic.Label(lang("Aircraft:")), { row : 3, column : 0 }); this.labels.health.aircraft = new qx.ui.basic.Label("100"); container.add(this.labels.health.aircraft, { row : 3, column : 1 }); // The inner Vertical Box container = new qx.ui.container.Composite(); layout = new qx.ui.layout.Grid(); layout.setColumnAlign(1, "right", "middle"); layout.setColumnFlex(0, 1); container.setLayout(layout); container.setThemedFont("bold"); container.setThemedBackgroundColor("#eef"); this.statsPage.add(container); // The Victory Label container.add(new qx.ui.basic.Label(lang("Outcome:")), { row : 0, column : 0 }); this.labels.damage.outcome = new qx.ui.basic.Label(lang("Unknown")); container.add(this.labels.damage.outcome, { row : 0, column : 1 }); // The Battle Time Label container.add(new qx.ui.basic.Label(lang("Battle Time:")), { row : 1, column : 0 }); this.labels.time = new qx.ui.basic.Label("120"); container.add(this.labels.time, { row : 1, column : 1 }); // Available RT/Attacks Vertical Box container = new qx.ui.container.Composite(); layout = new qx.ui.layout.Grid(); layout.setColumnAlign(1, "right", "middle"); layout.setColumnFlex(0, 1); container.setLayout(layout); container.setThemedFont("bold"); container.setThemedBackgroundColor("#eef"); this.statsPage.add(container); // Available Repair Time Label container.add(new qx.ui.basic.Label(lang("Available Repair:")), { row : 0, column : 0 }); this.labels.repair.available = new qx.ui.basic.Label("00:00:00"); container.add(this.labels.repair.available, { row : 0, column : 1 }); // Available Attacks Label container.add(new qx.ui.basic.Label(lang("Available Attacks:")), { row : 1, column : 0 }); this.labels.attacks.available = new qx.ui.basic.Label("CP:- / FR:- / CFR:-"); container.add(this.labels.attacks.available, { row : 1, column : 1 }); // Resource Summary Vertical Box this.resourceSummaryVerticalBox = new qx.ui.container.Composite(); var layout = new qx.ui.layout.Grid(); layout.setColumnAlign(1, "right", "middle"); layout.setColumnWidth(0, 90); this.resourceSummaryVerticalBox.setLayout(layout); this.resourceSummaryVerticalBox.setThemedFont("bold"); this.resourceSummaryVerticalBox.setThemedBackgroundColor("#eef"); if (this.saveObj.checkbox.showLootSummary) { this.statsPage.add(this.resourceSummaryVerticalBox); } // Research Icon/Label this.labels.resourcesummary.research = new qx.ui.basic.Atom("0", "webfrontend/ui/common/icn_res_research_mission.png"); this.resourceSummaryVerticalBox.add(this.labels.resourcesummary.research, { row : 0, column : 0 }); // Tiberium Icon/Label this.labels.resourcesummary.tiberium = new qx.ui.basic.Atom("0", "webfrontend/ui/common/icn_res_tiberium.png"); this.resourceSummaryVerticalBox.add(this.labels.resourcesummary.tiberium, { row : 0, column : 1 }); // Credits Icon/Label this.labels.resourcesummary.credits = new qx.ui.basic.Atom("0", "webfrontend/ui/common/icn_res_dollar.png"); this.resourceSummaryVerticalBox.add(this.labels.resourcesummary.credits, { row : 1, column : 0 }); // Crystal Icon/Label this.labels.resourcesummary.crystal = new qx.ui.basic.Atom("0", "webfrontend/ui/common/icn_res_chrystal.png"); this.resourceSummaryVerticalBox.add(this.labels.resourcesummary.crystal, { row : 1, column : 1 }); } catch (e) { console.log(e); } }, initializeLayout : function (tabView) { try { ////////////////// Layouts //////////////////// var layoutPage = new qx.ui.tabview.Page(lang("Layouts")); layoutPage.setLayout(new qx.ui.layout.VBox()); tabView.add(layoutPage); this.layouts.list = new qx.ui.form.List(); this.layouts.list.set({ height : 174, selectionMode : "one" }); layoutPage.add(this.layouts.list); // Add the two buttons for save and load var layHBox = new qx.ui.container.Composite(); layHBox.setLayout(new qx.ui.layout.HBox(5)); // Load button this.buttons.attack.layout.load = new qx.ui.form.Button(lang("Load")); this.buttons.attack.layout.load.set({ width : 80, appearance : "button-text-small", toolTipText : lang("Load this saved layout.") }); this.buttons.attack.layout.load.addListener("click", this.loadCityLayout, this); layHBox.add(this.buttons.attack.layout.load); // Delete button this.buttonLayoutDelete = new qx.ui.form.Button(lang("Delete")); this.buttonLayoutDelete.set({ width : 80, appearance : "button-text-small", toolTipText : lang("Delete this saved layout.") }); this.buttonLayoutDelete.addListener("click", this.deleteCityLayout, this); layHBox.add(this.buttonLayoutDelete); layoutPage.add(layHBox); var layVBox = new qx.ui.container.Composite(); layVBox.setLayout(new qx.ui.layout.VBox(1)); layVBox.setThemedFont("bold"); layVBox.setThemedPadding(2); layVBox.setThemedBackgroundColor("#eef"); // The Label Textbox var layHBox2 = new qx.ui.container.Composite(); layHBox2.setLayout(new qx.ui.layout.HBox(5)); layHBox2.add(new qx.ui.basic.Label(lang("Name: "))); this.layouts.label = new qx.ui.form.TextField(); this.layouts.label.setValue(""); layHBox2.add(this.layouts.label); layVBox.add(layHBox2); // Save Button this.buttons.attack.layout.save = new qx.ui.form.Button(lang("Save")); this.buttons.attack.layout.save.set({ width : 80, appearance : "button-text-small", toolTipText : lang("Save this layout.") }); this.buttons.attack.layout.save.addListener("click", this.saveCityLayout, this); layVBox.add(this.buttons.attack.layout.save); layoutPage.add(layVBox); } catch (e) { console.log(e); } }, initializeInfo : function (tabView) { try { ////////////////// Info //////////////////// var infoPage = new qx.ui.tabview.Page(lang("Info")); infoPage.setLayout(new qx.ui.layout.VBox(1)); tabView.add(infoPage); // The Help Vertical Box var pVBox = new qx.ui.container.Composite(); pVBox.setLayout(new qx.ui.layout.VBox(1)); pVBox.setThemedFont("bold"); pVBox.setThemedPadding(2); pVBox.setThemedBackgroundColor("#eef"); infoPage.add(pVBox); var proHelpBar = new qx.ui.basic.Label().set({ value : "cncscripts.com", rich : true }); pVBox.add(proHelpBar); // The Spoils var psVBox = new qx.ui.container.Composite(); psVBox.setLayout(new qx.ui.layout.VBox(1)); psVBox.setThemedFont("bold"); psVBox.setThemedPadding(2); psVBox.setThemedBackgroundColor("#eef"); infoPage.add(psVBox); psVBox.add(new qx.ui.basic.Label(lang("Spoils"))); // Tiberium this.stats.spoils.tiberium = new qx.ui.basic.Atom("0", "webfrontend/ui/common/icn_res_tiberium.png"); psVBox.add(this.stats.spoils.tiberium); // Crystal this.stats.spoils.crystal = new qx.ui.basic.Atom("0", "webfrontend/ui/common/icn_res_chrystal.png"); psVBox.add(this.stats.spoils.crystal); // Credits this.stats.spoils.credit = new qx.ui.basic.Atom("0", "webfrontend/ui/common/icn_res_dollar.png"); psVBox.add(this.stats.spoils.credit); // Research this.stats.spoils.research = new qx.ui.basic.Atom("0", "webfrontend/ui/common/icn_res_research_mission.png"); psVBox.add(this.stats.spoils.research); // Options Page var pssVBox = new qx.ui.container.Composite(); var layout = new qx.ui.layout.Grid(); //layout.setColumnFlex(2, 1); pssVBox.setLayout(layout); pssVBox.setThemedFont("bold"); pssVBox.setThemedBackgroundColor("#eef"); infoPage.add(pssVBox); this.buttons.optionStats = new qx.ui.form.Button().set({ height : 25, width : 160, margin : 15, alignX : "center", label : lang("Options"), appearance : "button-text-small", icon : "FactionUI/icons/icon_forum_properties.png", toolTipText : lang("TACS Options") }); this.buttons.optionStats.addListener("click", this.toggleOptionsWindow, this); pssVBox.add(this.buttons.optionStats, { row : 0, column : 0 }); /* // Popup Checkbox this.options.autoDisplayStats = new qx.ui.form.CheckBox(lang("Auto display this box")); var temp = localStorage.ta_sim_autoDisplayStats; if (temp) { temp = JSON.parse(localStorage.ta_sim_autoDisplayStats); this.options.autoDisplayStats.setValue(temp); } else { this.options.autoDisplayStats.setValue(true); } this.options.autoDisplayStats.addListener("click", this.optionPopup, this); pssVBox.add(this.options.autoDisplayStats, { row: 1, column: 0, colSpan: 3 }); // showShift Checkbox this.options.showShift = new qx.ui.form.CheckBox(lang("Show shift buttons")); var temp = localStorage.ta_sim_showShift; if (temp) { temp = JSON.parse(localStorage.ta_sim_showShift); this.options.showShift.setValue(temp); } else { this.options.showShift.setValue(true); } this.options.showShift.addListener("click", this.optionShowShift, this); pssVBox.add(this.options.showShift, { row: 3, column: 0, colSpan: 3 }); // side RadioButtons this.options.sideLabel = new qx.ui.basic.Label(lang("Side:")); this.options.leftSide = new qx.ui.form.RadioButton(lang("Left")); this.options.rightSide = new qx.ui.form.RadioButton(lang("Right")); var sideRadioGroup = new qx.ui.form.RadioGroup(); sideRadioGroup.add(this.options.leftSide, this.options.rightSide); var temp = localStorage.ta_sim_side; if (temp) { temp = JSON.parse(localStorage.ta_sim_side); this.options.rightSide.setValue(temp); } else { this.options.rightSide.setValue(true); } sideRadioGroup.addListener("changeSelection", this.setupInterface, this); pssVBox.add(this.options.sideLabel, { row: 4, column: 0 }); pssVBox.add(this.options.leftSide, { row: 4, column: 1 }); pssVBox.add(this.options.rightSide, { row: 4, column: 2 }); // locks Checkboxes this.options.locksLabel = new qx.ui.basic.Label(lang("Locks:")); this.options.attackLock = new qx.ui.form.CheckBox(lang("Attack")); var temp = localStorage.ta_sim_attackLock; if (temp) { temp = JSON.parse(localStorage.ta_sim_attackLock); this.options.attackLock.setValue(temp); } else { this.options.attackLock.setValue(true); } this.options.repairLock = new qx.ui.form.CheckBox(lang("Repair")); var temp = localStorage.ta_sim_repairLock; if (temp) { temp = JSON.parse(localStorage.ta_sim_repairLock); this.options.repairLock.setValue(temp); } else { this.options.repairLock.setValue(true); } this.options.attackLock.addListener("click", this.optionAttackLock, this); this.options.repairLock.addListener("click", this.optionRepairLock, this); pssVBox.add(this.options.locksLabel, { row: 5, column: 0 }); pssVBox.add(this.options.attackLock, { row: 5, column: 1 }); pssVBox.add(this.options.repairLock, { row: 5, column: 2 });*/ this.battleResultsBox.add(tabView); } catch (e) { console.log(e); } }, initializeOptions : function () { try { var options = new qx.ui.container.Composite(); //hello options.setLayout(new qx.ui.layout.VBox(1)); //hey options.setThemedPadding(10); options.setThemedBackgroundColor("#eef"); this.optionsWindow.add(options); // Options Page var pssVBox = new qx.ui.container.Composite(); var layout = new qx.ui.layout.Grid(5, 5); layout.setColumnFlex(2, 1); pssVBox.setLayout(layout); pssVBox.setThemedFont("bold"); pssVBox.setThemedBackgroundColor("#eef"); options.add(pssVBox); pssVBox.add(new qx.ui.basic.Label(lang("Version: ") + window.TACS_version), { row : 0, column : 0, colSpan : 3 }); // Popup Checkbox this.options.autoDisplayStats = new qx.ui.form.CheckBox(lang("Auto display stats")); var temp = localStorage.ta_sim_popup; if (temp) { temp = JSON.parse(localStorage.ta_sim_popup); this.options.autoDisplayStats.setValue(temp); } else { this.options.autoDisplayStats.setValue(true); } this.options.autoDisplayStats.addListener("click", this.optionPopup, this); pssVBox.add(this.options.autoDisplayStats, { row : 1, column : 0, colSpan : 3 }); // Mark Saved Targets Checkbox this.options.markSavedTargets = new qx.ui.form.CheckBox(lang("Mark saved targets on region map")); var temp = localStorage.ta_sim_marksavedtargets; if (temp) { temp = JSON.parse(localStorage.ta_sim_marksavedtargets); this.options.markSavedTargets.setValue(temp); } else { this.options.markSavedTargets.setValue(true); } this.options.markSavedTargets.addListener("click", function () { localStorage.ta_sim_marksavedtargets = JSON.stringify(this.options.markSavedTargets.getValue()); }, this); pssVBox.add(this.options.markSavedTargets, { row : 2, column : 0, colSpan : 3 }); // Double-click to (De)activate Checkbox this.options.dblClick2DeActivate = new qx.ui.form.CheckBox(lang("Enable 'Double-click to (De)activate units'")); var temp = localStorage.ta_sim_dblClick2DeActivate; if (temp) { temp = JSON.parse(localStorage.ta_sim_dblClick2DeActivate); this.options.dblClick2DeActivate.setValue(temp); } else { this.options.dblClick2DeActivate.setValue(true); } this.options.dblClick2DeActivate.addListener("click", function () { localStorage.ta_sim_dblClick2DeActivate = JSON.stringify(this.options.dblClick2DeActivate.getValue()); }, this); pssVBox.add(this.options.dblClick2DeActivate, { row : 3, column : 0, colSpan : 3 }); // showShift Checkbox this.options.showShift = new qx.ui.form.CheckBox(lang("Show shift buttons")); var temp = localStorage.ta_sim_showShift; if (temp) { temp = JSON.parse(localStorage.ta_sim_showShift); this.options.showShift.setValue(temp); } else { this.options.showShift.setValue(true); } this.options.showShift.addListener("click", this.optionShowShift, this); pssVBox.add(this.options.showShift, { row : 4, column : 0, colSpan : 3 }); // side RadioButtons this.options.sideLabel = new qx.ui.basic.Label(lang("Side:")); this.options.leftSide = new qx.ui.form.RadioButton(lang("Left")); this.options.rightSide = new qx.ui.form.RadioButton(lang("Right")); var sideRadioGroup = new qx.ui.form.RadioGroup(); sideRadioGroup.add(this.options.leftSide, this.options.rightSide); var temp = localStorage.ta_sim_side; if (temp) { temp = JSON.parse(localStorage.ta_sim_side); this.options.rightSide.setValue(temp); } else { this.options.rightSide.setValue(true); } sideRadioGroup.addListener("changeSelection", this.setupInterface, this); pssVBox.add(this.options.sideLabel, { row : 5, column : 0 }); pssVBox.add(this.options.leftSide, { row : 5, column : 1 }); pssVBox.add(this.options.rightSide, { row : 5, column : 2 }); // locks Checkboxes this.options.locksLabel = new qx.ui.basic.Label(lang("Locks:")); this.options.attackLock = new qx.ui.form.CheckBox(lang("Attack")); var temp = localStorage.ta_sim_attackLock; if (temp) { temp = JSON.parse(localStorage.ta_sim_attackLock); this.options.attackLock.setValue(temp); } else { this.options.attackLock.setValue(true); } this.options.repairLock = new qx.ui.form.CheckBox(lang("Repair")); var temp = localStorage.ta_sim_repairLock; if (temp) { temp = JSON.parse(localStorage.ta_sim_repairLock); this.options.repairLock.setValue(temp); } else { this.options.repairLock.setValue(true); } this.options.attackLock.addListener("click", this.optionAttackLock, this); this.options.repairLock.addListener("click", this.optionRepairLock, this); pssVBox.add(this.options.locksLabel, { row : 6, column : 0 }); pssVBox.add(this.options.attackLock, { row : 6, column : 1 }); pssVBox.add(this.options.repairLock, { row : 6, column : 2 }); // showLootSummary Checkbox this.options.showLootSummary = new qx.ui.form.CheckBox(lang("Show Loot Summary")); this.options.showLootSummary.saveLocation = "showLootSummary"; this.options.showLootSummary.setValue(this.saveObj.checkbox.showLootSummary); this.options.showLootSummary.addListener("click", this.toggleCheckboxOption, this); pssVBox.add(this.options.showLootSummary, { row : 7, column : 0, colSpan : 3 }); // showResourceLayoutWindow Checkbox this.options.showResourceLayoutWindow = new qx.ui.form.CheckBox(lang("Show Resource Layout Window")); this.options.showResourceLayoutWindow.saveLocation = "showResourceLayoutWindow"; this.options.showResourceLayoutWindow.setValue(this.saveObj.checkbox.showResourceLayoutWindow); this.options.showResourceLayoutWindow.addListener("click", this.toggleCheckboxOption, this); pssVBox.add(this.options.showResourceLayoutWindow, { row : 8, column : 0, colSpan : 3 }); // showStatsDuringAttack Checkbox this.options.showStatsDuringAttack = new qx.ui.form.CheckBox(lang("Show Stats During Attack")); this.options.showStatsDuringAttack.saveLocation = "showStatsDuringAttack"; this.options.showStatsDuringAttack.setValue(this.saveObj.checkbox.showStatsDuringAttack); this.options.showStatsDuringAttack.addListener("click", this.toggleCheckboxOption, this); pssVBox.add(this.options.showStatsDuringAttack, { row : 9, column : 0, colSpan : 3 }); // showStatsDuringSimulation Checkbox this.options.showStatsDuringSimulation = new qx.ui.form.CheckBox(lang("Show Stats During Simulation")); this.options.showStatsDuringSimulation.saveLocation = "showStatsDuringSimulation"; this.options.showStatsDuringSimulation.setValue(this.saveObj.checkbox.showStatsDuringSimulation); this.options.showStatsDuringSimulation.addListener("click", this.toggleCheckboxOption, this); pssVBox.add(this.options.showStatsDuringSimulation, { row : 10, column : 0, colSpan : 3 }); // skipVictoryPopup Checkbox this.options.skipVictoryPopup = new qx.ui.form.CheckBox(lang("Skip Victory-Popup After Battle")); this.options.skipVictoryPopup.saveLocation = "skipVictoryPopup"; this.options.skipVictoryPopup.setValue(this.saveObj.checkbox.skipVictoryPopup); this.options.skipVictoryPopup.addListener("click", this.toggleCheckboxOption, this); pssVBox.add(this.options.skipVictoryPopup, { row : 11, column : 0, colSpan : 3 }); webfrontend.gui.reports.CombatVictoryPopup.getInstance().addListener("appear", function () { /*if (this.toolBar.isVisible()) { this.toolBar.hide(); } if (this.toolBarMouse.isVisible()) { this.toolBarMouse.hide(); }*/ if (this.saveObj.checkbox.skipVictoryPopup) { webfrontend.gui.reports.CombatVictoryPopup.getInstance()._onBtnClose(); } }, this); // disableTooltipsInAttackPreparationView Checkbox this.options.disableAttackPreparationTooltips = new qx.ui.form.CheckBox(lang("Disable Tooltips In Attack Preparation View")); this.options.disableAttackPreparationTooltips.saveLocation = "disableAttackPreparationTooltips"; this.options.disableAttackPreparationTooltips.setValue(this.saveObj.checkbox.disableAttackPreparationTooltips); this.options.disableAttackPreparationTooltips.addListener("click", this.toggleCheckboxOption, this); pssVBox.add(this.options.disableAttackPreparationTooltips, { row : 12, column : 0, colSpan : 3 }); // disableArmyFormationManagerTooltips Checkbox this.options.disableArmyFormationManagerTooltips = new qx.ui.form.CheckBox(lang("Disable Unit Tooltips In Army Formation Manager")); this.options.disableArmyFormationManagerTooltips.saveLocation = "disableArmyFormationManagerTooltips"; this.options.disableArmyFormationManagerTooltips.setValue(this.saveObj.checkbox.disableArmyFormationManagerTooltips); this.options.disableArmyFormationManagerTooltips.addListener("click", this.toggleCheckboxOption, this); pssVBox.add(this.options.disableArmyFormationManagerTooltips, { row : 13, column : 0, colSpan : 3 }); this.options.statsOpacityLabel = new qx.ui.basic.Label(lang("Stats Window Opacity")); this.options.statsOpacityLabel.setMarginTop(10); pssVBox.add(this.options.statsOpacityLabel, { row : 14, column : 0, colSpan : 3 }); this.options.statsOpacity = new qx.ui.form.Slider(); pssVBox.add(this.options.statsOpacity, { row : 15, column : 1, colSpan : 2 }); this.options.statsOpacity.setValue(this.saveObj.slider.statsOpacity); this.options.statsOpacityOutput = new qx.ui.basic.Label(String(this.saveObj.slider.statsOpacity)); pssVBox.add(this.options.statsOpacityOutput, { row : 16, column : 0 }); this.options.statsOpacity.addListener("changeValue", function () { var val = this.options.statsOpacity.getValue(); this.battleResultsBox.setOpacity(val/100); this.options.statsOpacityOutput.setValue(String(val)+"%"); this.saveObj.slider.statsOpacity = val; }, this); // The Help Vertical Box var pVBox = new qx.ui.container.Composite(); pVBox.setLayout(new qx.ui.layout.VBox(1)); pVBox.setThemedFont("bold"); pVBox.setThemedPadding(10); //pVBox.setThemedMargin(3); pVBox.setThemedBackgroundColor("#eef"); options.add(pVBox); var proHelpBar = new qx.ui.basic.Label().set({ value : "cncscripts.com", rich : true }); pVBox.add(proHelpBar); } catch (e) { console.log(e); } }, toggleCheckboxOption : function (evt) { var tgt = evt.getTarget(); var val = tgt.getValue(); this.saveObj.checkbox[tgt.saveLocation] = val; //console.log("this.saveObj.checkbox[\"" + tgt.saveLocation + "\"] = " + this.saveObj.checkbox[tgt.saveLocation]); //console.log("val = " + val); if (tgt == this.options.showLootSummary) { if (this.saveObj.checkbox.showLootSummary) { this.statsPage.add(this.resourceSummaryVerticalBox); } else { this.statsPage.remove(this.resourceSummaryVerticalBox); } } if (tgt == this.options.showResourceLayoutWindow) { if (this.saveObj.checkbox.showResourceLayoutWindow) { this.resourceLayoutWindow.open(); } else { this.resourceLayoutWindow.close(); } } this.saveData(); }, createHasAttackFormationFunction : function () { try { ClientLib.Data.City.prototype.HasAttackFormation = function (targetCity) { var $createHelper; var ownCity = this.get_Id(); if (TACS.getInstance().layouts.all.hasOwnProperty(targetCity)) { if (TACS.getInstance().layouts.all[targetCity].hasOwnProperty(ownCity)) { var count = 0; for (var key in TACS.getInstance().layouts.all[targetCity][ownCity]) { if (TACS.getInstance().layouts.all[targetCity][ownCity].hasOwnProperty(key)) { count++; } } if (count > 0) return true; } else { return false; } } } } catch (e) { console.log(e); } }, createBasePlateFunction : function (r) { try { var regionObject = r.prototype; for (var key in regionObject) { if (typeof regionObject[key] === 'function') { var strFunction = regionObject[key].toString(); if (strFunction.indexOf("Blue") > -1 && strFunction.indexOf("Black") > -1 ) { if (r == ClientLib.Vis.Region.RegionNPCCamp || r == ClientLib.Vis.Region.RegionNPCBase) { regionObject[key]=function () { var $createHelper; var basePlateColor = ClientLib.Vis.EBackgroundPlateColor.Black; if ((ClientLib.Data.MainData.GetInstance().get_Cities().get_CurrentOwnCity() != null) && ClientLib.Data.MainData.GetInstance().get_Cities().get_CurrentOwnCity().HasAttackFormation(this.get_Id())) { var playerFaction = ClientLib.Data.MainData.GetInstance().get_Player().get_Faction(); basePlateColor = ((this.get_PlayerFaction() == 1) ? ClientLib.Vis.EBackgroundPlateColor.Orange : ClientLib.Vis.EBackgroundPlateColor.Cyan); } return basePlateColor; } break; } else { regionObject[key]=function () { var $createHelper; var basePlateColor = ClientLib.Vis.EBackgroundPlateColor.Black; if (this.get_Type() == ClientLib.Vis.Region.RegionCity.ERegionCityType.Own) { basePlateColor = ((this.get_PlayerFaction() == 1) ? ClientLib.Vis.EBackgroundPlateColor.Cyan : ClientLib.Vis.EBackgroundPlateColor.Orange); } else { basePlateColor = ClientLib.Vis.EBackgroundPlateColor.Black; } if (((this.get_Type() != ClientLib.Vis.Region.RegionCity.ERegionCityType.Own) && (ClientLib.Data.MainData.GetInstance().get_Cities().get_CurrentOwnCity() != null)) && ClientLib.Data.MainData.GetInstance().get_Cities().get_CurrentOwnCity().HasAttackFormation(this.get_Id())) { basePlateColor = ((this.get_PlayerFaction() == 1) ? ClientLib.Vis.EBackgroundPlateColor.Orange : ClientLib.Vis.EBackgroundPlateColor.Cyan); } return basePlateColor; } break; } } } } } catch (e) { console.log(e); } }, initToolBarListeners : function () { try { var playAreaBounds = this._PlayArea.getLayoutParent().getBounds(); var playAreaWidth = this._PlayArea.getLayoutParent().getBounds().width; this._PlayArea.addListener("mouseover", function () { //this.toolBar.setOpacity(0); if (this.toolBar.isVisible()) { this.toolBarMouse.show(); this.toolBar.setLayoutProperties({ bottom : this.TOOL_BAR_LOW }); this.toolBar.setZIndex(1); } }, this); this._armyBarContainer.addListener("appear", function () { //console.log("_armyBarContainer appeared"); this._armyBarContainer.setZIndex(3); this.toolBar.show(); this.toolBarMouse.show(); }, this); this._armyBarContainer.addListener("changeVisibility", function () { if (!this._armyBarContainer.isVisible()) { //console.log("changeVisibility: _armyBarContainer hidden"); this.toolBar.hide(); this.toolBarMouse.hide(); } else { //console.log("changeVisibility: armybar is visible"); this.toolBar.show(); this.toolBarMouse.show(); } }, this); this.toolBarMouse.addListener("mouseover", function () { var paw = playAreaBounds.width; if (playAreaWidth !== paw) { playAreaWidth = paw; //need to do this on maximize as well var armyBarBounds = this._armyBarContainer.getBounds(); if (armyBarBounds){ this.toolBar.setDomLeft(armyBarBounds.left + ((armyBarBounds.width - this.TOOL_BAR_WIDTH)/2)); this.toolBarMouse.setDomLeft(armyBarBounds.left + ((armyBarBounds.width - this.TOOL_BAR_WIDTH)/2)); } } this.toolBarMouse.hide(); this.toolBar.setZIndex(11); this.toolBar.setLayoutProperties({ bottom : this.TOOL_BAR_HIGH }); }, this); this.toolBar.addListener("appear", function () { this.toolBar.setZIndex(1); }, this); this._armyBar.addListener("mouseover", function () { //this.toolBar.setOpacity(0); this.toolBarMouse.show(); this.toolBar.setZIndex(1); this.toolBar.setLayoutProperties({ bottom : this.TOOL_BAR_LOW }); }, this); this._armyBar.addListener("click", function () { this.armybarClickCount += 1; if (this.armybarClickCount == 1) { this.armybarClearnClickCounter = setInterval(this.resetDblClick, 500); } }, this); } catch(err){ console.log(err); } }, setupInterface : function () { try { ////////////////// Interface Side //////////////////// localStorage.ta_sim_side = JSON.stringify(this.options.rightSide.getValue()); // qx.core.Init.getApplication().getPlayArea() // might need to use this instead, mouseovers are not being registered during attacks var playArea = this._Application.getUIItem(ClientLib.Data.Missions.PATH.OVL_PLAYAREA); var playAreaWidth = this._Application.getUIItem(ClientLib.Data.Missions.PATH.OVL_PLAYAREA).getLayoutParent().getLayoutParent().getBounds().width; this.armybarClickCount = 0; var playerFaction = this._MainData.get_Player().get_Faction(); var statsIcon = "data:image/png;base64,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"; var undoIcon = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAzdJREFUeNq8ll2ITGEYx+edj901i2UNaaiVyFdK3PgohUJSyo3ykVsXeyFy7+NOElfkjpBy5Yoil5S4EclolfK5YwfL7JwzX8f/af5Hj9eZs2P3nD3165yZc877/N//857nfUwi5PA8T05GLo0xiTiO5DjBe8BaMIDfZsoEMHg32Akug00gNZUOSLD14CQYAu9BMw4B6YDZi9WrwGnQC56A161bf9Lg6Xcmsz7SAcHz4BTIge+gClaA5QxcBqO8Fn7hvTGcXVAXp/5HkLHyPhucAdvAGAV2B6RHjmGKk+c+gLfgKd0qiiAI8ToSwOAzwVFwGPxgzvUAnvXbv29IimI/g0fgNiiAWpgjvgB5eR+tL9PKoOA2TXXWgqZxnEvgrrjUTkRSnXO03Jtg8AaFO2CEv0+AI6CPLrcVUANXwXUwS+XZn1FSYRSJABH+ucy1sB8MyrhBIuxF2AeOgUOgRCEVDtYMcKeXC1dm/ZPP1pUbDcYQd2+BG/KMTkdaf8sQIYvvPBfTHg58H9zkqrfFT6eIzWALWMxZV5UI4RPYC16Bx7qope2CQhEXafdusJIDD+F+3aobJV6+AXfALnCA/5WUAIfjyb0C3iv6LvxTinlDPqULnL0UoNWg386hPEvqfEecOsfUZRi8Rke+ggUsaiZ0L2ABEdvOsrAsA9nQgtISLjN9CK6BebS6RiEVitwIutruBVoEDhFxnIvoy3gllimUkvwAbOf4dTpQowuLWPSKof0AB5QZvAPPcF3pqLa3REqge3StpigzPTk/nclOBpzAbifCn6sU+OvAUXtMZwImcVSt4FXumA47LRO6BiJqdhpW8Cq38mzcDhh+OQ4Du0pIimlIxOlAF+vHNxXcVRWy4pf0yB3g6s6z4Iyo4C7XQ4bOxJYCcXUDv/+yCu6oDW20bSmOYPZSbreym66o4C5TM0ZhsTggu+gOBhu2gksq5qr/oxWA2SfZzq8DLzlLx7J/DrfkRqQCaP18cBB8ZDvvWg7MkBaeW7cXtQOG3ZTMrB+sAUs5Y/9TXwJe6AX4V0sWUQqy7CnlMxwAC/lfhuKu2LuqiakO+I1sD3vGPHvGAoI39PO/BRgAhgJgQiBnZrUAAAAASUVORK5CYII="; var redoIcon = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAx9JREFUeNq8l8uPDFEUxvtWV8/o7hmPTCeeC4bJYIhHIhZYiNjZ2CEidlYWHrEwEyxn7x+wtbSxFqyJiEeEeGS0kU4YY3qobt3lO/HdOK6q6mrd5Sa/VLoe93zn3HPuPZ3LZTTCMDSg43teRsZ9XDaD1SLkvwvAKIFT4DqoJEUiKwFN8A5sB+fB0jgRXo+hdjEMeQM8BE/BCXAWlKNE+N0mFi55UABLwDAY4GO5N8LnOT6vglFwEnwBNzDHgjG/08Kk8ZKREmMbwU4wAVaBNfKKhBgsA21i5/0BAjoqeXEJ3JZ7VoRJ4bFMvgMcB7s5mUzccpbSOE7puQ0jJblxDtyHgHaiABiXUG4CZ8B+ehIog54ybK9RaBFFUAPHwKxEwU8wLnV8lWGuMdR5tcba+3ZCQmsRErUyGIxNQhiXibayfIbAR06Sj5nYJEQiR+F2Cb6CKUlOmwN+xJqvBRcZrk807DtrOcTnkvnv6ZlxRA3QW8OKmGc5PoLxVlwEilyfYRr3nVAv57274A54xYkbEdHZA06DbUy+C67xPwTQ+w1gnyQIQxcq4yvAGzANXjMhf2WyqmuWrZTkGPNInLoCHrjG3QjIi0fo0aIT9gpFXZaQY6Kww/myBexisk2y9htRL/tK9Up+NMM6t6PMj6eZPJ3OWBGwHoyDa+CW3njiIuDxAzG0oDLecN1vgud28+gwWsyRl+BJknEtwOem8wF8V/v7IH/fiwvhX0Vv5DwKq7rUkoavDo5KREbLDJ/lfprJlIjU71oBeWZ0nSWTU5tILa33/zJ8Z+0CJwHrjE4hKwGe8jSkp4G6LvI0LKZpMHsR0KTnniOizjIcS9M79CKgwUOnwKy3R+837vUHuFFlJqBFASUVgYBiZtgJjXZqsXvNgSrXu+VEYZ4cUvtDJgJmmQcF5b1dhhc81db1Oxk9tXHMsZevOEsQ8JnkwlFZpn6K8Jw/E4/ZgrWdZQjUH42D3bbzqQTwlHvGtmmEZVeioAl2xHW24/l+CTAR/eBecFhtvxL+t2xGava86Ga/70aA/WM5TsNz3A2bUd1PP8ZPAQYA6tkaX3nBq4MAAAAASUVORK5CYII="; var resetIcon = "data:image/png;base64,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"; switch (playerFaction) { case ClientLib.Base.EFactionType.GDIFaction: var iconFlipHorizontal = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAFTElEQVR4XtWVW28bRRTHz5nZ9Xrt2IlzKUlanJReiEhLpUpFPAQJBIUH4K1IXEQf+AZIfIE+9oXPgAChPlb0DVGFXlBBlFJoaakobVVCkxbiJI7ttdfeOfwnySo18UXIlRBnd+X1zP/8/mfO7tj0v4lvStKDtseYfVAiGxeCBt8Q8a5Hkj67JGkRYVyEe/2LwSWioNnMeZRx4so1vhLK0Km7xbdO3Fw6fnYpOvr+ye9e/uDzi4NnlqIdGJvC3PjVUNzPfrr66IzP/ylk47pI4tTc6psnbi3/cPmvslxalZPvfjz74dFPZnfj/hDGXsPcc9CMQ8txbrdQ3QQzI0xn7ghXyjRKrJ59aiA5dWAoRa6mEWau4zKOogTGGHN90OTKZUoix+b2XoCNTJ7U/EppplKrHx7w9BpViEwsEHsiMEfQDC+slHLZCbK63gs4VxGqBpR3tDs9PZDMu0p7QSTEQg34xhCxY5jT0PjQZoMK+cjtvQAlolbLwcFSJTjiOUosUta5EW2GyEYboCFox5CTVdJDAefLGy5GdpLwwcmsNzzqu5mFqgi3aK4ds3PQuNC6yBlAbipm/esCZtJMXwfiSGSmqtXakX7PcSuRkOKmZysPf7Nz0Ai0jJwx5PaBwWC1L6DT6o0x+XK5drg/6aZ3pt3MPaxQNbOEpKkAshpoE8jRyB0Bw+/UBdVu9ecC8VzhPVFkXnoy6w0CTA63fLObyFYDrezFY0DuMBhpsFS7Lqh2q1ck4w8Kq28orf3RpPYLoV09dzS3YTVWO5bUWuEEY1yxeO26oNqs3nci3stKP/3CY37+Rqnl6hmXMG2tymptDnJTYGScBveBqVt1QbVavato273F4juseMDX7IRGhLllC0Vo616zWpuDXAbDAWs7mIlWXVAPm9sKz1clFVWjfVrrna+O+buvFI1YDrWLNjM2x+aCkQbLMjNg2y5Yr60FxO3xFA09WCkf6XPV9lq0JmhvTiw4AGj7hrNlgJUEcxRsN/ZqKiCu6EJd/GKx9oyQmnx+JDnxa5m4w+LbGDc/CssAywczBXYOHk2eKq5oVoQSQsOlIHwxn3KmCnWK93wnfxZEpyZZBlgEZh/YQ/BIfIWUuAsqriRDlLi/WJlBy/ZP9bu5Qkga7G5L7NYiEgRYDGaiZigLj0F4cdwFZSs5EwhTSKPG0MHpfndfsaHcxrp15/6LqG41ItiywOTprJuBR7/UKAlPst6KEP1JUvOLpZnVavhKznPcSEgZibdepxCbz93eA8sCk8FmeIzMF0o5eK7Blf3PrlQo7ypnen8u+YSjdHqlLtQdvEZXpKxF12DLBNuBRwpeGXj61lu5ZHi5WDqwVCy/5zqarLVsPr8tV/xzO7e6QMaIE0WRvbdjHXNiLjwYXnl4ZuBNjkTAsdufz8jg4/gXu1sWSur2azIb7/z2vlGl+LpmxHhm1Nqzp7jjzlkKiSbSrrOYSVCRXRfeKEAMaUUVY/Q1T1FmV4al1QYXEaqbBtrowFL05T/uBJGIz4T7udvRrt0TtR0+SWjqktAuKVbUIthhotW6UZETrRXrOKwkCMKb399d+PTcbxpANoKTpPnXFmAuBMs84GVVKHWZm1vZI0LfGkO10xfnwt+Xq/MeJ6hQXZbh1CAldOIf6+D1A67LK8X05LahYHIkRSygHPvicvbSrfn9IiYkhDAsTfMLp5hZ44hMxICwh4epFF+AYAgML6xHYsDSrMTeIVr8d8oGT6m940P3j79+qM7UY7z90WlX4i2LE9a0vrvtZ1wEPuNvwsQs9OPte42fjx3t2bzH/C/pP4+/ARzr/zZI4lPKAAAAAElFTkSuQmCC"; var iconFlipVertical = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAEz0lEQVR4XsWX3W8U5RfHz3lmd2Z2drftdinQjRhKE02MV7SIhZYLSUyIMcZ45wVeatQ/4BfwlxiF+A8Yb8WXC68QiBFjIEYwigQiYFEoFVBCX3ZL931nd555zvFkQnphu11Td/VMJvMkm8l8crLn+/0ehDXqXIkxbhECKgBFPOFZDD2qNQHOl2hbzff3C4BWSHOZAe8axqG4SyH9OwBF8xo16h8YpsZik34eSLnHLQsvZwfcKy2G6h4bdW8Blun/kxl850HAXPB1I+8HQSHg722Fl/tT7lkvFZtuGqhNuRj0qAN0eKIfjtyoAmx1EUKikNno6VKwXCe4CGRubR3sO6kcmBGQ8j4XdVcBzhXDQ3v71dHpKgMCsKsQXQsgabG2kfmbRf8uI94Ephu5bPp4GIM7oYLCVAypSx3Qh/f0W0euC4CFCMwMDMC2gCAAbEtAyMz01YJ/ywKetxRcHMqkvtAIdycTON8FgFAA1ArAw4pApFg4UMnh8TTwckD++ULzLhhT8pz4l17K/pZR3Z5KqrnuAayula4kY4gjHsLtmi7PVIOlZissD6QTn7IFP9m2fXMyifPdAmgLEjLwsIu42UG4WgqWykHYKjSCxcE+7xNN5peBVOJqTEFhzEH6WwBf52uH929KCgCtAHQqYgbNwKOewoQFcL3SetDShv+o6dk+zzkFQFeGB7xLTR2UdqcdvS7Ah7dnDx3cPnp0NUDnMsxADDySVMhyXvB1pdQM+Z5vrsYVXEi59ulMyrk05mGtLcDpxcpbzw6l371WEQCEDZVhAAWRjsgZmMjo36pBuFAPvsumvbf7U/aFXR7ymgCn8oX/PT+06T3fMKBcLNdGixkgrkBuBJLzmXvlkOLuwcG089nudBuA1z+/8NFLUzseybpZKDZLvNkbjF6W6tQPbjNpFiPEhAPqmu+0CD4GwDP7Mm0AXj529jlLwQEEDAkgVIgEzAaiJ0YDiIgMUa10EVfuiAPVWgNHRM7EEzvef2PX9lmQagfwmGUBICtiBFaoonlDRGCIvg+IEXvEg5FiI0a/yTGCih6re0GG1eSTo3Ov7ny00RbgzZM/7nxx74iddbKw3CzBluQgELfrdscpiXjlRkvOtZD9gODevoxaagtwYiE//sKWoZxvmHvwJzQUd64cyCXm1hvDcRnDYRlD7uIYsowhyRgWN6W9mf2bneJ6QjT2yshobloAuiBEWoQIRIgq0oViyo3nRYjKIkRmPSkeFykeFiXkDUoxihS3RIpBpLguUrwIQGWR4rJIsRYp5k5mNC55YDVAZzNCMaOWmBGJGbXEjO5rMhUxo+ruBLZWUW8IoL0da7HjQOw4FDu+zxaUxI7rYscrH94YQOdAQhJIGmBMKIEkL4FkiVH5Ekia/ySSCUAsAmgTyYiZQSJZ3QJuWgpKEsnyGqExKa3uRigdk1Cak1DKfwmlZCODhNIGI9aBqSahdCGMQX3CxqCbsVw6AMO/VoEfxnJiNiyxPKgTlIFMTWL5onKhLhOmJZZzV2P5D2Uee7oPcrKYUMHXRhYTKgRcikurJV4tJdOxqh+CmXKRerKYHLs+/8xoJulqIpLVrCqr2bxlYVlWs0qLIZTVjHu6mp34vbLFcWLxyA+RmrKcVp5yUPdmO/6P609VRf8/TUkZ4wAAAABJRU5ErkJggg%3D%3D"; var iconRefresh = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAFfUlEQVR4Xu2Va2wUVRTHz9zZme6zpbQVSgxU21r64hUSUIkPFFPhCx/kFTEkkhYwNYX4ICFRoTFEKomhIajBICRNSgSifrBWHpaAChUhPFtqIVKUAm63y86+ZmfmzvXcnWWxBaoy+9Gb/DJ7956Z//+ee8+9AmSw1XZpIj5kxIm4EAcSRFTE2F4hs+ECjgwJ84lISDZSgIxF8lJGTiA3EQW5ywDJkLicEizLl4QXnxvt2Lx4rNTycqG0c4pPrAEALyIWVMyuwHiSQshUBkQkBymp9pJl1V5xGRHufJdZ5kh77ZIlotNZ2/F2/SfPNm39hi8LmkjYN2AJjBnvJLMn+8TlfCCo0f7j3b8NXLr4q6fwmTlHTzY3VRBJXpUzplAun1T93sU9LdkTFyzlJvwE7LcCpBRn/yrv9EfUa1t27o1917qbXDi0Xzm+bYt7sLdn/ahHSzwL65ZPWNNQV/rEtOrGKwfalgLAQ5kwMAGpzJWE8bzT0nZE0CJhoKp6XvL41gd6uqpyi0u7Zy94Kf78jCl5PGburOn5MyZXLASAYttl+OWf5kH+odGSUGSYptnddz2e7XGrntxR7e0DxjoeU+Uli3Ezbhou0BszP7Zt4LNrdFupm6waPnA6TNeej5i7eacm37ExGrxVo0RjzvIJhS4HIWRQZ1cA4LLtJegM0b0HzvSe+fvAV8fP/rzz/Y3lh9asmN/Z1Dhlw1vviJ+27At+e+JCiIvzmLYBYwfSSMB+u9x5puuLth9+GeCdg52nA9/v2esKXu4tzyurOK9Hw+ux/Kpkrw+Wzn2KJatEZ1fxcQHpu28ZzmrY+kokFn/XZOye40QQwOdxr8bOsaI5c1t+2tMS7Dl5ak332XNhdTCg5U2s3DDztYbY9cMHsksmPhadWf6IO1cWx3GBcxFzB98CiP++e+Dx+uZmg9LXix8eCyIR0meogBjUhJ6+a+B2OddVrlyx6fb5j4fMvEj/Hysll2t7zfbWw3guLMLybIJUMxkY5yJ0FxrYhd0eZHCkJUgwlG2smw9b3lgEH622aH5zEaxdNg9ww3MzGl4wJo9FFDzhWrH8VqB4K9fj4wyAGgwS1xPs1P6AsRbFPweAS0gIof94EiaoCQkDI00rBxRldWoOibFuuXSSuhCCRLAS2pFA6jbkzxuIH1EQnb83ogHG0DoKq5RBSh+owE0xPjbiq0gU6UeOIAYSTxnhWaP/5jpGFbRpchOQTDlLvkBAH1E8nRE9RXikWMcIsxe4gzhlIFGTG0hffSr2UxmwTdrA1NoPO4NKeOrtfr/fL1aWFMPur4+C5CDgcTuhZs4McDqz0kuAZM5AQtcLqkqKpKenlQH/bpYkgRdFCZjQdzOEBCGiUaAiTe4Jg1IQBCGYMQOMMeoQCZ5W0yGVbS4AWRjRceoqXOoPWKlH+LMwPw8CIaVhWt3mGr5chAhElqTOY1sbmh7UQHKd/RFrvbk4b7JMIKzqIACDmGECReI6hXEFeZCb7ZoUjcUn8YyFonEIhpTpAPBgBtBB8oQLaUa65DhZKK1Syk2lDagYQCmD+oUvQFlRLuBrUP9BKyjRuGZnCcBAkcEEHRIgA4GYbmUlblAwdAoqAgxjUe9GGE2Z1p5gGGPLAEWRIDcgDDUQRWF2x0A6IyGNgj9h/Tas0rRngM8ipNMhH5KYgBmwRPixTBENAezfQgMyN8D/t8rSfgYUfehMHGCCapjJDKi6AQ4igpYyxPcLiRupDFD7BpjJQIkl+O90GRIUi6MwRQxNTwKSAxivCkaAmAIwhJo2M2AyJuuJBBxp3Tc8xtpcKPB7ekxIbpOb+ztAlCQMADSm8UzID2wgx+vtCITCT95rFoKVjruNKeEhMTk+34//Uf9/4C/OeihXxgLfsQAAAABJRU5ErkJggg%3D%3D"; var leftBG = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFoAAACgCAMAAAC7f4tPAAABklBMVEUAAAD///8bfqbc3Nyhop/T09PZ2dnY2Njx8fHy8vLz8/Oen5t2d3XW1tZyc3C5ubnJycnLy8ugoZ6hoZ7X19bX19eKioiXmJTa2tqXmJXg4ODh4eHi4uLr6+ucnZmcnZqdnpr09PTR0dHS0tLV1dV0dXPj4+Pq6uqen52LjIrK09eMjIvOzs3Q0NC3t7e4uLiRko9qa2iWl5NtbmsbfqZ0dHK9vr3b29t2dnTf39/IyMifoJygoZ3CwsLo6Ojp6enDw8Pu7u7w8PCGh4OIiYewsLC0tLR1dnRnoblsbWqpqairq6irrKmsrKutrq2ur6xub22zs7OHiISHiIW4uLZub26Jioi5uri6urq7vLtvb22Ki4dvb27FxcVra2nIz9KNjoqOjouQkY5zc3HOzs7O1djPz8+Sk4+TlJCVlpNpamd0dXJubmyYmJaZmpeam5ibm5l1dnNqpbxubm2enptub2x4eXd6enh8fXuCgoGEhYKEhYOioqHt7e2io6Hv7++jo6OkpaKlpaOlpqOmp6Wnp6Um7BAdAAAAA3RSTlMAAH5Ny5jlAAACu0lEQVR4Xu3b1Y/bQBDA4Wtm1+wgM8MhMzOUmZmZmfH/rtc5K6kq9SGbac/qjnSv38NPymmccbr2oM3vtKC7nPGMdXRaaM/THuAZSZLYX9kBmrRnqwekDkyZQpyacUmyaEe+5MjcNFj0xEdGN2rcAO5p0ABxaz6/ZLQj80+DZjYcfsdoVoPJS+sDg+2Pz+cHp7VJ4X6O0awzkzf8k8npdieZTEERbDoepxRO6Ixu1Fg6EqiuaGq7o2kFJV0CgDLLYR7wzlr0jrwRSH9SeEbVlORNRgPI3a+Ozln0mP1JWfdXmcxlFzIli6YgR18cexRiNLAZmFxReEfLSIw2T05dHso36cGkxk/XGA2bUwkSDJEmPa1y0+qiTY8HCQkRDJoO6yR2W/9LtMI/Ng0VwsY9NGKQ/6a1aC1ai9Z3rSC3cFpfzJPYUB4lSOQQWmuQfxAdJwhA//MYFk37TtVxgrBZw6O9WEEoJl1BC/JHWrQWrfv2YtH9b58gfdDlXiNRR6EjUSOB9P96+14Caw8ZDZJYzG3LAnh1QnS3LWZ0lLirNT8t9mvRWrQWrQ281uH9aK1B/obVmj3dfSFINIQn6nhL8Coe7XXlfl35N0FEa9E6fBCrtdz7eg0niBw9ey6LQoejxhWkPcQwEijLgnMDQ6HFHiJ2PtFatBatRettJBr/BkaIG29gx7O75QYm9mvxLCNau/EGdm3VdTewbvac5LYb2HB+F+0hYucTrUVrzHeC3UNjBnF/a4x33cfJr1/G+TpAqws2vWm5wVALnSpwF1lO2UHMfaGR1pf/Z0DROO0P6YhNg/x15GquSUOxqhQ0jt9wqMtpU4KdG9h3Mhts0lBKZTK1xXantpCKSODQcCY710LDdSrxjMxkOwgUKbzRbbqT4+zXz3IItA0Ezj/GomcePMQKcuH9HSx6fv70T0KzcLgY6GqkAAAAAElFTkSuQmCC"; var rightBG = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAACgCAMAAACL85puAAAAn1BMVEX////c3Nzr6+vw8PDT09PFxcXp6enV1dWdnpro6Ojt7e2en5v29vb39/fq6uqhop+kpaOdnpvs7OyhoZ7g4ODOzs7Q0NDX19eam5ecnZq9vb3CwsK6urrGxsbv7+/Hx8fy8vKPkIyTlJC2tLGSk5DLy8ubnJiWl5TR0dGdnpwbfqafoJzZ2dna2trIyMj19fXd3d3e3t74+Pj5+fn6+voyWnv7AAAAAXRSTlMAQObYZgAAAR9JREFUeF7tmkduxTAMREnJvf/ea3qv9z9bYuQE0XyAXswDuJ3FA2XPgkJEHkFEQSRSjZDBAxQED7hCHTzgARhyqz3++7MOQ1a9A18d/T4MyVSj8ZsvnGv+cM2/kImqr7xL8kCk1enXsUjyUKTUae1dDgVU+wYIaM0DyssE0AEd0EGGO+Aqj9CAMxpwQgOuzQNOeAAdnM1XuVUFn7N5QKtKB8MLSFAHiYlELpJ9wajZE9mVl9YtjSWLDnrkzqCl8XswZAd0QAd0QAd0MLrIz5UdiQ7M6/6S/YD9YEAO6IAO6GDy8oGdUGTP79gRx2qxcNAZyVOapgVyyFJGv4yBU5puPj8c7l34MU83m+12wMgNiLyCSBzH6zUwst1stsj8AK74lmQgdGoWAAAAAElFTkSuQmCC"; break; case ClientLib.Base.EFactionType.NODFaction: var iconFlipHorizontal = "data:image/png;base64,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%3D"; var iconFlipVertical = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAFMElEQVR4XsWXXWwUZRfHz5nZ7213u91u2W26RRFfaoCgiSDbxpiYKIitcueFGKM3mhhD64WJ0Qgx75WxkBATjRdcCBdyIYlEJNF4gdrlI6AUiNBCtFK3Le2W3S3dnZl9nnnOe7ZbQJp2obDre+bZZDMXk9+cc+Z//gdhgaCxIwhKIAAf0glbtxDUKBYEyJ3bu8Kpw5MAKIkco75w01nQtQxGNql/BWDohx37w/FHXyJZtOT0lXOBYONB1N2nPeHIGRDyOrY8L2oKMHZi9/7ohp6XwRwnMztSsHIjRciPJEH3nK4LhH/U6+vPkyFmtLbuYk0ARo/t2hfbuH0bTJ0A8D8AyhbSlkoYqeQ1XWROWkq71Ngc/wZc+pA0VM65vEtUFSCV7PuyJdH7CqT7gVAj1H0IDh8oLSBI81Bh6MAwgj0oleNiQzR+EED9WRSuSXfbs6o6GejnDHT0bIN0EkBzABABXwzimQUm/ypJpFThwt5LipxjpLlOBiPRb0HZw9j64tj990By975oYvstgHLMgQAh6giIQKHHSRXGDfPy18NFW8t6vHXfef11R5n6D2zbOno/JfisJdHzJqSP3Q4AMA9GETqDCIHVIKfO5qzxX9OmVcgFg+H9iPCb7vQOYhtnZMklSO76PJbY/sY8gMVBVJHQ/yCCLw7F0aNpkU9bRjZ1NRSK7BO2/N0TCA+A1zWJoWfUXfZA3x7ugbfnAVQOshlEEAbXIDjrwEr1TwnLIuva4GV/XcMhBXjG1xw/BcLIYqxL3KEEn+xs2di7A6bKAEsKJculCaxGJgIrOzxdnEmTnb04AJr7uM/fcMTV1HgKw5tnFgfo7/u0paPnLZj8GQArAVTOCKAG4F/OfyVJYQtzckAamSu/1DdGdnqDDcdxWTct1gPvxxK9/wW7UCZChHsOUgCaCwCdAKBg6vxXps8pX/OGIgdw2ZaFAQa///DdSHztKiVFOyJeI6ViCFB+AmDpENwKJJq9hYu1Oc4FoE65iWGtMRx5rz4SO4zRzQsDHNrV1e30eLodqBEBSNRKnKjKPyBAPogAxIeonCKkOQbCf/bXPFSwTNO9sn3dx+2bPrq0aA8c3rN1ldvrAx21Ej6V4G++eYkZae4eAdGNGtHshbcSgTRHgEQ3y2gaBj78yLqRh57+YLa+i5VgZaR1jV/Zog5QK4Kt3ICkISAt1BM0R1F+XYTb3lwr39G0ErgO2YlhDIcjFwJrX5+oIER9a2OJd1ZwE6oaNKHkJhzwtb86WukzXN/S0RuFyZ+oap+htMmcGFBG5q9MoHHZkPc/2zKVhGgdj+M2VkKqghAJFiJgIZpmIcqwEE2wEOVYiOxKUrw+VspAOkn3KMVopZKWsExgKc6zFF9VgDmW4hwIQ7AU052G0ROxRE+EAZY6jLCYOmqJQlrxMLJCjZGUkHKah1HJR1pLGccbuATNDLCEcXxOWOOnizyOJY/jFCJkeRzneRxb92JIOtmQhO7SkCg2JAU2JJINyYS3rj4NhAYbEvN+LFknj+NQBUumiBSwJcsrcpqku7LBpugEKFXA1hesapjSTi5BaAFTqkjzAJvSAoKdl8ox0xBtHQegPDdWsZq2vDO2kTMwdfyGLVe2VMS2vKiLbM5SOMO2/Cq49LxtKOFY3kXVXkw6eDEJgzmmzOzfNi8miheTLOieLC8maV5MrpMhbF5MVK1Ws6ea4o/5lbQUr2bXA8HwGOquHK9m0yCk5E+KarqaZc580ex2O1ygkAgcJi+n0xh9TtRmO/4/x/8AHKjlP9O9djoAAAAASUVORK5CYII%3D"; var iconRefresh = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAFmklEQVR4Xu2VfWxT5QLGn3P6tbasU9nGAO+GczjQOUaAuyioSPxjSC6BmAiEixjMEEz4UiJxfs2PoJL9gyFeVDJGgID4gd443R8oRByyTRBwiDg23YAxVrvSru1pT895j4+n/WMyGHHtnz7Lr+3es/M+z/u8Z28lpFFG/WwLADvJIE5iJX4SJZo050sDV8maJmMJgI14SA7JIyOTQVrIZRIkgwLIaTK3Jw2L4c6ZjcI5NSip3IW7V9Qhb1oFgBHEMuku550MKyeR0tWAhWSRIuSULUVe+VJI8oB5DYaDPLO6cZHDKlU+UtO09eP15fUAogwRk5G67GQUssbNwuh7njDNI5e7zx7dd+rDujfa4W09/MzOH++026SVhaNcrvKyopc3159bBCCXZKQjQA4Zj9ypy0DF/R0Xt71XE3n3o4PyZ43nglW7j7nOXAhVj89zu9cu+U/Bs0+/MH7KtH+/uvtw53/BEOkIUEDugjMnH9QXn9ZJgYgGJS5aPW5rdWtXsKR4jPvMsrnTlfKZ80eCmvHQgmyGeBTA7RJSlPHLtgPgRHDmjoMWE+c7TigjMrOiN3tuakD7/qpER5MWYvS9b+Fq9bX+L/UAJze+g1tKVuJqXTqyAd6TewEw3vyN/uCVilB/IONfhWVOWB0ylN7fALSnvgUXDn/0c/MnJzFAx77a2byuZufEuZu+m/dU7YmylVUvW2q3v+s/3lgfMM0ptH1cS16Vkbraj7U07/v2wAe/g2o6tN9X+/9G59nu8MSSfE9rMKxVO21ySZbLiofnPW6AguLtAnCadFpxHb22pmhJNBx5SRgC15IsyXCOcK8F8PXi+wp2ba5v9h851bbuh9Md/b5QXL07P/OVjYunRD5s6fGUTrg9XFz6gAuuUWNAoff7WrAD4pVwHb2y6ra3dU1fNTa/AJJkAYxEeP4CITSc7+iAw5lR9WJF8ZsAHCSDh8ycC33RFU679f1D1dMPIW/qAuRO24SkYPDGnqYd8J7YAeAs6RtqC2KGMLBk+WZUrt6DyrW7Eqzei4WPvQ5dCDCMmvyCiZEgT7g9Mc14kuZ7AAhAUhlch9BiCHUdR8cnG2i+HcA5EiC6FTeQoUUBKICIJxuw01zFQCVDEFM/EZmE0NPSQHwAosRHeoiXBEmc4Y0hAxis3YjTXAsDEEhIMFSE14bOTcKkm3xDNKIkg6g01pGUdchJJEDoMUAoMHSdIxyS4wylYiglG4kn6ccQsg6xeskQoFkYRtSe2HPKIlkg2AqvIwUNDvBc5dimULB/MpLq7fFZ7phQiIYDdZBlG1wZbsyaMQ9Wp5ttRM0AJH0BNFXNKRxfZCuZNNNs3+50wOn0QBcy/L52+Ho7occC0CXNfAZ0XYckSf60BWCjuixbcf+DqwBJgAINOO7Eubb98F5qg87qhcSVqwqyc7MR8AfWPL/81grB7ZIhyTaHral6y6+bhhnAgBACQrtovtM8EcJwQIsFYQiZxmEwJ7R4BDl5eXC5biqNRCKlgEAkFELwSv9UAMMNANaqIR72AQOOX5stgwEU8yHU1RDt4wwSMc+X+QvXI3vkZAAatm5ZDKUrrIIafgOaBhHpveogcrD6UKIdGgvEE1thANFQLwxPJz/rHOO9HEwhAEwTXfEBA+YRNgdElAEYUGMADTY2EmUjBsf7oPd3m+0IoZlzpNSAxga0SB+MASuRbHYah01DXaUxNPNwoif0iB96iAENwXsIE6S2BToniV4ZOBHDWCHiUZoaiHPlNlgZVDXbiocZwCVB530Mn3oA/kBRgubn5L8h65aJAk3oUGlCGAJmS1Y9DEmRIJmHUuoN2KOqhtqGo7haggZCAmrPdyeCyeYrPvd5YbPKHABUVQe3yT7sAO5M98FQIDD9Wi3SHBYMVsj4699ketyNQAB/R//oD9nHCW2twSEjAAAAAElFTkSuQmCC"; var leftBG = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFoAAACgCAMAAAC7f4tPAAABj1BMVEX///+hop/p6el0dXOXmJSTlJBqa2jY2NihoZ6XmJV2d3XX19egoZ6dnprOzs3X19aIiYeKiojQ0NDr6+vq6uqen51sbWqnp6WRko+cnZl0dHKMjIuur6yLjIro6Oh2dnTIyMh1dnRtbmupqajCwsLu7u6enpuWl5OGh4OgoZ2EhYJ0dXKHiIWHiIR6eniSk49ub2yam5hpameJioiNjoqlpqOkpaK9vr25uritrq18fXtvb22Ki4d1dnOOjou4uLZzc3Fra2mrq6irrKnPz8/t7e2lpaOQkY6mp6W7vLvOzs6CgoFubm1vb26bm5mYmJaZmpfFxcWVlpO6urrc3NzZ2dnT09PV1dXa2trg4ODz8/PW1tbJycnLy8u0tLTi4uLSvbq5ubnDw8OwsLC3t7fb29vw8PDR0dHv7+/f39+uRDqvRTzj4+Px8fGcnZrh4eGsrKv09PSioqHTwL2mGxvW19by8vJyc3Czs7Ojo6KfoJxubmyEhYPOuri4uLjS0tK9vb2en5tub254eXdub21rpm98AAAAAXRSTlMAQObYZgAAAr9JREFUeF7s0MUOwzAURNF+5DxTEIrMzPDhjRtZztqx1E2vNNuzmNZv+rf2Wl0epWgSEelxA9TkYQryEGcQLBBENfkC8kSjpO9L+8YKjatoQJQdXj5loKK1jffZvKHlvGhf3cuyEObrgOE0NT9rOQ47cuCalDP08KWFYAzPh30j30fjrtq6ptRiktwAcH3HZr47WjmOkv6nffPsbRoKozBva+oRO6NJS5OSpIWWTubee+/xxqgOqCBGQaobpUKOxIdW/udwrUgOX/jA7UGxeM8PeBQ90rWOc65DnURBuHZHoZnN+rGjS+oMJifl49tNRdZid8u7v9A+m6UTqycthWaVT5+/hLoJyi2Fbp9unpnyUvTOWqCPrig0zzZtci1K0d8ibXQ0kqBrLpFFCLQ/FpOxP/5H6FA/CZpHSSU7aKCQ/8a1uBbX4vpUTMZxjOubHhlTHkRI7iDMNZsHKMYIYR4/YqDQfv7CBEaIShGH7qGE+Ej0KEzIH9HiWlznD6PQ48tXQQfdnHZszOMpV3Js0PN6csVG9ZBDLhlG1soC92KiGFbMYK4J63r40NKvxbW4FtcOznXhNsw1m2dRrtXb3TkCoblwfgJXghfh1R3fr/FovBBxLa4LF1GuzelLRYwQs3T5ShWCLpSca6Ae4jg2oCykGxgELT1EOp+4FtfiWlxPgtD4DYwoixvY9eqwbGDSr+VdRlxncQO7sZi5Dazu2ERZ28DGvCHqIdL5xLW4Rt4Jzg4aKST7rhF33Wv0+4X0D3uAjhoJetYicq0BdKerbWS+kwhp37IWBi//z3AYaLLvruf6G9i9hftbKZo3NsNuoPENRzS/3m5xfwN7QD/cFM27nXK5MvK3qTQ66jf30fywujSA5kd+SyemIidCeMPnx3GC3tP0+/WTLQCaVd49fYZCzzx/gRLycvsVCj039/onvUF9K+HA7eQAAAAASUVORK5CYII%3D"; var rightBG = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAACgCAMAAACL85puAAAAolBMVEX////o6Ojg4ODLy8vIyMien5uhop/FxcXCwsLOzs66urrGxsa9vb2Sk5CPkIyTlJCdnpvV1dXHx8eWl5T5+fmkpaPQ0NCam5fX19fR0dHa2trZ2dnd3d3e3t6foJzc3Nzr6+vw8PDT09P29vbq6ur19fWmGxvp6ent7e339/ehoZ7y8vKdnpqlGxu2tLHv7++bnJj4+PicnZrs7Oydnpz6+voBl3AiAAAAAXRSTlMAQObYZgAAAS9JREFUeNrtmttuwjAQRDe0JNxDuPcCayehSSCUFtr//7US8QX1IBmhGcmvR+zBseZhhRE5fGARBSOpaoocHKBgcMAnOsIPDsAiX9rE/n5XbpFT81NstrdHt0h9AZy3tjQmv8bk/4rsVG1mTRE4RkJtzfZlETgD2tqqrAkgQHbMAUDoHXAdgQ7ogA7gEWr+jfgIYxQQo4ARChh6B4zoAB8h9n6VQ1X0c8YB8Ah0cH+AAnVQ8CJ5uUj+C0bFnsiuvEQBMQsGS9YtAFO4pfE94JtIB3RAB3TwWA7GKGDKjsSe2AC81/0l3wO+iXRAB3RwRw52r2tshaJ+e8eWOE6rlYHWSDZJkpTIIks7veQMrNLMF4vJ5MW4L/PMu91+HzjyBEaewUgURYMBcKTX6fSQ8wfrkQWdCN/EzwAAAABJRU5ErkJggg%3D%3D"; break; } if (this.toolBar) { this.toolBarParent.remove(this.toolBar); } if (this.repairInfo) { playArea.remove(this.repairInfo); } // Repair Time Infobox this.repairInfo = new qx.ui.container.Composite(); var layout = new qx.ui.layout.Grid(); layout.setColumnAlign(0, "right", "middle"); //layout.setColumnFlex(0, 1); //layout.setColumnWidth(1, 70); this.repairInfo.setLayout(layout); this.repairInfo.setThemedFont("bold"); this.repairInfo.set({ visibility : false }); //this.repairInfo.setThemedBackgroundColor("#eef"); // Available Repair Label this.repairInfo.add(new qx.ui.basic.Image("webfrontend/ui/icons/icn_repair_off_points.png"), { row : 0, column : 1 }); this.labels.repairinfos.available = new qx.ui.basic.Label("100").set({ textColor : "white" }); this.repairInfo.add(this.labels.repairinfos.available, { row : 0, column : 0 }); // Max Infantry Repaircharge Label this.repairInfo.add(new qx.ui.basic.Image("webfrontend/ui/icons/icon_res_repair_inf.png"), { row : 1, column : 1 }); this.labels.repairinfos.infantry = new qx.ui.basic.Label("100").set({ textColor : "white" }); this.repairInfo.add(this.labels.repairinfos.infantry, { row : 1, column : 0 }); // Max Vehicle Repaircharge Label this.repairInfo.add(new qx.ui.basic.Image("webfrontend/ui/icons/icon_res_repair_tnk.png"), { row : 2, column : 1 }); this.labels.repairinfos.vehicle = new qx.ui.basic.Label("100").set({ textColor : "white" }); this.repairInfo.add(this.labels.repairinfos.vehicle, { row : 2, column : 0 }); // Max Air Repaircharge Label this.repairInfo.add(new qx.ui.basic.Image("webfrontend/ui/icons/icon_res_repair_air.png"), { row : 3, column : 1 }); this.labels.repairinfos.aircraft = new qx.ui.basic.Label("100").set({ textColor : "white" }); this.repairInfo.add(this.labels.repairinfos.aircraft, { row : 3, column : 0 }); playArea.add(this.repairInfo, { bottom : 130, right : 3 }); // Toolbar this.toolBar = new qx.ui.container.Composite(); this.toolBar.setLayout(new qx.ui.layout.Canvas()); this.toolBar.setHeight(53); this.toolBar.setWidth(this.TOOL_BAR_WIDTH); this.toolBar.set({ decorator : new qx.ui.decoration.Decorator().set({ backgroundImage : "FactionUI/menues/victory_screen/bgr_victscr_header.png" }), visibility : false }); if (PerforceChangelist >= 441272) { // 15.4 patch this.toolBarParent = this._armyBar.getLayoutParent().getLayoutParent().getLayoutParent(); } else { //old this.toolBarParent = this._armyBar.getLayoutParent().getLayoutParent(); } this.toolBarParent.add(this.toolBar, { bottom : this.TOOL_BAR_HIGH, left : (playAreaWidth - this.TOOL_BAR_WIDTH) / 2, visibility : false }); // Toolbar Mouse Region this.toolBarMouse = new qx.ui.container.Composite(); this.toolBarMouse.setLayout(new qx.ui.layout.Canvas()); this.toolBarMouse.setHeight(25); this.toolBarMouse.setWidth(740); this.toolBarParent.add(this.toolBarMouse, { bottom : 155, left : (playAreaWidth - this.TOOL_BAR_WIDTH) / 2 }); this.toolBarMouse.hide(); this.toolBarMouse.setBackgroundColor("#FF0000"); this.toolBarMouse.setOpacity(0); this.toolBarMouse.setZIndex(10); this.initToolBarListeners(); /* // does the game init in combat mode? if (this._VisMain.get_Mode() === ClientLib.Vis.Mode.CombatSetup) { this.toolBar.show(); this.toolBarMouse.show(); //this.toolBar.setOpacity(0); this.toolBar.setLayoutProperties({ bottom : this.TOOL_BAR_LOW }); } */ // (De)activate All Button this.buttons.attack.activateAll = new qx.ui.form.ToggleButton("", "FactionUI/icons/icon_disable_unit_active.png"); this.buttons.attack.activateAll.set({ width : 44, height : 40, padding : 0, show : "icon", appearance : "button-text-small", toolTipText : ""+lang("Deactivate All")+"" }); this.buttons.attack.activateAll.addListener("changeValue", function () { var btnActivateAll = this.buttons.attack.activateAll; if (!btnActivateAll.getValue()) { btnActivateAll.setOpacity(1); btnActivateAll.setToolTipText(""+lang("Deactivate All")+""); } else { btnActivateAll.setOpacity(0.75); btnActivateAll.setToolTipText(""+lang("Activate All")+""); } }, this); this.buttons.attack.activateAll.addListener("execute", function () { var btnActivateAll = this.buttons.attack.activateAll; if (this.buttons.attack.activateInfantry.getValue() !== btnActivateAll.getValue()) { this.buttons.attack.activateInfantry.setValue(btnActivateAll.getValue()); } if (this.buttons.attack.activateVehicles.getValue() !== btnActivateAll.getValue()) { this.buttons.attack.activateVehicles.setValue(btnActivateAll.getValue()); } if (this.buttons.attack.activateAir.getValue() !== btnActivateAll.getValue()) { this.buttons.attack.activateAir.setValue(btnActivateAll.getValue()); } }, this); // (De)activate Infantry Button this.buttons.attack.activateInfantry = new qx.ui.form.ToggleButton("", "FactionUI/icons/icon_alliance_bonus_inf.png"); this.buttons.attack.activateInfantry.set({ width : 44, height : 40, appearance : "button-text-small", toolTipText : ""+lang("Deactivate Infantry")+"" }); this.buttons.attack.activateInfantry.addListener("changeValue", function () { var btnActivateInfantry = this.buttons.attack.activateInfantry; if (btnActivateInfantry.getValue() === this.buttons.attack.activateVehicles.getValue() && btnActivateInfantry.getValue() === this.buttons.attack.activateAir.getValue()) { this.buttons.attack.activateAll.setValue(btnActivateInfantry.getValue()); } this.activateUnits('infantry', !btnActivateInfantry.getValue()); if (!btnActivateInfantry.getValue()) { btnActivateInfantry.setOpacity(1); btnActivateInfantry.setToolTipText(""+lang("Deactivate Infantry")+""); } else { btnActivateInfantry.setOpacity(0.75); btnActivateInfantry.setToolTipText(""+lang("Activate Infantry")+""); } }, this); // (De)activate Vehicles Button this.buttons.attack.activateVehicles = new qx.ui.form.ToggleButton("", "FactionUI/icons/icon_alliance_bonus_tnk.png"); this.buttons.attack.activateVehicles.set({ width : 44, height : 40, appearance : "button-text-small", toolTipText : ""+lang("Deactivate Vehicles")+"" }); this.buttons.attack.activateVehicles.addListener("changeValue", function () { var btnActivateVehicles = this.buttons.attack.activateVehicles; if (btnActivateVehicles.getValue() === this.buttons.attack.activateInfantry.getValue() && btnActivateVehicles.getValue() === this.buttons.attack.activateAir.getValue()) { this.buttons.attack.activateAll.setValue(btnActivateVehicles.getValue()); } this.activateUnits('vehicles', !btnActivateVehicles.getValue()); if (!btnActivateVehicles.getValue()) { btnActivateVehicles.setOpacity(1); btnActivateVehicles.setToolTipText(""+lang("Deactivate Vehicles")+""); } else { btnActivateVehicles.setOpacity(0.75); btnActivateVehicles.setToolTipText(""+lang("Activate Vehicles")+""); } }, this); // (De)activate Air Button this.buttons.attack.activateAir = new qx.ui.form.ToggleButton("", "FactionUI/icons/icon_alliance_bonus_air.png"); this.buttons.attack.activateAir.set({ width : 44, height : 40, appearance : "button-text-small", toolTipText : ""+lang("Deactivate Air")+"" }); this.buttons.attack.activateAir.addListener("changeValue", function () { var btnActivateAir = this.buttons.attack.activateAir; if (btnActivateAir.getValue() === this.buttons.attack.activateInfantry.getValue() && btnActivateAir.getValue() === this.buttons.attack.activateVehicles.getValue()) { this.buttons.attack.activateAll.setValue(btnActivateAir.getValue()); } this.activateUnits('air', !btnActivateAir.getValue()); if (!btnActivateAir.getValue()) { btnActivateAir.setOpacity(1); btnActivateAir.setToolTipText(""+lang("Deactivate Air")+""); } else { btnActivateAir.setOpacity(0.75); btnActivateAir.setToolTipText(""+lang("Activate Air")+""); } }, this); // Reset Formation Button this.buttons.attack.formationReset = new qx.ui.form.Button("", resetIcon); this.buttons.attack.formationReset.set({ width : 44, height : 40, appearance : "button-text-small", toolTipText : ""+lang("Reset Formation")+"" }); this.buttons.attack.formationReset.addListener("click", this.resetFormation, this); // Flip Horizontal Button this.buttons.attack.flipHorizontal = new qx.ui.form.Button("", iconFlipHorizontal); this.buttons.attack.flipHorizontal.set({ width : 44, height : 40, padding : 0, show : "icon", appearance : "button-text-small", toolTipText : ""+lang("Flip Horizontal")+"" }); this.buttons.attack.flipHorizontal.addListener("click", function () { this.flipFormation('horizontal'); }, this); // Flip Vertical Button this.buttons.attack.flipVertical = new qx.ui.form.Button("", iconFlipVertical); this.buttons.attack.flipVertical.set({ width : 44, height : 40, padding : 0, show : "icon", appearance : "button-text-small", toolTipText : ""+lang("Flip Vertical")+"" }); this.buttons.attack.flipVertical.addListener("click", function () { this.flipFormation('vertical'); }, this); // Repair Mode Button this.buttons.attack.repairMode = new qx.ui.form.ToggleButton("", "FactionUI/icons/icon_mode_repair_active.png"); this.buttons.attack.repairMode.set({ width : 44, height : 40, padding : 0, show : "icon", appearance : "button-text-small", toolTipText : ""+lang("Activate Repair Mode")+"" }); this.buttons.attack.repairMode.addListener("execute", this.toggleRepairMode, this); this.buttons.attack.repairMode.addListener("changeValue", function () { var btnRepairMode = this.buttons.attack.repairMode; if (!btnRepairMode.getValue()) { btnRepairMode.setToolTipText(""+lang("Deactivate Repair Mode")+""); } else { btnRepairMode.setToolTipText(""+lang("Activate Repair Mode")+""); } }, this); // The new refresh button this.buttons.attack.toolbarRefreshStats = new qx.ui.form.Button("", iconRefresh); this.buttons.attack.toolbarRefreshStats.addListener("click", this.refreshStatistics, this); this.buttons.attack.toolbarRefreshStats.set({ width : 44, height : 40, padding : 0, show : "icon", appearance : "button-text-small", toolTipText : ""+lang("Refresh Stats")+"" }); // The new stats window button this.buttons.attack.toolbarShowStats = new qx.ui.form.Button("", statsIcon); this.buttons.attack.toolbarShowStats.addListener("click", this.toggleTools, this); this.buttons.attack.toolbarShowStats.set({ width : 44, height : 40, padding : 0, show : "icon", appearance : "button-text-small", toolTipText : ""+lang("Open Stats Window")+"" }); // Undo this.buttons.attack.toolbarUndo = new qx.ui.form.Button("", undoIcon); this.buttons.attack.toolbarUndo.addListener("click", function(){console.log("Undo");}, this); this.buttons.attack.toolbarUndo.set({ width : 44, height : 40, padding : 0, show : "icon", appearance : "button-text-small", enabled : false, toolTipText : ""+lang("Undo")+"" }); // Redo (if possible) this.buttons.attack.toolbarRedo = new qx.ui.form.Button("", redoIcon); this.buttons.attack.toolbarRedo.addListener("click", function(){console.log("Redo");}, this); this.buttons.attack.toolbarRedo.set({ width : 44, height : 40, padding : 0, show : "icon", appearance : "button-text-small", enabled : false, toolTipText : ""+lang("Redo")+"" }); // Options Button this.buttons.attack.options = new qx.ui.form.Button().set({ width : 44, height : 40, appearance : "button-text-small", icon : "FactionUI/icons/icon_forum_properties.png", toolTipText : ""+lang("Options")+"" }); this.buttons.attack.options.addListener("click", this.toggleOptionsWindow, this); this.toolBar.add(this.buttons.attack.flipVertical, { top : 10, left : 10 }); this.toolBar.add(this.buttons.attack.flipHorizontal, { top : 10, left : 60 }); this.toolBar.add(this.buttons.attack.activateAll, { top : 10, left : 130 }); this.toolBar.add(this.buttons.attack.activateInfantry, { top : 10, left : 180 }); this.toolBar.add(this.buttons.attack.activateVehicles, { top : 10, left : 230 }); this.toolBar.add(this.buttons.attack.activateAir, { top : 10, left : 280 }); this.toolBar.add(this.buttons.attack.toolbarRefreshStats, { top : 10, left : 349 }); // right bound buttons this.toolBar.add(this.buttons.attack.options, { top : 10, right : 10 }); this.toolBar.add(this.buttons.attack.repairMode, { top : 10, right : 60 }); this.toolBar.add(this.buttons.attack.toolbarShowStats, { top : 10, right : 110 }); this.toolBar.add(this.buttons.attack.toolbarRedo, { top : 10, right : 175 }); this.toolBar.add(this.buttons.attack.toolbarUndo, { top : 10, right : 225 }); this.toolBar.add(this.buttons.attack.formationReset, { top : 10, right : 275 }); if (this.userInterface) { this._armyBar.remove(this.userInterface); } if (this.options.rightSide.getValue()) { var canvasWidth = 64; var interfaceBG = rightBG; var buttonsLeftPosition = 5; var shiftRRightPos = 0; var shiftLRightPos = 30; var shiftURightPos = 15; var shiftDRightPos = 15; } else { var canvasWidth = 90; var interfaceBG = leftBG; var buttonsLeftPosition = 15; var shiftRRightPos = 16; var shiftLRightPos = 46; var shiftURightPos = 30; var shiftDRightPos = 30; } // Interface Canvas this.userInterface = new qx.ui.container.Composite(); this.userInterface.setLayout(new qx.ui.layout.Canvas()); this.userInterface.setHeight(160); this.userInterface.setWidth(canvasWidth); this.userInterface.set({ decorator : new qx.ui.decoration.Decorator().set({ backgroundImage : interfaceBG }) }); if (this.options.rightSide.getValue()) { this._armyBar.add(this.userInterface, { top : 0, right : 65 }); } else { this._armyBar.add(this.userInterface, { top : 0, left : 0 }); } // Simulate Button this.buttons.attack.simulate = new qx.ui.form.Button(); this.buttons.attack.simulate.set({ width : 58, height : 37, appearance : "button-baseviews", icon : "FactionUI/icons/icon_play.png", toolTipText : lang("Start Combat Simulation") }); this.buttons.attack.simulate.addListener("click", this.startSimulation, this); // Tools Button this.buttons.attack.tools = new qx.ui.form.Button(lang("Stats")); this.buttons.attack.tools.set({ width : 58, appearance : "button-text-small", toolTipText : lang("Open Simulator Tools") }); this.buttons.attack.tools.addListener("click", this.toggleTools, this); //Shift Buttons this.buttons.shiftFormationLeft = new qx.ui.form.Button("<"); this.buttons.shiftFormationLeft.set({ width : 30, appearance : "button-text-small", toolTipText : lang("Shift units left") }); this.buttons.shiftFormationLeft.addListener("click", function () { this.shiftFormation('l'); }, this); this.buttons.shiftFormationRight = new qx.ui.form.Button(">"); this.buttons.shiftFormationRight.set({ width : 30, appearance : "button-text-small", toolTipText : lang("Shift units right") }); this.buttons.shiftFormationRight.addListener("click", function () { this.shiftFormation('r'); }, this); this.buttons.shiftFormationUp = new qx.ui.form.Button("^"); this.buttons.shiftFormationUp.set({ width : 30, appearance : "button-text-small", toolTipText : lang("Shift units up") }); this.buttons.shiftFormationUp.addListener("click", function () { this.shiftFormation('u'); }, this); this.buttons.shiftFormationDown = new qx.ui.form.Button("v"); this.buttons.shiftFormationDown.set({ width : 30, appearance : "button-text-small", toolTipText : lang("Shift units down") }); this.buttons.shiftFormationDown.addListener("click", function () { this.shiftFormation('d'); }, this); var temp = localStorage.ta_sim_showShift; if (temp) { temp = JSON.parse(localStorage.ta_sim_showShift); } else { temp = true; } if (temp) { this.userInterface.add(this.buttons.shiftFormationUp, { top : 16, right : shiftURightPos }); this.userInterface.add(this.buttons.shiftFormationLeft, { top : 35, right : shiftLRightPos }); this.userInterface.add(this.buttons.shiftFormationRight, { top : 35, right : shiftRRightPos }); this.userInterface.add(this.buttons.shiftFormationDown, { top : 54, right : shiftDRightPos }); } this.userInterface.add(this.buttons.attack.tools, { top : 82, left : buttonsLeftPosition }); this.userInterface.add(this.buttons.attack.simulate, { top : 108, left : buttonsLeftPosition }); } catch (e) { console.log(e); } }, getAttackUnits : function () { try { var base_city = this._MainData.get_Cities().get_CurrentOwnCity(); var target_city = this._MainData.get_Cities().get_CurrentCity(); if (target_city != null) { var target_city_id = target_city.get_Id(); var units = base_city.get_CityArmyFormationsManager().GetFormationByTargetBaseId(target_city_id); this.view.lastUnits = units; this.view.lastUnitList = units.get_ArmyUnits().l; } this.attackUnitsLoaded = true; } catch (e) { console.log(e); } }, optionPopup : function () { localStorage.ta_sim_popup = JSON.stringify(this.options.autoDisplayStats.getValue()); }, optionShowShift : function () { localStorage.ta_sim_showShift = JSON.stringify(this.options.showShift.getValue()); if (this.options.showShift.getValue()) { this.setupInterface(); } else { this.userInterface.remove(this.buttons.shiftFormationUp); this.userInterface.remove(this.buttons.shiftFormationLeft); this.userInterface.remove(this.buttons.shiftFormationRight); this.userInterface.remove(this.buttons.shiftFormationDown); } }, optionAttackLock : function () { try { localStorage.ta_sim_attackLock = JSON.stringify(this.options.attackLock.getValue()); if (this.options.attackLock.getValue()) { this._armyBar.add(this.buttons.attack.unlock, { top : 108, right : 9 }); } else { this._armyBar.remove(this.buttons.attack.unlock); } } catch (e) { console.log(e); } }, optionRepairLock : function () { try { localStorage.ta_sim_repairLock = JSON.stringify(this.options.repairLock.getValue()); if (this.options.repairLock.getValue()) { this._armyBar.add(this.buttons.attack.repair, { top : 16, right : 9 }); } else { this._armyBar.remove(this.buttons.attack.repair); } } catch (e) { console.log(e); } }, toggleTools : function () { this.battleResultsBox.isVisible() ? this.battleResultsBox.close() : this.battleResultsBox.open(); }, toggleOptionsWindow : function () { this.optionsWindow.isVisible() ? this.optionsWindow.close() : this.optionsWindow.open(); }, getAllUnitsDeactivated : function () { var f = this.getFormation(); var unitEnabled = false; for (var i = 0; i < f.length; i++){ if (f[i].e) { unitEnabled = true; break; } } //console.log(unitEnabled); if (unitEnabled) { return false; }else{ return true; } }, refreshStatistics : function () { try { var ownCity = this._MainData.get_Cities().get_CurrentOwnCity(); if (!this.getAllUnitsDeactivated() && ownCity.GetOffenseConditionInPercent() > 0) { this.timerStart(); ClientLib.API.Battleground.GetInstance().SimulateBattle(); this.buttons.attack.refreshStats.setEnabled(false); this.buttons.attack.toolbarRefreshStats.setEnabled(false); this.buttons.attack.simulate.setEnabled(false); this.labels.countDown.setWidth(110); this.count = 10; this.statsOnly = true; } } catch (e) { console.log(e); } }, countDownToNextSimulation : function () { try { var _this = window.TACS.getInstance(); _this.count = _this.count - 1; _this.labels.countDown.setWidth(_this.labels.countDown.getWidth() - 11); if (_this.count <= 0) { clearInterval(_this.counter); _this.buttons.attack.refreshStats.setEnabled(true); _this.buttons.attack.toolbarRefreshStats.setEnabled(true); if (_this.warningIcon) { _this._armyBar.remove(_this.simulationWarning); _this.warningIcon = false; } } } catch (e) { console.log(e); } }, formationChangeHandler : function () { try { var _this = this; if (this.labels.countDown.getWidth() != 0) { if (!_this.warningIcon) { // Simulation Warning _this.simulationWarning = new qx.ui.basic.Image("https://eaassets-a.akamaihd.net/cncalliancesgame/cdn/data/d75cf9c68c248256dfb416d8b7a86037.png"); _this.simulationWarning.set({ toolTipText : lang("Simulation will be based on most recently refreshed stats!") }); if (this.options.rightSide.getValue()) { this._armyBar.add(_this.simulationWarning, { top : 122, right : 67 }); } else { this._armyBar.add(_this.simulationWarning, { top : 122, left : 27 }); } _this.warningIcon = true; } } } catch (e) { console.log(e); } }, calculateLoot : function () { try { // Adapted from the CNC Loot script: // http://userscripts.org/scripts/show/135953 //var city = this._MainData.get_Cities().get_CurrentCity(); // not used var mod; var spoils = { 1 : 0, 2 : 0, 3 : 0, 6 : 0, 7 : 0 }; var loot = ClientLib.API.Battleground.GetInstance().GetLootFromCurrentCity(); for (var i in loot) { spoils[loot[i].Type] += loot[i].Count; } this.stats.spoils.tiberium.setLabel(this.formatNumberWithCommas(spoils[1])); this.stats.spoils.crystal.setLabel(this.formatNumberWithCommas(spoils[2])); this.stats.spoils.credit.setLabel(this.formatNumberWithCommas(spoils[3])); this.stats.spoils.research.setLabel(this.formatNumberWithCommas(spoils[6])); } catch (e) { console.log(e); } }, getRepairCost : function (unitStartHealth, unitEndHealth, unitMaxHealth, unitLevel, unitMDBID) { if (unitStartHealth != unitEndHealth) { if (unitEndHealth > 0) { var damageRatio = ((unitStartHealth - unitEndHealth) / 16) / unitMaxHealth; } else { var damageRatio = ((unitStartHealth / 16) / unitMaxHealth); } var repairCosts = ClientLib.API.Util.GetUnitRepairCosts(unitLevel, unitMDBID, damageRatio); // var crystal = 0; // crystal didn't use, only RT var repairTime = 0; for (var j = 0; j < repairCosts.length; j++) { var c = repairCosts[j]; var type = parseInt(c.Type); switch (type) { /*case ClientLib.Base.EResourceType.Crystal: // crystal ddidn't use, only RT crystal += c.Count; break;*/ case ClientLib.Base.EResourceType.RepairChargeBase: case ClientLib.Base.EResourceType.RepairChargeInf: case ClientLib.Base.EResourceType.RepairChargeVeh: case ClientLib.Base.EResourceType.RepairChargeAir: repairTime += c.Count; break; } } return repairTime; } return 0; }, setLabelColor : function (obj, val, dir) { var colors = ['green', 'blue', 'black', 'red']; var color = colors[0]; var v = val; if (dir >= 0) v = 100.0 - v; if (v > 99.99) color = colors[3]; else if (v > 50) color = colors[2]; else if (v > 0) color = colors[1]; obj.setTextColor(color); }, updateLabel100 : function (obj, val, dir) { this.setLabelColor(obj, val, dir); val = Math.ceil(val * 100) / 100; obj.setValue(val.toFixed(2).toString()); }, updateLabel100time : function (obj, val, dir, time) { var s = val.toFixed(2).toString() + " @ " + phe.cnc.Util.getTimespanString(time); this.setLabelColor(obj, val, dir); obj.setValue(s); }, updateStatsWindow : function () { var _this = this; var colors = ['black', 'blue', 'green', 'red']; var s = ""; var n = 0; if (this.stats.damage.structures.construction === 0) { s = lang("Total Victory"); n = 0; } else if (this.stats.damage.structures.overall < 100) { s = lang("Victory"); n = 1; } else { s = lang("Total Defeat"); n = 3; } this.labels.damage.outcome.setValue(s); this.labels.damage.outcome.setTextColor(colors[n]); this.updateLabel100(this.labels.damage.overall, this.stats.damage.overall, - 1); this.updateLabel100(this.labels.damage.units.overall, this.stats.damage.units.overall, - 1); this.updateLabel100(this.labels.damage.structures.overall, this.stats.damage.structures.overall, - 1); this.updateLabel100(this.labels.damage.structures.construction, this.stats.damage.structures.construction, - 1); this.updateLabel100(this.labels.damage.structures.defense, this.stats.damage.structures.defense, - 1); // Command Center if (this.view.playerCity) this.updateLabel100(this.labels.damage.structures.command, this.stats.damage.structures.command, - 1); else { this.labels.damage.structures.command.setValue("--"); this.labels.damage.structures.command.setTextColor("green"); } // SUPPORT var SLabel = (this.stats.supportLevel > 0) ? this.stats.supportLevel.toString() : '--'; this.labels.supportLevel.setValue(lang('Support lvl ') + SLabel + ': '); this.updateLabel100(this.labels.damage.structures.support, this.stats.damage.structures.support, - 1); // AVAILABLE RT this.labels.repair.available.setValue(phe.cnc.Util.getTimespanString(this.stats.repair.available)); // AVAILABLE ATTACKS this.labels.attacks.available.setValue('CP:' + this.stats.attacks.availableAttacksCP + ' / F:' + this.stats.attacks.availableAttacksAtFullStrength + '/ C:' + this.stats.attacks.availableAttacksWithCurrentRepairCharges); // OVERALL this.updateLabel100time(this.labels.health.overall, this.stats.health.overall, 1, this.stats.repair.overall); // INF this.updateLabel100time(this.labels.health.infantry, this.stats.health.infantry, 1, this.stats.repair.infantry); // VEH this.updateLabel100time(this.labels.health.vehicle, this.stats.health.vehicle, 1, this.stats.repair.vehicle); // AIR this.updateLabel100time(this.labels.health.aircraft, this.stats.health.aircraft, 1, this.stats.repair.aircraft); // BATTLE TIME setTimeout(function () { _this.stats.time = _this._VisMain.get_Battleground().get_BattleDuration() / 1000; _this.setLabelColor(_this.labels.time, _this.stats.time / 120.0, - 1); // max is 120s _this.labels.time.setValue(_this.stats.time.toFixed(2).toString()); }, 1); //this.saveUndoState(); }, formatNumberWithCommas : function (x) { return Math.floor(x).toString().replace(/\B(?=(\d{3})+(?!\d))/g, ","); }, /* Not used: formatSecondsAsTime: function (secs, format) { var hr = Math.floor(secs / 3600); var min = Math.floor((secs - (hr * 3600)) / 60); var sec = Math.floor(secs - (hr * 3600) - (min * 60)); if (hr < 10) hr = "0" + hr; if (min < 10) min = "0" + min; if (sec < 10) sec = "0" + sec; if (format !== null) { var formatted_time = format.replace('hh', hr); formatted_time = formatted_time.replace('h', hr * 1 + ""); formatted_time = formatted_time.replace('mm', min); formatted_time = formatted_time.replace('m', min * 1 + ""); formatted_time = formatted_time.replace('ss', sec); formatted_time = formatted_time.replace('s', sec * 1 + ""); return formatted_time; } else { return hr + ':' + min + ':' + sec; } }, */ unlockAttacks : function () { this._armyBar.remove(this.buttons.attack.unlock); var _this = this; setTimeout(function () { _this._armyBar.add(_this.buttons.attack.unlock); }, 2000); }, unlockRepairs : function () { this._armyBar.remove(this.buttons.attack.repair); var _this = this; setTimeout(function () { _this._armyBar.add(_this.buttons.attack.repair); }, 5000); }, /*calculateDefenseBonus : function (context, data) { try { var score = data.rpois[6].s; var rank = data.rpois[6].r; this.view.playerCityDefenseBonus = Math.round(ClientLib.Base.PointOfInterestTypes.GetTotalBonusByType(ClientLib.Base.EPOIType.DefenseBonus, rank, score)); } catch (e) { console.log(e); } },*/ hideAll : function () { if (this.buttons.attack.repairMode.getValue()) this.buttons.attack.repairMode.execute(); if (this.battleResultsBox.isVisible()) this.battleResultsBox.close(); if (this.resourceLayoutWindow.isVisible()) this.resourceLayoutWindow.close(); if (this.optionsWindow.isVisible()) this.optionsWindow.close(); /*if (this.toolBar.isVisible()) this.toolBar.hide(); if (this.toolBarMouse.isVisible()) this.toolBarMouse.hide();*/ }, gameOverlaysToFront : function () { webfrontend.gui.reports.ReportsOverlay.getInstance().setZIndex(20); webfrontend.gui.mail.MailOverlay.getInstance().setZIndex(20); //webfrontend.gui.mail.MailMessageOverlay.getInstance().setZIndex(20); webfrontend.gui.alliance.AllianceOverlay.getInstance().setZIndex(20); webfrontend.gui.forum.ForumOverlay.getInstance().setZIndex(20); webfrontend.gui.research.ResearchOverlay.getInstance().setZIndex(20); webfrontend.gui.monetization.ShopOverlay.getInstance().setZIndex(20); webfrontend.gui.ranking.RankingOverlay.getInstance().setZIndex(20); }, ownCityChangeHandler : function (oldId, newId) { console.log("CurrentOwnChange event"); if (this._armyBarContainer.isVisible()) { this.buttons.attack.refreshStats.setEnabled(false); this.buttons.attack.toolbarRefreshStats.setEnabled(false); this.buttons.attack.simulate.setEnabled(false); this.onCityLoadComplete(); this.resetDisableButtons(); } }, //onViewChange viewChangeHandler : function (oldMode, newMode) { //console.log("ViewModeChange event"); this.curViewMode = newMode; this.buttons.attack.simulate.setEnabled(false); this.buttons.attack.refreshStats.setEnabled(false); this.buttons.attack.toolbarRefreshStats.setEnabled(false); try { this.hideAll(); //this.getAvailableRepairAndCP(); switch (newMode) { /* case ClientLib.Vis.Mode.None: break; case ClientLib.Vis.Mode.City: //own base break; case ClientLib.Vis.Mode.Region: //the map break; */ case ClientLib.Vis.Mode.Battleground: // 3: while attacking or simming this.curPAVM = qx.core.Init.getApplication().getPlayArea().getViewMode(); this.onCityLoadComplete(); break; /* case ClientLib.Vis.Mode.ArmySetup: //in own base / add upgrade units break; case ClientLib.Vis.Mode.DefenseSetup: break; case ClientLib.Vis.Mode.World: //world button break; */ case ClientLib.Vis.Mode.CombatSetup: // 7: formation setup this.curPAVM = qx.core.Init.getApplication().getPlayArea().getViewMode(); this.onCityLoadComplete(); break; } //console.log("\nViewMode: " + ClientLib.Vis.VisMain.GetInstance().get_Mode() + "\n"); //console.log("curPAVM: " + this.curPAVM); } catch (e) { console.log(e); } }, resetDisableButtons : function () { try { if (this.buttons.attack.activateInfantry.getValue(true)) this.buttons.attack.activateInfantry.setValue(false); if (this.buttons.attack.activateVehicles.getValue(true)) this.buttons.attack.activateVehicles.setValue(false); if (this.buttons.attack.activateAir.getValue(true)) this.buttons.attack.activateAir.setValue(false); } catch (e) { console.log(e); } }, onCityLoadComplete : function () { try { var _this = this; //console.log("Running onCityLoadComplete..."); if (this._VisMain.GetActiveView().get_VisAreaComplete()) { /*setTimeout(function () { var cbtSetup = ClientLib.Vis.VisMain.GetInstance().get_CombatSetup(); // No longer needed. They've fixed the issue in-game. Leaving here just in case. cbtSetup.SetPosition(0, cbtSetup.get_MinYPosition() + cbtSetup.get_DefenseOffsetY() * cbtSetup.get_GridHeight()); //qx.core.Init.getApplication().getUIItem(ClientLib.Data.Missions.PATH.OVL_PLAYAREA).getLayoutParent().setZIndex(1); }, 500);*/ this.checkAttackRange(); if (this.curPAVM > 3) { this.showCombatTools(); var currentcity = this._MainData.get_Cities().get_CurrentCity(); if (currentcity != null) { var ownCity = this._MainData.get_Cities().get_CurrentOwnCity(); var cityFaction = currentcity.get_CityFaction(); this.stats.attacks.attackCost = ownCity.CalculateAttackCommandPointCostToCoord(currentcity.get_PosX(),currentcity.get_PosY()); this.getAvailableRepairAndCP(); this.calculateLoot(); this.updateLayoutsList(); this.getAttackUnits(); //if opened new city then reset disable buttons and calculate defense bonus if (this.targetCityId != null && this.targetCityId !== currentcity.get_Id()) { this.labels.repair.available.setValue(phe.cnc.Util.getTimespanString(this.stats.repair.available)); //this.labels.attacks.available.setValue('CP:' + Math.floor(this.stats.attacks.availableCP / this.stats.attacks.attackCost) + ' / F:' + Math.floor(this.stats.repair.available / this.stats.repair.max) + '/ C:-'); this.labels.attacks.available.setValue('CP:' + this.stats.attacks.availableAttacksCP + ' / F:' + this.stats.attacks.availableAttacksAtFullStrength + '/ C:-'); this.resetDisableButtons(); this.view.playerCity = cityFaction === ClientLib.Base.EFactionType.GDIFaction || cityFaction === ClientLib.Base.EFactionType.NODFaction; if (this.view.playerCity) { this.view.playerCityDefenseBonus = currentcity.get_AllianceDefenseBonus(); /*var cityAllianceId = currentcity.get_OwnerAllianceId(); ClientLib.Net.CommunicationManager.GetInstance().SendSimpleCommand("GetPublicAllianceInfo", { id : cityAllianceId }, phe.cnc.Util.createEventDelegate(ClientLib.Net.CommandResult, this, this.calculateDefenseBonus), null);*/ } } if (cityFaction >= 4 && cityFaction <= 6) this.createLayoutPreview(); this.targetCityId = currentcity.get_Id(); } } return; } setTimeout(function () { _this.onCityLoadComplete(); }, 200); } catch (e) { console.log(e); } }, createLayoutPreview : function () { try { var fileManager = ClientLib.File.FileManager.GetInstance(); var images = { 0 : fileManager.GetPhysicalPath('ui/menues/main_menu/misc_empty_pixel.png'), 1 : fileManager.GetPhysicalPath('ui/common/icn_res_chrystal.png'), 2 : fileManager.GetPhysicalPath('ui/common/icn_res_tiberium.png') } var currenLayout = this.getLayout(); var tibCount = currenLayout.match(/2/g).length; switch (this._MainData.get_Player().get_Faction()) { case ClientLib.Base.EFactionType.GDIFaction: var playerFaction = "G"; break; case ClientLib.Base.EFactionType.NODFaction: var playerFaction = "N"; break; } var cncOptURL = "http://cncopt.com/?map=2|" + playerFaction + "|" + playerFaction + "||" + this.encodeToCNCOpt(currenLayout) + "....................................|newEconomy"; var html = ''; for (var i = 0; i < 72; i++) { var row = Math.floor(i / 9); var column = i - Math.floor(i / 9) * 9; if (column == 0) html += ''; html += ''; if (column == 8) html += ''; } html += '
CNCOpt'; this.resourceLayout = new qx.ui.basic.Label().set({ backgroundColor : "#303030", value : html, padding : 10, rich : true }); if (tibCount == 7) { this.resourceLayout.setBackgroundColor("#202820"); } else if (tibCount == 5) { this.resourceLayout.setBackgroundColor("#202028"); } this.resourceLayoutWindow.removeAll(); this.resourceLayoutWindow.add(this.resourceLayout); } catch (e) { console.log(e); } }, getLayout : function () { try { var resourceLayout = ""; for (var y = 0; y < 16; y++) { for (var x = 0; x < 9; x++) { resourceLayout += this._MainData.get_Cities().get_CurrentCity().GetResourceType(x, y); } } return resourceLayout; } catch (e) { console.log(e); } }, encodeToCNCOpt : function (data) { try { var str = ".ct-jhlk"; for (var i = 0; i < 8; i++) { var re = new RegExp(i, 'g'); var char = str.charAt(i); data = data.replace(re, char); } return data; } catch (e) { console.log(e); } }, showCombatTools : function () { this.curPAVM = qx.core.Init.getApplication().getPlayArea().getViewMode(); //console.log("showCombatTools PAVM: " + this.curPAVM); switch (this.curPAVM) { //4 Scrolled up (when more than ~50% of the top is in view) this should never be the case case ClientLib.Data.PlayerAreaViewMode.pavmCombatSetupBase: { console.log("!!!\n TACS Warning\n!!!\n onCityLoadComplete, unexpected case pavmCombatSetupBase"); break; } //5 Scrolled down -- normal combat setup case ClientLib.Data.PlayerAreaViewMode.pavmCombatSetupDefense: { if (this.options.autoDisplayStats.getValue()) { this.battleResultsBox.open(); } if (this.options.showResourceLayoutWindow.getValue()) { this.resourceLayoutWindow.open(); } break; } //6 While attacking a target case ClientLib.Data.PlayerAreaViewMode.pavmCombatAttacker: { if (this.options.autoDisplayStats.getValue() && this.saveObj.checkbox.showStatsDuringAttack) { this.battleResultsBox.open(); /*if(this._armyBarContainer.isVisible()){ this.toolBar.show(); }*/ } break; } //8 case ClientLib.Data.PlayerAreaViewMode.pavmCombatViewerAttacker: { console.log("pavmCombatViewerAttacker"); break; } //9 case ClientLib.Data.PlayerAreaViewMode.pavmCombatViewerDefender: { console.log("pavmCombatViewerDefender"); break; } //10 Watching a "sim" OR replay case ClientLib.Data.PlayerAreaViewMode.pavmCombatReplay: { if (this.saveObj.checkbox.showStatsDuringSimulation) { console.log("simulation case 10"); this.battleResultsBox.open(); } break; } } }, getAvailableRepairAndCP : function () { try { var ownCity = this._MainData.get_Cities().get_CurrentOwnCity(); var offHealth = ownCity.GetOffenseConditionInPercent(); var unitData = ownCity.get_CityUnitsData(); //var availableInfRT = ownCity.GetResourceCount(ClientLib.Base.EResourceType.RepairChargeInf); //var availableVehRT = ownCity.GetResourceCount(ClientLib.Base.EResourceType.RepairChargeVeh); //var availableAirRT = ownCity.GetResourceCount(ClientLib.Base.EResourceType.RepairChargeAir); var maxInfRepairCharge = unitData.GetRepairTimeFromEUnitGroup(ClientLib.Data.EUnitGroup.Infantry, false); var maxVehRepairCharge = unitData.GetRepairTimeFromEUnitGroup(ClientLib.Data.EUnitGroup.Vehicle, false); var maxAirRepairCharge = unitData.GetRepairTimeFromEUnitGroup(ClientLib.Data.EUnitGroup.Aircraft, false); //this.stats.repair.available = this._MainData.get_Time().GetTimeSpan(Math.min(availableInfRT, availableAirRT, availableVehRT)); this.stats.repair.available = ClientLib.Base.Resource.GetResourceCount(ownCity.get_RepairOffenseResources().get_RepairChargeOffense()); this.stats.repair.max = this._MainData.get_Time().GetTimeSpan(Math.max(maxInfRepairCharge, maxAirRepairCharge, maxVehRepairCharge)); this.stats.attacks.availableCP = this._MainData.get_Player().GetCommandPointCount(); this.stats.attacks.availableAttacksCP = Math.floor(this.stats.attacks.availableCP / this.stats.attacks.attackCost); this.stats.attacks.availableAttacksAtFullStrength = Math.floor(this.stats.repair.available / this.stats.repair.max) + 1; this.stats.attacks.availableAttacksWithCurrentRepairCharges = Math.floor(this.stats.repair.available / this.stats.repair.overall) + 1; if (offHealth !== 100) { this.stats.attacks.availableAttacksAtFullStrength--; this.stats.attacks.availableAttacksAtFullStrength += '*'; } // Decrease number of attacks by 1 when unit unhealthy. Borrowed from Maelstrom Tools - by krisan } catch (e) { console.log(e); } }, returnSetup : function () { // Set the scene again, just in case it didn't work the first time try { this._Application.getPlayArea().setView(ClientLib.Data.PlayerAreaViewMode.pavmCombatSetupDefense, localStorage.ta_sim_last_city, 0, 0); } catch (e) { this._Application.getPlayArea().setView(ClientLib.Data.PlayerAreaViewMode.pavmCombatSetupDefense, localStorage.ta_sim_last_city, 0, 0); console.log(e); } }, checkAttackRange : function () { try { var cities = this._MainData.get_Cities(); var target_city = cities.get_CurrentCity(); if (target_city != null) { var base_city = cities.get_CurrentOwnCity(); var attackDistance = ClientLib.Base.Util.CalculateDistance(target_city.get_PosX(), target_city.get_PosY(), base_city.get_PosX(), base_city.get_PosY()); if (attackDistance <= 10) { //console.log("Target in range"); this.buttons.attack.simulate.setEnabled(true); if (this.count <= 0) { this.buttons.attack.refreshStats.setEnabled(true); this.buttons.attack.toolbarRefreshStats.setEnabled(true); } } else { //console.log("Target Out of range"); } } } catch (e) { console.log(e); } }, skipSimulation : function () { try { while (this._VisMain.get_Battleground().get_Simulation().DoStep(false)) {} this._VisMain.get_Battleground().set_ReplaySpeed(1); } catch (e) { console.log(e); } }, startSimulation : function () { try { if (PerforceChangelist >= 448942) { var simTimeLimit = 3000; } else { var simTimeLimit = 10000; } if (Date.now() - this.lastSimulation > simTimeLimit) { var ownCity = this._MainData.get_Cities().get_CurrentOwnCity(); if (!this.getAllUnitsDeactivated() && ownCity.GetOffenseConditionInPercent() > 0) { ClientLib.API.Battleground.GetInstance().SimulateBattle(); this.buttons.attack.refreshStats.setEnabled(false); this.buttons.attack.toolbarRefreshStats.setEnabled(false); this.buttons.attack.simulate.setEnabled(false); this.labels.countDown.setWidth(110); this.count = 10; this.statsOnly = false; } } else { this.enterSimulationView(); this._VisMain.get_Battleground().RestartReplay(); this._VisMain.get_Battleground().set_ReplaySpeed(1); } } catch (e) { console.log(e); } }, OnSimulateCombatReportEvent : function (data) { // console.log(data); this.timerEnd("OnSimulateCombatReportEvent"); try { // Resource Summary this.stats.resourcesummary.research = data.GetAttackerTotalResourceReceived(ClientLib.Base.EResourceType.ResearchPoints); this.stats.resourcesummary.credits = data.GetAttackerTotalResourceReceived(ClientLib.Base.EResourceType.Gold); this.stats.resourcesummary.crystal = data.GetAttackerTotalResourceReceived(ClientLib.Base.EResourceType.Crystal); this.stats.resourcesummary.tiberium = data.GetAttackerTotalResourceReceived(ClientLib.Base.EResourceType.Tiberium); this.labels.resourcesummary.research.setLabel(phe.cnc.gui.util.Numbers.formatNumbersCompact(this.stats.resourcesummary.research)); this.labels.resourcesummary.credits.setLabel(phe.cnc.gui.util.Numbers.formatNumbersCompact(this.stats.resourcesummary.credits)); this.labels.resourcesummary.crystal.setLabel(phe.cnc.gui.util.Numbers.formatNumbersCompact(this.stats.resourcesummary.crystal)); this.labels.resourcesummary.tiberium.setLabel(phe.cnc.gui.util.Numbers.formatNumbersCompact(this.stats.resourcesummary.tiberium)); } catch (e) { console.log('OnSimulateCombatReportEvent()', e); } }, onSimulateBattleFinishedEvent : function (data) { //console.log("data:"); //console.log(data); this.timerEnd("onSimulateBattleFinishedEvent"); try { if (!this.statsOnly) { this.enterSimulationView(); setTimeout(function () { ClientLib.Vis.VisMain.GetInstance().get_Battleground().set_ReplaySpeed(1); }, 1); } var total_hp = 0; var end_hp = 0; var e_total_hp = 0; var e_end_hp = 0; var eb_total_hp = 0; var eb_end_hp = 0; var eu_total_hp = 0; var eu_end_hp = 0; var i_end_hp = 0; var v_end_hp = 0; var a_end_hp = 0; var v_total_hp = 0; var a_total_hp = 0; var i_total_hp = 0; var costInf = 0; var costAir = 0; var costVeh = 0; this.stats.damage.structures.defense = 0; this.stats.damage.structures.construction = 0; this.stats.damage.structures.command = 0; this.stats.supportLevel = 0; this.stats.damage.structures.support = 0; this.stats.repair.infantry = 0; this.stats.repair.vehicle = 0; this.stats.repair.aircraft = 0; this.lastSimulation = Date.now(); if (PerforceChangelist >= 448942) { var countDownInterval = 300; } else { var countDownInterval = 1000; } if (this.count == 10) this.counter = setInterval(this.countDownToNextSimulation, countDownInterval); for (var i = 0; i < data.length; i++) { var unitData = data[i].Value; var unitMDBID = unitData.t; var unit = ClientLib.Res.ResMain.GetInstance().GetUnit_Obj(unitMDBID); var placementType = unit.pt; var movementType = unit.mt; var unitLevel = unitData.l; var unitStartHealth = unitData.sh; var unitEndHealth = unitData.h; var unitMaxHealth = ClientLib.API.Util.GetUnitMaxHealthByLevel(unitLevel, unit, false); switch (placementType) { case ClientLib.Base.EPlacementType.Defense: if (this.view.playerCity) { var defenseBonus = this.view.playerCityDefenseBonus; var nerfBoostModifier = ClientLib.Base.Util.GetNerfAndBoostModifier(unitLevel, defenseBonus); unitMaxHealth = Math.floor((unitMaxHealth * nerfBoostModifier) / 100 * 16) / 16; } eu_total_hp += unitMaxHealth; eu_end_hp += unitEndHealth; e_total_hp += unitMaxHealth; e_end_hp += unitEndHealth; break; case ClientLib.Base.EPlacementType.Offense: total_hp += unitMaxHealth; end_hp += unitEndHealth; switch (movementType) { case ClientLib.Base.EUnitMovementType.Feet: i_total_hp += unitMaxHealth; i_end_hp += unitEndHealth; costInf += this.getRepairCost(unitStartHealth, unitEndHealth, unitMaxHealth, unitLevel, unitMDBID); break; case ClientLib.Base.EUnitMovementType.Wheel: case ClientLib.Base.EUnitMovementType.Track: v_total_hp += unitMaxHealth; v_end_hp += unitEndHealth; costVeh += this.getRepairCost(unitStartHealth, unitEndHealth, unitMaxHealth, unitLevel, unitMDBID); break; case ClientLib.Base.EUnitMovementType.Air: case ClientLib.Base.EUnitMovementType.Air2: a_total_hp += unitMaxHealth; a_end_hp += unitEndHealth; costAir += this.getRepairCost(unitStartHealth, unitEndHealth, unitMaxHealth, unitLevel, unitMDBID); break; } break; case ClientLib.Base.EPlacementType.Structure: if (this.view.playerCity) { var defenseBonus = this.view.playerCityDefenseBonus; var nerfBoostModifier = ClientLib.Base.Util.GetNerfAndBoostModifier(unitLevel, defenseBonus); unitMaxHealth = Math.floor((unitMaxHealth * nerfBoostModifier) / 100 * 16) / 16; } eb_total_hp += unitMaxHealth; eb_end_hp += unitEndHealth; e_total_hp += unitMaxHealth; e_end_hp += unitEndHealth; break; } if (unitMDBID >= 200 && unitMDBID <= 205) { this.stats.supportLevel = unitLevel; this.stats.damage.structures.support = (unitEndHealth / 16 / unitMaxHealth) * 100; } else { switch (unitMDBID) { case 131: // GDI DF case 158: // NOD DF case 195: // Forgotten DF this.stats.damage.structures.defense = (unitStartHealth > 0) ? (unitEndHealth / 16 / unitMaxHealth) * 100 : 0; break; case 112: // GDI CY case 151: // NOD CY case 177: // Forgotten CY case 251: // Mutated Forgotten CY this.stats.damage.structures.construction = (unitEndHealth / 16 / unitMaxHealth) * 100; break; case 111: // GDI CC case 159: // NOD CC this.stats.damage.structures.command = (unitEndHealth / 16 / unitMaxHealth) * 100; break; } } } // Calculate Percentages this.stats.health.infantry = i_total_hp ? (i_end_hp / 16 / i_total_hp) * 100 : 100; this.stats.health.vehicle = v_total_hp ? (v_end_hp / 16 / v_total_hp) * 100 : 100; this.stats.health.aircraft = a_total_hp ? (a_end_hp / 16 / a_total_hp) * 100 : 100; this.stats.damage.units.overall = eu_total_hp ? (eu_end_hp / 16 / eu_total_hp) * 100 : 0; this.stats.damage.structures.overall = (eb_end_hp / 16 / eb_total_hp) * 100; this.stats.damage.overall = (e_end_hp / 16 / e_total_hp) * 100; this.stats.health.overall = end_hp ? (end_hp / 16 / total_hp) * 100 : 0; // Calculate the repair time var _this = this; this.stats.repair.infantry = _this._MainData.get_Time().GetTimeSpan(costInf); this.stats.repair.aircraft = _this._MainData.get_Time().GetTimeSpan(costAir); this.stats.repair.vehicle = _this._MainData.get_Time().GetTimeSpan(costVeh); this.stats.repair.overall = _this._MainData.get_Time().GetTimeSpan(Math.max(costInf, costAir, costVeh)); this.getAvailableRepairAndCP(); this.updateStatsWindow(); this.buttons.attack.simulate.setEnabled(true); } catch (e) { console.log('onSimulateBattleFinishedEvent()\n check getRepairCost()', e); } }, enterSimulationView : function () { try { var city = this._MainData.get_Cities().get_CurrentCity(); var ownCity = this._MainData.get_Cities().get_CurrentOwnCity(); ownCity.get_CityArmyFormationsManager().set_CurrentTargetBaseId(city.get_Id()); localStorage.ta_sim_last_city = city.get_Id(); this._Application.getPlayArea().setView(ClientLib.Data.PlayerAreaViewMode.pavmCombatReplay, city.get_Id(), 0, 0); } catch (e) { console.log(e); } }, //Undo / Redo saveUndoState : function () { var formation = this.getFormation(); var ts = this.getTimestamp(); var stats = this.badClone(this.stats); this.undoCache[0] = { f : formation, t : ts, s : stats }; console.log(this.undoCache[0]); /* f.d = { eb : 0, de : 0, bu : 0, cy : 0, df : 0, cc : 0, sl : 0, ovr : this.stats.health.overall, inf : this.stats.health.infantry, veh : this.stats.health.vehicle, air : this.stats.health.aircraft, ou : 0, bt : 0 }; */ }, wipeUndoStateAfter : function (timestamp) { var i; for (i = 0; i < this.undoCache.length; i++) { if (this.undoCache[i].t > timestamp){ break; } } this.undoCache = this.undoCache.slice(0,i); }, //Layouts updateLayoutsList : function () { try { this.layouts.list.removeAll(); // Load the saved layouts for this city this.loadCityLayouts(); if (this.layouts.current) { for (var i in this.layouts.current) { var layout = this.layouts.current[i]; var item = new qx.ui.form.ListItem(layout.label, null, layout.id); //item.addListener("cellDblclick", function (){},this) this.layouts.list.add(item); } } } catch (e) { console.log(e); } }, deleteCityLayout : function () { try { var list = this.layouts.list.getSelection(); if (list != null && list.length > 0) { var lid = list[0].getModel(); if (this.layouts.current && typeof this.layouts.current[lid] !== 'undefined') { delete this.layouts.current[lid]; this.saveLayouts(); this.updateLayoutsList(); } } } catch (e) { console.log(e); } }, loadCityLayout : function (lid) { try { var list = this.layouts.list.getSelection(); if (list != null && list.length > 0) { var layout = typeof lid === 'object' ? list[0].getModel() : lid; if (this.layouts.current && typeof this.layouts.current[layout] !== 'undefined') { //console.log("layout: "); //console.log(layout); //console.log(this.layouts.current[layout].layout); this.loadFormation(this.layouts.current[layout].layout); } } } catch (e) { console.log(e); } }, saveCityLayout : function () { var formation = [], lid, title; try { formation = this.getFormation(); lid = new Date().getTime().toString(); if (this.stats.damage.structures.construction !== null) { title = this.layouts.label.getValue() + " (" + this.stats.damage.structures.construction.toFixed(0).toString() + ":" + this.stats.damage.structures.defense.toFixed(0).toString() + ":" + this.stats.damage.units.overall.toFixed(0).toString() + ")"; } else { title = this.layouts.label.getValue() + " (??:??:??)"; } this.layouts.current[lid] = { id : lid, label : title, layout : formation }; this.saveLayouts(); this.updateLayoutsList(); this.layouts.label.setValue(""); } catch (e) { console.log(e); } return lid; // return value at the end }, loadCityLayouts : function () { try { if (this._MainData.get_Cities().get_CurrentCity() == null) return; var target_city = this._MainData.get_Cities().get_CurrentCity().get_Id(); var base_city = this._MainData.get_Cities().get_CurrentOwnCity().get_Id(); if (!this.layouts.all.hasOwnProperty(target_city)) this.layouts.all[target_city] = {}; if (!this.layouts.all[target_city].hasOwnProperty(base_city)) this.layouts.all[target_city][base_city] = {}; this.layouts.current = this.layouts.all[target_city][base_city]; } catch (e) { console.log(e); } }, loadLayouts : function () { try { var temp = localStorage.ta_sim_layouts; if (temp) this.layouts.all = JSON.parse(temp); else this.layouts.all = {}; } catch (e) { console.log(e); } }, saveLayouts : function () { try { localStorage.ta_sim_layouts = JSON.stringify(this.layouts.all); } catch (e) { console.log(e); } }, //Formations loadFormation : function (formation) { try { this.layouts.restore = true; //console.log("this.view = "); //console.log(this.view); for (var i = 0; i < formation.length; i++) { var unit = formation[i]; if (i == formation.length - 1) this.layouts.restore = false; for (var j = 0; j < this.view.lastUnitList.length; j++) { if (this.view.lastUnitList[j].get_Id() === unit.id) { this.view.lastUnitList[j].MoveBattleUnit(unit.x, unit.y); if (unit.e === undefined) this.view.lastUnitList[j].set_Enabled(true); else this.view.lastUnitList[j].set_Enabled(unit.e); } } } //this.view.lastUnits.RefreshData(); // RefreshData() has been obfuscated ? } catch (e) { console.log(e); } }, getFormation : function () { var formation = []; try { for (var i = 0; i < this.view.lastUnitList.length; i++) { var unit = this.view.lastUnitList[i]; var armyUnit = {}; armyUnit.x = unit.get_CoordX(); armyUnit.y = unit.get_CoordY(); armyUnit.id = unit.get_Id(); armyUnit.e = unit.get_Enabled(); formation.push(armyUnit); } } catch (e) { console.log(e); } return formation; // return value at the end }, shiftFormation : function (direction) { //left right up down var Army = [], v_shift = 0, h_shift = 0; if (direction === "u") v_shift = -1; if (direction === "d") v_shift = 1; if (direction === "l") h_shift = -1; if (direction === "r") h_shift = 1; //read army, consider use getFormation(?) for (var i = 0; i < this.view.lastUnitList.length; i++) { var unit = this.view.lastUnitList[i]; var armyUnit = {}; var x = unit.get_CoordX() + h_shift; switch (x) { case 9: x = 0; break; case - 1: x = 8; break; } var y = unit.get_CoordY() + v_shift; switch (y) { case 4: y = 0; break; case - 1: y = 3; break; } armyUnit.x = x; armyUnit.y = y; armyUnit.id = unit.get_Id(); armyUnit.e = unit.get_Enabled(); Army.push(armyUnit); } this.loadFormation(Army); }, flipFormation : function (axis) { var Army = []; try { for (var i = 0; i < this.view.lastUnitList.length; i++) { var unit = this.view.lastUnitList[i]; var armyUnit = {}; var x = unit.get_CoordX(); var y = unit.get_CoordY(); if (axis === 'horizontal') { x = Math.abs(x - 8); } else if (axis === 'vertical') { y = Math.abs(y - 3); } armyUnit.x = x; armyUnit.y = y; armyUnit.id = unit.get_Id(); armyUnit.e = unit.get_Enabled(); Army.push(armyUnit); } this.loadFormation(Army); } catch (e) { console.log(e); } }, activateUnits : function (type, activate) { var Army = []; try { for (var i = 0; i < this.view.lastUnitList.length; i++) { var unit = this.view.lastUnitList[i]; var armyUnit = {}; switch (type) { case 'air': if (unit.get_UnitGameData_Obj().mt === ClientLib.Base.EUnitMovementType.Air || unit.get_UnitGameData_Obj().mt === ClientLib.Base.EUnitMovementType.Air2) unit.set_Enabled(activate); break; case 'infantry': if (unit.get_UnitGameData_Obj().mt === ClientLib.Base.EUnitMovementType.Feet) unit.set_Enabled(activate); break; case 'vehicles': if (unit.get_UnitGameData_Obj().mt === ClientLib.Base.EUnitMovementType.Wheel || unit.get_UnitGameData_Obj().mt === ClientLib.Base.EUnitMovementType.Track) unit.set_Enabled(activate); break; } armyUnit.x = unit.get_CoordX(); armyUnit.y = unit.get_CoordY(); armyUnit.e = unit.get_Enabled(); armyUnit.id = unit.get_Id(); Army.push(armyUnit); } this.loadFormation(Army); } catch (e) { console.log(e); } }, resetFormation : function () { var Army = []; try { for (var i = 0; i < this.view.lastUnitList.length; i++) { var unit = this.view.lastUnitList[i]; var armyUnit = {}; armyUnit.x = unit.GetCityUnit().get_CoordX(); armyUnit.y = unit.GetCityUnit().get_CoordY(); armyUnit.id = unit.get_Id(); Army.push(armyUnit); } this.loadFormation(Army); if (this.buttons.attack.activateInfantry.getValue(true)) this.buttons.attack.activateInfantry.setValue(false); if (this.buttons.attack.activateVehicles.getValue(true)) this.buttons.attack.activateVehicles.setValue(false); if (this.buttons.attack.activateAir.getValue(true)) this.buttons.attack.activateAir.setValue(false); } catch (e) { console.log(e); } }, //Audio playSound : function (str, _this) { var temp = _this.audio[str].cloneNode(true); temp.volume = _this.getAudioSettings().ui / 100; temp.play(); }, getAudioSettings : function () { return JSON.parse(localStorage.getItem("CNC_Audio")); }, //Repair repairUnit : function () { try { ClientLib.Net.CommunicationManager.GetInstance().SendCommand("Repair", { cityid : this.ownCityId, entityId : this.unitId, mode : 4 }, phe.cnc.Util.createEventDelegate(ClientLib.Net.CommandResult, this, window.TACS.getInstance().repairResult), this.buttonId, true); } catch (e) { console.log(e); } }, repairResult : function (buttonId, result) { // result erroneously true when not enough RT, button deletes/sound plays but unit does not repair. try { if (result) { var _this = window.TACS.getInstance(); if (_this.saveObj.audio.playRepairSound) { if (_this.repairButtons[buttonId].unitType == "Inf"){ _this.playSound("soundRepairReload", _this); } else { _this.playSound("soundRepairImpact", _this); } } _this._armyBar.remove(_this.repairButtons[buttonId]); delete _this.repairButtons[buttonId]; } } catch (e) { console.log(e); } }, removeAllRepairButtons : function () { for (var i in this.repairButtons) { this._armyBar.remove(this.repairButtons[i]); } this.repairButtons = []; }, setResizeTimer : function () { var _this = this; if (this.repairButtonsRedrawTimer) { clearTimeout(_this.repairButtonsRedrawTimer); } this.repairButtonsRedrawTimer = setTimeout(function () { _this.redrawRepairButtons(_this); }, 500); }, redrawRepairButtons : function (that) { var _this = that || this; var base_city_id = _this._MainData.get_Cities().get_CurrentOwnCity().get_Id(); if (_this.repairButtons.length > 0) { _this.removeAllRepairButtons(); } var cbtSetup = _this._VisMain.get_CombatSetup(); var zoomFactor = cbtSetup.get_ZoomFactor(); var startX = Math.round(cbtSetup.get_MinXPosition() * zoomFactor * -1) + 10; //qx.core.Init.getApplication().getUIItem(ClientLib.Data.Missions.PATH.BAR_ATTACKSETUP).getChildren()[1].getBounds().left; var startY = 7; var gridWidth = Math.round(cbtSetup.get_GridWidth() * zoomFactor); var gridHeight = 38; for (var i = 0; i < _this.view.lastUnitList.length; i++) { var unit = _this.view.lastUnitList[i]; if (unit.get_HitpointsPercent() < 1) { var cityUnit = unit.GetCityUnit(); var unitRepairCharges = cityUnit.GetResourceCostForFullRepair().d; var resourceCost, repairCharge, unitType; for (var type in unitRepairCharges) { type = parseInt(type); switch (type) { case ClientLib.Base.EResourceType.Crystal: resourceCost = unitRepairCharges[type]; break; case ClientLib.Base.EResourceType.RepairChargeInf: repairCharge = unitRepairCharges[type]; unitType = "Inf"; break; case ClientLib.Base.EResourceType.RepairChargeVeh: repairCharge = unitRepairCharges[type]; unitType = "Veh"; break; case ClientLib.Base.EResourceType.RepairChargeAir: repairCharge = unitRepairCharges[type]; unitType = "Air"; break; } } repairCharge = phe.cnc.Util.getTimespanString(_this._MainData.get_Time().GetTimeSpan(repairCharge)); resourceCost = _this.formatNumberWithCommas(resourceCost); _this.repairButtons[i] = new qx.ui.form.Button("", "data:image/png;base64,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%3D%3D"); _this.repairButtons[i].set({ decorator : new qx.ui.decoration.Decorator().set({ backgroundColor : 'transparent' }), width : gridWidth, height : gridHeight, show : "icon", center : false, padding : 3, appearance : "button-text-small", cursor : "pointer", toolTipText : "Crystal: " + resourceCost + " / Time: " + repairCharge + " / Type: " + unitType }); _this.repairButtons[i].addListener("execute", _this.repairUnit, { ownCityId : base_city_id, unitId : unit.get_Id(), buttonId : i, frm : _this }); _this.repairButtons[i].unitType = unitType; // allowGrowY: false _this._armyBar.add(_this.repairButtons[i], { left : startX + gridWidth * unit.get_CoordX(), top : startY + gridHeight * unit.get_CoordY() }); } } }, toggleRepairMode : function () { try { var _this = this; if (!this.audio.soundRepairImpact) { this.audio.soundRepairImpact = new Audio(window.soundRepairImpact.d); this.audio.soundRepairReload = new Audio(window.soundRepairReload.d); this.audio.soundRepairImpact.volume = this.getAudioSettings().ui / 100; this.audio.soundRepairReload.volume = this.getAudioSettings().ui / 100; } this._armyBar.getLayoutParent().toggleEnabled(); this._armyBar.setEnabled(true); this.userInterface.toggleEnabled(); this.battleResultsBox.toggleEnabled(); if (this.buttons.attack.repairMode.getValue()) { this.redrawRepairButtons(); this._armyBar.addListener("resize", this.setResizeTimer, this); this.repairInfo.show(); this.updateRepairTimeInfobox(); this.repairModeTimer = setInterval(this.updateRepairTimeInfobox, 1000); } else { this.removeAllRepairButtons(); this._armyBar.removeListener("resize", this.setResizeTimer, this); this.repairInfo.hide(); clearInterval(this.repairModeTimer); } } catch (e) { console.log(e); } }, updateRepairTimeInfobox : function () { try { var _this = window.TACS.getInstance(); var ownCity = _this._MainData.get_Cities().get_CurrentOwnCity(); var availableInfRT = ownCity.GetResourceCount(ClientLib.Base.EResourceType.RepairChargeInf); var availableVehRT = ownCity.GetResourceCount(ClientLib.Base.EResourceType.RepairChargeVeh); var availableAirRT = ownCity.GetResourceCount(ClientLib.Base.EResourceType.RepairChargeAir); _this.stats.repair.available = ClientLib.Base.Resource.GetResourceCount(ownCity.get_RepairOffenseResources().get_RepairChargeOffense()); _this.labels.repairinfos.available.setValue(phe.cnc.Util.getTimespanString(_this.stats.repair.available)); _this.labels.repairinfos.infantry.setValue(phe.cnc.Util.getTimespanString(availableInfRT - _this.stats.repair.available)); _this.labels.repairinfos.vehicle.setValue(phe.cnc.Util.getTimespanString(availableVehRT - _this.stats.repair.available)); _this.labels.repairinfos.aircraft.setValue(phe.cnc.Util.getTimespanString(availableAirRT - _this.stats.repair.available)); /*var unitGroupData = phe.cnc.gui.RepairUtil.getUnitGroupCityData(ownCity); if (unitGroupData[ClientLib.Data.EUnitGroup.Infantry].lowestUnitDmgRatio == 1) console.log("No damage to Infantry"); if (unitGroupData[ClientLib.Data.EUnitGroup.Vehicle].lowestUnitDmgRatio == 1) console.log("No damage to Vehicles"); if (unitGroupData[ClientLib.Data.EUnitGroup.Aircraft].lowestUnitDmgRatio == 1) console.log("No damage to Aircraft");*/ } catch (e) { console.log(e); } }, resetDblClick : function () { try { var _this = window.TACS.getInstance(); clearInterval(_this.armybarClearnClickCounter); _this.armybarClickCount = 0; } catch (e) { console.log(e); } }, //Util getDateFromMillis : function (ms) { return new Date(ms); }, getTimestamp : function () { return new Date().getTime(); }, timerStart : function () { this.ts1 = this.getTimestamp(); }, timerEnd : function (functionName) { functionName = functionName || "nullName"; this.ts2 = this.getTimestamp(); var diff = this.ts2 - this.ts1; console.log(diff+"ms to run "+functionName) }, badClone : function (obj) { // broken var stringied = JSON.stringify(obj); //var p = JSON.parse(stringied); return stringied; } } }); } var TASuite_timeout = 0; // 10 seconds function TASuite_checkIfLoaded() { try { if (typeof qx !== 'undefined') { var a = qx.core.Init.getApplication(); // application var mb = qx.core.Init.getApplication().getMenuBar(); var v = ClientLib.Vis.VisMain.GetInstance(); var md = ClientLib.Data.MainData.GetInstance(); if (a && mb && v && md && typeof PerforceChangelist !== 'undefined') { if (TASuite_timeout > 10 || typeof CCTAWrapper_IsInstalled !== 'undefined') { CreateTweak(); window.TACS.getInstance().initialize(); /*if (typeof ClientLib.API.Util.GetUnitMaxHealthByLevel == 'undefined') { for (var key in ClientLib.Base.Util) { var strFunction = ClientLib.Base.Util[key].toString(); if (typeof ClientLib.Base.Util[key] === 'function' & strFunction.indexOf("1.1") > -1 & strFunction.indexOf("*=") > -1) { ClientLib.API.Util.GetUnitMaxHealthByLevel = ClientLib.Base.Util[key]; break; } } }*/ if (PerforceChangelist >= 392583) { //endgame patch - repair costs fix var currentCity = ClientLib.Data.Cities.prototype.get_CurrentCity.toString(); for (var i in ClientLib.Data.Cities.prototype) { if (ClientLib.Data.Cities.prototype.hasOwnProperty(i) && typeof(ClientLib.Data.Cities.prototype[i]) === 'function') { var strCityFunction = ClientLib.Data.Cities.prototype[i].toString(); if (strCityFunction.indexOf(currentCity) > -1) { if (i.length == 6) { currentCity = i; break; } } } } var currentOwnCity = ClientLib.Data.Cities.prototype.get_CurrentOwnCity.toString(); for (var y in ClientLib.Data.Cities.prototype) { if (ClientLib.Data.Cities.prototype.hasOwnProperty(y) && typeof(ClientLib.Data.Cities.prototype[y]) === 'function') { var strOwnCityFunction = ClientLib.Data.Cities.prototype[y].toString(); if (strOwnCityFunction.indexOf(currentOwnCity) > -1) { if (y.length == 6) { currentOwnCity = y; break; } } } } var strFunction = ClientLib.API.Util.GetUnitRepairCosts.toString(); strFunction = strFunction.replace(currentCity, currentOwnCity); var functionBody = strFunction.substring(strFunction.indexOf("{") + 1, strFunction.lastIndexOf("}")); var fn = Function('a,b,c', functionBody); ClientLib.API.Util.GetUnitRepairCosts = fn; } // Solution for OnSimulateBattleFinishedEvent issue for (var key in ClientLib.API.Battleground.prototype) { if (typeof ClientLib.API.Battleground.prototype[key] === 'function') { strFunction = ClientLib.API.Battleground.prototype[key].toString(); if (strFunction.indexOf(",-1,0,0,0);") > -1) { strFunction = strFunction.substring(strFunction.indexOf("{") + 1, strFunction.lastIndexOf("}")); var re = /.I.[A-Z]{6}.[A-Z]{6}\(.I.[A-Z]{6}.[a-zA-Z]+,-1,0,0,0\)\;/; //$I.QPYKHN.IVAYJF($I.XIMKGT.pavmCombatSimulation,-1,0,0,0); strFunction = strFunction.replace(re, ""); var re2 = /.I.[A-Z]{6}.[A-Z]{6}\(\).[A-Z]{6}\(\).[A-Z]{6}\([a-z].[a-z]\)\;/; //$I.BFALSI.DZYMBX().JLBGOK().KLRGNI(b.d); var temp = strFunction.match(re2).toString(); console.log(temp); strFunction = strFunction.replace(re2, ""); strFunction = strFunction.replace("}}", "}}" + temp); //strFunction = strFunction.replace("var $createHelper;", "var $createHelper;var offenseData = b.d.a;var baseData = b.d.s;var defenseData = b.d.d;var simResults = b.e;for (var i in offenseData) {simResults[offenseData[i].ci-1].Value.x = offenseData[i].x;simResults[offenseData[i].ci-1].Value.y = offenseData[i].y;}for (var u in baseData) {simResults[baseData[u].ci-1].Value.x = baseData[u].x;simResults[baseData[u].ci-1].Value.y = baseData[u].y;}for (var e in defenseData) {simResults[defenseData[e].ci-1].Value.x = defenseData[e].x;simResults[defenseData[e].ci-1].Value.y = defenseData[e].y;}"); // Add Coords var fn = Function('a,b', strFunction); ClientLib.API.Battleground.prototype[key] = fn; break; } } } for (var key in ClientLib.Vis.BaseView.BaseView.prototype) { if (typeof ClientLib.Vis.BaseView.BaseView.prototype[key] === 'function') { strFunction = ClientLib.Vis.BaseView.BaseView.prototype[key].toString(); if (strFunction.indexOf(ClientLib.Vis.BaseView.BaseView.prototype.ShowToolTip.toString()) > -1) { console.log("ClientLib.Vis.BaseView.BaseView.prototype.ShowToolTip_Original = ClientLib.Vis.BaseView.BaseView.prototype." + key); var showToolTip_Original = "ClientLib.Vis.BaseView.BaseView.prototype.ShowToolTip_Original = ClientLib.Vis.BaseView.BaseView.prototype." + key; var stto = Function('', showToolTip_Original); stto(); var showToolTip_New = "ClientLib.Vis.BaseView.BaseView.prototype." + key + "=function (a){if(ClientLib.Vis.VisMain.GetInstance().get_Mode()==7&&window.TACS.getInstance().saveObj.checkbox.disableAttackPreparationTooltips){return;}else{this.ShowToolTip_Original(a);}}"; var sttn = Function('', showToolTip_New); sttn(); console.log(showToolTip_New); break; } } } qx.core.Init.getApplication().getArmyUnitTooltipOverlay().setVisibility_Original = qx.core.Init.getApplication().getArmyUnitTooltipOverlay().setVisibility; qx.core.Init.getApplication().getArmyUnitTooltipOverlay().setVisibility = function (a) { if (window.TACS.getInstance().saveObj.checkbox.disableArmyFormationManagerTooltips) { qx.core.Init.getApplication().getArmyUnitTooltipOverlay().setVisibility_Original(false); } else { qx.core.Init.getApplication().getArmyUnitTooltipOverlay().setVisibility_Original(a); } }; } else { TASuite_timeout++; window.setTimeout(TASuite_checkIfLoaded, 1000); } } else window.setTimeout(TASuite_checkIfLoaded, 1000); } else { window.setTimeout(TASuite_checkIfLoaded, 1000); } } catch (e) { if (typeof console !== 'undefined') console.log(e); else if (window.opera) opera.postError(e); else GM_log(e); } } if (/commandandconquer\.com/i.test(document.domain)) { window.setTimeout(TASuite_checkIfLoaded, 1000); } }; // injecting, because there seem to be problems when creating game interface with unsafeWindow var TASuiteScript = document.createElement("script"); var txt = TASuite_mainFunction.toString(); TASuiteScript.innerHTML = "(" + txt + ")();"; TASuiteScript.type = "text/javascript"; if (/commandandconquer\.com/i.test(document.domain)) document.getElementsByTagName("head")[0].appendChild(TASuiteScript); //Sound sample B64LOBs window.soundRepairImpact = { info : "Impact Wrench Sound; Used in TACS; courtesy of: http://www.freesfx.co.uk", d : "data:video/ogg;base64,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" }; window.soundRepairReload = { info : "Reload sound; Used in TACS; courtesy of: http://www.freesfx.co.uk; 7806 bytes", d : "data:video/ogg;base64,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" }; })();