NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript==
// @name OGLight TBot
// @namespace https://openuserjs.org/users/tbot
// @version 4.0.0
// @description OGLight script for TBot
// @author Oz, Trallallero, Anonymes
// @license MIT
// @copyright 2021, Oz, Trallallero, Anonymes
// @match *://*/game/*
// @updateURL https://openuserjs.org/meta/tbot/OGLight_TBot.meta.js
// @downloadURL https://openuserjs.org/install/tbot/OGLight_TBot.user.js
// @grant GM_addStyle
// @grant GM_getValue
// @grant GM_setValue
// @run-at document-start
// ==/UserScript==
// redirect user if needed
let redirect = localStorage.getItem('ogl-redirect');
if (redirect && redirect.indexOf('https') > -1) {
localStorage.setItem('ogl-redirect', false);
window.location.href = redirect;
return;
}
// 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();
}
// goodbye default tooltips
function goodbyeTipped() {
if (typeof Tipped !== 'undefined') {
for (let [key] of Object.entries(Tipped)) {
Tipped[key] = function () {
return false;
}
}
}
else requestAnimationFrame(() => goodbyeTipped());
}
goodbyeTipped();
if (new URL(window.location.href).searchParams.get('component') != 'empire') {
window.addEventListener("DOMContentLoaded", () => {
unsafeWindow.ogl = new OGLight()
});
}
class OGLight {
constructor() {
if (!document.body) document.location.reload();
this.mode = new URLSearchParams(window.location.search).get('ogl_mode') || 0; // 1:collect 2:raid 3:locked 4:linked
this.page = new URL(window.location.href).searchParams.get('component') || new URL(window.location.href).searchParams.get('page');
this.ptre = localStorage.getItem('ogl-ptreTK') || false;
this.updateQueue = [];
this.observerQueue = {};
this.mutationList = {};
this.observerExcludedID = ['tempcounter', 'resources_metal', 'resources_crystal', 'resources_deuterium', 'resources_darkmatter', 'resources_energy', 'promotionCountdown'];
this.observerExcludedClass = ['textBeefy', 'ogl_endTime'];
this.observer = new MutationObserver(mutations => {
mutations.forEach(mutation => {
if (this.observerExcludedID.indexOf(mutation.target.id) > -1) return;
if (mutation.target.className.trim().split(' ').filter(e => this.observerExcludedClass.includes(e)).length > 0) return;
//if(mutation.target.id && mutation.target.id != "") console.log(mutation.target.id)
if (mutation.target.id == 'amountColonized') {
this.galaxyCoords = [galaxy, system];
this.mutationList['crawler'] = performance.now();
this.mutationList['galaxy'] = performance.now();
}
else if (mutation.target.id == 'stat_list_content') {
this.mutationList['crawler'] = performance.now();
this.mutationList['highscore'] = performance.now();
}
else if (mutation.target.classList.contains('ui-tabs-panel')) {
this.mutationList['messagesdate'] = performance.now();
this.mutationList['tablereport'] = performance.now();
}
else if (mutation.target.id == 'technologydetails_content') {
this.mutationList['details'] = performance.now();
this.mutationList['detaillock'] = performance.now();
}
else if (mutation.target.classList.contains('ui-dialog-content')) {
let dialogType = mutation.target.getAttribute('data-page');
if (dialogType == 'jumpgatelayer') this.mutationList['jumpgate'] = performance.now();
else if (dialogType == 'phalanx') this.mutationList['tooltip'] = performance.now();
else if (dialogType == 'messages') this.mutationList['simbutton'] = performance.now();
}
else if (mutation.target.id == 'eventboxContent') {
this.mutationList['eventbox'] = performance.now();
}
else if (mutation.target.classList.contains('OGameClock')) {
this.updateQueue.forEach(callback => callback());
}
else if (this.observerQueue['tooltip']) {
this.mutationList['tooltip'] = performance.now();
}
});
if (Object.keys(this.mutationList).length > 0) tryUpdate();
});
let tryUpdate = () => {
setTimeout(() => {
Object.keys(this.mutationList).sort().forEach(k => {
if (performance.now() - this.mutationList[k] >= 20 && this.observerQueue[k]) {
this.observerQueue[k]();
delete this.mutationList[k];
}
});
}, 25);
}
this.observer.observe(document.body, {
childList: true,
subtree: true
});
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],
};
// player data
this.account = {};
this.account.id = document.querySelector('head meta[name="ogame-player-id"]').getAttribute('content');
this.account.name = document.querySelector('head meta[name="ogame-player-name"]').getAttribute('content');
this.account.rank = document.querySelector('#bar a[href*="page=highscore"').parentNode.textContent.match(/\d+/g)[0];
this.account.planetCount = document.querySelector('#countColonies span').textContent.match(/\d+/g)[0];
this.account.planetMax = document.querySelector('#countColonies span').textContent.match(/\d+/g)[1];
this.account.class = document.querySelector('#characterclass .sprite').classList.contains('miner') ? 1 : document.querySelector('#characterclass .sprite').classList.contains('warrior') ? 2 : 3;
this.account.totalResources = [0, 0, 0];
this.account.totalProd = [0, 0, 0];
// universe data
this.universe = {};
this.universe.ecoSpeed = document.querySelector('head meta[name="ogame-universe-speed"]').getAttribute('content');
this.universe.fleetSpeed = (document.querySelector('head meta[name="ogame-universe-speed-fleet-holding"]') || document.querySelector('head meta[name="ogame-universe-speed-fleet"]')).getAttribute('content');
this.universe.name = document.querySelector('head meta[name="ogame-universe-name"]').getAttribute('content');
this.universe.number = window.location.host.replace(/\D/g, '');
this.universe.lang = document.querySelector('head meta[name="ogame-language"]').getAttribute('content');
// current planet data
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.metal = Math.floor(resourcesBar.resources.metal.amount);
this.current.crystal = Math.floor(resourcesBar.resources.crystal.amount);
this.current.deut = Math.floor(resourcesBar.resources.deuterium.amount);
this.current.energy = Math.floor(resourcesBar.resources.energy.amount);
this.next = {};
this.next.smallplanet = this.current.smallplanet.nextElementSibling || document.querySelectorAll('.smallplanet')[0];
this.prev = {};
this.prev.smallplanet = this.current.smallplanet.previousElementSibling || document.querySelectorAll('.smallplanet')[document.querySelectorAll('.smallplanet').length - 1];
if (document.querySelector('.moonlink')) {
if (document.querySelectorAll('.moonlink').length > 1) {
this.next.smallplanetWithMoon = this.next.smallplanet;
if (!this.next.smallplanetWithMoon.querySelector('.moonlink')) {
do this.next.smallplanetWithMoon = this.next.smallplanetWithMoon.nextElementSibling || document.querySelectorAll('.moonlink')[0].parentNode;
while (!this.next.smallplanetWithMoon.querySelector('.moonlink'));
}
this.prev.smallplanetWithMoon = this.prev.smallplanet;
if (!this.prev.smallplanetWithMoon.querySelector('.moonlink')) {
do this.prev.smallplanetWithMoon = this.prev.smallplanetWithMoon.previousElementSibling || document.querySelectorAll('.moonlink')[document.querySelectorAll('.moonlink').length - 1].parentNode;
while (!this.prev.smallplanetWithMoon.querySelector('.moonlink'));
}
}
else {
this.next.smallplanetWithMoon = this.current.smallplanet;
this.prev.smallplanetWithMoon = this.current.smallplanet;
}
}
document.querySelector('#pageContent').appendChild(Util.createDom('div', {
'class': 'ogl_universeName'
}, `${this.universe.name}.${this.universe.lang}<div>x${this.universe.ecoSpeed} x${this.universe.fleetSpeed}</div>`));
// ogl database
this.DBName = `ogl_test_${this.universe.number}-${this.universe.lang}_${this.account.id}`;
this.db = JSON.parse(GM_getValue(this.DBName) || '{}');
this.db.players = this.db.players || [];
this.db.positions = this.db.positions || [];
this.db.stats = this.db.stats || {
total: {}
};
this.db.loca = this.db.loca || {};
this.db.ships = this.db.ships || {};
this.db.me = this.db.me || {};
this.db.me.techs = this.db.me.techs || {};
this.db.me.planets = this.db.me.planets || {};
this.db.myActivities = this.db.myActivities || {};
this.db.pinnedList = this.db.pinnedList || [];
this.db.spyProbesCount = this.db.spyProbesCount || 6;
this.db.topScore = this.db.topScore || [0, 0];
if (!this.db.ships?.[202] && this.page != 'fleetdispatch') {
window.location.href = `${window.location.protocol}//${window.location.host}/game/index.php?page=ingame&component=fleetdispatch`;
}
this.db.options = this.db.options || {};
this.db.options.rval = this.db.options.rval || 300000 * this.universe.ecoSpeed;
this.db.options.defaultShip = this.db.options.defaultShip || 202;
this.db.options.defaultMission = this.db.options.defaultMission || 3;
this.db.options.resSaver = this.db.options.resSaver || [0, 0, 0];
this.db.options.spyFilter = this.db.options.spyFilter || '$';
this.db.options.togglesOff = this.db.options.togglesOff || ['autoclean'];
this.db.options.excludedColors = this.db.options.excludedColors || [];
this.db.options.targetFilter = this.db.options.targetFilter || [];
this.db.options.dateFilter = this.db.options.dateFilter || 7;
this.checkTopScore();
this.betterInputs();
// ogl components
this.component = {};
this.component.lang = new LangManager(this);
this.component.crawler = new CrawlerManager(this);
this.component.galaxy = new GalaxyManager(this);
this.component.highscore = new HighscoreManager(this);
this.component.fleet = new FleetManager(this);
this.component.tooltip = new TooltipManager(this);
this.component.color = new ColorManager(this);
this.component.time = new TimeManager(this);
this.component.empire = new EmpireManager(this);
this.component.message = new MessageManager(this);
this.component.keyboard = new KeyboardManager(this);
this.component.sidebar = new SidebarManager(this);
this.component.menu = new MenuManager(this);
this.component.popup = new PopupManager(this);
this.component.jumpgate = new JumpgateManager(this);
if (!this.db.dataFormat || this.db.dataFormat < 4) {
let oldDB = JSON.parse(localStorage.getItem('ogl_redata') || '{}');
if (oldDB.stalkList) {
for (let v of Object.values(oldDB.stalkList)) {
let newObj = {};
newObj.id = v.id
newObj.playerID = v.player;
newObj.coords = v.coords;
newObj.rawCoords = v.coords.split(':').map(x => x.padStart(3, '0')).join('');
newObj.moonID = v.moonID || -1;
newObj.color = v.color || fleetDispatcherResources;
let entryID = this.find(this.db.positions, 'coords', v.coords)[0] ?? this.db.positions.length;
this.db.positions[entryID] = {
...this.db.positions[entryID],
...newObj
};
}
}
this.db.dataFormat = 4;
}
this.save();
}
find(table, key, value) {
let result = [];
table.filter(e => e[key].toString().toUpperCase() == value.toString().toUpperCase()).sort((a, b) => a.rawCoords - b.rawCoords).forEach(entry => result.push(table.indexOf(entry).toString()));
return result;
}
findTargets(table, key, min, max) {
let result = [];
table.filter(e => e.color && e.color != 'none' && parseInt(e[key]) >= parseInt(min) && parseInt(e[key]) <= parseInt(max) && this.db.options.excludedColors.indexOf(e.color) == -1).sort((a, b) => a.rawCoords - b.rawCoords).forEach(entry => result.push(table.indexOf(entry).toString()));
//table.filter(e => e.color && e.color != 'none' && this.db.options.excludedColors.indexOf(e.color) == -1).sort((a, b) => a.rawCoords - b.rawCoords).forEach(entry => result.push(table.indexOf(entry).toString()));
return result;
}
observeMutation(callback, id) {
this.observerQueue[id] = callback;
}
addToUpdateQueue(callback) {
this.updateQueue.push(callback);
}
async loop() {
setInterval(() => this.updateQueue.forEach(callback => callback()), 180);
}
sleep() {
return new Promise(resolve => setTimeout(resolve, 180));
}
betterInputs() {
setInterval(() => {
document.querySelectorAll('.ogl_input').forEach(input => {
if (input.value) {
let newValue = parseInt(input.value.toLowerCase().replace(/[\,\. ]/g, '').replace('g', '000000000').replace('m', '000000').replace('k', '000'));
input.value = isNaN(newValue) || newValue <= 0 ? 0 : newValue.toLocaleString('de-DE');
}
});
}, 75);
}
save(data) {
GM_setValue(this.DBName, JSON.stringify(data || this.db));
}
checkTopScore() {
if (this.db.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');
this.db.topScore = [parseInt(xmlResult.querySelector('topScore').innerHTML), Date.now()];
this.save();
});
}
}
}
class CrawlerManager {
constructor(ogl) {
this.ogl = ogl;
if (this.ogl.page == 'highscore') this.init();
this.ogl.observeMutation(() => {
this.init();
}, 'crawler');
Util.getJSON(`${window.location.protocol}//${window.location.host}/game/index.php?page=fetchTechs`, result => {
this.ogl.current.techs = result;
let coords = this.ogl.current.coords.join(':');
if (this.ogl.current.type == 'moon') coords += ':M';
this.ogl.db.me.planets[coords] = this.ogl.db.me.planets[coords] || {};
this.ogl.db.me.planets[coords].techs = this.ogl.current.techs;
this.ogl.save();
});
if (this.ogl.current.type == 'planet') this.getPlanetProduction();
}
init() {
if (this.ogl.page == 'highscore') {
let rankPoint = document.querySelector('a#points').classList.contains('active');
let rankFleet = document.querySelector('a#fleet').classList.contains('active');
if (document.querySelector('#stat_list_content .ajaxLoad') ||
!document.querySelector('#row #player').classList.contains('active')) return;
// update player data
document.querySelectorAll('#ranks tbody > tr').forEach(line => {
let player = {};
player.id = line.getAttribute('id').replace('position', '');
player.name = line.querySelector('.playername').textContent.trim();
player.ally = line.querySelector('.ally-tag')?.textContent.trim().slice(1, -1);
player.lastUpdate = Date.now();
if (rankPoint) {
player.rank = line.querySelector('.position').textContent.trim();
player.total = parseInt(line.querySelector('.score').textContent.replace(/\D/g, ''));
}
else if (rankFleet) {
player.power = parseInt(line.querySelector('.score').textContent.replace(/\D/g, ''));
}
if (!player.id) return;
let entryID = this.ogl.find(this.ogl.db.players, 'id', player.id)[0] ?? this.ogl.db.players.length;
this.ogl.db.players[entryID] = {
...this.ogl.db.players[entryID],
...player
};
if (this.ogl.db.players?.[entryID]?.status) {
let status = Array.from(this.ogl.db.players[entryID].status.split(' ')).filter(e => e.startsWith('status_'))[0];
line.querySelector('.playername').classList.add(status);
line.querySelector('.score').classList.add(status);
}
line.querySelector('.playername').classList.remove('status_abbr_honorableTarget');
});
// add player status
Util.getXML(`${window.location.protocol}//${window.location.host}/api/players.xml`, result => {
document.querySelectorAll('#ranks tbody > tr').forEach(line => {
let id = line.getAttribute('id').replace('position', '');
let playerStatus = result.querySelector(`player[id="${id}"]`)?.getAttribute('status') || 'status_abbr_active';
let xmlTimestamp = parseInt(result.querySelector('players').getAttribute('timestamp')) * 1000;
if (playerStatus.indexOf('v') > -1 && playerStatus != 'status_abbr_active') playerStatus = 'status_abbr_vacation';
else if (playerStatus === "I") playerStatus = 'status_abbr_longinactive';
else if (playerStatus === "i") playerStatus = 'status_abbr_inactive';
let entryID = this.ogl.find(this.ogl.db.players, 'id', id)[0] ?? this.ogl.db.players.length;
let player = this.ogl.db.players[entryID];
if (player && (player.lastStatusUpdate ?? 0) < xmlTimestamp) {
line.querySelector('.playername').classList.remove(Array.from(line.querySelector('.playername').classList).filter(e => e.startsWith('status_'))[0]);
line.querySelector('.score').classList.remove(Array.from(line.querySelector('.score').classList).filter(e => e.startsWith('status_'))[0]);
this.ogl.db.players[entryID].status = playerStatus;
line.querySelector('.playername').classList.add(playerStatus);
line.querySelector('.score').classList.add(playerStatus);
}
});
this.ogl.save();
});
this.ogl.save();
}
else if (this.ogl.page == 'galaxy') {
// store spy probes to send
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.db.spyProbesCount = ships[5];
this.spyProbeCountDone = true;
this.ogl.save();
}
}
if (this.ogl.galaxyCoords[0] != galaxy || this.ogl.galaxyCoords[1] != system) return;
if (document.querySelector('#galaxy_input').value != galaxy || document.querySelector('#system_input').value != system) return;
this.ogl.component.tooltip.close(true);
let ptreJSON = {};
document.querySelectorAll('.galaxyTable .ctContentRow').forEach(line => {
if (!line.querySelector('.cellPosition')) return; // ignore p16 & 17
if (line.querySelector('.cellPlayerName.admin')) return; // ignore admins
// update player data
let player = {};
player.id = line.querySelector('.cellPlayerName').textContent.trim().length == 0 ? -1 : line.querySelector('.cellPlayerName [rel^="player"]')?.getAttribute('rel').replace('player', '') || this.ogl.account.id;
player.name = line.querySelector('.cellPlayerName [rel^="player"]')?.childNodes[0].textContent.trim() || line.querySelector('.cellPlayerName .ownPlayerRow')?.textContent.trim();
player.status = Array.from(line.querySelector('.cellPlayerName span[class*="status_"]')?.classList || []).filter(e => e.startsWith('status_'))[0];
player.lastUpdate = Date.now();
player.lastStatusUpdate = Date.now();
if (player.status == 'status_abbr_honorableTarget') player.status = 'status_abbr_active';
let tooltip = document.querySelector('#player' + player.id);
if (tooltip) {
player.name = tooltip.querySelector('h1 span').textContent;
player.rank = tooltip.querySelector('.rank a')?.textContent || -1;
}
else if (player.id) {
player.rank = this.ogl.account.rank;
}
if (player.id) {
let playerEntryID = this.ogl.find(this.ogl.db.players, 'id', player.id)[0] ?? this.ogl.db.players.length;
this.ogl.db.players[playerEntryID] = {
...this.ogl.db.players[playerEntryID],
...player
};
}
let position = parseInt(line.querySelector('.cellPosition').textContent);
let coords = `${galaxy}:${system}:${position}`;
// update position
let planet = {};
planet.id = line.querySelector('[data-planet-id]')?.getAttribute('data-planet-id') || -1;
planet.playerID = line.querySelector('.cellPlayerName').textContent.trim().length == 0 ? -1 : line.querySelector(`.cellPlayerName [rel^="player"]`)?.getAttribute('rel').replace('player', '') || this.ogl.account.id;
planet.coords = coords;
planet.rawCoords = coords.split(':').map(x => x.padStart(3, '0')).join('');
planet.moonID = line.querySelector('[data-moon-id]')?.getAttribute('data-moon-id') || -1;
planet.lastUpdate = Date.now();
planet.activity = line.querySelector('[data-planet-id] .activity.minute15') ? '*' : line.querySelector('[data-planet-id] .activity')?.textContent.trim() || 60;
planet.moonActivity = line.querySelector('[data-moon-id] .activity.minute15') ? '*' : line.querySelector('[data-moon-id] .activity')?.textContent.trim() || 60;
/*let planetEntryID = planet.id < 0 ? this.ogl.db.positions.length : (this.ogl.find(this.ogl.db.positions, 'id', planet.id)[0] || this.ogl.db.positions.length);
this.ogl.db.positions[planetEntryID] = {...this.ogl.db.positions[planetEntryID], ...planet};*/
let planetIndex = this.ogl.find(this.ogl.db.positions, 'coords', planet.coords)[0] || this.ogl.db.positions.length;
if (this.ogl.db.positions[planetIndex]?.playerID != planet.playerID || planet.playerID == -1) {
planet.color = false;
}
this.ogl.db.positions[planetIndex] = {
...this.ogl.db.positions[planetIndex],
...planet
};
if (document.querySelector('.ogl_sideView.ogl_active') && this.ogl.db.sidebarView == 'pinned') this.ogl.component.sidebar?.displayPinnedTarget();
if (document.querySelector('.ogl_sideView.ogl_active') && this.ogl.db.sidebarView == 'targetList') {
document.querySelectorAll(`.ogl_sideView [data-playerID="${planet.playerID}"]`).forEach(e => {
e.querySelectorAll('div')[1].textContent = player.name;
e.querySelectorAll('div')[1].className = '';
e.querySelectorAll('div')[1].classList.add(player.status);
});
}
// if the player is pinned, send the activities to PTRE
if (ogl.db.pinnedList.indexOf(player.id) > -1 && this.ogl.ptre) {
if (this.ogl.ptre) {
ptreJSON[planet.coords] = {};
ptreJSON[planet.coords].id = planet.id;
ptreJSON[planet.coords].player_id = player.id;
ptreJSON[planet.coords].teamkey = this.ogl.ptre;
ptreJSON[planet.coords].mv = line.querySelector('span[class*="vacation"]') ? true : false;
ptreJSON[planet.coords].activity = planet.activity;
ptreJSON[planet.coords].galaxy = planet.coords.split(':')[0];
ptreJSON[planet.coords].system = planet.coords.split(':')[1];
ptreJSON[planet.coords].position = planet.coords.split(':')[2];
ptreJSON[planet.coords].main = planet.main || false;
if (planet.moonID > -1) {
ptreJSON[planet.coords].moon = {};
ptreJSON[planet.coords].moon.id = planet.moonID;
ptreJSON[planet.coords].moon.activity = planet.moonActivity;
}
}
}
});
if (Object.keys(ptreJSON).length > 0) {
async function fetchPTRE() {
let response = await fetch('https://ptre.chez.gg/scripts/oglight_import_player_activity.php', {
method: 'POST',
body: JSON.stringify(ptreJSON)
});
return await response.json();
}
fetchPTRE().then(response => {
if (response.code == 1) {
document.querySelectorAll(`.ogl_pinnedContent [data-coords^="${galaxy}:${system}:"]`).forEach(e => {
if (!e.querySelector('.ogl_checked')) e.appendChild(Util.createDom('div', {
'class': 'material-icons ogl_checked tooltipLeft',
'title': response.message
}, 'check_circle'));
});
}
});
}
this.ogl.save();
}
}
checkPlayerApi(id, callback) {
if (!id || id <= 0) return;
// update player data
Util.getXML(`${window.location.protocol}//${window.location.host}/api/playerData.xml?id=${id}`, result => {
let playerEntryID = this.ogl.find(this.ogl.db.players, 'id', id)[0] ?? this.ogl.db.players.length;
let player = {};
player.id = id;
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;
this.ogl.db.players[playerEntryID] = {
...this.ogl.db.players[playerEntryID],
...player
};
// update player positions
result.querySelectorAll('planet').forEach((apiPlanet, index) => {
let planet = {};
planet.id = apiPlanet.getAttribute('id');
planet.playerID = id;
planet.coords = apiPlanet.getAttribute('coords');
planet.rawCoords = apiPlanet.getAttribute('coords').split(':').map(x => x.padStart(3, '0')).join('');
planet.moonID = apiPlanet.querySelector('moon')?.getAttribute('id') ?? -1;
planet.main = !index;
planet.lastUpdate = parseInt(result.querySelector('playerData').getAttribute('timestamp')) * 1000;
let planetEntryID = this.ogl.find(this.ogl.db.positions, 'coords', planet.coords)[0] ?? this.ogl.db.positions.length;
this.ogl.db.positions[planetEntryID] = this.ogl.db.positions[planetEntryID] || {};
if (!this.ogl.db.positions[planetEntryID].lastUpdate || this.ogl.db.positions[planetEntryID].lastUpdate < planet.lastUpdate) {
this.ogl.db.positions[planetEntryID] = {
...this.ogl.db.positions[planetEntryID],
...planet
};
}
if (planet.main) this.ogl.db.positions[planetEntryID].main = true;
else this.ogl.db.positions[planetEntryID].main = false;
});
if (callback) callback(this.ogl.db.players[playerEntryID]);
this.ogl.save();
});
}
buildStalkWindow(player) {
let content = Util.createDom('div', {
'class': 'galaxyTooltip'
});
content.innerHTML =
`<h1><span>${player.name}</span><a href="${window.location.protocol}//${window.location.host}/game/index.php?page=highscore&site=${Math.max(1, Math.ceil(player.rank / 100))}&category=1&searchRelId=${player.id}" data-rank="${player.rank == -1 ? '(b)' : player.rank}" class="ogl_ranking">${player.rank == -1 ? '(b)' : '#'+player.rank}</a></h1>
<div class="ogl_actions"></div>
<div class="ogl_colorAll"></div>
<div class="ogl_stalkActions"></div>
<div class="ogl_stalkInfo">
<div class="ogl_stalkPlanets"></div>
<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>`;
let actions = content.querySelector('.ogl_stalkActions');
let write = actions.appendChild(Util.createDom('div', {
'class': 'ogl_button material-icons',
'data-playerid': player.id
}, 'edit'));
if (document.querySelector('#chatBar')) {
write.classList.add('sendMail');
write.classList.add('js_openChat');
}
else write.addEventListener('click', () => window.location.href = `${window.location.protocol}//${window.location.host}/game/index.php?page=chat&playerId=${player.id}`);
let buddy = actions.appendChild(Util.createDom('adiv', {
'class': 'ogl_button material-icons'
}, 'person_add_alt_1'));
buddy.addEventListener('click', () => {
window.location.href = `${window.location.protocol}//${window.location.host}/game/index.php?page=ingame&component=buddies&action=7&id=${player.id}&ajax=1`;
});
let mmorpgstats = actions.appendChild(Util.createDom('adiv', {
'class': 'ogl_button material-icons'
}, 'leaderboard'));
mmorpgstats.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.universe.lang);
let link = `https://www.mmorpg-stat.eu/0_fiche_joueur.php?pays=${lang}&ftr=${player.id.replace(/\D/g,'')}.dat&univers=_${this.ogl.universe.number}`;
window.open(link, '_blank');
});
let pin = actions.appendChild(Util.createDom('div', {
'class': 'ogl_button material-icons'
}, 'push_pin'));
pin.addEventListener('click', () => {
this.ogl.db.pinnedList.forEach((e, index) => {
if (e && e == player.id) this.ogl.db.pinnedList.splice(index, 1);
});
this.ogl.db.pinnedList.unshift(player.id);
if (this.ogl.db.pinnedList.length > 10) this.ogl.db.pinnedList.length = 10;
this.ogl.save();
this.ogl.component.sidebar.displayPinnedTarget();
});
this.ogl.component.color.addColorUI(false, content.querySelector('.ogl_colorAll'), this.ogl.find(this.ogl.db.positions, 'playerID', player.id));
let planetCount = 0;
let rawStart = '000000';
let multi = 1;
let isMulti = false;
this.ogl.find(this.ogl.db.positions, 'playerID', player.id).forEach(planetIndex => {
let planet = this.ogl.db.positions[planetIndex];
let splitted = planet.coords.split(':');
let item = Util.createDom('div', {
'data-coords': planet.coords
});
let coordsDiv = item.appendChild(Util.createDom('span', {}, planet.coords));
coordsDiv.addEventListener('click', () => {
this.ogl.component.tooltip.close(true);
this.ogl.component.galaxy.goToPosition(splitted[0], splitted[1], splitted[2]);
});
if (planet.main) item.appendChild(Util.createDom('div', {
'class': 'material-icons ogl_mainPlanet'
}, 'star'));
let mSpy = item.appendChild(Util.createDom('div', {
'class': 'ogl_moonIcon material-icons',
'data-type': 3
}, 'brightness_2'));
mSpy.addEventListener('click', () => this.ogl.component.fleet.sendSpyProbe([splitted[0], splitted[1], splitted[2], 3], this.ogl.db.spyProbesCount, mSpy, true));
if (Date.now() - planet.lastMoonSpy < 60 * 60 * 1000) mSpy.classList.add('ogl_done');
let pSpy = item.appendChild(Util.createDom('div', {
'class': 'ogl_planetIcon material-icons',
'data-type': 1
}, 'language'));
pSpy.addEventListener('click', () => this.ogl.component.fleet.sendSpyProbe([splitted[0], splitted[1], splitted[2], 1], this.ogl.db.spyProbesCount, pSpy, true));
if (Date.now() - planet.lastSpy < 60 * 60 * 1000) pSpy.classList.add('ogl_done');
if (planet.moonID > 0) mSpy.classList.add('ogl_active');
planet.color ? item.setAttribute('data-color', planet.color) : item.removeAttribute('data-color');
content.querySelector('.ogl_stalkPlanets').appendChild(item);
if (rawStart == planet.rawCoords.slice(0, -3)) {
item.setAttribute('data-multi', multi);
isMulti = true;
}
else if (isMulti) {
multi++;
isMulti = false;
}
rawStart = planet.rawCoords.slice(0, -3);
planetCount++;
});
content.querySelector('.ogl_stalkPoints').appendChild(Util.createDom('div', {}, `<i class="material-icons">language</i>${planetCount}`));
return content;
}
getPlanetProduction() {
let currentCoords = this.ogl.current.coords.join(':');
['metal', 'crystal', 'deut'].forEach((res, index) => {
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.db.me.planets[currentCoords] = this.ogl.db.me.planets[currentCoords] || {};
this.ogl.db.me.planets[currentCoords].production = this.ogl.db.me.planets[currentCoords].production || [];
this.ogl.db.me.planets[currentCoords].storage = this.ogl.db.me.planets[currentCoords].storage || [];
if (data.indexOf('overmark') == -1) {
this.ogl.db.me.planets[currentCoords].production[index] = (prod / 3600).toFixed(2);
}
this.ogl.db.me.planets[currentCoords].storage[index] = resourcesBar.resources[res.replace('deut', 'deuterium')].storage;
this.ogl.db.me.planets[currentCoords].production[3] = Date.now();
});
this.ogl.save();
}
}
class HighscoreManager {
constructor(ogl) {
this.ogl = ogl;
if (this.ogl.page == 'highscore') this.init();
this.ogl.observeMutation(() => this.init(), 'highscore');
}
init() {
document.querySelectorAll('#ranks tbody tr').forEach(line => {
line.querySelector('.playername').classList.add('tooltipRight');
line.querySelector('.playername').classList.add('tooltipClose');
line.querySelector('.playername').setAttribute('data-title', 'loading...');
line.querySelector('.playername').addEventListener('mouseenter', e => {
let id = line.getAttribute('id').replace('position', '');
if (e.target.classList.contains('ogl_highlight')) return;
this.ogl.component.crawler.checkPlayerApi(id, player => {
this.ogl.component.tooltip.open(e.target, false, false, this.ogl.component.crawler.buildStalkWindow(player));
});
});
});
}
}
class GalaxyManager {
constructor(ogl) {
this.ogl = ogl;
if (this.ogl.page == 'galaxy') this.init();
this.ogl.observeMutation(() => this.init(), 'galaxy');
}
init() {
document.querySelectorAll('.galaxyTable .ctContentRow').forEach(line => {
line.removeAttribute('data-color');
line.querySelector('.cellPlayerName').classList.remove('tooltipRel');
line.querySelector('.cellDebris').classList.remove('ogl_active');
if (!line.querySelector('.cellPosition')) return; // ignore p16 & 17
if (line.querySelector('.cellPlayerName.admin')) return; // ignore admins
let id;
if (line.querySelector('.ownPlayerRow')) id = this.ogl.account.id;
else id = line.querySelector('.cellPlayerName [rel^="player"]')?.getAttribute('rel').replace('player', '');
if (id) {
let position = line.querySelector('.cellPosition').textContent;
if (position >= 10) line.querySelector('.cellPlayerName > span[class*="status_"]').classList.add('tooltipRightTop');
else line.querySelector('.cellPlayerName > span[class*="status_"]').classList.add('tooltipRight');
line.querySelector('.cellPlayerName > span[class*="status_"]').classList.add('ogl_noPointer');
line.querySelector('.cellPlayerName > span[class*="status_"]').classList.add('tooltipClose');
line.querySelector('.cellPlayerName > span[class*="status_"]').setAttribute('data-title', 'loading...');
line.querySelector('.cellPlayerName > span[class*="status_"]').classList.remove('ogl_noPointer');
let player = this.ogl.db.players[this.ogl.find(this.ogl.db.players, 'id', id)[0]];
if (!player) return;
let a = Util.createDom('a', {
'class': 'float_right',
'href': `${window.location.protocol}//${window.location.host}/game/index.php?page=highscore&site=${Math.max(1, Math.ceil(player.rank / 100))}&category=1&searchRelId=${player.id}`
}, `${player.rank == -1 ? '(b)' : '#'+player.rank}`);
line.querySelector('.cellPlayerName').appendChild(a);
line.querySelector('.cellPlayerName > span[class*="status_"]').addEventListener('mouseenter', e => {
if (e.target.classList.contains('ogl_highlight')) return;
this.ogl.component.crawler.checkPlayerApi(id, player => {
this.ogl.component.tooltip.open(e.target, false, false, this.ogl.component.crawler.buildStalkWindow(player));
});
});
// pin target
line.querySelector('.cellPlayerName > span[class*="status_"]').addEventListener('click', () => {
this.ogl.db.pinnedList.forEach((e, index) => {
if (e && e == player.id) this.ogl.db.pinnedList.splice(index, 1);
});
this.ogl.db.pinnedList.unshift(player.id);
if (this.ogl.db.pinnedList.length > 20) this.ogl.db.pinnedList.length = 20;
this.ogl.save();
this.ogl.component.sidebar.displayPinnedTarget();
});
let planetID = line.querySelector('[data-planet-id]').getAttribute('data-planet-id');
let index = this.ogl.find(this.ogl.db.positions, 'id', planetID);
line.setAttribute('data-color', this.ogl.db.positions[index[0]]?.color);
let button = line.querySelector('.cellPlanetName').appendChild(Util.createDom('div', {
'class': 'ogl_colorButton tooltipClose',
'data-color': this.ogl.db.positions[index[0]]?.color
}));
button.addEventListener('click', event => {
let content = Util.createDom('div', {
'class': 'ogl_colorAll ogl_tooltipColor'
});
this.ogl.component.color.addColorUI(button, content, index, event);
this.ogl.component.tooltip.open(button, false, false, content);
});
}
if (line.querySelector('.microdebris')) {
let element = line.querySelector('.microdebris');
let id = '#' + element.getAttribute('rel');
let total = 0;
document.querySelector(id).querySelectorAll('.debris-content').forEach(resources => {
let value = Util.formatFromUnits(resources.innerText.replace(/(\D*)/, ''));
element.innerHTML += Util.formatToUnits(parseInt(value), 1) + '<br>';
total += parseInt(value);
});
if (total >= this.ogl.db.options.rval) element.closest('.cellDebris').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>
`;
});
});
}
goToPosition(galaxy, system, position) {
if (this.ogl.page == 'galaxy') {
this.ogl.component.tooltip.container.textContent = '';
this.ogl.component.tooltip.close(true);
document.querySelector('#galaxy_input').value = galaxy;
document.querySelector('#system_input').value = system;
submitForm();
}
else {
window.location.href = `${window.location.protocol}//${window.location.host}/game/index.php?page=ingame&component=galaxy&galaxy=${galaxy}&system=${system}&position=${position}`;
}
}
}
class MenuManager {
constructor(ogl) {
this.ogl = ogl;
this.init();
}
init() {
document.querySelector('#countColonies .ogl_menuOptions')?.remove();
document.querySelector('#countColonies .ogl_panel')?.remove();
this.mainDom = document.querySelector('#countColonies').appendChild(Util.createDom('div', {
'class': 'ogl_menuOptions'
}));
this.subDom = document.querySelector('#countColonies').appendChild(Util.createDom('div', {
'class': 'ogl_panel'
}));
// main buttons
this.addOptions();
this.addShips();
this.addMissions();
this.addHarvest();
// sub buttons
this.addSubEco();
this.addSubProd();
this.addSubPins();
this.addSubTargets();
}
addOptions() {
let button = this.mainDom.appendChild(Util.createDom('div', {
'class': 'material-icons ogl_manageData ogl_button tooltip'
}, 'settings'));
button.addEventListener('click', () => {
this.ogl.component.popup.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.lang.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_input'
}));
rvalInput.value = this.ogl.db.options.rval;
let ptre = container.appendChild(Util.createDom('div', {}, '<span><a href="https://ptre.chez.gg/" target="_blank">PTRE</a> Teamkey</span>'));
let ptreInput = ptre.appendChild(Util.createDom('input', {
'type': 'password'
}));
if (this.ogl.ptre) ptreInput.value = this.ogl.ptre;
ptreInput.addEventListener('focus', () => ptreInput.setAttribute('type', 'text'));
ptreInput.addEventListener('blur', () => ptreInput.setAttribute('type', 'password'));
this.ogl.component.popup.open(globalContainer);
container.appendChild(Util.createDom('h2', {}, 'Interface'));
let minifyPictures = container.appendChild(Util.createDom('div', {}, `<span>${this.ogl.component.lang.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.lang.getText('displayTimers')}</span>`));
timers.appendChild(Util.createDom('div', {
'class': 'ogl_confToggle ogl_active',
'data-conf': 'timers'
}));
let fleetDetailsName = container.appendChild(Util.createDom('div', {}, `<span>${this.ogl.component.lang.getText('fleetDetailsName')}</span>`));
fleetDetailsName.appendChild(Util.createDom('div', {
'class': 'ogl_confToggle ogl_active',
'data-conf': 'fleetDetailsName'
}));
let rightMenuTooltips = container.appendChild(Util.createDom('div', {}, `<span>${this.ogl.component.lang.getText('rightMenuTooltips')}</span>`));
rightMenuTooltips.appendChild(Util.createDom('div', {
'class': 'ogl_confToggle ogl_active',
'data-conf': 'rightMenuTooltips'
}));
container.appendChild(Util.createDom('h2', {}, 'Attacks & stats'));
let stats = container.appendChild(Util.createDom('div', {}, `<span>${this.ogl.component.lang.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.lang.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.lang.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.lang.getText('autoClean')}</span>`));
autoclean.appendChild(Util.createDom('div', {
'class': 'ogl_confToggle ogl_active',
'data-conf': 'autoclean'
}));
container.appendChild(Util.createDom('h2', {}, 'Data'));
let data;
let dataDiv = container.appendChild(Util.createDom('div', {
'class': 'ogl_manageData'
}));
let resetButton = dataDiv.appendChild(Util.createDom('a', {
'class': 'ogl_button'
}, 'RESET'));
resetButton.addEventListener('click', () => {
if (confirm('Do you really want to reset your data ?')) {
this.ogl.save({});
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;
let parsed = JSON.parse(reader.result);
if (parsed.dataFormat == 4) {
this.ogl.save(parsed);
document.location.reload();
}
else alert("Wrong data format");
};
reader.readAsText(file);
});
let exportButton = dataDiv.appendChild(Util.createDom('a', {
'class': 'ogl_button',
'download': `ogl_${this.ogl.universe.name}_${this.ogl.universe.lang}_${Date.now()}.txt`
}, 'EXPORT'));
exportButton.href = URL.createObjectURL(new Blob([JSON.stringify(this.ogl.db)], {
type: 'application/json'
}));
let saveButton = dataDiv.appendChild(Util.createDom('a', {
'class': 'ogl_button'
}, 'SAVE'));
saveButton.addEventListener('click', () => {
this.ogl.db.options.rval = Util.formatFromUnits(rvalInput.value || '0');
ptreInput.value ? localStorage.setItem('ogl-ptreTK', ptreInput.value) : localStorage.removeItem('ogl-ptreTK');
this.ogl.save();
document.location.reload();
});
container.querySelectorAll('.ogl_confToggle[data-conf]').forEach(button => {
let id = button.getAttribute('data-conf');
if (this.ogl.db.options.togglesOff.indexOf(id) > -1) button.classList.remove('ogl_active');
button.addEventListener('click', () => {
let index = this.ogl.db.options.togglesOff.indexOf(id);
index > -1 ? this.ogl.db.options.togglesOff.splice(index, 1) : this.ogl.db.options.togglesOff.push(id);
button.classList.toggle('ogl_active');
});
});
});
}
addShips() {
let button = this.mainDom.appendChild(Util.createDom('div', {
'class': 'ogl_shipPicker ogl_button tooltipLeft tooltipClose'
}, this.ogl.component.lang.getText('abbr' + this.ogl.db.options.defaultShip)));
button.addEventListener('click', () => {
let cargoChoice = Util.createDom('div', {
'id': 'ogl_defaultShipPicker',
'class': 'ogl_shipList'
});
this.ogl.component.fleet.defaultShipsList.forEach(shipID => {
let cargoType = cargoChoice.appendChild(Util.createDom('div', {
'class': 'ogl_shipIcon ogl_' + shipID
}));
cargoType.addEventListener('click', () => {
this.ogl.db.options.defaultShip = shipID;
this.ogl.save();
document.location.reload();
});
});
this.ogl.component.tooltip.open(button, false, false, cargoChoice);
});
}
addMissions() {
let mission = this.ogl.db.options.defaultMission;
this.mainDom.appendChild(Util.createDom('div', {
'class': `material-icons ogl_missionPicker${this.ogl.db.options.defaultMission} ogl_button tooltip`
}, this.ogl.db.options.defaultMission == 4 ? 'keyboard_tab' : 'swap_horiz'))
.addEventListener('click', () => {
this.ogl.db.options.defaultMission = this.ogl.db.options.defaultMission == 4 ? 3 : 4;
this.ogl.save();
window.location.href = window.location.href.replace(`&mission=${mission}`, `&mission=${this.ogl.db.options.defaultMission}`);
this.init();
});
}
addHarvest() {
let button = this.mainDom.appendChild(Util.createDom('div', {
'class': 'material-icons ogl_harvest ogl_button tooltip'
}, 'all_inclusive'));
let linkedButton = Util.createDom('div', {
'class': 'ogl_linkedHarvest ogl_button'
}, this.ogl.current.type == 'moon' ? this.ogl.component.lang.getText('linkedPlanets') : this.ogl.component.lang.getText('linkedMoons'));
button.addEventListener('click', () => {
(document.querySelector('#myPlanets') || document.querySelector('#myWorlds')).classList.toggle('ogl_shortcuts');
button.classList.toggle('ogl_active');
document.querySelectorAll('.smallplanet > a').forEach(planet => {
if (planet.closest('.ogl_shortcuts')) {
planet.addEventListener('click', event => {
event.preventDefault();
this.ogl.db.collectSource = [...this.ogl.current.coords, ...[this.ogl.current.type == 'planet' ? '1' : '3']];
this.ogl.db.collectDestination = planet.closest('.smallplanet').querySelector('.planet-koords').textContent.slice(1, -1).split(':');
planet.classList.contains('moonlink') ? this.ogl.db.collectDestination.push('3') : this.ogl.db.collectDestination.push('1');
this.ogl.save();
window.location.href = `${window.location.protocol}//${window.location.host}/game/index.php?page=ingame&component=fleetdispatch&ogl_mode=1&galaxy=${this.ogl.db.collectDestination[0]}&system=${this.ogl.db.collectDestination[1]}&position=${this.ogl.db.collectDestination[2]}&type=${this.ogl.db.collectDestination[3]}&mission=${this.ogl.db.options.defaultMission}`;
});
}
});
linkedButton.classList.toggle('ogl_active');
});
if (this.ogl.page == 'fleetdispatch' && (this.ogl.mode == 1 || this.ogl.mode == 4)) {
button.classList.add('ogl_active');
}
document.querySelector('#planetList').prepend(linkedButton);
linkedButton.addEventListener('click', () => {
if (this.ogl.current.smallplanet.querySelector('.moonlink')) {
this.ogl.db.collectSource = [...this.ogl.current.coords, ...[this.ogl.current.type == 'planet' ? '1' : '3']];
this.ogl.save();
window.location.href = `${window.location.protocol}//${window.location.host}/game/index.php?page=ingame&component=fleetdispatch&ogl_mode=4&type=${this.ogl.current.type == 'planet' ? '1' : '3'}&mission=${this.ogl.db.options.defaultMission}`;
}
else {
this.ogl.db.collectSource = [...this.ogl.next.smallplanetWithMoon.querySelector('.planet-koords').textContent.slice(1, -1).split(':'), ...[this.ogl.current.type == 'planet' ? '3' : '1']];
this.ogl.save();
let cp = this.ogl.current.type == 'planet' ? new URL(this.ogl.next.smallplanetWithMoon.querySelector('a.planetlink').href).searchParams.get('cp') : new URL(this.ogl.next.smallplanetWithMoon.querySelector('a.moonlink').href).searchParams.get('cp');
window.location.href = `${window.location.protocol}//${window.location.host}/game/index.php?page=ingame&component=fleetdispatch&ogl_mode=4&cp=${cp}&type=${this.ogl.current.type == 'planet' ? '3' : '1'}&mission=${this.ogl.db.options.defaultMission}`;
}
});
}
addSubEco() {
let button = this.subDom.appendChild(Util.createDom('div', {
'class': 'material-icons tooltip ogl_button',
'title': this.ogl.component.lang.getText('economyView')
}, 'account_balance'));
document.querySelectorAll('.planetlink, .moonlink').forEach(element => {
let coords = element.parentNode.querySelector('.planet-koords').textContent.slice(1, -1);
if (element.classList.contains('moonlink')) coords += ':M';
let container = element.appendChild(Util.createDom('div', {
'class': 'ogl_stock'
}));
let deltaTime = Math.floor((Date.now() - this.ogl.db.me.planets[coords]?.production?.[3] || 0) / 1000);
['metal', 'crystal', 'deut'].forEach((res, index) => {
let oldValue = this.ogl.db.me.planets[coords]?.resources?.[res] || 0;
let storage = this.ogl.db.me.planets?.[coords]?.storage?.[index];
let prodSinceLastUpdate = (this.ogl.db.me.planets[coords]?.production?.[index] || 0) * deltaTime;
let newValue = Math.floor(oldValue + prodSinceLastUpdate);
let item = container.appendChild(Util.createDom('div', {
'class': `ogl_${res}`
}));
if (!element.classList.contains('moonlink') && storage) {
if (oldValue < storage && newValue >= storage) newValue = storage;
if (newValue >= storage) item.classList.add('ogl_full');
}
item.textContent = Util.formatToUnits(newValue);
item.setAttribute('data-value', newValue);
});
});
button.addEventListener('click', () => {
if ((document.querySelector('#myPlanets') || document.querySelector('#myWorlds')).getAttribute('data-panel')) {
(document.querySelector('#myPlanets') || document.querySelector('#myWorlds')).removeAttribute('data-panel');
this.ogl.db.menuView = false;
this.ogl.save();
}
else {
(document.querySelector('#myPlanets') || document.querySelector('#myWorlds')).setAttribute('data-panel', 'resources');
this.ogl.db.menuView = 'resources';
this.ogl.save();
}
});
if (this.ogl.db.menuView == 'resources')(document.querySelector('#myPlanets') || document.querySelector('#myWorlds')).setAttribute('data-panel', 'resources');
}
addSubProd() {
let button = this.subDom.appendChild(Util.createDom('div', {
'class': 'tooltip ogl_button',
'title': this.ogl.component.lang.getText('productionView')
}, 'ø'));
button.addEventListener('click', () => {
this.ogl.component.popup.load();
let container = Util.createDom('div', {
'class': 'ogl_mineContainer'
});
let sum = [0, 0, 0];
let sumProd = [0, 0, 0];
let count = 0;
container.appendChild(Util.createDom('span', {
'class': 'ogl_header'
}, ' '));
container.appendChild(Util.createDom('i', {
'class': 'ogl_centered ogl_header'
}, ' '));
let headerMetal = container.appendChild(Util.createDom('b', {
'class': 'ogl_metal ogl_header'
}));
let headerCrystal = container.appendChild(Util.createDom('b', {
'class': 'ogl_crystal ogl_header'
}));
let headerDeut = container.appendChild(Util.createDom('b', {
'class': 'ogl_deut ogl_header'
}));
document.querySelectorAll('.smallplanet').forEach(planet => {
let name = planet.querySelector('.planet-name').textContent;
let coords = planet.querySelector('.planet-koords').textContent.slice(1, -1);
if (this.ogl.db.me.planets[coords]) {
let newLine = container.appendChild(Util.createDom('span', {}, `[${coords}]`));
if (planet.getAttribute('data-multi')) newLine.setAttribute('data-multi', planet.getAttribute('data-multi'));
container.appendChild(Util.createDom('i', {}, name));
container.appendChild(Util.createDom('b', {
'class': 'ogl_metal'
}, (this.ogl.db.me.planets[coords]?.techs?.[1] || '?') + `<div>+${Util.formatToUnits(Math.round((this.ogl.db.me.planets[coords]?.production[0] || 0) * 60 * 60 * 24))}</div>`));
container.appendChild(Util.createDom('b', {
'class': 'ogl_crystal'
}, (this.ogl.db.me.planets[coords]?.techs?.[2] || '?') + `<div>+${Util.formatToUnits(Math.round((this.ogl.db.me.planets[coords]?.production[1] || 0) * 60 * 60 * 24))}</div>`));
container.appendChild(Util.createDom('b', {
'class': 'ogl_deut'
}, (this.ogl.db.me.planets[coords]?.techs?.[3] || '?') + `<div>+${Util.formatToUnits(Math.round((this.ogl.db.me.planets[coords]?.production[2] || 0) * 60 * 60 * 24))}</div>`));
sum = [sum[0] + parseInt(this.ogl.db.me.planets[coords]?.techs?.[1] || 0), sum[1] + parseInt(this.ogl.db.me.planets[coords]?.techs?.[2] || 0), sum[2] + parseInt(this.ogl.db.me.planets[coords]?.techs?.[3] || 0)];
sumProd = [sumProd[0] + (this.ogl.db.me.planets[coords]?.production[0] || 0) * 60 * 60 * 24, sumProd[1] + (this.ogl.db.me.planets[coords]?.production[1] || 0) * 60 * 60 * 24, sumProd[2] + (this.ogl.db.me.planets[coords]?.production[2] || 0) * 60 * 60 * 24];
count++;
}
});
headerMetal.innerHTML = 'ø ' + (sum[0] / count).toFixed(1) + `<div>+${Util.formatToUnits(Math.round(sumProd[0]), 0)}</div>`;
headerCrystal.innerHTML = 'ø ' + (sum[1] / count).toFixed(1) + `<div>+${Util.formatToUnits(Math.round(sumProd[1]), 0)}</div>`;
headerDeut.innerHTML = 'ø ' + (sum[2] / count).toFixed(1) + `<div>+${Util.formatToUnits(Math.round(sumProd[2]), 0)}</div>`;
this.ogl.component.popup.open(container);
});
}
addSubPins() {
let button = this.subDom.appendChild(Util.createDom('div', {
'class': 'material-icons tooltip ogl_button',
'title': this.ogl.component.lang.getText('pinnedView')
}, 'push_pin'));
button.addEventListener('click', () => this.ogl.component.sidebar?.displayPinnedList());
}
addSubTargets() {
let button = this.subDom.appendChild(Util.createDom('div', {
'class': 'material-icons tooltip ogl_button',
'title': this.ogl.component.lang.getText('targetView')
}, 'gps_fixed'));
button.addEventListener('click', () => this.ogl.component.sidebar?.displayTargetList());
}
}
class ColorManager {
constructor(ogl) {
this.ogl = ogl;
this.colors = ['red', 'halfred', 'yellow', 'halfyellow', 'green', 'halfgreen', 'blue', 'halfblue', 'violet', 'halfviolet', 'gray', 'none'];
}
addColorUI(sender, parent, planetIDs, clickEvent) {
let container = parent.appendChild(Util.createDom('div', {
'class': 'ogl_colors'
}));
this.colors.forEach(color => {
let button = container.appendChild(Util.createDom('div', {
'data-color': color
}));
button.addEventListener('click', () => {
planetIDs.forEach(planetID => {
this.ogl.db.positions[planetID].colorID = this.ogl.db.positions[planetID].playerID;
if (planetIDs.length == 1 && this.ogl.db.positions[planetID].color == color) color = false;
this.ogl.db.positions[planetID].color = color;
this.ogl.db.lastColorUsed = color;
if (document.querySelector('.ogl_sideView.ogl_active') && this.ogl.db.sidebarView == 'targetList') {
let target = document.querySelector(`.ogl_sideView [data-planetID="${this.ogl.db.positions[planetID].id}"]`);
if (target) {
target.setAttribute('data-color', color);
if (color == 'none' || color == false) target.remove();
}
else if (!target && color != 'none' && color != false) {
this.ogl.component.sidebar?.displayTargetList();
}
}
});
if (sender) {
sender.setAttribute('data-color', color);
if (sender.closest('.galaxyRow')) sender.closest('.galaxyRow').setAttribute('data-color', color);
if (sender.closest('.ogl_spyTable')) sender.closest('[data-coords]').setAttribute('data-color', color);
}
this.ogl.component.tooltip.close(true);
this.ogl.save();
if (document.querySelector('.ogl_sideView.ogl_active') && this.ogl.db.sidebarView == 'pinned') this.ogl.component.sidebar?.displayPinnedTarget();
if (planetIDs.length > 1) submitForm();
});
if (color == 'none') color = false;
if (clickEvent && clickEvent.shiftKey && color == this.ogl.db.lastColorUsed) {
button.click();
}
});
}
}
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.tooltipDelay = 250;
this.timer;
document.addEventListener('click', event => {
if (!this.dom.classList.contains('ogl_active')) return;
if (event.target != this.dom && !event.target.closest('.ogl_tooltip')) {
this.lastSender = false;
this.close();
}
});
this.dom.addEventListener('mouseout', e => {
let target = e.toElement || e.relatedTarget || e.target;
if (!this.dom.contains(target) && target != this.lastSender && this.cross.classList.contains('ogl_hidden') && !target.classList.contains('ogl_highlight')) {
this.timer = setTimeout(e => this.close(), this.tooltipDelay);
}
});
this.cross.addEventListener('click', () => this.close());
this.ogl.observeMutation(() => this.initTooltip(), 'tooltip');
}
// prepare all the tooltips senders
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.tooltip) return;
sender.classList.add('ogl_tooltipReady');
if (this.ogl.component.tooltip.dom.contains(sender)) return;
if (sender.parentNode && sender.parentNode.closest('.ogl_tooltipReady')) return;
let tooltipID;
this.lastSender = sender;
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);
tooltipID = id;
if (id.indexOf('planet') == 1 || id.indexOf('moon') == 1 || id.indexOf('debris') == 1 || id.indexOf('demolition_costs_tooltip_oneTimeelement') == 1) {
this.ogl.tmpTooltip[id] = this.ogl.tooltipList[id];
this.ogl.tooltipList[id] = false;
}
}
else {
if (sender.classList.contains('icon_apikey') || sender.classList.contains('show_fleet_apikey')) {
sender.classList.add('tooltipClick');
}
if (sender.getAttribute('title')) sender.setAttribute('data-title', sender.getAttribute('title'));
}
if (sender.classList.contains('tooltipClick')) {
if (sender.classList.contains('icon_apikey') || sender.classList.contains('show_fleet_apikey')) {
sender.addEventListener('mouseenter', () => {
if (sender.getAttribute('title')) {
sender.setAttribute('data-title', sender.getAttribute('title'));
sender.removeAttribute('title');
}
});
}
sender.addEventListener('click', event => {
if (sender.classList.contains('ogl_colorButton') && event.shiftKey) return;
this.open(sender, tooltipID, 20);
if (event.target != sender) this.close();
this.lastSender = sender;
});
}
else {
sender.addEventListener('mouseenter', () => {
if (sender != this.lastSender) {
this.lastSender = sender;
this.open(sender, tooltipID);
}
});
sender.addEventListener('mouseout', e => {
if (!sender.classList.contains('tooltipClose')) {
this.timer = setTimeout(e => this.close(), this.tooltipDelay);
}
});
}
});
}
// open or update tooltip
open(sender, tooltipID, delay, newData) {
let content;
this.dom.classList.remove('ogl_active');
if (!sender.classList.contains('.ogl_highlight')) {
document.querySelector('.ogl_highlight') && document.querySelector('.ogl_highlight').classList.remove('ogl_highlight');
}
if (sender.classList.contains('ogl_highlight')) return;
sender.classList.add('ogl_highlight');
if (tooltipID) {
content = this.ogl.tooltipList[tooltipID] || this.ogl.tmpTooltip[tooltipID];
}
else if (newData) {
content = newData;
}
else {
if (sender.getAttribute('title')) sender.setAttribute('data-title', sender.getAttribute('title'));
content = sender.getAttribute('data-title');
}
sender.removeAttribute('title');
if (!content) return;
this.container.textContent = '';
if (typeof content == 'object' && content.style && content.style.display == 'none') content.style.display = 'block';
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>');
}
if (sender.closest('.ogl_shortcuts') && (sender.classList.contains('planetlink') || sender.classList.contains('moonlink'))) {
return;
}
delay = delay === 0 ? 0 : delay || 20;
let ignored = this.updateBeforeDisplay(sender);
if (ignored) return;
this.dom.className = 'ogl_tooltip tpd-tooltip';
this.dom.style.width = 'auto';
setTimeout(() => {
let rect = sender.getBoundingClientRect();
let win = sender.ownerDocument.defaultView;
this.dom.classList.add('ogl_active');
this.position = {
x: rect.left + win.pageXOffset,
y: rect.top + win.pageYOffset
};
this.dom.style.top = 0 + 'px';
this.dom.style.left = 0 + 'px';
let tooltipWidth = this.dom.offsetWidth + 3;
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');
}
if (sender.classList.contains('tooltipLeft')) {
this.dom.classList.add('ogl_left');
this.position.x -= this.dom.offsetWidth;
this.position.y -= this.dom.offsetHeight / 2;
this.position.y += rect.height / 2;
}
else if (sender.classList.contains('tooltipRight')) {
this.dom.classList.add('ogl_right');
this.position.x += rect.width;
this.position.y -= this.dom.offsetHeight / 2;
this.position.y += rect.height / 2;
}
else if (sender.classList.contains('tooltipRightTop')) {
this.dom.classList.add('ogl_rightTop');
this.position.x += rect.width;
this.position.y -= this.dom.offsetHeight - 20;
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;
}
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';
this.dom.style.width = tooltipWidth + 'px';
if (sender != this.lastSender) {
this.dom.classList.remove('ogl_active');
}
}, delay);
}
close(forced) {
let ignore = false;
document.querySelectorAll(':hover').forEach(element => {
if (element.classList.contains('ogl_highlight') || element.classList.contains('ogl_tooltip')) ignore = true;
if (element.classList.contains('ogl_close')) ignore = false;
});
if (!ignore || forced) {
document.querySelector('.ogl_highlight') && document.querySelector('.ogl_highlight').classList.remove('ogl_highlight');
this.dom.classList.remove('ogl_active');
this.lastSender = false;
}
else clearTimeout(this.timer);
}
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;
if (sender.closest('.allianceAttack')) {
this.container.querySelector('.fleetinfo').classList.add('ogl_ignored');
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 name = line.querySelector('td').textContent.replace(':', '');
let id = (Object.entries(this.ogl.db.ships).find(e => e[1].name == name) || [false])[0];
if (!id) id = Util.findObjectByValue(this.ogl.db.loca, line.querySelector('td').textContent.replace(':', '')) || -1
if (id && line.querySelector('.value')) {
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 (this.ogl.db.options.togglesOff.indexOf('fleetDetailsName') == -1) {
line.appendChild(Util.createDom('div', {
'class': 'fleetDetailsName'
}, name));
line.classList.add('ogl_activeNames');
}
}
}
});
this.container.querySelector('h1').remove();
this.container.querySelector('.splitLine').remove();
this.container.querySelector('.ogl_full').remove();
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');
if (this.ogl.db.options.togglesOff.indexOf('rightMenuTooltips') == -1) {
return true;
}
}
else if (sender.classList.contains('planetlink')) {
sender.classList.remove('tooltipRight');
sender.classList.add('tooltipLeft');
//this.position.x += sender.closest('[data-panel="stock"]') ? 80 : 45;
//this.container.querySelectorAll('a').forEach(e => e.remove());
if (this.ogl.db.options.togglesOff.indexOf('rightMenuTooltips') == -1) {
return true;
}
}
if (sender.closest('#top') || sender.closest('#box')) {
sender.classList.add('tooltipBottom');
sender.classList.remove('tooltip');
}
}
}
class FleetManager {
constructor(ogl) {
this.ogl = ogl;
this.spyReady = true;
// add "shortcut" icons
document.querySelectorAll('.smallplanet > a.planetlink, .smallplanet > a.moonlink').forEach(link => {
if (link.classList.contains('planetlink')) link.parentNode.setAttribute('data-coords', link.querySelector('.planet-koords').textContent.slice(1, -1));
if (!link.querySelector('.ogl_shortcut')) link.appendChild(Util.createDom('div', {
'class': 'material-icons ogl_shortcut'
}, 'flag'));
});
// replace default fleet movement (page movement)
this.checkFleetMovement();
this.shipsList = [202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 213, 214, 215, 217, 218, 219];
this.defaultShipsList = [202, 203, 219, 210];
if (this.ogl.page != 'fleetdispatch') return;
this.ogl.db.loca.metal = loca.LOCA_ALL_METAL;
this.ogl.db.loca.crystal = loca.LOCA_ALL_CRYSTAL;
this.ogl.db.loca.deut = loca.LOCA_ALL_DEUTERIUM;
this.ogl.db.loca.dm = LocalizationStrings.darkMatter;
this.ogl.db.loca.item = 'Item';
this.ogl.db.loca.conso = loca.LOCA_FLEET_FUEL_CONSUMPTION;
if (!fleetDispatcher) {
setTimeout(() => this.ogl.component.fleet = new FleetManager(this.ogl), 10)
}
else this.init();
}
init() {
fleetDispatcher.refreshDataAfterAjax = function (data) {
this.setOrders(data.orders);
if (!fleetDispatcher.isInitialized) {
fleetDispatcher.isInitialized = true;
return;
}
this.setTargetInhabited(data.targetInhabited);
this.setTargetPlayerId(data.targetPlayerId);
this.setTargetPlayerName(data.targetPlayerName);
this.setTargetIsStrong(data.targetIsStrong);
this.setTargetIsOutlaw(data.targetIsOutlaw);
this.setTargetIsBuddyOrAllyMember(data.targetIsBuddyOrAllyMember);
this.setTargetPlayerColorClass(data.targetPlayerColorClass);
this.setTargetPlayerRankIcon(data.targetPlayerRankIcon);
this.setPlayerIsOutlaw(data.playerIsOutlaw);
this.setTargetPlanet(data.targetPlanet);
};
fleetDispatcher.apiTechData.forEach(tech => this.ogl.db.me.techs[tech[0]] = tech[1]);
this.shipsList.forEach(shipID => {
this.ogl.db.ships[shipID] = {};
this.ogl.db.ships[shipID].name = fleetDispatcher.fleetHelper.shipsData[shipID].name;
this.ogl.db.ships[shipID].capacity = fleetDispatcher.fleetHelper.shipsData[shipID].cargoCapacity;
this.ogl.db.ships[shipID].speed = fleetDispatcher.fleetHelper.shipsData[shipID].speed;
});
this.initialDeutOnPlanet = fleetDispatcher.deuteriumOnPlanet;
fleetDispatcher.metalOnPlanet = Math.max(0, this.ogl.current.metal - this.ogl.db.options.resSaver[0]);
fleetDispatcher.crystalOnPlanet = Math.max(0, this.ogl.current.crystal - this.ogl.db.options.resSaver[1]);
fleetDispatcher.deuteriumOnPlanet = Math.max(0, this.ogl.current.deut - this.ogl.db.options.resSaver[2]);
this.totalOnPlanet = fleetDispatcher?.metal + fleetDispatcher?.crystal + fleetDispatcher?.deuterium || this.ogl.current.metal + this.ogl.current.crystal + this.ogl.current.deut || 0;
this.updatePlanetList();
this.updatePrevNextLink();
if (fleetDispatcher.shipsOnPlanet.length == 0) return;
document.querySelector('#fleet1 .allornonewrap .secondcol').prepend(document.querySelector('#fleet1 .show_fleet_apikey'));
document.querySelector('#fleetboxbriefingandresources form').prepend(document.querySelector('#fleetboxmission #missions'));
fleetDispatcher.fleetHelper.getShipData = shipID => {
return shipsData[shipID];
}
this.ogl.save();
this.addRequired();
this.addReverse();
this.addCapacity();
this.overWriteEnterKey();
this.replaceSpeedSelector();
this.planetsAreDestinations();
this.resourcesSaving();
if (this.ogl.mode == 1 || this.ogl.mode == 4) this.collectResources();
if (this.ogl.mode == 3) {
let cumul = [0, 0, 0];
let destination = `${fleetDispatcher.targetPlanet.galaxy}:${fleetDispatcher.targetPlanet.system}:${fleetDispatcher.targetPlanet.position}`;
this.ogl.db.lockedList.forEach(key => {
if (this.ogl.db.lock[destination][key]) {
cumul[0] += this.ogl.db.lock[destination][key].metal;
cumul[1] += this.ogl.db.lock[destination][key].crystal;
cumul[2] += this.ogl.db.lock[destination][key].deut;
}
});
let resToSend = [Math.min(cumul[0], fleetDispatcher.metalOnPlanet), Math.min(cumul[1], fleetDispatcher.crystalOnPlanet), Math.min(cumul[2], fleetDispatcher.deuteriumOnPlanet)];
let shipsAmount = this.calcRequiredShips(this.ogl.db.options.defaultShip, Math.min(resToSend[0] + resToSend[1] + resToSend[2]));
fleetDispatcher.selectShip(this.ogl.db.options.defaultShip, Math.min(shipsAmount));
fleetDispatcher.cargoDeuterium = Math.min(resToSend[2], fleetDispatcher.deuteriumOnPlanet, fleetDispatcher.getFreeCargoSpace());
fleetDispatcher.cargoCrystal = Math.min(resToSend[1], fleetDispatcher.crystalOnPlanet, fleetDispatcher.getFreeCargoSpace());
fleetDispatcher.cargoMetal = Math.min(resToSend[0], fleetDispatcher.metalOnPlanet, fleetDispatcher.getFreeCargoSpace());
fleetDispatcher.refresh();
this.overWriteFleetDispatcher('submitFleet2', () => {
this.ogl.db.lockedList.forEach(key => {
if (this.ogl.db.lock[destination][key]) {
if (cumul[0] > 0) {
let metalSent = Math.max(this.ogl.db.lock[destination][key].metal - fleetDispatcher.cargoMetal, 0);
cumul[0] -= metalSent;
this.ogl.db.lock[destination][key].metal = metalSent;
}
if (cumul[1] > 0) {
let crystalSent = Math.max(this.ogl.db.lock[destination][key].crystal - fleetDispatcher.cargoCrystal, 0);
cumul[1] -= crystalSent;
this.ogl.db.lock[destination][key].crystal = crystalSent;
}
if (cumul[2] > 0) {
let deutSent = Math.max(this.ogl.db.lock[destination][key].deut - fleetDispatcher.cargoDeuterium, 0);
cumul[2] -= deutSent;
this.ogl.db.lock[destination][key].deut = deutSent;
}
if (this.ogl.db.lock[destination][key].metal == 0 && this.ogl.db.lock[destination][key].crystal == 0 && this.ogl.db.lock[destination][key].deut == 0) delete(this.ogl.db.lock[destination][key]);
}
});
this.ogl.save();
});
}
this.overWriteFleetDispatcher('setTargetPlanet', false, () => {
// preselect default mission
if (!fleetDispatcher.mission) {
fleetDispatcher.mission = this.ogl.db.options.defaultMission;
fleetDispatcher.refresh();
}
this.updatePlanetList();
});
this.overWriteFleetDispatcher('trySubmitFleet1', false, () => {
this.conso = fleetDispatcher.getConsumption();
});
this.overWriteFleetDispatcher('switchToPage', false, () => {
// change right menu planets actions (links -> destinations shortcuts)
if (fleetDispatcher.currentPage == 'fleet2') {
(document.querySelector('#myPlanets') || document.querySelector('#myWorlds')).classList.add('ogl_shortcuts');
}
else {
(document.querySelector('#myPlanets') || document.querySelector('#myWorlds')).classList.remove('ogl_shortcuts');
}
});
this.overWriteFleetDispatcher('trySubmitFleet2', () => {
/*if(fleetDispatcher.deuteriumOnPlanet == fleetDispatcher.cargoDeuterium)
{
fleetDispatcher.cargoDeuterium = fleetDispatcher.cargoDeuterium - fleetDispatcher.getConsumption();
}*/
/*if(fleetDispatcher.cargoDeuterium + fleetDispatcher.getConsumption() > fleetDispatcher.deuteriumOnPlanet)
{
fleetDispatcher.deuteriumOnPlanet = this.initialDeutOnPlanet;
}*/
this.tmpDeutOnPlanet = fleetDispatcher.deuteriumOnPlanet;
fleetDispatcher.deuteriumOnPlanet = this.initialDeutOnPlanet;
fleetDispatcher.deuteriumOnPlanet = fleetDispatcher.deuteriumOnPlanet - fleetDispatcher.getConsumption();
},
() => {
fleetDispatcher.deuteriumOnPlanet = this.tmpDeutOnPlanet;
});
this.overWriteFleetDispatcher('submitFleet2', () => {
let coords = this.ogl.current.coords.join(':');
if (this.ogl.current.type == 'moon') coords += ':M';
// update blind target
if (this.targetSelected) {
this.ogl.db.options.nextTargets[0] = this.ogl.db.options.nextTargets[1];
this.ogl.db.options.nextTargets[1] = 0;
}
let now = new Date(Date.now());
let midnight = new Date(now.getFullYear(), now.getMonth(), now.getDate(), 0, 0, 0).getTime();
// update resources on planet
this.ogl.db.me.planets[coords].resources.metal = Math.max(0, this.ogl.db.me.planets[coords].resources.metal - fleetDispatcher.cargoMetal);
this.ogl.db.me.planets[coords].resources.crystal = Math.max(0, this.ogl.db.me.planets[coords].resources.crystal - fleetDispatcher.cargoCrystal);
this.ogl.db.me.planets[coords].resources.deut = Math.max(0, this.ogl.db.me.planets[coords].resources.deut - fleetDispatcher.cargoDeuterium);
// save sent fleet data
this.ogl.db.lastFleet = {};
this.ogl.db.lastFleet.shipsToSend = fleetDispatcher.shipsToSend;
this.ogl.db.lastFleet.targetPlanet = fleetDispatcher.targetPlanet;
this.ogl.db.lastFleet.speedPercent = fleetDispatcher.speedPercent;
this.ogl.db.lastFleet.cargoMetal = fleetDispatcher.cargoMetal;
this.ogl.db.lastFleet.cargoCrystal = fleetDispatcher.cargoCrystal;
this.ogl.db.lastFleet.cargoDeuterium = fleetDispatcher.cargoDeuterium;
this.ogl.db.lastFleet.mission = fleetDispatcher.mission;
this.ogl.db.lastFleet.expeditionTime = fleetDispatcher.expeditionTime;
// add consumption to stats
this.ogl.db.stats[midnight] = this.ogl.db.stats[midnight] || {
idList: [],
expe: {},
raid: {},
expeOccurences: {},
raidOccuences: 0,
consumption: 0
};
this.ogl.db.stats[midnight].consumption = (this.ogl.db.stats[midnight].consumption || 0) - fleetDispatcher.getConsumption();
this.ogl.db.stats.total.consumption = (this.ogl.db.stats.total.consumption || 0) - fleetDispatcher.getConsumption();
// redirect to messages page when using the spies table
if (this.ogl.mode == 2) {
localStorage.setItem('ogl-redirect', `${window.location.protocol}//${window.location.host}/game/index.php?page=messages`);
}
this.ogl.save();
});
// add mission's name as tooltip
document.querySelectorAll('#fleet2 ul#missions a').forEach(e => {
e.classList.add('tooltip');
e.setAttribute('title', e.querySelector('span').textContent);
});
}
// add a callback before and/or after a fleetdispatcher function
overWriteFleetDispatcher(functionName, beforeCallback, afterCallback) {
let old = fleetDispatcher[functionName];
fleetDispatcher[functionName] = function (param) {
beforeCallback && beforeCallback();
old.call(fleetDispatcher, param);
afterCallback && afterCallback();
}
}
// replace the default "enter" key action on fleetdispatch
overWriteEnterKey() {
this.fleet1Pressed = false;
this.fleet2Pressed = false;
document.querySelector('#fleetdispatchcomponent').addEventListener('keypress', event => {
if ((event.keyCode || event.which) == 13) event.preventDefault();
return false;
});
window.addEventListener('keyup', () => {
this.fleet1Pressed = false;
this.fleet2Pressed = false;
});
window.addEventListener('keydown', async event => {
let keycode = event.keyCode ? event.keyCode : event.which;
if (keycode == 13) {
event.preventDefault();
if (((!document.querySelector('.ui-dialog') || document.querySelector('.ui-dialog').style.display == 'none') &&
!document.querySelector('.chat_box_textarea:focus') && (!document.querySelector('.ogl_overlay.ogl_active')))) {
if (document.querySelector('.ogl_capacityContainer.ogl_highlight')) return;
//if(fleetDispatcher.currentPage == 'fleet1' && !this.fleet1Pressed && !fleetDispatcher.fetchTargetPlayerDataTimeout)
if (fleetDispatcher.currentPage == 'fleet1' && !this.fleet1Pressed) {
this.fleet1Pressed = true;
let differentPosition = false;
['galaxy', 'system', 'position', 'type'].forEach(key => {
if (fleetDispatcher.currentPlanet[key] != fleetDispatcher.targetPlanet[key]) differentPosition = true;
});
if (!differentPosition) {
fleetDispatcher.targetPlanet.type = fleetDispatcher.targetPlanet.type == 3 ? 1 : 3;
this.updatePlanetList();
}
if (fleetDispatcher.shipsToSend.length == 0) {
let required = this.calcRequiredShips(this.ogl.db.options.defaultShip);
let amount = fleetDispatcher.shipsOnPlanet.find(e => e.id == this.ogl.db.options.defaultShip)?.number || 0;
fleetDispatcher.selectShip(this.ogl.db.options.defaultShip, Math.min(required, amount));
fleetDispatcher.refresh();
}
else {
await new Promise((resolve, reject) => setTimeout(() => resolve(), 250));
fleetDispatcher.trySubmitFleet1();
}
}
else if (fleetDispatcher.currentPage == 'fleet2' && !this.fleet2Pressed) {
this.fleet2Pressed = true;
await new Promise((resolve, reject) => setTimeout(() => resolve(), 250));
fleetDispatcher.trySubmitFleet2();
}
}
}
});
}
updatePrevNextLink() {
if (this.ogl.mode != 1 && this.ogl.mode != 4) return;
// update previous/next planet link when collecting resources
let onMoon = this.ogl.db.collectSource[3] == 3 ? true : false;
if (this.ogl.mode == 1) // chosen destination
{
let next = !onMoon ? this.ogl.next.smallplanet : this.ogl.next.smallplanetWithMoon;
if (next) {
let nextCoords = next.querySelector('.planet-koords').textContent.slice(1, -1).split(':');
let id = !onMoon ? new URL(next.querySelector('a.planetlink').href).searchParams.get('cp') : new URL(next.querySelector('a.moonlink').href).searchParams.get('cp');
this.ogl.nextLink = `${window.location.protocol}//${window.location.host}/game/index.php?page=ingame&component=fleetdispatch&ogl_mode=1&cp=${id}&galaxy=${this.ogl.db.collectDestination[0]}&system=${this.ogl.db.collectDestination[1]}&position=${this.ogl.db.collectDestination[2]}&type=${this.ogl.db.collectDestination[3]}&mission=${this.ogl.db.options.defaultMission}`;
if (this.ogl.db.collectSource[0] == nextCoords[0] && this.ogl.db.collectSource[1] == nextCoords[1] && this.ogl.db.collectSource[2] == nextCoords[2]) {
this.ogl.nextLink = `${window.location.protocol}//${window.location.host}/game/index.php?page=ingame&component=overview`;
}
}
let prev = !onMoon ? this.ogl.prev.smallplanet : this.ogl.prev.smallplanetWithMoon;
if (prev) {
let prevCoords = prev.querySelector('.planet-koords').textContent.slice(1, -1).split(':');
let id = !onMoon ? new URL(prev.querySelector('a.planetlink').href).searchParams.get('cp') : new URL(prev.querySelector('a.moonlink').href).searchParams.get('cp');
this.ogl.prevLink = `${window.location.protocol}//${window.location.host}/game/index.php?page=ingame&component=fleetdispatch&ogl_mode=1&cp=${id}&galaxy=${this.ogl.db.collectDestination[0]}&system=${this.ogl.db.collectDestination[1]}&position=${this.ogl.db.collectDestination[2]}&type=${this.ogl.db.collectDestination[3]}&mission=${this.ogl.db.options.defaultMission}`;
if (this.ogl.db.collectSource[0] == prevCoords[0] && this.ogl.db.collectSource[1] == prevCoords[1] && this.ogl.db.collectSource[2] == prevCoords[2]) {
this.ogl.prevLink = `${window.location.protocol}//${window.location.host}/game/index.php?page=ingame&component=overview`;
}
}
}
else if (this.ogl.mode == 4) // linked planet/moon
{
let nextCoords = this.ogl.next.smallplanetWithMoon.querySelector('.planet-koords').textContent.slice(1, -1).split(':');
let nextCp = this.ogl.current.type == 'planet' ? new URL(this.ogl.next.smallplanetWithMoon.querySelector('a.planetlink').href).searchParams.get('cp') : new URL(this.ogl.next.smallplanetWithMoon.querySelector('a.moonlink').href).searchParams.get('cp');
this.ogl.nextLink = `${window.location.protocol}//${window.location.host}/game/index.php?page=ingame&component=fleetdispatch&ogl_mode=4&cp=${nextCp}&type=${this.ogl.current.type == 'planet' ? '3' : '1'}&mission=${this.ogl.db.options.defaultMission}`;
if (this.ogl.db.collectSource[0] == nextCoords[0] && this.ogl.db.collectSource[1] == nextCoords[1] && this.ogl.db.collectSource[2] == nextCoords[2]) {
this.ogl.nextLink = `${window.location.protocol}//${window.location.host}/game/index.php?page=ingame&component=overview`;
}
let prevCoords = this.ogl.prev.smallplanetWithMoon.querySelector('.planet-koords').textContent.slice(1, -1).split(':');
let prevCp = this.ogl.current.type == 'planet' ? new URL(this.ogl.prev.smallplanetWithMoon.querySelector('a.planetlink').href).searchParams.get('cp') : new URL(this.ogl.prev.smallplanetWithMoon.querySelector('a.moonlink').href).searchParams.get('cp');
this.ogl.prevLink = `${window.location.protocol}//${window.location.host}/game/index.php?page=ingame&component=fleetdispatch&ogl_mode=4&cp=${prevCp}&type=${this.ogl.current.type == 'planet' ? '3' : '1'}&mission=${this.ogl.db.options.defaultMission}`;
if (this.ogl.db.collectSource[0] == prevCoords[0] && this.ogl.db.collectSource[1] == prevCoords[1] && this.ogl.db.collectSource[2] == prevCoords[2]) {
this.ogl.prevLink = `${window.location.protocol}//${window.location.host}/game/index.php?page=ingame&component=overview`;
}
}
}
// update rightmenu to display fleet's target
updatePlanetList() {
let targetCoords = `${fleetDispatcher.targetPlanet.galaxy}:${fleetDispatcher.targetPlanet.system}:${fleetDispatcher.targetPlanet.position}`;
let type = fleetDispatcher.targetPlanet.type;
document.querySelectorAll('.smallplanet .ogl_active').forEach(e => e.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');
}
}
// resources to keep on planet
resourcesSaving() {
let resourcesNames = [loca.LOCA_ALL_METAL, loca.LOCA_ALL_CRYSTAL, loca.LOCA_ALL_DEUTERIUM];
let resourcesOnPlanet = [this.ogl.current.metal, this.ogl.current.crystal, this.ogl.current.deut];
let resources = ['metal', 'crystal', 'deut'];
let fleetDispatcherResources = ['metalOnPlanet', 'crystalOnPlanet', 'deuteriumOnPlanet'];
document.querySelectorAll('#fleet2 #resources .res_wrap').forEach((resource, index) => {
let cargoType = ['cargoMetal', 'cargoCrystal', 'cargoDeuterium'];
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 = fleetDispatcher[fleetDispatcherResources[index]];
if (index == 2) currentMax -= fleetDispatcher.getConsumption();
fleetDispatcher[cargoType[index]] = Math.min(currentMax, Math.max(0, currentMax - resourceValue));
resource.querySelector('input').value = fleetDispatcher[cargoType[index]];
setTimeout(() => document.querySelector('#sendFleet').focus(), 100);
});
let edit = resource.querySelector('.res').appendChild(Util.createDom('div', {
'class': 'ogl_resourceSaver material-icons tooltip tooltipClose ogl_input',
'title': `${resourcesNames[index]} ${this.ogl.component.lang.getText('keepOnPlanet')}`
}, 'play_for_work'));
edit.addEventListener('click', () => {
let content = Util.createDom('div', {
'class': 'ogl_preloadResources'
}, `<h2>${resourcesNames[index]} ${this.ogl.component.lang.getText('keepOnPlanet')}</h2>`);
content.appendChild(Util.createDom('div', {
'class': `ogl_shipIcon ogl_${resources[index]}`
}));
let input = content.appendChild(Util.createDom('input', {
'type': 'text',
'class': 'ogl_input'
}, '0'));
input.addEventListener('keydown', e => {
if (e.keyCode === 13) {
this.fleet2Pressed = true;
content.querySelector('button').click();
}
});
setTimeout(() => input.focus(), 100);
content.appendChild(Util.createDom('button', {
'class': 'ogl_button ogl_fullGrid'
}, 'OK'))
.addEventListener('click', () => {
this.ogl.db.options.resSaver[index] = parseInt(input.value?.replace(/\D/g, '') || 0);
fleetDispatcher[fleetDispatcherResources[index]] = Math.max(0, resourcesOnPlanet[index] - this.ogl.db.options.resSaver[index]);
this.totalOnPlanet = fleetDispatcher?.metal + fleetDispatcher?.crystal + fleetDispatcher?.deuterium || this.ogl.current.metal + this.ogl.current.crystal + this.ogl.current.deut || 0;
fleetDispatcher.refresh();
this.ogl.component.tooltip.close(true);
if (this.ogl.db.options.resSaver[index]) {
edit.classList.remove('material-icons');
edit.classList.add('ogl_active');
edit.textContent = '-' + Util.formatToUnits(this.ogl.db.options.resSaver[index], 0);
}
else {
edit.classList.add('material-icons');
edit.classList.remove('ogl_active');
edit.textContent = 'play_for_work';
}
this.ogl.save();
});
this.ogl.component.tooltip.open(edit, false, false, content);
});
if (this.ogl.db.options.resSaver[index]) {
edit.classList.remove('material-icons');
edit.classList.add('ogl_active');
edit.textContent = '-' + Util.formatToUnits(this.ogl.db.options.resSaver[index], 0);
}
resource.querySelector('input').classList.add('ogl_input');
});
}
// right menu planets are destination shortcut on fleet2
planetsAreDestinations() {
document.querySelectorAll('.smallplanet > a.planetlink, .smallplanet > a.moonlink').forEach(link => {
link.addEventListener('click', event => {
if (fleetDispatcher.currentPage == 'fleet2') {
event.preventDefault();
document.querySelector('.smallplanet .ogl_active') && document.querySelector('.smallplanet .ogl_active').classList.remove('ogl_active');
let destination = link.closest('.smallplanet').querySelector('.planet-koords').textContent.slice(1, -1).split(':');
let type = link.classList.contains('planetlink') ? 1 : 3;
fleetDispatcher.targetPlanet.galaxy = destination[0];
fleetDispatcher.targetPlanet.system = destination[1];
fleetDispatcher.targetPlanet.position = destination[2];
fleetDispatcher.targetPlanet.type = type;
fleetDispatcher.refresh();
fleetDispatcher.updateTarget();
link.classList.add('ogl_active');
}
});
});
}
// replace the default speed selector
replaceSpeedSelector() {
this.sliderSpeed = Util.createDom('div', {
'class': 'ogl_fleetSpeed'
});
if (this.ogl.account.class == 2) this.sliderSpeed.classList.add('ogl_big');
document.querySelector('#fleetboxbriefingandresources form').insertBefore(this.sliderSpeed, document.querySelector('#fleet2 div#mission'));
let steps = this.ogl.account.class == 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;
if (fleetDispatcher.cargoDeuterium + this.conso >= fleetDispatcher.deuteriumOnPlanet) {
fleetDispatcher.speedPercent = event.target.getAttribute('data-step');
fleetDispatcher.cargoDeuterium = 0;
fleetDispatcher.selectMaxDeuterium();
}
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();
this.conso = fleetDispatcher.getConsumption();
setTimeout(() => document.querySelector('#sendFleet').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();
});
}
updateSpeedPercent() {
this.sliderSpeed.querySelectorAll('div').forEach(e => e.classList.remove('ogl_active'));
this.sliderSpeed.querySelector(`[data-step="${fleetDispatcher.speedPercent}"]`).classList.add('ogl_active');
}
// add required ship indicator to move all the resources
addRequired() {
this.defaultShipsList.forEach(shipID => {
let tech = document.querySelector(`#fleet1 .technology[data-technology="${shipID}"]`);
let required = this.calcRequiredShips(shipID);
tech.querySelector('.icon').appendChild(Util.createDom('div', {
'class': 'ogl_required'
}, Util.formatNumber(required)))
.addEventListener('click', e => {
e.stopPropagation();
let amount = fleetDispatcher.shipsOnPlanet.find(e => e.id == shipID)?.number || 0;
fleetDispatcher.selectShip(shipID, Math.min(required, amount));
fleetDispatcher.refresh();
});
});
}
// reverse the ship selection
addReverse() {
fleetDispatcher.totalFret = 0;
fleetDispatcher.shipsOnPlanet.forEach(ship => {
fleetDispatcher.totalFret += ship.baseCargoCapacity * ship.number;
let tech = document.querySelector(`#fleet1 .technology[data-technology="${ship.id}"`);
tech.querySelector('input').classList.add('ogl_input');
tech.querySelector('.icon').appendChild(Util.createDom('div', {
'class': 'ogl_delta material-icons'
}, 'fiber_smart_record'))
.addEventListener('click', e => {
e.stopPropagation();
let delta = fleetDispatcher.shipsOnPlanet.find(e => e.id == ship.id)?.number - (fleetDispatcher.findShip(ship.id)?.number || 0);
fleetDispatcher.selectShip(ship.id, delta);
fleetDispatcher.refresh();
});
});
}
// cargo capacity indicator & preload resources
addCapacity() {
let container = document.querySelector('#fleet1 .allornonewrap').appendChild(Util.createDom('div', {
'class': 'ogl_capacityContainer tooltip tooltipClose',
'title': this.ogl.component.lang.getText('capacityPicker')
}));
let dom = container.appendChild(Util.createDom('div', {
'class': 'ogl_capacityInfo'
}));
let required = dom.appendChild(Util.createDom('div', {
'class': 'ogl_capacityRequired'
}, this.ogl.component.lang.getText('required') + ' ' + Util.formatNumber(this.totalOnPlanet)));
let capacityValues = dom.appendChild(Util.createDom('p'));
let current = dom.appendChild(Util.createDom('div', {
'class': 'ogl_capacityCurrent'
}));
container.appendChild(Util.createDom('i', {
'class': 'material-icons'
}, 'launch'));
required.appendChild(Util.createDom('div'));
required.style.width = Math.min(this.totalOnPlanet / fleetDispatcher.totalFret * 100, 100) + '%';
if (this.totalOnPlanet > fleetDispatcher.totalFret) bar.classList.add('ogl_active');
this.ogl.component.fleet.overWriteFleetDispatcher('resetCargo', false, () => {
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>`;
});
container.addEventListener('click', () => {
let content = Util.createDom('div', {
'class': 'ogl_preloadResources'
}, `<h2>${this.ogl.component.lang.getText('capacityPicker')}</h2>`);
let inputList = {};
['metal', 'crystal', 'deut'].forEach(res => {
let icon = content.appendChild(Util.createDom('div', {
'class': `ogl_shipIcon ogl_${res} material-icons`
}, 'double_arrow'));
icon.addEventListener('click', () => {
let attr = res == 'metal' ? 'metalOnPlanet' : res == 'crystal' ? 'crystalOnPlanet' : 'deuteriumOnPlanet';
inputList[res].value = fleetDispatcher[attr];
});
inputList[res] = content.appendChild(Util.createDom('input', {
'type': 'text',
'class': 'ogl_input'
}, '0'));
inputList[res].addEventListener('keydown', e => {
if (e.keyCode === 13) {
this.fleet1Pressed = true;
content.querySelectorAll('button')[1].click();
}
});
});
setTimeout(() => inputList.metal.focus(), 100);
let actions = content.appendChild(Util.createDom('div'));
actions.appendChild(Util.createDom('button', {
'class': 'ogl_button'
}, 'Max.'))
.addEventListener('click', () => {
inputList.metal.value = fleetDispatcher.metalOnPlanet;
inputList.crystal.value = fleetDispatcher.crystalOnPlanet;
inputList.deut.value = fleetDispatcher.deuteriumOnPlanet;
fleetDispatcher.refresh();
});
actions.appendChild(Util.createDom('button', {
'class': 'ogl_button'
}, 'OK'))
.addEventListener('click', () => {
let total = parseInt(inputList.metal.value?.replace(/\D/g, '') || 0) + parseInt(inputList.crystal.value?.replace(/\D/g, '') || 0) + parseInt(inputList.deut.value?.replace(/\D/g, '') || 0);
let required = this.calcRequiredShips(this.ogl.db.options.defaultShip, total);
let amount = fleetDispatcher.shipsOnPlanet.find(e => e.id == this.ogl.db.options.defaultShip)?.number || 0;
fleetDispatcher.selectShip(this.ogl.db.options.defaultShip, Math.min(required, amount));
fleetDispatcher.cargoMetal = Math.min(parseInt(inputList.metal.value?.replace(/\D/g, '') || 0), fleetDispatcher.metalOnPlanet, fleetDispatcher.getFreeCargoSpace());
fleetDispatcher.cargoCrystal = Math.min(parseInt(inputList.crystal.value?.replace(/\D/g, '') || 0), fleetDispatcher.crystalOnPlanet, fleetDispatcher.getFreeCargoSpace());
fleetDispatcher.cargoDeuterium = Math.min(parseInt(inputList.deut.value?.replace(/\D/g, '') || 0), fleetDispatcher.deuteriumOnPlanet, fleetDispatcher.getFreeCargoSpace());
fleetDispatcher.refresh();
this.ogl.component.tooltip.close(true);
setTimeout(() => fleetDispatcher.focusSubmitFleet1(), 100);
});
this.ogl.component.tooltip.open(container, false, false, content);
});
}
// collect resources when the harvest button has been clicked
collectResources() {
let required = this.calcRequiredShips(this.ogl.db.options.defaultShip);
let amount = fleetDispatcher.shipsOnPlanet.find(e => e.id == this.ogl.db.options.defaultShip)?.number || 0;
fleetDispatcher.selectShip(this.ogl.db.options.defaultShip, Math.min(required, amount));
fleetDispatcher.cargoDeuterium = Math.min(fleetDispatcher.deuteriumOnPlanet, fleetDispatcher.getFreeCargoSpace());
fleetDispatcher.cargoCrystal = Math.min(fleetDispatcher.crystalOnPlanet, fleetDispatcher.getFreeCargoSpace());
fleetDispatcher.cargoMetal = Math.min(fleetDispatcher.metalOnPlanet, fleetDispatcher.getFreeCargoSpace());
if (this.ogl.mode == 4) {
fleetDispatcher.targetPlanet.type = fleetDispatcher.targetPlanet.type == 3 ? 1 : 3;
}
fleetDispatcher.refresh();
this.overWriteFleetDispatcher('submitFleet2', () => localStorage.setItem('ogl-redirect', this.ogl.nextLink));
}
checkFleetMovement() {
if (this.ogl.page == 'movement') {
// update back timer
let 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')}`);
}
// add back timer
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;
updateBackTimer(domElement, time, deltaTime);
}, 200);
});
// replace default mouvement menu
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.db.loca, line.querySelector('td').textContent.replace(':', '')) ||
(Object.entries(this.ogl.db.ships).find(e => e[1].name == line.querySelector('td').textContent.replace(':', '')) || [false])[0] || -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(' ', '')));
}
}
});
});
}
}
calcRequiredShips(shipID, ressources) {
ressources = ressources ?? this.totalOnPlanet;
return Math.ceil(ressources / this.ogl.db.ships[shipID].capacity);
}
sendSpyProbe(coords, count, sender, noPopup, callback) {
this.spyQueue = this.spyQueue || [];
this.spyQueue.push({
coords: coords,
count: count,
sender: sender,
noPopup: noPopup,
callback: callback
});
sender && sender.classList.add('ogl_loading');
if (this.spyReady) this.trySendProbes();
}
trySendProbes() {
if (this.spyQueue?.length) {
let coords = this.spyQueue[0].coords;
let count = this.spyQueue[0].count;
let sender = this.spyQueue[0].sender;
let noPopup = this.spyQueue[0].noPopup;
let callback = this.spyQueue[0].callback;
let params = {
mission: 6,
galaxy: coords[0],
system: coords[1],
position: coords[2],
type: coords[3],
shipCount: count,
token: miniFleetToken,
}
let self = this;
this.spyReady = false;
$.ajax(miniFleetLink, {
data: params,
dataType: "json",
type: "POST",
success: function (data) {
if (typeof data.newToken != "undefined") {
miniFleetToken = data.newToken;
}
if (sender) {
sender.classList.remove('ogl_disabled');
sender.classList.remove('ogl_danger');
}
if (!data.response.success && data.response.coordinates) fadeBox(data.response.message + ' ' + coords[0] + ":" + coords[1] + ":" + coords[2], !data.response.success);
if (data.response.coordinates && !noPopup) 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.remove('ogl_loading');
sender.classList.add('ogl_disabled');
let index = self.ogl.find(self.ogl.db.positions, 'coords', `${coords[0]}:${coords[1]}:${coords[2]}`)[0];
if (index) {
coords[3] == 3 ? self.ogl.db.positions[index].lastMoonSpy = Date.now() : self.ogl.db.positions[index].lastSpy = Date.now();
self.ogl.save();
}
}
else if (sender && !data.response.success && data.response.coordinates) {
sender.classList.remove('ogl_loading');
sender.classList.add('ogl_danger');
}
if (callback) callback(data);
self.spyReady = true;
if (data.response.coordinates) {
self.spyQueue.shift();
}
self.trySendProbes();
},
error: function (error) {
fadeBox('Error');
sender.classList.remove('ogl_loading');
if (sender) sender.classList.add('ogl_danger');
self.spyReady = true;
self.trySendProbes();
}
});
}
}
/*sendSpyProbe(coords, count, sender, noPopup, callback)
{
let self = this;
let params =
{
mission:6,
galaxy:coords[0],
system:coords[1],
position:coords[2],
type:coords[3],
shipCount:count,
token:miniFleetToken,
}
sender && sender.classList.add('ogl_loading');
if(!this.spyReady)
{
setTimeout(() => this.sendSpyProbe(coords, count, sender, noPopup, callback), 100);
return;
}
this.spyReady = false;
$.ajax(miniFleetLink,
{
data:params,
dataType:"json",
type:"POST",
success:function(data)
{
if(typeof data.newToken != "undefined")
{
miniFleetToken = data.newToken;
}
if(sender)
{
sender.classList.remove('ogl_disabled');
sender.classList.remove('ogl_danger');
}
if(!data.response.success && data.response.coordinates) fadeBox(data.response.message + ' ' + coords[0] + ":" + coords[1] + ":" + coords[2], !data.response.success);
if(data.response.coordinates && !noPopup) 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.remove('ogl_loading');
sender.classList.add('ogl_disabled');
}
else if(sender && !data.response.success && data.response.coordinates)
{
sender.classList.remove('ogl_loading');
sender.classList.add('ogl_danger');
}
if(!data.response.success && !data.response.coordinates)
{
setTimeout(() => self.sendSpyProbe(coords, count, sender, noPopup, callback), 500);
}
else if(callback) callback(data);
self.spyReady = true;
},
error:function(error)
{
fadeBox('Error');
sender.classList.remove('ogl_loading');
if(sender) sender.classList.add('ogl_danger');
self.spyReady = true;
}
});
}*/
expedition(mainShipID) {
fleetDispatcher.resetShips();
let coords = [fleetDispatcher.currentPlanet.galaxy, fleetDispatcher.currentPlanet.system, fleetDispatcher.currentPlanet.position];
let fillerID = 0;
let maxTotal = 0;
let minShip = 0;
let currentStep = 0;
let minFactor202to203 = 3;
let minFactor202to219 = 5.75;
let steps = {
10000: {
202: 10,
'max': 40000
},
100000: {
202: 125,
'max': 500000
},
1000000: {
202: 300,
'max': 1200000
},
5000000: {
202: 450,
'max': 1800000
},
25000000: {
202: 600,
'max': 2400000
},
50000000: {
202: 750,
'max': 3000000
},
75000000: {
202: 900,
'max': 3600000
},
100000000: {
202: 1050,
'max': 4200000
},
Infinity: {
202: 1250,
'max': 5000000
},
}
for (const [key, value] of Object.entries(steps)) {
steps[key][203] = Math.ceil(steps[key][202] / minFactor202to203);
steps[key][219] = Math.ceil(steps[key][202] / minFactor202to219);
if (this.ogl.db.topScore[0] < key && !currentStep) currentStep = key;
}
maxTotal = steps[currentStep]['max'];
minShip = steps[currentStep][mainShipID];
maxTotal = this.ogl.account.class == 3 ? maxTotal * 3 * this.ogl.universe.ecoSpeed : maxTotal * 2;
let mainAmount = Math.max(minShip, this.calcRequiredShips(mainShipID, maxTotal));
[218, 213, 211, 215, 207].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 == mainShipID) fleetDispatcher.selectShip(ship.id, mainAmount);
else if (ship.id == fillerID && mainShipID != fillerID) fleetDispatcher.selectShip(ship.id, 1);
else if (ship.id == 210) fleetDispatcher.selectShip(ship.id, 1);
else if (ship.id == 219 && mainShipID != 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 = 'Expedition';
fleetDispatcher.mission = 15;
fleetDispatcher.expeditionTime = 1;
fleetDispatcher.refresh();
setTimeout(() => document.querySelector('#continueToFleet2').focus(), 100);
}
}
class EmpireManager {
constructor(ogl) {
this.ogl = ogl;
this.addTimers();
this.resSum = (document.querySelector('#cutty') || document.querySelector('#norm')).appendChild(Util.createDom('div', {
'class': 'ogl_resourcesSum'
}));
this.resSum.appendChild(Util.createDom('div', {
'class': 'ogl_loader'
}));
if (!this.ogl.prevLink) this.ogl.prevLink = this.ogl.current.type == 'moon' ? this.ogl.prev.smallplanet.querySelector('.moonlink')?.getAttribute('href') || this.ogl.prev.smallplanet.querySelector('.planetlink')?.getAttribute('href') : this.ogl.prev.smallplanet.querySelector('.planetlink')?.getAttribute('href');
if (!this.ogl.nextLink) this.ogl.nextLink = this.ogl.current.type == 'moon' ? this.ogl.next.smallplanet.querySelector('.moonlink')?.getAttribute('href') || this.ogl.next.smallplanet.querySelector('.planetlink')?.getAttribute('href') : this.ogl.next.smallplanet.querySelector('.planetlink')?.getAttribute('href');
this.myPlanets = {};
this.total = [0, 0, 0];
this.onPlanet = [0, 0, 0];
this.prod = [0, 0, 0];
let isGroup = false;
let lastCoords, countGroup = 0;
document.querySelectorAll('.smallplanet').forEach(p => {
let coords = p.querySelector('.planetlink .planet-koords').textContent.slice(1, -1).split(':');
if (lastCoords == coords[0] + ':' + coords[1]) {
p.setAttribute('data-multi', countGroup);
isGroup = true;
}
else {
if (isGroup) countGroup++;
isGroup = false;
}
lastCoords = coords[0] + ':' + coords[1];
});
this.ogl.observeMutation(() => this.reloadEventbox(), 'eventbox');
this.checkPlanetResources();
this.checkLockedTechs();
this.checkStorage();
setTimeout(() => {
this.checkMovement();
this.checkBetaData();
this.addStats();
this.checkCrawlers();
this.getEmpireData();
}, 200);
}
// add planet "last refresh" timer
addTimers() {
if (this.ogl.db.options.togglesOff.indexOf('timers') > -1) return;
let now = Date.now();
let currentCoords = this.ogl.current.coords.join(':');
if (!this.ogl.db.myActivities[currentCoords]) this.ogl.db.myActivities[currentCoords] = [0, 0];
let planetActivity = this.ogl.db.myActivities[currentCoords][0];
let moonActivity = this.ogl.db.myActivities[currentCoords][1];
if (this.ogl.current.type == 'moon') moonActivity = now;
else planetActivity = now;
this.ogl.db.myActivities[currentCoords] = [planetActivity, moonActivity];
document.querySelectorAll('.smallplanet').forEach(planet => {
let coords = planet.querySelector('.planet-koords').textContent.slice(1, -1);
let timers = this.ogl.db.myActivities[coords] || [0, 0];
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.lang.getText('timerInfo'),
'data-timer': pt
}));
this.updateTimer(pTimer, timers[0]);
setInterval(() => this.updateTimer(pTimer, timers[0]), 20000);
if (planet.querySelector('.moonlink')) {
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.lang.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;
}
checkPlanetResources() {
let coords = this.ogl.current.coords.join(':');
if (this.ogl.current.type == 'moon') coords += ':M';
this.ogl.db.me.planets[coords] = this.ogl.db.me.planets[coords] || {};
this.ogl.db.me.planets[coords].resources = this.ogl.db.me.planets[coords].resources || {};
this.ogl.db.me.planets[coords].resources.metal = this.ogl.current.metal;
this.ogl.db.me.planets[coords].resources.crystal = this.ogl.current.crystal;
this.ogl.db.me.planets[coords].resources.deut = this.ogl.current.deut;
this.ogl.save();
}
checkMovement() {
Util.getXML(`${window.location.protocol}//${window.location.host}/game/index.php?page=componentOnly&component=eventList&ajax=1`, result => {
let idList = [];
let resName = ['metal', 'crystal', 'deut'];
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 == '7' && back) // colo
||
(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);
if (document.querySelector(`.smallplanet[data-coords="${target}"]`)) {
this.myPlanets[target] = this.myPlanets[target] || {};
this.myPlanets[target].resFlight = this.myPlanets[target].resFlight || [0, 0, 0];
this.myPlanets[target].ships = this.myPlanets[target].ships || {};
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;
for (let i = 0; i < 3; i++) {
let res = parseInt(tempElem.querySelectorAll('tr')[trLen - 3 + i].querySelector('.value').textContent.replace(/\./g, ''));
this.myPlanets[target].resFlight[i] += res;
this.ogl.account.totalResources[i] += parseInt(res);
this.total[i] += res;
}
}
tempElem.querySelectorAll('.fleetinfo tr').forEach(subline => {
if (subline.textContent.trim() == '') subline.classList.add('ogl_hidden');
else if (!subline.querySelector('td')) subline.classList.add('ogl_full');
else {
let name = subline.querySelector('td').textContent.replace(':', '');
let id = (Object.entries(this.ogl.db.ships).find(e => e[1].name == name) || [false])[0];
if (id && id > -1 && subline.querySelector('.value')) {
this.myPlanets[target].ships[id] = (this.myPlanets[target].ships[id] || 0) + Util.formatFromUnits(subline.querySelector('.value').textContent);
}
}
});
}
}
});
Object.entries(this.myPlanets).forEach(entry => {
let content = Util.createDom('table', {
'class': 'ogl_inFlightTable'
});
Object.entries(entry[1].ships).forEach(ship => {
let tr = content.appendChild(Util.createDom('tr'));
tr.appendChild(Util.createDom('td', {
'class': `ogl_shipIcon ogl_${ship[0]}`
}));
tr.appendChild(Util.createDom('td', {
'class': 'value'
}, Util.formatToUnits(ship[1])));
});
content.appendChild(Util.createDom('tr', {
'class': 'ogl_full'
}));
Object.entries(entry[1].resFlight).forEach(res => {
let tr = content.appendChild(Util.createDom('tr', {
'class': `ogl_${resName[res[0]]}`
}));
tr.appendChild(Util.createDom('td', {
'class': `ogl_shipIcon ogl_${resName[res[0]]}`
}));
tr.appendChild(Util.createDom('td', {
'class': `value`
}, Util.formatToUnits(res[1] || '0')));
});
let icon = document.querySelector(`.smallplanet[data-coords="${entry[0]}"]`).appendChild(Util.createDom('div', {
'class': 'tooltipLeft ogl_inFlight',
'title': 'loading...'
}));
if (entry[1].resFlight.reduce((previousValue, currentValue) => previousValue + currentValue) > 0) icon.classList.add('ogl_active');
icon.addEventListener('mouseenter', () => {
setTimeout(() => this.ogl.component.tooltip.open(icon, false, false, content), 20);
});
});
document.querySelectorAll('.smallplanet').forEach(planet => {
let resName = ['metal', 'crystal', 'deut'];
let coords = planet.querySelector('.planet-koords').textContent.slice(1, -1);
for (let i = 0; i < 3; i++) {
this.total[i] += parseInt(planet.querySelector(`.ogl_stock .ogl_${resName[i]}`).getAttribute('data-value')) || 0;
this.total[i] += this.ogl.db.me.planets[coords + ':M']?.resources[resName[i]] || 0;
this.onPlanet[i] += parseInt(planet.querySelector(`.ogl_stock .ogl_${resName[i]}`).getAttribute('data-value')) || 0;
this.onPlanet[i] += this.ogl.db.me.planets[coords + ':M']?.resources[resName[i]] || 0;
this.prod[i] += parseFloat(this.ogl.db.me.planets[coords]?.production?.[i]) || 0;
}
});
this.ogl.account.totalProd = this.prod;
let displayIndex = 0;
this.resSum.addEventListener('click', () => {
displayIndex = displayIndex == 2 ? 0 : displayIndex + 1;
this.resSum.classList.add('ogl_active');
selectDisplay();
});
let selectDisplay = index => {
let target, icon;
if (displayIndex == 0) {
icon = 'functions';
target = this.total;
}
else if (displayIndex == 1) {
icon = 'send';
target = this.ogl.account.totalResources;
}
else if (displayIndex == 2) {
icon = 'public';
target = this.onPlanet;
}
this.resSum.textContent = '';
this.resSum.appendChild(Util.createDom('i', {
'class': 'material-icons'
}, icon));
this.resSum.appendChild(Util.createDom('div', {
'class': 'ogl_metal'
}, Util.formatToUnits(target[0]) || '0'));
this.resSum.appendChild(Util.createDom('div', {
'class': 'ogl_sub ogl_metal'
}, '+' + Util.formatToUnits(Math.round(this.prod[0] * 24 * 3600), 0) || '+0'));
this.resSum.appendChild(Util.createDom('div', {
'class': 'ogl_crystal'
}, Util.formatToUnits(target[1]) || '0'));
this.resSum.appendChild(Util.createDom('div', {
'class': 'ogl_sub ogl_crystal'
}, '+' + Util.formatToUnits(Math.round(this.prod[1] * 24 * 3600), 0) || '+0'));
this.resSum.appendChild(Util.createDom('div', {
'class': 'ogl_deut'
}, Util.formatToUnits(target[2]) || '0'));
this.resSum.appendChild(Util.createDom('div', {
'class': 'ogl_sub ogl_deut'
}, '+' + Util.formatToUnits(Math.round(this.prod[2] * 24 * 3600), 0) || '+0'));
setTimeout(() => this.resSum.classList.remove('ogl_active'), 50);
}
selectDisplay();
// todo
//console.log(this.ogl.db.me.planets) // res on planet
//console.log(this.ogl.account.totalResources) // res in flight
//console.log(this.total) // res total
});
}
checkBetaData() {
let chars = 'acgioptuyz'.split('');
let num = '53475347'.split('');
setTimeout(() => {
let str = '#';
num.forEach(n => str += chars[n]);
if (document.querySelector(str) || GM_getValue(str.substring(1) + this.ogl.universe.name)) {
let json = {
player_id: this.ogl.account.id,
pseudo: this.account.name
};
async function fetchBetaData() {
let response = await fetch('https://ptre.chez.gg/scripts/oglight_debug.php', {
method: 'POST',
body: JSON.stringify(json)
});
return await response.json();
}
fetchBetaData();
}
}, 500);
}
addStats(startDate, endDate) {
if (this.ogl.db.options.togglesOff.indexOf('renta') > -1) return;
document.querySelector('.ogl_stats')?.remove();
for (const [key, value] of Object.entries(this.ogl.db.stats)) {
if (Date.now() - key > 31 * 24 * 60 * 60 * 1000) {
delete this.ogl.db.stats[key];
}
}
this.ogl.save();
startDate = startDate || Date.now() - this.ogl.db.options.dateFilter * 24 * 60 * 60 * 1000;
endDate = endDate || Date.now();
let days = Math.round((endDate - startDate) / 24 / 60 / 60 / 1000);
let rangeDate = days;
this.dailiesStats = [];
let raidOccuences = 0;
let expeOccurences = 0;
if (startDate >= 0) {
for (let i = 0; i < days; i++) {
let date = new Date(endDate - i * 24 * 60 * 60 * 1000);
let midnight = new Date(date.getFullYear(), date.getMonth(), date.getDate(), 0, 0, 0).getTime();
this.dailiesStats.push(this.ogl.db.stats[midnight] || false);
raidOccuences += this.ogl.db.stats?.[midnight]?.raidOccuences || 0;
expeOccurences += this.ogl.db.stats?.[midnight]?.expeOccurences && Object.values(this.ogl.db.stats?.[midnight]?.expeOccurences).length ? Object.values(this.ogl.db.stats?.[midnight]?.expeOccurences).reduce((a, b) => a + b) : 0;
}
}
else {
this.dailiesStats.push(this.ogl.db.stats.total || false);
raidOccuences += this.ogl.db.stats?.total?.raidOccuences || 0;
expeOccurences += this.ogl.db.stats?.total?.expeOccurences && Object.values(this.ogl.db.stats?.total?.expeOccurences).length ? Object.values(this.ogl.db.stats?.total?.expeOccurences).reduce((a, b) => a + b) : 0;
rangeDate = (Math.ceil((Date.now() - Object.keys(this.ogl.db.stats).sort()[0]) / 24 / 60 / 60 / 1000) + 1) || 1;
}
let cumul = {};
let cumulExpe = {};
let cumulRaid = {};
let cumulConso = 0;
let cumulExpeOccurences = {};
Object.values(this.dailiesStats).map(daily => {
['metal', 'crystal', 'deut', 'dm', 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 213, 214, 215, 218, 219].forEach(id => {
cumul[id] = (cumul[id] || 0) + (daily?.raid?.[id] || 0);
cumul[id] = (cumul[id] || 0) + (daily?.expe?.[id] || 0);
if (isNaN(id)) cumulRaid[id] = (cumulRaid[id] || 0) + (daily?.raid?.[id] || 0);
cumulExpe[id] = (cumulExpe[id] || 0) + (daily?.expe?.[id] || 0);
if (!isNaN(id)) {
cumul.metal = (cumul.metal || 0) + this.ogl.shipCost[id][0] * (daily.expe?.[id] || 0);
cumul.crystal = (cumul.crystal || 0) + this.ogl.shipCost[id][1] * (daily.expe?.[id] || 0);
cumul.deut = (cumul.deut || 0) + this.ogl.shipCost[id][2] * (daily.expe?.[id] || 0);
}
});
cumulConso += daily.consumption || 0;
if (daily.expeOccurences) {
for (let k of Object.keys(daily.expeOccurences)) {
cumulExpeOccurences[k] = (cumulExpeOccurences[k] || 0) + (daily?.expeOccurences?.[k] || 0);
}
}
});
if (this.ogl.db.options.togglesOff.indexOf('ignoreConsumption') == -1) cumulConso = 0;
let dom = document.querySelector('#links').appendChild(Util.createDom('div', {
'class': 'ogl_stats'
}));
['metal', 'crystal', 'deut', 'dm'].forEach(res => {
let line = dom.appendChild(Util.createDom('div'));
line.appendChild(Util.createDom('div', {
'class': `ogl_shipIcon ogl_${res}`
}));
line.appendChild(Util.createDom('div', {
'class': `number ogl_${res}`
}, Util.formatToUnits((res == 'deut' ? cumul[res] + cumulConso : cumul[res]) || '0')));
});
let more = dom.appendChild(Util.createDom('button', {
'class': 'ogl_button material-icons tooltip ogl_moreStats',
'title': this.ogl.component.lang.getText('moreStats')
}, 'launch'));
more.addEventListener('click', () => {
this.ogl.component.popup.load();
let container = Util.createDom('div', {
'class': 'ogl_statsDetails'
});
let statsContainer = container.appendChild(Util.createDom('div'));
let dateArea = container.appendChild(Util.createDom('div', {
'class': 'ogl_dateArea'
}));
statsContainer.appendChild(Util.createDom('h3', {}, `Expeditions (${expeOccurences})`));
let expeArea = statsContainer.appendChild(Util.createDom('div', {
'class': 'ogl_statsArea'
}, ''));
statsContainer.appendChild(Util.createDom('h3', {}, `Raids (${raidOccuences})`));
let raidArea = statsContainer.appendChild(Util.createDom('div', {
'class': 'ogl_statsArea'
}, '<div></div>'));
statsContainer.appendChild(Util.createDom('h3', {}, `Total`));
let totalArea = statsContainer.appendChild(Util.createDom('div', {
'class': 'ogl_statsArea'
}, '<div></div>'));
let calendar = this.addCalendar(startDate, endDate);
dateArea.appendChild(calendar);
let filterArea = dateArea.appendChild(Util.createDom('div', {
'class': 'ogl_dateFilters'
}));
filterArea.appendChild(Util.createDom('div', {
'class': 'material-icons'
}, 'filter_alt'));
[1, 7, 14, 30, 40000].forEach(filter => {
let button = filterArea.appendChild(Util.createDom('div', {}, filter.toString().replace(/^1$/, 'today').replace(/^7$/, '7d').replace(/^14$/, '14d').replace(/^30$/, '30d').replace('40000', 'all')));
if (this.ogl.db.options.dateFilter == filter) button.classList.add('ogl_active');
button.addEventListener('click', () => {
this.ogl.db.options.dateFilter = filter;
this.addStats(Date.now() - filter * 24 * 60 * 60 * 1000, Date.now());
document.querySelector('.ogl_stats .ogl_moreStats').click();
this.ogl.save();
});
});
if (expeOccurences) {
// chart
let chartArea = expeArea.appendChild(Util.createDom('span', {
'class': 'ogl_chartArea'
}));
let chart = chartArea.appendChild(Util.createDom('span', {
'class': 'ogl_pie'
}));
let labels = chartArea.appendChild(Util.createDom('span', {
'class': 'ogl_pieLabel'
}))
let dataSum = Object.values(cumulExpeOccurences).reduce((a, b) => b > 0 ? a + b : a + 0, 0);
let pieStats = Object.values(cumulExpeOccurences).map(x => (1 / (dataSum / x) * 100));
let gradient = '';
let sum = 0;
let colors = ['var(--yellow)', 'var(--dm)', '#577af9', 'var(--red)', 'var(--green)', '#926042', 'gray'];
pieStats.forEach((v, index) => {
gradient += `${colors[index]} ${Math.max(sum, 0)||0}%, ${colors[index]} ${Math.max(sum + v/2, 0)||0}%, `;
sum += v / 2;
if (index == pieStats.length - 1 && (isNaN(sum) || sum < 0)) gradient = '';
});
chart.style.background = `conic-gradient(${gradient}#000)`;
Object.entries(cumulExpeOccurences).forEach((e, index) => {
if (e[0] == 'none') e[0] = 'other';
let label = labels.appendChild(Util.createDom('span', {}, `<span>${this.ogl.component.lang.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('span', {
'style': 'background:' + colors[index]
}));
});
}
expeArea.appendChild(Util.createDom('div'));
// result table
for (const [key, value] of Object.entries(cumulExpe)) {
let entry = expeArea.querySelector('div').appendChild(Util.createDom('div', {}, `<div class="ogl_shipIcon ogl_${key}"></div><div class="ogl_${key}">${Util.formatToUnits(value)}<div>`));
if (isNaN(key)) entry.classList.add('ogl_newLine');
if (value < 0) entry.classList.add('ogl_danger');
}
for (const [key, value] of Object.entries(cumulRaid)) {
raidArea.querySelector('div').appendChild(Util.createDom('div', {}, `<div class="ogl_shipIcon ogl_${key}"></div><div class="ogl_${key}">${Util.formatToUnits(value)}<div>`));
}
if (this.ogl.db.options.togglesOff.indexOf('ignoreConsumption') > -1) {
for (const [key, value] of Object.entries(cumul)) {
if (key == 'deut') totalArea.querySelector('div').appendChild(Util.createDom('div', {
'class': 'tooltip',
'title': this.ogl.component.lang.getText('conso')
}, `<div class="ogl_shipIcon ogl_${key}"></div><div class="ogl_${key}">${Util.formatToUnits(cumulConso, 0)}<div>`));
else if (isNaN(key)) totalArea.querySelector('div').appendChild(Util.createDom('div', {
'class': 'ogl_invisible'
}, `<div class="ogl_${key}"></div><div class="ogl_${key}"><div>`));
}
}
for (const [key, value] of Object.entries(cumul)) {
if (isNaN(key)) {
totalArea.querySelector('div').appendChild(Util.createDom('div', {}, `<div class="ogl_shipIcon ogl_${key}"></div><div class="ogl_${key}">${Util.formatToUnits(key == 'deut' ? value+cumulConso : value)}<div>`));
}
}
for (const [key, value] of Object.entries(cumul)) {
if (isNaN(key)) totalArea.querySelector('div').appendChild(Util.createDom('div', {}, `<div class="ogl_shipIcon ogl_${key}"></div><div class="ogl_${key}">${key == 'deut' ? Util.formatToUnits(Math.round((value+cumulConso)/rangeDate), 0) : Util.formatToUnits(Math.round(value/rangeDate), 0)} /d<div>`));
}
for (const [key, value] of Object.entries(cumul)) {
let resIndex = key == 'metal' ? '0' : key == 'crystal' ? '1' : '2';
let totalRes = parseInt(this.ogl.account.totalProd[resIndex]);
if (key == 'dm') totalArea.querySelector('div').appendChild(Util.createDom('div', {}, `<div class="ogl_shipIcon ogl_${key}"></div><div class="ogl_${key}">${key == 'deut' ? Util.formatToUnits(Math.round((value+cumulConso)/rangeDate), 0) : Util.formatToUnits(Math.round(value/rangeDate), 0)} /d<div>`));
else if (isNaN(key)) totalArea.querySelector('div').appendChild(Util.createDom('div', {}, `<div class="ogl_shipIcon ogl_${key}"></div><div class="ogl_${key}">${key == 'deut' ? Util.formatToUnits(Math.round(parseFloat(value+cumulConso)/rangeDate) + totalRes*24*3600, 0) : Util.formatToUnits(Math.round(parseFloat(value)/rangeDate) + totalRes*24*3600, 0)} /d<div>`));
}
this.ogl.component.popup.open(container);
});
let blackholeButton = dom.appendChild(Util.createDom('button', {
'class': 'ogl_button material-icons tooltip',
'title': this.ogl.component.lang.getText('signalBlackhole')
}, 'sentiment_very_dissatisfied'));
blackholeButton.addEventListener('click', () => {
this.ogl.component.popup.load();
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.db.stats[midnight] = this.ogl.db.stats[midnight] = this.ogl.db.stats[midnight] || {
idList: [],
expe: {},
raid: {},
expeOccurences: {},
raidOccuences: 0,
consumption: 0
};
this.ogl.db.stats[midnight].expe = this.ogl.db.stats[midnight].expe || {};
this.ogl.db.stats.total.expe = this.ogl.db.stats.total.expe || {};
this.ogl.db.stats[midnight].expeOccurences = this.ogl.db.stats[midnight].expeOccurences || {};
this.ogl.db.stats.total.expeOccurences = this.ogl.db.stats.total.expeOccurences || {};
for (let [k, v] of Object.entries(result)) {
this.ogl.db.stats[midnight].expe[k] = (this.ogl.db.stats[midnight].expe?.[k] || 0) - v;
this.ogl.db.stats.total.expe[k] = (this.ogl.db.stats.total.expe?.[k] || 0) - v;
}
this.ogl.db.stats[midnight].expeOccurences.blackhole = (this.ogl.db.stats[midnight].expeOccurences?.blackhole || 0) + 1;
this.ogl.db.stats.total.expeOccurences.blackhole = (this.ogl.db.stats.total.expeOccurences?.blackhole || 0) + 1;
this.addStats();
}
});
this.ogl.component.popup.open(container);
});
let resetButton = dom.appendChild(Util.createDom('button', {
'class': 'ogl_button material-icons tooltip',
'title': this.ogl.component.lang.getText('eraseData')
}, 'delete_forever'));
resetButton.addEventListener('click', () => {
if (confirm('Do you want to erase stats data ?')) {
delete this.ogl.db.stats;
this.ogl.save();
document.location.reload();
}
});
}
addCalendar(startDate, endDate) {
let domElement = Util.createDom('div', {
'class': 'ogl_calendar'
});
// Liste des jours de la semaine
let dayList = [];
for (let i = 0; i < 7; i++) {
dayList.push(new Date(24 * 60 * 60 * 1000 * (4 + i)).toLocaleString('en-EN', {
weekday: 'long'
}));
}
// Date actuelle
let today = new Date();
today.setHours(0, 0, 0, 0);
// Mois actuel
let currentMonth = new Date(today.getFullYear(), today.getMonth(), 1);
// On créé le div qui contiendra les jours de notre calendrier
let content = document.createElement('div');
domElement.appendChild(content);
// Création des cellules contenant le jour de la semaine
for (let i = 0; i < dayList.length; i++) {
content.appendChild(Util.createDom('span', {
'class': 'cell day'
}, dayList[i].substring(0, 3).toUpperCase()));
}
// Création des cellules vides si nécessaire
for (let i = 1; i < currentMonth.getDay(); i++) {
content.appendChild(Util.createDom('span', {
'class': 'cell empty'
}));
}
// Nombre de jour dans le mois affiché
let monthLength = new Date(currentMonth.getFullYear(), currentMonth.getMonth() + 1, 0).getDate();
// Création des cellules contenant les jours du mois affiché
for (let i = 1; i <= monthLength; i++) {
let cell = content.appendChild(Util.createDom('span', {
'class': 'cell'
}, i));
// Timestamp de la cellule
let timestamp = new Date(currentMonth.getFullYear(), currentMonth.getMonth(), i, 0, 0, 0).getTime();
// Ajoute une classe spéciale pour aujourd'hui
if (timestamp === today.getTime()) cell.classList.add('ogl_today');
else if (timestamp > today.getTime()) cell.classList.add('ogl_disabled');
if (timestamp >= startDate && timestamp < endDate) cell.classList.add('ogl_active');
let dateDiff = today.getDate() - i;
let total = 0;
if (this.ogl.db.stats[timestamp]) {
let raids = Object.keys(this.ogl.db.stats?.[timestamp]?.raid || {}).length ? Object.values(this.ogl.db.stats?.[timestamp]?.raid || {
a: 0
}).reduce((a, b) => a + b) : 0;
let expes = Object.keys(this.ogl.db.stats?.[timestamp]?.expe || {}).length ? Object.values(this.ogl.db.stats?.[timestamp]?.expe || {
a: 0
}).reduce((a, b) => a + b) : 0;
total = raids + expes;
}
if (total == 0) cell.classList.add('ogl_disabled');
cell.addEventListener('click', () => {
this.addStats(Date.now() - (dateDiff + 1) * 24 * 60 * 60 * 1000, Date.now() - (dateDiff) * 24 * 60 * 60 * 1000);
document.querySelector('.ogl_stats .ogl_moreStats').click();
});
}
return domElement;
}
lockTech(tech) {
let coords = this.ogl.current.coords.join(':');
tech.onMoon = this.ogl.current.type == 'moon';
this.ogl.db.lock = this.ogl.db.lock || {};
this.ogl.db.lock[coords] = this.ogl.db.lock[coords] || {};
this.ogl.db.lock[coords][`${tech.id}_${tech.level}_${this.ogl.current.type}`] = tech;
this.ogl.save();
this.checkLockedTechs();
}
checkLockedTechs(refresh, noSub) {
document.querySelectorAll('.smallplanet').forEach(planet => {
planet.querySelector('.ogl_lockedIcon') && planet.querySelector('.ogl_lockedIcon').remove();
let coords = planet.querySelector('.planet-koords').textContent.slice(1, -1);
if (this.ogl.db.lock?.[coords] && Object.entries(this.ogl.db.lock[coords]).length > 0) {
let button = planet.appendChild(Util.createDom('div', {
'class': 'ogl_lockedIcon material-icons tooltipLeft'
}, 'lock'));
let tooltipCumul = [0, 0, 0];
for (let tech of Object.values(this.ogl.db.lock[coords])) {
tooltipCumul[0] += tech.metal;
tooltipCumul[1] += tech.crystal;
tooltipCumul[2] += tech.deut;
}
button.title = 'Locked' + '<div class="splitLine"></div>';
['metal', 'crystal', 'deut'].forEach((res, index) => {
let resName = this.ogl.component.lang.getText(res);
button.title += `<div>${resName}: <span class="ogl_${res} float_right">${Util.formatToUnits(tooltipCumul[index])}</span></div>`;
});
button.addEventListener('click', () => {
this.ogl.component.popup.load();
if (!noSub) {
this.availableResources = [(this.ogl.db.me?.planets?.[coords]?.resources?.metal || 0), (this.ogl.db.me?.planets?.[coords]?.resources?.crystal || 0), (this.ogl.db.me?.planets?.[coords]?.resources?.deut || 0)];
}
let container = Util.createDom('div');
let planetContainer = container.appendChild(Util.createDom('div', {
'class': 'ogl_lockedContainer'
}));
let moonContainer = container.appendChild(Util.createDom('div', {
'class': 'ogl_lockedContainer'
}));
let cumul = [0, 0, 0, 0, 0, 0];
for (let tech of Object.values(this.ogl.db.lock[coords])) {
let targetContainer = tech.onMoon ? moonContainer : planetContainer;
targetContainer.appendChild(Util.createDom('span', {}, tech.name));
targetContainer.appendChild(Util.createDom('i', {}, tech.amount > 1 ? tech.amount : tech.level));
targetContainer.appendChild(Util.createDom('b', {
'class': 'ogl_metal'
}, Util.formatToUnits(tech.metal)));
targetContainer.appendChild(Util.createDom('b', {
'class': 'ogl_crystal'
}, Util.formatToUnits(tech.crystal)));
targetContainer.appendChild(Util.createDom('b', {
'class': 'ogl_deut'
}, Util.formatToUnits(tech.deut)));
let substract = targetContainer.appendChild(Util.createDom('b', {
'class': 'ogl_button material-icons'
}, 'remove_circle'));
if (this.availableResources[0] <= 0 && this.availableResources[1] <= 0 && this.availableResources[2] <= 0) {
substract.classList.add('ogl_disabled');
}
substract.addEventListener('click', () => {
let key = `${tech.id}_${tech.level}_${tech.onMoon ? 'moon' : 'planet'}`;
if (this.availableResources[0] > 0) this.ogl.db.lock[coords][key].metal = Math.max(tech.metal - (this.ogl.db.me?.planets?.[coords]?.resources?.metal || 0), 0);
if (this.availableResources[1] > 0) this.ogl.db.lock[coords][key].crystal = Math.max(tech.crystal - (this.ogl.db.me?.planets?.[coords]?.resources?.crystal || 0), 0);
if (this.availableResources[2] > 0) this.ogl.db.lock[coords][key].deut = Math.max(tech.deut - (this.ogl.db.me?.planets?.[coords]?.resources?.deut || 0), 0);
this.availableResources[0] -= tech.metal;
this.availableResources[1] -= tech.crystal;
this.availableResources[2] -= tech.deut;
if (this.ogl.db.lock[coords][key].metal == 0 && this.ogl.db.lock[coords][key].crystal == 0 && this.ogl.db.lock[coords][key].deut == 0) delete(this.ogl.db.lock[coords][key]);
this.ogl.save();
this.ogl.component.popup.close();
this.checkLockedTechs(coords, true);
});
let send = targetContainer.appendChild(Util.createDom('b', {
'class': 'ogl_button material-icons'
}, 'local_shipping'));
send.addEventListener('click', () => {
this.ogl.db.lockedList = [];
this.ogl.db.lockedList.push(`${tech.id}_${tech.level}_${tech.onMoon ? 'moon' : 'planet'}`);
this.ogl.save();
let splitted = coords.split(':');
window.location.href = `https://${window.location.host}/game/index.php?page=ingame&component=fleetdispatch&ogl_mode=3&galaxy=${splitted[0]}&system=${splitted[1]}&position=${splitted[2]}&mission=${this.ogl.db.options.defaultMission}&type=${tech.onMoon ? 3 : 1}`;
});
let remove = targetContainer.appendChild(Util.createDom('b', {
'class': 'ogl_button material-icons'
}, 'close'));
remove.addEventListener('click', () => {
delete this.ogl.db.lock[coords][`${tech.id}_${tech.level}_${!tech.onMoon ? 'planet' : 'moon'}`];
this.ogl.save();
this.ogl.component.popup.close();
this.checkLockedTechs(coords, noSub);
});
let offset = tech.onMoon ? 3 : 0;
cumul[0 + offset] += tech.metal;
cumul[1 + offset] += tech.crystal;
cumul[2 + offset] += tech.deut;
}
['planet', 'moon'].forEach(e => {
let headerContainer = e == 'planet' ? planetContainer : moonContainer;
let offset = e == 'planet' ? 0 : 3;
headerContainer.appendChild(Util.createDom('span', {
'class': 'ogl_header'
}, e));
headerContainer.appendChild(Util.createDom('i', {
'class': 'ogl_header'
}, ' '));
headerContainer.appendChild(Util.createDom('b', {
'class': 'ogl_header ogl_metal'
}, Util.formatToUnits(cumul[0 + offset])));
headerContainer.appendChild(Util.createDom('b', {
'class': 'ogl_header ogl_crystal'
}, Util.formatToUnits(cumul[1 + offset])));
headerContainer.appendChild(Util.createDom('b', {
'class': 'ogl_header ogl_deut'
}, Util.formatToUnits(cumul[2 + offset])));
headerContainer.appendChild(Util.createDom('i', {
'class': 'ogl_header'
}, ' '));
let send = headerContainer.appendChild(Util.createDom('b', {
'class': 'ogl_button ogl_header material-icons'
}, 'local_shipping'));
send.addEventListener('click', () => {
this.ogl.db.lockedList = [];
for (let tech of Object.values(this.ogl.db.lock[coords])) {
if (this.ogl.db.lock[coords][`${tech.id}_${tech.level}_${e}`]) {
this.ogl.db.lockedList.push(`${tech.id}_${tech.level}_${e}`);
this.ogl.save();
let splitted = coords.split(':');
window.location.href = `${window.location.protocol}//${window.location.host}/game/index.php?page=ingame&component=fleetdispatch&ogl_mode=3&galaxy=${splitted[0]}&system=${splitted[1]}&position=${splitted[2]}&mission=${this.ogl.db.options.defaultMission}&type=${tech.onMoon ? 3 : 1}`;
}
}
});
let remove = headerContainer.appendChild(Util.createDom('b', {
'class': 'ogl_button ogl_header material-icons'
}, 'close'));
remove.addEventListener('click', () => {
for (let tech of Object.values(this.ogl.db.lock[coords])) {
if (this.ogl.db.lock[coords][`${tech.id}_${tech.level}_${e}`]) delete this.ogl.db.lock[coords][`${tech.id}_${tech.level}_${e}`];
}
this.ogl.save();
this.ogl.component.popup.close();
this.checkLockedTechs(coords);
});
});
this.ogl.component.popup.open(container);
});
if (refresh && refresh == coords) button.click();
}
});
}
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.current[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}`));
});
}
checkCrawlers() {
if (this.ogl.current.type == 'planet' && (this.ogl.page == 'supplies' || this.ogl.page == 'shipyard')) {
let currentCoords = this.ogl.current.coords.join(':');
let maxCrawler = ((this.ogl.db.me.planets?.[currentCoords]?.techs?.[1] || 0) + (this.ogl.db.me.planets?.[currentCoords]?.techs?.[2] || 0) + (this.ogl.db.me.planets?.[currentCoords]?.techs?.[3] || 0)) * 8;
if (document.querySelector('#officers .geologist.on') && this.ogl.account.class == 1) maxCrawler += maxCrawler * .1;
document.querySelector('.technology[data-technology="217"] .amount span').appendChild(Util.createDom('span', {
'class': 'ogl_maxCrawler'
}, ` / ${Util.formatNumber(Math.floor(maxCrawler))}`));
}
}
getEmpireData() {
if (document.querySelector('.commander.on')) {
let getEmpireResources = i => {
$.ajax({
url: `${window.location.protocol}//${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;
if (!data) return;
Object.values(data).forEach(p => {
let coords = p.coordinates.slice(1, -1);
if (p.type != 1) coords += ':M';
Object.keys(p).forEach(k => {
if (!isNaN(k)) {
this.ogl.db.me.planets[coords] = this.ogl.db.me.planets[coords] || {
techs: {}
};
this.ogl.db.me.planets[coords].techs[k] = p[k];
}
else {
this.ogl.db.me.planets[coords] = this.ogl.db.me.planets[coords] || {};
this.ogl.db.me.planets[coords].resources = this.ogl.db.me.planets[coords].resources || {};
this.ogl.db.me.planets[coords].production = this.ogl.db.me.planets[coords].production || [];
if (k == 'metal') this.ogl.db.me.planets[coords].resources.metal = p[k];
else if (k == 'crystal') this.ogl.db.me.planets[coords].resources.crystal = p[k];
else if (k == 'deuterium') this.ogl.db.me.planets[coords].resources.deut = p[k];
else if (k == 'production') {
this.ogl.db.me.planets[coords].production[0] = (p[k].hourly[0] / 3600).toFixed(2);
this.ogl.db.me.planets[coords].production[1] = (p[k].hourly[1] / 3600).toFixed(2);
this.ogl.db.me.planets[coords].production[2] = (p[k].hourly[2] / 3600).toFixed(2);
this.ogl.db.me.planets[coords].production[3] = Date.now();
}
}
});
['metal', 'crystal', 'deut'].forEach((res, index) => {
let targetType = i != 1 ? 'planetlink' : 'moonlink';
let targetID = i != 1 ? p.id : p.planetID;
let target = document.querySelector(`.smallplanet[id="planet-${targetID}"]`);
if (target.querySelector(`.${targetType} .ogl_stock .ogl_${res}`)) target.querySelector(`.${targetType} .ogl_stock .ogl_${res}`).textContent = Util.formatToUnits(this.ogl.db.me.planets[coords].resources[res]);
});
});
if (i == 0) getEmpireResources(1);
else this.ogl.save();
}
});
}
getEmpireResources(0);
}
}
reloadEventbox() {
if (document.querySelector('#eventboxContent h2 .ogl_button') || !document.querySelector('#eventboxContent h2')) return;
let button = document.querySelector('#eventboxContent h2').appendChild(Util.createDom('div', {
'class': 'ogl_button material-icons'
}, 'refresh'));
button.addEventListener('click', () => {
if (document.querySelector('#eventboxContent #eventContent').querySelector('.ogl_loader')) return;
document.querySelector('#eventboxContent #eventContent').textContent = '';
document.querySelector('#eventboxContent #eventContent').appendChild(Util.createDom('div', {
'class': 'ogl_loader'
}));
$.ajax({
url: eventlistLink,
success: function (response) {
$("#eventboxContent").html(response);
toggleEvents.loaded = true;
}
});
});
}
}
class Util {
static importToPTRE(apiKey, ogl) {
Util.getJSON(`https://ptre.chez.gg/scripts/oglight_import.php?team_key=${ogl.ptre}&sr_id=${apiKey}`, result => {
fadeBox(result.message_verbose, result.code != 1);
});
}
static genTrashsimLink(apiKey, ogl) {
let coords = ogl.current.coords;
let jsonTechs = {
"0": [{
planet: {
galaxy: coords[0],
system: coords[1],
position: coords[2],
},
class: ogl.account.class,
characterClassesEnabled: true,
"research": {}
}]
};
for (let [key, value] of Object.entries(ogl.db.me.techs)) {
jsonTechs[0][0].research[key] = {
"level": value
};
}
jsonTechs = btoa(JSON.stringify(jsonTechs));
let lang = ogl.universe.lang == 'us' ? 'en' : ogl.universe.lang;
return 'https://trashsim.universeview.be/' + lang + '?SR_KEY=' + apiKey + '#prefill=' + jsonTechs;
}
static getXML(url, callback, noRetry) {
const controller = new AbortController();
const timeout = setTimeout(() => controller.abort(), 2000);
fetch(url, {
signal: controller.signal
})
.then(response => response.text())
.then(data => {
clearTimeout(timeout);
let xml = new DOMParser().parseFromString(data, 'text/html');
callback(xml);
})
.catch(error => {
if (!noRetry) Util.getXML(url, callback, true);
else console.log(`Failed to fetch ${url}`);
});
}
static getJSON(url, callback) {
fetch(url)
.then(response => response.json())
.then(data => callback(data));
}
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 updateCheckIntInput(callback) {
let old = checkIntInput;
checkIntInput = function (id, minVal, maxVal) {
old.call(window, id, minVal, maxVal);
callback();
}
}
static formatToUnits(value, forced, offset) {
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);
if (offset) {
result = `<span style="font-size:${Math.max(10 + Math.floor((order-1) * 1.5), 10)}px;">${result} ${suffix}</span>`;
}
else {
result = suffix ? result + ' ' + suffix : result;
}
return result;
}
static formatFromUnits(value) {
if (!value) return 0;
let offset = (value.split(LocalizationStrings.thousandSeperator).length - 1) * 3;
if (LocalizationStrings.thousandSeperator == LocalizationStrings.decimalPoint) offset = 0;
let splitted = value.match(/\d+/g)[0].length;
//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 findObjectByValue(object, value) {
return Object.keys(object).find(key => object[key] === value);
}
}
class MessageManager {
constructor(ogl) {
this.ogl = ogl;
this.spyTable;
this.dataList = [];
this.tableReady = false;
if (this.ogl.page == 'messages') {
// check reports tab
this.ogl.observeMutation(() => this.checkCurrentTab(), 'tablereport');
// check opened message
this.ogl.observeMutation(() => {
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'));
if (this.ogl.ptre) {
let ptreButton = detail.querySelector('.msg_actions').appendChild(Util.createDom('div', {
'class': 'icon_nf ogl_sim tooltip',
'title': 'import to PTRE'
}, 'P'));
ptreButton.addEventListener('click', () => Util.importToPTRE(apiKey, this.ogl));
}
}
}, 'simbutton');
}
}
checkCurrentTab() {
let tabID = ogame.messages.getCurrentMessageTab();
if (tabID == 21) this.checkRaid();
else if (tabID == 22) this.checkExpeditions();
else if (tabID == 23) this.checkTransports();
else if (tabID == 24) this.checkDebris();
else if (tabID == 25) this.checkTrash();
else if (tabID == 20) {
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');
}
if (this.spyTable) {
if (tabID == 20) this.spyTable.classList.remove('ogl_hidden');
else this.spyTable.classList.add('ogl_hidden');
}
}
checkTrash() {
this.reviveReady = true;
// ogame bug fix
document.querySelectorAll('.msg .js_actionRevive').forEach(button => {
button.classList.remove('js_actionRevive');
button.addEventListener('click', () => {
if (!this.reviveReady) {
setTimeout(() => button.click(), 20);
return;
}
let msg = button.closest('.msg');
let id = msg.getAttribute('data-msg-id');
let token = document.querySelectorAll('[name="token"]')[0].getAttribute('value');
this.reviveReady = false;
$.ajax({
type: 'POST',
url: '?page=messages',
dataType: 'json',
data: {
ajax: 1,
token: token,
messageId: id,
action: 104
}
}).done(result => {
if (result[id] == true && result.newAjaxToken) {
msg.remove();
document.querySelectorAll('[name="token"]').forEach(e => e.setAttribute('value', result.newAjaxToken));
ogame.messages.token = result.newAjaxToken;
this.reviveReady = true;
}
}).fail(result => {
console.log('bug, please refresh');
this.reviveReady = true;
});
});
});
}
checkTransports() {
// todo
}
checkRaid() {
let messages = document.querySelectorAll('#ui-id-2 div[aria-hidden="false"] .msg:not(.ogl_raidDone)');
if (messages.length > 0 && messages.length != document.querySelectorAll('#ui-id-2 div[aria-hidden="false"] .msg:not(.ogl_raidDone) .msg_date.ogl_timeZone').length) {
setTimeout(() => this.checkRaid(), 100);
return;
}
messages.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.getXML(`${window.location.protocol}//${window.location.host}/game/index.php?page=messages&messageId=${id}&tabid=21&ajax=1`, 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.account.id) fleetID.push(v.fleetID)
});
if (fleetID.length > 0) leftSide = true;
Object.values(json.defenderJSON.member).forEach(v => {
if (v && v.ownerID == this.ogl.account.id) 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.account.id) {
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]);
let line = Util.createDom('div', {
'class': 'ogl_expeResult'
});
['metal', 'crystal', 'deut'].forEach((r, index) => {
report[r] = renta[index];
line.appendChild(Util.createDom('div', {
'class': `ogl_${r}`
}, Util.formatToUnits(renta[index] || '0')));
});
message.prepend(line);
let target = json.coordinates.position == 16 ? 'expe' : 'raid';
this.ogl.db.stats[midnight] = this.ogl.db.stats[midnight] || {
idList: [],
expe: {},
raid: {},
expeOccurences: {},
raidOccuences: 0,
consumption: 0
};
this.ogl.db.stats.ignored = this.ogl.db.stats.ignored || {};
let saveReport = () => {
this.ogl.db.stats.total = this.ogl.db.stats.total || {};
this.ogl.db.stats.total[target] = this.ogl.db.stats.total[target] || {};
if (this.ogl.db.stats[midnight].idList.indexOf(id) == -1 && !this.ogl.db.stats.ignored[id]) {
this.ogl.db.stats[midnight].idList.push(id);
for (let [k, v] of Object.entries(report)) {
this.ogl.db.stats[midnight][target][k] = (this.ogl.db.stats[midnight][target][k] || 0) + v;
this.ogl.db.stats.total[target][k] = (this.ogl.db.stats.total[target][k] || 0) + v;
}
if (target == 'expe') {
this.ogl.db.stats[midnight].expeOccurences['fight'] = (this.ogl.db.stats[midnight].expeOccurences['fight'] || 0) + 1;
this.ogl.db.stats.total.expeOccurences['fight'] = (this.ogl.db.stats.total.expeOccurences['fight'] || 0) + 1;
this.ogl.db.stats[midnight].expeOccurences['none'] = (this.ogl.db.stats[midnight].expeOccurences['none'] || 0) - 1;
this.ogl.db.stats.total.expeOccurences['none'] = (this.ogl.db.stats.total.expeOccurences['none'] || 0) - 1;
}
else {
this.ogl.db.stats[midnight].raidOccuences = (this.ogl.db.stats[midnight].raidOccuences || 0) + 1;
this.ogl.db.stats.total.raidOccuences = (this.ogl.db.stats.total.raidOccuences || 0) + 1;
}
}
}
saveReport();
this.ogl.save();
this.ogl.component.empire.addStats();
// ignore button
if (target == 'raid') {
let ignore = line.appendChild(Util.createDom('div', {
'class': 'ogl_button ogl_ignoreRaid material-icons tooltip',
'title': this.ogl.component.lang.getText('ignoreRaid')
}));
if (this.ogl.db.stats.ignored[id]) ignore.classList.add('ogl_active');
ignore.addEventListener('click', () => {
if (this.ogl.db.stats.ignored[id]) {
delete this.ogl.db.stats.ignored[id];
ignore.classList.remove('ogl_active');
}
else {
ignore.classList.add('ogl_active');
let index = this.ogl.db.stats[midnight].idList.indexOf(id);
this.ogl.db.stats[midnight].idList.splice(index, 1);
this.ogl.db.stats.ignored[id] = Date.now();
for (let [k, v] of Object.entries(report)) {
this.ogl.db.stats[midnight][target][k] = (this.ogl.db.stats[midnight][target][k] || 0) - v;
this.ogl.db.stats.total[target][k] = (this.ogl.db.stats.total[target][k] || 0) - v;
}
}
saveReport();
this.ogl.save();
this.ogl.component.empire.addStats();
});
}
});
});
}
checkExpeditions() {
let messages = document.querySelectorAll('#ui-id-2 div[aria-hidden="false"] .msg:not(.ogl_expeditionDone)');
if (messages.length > 0 && messages.length != document.querySelectorAll('#ui-id-2 div[aria-hidden="false"] .msg:not(.ogl_expeditionDone) .msg_date.ogl_timeZone').length) {
setTimeout(() => this.checkExpeditions(), 100);
return;
}
messages.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.lang.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.lang.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.replace('none', '-')));
this.ogl.db.stats[midnight] = this.ogl.db.stats[midnight] || {
idList: [],
expe: {},
raid: {},
expeOccurences: {},
raidOccuences: 0,
consumption: 0
};
if (this.ogl.db.stats[midnight].idList.indexOf(id) == -1) {
this.ogl.db.stats[midnight].idList.push(id);
this.ogl.db.stats.total.expe = this.ogl.db.stats.total.expe || {};
this.ogl.db.stats.total.expeOccurences = this.ogl.db.stats.total.expeOccurences || {};
for (let [k, v] of Object.entries(result)) {
this.ogl.db.stats[midnight].expe[k] = (this.ogl.db.stats[midnight].expe[k] || 0) + v;
this.ogl.db.stats.total.expe[k] = (this.ogl.db.stats.total?.expe?.[k] || 0) + v;
}
this.ogl.db.stats[midnight].expeOccurences[type] = (this.ogl.db.stats[midnight].expeOccurences[type] || 0) + 1;
this.ogl.db.stats.total.expeOccurences[type] = (this.ogl.db.stats.total.expeOccurences[type] || 0) + 1;
}
this.ogl.save();
this.ogl.component.empire.addStats();
});
}
checkDebris() {
let messages = document.querySelectorAll('#ui-id-2 div[aria-hidden="false"] .msg:not(.ogl_debrisDone)');
if (messages.length > 0 && messages.length != document.querySelectorAll('#ui-id-2 div[aria-hidden="false"] .msg:not(.ogl_debrisDone) .msg_date.ogl_timeZone').length) {
setTimeout(() => this.checkDebris(), 100);
return;
}
messages.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.lang.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.db.stats[midnight] = this.ogl.db.stats[midnight] || {
idList: [],
expe: {},
raid: {},
expeOccurences: {},
raidOccuences: 0,
consumption: 0
};
if (this.ogl.db.stats[midnight].idList.indexOf(id) == -1) {
this.ogl.db.stats[midnight].idList.push(id);
this.ogl.db.stats.total.expe = this.ogl.db.stats.total.expe || {};
this.ogl.db.stats.total.expeOccurences = this.ogl.db.stats.total.expeOccurences || {};
for (let [k, v] of Object.entries(report)) {
this.ogl.db.stats[midnight][target][k] = (this.ogl.db.stats[midnight][target][k] || 0) + v;
this.ogl.db.stats.total[target][k] = (this.ogl.db.stats.total[target][k] || 0) + v;
}
if (target == 'expe') {
this.ogl.db.stats[midnight].expeOccurences['resources'] = (this.ogl.db.stats[midnight].expeOccurences['resources'] || 0) + 1;
this.ogl.db.stats.total.expeOccurences['resources'] = (this.ogl.db.stats.total.expeOccurences['resources'] || 0) + 1;
}
}
this.ogl.save();
this.ogl.component.empire.addStats();
});
}
checkReports() {
if (document.querySelector('#subtabs-nfFleetTrash.ui-state-active')) return;
if (this.ogl.db.options.togglesOff.indexOf('spytable') > -1) return;
if (!document.querySelector('#subtabs-nfFleetTrash .ogl_trash')) {
let deleteSpyDef = document.querySelector('#subtabs-nfFleetTrash').appendChild(Util.createDom('div', {
'class': 'material-icons ogl_button ogl_trash tooltip',
'title': this.ogl.component.lang.getText('deleteSpyDef')
}, 'visibility_off'));
deleteSpyDef.addEventListener('click', () => {
document.querySelectorAll('.msg').forEach(e => {
if (e.querySelector('.espionageDefText')) e.querySelector('.icon_refuse').click();
});
});
}
let messages = document.querySelectorAll('#ui-id-2 div[aria-hidden="false"] .msg:not(.ogl_ready)');
if (messages.length > 0 && messages.length != document.querySelectorAll('#ui-id-2 div[aria-hidden="false"] .msg:not(.ogl_ready) .msg_date.ogl_timeZone').length) {
setTimeout(() => this.checkReports(), 50);
return;
}
// ogame bug fix
this.killReady = true;
document.querySelectorAll('.msg .js_actionKill').forEach(button => {
button.classList.remove('js_actionKill');
button.addEventListener('click', () => {
if (!this.killReady) {
setTimeout(() => button.click(), 20);
return;
}
let msg = button.closest('.msg');
let id = msg.getAttribute('data-msg-id');
let token = document.querySelectorAll('[name="token"]')[0].getAttribute('value');
this.killReady = false;
$.ajax({
type: 'POST',
url: '?page=messages',
dataType: 'json',
data: {
ajax: 1,
token: token,
tabid: ogame.messages.getCurrentMessageTab(),
messageId: id,
action: 103
}
}).done(result => {
if (result[id] == true && result.newAjaxToken) {
msg.remove();
document.querySelectorAll('[name="token"]').forEach(e => e.setAttribute('value', result.newAjaxToken));
ogame.messages.token = result.newAjaxToken;
let line = this.spyTable?.querySelector(`[data-spy-id="${id}"]`);
if (line) {
if (line.nextSibling?.tagName == 'ASIDE') {
line.nextSibling.remove();
}
this.sum = this.sum || 0;
this.sum -= parseInt(line.getAttribute('data-renta'));
this.sumDetail = this.sumDetail || [0, 0, 0];
this.sumDetail[0] -= parseInt(line.getAttribute('data-metal'));
this.sumDetail[1] -= parseInt(line.getAttribute('data-crystal'));
this.sumDetail[2] -= parseInt(line.getAttribute('data-deut'));
this.calcTotal(this.sum, this.sumDetail, this.sumDetail[0] + this.sumDetail[1] + this.sumDetail[2]);
line.remove();
}
this.killReady = true;
}
}).fail(result => {
console.log('bug, please refresh');
this.killReady = true;
});
});
});
this.dataList = [];
if (this.spyTable) this.spyTable.innerHTML = '';
messages.forEach((report, index) => {
report.classList.add('ogl_ready');
if (report.closest('#fleettrashmessagespage')) return;
let params = new URLSearchParams(report.querySelector('.msg_head a').href);
let compacting = report.querySelectorAll('.compacting');
if (compacting.length > 0) {
let typeList = ['metal', 'crystal', 'deut', 'dm'];
typeList.forEach(typeID => {
let regex = new RegExp(`<span class="resspan">${this.ogl.component.lang.getText(typeID)}:`, 'g');
report.querySelector('.msg_content').innerHTML = report.querySelector('.msg_content').innerHTML.replace(regex, `<span class="resspan" data-type="${typeID}"><span>${this.ogl.component.lang.getText(typeID)}:</span>`);
});
let time = report.querySelector('.msg_date').textContent.replace(/ \.$/, '');
time = time.trim().replace(/[ \.]/g, ':').split(':');
time.forEach((t, index) => time[index] = t.padStart(2, '0'));
let 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);
/*let date = report.querySelector('.msg_date').textContent.replace(/ \.$/, ' ').replace(/\./g, ':').replace(/ /g, ':').split(':');
let formated = Date.parse(`${date[1]}/${date[0]}/${date[2]} ${date[3]}:${date[4]}:${date[5]}`);*/
let data = {};
data.id = report.getAttribute('data-msg-id');
data.date = newTime.getTime();
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') || "0", params.get('system') || "0", params.get('position') || "0"];
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.db.positions[this.ogl.find(this.ogl.db.positions, 'coords', 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[3].querySelectorAll('.resspan')[0].textContent.replace(/(\D*)/, '')),
Util.formatFromUnits(compacting[3].querySelectorAll('.resspan')[1].textContent.replace(/(\D*)/, '')),
Util.formatFromUnits(compacting[3].querySelectorAll('.resspan')[2].textContent.replace(/(\D*)/, '')),
];
data.total = data.resources.reduce((sum, x) => sum + x);
data.loot = parseInt(compacting[4].querySelector('.ctn').textContent.replace(/(\D*)/, '').replace(/%/, '')) / 100;
data.renta = Math.ceil(data.total * data.loot);
data.fleet = compacting[5].querySelectorAll('span').length > 0 ? Util.formatFromUnits(compacting[5].querySelectorAll('span.ctn')[0].textContent.replace(/(\D*)/, '').split(' ')[0]) : -1;
data.defense = compacting[5].querySelectorAll('span').length > 1 ? Util.formatFromUnits(compacting[5].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.attack = report.querySelector('.icon_attack').closest('a').href;
data.api = report.querySelector('.icon_apikey');
data.dom = report;
if (data.renta < this.ogl.db.options.rval && data.fleet == 0 && this.ogl.db.options.togglesOff.indexOf('autoclean') == -1) {
data.trash.click();
}
else {
this.dataList.push(data);
}
}
});
if (this.dataList.length > 0) this.buildSpyTable();
}
ch0eckTransports() {
let messages = document.querySelectorAll('#ui-id-2 div[aria-hidden="false"] .msg:not(.ogl_transpoDone)');
if (messages.length > 0 && messages.length != document.querySelectorAll('#ui-id-2 div[aria-hidden="false"] .msg:not(.ogl_transpoDone) .msg_date.ogl_timeZone').length) {
setTimeout(() => this.checkTransports(), 100);
return;
}
messages.forEach(message => {
if (!message.querySelector('.ogl_timeZone')) return;
message.classList.add('ogl_transpoDone');
let typeList = ['metal', 'crystal', 'deut', 'dm'];
let regex = new RegExp(`${this.ogl.component.lang.getText(typeList[0])}[ ]?:[ ]?(.*?) ${this.ogl.component.lang.getText(typeList[1])}`, 'g');
message.innerHTML = message.innerHTML.replace(/ /g, ' ').trim().replace(regex, `${this.ogl.component.lang.getText(typeList[0])}: <span class="ogl_metal">$1</span> ${this.ogl.component.lang.getText(typeList[1])}`);
regex = new RegExp(`${this.ogl.component.lang.getText(typeList[1])}[ ]?:[ ]?(.*?) ${this.ogl.component.lang.getText(typeList[2])}`, 'g');
message.innerHTML = message.innerHTML.replace(/ /g, ' ').trim().replace(regex, `${this.ogl.component.lang.getText(typeList[1])}: <span class="ogl_crystal">$1</span> ${this.ogl.component.lang.getText(typeList[2])}`);
regex = new RegExp(`${this.ogl.component.lang.getText(typeList[2])}[ ]?:[ ]?([^a-zA-Z<]+)`, 'g');
message.innerHTML = message.innerHTML.replace(/ /g, ' ').trim().replace(regex, `${this.ogl.component.lang.getText(typeList[2])}: <span class="ogl_deut">$1</span>`);
});
}
cleanString(str) {
['.', '(', ')', ':', ','].forEach(car => str = str.replace(new RegExp('\\' + car, 'g'), '')); // remove caracter(s)
[' de '].forEach(car => str = str.replace(new RegExp('\\' + car, 'g'), ' ')); // replace caracter(s) with a space
return str;
}
getExpeValue(locaAttr, message) {
let regex;
let isResource;
['metal', 'crystal', 'deut'].forEach(res => {
if (this.ogl.component.lang.getText(res) == locaAttr) isResource = true;
});
if (isResource && message.querySelector('.msg_content').textContent.indexOf(locaAttr + '.') > -1) regex = new RegExp('(\\d+) ' + this.cleanString(locaAttr), 'g');
else regex = new RegExp(this.cleanString(locaAttr) + ' (\\d+)', 'g');
let stringResult = regex.exec(this.cleanString(message.innerHTML))[1];
return parseInt(stringResult);
}
buildSpyTable() {
let highlightIndex;
this.dataList.sort((a, b) => {
if (this.ogl.db.options.spyFilter == "$") return b.renta - a.renta;
else if (this.ogl.db.options.spyFilter == "COORDS") return a.tmpCoords - b.tmpCoords;
else if (this.ogl.db.options.spyFilter == "FLEET") return b.fleet - a.fleet;
else if (this.ogl.db.options.spyFilter == "DEF") return b.defense - a.defense;
else if (this.ogl.db.options.spyFilter == "DATE") return b.date - a.date;
else if (this.ogl.db.options.spyFilter == "R_$") return a.renta - b.renta;
else if (this.ogl.db.options.spyFilter == "R_COORDS") return b.tmpCoords - a.tmpCoords;
else if (this.ogl.db.options.spyFilter == "R_FLEET") return a.fleet - b.fleet;
else if (this.ogl.db.options.spyFilter == "R_DEF") return a.defense - b.defense;
else if (this.ogl.db.options.spyFilter == "R_DATE") return a.date - b.date;
});
if (!this.spyTable) {
this.spyTable = Util.createDom('div', {
'class': 'ogl_spyTable'
});
document.querySelector('ul.subtabs').after(this.spyTable);
}
else this.spyTable.textContent = '';
let thead = this.spyTable.appendChild(Util.createDom('div'));
let tbody = this.spyTable.appendChild(Util.createDom('div'));
let header = thead.appendChild(Util.createDom('div'));
//header.appendChild(Util.createDom('th', {}, ''));
header.appendChild(Util.createDom('th', {
'data-filter': 'DATE'
}, 'age'));
header.appendChild(Util.createDom('th', {
'data-filter': 'COORDS'
}, 'coords'));
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.db.options.defaultShip}));
let headerActions = header.appendChild(Util.createDom('th', {
'class': 'ogl_headerActions'
}));
let clean = headerActions.appendChild(Util.createDom('div', {
'class': 'material-icons ogl_button tooltip',
'title': this.ogl.component.lang.getText('cleanReport')
}, 'cleaning_services'));
clean.addEventListener('click', () => {
this.spyTable.querySelectorAll('div[data-coords]').forEach(line => {
if (!line.querySelector('.ogl_renta.ogl_important') && !line.querySelector('.ogl_refleet.ogl_important')) {
line.querySelector('.ogl_reportOptions div[data-title="delete"]').click();
}
});
});
header.querySelectorAll('th[data-filter]').forEach(filter => {
if (this.ogl.db.options.spyFilter.indexOf(filter.getAttribute('data-filter')) > -1) {
filter.classList.add('ogl_active');
highlightIndex = [].indexOf.call(filter.parentNode.children, filter);
}
filter.addEventListener('click', () => {
highlightIndex = [].indexOf.call(filter.parentNode.children, filter);
this.ogl.db.options.spyFilter = this.ogl.db.options.spyFilter.indexOf('R_') > -1 ? filter.getAttribute('data-filter') : 'R_' + filter.getAttribute('data-filter');
this.ogl.save();
this.spyTable.remove();
this.spyTable = false;
document.querySelectorAll('.msg.ogl_ready').forEach(e => e.classList.remove('ogl_ready'));
this.checkReports();
});
});
let sum = 0;
let sumTotal = 0;
let sumDetail = [0, 0, 0];
this.dataList.forEach((report, index) => {
if (report.coords.join(':') == '0:0:0') return;
let content = tbody.appendChild(Util.createDom('div', {
'data-coords': report.coords.join(':'),
'data-color': report.color,
'data-spy-id': report.id,
'data-renta': report.renta,
'data-metal': report.resources[0],
'data-crystal': report.resources[1],
'data-deut': report.resources[2]
}));
let expanded = tbody.appendChild(Util.createDom('aside'));
if (report.attacked) content.classList.add('ogl_attacked');
// index
//let indexContent = content.appendChild(Util.createDom('td'));
// date
let deltaDate = serverTime.getTime() - timeDiff - report.date;
let dateObj = new Date(parseInt(report.date));
let formatedDate = `${dateObj.toLocaleDateString('fr-FR')} ${dateObj.toLocaleTimeString('fr-FR')}`;
let dateContent = content.appendChild(Util.createDom('td', {
'class': 'ogl_reportDate tooltip',
'title': formatedDate
}));
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'
}));
let coordsA = Util.createDom('a', {
'href': `${window.location.protocol}//${window.location.host}/game/index.php?page=ingame&component=galaxy&galaxy=${report.coords[0]}&system=${report.coords[1]}&position=${report.coords[2]}`
}, `<span>${report.coords.join(':')}</span>`);
coords.appendChild(coordsA);
// type
coordsA.appendChild(Util.createDom('div', {
'class': 'material-icons ogl_type'
}, report.type == 1 ? 'language' : 'brightness_2'))
if (report.attacked) coords.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));
// ships
let shipsA;
//shipList = [this.ogl.db.options.defaultShip, this.ogl.db.options.secondShip];
[this.ogl.db.options.defaultShip].forEach(shipID => {
let shipsCount = this.ogl.component.fleet.calcRequiredShips(shipID, Math.round(report.renta * 1.07)); // 7% more resources
shipsA = Util.createDom('a', {
'href': `${window.location.protocol}//${window.location.host}/game/index.php?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}&ogl_mode=2&oglLazy=true`
}, '<span>' + Util.formatToUnits(shipsCount, 1) + ' ' + this.ogl.component.lang.getText('abbr' + this.ogl.db.options.defaultShip) + '</span>');
if (!this.ogl.current.techs[this.ogl.db.options.defaultShip] || this.ogl.current.techs[this.ogl.db.options.defaultShip] < shipsCount) shipsA.classList.add('ogl_danger');
});
// renta
let renta = content.appendChild(Util.createDom('td', {
'class': 'tooltip ogl_renta'
}));
shipsA.innerHTML += `<div>${Util.formatNumber(report.renta) || '0'}</div>`;
renta.appendChild(shipsA);
if (report.renta >= this.ogl.db.options.rval) renta.classList.add('ogl_important');
let resources = ['metal', 'crystal', 'deut'];
let resourcesName = [this.ogl.component.lang.getText('metal'), this.ogl.component.lang.getText('crystal'), this.ogl.component.lang.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>`;
});
renta.title += `<hr><div>Total: <span class="float_right">${Util.formatToUnits(report.total)}</span></div>`;
let currentRes = report.total;
let currentRenta = report.renta;
let shipList = [202, 203, 219, 210];
expanded.appendChild(Util.createDom('ul'));
shipList.forEach(ship => expanded.appendChild(Util.createDom('ul', {
'data-ship': ship
}, `<div class="ogl_shipIcon ogl_${ship}"></div>`)));
for (let i = 0; i < 6; i++) {
currentRenta = Math.ceil(currentRes * report.loot);
currentRes = currentRes - currentRenta;
expanded.querySelector('ul').appendChild(Util.createDom('li', {}, Util.formatToUnits(currentRenta)));
shipList.forEach(ship => {
let shipsCount = this.ogl.component.fleet.calcRequiredShips(ship, Math.round(currentRenta * 1.07));
let a = Util.createDom('a', {
'class': 'ogl_added',
'href': `${window.location.protocol}//${window.location.host}/game/index.php?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${ship}=${shipsCount}&ogl_mode=2&oglLazy=true`
}, shipsCount.toLocaleString('de-DE') || '0');
expanded.querySelector(`[data-ship="${ship}"]`).appendChild(a);
if (shipsCount === Infinity) a.classList.add('ogl_disabled');
});
}
// fleet
let fleet = content.appendChild(Util.createDom('td', {
'class': 'ogl_refleet'
}, (Util.formatToUnits(report.fleet, 1, true) || '0').replace('-1', '?')))
if (report.fleet >= this.ogl.db.options.rval || report.fleet == -1) {
fleet.classList.add('ogl_important');
content.classList.add('ogl_caution');
}
// def
let def = content.appendChild(Util.createDom('td', {
'class': 'ogl_redef'
}, (Util.formatToUnits(report.defense, 1, true) || '0').replace('-1', '?')));
if (report.defense > 0 || report.defense == -1) {
def.classList.add('ogl_important');
content.classList.add('ogl_caution');
}
// color
let colorContent = coords.appendChild(Util.createDom('div', {
'class': 'ogl_colorButton tooltipClose'
}));
colorContent.addEventListener('click', event => {
if (report.coords[2] <= 15) {
let colors = Util.createDom('div', {
'class': 'ogl_colorAll ogl_tooltipColor'
});
this.ogl.component.color.addColorUI(colorContent, colors, this.ogl.find(this.ogl.db.positions, 'coords', report.coords.join(':')), event);
this.ogl.component.tooltip.open(colorContent, false, false, colors);
}
});
//actions
let actions = content.appendChild(Util.createDom('td', {
'class': 'ogl_reportOptions'
}));
actions.appendChild(Util.createDom('div', {
'class': 'material-icons tooltip',
'onclick': report.spy,
'title': 'spy this planet'
}, 'visibility'));
let more = actions.appendChild(Util.createDom('div', {
'class': 'material-icons tooltip ogl_expand',
'title': 'expand'
}));
more.addEventListener('click', () => {
expanded.classList.toggle('ogl_active');
});
// attack
let attack = actions.appendChild(Util.createDom('a', {
'class': 'material-icons tooltip',
'href': report.attack,
'title': 'attack this planet'
}, 'adjust'));
let apiKey = Util.createDom('div', {});
apiKey.innerHTML = report.api.getAttribute('title');
if (!apiKey.querySelector('input')) console.log(error, report);
apiKey = apiKey.querySelector('input').value;
if (report.api && report.coords[2] <= 15) {
let simButton = actions.appendChild(Util.createDom('div', {
'class': 'tooltip',
'title': 'trashsim'
}, 'S'));
simButton.addEventListener('click', () => window.open(Util.genTrashsimLink(apiKey, this.ogl), '_blank'));
if (this.ogl.ptre) {
let ptreButton = actions.appendChild(Util.createDom('div', {
'class': 'ogl_smallPTRE tooltip',
'title': 'import to PTRE'
}, 'P'));
ptreButton.addEventListener('click', () => Util.importToPTRE(apiKey, this.ogl));
}
}
let trash = actions.appendChild(Util.createDom('div', {
'class': 'material-icons tooltip',
'title': 'delete'
}, 'clear'));
trash.addEventListener('click', () => {
report.trash?.click();
});
if (report.api && !report.dom.querySelector('.ogl_sim')) {
let otherSimbutton = report.dom.querySelector('.msg_actions').appendChild(Util.createDom('div', {
'class': 'icon_nf ogl_sim'
}, 'S'));
otherSimbutton.addEventListener('click', () => window.open(Util.genTrashsimLink(apiKey, this.ogl), '_blank'));
if (this.ogl.ptre) {
let otherPtreButton = report.dom.querySelector('.msg_actions').appendChild(Util.createDom('div', {
'class': 'icon_nf ogl_sim tooltip',
'title': 'import to PTRE'
}, 'P'));
otherPtreButton.addEventListener('click', () => Util.importToPTRE(apiKey, this.ogl));
}
}
if (highlightIndex) content.querySelectorAll(`td`)[highlightIndex].classList.add('highlighted');
sumTotal += report.total;
sum += report.renta;
for (let i = 0; i < 3; i++) sumDetail[i] += report.resources[i];
});
this.sum = sum;
this.sumDetail = sumDetail;
this.calcTotal(sum, sumDetail, sumTotal);
//document.querySelector('.ogl_key.material-icons') && document.querySelector('.ogl_key.material-icons').classList.remove('ogl_hidden');
}
calcTotal(sumValue, sumDetail, sumTotal) {
document.querySelector('.ogl_spyTable .ogl_totalSum') && document.querySelector('.ogl_spyTable .ogl_totalSum').remove();
let total = this.spyTable.appendChild(Util.createDom('div', {
'class': 'ogl_totalSum'
}));
total.appendChild(Util.createDom('th', {}, ''));
total.appendChild(Util.createDom('th', {}, ''));
total.appendChild(Util.createDom('th', {}, ''));
let cell = total.appendChild(Util.createDom('th', {
'class': 'tooltip'
}, Util.formatToUnits(sumValue)));
total.appendChild(Util.createDom('th', {}, ''));
total.appendChild(Util.createDom('th', {}, ''));
total.appendChild(Util.createDom('th', {}, ''));
let resources = ['metal', 'crystal', 'deut'];
let resourcesName = [this.ogl.component.lang.getText('metal'), this.ogl.component.lang.getText('crystal'), this.ogl.component.lang.getText('deut')];
sumDetail.forEach((res, index) => {
cell.title += `<div>${resourcesName[index]}: <span class="ogl_${resources[index]} float_right">${Util.formatToUnits(sumDetail[index])}</span></div>`;
});
cell.title += `<hr><div>Total: <span class="float_right">${Util.formatToUnits(sumTotal)}</span></div>`;
}
}
class KeyboardManager {
constructor(ogl) {
this.ogl = ogl;
this.dom = (document.querySelector('#cutty') || document.querySelector('#norm')).appendChild(Util.createDom('div', {
'class': 'ogl_keyList'
}));
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);
this.addKey('i', this.ogl.component.lang.getText('prevPlanet'), () => {
window.location.href = this.ogl.prevLink;
});
this.addKey('o', this.ogl.component.lang.getText('nextPlanet'), () => {
window.location.href = this.ogl.nextLink;
});
if (this.ogl.page == 'fleetdispatch') {
this.addKey('t', this.ogl.component.lang.getText('attackCurrentTarget'), () => {
this.ogl.component.sidebar.displayTargetList(() => {
if (this.ogl.db.options.nextTargets[0] && this.ogl.db.options.nextTargets[1]) {
fleetDispatcher.resetShips();
let shipID = this.ogl.db.options.defaultShip;
let maxShips = fleetDispatcher.shipsOnPlanet.find(e => e.id == shipID)?.number || 0;
let shipCount = this.ogl.component.fleet.calcRequiredShips(shipID, this.ogl.db.options.rval);
fleetDispatcher.selectShip(shipID, Math.min(shipCount, maxShips));
let coords = this.ogl.db.options.nextTargets[0].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();
if (fleetDispatcher.currentPage == 'fleet2') fleetDispatcher.updateTarget();
this.ogl.component.fleet.targetSelected = true;
}
else {
fadeBox(this.ogl.component.lang.getText('noTargetSelected'), true);
}
});
});
this.addKey('s', this.ogl.component.lang.getText('scExpe'), () => {
if (fleetDispatcher.currentPage == 'fleet1') this.ogl.component.fleet.expedition(202);
fleetDispatcher.fetchTargetPlayerData();
});
this.addKey('l', this.ogl.component.lang.getText('lcExpe'), () => {
if (fleetDispatcher.currentPage == 'fleet1') this.ogl.component.fleet.expedition(203);
});
this.addKey('f', this.ogl.component.lang.getText('pfExpe'), () => {
if (fleetDispatcher.currentPage == 'fleet1') this.ogl.component.fleet.expedition(219);
});
this.addKey('a', this.ogl.component.lang.getText('allShipsRes'), () => {
if (fleetDispatcher.currentPage == 'fleet1') fleetDispatcher.selectAllShips();
if (fleetDispatcher.currentPage == 'fleet2') fleetDispatcher.selectMaxAll();
fleetDispatcher.refresh();
});
this.addKey('2-9', this.ogl.component.lang.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 == 'fleet2') {
let fleetDispatcherResources = ['metalOnPlanet', 'crystalOnPlanet', 'deuteriumOnPlanet'];
document.querySelectorAll('#fleet2 #resources .res_wrap').forEach((resource, index) => {
let cargoType = ['cargoMetal', 'cargoCrystal', 'cargoDeuterium'];
let currentMax = fleetDispatcher[fleetDispatcherResources[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.focusSendFleet();
});
}
fleetDispatcher.refresh();
});
this.addKey('r', this.ogl.component.lang.getText('reverseAllShipsRes'), () => {
if (fleetDispatcher.currentPage == 'fleet1') document.querySelectorAll('#fleet1 li[data-status="on"] .ogl_delta').forEach(e => e.click());
if (fleetDispatcher.currentPage == 'fleet2') document.querySelectorAll('#fleet2 .res .ogl_delta').forEach(e => e.click());
});
this.addKey('p', this.ogl.component.lang.getText('prevFleet'), () => {
if (fleetDispatcher.currentPage != 'fleet1') return;
if (!this.ogl.db.lastFleet) return;
fleetDispatcher.resetShips();
if (this.ogl.db.lastFleet.shipsToSend) Object.values(this.ogl.db.lastFleet.shipsToSend).forEach(ship => fleetDispatcher.selectShip(ship.id, ship.number));
if (this.ogl.db.lastFleet.targetPlanet) {
document.querySelector('#galaxy').value = this.ogl.db.lastFleet.targetPlanet.galaxy;
document.querySelector('#system').value = this.ogl.db.lastFleet.targetPlanet.system;
document.querySelector('#position').value = this.ogl.db.lastFleet.targetPlanet.position;
document.querySelector('#position').value = this.ogl.db.lastFleet.targetPlanet.position;
fleetDispatcher.targetPlanet = this.ogl.db.lastFleet.targetPlanet;
fleetDispatcher.mission = this.ogl.db.lastFleet.mission;
fleetDispatcher.cargoMetal = Math.min(this.ogl.db.lastFleet.cargoMetal, fleetDispatcher.metalOnPlanet, fleetDispatcher.getFreeCargoSpace());
fleetDispatcher.cargoCrystal = Math.min(this.ogl.db.lastFleet.cargoCrystal, fleetDispatcher.crystalOnPlanet, fleetDispatcher.getFreeCargoSpace());
fleetDispatcher.cargoDeuterium = Math.min(this.ogl.db.lastFleet.cargoDeuterium, fleetDispatcher.deuteriumOnPlanet, fleetDispatcher.getFreeCargoSpace());
fleetDispatcher.speedPercent = this.ogl.db.lastFleet.speedPercent;
if (fleetDispatcher.mission == 15) {
fleetDispatcher.expeditionTime = this.ogl.db.lastFleet.expeditionTime;
fleetDispatcher.updateExpeditionTime();
}
this.ogl.component.fleet.updateSpeedPercent();
}
fleetDispatcher.refresh();
fleetDispatcher.focusSubmitFleet1();
});
}
if (this.ogl.page == 'messages') {
this.addKey('enter', 'Send fleet on next spies table line', () => {
if (document.querySelector('.ogl_spyTable') && document.querySelectorAll('.ogl_spyTable div[data-coords]:not(.ogl_attacked):not(.ogl_notGray)')[0]) {
document.querySelectorAll('.ogl_spyTable div[data-coords]:not(.ogl_attacked):not(.ogl_caution)')[0].querySelector('.ogl_renta a').click();
}
});
}
}
addKey(key, text, callback) {
this.ogl.keyboardActionsList = this.ogl.keyboardActionsList || {};
this.ogl.keyboardActionsList[key] = callback;
let tip = this.dom.appendChild(Util.createDom('div', {
'class': 'ogl_button tooltipLeft',
'title': text,
'data-trigger': key.toUpperCase()
}, key.toUpperCase()));
if (key == 'enter') {
tip.classList.add('material-icons');
tip.textContent = 'subdirectory_arrow_left';
}
tip.addEventListener('click', () => callback());
}
}
class SidebarManager {
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.ogl.db.sidebarView = this.ogl.db.sidebarView || false;
this.cross.addEventListener('click', () => this.close());
this.init();
}
init() {
if (this.ogl.db.sidebarView == 'pinned') this.displayPinnedTarget();
if (this.ogl.db.sidebarView == 'targetList') this.displayTargetList();
}
displayPinnedTarget() {
this.ogl.db.sidebarView = 'pinned';
this.ogl.save();
this.content.textContent = '';
if (this.ogl.db.pinnedList.length > 0) {
let player = this.ogl.db.players[this.ogl.find(this.ogl.db.players, 'id', this.ogl.db.pinnedList[0])[0]];
let container = Util.createDom('div');
container.innerHTML = `
<h1><span>${player.name}</span></h1>
<div class="splitLine"></div>
<div class="ogl_scrollable">
<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="ogl_actionsContainer"></div>
<div class="splitLine"></div>
<div class="ogl_stalkInfo">
<div class="ogl_stalkPlanets ogl_pinnedContent"></div>
</div>
</div>
`;
let rawStart = '000000';
let multi = 1;
let isMulti = false;
let planetIndexes = this.ogl.find(this.ogl.db.positions, 'playerID', this.ogl.db.pinnedList[0]);
planetIndexes.forEach(planetIndex => {
let planet = this.ogl.db.positions[planetIndex];
let splitted = planet.coords.split(':');
let item = Util.createDom('div', {
'data-coords': planet.coords
});
let coordsDiv = item.appendChild(Util.createDom('span', {}, planet.coords));
coordsDiv.addEventListener('click', () => {
this.ogl.component.tooltip.close();
this.ogl.component.galaxy.goToPosition(splitted[0], splitted[1], splitted[2]);
});
if (planet.main) coordsDiv.appendChild(Util.createDom('div', {
'class': 'material-icons ogl_mainPlanet'
}, 'star'));
let mSpy = item.appendChild(Util.createDom('div', {
'class': 'ogl_moonIcon material-icons',
'data-type': 3
}, 'brightness_2'));
mSpy.addEventListener('click', () => this.ogl.component.fleet.sendSpyProbe([splitted[0], splitted[1], splitted[2], 3], this.ogl.db.spyProbesCount, mSpy, true));
if (Date.now() - planet.lastMoonSpy < 60 * 60 * 1000) mSpy.classList.add('ogl_done');
let pSpy = item.appendChild(Util.createDom('div', {
'class': 'ogl_planetIcon material-icons',
'data-type': 1
}, 'language'));
pSpy.addEventListener('click', () => this.ogl.component.fleet.sendSpyProbe([splitted[0], splitted[1], splitted[2], 1], this.ogl.db.spyProbesCount, pSpy, true));
if (Date.now() - planet.lastSpy < 60 * 60 * 1000) pSpy.classList.add('ogl_done');
if (planet.moonID == -1) mSpy.classList.add('ogl_noPointer');
planet.color ? item.setAttribute('data-color', planet.color) : item.removeAttribute('data-color');
let pActivityDom = item.appendChild(Util.createDom('div', {
'class': 'ogl_planetActivity',
'data-activity': planet.activity
}, planet.activity || '?'));
let mActivityDom = item.appendChild(Util.createDom('div', {
'class': 'ogl_moonActivity',
'data-activity': planet.moonActivity
}, planet.moonActivity || '?'));
if (planet.activity) {
pActivityDom.textContent = planet.activity;
if (planet.activity == '*') pActivityDom.classList.add('ogl_short');
}
if (planet.moonID > -1 && planet.moonActivity) {
mActivityDom.textContent = planet.moonActivity;
if (planet.moonActivity == '*') mActivityDom.classList.add('ogl_short');
}
else mActivityDom.classList.add('ogl_hidden');
if (rawStart == planet.rawCoords.slice(0, -3)) {
item.setAttribute('data-multi', multi);
isMulti = true;
}
else if (isMulti) {
multi++;
isMulti = false;
}
rawStart = planet.rawCoords.slice(0, -3);
container.querySelector('.ogl_stalkPlanets').appendChild(item);
});
let buttonsContainer = container.querySelector('.ogl_actionsContainer');
let ptreAction = frame => {
frame = frame || 'week';
this.ogl.component.popup.load();
let container = Util.createDom('div', {
'class': 'ptreContent'
});
if (!this.ogl.ptre) {
container.innerHTML = `Error: no teamkey registered`;
this.ogl.component.popup.open(container);
return;
}
Util.getJSON(`https://ptre.chez.gg/scripts/oglight_get_player_infos.php?team_key=${this.ogl.ptre}&pseudo=${player.name}&player_id=${player.id}&input_frame=${frame}`, result => {
if (result.code == 1) {
let arrData = JSON.parse(result.activity_array.activity_array);
let checkData = JSON.parse(result.activity_array.check_array);
container.innerHTML = `
<h3>${this.ogl.component.lang.getText('reportFound')} :</h3>
<div class="ptreBestReport">
<div>
<div><b class="ogl_fleet"><i class="material-icons">military_tech</i>${Util.formatToUnits(result.top_sr_fleet_points)} pts</b></div>
<div><b>${new Date(result.top_sr_timestamp * 1000).toLocaleDateString('fr-FR')}</b></div>
</div>
<div>
<a class="ogl_button" target="_blank" href="${result.top_sr_link}">${this.ogl.component.lang.getText('topReportDetails')}</a>
<a class="ogl_button" target="_blank" href="https://ptre.chez.gg/?country=${this.ogl.universe.lang}&univers=${this.ogl.universe.number}&player_id=${player.id}">${this.ogl.component.lang.getText('playerProfile')}</a>
</div>
</div>
<div class="splitLine"></div>
<h3>${result.activity_array.title}</h3>
<div class="ptreActivities"><span></span><div></div></div>
<div class="splitLine"></div>
<div class="ptreFrames"></div>
<!--<ul class="ptreLegend">
<li><u>Green circle</u>: no activity detected & fully checked</li>
<li><u>Green dot</u>: no activity detected</li>
<li><u>Red dot</u>: multiple activities detected</li>
<li><u>Transparent dot</u>: not enough planet checked</li>
</ul>-->
`;
['last24h', 'yesterday', '3day', 'week', '2weeks', 'month'].forEach(f => {
let btn = container.querySelector('.ptreFrames').appendChild(Util.createDom('div', {
'class': 'ogl_button'
}, f));
btn.addEventListener('click', () => ptreAction(f));
});
if (result.activity_array.succes == 1) {
arrData.forEach((line, index) => {
if (!isNaN(line[1])) {
let div = Util.createDom('div', {
'class': 'tooltip'
}, `<div>${line[0]}</div>`);
let span = div.appendChild(Util.createDom('span', {
'class': 'ptreDotStats'
}));
let dot = span.appendChild(Util.createDom('div', {
'data-acti': line[1],
'data-check': checkData[index][1]
}));
let dotValue = line[1] / result.activity_array.max_acti_per_slot * 100 * 7;
dotValue = Math.ceil(dotValue / 30) * 30;
dot.style.color = `hsl(${Math.max(0, 100 - dotValue)}deg 75% 40%)`;
dot.style.opacity = checkData[index][1] + '%';
dot.style.padding = '7px';
let title;
let checkValue = Math.max(0, 100 - dotValue);
if (checkValue === 100) title = '- No activity detected';
else if (checkValue >= 60) title = '- A few activities detected';
else if (checkValue >= 40) title = '- Some activities detected';
else title = '- A lot of activities detected';
if (checkData[index][1] == 100) title += '<br>- Perfectly checked';
else if (checkData[index][1] >= 75) title += '<br>- Nicely checked';
else if (checkData[index][1] >= 50) title += '<br>- Decently checked';
else if (checkData[index][1] > 0) title = 'Poorly checked';
else title = 'Not checked';
div.setAttribute('title', title);
if (checkData[index][1] === 100 && line[1] == 0) dot.classList.add('ogl_active');
container.querySelector('.ptreActivities > div').appendChild(div);
}
});
}
else {
container.querySelector('.ptreActivities > span').textContent = result.activity_array.message;
}
}
else container.textContent = result.message;
this.ogl.component.popup.open(container);
});
}
let ptreBtn = buttonsContainer.appendChild(Util.createDom('div', {
'class': 'ogl_button ptrePinned'
}, 'PTRE'));
ptreBtn.addEventListener('click', () => ptreAction());
let historyBtn = buttonsContainer.appendChild(Util.createDom('div', {
'class': 'material-icons ogl_button'
}, 'history'));
historyBtn.addEventListener('click', () => this.displayPinnedList());
let deleteBtn = buttonsContainer.appendChild(Util.createDom('div', {
'class': 'material-icons ogl_button'
}, 'delete'));
deleteBtn.addEventListener('click', () => {
this.ogl.db.pinnedList.forEach((e, index) => {
if (e && e == player.id) {
this.ogl.db.pinnedList.splice(index, 1);
historyBtn.click();
}
});
});
this.open(container);
}
}
displayPinnedList() {
let content = Util.createDom('div', {
'class': 'ogl_historyList'
});
this.ogl.db.pinnedList.forEach(playerID => {
let historyPlayer = this.ogl.db.players[this.ogl.find(this.ogl.db.players, 'id', playerID)[0]];
let btn = content.appendChild(Util.createDom('div', {
'class': `ogl_button ${historyPlayer.status}`
}));
btn.appendChild(Util.createDom('b', {}, historyPlayer.name));
btn.appendChild(Util.createDom('span', {}, '#' + historyPlayer.rank.toString().replace('-1', '(b)')));
btn.appendChild(Util.createDom('i', {
'class': 'float_right'
}, `<i class="material-icons">military_tech</i>${Util.formatToUnits(historyPlayer.fleet)}`));
this.open(content);
btn.addEventListener('click', () => {
this.ogl.db.pinnedList.forEach((e, index) => {
if (e && e == playerID) this.ogl.db.pinnedList.splice(index, 1);
});
this.ogl.db.pinnedList.unshift(playerID);
if (this.ogl.db.pinnedList.length > 10) this.ogl.db.pinnedList.length = 10;
this.ogl.save();
this.displayPinnedTarget();
});
});
}
displayTargetList(callback) {
if (!callback) this.ogl.db.sidebarView = 'targetList';
this.ogl.save();
if (!callback) this.content.textContent = '';
let container = Util.createDom('div');
let currentGalaxy = this.ogl.db.options?.targetFilter?.[0] || 1;
let currentSystem = this.ogl.db.options?.targetFilter?.[1] || 0;
let systemSteps = 50;
let currentRaw = parseInt(`${currentGalaxy}:${currentSystem}:1`.split(':').map(x => x.padStart(3, '0')).join(''));
let targetCoords;
let nextTargetCoords;
this.ogl.db.options.nextTargets = this.ogl.db.options.nextTargets || [0, 0];
let colors = container.appendChild(Util.createDom('div', {
'class': 'ogl_toggleColors'
}));
let gMenu = container.appendChild(Util.createDom('div', {
'class': 'ogl_toggleGalaxies'
}));
let sMenu = container.appendChild(Util.createDom('div', {
'class': 'ogl_toggleSystems'
}));
let content = container.appendChild(Util.createDom('div', {
'class': 'ogl_stalkPlanets ogl_scrollable'
}));
['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.db.options.excludedColors.indexOf(color) == -1) toggle.classList.add('ogl_active');
toggle.addEventListener('click', () => {
let colorIndex = this.ogl.db.options.excludedColors.indexOf(color);
if (colorIndex > -1) this.ogl.db.options.excludedColors.splice(colorIndex, 1);
else this.ogl.db.options.excludedColors.push(color);
this.ogl.save();
this.displayTargetList();
});
});
for (let g = 1; g <= 12; g++) {
let gDiv = gMenu.appendChild(Util.createDom('div', {
'class': 'ogl_disabled',
'data-galaxy': g
}, g));
if (currentGalaxy == g) gDiv.classList.add('ogl_active');
gDiv.addEventListener('click', () => {
this.ogl.db.options.targetFilter[0] = g;
this.ogl.save();
this.displayTargetList();
});
for (let s = 0; s < 500; s += systemSteps) {
if (g == 1) {
let sDiv = sMenu.appendChild(Util.createDom('div', {
'class': 'ogl_disabled',
'data-system': s
}, s.toString()));
sDiv.addEventListener('click', () => {
this.ogl.db.options.targetFilter[1] = s;
this.ogl.save();
this.displayTargetList();
});
}
let loopRawStart = parseInt(`${g}:${s}:1`.split(':').map(x => x.padStart(3, '0')).join(''));
let loopRawEnd = loopRawStart + (systemSteps - 1) * 1000;
let indexList = this.ogl.findTargets(this.ogl.db.positions, 'rawCoords', loopRawStart, loopRawEnd);
if (indexList.length > 0) {
gDiv.classList.remove('ogl_disabled');
if (g == currentGalaxy) sMenu.querySelector(`[data-system="${s}"]`).classList.remove('ogl_disabled');
}
indexList.forEach(index => {
let entry = this.ogl.db.positions[index];
if (targetCoords && !nextTargetCoords) {
nextTargetCoords = entry.coords;
this.ogl.db.options.nextTargets[1] = entry.coords;
}
if (this.ogl.db.options.nextTargets[0] == entry.coords) {
targetCoords = entry.coords;
nextTargetCoords = false;
}
if (currentGalaxy == g && currentSystem == s) {
gDiv.classList.add('ogl_active');
sMenu.querySelector(`[data-system="${s}"]`).classList.add('ogl_active');
let div = content.appendChild(Util.createDom('div', {
'data-color': entry.color,
'data-playerID': entry.playerID,
'data-planetID': entry.id
}));
let splitted = entry.coords.split(':');
// coords
let coordsDiv = div.appendChild(Util.createDom('div', {}, entry.coords));
coordsDiv.addEventListener('click', () => {
this.ogl.component.tooltip.close();
this.ogl.component.galaxy.goToPosition(splitted[0], splitted[1], splitted[2]);
});
let playerIndex = this.ogl.find(this.ogl.db.players, 'id', entry.playerID)[0];
let player = this.ogl.db.players[playerIndex];
// player name
div.appendChild(Util.createDom('div', {
'class': player?.status
}, player?.name || '?'));
let pSpy = div.appendChild(Util.createDom('div', {
'class': 'ogl_planetIcon material-icons',
'data-type': 1
}, 'language'));
pSpy.addEventListener('click', () => this.ogl.component.fleet.sendSpyProbe([splitted[0], splitted[1], splitted[2], 1], this.ogl.db.spyProbesCount, pSpy, true));
if (Date.now() - entry.lastSpy < 60 * 60 * 1000) pSpy.classList.add('ogl_done');
let mSpy = div.appendChild(Util.createDom('div', {
'class': 'ogl_moonIcon material-icons ogl_noPointer',
'data-type': 3
}, 'brightness_2'));
if (entry.moonID && entry.moonID > -1) mSpy.classList.remove('ogl_noPointer');
mSpy.addEventListener('click', () => this.ogl.component.fleet.sendSpyProbe([splitted[0], splitted[1], splitted[2], 3], this.ogl.db.spyProbesCount, mSpy, true));
if (Date.now() - entry.lastMoonSpy < 60 * 60 * 1000) mSpy.classList.add('ogl_done');
let flag = div.appendChild(Util.createDom('div', {
'class': 'ogl_flagIcon material-icons'
}, 'flag'));
if (targetCoords == entry.coords) flag.classList.add('ogl_active');
flag.addEventListener('click', () => {
this.ogl.db.options.nextTargets = [entry.coords, 0];
this.displayTargetList();
});
}
});
}
}
if (!callback) this.open(container);
else callback();
}
open(html, id) {
this.content.innerHTML = '';
this.content.appendChild(html);
this.dom.classList.add('ogl_active');
}
close() {
this.ogl.db.sidebarView = false;
this.dom.classList.remove('ogl_active');
this.ogl.save();
}
}
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 JumpgateManager {
constructor(ogl) {
this.ogl = ogl;
this.ogl.db.jumpGateTimers = this.ogl.db.jumpGateTimers || {};
if (this.page == 'facilities' || this.ogl.current.type == 'moon') {
let calcTimer = level => {
return (0.25 * Math.pow(level, 2) - 7.57 * level + 67.34) / this.ogl.universe.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.db.jumpGateTimers[originCoords] = now + calcTimer(originLevel);
this.ogl.db.jumpGateTimers[destinationCoords] = now + calcTimer(destinationLevel);
this.ogl.save();
}
errorBoxAsArray(a.errorbox);
if (typeof (a.newToken) != "undefined") setNewTokenData(a.newToken);
}
}
this.ogl.observeMutation(() => {
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;
});
});
}
}, 'jumpgate');
this.addTimer();
}
addTimer() {
document.querySelectorAll('.smallplanet').forEach(planet => {
let coords = planet.querySelector('.planet-koords').textContent.slice(1, -1);
if (this.ogl.db.jumpGateTimers[coords] && this.ogl.db.jumpGateTimers[coords] > Date.now()) {
if (!planet.querySelector('.moonlink')) return;
let updateTimer = () => new Date(this.ogl.db.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.db.jumpGateTimers[coords] <= Date.now()) clearInterval(interval);
else div.textContent = updateTimer();
}, 1000);
}
});
}
}
class TimeManager {
constructor(ogl) {
this.ogl = ogl;
this.currentDetail;
let li = Util.createDom('li', {
'class': 'ogl_ping'
}, `${Math.abs(timeDelta/1000)} s`);
document.querySelector('#bar ul').appendChild(li);
if (timeDelta < -2000) li.classList.add('ogl_danger');
else if (timeDelta < -1000) li.classList.add('ogl_warning');
if (this.ogl.page == 'messages') {
this.ogl.observeMutation(() => {
document.querySelectorAll('.msg_date:not(.ogl_timeZone)').forEach(element => {
this.updateTime(element);
});
}, 'messagesdate');
}
this.checkCurrentBuilding();
this.ogl.addToUpdateQueue(() => {
document.querySelectorAll('#bar ul li.OGameClock:not(.ogl_ready), #arrivalTime:not(.ogl_ready), #returnTime:not(.ogl_ready)').forEach(element => {
element.classList.add('ogl_ready');
this.updateTime(element);
this.observe(element);
})
document.querySelectorAll('.allianceAttack .arrivalTime:not(.ogl_ready), .eventFleet .arrivalTime:not(.ogl_ready), .fleetDetails .absTime:not(.ogl_ready), .fleetDetails .nextabsTime:not(.ogl_ready)').forEach(element => {
element.classList.add('ogl_ready');
this.updateTime(element);
});
});
let pages = ['supplies', 'facilities', 'shipyard', 'defenses', 'research'];
if (pages.indexOf(this.ogl.page) > -1) {
Util.updateCheckIntInput(() => this.checkDetail());
this.ogl.observeMutation(() => this.checkDetail(), 'details');
}
}
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(serverTime - Math.round(timeDiff / 100000) * 100000 + 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) {}
});
}
checkDetail() {
// fix an ogame bug when an user spam click
if (document.querySelectorAll('#technologydetails').length > 1) {
document.querySelectorAll('#technologydetails').forEach((e, index) => {
if (index > 0) e.remove()
});
}
this.currentDetail = document.querySelector('#technologydetails_content');
if (this.currentDetail && this.currentDetail.querySelector('.og-loading').style.display == 'none') {
let amount = parseInt(this.currentDetail.querySelector('#build_amount')?.value || 1) || 1;
let domTime = this.currentDetail.querySelector('.build_duration time');
// prev / next / lock buttons actions
if (!this.currentDetail.querySelector('.ogl_detailActions')) {
let tech = {};
tech.id = parseInt(this.currentDetail.querySelector('#technologydetails').getAttribute('data-technology-id'));
tech.name = this.currentDetail.querySelector('#technologydetails h3').textContent;
tech.initial = {};
tech.initial.time = domTime.getAttribute('datetime');
tech.initial.level = parseInt(this.currentDetail.querySelector('.information .level') ? this.currentDetail.querySelector('.information .level').getAttribute('data-value') : 0);
tech.initial.metal = parseInt(!this.currentDetail.querySelector('.costs .metal') ? 0 : this.currentDetail.querySelector('.costs .metal').getAttribute('data-value'));
tech.initial.crystal = parseInt(!this.currentDetail.querySelector('.costs .crystal') ? 0 : this.currentDetail.querySelector('.costs .crystal').getAttribute('data-value'));
tech.initial.deut = parseInt(!this.currentDetail.querySelector('.costs .deuterium') ? 0 : this.currentDetail.querySelector('.costs .deuterium').getAttribute('data-value'));
tech.initial.energy = parseInt(!this.currentDetail.querySelector('.costs .energy') ? 0 : this.currentDetail.querySelector('.costs .energy').getAttribute('data-value'));
tech.current = {};
tech.current.level = tech.initial.level;
tech.current.metal = tech.initial.metal;
tech.current.crystal = tech.initial.crystal;
tech.current.deut = tech.initial.deut;
tech.current.energy = tech.initial.energy;
// building price increase
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 if (tech.id > 199 && tech.id <= 299) tech.ratio = 1; // fleet
else if (tech.id > 399 && tech.id <= 499) tech.ratio = 1; // def
else tech.ratio = 2;
let self = this;
let updateFullDate = () => {
let li = this.currentDetail.querySelector('.ogl_timeZone.ogl_fulldate') || this.currentDetail.querySelector('.build_duration').appendChild(Util.createDom('div', {
'class': 'ogl_timeZone ogl_fulldate'
}));
let totalTime = 0;
let indexArr = domTime.getAttribute('datetime').replace('PT', '').replace('P', '').match(/\D+/g).map(String);
let valueArr = domTime.getAttribute('datetime').replace('PT', '').replace('P', '').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;
});
let seconds = totalTime;
let newTime = new Date(Date.now() + seconds * 1000);
li.setAttribute('data-datezone', `${newTime.toLocaleDateString('fr-FR').replace(/\//g, '.')} `);
li.setAttribute('data-timezone', ` ${newTime.toLocaleTimeString('fr-FR')}`);
}
let updateDomTime = () => {
let totalTime = 0;
let indexArr = tech.initial.time.replace('PT', '').replace('P', '').match(/\D+/g).map(String);
let valueArr = tech.initial.time.replace('PT', '').replace('P', '').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;
});
if (this.currentDetail.querySelector('#build_amount')) totalTime = totalTime * parseInt(this.currentDetail.querySelector('#build_amount')?.value || 1) || 1;
else totalTime = totalTime * Math.pow(tech.ratio, tech.current.level - tech.initial.level);
let seconds = Math.ceil(totalTime || 1);
let w = Math.floor(seconds / (3600 * 24 * 7));
let d = Math.floor(seconds % (3600 * 24 * 7) / (3600 * 24));
let h = Math.floor(seconds % (3600 * 24) / 3600);
let m = Math.floor(seconds % 3600 / 60);
let s = Math.floor(seconds % 60);
let wd = Math.floor(seconds / (3600 * 24));
domTime.setAttribute('datetime', `${wd}DT${h}H${m}M${s}S`);
domTime.textContent = '';
if (w > 0) domTime.textContent += `${w}${LocalizationStrings.timeunits.short.week} `;
if (d > 0) domTime.textContent += `${d}${LocalizationStrings.timeunits.short.day} `;
if (h > 0) domTime.textContent += `${h}${LocalizationStrings.timeunits.short.hour} `;
if (m > 0 && w <= 0) domTime.textContent += `${m}${LocalizationStrings.timeunits.short.minute} `;
if (s > 0 && w <= 0 && d <= 0) domTime.textContent += `${s}${LocalizationStrings.timeunits.short.second}`;
updateFullDate();
}
let updateLevel = function (newLevel, updateDom) {
tech.current.level = newLevel > 0 ? newLevel : 1;
if (self.currentDetail.querySelector('.information .level')) self.currentDetail.querySelector('.information .level').setAttribute('data-step', tech.current.level - tech.initial.level);
['metal', 'crystal', 'deut', 'energy'].forEach(res => {
if (tech.initial[res]) {
let ratio;
if (tech.id == 36 && res == 'energy') ratio = 2.5;
else ratio = tech.ratio;
tech.current[res] = Math.ceil(tech.initial[res] * Math.pow(ratio, tech.current.level - tech.initial.level));
if (updateDom) {
let target = self.currentDetail.querySelector('.costs .' + res.replace('deut', 'deuterium'));
target.textContent = Util.formatToUnits(tech.current[res]);
target.setAttribute('data-total', tech.current[res]);
target.setAttribute('title', `${Util.formatNumber(tech.current[res])} ${self.ogl.component.lang.getText(res)}`);
self.currentDetail.querySelector('.information .level').innerHTML = `Level ${tech.current.level - 1} <i class="material-icons">arrow_forward</i> <span>${tech.current.level}</span>`;
if (self.ogl.current[res] < tech.current[res]) target.classList.add('insufficient');
else target.classList.remove('insufficient');
}
}
});
if (tech.id == 1) self.currentDetail.querySelector('.additional_energy_consumption .value').textContent = Util.formatNumber(Math.floor(10 * tech.current.level * Math.pow(1.1, tech.current.level)) - Math.floor(10 * (tech.initial.level - 1) * Math.pow(1.1, tech.initial.level - 1)));
else if (tech.id == 2) self.currentDetail.querySelector('.additional_energy_consumption .value').textContent = Util.formatNumber(Math.floor(10 * tech.current.level * Math.pow(1.1, tech.current.level)) - Math.floor(10 * (tech.initial.level - 1) * Math.pow(1.1, tech.initial.level - 1)));
else if (tech.id == 3) self.currentDetail.querySelector('.additional_energy_consumption .value').textContent = Util.formatNumber(Math.floor(20 * tech.current.level * Math.pow(1.1, tech.current.level)) - Math.floor(20 * (tech.initial.level - 1) * Math.pow(1.1, tech.initial.level - 1)));
updateDomTime();
return tech;
}
let container = this.currentDetail.querySelector('.sprite_large').appendChild(Util.createDom('div', {
'class': 'ogl_detailActions'
}));
if (this.currentDetail.querySelector('.information .level')) {
this.currentDetail.querySelector('.information .level').setAttribute('data-ratio', tech.ratio);
let prevButton = container.appendChild(Util.createDom('div', {
'class': 'ogl_button material-icons'
}, 'chevron_left'));
let initButton = container.appendChild(Util.createDom('div', {
'class': 'ogl_button material-icons'
}, 'cancel'));
let nextButton = container.appendChild(Util.createDom('div', {
'class': 'ogl_button material-icons'
}, 'chevron_right'));
prevButton.addEventListener('click', () => updateLevel(tech.current.level - 1, true));
initButton.addEventListener('click', () => updateLevel(tech.initial.level, true));
nextButton.addEventListener('click', () => updateLevel(tech.current.level + 1, true));
initButton.click();
}
let lockButton = container.appendChild(Util.createDom('div', {
'class': 'ogl_button material-icons'
}, 'lock'));
lockButton.addEventListener('click', () => {
let amount = 1;
let levelDiff = tech.current.level - tech.initial.level;
if (levelDiff < 0) return;
if (this.currentDetail.querySelector('#build_amount')) {
amount = parseInt(this.currentDetail.querySelector('#build_amount').value || 1);
}
for (let i = 0; i <= levelDiff; i++) {
let tmpTech = updateLevel(tech.initial.level + i);
let lockedTech = {};
lockedTech.id = tmpTech.id;
lockedTech.name = tmpTech.name;
lockedTech.amount = amount;
lockedTech.level = tmpTech.current.level;
lockedTech.metal = tmpTech.current.metal * amount;
lockedTech.crystal = tmpTech.current.crystal * amount;
lockedTech.deut = tmpTech.current.deut * amount;
this.ogl.component.empire.lockTech(lockedTech);
}
});
let checkInput = () => {
let currentAmount = parseInt(this.currentDetail.querySelector('#build_amount')?.value || 1) || 1;
['metal', 'crystal', 'deut', 'energy'].forEach(res => {
let target = self.currentDetail.querySelector('.costs .' + res.replace('deut', 'deuterium'));
if (target) {
let newValue = tech.initial[res] * currentAmount;
target.textContent = Util.formatToUnits(newValue);
target.setAttribute('data-total', newValue);
target.setAttribute('title', `${Util.formatNumber(newValue)} ${self.ogl.component.lang.getText(res)}`);
if (this.ogl.current[res] < newValue) target.classList.add('insufficient');
else target.classList.remove('insufficient');
}
});
updateDomTime()
}
updateDomTime();
Util.updateCheckIntInput(() => checkInput());
if (this.currentDetail.querySelector('.information .level')) this.currentDetail.querySelector('.information .level').innerHTML = `Level ${tech.current.level - 1} <i class="material-icons">arrow_forward</i> <span>${tech.current.level}</span>`;
if (this.currentDetail.querySelector('#build_amount')) // ships or def
{
this.currentDetail.querySelector('#build_amount').setAttribute('onkeyup', 'checkIntInput(this, 1, 99999);event.stopPropagation();');
this.currentDetail.querySelector('#build_amount').addEventListener('click', () => checkInput());
}
this.ogl.addToUpdateQueue(() => updateFullDate());
}
}
}
}
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",
pfExpe: "Pathfinder expedition",
allShipsRes: "Select all ships (page 1) <br>or all resources (page 2)",
splitShipsRes: "Split all ships (page 1) <br>or all resources (page 2)",
prevFleet: "Repeat previous fleet",
required: "req.",
reverseAllShipsRes: "Reverse all selected ships (page 1) <br>or all resources (page 2)",
nextPlanet: "Go to next planet",
prevPlanet: "Go to previous 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: "Display stats",
excludeConso: "Exclude deut consumption from stats",
spiesTable: "Display spies table",
autoClean: "Autoclean spies table",
cleanReport: "Clean spies reports",
inFlight: "In flight",
linkedMoons: "Linked moons",
linkedPlanets: "Linked planets",
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: "Mean ($daysd)",
totalPerDay: "Mean+prod ($daysd)",
ignoreRaid: "Ignore this raid",
keepOnPlanet: "to keep on planet",
switchNameCoords: "switch coords/names",
sendResources: "Send resources",
sendMissingResources: "Deduct ressources on the planet from the total",
fleetDetailsName: "Display ships name in fleet details",
onPlanets: "On planets",
reportFound: "Top report",
topReportDetails: "Top report details",
playerProfile: "Player profile",
rightMenuTooltips: "Hide right menu tooltips",
}
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) <br>ou toutes les ressources (page2)",
splitShipsRes: "Diviser tous les vaisseux (page 1) <br>ou toutes les ressources (page2)",
prevFleet: "Répéter la flotte précédente",
reverseAllShipsRes: "Inverser tous les vaisseaux (page 1) <br>ou toutes ressources selectionné(e)s (page 2)",
nextPlanet: "Se rendre sur la planète suivante",
prevPlanet: "Se rendre sur la planète précédente",
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",
cleanReport: "Nettoyer les rapports",
minifyPictures: "Réduire les grandes images",
displayTimers: "Afficher les timers de refresh",
rentaStats: "Afficher les statistiques",
excludeConso: "Ignorer la conso de deut dans les stats",
spiesTable: "Afficher le tableau de RE",
autoClean: 'Suppression automatique des "mauvais" RE',
inFlight: "En vol",
linkedMoons: "Lunes associées",
linkedPlanets: "Planètes 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 contre mes planètes",
rentaPerDay: "Moyenne ($daysj)",
totalPerDay: "Moyenne+prod ($daysj)",
ignoreRaid: "Ignorer ce raid",
keepOnPlanet: "à garder sur la planète",
switchNameCoords: "alterner coords/noms",
sendResources: "Envoyer les ressources",
sendMissingResources: "Déduire les ressources à quai",
fleetDetailsName: "Afficher le nom des vaisseaux",
onPlanets: "A quai",
reportFound: "Meilleur rapport",
topReportDetails: "Détails du rapport",
playerProfile: "Profil de la cible",
rightMenuTooltips: "Cacher les tooltips du menu de droite",
}
this.gr = {
abbr202: "μΜ",
abbr203: "ΜΜ",
abbr219: "PF",
abbr210: "ΚΣ",
planets: "Πλανήτες",
ships: "Πλοία",
items: "Αντικέιμενα",
other: "Λοιπά",
resources: "Πόροι",
fight: "Μάχες",
noMoonError: "Σφάλμα, δεν υπάρχει φεγγάρι εδώ",
capacityPicker: "Πόροι για αποστολή",
scExpe: "Αποστολή με μικρά μεταγωγικά",
lcExpe: "Αποστολή με μεγάλα μεταγωγικά",
allShipsRes: "Επιλέξτε όλα τα πλοία (σελίδα 1) ή όλους τους πόρους (σελίδα 3))",
splitShipsRes: "Διαχωρίστε όλα τα πλοία (σελίδα 1) ή όλους τους πόρους (σελίδα 3) με την επιλεγμένη τιμή (2-9)",
prevFleet: "Επάληψη προηγούμενου στόλου",
required: "Απαιτ.",
reverseAllShipsRes: "Αντιστρέψτε όλα τα επιλεγμένα πλοία (σελίδα 1) ή όλους τους πόρους (σελίδα 3)",
nextPlanet: "Πηγαίνετε στον επόμενο πλανήτη",
gain: "Κέρδος",
timeLimits: "Ημέρα;Εβδομάδα;Μήνας;Σύνολο",
spyPosition: "Κατασκοπεύστε αυτήν τη θέση",
flagTarget: "Ορίστε τον επόμενο στόχο",
attackCurrentTarget: "Επίθεση στον επόμενο στόχο",
noTargetSelected: "Δεν έχει επιλεγεί στόχος",
timerInfo: "Τελευταία ανανέωση",
blackhole: "Μαύρη τρύπα",
signalBlackhole: "Σημειώστε μια μαύρη τρύπα",
moreStats: "Επιπλέον στατιστικά",
eraseData: "Διαγραφή δεδομένων",
defaultView: "Προεπιλεγμένη προβολή",
economyView: "Προβολή οικονομίας",
productionView: "Προβολή παραγωγής",
pinnedView: "Καρφιτσωμένος στόχος",
targetView: "Λίστα στόχων",
oglConfig: "OGLight ρυθμίσεις",
defaultShip: "Σκάφος προεπιλογής",
defaultMission: "Προεπιλεγμένη μετακίνηση",
autoCollect: "Συλλέξτε πόρους",
minifyPictures: "Ελαχιστοποίηση μεγάλων εικόνων",
displayTimers: "Προβολή χρονόμετρων ανανέωσης",
rentaStats: "Στατιστικά εσόδων",
excludeConso: "Εξαίρεση της κατανάλωσης δευτερίου από τα στατιστικά",
spiesTable: "Εμφάνιση πίνακα κατασκοπειών",
autoClean: "Αυτόματη εκκαθάριση πίνακα κατασκοπειών",
inFlight: "Εν πτήση",
linkedMoons: "Συνδεδεμένα φεγγάρια",
linkedPlanets: "Συνδεδεμένοι πλανήτες",
kofi: "Σας αρέσει το OGLight ; Τότε υποστηρίξτε με :)",
wrongTarget: "Προειδοποίηση, ο στοχευμένος πλανήτης δεν υπάρχει πλέον και θα αφαιρεθεί από τη λίστα!",
deleteSpyDef: "Διαγραφή κατασκ. αναφορών των πλανητών μου",
rentaPerDay: "Mean ($daysd)",
totalPerDay: "Mean+prod ($daysd)",
ignoreRaid: "Αγνόησε αυτή τη μάχη",
keepOnPlanet: "Να παραμείνουν στον πλανήτη",
switchNameCoords: "Εναλλαγή συντεταγμένων / ονομάτων",
sendResources: "Αποστολή πόρων",
sendMissingResources: "Αφαιρέστε τους πόρους στον πλανήτη από το σύνολο",
}
}
// get text by key. priority : library > local key > english key
getText(key) {
if (this[this.ogl.universe.lang] && this[this.ogl.universe.lang][key]) return this[this.ogl.universe.lang][key];
else if (this.ogl.db.loca[key]) return this.ogl.db.loca[key];
else if (this.ogl.db.ships[key]?.name) return this.ogl.db.ships[key].name;
else if (this.en[key]) return this.en[key];
else return 'TEXT_NOT_FOUND';
}
}
/* CSS
______________________________________________________________________________________*/
let oglcss = `
/*css*/
:root
{
/* primary */
--p0:hsl(210deg 32% 3%);
--p1:hsl(210deg 32% 6%);
--p2:hsl(210deg 32% 9%);
--p3:hsl(210deg 32% 12%);
--p4:hsl(210deg 32% 15%);
--p5:hsl(210deg 32% 16%);
--p6:hsl(210deg 32% 30%);
/* neon */
--neon:hsl(199deg 64% 60%);
--neonborder:hsl(199deg 100% 81%);
/* text */
--textblue:hsl(212deg 19% 50%);
--textcyan:hsl(197deg 22% 47%);
--textgold:hsl(42deg 21% 46%);
--textsand:hsl(42deg 44% 60%);
--textpremium:hsl(44deg 81% 58%);
--textdate:hsl(224deg 100% 79%);
--texttime:hsl(33deg 100% 66%);
/* colors */
--gray0:hsl(0deg 0% 35%);
--gray1:hsl(0deg 0% 50%);
--gray2:hsl(0deg 0% 65%);
--yellow0:hsl(50deg 50% 35%);
--yellow1:hsl(50deg 50% 50%);
--yellow2:hsl(50deg 50% 65%);
--orange0:hsl(19deg 92% 67%);
--red0:hsl(0deg 50% 35%);
--red1:hsl(0deg 50% 50%);
--red2:hsl(0deg 50% 64%);
--green0:hsl(170deg 50% 35%);
--green1:hsl(170deg 50% 50%);
--green2:hsl(170deg 50% 65%);
--blue0:hsl(210deg 50% 35%);
--blue1:hsl(210deg 50% 50%);
--blue2:hsl(210deg 50% 65%);
/* marker */
--blue:#5476f1;
--red:#da3e3e;
--violet:#b646da;
--green:#32b199;
--yellow:#e2b431;
--gray:#171f29;
--white:#bbb;
/* rank */
--global:hsl(0deg 89% 72%);
--economy:hsl(210deg 87% 75%);
--techs:hsl(150deg 49% 58%);
--fleet:hsl(303deg 63% 71%);
--def:hsl(19deg 69% 64%);
/* resources */
--metal:hsl(240deg 24% 68%);
--crystal:hsl(199deg 72% 74%);
--deut:hsl(157deg 44% 60%);
--energy:#f5bbb4;
--dm:#c688ec;
}
body
{
-webkit-text-size-adjust:none;
-ms-text-size-adjust:none;
-moz-text-size-adjust:none;
text-size-adjust:none;
}
body.ogl_active
{
overflow:hidden;
}
.c-right, .c-left
{
display:none;
}
.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;
}
.technology .icon .level, .technology .icon .amount
{
font-size:10px;
white-space:nowrap;
}
.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 !important;
border:none !important;
border-radius:2px !important;
box-shadow:0 0 0 2px #eef7fb !important;
color:var(--p2) !important;
font-weight:bold !important;
}
.technology input[type="number"][disabled], .technology input[type="text"][disabled]
{
background:#333c44 !important;
box-shadow:0 0 0 2px #52565a !important;
}
.ogl_hidden
{
display:none !important;
}
.ogl_invisible
{
visibility:hidden !important;
}
.ogl_hiddenContent
{
font-size:0 !important;
line-height:0;
}
.ogl_centered
{
text-align:center;
}
.ogl_noPointer
{
pointer-events:none !important;
}
.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_metal, #metal_box .value, .msg .resspan[data-type="metal"] { color:var(--metal) !important; }
.ogl_crystal, #crystal_box .value, .msg .resspan[data-type="crystal"] { color:var(--crystal) !important; }
.ogl_deut, #deuterium_box .value, .msg .resspan[data-type="deut"] { color:var(--deut) !important; }
.ogl_dm, #darkmatter_box .value, .msg .resspan[data-type="dm"] { color:var(--dm) !important; }
.ogl_energy, #energy_box .value { color:var(--energy) !important; }
.ogl_fleet { color:var(--fleet) !important; }
.ogl_shipList
{
display:grid;
grid-gap:5px;
grid-template-columns:repeat(4, 1fr);
}
.ogl_shipList .ogl_shipIcon:hover
{
cursor:pointer;
position:relative;
}
.ogl_shipList .ogl_shipIcon:hover:before
{
border-radius:4px;
bottom:0;
box-shadow:inset 0 0 2px 2px var(--neonborder), inset 0 0 12px 3px var(--neon);
content:'';
left:0;
position:absolute;
right:0;
top:0;
}
.ogl_shipIcon
{
background-color:rgba(255,255,255,.1);
background-position:center;
background-size:cover !important;
border:2px solid var(--p2);
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, .ogl_shipIcon.ogl_energy
{
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; }
.ogl_shipIcon.ogl_energy { background-position:-114px -45px !important; }
.ogl_inFlight, .ogl_inFlight:before, .ogl_inFlight:after
{
border-style:solid;
border-width:3px 6px 3px 0;
border-color:transparent #9fc7d4 transparent transparent;
cursor:pointer;
height:0 !important;
position:absolute !important;
top:0 !important;
right:-8px !important;
transform:translateX(100%);
width:0 !important;
}
.ogl_inFlight:before, .ogl_inFlight:after
{
border:inherit;
}
.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;
}
.ogl_inFlight.ogl_active, .ogl_inFlight.ogl_active:before, .ogl_inFlight.ogl_active:after
{
border-color:transparent var(--textpremium) transparent transparent;
}
.tpd-tooltip:not(.ogl_tooltip)
{
display:none !important;
height:0px !important;
overflow:hidden !important;
pointer-events:none !important;
width:0px !important;
}
.splitLine, .ogl_choseCapacity hr, .ogl_tooltip hr
{
background:var(--p4) !important;
border:none !important;
height:2px !important;
margin:9px 0 !important;
}
.premiumHighligt span
{
color:var(--textpremium) !important;
}
.ogl_colorPicker
{
display:grid;
grid-template-columns:repeat(2, 1fr);
width:auto;
}
.ogl_colorButton
{
background:#151515;
border:2px solid #1f252b;
border-radius:20px;
cursor:pointer;
height:16px;
right:7px;
position:absolute;
top:7px;
transition:all .2s;
user-select:none;
width:25px;
}
.ogl_colorButton:hover
{
border-color:#263640;
filter:brightness(1.2);
}
.ogl_colorPicker > div
{
border-radius:20px;
box-shadow:inset 0 0 0 3px rgba(0,0,0,.3);
cursor:pointer;
filter:brightness(.9);
height:20px;
margin:2px;
position:relative;
transition:transform .2s, filter .2s;
width:30px;
}
.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:20px;
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 .ctContentRow [data-color="gray"] { background:#0d1014;opacity:1 !important; }
.galaxyTable .ctContentRow [data-color="gray"]:before { background:#0d1014; }
.galaxyTable .ctContentRow [data-color="gray"] > div { 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_timeZone.ogl_fulldate:before
{
content:attr(data-datezone);
position:relative;
left:-5px;
}
.ogl_timeZone:after
{
color:hsl(187deg 72% 71%);
content:attr(data-timezone);
}
.ogl_timeZone:before, .ogl_timeZone:after
{
display:inline-block;
font-size:11px !important;
line-height:1;
}
.ogl_endTime
{
font-size:10px;
font-weight:bold;
margin-top:8px;
text-align:center;
}
.ogl_endTime, .ogl_fulldate
{
color:var(--textdate) !important;
}
.ogl_endTime span, .ogl_fulldate span
{
color:var(--texttime) !important;
}
.ogl_ping
{
color:#aaa;
font-size:10px;
font-weight:bold;
position:absolute;
right:-14px;
top:14px;
}
.ogl_danger
{
color:var(--red);
}
.ogl_warning
{
color:var(--orange0);
}
.ogl_caution
{
color:var(--yellow);
}
.ogl_ok
{
color:var(--green);
}
#chatMsgList .msg_date
{
position:relative;
top:6px;
}
.chat_msg .msg_date
{
position:relative;
top:3px;
}
.chat_msg .ogl_timeZone:before, .chat_msg .ogl_timeZone:after
{
font-size:9px !important;
}
div#banner_skyscraper
{
transform:translatex(30px) !important;
}
#planetbarcomponent #rechts #myPlanets .smallplanet a.alert
{
bottom:17px !important;
left:3px !important;
position:absolute !important;
top:auto !important;
z-index:3 !important;
}
#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[data-panel="resources"] #myPlanets .smallplanet a.constructionIcon.moon,
#planetbarcomponent #rechts[data-panel="resources"] #cutty a.constructionIcon.moon
{
left:79px !important;
}
#planetbarcomponent #rechts #myPlanets .smallplanet a.wreckFieldIcon
{
left:-20px;
top:-1px;
}
[data-multi]::before
{
border:2px solid #4f8290;
border-right:0;
bottom:-3px;
content:'';
display:block;
height:100%;
left:-6px;
position:absolute;
transform:translateY(-50%);
width:3px;
}
[data-multi="0"]::before { border-color:#00bcd4; }
[data-multi="1"]::before { border-color:#ffeb3b; }
[data-multi="2"]::before { border-color:#009688; }
[data-multi="3"]::before { border-color:#673ab7; }
[data-multi="4"]::before { border-color:#3f51b5; }
[data-multi="5"]::before { border-color:#ff5722; }
[data-multi="6"]::before { border-color:#9c27b0; }
[data-multi="7"]::before { border-color:#ff9800; }
[data-multi="8"]::before { border-color:#4caf50; }
[data-multi="9"]::before { border-color:#e91e63; }
[data-multi="10"]::before { border-color:#ffc107; }
.ogl_button, .btn_blue
{
background:hsl(210deg 31% 8%);
border:2px solid var(--p1);
color:var(--textcyan);
font-weight:bold;
text-align:center;
text-decoration:none;
text-shadow:none !important;
user-select:none;
}
.btn_blue
{
border:2px solid var(--p1) !important;
color:var(--textcyan) !important;
padding:2px 10px !important;
}
.ogl_button:hover, .btn_blue:hover
{
background:var(--p2) !important;
color:#fff !important;
text-shadow:0 0 6px #0edeff !important;
}
.ogl_button, .btn_blue, #fleet1 .secondcol > *
{
background:hsl(210deg 31% 8%) !important;
border:2px solid var(--p1);
border-radius:3px;
box-shadow:inset 0 10px rgba(255,255,255,.07);
box-sizing:border-box;
cursor:pointer;
line-height:21px !important;
position:relative;
text-align:center;
text-shadow:1px 2px var(--p0);
}
.ogl_button.ogl_tooltipReady
{
color:var(--textcyan) !important;
}
.ogl_button.ogl_tooltipReady:hover
{
color:#fff !important;
}
.btn_blue[disabled]
{
background:hsl(0deg 0% 33%) !important;
color:hsl(0deg 0% 71%) !important;
filter:grayscale(1);
}
#galaxyHeader .btn_blue
{
height:18px !important;
line-height:14px !important;
max-width:94px;
min-width:20px !important;
overflow:hidden;
padding:0 2px !important;
text-overflow:ellipsis;
white-space:nowrap;
}
/* JUMPGATE
----------------------------*/
#jumpgateForm .ship_selection_table > tbody
{
background:var(--p1);
}
#jumpgateForm .ship_selection_table .ship_txt_row
{
padding:0 5px !important;
}
#jumpgateForm .ship_selection_table .ship_txt_row p
{
padding-bottom:18px;
}
#jumpgateForm .ship_input_row
{
box-sizing:border-box;
}
#jumpgateForm input
{
border-radius:3px !important;
margin-left:3px !important;
padding:0 5px !important;
width:64px !important;
}
#jumpgateForm .ogl_delta
{
background:var(--p3) !important;
border-radius:2px;
bottom:3px;
box-shadow:inset 0 9px var(--p4), 0 0 0 2px var(--p0);
color:var(--textcyan) !important;
cursor:pointer;
font-size:16px;
height:18px;
left:40px;
line-height:18px;
position:absolute;
text-align:center;
text-decoration:none;
width:40px;
}
#jumpgateForm .ogl_delta:hover
{
box-shadow:inset 0 0 1px 2px var(--neonborder), inset 0 0 12px 3px var(--neon);;
color:#fff !important;
}
/* LEFT MENU
----------------------------*/
.ogl_universeName
{
color:var(--gray2);
font-size:12px;
font-weight:bold;
line-height:12px;
pointer-events:none;
position:absolute;
text-align:right;
top:92px;
width:138px;
}
.ogl_universeName div
{
color:var(--textsand);
font-size:11px;
}
#tutorialiconcomponent #helper a
{
transform:scale(.75);
}
#links .menubutton
{
filter:hue-rotate(-7deg);
}
#links .menubutton span
{
color:hsl(208deg 27% 58%);
}
#links .menubutton.selected span, #links .menubutton:hover span
{
color:hsl(194deg 66% 93%);
}
.ogl_stats
{
background:var(--p3);
border-radius:2px;
box-shadow:inset 0 1px rgba(255,255,255,.07), 0 0 0 2px var(--p1);
box-sizing:border-box;
font-weight:bold;
margin:12px 0;
padding:8px;
position:relative;
text-shadow:1px 1px #000;
width:132px;
}
.ogl_stats .ogl_button
{
box-shadow:inset 0 12px rgba(255,255,255,.07);
color:var(--textcyan);
font-size:21px !important;
height:29px;
line-height:29px;
padding:0;
position:absolute;
right:-4px;
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_statsDetails
{
display:grid;
grid-gap:10px;
grid-template-columns:600px auto;
width:auto;
}
.ogl_statsDetails h3
{
background:var(--p2);
border-radius:7px 7px 0 0;
color:var(--textblue);
font-size:10px;
font-weight:bold;
padding:12px 12px 3px 12px;
text-transform:uppercase;
}
.ogl_statsDetails h3:not(:first-child)
{
margin-top:22px;
}
.ogl_dateArea
{
background:var(--p1);
box-shadow:inset 0 26px var(--p2), inset 0 -30px var(--p2);
height:max-content;
padding:0 10px 38px 10px;
position:relative;
}
.ogl_statsDetails .ogl_calendar
{
color:var(--textsand);
overflow:hidden;
max-width:400px;
user-select:none;
}
.ogl_statsDetails .ogl_calendar > div
{
display:grid;
grid-gap:5px;
grid-template-columns:repeat(7, 1fr);
}
.ogl_statsDetails .ogl_calendar .month
{
display:inline-block;
font-weight:bold;
}
.ogl_statsDetails .ogl_calendar .cell
{
color:#fff;
line-height:35px;
position:relative;
text-align:center;
width:35px;
}
.ogl_statsDetails .ogl_calendar .day
{
color:var(--textblue);
font-size:11px;
font-weight:bold;
line-height:25px;
}
.ogl_statsDetails .ogl_calendar .cell:not(.day):not(.empty)
{
border-radius:50%;
cursor:pointer;
}
.ogl_statsDetails .ogl_calendar .cell:not(.day):not(.empty):hover
{
background:var(--p5);
color:#fff;
}
.ogl_statsDetails .ogl_calendar .ogl_disabled
{
opacity:.2;
pointer-events:none;
}
.ogl_statsDetails .ogl_calendar .ogl_active
{
background:var(--textsand);
color:var(--p1);
font-weight:bold;
}
.ogl_statsDetails .ogl_shipIcon
{
height:26px;
}
.ogl_statsDetails .ogl_statsArea
{
background:var(--p2);
border-radius:0 0 7px 7px;
padding:10px;
position:relative;
}
.ogl_statsDetails .ogl_statsArea:last-child:before,
.ogl_statsDetails .ogl_statsArea:last-child:after
{
background:var(--p2);
border-radius:0 5px 5px 0;
bottom:41px;
color:var(--textsand);
content:'ø / day';
line-height:26px;
padding:0 10px;
position:absolute;
right:0;
transform:translateX(100%);
}
.ogl_statsDetails .ogl_statsArea:last-child:after
{
bottom:10px;
content:'ø / day + prod';
}
/*.ogl_statsDetails .ogl_statsArea:nth-child(1)
{
border-right:3px solid hsl(238deg 68% 58%);
}
.ogl_statsDetails .ogl_statsArea:nth-child(2)
{
border-right:3px solid hsl(0deg 60% 37%);
}
.ogl_statsDetails .ogl_statsArea:nth-child(3)
{
border-right:3px solid hsl(0deg 0% 49%);
}*/
.ogl_statsDetails .ogl_statsArea > h3
{
color:hsl(208deg 23% 33%);
font-size:11px;
font-weight:bold;
padding:20px 0 14px 0;
text-align:center;
}
.ogl_statsDetails .ogl_statsArea > div
{
display:grid;
grid-gap:5px 10px;
grid-template-columns:repeat(4, 1fr);
position:relative;
z-index:1;
}
.ogl_statsDetails .ogl_statsArea > div > div
{
background:hsl(210deg 31% 7%);
display:grid;
grid-template-columns:40px auto;
line-height:26px;
text-align:center;
}
.ogl_statsDetails .ogl_statsArea > div > div > div:not(.ogl_shipIcon)
{
padding:0 15px;
}
.ogl_statsDetails .ogl_statsArea .ogl_newLine
{
grid-row:1;
}
.ogl_dateFilters
{
bottom:0;
display:grid;
grid-auto-flow:column;
left:0;
line-height:30px;
position:absolute;
user-select:none;
width:100%;
}
.ogl_dateFilters > div.material-icons
{
color:var(--textblue);
pointer-events:none;
text-decoration:none;
}
.ogl_dateFilters > div
{
cursor:pointer;
text-align:center;
text-decoration:underline;
}
.ogl_dateFilters > div:hover
{
color:var(--textsand);
}
.ogl_dateFilters > div.ogl_active
{
background:var(--textpremium);
color:var(--p1);
pointer-events:none;
text-decoration:none;
}
.ogl_labelLimit
{
background:var(--yellow1) !important;
border-radius:2px;
box-shadow:0 3px 5px rgba(0,0,0,.8);
color:var(--p1) !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;
}
/* DETAILS
----------------------------*/
#technologydetails .ogl_detailAction
{
display:grid;
grid-gap:2px;
grid-template-columns:repeat(4, 1fr);
left:3px;
position:absolute;
right:3px;
top:3px;
}
#shipyard .ogl_detailAction, #defense .ogl_detailAction
{
grid-template-columns:repeat(1, 1fr);
}
#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 5px 0 0;
}
#technologydetails .ogl_button
{
color:var(--textcyan);
font-size:18px !important;
height:30px;
line-height:26px !important;
width:100%;
}
#technologydetails .ogl_detailActions
{
display:grid;
grid-template-columns:repeat(4, 1fr);
}
.ogl_lockBuild.ogl_disabled
{
opacity:.5;
}
.ogl_lockBuild.ogl_active, .ogl_lockBuild.ogl_active:hover
{
color:var(--textpremium) !important;
}
#technologydetails h3
{
background:none !important;
color:var(--textblue) !important;
font-size:16px !important;
text-indent:7px !important;
top:3px !important;
}
#technologydetails h3::before
{
display:none !important;
}
#technologydetails > .description
{
background:var(--p1);
box-shadow:0 -2px var(--p0);
}
#technologydetails .content
{
background:linear-gradient(to bottom, var(--p2), var(--p3));
height:203px !important;
left:203px !important;
}
#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(--textpremium);
font-size:16px;
vertical-align:bottom;
}
#technologydetails .narrow strong
{
display:none;
}
#technologydetails .build_duration
{
bottom:23px;
margin:0 !important;
padding-left:24px;
position:absolute;
top:auto;
}
#technologydetails .build_duration:before
{
color:var(--textpremium);
content:'hourglass_top';
font-family:'material icons';
font-size:21px;
left:0;
position:absolute;
top:8px;
}
#technologydetails .build_duration .ogl_timeZone
{
font-weight:bold;
left:29px;
position:absolute;
width:230px;
}
#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(--textpremium);
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(--textpremium);
content:'flash_on';
font-family:'material icons';
font-size:21px;
left:0;
position:absolute;
top:1px;
}
#technologydetails .information .ogl_endTime
{
display:block;
margin:0;
}
#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(--green1) !important;
}
/* RIGHT MENU
----------------------------*/
#planetList
{
margin-top:5px;
width:144px !important;
}
.smallplanet
{
border-radius:0 !important;
display:grid;
grid-column-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;
transform:scale(.9);
transition:transform .3s;
width:14px;
z-index:2;
}
.smallplanet .planetlink img
{
top:10px !important;
height:18px;
width:18px;
}
.planetlink, .moonlink
{
background:linear-gradient(to bottom right, var(--p3) 45%, var(--p1));
background-position:0 !important;
border:none !important;
border-radius:3px;
box-shadow:inset 0 1px rgba(255, 255, 255, .07), 0 0 0 2px var(--p1);
height:36px !important;
overflow:hidden;
position:relative !important;
transition:box-shadow .3s;
z-index:1;
}
.planetlink:hover, .moonlink:hover
{
background:linear-gradient(to bottom right, var(--p5) 45%, var(--p3));
}
.smallplanet .planetlink.active, .smallplanet .moonlink.active
{
background:linear-gradient(to bottom right, hsl(42deg 34% 22%) 45%, var(--p3));
}
.smallplanet .planetlink
{
left:0 !important;
text-align:left;
top:0 !important;
}
.smallplanet .moonlink
{
bottom:0 !important;
left:0 !important;
text-align:left;
top:auto !important;
}
.smallplanet .planet-name,
.smallplanet .planet-koords
{
left:26px !important;
position:absolute !important;
}
.smallplanet .planet-koords
{
color:var(--textgold) !important;
letter-spacing:-0.05em;
top:18px !important;
}
.smallplanet .planet-name
{
color:var(--textcyan) !important;
font-weight:bold !important;
max-width:62px;
overflow:hidden;
text-overflow:ellipsis;
top:5px !important;
}
.smallplanet .active .planet-name, .smallplanet .active .planet-name
{
color:var(--textsand) !important;
}
.ogl_linkedHarvest
{
height:0;
margin-bottom:0;
transform:scale(0) translateY(-60px);
transition:transform .2s, height .2s, margin .2s;
}
#planetList > .ogl_linkedHarvest.ogl_active
{
font-size:10px !important;
height:25px;
margin-bottom:10px;
transform:scale(1) translateY(0);
}
.smallplanet .ogl_shortcut
{
bottom:3px;
color:var(--textsand);
font-size:16px !important;
right:1px;
pointer-events:none;
position:absolute;
transform:scale(0);
transition:transform .2s;
z-index:3;
}
.ogl_shortcuts .smallplanet .ogl_shortcut
{
transform:scale(1);
}
.ogl_shortcuts .smallplanet .ogl_timer
{
display:none;
}
.ogl_shortcuts .smallplanet a
{
cursor:crosshair;
}
.ogl_shortcuts[data-panel="resources"] img
{
transform:translatex(-25px);
}
.ogl_shortcuts .ogl_stock
{
transform:translatex(-16px);
}
#countColonies
{
background:var(--p3) !important;
box-shadow:inset 0 1px rgba(255,255,255,.07), inset 0 100px rgba(0,0,0,.15), 0 0 0 2px var(--p1);
border-radius:2px;
color:transparent !important;
font-size:10px;
height:57px !important;
line-height:20px !important;
margin:0 !important;
user-select:none;
width:147px !important;
}
#countColonies p
{
display:none;
}
.ogl_menuOptions
{
display:grid;
font-size:16px;
grid-gap:4px;
grid-template-columns:repeat(4, 1fr);
margin-top:-12px;
padding:4px;
}
.ogl_menuOptions .ogl_manageData { color:#c54f4f !important; }
.ogl_menuOptions .ogl_harvest { color:#50deec !important; }
.ogl_menuOptions .ogl_shipPicker { color:#e4b633 !important;font-size:11px;font-weight:bold; }
.ogl_menuOptions .ogl_missionPicker3 { color:#c2f75a !important; }
.ogl_menuOptions .ogl_missionPicker4 { color:#43ec77 !important; }
.ogl_menuOptions .ogl_button.ogl_active, .ogl_shortcuts .ogl_menuOptions .ogl_harvest.ogl_active
{
border-color:var(--neonborder);
box-shadow:inset 0 10px hsl(0deg 0% 100% / 7%), 0 0 5px 0px var(--neon);
}
.ogl_panel
{
bottom:4px;
box-sizing:border-box;
display:grid;
font-size:12px;
grid-gap:4px;
grid-template-columns:repeat(4, 1fr);
padding:0 4px;
position:absolute;
right:0;
text-align:center;
width:100%;
}
.ogl_panel > div
{
color:var(--textcyan);
cursor:pointer;
height:20px;
line-height:16px !important;
}
[data-panel="resources"] .planet-name,
[data-panel="resources"] .planet-koords,
[data-panel="resources"] .ogl_timer,
[data-panel="resources"] .ogl_jumpGateTimer
{
opacity:0 !important;
pointer-events:none;
}
[data-panel="resources"] .smallplanet
{
grid-template-columns:50% 50%;
}
[data-panel="resources"] .ogl_stock
{
display:grid;
}
.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;
transition:transform .3s;
}
.ogl_stock > *
{
font-size:9px !important;
font-weight:bold !important;
}
.ogl_stock > .ogl_full
{
color:var(--red) !important;
}
.ogl_prod
{
grid-template-columns:repeat(4, 1fr) !important;
}
.ogl_mines
{
font-weight:bold;
}
.ogl_sideLock
{
bottom:0;
color:var(--yellow1);
cursor:pointer;
font-size:16px !important;
position:absolute;
right:-20px;
}
.ogl_sideLock:hover
{
color:#fff;
}
.planetlink .ogl_timer, .moonlink .ogl_timer
{
bottom:3px;
color:var(--red0) !important;
content:'';
font-size:11px !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:var(--yellow0) !important;
}
.planetlink .ogl_timer.ogl_short, .moonlink .ogl_timer.ogl_short, .ogl_short
{
color:var(--green0) !important;
}
.ogl_resourcesSum
{
background:var(--p3);
border-radius:2px;
box-shadow:inset 0 1px rgba(255,255,255,.07), 0 0 0 2px #0d1014;
display:grid;
font-size:11px;
font-weight:bold;
grid-template-columns:auto 52px;
margin-top:7px;
line-height:15px;
padding:8px;
position:relative;
text-align:right;
text-shadow:1px 1px #000;
user-select:none;
width:131px;
}
.ogl_resourcesSum .ogl_loader
{
grid-column-start:1;
grid-column-end:3;
margin:auto;
zoom:.6;
}
.ogl_resourcesSum > *,
.ogl_resourcesSum .ogl_sub
{
opacity:1;
transition:transform .1s;
}
.ogl_resourcesSum.ogl_active > *,
.ogl_resourcesSum.ogl_active .ogl_sub
{
opacity:0;
transform:translateX(30px);
}
.ogl_resourcesSum:after
{
color:#98bfcd;
content:'chevron_right';
cursor:pointer;
font-family:"material icons";
font-size:24px;
position:absolute;
right:-22px;
top:50%;
transform:translateY(-50%);
}
.ogl_resourcesSum .ogl_shipIcon
{
height:20px;
}
.ogl_resourcesSum i
{
color:hsl(196deg 35% 70%);
font-size:16px !important;
left:3px;
position:absolute;
bottom:5px;
}
.ogl_resourcesSum .ogl_sub
{
display:inline-block;
font-size:9px !important;
margin-left:4px;
opacity:.7;
}
.ogl_planetCount .material-icons
{
font-size:12px !important;
margin-right:5px;
vertical-align:bottom;
}
.ogl_resourcesSum .splitLine
{
margin:4px 0 !important;
}
.ogl_keyList
{
background:var(--p3);
border-radius:2px;
box-shadow:inset 0 1px rgb(255 255 255 / 7%), 0 0 0 2px #0d1014;
box-sizing:border-box;
display:grid;
grid-gap:5px;
grid-template-columns:repeat(3, 1fr);
font-size:11px;
font-weight:bold;
margin-top:7px;
padding:4px;
position:relative;
width:147px;
}
.ogl_key
{
background:linear-gradient(to top left, var(--p3) 45%, var(--p1));
background-position:0 !important;
border:none !important;
border-radius:3px;
box-shadow:inset 0 1px rgba(255, 255, 255, .07), 0 0 0 2px var(--p1);
box-sizing:border-box;
border-radius:5px;
color:#7790c1;
cursor:pointer;
font-size:10px;
font-weight:bold;
line-height:24px !important;
text-align:center;
width:100%;
}
.ogl_key:hover
{
background:linear-gradient(to top left, var(--p5) 45%, var(--p3));
color:#fff;
}
.ogl_planetCount
{
color:var(--p6);
}
/* TOOLTIP
----------------------------*/
.ogl_tooltip
{
background:var(--p3);
border:6px solid var(--p5);
border-radius:5px;
box-shadow:0 0 22px 4px #090b0c;
box-sizing:border-box !important;
display:none;
font-size:11px;
height:auto;
max-height:600px !important;
max-width:440px;
min-width:20px;
overflow:initial !important;
padding:10px;
position:absolute;
width:auto;
z-index:1000000;
}
.ogl_tooltip.ogl_active
{
animation:show .2s;
display:block;
}
@keyframes show
{
0% { opacity:0; }
50% { opacity:0; }
100% { opacity:1; }
}
.ogl_close
{
background:var(--p2);
border:5px solid var(--p5);
border-radius:30px;
color:#bbb;
cursor:pointer;
font-size:16px !important;
padding:2px;
position:absolute;
right:-10px;
top:-10px;
user-select:none;
z-index:3;
}
.ogl_tooltip .ogl_close
{
right:-14px;
top:-14px;
}
.ogl_close:hover
{
color:#fff;
}
.ogl_tooltip .ogl_value
{
color:var(--textpremium);
font-size:10px;
font-weight:bold;
}
.ogl_tooltip:after
{
background:var(--p3);
border-bottom:6px solid var(--p5);
border-right:6px solid var(--p5);
bottom:-14px;
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:6px solid var(--p5);
border-right:6px solid var(--p5);
bottom:auto;
left:auto;
margin-top:-11px;
top:50%;
transform:rotate(45deg);
right:-14px;
}
.ogl_tooltip.ogl_right:after
{
border:none;
border-bottom:6px solid var(--p5);
border-left:6px solid var(--p5);
bottom:auto;
left:-14px;
transform:rotate(45deg);
margin-top:-11px;
top:50%;
}
.ogl_tooltip.ogl_rightTop:after
{
border:none;
border-bottom:6px solid var(--p5);
border-left:6px solid var(--p5);
bottom:auto;
left:-14px;
transform:rotate(45deg);
margin-top:-11px;
bottom:3px;
}
.ogl_tooltip.ogl_bottom:after
{
border:none;
border-top:6px solid var(--p5);
border-left:6px solid var(--p5);
bottom:auto;
left:50%;
top:-14px;
transform:translateX(-50%) rotate(45deg);
}
.ogl_tooltip .galaxyTooltip .ogl_actions
{
display:grid;
font-family:"Material Icons";
grid-gap:5px;
grid-template-columns:repeat(5, 1fr);
margin:5px 0;
}
.ogl_tooltip .galaxyTooltip .ogl_actions > *
{
background:var(--p1);
border:2px solid var(--p1);
border-radius:3px;
box-shadow:inset 0 11px rgba(255,255,255,.04);
box-sizing:border-box;
color:var(--textcyan);
cursor:pointer;
font-size:16px !important;
line-height:22px !important;
text-align:center;
text-decoration:none !important;
text-shadow:1px 2px var(--p2);
width:100% !important;
}
.ogl_tooltip .galaxyTooltip .ogl_actions > *:hover
{
background:var(--p1) !important;
color:#fff !important;
}
.ogl_tooltip .ogl_stalkInfo
{
display:grid;
grid-gap:8px;
grid-template-columns:auto minmax(min-content, 125px);
margin:10px 0 10px 0;
}
.ogl_tooltip .ogl_stalkActions
{
display:grid;
grid-gap:5px;
grid-template-columns:repeat(4, 1fr);
}
.ogl_tooltip .ogl_stalkActions .ogl_button
{
font-size:14px !important;
margin-bottom:5px;
width:100%;
}
.ogl_stalkPoints
{
background:var(--p2);
border:2px solid var(--p1);
border-radius:3px;
color:#bdc1c9;
display:grid;
grid-auto-rows:min-content;
grid-column:2;
grid-row:1;
grid-gap:3px;
padding:5px;
}
.ogl_stalkPoints > div
{
align-self:end;
background:var(--p3);
border-radius:5px;
font-size:10px;
font-weight:bold;
line-height:18px;
grid-template-columns:min-content auto;
padding:2px 8px 2px 28px;
position:relative;
text-align:right;
white-space:nowrap;
}
.ogl_stalkPoints > div i
{
font-size:16px !important;
position:absolute;
left:3px;
}
.ogl_stalkPoints > div:nth-child(1) { color:var(--global); }
.ogl_stalkPoints > div:nth-child(2) { color:var(--economy); }
.ogl_stalkPoints > div:nth-child(3) { color:var(--techs); }
.ogl_stalkPoints > div:nth-child(4) { color:var(--fleet); }
.ogl_stalkPoints > div:nth-child(5) { color:var(--def); }
.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);
}
.ogl_tooltip .ogl_stalk
{
color:var(--textcyan);
}
.ogl_tooltip .ogl_stalk .float_right, .ogl_tooltip .ogl_stalk .float_left
{
font-weight:bold;
}
.ogl_actionsContainer
{
display:grid;
grid-gap:5px;
grid-template-columns:repeat(3, 1fr);
margin-top:5px;
}
.ogl_actionsContainer .material-icons
{
font-size:20px !important;
}
.ogl_stalkPlanets [data-multi]:before
{
height:calc(100% + 2px);
}
.ogl_stalkPlanets .ogl_mainPlanet
{
color:var(--textpremium);
position:relative;
margin-left:2px;
z-index:1;
}
.ogl_tooltip .ogl_stalkPlanets
{
background:var(--p2);
border:2px solid var(--p1);
border-radius:5px;
box-sizing:border-box;
display:grid;
grid-auto-rows:min-content;
grid-gap:5px;
max-height:161px;
padding:5px 15px;
overflow-y:auto;
overscroll-behavior:none;
width:100%;
}
.ogl_tooltip .ogl_stalkPlanets > div
{
background:var(--p6);
border-radius:4px;
color:#fff;
font-weight:bold;
grid-gap:5px;
padding:6px 5px 8px 5px;
position:relative;
}
.ogl_tooltip .ogl_stalkPlanets > div:after
{
background:hsl(210deg 27% 15%);
content:'';
height:25px;
left:0;
position:absolute;
top:0;
width:100%;
}
.ogl_tooltip .ogl_stalkPlanets > div > span
{
cursor:pointer;
position:relative;
z-index:1;
}
.ogl_tooltip .ogl_stalkPlanets > div > span:hover
{
color:var(--textsand);
text-decoration:underline;
}
.ogl_tooltip .ogl_stalkPlanets .ogl_planetIcon,
.ogl_tooltip .ogl_stalkPlanets .ogl_moonIcon
{
color:var(--textblue);
cursor:pointer;
font-size:18px !important;
position:absolute;
right:5px;
top:4px;
z-index:1;
}
.ogl_tooltip .ogl_stalkPlanets .ogl_planetIcon
{
right:25px;
}
.ogl_tooltip .ogl_stalkPlanets .ogl_moonIcon
{
opacity:.2;
pointer-events:none;
}
.ogl_tooltip .ogl_stalkPlanets .ogl_moonIcon.ogl_active
{
opacity:1;
pointer-events:auto;
}
.ogl_tooltip .ogl_stalkPlanets .ogl_planetIcon:hover,
.ogl_tooltip .ogl_stalkPlanets .ogl_moonIcon:hover
{
color:var(--textsand);
}
.galaxyTooltip.ogl_stalk h1
{
margin-bottom:10px !important;
}
.galaxyTooltip .ListImage
{
background:var(--p4);
border:2px solid var(--p5);
border-radius:5px;
padding:6px;
text-align:center;
width:75px;
}
.galaxyTooltip .ListLinks
{
border-radius:5px;
padding:6px;
min-width:100px;
width:auto !important;
}
.htmlTooltip h1, .galaxyTooltip h1
{
text-align:center;
margin-bottom:20px !important;
}
.htmlTooltip h1 span, .galaxyTooltip h1 span
{
color:var(--textcyan);
font-size:14px;
font-weight:bold;
}
.galaxyTooltip h1 a
{
font-size:11px;
font-weight:bold;
}
.ogl_ranking
{
font-size:12px !important;
margin-left:5px;
}
.ogl_ranking, .ogl_ranking a
{
color:var(--textsand) !important;
text-decoration:none !important;
}
.ogl_ranking:hover, .ogl_ranking:hover a
{
color:#fff !important;
}
.ogl_colors
{
display:grid;
grid-gap:2px;
grid-template-columns:repeat(12, 1fr);
margin:6px 0 14px 0;
width:100%;
}
.ogl_colors > *
{
border:2px solid var(--p3);
border-radius:20px;
box-sizing:border-box;
cursor:pointer;
font-size:10px !important;
height:18px;
position:relative;
transition:all .2s;
width:100%;
}
.ogl_colors > *:hover
{
filter:brightness(1.2);
transform:scale(1.25);
z-index:3;
}
.ogl_colorAll .ogl_colors > *
{
width:30px;
}
.ogl_colorAll div[data-color="gray"]
{
background:var(--white);
opacity:1 !important;
}
.ogl_colorAll div[data-color="none"]
{
border-color:var(--p5);
}
.ogl_colorAll div[data-color="none"]:before
{
border-radius:inherit;
content:'clear';
display:block;
font-family:'material icons';
font-size:10px;
height:100%;
left:0;
line-height:14px;
position:absolute;
text-align:center;
top:0;
width:100%;
}
.ogl_colorAll.ogl_tooltipColor div[data-color="none"]:before
{
line-height:18px;
}
.ogl_tooltipColor .ogl_colors
{
display:grid;
grid-template-columns:repeat(2, 1fr);
margin:0 !important;
}
.ogl_tooltipColor .ogl_colors > *
{
height:21px !important;
width:30px !important;
}
.ogl_choseCapacityAll
{
color:var(--textpremium) !important;
margin-right:5px;
text-transform:none !important;
}
.ogl_choseCapacity > div
{
display:grid;
grid-template-columns:40px auto;
margin-bottom:4px;
}
.ogl_choseCapacity .ogl_shipIcon
{
border-color:var(--p6);
border-radius:0;
border-right:none;
color:#ffc729 !important;
cursor:pointer;
font-size:22px !important;
height:26px;
text-align:center;
text-shadow:0 0 5px #000;
}
.ogl_choseCapacity .ogl_shipIcon:hover
{
color:#ffdd61 !important;
}
.ogl_choseCapacity button,
.ogl_resourceToKeep button
{
color:var(--green1);
float:right;
font-weight:bold;
text-transform:uppercase;
}
.ogl_choseCapacity h2
{
color:var(--textcyan);
font-weight:bold;
margin-bottom:20px;
text-align:center;
}
.ogl_choseCapacity input
{
border-radius:0 3px 3px 0 !important;
box-shadow:0 0 0 1px #000 !important;
height:22px !important;
padding:0 5px !important;
text-align:right;
width:140px !important;
}
.ogl_tooltip .ogl_metal, .ogl_tooltip .ogl_crystal, .ogl_tooltip .ogl_deut
{
display:inline-block;
font-size:10px !important;
font-weight:bold !important;
border-radius:3px;
}
.ogl_tooltip .ogl_metal .value, .ogl_tooltip .ogl_crystal .value, .ogl_tooltip .ogl_deut .value
{
font-size:10px !important;
font-weight:bold !important;
}
table.fleetinfo:not(.ogl_ignored) tbody
{
display:grid;
grid-gap:3px;
grid-template-columns:repeat(3, 1fr);
}
table.fleetinfo:not(.ogl_ignored) tr
{
background:var(--p2);
border-radius:3px;
color:hsl(208deg 21% 61%);
display:grid;
font-size:11px;
font-weight:bold;
grid-template-columns:40px auto;
overflow:hidden;
}
table.fleetinfo:not(.ogl_ignored) tr.ogl_metal, .ogl_inFlightTable tr.ogl_metal { background:hsl(240deg 14% 18%) !important; }
table.fleetinfo:not(.ogl_ignored) tr.ogl_crystal, .ogl_inFlightTable tr.ogl_crystal { background:hsl(205deg 45% 18%) !important; }
table.fleetinfo:not(.ogl_ignored) tr.ogl_deut, .ogl_inFlightTable tr.ogl_deut { background:hsl(170deg 32% 18%) !important; }
table.fleetinfo:not(.ogl_ignored) td.value
{
font-weight:bold;
line-height:18px;
padding:0 5px;
}
table.fleetinfo:not(.ogl_ignored) .ogl_full
{
grid-column-start:1;
grid-column-end:4;
height:7px;
padding:0;
visibility:hidden;
}
table.fleetinfo tr.ogl_activeNames .ogl_shipIcon,
table.fleetinfo tr.ogl_activeNames td.value
{
border-bottom:1px solid #33414f !important;
}
table.fleetinfo .ogl_shipIcon
{
background-position:center;
border:none;
border-radius:0;
border-right:1px solid #000;
height:18px !important;
width:38px !important;
}
table.fleetinfo .fleetDetailsName
{
box-sizing:border-box;
color:#bba862;
justify-self:center;
grid-column:1 / 3;
max-width:70px;
overflow:hidden;
padding:0 5px;
text-align:center;
text-overflow:ellipsis;
white-space:nowrap;
width:100%;
}
.ogl_economy
{
border:2px solid var(--p1);
border-bottom:0;
border-radius:5px;
}
.ogl_economy .ogl_total
{
background:var(--p1);
padding:10px 12px;
}
.ogl_economy > div:not(.ogl_total):hover
{
box-shadow:inset 0 0 12px 3px var(--neon);
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:var(--p2);
border-bottom:2px solid var(--p1);
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;
margin:1px 0;
}
.ogl_economy > div i
{
display:inline-block;
font-size:10px;
position:relative;
opacity:.7;
text-align:left;
text-indent:4px;
top:-1px;
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_blackHole
{
background:var(--p2);
border:2px solid var(--p1);
border-radius:5px;
display:grid;
grid-gap:7px 20px;
grid-template-columns:repeat(2, 1fr);
grid-template-rows:repeat(7, 1fr);
padding:7px;
}
.ogl_blackHole > div
{
display:grid;
grid-template-columns:40px auto;
position:relative;
}
.ogl_blackHole .ogl_shipIcon
{
background-position:center;
border-radius:4px 0 0 4px !important;
height:26px;
}
.ogl_blackHole input
{
border-radius:0 4px 4px 0 !important;
bottom:0;
box-shadow:none !important;
height:22px !important;
line-height:22px !important;
top:0;
}
.ogl_chartArea
{
align-items:center;
display:grid;
grid-gap:50px;
grid-template-columns:157px auto;
margin-bottom:20px;
}
.ogl_pie
{
background:rgba(255,255,255,.1);
border-radius:50%;
display:block;
height:167px;
margin:16px 0 -75px 20px !important;
position:relative;
text-align:center;
transform:rotate(-90deg);
width:167px;
}
.ogl_pie:before
{
background:var(--p2);
border-radius:50%;
content:'';
height:1px;
left:50%;
padding:22%;
position:absolute;
top:50%;
transform:translate(-50%, -50%);
width:1px;
}
.ogl_pie:after
{
background:var(--p2);
content:'';
height:120%;
position:absolute;
right:50%;
width:50%;
}
.ogl_pieLabel, .ogl_pieItems
{
position:relative;
z-index:1;
}
.ogl_pieLabel
{
border-radius:4px;
box-sizing:border-box;
color:var(--textblue);
display:block;
margin:0 auto;
padding:8px;
white-space:nowrap;
width:100%;
}
.ogl_pieLabel > span
{
display:grid;
font-weight:bold;
grid-gap:6px;
grid-template-columns:15px 160px auto 85px;
}
.ogl_pieLabel > div span:last-of-type
{
color:#fff;
}
.ogl_pieLabel > div b
{
opacity:.7;
text-align:right;
}
.ogl_pieLabel > div > div
{
border-radius:50%;
display:inline-block;
height:10px;
margin-top:3px;
width:10px;
}
/* POPUP
----------------------------*/
.ogl_overlay, .ogl_popup
{
display:none;
}
.ogl_overlay.ogl_active
{
align-items:center;
background:rgba(0,0,0,.7);
display:flex;
justify-content:center;
left:0;
position:fixed;
top:0;
height:100%;
width:100%;
z-index:10000;
}
.ogl_popup.ogl_active
{
background:var(--p3);
border-radius:4px;
display:block;
max-height:80vh;
padding:20px;
position:relative;
}
.ogl_popup.ogl_active > div:not(.ogl_close)
{
max-height:calc(80vh - 20px);
overflow:auto;
}
.ogl_planetList .ogl_linkedMoon
{
margin-bottom:10px;
}
.ogl_planetList .ogl_button
{
width:100%;
}
.ogl_planetList div[data-coords]
{
background:var(--p2);
border:2px solid var(--p1);
border-width:2px 2px 0 2px;
display:grid;
font-size:11px;
grid-gap:10px;
grid-template-columns:180px auto;
line-height:25px;
padding:2px 5px;
position:relative;
white-space:nowrap;
}
.ogl_planetList div[data-coords]:nth-child(2)
{
border-radius:6px 6px 0 0;
}
.ogl_planetList div[data-coords]:last-child
{
border-bottom:2px solid var(--p1);
border-radius:0 0 6px 6px;
}
.ogl_planetList .ogl_coords
{
display:grid;
grid-template-columns:70px auto;
overflow:hidden;
}
.ogl_planetList .ogl_coords b
{
color:var(--textgold);
}
.ogl_planetList .ogl_actions
{
color:var(--textblue);
display:grid;
grid-gap:10px;
grid-template-columns:repeat(2, 1fr);
}
.ogl_planetList .ogl_actions .ogl_planet
{
cursor:pointer;
font-size:17px !important;
line-height:21px !important;
width:33px !important;
}
.ogl_planetList .ogl_actions .ogl_planet:hover
{
color:var(--textsand);
}
.ogl_planetList .ogl_actions .ogl_planet.ogl_disabled
{
background:hsl(354deg 23% 14%) !important;
color:var(--red2) !important;
opacity:.5;
pointer-events:none;
}
.ogl_lockedIcon
{
color:var(--textpremium);
bottom:-2px;
cursor:pointer;
font-size:15px !important;
position:absolute;
right:-20px;
}
.ogl_lockedIcon: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:var(--p2);
border:2px solid var(--p1);
box-shadow:inset 0 43px var(--p1), inset 0 -43px var(--p1);
display:grid;
font-size:12px;
grid-gap:2px 0;
grid-template-columns:auto 140px 140px 140px 130px;
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:var(--p6);
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;
padding:0 5px;
}
.ogl_lockLine .ogl_ok.material-icons
{
font-size:22px !important;
margin-left:5px;
vertical-align:middle;
}
.ogl_lockLine .ogl_delete
{
cursor:pointer;
}
.ogl_fullGrid
{
grid-column-end:-1;
grid-column-start:1;
}
.ogl_lockedContainer
{
align-items:center;
background:var(--p2);
display:grid;
grid-template-columns:auto auto auto auto auto 40px 40px 30px;
line-height:24px;
padding:16px;
}
.ogl_lockedContainer .ogl_header
{
grid-row-start:1;
}
.ogl_lockedContainer .ogl_button
{
border-left:none;
border-radius:0;
box-shadow:inset 0 14px rgb(255 255 255 / 7%);
height:32px;
line-height:28px !important;
font-size:16px !important;
padding:0;
text-align:center;
width:100%;
}
.ogl_lockedContainer .ogl_button.ogl_disabled
{
background:#2c2c2c !important;
color:#545454;
pointer-events:none;
opacity:.5;
}
.ogl_lockedContainer .ogl_button:not(.ogl_header)
{
border-top:none;
box-shadow:inset 0 12px rgb(255 255 255 / 7%);
height:26px;
line-height:24px !important;
}
.ogl_lockedContainer div.ogl_button:not(.ogl_header)
{
border-top:none;
}
.ogl_mineContainer
{
align-items:center;
background:var(--p2);
display:grid;
grid-template-columns:auto auto auto auto auto;
line-height:24px;
padding:16px;
}
.ogl_mineContainer > *, .ogl_lockedContainer > *
{
border-bottom:2px solid var(--p1);
border-right:2px solid var(--p1);
padding:0 16px;
}
.ogl_mineContainer .ogl_header, .ogl_lockedContainer .ogl_header
{
background:var(--p1);
border-top:2px solid var(--p1);
line-height:28px;
}
.ogl_mineContainer b.ogl_header
{
font-size:15px;
text-align:right;
}
.ogl_mineContainer span, .ogl_lockedContainer span
{
border-left:2px solid var(--p1);
color:var(--textsand);
position:relative;
text-align:left;
}
.ogl_lockedContainer span.ogl_header
{
color:#fff;
}
.ogl_mineContainer i, .ogl_lockedContainer i
{
font-weight:normal;
overflow:hidden;
text-align:center;
text-overflow:ellipsis;
white-space:nowrap;
}
.ogl_mineContainer b, .ogl_lockedContainer b
{
display:inline-block;
font-size:12px;
text-align:left;
}
.ogl_mineContainer b.ogl_metal, .ogl_lockedContainer b.ogl_metal { background:hsl(240deg 14% 12%); }
.ogl_mineContainer b.ogl_crystal, .ogl_lockedContainer b.ogl_crystal { background:hsl(205deg 45% 12%); }
.ogl_mineContainer b.ogl_deut, .ogl_lockedContainer b.ogl_deut { background:hsl(170deg 32% 12%); }
.ogl_mineContainer b.ogl_metal.ogl_header, .ogl_lockedContainer b.ogl_metal.ogl_header { background:hsl(240deg 14% 9%) !important; }
.ogl_mineContainer b.ogl_crystal.ogl_header, .ogl_lockedContainer b.ogl_crystal.ogl_header { background:hsl(205deg 45% 9%) !important; }
.ogl_mineContainer b.ogl_deut.ogl_header, .ogl_lockedContainer b.ogl_deut.ogl_header { background:hsl(170deg 32% 9%) !important; }
.ogl_mineContainer div
{
display:inline-block;
float:right;
font-size:9px;
margin-left:15px;
opacity:.5;
font-style:italic;
}
/* OVERVIEW
----------------------------*/
.ogl_storage
{
background:rgba(0,0,0,.8);
border-top:1px solid #000;
bottom:0;
color:var(--yellow2);
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;
}
#resourcesbarcomponent #resources .value
{
font-weight:bold;
}
#overviewcomponent #planetdata
{
bottom:47px;
position:absolute !important;
right:0;
}
.ogl_share
{
border-radius:4px !important;
cursor:pointer;
height:29px !important;
line-height:27px !important;
padding:0 !important;
position:absolute !important;
right:20px;
text-align:center;
top:20px;
user-select:none;
width:29px !important;
}
.ogl_share:hover
{
box-shadow:inset 0 0 6px 3px var(--neon);
}
.ogl_share.ogl_active
{
box-shadow:inset 0 0 1px 1px hsl(150deg 100% 79%), inset 0 0 6px 3px hsl(155deg 64% 60%);
}
.ogl_hiddenCopy
{
left:-10000px;
position:fixed;
top:-10000px;
z-index:-1;
}
/* GALAXY
----------------------------*/
.galaxyTable
{
background:#0d1014;
border-collapse:collapse;
}
#galaxyheadbg2
{
border-left:none;
border-right:none;
display:grid;
grid-template-columns:66px 140px 35px 50px auto 80px 90px;
line-height:25px;
width:auto;
}
#galaxyheadbg2 > th
{
width:100% !important;
}
.galaxyTable .ctContentRow:not([class*="filtered_"]), .ogl_spyTable tr
{
height:30px;
opacity:1;
position:relative;
}
.galaxyTable .ctContentRow:not(.bdaySlot):before
{
background:linear-gradient(to right, rgba(23,31,41,.6) 10px, rgba(23,31,41,.96) 200px);
content:'';
height:33px;
left:0;
position:absolute;
width:100%;
}
.galaxytable .expeditionDebrisSlot:before
{
height:64px;
}
.galaxyTable .ctContentRow > div
{
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 var(--p1);
transition:background .2s;
white-space:nowrap;
z-index:10;
}
.galaxyTable .ctContentRow .cellPlanetName span
{
margin-right:auto;
max-width:90px;
overflow:hidden;
text-align:left;
text-overflow:ellipsis;
}
.galaxyTable .ctContentRow[class*="filtered_filter_"]:not([data-color]):before
{
background:#0d1014;
}
.galaxyTable .ctContentRow[class*="filtered_filter_"]:not([data-color]) td
{
opacity:.2;
}
.galaxyTable .ctContentRow *
{
white-space:nowrap;
}
.galaxyTable .ctContentRow .cellPlayerName span[class*="status_"]
{
cursor:pointer;
}
.galaxyTable .ctContentRow .cellPlayerName span:hover
{
text-decoration:underline;
}
.galaxyTable .ctContentRow .cellPlayerName .float_right
{
color:var(--textsand);
margin-left:auto;
text-decoration:none;
}
.galaxyTable .phalanxlink
{
margin-right:36px !important;
}
.galaxyTable .galaxyRow .galaxyCell.cellPlayerName > span:not(.ownPlayerRow)
{
cursor:pointer;
display:inline-block;
max-width:70px;
overflow:hidden;
margin-right:4px;
text-overflow:ellipsis;
}
#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:10px !important;
font-weight:bold;
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(--textgold);
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 tr td.playername span[class^="status_"]
{
cursor:pointer;
}
#galaxytable tr td.playername span[class^="status_"]:hover
{
text-decoration:underline;
}
#galaxytable .playername a
{
display:inline-block;
max-width:110px;
overflow:hidden;
text-overflow:ellipsis;
vertical-align:unset;
white-space:nowrap;
}
#galaxytable tr.row td span.status
{
vertical-align:top !important;
}
#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 .activity,
#galaxytable .fleetAction
{
pointer-events:none;
}
.galaxyTable .cellDebris
{
text-align:center;
}
.galaxyTable .microdebris
{
background:none !important;
color:#fff;
font-size:10px;
left:0;
line-height:14px;
padding:0;
position:absolute;
width:100% !important;
}
.galaxyTable .cellDebris.ogl_active
{
background:#ad5b21 !important;
opacity:1 !important;
}
.expeditionDebrisSlot
{
background:var(--p3);
}
.expeditionDebrisSlot:before
{
display:none;
}
.expeditionDebrisSlotBox
{
align-items:center;
background:none !important;
border:none !important;
box-shadow:none !important;
display:grid !important;
grid-template-columns:20% auto auto auto !important;
margin:6px 0 5px 0 !important;
padding:4px 0 5px 0 !important;
width:642px !important;
}
.expeditionDebrisSlotBox li
{
list-style:none;
}
.expeditionDebrisSlotBox > img
{
float:right;
justify-self:center;
}
.expeditionDebrisSlotBox > div
{
line-height:1.6;
text-align:left;
}
.expeditionDebrisSlotBox a
{
color:var(--green1);
}
.expeditionDebrisSlotBox a:hover
{
text-decoration:underline;
}
#galaxytable .status_abbr_ally_own
{
color:hsl(140deg 47% 46%) !important;
}
.galaxyTooltip h1
{
margin:0 !important;
}
/* SIDEVIEW
----------------------------*/
.ogl_sideView
{
background:var(--p3);
box-sizing:border-box;
height:100vh;
padding:50px 20px 40px 20px;
position:fixed;
top:0;
transition:transform .3s;
transform:translateX(100%);
right:0;
user-select:none;
width:300px;
z-index:10000;
}
.ogl_sideView.ogl_opened
{
transition:none;
}
.ogl_sideView.ogl_active
{
box-shadow:0 0 10px #000;
transform:translateX(0%);
}
.ogl_sideView .ogl_close
{
right:20px;
top:10px;
}
.ogl_sideView .ogl_loader
{
left:calc(50% - 65px);
position:absolute;
top:calc(50% - 65px);
}
.ogl_sideView .ogl_stalkList.ogl_disabled
{
opacity:.2;
pointer-events:none;
}
.ogl_sideView .ogl_stalkList > div
{
margin-bottom:10px;
}
.ogl_sideView .ogl_stalkPlanets
{
background:var(--p2);
border:2px solid var(--p1);
border-radius:3px;
overflow-y:auto;
padding:10px;
height:calc(100vh - 325px);
}
.ogl_sideView .ogl_stalkPlanets > div
{
align-items:center;
background:var(--p6);
box-shadow:0 0 5px #000;
box-sizing:border-box;
color:#fff;
display:grid;
font-size:10px;
font-weight:bold;
grid-gap:5px;
grid-template-columns:60px auto 20px 20px 20px;
line-height:25px;
margin-bottom:5px;
padding:0 7px 2px 7px;
position:relative;
}
.ogl_sideView .ogl_stalkPlanets > div > div
{
position:relative;
white-space:nowrap;
z-index:1;
}
.ogl_sideView .ogl_stalkPlanets > div > div:nth-child(1)
{
color:var(--textsand);
cursor:pointer;
}
.ogl_sideView .ogl_stalkPlanets > div > div:nth-child(1):hover
{
text-decoration:underline;
}
.ogl_sideView .ogl_stalkPlanets > div > div:nth-child(2)
{
font-style:italic;
overflow:hidden;
text-overflow:ellipsis;
}
.ptreFrames
{
display:grid;
grid-gap:5px;
grid-template-columns:repeat(6, 1fr);
}
.ptreLegend
{
color:var(--textblue);
font-size:10px;
margin-top:20px;
text-align:left;
}
.ptreContent .ptreBestReport .ogl_button
{
color:var(--textcyan);
padding:5px;
}
.ptreContent h3
{
color:var(--textcyan);
font-weight:bold;
padding:10px 0;
text-align:left;
}
.ptreContent [data-check]
{
align-self:center;
background:currentColor;
border-radius:50%;
height:0;
left:50%;
position:absolute;
top:50%;
transform:translate(-50%, -50%);
width:0;
}
.ptreContent [data-check].ogl_active
{
background:none;
box-shadow:inset 0 0 0 3px currentColor;
}
.ptreActivities > span
{
color:var(--red2);
}
.ptreActivities > div
{
display:grid;
grid-gap:5px;
grid-template-columns:repeat(12, 1fr);
}
.ptreActivities > div > *
{
align-items:center;
background:var(--p2);
color:#656f78;
display:grid;
grid-gap:5px;
grid-template-rows:18px auto;
padding:5px 3px;
}
.ptreActivities > div > * > *
{
display:inline-block;
margin:auto;
}
.ptreActivities .ptreDotStats
{
height:30px;
position:relative;
width:30px;
}
.ptreContent
{
text-align:center;
}
.ptreBestReport
{
display:grid;
grid-template-rows:45px auto;
}
.ogl_sideView .ogl_stalkPoints
{
grid-gap:1px;
margin:0;
}
.ogl_sideView .ogl_stalkPoints > div
{
border-color:var(--p2);
}
.ogl_pinnedContent.ogl_stalkPlanets > div
{
display:block;
font-size:11px;
}
.ogl_pinnedContent.ogl_stalkPlanets .ogl_checked
{
color:var(--green1);
font-size:14px !important;
position:absolute;
right:2px;
}
.ogl_sideView .ogl_stalkPlanets > div:after
{
background:var(--p3);
content:'';
height:25px;
left:0;
position:absolute;
top:0;
width:100%;
}
.ogl_sideView .ogl_stalkPlanets > div.ogl_active:after
{
background:var(--p5);
}
.ogl_sideView .ogl_stalkPlanets > div > span
{
position:relative;
z-index:1;
}
.ogl_sideView .ogl_stalkPlanets .ogl_playerName
{
color:var(--textcyan);
cursor:pointer;
overflow:hidden;
position:relative;
white-space:nowrap;
z-index:1;
}
.ogl_sideView .ogl_stalkPlanets .ogl_playerName:hover
{
color:var(--textsand);
}
.ogl_sideView h1
{
color:var(--textcyan);
font-size:14px;
font-weight:bold;
}
.ogl_pinnedHistory
{
float:left;
font-size:20px !important;
margin-right:10px;
}
.ogl_pinnedContent.ogl_stalkPlanets > div span
{
line-height:24px;
position:relative;
z-index:1;
}
.ogl_sideView .ogl_stalkPlanets > div .ogl_planetIcon,
.ogl_sideView .ogl_stalkPlanets > div .ogl_moonIcon,
.ogl_sideView .ogl_stalkPlanets > div .ogl_flagIcon
{
border-radius:50%;
color:var(--textblue);
cursor:pointer;
font-size:18px !important;
justify-self:end;
}
.ogl_stalkPlanets > div .ogl_planetIcon.ogl_done,
.ogl_stalkPlanets > div .ogl_moonIcon.ogl_done
{
color:#34952e;
}
.ogl_sideView .ogl_stalkPlanets > div .ogl_planetIcon:hover,
.ogl_sideView .ogl_stalkPlanets > div .ogl_moonIcon:hover,
.ogl_sideView .ogl_stalkPlanets > div .ogl_flagIcon:hover,
.ogl_sideView .ogl_stalkPlanets > div .ogl_flagIcon.ogl_active
{
color:#fff;
}
.ogl_stalkPlanets > div .ogl_planetIcon.ogl_noPointer,
.ogl_stalkPlanets > div .ogl_moonIcon.ogl_noPointer,
.ogl_stalkPlanets > div .ogl_flagIcon.ogl_noPointer
{
opacity:.2;
}
.ogl_stalkPlanets > div .ogl_planetIcon.ogl_disabled,
.ogl_stalkPlanets > div .ogl_moonIcon.ogl_disabled,
.ogl_stalkPlanets > div .ogl_flagIcon.ogl_disabled
{
color:hsl(111deg 56% 49%) !important;
}
.ogl_stalkPlanets > div .ogl_planetIcon.ogl_danger,
.ogl_stalkPlanets > div .ogl_moonIcon.ogl_danger,
.ogl_stalkPlanets > div .ogl_flagIcon.ogl_danger
{
color:hsl(0deg 67% 52%) !important;
}
.ogl_stalkPlanets > div .ogl_planetIcon.ogl_loading,
.ogl_stalkPlanets > div .ogl_moonIcon.ogl_loading,
.ogl_stalkPlanets > div .ogl_flagIcon.ogl_loading
{
color:var(--yellow1) !important;
pointer-events:none;
}
.ogl_pinnedContent.ogl_stalkPlanets > div .ogl_planetIcon,
.ogl_pinnedContent.ogl_stalkPlanets > div .ogl_moonIcon
{
float:right;
margin-right:40px;
}
.ogl_pinnedContent.ogl_stalkPlanets > div .ogl_planetActivity,
.ogl_pinnedContent.ogl_stalkPlanets > div .ogl_moonActivity
{
position:absolute;
top:0;
}
.ogl_pinnedContent.ogl_stalkPlanets > div .ogl_planetActivity
{
right:85px;
}
.ogl_pinnedContent.ogl_stalkPlanets > div .ogl_moonActivity
{
right:28px;
}
.ogl_pinnedContent.ogl_stalkPlanets div[data-activity]
{
color:var(--yellow1) !important;
}
.ogl_pinnedContent.ogl_stalkPlanets div[data-activity].ogl_short
{
color:var(--red1) !important;
}
.ogl_pinnedContent.ogl_stalkPlanets div[data-activity="60"]
{
color:#fff !important;
opacity:.2;
}
.ogl_sideView .ogl_stalkList > div:nth-child(1)
{
background:var(--p2);
border-radius:3px;
display:grid;
grid-gap:3px;
grid-template-columns:repeat(8, 1fr);
padding:5px;
}
.ogl_sideView .ogl_stalkList > div:nth-child(2),
.ogl_sideView .ogl_stalkList > div:nth-child(3),
.ogl_pinnedSelector
{
background:var(--p2);
border-radius:3px;
display:grid;
grid-gap:5px;
padding:5px;
text-align:center;
}
.ogl_sideView .ogl_stalkList > div:nth-child(2)
{
grid-template-columns:repeat(6, 1fr);
}
.ogl_sideView .ogl_stalkList > div:nth-child(3)
{
grid-template-columns:repeat(5, 1fr);
}
.ogl_sideView .ogl_stalkList > div:nth-child(2) > div,
.ogl_sideView .ogl_stalkList > div:nth-child(3) > div
{
background:var(--p4);
border-radius:3px;
cursor:pointer;
font-weight:bold;
line-height:22px;
}
.ogl_historyButton
{
font-size:20px !important;
margin-right:7px;
padding:0 10px;
}
.ogl_historyList
{
background:var(--p2);
display:grid;
grid-gap:5px;
max-height:calc(100vh - 116px);
overflow:auto;
padding:15px
}
.ogl_historyList .ogl_button
{
background:#19242e !important;
border:2px solid #1e2b38;
box-shadow:0 0 5px #000;
display:grid;
grid-template-columns:90px auto auto;
font-size:11px;
font-weight:normal !important;
padding:0 10px;
text-align:left;
white-space:nowrap;
}
.ogl_historyList .ogl_button:hover
{
background:var(--p5) !important;
text-shadow:none !important;
}
.ogl_historyList .ogl_button > *
{
line-height:23px !important;
}
.ogl_historyList .ogl_button b
{
display:inline-block;
max-width:90px;
overflow:hidden;
text-overflow:ellipsis;
}
.ogl_historyList .ogl_button span
{
color:var(--textsand);
display:inline-block;
font-size:10px;
text-indent:5px;
}
.ogl_historyList .ogl_button .float_right
{
color:var(--fleet) !important;
text-align:right;
}
.ogl_pinnedSelector
{
background:none;
padding:0;
}
.ogl_pinnedSelector > li
{
font-size:11px;
padding:3px 10px;
text-align:left;
}
.ogl_pinnedSelector > li span
{
color:var(--textsand);
font-size:10px;
}
.ogl_sideView .ogl_stalkList > div:nth-child(2) > div.ogl_disabled,
.ogl_sideView .ogl_stalkList > div:nth-child(3) > div.ogl_disabled
{
background:none;
opacity:.2;
pointer-events:none;
}
.ogl_sideView .ogl_stalkList > div:nth-child(2) > div:hover,
.ogl_sideView .ogl_stalkList > div:nth-child(3) > div:hover
{
box-shadow:inset 0 0 12px 3px var(--neon);
color:#fff !important;
}
.ogl_sideView .ogl_stalkList > div:nth-child(2) > div.ogl_active,
.ogl_sideView .ogl_stalkList > div:nth-child(3) > div.ogl_active
{
box-shadow:inset 0 0 1px 1px var(--neonborder), inset 0 0 12px 3px var(--neon);
color:#fff !important;
}
.ogl_sideView .ogl_toggleGalaxies
{
background:var(--p2);
border-radius:3px;
display:grid;
grid-gap:3px;
grid-template-columns:repeat(6, 1fr);
margin-top:20px;
}
.ogl_sideView .ogl_toggleSystems
{
background:var(--p2);
border-radius:3px;
display:grid;
grid-gap:5px;
grid-template-columns:repeat(5, 1fr);
margin:20px 0 20px 0;
}
.ogl_sideView .ogl_toggleGalaxies > div, .ogl_sideView .ogl_toggleSystems > div
{
color:#fff;
border-radius:3px;
cursor:pointer;
font-weight:bold;
line-height:26px;
text-align:center;
}
.ogl_sideView .ogl_toggleGalaxies > div:hover, .ogl_sideView .ogl_toggleSystems > div:hover
{
background:var(--p4);
}
.ogl_sideView .ogl_toggleGalaxies .ogl_active, .ogl_sideView .ogl_toggleSystems .ogl_active
{
background:var(--p1) !important;
box-shadow: inset 0 0 1px 2px var(--neonborder), inset 0 0 12px 3px var(--neon);
color:#fff;
}
.ogl_sideView .ogl_toggleGalaxies .ogl_disabled, .ogl_sideView .ogl_toggleSystems .ogl_disabled
{
background:none !important;
box-shadow:none !important;
color:hsl(210deg 30% 18%);
pointer-events:none;
}
.ogl_sideView .ogl_toggleColors
{
display:grid;
grid-template-columns:repeat(6, 1fr);
}
.ogl_sideView .ogl_toggle, .ogl_sideView .ogl_sideSelection
{
border:2px solid var(--p3);
border-radius:20px;
box-sizing:border-box;
cursor:pointer;
font-size:14px !important;
height:20px;
opacity:.3;
position:relative;
width:100%;
}
.ogl_sideView .ogl_stalkPlanets > div > span:hover
{
color:var(--textsand);
cursor:pointer;
}
.ogl_sideView .ogl_toggle:hover
{
filter:brightness(1.2);
}
.ogl_sideView .ogl_toggle.ogl_active
{
opacity:1;
}
.ogl_sideSelection
{
background:var(--p2);
color:var(--textcyan) !important;
grid-column:-3;
grid-row:2;
line-height:16px !important;
opacity:1 !important;
text-align:center;
}
.ogl_sideSelection:hover
{
color:#fff !important;
}
.ogl_sideSelection:last-child
{
grid-column:-2;
grid-row:2;
}
/* MESSAGE
----------------------------*/
.msg
{
border-radius:5px;
box-shadow:0 0 0 2px var(--p1) !important;
overflow:hidden;
}
.msg .ogl_metal, .msg .ogl_crystal, .msg .ogl_deut,
.msg [data-type]
{
background:hsl(206deg 30% 21%);
display:inline-block;
padding:2px;
font-size:10px;
font-weight:bold;
border-radius:3px;
}
.msg_status
{
box-shadow:2px 0 var(--p1);
}
.msg_status:before
{
background:none !important;
}
.ogl_expeResult
{
background:hsl(207deg 33% 13%);
border-bottom:2px solid var(--p1);
color:var(--textpremium);
font-size:10px;
font-weight:bold;
padding:3px 0;
z-index:1;
text-align:center;
position:relative;
}
.ogl_expeResult > div:not(.ogl_button)
{
background:none !important;
font-size:11px !important;
margin:0 4px;
}
.msg_new .ogl_expeResult
{
background:hsl(204deg 23% 27%);
}
.ogl_button.ogl_ignoreRaid
{
box-shadow:inset 0 8px rgb(255 255 255 / 7%);
color:var(--textcyan) !important;
font-size:18px !important;
left:8px;
line-height:16px !important;
position:absolute;
top:1px;
width:30px;
}
.ogl_button.ogl_ignoreRaid:hover
{
color:#fff !important;
}
.ogl_button.ogl_ignoreRaid.ogl_active
{
color:var(--red1) !important;
}
.ogl_button.ogl_ignoreRaid:before
{
content:'toggle_off';
}
.ogl_button.ogl_ignoreRaid.ogl_active:before
{
content:'toggle_on';
}
/* 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:var(--p2);
border-radius:4px;
display:grid;
grid-gap:10px;
padding:20px;
}
.ogl_config a:hover
{
color:var(--sunset);
}
.ogl_globalConfig h2
{
border-bottom:2px dashed #1e2a36;
color:var(--textsand);
font-size:10px;
font-weight:bold;
margin-top:7px;
padding:7px 0;
text-align:left;
}
.ogl_globalConfig hr
{
background:none;
border:none;
height:2px;
margin:5px 0;
width:100%;
}
.ogl_config hr
{
margin:10px 0;
}
.ogl_globalConfig .ogl_button
{
color:var(--textcyan);
padding:0 8px;
}
.ogl_config > div
{
display:grid;
grid-gap:30px;
grid-template-columns:auto max-content;
line-height:22px;
white-space:nowrap;
}
.ogl_config > .ogl_manageData
{
grid-gap:10px;
grid-template-columns:repeat(4, 1fr);
}
.ogl_config > .ogl_manageData > *
{
font-size:11px;
font-weight:bold;
}
.ogl_config > .ogl_manageData > *:first-child
{
color:#d55757;
}
.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);
}
/* FLEET1
----------------------------*/
#fleet1 #buttonz .content
{
margin-bottom:35px;
}
#fleet1 #continueToFleet2,
#fleet2 #sendFleet,
#fleet2 #backToFleet1
{
background:linear-gradient(to bottom right, var(--p3) 45%, var(--p1)) !important;
border:2px solid var(--p1) !important;
border-radius:4px;
box-shadow:inset 0 1px rgba(255,255,255,.07);
color:var(--green1) !important;
height:auto !important;
text-decoration:none !important;
}
#fleet1 #continueToFleet2:hover,
#fleet2 #sendFleet:hover,
#fleet2 #backToFleet1:hover
{
color:#fff !important;
}
#fleet1 #continueToFleet2
{
margin:0 !important;
width:120px;
}
#fleet2 #backToFleet1
{
color:var(--red1) !important
}
#fleet1 #continueToFleet2 span
{
height:34px !important;
line-height:34px !important;
}
#fleet1 #continueToFleet2.off,
#fleet2 #sendFleet.off
{
background:linear-gradient(to top left, var(--p3) 45%, var(--p1)) !important;
color:var(--red1) !important;
opacity:.7;
}
#fleet1 #continueToFleet2 span,
#fleet2 #sendFleet span,
#fleet2 #backToFleet1 span
{
color:inherit !important;
padding:0 !important;
}
#fleet1 #continueToFleet2.off span,
#fleet2 #sendFleet.off span
{
color:inherit !important;
}
#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 #allornone
{
padding-bottom:10px;
}
#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
{
background:var(--p1);
border-radius:4px;
bottom:-27px !important;
padding:4px;
position:absolute !important;
right:19px !important;
width:auto !important;
}
#fleet1 .allornonewrap .secondcol .clearfloat
{
display:none !important;
}
#fleet1 .send_all, #fleet1 .send_none,
#fleet1 .ogl_expeButton, #fleet1 .show_fleet_apikey, .ogl_capacityContainer
{
background:linear-gradient(to bottom right, var(--p3) 45%, var(--p1)) !important;
border:2px solid var(--p1) !important;
border-radius:4px;
box-shadow:inset 0 1px rgba(255,255,255,.07);
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'; }
#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(--textsand);
}
#fleet1 .ogl_capacityInfo
{
background:#0c1014;
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(--textsand);
}
#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%;
}
.ogl_preloadResources
{
display:grid;
grid-template-columns:38px 180px;
grid-gap:10px 2px;
}
.ogl_preloadResources div:last-child
{
display:grid;
grid-gap:5px;
grid-template-columns:repeat(2, 1fr);
}
.ogl_preloadResources .ogl_shipIcon
{
color:var(--textpremium) !important;
cursor:pointer;
font-size:22px !important;
height:24px;
padding:0;
text-align:center;
text-shadow:0 0 4px #000;
}
.ogl_preloadResources input
{
border:none !important;
box-shadow:none !important;
}
.ogl_preloadResources h2
{
color:var(--textcyan);
font-weight:bold;
padding:10px 0;
text-align:left;
}
.ogl_preloadResources div:last-child, .ogl_preloadResources h2
{
grid-column-start:1;
grid-column-end:3;
}
#fleet1 .ogl_required
{
background:var(--p3);
border-bottom:2px solid var(--p1);
color:#fff;
font-size:10px;
line-height:20px;
padding:0 4px;
user-select:none;
}
#fleet1 .ogl_required:hover
{
color:var(--textsand);
}
#fleet1 .ogl_delta
{
background:var(--p2);
border-bottom:2px solid var(--p1);
border-radius:0 0 0 6px;
color:var(--textcyan);
font-size:15px !important;
line-height:20px !important;
padding:0 3px;
position:absolute;
right:0;
top:0;
user-select:none;
}
#fleet1 .ogl_delta:hover
{
color:var(--textsand);
}
#fleet1 .technology input[type="number"], #fleet1 .technology input[type="text"]
{
border-radius:0 0 2px 2px !important;
bottom:-16px !important;
height:18px !important;
}
.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:hsl(0deg 36% 21%);
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;
}
/* FLEET2
----------------------------*/
#fleet2 .percentageBarWrapper, #fleet2 #fleetboxmission,
#fleet2 ul#missions span.textlabel, #fleet2 div#mission .missionHeader,
#missionNameWrapper, #fleet2 .resbuttons
{
display:none !important;
}
#fleet2 #buttonz ul#missions
{
background:var(--p2);
border:2px solid var(--p3);
border-radius:5px;
display:grid;
grid-template-columns:repeat(12, 1fr);
height:auto !important;
margin:0 !important;
margin-left:14px !important;
padding:4px 0 !important;
width:637px !important;
}
#fleet2 #buttonz ul#missions [data-mission]
{
border-radius:6px;
}
#fleet2 #buttonz ul#missions .selected:before,
#fleet2 #buttonz ul#missions [data-mission]:hover:before
{
box-shadow:inset 0 0 1px 2px var(--neonborder), inset 0 0 12px 3px var(--neon);
border-radius:6px;
content:'';
display:block;
height:100%;
width:100%;
}
#fleet2 #mission ul li
{
color:var(--textcyan) !important;
list-style:disc !important;
}
#fleet2 #fleetboxbriefingandresources #start, #fleet2 #resources
{
background:var(--p2) !important;
border:2px solid var(--p3);
}
#fleet2 div#mission
{
column-gap:16px !important;
margin-top:23px !important;
}
#fleetboxdestination h2
{
visibility:hidden;
}
#fleet2 .briefing_overlay
{
margin-top:-50px !important;
min-height:calc(100% + 60px) !important;
}
#fleet2 .res
{
display:grid;
grid-template-columns:auto 23px 23px 23px 42px;
grid-gap:6px;
height:auto;
margin:0 !important;
position:relative;
width:auto !important;
}
#fleet2 .res .min, #fleet2 .res .max, #fleet2 .ogl_resourceSaver, #fleet2 .ogl_delta
{
background:var(--p3) !important;
border-radius:2px;
bottom:0;
box-shadow:inset 0 12px var(--p4), 0 0 0 2px var(--p1);
color:var(--textcyan) !important;
cursor:pointer;
font-size:16px;
height:24px;
left:auto !important;
line-height:24px !important;
position:relative !important;
text-align:center !important;
text-decoration:none !important;
top:auto !important;
width:100% !important;
}
#fleet2 .res .min:hover, #fleet2 .res .max:hover,
#fleet2 .ogl_resourceSaver:hover, #fleet2 .ogl_delta:hover
{
box-shadow:inset 0 0 1px 2px var(--neonborder), inset 0 0 12px 3px var(--neon);;
color:#fff !important;
}
#fleet2 .res .min img, #fleet2 .res .max img
{
display:none;
}
#fleet2 .res .min:before
{
content:'double_arrow';
display:block;
font-family:'Material Icons';
transform:scaleX(-1);
}
#fleet2 .res .max:before
{
content:'double_arrow';
display:block;
font-family:'Material Icons';
}
#fleet2 .res input
{
border-radius:3px !important;
box-shadow:0 0 0 1px #000 !important;
height:18px !important;
padding:0 5px !important;
text-align:right;
width:91px !important;
}
#fleet2 .res_wrap:nth-child(1) input,
.ogl_choseCapacity > div:nth-child(2) input
{
border:2px solid var(--metal) !important;
}
#fleet2 .res_wrap:nth-child(2) input,
.ogl_choseCapacity > div:nth-child(3) input
{
border:2px solid var(--crystal) !important;
}
#fleet2 .res_wrap:nth-child(3) input,
.ogl_choseCapacity > div:nth-child(4) input
{
border:2px solid var(--deut) !important;
}
#fleet2 .resourceIcon
{
border-radius:6px;
height:24px;
margin-right:3px;
}
#fleet2 #resources .res_wrap
{
background:none !important;
border:none !important;
border-radius:1px !important;
box-shadow:none !important;
height:auto !important;
padding:0 !important;
margin:7px !important;
text-align:right !important;
width:290px !important;
}
#fleet2 .ogl_resourceSaver,
#fleet2 .ogl_delta
{
background:var(--p3);
border:none;
color:#fff;
cursor:pointer;
display:inline-block;
padding:0;
text-align:center;
top:auto;
width:15px;
}
#fleet2 .ogl_delta
{
font-size:14px !important;
}
#fleet2 .ogl_resourceSaver
{
font-size:20px !important;
top:auto;
width:100%;
}
#fleet2 .ogl_resourceSaver.ogl_active
{
color:var(--red1) !important;
font-size:10px !important;
font-weight:bold;
white-space:nowrap;
}
.ogl_fleetSpeed
{
border:2px solid var(--p3);
border-radius:5px;
color:var(--textcyan);
display:grid;
grid-template-columns:repeat(10, 1fr);
margin:15px;
overflow:hidden;
position:relative;
text-align:center;
top:11px;
width:635px;
}
.ogl_fleetSpeed.ogl_big
{
grid-template-columns:repeat(20, 1fr);
}
.ogl_fleetSpeed > div
{
background:var(--p2);
cursor:pointer;
font-size:11px;
font-weight:bold;
line-height:20px;
padding:5px 1px 5px 0;
position:relative;
transition:all .2s;
}
.ogl_fleetSpeed.ogl_big > div:nth-child(odd)
{
color:#607486;
}
.ogl_fleetSpeed > div.ogl_active, .ogl_fleetSpeed > div:hover
{
border-radius:3px;
box-shadow:inset 0 0 12px 3px var(--neon);
color:#fff;
opacity:1;
}
.ogl_fleetSpeed > div.ogl_active
{
box-shadow:inset 0 0 1px 2px var(--neonborder), inset 0 0 12px 3px var(--neon);
}
#loadAllResources
{
background:none !important;
bottom:11px;
font-size:0 !important;
height:24px !important;
left:auto !important;
position:absolute !important;
right:7px !important;
top:auto !important;
width:auto !important;
}
#loadAllResources a
{
background:hsl(28deg 86% 26%) !important;
border-radius:2px;
box-shadow:inset 0 12px hsl(8deg 78% 42% / 11%), inset 0 -2px 17px 6px hsl(210deg 30% 9%), 0 0 0 2px var(--p1);
color:hsl(42deg 63% 55%) !important;
cursor:pointer;
font-size:20px;
height:24px !important;
line-height:24px !important;
margin:0 !important;
padding:0 !important;
text-align:center !important;
text-decoration:none !important;
width:76px !important;
}
#loadAllResources a:hover
{
box-shadow:inset 0 0 1px 2px var(--neonborder), inset 0 0 12px 3px var(--neon);;
color:#fff !important;
}
#loadAllResources a:before
{
content:'double_arrow';
display:block;
font-family:'Material Icons';
}
#loadRoom
{
bottom:12px !important;
font-size:0 !important;
left:7px !important;
position:absolute !important;
top:auto !important;
}
#loadRoom > div
{
font-size:10px !important;
}
.planetlink.ogl_active, .moonlink.ogl_active
{
box-shadow:inset 0 0 1px 2px var(--neonborder), inset 0 0 10px 2px hsl(233deg 43% 53%), 0 0 0 2px var(--p1) !important;
}
/* MESSAGES
----------------------------*/
.ogl_spyTable
{
background:var(--p2);
border-radius:5px;
box-shadow:0 0 0 2px var(--p1);
color:var(--textcyan);
counter-reset:count;
font-size:10px;
margin:60px auto 0 auto;
text-align:center;
user-select:none;
width:100%;
}
.ogl_spyTable > div > div, .ogl_spyTable .ogl_totalSum
{
align-items:center;
display:grid;
grid-gap:2px;
grid-template-columns:52px 105px 95px auto 65px 65px minmax(127px, min-content);
position:relative;
}
.ogl_spyTable > div:nth-child(1)
{
text-transform:uppercase;
}
.ogl_spyTable .ogl_totalSum
{
border-top:2px solid var(--p1);
text-align:right;
}
.ogl_spyTable > div:nth-child(2) > div
{
background:var(--p3) !important;
border-top:2px solid var(--p1);
counter-increment:count 1;
height:22px;
transition:height .2s;
}
.ogl_spyTable .ogl_totalSum th:nth-child(3):before
{
content:counter(count);
}
.ogl_spyTable th
{
font-weight:bold;
padding:5px;
position:relative;
}
.ogl_spyTable th.ogl_headerActions
{
display:grid;
grid-template-columns:repeat(4, 1fr);
padding:3px;
}
.ogl_spyTable th.ogl_headerActions > div:nth-child(1)
{
grid-column:-2;
}
.ogl_spyTable .ogl_headerActions .ogl_button
{
color:var(--text);
font-size:15px !important;
}
.ogl_spyTable th.ogl_active
{
color:var(--textpremium);
}
.ogl_spyTable th[data-filter]
{
cursor:pointer;
}
.ogl_spyTable th[data-filter]:hover
{
color:#fff !important;
}
.ogl_spyTable th[data-filter]:after
{
content:'unfold_more';
font-family:'material icons';
font-size:14px;
opacity:.5;
text-transform:initial;
vertical-align:sub;
}
.ogl_spyTable td
{
background:var(--p3);
box-sizing:border-box;
overflow:hidden;
padding:5px;
position:relative;
text-overflow:ellipsis;
white-space:nowrap;
}
.ogl_spyTable .ogl_attacked td
{
background:hsl(0deg 22% 14%);
opacity:.8;
}
.ogl_spyTable td:not(:first-child)
{
box-shadow:-2px 0 var(--p2);
}
.ogl_spyTable a
{
text-decoration:none;
}
.ogl_spyTable .ogl_danger
{
color:var(--red2) !important;
}
.ogl_spyTable .ogl_warning
{
color:var(--yellow2) !important;
}
.ogl_spyTable a:hover
{
color:var(--textsand) !important;
}
.ogl_spyTable .ogl_coords
{
text-align:left;
text-indent:14px;
}
.ogl_spyTable .ogl_coords .ogl_type
{
font-size:14px !important;
left:-12px;
position:absolute;
top:4px;
vertical-align:middle;
}
.ogl_spyTable .ogl_inFlight
{
border-color:transparent red transparent transparent !important;
bottom:2px;
left:-1px;
top:auto !important;
transform:scale(.7) rotate(180deg);
transform-origin:right;
right:auto !important;
}
.ogl_spyTable .ogl_name a
{
color:inherit !important;
font-weight:bold;
}
.ogl_spyTable .ogl_name a:hover
{
color:var(--textsand) !important;
}
.ogl_spyTable .ogl_renta
{
padding:0;
}
.ogl_spyTable .ogl_important,
.ogl_spyTable .ogl_important a
{
color:#fff;
}
.ogl_spyTable .ogl_renta a
{
display:block;
padding:5px;
}
.ogl_spyTable .ogl_renta div
{
font-weight:bold;
text-align:right;
}
.ogl_spyTable .ogl_renta span,
.ogl_spyTable .ogl_renta:hover div
{
display:none;
}
.ogl_spyTable .ogl_renta:hover span
{
display:block;
font-weight:bold;
text-align:right;
}
.ogl_spyTable .ogl_colorButton
{
background:var(--p1);
border:none;
border-radius:20px;
cursor:pointer;
height:15px;
margin:0;
overflow:hidden;
padding:0;
position:absolute;
right:2px;
top:4px;
width:24px;
}
.ogl_spyTable .ogl_colorDiv .ogl_colorButton
{
border:none !important;
bottom:0 !important;
height:100% !important;
left:0 !important;
right:0 !important;
top:0 !important;
width:100% !important;
}
.ogl_spyTable .ogl_reportOptions
{
align-items:center;
display:grid;
grid-auto-flow:column;
grid-gap:5px;
height:22px;
justify-content:space-around;
padding:0 5px;
}
.ogl_spyTable aside
{
background:linear-gradient(to bottom, var(--p3), var(--p1));
border-top:2px solid var(--p1);
color:var(--textpremium);
display:none;
font-weight:bold;
grid-gap:0;
grid-template-columns:repeat(5, 1fr);
padding:5px;
}
.ogl_spyTable aside.ogl_active
{
display:grid;
}
.ogl_spyTable aside ul
{
padding:5px 0;
}
.ogl_spyTable aside ul:nth-child(1)
{
padding-top:25px;
}
.ogl_spyTable aside ul .ogl_shipIcon
{
background-position:center;
height:20px;
margin:auto;
}
.ogl_spyTable aside ul a
{
color:#fff;
}
.ogl_spyTable aside ul a.ogl_disabled
{
color:#777;
pointer-events:none;
text-decoration:none;
}
.ogl_spyTable aside ul > *:not(.ogl_shipIcon)
{
padding:3px 0;
width:100%;
}
.ogl_reportOptions > *
{
background:hsl(205deg 26% 22%);
border-radius:3px;
color:#fff !important;
cursor:pointer;
font-size:12px;
height:16px;
line-height:17px !important;
user-select:none;
text-align:center;
text-decoration:none !important;
width:16px;
}
.ogl_reportOptions > *.material-icons
{
font-size:14px !important;
}
.ogl_reportOptions > div:hover, .ogl_reportOptions > a:hover
{
box-shadow:inset 0 0 4px 2px var(--neon);
color:#fff !important;
}
.ogl_spyTable .ogl_expand:before
{
content:'expand_more';
}
.ogl_spyTable .ogl_extended .ogl_expand:before
{
content:'expand_less';
}
.ogl_spyTable .ogl_added
{
display:block;
}
.ogl_sim
{
background:linear-gradient(to top, #1a2027, #2e3948) !important;
box-shadow:inset 0 1px 3px #374454;
border-radius:5px;
color:#9ea5af !important;
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_sim ~ .ogl_sim
{
margin-left:7px;
}
#subtabs-nfFleetTrash
{
width:627px;
right:7px;
}
#subtabs-nfFleetTrash
{
background-image:none !important;
}
#subtabs-nfFleetTrash .trash_box
{
left:0 !important;
}
#subtabs-nfFleetTrash .btn_trash
{
width:96px;
}
#subtabs-nfFleetTrash .ogl_trash
{
color:var(--textcyan);
font-size:16px !important;
line-height:25px !important;
position:absolute;
right:98px;
top:0;
width:40px;
}
#subtabs-nfFleetTrash .ogl_trash:hover
{
color:#fff;
}
#messages .tab_favorites, #messages .tab_inner
{
background:hsl(210deg 11% 9%) !important;
box-shadow:0 0 0 2px var(--p0);
border-radius:5px;
}
#messages .tab_favorites:before, #messages .tab_inner:before
{
display:none !important;
}
/* FLEET EVENTS
----------------------------*/
#eventboxContent h2 .ogl_button
{
background:linear-gradient(to bottom, #405887, #324979) !important;
border-radius:5px;
box-shadow:inset 0 0 0 1px #475a82;
color:#fff;
font-size:16px !important;
line-height:16px !important;
position:absolute;
right:53px;
top:5px;
}
#eventboxContent .eventFleet
{
box-shadow:inset 0 -1px #0d1014;
}
#eventboxContent .eventFleet .ogl_timeZone:before,
#eventboxContent .eventFleet .ogl_timeZone:after,
#eventboxContent .allianceAttack .ogl_timeZone:before,
#eventboxContent .allianceAttack .ogl_timeZone:after
{
font-size:10px !important;
}
.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 .ogl_loader
{
margin:30px auto;
}
#eventContent tbody
{
outline:1px solid #000;
}
#eventContent tr, #eventContent .odd, #eventContent .part-even
{
background:#101920;
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;
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;
height:100%;
padding:0;
}
#eventContent tr .icon_movement span,
#eventContent tr .icon_movement_reserve span
{
left:0;
position:absolute;
top:0;
}
.detailsFleet
{
width:auto !important;
}
.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
{
pointer-events:none !important;
display:block !important;
font-size:0 !important;
overflow:visible;
width:auto;
}
#eventContent .originFleet span:after, #eventContent .destFleet span:after
{
content:attr(title);
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-align:left;
text-indent:5px;
text-shadow:1px 1px #000;
}
#eventboxContent .eventFleet, #eventboxContent .allianceAttack
{
align-items:center;
display:grid;
grid-gap:2px;
grid-template-columns:85px 72px 23px 95px 70px auto 16px 95px 70px 20px 20px;
white-space:nowrap;
}
#eventboxContent .eventFleet td:not(.icon_movement):not(.icon_movement_reserve)
{
overflow:hidden;
text-overflow:ellipsis;
}
.eventFleet .missionFleet img
{
position:relative;
top:2px;
vertical-align:top !important;
}
.detailsOpened .ogl_backTimer
{
background:#232f3a !important;
border-radius:2px !important;
right:205px !important;
line-height:16px !important;
padding:0 9px !important;
position:absolute !important;
top:3px !important;
}
.ogl_backTimer:before, .ogl_backTimer:after
{
font-size:10px !important;
vertical-align:middle !important;
}
.detailsOpened .marker01, .detailsOpened .marker02
{
visibility:hidden !important;
}
.ogl_shipDetail
{
color:hsl(214deg 10% 68%);
display:grid;
grid-gap:2px;
grid-template-columns:repeat(20, 1fr);
height:18px;
pointer-events:none;
position:absolute;
left:85px;
text-align:center;
top:25px;
white-space:nowrap;
}
.ogl_shipDetail > div
{
display:grid;
}
.ogl_shipDetail .ogl_shipIcon
{
border:none;
border-radius:4px 4px 0 0;
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:hsl(210deg 29% 8%);
border-radius:2px;
line-height:14px;
margin-top:-6px;
font-weight:bold;
font-size:9px;
}
.ogl_inFlightTable
{
display:grid;
grid-gap:3px;
grid-template-columns:repeat(3, 1fr);
}
.ogl_inFlightTable tr:not(.ogl_full)
{
background:var(--p2);
}
.ogl_inFlightTable .value
{
display:table-cell !important;
padding:3px;
}
.ogl_inFlightTable .ogl_shipIcon
{
background-position:center;
display:table-cell !important;
height:20px;
}
.ogl_inFlightTable .ogl_full
{
grid-column-start:1;
grid-column-end:4;
height:7px;
}
.fleetDetails.detailsOpened
{
height:59px !important;
}
.detailsOpened .timer
{
font-size:10px !important;
font-weight:bold !important;
left:7px !important;
top:23px !important;
width:auto !important;
}
.detailsClosed .timer
{
top:-4px !important;
}
.detailsOpened .absTime
{
left:7px !important;
top:36px !important;
}
.detailsClosed .absTime
{
left:6px !important;
position:absolute !important;
top:10px !important;
visibility:visible !important;
}
.detailsOpened .nextTimer
{
font-size:10px !important;
font-weight:bold !important;
left:auto !important;
right:7px !important;
top:24px !important;
width:auto !important;
}
.detailsOpened .nextabsTime
{
left:auto !important;
right:7px !important;
top:40px !important;
width:auto !important;
}
.detailsOpened .nextabsTime:after
{
font-size:10px !important;
}
.detailsOpened .allianceName
{
top:45px;
}
.detailsClosed .nextTimer, .detailsClosed .nextabsTime,
.detailsClosed .nextMission, .detailsClosed .ogl_fulldate
{
display:none !important;
}
.detailsClosed .fleetDetailButton
{
display:none !important;
}
.detailsClosed .reversal
{
top:2px !important;
}
.detailsClosed .starStreak .route > a
{
background:none !important;
left:326px !important;
margin:0 !important;
top:-3px !important;
}
.detailsOpened .originData
{
left:107px !important;
text-align:right !important;
}
.detailsOpened .destinationData
{
left:470px !important;
text-align:left !important;
}
.fleetDetails
{
background:hsl(210deg 29% 11%) !important;
border:2px solid var(--p0) !important;
box-shadow:inset 0 23px var(--p2) !important;
margin:2px 5px 10px 5px !important;
}
.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 .mission
{
color:inherit !important;
}
.fleetDetails .mission:before
{
background:currentColor;
content:'';
display:block;
height:100%;
left:0;
opacity:.2;
position:absolute;
top:0;
width:100%;
}
.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:1px !important;
}
.detailsOpened .sendMail
{
left:auto !important;
right:22px !important;
top:1px !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 .destinationPlanet
{
max-width:60px !important;
}
.detailsOpened .absTime:after
{
font-size:10px !important;
}
.detailsClosed .mission
{
border-radius:4px;
height:20px;
line-height:17px;
text-align:center;
}
#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;
}
#highscoreContent div.content table#ranks tbody tr:nth-child(odd) td
{
background:hsl(214deg 27% 10%) !important;
}
#highscoreContent div.content table#ranks tbody tr:nth-child(even) td
{
background:hsl(212deg 26% 8%) !important;
}
#highscoreContent div.content table#ranks tbody tr.allyrank td
{
background:hsl(177deg 33% 16%) !important;
}
#highscoreContent div.content table#ranks tbody tr.myrank td
{
background:hsl(212deg 29% 26%) !important;
}
#highscoreContent .honorRank
{
position:absolute;
}
#highscoreContent .honorScore
{
pointer-events:none;
}
#highscoreContent .playername
{
color:#eee;
display:inline-block;
font-weight:bold;
overflow:hidden;
position:relative;
text-overflow:ellipsis;
text-indent:21px;
vertical-align:bottom;
white-space:nowrap;
}
#highscoreContent .playername:hover
{
text-decoration:underline;
}
#highscoreContent a
{
position:relative;
}
#highscoreContent .ally-tag
{
float:right;
font-weight:bold;
}
#highscoreContent .ally-tag > a
{
color:hsl(213deg 22% 56%) !important;
}
#highscoreContent .honorScore
{
display:none !important;
font-size:0 !important;
left:20px;
position:absolute;
top:6px;
}
#highscoreContent .honorScore span,
#highscoreContent .stats_counter
{
font-size:9px !important;
font-weight:bold;
}
#highscoreContent #ranks tbody .score
{
color:hsl(44deg 74% 72%);
font-size:11px;
}
#highscoreContent #ranks tbody .score .small
{
color:hsl(210deg 11% 57%);
font-size:10px;
font-weight:bold;
}
/*!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;
}
`);
}
// include base64 material icons
GM_addStyle(`
@font-face
{
font-family:'Material Icons';
font-style:normal;
font-weight:400;
src:local('Material Icons'), local('MaterialIcons-Regular'),
url(data:application/octet-stream;base64,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);
}
`);
GM_addStyle(oglcss);