NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript== // @name OGLight // @namespace https://openuserjs.org/users/obame-tbot // @version 3.0.0 // @description OGLight script for OGame // @author Oz // @license MIT // @copyright 2021 // @match *://*/game/* // @updateURL https://openuserjs.org/meta/obame-tbot/OGLight.meta.js // @grant GM_addStyle // @run-at document-start // ==/UserScript== // ogl lazy loading if(new URL(window.location.href).searchParams.get('oglLazy') == 'true' && !document.hasFocus()) { window.onfocus = () => window.location.href = window.location.protocol + '//' + window.location.host + window.location.pathname + window.location.search.replace('&oglLazy=true', ''); localStorage.setItem('ogl-redirect', false); window.stop(); } let redirect = localStorage.getItem('ogl-redirect'); if(redirect && redirect.indexOf('https') > -1) { localStorage.setItem('ogl-redirect', false); window.location.href = redirect; } // goodbye tooltips function goodbyeTipped() { if(typeof Tipped !== 'undefined') { for(let [key] of Object.entries(Tipped)) { Tipped[key] = function() { return false; } } } else requestAnimationFrame(() => goodbyeTipped()); } if(new URL(window.location.href).searchParams.get('component') != 'empire') { // collect resources fix let mode = new URL(window.location.href).searchParams.get('oglMode'); if(mode == 1 || mode == 4) { //let cp = new URL(window.location.href).searchParams.get('cp') || document.querySelector(`head meta[name="ogame-planet-id"]`).getAttribute('content'); async function fetchData() { let result = await fetch(window.location.protocol + '//' + window.location.host + window.location.pathname + '?page=fetchResources&ajax=1'); return result.text(); } fetchData().then(response => { let loop = () => { if(document.readyState === 'complete') { resourcesBar.reload(JSON.parse(response)); new OGLight(); } else requestAnimationFrame(() => loop()); } loop(); }); } else window.addEventListener("DOMContentLoaded", () => { new OGLight() }); } goodbyeTipped(); GM_addStyle(` @font-face { font-family:'Material Icons'; font-style:normal; font-weight:400; src:local('Material Icons'), local('MaterialIcons-Regular'), url('data:font/woff2;base64,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'); } `); class OGLight { constructor() { this.rawURL = new URL(window.location.href); this.mode = this.rawURL.searchParams.get('oglMode') || 0; // 0:default; 1:autoHarvest; 2:raid; 3:locked; 4:linkedMoon; this.playerID = document.querySelector('head meta[name="ogame-player-id"]').getAttribute('content'); this.playerName = document.querySelector('head meta[name="ogame-player-name"]').getAttribute('content'); this.ecoSpeed = document.querySelector('head meta[name="ogame-universe-speed"]').getAttribute('content'); this.fleetSpeed = document.querySelector('head meta[name="ogame-universe-speed-fleet"]').getAttribute('content'); this.universeName = document.querySelector('head meta[name="ogame-universe-name"]').getAttribute('content'); this.lang = document.querySelector('head meta[name="ogame-language"]').getAttribute('content'); this.universeNumber = window.location.host.replace(/\D/g,''); this.baselink = window.location.protocol + '//' + window.location.host + window.location.pathname; this.planetList = document.querySelectorAll('.smallplanet'); this.current = {}; this.current.smallplanet = document.querySelector('.smallplanet.hightlightPlanet') || document.querySelector('.smallplanet.hightlightMoon') || document.querySelector('.smallplanet'); this.current.type = document.querySelector('head meta[name="ogame-planet-type"]').getAttribute('content'); this.current.coords = this.current.smallplanet.querySelector('.planetlink .planet-koords').textContent.slice(1,-1).split(':'); this.current.id = document.querySelector('head meta[name="ogame-planet-id"]').getAttribute('content'); this.current.next = this.current.smallplanet.nextElementSibling || document.querySelectorAll('.smallplanet')[0]; this.keyboardActionsList = this.keyboardActionsList || {}; this.shipCost = { 202:[2000,2000,0], 203:[6000,6000,0], 204:[3000,1000,0], 205:[6000,4000,0], 206:[20000,7000,2000], 207:[45000,15000,0], 215:[30000,40000,15000], 211:[50000,25000,15000], 213:[60000,50000,15000], 214:[5000000,4000000,1000000], 218:[85000,55000,20000], 219:[8000,15000,8000], 209:[10000,6000,2000], 210:[0,1000,0], 212:[0,2000,500], 208:[10000,20000,10000], 217:[2000,2000,1000], 401:[2000,0,0], 402:[1500,500,0], 403:[6000,2000,0], 404:[20000,15000,2000], 405:[5000,3000,0], 406:[50000,50000,30000], 407:[10000,10000,0], 408:[50000,50000,0], }; this.resources = { 'metal' : Math.floor(resourcesBar.resources.metal.amount), 'crystal' : Math.floor(resourcesBar.resources.crystal.amount), 'deut' : Math.floor(resourcesBar.resources.deuterium.amount), }; if(Util.getPage() == 'fleetdispatch') { fleetDispatcher.metalOnPlanet = this.resources.metal; fleetDispatcher.crystalOnPlanet = this.resources.crystal; fleetDispatcher.deuteriumOnPlanet = this.resources.deut; } this.totalResources = [0,0,0]; document.querySelector('#pageContent').appendChild(Util.createDom('div', {'class':'ogl_universeName'}, this.universeName + '.' + this.lang)) this.json = JSON.parse(localStorage.getItem('ogl_redata')) || {}; this.json.topScore = this.json.topScore || [0,0]; this.json.loca = this.json.loca || {}; this.json.shipCapacity = this.json.shipCapacity || {}; this.json.stalkList = this.json.stalkList || {}; this.json.spyProbesCount = this.json.spyProbesCount || 6; this.json.lastFleet = this.json.lastFleet || {}; this.json.myActivities = this.json.myActivities || {}; this.json.myEconomy = this.json.myEconomy || {}; this.json.myTechs = this.json.myTechs || {}; if(!this.json.loca.metal) window.location.href = window.location.protocol + '//' + window.location.host + '/game/index.php?page=ingame&component=fleetdispatch'; this.json.stats = this.json.stats || {}; this.json.stats.range = this.json.stats.range || 1; this.json.stats.total = this.json.stats.total || { idList:[], expe:{}, raid:{}, expeOccurences:{}, consumption:0 }; this.json.options = this.json.options || {}; this.json.options.togglesOff = this.json.options.togglesOff || []; this.json.options.defaultShip = this.json.options.defaultShip || 202; this.json.options.defaultMission = this.json.options.defaultMission || 3; this.json.options.rval = this.json.options.rval || 300000 * this.ecoSpeed; this.json.options.expeShips = this.json.options.expeShips || [this.json.options.defaultShip,0,1]; this.json.options.resSaver = this.json.options.resSaver || [0,0,0]; this.json.options.pinned = this.json.options.pinned || false; this.json.options.spyFilter = this.json.options.spyFilter || '$'; this.json.options.autoHarvest = this.json.options.autoHarvest || [0,0,0,0]; this.json.options.harvestInitialPlanet = this.json.options.harvestInitialPlanet || '0'; this.json.options.hiddenTargets = this.json.options.hiddenTargets || {}; this.json.options.targetFilter = this.json.options.targetFilter || [1, 0]; this.json.options.sideViewOpened = this.json.options.sideViewOpened || false; this.json.options.currentTarget = this.json.options.currentTarget || false; this.json.options.nextTarget = this.json.options.nextTarget || false; this.json.options.currentPanel = this.json.options.currentPanel || 'default'; this.json.jumpGateTimers = this.json.jumpGateTimers || {}; this.json.locked = this.json.locked || {}; this.menuOptions = Util.createDom('div', {'class':'ogl_menuOptions'}); document.querySelector('#countColonies').prepend(this.menuOptions); if(!this.json.loca.metal && Util.getPage() != 'fleetdispatch') window.location.href = this.ogl.baselink + '?page=ingame&component=fleetdispatch'; this.component = {}; this.component.langManager = new LangManager(this); this.component.sideViewManager = new SideViewManager(this); this.component.planetManager = new PlanetManager(this); this.component.empireManager = new EmpireManager(this); this.component.playerManager = new PlayerManager(this); this.component.popupManager = new PopupManager(this); this.component.tooltipManager = new TooltipManager(this); this.component.fleetManager = new FleetManager(this); this.component.messageManager = new MessageManager(this); this.component.timeManager = new TimeManager(this); this.component.lockManager = new LockManager(this); this.component.jumpgateManager = new JumpgateManager(this); this.component.keyboardManager = new KeyboardManager(this); Util.saveData(this.json); Util.loop(() => Util.checkInputs()); Util.checkTopScore(this); } } class LangManager { constructor(ogl) { this.ogl = ogl; this.en = { abbr202 : "SC", abbr203 : "LC", abbr219 : "PF", abbr210 : "SP", planets : "planets", ships : "Ships", items : "Items", other : "Other", resources : "Resources", fight : "Fight", noMoonError : "Error, there is no moon here", capacityPicker : "Resources to send", scExpe : "Small cargo expedition", lcExpe : "Large cargo expedition", allShipsRes : "Select all ships (page 1) or all resources (page 3)", splitShipsRes : "Split all ships (page 1) or all resources (page 3) by the value selected (2-9)", prevFleet : "Repeat previous fleet", required : "req.", reverseAllShipsRes : "Reverse all selected ships (page 1) or all resources (page 3)", nextPlanet : "Go to next planet", gain : "Gain", timeLimits : "Day;Week;Month;All", spyPosition : "Spy this position", flagTarget : "Set next target", attackCurrentTarget : "Attack next target", noTargetSelected : "No target selected", timerInfo : "Last refresh", blackhole : "Black hole", signalBlackhole : "Signal a blackhole", moreStats : "More statistics", eraseData : "Erase data", defaultView : "Default view", economyView : "Economy view", productionView : "Production view", pinnedView : "Pinned target", targetView : "Targets list", oglConfig : "OGLight settings", defaultShip : "Default ship", defaultMission : "Default mission", autoCollect : "Collect resources", minifyPictures : "Minify large pictures", displayTimers : "Display refresh timers", rentaStats : "Rentability Statistics", excludeConso : "Exclude deut consumption from stats", spiesTable : "Display spies table", autoClean : "Autoclean spies table", inFlight : "In flight", linkedMoons : "Linked moons", kofi : "Do you like OGLight ? Then support me :)", wrongTarget : "Warning, the targeted planet has changed and will be removed from the list !", deleteSpyDef : "Delete spies agaisnt my planets", rentaPerDay : "Renta / day ($daysd)", totalPerDay : "Total / day ($daysd)", ignoreRaid : "Ignore this raid", } this.fr = { abbr202 : "PT", abbr203 : "GT", abbr219 : "EC", abbr210 : "SP", planets : "planètes", ships : "Vaisseaux", other : "Autre", resources : "Ressources", fight : "Combat", noMoonError : "Erreur, il n'y a pas de lune ici", capacityPicker : "Ressources à envoyer", scExpe : "Expedition au PT", lcExpe : "Expedition au GT", allShipsRes : "Selectionner tous les vaisseux (page 1) ou toutes les ressources (page3)", splitShipsRes : "Diviser tous les vaisseux (page 1) ou toutes les ressources (page3) par la valeur selectionnée (2-9)", prevFleet : "Répéter la flotte précédente", reverseAllShipsRes : "Inverser tous les vaisseaux (page 1) ou toutes ressources selectionné(e)s (page 3)", nextPlanet : "Se rendre sur la planète suivante", gain : "Gain", timeLimits : "Jour;Semaine;Mois;Tout", spyPosition : "Espionner cette position", flagTarget : "Définir la prochaine cible", attackCurrentTarget : "Attaquer la prochaine cible", noTargetSelected : "Aucune cible définie", timerInfo : "Dernier refresh", blackhole : 'Trou noir', signalBlackhole : "Signaler un trou noir", moreStats : "Plus de statistiques", eraseData : "Supprimer les données", defaultView : "Vue par défaut", economyView : "Vue économie", productionView : "Vue production", pinnedView : "Cible épinglée", targetView : "Liste des cibles", oglConfig : "Configuration d'OGLight", defaultShip : "Vaisseau par défaut", defaultMission : "Mission par défaut", autoCollect : "Collecter les ressources", minifyPictures : "Réduire les grandes images", displayTimers : "Afficher les timers de refresh", rentaStats : "Statistiques de rentabilité", excludeConso : "Ignore la conso de deut dans les stats", spiesTable : "Afficher le tableau de RE", autoClean : "Nettoyage automatique du tableau de RE", inFlight : "En vol", linkedMoons : "Lunes associées", kofi : "Vous aimez OGLight ? Alors soutenez-moi :)", wrongTarget : "Attention, la planète ciblée a changée et va être supprimée de la liste !", deleteSpyDef : "Supprimer les espionnages de mes planètes", rentaPerDay : "Renta / jour ($daysj)", totalPerDay : "Total / jour ($daysj)", ignoreRaid : "Ignorer ce raid", } } getText(key) { if(this[this.ogl.lang] && this[this.ogl.lang][key]) return this[this.ogl.lang][key]; else if(this.ogl.json.loca[key]) return this.ogl.json.loca[key]; else if(this.en[key]) return this.en[key]; else return 'OGL lang error'; } } class LockManager { constructor(ogl) { this.ogl = ogl; if(Util.getPage() == 'fleetdispatch' && this.ogl.mode == '3') { let url = new URL(window.location.href); let techIDs = url.searchParams.get('oglTech').split(/;/g); let coords = `${fleetDispatcher.targetPlanet.galaxy}:${fleetDispatcher.targetPlanet.system}:${fleetDispatcher.targetPlanet.position}`; let cumulRes = [0,0,0]; let totalShipsToSend = 0; let shipID = this.ogl.json.options.defaultShip; let maxShips = this.ogl.component.fleetManager.shipsOnPlanet[shipID].number; let sentList = {}; techIDs.forEach(techID => { if(this.ogl.json.locked[coords] && this.ogl.json.locked[coords][techID]) { let data = this.ogl.json.locked[coords][techID]; let resToSend = Math.min(data.metal, fleetDispatcher.metalOnPlanet - cumulRes[0]) + Math.min(data.crystal, fleetDispatcher.crystalOnPlanet - cumulRes[1]) + Math.min(data.deut, fleetDispatcher.deuteriumOnPlanet - cumulRes[2]); let shipsToSend = this.ogl.component.fleetManager.calcRequiredShips(shipID, resToSend + 3); let diffShips = Math.min(maxShips - (totalShipsToSend + shipsToSend), 0); totalShipsToSend += (shipsToSend - diffShips); let diffRes = [fleetDispatcher.cargoMetal, fleetDispatcher.cargoCrystal, fleetDispatcher.cargoDeuterium]; cumulRes[0] = Math.min(fleetDispatcher.cargoMetal + data.metal, fleetDispatcher.metalOnPlanet); cumulRes[1] = Math.min(fleetDispatcher.cargoCrystal + data.crystal, fleetDispatcher.crystalOnPlanet); cumulRes[2] = Math.min(fleetDispatcher.cargoDeuterium + data.deut, fleetDispatcher.deuteriumOnPlanet); fleetDispatcher.selectShip(shipID, totalShipsToSend); fleetDispatcher.cargoMetal = Math.min(cumulRes[0], fleetDispatcher.getFreeCargoSpace()); fleetDispatcher.cargoCrystal = Math.min(cumulRes[1], fleetDispatcher.getFreeCargoSpace()); fleetDispatcher.cargoDeuterium = Math.min(cumulRes[2], fleetDispatcher.getFreeCargoSpace()); diffRes[0] = fleetDispatcher.cargoMetal - diffRes[0]; diffRes[1] = fleetDispatcher.cargoCrystal - diffRes[1]; diffRes[2] = fleetDispatcher.cargoDeuterium - diffRes[2]; sentList[techID] = sentList[techID] || {}; sentList[techID].metal = diffRes[0]; sentList[techID].crystal = diffRes[1]; sentList[techID].deut = diffRes[2]; } }); fleetDispatcher.refresh(); Util.overwriteFleetDispatcher('submitFleet3', false, () => { if(fleetDispatcher.currentPage == 'fleet3') { techIDs.forEach(techID => { this.ogl.json.locked[coords][techID].metal = Math.max(this.ogl.json.locked[coords][techID].metal - sentList[techID].metal, 0); this.ogl.json.locked[coords][techID].crystal = Math.max(this.ogl.json.locked[coords][techID].crystal - sentList[techID].crystal, 0); this.ogl.json.locked[coords][techID].deut = Math.max(this.ogl.json.locked[coords][techID].deut - sentList[techID].deut, 0); Util.saveData(this.ogl.json); }); } }); } let pages = ['supplies', 'facilities', 'shipyard', 'defenses', 'research']; if(pages.indexOf(Util.getPage()) > -1) this.checkDetail(); this.sideLock(); } checkDetail() { let coords = this.ogl.current.coords.join(':'); this.ogl.json.locked[coords] = this.ogl.json.locked[coords] || {}; let updateData = (detail, tech) => { let level = tech.level + tech.currentStep - 1; let nextLevel = tech.level + tech.currentStep; let domLevel = detail.querySelector('.information .level'); domLevel.innerHTML = `Level ${level} <i class="material-icons">arrow_forward</i> <span>${nextLevel}</span>`; domLevel.setAttribute('data-value', tech.level + tech.currentStep); domLevel.setAttribute('data-ratio', tech.ratio); domLevel.setAttribute('data-step', tech.currentStep); this.ogl.json.locked[coords] = this.ogl.json.locked[coords] || {}; let lockButton = detail.querySelector('.ogl_lockBuild'); if(this.ogl.json.locked[coords][`${tech.id}_${level+1}`]) lockButton.classList.add('ogl_active'); else lockButton.classList.remove('ogl_active'); ['metal', 'crystal', 'deut', 'energy'].forEach(res => { if(tech[res]) { let ratio; if(tech.id == 36 && res == 'energy') ratio = 2.5; else ratio = tech.ratio; let newValue = Math.ceil(tech[res] * Math.pow(ratio, tech.currentStep)); let target = detail.querySelector('.costs .' + res.replace('deut', 'deuterium')); target.textContent = Util.formatToUnits(newValue); target.setAttribute('data-total', newValue); target.setAttribute('title', `${Util.formatNumber(newValue)} ${this.ogl.component.langManager.getText(res)}`); target.classList.remove('ogl_tooltipReady'); } }); } for(let [k,v] of Object.entries(this.ogl.json.locked[coords])) { let domBuilding = document.querySelector(`.technology[data-technology="${v.id}"]`); if(domBuilding && (v.id < 200 || (v.id >= 300 && v.id < 400) || v.id >= 500)) { let currentLevel = (domBuilding.querySelector('.targetlevel') || domBuilding.querySelector('.level')).getAttribute('data-value'); let onMoon = this.ogl.current.type == 'moon' ? true : false; if(domBuilding && currentLevel >= v.level && onMoon === this.ogl.json.locked[coords][k].onMoon) { delete(this.ogl.json.locked[coords][k]); } } } Util.loop(() => { // fix ogame bug when user spam click if(document.querySelectorAll('#technologydetails').length > 1) { document.querySelectorAll('#technologydetails').forEach((e, index) => { if(index > 0) e.remove() }); } let detail = document.querySelector('#technologydetails'); if(!detail || detail.classList.contains('ogl_lockReady')) return; detail.classList.add('ogl_lockReady'); let detailAction = detail.querySelector('.sprite_large').appendChild(Util.createDom('div', {'class':'ogl_detailAction'})); let lockButton = detailAction.appendChild(Util.createDom('div', {'class':'ogl_button material-icons ogl_lockBuild tooltip', 'title':'Lock this building'}, 'lock')); if(detail.querySelector('#build_amount')) { detail.querySelector('#build_amount').setAttribute('onkeyup', 'checkIntInput(this, 1, 99999);event.stopPropagation();'); for(let i=0; i<3; i++) detailAction.appendChild(Util.createDom('div')); } else { let tech = {}; tech.id = parseInt(detail.getAttribute('data-technology-id')); tech.level = parseInt(detail.querySelector('.information .level') ? detail.querySelector('.information .level').getAttribute('data-value') : 0); tech.metal = parseInt(!detail.querySelector('.costs .metal') ? 0 : detail.querySelector('.costs .metal').getAttribute('data-value')); tech.crystal = parseInt(!detail.querySelector('.costs .crystal') ? 0 : detail.querySelector('.costs .crystal').getAttribute('data-value')); tech.deut = parseInt(!detail.querySelector('.costs .deuterium') ? 0 : detail.querySelector('.costs .deuterium').getAttribute('data-value')); tech.energy = parseInt(!detail.querySelector('.costs .energy') ? 0 : detail.querySelector('.costs .energy').getAttribute('data-value')); tech.currentStep = 0; if(tech.id == 1 || tech.id == 3 || tech.id == 4) tech.ratio = 1.5; else if(tech.id == 2) tech.ratio = 1.6; else if(tech.id == 12) tech.ratio = 1.8; else if(tech.id == 36) tech.ratio = 5; else if(tech.id == 124) tech.ratio = 1.75; else if(tech.id == 199) tech.ratio = 3; else tech.ratio = 2; let level = tech.level + tech.currentStep - 1; let nextLevel = tech.level + tech.currentStep; detail.querySelector('.information .level').innerHTML = `Level ${level} <i class="material-icons">arrow_forward</i> <span>${nextLevel}</span>`; let prevButton = detailAction.appendChild(Util.createDom('div', {'class':'ogl_button material-icons tooltip', 'title':'Next level'}, 'keyboard_arrow_left')); let clearButton = detailAction.appendChild(Util.createDom('div', {'class':'ogl_button material-icons tooltip', 'title':'Current level'}, 'clear')); let nextButton = detailAction.appendChild(Util.createDom('div', {'class':'ogl_button material-icons tooltip', 'title':'Next level'}, 'keyboard_arrow_right')); prevButton.addEventListener('click', () => { if(tech.level + tech.currentStep > 1) { tech.currentStep--; updateData(detail, tech); if(tech.level + tech.currentStep < tech.level) lockButton.classList.add('ogl_disabled'); else lockButton.classList.remove('ogl_disabled'); } }); clearButton.addEventListener('click', () => { tech.currentStep = 0; updateData(detail, tech); lockButton.classList.remove('ogl_disabled'); }); nextButton.addEventListener('click', () => { tech.currentStep++; updateData(detail, tech); if(tech.level + tech.currentStep < tech.level) lockButton.classList.add('ogl_disabled'); else lockButton.classList.remove('ogl_disabled'); }); } this.ogl.json.locked[coords] = this.ogl.json.locked[coords] || {}; let t = {}; t.id = parseInt(detail.getAttribute('data-technology-id')); t.level = parseInt(detail.querySelector('.information .level') ? detail.querySelector('.information .level').getAttribute('data-value') : 0); if(this.ogl.json.locked[coords][`${t.id}_${t.level}`]) lockButton.classList.add('ogl_active'); lockButton.addEventListener('click', e => { if(e.target.classList.contains('ogl_disabled')) return; let tech = {}; tech.id = parseInt(detail.getAttribute('data-technology-id')); tech.onMoon = this.ogl.current.type == 'moon' ? true : false; tech.name = detail.querySelector('.content h3').textContent; tech.amount = parseInt(detail.querySelector('#build_amount') ? detail.querySelector('#build_amount').value || 1 : 0); tech.level = parseInt(detail.querySelector('.information .level') ? detail.querySelector('.information .level').getAttribute('data-value') : 0); tech.metal = parseInt(!detail.querySelector('.costs .metal') ? 0 : detail.querySelector('.costs .metal').getAttribute('data-total') || detail.querySelector('.costs .metal').getAttribute('data-value')); tech.crystal = parseInt(!detail.querySelector('.costs .crystal') ? 0 : detail.querySelector('.costs .crystal').getAttribute('data-total') || detail.querySelector('.costs .crystal').getAttribute('data-value')); tech.deut = parseInt(!detail.querySelector('.costs .deuterium') ? 0 : detail.querySelector('.costs .deuterium').getAttribute('data-total') || detail.querySelector('.costs .deuterium').getAttribute('data-value')); let key = tech.level ? `${tech.id}_${tech.level}` : tech.id; this.ogl.json.locked[coords] = this.ogl.json.locked[coords] || {}; this.ogl.json.locked[coords][key] = tech; lockButton.classList.add('ogl_active'); Util.saveData(this.ogl.json); this.sideLock(); }); }); } sideLock() { this.ogl.planetList.forEach(planet => { planet.querySelector('.ogl_sideLock') && planet.querySelector('.ogl_sideLock').remove(); let coords = planet.querySelector('.planet-koords').textContent.slice(1,-1); if(this.ogl.json.locked[coords] && Object.keys(this.ogl.json.locked[coords]).length > 0) { let lock = planet.appendChild(Util.createDom('div', {'class':'material-icons ogl_sideLock'}, 'lock')); lock.addEventListener('click', () => this.buildContent(coords, planet)); } }); } buildContent(coords, planet) { this.ogl.component.popupManager.load(); let container = Util.createDom('div', {'class':'ogl_lockInfo'}); let total = [0,0,0,0,0,0]; let pTechList; let mTechList; let pLine = container.appendChild(Util.createDom('div', {'class':'ogl_type ogl_lockLine'})); let mLine = container.appendChild(Util.createDom('div', {'class':'ogl_type ogl_lockLine'})); pLine.appendChild(Util.createDom('div', {'class':'ogl_type'}, `${planet.querySelector('.planet-name').textContent} ${planet.querySelector('.planet-koords').textContent}`)); ['metal', 'crystal', 'deut'].forEach(res => pLine.appendChild(Util.createDom('div', {}, `<div class="ogl_shipIcon ogl_${res}"></div>`))); pLine.appendChild(Util.createDom('div')); pLine.appendChild(Util.createDom('hr')); mLine.appendChild(Util.createDom('div', {'class':'ogl_type'}, `Moon ${planet.querySelector('.planet-koords').textContent}`)); ['metal', 'crystal', 'deut'].forEach(res => mLine.appendChild(Util.createDom('div', {}, `<div class="ogl_shipIcon ogl_${res}"></div>`))); mLine.appendChild(Util.createDom('div')); mLine.appendChild(Util.createDom('hr')); for(let [k,v] of Object.entries(this.ogl.json.locked[coords])) { let tech = this.ogl.json.locked[coords][k]; if(tech.onMoon) mTechList = !mTechList ? k : mTechList+';'+k; else pTechList = !pTechList ? k : pTechList+';'+k; let target = tech.onMoon ? mLine : pLine; let name = target.appendChild(Util.createDom('div', {'class':'ogl_type'}, `${tech.name} (${tech.level || Util.formatNumber(tech.amount)})`)); if(tech.metal + tech.crystal + tech.deut <= 0) name.appendChild(Util.createDom('i', {'class':'material-icons ogl_ok'}, 'checked')); ['metal', 'crystal', 'deut'].forEach((res, index) => { target.appendChild(Util.createDom('div', {'class':'ogl_'+res}, Util.formatNumber(tech[res]))); tech.onMoon ? total[index + 3] += tech[res] : total[index] += tech[res]; }); let actions = target.appendChild(Util.createDom('div')); let sendRes = actions.appendChild(Util.createDom('div', {'class':'ogl_button material-icons'}, 'local_shipping')); if(tech.metal + tech.crystal + tech.deut <= 0) sendRes.classList.add('ogl_hidden'); sendRes.addEventListener('click', () => { let type = tech.onMoon ? 3 : 1; let splittedCoords = coords.replace('M', '').split(':'); let id = tech.level ? `${tech.id}_${tech.level}` : tech.id; let link = `?page=ingame&component=fleetdispatch&galaxy=${splittedCoords[0]}&system=${splittedCoords[1] }&position=${splittedCoords[2]}&type=${type}&mission=${this.ogl.json.options.defaultMission}&oglMode=3&oglTech=${id}`; window.location.href = this.ogl.baselink + link; }); let clear = actions.appendChild(Util.createDom('div', {'class':'ogl_button material-icons'}, 'clear')); clear.addEventListener('click', () => { delete this.ogl.json.locked[coords][k]; this.sideLock(); this.ogl.component.popupManager.close(); if(Object.keys(this.ogl.json.locked[coords]).length > 0) this.buildContent(coords, planet); Util.saveData(this.ogl.json); }); } for(let i=0; i<2; i++) { let line = i == 0 ? pLine : mLine; let indexOffset = i == 0 ? 0 : 3; let type = i == 0 ? 1 : 3; let techList = i == 0 ? pTechList : mTechList; line.appendChild(Util.createDom('hr')); line.appendChild(Util.createDom('div', {'class':'ogl_type material-icons'}, 'functions')); ['metal', 'crystal', 'deut'].forEach((res, index) => line.appendChild(Util.createDom('div', {'class':'ogl_'+res}, Util.formatNumber(total[index + indexOffset])))); let actions = line.appendChild(Util.createDom('div')); if(total[0 + indexOffset] + total[1 + indexOffset] + total[2 + indexOffset] > 0) { let sendRes = actions.appendChild(Util.createDom('div', {'class':'ogl_button material-icons'}, 'local_shipping')); sendRes.addEventListener('click', () => { let splittedCoords = coords.replace('M', '').split(':'); let link = `?page=ingame&component=fleetdispatch&galaxy=${splittedCoords[0]}&system=${splittedCoords[1] }&position=${splittedCoords[2]}&type=${type}&mission=${this.ogl.json.options.defaultMission}&oglMode=3&oglTech=${techList}`; window.location.href = this.ogl.baselink + link; }); let clear = actions.appendChild(Util.createDom('div', {'class':'ogl_button material-icons'}, 'clear')); clear.addEventListener('click', () => { for(let [k,v] of Object.entries(this.ogl.json.locked[coords])) { if(i == 0 && !this.ogl.json.locked[coords][k].onMoon) delete this.ogl.json.locked[coords][k]; else if(i == 1 && this.ogl.json.locked[coords][k].onMoon) delete this.ogl.json.locked[coords][k]; } this.sideLock(); this.ogl.component.popupManager.close(); if(Object.keys(this.ogl.json.locked[coords]).length > 0) this.buildContent(coords, planet); Util.saveData(this.ogl.json); }); } } this.ogl.component.popupManager.open(container); } } class JumpgateManager { constructor(ogl) { this.ogl = ogl; if(Util.getPage() == 'facilities' || this.ogl.current.type == 'moon') { let calcTimer = level => { return (0.25*Math.pow(level,2)-7.57*level+67.34)/this.ogl.fleetSpeed * 60000; } jumpgateDone = a => { var a = $.parseJSON(a); if(a.status) { planet = a.targetMoon; $(".overlayDiv").dialog("destroy"); let originCoords = this.ogl.current.coords.join(':'); let originLevel = this.ogl.current.smallplanet.querySelector('.moonlink').getAttribute('data-jumpgatelevel'); let destinationCoords = document.querySelector(`.moonlink[href*="${jumpGateTargetId}"]`).parentNode.querySelector('.planet-koords').textContent.slice(1, -1); let destinationLevel = document.querySelector(`.moonlink[href*="${jumpGateTargetId}"]`).getAttribute('data-jumpgatelevel'); let now = Date.now(); this.ogl.json.jumpGateTimers[originCoords] = now + calcTimer(originLevel); this.ogl.json.jumpGateTimers[destinationCoords] = now + calcTimer(destinationLevel); Util.saveData(this.ogl.json); } errorBoxAsArray(a.errorbox); if(typeof(a.newToken) != "undefined") setNewTokenData(a.newToken); } } Util.loop(() => { if(document.querySelector('#jumpgateForm') && !document.querySelector('#jumpgateForm').classList.contains('ogl_ready')) { document.querySelector('#jumpgateForm').classList.add('ogl_ready'); document.querySelectorAll('#jumpgateForm .ship_txt_row:not(.tdInactive)').forEach(ship => { ship.style.position = 'relative'; let delta = ship.appendChild(Util.createDom('div',{'class':'ogl_delta'}, '<i class="material-icons">fiber_smart_record</i>')); delta.addEventListener('click', event => { let input = ship.nextElementSibling.querySelector('input'); let selected = input.value.replace(/\./g, '') || 0; let amount = parseInt(input.getAttribute('rel')); input.value = amount - selected; }); }); } }); this.addTimer(); } addTimer() { this.ogl.planetList.forEach(planet => { let coords = planet.querySelector('.planet-koords').textContent.slice(1, -1); if(this.ogl.json.jumpGateTimers[coords] && this.ogl.json.jumpGateTimers[coords] > Date.now()) { if(!planet.querySelector('.moonlink')) return; let updateTimer = () => new Date(this.ogl.json.jumpGateTimers[coords] - (Date.now() + 3600000)).toLocaleTimeString('fr-FR').substr(3); let timer = updateTimer(); let div = planet.querySelector('.moonlink').appendChild(Util.createDom('div', {'class':'ogl_jumpGateTimer'}, timer)); let interval = setInterval(() => { if(this.ogl.json.jumpGateTimers[coords] <= Date.now()) clearInterval(interval); else div.textContent = updateTimer(); }, 1000); } }); } } class KeyboardManager { constructor(ogl) { this.ogl = ogl; this.dom = (document.querySelector('#cutty') || document.querySelector('#norm')).appendChild(Util.createDom('div', {'class':'ogl_keyList'})); this.addKey('o', this.ogl.component.langManager.getText('nextPlanet'), () => { if(this.ogl.mode == 1 || this.ogl.mode == 4) { window.location.href = this.ogl.component.fleetManager.nextLink; } else { let linkType = this.ogl.current.type == 'planet' ? '.planetlink' : '.moonlink'; if(!this.ogl.current.next.querySelector(linkType)) linkType = '.planetlink'; let url = new URL(window.location.href); url.searchParams.delete('cp'); let cp = new URL(this.ogl.current.next.querySelector(linkType).href).searchParams.get('cp'); url.searchParams.set('cp', cp); window.location.href = url.href; } }); if(Util.getPage() == 'messages') { this.addKey('enter', 'Send fleet on next spies table line', () => { if(document.querySelector('.ogl_spyTable') && document.querySelectorAll('.ogl_spyTable tr:not(.ogl_attacked):not(.ogl_notGray)')[1]) { document.querySelectorAll('.ogl_spyTable tr:not(.ogl_attacked):not(.ogl_notGray)')[1].querySelector('.ogl_shipsLink a').click(); } }); } if(Util.getPage() == 'galaxy') { this.addKey('s', 'Previous galaxy', () => submitOnKey(40)); this.addKey('z|w', 'Next galaxy', () => submitOnKey(38)); this.addKey('q|a', 'Previous system', () => submitOnKey(37)); this.addKey('d', 'Next system', () => submitOnKey(39)); } if(Util.getPage() == 'fleetdispatch') { this.addKey('a', this.ogl.component.langManager.getText('allShipsRes'), () => { if(fleetDispatcher.currentPage == 'fleet1') fleetDispatcher.selectAllShips(); if(fleetDispatcher.currentPage == 'fleet3') fleetDispatcher.selectMaxAll(); fleetDispatcher.refresh(); }); let expeAction = shipID => { let initialValue = this.ogl.json.options.expeShips[0]; this.ogl.json.options.expeShips[0] = shipID; this.ogl.component.fleetManager.expeButtonAction(); this.ogl.json.options.expeShips[0] = initialValue; Util.saveData(this.ogl.json); fleetDispatcher.refresh(); } this.addKey('s', this.ogl.component.langManager.getText('scExpe'), () => { if(fleetDispatcher.currentPage == 'fleet1') expeAction(202); }); this.addKey('l', this.ogl.component.langManager.getText('lcExpe'), () => { if(fleetDispatcher.currentPage == 'fleet1') expeAction(203); }); this.addKey('2-9', this.ogl.component.langManager.getText('splitShipsRes'), keyNumber => { if(!keyNumber) keyNumber = 2; if(fleetDispatcher.currentPage == 'fleet1') { fleetDispatcher.shipsOnPlanet.forEach(ship => fleetDispatcher.selectShip(ship.id, Math.ceil(ship.number / keyNumber))); fleetDispatcher.focusSubmitFleet1(); } else if(fleetDispatcher.currentPage == 'fleet3') { document.querySelectorAll('#fleet3 #resources .res_wrap').forEach((resource, index) => { let cargoType = ['cargoMetal', 'cargoCrystal', 'cargoDeuterium']; let currentMax = this.ogl.component.fleetManager.resOnPlanet[index]; if(index == 2) currentMax -= fleetDispatcher.getConsumption(); fleetDispatcher[cargoType[index]] = Math.max(Math.ceil(currentMax / keyNumber), 0); resource.querySelector('input').value = fleetDispatcher[cargoType[index]]; fleetDispatcher.focusSubmitFleet3(); }); } fleetDispatcher.refresh(); }); this.addKey('p', this.ogl.component.langManager.getText('prevFleet'), () => { if(fleetDispatcher.currentPage != 'fleet1') return; fleetDispatcher.resetShips(); Object.values(this.ogl.json.lastFleet.shipsToSend).forEach(ship => fleetDispatcher.selectShip(ship.id, ship.number)); fleetDispatcher.targetPlanet = this.ogl.json.lastFleet.targetPlanet; fleetDispatcher.speedPercent = this.ogl.json.lastFleet.speedPercent; fleetDispatcher.mission = this.ogl.json.lastFleet.mission; fleetDispatcher.refresh(); fleetDispatcher.cargoMetal = Math.min(this.ogl.json.lastFleet.cargoMetal, fleetDispatcher.metalOnPlanet, fleetDispatcher.getFreeCargoSpace()); fleetDispatcher.cargoCrystal = Math.min(this.ogl.json.lastFleet.cargoCrystal, fleetDispatcher.crystalOnPlanet, fleetDispatcher.getFreeCargoSpace()); fleetDispatcher.cargoDeuterium = Math.min(this.ogl.json.lastFleet.cargoDeuterium, fleetDispatcher.deuteriumOnPlanet, fleetDispatcher.getFreeCargoSpace()); this.ogl.component.fleetManager.tempCoords = [fleetDispatcher.targetPlanet.galaxy, fleetDispatcher.targetPlanet.system,fleetDispatcher.targetPlanet.position, fleetDispatcher.targetPlanet.type]; this.ogl.component.fleetManager.updateSpeedPercent(); fleetDispatcher.refresh(); fleetDispatcher.focusSubmitFleet1(); }); this.addKey('r', this.ogl.component.langManager.getText('reverseAllShipsRes'), () => { if(fleetDispatcher.currentPage == 'fleet1') document.querySelectorAll('#fleet1 li[data-status="on"] .ogl_delta').forEach(e => e.click()); if(fleetDispatcher.currentPage == 'fleet3') document.querySelectorAll('#fleet3 .res_wrap .ogl_delta').forEach(e => e.click()); }); this.addKey('t', this.ogl.component.langManager.getText('attackCurrentTarget'), () => { if(this.ogl.json.options.currentTarget) { fleetDispatcher.resetShips(); let shipID = this.ogl.json.options.defaultShip; this.ogl.component.fleetManager.shipsOnPlanet[shipID] = this.ogl.component.fleetManager.shipsOnPlanet[shipID] || {number:0}; let shipCount = this.ogl.component.fleetManager.calcRequiredShips(shipID, this.ogl.json.options.rval); fleetDispatcher.selectShip(shipID, Math.min(shipCount, this.ogl.component.fleetManager.shipsOnPlanet[shipID].number)); let coords = this.ogl.json.options.currentTarget.split(':'); fleetDispatcher.targetPlanet.galaxy = coords[0]; fleetDispatcher.targetPlanet.system = coords[1]; fleetDispatcher.targetPlanet.position = coords[2]; fleetDispatcher.targetPlanet.type = 1; fleetDispatcher.targetPlanet.name = '-'; fleetDispatcher.mission = 1; fleetDispatcher.refresh(); this.ogl.component.fleetManager.targetSelected = true; this.ogl.component.fleetManager.tempCoords = [fleetDispatcher.targetPlanet.galaxy, fleetDispatcher.targetPlanet.system,fleetDispatcher.targetPlanet.position, fleetDispatcher.targetPlanet.type]; } else { fadeBox(this.ogl.component.langManager.getText('noTargetSelected'), true); } }); } this.sent = false; document.addEventListener('keypress', event => { if(!this.sent && (!document.querySelector('.ui-dialog') || document.querySelector('.ui-dialog').style.display == 'none') && !document.querySelector('.chat_box_textarea:focus') && document.activeElement.tagName != 'INPUT' && document.activeElement.tagName != 'TEXTAREA') { this.sent = true; let keycode = event.keyCode ? event.keyCode : event.which; let keyNumber = parseInt(String.fromCharCode(keycode)); let charList = Object.keys(this.ogl.keyboardActionsList).map(x => x.split('|')); if(keycode == 91 || keycode == 17) return; // windows key charList.forEach(c => { if(c.indexOf(String.fromCharCode(keycode).toLowerCase()) > -1) { this.ogl.keyboardActionsList[c.join('|')](); } else if(keyNumber > 1 && keyNumber <= 9 && keycode) { this.ogl.keyboardActionsList['2-9'] && this.ogl.keyboardActionsList['2-9'](keyNumber); } else if(keycode == 13 && this.ogl.keyboardActionsList['enter']) { this.ogl.keyboardActionsList['enter'](); } }); } }); document.addEventListener('keyup', () => this.sent = false); } addKey(key, text, callback) { this.ogl.keyboardActionsList[key] = callback; let tip = this.dom.appendChild(Util.createDom('div', {'class':'ogl_key tooltipLeft', 'title':text}, key.toUpperCase())); if(key == 'enter') { tip.classList.add('material-icons'); tip.textContent = 'subdirectory_arrow_left'; } tip.addEventListener('click', () => callback()); } } class EmpireManager { constructor(ogl) { this.ogl = ogl; this.saveData(); this.addTimers(); this.displayStats(); this.checkStorage(); } saveData() { let now = Date.now(); let currentCoords = this.ogl.current.coords.join(':'); if(this.ogl.current.type == 'moon') currentCoords += 'M'; this.ogl.json.myEconomy[currentCoords] = this.ogl.json.myEconomy[currentCoords] || {}; if(Util.getPage() == 'supplies' && this.ogl.current.type == 'planet') { this.ogl.json.myEconomy[currentCoords].metal = parseInt((document.querySelector('.metalMine .level') || document.querySelector('.metalMine .targetlevel')).getAttribute('data-value')); this.ogl.json.myEconomy[currentCoords].crystal = parseInt((document.querySelector('.crystalMine .level') || document.querySelector('.crystalMine .targetlevel')).getAttribute('data-value')); this.ogl.json.myEconomy[currentCoords].deut = parseInt((document.querySelector('.deuteriumSynthesizer .level') || document.querySelector('.deuteriumSynthesizer .targetlevel')).getAttribute('data-value')); Util.saveData(this.ogl.json); } if(this.ogl.current.type == 'planet' && (Util.getPage() == 'supplies' || Util.getPage() == 'shipyard')) { let maxCrawler = (this.ogl.json.myEconomy[currentCoords].metal + this.ogl.json.myEconomy[currentCoords].crystal + this.ogl.json.myEconomy[currentCoords].deut) * 8; if(document.querySelector('#officers .geologist.on') && this.ogl.json.playerClass == 1) maxCrawler += maxCrawler * .1; document.querySelector('.technology[data-technology="217"] span').prepend(Util.createDom('div', {'class':'ogl_maxCrawler'}, 'max. ' + Util.formatNumber(Math.floor(maxCrawler)))); } let commander = document.querySelector('.commander.on') ? true : false; if(commander) { let getEmpireResources = i => { $.ajax( { url:`https://${window.location.host}/game/index.php?page=ajax&component=empire&ajax=1&asJson=1&planetType=${i}`, type:'GET', dataType:'json', success:result => { let data = JSON.parse(result.mergedArray).planets; Object.values(data).forEach(p => { let planet = {}; planet.id = p.id; planet.resources = p.production.resources; planet.prod = p.production.hourly; planet.building = [p.production.production[1].number, p.production.production[2].number, p.production.production[3].number]; planet.coords = i == 1 ? p.coordinates.slice(1, -1) + 'M' : p.coordinates.slice(1, -1); this.ogl.json.myEconomy[planet.coords] = this.ogl.json.myEconomy[planet.coords] || {}; this.ogl.json.myEconomy[planet.coords].prodTimer = now; ['metal', 'crystal', 'deut'].forEach((res, index) => { this.ogl.json.myEconomy[planet.coords][res] = planet.building[index]; this.ogl.json.myEconomy[planet.coords]['res'+res] = planet.resources[index]; this.ogl.json.myEconomy[planet.coords]['prod'+res] = (planet.prod[index] / 3600).toFixed(2); if(i != 1) { let target = document.querySelector(`.smallplanet[id="planet-${planet.id}"]`); target.querySelector('.planetlink .ogl_stock .ogl_'+res).textContent = Util.formatToUnits(this.ogl.json.myEconomy[planet.coords]['res'+res]); } else { let target = document.querySelector(`.smallplanet[id="planet-${p.planetID}"]`); target.querySelector('.moonlink .ogl_stock .ogl_'+res).textContent = Util.formatToUnits(this.ogl.json.myEconomy[planet.coords]['res'+res]); } }); }); if(i != 1) getEmpireResources(1); else Util.saveData(this.ogl.json); } }); }; getEmpireResources(0); } ['metal', 'crystal', 'deut'].forEach(res => { let data = resourcesBar.resources[res.replace('deut', 'deuterium')].tooltip; let currentRes = Math.floor(resourcesBar.resources[res.replace('deut', 'deuterium')].amount); let prod = data.replace(/\./g, '').match(/\d+/g)[2]; this.ogl.json.myEconomy[currentCoords]['res'+res] = currentRes; this.ogl.json.myEconomy[currentCoords]['prod'+res] = (prod / 3600).toFixed(2); this.ogl.json.myEconomy[currentCoords].prodTimer = now; Util.saveData(this.ogl.json); }); } addBlackHole() { let dom = document.querySelector('#links .ogl_stats'); let button = dom.appendChild(Util.createDom('button', {'class':'ogl_button material-icons tooltip', 'title':this.ogl.component.langManager.getText('signalBlackhole')}, 'sentiment_very_dissatisfied')); button.addEventListener('click', () => { let date = new Date(); let midnight = new Date(date.getFullYear(), date.getMonth(), date.getDate(), 0, 0, 0).getTime(); let container = Util.createDom('div', {'class':'ogl_blackHole'}); [202,203,204,205,206,207,208,209,210,211,213,214,215,218,219].forEach(shipID => { let content = container.appendChild(Util.createDom('div')); content.appendChild(Util.createDom('div', {'class':'ogl_shipIcon ogl_'+shipID})); content.appendChild(Util.createDom('input', {'type':'text', 'class':'ogl_checkInput', 'data-ship':shipID})); }); let confirmButton = container.appendChild(Util.createDom('button', {'class':'ogl_button'}, 'OK')); confirmButton.addEventListener('click', () => { if(confirm('Do you really want to add this black hole ?')) { let result = {}; container.querySelectorAll('input').forEach(input => { let shipID = parseInt(input.getAttribute('data-ship')); let amount = parseInt(input.value.replace(/[\,\.]/g, '')); if(!isNaN(shipID) && !isNaN(amount)) result[shipID] = amount; }); this.ogl.json.stats[midnight] = this.ogl.json.stats[midnight] = this.ogl.json.stats[midnight] || { idList:[], expe:{}, raid:{}, expeOccurences:{}, consumption:0 }; for(let [k,v] of Object.entries(result)) { this.ogl.json.stats[midnight].expe[k] = (this.ogl.json.stats[midnight].expe[k] || 0) - v; this.ogl.json.stats.total.expe[k] = (this.ogl.json.stats.total.expe[k] || 0) - v; } this.ogl.json.stats[midnight].expeOccurences.blackhole = (this.ogl.json.stats[midnight].expeOccurences.blackhole || 0) + 1; this.ogl.json.stats.total.expeOccurences.blackhole = (this.ogl.json.stats.total.expeOccurences.blackhole || 0) + 1; this.ogl.component.empireManager.displayStats(this.ogl.json.stats.range); Util.saveData(this.ogl.json); document.location.reload(); } }); this.ogl.component.popupManager.open(container); }); } displayStats(days) { if(this.ogl.json.options.togglesOff.indexOf('renta') > -1) return; days = days || this.ogl.json.stats.range; document.querySelector('.ogl_stats') && document.querySelector('.ogl_stats').remove(); let now = new Date(); let midnight = new Date(now.getFullYear(), now.getMonth(), now.getDate(), 0, 0, 0); let aMonth = 30 * 24 * 60 * 60 * 1000; let limitTime = days > 1 ? days * 24 * 60 * 60 * 1000 : now.getTime() - midnight.getTime(); let firstloopDone = false; let result = { raid:{metal:0,crystal:0,deut:0,dm:0}, expe:{metal:0,crystal:0,deut:0,dm:0}, cumul:{metal:0,crystal:0,deut:0,dm:0}, expeOccurences:{resources:0,dm:0,ships:0,item:0,fight:0,blackhole:0,none:0} }; for(let [k,v] of Object.entries(this.ogl.json.stats)) { // delete stats older than 1 month if(!isNaN(k) && now.getTime() - k > aMonth) { delete this.ogl.json.stats[k]; } // delete ignored raid id older than 3 months if(k == 'ignored') { for(let [l,m] of Object.entries(this.ogl.json.stats.ignored)) { if(now.getTime() - m > aMonth * 3) delete this.ogl.json.stats.ignored[l]; } } if((days < 99999999999 && !isNaN(k) && now.getTime() - k <= limitTime) || (days == 99999999999 && !firstloopDone)) { let keyID = days == 99999999999 ? 'total' : k; firstloopDone = true; for(let [i,j] of Object.entries(this.ogl.json.stats[keyID].raid)) { result.raid[i] = (result.raid[i] || 0) + j; result.cumul[i] = (result.cumul[i] || 0) + j; } for(let [i,j] of Object.entries(this.ogl.json.stats[keyID].expe)) { result.expe[i] = (result.expe[i] || 0) + j; if(i != 'item') { if(!this.ogl.shipCost[i]) result.cumul[i] = (result.cumul[i] || 0) + j; else { result.cumul.metal = (result.cumul.metal || 0) + this.ogl.shipCost[i][0] * j; result.cumul.crystal = (result.cumul.crystal || 0) + this.ogl.shipCost[i][1] * j; result.cumul.deut = (result.cumul.deut || 0) + this.ogl.shipCost[i][2] * j; } } } for(let [i,j] of Object.entries(this.ogl.json.stats[keyID].expeOccurences)) { result.expeOccurences[i] = (result.expeOccurences[i] || 0) + j; if(i == 'blackhole') result.expeOccurences['none'] = (result.expeOccurences['none'] || 0) - j; } result.consumption = (result.consumption || 0) + this.ogl.json.stats[keyID].consumption; } } if(this.ogl.json.options.togglesOff.indexOf('ignoreConsumption') > -1) result.cumul.deut += result.consumption; let dom = document.querySelector('#links').appendChild(Util.createDom('div', {'class':'ogl_stats'})); let timeLimits = this.ogl.component.langManager.getText('timeLimits').split(';'); let rawRenta = result.cumul.metal + result.cumul.crystal + result.cumul.deut; let rawProd = this.ogl.totalProd[0] + this.ogl.totalProd[1] + this.ogl.totalProd[2]; let limitDom = dom.appendChild(Util.createDom('div', {'class':'ogl_labelLimit'}, this.ogl.json.stats.range.toString().replace('1', timeLimits[0]).replace('7', timeLimits[1]).replace('30', timeLimits[2]).replace('99999999999', timeLimits[3]))); if(days < 31) { limitDom.className = 'ogl_labelLimit tooltipRight tooltipClose tooltipClick'; limitDom.title = ` ${this.ogl.component.langManager.getText('rentaPerDay').replace('$days', days)} : <span class="ogl_value float_right">${Util.formatNumber(Math.round(rawRenta/days))}</span><br> Production : <span class="ogl_value float_right">${Util.formatNumber(rawProd)}</span> <div class="splitLine"></div> ${this.ogl.component.langManager.getText('totalPerDay').replace('$days', days)} : <span class="ogl_value float_right">${Util.formatNumber(Math.round(rawRenta/days) + rawProd)}</span> `; } for(let [k,v] of Object.entries(result.cumul)) { let line = dom.appendChild(Util.createDom('div')); line.innerHTML = `<div class="ogl_shipIcon ogl_${k}"></div><div class="number tooltip ogl_${k}" title="${this.ogl.component.langManager.getText(k)}: ${Util.formatNumber(v)}">${Util.formatToUnits(v)}</div>`; } let more = dom.appendChild(Util.createDom('button', {'class':'ogl_button material-icons tooltip', 'title':this.ogl.component.langManager.getText('moreStats')}, 'launch')); more.addEventListener('click', () => { this.ogl.component.popupManager.load(); let allStats = Util.createDom('div', {'class':'ogl_fullStats'}); [result.expe, result.raid, result.cumul].forEach(stats => { let totalOccurences = stats == result.expe ? Object.values(result.expeOccurences).reduce((a,b) => a+b, 0) : 0; let title = stats == result.expe ? `Expeditions<br>(${totalOccurences})` : stats == result.raid ? 'Raids' : 'Total'; let container = allStats.appendChild(Util.createDom('div', {}, '<h2>'+title+'</h2>')); let chart = container.appendChild(Util.createDom('div', {'class':'ogl_pie'})); let labels = stats == result.expe ? container.appendChild(Util.createDom('div', {'class':'ogl_pieLabel'})) : false; let itemContainer = container.appendChild(Util.createDom('div', {'class':'ogl_pieItems'})); let piePercent = stats == result.expe ? result.expeOccurences : stats; let dataSum = Object.values(piePercent).reduce((a,b) => b>0 ? a+b : a+0, 0); let pieStats = Object.values(piePercent).map(x => (1 / (dataSum / x) * 100)); let gradient = ''; let sum = 0; let colors = ['var(--yellow)', 'var(--dm)', '#577af9', 'var(--red)', 'var(--green)', '#926042', 'gray']; if(stats != result.expe) colors = ['var(--metal)', 'var(--crystal)', 'var(--deut)', 'var(--dm)']; let itemList = stats == result.expe ? ['metal','crystal','deut','dm',202,203,204,205,206,207,208,209,210,211,213,215,218,219] : ['metal','crystal','deut','dm']; itemList.forEach(item => { let box = itemContainer.appendChild(Util.createDom('div', {'class':'ogl_item'})); box.innerHTML = `<div class="ogl_shipIcon ogl_${item}"></div><div class="number ogl_${item}">${Util.formatToUnits(stats[item])}</div>`; }); pieStats.forEach((v, index) => { gradient += `${colors[index]} ${Math.max(sum, 0)||0}%, ${colors[index]} ${Math.max(sum + v, 0)||0}%, `; sum += v; if(index == pieStats.length-1 && (isNaN(sum) || sum < 0)) gradient = ''; }); if(stats == result.expe) { itemContainer.classList.add('tooltipRight'); itemContainer.title = ` <div class="ogl_expeditionTooltip"> <h3>Expeditions Total</h3> <div class="ogl_shipIcon ogl_metal"></div><div class="ogl_metal">${Util.formatToUnits(result.cumul.metal - result.raid.metal)}</div> <div class="ogl_shipIcon ogl_crystal"></div><div class="ogl_crystal">${Util.formatToUnits(result.cumul.crystal - result.raid.crystal)}</div> <div class="ogl_shipIcon ogl_deut"></div><div class="ogl_deut">${Util.formatToUnits(result.cumul.deut - result.raid.deut)}</div> </div>`; Object.entries(piePercent).forEach((e, index) => { if(e[0] == 'none') e[0] = 'other'; let label = labels.appendChild(Util.createDom('div', {}, `<span>${this.ogl.component.langManager.getText(e[0])}</span><span>${Util.formatToUnits(Math.max(0, e[1]))}</span><b>(${Math.max(0, pieStats[index].toFixed(2)) || 0}%)</b>`)); label.prepend(Util.createDom('div', {'style':'background:'+colors[index]})); }); } chart.style.background = `conic-gradient(${gradient}#000)`; }); let links = allStats.appendChild(Util.createDom('div', {'class':'ogl_statsLimit'})); let timeLimits = this.ogl.component.langManager.getText('timeLimits').split(';'); [1,7,30,99999999999].forEach(i => { let link = links.appendChild(Util.createDom('div', {}, i.toString().replace('1', timeLimits[0]).replace('7', timeLimits[1]).replace('30', timeLimits[2]).replace('99999999999', timeLimits[3]))); if(i == this.ogl.json.stats.range) link.classList.add('ogl_active'); link.addEventListener('click', () => { this.ogl.json.stats.range = i; Util.saveData(this.ogl.json); this.displayStats(i); document.querySelectorAll('.ogl_stats .ogl_button')[0].click(); }); }); setTimeout(() => this.ogl.component.popupManager.open(allStats), 500); }); let reset = dom.appendChild(Util.createDom('button', {'class':'ogl_button material-icons tooltip', 'title':this.ogl.component.langManager.getText('eraseData')}, 'delete_sweep')); reset.addEventListener('click', () => { if(confirm('Do you want to erase stats data ?')) { delete this.ogl.json.stats; Util.saveData(this.ogl.json); document.location.reload(); } }); this.addBlackHole(); } addTimers() { let now = Date.now(); let currentCoords = this.ogl.current.coords.join(':'); if(!this.ogl.json.myActivities[currentCoords]) this.ogl.json.myActivities[currentCoords] = [0, 0]; let planetActivity = this.ogl.json.myActivities[currentCoords][0]; let moonActivity = this.ogl.json.myActivities[currentCoords][1]; if(this.ogl.current.type == 'moon') moonActivity = now; else planetActivity = now; this.ogl.json.myActivities[currentCoords] = [planetActivity, moonActivity]; Util.saveData(this.ogl.json); if(this.ogl.json.options.togglesOff.indexOf('timers') > -1) return; this.ogl.planetList.forEach(planet => { let coords = planet.querySelector('.planet-koords').textContent.slice(1, -1); let timers = this.ogl.json.myActivities[coords] || [0,0]; //let pTimer = planet.querySelector('.planetlink').appendChild(Util.createDom('div', {'class':'ogl_timer ogl_medium ogl_short', 'data-timer':Math.min(Math.round((now - timers[0]) / 60000), 60)})); let pt = Math.min(Math.round((now - timers[0]) / 60000), 60); let pTimer = planet.querySelector('.planetlink').appendChild(Util.createDom('div', {'class':'ogl_timer ogl_medium ogl_short', 'title':this.ogl.component.langManager.getText('timerInfo'), 'data-timer':pt})); this.updateTimer(pTimer, timers[0]); setInterval(() => this.updateTimer(pTimer, timers[0]), 20000); if(planet.querySelector('.moonlink')) { //let mTimer = planet.querySelector('.moonlink').appendChild(Util.createDom('div', {'class':'ogl_timer ogl_medium ogl_short', 'data-timer':Math.min(Math.round((now - timers[1]) / 60000), 60)})); let mt = Math.min(Math.round((now - timers[1]) / 60000), 60); let mTimer = planet.querySelector('.moonlink').appendChild(Util.createDom('div', {'class':'ogl_timer ogl_medium ogl_short', 'title':this.ogl.component.langManager.getText('timerInfo'), 'data-timer':mt})); this.updateTimer(mTimer, timers[1]); setInterval(() => this.updateTimer(mTimer, timers[1]), 20000); } }); } updateTimer(element, timer) { let time = Math.min(Math.round((Date.now() - timer) / 60000), 60); if(time >= 15) element.classList.remove('ogl_short'); if(time >= 30) element.classList.remove('ogl_medium'); if(time >= 60) return; element.setAttribute('data-timer', time); element.title = time; } checkStorage() { if(this.ogl.current.type == 'moon') return; let storage = { 'metal' : resourcesBar.resources.metal.storage, 'crystal' : resourcesBar.resources.crystal.storage, 'deut' : resourcesBar.resources.deuterium.storage, }; ['metal', 'crystal', 'deut'].forEach(res => { let data = resourcesBar.resources[res.replace('deut', 'deuterium')].tooltip; let prod = data.replace(/\./g, '').match(/\d+/g)[2]; let timeLeft = prod > 0 ? Math.floor((storage[res] - this.ogl.resources[res]) / prod) || 0 : 0; let day = Math.floor(timeLeft / 24); let hour = Math.floor(timeLeft % 24); let box = document.querySelector(`#${res.replace('deut', 'deuterium')}_box`); box.querySelector('.resourceIcon').appendChild(Util.createDom('div', {'class':'ogl_storage'}, `${day}${LocalizationStrings.timeunits.short.day} ${hour}${LocalizationStrings.timeunits.short.hour}`)); }); } } class PlayerManager { constructor(ogl) { this.ogl = ogl; this.ogl.tooltipList = this.ogl.tooltipList || {}; this.playerList = {}; if(Util.getPage() == 'galaxy') { Util.loop(() => { this.stalkPlayers(); this.checkCurrentGalaxy(); }); } } deleteTarget(galaxy, system, position) { let coords = `${galaxy}:${system}:${position}`; let sideTarget = document.querySelector(`.ogl_sideView div[data-galaxy="${galaxy}"][data-system="${system}"][data-position="${position}"]`); if(this.ogl.json.options.currentTarget == coords) this.ogl.json.options.currentTarget = null; sideTarget && sideTarget.remove(); delete this.ogl.json.stalkList[coords]; Util.saveData(this.ogl.json); } stalkPlayers() { document.querySelectorAll('#galaxytable tbody tr:not(.ogl_ready)').forEach(line => { line.classList.add('ogl_ready'); if(!line.querySelector('.position')) return; this.ogl.component.tooltipManager.close(); let player = {}; let position = line.querySelector('.position').textContent; let coords = `${galaxy}:${system}:${position}`; if(line.querySelector('.playername').textContent.trim().length == 0) { if(this.ogl.json.stalkList[coords]) { this.deleteTarget(galaxy, system, position); } return; } if(!line.querySelector('.playername a') && !line.querySelector('.playername span[class^="status_abbr"]')) return; else if(!line.querySelector('.playername a') && this.ogl.playerName.indexOf(line.querySelector('.playername span[class^="status_abbr"]').textContent.trim().replace('...', '')) == 0) { player.id = this.ogl.playerID; if(!this.playerList[player.id]) { let highscore = document.querySelector('#bar a[href$="page=highscore"]'); this.ogl.tooltipList['#player' + player.id] = Util.createDom('div', {'class':'htmlTooltip galaxyTooltip'}); this.ogl.tooltipList['#player' + player.id].innerHTML = ` <h1> <span class="status_abbr_active">${document.querySelector('#bar a[href$="changenick"]').textContent}</span> </h1> <ul class="ListLinks"> <li class="rank"><a href="${highscore.getAttribute('href')}">${highscore.parentNode.textContent.match(/\d+/g)[0]}</a></li> </ul> `; } line.querySelector('.playername').innerHTML = `<a href="javascript:void(0);" class="tooltipRel tooltipClose tooltipRight js_hideTipOnMobile">${line.querySelector('.playername').innerHTML}</a>`; line.querySelector('.playername a').setAttribute('rel', 'player' + player.id); } else if(line.querySelector('.playername a')) player.id = line.querySelector('.playername a').getAttribute('rel').replace('player', ''); else player.id = -1; if(line.querySelector('.playername').textContent.trim().length == 0) return; line.setAttribute('data-player', player.id); if(this.ogl.json.stalkList[coords] && this.ogl.json.stalkList[coords].player == -1) { this.ogl.json.stalkList[coords].player = player.id; this.ogl.json.stalkList[coords].id = line.querySelector('td[data-planet-id]').getAttribute('data-planet-id'); Util.saveData(this.ogl.json); } if(this.ogl.json.stalkList[coords] && this.ogl.json.stalkList[coords].player != player.id && this.ogl.json.stalkList[coords].player != -1) { this.deleteTarget(galaxy, system, position); } if(this.playerList[player.id]) { player = this.playerList[player.id]; } else { this.playerList[player.id] = player; if(line.querySelector('.playername.admin')) return; if(!this.ogl.tooltipList['#player' + player.id] && !document.querySelector('#player' + player.id)) return; player.tooltip = this.ogl.tooltipList['#player' + player.id] || document.querySelector('#player' + player.id); player.name = player.tooltip.querySelector('h1 span').textContent; player.ranking = player.tooltip.querySelector('.rank a') || player.tooltip.querySelector('.ogl_ranking a') || Util.createDom('s', {}, '(b)'); player.write = player.tooltip.querySelector('a[href*="page=chat"]') || player.tooltip.querySelector('a.sendMail'); player.buddy = player.tooltip.querySelector('a[href*="component=buddies"]'); player.ignore = player.tooltip.querySelector('a[href*="page=ignorelist"]'); player.status = line.querySelector('.status'); player.color = (player.status.querySelector('span') || Util.createDom('span')).getAttribute('class'); player.planets = {}; Util.loadPageContent(`https://${window.location.host}/api/playerData.xml?id=${player.id}`, 'text/xml', result => { player.update = parseInt(result.querySelector('playerData').getAttribute('timestamp')); player.total = parseInt(result.querySelector('position[type="0"]').getAttribute('score')); player.eco = parseInt(result.querySelector('position[type="1"]').getAttribute('score')); player.tech = parseInt(result.querySelector('position[type="2"]').getAttribute('score')); player.power = parseInt(result.querySelector('position[type="3"]').getAttribute('score')); player.def = Math.max(player.power - (player.total - player.eco - player.tech), 0); player.fleet = player.power - player.def; let planetList = this.ogl.component.planetManager.buildPlanetList(result); this.ogl.tooltipList['#player' + player.id] = this.ogl.tooltipList['#player' + player.id] || document.querySelector('#player' + player.id); this.ogl.tooltipList['#player' + player.id].classList.add('ogl_stalk'); this.ogl.tooltipList['#player' + player.id].innerHTML = ` <h1><span class="${player.color}">${player.name}</span><span class="ogl_ranking">#${player.ranking.outerHTML}</span></h1> <div class="ogl_actions"></div> <div class="splitLine"></div> <div class="ogl_stalkInfo"> <div class="ogl_stalkPoints"> <div title="${Util.formatNumber(player.total)}"><i class="material-icons">star</i>${Util.formatToUnits(player.total)}</div> <div title="${Util.formatNumber(player.eco)}"><i class="material-icons">attach_money</i>${Util.formatToUnits(player.eco)}</div> <div title="${Util.formatNumber(player.tech)}"><i class="material-icons">science</i>${Util.formatToUnits(player.tech)}</div> <div title="${Util.formatNumber(player.fleet)}"><i class="material-icons">military_tech</i>${Util.formatToUnits(player.fleet)}</div> <div title="${Util.formatNumber(player.def)}"><i class="material-icons">security</i>${Util.formatToUnits(player.def)}</div> </div> </div> <div class="splitLine"></div> <div class="ogl_colorAll"></div> `; let container = this.ogl.tooltipList['#player' + player.id].querySelector('.ogl_stalkInfo').appendChild(Util.createDom('div', {'class':'ogl_stalkPlanets'})); this.ogl.tooltipList['#player' + player.id].appendChild(Util.createDom('div', {'class':'splitLine'})); this.ogl.tooltipList['#player' + player.id].appendChild(Util.createDom('div', {'class':'float_right'}, `<div>${new Date(player.update * 1000).toLocaleDateString('fr-FR')}</div>`)); this.ogl.tooltipList['#player' + player.id].appendChild(Util.createDom('div', {'class':'float_left'}, `<div>${planetList.length} ${this.ogl.component.langManager.getText('planets')}</div>`)); let actions = this.ogl.tooltipList['#player' + player.id].querySelector('.ogl_actions'); let iconList = ['person_add_alt_1', 'block', 'create'] let actionList = [player.buddy, player.ignore, player.write]; if(iconList.length > 0) { actionList.forEach((button, index) => { if(button) { button.textContent = iconList[index]; actions.appendChild(button); } else actions.appendChild(Util.createDom('div', {'class':'ogl_invisible'})); }); } let lockButton = actions.appendChild(Util.createDom('div', {'class':'material-icons ogl_pin'}, 'push_pin')); lockButton.addEventListener('click', () => { this.ogl.json.options.pinned = player; Util.saveData(this.ogl.json); this.ogl.component.sideViewManager.checkPinnedContent(); }); let stats = actions.appendChild(Util.createDom('a', {'class':'material-icons ogl_mmorpgstats'}, 'leaderboard')); stats.addEventListener('click', () => { let lang = ['fr', 'de', 'en', 'es', 'pl', 'it', 'ru', 'ar', 'mx', 'tr', 'fi', 'tw', 'gr', 'br', 'nl', 'hr', 'sk', 'cz', 'ro', 'us', 'pt', 'dk', 'no', 'se', 'si', 'hu', 'jp', 'ba'].indexOf(this.ogl.lang); let link = `https://www.mmorpg-stat.eu/0_fiche_joueur.php?pays=${lang}&ftr=${player.id.replace(/\D/g,'')}.dat&univers=_${this.ogl.universeNumber}`; window.open(link, '_blank'); }); let sendProbes = (event, planet, type) => { event.stopPropagation(); event.preventDefault(); this.ogl.component.fleetManager.sendSpyProbe([planet.galaxy, planet.system, planet.position, type], this.ogl.json.spyProbesCount, event.target); }; planetList.forEach(planet => { let div = container.appendChild(Util.createDom('div', {'data-coords':planet.coords})); div.appendChild(Util.createDom('span', {}, planet.coords)); let mSpy = div.appendChild(Util.createDom('div', {'class':'ogl_moonIcon material-icons', 'data-type':3}, 'brightness_2')); let pSpy = div.appendChild(Util.createDom('div', {'class':'ogl_planetIcon material-icons', 'data-type':1}, 'language')); pSpy.addEventListener('click', event => sendProbes(event, planet, 1)); mSpy.addEventListener('click', event => sendProbes(event, planet, 3)); if(planet.main) div.appendChild(Util.createDom('span', {'class':'ogl_mainPlanet material-icons'}, 'star')); if(planet.moon) mSpy.classList.add('ogl_active'); if(this.ogl.json.stalkList[planet.coords]) div.setAttribute('data-color', this.ogl.json.stalkList[planet.coords].color); else div.removeAttribute('data-color'); div.addEventListener('click', () => { this.ogl.component.tooltipManager.close(); this.ogl.component.planetManager.goToPosition(planet.galaxy, planet.system, planet.position); }); player.planets[planet.coords] = planet; }); let colors = this.ogl.tooltipList['#player' + player.id].querySelector('.ogl_colorAll'); ['red', 'halfred', 'yellow', 'halfyellow', 'green', 'halfgreen', 'blue', 'halfblue', 'violet', 'halfviolet', 'gray', 'none'].forEach(color => { let colorAll = colors.appendChild(Util.createDom('div', {'data-color':color})); if(color == 'none') colorAll.textContent = 'clear'; colorAll.addEventListener('click', () => { this.ogl.component.planetManager.colorizeAllPlanets(player.id, planetList, color); document.querySelectorAll(`tr[data-player="${player.id}"]`).forEach(tr => tr.classList.remove('ogl_ready')); delete this.playerList[player.id]; }); }); this.playerList[player.id] = player; }); } if(!player.ranking) return; if(!line.querySelector('.playername .float_right')) { let div = line.querySelector('.playername').appendChild(Util.createDom('div', {'class':'float_right'})); div.innerHTML = `#${player.ranking.outerHTML}`; } let planetID = line.querySelector('td[data-planet-id]') ? line.querySelector('td[data-planet-id]').getAttribute('data-planet-id') : 0; if(this.ogl.json.stalkList[coords]) line.setAttribute('data-color', this.ogl.json.stalkList[coords].color); else line.removeAttribute('data-color'); this.ogl.component.planetManager.buildColorPicker(line.querySelector('.allytag'), {player:player.id, planet:planetID, coords:coords}); let pinnedPosition = document.querySelector(`.ogl_pinnedContent div[data-coords="${coords}"]`); if(pinnedPosition) { let pActivityDom = line.querySelector('td[data-planet-id] .activity') || Util.createDom('div'); let mActivitydom = line.querySelector('.moon .activity') || Util.createDom('div', {}, '60'); let pActivity = pActivityDom.classList.contains('minute15') ? '*' : parseInt(pActivityDom.textContent.trim() || 60); let mActivity = mActivitydom.classList.contains('minute15') ? '*' : parseInt(mActivitydom.textContent.trim() || 60); this.ogl.json.options.pinned.planets[coords].activity = pActivity; if(this.ogl.json.options.pinned.planets[coords].moon) this.ogl.json.options.pinned.planets[coords].moon.activity = mActivity; Util.saveData(this.ogl.json); let pActivityDiv = pinnedPosition.querySelector('.ogl_planetActivity'); let mActivityDiv = pinnedPosition.querySelector('.ogl_moonActivity'); if(pActivityDiv) { pActivityDiv.textContent = pActivity; pActivityDiv.className = 'ogl_planetActivity'; if(pActivity == '*') pActivityDiv.classList.add('ogl_short'); } if(mActivityDiv) { mActivityDiv.textContent = mActivity; mActivityDiv.className = 'ogl_moonActivity'; if(mActivity == '*') mActivityDiv.classList.add('ogl_short'); } } }); } checkCurrentGalaxy() { document.querySelectorAll('.ogl_stalkPlanets [data-coords]').forEach(planet => { let coords = planet.getAttribute('data-coords').split(':'); if(coords[0] == galaxy && coords[1] == system) { planet.classList.add('ogl_active'); } else { planet.classList.remove('ogl_active'); } }); if(!this.spyProbeCountDone && document.querySelector('a[onclick*="sendShips"]')) { let ships = document.querySelector('a[onclick*="sendShips"]').getAttribute('onclick').match(/\d+/g).map(Number); if(ships[0] == 6) { this.ogl.json.spyProbesCount = ships[5]; this.spyProbeCountDone = true; Util.saveData(this.ogl.json); } } } } class TimeManager { constructor(ogl) { this.ogl = ogl; this.currentDetail; this.checkCurrentBuilding() Util.loop(() => { let list = []; list.push({domElement:document.querySelectorAll('#bar ul li.OGameClock, #arrivalTime, #returnTime'), observe:true}); list.push({domElement:document.querySelectorAll('.msg_date, .eventFleet .arrivalTime, .fleetDetails .absTime, .fleetDetails .nextabsTime')}); list.forEach(domList => { domList.domElement.forEach(element => { if(!element.classList.contains('ogl_ready')) { element.classList.add('ogl_ready'); this.updateTime(element); if(domList.observe) this.observe(element); } }); }); }); let pages = ['supplies', 'facilities', 'shipyard', 'defenses', 'research']; if(pages.indexOf(Util.getPage()) > -1) this.checkDetail(); } observe(target) { let observer = new MutationObserver(() => this.updateTime(target)); observer.observe(target, {childList:true}); } updateTime(domElement) { domElement.classList.add('ogl_hiddenContent'); domElement.classList.add('ogl_timeZone'); domElement.setAttribute('title', domElement.innerHTML); let time = domElement.textContent; let newTime; let timeMode = false; if(!time) return; time = time.replace(/ \.$/, ''); time = time.trim().replace(/[ \.]/g, ':'); time = time.split(':'); if(time.length <= 5) { timeMode = true; time = ["01","01","2000"].concat(time); } time.forEach((t, index) => time[index] = t.padStart(2, '0')); if(time[2].length == 2) time[2] = '20' + time[2]; newTime = new Date(`${time[2]}-${time[1]}-${time[0]}T${time[3]}:${time[4]}:${time[5]}`).getTime(); newTime = new Date(newTime - Math.round(timeDiff / 100000) * 100000); domElement.setAttribute('data-timestamp', newTime.getTime()); if(timeMode) { domElement.setAttribute('data-timezone', newTime.toLocaleTimeString('fr-FR')); } else { domElement.classList.add('ogl_fulldate'); domElement.setAttribute('data-datezone', `${newTime.toLocaleDateString('fr-FR').replace(/\//g, '.')} `); domElement.setAttribute('data-timezone', ` ${newTime.toLocaleTimeString('fr-FR')}`); } } checkCurrentBuilding() { let countDownID = ['buildingCountdown', 'researchCountdown', 'shipyardCountdown2']; ['restTimebuilding', 'restTimeresearch', 'restTimeship2'].forEach((building, index) => { try { let time = new Date(localTime.getTime() + eval(building) * 1000); let parent = document.querySelector(`span#${countDownID[index]}`).closest('.content'); let div = parent.appendChild(Util.createDom('div', {'class':'ogl_endTime'})); div.innerHTML = `${time.toLocaleDateString('fr-FR').replace(/\//g, '.')} <span>${time.toLocaleTimeString('fr-FR')}</span>`; } catch(e){} }); } updateBuildTime(totalTime, domTime) { let seconds = totalTime; let d = Math.floor(seconds / (3600*24)); let h = Math.floor(seconds % (3600*24) / 3600); let m = Math.floor(seconds % 3600 / 60); let s = Math.floor(seconds % 60); domTime.textContent = ''; if(d > 0) domTime.textContent += `${d}${LocalizationStrings.timeunits.short.day} `; if(h > 0) domTime.textContent += `${h}${LocalizationStrings.timeunits.short.hour} `; if(m > 0) domTime.textContent += `${m}${LocalizationStrings.timeunits.short.minute} `; if(s > 0) domTime.textContent += `${s}${LocalizationStrings.timeunits.short.second}`; } checkDetail() { Util.updateCheckIntInput(() => check()); let check = () => { let detail = this.currentDetail; detail && detail.querySelector('.costs li') && detail.querySelectorAll('.costs li').forEach(res => { let amount = Math.max(parseInt(detail.querySelector('#build_amount').value), 1) || 1; let resValue = res.getAttribute('data-value') * amount; let domTime = detail.querySelector('.build_duration time'); let baseTime = domTime.getAttribute('datetime').replace('PT', '').replace('P', ''); let totalTime = 0; let indexArr = baseTime.match(/\D+/g).map(String); let valueArr = baseTime.match(/\d+/g).map(Number); valueArr.forEach((value, index) => { if(indexArr[index] == "DT") totalTime += value * 86400; if(indexArr[index] == "H") totalTime += value * 3600; if(indexArr[index] == "M") totalTime += value * 60; if(indexArr[index] == "S") totalTime += value; }); this.updateBuildTime(totalTime * amount, domTime); if((res.classList.contains('metal') && this.ogl.resources.metal >= resValue) || (res.classList.contains('crystal') && this.ogl.resources.crystal >= resValue) || (res.classList.contains('deuterium') && this.ogl.resources.deut >= resValue)) { res.classList.add('ogl_active'); res.classList.remove('ogl_noMoney'); } else { res.classList.remove('ogl_active'); res.classList.add('ogl_noMoney'); } if(!isNaN(resValue)) { let techID = parseInt(detail.getAttribute('data-technology-id')); if(techID == 212) { let bonus = detail.querySelector('.energy_production span.bonus'); let bonusScaled = parseInt(bonus.getAttribute('data-value')) * amount; bonus.textContent = `(+${Util.formatNumber(bonusScaled)})`; } res.setAttribute('data-total', resValue); res.textContent = Util.formatToUnits(resValue); } }); } Util.loop(() => { let detail = document.querySelector('#technologydetails'); if(detail) { this.currentDetail = detail; let techID = parseInt(detail.getAttribute('data-technology-id')); let li = detail.querySelector('.ogl_endTime') || detail.querySelector('.build_duration').appendChild(Util.createDom('div', {'class':'ogl_endTime'})); let domTime = detail.querySelector('.build_duration time'); let baseTime = domTime.getAttribute('datetime').replace('PT', '').replace('P', ''); let levelTime; let totalTime = 0; let offset = 0; let indexArr = baseTime.match(/\D+/g).map(String); let valueArr = baseTime.match(/\d+/g).map(Number); if(!detail.querySelector('.ogl_energyLeft')) { let energy = detail.querySelector('.additional_energy_consumption span'); let energyLeft = !energy ? 0 : parseInt(document.querySelector('#resources_energy').getAttribute('data-raw')) - parseInt(energy.getAttribute('data-value')); energyLeft && energy.parentNode.appendChild(Util.createDom('span', {'class':`ogl_energyLeft ${energyLeft > 0 ? 'ogl_ok' : 'ogl_danger'}`}, ' ('+Util.formatNumber(energyLeft)+')')); } valueArr.forEach((value, index) => { if(indexArr[index] == "DT") totalTime += value * 86400; if(indexArr[index] == "H") totalTime += value * 3600; if(indexArr[index] == "M") totalTime += value * 60; if(indexArr[index] == "S") totalTime += value; }); if(techID < 100 && typeof restTimebuilding !== 'undefined') offset = restTimebuilding; else if(techID < 200 && typeof restTimeresearch !== 'undefined') offset = restTimeresearch; else if(techID < 300 && typeof restTimeship2 !== 'undefined') offset = restTimeship2; let domLevel = detail.querySelector('.information .level'); if(domLevel) { let ratio = parseFloat(domLevel.getAttribute('data-ratio')); let step = parseInt(domLevel.getAttribute('data-step')); levelTime = (!isNaN(step) && !isNaN(ratio)) ? Math.pow(ratio, step) : 1; } let amount = detail.querySelector('#build_amount') ? parseInt(detail.querySelector('#build_amount').value) || 1 : levelTime; let time = new Date(localTime.getTime() + offset * 1000 + totalTime * amount * 1000); li.innerHTML = `${time.toLocaleDateString('fr-FR').replace(/\//g, '.')} <span>${time.toLocaleTimeString('fr-FR')}</span>`; if(domLevel) { this.updateBuildTime(totalTime * amount, domTime); } if(!detail.classList.contains('ogl_ready') && detail.querySelector('#build_amount')) { detail.classList.add('ogl_ready'); detail.querySelector('#build_amount').addEventListener('focus', () => setTimeout(check(detail), 500)); detail.querySelector('.build_amount .maximum') && detail.querySelector('.build_amount .maximum').addEventListener('click', () => setTimeout(() => check(detail), 100)); } } }); } } class MessageManager { constructor(ogl) { this.ogl = ogl; this.spyTable; this.dataList = []; this.tableReady = false; if(Util.getPage() == 'messages') { Util.loadPageContent(`https://${window.location.host}/game/index.php?page=componentOnly&component=fleetdispatch&ajax=1`, 'text/html', result => { document.head.appendChild(Util.createDom('script', {}, result.querySelector('#fleetdispatch > script').textContent.split('var expeditionCount')[0])); shipsOnPlanet.forEach(ship => { if(ship.id == this.ogl.json.options.defaultShip) this.availableShips = ship.number; }); Util.loop(() => this.checkCurrentTab()); }); Util.loop(() => { if(!document.querySelector('#tabs-nfFleets[tabindex="0"]')) return; let detail = document.querySelector('.detail_msg'); if(detail && detail.getAttribute('data-message-type') == 10 && !detail.classList.contains('ogl_detailReady')) { detail.classList.add('ogl_detailReady'); let apiKey = Util.createDom('div', {}); //apiKey.innerHTML = detail.querySelector('.icon_apikey').getAttribute('data-tooltip') || detail.querySelector('.icon_apikey').getAttribute('title'); apiKey.innerHTML = detail.querySelector('.icon_apikey').getAttribute('title'); apiKey = apiKey.querySelector('input').value; let simButton = detail.querySelector('.msg_actions').appendChild(Util.createDom('div', {'class':'icon_nf ogl_sim'}, 'S')); simButton.addEventListener('click', () => window.open(Util.genTrashsimLink(apiKey, this.ogl), '_blank')); } }); } } cleanString(str) { ['.', '(', ')', ':'].forEach(car => str = str.replace(new RegExp('\\'+car, 'g'), '')); return str; } getExpeValue(locaAttr, message) { let regex = new RegExp(this.cleanString(locaAttr)+' (\\d+)', 'g'); return parseInt(regex.exec(this.cleanString(message.innerHTML))[1]); } checkCurrentTab() { if(document.querySelector('#tabs-nfFleets.ui-state-active') && document.querySelector('#subtabs-nfFleet20.ui-state-active')) { this.checkReports(); this.spyTable && this.spyTable.classList.remove('ogl_hidden'); document.querySelector('#subtabs-nfFleetTrash .ogl_trash') && document.querySelector('#subtabs-nfFleetTrash .ogl_trash').classList.remove('ogl_hidden'); } else { this.spyTable && this.spyTable.classList.add('ogl_hidden'); document.querySelector('#subtabs-nfFleetTrash .ogl_trash') && document.querySelector('#subtabs-nfFleetTrash .ogl_trash').classList.add('ogl_hidden'); } if(this.spyTable && !this.spyTable.classList.contains('ogl_hidden')) { document.querySelector('.ogl_key.material-icons') && document.querySelector('.ogl_key.material-icons').classList.remove('ogl_hidden'); } else { document.querySelector('.ogl_key.material-icons') && document.querySelector('.ogl_key.material-icons').classList.add('ogl_hidden'); } if(document.querySelector('#tabs-nfFleets.ui-state-active') && document.querySelector('#subtabs-nfFleet21.ui-state-active')) this.checkRaid(); else if(document.querySelector('#tabs-nfFleets.ui-state-active') && document.querySelector('#subtabs-nfFleet22.ui-state-active')) this.checkExpeditions(); else if(document.querySelector('#tabs-nfFleets.ui-state-active') && document.querySelector('#subtabs-nfFleet24.ui-state-active')) this.checkDebris(); } checkReports() { if(document.querySelector('#subtabs-nfFleetTrash.ui-state-active') || this.ogl.json.options.togglesOff.indexOf('spytable') > -1) return; if(!document.querySelector('#subtabs-nfFleetTrash .ogl_trash')) { let deleteSpyDef = document.querySelector('#subtabs-nfFleetTrash').appendChild(Util.createDom('div', {'class':'icon icon_trash ogl_trash tooltip', 'title':this.ogl.component.langManager.getText('deleteSpyDef')})); deleteSpyDef.addEventListener('click', () => { document.querySelectorAll('.msg').forEach(e => { if(e.querySelector('.espionageDefText')) e.querySelector('.icon_refuse').click(); }); }); } let messages = document.querySelectorAll('.msg:not(.ogl_ready)'); if(messages.length > 0) this.dataList = []; messages.forEach((report, index) => { if(!report.querySelector('.ogl_timeZone')) return; report.classList.add('ogl_ready'); let params = new URLSearchParams(report.querySelector('.msg_head a').href); let compacting = report.querySelectorAll('.compacting'); if(compacting.length > 0) { let data = {}; data.id = report.getAttribute('data-msg-id'); data.date = report.querySelector('.msg_date').getAttribute('data-timestamp'); data.status = compacting[0].querySelectorAll('span[class^="status"]')[0].className; data.name = compacting[0].querySelectorAll('span[class^="status"]')[0].textContent.replace(/ /g,'').trim(); data.coords = [params.get('galaxy'), params.get('system'), params.get('position')]; data.tmpCoords = data.coords.map(x => x.padStart(3, '0')).join(''); data.type = report.querySelector('.msg_head figure.moon') ? 3 : 1; data.color = (this.ogl.json.stalkList[data.coords.join(':')] || {}).color; data.activity = compacting[0].querySelectorAll('span.fright')[0].textContent ? parseInt(compacting[0].querySelectorAll('span.fright')[0].textContent.match(/\d+/)[0]) : -1; data.resources = [ Util.formatFromUnits(compacting[2].querySelectorAll('.resspan')[0].textContent.replace(/(\D*)/, '')), Util.formatFromUnits(compacting[2].querySelectorAll('.resspan')[1].textContent.replace(/(\D*)/, '')), Util.formatFromUnits(compacting[2].querySelectorAll('.resspan')[2].textContent.replace(/(\D*)/, '')), ]; data.total = data.resources.reduce((sum, x) => sum + x); data.loot = parseInt(compacting[3].querySelector('.ctn').textContent.replace(/(\D*)/, '').replace(/%/, '')) / 100; data.renta = Math.ceil(data.total * data.loot); data.fleet = compacting[4].querySelectorAll('span').length > 0 ? Util.formatFromUnits(compacting[4].querySelectorAll('span.ctn')[0].textContent.replace(/(\D*)/, '').split(' ')[0]) : -1; data.defense = compacting[4].querySelectorAll('span').length > 1 ? Util.formatFromUnits(compacting[4].querySelectorAll('span.ctn')[1].textContent.replace(/(\D*)/, '').split(' ')[0]) : -1; data.attacked = report.querySelector('.msg_actions .icon_attack img') ? true : false; data.trash = report.querySelector('.msg_head .fright a .icon_refuse'); data.detail = report.querySelector('.msg_actions a.fright').href; data.spy = report.querySelector('a[onclick*="sendShipsWithPopup"]').getAttribute('onclick'); data.api = report.querySelector('.icon_apikey'); data.dom = report; if(this.ogl.json.options.togglesOff.indexOf('autoclean') == -1 && data.renta < this.ogl.json.options.rval && data.fleet == 0) { data.trash.click(); } else { this.dataList.push(data); } } if(index == messages.length-1) this.tableReady = true; }); if(this.tableReady && this.dataList.length > 0) this.buildSpyTable(); requestAnimationFrame(() => this.checkReports()); } buildSpyTable() { this.tableReady = false; this.dataList.sort((a, b) => { if(this.ogl.json.options.spyFilter == "$") return b.renta - a.renta; else if(this.ogl.json.options.spyFilter == "COORDS") return a.tmpCoords - b.tmpCoords; else if(this.ogl.json.options.spyFilter == "FLEET") return b.fleet - a.fleet; else if(this.ogl.json.options.spyFilter == "DEF") return b.defense - a.defense; else if(this.ogl.json.options.spyFilter == "DATE") return b.date - a.date; else if(this.ogl.json.options.spyFilter == "R_$") return a.renta - b.renta; else if(this.ogl.json.options.spyFilter == "R_COORDS") return b.tmpCoords - a.tmpCoords; else if(this.ogl.json.options.spyFilter == "R_FLEET") return a.fleet - b.fleet; else if(this.ogl.json.options.spyFilter == "R_DEF") return a.defense - b.defense; else if(this.ogl.json.options.spyFilter == "R_DATE") return a.date - b.date; }); if(!this.spyTable) { this.spyTable = Util.createDom('table', {'class':'ogl_spyTable'}); document.querySelector('ul.subtabs').after(this.spyTable); } else { this.spyTable.textContent = ''; } let header = this.spyTable.appendChild(Util.createDom('tr')); header.appendChild(Util.createDom('th', {}, '#')); header.appendChild(Util.createDom('th', {'data-filter':'DATE'}, 'date')); header.appendChild(Util.createDom('th', {'data-filter':'COORDS'}, 'coords')); header.appendChild(Util.createDom('th', {}, 'type')); header.appendChild(Util.createDom('th', {}, 'name')); header.appendChild(Util.createDom('th', {'data-filter':'$'}, 'renta')); header.appendChild(Util.createDom('th', {'data-filter':'FLEET'}, 'fleet')); header.appendChild(Util.createDom('th', {'data-filter':'DEF'}, 'def')); header.appendChild(Util.createDom('th', {'class':'ogl_shipIcon ogl_'+this.ogl.json.options.defaultShip})); //header.appendChild(Util.createDom('th', {}, this.ogl.component.langManager.getText('abbr'+this.ogl.json.options.defaultShip))); /*header.appendChild(Util.createDom('th', {}, 'ships')); header.appendChild(Util.createDom('th', {}, 'ships')); if(this.ogl.json.shipCapacity[210]) header.appendChild(Util.createDom('th', {}, 'ships'));*/ header.appendChild(Util.createDom('th', {}, '')); header.appendChild(Util.createDom('th', {}, '')); header.querySelectorAll('th[data-filter]').forEach(filter => { if(this.ogl.json.options.spyFilter.indexOf(filter.getAttribute('data-filter')) > -1) filter.classList.add('ogl_active'); filter.addEventListener('click', () => { this.ogl.json.options.spyFilter = this.ogl.json.options.spyFilter.indexOf('R_') > -1 ? filter.getAttribute('data-filter') : 'R_'+filter.getAttribute('data-filter'); Util.saveData(this.ogl.json); this.spyTable.remove(); this.spyTable = false; document.querySelectorAll('.msg.ogl_ready').forEach(e => e.classList.remove('.ogl_ready')); this.buildSpyTable(); }); }); let sum = 0; this.dataList.forEach((report, index) => { let content = this.spyTable.appendChild(Util.createDom('tr', {'data-coords':report.coords.join(':'), 'data-color':report.color})); if(report.attacked) content.classList.add('ogl_attacked'); if(report.fleet || report.defense) content.classList.add('ogl_notGray'); // index let indexContent = content.appendChild(Util.createDom('td')); indexContent.appendChild(Util.createDom('div')); // date let deltaDate = Date.now() - report.date; let dateContent = content.appendChild(Util.createDom('td', {'class':'ogl_reportDate'})); let date = dateContent.appendChild(Util.createDom('div')); if(deltaDate < 3600000) date.textContent = (Math.floor(deltaDate / 60000) || '0') + LocalizationStrings.timeunits.short.minute; else if(deltaDate < 86400000) date.textContent = (Math.floor(deltaDate / 3600000) || '0') + LocalizationStrings.timeunits.short.hour; else date.textContent = (Math.floor(deltaDate / 86400000) || '0') + LocalizationStrings.timeunits.short.day; if(report.activity > 0 && report.activity <= 15) date.classList.add('ogl_danger'); else if(report.activity > 0 && report.activity < 60) date.classList.add('ogl_warning'); // coords let coords = content.appendChild(Util.createDom('td', {'class':'ogl_coords'})); coords.appendChild(Util.createDom('a', { 'href': this.ogl.baselink + `?page=ingame&component=galaxy&galaxy=${ report.coords[0]}&system=${report.coords[1]}&position=${report.coords[2]}` }, report.coords.join(':'))); // type let type = content.appendChild(Util.createDom('td', {'class':'ogl_type'})); type.appendChild(Util.createDom('div', {'class':'material-icons'}, report.type == 1 ? 'language' : 'brightness_2')) if(report.attacked) type.appendChild(Util.createDom('div', {'class':'ogl_inFlight'})); // player let detail = content.appendChild(Util.createDom('td', {'class':'ogl_name '+report.status})); detail.appendChild(Util.createDom('a', {'class':'msg_action_link overlay', 'href':report.detail}, report.name)); // renta let renta = content.appendChild(Util.createDom('td', {'class':'tooltip ogl_renta'}, Util.formatToUnits(report.renta) || '0')); let resources = ['metal', 'crystal', 'deut']; let resourcesName = [this.ogl.component.langManager.getText('metal'), this.ogl.component.langManager.getText('crystal'), this.ogl.component.langManager.getText('deut')]; resources.forEach((res, index) => { renta.title += `<div>${resourcesName[index]}: <span class="ogl_${resources[index]} float_right">${Util.formatToUnits(report.resources[index])}</span></div>`; }); // fleet let fleet = content.appendChild(Util.createDom('td', {}, (Util.formatToUnits(report.fleet, 1) || '0').replace('-1', '?'))) if(report.fleet) fleet.classList.add('ogl_danger'); // def let def = content.appendChild(Util.createDom('td', {}, (Util.formatToUnits(report.defense, 1) || '0').replace('-1', '?'))); if(report.defense) def.classList.add('ogl_danger'); // ships let ships; let shipList = this.ogl.json.shipCapacity[210] ? [202,203,219,210] : [202,203,219]; shipList = [this.ogl.json.options.defaultShip]; shipList.forEach(shipID => { let shipsCount = this.ogl.component.fleetManager.calcRequiredShips(shipID, Math.round(report.renta * 1.07)); // 7% more resources ships = content.appendChild(Util.createDom('td', {'class':'ogl_shipsLink'})); let a = ships.appendChild(Util.createDom('a', { 'href': this.ogl.baselink + `?page=ingame&component=fleetdispatch&galaxy=${ report.coords[0]}&system=${report.coords[1]}&position=${report.coords[2]}&type=${report.type == 3 ? 3 : 1}&mission=1&am${shipID}=${shipsCount}&oglMode=2&oglLazy=true` }, Util.formatToUnits(shipsCount, 1))); this.availableShips >= shipsCount ? a.classList.add('ogl_ok') : a.classList.add('ogl_danger'); }); // colors this.ogl.component.planetManager.buildColorPicker(content.appendChild(Util.createDom('td', {'class':'ogl_colors'})), {player:report.player, planet:report.planet, coords:report.coords.join(':')}); //actions let actions = content.appendChild(Util.createDom('td', {'class':'ogl_reportOptions'})); actions.appendChild(Util.createDom('div', {'class':'icon icon_eye', 'onclick':report.spy})); let more = actions.appendChild(Util.createDom('div', {'class':'icon icon_fastforward'})); more.addEventListener('click', () => { if(content.classList.contains('ogl_extended')) { content.classList.remove('ogl_extended'); content.querySelectorAll('.ogl_added').forEach(e => e.remove()); } else { content.classList.add('ogl_extended'); let resMax = report.total - report.renta; for(let i=0; i<5; i++) { resMax = resMax - Math.ceil(resMax * report.loot); renta.innerHTML += `<div class="ogl_added">${Util.formatToUnits(resMax)}</div>`; let shipID = this.ogl.json.options.defaultShip; let shipsCount = this.ogl.component.fleetManager.calcRequiredShips(shipID, Math.round(resMax * 1.07)); ships.appendChild(Util.createDom('a', { 'class' : 'ogl_added', 'href': this.ogl.baselink + `?page=ingame&component=fleetdispatch&galaxy=${ report.coords[0]}&system=${report.coords[1]}&position=${report.coords[2]}&type=${report.type == 3 ? 3 : 1}&mission=1&am${shipID}=${shipsCount}&oglMode=2&oglLazy=true` }, Util.formatToUnits(shipsCount, 1) || '0')); } } }); let apiKey = Util.createDom('div', {}); //apiKey.innerHTML = report.api.getAttribute('data-tooltip') || report.api.getAttribute('title'); apiKey.innerHTML = report.api.getAttribute('title'); apiKey = apiKey.querySelector('input').value; let simButton = report.dom.querySelector('.msg_actions').appendChild(Util.createDom('div', {'class':'icon_nf ogl_sim'}, 'S')); simButton.addEventListener('click', () => window.open(Util.genTrashsimLink(apiKey, this.ogl), '_blank')); let trash = actions.appendChild(Util.createDom('div', {'class':'icon icon_trash'})); trash.addEventListener('click', () => { sum -= report.renta; this.calcTotal(sum); report.trash.click(); content.remove(); }); sum += report.renta; }); this.calcTotal(sum); } calcTotal(sum) { document.querySelector('.ogl_spyTable .ogl_totalSum') && document.querySelector('.ogl_spyTable .ogl_totalSum').remove(); let total = this.spyTable.appendChild(Util.createDom('tr', {'class':'ogl_totalSum'})); total.appendChild(Util.createDom('td', {}, '')); total.appendChild(Util.createDom('td', {}, '')); total.appendChild(Util.createDom('td', {}, '')); total.appendChild(Util.createDom('td', {}, '')); total.appendChild(Util.createDom('td', {}, '')); total.appendChild(Util.createDom('td', {}, Util.formatToUnits(sum))); total.appendChild(Util.createDom('td', {}, '')); total.appendChild(Util.createDom('td', {}, '')); total.appendChild(Util.createDom('td', {}, '')); total.appendChild(Util.createDom('td', {}, '')); total.appendChild(Util.createDom('td', {}, '')); } checkExpeditions() { document.querySelectorAll('#ui-id-2 div[aria-hidden="false"] .msg:not(.ogl_expeditionDone)').forEach(message => { if(!message.querySelector('.ogl_timeZone')) return; message.classList.add('ogl_expeditionDone'); if(document.querySelector('#subtabs-nfFleetTrash.ui-state-active')) return; let id = message.getAttribute('data-msg-id'); let date = new Date(parseInt(message.querySelector('.msg_date').getAttribute('data-timestamp'))); let midnight = new Date(date.getFullYear(), date.getMonth(), date.getDate(), 0, 0, 0).getTime(); let type = 'none'; let typeList = ['metal','crystal','deut','dm',202,203,204,205,206,207,208,209,210,211,213,214,215,217,218,219]; let result = {}; typeList.forEach(typeID => { if(message.textContent.indexOf(this.ogl.component.langManager.getText(typeID)) > -1) { if(!isNaN(typeID)) type = 'ships'; else if(typeID == 'metal' || typeID == 'crystal' || typeID == 'deut') type = 'resources'; else if(typeID == 'dm') type = 'dm'; result[typeID] = this.getExpeValue(this.ogl.component.langManager.getText(typeID), message); } }); if(message.querySelector('a.itemLink')) { type = 'item'; result.item = 1; } message.querySelector('.msg_content').prepend(Util.createDom('div', {'class':'ogl_expeResult'}, type)); this.ogl.json.stats[midnight] = this.ogl.json.stats[midnight] || { idList:[], expe:{}, raid:{}, expeOccurences:{}, consumption:0 }; if(this.ogl.json.stats[midnight].idList.indexOf(id) == -1) { this.ogl.json.stats[midnight].idList.push(id); for(let [k,v] of Object.entries(result)) { this.ogl.json.stats[midnight].expe[k] = (this.ogl.json.stats[midnight].expe[k] || 0) + v; this.ogl.json.stats.total.expe[k] = (this.ogl.json.stats.total.expe[k] || 0) + v; } this.ogl.json.stats[midnight].expeOccurences[type] = (this.ogl.json.stats[midnight].expeOccurences[type] || 0) + 1; this.ogl.json.stats.total.expeOccurences[type] = (this.ogl.json.stats.total.expeOccurences[type] || 0) + 1; this.ogl.component.empireManager.displayStats(this.ogl.json.stats.range); } Util.saveData(this.ogl.json); }); } checkRaid() { document.querySelectorAll('#ui-id-2 div[aria-hidden="false"] .msg:not(.ogl_raidDone)').forEach(message => { let content = message.querySelector('.msg_content'); if(!message.querySelector('.ogl_timeZone') || !content.querySelector('.msg_ctn2')) return; message.classList.add('ogl_raidDone'); if(document.querySelector('#subtabs-nfFleetTrash.ui-state-active')) return; let id = message.getAttribute('data-msg-id'); let date = new Date(parseInt(message.querySelector('.msg_date').getAttribute('data-timestamp'))); let midnight = new Date(date.getFullYear(), date.getMonth(), date.getDate(), 0, 0, 0).getTime(); let report = {}; Util.loadPageContent(`https://${window.location.host}/game/index.php?page=messages&messageId=${id}&tabid=21&ajax=1`, 'text/html', result => { let htmlReport = result.getElementsByClassName('detail_msg')[0].innerHTML; let json = JSON.parse(htmlReport.substring((htmlReport.search("var combatData") + 35),(htmlReport.search("var attackerJson") - 12))); let loot = [json.loot.metal, json.loot.crystal, json.loot.deuterium]; let renta = [0,0,0]; let loss = [0,0,0]; let fleetID = []; let leftSide = false; Object.values(json.attackerJSON.member).forEach(v => { if(v && v.ownerID == this.ogl.playerID) fleetID.push(v.fleetID) }); if(fleetID.length > 0) leftSide = true; Object.values(json.defenderJSON.member).forEach(v => { if(v && v.ownerID == this.ogl.playerID) fleetID.push(v.fleetID) }); let atkRounds = json.attackerJSON.combatRounds; let defRounds = json.defenderJSON.combatRounds; fleetID.forEach(fleet => { if(defRounds[defRounds.length-1].losses && defRounds[defRounds.length-1].losses[fleet]) { for(let [k,v] of Object.entries(defRounds[defRounds.length-1].losses[fleet])) { let lossValue = this.ogl.shipCost[k].map(x => x * v); loss = loss.map((x, i) => parseInt(x) + parseInt(lossValue[i])); } } if(atkRounds[atkRounds.length-1].losses && atkRounds[atkRounds.length-1].losses[fleet]) { for(let [k,v] of Object.entries(atkRounds[atkRounds.length-1].losses[fleet])) { let lossValue = this.ogl.shipCost[k].map(x => x * v); loss = loss.map((x, i) => parseInt(x) + parseInt(lossValue[i])); } } }); if(json.defender[0] && json.defender[0].ownerID == this.ogl.playerID) { for(let [k,v] of Object.entries(json.repairedDefense)) { let repairedValue = this.ogl.shipCost[k].map(x => x * v); loss = loss.map((x, i) => parseInt(x) - parseInt(repairedValue[i])); } } if(leftSide) renta = renta.map((x, i) => parseInt(x) - loss[i] + loot[i]); else renta = renta.map((x, i) => parseInt(x) - loss[i] - loot[i]); ['metal', 'crystal', 'deut'].forEach((r, index) => report[r] = renta[index]); let formatedRenta = renta.map((res) => Util.formatToUnits(res)); let line = Util.createDom('div', {'class':'ogl_expeResult'}, 'Renta: ' + formatedRenta.join(' | ')); message.prepend(line); let target = json.coordinates.position == 16 ? 'expe' : 'raid'; this.ogl.json.stats[midnight] = this.ogl.json.stats[midnight] || { idList:[], expe:{}, raid:{}, expeOccurences:{}, consumption:0 }; this.ogl.json.stats.ignored = this.ogl.json.stats.ignored || {}; let saveReport = () => { if(this.ogl.json.stats[midnight].idList.indexOf(id) == -1 && !this.ogl.json.stats.ignored[id]) { this.ogl.json.stats[midnight].idList.push(id); for(let [k,v] of Object.entries(report)) { this.ogl.json.stats[midnight][target][k] = (this.ogl.json.stats[midnight][target][k] || 0) + v; this.ogl.json.stats.total[target][k] = (this.ogl.json.stats.total[target][k] || 0) + v; } if(target == 'expe') { this.ogl.json.stats[midnight].expeOccurences['fight'] = (this.ogl.json.stats[midnight].expeOccurences['fight'] || 0) + 1; this.ogl.json.stats.total.expeOccurences['fight'] = (this.ogl.json.stats.total.expeOccurences['fight'] || 0) + 1; this.ogl.json.stats[midnight].expeOccurences['none'] = (this.ogl.json.stats[midnight].expeOccurences['none'] || 0) - 1; this.ogl.json.stats.total.expeOccurences['none'] = (this.ogl.json.stats.total.expeOccurences['none'] || 0) - 1; } this.ogl.component.empireManager.displayStats(this.ogl.json.stats.range); } } if(target == 'raid') { let ignore = line.appendChild(Util.createDom('div', {'class':'ogl_button ogl_ignoreRaid material-icons tooltip', 'title':this.ogl.component.langManager.getText('ignoreRaid')})); if(this.ogl.json.stats.ignored[id]) ignore.classList.add('ogl_active'); ignore.addEventListener('click', () => { if(this.ogl.json.stats.ignored[id]) { delete this.ogl.json.stats.ignored[id]; ignore.classList.remove('ogl_active'); } else { ignore.classList.add('ogl_active'); let index = this.ogl.json.stats[midnight].idList.indexOf(id); this.ogl.json.stats[midnight].idList.splice(index, 1); this.ogl.json.stats.ignored[id] = Date.now(); for(let [k,v] of Object.entries(report)) { this.ogl.json.stats[midnight][target][k] = (this.ogl.json.stats[midnight][target][k] || 0) - v; this.ogl.json.stats.total[target][k] = (this.ogl.json.stats.total[target][k] || 0) - v; } } saveReport(); Util.saveData(this.ogl.json); this.ogl.component.empireManager.displayStats(this.ogl.json.stats.range); }); } saveReport(); Util.saveData(this.ogl.json); }); }); } checkDebris() { document.querySelectorAll('#ui-id-2 div[aria-hidden="false"] .msg:not(.ogl_debrisDone)').forEach(message => { if(!message.querySelector('.ogl_timeZone')) return; message.classList.add('ogl_debrisDone'); if(!message.querySelector('.icon_apikey') && message.querySelector('.msg_head').textContent.indexOf(':17]') < 0) return; let content = message.querySelector('.msg_content'); let regex = new RegExp('\\'+LocalizationStrings.thousandSeperator, 'g'); let id = message.getAttribute('data-msg-id'); let date = new Date(parseInt(message.querySelector('.msg_date').getAttribute('data-timestamp'))); let midnight = new Date(date.getFullYear(), date.getMonth(), date.getDate(), 0, 0, 0).getTime(); let report = {}; let numList = content.textContent.replace(regex, '').match(/\d+/g); let target = parseInt(numList[numList.length - 3] == '16') ? 'expe' : 'raid'; if(!message.querySelector('.icon_apikey')) { report.dm = parseInt(numList[numList.length - 2]); message.prepend(Util.createDom('div', {'class':'ogl_expeResult'}, `Renta: ${report.DM} ${this.ogl.component.langManager.getText('DM')}`)); } else { report.metal = parseInt(numList[numList.length - 2]); report.crystal = parseInt(numList[numList.length - 1]); report.deut = 0; message.prepend(Util.createDom('div', {'class':'ogl_expeResult'}, `Renta: ${Util.formatToUnits(report.metal)} | ${Util.formatToUnits(report.crystal)} | ${Util.formatToUnits(report.deut)}`)); } this.ogl.json.stats[midnight] = this.ogl.json.stats[midnight] || { idList:[], expe:{}, raid:{}, expeOccurences:{}, consumption:0 }; if(this.ogl.json.stats[midnight].idList.indexOf(id) == -1) { this.ogl.json.stats[midnight].idList.push(id); for(let [k,v] of Object.entries(report)) { this.ogl.json.stats[midnight][target][k] = (this.ogl.json.stats[midnight][target][k] || 0) + v; this.ogl.json.stats.total[target][k] = (this.ogl.json.stats.total[target][k] || 0) + v; } if(target == 'expe') { this.ogl.json.stats[midnight].expeOccurences['resources'] = (this.ogl.json.stats[midnight].expeOccurences['resources'] || 0) + 1; this.ogl.json.stats.total.expeOccurences['resources'] = (this.ogl.json.stats.total.expeOccurences['resources'] || 0) + 1; } this.ogl.component.empireManager.displayStats(this.ogl.json.stats.range); } Util.saveData(this.ogl.json); }); } } class PlanetManager { constructor(ogl) { this.ogl = ogl; this.myPlanets = {}; let isGroup = false; let lastCoords, countGroup = 0; this.ogl.planetList.forEach(p => { let coords = p.querySelector('.planetlink .planet-koords').textContent.slice(1,-1).split(':'); p.setAttribute('data-coords', coords.join(':')); let planet = {}; planet.id = p.getAttribute('id').replace('planet-',''); planet.galaxy = coords[0]; planet.system = coords[1]; planet.position = coords[2]; planet.coords = coords.join(':'); planet.name = p.querySelector('.planetlink .planet-name').textContent; planet.active = p.querySelector('.planetlink').classList.contains('active'); if(lastCoords == coords[0] + ':' + coords[1]) { p.setAttribute('data-multi', countGroup); planet.multi = countGroup; isGroup = true; } else { if(isGroup) countGroup++; isGroup = false; } lastCoords = coords[0] + ':' + coords[1]; if(p.querySelector('.moonlink')) { planet.moon = {}; planet.moon.id = new URL(p.querySelector('.moonlink').href).searchParams.get('cp'); planet.moon.jumpgate = p.querySelector('.moonlink').getAttribute('data-jumpgatelevel'); planet.moon.active = p.querySelector('.moonlink').classList.contains('active'); } this.myPlanets[planet.coords] = planet; if(Util.getPage() == 'galaxy') Util.loop(() => this.updateDebris()); }); this.buildTargetList(); this.ogl.component.sideViewManager.addEconomyPanel(); } buildPlanetList(dom) { let stalkPlanetList = []; dom.querySelectorAll('planet').forEach(domPlanet => { let coords = domPlanet.getAttribute('coords').split(':'); let planet = {}; planet.id = domPlanet.getAttribute('id'); planet.name = domPlanet.getAttribute('name'); planet.coords = domPlanet.getAttribute('coords'); planet.galaxy = coords[0]; planet.system = coords[1]; planet.position = coords[2]; planet.main = stalkPlanetList.length == 0; if(domPlanet.querySelector('moon')) { let moon = domPlanet.querySelector('moon'); planet.moon = {}; planet.moon.id = moon.getAttribute('id'); planet.moon.size = moon.getAttribute('size'); } stalkPlanetList.push(planet); }); stalkPlanetList.sort((a, b) => { let coordsA = a.coords.split(':').map(x => x.padStart(3, '0')).join(''); let coordsB = b.coords.split(':').map(x => x.padStart(3, '0')).join(''); return coordsA - coordsB; }); return stalkPlanetList; } buildColorPicker(domElement, data) { data = data || {}; if(!this.colorPicker) { this.colorPicker = document.body.appendChild(Util.createDom('div', {'style':'display:none;', 'id':'ogl_color'})); let container = this.colorPicker.appendChild(Util.createDom('div', {'class':'ogl_colorPicker'})); ['red', 'halfred', 'yellow', 'halfyellow', 'green', 'halfgreen', 'blue', 'halfblue', 'violet', 'halfviolet', 'gray', 'none'].forEach(color => { let pick = container.appendChild(Util.createDom('div', {'data-color':color})); pick.addEventListener('click', () => { let planet = {}; let coords = this.colorPicker.getAttribute('data-coords'); let splitted = coords.split(':'); this.ogl.json.stalkList[coords] = this.ogl.json.stalkList[coords] || {}; planet.id = parseInt(this.colorPicker.getAttribute('data-planet')); planet.player = parseInt(this.colorPicker.getAttribute('data-player')); planet.coords = coords; planet.color = this.ogl.json.stalkList[planet.coords].color == color ? false : color == 'none' ? false : color; if(!planet.color) { delete this.ogl.json.stalkList[planet.coords]; Util.saveData(this.ogl.json); } else if(!planet.id || !planet.player) { Util.loadPageContent(`https://${window.location.host}/game/index.php?page=componentOnly&component=galaxyContent&ajax=1&galaxy=${splitted[0]}&system=${splitted[1]}&position=${splitted[2]}`, 'text/html', result => { let line = result.querySelector('#planet'+splitted[2]).closest('tr'); planet.id = line.querySelector('td[data-planet-id]').getAttribute('data-planet-id'); planet.player = line.querySelector('td.playername a[rel^="player"]').getAttribute('rel').replace('player', ''); this.ogl.json.stalkList[planet.coords] = planet; Util.saveData(this.ogl.json); }); } else { this.ogl.json.stalkList[planet.coords] = planet; Util.saveData(this.ogl.json); } let line = this.colorPicker.domLink.parentNode; if(line.closest('.ogl_spyTable')) { line.closest('.ogl_spyTable').querySelectorAll(`tr[data-coords="${planet.coords}"]`).forEach(e => { e.setAttribute('data-color', planet.color); }); } else { line.classList.remove('ogl_ready'); delete this.ogl.component.playerManager.playerList[planet.player]; this.colorPicker.domLink.parentNode.removeAttribute('data-color'); if(this.ogl.json.options.sideViewOpened == 'stalkPinned' && this.ogl.json.options.pinned.id == planet.player) { document.querySelector(`.ogl_sideView [data-coords="${planet.coords}"]`).setAttribute('data-color', planet.color); } } this.ogl.component.planetManager.buildTargetList(); this.ogl.component.tooltipManager.close(); }); }); } if(!domElement.querySelector('.ogl_colorButton')) { let colorButton = domElement.appendChild(Util.createDom('div', {'class':'ogl_colorButton tooltipClick tooltipRel', 'rel':'ogl_color'})); colorButton.addEventListener('click', () => { this.colorPicker.domLink = domElement; this.colorPicker.setAttribute('data-player', data.player); this.colorPicker.setAttribute('data-planet', data.planet); this.colorPicker.setAttribute('data-coords', data.coords); }); } } colorizeAllPlanets(playerID, planetList, color) { planetList.forEach(planet => { let p = {}; p.id = planet.id; p.player = playerID; p.coords = planet.coords; p.color = color; color == 'none' ? delete this.ogl.json.stalkList[planet.coords] : this.ogl.json.stalkList[planet.coords] = p; }); Util.saveData(this.ogl.json); this.ogl.component.planetManager.buildTargetList(); } goToPosition(galaxy, system, position) { if(Util.getPage() == 'galaxy') { document.querySelector('#galaxy_input').value = galaxy; document.querySelector('#system_input').value = system; submitForm(); } else { let link = `?page=ingame&component=galaxy&galaxy=${galaxy}&system=${system}&position=${position}`; window.location.href = this.ogl.baselink + link; } } buildTargetList() { this.stalkList ? this.stalkList.textContent = '' : this.stalkList = Util.createDom('div', {'class':'ogl_stalkList'}); let systemSteps = 50; let currentStep = 0; let targetFound = false; let colors = this.stalkList.appendChild(Util.createDom('div')); let gMenu = this.stalkList.appendChild(Util.createDom('div')); let sMenu = this.stalkList.appendChild(Util.createDom('div')); let content = this.stalkList.appendChild(Util.createDom('div', {'class':'ogl_stalkPlanets'})); let sendProbes = (event, planet, type, sender) => { event.stopPropagation(); event.preventDefault(); if(type == 3) { Util.loadPageContent(`https://${window.location.host}/game/index.php?page=componentOnly&component=galaxyContent&ajax=1&galaxy=${planet.galaxy}&system=${planet.system}&position=${planet.position}`, 'text/html', result => { let line = result.querySelector('#planet'+planet.position).closest('tr'); if(line.querySelector('.moon .moon_a')) { this.ogl.component.fleetManager.sendSpyProbe([planet.galaxy, planet.system, planet.position, type], this.ogl.json.spyProbesCount, sender); } else fadeBox(this.ogl.component.langManager.getText('noMoonError'), true); this.ogl.json.stalkList[`${planet.galaxy}:${planet.system}:${planet.position}`].lastMoonSpy = Date.now(); }); } else { this.ogl.component.fleetManager.sendSpyProbe([planet.galaxy, planet.system, planet.position, type], this.ogl.json.spyProbesCount, sender); this.ogl.json.stalkList[`${planet.galaxy}:${planet.system}:${planet.position}`].lastPlanetSpy = Date.now(); } Util.saveData(this.ogl.json); }; ['red', 'halfred', 'yellow', 'halfyellow', 'green', 'halfgreen', 'blue', 'halfblue', 'violet', 'halfviolet', 'gray'].forEach(color => { let toggle = colors.appendChild(Util.createDom('div', {'class':'ogl_toggle', 'data-toggle':color})); if(!this.ogl.json.options.hiddenTargets[color]) toggle.classList.add('ogl_active'); toggle.addEventListener('click', () => { if(this.ogl.json.options.hiddenTargets[color]) { delete this.ogl.json.options.hiddenTargets[color]; toggle.classList.add('ogl_active'); content.querySelectorAll(`div[data-color="${color}"]`).forEach(e => e.classList.remove('ogl_colorHidden')); } else { this.ogl.json.options.hiddenTargets[color] = color; toggle.classList.remove('ogl_active'); content.querySelectorAll(`div[data-color="${color}"]`).forEach(e => e.classList.add('ogl_colorHidden')); } Util.saveData(this.ogl.json); gMenu.querySelectorAll('div').forEach(e => e.classList.add('ogl_disabled')); sMenu.querySelectorAll('div').forEach(e => e.classList.add('ogl_disabled')); for(let i=0; i<10; i++) { if(content.querySelector(`div[data-galaxy="${i}"]:not(.ogl_colorHidden)`)) { gMenu.querySelector(`div[data-galaxy="${i}"]`).classList.remove('ogl_disabled'); } } for(let i=0; i<500; i+=systemSteps) { if(content.querySelector(`div[data-galaxy="${gMenu.querySelector('.ogl_active').getAttribute('data-galaxy')}"][data-group="${i}"]:not(.ogl_colorHidden)`)) { sMenu.querySelector(`div[data-system="${i}"]`).classList.remove('ogl_disabled'); } } }); }); for(let g=1; g<=10; g++) { let gDiv = gMenu.appendChild(Util.createDom('div', {'class':'ogl_disabled', 'data-galaxy':g}, g)); gDiv.addEventListener('click', () => { gMenu.querySelectorAll('div.ogl_active').forEach(e => e.classList.remove('ogl_active')); gDiv.classList.add('ogl_active'); this.ogl.json.options.targetFilter[0] = g; Util.saveData(this.ogl.json); content.querySelectorAll('div[data-galaxy]').forEach(div => { if(div.getAttribute('data-galaxy') == g) div.classList.remove('ogl_galaxyHidden'); else div.classList.add('ogl_galaxyHidden'); }); sMenu.querySelectorAll('div').forEach(e => e.classList.add('ogl_disabled')); for(let i=0; i<500; i+=systemSteps) { if(content.querySelector(`div[data-galaxy="${g}"][data-group="${i}"]:not(.ogl_colorHidden)`)) { sMenu.querySelector(`div[data-system="${i}"]`).classList.remove('ogl_disabled'); } } }); for(let s=0; s<500; s++) { if(s == currentStep) { let sDiv = sMenu.appendChild(Util.createDom('div', {'class':'ogl_disabled', 'data-system':s}, s||'0')); sDiv.addEventListener('click', () => { sMenu.querySelectorAll('div.ogl_active').forEach(e => e.classList.remove('ogl_active')); sDiv.classList.add('ogl_active'); this.ogl.json.options.targetFilter[1] = s; Util.saveData(this.ogl.json); content.querySelectorAll('div[data-system]').forEach(div => { if(div.getAttribute('data-group') == s) div.classList.remove('ogl_systemHidden'); else div.classList.add('ogl_systemHidden'); }); }); currentStep += systemSteps; } for(let p=1; p<=15; p++) { let id = `${g}:${s}:${p}`; if(this.ogl.json.stalkList[id]) { let group = Math.floor(s/systemSteps)*systemSteps; let div = content.appendChild(Util.createDom('div', {'data-galaxy':g, 'data-system':s, 'data-position':p, 'data-group':group, 'data-coords':id})); div.appendChild(Util.createDom('span', {}, id)); let mSpy = div.appendChild(Util.createDom('div', {'class':'ogl_moonIcon material-icons ogl_active tooltip', 'data-type':3, 'title':this.ogl.component.langManager.getText('spyPosition')}, 'brightness_2')); let pSpy = div.appendChild(Util.createDom('div', {'class':'ogl_planetIcon material-icons tooltip', 'data-type':1, 'title':this.ogl.component.langManager.getText('spyPosition')}, 'language')); let pTarget = div.appendChild(Util.createDom('div', {'class':'ogl_flagIcon material-icons tooltip', 'data-type':3, 'title':this.ogl.component.langManager.getText('flagTarget')}, 'flag')); let now = Date.now(); if(now - this.ogl.json.stalkList[id].lastPlanetSpy < 3*60*60*1000) pSpy.classList.add('ogl_disabled'); if(now - this.ogl.json.stalkList[id].lastMoonSpy < 3*60*60*1000) mSpy.classList.add('ogl_disabled'); let planet = { galaxy:g, system:s, position:p }; pSpy.addEventListener('click', event => sendProbes(event, planet, 1, pSpy)); mSpy.addEventListener('click', event => sendProbes(event, planet, 3, mSpy)); pTarget.addEventListener('click', event => { event.stopPropagation(); event.preventDefault(); content.querySelector('[data-galaxy] .ogl_flagIcon.ogl_active') && content.querySelector('[data-galaxy] .ogl_flagIcon.ogl_active').classList.remove('ogl_active'); pTarget.classList.add('ogl_active'); this.ogl.json.options.currentTarget = id; this.ogl.json.options.targetFilter = [g,group]; let siblingFound = false; let nextElement = div.nextElementSibling; if(nextElement && nextElement.classList.contains('ogl_colorHidden')) { while(!siblingFound) { nextElement = nextElement.nextElementSibling; if(!nextElement || !nextElement.classList.contains('ogl_colorHidden')) siblingFound = true; } } Util.saveData(this.ogl.json); }); div.setAttribute('data-color', this.ogl.json.stalkList[id].color); if(this.ogl.json.options.hiddenTargets[this.ogl.json.stalkList[id].color]) div.classList.add('ogl_colorHidden'); else gMenu.querySelector(`div[data-galaxy="${g}"]`).classList.remove('ogl_disabled'); if(targetFound && !div.classList.contains('ogl_colorHidden')) { targetFound = false; this.ogl.json.options.nextTarget = id; Util.saveData(this.ogl.json); } if(this.ogl.json.options.currentTarget == id) { pTarget.classList.add('ogl_active'); targetFound = true; } div.addEventListener('click', () => { this.ogl.component.tooltipManager.close(); this.ogl.component.planetManager.goToPosition(planet.galaxy, planet.system, planet.position); }); } } } } gMenu.querySelector(`div[data-galaxy="${this.ogl.json.options.targetFilter[0]}"]`).click(); sMenu.querySelector(`div[data-system="${this.ogl.json.options.targetFilter[1]}"]`).click(); let syncOldData = this.stalkList.appendChild(Util.createDom('button', {'class':'ogl_button ogl_tempSync'}, 'Sync OGL v2 Data')); syncOldData.addEventListener('click', () => { this.ogl.component.popupManager.load(); let result = Util.createDom('div'); if(localStorage.getItem('ogl-data')) { let oldData = JSON.parse(localStorage.getItem('ogl-data')); if(oldData.markers && Object.keys(oldData.markers).length > 0) { for(const [key, value] of Object.entries(oldData.markers)) { this.ogl.json.stalkList[key] = { id:-1, player:-1, coords:key, color:value.color, }; } Util.saveData(this.ogl.json); result.textContent = 'Data synced'; } else result.textContent = 'No data found'; } else result.textContent = 'No data found'; let btn = result.appendChild(Util.createDom('div', {'class':'ogl_button'}, 'OK')); btn.addEventListener('click', () => document.location.reload()); this.ogl.component.popupManager.open(result); }); if(!this.ogl.component.sideViewManager.panel.querySelector('.ogl_targetButton')) { let button = this.ogl.component.sideViewManager.panel.appendChild(Util.createDom('div', {'class':'material-icons tooltip ogl_targetButton', 'title':this.ogl.component.langManager.getText('targetView')}, 'gps_fixed')); let sideViewId = 'stalkList'; button.addEventListener('click', () => this.ogl.component.sideViewManager.open(this.stalkList, sideViewId)); if(this.ogl.json.options.sideViewOpened == sideViewId) this.ogl.component.sideViewManager.open(this.stalkList, sideViewId); } } updateDebris() { document.querySelectorAll('.debris a.ogl_tooltipReady:not(.ogl_debrisReady)').forEach(element => { element.classList.add('ogl_debrisReady'); let total = 0; let id = '#' + element.getAttribute('rel'); this.ogl.tmpTooltip[id].querySelectorAll('.debris-content').forEach(resources => { let value = Util.formatFromUnits(resources.innerText.replace(/(\D*)/, '')); element.querySelector('.debrisField').innerHTML += Util.formatToUnits(parseInt(value), 1) + '<br>'; total += parseInt(value); }); if(total >= this.ogl.json.options.rval) element.closest('.debris').classList.add('ogl_active'); }); document.querySelectorAll('.expeditionDebrisSlotBox:not(.ogl_debrisReady)').forEach(element => { element.classList.add('ogl_debrisReady'); let content = element.querySelectorAll('.ListLinks li'); if(!content[0]) content = this.ogl.tmpTooltip['#debris16'].querySelectorAll('.ListLinks li'); let scouts = content[2]; let action = content[3]; let res = [ content[0].textContent.replace(/(\D*)/, ''), content[1].textContent.replace(/(\D*)/, '') ]; element.innerHTML = ` <img src="https://gf1.geo.gfsrv.net/cdnc5/fa3e396b8af2ae31e28ef3b44eca91.gif"> <div> <div class="ogl_metal">${res[0]}</div> <div class="ogl_crystal">${res[1]}</div> </div> <div> <div>${scouts.textContent}</div> <div>${action.outerHTML}</div> </div> `; }); } } class FleetManager { constructor(ogl) { this.ogl = ogl; this.defaultShip; this.sliderSpeed; this.targetSelected = false; this.checkFleetMovements(); this.totalOnPlanet = this.ogl.resources.metal + this.ogl.resources.crystal + this.ogl.resources.deut; if(Util.getPage() == 'fleetdispatch') { if(this.ogl.mode == '2') { let link = this.ogl.baselink + '?page=messages'; Util.overwriteFleetDispatcher('submitFleet3', false, () => { if(fleetDispatcher.currentPage == 'fleet3') localStorage.setItem('ogl-redirect', link); }); } this.ogl.json.loca.metal = loca.LOCA_ALL_METAL; this.ogl.json.loca.crystal = loca.LOCA_ALL_CRYSTAL; this.ogl.json.loca.deut = loca.LOCA_ALL_DEUTERIUM; this.ogl.json.loca.dm = LocalizationStrings.darkMatter; this.ogl.json.loca.item = 'Item'; this.ogl.json.loca.conso = loca.LOCA_FLEET_FUEL_CONSUMPTION; fleetDispatcher.apiTechData.forEach(tech => this.ogl.json.myTechs[tech[0]] = tech[1]); [202,203,204,205,206,207,208,209,210,211,213,214,215,217,218,219].forEach(shipID => { this.ogl.json.loca[shipID] = fleetDispatcher.fleetHelper.shipsData[shipID].name; this.ogl.json.shipCapacity[shipID] = fleetDispatcher.fleetHelper.shipsData[shipID].cargoCapacity; }); this.ogl.json.playerClass = fleetDispatcher.apiCommonData[1][1]; if(!fleetDispatcher.shipsOnPlanet.length) { this.rightMenuOptions(); let empty = document.querySelector('#fleetdispatchcomponent #warning h3'); empty.textContent = ''; let grid = empty.appendChild(Util.createDom('div', {'class':'ogl_emptyGrid'})); [202,203,219,210].forEach(shipID => { let amount = this.calcRequiredShips(shipID, this.totalOnPlanet); let div = grid.appendChild(Util.createDom('div', {'class':'ogl_emptyShip'})); div.appendChild(Util.createDom('div', {'class':'ogl_shipIcon ogl_' + shipID})); div.appendChild(Util.createDom('span', {}, amount.toLocaleString('de-DE'))); }); return; } this.tempCoords = [fleetDispatcher.targetPlanet.galaxy, fleetDispatcher.targetPlanet.system, fleetDispatcher.targetPlanet.position, fleetDispatcher.targetPlanet.type]; this.initialResOnPlanet = [fleetDispatcher.metalOnPlanet, fleetDispatcher.crystalOnPlanet, fleetDispatcher.deuteriumOnPlanet]; fleetDispatcher.metalOnPlanet = Math.max(0, fleetDispatcher.metalOnPlanet - this.ogl.json.options.resSaver[0]); fleetDispatcher.crystalOnPlanet = Math.max(0, fleetDispatcher.crystalOnPlanet - this.ogl.json.options.resSaver[1]); fleetDispatcher.deuteriumOnPlanet = Math.max(0, fleetDispatcher.deuteriumOnPlanet - this.ogl.json.options.resSaver[2]); this.resOnPlanet = [fleetDispatcher.metalOnPlanet, fleetDispatcher.crystalOnPlanet, fleetDispatcher.deuteriumOnPlanet]; this.shipsOnPlanet = []; Util.saveData(this.ogl.json); fleetDispatcher.totalFret = 0; fleetDispatcher.shipsOnPlanet.forEach(ship => { fleetDispatcher.totalFret += ship.baseCargoCapacity * ship.number; this.shipsOnPlanet[ship.id] = ship; document.querySelector(`.technology[data-technology="${ship.id}"] input`).classList.add('ogl_checkInput'); }); this.updatePlanetList(this.tempCoords, fleetDispatcher.targetPlanet.type); // DOM manipulations document.querySelector('#fleet1 .allornonewrap').prepend(document.querySelector('#fleet1 #continueToFleet2')); document.querySelector('#fleet1 .allornonewrap .secondcol').prepend(document.querySelector('#fleet1 .show_fleet_apikey')); document.querySelector('#fleet2 #buttonz .header').appendChild(document.querySelector('#fleet2 #mission #shortcuts > div:nth-child(2)')); fleetDispatcher.focusSubmitFleet1(); document.querySelector('#fleet1 .show_fleet_apikey').addEventListener('mouseover', () => fleetDispatcher.refresh()); let preloadShips = () => { let shipID = this.ogl.json.options.defaultShip; let required = this.calcRequiredShips(shipID, this.totalOnPlanet); this.shipsOnPlanet[shipID] = this.shipsOnPlanet[shipID] || {number:0}; fleetDispatcher.selectShip(shipID, Math.min(required, this.shipsOnPlanet[shipID].number)); if(this.ogl.mode == 1 || this.ogl.mode == 4) fleetDispatcher.selectMaxAll(); fleetDispatcher.refresh(); fleetDispatcher.focusSubmitFleet2(); } Util.overwriteFleetDispatcher('trySubmitFleet1', false, () => { let shipSelected = false; document.querySelectorAll('.technology').forEach(tech => { let inputValue = tech.querySelector('input').value.replace(/\./g); if(inputValue && inputValue != "0") shipSelected = true; }); if(fleetDispatcher.currentPage == 'fleet1' && !shipSelected && !fleetDispatcher.shipsToSend.length && !fleetDispatcher.mission) { preloadShips(); } }); if(this.ogl.mode == 1 || this.ogl.mode == 4) preloadShips(); this.expedition(); this.addRequiredUI(); this.addDeltaUI(); this.addFretInfoUI(); this.addFleet2UI(); this.addFleet3UI(); Util.overwriteFleetDispatcher('trySubmitFleet2', false, () => { fleetDispatcher.targetPlanet.galaxy = this.tempCoords[0]; fleetDispatcher.targetPlanet.system = this.tempCoords[1]; fleetDispatcher.targetPlanet.position = this.tempCoords[2]; fleetDispatcher.targetPlanet.type = this.tempCoords[3]; if(fleetDispatcher.targetPlanet.galaxy == fleetDispatcher.currentPlanet.galaxy && fleetDispatcher.targetPlanet.system == fleetDispatcher.currentPlanet.system && fleetDispatcher.targetPlanet.position == fleetDispatcher.currentPlanet.position && fleetDispatcher.targetPlanet.type == fleetDispatcher.currentPlanet.type && this.ogl.mode == 0) { if(!fleetDispatcher.mission) fleetDispatcher.mission = this.ogl.json.options.defaultMission; if(fleetDispatcher.cargoMetal == 0 && fleetDispatcher.cargoCrystal == 0 && fleetDispatcher.cargoDeuterium == 0) fleetDispatcher.selectMaxAll(); fleetDispatcher.targetPlanet.type = fleetDispatcher.targetPlanet.type == 1 ? 3 : 1; this.checkPlanetList(fleetDispatcher.targetPlanet.type); fleetDispatcher.refresh(); } if(!fleetDispatcher.mission) { fleetDispatcher.mission = this.ogl.json.options.defaultMission; } }); Util.overwriteFleetDispatcher('submitFleet3', false, () => { if(fleetDispatcher.currentPage == 'fleet3') { let now = new Date(); let midnight = new Date(now.getFullYear(), now.getMonth(), now.getDate(), 0, 0, 0).getTime(); let coords = this.ogl.current.type == 'moon' ? this.ogl.current.coords.join(':') + 'M' : this.ogl.current.coords.join(':'); if(this.targetSelected) { let tCoords = this.ogl.json.options.currentTarget.split(':'); if(fleetDispatcher.targetPlanet.galaxy == tCoords[0] && fleetDispatcher.targetPlanet.system == tCoords[1] && fleetDispatcher.targetPlanet.position == tCoords[2] && fleetDispatcher.mission == 1) { if(this.ogl.json.options.nextTarget) { if(this.ogl.json.options.currentTarget == this.ogl.json.options.nextTarget) { this.ogl.json.options.nextTarget = false; this.ogl.json.options.currentTarget = false; } else { let newTarget = this.ogl.json.options.nextTarget.split(':'); let group = Math.floor(newTarget[1]/50)*50; // system step this.ogl.json.options.currentTarget = this.ogl.json.options.nextTarget; this.ogl.json.options.targetFilter = [newTarget[0],group]; } } else { this.ogl.json.options.currentTarget = false; this.ogl.json.options.nextTarget = false; } } } this.ogl.json.lastFleet.shipsToSend = fleetDispatcher.shipsToSend; this.ogl.json.lastFleet.targetPlanet = fleetDispatcher.targetPlanet; this.ogl.json.lastFleet.speedPercent = fleetDispatcher.speedPercent; this.ogl.json.lastFleet.cargoMetal = fleetDispatcher.cargoMetal; this.ogl.json.lastFleet.cargoCrystal = fleetDispatcher.cargoCrystal; this.ogl.json.lastFleet.cargoDeuterium = fleetDispatcher.cargoDeuterium; this.ogl.json.lastFleet.mission = fleetDispatcher.mission; this.ogl.json.stats[midnight] = this.ogl.json.stats[midnight] || { idList:[], expe:{}, raid:{}, expeOccurences:{}, consumption:0 }; this.ogl.json.stats[midnight].consumption = (this.ogl.json.stats[midnight].consumption || 0) - fleetDispatcher.getConsumption(); this.ogl.json.stats.total.consumption = (this.ogl.json.stats.total.consumption || 0) - fleetDispatcher.getConsumption(); this.ogl.json.myEconomy[coords] = this.ogl.json.myEconomy[coords] || {}; this.ogl.json.myEconomy[coords]['resmetal'] = Math.max(0, (this.ogl.json.myEconomy[coords]['resmetal'] || 0) - fleetDispatcher.cargoMetal); this.ogl.json.myEconomy[coords]['rescrystal'] = Math.max(0, (this.ogl.json.myEconomy[coords]['rescrystal'] || 0) - fleetDispatcher.cargoCrystal); this.ogl.json.myEconomy[coords]['resdeut'] = Math.max(0, (this.ogl.json.myEconomy[coords]['resdeut'] || 0) - fleetDispatcher.cargoDeuterium); Util.saveData(this.ogl.json); fleetDispatcher.refresh(); } }); let data = fleetDispatcher.fleetHelper.shipsData; for(let id in data) { let infos = ` <div class="ogl_fleetInfo"> ${data[id].name} <div class="splitLine"></div> <div><span>Fret</span>${Util.formatNumber(data[id].cargoCapacity)}</div> <div><span>Speed</span>${Util.formatNumber(data[id].speed)}</div> <div><span>Conso</span>${Util.formatNumber(data[id].fuelConsumption)}</div> </div> `; let ship = document.querySelector(`.technology[data-technology="${id}"]`); if(ship) ship.setAttribute('title', infos); } Util.loop(() => { if(!fleetDispatcher.mission && document.querySelectorAll('#missions .on').length == 1) { document.querySelector('#missions .on a').click(); } if(fleetDispatcher.currentPage == 'fleet3') { if(this.targetSelected && this.ogl.json.stalkList[this.ogl.json.options.currentTarget]) { let tCoords = this.ogl.json.options.currentTarget.split(':'); let playerID = this.ogl.json.stalkList[this.ogl.json.options.currentTarget].player; if(fleetDispatcher.targetPlanet.galaxy == tCoords[0] && fleetDispatcher.targetPlanet.system == tCoords[1] && fleetDispatcher.targetPlanet.position == tCoords[2] && fleetDispatcher.mission == 1 && fleetDispatcher.targetPlayerId != playerID && playerID != -1) { this.ogl.component.playerManager.deleteTarget(tCoords[0], tCoords[1], tCoords[2]); fadeBox(this.ogl.component.langManager.getText('wrongTarget'), true); } } } }); } this.rightMenuOptions(); if(Util.getPage() == 'movement') { this.addBackTimer(); document.querySelectorAll('.starStreak .route').forEach(movement => { let id = '#'+movement.querySelector('a').getAttribute('rel'); let div = document.querySelector(id); let container = movement.closest('.fleetDetails').appendChild(Util.createDom('div',{'class':'ogl_shipDetail'})); movement.querySelector('a').classList.add('ogl_inFlight'); div.querySelectorAll('.fleetinfo tr').forEach((line, index) => { if(line.querySelector('td')) { let shipLine = Util.createDom('div', {'class':'ogl_movementItem'}); let shipID = Util.findObjectByValue(this.ogl.json.loca, line.querySelector('td').textContent.replace(':', '')) || -1; if(shipID == 'metal') container.prepend(shipLine); else if(shipID == 'crystal') container.insertBefore(shipLine, container.querySelectorAll('.ogl_movementItem')[1]); else if(shipID == 'deut') container.insertBefore(shipLine, container.querySelectorAll('.ogl_movementItem')[2]); else if(shipID == -1) container.prepend(shipLine); else container.appendChild(shipLine); let shipNumber = line.querySelector('td.value') ? line.querySelector('td.value').textContent : '0'; if(shipID && shipID != -1) { shipLine.appendChild(Util.createDom('div', {'class':'ogl_shipIcon ogl_'+shipID})); shipLine.appendChild(Util.createDom('span', {'class':'ogl_'+shipID}, Util.formatToUnits(Util.formatNumber(shipNumber), 0).replace(' ',''))); } } }); }); } } checkFleetMovements() { Util.loadPageContent(`https://${window.location.host}/game/index.php?page=componentOnly&component=eventList&action=checkEvents&ajax=1`, 'text/html', result => { let idList = []; result.querySelectorAll('.eventFleet').forEach(line => { let id = line.getAttribute('id').replace('eventRow-', ''); let mission = line.getAttribute('data-mission-type'); let back = line.getAttribute('data-return-flight') == 'false' ? false : true; if((mission == '1' && back) // attack || mission == '3' // transpo || mission == '4' // deploy || (mission == '8' && back) // harvest || (mission == '15' && back)) // expedition { let target; if(idList.indexOf(parseInt(id)) > -1) return; if(mission == '3' && !back) idList.push(parseInt(id) + 1); if(!back) target = line.querySelector('.destCoords').textContent.trim().slice(1,-1); else target = line.querySelector('.coordsOrigin').textContent.trim().slice(1,-1); this.ogl.component.planetManager.myPlanets[target] = this.ogl.component.planetManager.myPlanets[target] || {}; let tempElem = Util.createDom('div', {}, (line.querySelector('.icon_movement .tooltip') || line.querySelector('.icon_movement_reserve .tooltip')).getAttribute('title')); if(tempElem.querySelectorAll('th').length > 1) { let trLen = tempElem.querySelectorAll('tr').length; this.ogl.component.planetManager.myPlanets[target].inFlight = this.ogl.component.planetManager.myPlanets[target].inFlight || [0,0,0]; for(let i=0; i<3; i++) { let res = parseInt(tempElem.querySelectorAll('tr')[trLen-3+i].querySelector('.value').textContent.replace(/\./g,'')); this.ogl.component.planetManager.myPlanets[target].inFlight[i] += res; this.ogl.totalResources[i] += res; } } } }); let inFlightTotal = [0,0,0]; let totalDiv = Util.createDom('div', {'class':'ogl_resourcesSum tooltip'}, '<i class="material-icons">functions</i>'); (document.querySelector('#myPlanets') || document.querySelector('#myWorlds')).appendChild(totalDiv); ['metal','crystal','deut'].forEach((res, index) => { totalDiv.appendChild(Util.createDom('span', {'class':'ogl_'+res}, Util.formatToUnits(this.ogl.totalResources[index]))); }); this.ogl.planetList.forEach(planet => { let coords = planet.querySelector('.planet-koords').textContent.slice(1,-1); if(this.ogl.component.planetManager.myPlanets[coords].inFlight && this.ogl.component.planetManager.myPlanets[coords].inFlight.reduce((a, b) => a + b, 0) > 0) { let content = this.ogl.component.langManager.getText('inFlight') + '<div class="splitLine"></div>'; let resources = ['metal', 'crystal', 'deut']; let resourcesName = [this.ogl.component.langManager.getText('metal'), this.ogl.component.langManager.getText('crystal'), this.ogl.component.langManager.getText('deut')]; this.ogl.component.planetManager.myPlanets[coords].inFlight.forEach((res, index) => { content += `<div>${resourcesName[index]}: <span class="ogl_${resources[index]} float_right">${Util.formatToUnits(res)}</span></div>`; inFlightTotal[index] += parseInt(res); }); planet.appendChild(Util.createDom('div', {'class':'tooltip ogl_inFlight', 'title':content})); } }); totalDiv.title = this.ogl.component.langManager.getText('inFlight') + '<div class="splitLine"></div>'; ['metal','crystal','deut'].forEach((res, index) => { let resName = this.ogl.component.langManager.getText(res); totalDiv.title += `<div>${resName}: <span class="ogl_${res} float_right">${Util.formatToUnits(inFlightTotal[index])}</span></div>`; }); }); } checkPlanetList(forcedType) { setTimeout(() => { let coords = `${document.querySelector('input#galaxy').value}:${document.querySelector('input#system').value}:${document.querySelector('input#position').value}`; let domElement = document.querySelector(`.ogl_planetList > div[data-coords="${coords}"]`); document.querySelectorAll('.ogl_planetList .ogl_active').forEach(e => e.classList.remove('ogl_active')); if(domElement) { if((document.querySelector('a#pbutton.planet_selected') && !forcedType) || forcedType == 1) domElement.querySelector('.ogl_planet').classList.add('ogl_active'); if((document.querySelector('a#dbutton.debris_selected') && !forcedType) || forcedType == 2) domElement.querySelector('.ogl_cr').classList.add('ogl_active'); if((document.querySelector('a#mbutton.moon_selected') && !forcedType) || forcedType == 3) domElement.querySelector('.ogl_moon') && domElement.querySelector('.ogl_moon').classList.add('ogl_active'); } this.tempCoords = [fleetDispatcher.targetPlanet.galaxy, fleetDispatcher.targetPlanet.system,fleetDispatcher.targetPlanet.position, fleetDispatcher.targetPlanet.type]; this.updatePlanetList(coords.split(':'), this.tempCoords[3]); }, 100); } updatePlanetList(coords, type) { let targetCoords = `${coords[0]}:${coords[1]}:${coords[2]}`; document.querySelector('.smallplanet .ogl_active') && document.querySelector('.smallplanet .ogl_active').classList.remove('ogl_active'); let target = document.querySelector(`.smallplanet[data-coords="${targetCoords}"]`); if(target && type == 1) { document.querySelector(`.smallplanet[data-coords="${targetCoords}"] .planetlink`).classList.add('ogl_active'); } else if(target && type == 3) { document.querySelector(`.smallplanet[data-coords="${targetCoords}"] .moonlink`).classList.add('ogl_active'); } } rightMenuOptions() { // data button let dataButton = this.ogl.menuOptions.appendChild(Util.createDom('div', {'class':'material-icons ogl_manageData ogl_button tooltip', 'title':this.ogl.component.langManager.getText('oglConfig')}, 'settings')); dataButton.addEventListener('click', () => { this.ogl.component.popupManager.load(); let globalContainer = Util.createDom('div', {'class':'ogl_globalConfig'}); let sideContainer = globalContainer.appendChild(Util.createDom('div')); let container = globalContainer.appendChild(Util.createDom('div', {'class':'ogl_config'})); sideContainer.appendChild(Util.createDom('h1', {'class':'ogl_scriptTitle'}, `OGLight <span>(v${GM_info.script.version})</span>`)); sideContainer.appendChild(Util.createDom('hr')); sideContainer.appendChild(Util.createDom('p', {}, this.ogl.component.langManager.getText('kofi'))); sideContainer.appendChild(Util.createDom('div', {}, "<a class='ogl_kofi' href='https://ko-fi.com/O4O22XV69' target='_blank'>Buy me a coffee</a>")); let rval = container.appendChild(Util.createDom('div', {}, '<span>Resources Value (RVal)</span>')); let rvalInput = rval.appendChild(Util.createDom('input', {'type':'text', 'class':'ogl_checkInput'})); rvalInput.value = this.ogl.json.options.rval; container.appendChild(Util.createDom('hr')); let minifyPictures = container.appendChild(Util.createDom('div', {}, `<span>${this.ogl.component.langManager.getText('minifyPictures')}</span>`)); let minifyToggle = minifyPictures.appendChild(Util.createDom('div', {'class':'ogl_confToggle'})); if(localStorage.getItem('ogl-minipics')) minifyToggle.classList.add('ogl_active'); minifyToggle.addEventListener('click', () => { if(localStorage.getItem('ogl-minipics')) { localStorage.removeItem('ogl-minipics'); minifyToggle.classList.remove('ogl_active'); } else { localStorage.setItem('ogl-minipics', true); minifyToggle.classList.add('ogl_active'); } }); let timers = container.appendChild(Util.createDom('div', {}, `<span>${this.ogl.component.langManager.getText('displayTimers')}</span>`)); timers.appendChild(Util.createDom('div', {'class':'ogl_confToggle ogl_active', 'data-conf':'timers'})); let stats = container.appendChild(Util.createDom('div', {}, `<span>${this.ogl.component.langManager.getText('rentaStats')}</span>`)); stats.appendChild(Util.createDom('div', {'class':'ogl_confToggle ogl_active', 'data-conf':'renta'})); let ignoreConsumption = container.appendChild(Util.createDom('div', {}, `<span>${this.ogl.component.langManager.getText('excludeConso')}</span>`)); ignoreConsumption.appendChild(Util.createDom('div', {'class':'ogl_confToggle ogl_active', 'data-conf':'ignoreConsumption'})); let spytable = container.appendChild(Util.createDom('div', {}, `<span>${this.ogl.component.langManager.getText('spiesTable')}</span>`)); spytable.appendChild(Util.createDom('div', {'class':'ogl_confToggle ogl_active', 'data-conf':'spytable'})); let autoclean = container.appendChild(Util.createDom('div', {}, `<span>${this.ogl.component.langManager.getText('autoClean')}</span>`)); autoclean.appendChild(Util.createDom('div', {'class':'ogl_confToggle ogl_active', 'data-conf':'autoclean'})); container.appendChild(Util.createDom('hr')); let data; let dataDiv = container.appendChild(Util.createDom('div', {'class':'ogl_manageData'})); dataDiv.appendChild(Util.createDom('span', {}, 'Manage data')); let resetButton = dataDiv.appendChild(Util.createDom('button', {'class':'ogl_button'}, 'RESET')); resetButton.addEventListener('click', () => { if(confirm('Do you really want to reset your data ?')) { Util.saveData({}); document.location.reload(); } }); dataDiv.appendChild(Util.createDom('label', {'class':'ogl_button', 'for':'ogl_import'}, 'IMPORT')); let importButton = dataDiv.appendChild(Util.createDom('input', {'id':'ogl_import', 'class':'ogl_hidden', 'type':'file'})); importButton.addEventListener('change', () => { let file = importButton.files[0]; let reader = new FileReader(); reader.onload = () => { try { JSON.parse(reader.result); } catch (e) { return false; } data = reader.result; }; reader.readAsText(file); }); let exportButton = dataDiv.appendChild(Util.createDom('a', {'class':'ogl_button', 'download':`ogl_${this.ogl.universeName}_${this.ogl.lang}_${Date.now()}.txt`}, 'EXPORT')); exportButton.href = URL.createObjectURL(new Blob([JSON.stringify(this.ogl.json)], {type: 'application/json'})); let saveButton = container.appendChild(Util.createDom('button', {'class':'ogl_button'}, 'SAVE')); saveButton.addEventListener('click', () => { this.ogl.json.options.rval = Util.formatFromUnits(rvalInput.value || '0'); if(data) { this.ogl.json = JSON.parse(data); } Util.saveData(this.ogl.json); document.location.reload(); }); container.querySelectorAll('.ogl_confToggle[data-conf]').forEach(button => { let id = button.getAttribute('data-conf'); if(this.ogl.json.options.togglesOff.indexOf(id) > -1) button.classList.remove('ogl_active'); button.addEventListener('click', () => { let index = this.ogl.json.options.togglesOff.indexOf(id); index > -1 ? this.ogl.json.options.togglesOff.splice(index, 1) : this.ogl.json.options.togglesOff.push(id); button.classList.toggle('ogl_active'); }); }); this.ogl.component.popupManager.open(globalContainer); }); // default cargo button let cargoButton = this.ogl.menuOptions.appendChild(Util.createDom('div', {'class':'ogl_shipPicker tooltipLeft tooltipClick tooltipRel ogl_button', 'rel':'ogl_defaultShipPicker'})); cargoButton.textContent = this.ogl.component.langManager.getText('abbr' + this.ogl.json.options.defaultShip); let container = document.body.appendChild(Util.createDom('div', {'style':'display:none;'})); let cargoChoice = container.appendChild(Util.createDom('div', {'id':'ogl_defaultShipPicker', 'class':'ogl_shipList'})); [202, 203, 219, 210].forEach(shipID => { let cargoType = cargoChoice.appendChild(Util.createDom('div', {'class':'ogl_shipIcon ogl_'+shipID})); cargoType.addEventListener('click', () => { this.ogl.json.options.defaultShip = shipID; Util.saveData(this.ogl.json); document.location.reload(); }); }); // default mission button let mission = this.ogl.json.options.defaultMission; let missionButton = this.ogl.menuOptions.appendChild(Util.createDom('div', {'class':'material-icons tooltip ogl_button ogl_missionPicker'+mission, 'title':this.ogl.component.langManager.getText('defaultMission')}, mission == 3 ? 'swap_horiz' : 'keyboard_tab')); missionButton.addEventListener('click', () => { this.ogl.json.options.defaultMission = mission == 3 ? 4 : 3; Util.saveData(this.ogl.json); window.location.href = window.location.href.replace(`&mission=${mission}`, `&mission=${this.ogl.json.options.defaultMission}`); }); let nextElementWithMoon = this.ogl.current.smallplanet; if(document.querySelector('.moonlink')) { if(!this.ogl.current.smallplanet.querySelector('.moonlink') || this.ogl.mode == 1 || this.ogl.mode == 4) { do nextElementWithMoon = nextElementWithMoon.nextElementSibling || document.querySelectorAll('.smallplanet')[0]; while(!nextElementWithMoon.querySelector('.moonlink')); } } let harvestAction = (mode, origin, destination) => { let link = `?page=ingame&component=fleetdispatch&galaxy=${destination.coords[0]}&system=${destination.coords[1] }&position=${destination.coords[2]}&type=${destination.type}&mission=${this.ogl.json.options.defaultMission}&cp=${origin.cp}&oglMode=${mode}`; if(mode == 4) this.ogl.json.options.autoHarvest = [origin.coords[0], origin.coords[1], origin.coords[2], origin.type]; else this.ogl.json.options.autoHarvest = [destination.coords[0], destination.coords[1], destination.coords[2], destination.type]; this.ogl.json.options.harvestInitialPlanet = origin.cp; Util.saveData(this.ogl.json); window.location.href = this.ogl.baselink + link; } // auto harvest button let loopButton = this.ogl.menuOptions.appendChild(Util.createDom('div', {'class':'material-icons ogl_harvest ogl_button ogl_button tooltip', 'title':this.ogl.component.langManager.getText('autoCollect')}, 'all_inclusive')); loopButton.addEventListener('click', () => { this.ogl.component.popupManager.load(); let dom = Util.createDom('div', {'class':'ogl_planetList'}); let planetList = this.ogl.component.planetManager.myPlanets; let origin, destination; // harvest planet to its associated moon if(nextElementWithMoon) { let linkedMoon = dom.appendChild(Util.createDom('button', {'class':'ogl_linkedMoon ogl_button'}, this.ogl.component.langManager.getText('linkedMoons'))); linkedMoon.addEventListener('click', () => { origin = { coords:nextElementWithMoon.querySelector('.planet-koords').textContent.slice(1,-1).split(':'), type:1, cp:nextElementWithMoon.getAttribute('id').replace('planet-', '') }; destination = { coords:nextElementWithMoon.querySelector('.planet-koords').textContent.slice(1,-1).split(':'), type:3 }; harvestAction(4, origin, destination); }); } // harvest planet/moon to the chosen location Object.keys(planetList).forEach(planet => { origin = { coords:this.ogl.current.coords, type:(this.ogl.current.type == 'moon' ? 3 : 1) }; if(origin.type == 1) origin.cp = this.ogl.current.smallplanet.getAttribute('id').replace('planet-', ''); else origin.cp = new URL(this.ogl.current.smallplanet.querySelector('.moonlink').href).searchParams.get('cp'); let line = dom.appendChild(Util.createDom('div', {'data-coords':planetList[planet].coords, 'data-multi':planetList[planet].multi})); line.appendChild(Util.createDom('div', {'class':'ogl_coords'}, `[${planetList[planet].coords}] <b>${planetList[planet].name}</b>`)); let buttons = line.appendChild(Util.createDom('div', {'class':'ogl_actions'})); // planet let pButton = buttons.appendChild(Util.createDom('div', {'class':'ogl_planet material-icons', 'data-type':'1'}, 'language')); if(planet == origin.coords.join(':') && origin.type == 1) pButton.classList.add('ogl_disabled'); pButton.addEventListener('click', () => { destination = { coords:planetList[planet].coords.split(':'), type:1 }; harvestAction(1, origin, destination); }); // moon if(planetList[planet].moon) { let mButton = buttons.appendChild(Util.createDom('div', {'class':'ogl_planet material-icons', 'data-type':'3'}, 'brightness_2')); if(planet == origin.coords.join(':') && origin.type == 3) mButton.classList.add('ogl_disabled'); mButton.addEventListener('click', () => { destination = { coords:planetList[planet].coords.split(':'), type:3 }; harvestAction(1, origin, destination); }); } }); this.ogl.component.popupManager.open(dom); }); if((this.ogl.mode == 1 || this.ogl.mode == 4) && Util.getPage() == 'fleetdispatch') { let nextElement; loopButton.classList.add('ogl_active'); if(this.ogl.mode == 1) { nextElement = this.ogl.current.type == 'moon' ? nextElementWithMoon : this.ogl.current.next; let coords = this.ogl.json.options.autoHarvest.join(':'); if(this.ogl.current.type == 'planet') { if(coords == nextElement.getAttribute('data-coords')+':1') { nextElement = nextElement.nextElementSibling || document.querySelectorAll('.smallplanet')[0]; } } else { if(coords == nextElement.getAttribute('data-coords')+':3') { do nextElement = nextElement.nextElementSibling || document.querySelectorAll('.smallplanet')[0]; while(!nextElement.querySelector('.moonlink')); } } } else { nextElement = nextElementWithMoon; this.ogl.json.options.autoHarvest = (nextElementWithMoon.getAttribute('data-coords')+':3').split(':'); } let coords = this.ogl.json.options.autoHarvest; let cp; let link; if(this.ogl.current.type == 'planet') cp = nextElement.getAttribute('id').replace('planet-', ''); else cp = new URL(nextElement.querySelector('.moonlink').href).searchParams.get('cp'); if(cp == this.ogl.json.options.harvestInitialPlanet) link = `?page=ingame&component=overview&cp=${cp}`; else { link = `?page=ingame&component=fleetdispatch&galaxy=${coords[0]}&system=${coords[1] }&position=${coords[2]}&type=${coords[3]}&mission=${mission}&cp=${cp}&oglMode=${this.ogl.mode}`; } this.nextLink = link; Util.overwriteFleetDispatcher('trySubmitFleet2', false, () => { fleetDispatcher.selectMaxAll(); fleetDispatcher.refresh(); }); Util.overwriteFleetDispatcher('submitFleet3', false, () => { if(fleetDispatcher.currentPage == 'fleet3') localStorage.setItem('ogl-redirect', this.ogl.baselink + link); }); } } expedition() { let div = document.querySelector('#fleetdispatchcomponent .allornonewrap .secondcol'); //let mainShipButton = div.appendChild(Util.createDom('div', {'data-ratio':'1', 'class':`ogl_shipIcon ogl_${this.ogl.json.options.expeShips[0]}`})); //let subShipButton = div.appendChild(Util.createDom('div', {'data-ratio':this.ogl.json.options.expeShips[2]})); this.expeButton = div.appendChild(Util.createDom('div', {'class':'ogl_expeButton'})); /*if([202,203,219].indexOf(this.ogl.json.options.expeShips[0]) > -1) subShipButton.className = 'ogl_shipIcon ogl_0'; else subShipButton.className = 'ogl_active ogl_shipIcon ogl_'+this.ogl.json.options.expeShips[1]; mainShipButton.addEventListener('click', () => { let container = Util.createDom('div', {'class':'ogl_shipList'}); [202,203,204,205,206,207,209,211,213,214,215,218,219].forEach(shipID => { let ship = container.appendChild(Util.createDom('div', {'class':'ogl_shipIcon ogl_'+shipID})); ship.addEventListener('click', () => { mainShipButton.classList.remove('ogl_'+this.ogl.json.options.expeShips[0]); mainShipButton.classList.add('ogl_'+shipID); this.ogl.json.options.expeShips[0] = shipID; if([202,203,219].indexOf(shipID) > -1) subShipButton.className = 'ogl_shipIcon ogl_0'; else subShipButton.className = 'ogl_active ogl_shipIcon ogl_'+this.ogl.json.options.expeShips[1]; Util.saveData(this.ogl.json); this.ogl.component.popupManager.close(); }); }); this.ogl.component.popupManager.open(container); }); subShipButton.addEventListener('click', () => { if([202,203,219].indexOf(this.ogl.json.options.expeShips[0]) > -1) return; let container = Util.createDom('div', {'class':'ogl_shipList'}); [202,203,219,0].forEach(shipID => { let ship = container.appendChild(Util.createDom('div', {'class':'ogl_shipIcon ogl_'+shipID})); ship.addEventListener('click', () => { subShipButton.classList.remove('ogl_'+this.ogl.json.options.expeShips[1]); subShipButton.classList.add('ogl_'+shipID); this.ogl.json.options.expeShips[1] = shipID; Util.saveData(this.ogl.json); this.ogl.component.popupManager.close(); }); }); let expeRatio = container.appendChild(Util.createDom('input', {'class':'ogl_expeRatio', 'type':'number', 'value':this.ogl.json.options.expeShips[2], 'min':'0', 'max':'2', 'step':'0.1' })); expeRatio.addEventListener('input', () => { if(!expeRatio.checkValidity()) expeRatio.value = '0'; expeRatio.value = parseFloat(expeRatio.value); this.ogl.json.options.expeShips[2] = expeRatio.value; subShipButton.setAttribute('data-ratio', expeRatio.value); Util.saveData(this.ogl.json); }); this.ogl.component.popupManager.open(container); });*/ this.expeButtonAction = forcedShip => { fleetDispatcher.resetShips(); if(forcedShip) this.ogl.json.options.expeShips[0] = this.ogl.json.options.defaultShip; // NO MILI EXPE let mainAmount, subAmount, fillerId = 0; let coords = [fleetDispatcher.currentPlanet.galaxy, fleetDispatcher.currentPlanet.system, fleetDispatcher.currentPlanet.position]; if([202,203,219].indexOf(this.ogl.json.options.expeShips[0]) > -1) { let maxTotal = 0; let minShip = 0; let currentStep = 0; let steps = { 10000 : { 202:273, 203:91, 219:137, max:40000 }, 100000 : { 202:423, 203:141, 219:212, max:500000 }, 1000000 : { 202:423, 203:191, 219:212, max:1200000 }, 5000000 : { 202:423, 203:191, 219:212, max:1800000 }, 25000000 : { 202:573, 203:191, 219:287, max:2400000 }, 50000000 : { 202:723, 203:241, 219:362, max:3000000 }, 75000000 : { 202:873, 203:291, 219:437, max:3600000 }, 100000000 : { 202:1023, 203:341, 219:512, max:4200000 }, 999999999999999999999999999999 : { 202:1223, 203:417, 219:612, max:5000000 }, } for(const [key, value] of Object.entries(steps)) { if(this.ogl.json.topScore[0] < key && !currentStep) { currentStep = key; break; } } maxTotal = steps[currentStep]['max']; minShip = steps[currentStep][this.ogl.json.options.expeShips[0]]; maxTotal = this.ogl.json.playerClass == 3 ? maxTotal * 3 * this.ogl.ecoSpeed : maxTotal * 2; mainAmount = Math.max(minShip, this.calcRequiredShips(this.ogl.json.options.expeShips[0], maxTotal)); } else { mainAmount = parseInt(document.querySelector(`.technology[data-technology="${this.ogl.json.options.expeShips[0]}"] .amount`).getAttribute('data-value')); mainAmount = (Math.floor(mainAmount / (fleetDispatcher.maxExpeditionCount - fleetDispatcher.expeditionCount)) || 0); subAmount = Math.floor(mainAmount * this.ogl.json.options.expeShips[2]); } let priority = [218, 213, 211, 215, 207]; priority.forEach(shipID => { let count = document.querySelector(`.technology[data-technology="${shipID}"] .amount`).getAttribute('data-value'); if(fillerId == 0 && count > 0) fillerId = shipID; }); shipsOnPlanet.forEach(ship => { if(ship.id == this.ogl.json.options.expeShips[0]) fleetDispatcher.selectShip(ship.id, mainAmount); else if(ship.id == this.ogl.json.options.expeShips[1] && subAmount) fleetDispatcher.selectShip(ship.id, subAmount); else if(ship.id == fillerId && this.ogl.json.options.expeShips[0] != fillerId) fleetDispatcher.selectShip(ship.id, 1); else if(ship.id == 210) fleetDispatcher.selectShip(ship.id, 1); else if(ship.id == 219 && this.ogl.json.options.expeShips[0] != 219 && this.ogl.json.options.expeShips[1] != 219) fleetDispatcher.selectShip(ship.id, 1); }); fleetDispatcher.targetPlanet.galaxy = coords[0]; fleetDispatcher.targetPlanet.system = coords[1]; fleetDispatcher.targetPlanet.position = 16; fleetDispatcher.targetPlanet.type = 1; fleetDispatcher.targetPlanet.name = '-'; fleetDispatcher.mission = 15; fleetDispatcher.expeditionTime = 1; fleetDispatcher.refresh(); this.tempCoords = [fleetDispatcher.targetPlanet.galaxy, fleetDispatcher.targetPlanet.system,fleetDispatcher.targetPlanet.position, fleetDispatcher.targetPlanet.type]; setTimeout(() => document.querySelector('#continueToFleet2').focus(), 100); } this.expeButton.addEventListener('click', () => this.expeButtonAction(true)); } addFretInfoUI() { let container = document.querySelector('#fleet1 .allornonewrap').appendChild(Util.createDom('div', {'class':'ogl_capacityContainer ogl_button tooltip', 'title':this.ogl.component.langManager.getText('capacityPicker')})); let dom = container.appendChild(Util.createDom('div', {'class':'ogl_capacityInfo'})); let capacityValues = dom.appendChild(Util.createDom('p')); let current = dom.appendChild(Util.createDom('div', {'class':'ogl_capacityCurrent'})); let required = dom.appendChild(Util.createDom('div', {'class':'ogl_capacityRequired'}, this.ogl.component.langManager.getText('required') + ' ' + Util.formatNumber(fleetDispatcher.totalOnPlanet))); container.appendChild(Util.createDom('i', {'class':'material-icons'}, 'launch')); required.appendChild(Util.createDom('div')); required.style.width = Math.min(fleetDispatcher.totalOnPlanet / fleetDispatcher.totalFret * 100, 100) + '%'; if(fleetDispatcher.totalOnPlanet > fleetDispatcher.totalFret) bar.classList.add('ogl_active'); let updateData = () => { let domWidth = fleetDispatcher.getCargoCapacity() / fleetDispatcher.totalFret * 100; current.style.width = domWidth + '%'; capacityValues.innerHTML = `<span class="float_right"><b>${Util.formatNumber(fleetDispatcher.getCargoCapacity())}</b> / <b>${Util.formatNumber(fleetDispatcher.totalFret)}</b></span>`; }; Util.loop(() => updateData()); container.addEventListener('click', () => { this.ogl.component.popupManager.load(); let domPick = Util.createDom('div', {'class':'ogl_choseCapacity'}); domPick.appendChild(Util.createDom('h2', {}, this.ogl.component.langManager.getText('capacityPicker'))); let metal = domPick.appendChild(Util.createDom('div', {}, '<div class="ogl_shipIcon ogl_metal"></div>')); let inputMetal = metal.appendChild(Util.createDom('input', {'type':'text', 'placeholder':this.ogl.component.langManager.getText('metal'), 'class':'ogl_checkInput'})); let crystal = domPick.appendChild(Util.createDom('div', {}, '<div class="ogl_shipIcon ogl_crystal"></div>')); let inputCrystal = crystal.appendChild(Util.createDom('input', {'type':'text', 'placeholder':this.ogl.component.langManager.getText('crystal'), 'class':'ogl_checkInput'})); let deut = domPick.appendChild(Util.createDom('div', {}, '<div class="ogl_shipIcon ogl_deut"></div>')); let inputDeut = deut.appendChild(Util.createDom('input', {'type':'text', 'placeholder':this.ogl.component.langManager.getText('deut'), 'class':'ogl_checkInput'})); let button = domPick.appendChild(Util.createDom('button', {'class':'ogl_button'}, 'ok')); this.ogl.component.popupManager.open(domPick); Util.clickOrKeydown(button, 13, () => { if(inputMetal.value || inputCrystal.value || inputDeut.value) { let res = [Util.formatFromUnits(inputMetal.value) || 0, Util.formatFromUnits(inputCrystal.value) || 0, Util.formatFromUnits(inputDeut.value) || 0]; let sum = res.reduce((a, b) => a + b, 0); let shipID = this.ogl.json.options.defaultShip; let required = this.calcRequiredShips(shipID, sum); this.shipsOnPlanet[shipID] = this.shipsOnPlanet[shipID] || {number:0}; fleetDispatcher.selectShip(shipID, Math.min(required, this.shipsOnPlanet[shipID].number)); fleetDispatcher.cargoMetal = Math.min(this.ogl.component.fleetManager.resOnPlanet[0], res[0], fleetDispatcher.getFreeCargoSpace()); fleetDispatcher.cargoCrystal = Math.min(this.ogl.component.fleetManager.resOnPlanet[1], res[1], fleetDispatcher.getFreeCargoSpace()); fleetDispatcher.cargoDeuterium = Math.min(this.ogl.component.fleetManager.resOnPlanet[2], res[2], fleetDispatcher.getFreeCargoSpace()); fleetDispatcher.refresh(); } this.ogl.component.popupManager.close(); setTimeout(() => document.querySelector('#continueToFleet2').focus(), 100); }, true); }); } addRequiredUI() { let shipList = [202,203,209,210,219]; document.querySelectorAll('#fleet1 .technology').forEach(technology => { let shipID = parseInt(technology.getAttribute('data-technology')); if(shipList.indexOf(shipID) < 0) return; let required = this.calcRequiredShips(shipID, this.totalOnPlanet); if(isFinite(required)) { let dom = Util.createDom('div', {'class':'ogl_required'}, Util.formatNumber(required)); technology.querySelector('.icon').appendChild(dom); dom.addEventListener('click', event => { event.preventDefault(); event.stopPropagation(); this.shipsOnPlanet[shipID] = this.shipsOnPlanet[shipID] || {number:0}; fleetDispatcher.selectShip(shipID, Math.min(required, this.shipsOnPlanet[shipID].number)); fleetDispatcher.refresh(); setTimeout(() => document.querySelector('#continueToFleet2').focus(), 100); }); } }); } updateSpeedPercent() { this.sliderSpeed.querySelectorAll('div').forEach(e => e.classList.remove('ogl_active')); this.sliderSpeed.querySelector(`[data-step="${fleetDispatcher.speedPercent}"]`).classList.add('ogl_active'); } addFleet2UI() { document.querySelector('#speedPercentage').classList.add('ogl_hidden'); this.sliderSpeed = Util.createDom('div', {'class':'ogl_fleetSpeed'}); if(this.ogl.json.playerClass == 2) this.sliderSpeed.classList.add('ogl_big'); document.querySelector('#fleet2 .content').insertBefore(this.sliderSpeed, document.querySelector('#fleet2 .content .briefing')); let steps = this.ogl.json.playerClass == 2 ? .5 : 1; for(let i=steps; i<=10; i+=steps) { let step = this.sliderSpeed.appendChild(Util.createDom('div', {'data-step':i}, i*10)); if(fleetDispatcher.speedPercent == i) step.classList.add('ogl_active'); } this.sliderSpeed.addEventListener('click', event => { if(!event.target.getAttribute('data-step')) return; this.sliderSpeed.querySelectorAll('div').forEach(e => e.classList.remove('ogl_active')); event.target.classList.add('ogl_active'); fleetDispatcher.speedPercent = event.target.getAttribute('data-step'); fleetDispatcher.refresh(); setTimeout(() => document.querySelector('#continueToFleet3').focus(), 100); }); this.sliderSpeed.addEventListener('mouseover', event => { fleetDispatcher.speedPercent = event.target.getAttribute('data-step'); fleetDispatcher.refresh(); }); this.sliderSpeed.addEventListener('mouseout', event => { fleetDispatcher.speedPercent = this.sliderSpeed.querySelector('.ogl_active').getAttribute('data-step'); fleetDispatcher.refresh(); }); let dom = Util.createDom('div', {'class':'ogl_planetList'}); // document.querySelector('#fleet2 #buttonz').insertBefore(dom, document.querySelector('#fleet2 .content')); document.querySelector('#fleet2 #buttonz').appendChild(dom); document.querySelectorAll('input#galaxy, input#system, input#position').forEach(input => { input.addEventListener('input', () => this.checkPlanetList()); }); document.querySelectorAll('a#pbutton, a#mbutton, a#dbutton').forEach(button => { button.addEventListener('click', () => this.checkPlanetList()); }); let planetList = this.ogl.component.planetManager.myPlanets; dom.addEventListener('click', event => { if(!event.target.classList.contains('ogl_planet') && !event.target.classList.contains('ogl_moon') && !event.target.classList.contains('ogl_cr')) return; let coords = event.target.closest('[data-coords]').getAttribute('data-coords').split(':'); let type = event.target.getAttribute('data-type'); this.updatePlanetList(coords, type); this.tempCoords = coords; this.tempCoords.push(type); dom.querySelectorAll('.ogl_active').forEach(e => e.classList.remove('ogl_active')); event.target.classList.add('ogl_active'); fleetDispatcher.targetPlanet.galaxy = coords[0]; fleetDispatcher.targetPlanet.system = coords[1]; fleetDispatcher.targetPlanet.position = coords[2]; fleetDispatcher.targetPlanet.type = parseInt(type); fleetDispatcher.refresh(); setTimeout(() => document.querySelector('#continueToFleet3').focus(), 100); }); let hasFocus = false; dom.addEventListener('mouseover', event => { if(!event.target.classList.contains('ogl_planet') && !event.target.classList.contains('ogl_moon') && !event.target.classList.contains('ogl_cr')) return; let coords = event.target.closest('[data-coords]').getAttribute('data-coords').split(':'); let type = event.target.getAttribute('data-type'); this.updatePlanetList(coords, type); fleetDispatcher.targetPlanet.galaxy = coords[0]; fleetDispatcher.targetPlanet.system = coords[1]; fleetDispatcher.targetPlanet.position = coords[2]; fleetDispatcher.targetPlanet.type = parseInt(event.target.getAttribute('data-type')); fleetDispatcher.refresh(); hasFocus = true; }); dom.addEventListener('mouseout', event => { if(hasFocus) { let params = new URL(window.location.href); let g = params.searchParams.get('galaxy'); let s = params.searchParams.get('system'); let p = params.searchParams.get('position'); let t = params.searchParams.get('type'); let type = parseInt(this.tempCoords[3]); let coords = `${this.tempCoords[0]}:${this.tempCoords[1]}:${this.tempCoords[2]}`.split(':'); fleetDispatcher.targetPlanet.galaxy = g || this.tempCoords[0]; fleetDispatcher.targetPlanet.system = s || this.tempCoords[1]; fleetDispatcher.targetPlanet.position = p || this.tempCoords[2]; fleetDispatcher.targetPlanet.type = t || type; this.updatePlanetList(coords, type); fleetDispatcher.refresh(); hasFocus = false; } else { this.tempCoords[0] = fleetDispatcher.targetPlanet.galaxy; this.tempCoords[1] = fleetDispatcher.targetPlanet.system; this.tempCoords[2] = fleetDispatcher.targetPlanet.position; this.tempCoords[3] = fleetDispatcher.targetPlanet.type; } }); Object.keys(planetList).forEach(planet => { let line = dom.appendChild(Util.createDom('div')); line.setAttribute('data-coords', planetList[planet].coords); line.setAttribute('data-multi', planetList[planet].multi); let isCurrent = false; let isSource = false; if(planetList[planet].galaxy == fleetDispatcher.targetPlanet.galaxy && planetList[planet].system == fleetDispatcher.targetPlanet.system && planetList[planet].position == fleetDispatcher.targetPlanet.position) isCurrent = true; if(planetList[planet].galaxy == fleetDispatcher.currentPlanet.galaxy && planetList[planet].system == fleetDispatcher.currentPlanet.system && planetList[planet].position == fleetDispatcher.currentPlanet.position) isSource = true; line.appendChild(Util.createDom('div', {'class':'ogl_coords'}, `${planetList[planet].coords}`)); //line.appendChild(Util.createDom('div', {'class':'ogl_name'}, `${planetList[planet].name}`)); let buttons = line.appendChild(Util.createDom('div', {'class':'ogl_actions'})); let p = buttons.appendChild(Util.createDom('div', {'class':'ogl_planet material-icons', 'data-type':'1'}, 'language')); if(planetList[planet].moon) { let m = buttons.appendChild(Util.createDom('div', {'class':'ogl_moon material-icons', 'data-type':'3'}, 'brightness_2')); if(this.ogl.current.type == 'moon' && isSource == true) m.classList.add('ogl_disabled'); if(fleetDispatcher.targetPlanet.type == 3 && isCurrent == true) m.classList.add('ogl_active'); } else { buttons.appendChild(Util.createDom('div', {'class':'ogl_moon material-icons ogl_disabled', 'data-type':'3'}, 'brightness_2')); } let c = buttons.appendChild(Util.createDom('div', {'class':'ogl_cr', 'data-type':'2'})); c.appendChild(Util.createDom('img', {'src':'https://gf1.geo.gfsrv.net/cdnc5/fa3e396b8af2ae31e28ef3b44eca91.gif'})); if(this.ogl.current.type == 'planet' && isSource == true) p.classList.add('ogl_disabled'); if(fleetDispatcher.targetPlanet.type == 1 && isCurrent == true) p.classList.add('ogl_active'); //if(fleetDispatcher.targetPlanet.type == 2 && isCurrent == true) c.classList.add('ogl_disabled'); }); } addFleet3UI() { let resourcesNames = [loca.LOCA_ALL_METAL, loca.LOCA_ALL_CRYSTAL, loca.LOCA_ALL_DEUTERIUM]; document.querySelectorAll('#fleet3 #resources .res_wrap').forEach((resource, index) => { let cargoType = ['cargoMetal', 'cargoCrystal', 'cargoDeuterium']; let edit = resource.querySelector('.res').appendChild(Util.createDom('div', {'class':'ogl_resourceSaver'}, '$')); if(this.ogl.json.options.resSaver[index]) edit.textContent = '-' + Util.formatToUnits(this.ogl.json.options.resSaver[index]); resource.querySelector('input').classList.add('ogl_checkInput'); let deltaResources = resource.querySelector('.res').appendChild(Util.createDom('div', {'class':'ogl_delta material-icons'}, 'fiber_smart_record')); deltaResources.addEventListener('click', () => { let resourceValue = Util.formatFromUnits(resource.querySelector('input').value) || 0; let currentMax = this.resOnPlanet[index]; if(index == 2) currentMax -= fleetDispatcher.getConsumption(); fleetDispatcher[cargoType[index]] = Math.max(Math.min(currentMax - resourceValue, currentMax), 0); resource.querySelector('input').value = fleetDispatcher[cargoType[index]]; setTimeout(() => document.querySelector('#sendFleet').focus(), 100); }); edit.addEventListener('click', () => { this.ogl.component.popupManager.load(); let container = Util.createDom('div', {'class':'ogl_resourceToKeep'}); container.appendChild(Util.createDom('h2', {}, `${resourcesNames[index]} to keep on planet`)); let input = container.appendChild(Util.createDom('input', {'type':'text', 'class':'ogl_checkInput'})); let validate = container.appendChild(Util.createDom('button', {'class':'ogl_button'}, 'ok')); this.ogl.component.popupManager.open(container); validate.addEventListener('click', () => { if(input.value || input.value == 0) { let resType = ['metalOnPlanet', 'crystalOnPlanet', 'deuteriumOnPlanet']; let rawInput = Util.formatFromUnits(input.value); let currentValue = fleetDispatcher[resType[index]]; window[resType[index]] = fleetDispatcher[resType[index]] = Math.max(0, this.initialResOnPlanet[index] - rawInput); this.ogl.json.options.resSaver[index] = rawInput; edit.textContent = input.value == 0 ? '$' : '-' + Util.formatToUnits(input.value); fleetDispatcher.resetCargo(); fleetDispatcher.refresh(); this.resOnPlanet = [fleetDispatcher.metalOnPlanet, fleetDispatcher.crystalOnPlanet, fleetDispatcher.deuteriumOnPlanet]; Util.saveData(this.ogl.json); } this.ogl.component.popupManager.close(container); setTimeout(() => document.querySelector('#sendFleet').focus(), 100); }); }); }); let allButton = Util.createDom('div', {'class':'ogl_button ogl_loadAllResources material-icons'}, 'double_arrow'); document.querySelector('#fleet3 #loadAllResources').appendChild(allButton); allButton.addEventListener('click', () => { fleetDispatcher.selectMaxAll(); fleetDispatcher.refresh(); setTimeout(() => document.querySelector('#sendFleet').focus(), 100); }); let noneButton = Util.createDom('div', {'class':'ogl_button ogl_loadAllResources material-icons'}, 'clear'); document.querySelector('#fleet3 #loadAllResources').appendChild(noneButton); noneButton.addEventListener('click', () => { fleetDispatcher.resetCargo(); fleetDispatcher.refresh(); setTimeout(() => document.querySelector('#sendFleet').focus(), 100); }); } addDeltaUI() { document.querySelectorAll('#fleet1 .technology').forEach(technology => { let shipID = parseInt(technology.getAttribute('data-technology')); let dom = Util.createDom('div', {'class':'ogl_delta material-icons'}, 'fiber_smart_record'); technology.querySelector('.icon').appendChild(dom); dom.addEventListener('click', event => { event.preventDefault(); event.stopPropagation(); fleetDispatcher.selectShip(shipID, this.deltaSelectedShips(shipID)); fleetDispatcher.refresh(); setTimeout(() => document.querySelector('#continueToFleet2').focus(), 100); }); }); } addBackTimer() { document.querySelectorAll('.reversal a').forEach(button => { let time = button.getAttribute('data-tooltip') || button.getAttribute('title'); time = time.replace('<br>',' '); time = time.replace(/ \.$/, ''); time = time.trim().replace(/[ \.]/g, ':'); time = time.split(':'); let initialTime = Date.now(); let domElement = button.closest('.fleetDetails').appendChild(Util.createDom('div', {'class':'ogl_fulldate ogl_hiddenContent ogl_timeZone ogl_backTimer'})); setInterval(() => { let deltaTime = Date.now() - initialTime; this.updateBackTimer(domElement, time, deltaTime); }, 200); }); } updateBackTimer(parent, time, offset) { let newTime = new Date(`${time[4]}-${time[3]}-${time[2]}T${time[5]}:${time[6]}:${time[7]}`).getTime(); newTime = new Date((newTime - Math.round(timeDiff / 100000) * 100000) + offset * 2); parent.setAttribute('data-timestamp', newTime.getTime()); parent.setAttribute('data-datezone', `${newTime.toLocaleDateString('fr-FR').replace(/\//g, '.')} `); parent.setAttribute('data-timezone', ` ${newTime.toLocaleTimeString('fr-FR')}`); } calcRequiredShips(shipID, resources) { let fret = this.ogl.json.shipCapacity[shipID]; let required = Math.ceil(parseInt(resources) / parseInt(fret)); return required; } deltaSelectedShips(shipID) { return this.shipsOnPlanet[shipID].number - (fleetDispatcher.findShip(shipID) || {number:0}).number; } sendSpyProbe(coords, count, sender) { let params = { mission:6, galaxy:coords[0], system:coords[1], position:coords[2], type:coords[3], shipCount:count, token:miniFleetToken, } $.ajax(miniFleetLink, { data:params, dataType:"json", type:"POST", success:function(data) { if(typeof data.newToken != "undefined") { miniFleetToken = data.newToken; } fadeBox(data.response.message + ' ' + data.response.coordinates.galaxy + ":" + data.response.coordinates.system + ":" + data.response.coordinates.position, !data.response.success); if(sender && data.response.success) sender.classList.add('ogl_disabled'); } }); } } class TooltipManager { constructor(ogl) { this.ogl = ogl; this.ogl.tooltipList = this.ogl.tooltipList || {}; this.ogl.tmpTooltip = this.ogl.tmpTooltip || {}; this.dom = document.body.appendChild(Util.createDom('div', {'class':'ogl_tooltip tpd-tooltip'})); this.cross = this.dom.appendChild(Util.createDom('div', {'class':'ogl_close material-icons'}, 'clear')); this.container = this.dom.appendChild(Util.createDom('div', {})); this.timer; this.closeTimer; this.overed = false; document.addEventListener('click', event => { if(!this.dom.classList.contains('ogl_active')) return; if(event.target != this.dom && !event.target.closest('.ogl_tooltip')) this.close(); }); this.dom.addEventListener('mouseover', e => this.overed = true); this.dom.addEventListener('mouseleave', () => this.overed = false); this.cross.addEventListener('click', () => this.close()); Util.loop(() => this.initTooltip()); } initTooltip() { document.querySelectorAll(`.tooltip:not(.ogl_tooltipReady), .tooltipRight:not(.ogl_tooltipReady), .tooltipLeft:not(.ogl_tooltipReady), .tooltipBottom:not(.ogl_tooltipReady), .tooltipClose:not(.ogl_tooltipReady), .tooltipHTML:not(.ogl_tooltipReady), .tooltipRel:not(.ogl_tooltipReady), .tooltipCustom:not(.ogl_tooltipReady)`).forEach(sender => { if(sender.classList.contains('ogl_tooltipReady') || !this.ogl.component.tooltipManager) return; sender.classList.add('ogl_tooltipReady'); if(this.ogl.component.tooltipManager.dom.contains(sender)) return; let content; if(sender.classList.contains('tooltipRel')) { let id = '#' + sender.getAttribute('rel'); if(document.querySelector(id) && !this.ogl.tooltipList[id]) this.ogl.tooltipList[id] = document.querySelector(id); content = this.ogl.tooltipList[id]; if(id == '#demolition_costs_tooltip_oneTimeelement') this.ogl.tooltipList[id] = false; if(id.indexOf('planet') == 1 || id.indexOf('moon') == 1 || id.indexOf('debris') == 1) this.ogl.tooltipList[id] = false; if(id.indexOf('debris') == 1) this.ogl.tmpTooltip[id] = content; } else { sender.setAttribute('data-tooltip', sender.getAttribute('title')); content = sender.getAttribute('data-tooltip'); } if(!content) return; if(content.style && content.style.display == 'none') { content.style.display = 'block'; } let div = Util.createDom('div'); sender.classList.contains('tooltipRel') ? div.appendChild(content) : div.innerHTML = content; if(sender.classList.contains('tooltipClick')) { sender.addEventListener('click', () => this.open(sender, content, 0)); sender.addEventListener('click', event => { if(event.target != sender) { if(content && content != 'null') this.close(); } }); } else { sender.addEventListener('mouseenter', () => this.open(sender, content)); sender.addEventListener('mouseleave', () => { sender.setAttribute('title', sender.getAttribute('data-temp-title')); if(!sender.classList.contains('tooltipClose') && !sender.classList.contains('tooltipCustom')) { if(content && content != 'null') this.close(); } else { this.closeTimer = setInterval(() => { if(content && content != 'null' && !this.overed) { this.close(); clearInterval(this.closeTimer); } }, 400); } clearTimeout(this.timer); }); } }); } open(sender, content, delay) { if(!content || content == 'null') return; clearInterval(this.closeTimer); this.close(); this.sender = sender; if(sender.getAttribute('title') && sender.getAttribute('title') != 'null' && sender.getAttribute('title') != sender.getAttribute('data-tooltip')) content = sender.getAttribute('title'); sender.setAttribute('data-temp-title', sender.getAttribute('title')); sender.removeAttribute('title'); this.dom.style.height = '0'; this.dom.style.width = '0'; this.container.textContent = ''; typeof content == 'object' ? this.container.appendChild(content) : this.container.innerHTML = content; if(this.container.textContent.indexOf('|') > -1) { this.container.innerHTML = this.container.innerHTML.replace(/\|/g, '<div class="splitLine"></div>'); } delay = delay === 0 ? 0 : delay || 200; let rect = sender.getBoundingClientRect(); let win = sender.ownerDocument.defaultView; this.position = { x:rect.left + win.pageXOffset, y:rect.top + win.pageYOffset }; this.updateBeforeDisplay(sender); this.dom.className = 'ogl_tooltip tpd-tooltip'; this.timer = setTimeout(() => { this.dom.style.width = 'fit-content'; this.dom.style.width = '-moz-fit-content'; this.dom.style.height = 'auto'; this.dom.classList.add('ogl_active'); if(sender.classList.contains('tooltipLeft')) { this.dom.classList.add('ogl_left'); this.position.x -= this.dom.offsetWidth; this.position.x += rect.width / 2; this.position.y -= this.dom.offsetHeight / 2; this.position.y += 4; this.position.y += rect.height / 2; } else if(sender.classList.contains('tooltipRight')) { this.dom.classList.add('ogl_right'); this.position.x += rect.width + 4; this.position.y -= this.dom.offsetHeight / 2; this.position.y += 4; this.position.y += rect.height / 2; } else if(sender.classList.contains('tooltipBottom')) { this.dom.classList.add('ogl_bottom'); this.position.x -= this.dom.offsetWidth / 2; this.position.x += rect.width / 2; this.position.y += rect.height; } else { this.position.x -= this.dom.offsetWidth / 2; this.position.x += rect.width / 2; this.position.y -= this.dom.offsetHeight; this.position.y -= 4; } if(sender.classList.contains('tooltipClose') || sender.classList.contains('tooltipCustom') || sender.classList.contains('tooltipRel')) { this.cross.classList.remove('ogl_hidden'); this.dom.classList.remove('ogl_noPointer'); } else { this.cross.classList.add('ogl_hidden'); this.dom.classList.add('ogl_noPointer'); } this.position.x = Math.round(this.position.x); this.position.y = Math.round(this.position.y); this.position.x = this.position.x - (this.position.x % 2); this.position.y = this.position.y - (this.position.y % 2); this.dom.style.top = this.position.y + 'px'; this.dom.style.left = this.position.x + 'px'; }, delay); } close() { this.dom.classList.remove('ogl_active'); } updateBeforeDisplay(sender) { if(this.container.querySelector('.fleetinfo')) { if((sender.classList.contains('ogl_updated') && sender.closest('.route')) || (sender.classList.contains('ogl_updated') && sender.closest('.fleetDetailButton'))) return; this.container.querySelectorAll('.fleetinfo tr').forEach(line => { if(line.textContent.trim() == '') line.classList.add('ogl_hidden'); else if(!line.querySelector('td')) line.classList.add('ogl_full'); else { let id = Util.findObjectByValue(this.ogl.json.loca, line.querySelector('td').textContent.replace(':', '')) || -1; if(id) { line.classList.add('ogl_'+id); line.querySelector('td').textContent = ''; line.querySelector('td').className = 'ogl_shipIcon ogl_'+id; line.title = line.querySelector('.value').textContent; line.querySelector('.value').textContent = Util.formatToUnits(line.querySelector('.value').textContent); } } }); if(sender.closest('.fleetDetails')) { sender.closest('.fleetDetails').querySelector('.fleetDetailButton a').classList.add('ogl_updated'); sender.closest('.fleetDetails').querySelector('.route a').classList.add('ogl_updated'); } } if(sender.classList.contains('moonlink')) { sender.classList.add('tooltipRight'); sender.classList.remove('tooltipLeft'); } else if(sender.classList.contains('planetlink')) { this.position.x += sender.closest('[data-panel="stock"]') ? 80 : 45; } if(sender.closest('#top') || sender.closest('#box')) { sender.classList.add('tooltipBottom'); sender.classList.remove('tooltip'); } } } class PopupManager { constructor(ogl) { this.ogl = ogl; this.overlay = document.body.appendChild(Util.createDom('div', {'class':'ogl_overlay'})); this.dom = this.overlay.appendChild(Util.createDom('div', {'class':'ogl_popup'})); this.cross = this.dom.appendChild(Util.createDom('div', {'class':'ogl_close material-icons'}, 'clear')); this.content = this.dom.appendChild(Util.createDom('div')); this.cross.addEventListener('click', () => this.close()); this.overlay.addEventListener('click', event => { if(event.target === this.overlay) this.close(); }); } load() { this.content.innerHTML = ''; this.content.appendChild(Util.createDom('div', {'class':'ogl_loader'})); document.body.classList.add('ogl_active'); this.dom.classList.add('ogl_active'); this.overlay.classList.add('ogl_active'); } open(html) { setTimeout(() => { this.content.innerHTML = ''; this.content.appendChild(html); document.body.classList.add('ogl_active'); this.dom.classList.add('ogl_active'); this.overlay.classList.add('ogl_active'); }, Math.random() * (400 - 100 + 1) + 100) } close() { document.body.classList.remove('ogl_active'); this.dom.classList.remove('ogl_active'); this.overlay.classList.remove('ogl_active'); } } class SideViewManager { constructor(ogl) { this.ogl = ogl; this.dom = document.body.appendChild(Util.createDom('div', {'class':'ogl_sideView'})); this.cross = this.dom.appendChild(Util.createDom('div', {'class':'ogl_close material-icons'}, 'clear')); this.content = this.dom.appendChild(Util.createDom('div')); this.cross.addEventListener('click', () => this.close()); this.panel = document.querySelector('#countColonies').appendChild(Util.createDom('div', {'class':'ogl_panel'})); this.addDefaultPanel(); this.addProductionPanel(); this.economyButton = this.panel.appendChild(Util.createDom('div', {'class':'material-icons tooltip', 'title':this.ogl.component.langManager.getText('productionView')}, 'account_balance')); this.addPinnedPanel(); } open(html, id) { this.content.innerHTML = ''; this.content.appendChild(html); this.dom.classList.add('ogl_active'); this.ogl.json.options.sideViewOpened = id; Util.saveData(this.ogl.json); } close() { this.dom.classList.remove('ogl_active'); this.ogl.json.options.sideViewOpened = false; Util.saveData(this.ogl.json); } addDefaultPanel() { let button = this.panel.appendChild(Util.createDom('div', {'class':'material-icons tooltip', 'title':this.ogl.component.langManager.getText('defaultView')}, 'home')); button.addEventListener('click', () => { document.querySelector('#rechts').setAttribute('data-panel', 'default'); this.ogl.json.options.currentPanel = 'default'; Util.saveData(this.ogl.json); }); //document.querySelector('#rechts').setAttribute('data-panel', 'default'); } addProductionPanel() { let button = this.panel.appendChild(Util.createDom('div', {'class':'material-icons tooltip', 'title':this.ogl.component.langManager.getText('economyView')}, 'equalizer')); button.addEventListener('click', () => { document.querySelector('#rechts').setAttribute('data-panel', 'stock'); this.ogl.json.options.currentPanel = 'stock'; Util.saveData(this.ogl.json); }); if(this.ogl.json.options.currentPanel == 'stock') { document.querySelector('#rechts').setAttribute('data-panel', 'stock'); } let updateRes = (coords, res) => { if(!this.ogl.json.myEconomy[coords]) return; let deltaTime = Math.floor((Date.now() - this.ogl.json.myEconomy[coords].prodTimer || 0) / 1000); let prodSinceLastUpdate = (this.ogl.json.myEconomy[coords]['prod'+res] || 0) * deltaTime; return Math.floor((this.ogl.json.myEconomy[coords]['res'+res] || 0) + prodSinceLastUpdate); } Util.loop(() => { this.ogl.planetList.forEach((planet, pIndex) => { if(!planet.querySelector('.planetlink .ogl_stock')) planet.querySelector('.planetlink').appendChild(Util.createDom('div', {'class':'ogl_stock'})); if(planet.querySelector('.moonlink') && !planet.querySelector('.moonlink .ogl_stock')) planet.querySelector('.moonlink').appendChild(Util.createDom('div', {'class':'ogl_stock'})); let coords = planet.querySelector('.planet-koords').textContent.slice(1, -1); let stock = planet.querySelector('.planetlink .ogl_stock'); let moonStock = planet.querySelector('.moonlink .ogl_stock'); ['metal', 'crystal', 'deut'].forEach((res, index) => { let updatedValue = updateRes(coords, res); if(!stock.querySelector('.ogl_'+res)) stock.appendChild(Util.createDom('span', {'class':'ogl_'+res}, (Util.formatToUnits(updatedValue) || '0'))); else stock.querySelector('.ogl_'+res).textContent = (Util.formatToUnits(updatedValue) || '0'); this.ogl.totalResources[index] += parseInt(updatedValue) || 0; if(moonStock) { let moonValue = updateRes(coords+'M', res); if(!moonStock.querySelector('.ogl_'+res)) moonStock.appendChild(Util.createDom('span', {'class':'ogl_'+res}, (Util.formatToUnits(moonValue) || '0'))); else moonStock.querySelector('.ogl_'+res).textContent = (Util.formatToUnits(moonValue) || '0'); this.ogl.totalResources[index] += parseInt(moonValue) || 0; } }); }); }, 10000); } addEconomyPanel() { let content = Util.createDom('div', {'class':'ogl_economy'}); let averageMines = [0,0,0]; let totalProd = [0,0,0]; let totalBox = content.appendChild(Util.createDom('div', {'class':'ogl_total'}, '<div></div>')); this.ogl.planetList.forEach((planet, pIndex) => { let name = planet.querySelector('.planet-name').textContent; let coords = planet.querySelector('.planet-koords').textContent.slice(1, -1); this.ogl.json.myEconomy[coords] = this.ogl.json.myEconomy[coords] || {}; let box = content.appendChild(Util.createDom('div')); planet.getAttribute('data-multi') && box.setAttribute('data-multi', planet.getAttribute('data-multi')); box.appendChild(Util.createDom('h3', {}, `<span>[${coords}]</span> ${name}`)); ['metal', 'crystal', 'deut'].forEach((res, index) => { let prodValue = Math.round((this.ogl.json.myEconomy[coords]['prod'+res] || 0) * 3600 * 24); let boxContent = `<b>${this.ogl.json.myEconomy[coords][res] || '0'}</b> <i>+${Util.formatToUnits(prodValue) || '0'}</i>`; box.appendChild(Util.createDom('div', {'class':'ogl_'+res}, boxContent)); averageMines[index] += parseInt(this.ogl.json.myEconomy[coords][res]); totalProd[index] += prodValue; if(pIndex == this.ogl.planetList.length-1) { let totalBoxContent = `<div><b>ø ${(averageMines[index]/this.ogl.planetList.length).toFixed(1)}</b> <i>+${Util.formatToUnits(totalProd[index]) || '0'}</i></div>`; totalBox.appendChild(Util.createDom('div', {'class':'ogl_'+res}, totalBoxContent)); } }); box.addEventListener('click', () => { window.location.href = planet.querySelector('.planetlink').href; }); }); this.ogl.totalProd = totalProd; this.economyButton.addEventListener('click', () => { this.ogl.component.popupManager.load(); this.ogl.component.popupManager.open(content); }); } addPinnedPanel() { let button = this.panel.appendChild(Util.createDom('div', {'class':'material-icons tooltip', 'title':this.ogl.component.langManager.getText('pinnedView')}, 'push_pin')); button.addEventListener('click', () => this.checkPinnedContent()); if(this.ogl.json.options.pinned && Object.keys(this.ogl.json.options.pinned).length > 0) { if(this.ogl.json.options.sideViewOpened == 'stalkPinned') this.checkPinnedContent(); } } checkPinnedContent() { let player = this.ogl.json.options.pinned; let container = Util.createDom('div'); container.innerHTML = ` <h1><span class="${player.color}">${player.name}</span></h1> <div class="splitLine"></div> <div class="ogl_stalkPoints"> <div title="${player.total}"><i class="material-icons">star</i>${Util.formatToUnits(player.total)}</div> <div title="${player.eco}"><i class="material-icons">attach_money</i>${Util.formatToUnits(player.eco)}</div> <div title="${player.tech}"><i class="material-icons">science</i>${Util.formatToUnits(player.tech)}</div> <div title="${player.fleet}"><i class="material-icons">military_tech</i>${Util.formatToUnits(player.fleet)}</div> <div title="${player.def}"><i class="material-icons">security</i>${Util.formatToUnits(player.def)}</div> </div> <div class="splitLine"></div> <div class="ogl_stalkInfo"> <div class="ogl_stalkPlanets ogl_pinnedContent"></div> </div> <div class="splitLine"></div> <div class="float_right">${new Date(player.update * 1000).toLocaleDateString('fr-FR')}</div> `; let sendProbes = (event, planet, type) => { event.stopPropagation(); event.preventDefault(); this.ogl.component.fleetManager.sendSpyProbe([planet.galaxy, planet.system, planet.position, type], this.ogl.json.spyProbesCount, event.target); }; if(!this.ogl.json.options.pinned) return; Object.values(this.ogl.json.options.pinned.planets).forEach(planet => { let div = container.querySelector('.ogl_stalkPlanets').appendChild(Util.createDom('div', {'data-coords':planet.coords})); div.appendChild(Util.createDom('span', {}, planet.coords)); let mSpy = div.appendChild(Util.createDom('div', {'class':'ogl_moonIcon material-icons', 'data-type':3}, 'brightness_2')); let pSpy = div.appendChild(Util.createDom('div', {'class':'ogl_planetIcon material-icons', 'data-type':1}, 'language')); pSpy.addEventListener('click', event => sendProbes(event, planet, 1)); mSpy.addEventListener('click', event => sendProbes(event, planet, 3)); if(planet.main) div.appendChild(Util.createDom('span', {'class':'ogl_mainPlanet material-icons'}, 'star')); if(planet.moon) mSpy.classList.add('ogl_active'); if(this.ogl.json.stalkList[planet.coords]) div.setAttribute('data-color', this.ogl.json.stalkList[planet.coords].color); div.addEventListener('click', () => { this.ogl.component.tooltipManager.close(); this.ogl.component.planetManager.goToPosition(planet.galaxy, planet.system, planet.position); }); let pActivityDom = div.appendChild(Util.createDom('div', {'class':'ogl_planetActivity'})); let mActivityDom = div.appendChild(Util.createDom('div', {'class':'ogl_moonActivity'})); if(planet.activity) { pActivityDom.textContent = planet.activity; if(planet.activity == '*') pActivityDom.classList.add('ogl_short'); } if(planet.moon && planet.moon.activity) { mActivityDom.textContent = planet.moon.activity; if(planet.moon.activity == '*') mActivityDom.classList.add('ogl_short'); } }); this.open(container, 'stalkPinned'); } } class Util { static genTrashsimLink(apiKey, ogl) { let coords = ogl.current.coords; let jsonTechs = {"0": [{ planet: { galaxy:coords[0], system:coords[1], position:coords[2], }, class: ogl.playerClass, "research": {} }]}; for(let [key, value] of Object.entries(ogl.json.myTechs)) { jsonTechs[0][0].research[key] = {"level":value}; } jsonTechs = btoa(JSON.stringify(jsonTechs)); return 'https://trashsim.universeview.be/' + ogl.lang + '?SR_KEY=' + apiKey + '#prefill=' + jsonTechs; } static loop(callback, delay, lastCall) { let now = Date.now(); delay = delay || 1000 / 20; lastCall = lastCall || 0; if(now - lastCall >= delay) { lastCall = now; callback(); } requestAnimationFrame(() => Util.loop(callback, delay, lastCall)); } // overwrite global functions static updateCheckIntInput(callback) { let old = checkIntInput; checkIntInput = function(id, minVal, maxVal) { old.call(window, id, minVal, maxVal); callback(); } } static overwriteFleetDispatcher(functionName, param, callback) { let old = fleetDispatcher[functionName]; fleetDispatcher[functionName] = function(param) { callback(); old.call(fleetDispatcher, param); } } static checkInputs() { document.querySelectorAll('.ogl_checkInput').forEach(input => { if(input.value) { let max = input.getAttribute('max'); let newValue = input.value.toLowerCase(); newValue = newValue.replace('g', '000000000'); newValue = newValue.replace('m', '000000'); newValue = newValue.replace('k', '000'); newValue = newValue.replace(/[\,\.]/g, ''); newValue = parseInt(newValue); if(isNaN(newValue) || newValue <= 0) { input.value = 0; } else { if(max && newValue > max) newValue = max; input.value = newValue.toLocaleString('de-DE'); } } }); } static formatToUnits(value, forced) { if(!value) return 0; value = value.toString().replace(/[\,\.]/g, ''); if(isNaN(value)) return value; let precision = 0; value = parseInt(value); if(value == 0 || forced == 0 || value < 1000) precision = 0; else if(value < 1000000 || forced == 1) precision = 1; else precision = 2; // const abbrev = ['', LocalizationStrings.unitKilo, LocalizationStrings.unitMega, LocalizationStrings.unitMilliard]; const abbrev = ['', 'k', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y']; const unrangifiedOrder = Math.floor(Math.log10(Math.abs(value)) / 3); const order = Math.max(0, Math.min(unrangifiedOrder, abbrev.length-1)); const suffix = abbrev[order]; let result = (value / Math.pow(10, order * 3)).toFixed(precision); return suffix ? result + ' ' + suffix : result; } static formatFromUnits(value) { let offset = (value.split(LocalizationStrings.thousandSeperator).length - 1) * 3; let splitted = value.split(/[\,\.]/g)[0].length; if(value.match(/\d+/g) && value.match(/\d+/g).map(Number).length == 1) splitted -= 1; if(value.indexOf(LocalizationStrings.unitMilliard) > -1) { //let padEnd = value.indexOf(LocalizationStrings.thousandSeperator) > -1 ? 12 : 9; value = value.replace(LocalizationStrings.unitMilliard, ''); value = value.replace(/[\,\.]/g, ''); value = value.padEnd(9 + offset + splitted, '0'); } else if(value.indexOf(LocalizationStrings.unitMega) > -1) { value = value.replace(LocalizationStrings.unitMega, ''); value = value.replace(/[\,\.]/g, ''); value = value.padEnd(6 + offset + splitted, '0'); } else if(value.indexOf(LocalizationStrings.unitKilo) > -1) { value = value.replace(LocalizationStrings.unitKilo, ''); value = value.replace(/[\,\.]/g, ''); value = value.padEnd(3 + offset + splitted, '0'); } else { value = value.replace(/[\,\.]/g, ''); } return parseInt(value); } static formatNumber(number) { return (number || '0').toLocaleString('de-DE'); } static saveData(json) { if(json) localStorage.setItem('ogl_redata', JSON.stringify(json)); } static getPage() { let rawURL = new URL(window.location.href); return rawURL.searchParams.get('component') || rawURL.searchParams.get('page'); } static createDom(element, params, content) { params = params || {}; content = content || ''; let dom = document.createElement(element); Object.entries(params).forEach(p => dom.setAttribute(p[0], p[1])); dom.innerHTML = content; return dom; } static clickOrKeydown(domElement, keyID, callback, forced) { if(domElement) domElement.addEventListener('click', () => callback()); let sent = true; // todo document.addEventListener('keydown', event => { let keycode = event.keyCode ? event.keyCode : event.which; if(!sent && keycode == keyID && ((!document.querySelector('.ui-dialog') || document.querySelector('.ui-dialog').style.display == 'none') && !document.querySelector('.chat_box_textarea:focus') && (!document.querySelector('.ogl_overlay.ogl_active') || forced))) { if(!domElement) callback(); else if(domElement && forced) domElement.click(); sent = true; } }); document.addEventListener('keyup', () => sent = false); } static loadPageContent(url, type, callback) { let cancelController = new AbortController() let signal = cancelController.signal; fetch(url, {cache:'no-store', signal:signal}) .then(result => result.text()) .then(txt => { let parser = new DOMParser(); let result = parser.parseFromString(txt, type); callback(result); }) .catch((e) => /*console.log(e)*/{}); window.onbeforeunload = () => cancelController.abort(); } static checkTopScore(ogl) { if(ogl.json.topScore[1] < Date.now() - 86400000) { fetch(window.location.protocol + '//' + window.location.host + '/api/serverData.xml') .then(result => result.text()) .then(txt => { let parser = new DOMParser(); let xmlResult = parser.parseFromString(txt, 'text/xml'); ogl.json.topScore = [parseInt(xmlResult.querySelector('topScore').innerHTML), Date.now()]; Util.saveData(ogl.json); }); } } static findObjectByValue(object, value) { return Object.keys(object).find(key => object[key] === value); } } let oglcss = ` /*css*/ :root { /* ui */ --skyblue:hsla(227, 85%, 84%, 1); --raisin:hsla(218, 26%, 16%, 1); --deepnight:hsla(204, 33%, 3%, 1); --darkblue:hsla(218, 23%, 9%, 1); --sunset:hsla(22, 100%, 65%, 1); --purple:#610348; /* marker */ --blue:#5476f1; --red:#da3e3e; --violet:#b646da; --green:#32b199; --yellow:#e2b431; --gray:#171f29; --white:#bbb; /* resources */ --metal:#de74b4; --crystal:#85abff; --deut:#84f1c8; --dm:#db95ff; } body.ogl_active { overflow:hidden; } .input_replacement, input[type="text"], input[type="email"], input[type="password"], input[type="search"], .technology input[type="number"], .technology input[type="text"] { background-color:#c8d1da; border-color:#eef7fb !important; border-radius:3px !important; box-shadow:0 0 0 1px #eef7fb !important; color:#0c1117; font-weight:bold; } .technology input[type="number"][disabled], .technology input[type="text"][disabled] { background:#333c44; border-color:#52565a !important; box-shadow:0 0 0 1px #52565a !important; } div#banner_skyscraper { position:fixed !important; left:50% !important; top:70px !important; transform:translatex(530px) !important; } .icon:not(.sprite):not(.resource), .material-icons { direction:ltr; display:inline-block; font-family:'Material Icons' !important; font-weight:normal !important; font-style:normal !important; font-size:inherit !important; image-rendering:pixelated; line-height:inherit !important; letter-spacing:normal; text-transform:none; transform:rotate(0.03deg); white-space:nowrap; word-wrap:normal; -webkit-font-feature-settings:'liga'; -webkit-font-smoothing:antialiased; } #galaxytable .icon { vertical-align:top; } .eventFleet .icon { vertical-align:middle; } .icon[style*="background: none"] { border:none !important; box-shadow:none !important; } .tpd-tooltip:not(.ogl_tooltip) { display:none !important; height:0px !important; overflow:hidden !important; pointer-events:none !important; width:0px !important; } .ogl_close { background:#101317; border:2px solid #364352; border-radius:30px; color:#bbb; cursor:pointer; font-size:18px !important; padding:2px; position:absolute; right:-10px; top:-10px; z-index:3; } .ogl_tooltip .ogl_close { right:-10px; top:-10px; } .ogl_close:hover { color:#fff; } .ogl_stalk h1 { float:left; } .ogl_stalk .ogl_actions { display:grid; float:right; grid-gap:3px; grid-template-columns:repeat(5, 1fr); width:fit-content; width:-moz-fit-content; } .ogl_stalk .ogl_actions > *, .ogl_stalk .ogl_colorAll > * { border-radius:3px; color:#fff !important; cursor:pointer; display:block; font-family:'material icons'; font-size:14px !important; padding:3px; text-align:center; text-decoration:none !important; width:14px; } .ogl_stalk .ogl_actions > * { background:#3e5c86; } .ogl_stalk .ogl_actions > *:hover, .ogl_stalk .ogl_colorAll > *:hover { filter:brightness(1.2); } .ogl_stalk .ogl_colorAll { display:grid; float:right; grid-gap:2px; grid-template-columns:repeat(12, 1fr); width:fit-content; width:-moz-fit-content; } .ogl_stalk .ogl_colorAll > * { border:2px solid var(--darkblue); font-size:10px !important; height:10px; width:10px; } .ogl_colorAll div[data-color="gray"] { background:var(--white); opacity:1 !important; } .ogl_pinned { background:var(--gray); border:2px solid #364352; border-radius:4px; padding:12px; position:absolute; z-index:10; } .ogl_pinnedContent.ogl_stalkPlanets > div { height:34px; } .ogl_pinnedContent.ogl_stalkPlanets > div:before { height:32px; } .ogl_pinnedContent .ogl_planetActivity, .ogl_pinnedContent .ogl_moonActivity { bottom:0px; color:gold; font-size:9px; pointer-events:none; position:absolute; text-align:center; width:12px; } .ogl_pinnedContent .ogl_short { font-size:12px; } .ogl_pinnedContent .ogl_planetActivity { right:22px; } .ogl_pinnedContent .ogl_moonActivity { right:7px; } .ogl_pinned .ogl_pin, .ogl_pinned .ogl_stalkPoints, .ogl_pinned .splitLine:first-of-type { display:none; } .ogl_metal, #metal_box .value { color:var(--metal) !important; } .ogl_crystal, #crystal_box .value { color:var(--crystal) !important; } .ogl_deut, #deuterium_box .value { color:var(--deut) !important; } .ogl_dm, #darkmatter_box .value { color:var(--dm) !important; } .ogl_shipList { display:grid; grid-gap:5px; grid-template-columns:repeat(4, 1fr); } .ogl_shipList .ogl_shipIcon:hover { border-color:var(--yellow); cursor:pointer; } .ogl_shipIcon { background-color:rgba(255,255,255,.1); background-size:cover !important; border:2px solid #29384e; border-radius:4px; box-shadow:inset 0 0 0 2px rgba(0,0,0,.3); box-sizing:border-box; height:40px; width:40px; } .ogl_shipIcon.ogl_0 { background:var(--red); } .ogl_shipIcon.ogl_0.ogl_active { background:var(--green); } .ogl_shipIcon.ogl_202 { background-image:url(https://gf2.geo.gfsrv.net/cdnd9/60555c3c87b9eb3b5ddf76780b5712.jpg); } .ogl_shipIcon.ogl_203 { background-image:url(https://gf1.geo.gfsrv.net/cdn34/fdbcc505474e3e108d10a3ed4a19f4.jpg); } .ogl_shipIcon.ogl_204 { background-image:url(https://gf2.geo.gfsrv.net/cdnd2/9ed5c1b6aea28fa51f84cdb8cb1e7e.jpg); } .ogl_shipIcon.ogl_205 { background-image:url(https://gf1.geo.gfsrv.net/cdnf1/8266a2cbae5ad630c5fedbdf270f3e.jpg); } .ogl_shipIcon.ogl_206 { background-image:url(https://gf2.geo.gfsrv.net/cdn45/b7ee4f9d556a0f39dae8d2133e05b7.jpg); } .ogl_shipIcon.ogl_207 { background-image:url(https://gf1.geo.gfsrv.net/cdn32/3f4a081f4d15662bed33473db53d5b.jpg); } .ogl_shipIcon.ogl_208 { background-image:url(https://gf1.geo.gfsrv.net/cdn6f/41a21e4253d2231f8937ddef1ba43e.jpg); } .ogl_shipIcon.ogl_209 { background-image:url(https://gf1.geo.gfsrv.net/cdn07/6246eb3d7fa67414f6b818fa79dd9b.jpg); } .ogl_shipIcon.ogl_210 { background-image:url(https://gf3.geo.gfsrv.net/cdnb5/347821e80cafc52aec04f27c3a2a4d.jpg); } .ogl_shipIcon.ogl_211 { background-image:url(https://gf1.geo.gfsrv.net/cdnca/4d55a520aed09d0c43e7b962f33e27.jpg); } .ogl_shipIcon.ogl_213 { background-image:url(https://gf3.geo.gfsrv.net/cdn2a/c2b9fedc9c93ef22f2739c49fbac52.jpg); } .ogl_shipIcon.ogl_214 { background-image:url(https://gf3.geo.gfsrv.net/cdn84/155e9e24fc1d34ed4660de8d428f45.jpg); } .ogl_shipIcon.ogl_215 { background-image:url(https://gf3.geo.gfsrv.net/cdn5a/24f511ec14a71e2d83fd750aa0dee2.jpg); } .ogl_shipIcon.ogl_218 { background-image:url(https://gf1.geo.gfsrv.net/cdn39/12d016c8bb0d71e053b901560c17cc.jpg); } .ogl_shipIcon.ogl_219 { background-image:url(https://gf3.geo.gfsrv.net/cdne2/b8d8d18f2baf674acedb7504c7cc83.jpg); } .ogl_shipIcon.ogl_metal, .ogl_shipIcon.ogl_crystal, .ogl_shipIcon.ogl_deut, .ogl_shipIcon.ogl_dm { background-image:url(https://gf3.geo.gfsrv.net/cdnbb/a9fe14ed992de9b7f40d22213a475e.png) !important; background-size:190px !important; } .ogl_shipIcon.ogl_metal { background-position:-1px -44px !important; } .ogl_shipIcon.ogl_crystal { background-position:-39px -44px !important; } .ogl_shipIcon.ogl_deut { background-position:-76px -44px !important; } .ogl_shipIcon.ogl_dm { background-position:-153px -45px !important; } .technology input[type="number"], .technology input[type="text"] { font-weight:bold; } .ogl_hidden, .ogl_colorHidden, .ogl_galaxyHidden, .ogl_systemHidden { display:none !important; } .ogl_hiddenContent { font-size:0 !important; line-height:0; } .ogl_invisible { pointer-events:none; visibility:hidden; } .ogl_noPointer { pointer-events:none; } .ogl_danger { color:var(--red) !important; } .ogl_warning { color:var(--yellow) !important; } .ogl_ok { color:var(--green) !important; } .btn_blue, .btn_blue:hover { background:linear-gradient(to bottom, #527cb1 50%, #4465a0 50%) !important; border:1px solid transparent; } .btn_blue.undermark, .btn_blue.undermark:hover { background:linear-gradient(to bottom, #52b197 50%, #4493a0 50%) !important; } .btn_blue[disabled] { filter:grayscale(1) contrast(.9) !important; } .btn_blue:hover { filter:brightness(1.1); } .ogl_timeZone.ogl_fulldate:before { content:attr(data-datezone); margin-right:5px; } .ogl_timeZone:after { color:var(--yellow); content:attr(data-timezone); } .ogl_timeZone:before, .ogl_timeZone:after { display:inline-block; font-size:11px !important; line-height:1; } .chat_msg .msg_title { width:255px; } #chatMsgList .msg_date { margin-top:5px; } .msg_date.ogl_timeZone:before, .msg_date.ogl_timeZone:after { font-size:9px !important; } .eventFleet .ogl_timeZone:after { float:left;font-size:10px !important; } .ogl_endTime, .ogl_timeZone:before { color:#71cade; font-weight:bold; } .ogl_endTime span { color:var(--yellow); } .content > .ogl_endTime { font-size:10px; margin-top:10px; text-align:center; } #technologydetails h3 { background:none !important; color:#a7bce4 !important; font-size:16px !important; text-indent:7px !important; top:3px !important; } #technologydetails h3::before { display:none !important; } #technologydetails > .description { background:#141b23; } #technologydetails .content { background:#0d1117; box-shadow:inset 0 55px #121b25; height:203px; left:203px; } #technologydetails .level, #technologydetails .amount { color:#606f8c !important; font-size:12px !important; font-weight:bold !important; left:7px !important; top:25px !important; } #technologydetails .level i { font-size:20px !important; vertical-align:bottom; } #technologydetails .level span { color:var(--yellow); font-size:16px; vertical-align:bottom; } #technologydetails .narrow strong { display:none; } #technologydetails .build_duration { bottom:7px; margin:0 !important; padding-left:24px; position:absolute; top:auto; } #technologydetails .build_duration:before { color:var(--yellow); content:'hourglass_top'; font-family:'material icons'; font-size:21px; left:0; position:absolute; top:8px; } #technologydetails .build_duration .bonus { display:none; } #technologydetails .possible_build_start { bottom:55px; margin:0; position:absolute; right:10px; top:auto; } #technologydetails .additional_energy_consumption, #technologydetails .energy_production { bottom:81px; margin:0 !important; padding-left:24px; position:absolute; right:10px; } #technologydetails .research_laboratory_levels_sum { bottom:81px; margin:0 !important; padding-left:24px; position:absolute; right:10px; } } #technologydetails .research_laboratory_levels_sum:before { color:var(--yellow); content:'science'; font-family:'material icons'; font-size:21px; left:0; position:absolute; top:1px; } #technologydetails .additional_energy_consumption:before, #technologydetails .energy_production:before { color:var(--yellow); content:'flash_on'; font-family:'material icons'; font-size:21px; left:0; position:absolute; top:1px; } #technologydetails .information .ogl_endTime { display:block; } #technologydetails .costs { font-size:12px !important; font-weight:bold !important; top:59px !important; } #technologydetails .resource.icon { display:block !important; height:21px !important; line-height:21px !important; margin:0 !important; width:fit-content !important; width:-moz-fit-content !important; } #technologydetails .resource.icon::before { display:inline-block !important; image-rendering:-webkit-optimize-contrast !important; margin:0 5px 0 -24px !important; transform:scale(0.5) !important; transform-origin:top right !important; vertical-align:text-top !important; } #technologydetails .costs p { display:none; } #technologydetails .bonus { color:var(--green); } .ogl_overlay { align-items:center; background:rgba(0,0,0,.7); display:none; justify-content:center; left:0; position:fixed; top:0; height:100%; width:100%; z-index:1000000; } .ogl_popup { position:relative; } .ogl_popup > div:nth-child(2) { background:var(--raisin); border-radius:5px; box-shadow:0 0 10px #000; max-height:calc(100vh - 100px); overflow-y:auto; padding:20px; position:relative; } .ogl_popup h2 { font-size:14px; margin-bottom:10px; } .ogl_loader { animation:spin .7s infinite linear; border:4px solid #000; border-left-color:#fff; border-radius:100%; height:50px; margin:30px; width:50px; } @keyframes spin { from { transform:rotate(0); } to { transform:rotate(360deg); } } .ogl_overlay.ogl_active { display:flex; } .ogl_expeResult { background:rgba(0,0,0,.5); color:#ffd370; padding:6px; text-align:center; text-transform:capitalize; } .ogl_required { background:#2a364a; border-bottom:2px solid #0d1014; color:#fff; font-size:10px; line-height:20px; padding:0 4px; user-select:none; } .ogl_required:hover { color:var(--yellow); } .ogl_delta { background:var(--raisin); border:2px solid #0d1014; border-radius:0 6px 0 6px; border-width:0 0 2px 2px; color:var(--skyblue); font-size:15px !important; line-height:20px !important; padding:0 3px; position:absolute; right:0; top:0; user-select:none; } .ogl_delta:hover { color:var(--yellow); } #pageContent #middle { padding-bottom:40px; } .technology .icon .level, .technology .icon .amount { background:var(--raisin); } .technology .icon:hover, .technology.showsDetails .icon { border-color:var(--yellow); } #resources li span { font-weight:bold; text-shadow:1px 1px #000; } table.fleetinfo tbody { display:grid; grid-gap:2px 5px; grid-template-columns:repeat(3, 1fr); } table.fleetinfo tr { background:#0f141b; border:1px solid #27354e; color:var(--skyblue); display:grid; grid-template-columns:40px auto; font-size:11px; } table.fleetinfo td.value { line-height:22px; padding:0 5px; } table.fleetinfo .ogl_full { background:none; border:none; box-shadow:none; grid-column-start:1; grid-column-end:4; padding:7px 4px 4px 4px; font-size:11px; } table.fleetinfo .ogl_shipIcon { background-position:center; border:none; border-radius:0; border-right:1px solid #000; height:22px !important; width:38px !important; } .ogl_menuOptions { color:#fff; display:grid; font-size:16px; grid-gap:4px; grid-template-columns:repeat(4, 1fr); padding:4px 4px 2px 4px; } .ogl_button, #fleet1 .secondcol > * { background:var(--deepnight) !important; border:2px solid var(--deepnight); border-radius:3px; box-shadow:inset 0 10px rgba(255,255,255,.07); box-sizing:border-box; color:#8ca5c5; cursor:pointer; line-height:21px !important; position:relative; text-shadow:1px 2px var(--deepnight); text-align:center; } .ogl_button { font-weight:bold; text-decoration:none; user-select:none; } .ogl_button:hover { background:#12151b; color:#fff !important; } .ogl_menuOptions > .ogl_button.ogl_active { border-color:#fff; } .ogl_menuOptions .ogl_manageData { color:#c54f4f; } .ogl_menuOptions .ogl_harvest { color:#50deec; } .ogl_menuOptions .ogl_shipPicker { color:var(--yellow);font-size:11px;font-weight:bold; } .ogl_menuOptions .ogl_missionPicker3 { color:#c2f75a; } .ogl_menuOptions .ogl_missionPicker4 { color:#43ec77; } .ogl_universeName { color:#b2c0ce; font-size:12px; font-weight:bold; pointer-events:none; position:absolute; text-align:right; top:88px; width:138px; } /* SCROLLBAR MANAGER ------------------------------------------ */ .ogl_scrollable { bottom:-7px; overflow-y:auto; padding-right:1px; } /* FLEET MANAGER ------------------------------------------ */ .ogl_inFlight, .ogl_inFlight:before, .ogl_inFlight:after { border-style:solid; border-width:3px 6px 3px 0; border-color:transparent #9fc7d4 transparent transparent; height:0 !important; position:absolute !important; top:0 !important; right:-5px !important; transform:translateX(100%); width:0 !important; } .ogl_inFlight:before, .ogl_inFlight:after { border:inherit; } .ogl_type .ogl_inFlight { border-color:transparent #ff3e3e transparent transparent; right:20px !important; top:15px !important; } .ogl_inFlight { top:5px !important; } .ogl_inFlight:before { content:''; right:-6px !important; } .ogl_inFlight:after { bottom:0 !important; content:''; right:-6px !important; top:auto !important; } #subtabs-nfFleetTrash .ogl_trash { position:absolute; right:98px; top:11px; } .ogl_spyTable { color:#b5b5b5; counter-reset:report-counter; margin-top:50px; text-align:center; width:100%; } .ogl_spyTable tr[data-coords] { counter-increment:report-counter; } .ogl_spyTable tr[data-coords] td:nth-child(1) div:before { content:counter(report-counter); } .ogl_spyTable tr:first-child:before { background:none; pointer-events:none; } .ogl_spyTable tr.ogl_attacked td { box-shadow:inset 0 100px rgba(0,0,0,.5), inset 1px 0 rgba(255,255,255,.03), inset -1px 0 rgba(0,0,0,.5), inset 0 1px rgba(255,255,255,.03), inset 0 -1px rgba(0,0,0,.5), inset 0 0 3px 2px red; opacity:.75; } .ogl_spyTable .ogl_reportOptions > * { margin:auto; } .ogl_spyTable .ogl_reportOptions > *:not(last-child) { margin-right:3px; } .ogl_spyTable .ogl_coords a { background:rgba(0,0,0,.5); border-radius:40px; display:block; text-decoration:none; } .ogl_spyTable .material-icons { font-size:16px !important; } .ogl_spyTable th { background:#111; line-height:18px; padding:7px; text-transform:capitalize; } .ogl_spyTable th[data-filter] { cursor:pointer; } .ogl_spyTable th[data-filter]:hover { background:#282828; } .ogl_spyTable th.ogl_active { background:var(--purple) !important; color:#fff; } .ogl_spyTable th[data-filter]:after { content:'unfold_more'; font-family:'material icons'; font-size:14px; vertical-align:middle; } .ogl_spyTable th.ogl_shipIcon { background-position:center !important; border:none; border-radius:0; height:auto; } .ogl_spyTable td { height:30px; position:relative; } .ogl_spyTable a { color:inherit; } .ogl_spyTable a:hover { color:#fff; } .ogl_spyTable .ogl_name { text-align:left; text-indent:10px; } .ogl_spyTable .ogl_renta { color:#fff; } .ogl_spyTable .ogl_reportDate { color:var(--green); } .ogl_spyTable .ogl_reportDate > div, .ogl_spyTable tr td:nth-child(1) > div { background:rgba(0,0,0,.5); border-radius:40px; } .ogl_spyTable .ogl_colors { padding:0; width:22px; } .ogl_spyTable .ogl_colorButton { left:1px; position:relative; top:0; } #fleet1 #buttonz .header { display:none !important; } #fleet1 #buttonz #battleships { margin-left:8px !important; width:441px !important; } #fleet1 #buttonz #battleships ul, #fleet1 #buttonz #civilships ul, #shipyard #technologies_battle ul, #shipyard #technologies_civil ul { padding:0 !important; } #shipyard #technologies_battle { margin-left:0 !important; width:400px !important; } #shipyard #technologies_civil { margin-left:0 !important; width:240px !important; } #fleet1 .ogl_capacityContainer { box-sizing:border-box; grid-column-start:2; grid-row-start:1; height:38px; padding:5px; position:relative; width:100% !important; } #fleet1 .ogl_capacityContainer i { font-size:17px !important; position:absolute; right:7px; top:7px; } #fleet1 .ogl_capacityContainer:hover i { color:var(--yellow); } #fleet1 .ogl_capacityInfo { background:#253058; border:2px solid #0c1014; bottom:4px; box-sizing:border-box; font-size:10px; font-weight:bold; height:8px; left:7px; line-height:16px; position:absolute; right:30px; } #fleet1 .ogl_capacityInfo p { pointer-events:none; transform:translate(0px, -22px); } #fleet1 .ogl_capacityInfo p b:nth-child(1) { color:var(--yellow); } #fleet1 .ogl_capacityInfo .ogl_capacityCurrent, #fleet1 .ogl_capacityInfo .ogl_capacityRequired { display:block; height:100%; left:0; position:absolute; top:0; z-index:-1; } #fleet1 .ogl_capacityInfo .ogl_capacityCurrent { background:#b18b22; min-width:1px; transition:width .3s; width:0%; } #fleet1 .ogl_capacityInfo .ogl_capacityRequired { color:var(--skyblue); text-align:left; transform:translate(0px, -22px); white-space:nowrap; } #fleet1 .ogl_capacityInfo .ogl_capacityRequired > div { background:repeating-linear-gradient(-45deg, #303e6f, #303e6f 5px, transparent 5px, transparent 10px); height:100%; transform:translate(0px, 6px); width:100%; } #fleet1 #allornone .info { display:none; } #fleet1 .allornonewrap { align-items:end !important; background:none !important; border:none !important; display:grid !important; grid-gap:2px !important; grid-template-columns:118px auto min-content !important; margin-top:7px !important; padding:0 !important; width:637px !important; } #fleet1 .allornonewrap .secondcol { align-items:end !important; background:none !important; border:none !important; display:grid !important; float:right !important; grid-column-start:1 !important; grid-row-start:1 !important; grid-gap:2px !important; grid-template-columns:repeat(4, 1fr) !important; margin:0 !important; padding:0 !important; } #fleet1 .allornonewrap .firstcol { bottom:-28px !important; position:absolute !important; right:18px !important; width:auto !important; } #fleet1 .allornonewrap .secondcol .clearfloat { display:none !important; } #fleet1 #buttonz .content { margin-bottom:30px; } #fleet1 #continueToFleet2, #fleet2 #continueToFleet3, #fleet3 #sendFleet, #fleet2 #backToFleet1, #fleet3 #backToFleet2 { background:linear-gradient(to bottom right, #1f2735 45%, #05080a) !important; border:2px solid #0c1014 !important; border-radius:4px; box-shadow:inset 0 1px rgb(255 255 255 / 7%), 0 0 0 1px #000, inset 0 100px rgb(29 39 70 / 30%); color:var(--green); grid-column-start:3; grid-row-start:1; height:auto; margin:0 !important; text-decoration:none !important; transition:opacity .3s; } #fleet1 #continueToFleet2 span, #fleet2 #continueToFleet3 span, #fleet3 #sendFleet span, #fleet2 #backToFleet1 span, #fleet3 #backToFleet2 span { height:auto; line-height:34px; padding:0 !important; } #fleet2 #continueToFleet3 { margin-left:15px !important; } #fleet2 #backToFleet1, #fleet3 #backToFleet2 { color:#9c9c9c !important; } #fleet3 #backToFleet2 { position:absolute; right:315px; } #fleet1 #continueToFleet2:not(.off):hover, #fleet2 #continueToFleet3:not(.off):hover, #fleet3 #sendFleet:not(.off):hover, #fleet2 #backToFleet1:not(.off):hover, #fleet3 #backToFleet2:not(.off):hover { color:#fff !important; } #fleet1 #continueToFleet2.off, #fleet2 #continueToFleet3.off, #fleet3 #sendFleet.off { opacity:.5; } #fleet1 #continueToFleet2.on, #fleet2 #continueToFleet3.on, #fleet3 #sendFleet.on { color:var(--green) !important; } #fleet1 #continueToFleet2 span, #fleet2 #continueToFleet3 span, #fleet3 #sendFleet span, #fleet2 #backToFleet1 span, #fleet3 #backToFleet2 span { color:inherit; } #fleet1 .send_all, #fleet1 .send_none, #fleet1 .ogl_expeButton, #fleet1 .show_fleet_apikey, .ogl_capacityContainer { background:linear-gradient(to bottom right, #1f2735 45%, #05080a) !important; border-color:#0c1014 !important; border-radius:4px; box-shadow:inset 0 1px rgb(255 255 255 / 7%), 0 0 0 1px #000, inset 0 100px rgb(29 39 70 / 30%); color:#fff !important; cursor:pointer; font-size:12px; font-weight:bold; grid-row-start:1; height:auto; position:relative; text-decoration:none !important; width:38px; } #fleet1 .send_all:before, #fleet1 .send_none:before, #fleet1 .ogl_expeButton:before, #fleet1 .show_fleet_apikey:before { content:''; line-height:34px !important; width:100%; } #fleet1 .send_all:hover, #fleet1 .send_none:hover, #fleet1 .ogl_expeButton:hover, #fleet1 .show_fleet_apikey:hover { color:#fff !important; } #fleet1 .send_all, #fleet1 .send_none { font-family:"Material Icons"; font-size:20px; } #fleet1 #sendall, #fleet1 #resetall { background:none; height:100%; left:-1px; padding:1px; position:absolute; text-align:center; top:-1px; width:100%; } #fleet1 .send_all { color:#d0af37 !important; } #fleet1 .send_none { color:#bd4d4d !important; } #fleet1 .ogl_expeButton { color:#4087f1 !important;display:none; } #fleet1 .show_fleet_apikey { color:#9c9c9c !important;grid-column-start:3; } #fleet1 .send_all:before { content:'double_arrow'; } #fleet1 .send_none:before { content:'exposure_zero'; } #fleet1 .ogl_expeButton:before { content:'EXP'; } #fleet1 .show_fleet_apikey:before { content:'API'; } .ogl_choseCapacity > div { display:grid; grid-template-columns:40px auto; margin-bottom:4px; } .ogl_choseCapacity .ogl_shipIcon { border-radius:0; border-right:none; height:26px; } .ogl_choseCapacity button, .ogl_resourceToKeep button { color:var(--green); float:right; font-weight:bold; text-transform:uppercase; } #fleet1 .technology .icon.small { height:70px; } #fleet1 #buttonz .footer { bottom:-45px; left:-1px; } #fleet2 #buttonz { background:#0d1014; border-radius:0 0 7px 7px; box-shadow:inset 0 0 0 1px #000; display:grid; grid-gap:3px; grid-template-columns:auto 147px; overflow:hidden; width:659px; } #fleet2 #buttonz .content, #fleet2 #buttonz .footer { background:#0d1014; width:512px; } #fleet2 #buttonz .header { grid-column:1 / 3; } #fleet2 .ogl_planetList { display:grid; grid-auto-rows:min-content; height:100%; left:-5px; position:relative; width:auto; z-index:2; } #fleet2 .glow { box-shadow:none; } .ogl_planetList > div { align-items:center; background:#121a21; box-shadow:0 0 0 2px #0d1014; display:grid; grid-gap:2px; grid-template-columns:104px 74px; line-height:22px; margin:1px; padding:0 0 0 5px; position:relative; white-space:nowrap; } .ogl_planetList div > b { color:#ccc; display:inline-block; } .ogl_popup .ogl_planetList > div { grid-template-columns:145px 50px; } #fleet2 .ogl_planetList > div { grid-template-columns:58px 74px; } .ogl_planetList .ogl_coords, .ogl_planetList .ogl_name { align-items:center; color:#5d82af; display:grid; grid-gap:4px; grid-template-columns:72px min-content; font-size:10px; font-weight:bold; overflow:hidden; text-align:left; text-overflow:ellipsis; white-space:nowrap; } .ogl_planetList .ogl_coords > div { color:var(--yellow); font-weight:bold; } .ogl_planetList > div .ogl_actions { display:grid; grid-template-columns:repeat(3, 1fr); text-align:center; } .ogl_popup .ogl_planetList > div .ogl_actions { grid-template-columns:repeat(2, 1fr); } .ogl_planetList .ogl_planet, .ogl_planetList .ogl_moon, .ogl_planetList .ogl_cr { align-items:center; display:grid; color:#c2d0d9; cursor:pointer; font-size:18px !important; height:100%; margin:auto; opacity:.4; user-select:none; width:100%; } .ogl_planetList .ogl_planet:hover, .ogl_planetList .ogl_moon:hover, .ogl_planetList .ogl_cr:hover { opacity:.7; } .ogl_planetList .ogl_planet.ogl_active, .ogl_planetList .ogl_moon.ogl_active, .ogl_planetList .ogl_cr.ogl_active { filter:hue-rotate(200deg) saturate(8); opacity:1; } .ogl_planetList .ogl_planet.ogl_active:before, .ogl_planetList .ogl_moon.ogl_active:before, .ogl_planetList .ogl_cr.ogl_active:before { content:''; border-radius:3px; box-shadow:inset 0 0 0 2px #fff; height:100%; left:0; position:absolute; top:0; width:100%; } .ogl_planetList .ogl_planet.ogl_disabled, .ogl_planetList .ogl_moon.ogl_disabled, .ogl_planetList .ogl_cr.ogl_disabled { filter:hue-rotate(150deg) saturate(20); pointer-events:none; } .ogl_planetList .ogl_cr > img { height:20px; image-rendering:-webkit-optimize-contrast; margin:auto; pointer-events:none; width:20px; } #fleet2 #mission { margin-left:14px !important; margin-top:0 !important; width:627px !important; } #fleet2 #mission th { display:none; } #fleet2 #distanceValue { margin:50px auto 0 auto; } #fleet2 #shortcuts { width:117px !important; } #fleet2 #shortcuts > div:nth-child(1) { visibility:hidden; } #fleet2 #shortcuts * { max-width:109px; } #fleet2 #buttonz .header { align-items:center; display:grid; justify-content:end; padding-right:15px; } #fleet2 #buttonz .header > div { padding:0 !important; } #fleet2 #start, #fleet2 #target { border-radius:7px; } #fleet2 #target { margin:0; padding:0; } #fleet2 #target .target { margin:auto; width:132px; } #fleet2 #target a.planet, #fleet2 #target a.planet_source, #fleet2 #target a.planet_selected, #fleet2 #target a.planet_source_selected { margin-left:0 !important; } #fleet2 .planetname { width:auto; } #fleet2 .briefing { border-radius:7px !important; margin:0 !important; width:475px !important; } #fleet2 .briefing > ul { width:446px; } ul#fleetBriefingPart1 { margin-bottom:0; } ul#fleetBriefingPart1_2 { margin-left:20px; margin-top:0; } #fleet2 .briefing .undermark, #fleet3 .undermark, .status_abbr_ally_own { color:var(--green) !important; } #fleet2 .briefing #steps { margin-top:0 !important; } #fleet2 .briefing h2 { display:none; } .ogl_fleetSpeed { background:linear-gradient(to left, #248469, #b9801a, #a72525); box-shadow:inset 0 0 0 1px #0c0f13; color:#6f9fc8; display:grid; grid-template-columns:repeat(10, 1fr); margin:7px 0 7px 15px; overflow:hidden; text-align:center; width:475px; } .ogl_fleetSpeed.ogl_big { grid-template-columns:repeat(20, 1fr); } .ogl_fleetSpeed > div { background:#13171d; box-shadow:inset 0 0 0 1px #0c0f13; cursor:pointer; font-size:11px; font-weight:bold; padding:5px 1px 5px 0; position:relative; transition:all .2s; } .ogl_fleetSpeed.ogl_big > div:nth-child(odd) { color:#607486; } .ogl_fleetSpeed > div:hover { opacity:.5; } .ogl_fleetSpeed > div.ogl_active { background:var(--yellow); color:var(--gray); opacity:1; } #loadAllResources { font-size:0; z-index:-1; } #fleet3 #sendfleet { margin-top:-46px; } #fleet3 #missionNameWrapper { display:none; } #fleet3 #sendfleet #resources .res_wrap { background:#0c1014; border-radius:0; border:1px solid #1a232b; height:auto; margin-top:-4px; position:relative; } #fleet3 #sendfleet #resources .res_wrap .resourceIcon { height:20px; } #fleet3 #sendfleet .res { font-size:0; } #fleet3 #sendfleet .res > *:not(input) { background:var(--gray); border:1px solid #000; border-radius:2px; box-shadow:inset 0 200px #253644; cursor:pointer; display:inline-block; font-size:14px; font-weight:bold; height:18px; line-height:18px; margin-right:2px; overflow:hidden; text-align:center; transform:translateX(-50px); vertical-align:bottom; width:18px; } #fleet3 #sendfleet .res .resbuttons { display:none; } #fleet3 #sendfleet .res > *:not(input):hover { background:var(--yellow) !important; box-shadow:none; color:var(--gray) !important; } #fleet3 #sendfleet .res a:nth-child(2):before, #fleet3 #sendfleet .res a:nth-child(3):before { content:'double_arrow'; font-family:'material icons'; } #fleet3 #sendfleet .res a:nth-child(2):before { content:'clear'; } #fleet3 #sendfleet .ogl_resourceSaver, #fleet3 #sendfleet .ogl_delta { border:none; border-radius:2px; color:#fff; cursor:pointer; display:inline-block; padding:0; position:relative; text-align:center; top:auto; width:15px; } #fleet3 #sendfleet .ogl_resourceSaver { font-size:11px !important; position:absolute; right:-50px; top:auto; width:65px !important; } /* PLANETMANAGER ------------------------------------------ */ .smallplanet { border-radius:0 !important; display:grid; grid-gap:3px; grid-template-columns:auto 39px; height:auto !important; font-size:10px; margin:0 0 3px 0!important; position:relative !important; width:100% !important; } .smallplanet * { box-sizing:border-box; font-size:inherit !important; font-weight:normal !important; } .smallplanet img { background:#284563; border-radius:50% !important; box-shadow:0 0 0 1px #000 !important; height:14px; left:-3px !important; margin:0 !important; position:absolute !important; top:12px !important; transition:transform .3s; width:14px; z-index:2; } .smallplanet .planetlink img { top:10px !important; height:18px; width:18px; } .smallplanet .planetlink, .smallplanet .moonlink { background:linear-gradient(to bottom right, #1f2735 45%, #05080a); background-position:0 !important; border:none !important; border-radius:4px; box-shadow:inset 0 1px rgba(255,255,255,.07), 0 0 0 1px #000, inset 0 100px rgba(29,39,70,.3); height:36px !important; overflow:hidden; position:relative !important; transition:box-shadow .3s; z-index:1; } .smallplanet .planetlink.ogl_active, .smallplanet .moonlink.ogl_active { box-shadow:inset 0 1px rgba(255,255,255,.07), inset 0 100px rgba(31,38,53,.3), 0 0 0 2px #fff; } .smallplanet .planetlink { border-right:1px solid #000; left:0 !important; text-align:left; top:0 !important; } .smallplanet .moonlink { bottom:0 !important; color:#9e945b !important; left:0 !important; text-align:left; top:auto !important; } .smallplanet .planetlink:hover, .smallplanet .moonlink:hover { background:linear-gradient(to bottom right, #3b4b6f 45%, #090e13); } .smallplanet .planetlink.active, .smallplanet .moonlink.active { background:linear-gradient(to bottom right, var(--purple) 45%, #090e13); } .smallplanet .planet-name, .smallplanet .planet-koords { left:20px !important; position:absolute !important; } .smallplanet .planet-name { color:#6982af !important; font-weight:bold !important; max-width:62px; overflow:hidden; text-overflow:ellipsis; top:5px !important; } .smallplanet .planet-koords { color:#6d6d6d !important; letter-spacing:-0.05em; top:18px !important; } [data-multi="0"]::before { border:2px solid #ffdb2d; } [data-multi="1"]::before { border:2px solid #8bc34a; } [data-multi="2"]::before { border:2px solid #d24c9c; } [data-multi="3"]::before { border:2px solid #03a9f4; } [data-multi="4"]::before { border:2px solid #f57c00; } [data-multi="5"]::before { border:2px solid #d2d2d2; } [data-multi="6"]::before { border:2px solid #009688; } [data-multi="7"]::before { border:2px solid #d41c1c; } [data-multi="8"]::before { border:2px solid #3f51b5; } [data-multi]::before { border-right:0; bottom:-3px; content:''; display:block; height:100%; left:-6px; position:absolute; transform:translateY(-50%); width:3px; } #planetbarcomponent #rechts #myPlanets .smallplanet a.constructionIcon, #planetbarcomponent #rechts #cutty a.constructionIcon { bottom:3px !important; left:3px !important; position:absolute !important; top:auto !important; z-index:3 !important; } #planetbarcomponent #rechts #myPlanets .smallplanet a.constructionIcon.moon, #planetbarcomponent #rechts #cutty a.constructionIcon.moon { left:111px !important; } #planetbarcomponent #rechts #myPlanets .smallplanet a.wreckFieldIcon { left:-20px; top:-1px; } /* FLEET EVENTS ------------------------------------------ */ .eventFleet[data-mission-type="1"], .fleetDetails[data-mission-type="1"] { color:#ea463e !important; } .eventFleet[data-mission-type="2"], .fleetDetails[data-mission-type="2"] { color:#ff6046 !important; } .eventFleet[data-mission-type="3"], .fleetDetails[data-mission-type="3"] { color:#76c754 !important; } .eventFleet[data-mission-type="4"], .fleetDetails[data-mission-type="4"] { color:#47c79e !important; } .eventFleet[data-mission-type="5"], .fleetDetails[data-mission-type="5"] { color:#e48d50 !important; } .eventFleet[data-mission-type="6"], .fleetDetails[data-mission-type="6"] { color:#cabe6e !important; } .eventFleet[data-mission-type="7"], .fleetDetails[data-mission-type="7"] { color:#72d9de !important; } .eventFleet[data-mission-type="8"], .fleetDetails[data-mission-type="8"] { color:#b7e8c0 !important; } .eventFleet[data-mission-type="9"], .fleetDetails[data-mission-type="9"] { color:#fd2e2e !important; } .eventFleet[data-mission-type="15"], .fleetDetails[data-mission-type="15"] { color:#6d98e2 !important; } .eventFleet[data-mission-type="16"], .fleetDetails[data-mission-type="16"] { color:#72c4d4 !important; } #eventContent tbody { outline:1px solid #000; } #eventContent tr, #eventContent .odd, #eventContent .part-even { background:#141e26; line-height:22px; } #eventContent tr td { font-size:10px; padding:0; position:relative; vertical-align:middle; } #eventContent tr td * { font-size:inherit !important; } #eventContent tr td *:not(.textBeefy):not(a) { color:inherit; } #eventContent tr td a:not(.icon_link) { background:rgba(0,0,0,.4); border-radius:40px; padding:2px 4px; text-decoration:none; } .sendProbe .icon_link { background:none; } #eventContent tr td figure { margin-right:2px; } #eventContent tr .icon_movement, #eventContent tr .icon_movement_reserve { background-position-y:center; display:table-cell; height:auto; padding:0; } .eventFleet[data-return-flight="true"], .fleetDetails[data-return-flight="1"] { box-shadow:inset 0 150px 0 rgba(0,0,0,.5); } #eventContent td a:hover { color:#73a7c5; } #eventContent tr[data-return-flight="true"] td { opacity:.5; } #eventContent .originFleet span, #eventContent .destFleet span { display:block !important; font-size:0 !important; overflow:visible; width:auto; } #eventContent .originFleet span:after, #eventContent .destFleet span:after { content:attr(data-tooltip); font-size:10px; overflow:hidden; text-align:center; text-overflow:ellipsis; vertical-align:middle; } .eventFleet .countDown, .eventFleet .arrivalTime { text-align:left; text-indent:5px; } #eventContent .countDown { text-shadow:1px 1px #000; } .eventFleet .missionFleet img { position:relative; top:3px; vertical-align:top; } .detailsOpened .ogl_backTimer { background:#232f3a; border-radius:2px; right:205px; line-height:16px; padding:0 9px; position:absolute; top:3px; } .ogl_backTimer:before, .ogl_backTimer:after { font-size:10px !important; vertical-align:middle; } .detailsOpened .marker01, .detailsOpened .marker02 { visibility:hidden !important; } .ogl_shipDetail { color:#6982af; display:grid; grid-gap:2px; grid-template-columns:repeat(20, 1fr); height:18px; pointer-events:none; position:absolute; left:115px; text-align:center; top:25px; white-space:nowrap; } .ogl_shipDetail > div { display:grid; } .ogl_shipDetail .ogl_shipIcon { border:none; border-radius:40px !important; box-shadow:none; display:inline-block; height:24px; image-rendering:-webkit-optimize-contrast; margin:auto; position:relative; width:24px; z-index:-1; } .ogl_shipDetail span { background:#1f273a; border-radius:2px; box-shadow:0 0 5px #000; line-height:14px; margin-top:-6px; font-weight:bold; font-size:9px; } .fleetDetails.detailsOpened { height:59px !important; } .detailsOpened .timer { font-size:12px !important; font-weight:bold !important; left:7px !important; top:24px !important; width:auto !important; } .detailsOpened .absTime { left:7px !important; top:40px !important; } .detailsOpened .originData { left:107px !important; text-align:right !important; } .detailsOpened .destinationData { left:470px !important; text-align:left !important; } .fleetDetails { background:#141e26; box-shadow:inset 0 23px #0d1014, inset 0 -2px 23px #000 !important; margin:2px 5px 10px 5px; } .fleetDetails.detailsOpened .mission { border-radius:2px !important; color:inherit !important; display:inline-block !important; left:7px !important; padding:1px 10px !important; top:3px !important; } .fleetDetails.detailsOpened .mission:before { background:currentColor; content:''; display:block; height:100%; left:0; opacity:.2; position:absolute; top:0; width:100%; } .detailsOpened .nextTimer, .detailsOpened .nextabsTime, .detailsOpened .nextMission, #movementcomponent .starStreak .origin, #movementcomponent .starStreak .destination { display:none !important; } .detailsOpened .starStreak { background:none !important; border:none !important; overflow:initial !important; } .detailsOpened .reversal { left:auto !important; right:338px !important; top:1px !important; z-index:2 !important; } .detailsOpened .fedAttack { left:auto !important; right:43px !important; top:24px !important; } .detailsOpened .sendMail { left:auto !important; right:22px !important; top:24px !important; } .detailsOpened .originData, .detailsOpened .destinationData { color:#fff !important; width:168px !important; } .detailsOpened .originPlanet, .detailsOpened .destinationPlanet { display:inline-block !important; position:relative !important; top:auto !important; left:auto !important; max-width:100px !important; right:auto !important; vertical-align:middle !important; width:auto !important; } .detailsOpened .absTime:after { font-size:10px !important; } #movementcomponent .detailsOpened .starStreak .route a { background:none !important; left:103px !important; margin-left:0 !important; margin-top:5px !important; position:absolute !important; top:-33px !important; transform:scaleX(1) !important; transform-origin:right !important; } #movementcomponent .detailsOpened .starStreak .route a.fleet_icon_forward { transform:scaleX(-1) !important; transform-origin:right !important; } /* TOOLTIP MANAGER ------------------------------------------ */ .ogl_tooltip { background:var(--raisin); border:2px solid #364352; border-radius:5px; box-shadow:0 0 10px #000; box-sizing:border-box; display:none; font-size:11px; max-width:440px; min-width:20px; padding:10px; position:absolute; width:fit-content; width:-moz-fit-content; z-index:1000000; } .ogl_tooltip.ogl_active { display:block; } .ogl_tooltip:after { background:var(--raisin); border-bottom:2px solid #364352; border-right:2px solid #364352; bottom:-6px; content:''; display:block; height:15px; left:50%; pointer-events:none; position:absolute; transform:translateX(-50%) rotate(45deg); width:15px; z-index:-1; } .ogl_tooltip.ogl_left:after { border:none; border-top:2px solid #364352; border-right:2px solid #364352; bottom:auto; left:auto; margin-top:-12px; top:50%; transform:rotate(45deg); right:-6px; } .ogl_tooltip.ogl_right:after { border:none; border-bottom:2px solid #364352; border-left:2px solid #364352; bottom:auto; left:-6px; transform:rotate(45deg); margin-top:-12px; top:50%; } .ogl_tooltip.ogl_bottom:after { border:none; border-top:2px solid #364352; border-left:2px solid #364352; bottom:auto; left:50%; top:-8px; transform:translateX(-50%) rotate(45deg); } .splitLine { background:#181d27; border:none; height:2px; margin:9px 0; } .ogl_tooltip .ogl_value { color:var(--yellow); font-weight:bold; margin-left:10px; } .ogl_tooltip a { color:var(--skyblue); text-decoration:none; } .ogl_tooltip a:hover { color:var(--yellow); } .ogl_tooltip div.alert_triangle { top:auto; } .ogl_tooltip .float_right { margin-left:10px; } /* GALAXY MANAGER ------------------------------------------ */ #galaxytable, .ogl_spyTable { background:#0d1014; border-collapse:collapse; } #galaxytable tbody tr.row, .ogl_spyTable tr { height:30px; opacity:1; position:relative; } #galaxytable tbody tr:before, .ogl_spyTable tr:before { background:linear-gradient(to right, rgba(23,31,41,.6) 10px, rgba(23,31,41,.96) 200px); content:''; height:30px; left:0; position:absolute; width:100%; } .ogl_spyTable tr:before { left:auto; width:626px; } .ogl_spyTable tr.ogl_extended { height:120px; } .ogl_spyTable tr.ogl_extended:before { height:120px; } .ogl_spyTable .ogl_added { font-size:10px; opacity:.5; } .ogl_spyTable a.ogl_added { display:block; } #galaxytable .expeditionDebrisSlot:before { height:64px; } #galaxytable tbody tr td, .ogl_spyTable td { background:none !important; border-radius:0; box-shadow:inset 1px 0 rgba(255,255,255,.03), inset -1px 0 rgba(0,0,0,.5), inset 0 1px rgba(255,255,255,.03), inset 0 -1px rgba(0,0,0,.5); filter:brightness(100%) !important; font-size:11px; font-weight:normal; line-height:17px !important; padding:0 5px; text-shadow:1px 1px #000; transition:background .2s; white-space:nowrap; } #galaxytable tbody tr[class*="filtered_filter_"]:not([data-color]):before { background:#0d1014; } #galaxytable tbody tr[class*="filtered_filter_"]:not([data-color]) td { opacity:.2; } #galaxytable tbody * { white-space:nowrap; } #galaxytable tr.row { display:grid; grid-template-columns:30px 35px 140px 35px 50px auto 80px 90px; height:30px !important; } #galaxytable tr.row td { box-sizing:border-box; font-size:11px !important; height:30px !important; line-height:30px !important; margin:0 !important; padding:0 !important; width:100% !important; } #galaxytable td.playername { width:240px; } #galaxytable .playername .float_right, #galaxytable .playername .float_right a { color:var(--yellow); font-size:10px; } #galaxytable .ListImage .planetTooltip, #galaxytable tr.row td.moon img { margin-left:-5px; } #galaxytable td.moon { width:30px; } #galaxytable tr.row td.planetname, #galaxytable tr.row td.planetname1 { text-align:left; text-indent:10px; } #galaxytable tr td.action { padding-top:7px !important; } #galaxytable tr td.playername { padding:0 5px !important; } #galaxytable .playername a { display:inline-block; line-height:27px; max-width:110px; overflow:hidden; text-overflow:ellipsis; vertical-align:middle; white-space:nowrap; } #galaxytable .playername .honorRank { pointer-events:none; position:relative; top:6px; vertical-align:top; } .status_abbr_longinactive { color:#616161!important; } .status_abbr_inactive { color:#989898!important; } #galaxytable .playername { text-align:left; } #galaxytable .playername .status { } #galaxytable .activity, #galaxytable .fleetAction { pointer-events:none; } #galaxytable tr.row td.allytag { padding-right:8px !important; text-align:right; } .ogl_stalk h1 .ogl_ranking { color:var(--yellow); margin-left:5px; } .ogl_stalk h1 span a { color:inherit; } .ogl_stalkPlanets { background:var(--darkblue); box-sizing:border-box; display:grid; grid-auto-rows:min-content; grid-gap:5px; grid-template-columns:repeat(2, 1fr); } .ogl_sideView .ogl_stalkPlanets { align-content:flex-start; display:flex; flex-wrap:wrap; height:calc(100vh - 215px); overflow-y:auto; padding:6px; width:100%; } .ogl_stalkPlanets > div { background-color:var(--darkblue); border:3px solid #1f2735; border-radius:3px; box-shadow:0 0 5px #000; color:var(--bluelight); cursor:pointer; font-weight:bold; font-size:11px; height:23px; line-height:20px; min-width:100px; padding:0 5px; position:relative; text-shadow:0px 1px 5px #000; user-select:none; white-space:nowrap; } .ogl_sideView .ogl_stalkPlanets > div { width:40%; } .ogl_stalkPlanets > div:before { background:var(--raisin); content:''; display:block; height:21px; left:-1px; position:absolute; right:-1px; top:-1px; } .ogl_stalkPlanets > div span { position:relative; z-index:1; } .ogl_stalkPlanets > div.ogl_active, .ogl_sideView .ogl_stalkPlanets > div.ogl_active { border-color:hsla(218, 26%, 25%, 1); } .ogl_stalkPlanets > div.ogl_active:before, .ogl_sideView .ogl_stalkPlanets > div.ogl_active:before { background:hsla(218, 26%, 25%, 1); } .ogl_sideView .ogl_stalkPlanets > div { min-width:106px; } .ogl_sideView .ogl_stalkPlanets > div .ogl_active.ogl_flagIcon { color:var(--yellow); } .ogl_stalkPlanets > div:hover { border-color:hsla(218, 26%, 25%, 1); } .ogl_stalkPlanets > div .ogl_planetIcon, .ogl_stalkPlanets > div .ogl_moonIcon, .ogl_stalkPlanets > div .ogl_flagIcon { border-radius:50%; color:var(--skyblue); float:right; font-size:15px !important; } .ogl_stalkPlanets > div .ogl_flagIcon { margin-right:2px; } .ogl_stalkPlanets > div .ogl_planetIcon:hover, .ogl_stalkPlanets > div .ogl_moonIcon:hover, .ogl_stalkPlanets > div .ogl_flagIcon:hover { color:var(--sunset); } .ogl_stalkPlanets > div .ogl_moonIcon { filter:brightness(.3); pointer-events:none; position:relative; top:1px; transform:rotate(20deg); } .ogl_stalkPlanets > div .ogl_moonIcon.ogl_active { filter:brightness(1); pointer-events:auto; } .ogl_stalkPlanets > div .ogl_mainPlanet { color:#e4bb25; font-size:9px !important; position:absolute; top:-5px; } .ogl_stalk .splitLine { background:none; clear:both; margin:4px 0; } .ogl_stalkPlanets .ogl_disabled { color:var(--red) !important; opacity:.5; } .ogl_stalkInfo { background:var(--darkblue); border-radius:5px; display:grid; grid-template-columns:auto min-content; padding:5px; } .ogl_stalkInfo > * { grid-row:1; } .ogl_stalkPoints { border-left:2px solid var(--raisin); display:grid; grid-auto-rows:min-content; grid-column-start:2; grid-gap:3px; margin-left:5px; padding-left:5px; } .ogl_sideView .ogl_stalkPoints { grid-template-columns:repeat(3, 1fr); margin:0; padding:0; } .ogl_sideView h1 { font-size:16px; font-weight:bold; text-align:center; } .ogl_stalkPoints > div { align-self:end; align-items:center; background:var(--black); border:1px solid #121921; border-radius:4px; display:grid; font-size:10px; font-weight:bold; grid-gap:8px; grid-template-columns:min-content auto; padding:1px 4px 1px 1px; text-align:right; white-space:nowrap; } .ogl_stalkPoints > div i { font-size:16px !important; } .ogl_stalkPoints > div:nth-child(1) { background:#1b3444;color:#91d2ff; } .ogl_stalkPoints > div:nth-child(2) { background:#383737;color:#c5c5c5; } .ogl_stalkPoints > div:nth-child(3) { background:#214227;color:#a6e88b; } .ogl_stalkPoints > div:nth-child(4) { background:#402020;color:#ff9393; } .ogl_stalkPoints > div:nth-child(5) { background:#443822;color:#e8a560; } .ogl_stalkPoints > div:nth-child(1):before { background-position:0 -3px; } .ogl_stalkPoints > div:nth-child(2):before { background-position:100% -3px; } .ogl_stalkPoints > div:nth-child(3):before { background-position:80% -3px; } .ogl_stalkPoints > div:nth-child(4):before { background-position:60% -3px; } .ogl_stalkPoints > div:nth-child(5):before { background-position:60% -3px; filter:hue-rotate(27deg) brightness(1.75); } .ogl_stalkPoints > div:nth-child(6):before { background-position:60% -3px; filter:hue-rotate(67deg) brightness(1.75); } #galaxytable .debrisField { background:none !important; color:#fff; font-size:10px; left:0; line-height:14px; padding:0; position:absolute; width:100% !important; } #galaxytable .debris.ogl_active { background:var(--orangedark) !important; opacity:1 !important; } .expeditionDebrisSlotBox { align-items:center; background:none !important; border:none !important; box-shadow:none !important; display:grid; grid-template-columns:20% auto auto auto; width:652px; } .expeditionDebrisSlotBox li { list-style:none; } .expeditionDebrisSlotBox > img { float:right; justify-self:center; } .expeditionDebrisSlotBox > div { line-height:1.6; text-align:left; } .expeditionDebrisSlotBox a:hover { color:var(--orange); } /* PLAYER MANAGER ------------------------------------------ */ .ogl_colorButton { background:#151515; border:2px solid #1f252b; border-radius:3px; cursor:pointer; height:16px; left:5px; position:absolute; top:5px; transition:all .2s; width:16px; } .ogl_colorButton:hover { border-color:#263640; filter:brightness(1.2); } /* PLANET MANAGER ------------------------------------------ */ .ogl_colorPicker { display:grid; grid-template-columns:repeat(2, 1fr); width:60px; } .ogl_colorPicker > div { border-radius:3px; box-shadow:inset 0 0 0 3px rgba(0,0,0,.3); cursor:pointer; filter:brightness(.9); height:24px; margin:2px; position:relative; transition:transform .2s, filter .2s; width:24px; } .ogl_colorPicker > div:hover { filter:brightness(1.3); transform:scale(1.2); z-index:2; } .ogl_colorPicker > div[data-color="none"]:before { content:'clear'; display:block; font-family:'material icons'; font-size:10px; height:100%; left:0; line-height:24px; position:absolute; text-align:center; top:0; width:100%; } [data-color="red"], [data-color="red"] .ogl_colorButton, [data-toggle="red"] { background:var(--red) !important; } [data-color="yellow"], [data-color="yellow"] .ogl_colorButton, [data-toggle="yellow"] { background:var(--yellow) !important; } [data-color="green"], [data-color="green"] .ogl_colorButton, [data-toggle="green"] { background:var(--green) !important; } [data-color="blue"], [data-color="blue"] .ogl_colorButton, [data-toggle="blue"] { background:var(--blue) !important; } [data-color="violet"], [data-color="violet"] .ogl_colorButton, [data-toggle="violet"] { background:var(--violet) !important; } [data-color="gray"] { opacity:.2 !important; } [data-color="gray"] .ogl_colorButton, [data-toggle="gray"] { background:var(--white) !important; } .ogl_colorPicker [data-color="gray"] { background:var(--white) !important;opacity:1 !important; } #galaxytable tr[data-color="gray"] { background:#0d1014;opacity:1 !important; } #galaxytable tr[data-color="gray"]:before { background:#0d1014; } #galaxytable tr[data-color="gray"] td { opacity:.2 !important; } [data-color="halfred"], [data-color="halfred"] .ogl_colorButton, [data-toggle="halfred"] { background:repeating-linear-gradient(-45deg, var(--red), var(--red) 5px, #942424 5px, #942424 10px) !important; } [data-color="halfyellow"], [data-color="halfyellow"] .ogl_colorButton, [data-toggle="halfyellow"] { background:repeating-linear-gradient(-45deg, var(--yellow), var(--yellow) 5px, #947931 5px, #947931 10px) !important; } [data-color="halfgreen"], [data-color="halfgreen"] .ogl_colorButton, [data-toggle="halfgreen"] { background:repeating-linear-gradient(-45deg, var(--green), var(--green) 5px, #2b8055 5px, #2b8055 10px) !important; } [data-color="halfblue"], [data-color="halfblue"] .ogl_colorButton, [data-toggle="halfblue"] { background:repeating-linear-gradient(-45deg, var(--blue), var(--blue) 5px, #314a8c 5px, #314a8c 10px) !important; } [data-color="halfviolet"], [data-color="halfviolet"] .ogl_colorButton, [data-toggle="halfviolet"] { background:repeating-linear-gradient(-45deg, var(--violet), var(--violet) 5px, #5c2e6b 5px, #5c2e6b 10px) !important; } .ogl_stalkList { display:grid; justify-items:end; } .ogl_stalkList > div:nth-child(1) { display:grid; grid-gap:4px; grid-template-columns:repeat(11, 1fr); justify-items:end; margin-bottom:20px; width:280px; } .ogl_stalkList > div:nth-child(2), .ogl_stalkList > div:nth-child(3) { display:grid; grid-gap:3px; grid-template-columns:repeat(10, 1fr); margin-bottom:7px; width:100%; } .ogl_stalkList > div:nth-child(2) > div, .ogl_stalkList > div:nth-child(3) > div { background:rgba(255,255,255,.07); border-radius:3px; box-sizing:border-box; color:#b3b3b3; cursor:pointer; font-size:10px; font-weight:bold; line-height:21px; padding:4px 0; text-shadow:1px 2px var(--black); text-align:center; } .ogl_stalkList > div:nth-child(2) > div:hover, .ogl_stalkList > div:nth-child(3) > div:hover { color:#fff; } .ogl_stalkList > div:nth-child(2) > div.ogl_active, .ogl_stalkList > div:nth-child(3) > div.ogl_active { background:rgba(255,255,255,.07); box-shadow:0 0 0 2px #fff; } .ogl_stalkList > div:nth-child(2) > div.ogl_disabled, .ogl_stalkList > div:nth-child(3) > div.ogl_disabled { background:#0e1115; color:#353535; } .ogl_stalkList > div:nth-child(3) { margin-bottom:20px; } .ogl_stalkList > div:nth-child(4) { min-width:280px; } .ogl_toggle { border-radius:3px; box-shadow:inset 0 50px rgba(0,0,0,.6), inset 0 0 0 2px rgba(255,255,255,.4); cursor:pointer; display:inline-block; height:20px; vertical-align:middle; width:20px; } .ogl_toggle:hover { opacity:.7; } .ogl_toggle.ogl_active { box-shadow:inset 0 50px rgba(0,0,0,.3), inset 0 0 0 2px rgba(255,255,255,.2); } .ogl_toggle.ogl_active:before { color:#fff; content:"✓"; display:inline-block; font-size:14px; left:0; line-height:22px; text-align:center; top:0; width:100%; } /* PANEL MANAGER ------------------------------------------ */ #rechts { margin-bottom:0 !important; margin-top:-57px; } #planetList { margin-top:10px; width:147px !important; } #countColonies { background:var(--raisin) !important; box-shadow:inset 0 1px rgba(255,255,255,.07), inset 0 100px rgba(0,0,0,.15), 0 0 0 1px #000; border-radius:5px; color:#6982af; font-size:10px; height:auto !important; line-height:20px !important; margin:0 !important; user-select:none; } #countColonies { color:transparent !important; } #countColonies p { text-align:left !important; text-indent:5px; } #countColonies span { color:#6f9fc8; } #countColonies p:hover:after { color:var(--hoverLight); } /* SIDE VIEW MANAGER ------------------------------------------ */ .ogl_sideView { background:var(--raisin); box-sizing:border-box; min-height:100vh; max-width:85%; padding:50px 20px 20px 20px; position:fixed; top:0; transform:translateX(100%); transition:transform .3s; right:0; width:320px; z-index:10000; } .ogl_sideView.ogl_active { box-shadow:0 0 10px #000; transform:translateX(0%); } .ogl_sideView .ogl_close { right:20px; top:10px; } .ogl_sideContent { margin-bottom:20px; } .ogl_economy .ogl_total { background:#0c1015; padding:10px 12px; } .ogl_economy > div:not(.ogl_total):hover { background:#403916; cursor:pointer; } .ogl_economy .ogl_total .ogl_metal > div, .ogl_economy .ogl_total .ogl_crystal> div, .ogl_economy .ogl_total .ogl_deut > div { display:inline-block; text-align:center; } .ogl_economy .ogl_total b { font-size:16px; } .ogl_economy > div { background:#141921; box-shadow:inset 0 -1px #0c1015; display:grid; grid-template-columns:auto 120px 120px 120px; font-size:10px; padding:1px 12px 2px 12px; position:relative; text-align:right; } .ogl_economy > div b { display:inline-block; font-size:12px; magin:1px 0; } .ogl_economy > div i { display:inline-block; font-size:10px; margin-bottom:2px; opacity:.8; text-align:left; text-indent:4px; vertical-align:bottom; width:64px; } .ogl_economy > div h3 { color:#fff; font-size:10px; margin:2px 0; text-align:left; } .ogl_economy > div h3 span { color:#969696; display:inline-block; width:65px; } .ogl_panel > div:nth-child(1) { color:var(--yellow); } [data-panel="stock"] .ogl_panel > div:nth-child(1) { color:#51658a; } [data-panel="stock"] .ogl_panel > div:nth-child(2) { color:var(--yellow); } [data-panel="stock"] .smallplanet { grid-template-columns:50% 50%; } [data-panel="stock"] .ogl_stock { display:grid; } [data-panel="stock"] img { transform:scale(.9); } [data-panel="stock"] .planet-name, [data-panel="stock"] .planet-koords, [data-panel="stock"] .ogl_timer, [data-panel="stock"] .ogl_jumpGateTimer { opacity:0 !important; pointer-events:none; } .ogl_stock { display:none; grid-template-rows:repeat(3, 1fr); line-height:10px; pointer-events:none; position:absolute; right:5px; text-align:right; top:4px; } .ogl_stock > * { font-size:9px !important; font-weight:bold !important; } .ogl_prod { grid-template-columns:repeat(4, 1fr) !important; } .ogl_mines { font-weight:bold; } .ogl_panel { bottom:0; display:grid; font-size:14px; grid-gap:4px; grid-template-columns:repeat(5, 1fr); position:absolute; right:5px; text-align:center; width:auto; } .ogl_panel > div { color:#51658a; cursor:pointer; } .ogl_panel > div:hover { color:var(--yellow); } .ogl_resourcesSum { background:var(--raisin); border-radius:5px; box-shadow:inset 0 1px rgba(255,255,255,.07), inset 0 100px rgba(0,0,0,.15), 0 0 0 1px #000; display:grid; font-size:11px; font-weight:bold; grid-template-rows:repeat(3, 1fr); margin-top:7px; padding:8px; position:relative; text-align:right; text-shadow:1px 1px #000; } .ogl_resourcesSum i { color:#4c5f88; font-size:24px !important; left:5px; position:absolute; top:10px; } /* EMPIRE MANAGER ------------------------------------------ */ #technologydetails .costs li.ogl_noMoney { color:var(--red); } #technologydetails .costs li.ogl_active { color:var(--green); } #technologydetails > .sprite_large:before { background:rgba(92,142,214,.4); box-shadow:inset 0 0 56px #000, inset 0 0 0 1px #000; content:''; height:100%; left:0; left:0; position:absolute; top:0; width:100%; } #technologydetails .technology_tree { border-radius:0 8px 0 0; } #technologydetails .ogl_button { font-size:18px !important; height:30px; line-height:26px !important; width:30px; } .ogl_lockBuild.ogl_disabled { opacity:.5; } .ogl_lockBuild.ogl_active, .ogl_lockBuild.ogl_active:hover { color:var(--yellow) !important; } #technologydetails .ogl_detailAction { display:grid; grid-gap:2px; grid-template-columns:repeat(4, 1fr); position:absolute; right:3px; top:3px; } #shipyard .ogl_detailAction, #defense .ogl_detailAction { grid-template-columns:repeat(1, 1fr); } #technologydetails .costs p { display:none; } a.build-it_premium, button.build-it_premium { display:block; padding-left:45px; text-align:left; } #technologydetails .premium_info { bottom:10px; left:0; margin:0; padding-left:50px; pointer-events:none; position:absolute; width:auto; } #technologydetails a.build-it_premium span, #technologydetails button.build-it_premium span { display:inline-block !important; font-size:10px !important; height:auto !important; margin-top:12px !important; width:auto !important; } #technologydetails .premium_info span { color:#b1e8fb; } .ogl_stats { background:var(--raisin); border-radius:5px; box-shadow:inset 0 1px rgba(255,255,255,.07), inset 0 300px rgba(0,0,0,.15), 0 0 0 1px #000; box-sizing:border-box; font-weight:bold; margin:12px 0; padding:8px; position:relative; text-shadow:1px 1px #000; width:134px; } .ogl_stats b { background:var(--yellow); border-radius:4px; box-shadow:0 0 4px 1px #000; color:var(--gray); font-size:10px; padding:3px 7px; position:absolute; left:-4px; text-align:center; top:-7px; z-index:2; } .ogl_stats .ogl_button { box-shadow:inset 0 12px rgba(255,255,255,.07); font-size:21px !important; height:29px; line-height:29px; padding:0; position:absolute; right:-2px; top:-2px; transform:translateX(100%); width:29px; } .ogl_stats .ogl_button:nth-of-type(2) { top:29px; } .ogl_stats .ogl_button:nth-of-type(3) { top:60px; } .ogl_labelLimit { background:var(--yellow) !important; border-radius:2px; box-shadow:0 3px 5px rgba(0,0,0,.8); color:var(--gray) !important; display:block !important; font-weight:bold; left:-6px; padding:3px 5px; position:absolute; text-shadow:none; top:-8px; z-index:2; } .ogl_labelLimit.tooltipRight { cursor:pointer; } .ogl_stats .ogl_date { color:#4f5b73; display:block; font-size:10px; margin-top:5px; text-align:right; } .ogl_stats h2 { margin-bottom:10px; text-align:center; } .ogl_stats .ogl_0 { background:#252d3e; font-size:22px !important; text-align:center; } .ogl_stats .ogl_0:before { color:#fff; content:'functions'; } .ogl_stats > div { color:#a9bbda; display:grid; font-size:10px; grid-template-columns:40px auto; } .ogl_stats .ogl_shipIcon, .ogl_sideView .ogl_shipIcon { background-position:center; border:none; border-radius:0; border-right:1px solid #0d1013; height:18px !important; width:37px !important; } .ogl_stats .number { color:var(--yellow); line-height:17px; padding:0 5px; text-align:right; } .ogl_fullStats { align-items:start; display:grid; grid-gap:20px; grid-template-columns:repeat(2, 1fr); grid-template-rows:auto auto; padding-top:46px; } .ogl_fullStats h2 { font-size:10px; font-weight:bold; left:8px; position:absolute; text-transform:uppercase; top:8px; } .ogl_fullStats > div:nth-child(1) h2 { color:#5591dc; } .ogl_fullStats > div:nth-child(2) h2 { color:#cc5c5c; } .ogl_fullStats > div:nth-child(3) h2 { color:#57a28a; } .ogl_fullStats > div { background:#181e27; box-sizing:border-box; position:relative; } .ogl_fullStats .ogl_pieItems { border-radius:4px; display:grid; grid-auto-rows:min-content; grid-gap:3px 8px; grid-template-columns:repeat(2, 1fr); padding:7px; } .ogl_fullStats .ogl_item { background:#2c3954; border-radius:4px; display:grid; font-size:11px; font-weight:bold; grid-gap:4px; grid-template-columns:40px auto; line-height:22px; padding-right:7px; text-align:right; } .ogl_fullStats > div { border-radius:6px; padding:20px; height:100%; } .ogl_fullStats > div .ogl_pieLabel, .ogl_fullStats > div .ogl_pieItems { background:#222d40; } .ogl_fullStats > div > div:not(:last-child) { margin-bottom:30px; } .ogl_fullStats > div:nth-child(1) { grid-row:1 / 3; } .ogl_fullStats .ogl_shipIcon { background-position:center; border:2px solid #43516d; height:100%; padding:0; } .ogl_fullStats .ogl_statsLimit { background:#273346; border-radius:4px; box-shadow:0 2px 4px rgba(0,0,0,.5); color:#8da7b3; display:grid; font-size:12px; font-weight:bold; grid-template-columns:repeat(4, 1fr); height:25px; line-height:25px; left:50%; overflow:hidden; padding:0; position:absolute; text-align:center; transform:translateX(-50%); top:20px; } .ogl_fullStats .ogl_statsLimit > div { cursor:pointer; margin:0 !important; padding:0 7px; } .ogl_fullStats .ogl_statsLimit > div.ogl_active { background:#544d34; color:var(--yellow); } .ogl_fullStats .ogl_statsLimit > div:hover { color:#fff; } .ogl_pie { background:rgba(255,255,255,.1); border-radius:50%; box-shadow:0 7px 5px rgba(0,0,0,.3); height:167px; margin:auto; position:relative; text-align:center; width:167px; } .ogl_pie:before { background:var(--gray); border-radius:50%; box-shadow:inset 0 7px 5px rgba(0,0,0,.3); content:''; height:1px; left:50%; padding:29%; position:absolute; top:50%; transform:translate(-50%, -50%); width:1px; } .ogl_pieLabel { background:#272c44; border-radius:4px; box-sizing:border-box; color:#818cb3; margin:0 auto; padding:8px; white-space:nowrap; width:100%; } .ogl_pieLabel > div { display:grid; font-weight:bold; grid-gap:5px; grid-template-columns:11px 145px auto auto; } .ogl_pieLabel > div span:last-of-type { color:#fff; } .ogl_pieLabel > div b { color:#80869e; text-align:right; } .ogl_pieLabel > div > div { border-radius:50%; display:inline-block; height:10px; margin-top:3px; width:10px; } .planetlink .ogl_timer, .moonlink .ogl_timer { bottom:3px; color:#5f2f2f !important; content:''; font-size:12px !important; font-weight:bold !important; position:absolute; right:4px; } .ogl_timer[data-timer]:before { content:attr(data-timer); } .planetlink .ogl_timer.ogl_medium, .moonlink .ogl_timer.ogl_medium, .ogl_medium { color:#795a31 !important; } .planetlink .ogl_timer.ogl_short, .moonlink .ogl_timer.ogl_short, .ogl_short { color:#26867d !important; } .ogl_pinnedContent .ogl_short { color:#da3e3e !important; } #planetbarcomponent #rechts .smallplanet a.alert { left:1px; } /* KEYBOARD MANAGER ------------------------------------------ */ .ogl_keyList { display:grid; grid-gap:8px; grid-template-columns:repeat(4, 1fr); margin-top:10px; } .ogl_key { background:#161b25; border:1px solid #1c222f; box-shadow:1px 0 1px 0 #161b25, 0 2px 0 2px #0a0c10, 0 2px 0 3px #11151d; box-sizing:border-box; border-radius:3px; color:#d29d3e; cursor:pointer; font-size:10px; font-weight:bold; line-height:24px !important; text-align:center; width:100%; } .ogl_key:hover { background:#0e1119; box-shadow:1px 0 1px 0 #161b25, 0 1px 0 2px #0a0c10, 0 0 0 3px #11151d; transform:translateY(2px); } /* ICONS ------------------------------------------ */ .icon:not(.sprite):not(.resource):not(.icon_wreck_field) { border-radius:4px; box-shadow:inset 0 0 0 0 #121821; cursor:pointer; filter:sepia(1) hue-rotate(174deg) saturate(1.4) brightness(.8) contrast(1.5); } .icon:not(.resource):not(.sprite):not(.icon_wreck_field):hover { filter:sepia(1) hue-rotate(174deg) saturate(1.4) brightness(.9) contrast(1.2); } .icon.grayscale, .colonize-inactive { cursor:default !important; filter:grayscale(100%) !important; opacity:.7; } .icon.hueRotate { filter:hue-rotate(275deg) contrast(1.8) !important; } /* CONFIG ------------------------------------------ */ .ogl_scriptTitle { font-size:45px; font-weight:bold; } .ogl_scriptTitle span { color:#85a0c1; font-size:16px; font-weight:normal; } .ogl_globalConfig { display:grid; grid-gap:20px; grid-template-columns:repeat(2, 1fr); } .ogl_globalConfig > div:nth-child(1) { align-items:center; display:flex; flex-direction:column; justify-content:center; } .ogl_globalConfig p { margin-bottom:10px; padding:10px 0; } .ogl_kofi { background:var(--green); border:2px solid var(--darkblue); border-radius:4px; color:#fff !important; display:block; line-height:32px !important; padding:0 10px; text-decoration:none !important; text-shadow:1px 1px rgba(0,0,0,.3); } .ogl_kofi:after { color:#fff; content:'favorite'; font-family:'material icons'; font-size:16px !important; margin-left:7px; text-shadow:none; vertical-align:bottom; -webkit-text-stroke:2px var(--darkblue); } .ogl_kofi:hover:after { color:var(--red); } .ogl_config { background:#253144; border-radius:4px; display:grid; grid-gap:10px; padding:20px; } .ogl_globalConfig hr { background:var(--bluedark); border:none; height:2px; margin:5px 0; width:100%; } .ogl_config hr { margin:10px 0; } .ogl_globalConfig .ogl_button { color:#8ca5c5; padding:0 8px; } .ogl_config > div { display:grid; grid-gap:30px; grid-template-columns:auto max-content; line-height:22px; } .ogl_config > .ogl_manageData { grid-gap:10px; grid-template-columns:auto max-content max-content max-content; } .ogl_confToggle { background:#777; border-radius:50px; cursor:pointer; font-size:11px; font-weight:bold; position:relative; width:50px; } .ogl_confToggle:hover { opacity:.8; } .ogl_confToggle.ogl_active { background:var(--green); } .ogl_confToggle:before { box-sizing:border-box; content:'OFF'; height:100%; padding:0 5px; position:absolute; text-align:right; width:100%; } .ogl_confToggle.ogl_active:before { content:'ON'; text-align:left; } .ogl_confToggle:after { background:#fff; border-radius:50px; box-shadow:0 0 4px rgba(0,0,0,.5); content:''; height:16px; left:3px; position:absolute; top:3px; transition:left .2s; width:16px; } .ogl_confToggle.ogl_active:after { left:calc(50px - 20px); } /* LOCK ------------------------------------------ */ .ogl_sideLock { bottom:0; color:var(--yellow); cursor:pointer; font-size:16px !important; position:absolute; right:-20px; } .ogl_sideLock:hover { color:#fff; } .ogl_lockInfo { width:auto; } .ogl_lockInfo hr { border:none; grid-column:1 / 6; height:24px; margin:0; width:100%; } .ogl_lockLine { align-items:center; background:#131821; box-shadow:inset 0 43px #0e1117, inset 0 -43px #0e1117; display:grid; font-size:12px; grid-gap:2px 0; grid-template-columns:auto 140px 140px 140px 72px; justify-items:flex-end; overflow:hidden; padding:8px; white-space:nowrap; } .ogl_lockLine:nth-child(1) { margin-bottom:10px; } .ogl_lockLine > div { align-self:normal; height:25px; line-height:25px; padding:0 8px; text-align:right; } .ogl_lockInfo .ogl_type { text-align:left; } .ogl_lockLine .ogl_shipIcon { border-color:#5fb1ca; height:28px; margin:-1px 0 0 auto; padding:0 5px; } .ogl_lockLine .material-icons { font-size:16px !important; } .ogl_lockLine .ogl_button { margin-left:3px; width:25px; } .ogl_lockLine .ogl_ok.material-icons { font-size:22px !important; margin-left:5px; vertical-align:middle; } .ogl_lockLine .ogl_delete { cursor:pointer; } .ogl_emptyGrid { color:#fff; display:grid; font-size:12px; font-weight:normal; float:right; grid-gap:5px; grid-template-columns:repeat(4, auto); margin:0 16px; overflow:hidden; width:fit-content; width:-moz-fit-content; } .ogl_emptyShip { background:#4e2323; border:1px solid #000; border-radius:3px; display:grid; grid-template-columns:32px auto; line-height:15px; } .ogl_emptyGrid .ogl_shipIcon { background-position:center; border:none !important; border-right:1px solid #000 !important; border-radius:0 !important; height:15px; image-rendering:-webkit-optimize-contrast; width:32px; } .ogl_emptyShip span { display:inline-block; padding:0 8px; } #fleetdispatchcomponent #warning p { margin:30px auto 18px auto; } .ogl_sim { background:linear-gradient(to top, #1a2027, #2e3948) !important; box-shadow:inset 0 1px 3px #374454; border-radius:5px; color:#9ea5af; cursor:pointer; float:left; font-size:16px; font-weight:bold; line-height:26px; text-align:center; } .ogl_sim:hover { background:linear-gradient(to bottom, #1a2027, #2e3948) !important; box-shadow:inset 0 -1px 3px #374454; } .ogl_jumpGateTimer { text-align:center; } #jumpgateForm .ogl_delta { border-width:2px; border-radius:4px; top:7px; } .ogl_storage { background:rgba(0,0,0,.8); border-top:1px solid #000; bottom:0; color:var(--yellow); display:none; font-size:9px; font-weight:bold; height:100%; line-height:33px; pointer-events:none; position:absolute; width:49px; } #resourcesbarcomponent:hover .ogl_storage { display:block; } .ogl_blackHole { display:grid; grid-gap:7px 20px; grid-template-columns:repeat(2, 1fr); grid-template-rows:repeat(7, 1fr); } .ogl_blackHole > div { display:grid; grid-template-columns:40px auto; } .ogl_blackHole .ogl_shipIcon { background-position:center; height:26px; } .ogl_fleetInfo div:nth-of-type(2) { color:#eac612; } .ogl_fleetInfo div:nth-of-type(3) { color:#36c7e8; } .ogl_fleetInfo div:nth-of-type(4) { color:#e979f1; } .ogl_fleetInfo span { display:inline-block; width:50px; } .ogl_maxCrawler { color:#5a5719; font-size:10px; font-weight:bold; margin:1px 4px; } #overviewcomponent #planetdata { bottom:47px; position:absolute !important; right:0; } #overviewcomponent #detailWrapper { height:100% !important; } .ogl_tempSync { position:absolute; top:10px; } .ogl_planetList > .ogl_linkedMoon { cursor:pointer; margin-bottom:25px; width:100%; } .ogl_planetList > .ogl_linkedMoon:after { content:'language east brightness_2'; direction:ltr; display:inline-block; font-family:'Material Icons' !important; font-weight:normal !important; font-style:normal !important; font-size:16px; image-rendering:pixelated; line-height:inherit !important; letter-spacing:normal; margin-left:10px; text-transform:none; transform:rotate(0.03deg); vertical-align:sub; white-space:nowrap; word-wrap:normal; -webkit-font-feature-settings:'liga'; -webkit-font-smoothing:antialiased; } .ogl_expeditionTooltip { display:grid; font-weight:bold; grid-gap:7px 3px; grid-template-columns:40px auto; line-height:22px; text-align:right; } .ogl_expeditionTooltip h3 { grid-column:1 / 3; margin-bottom:7px; } .ogl_expeditionTooltip .ogl_shipIcon { height:22px; } .ogl_button.ogl_ignoreRaid { font-size:18px !important; left:6px; position:absolute; top:0; width:25px; } .ogl_button.ogl_ignoreRaid.ogl_active { color:var(--red) !important; } .ogl_button.ogl_ignoreRaid:before { content:'toggle_off'; } .ogl_button.ogl_ignoreRaid.ogl_active:before { content:'toggle_on'; } /*!css*/ `; if(localStorage.getItem('ogl-minipics')) { GM_addStyle(` #supplies > header, #facilities > header, #research > header, #shipyard > header, #defense > header, #fleet1 .planet-header, #fleet2 .planet-header, #fleet3 .planet-header { height:34px !important; } #overviewcomponent #planet, #overviewcomponent #detailWrapper { height:auto !important; min-height:208px !important; position:relative !important; } #technologydetails_wrapper { position:relative !important; } #detail.detail_screen { height:300px !important; position:relative !important; } `); } GM_addStyle(oglcss);