Fill in language integration

This commit is contained in:
Aelita4 2025-02-11 18:59:11 +01:00
parent fe201e4a39
commit 930ae80642
Signed by: Aelita4
GPG Key ID: E44490C2025906C1
21 changed files with 255 additions and 211 deletions

View File

@ -32,7 +32,7 @@ for(const key of planet.resources.resources) {
<Image src="/images/resources/energy.png" alt="energy" class="icon" width={32} height={32} />
<span class={`res-amount ${planet.energy.consumption > planet.energy.production ? "prod-full" : planet.energy.consumption >= (planet.energy.production * 0.9) ? "prod-almost-full" : ""}`}>{planet.energy.production - planet.energy.consumption}</span>
<div class="resourcebar-item-tooltip">
<span class="resourcebar-item-tooltip-title">Energy</span>
<span class="resourcebar-item-tooltip-title">{getName(lang, 'resources', 'energy')}</span>
<span class="resourcebar-item-tooltip-name">{getName(lang, 'general', 'production')}</span><span class={`resourcebar-item-tooltip-amount`}>{planet.energy.production}</span>
<span class="resourcebar-item-tooltip-name">{getName(lang, 'general', 'consumption')}</span><span class="resourcebar-item-tooltip-amount">{planet.energy.consumption}</span>
<span class="resourcebar-item-tooltip-name">{getName(lang, 'general', 'balance')}</span><span class={`resourcebar-item-tooltip-amount ${planet.energy.consumption > planet.energy.production ? "prod-full" : planet.energy.consumption >= (planet.energy.production * 0.9) ? "prod-almost-full" : ""}`}>{planet.energy.production - planet.energy.consumption}</span>
@ -42,7 +42,7 @@ for(const key of planet.resources.resources) {
<Image src="/images/resources/stellar-quartz.png" alt="stellar-quartz" class="icon" width={32} height={32} />
<span class={`res-amount`}>0</span>
<div class="resourcebar-item-tooltip">
<span class="resourcebar-item-tooltip-title">Stellar Quartz</span>
<span class="resourcebar-item-tooltip-title">{getName(lang, 'resources', 'stellar-quartz')}</span>
<span class="resourcebar-item-tooltip-name">{getName(lang, 'general', 'avaliable')}</span><span class={`resourcebar-item-tooltip-amount`}>0</span>
</div>
</div>

View File

@ -9,6 +9,7 @@ export const getLang = async (language = "en") => {
resources: (await lang[3].find({}).toArray()).map(({ _id, ...rest }) => rest),
research: (await lang[4].find({}).toArray()).map(({ _id, ...rest }) => rest),
structures: (await lang[5].find({}).toArray()).map(({ _id, ...rest }) => rest),
defenses: (await lang[6].find({}).toArray()).map(({ _id, ...rest }) => rest)
defenses: (await lang[6].find({}).toArray()).map(({ _id, ...rest }) => rest),
missions: (await lang[7].find({}).toArray()).map(({ _id, ...rest }) => rest),
}
}

View File

@ -91,7 +91,8 @@ export const Lang = async (language = "en") => {
await db.collection('resources'),
await db.collection('research'),
await db.collection('structures'),
await db.collection('defenses')
await db.collection('defenses'),
await db.collection('missions'),
]
}

View File

@ -38,9 +38,9 @@ export async function getLocales(language: string) {
}
export function getName(locale: { [key: string]: { id: string, name: string }[] }, type: string, name: string) {
return locale[type].find((element: { id: string }) => element.id === name)?.name ?? `NTL_${name}`;
return locale[type]?.find((element: { id: string }) => element.id === name)?.name ?? `NTL_${name}`;
}
export function getObj(locale: { [key: string]: { id: string, name: string, description: string | null }[] }, type: string, name: string) {
return locale[type].find((element: { id: string }) => element.id === name) ?? { id: name, name: `NTL_${name}`, description: `NTL_${name}` };
return locale[type]?.find((element: { id: string }) => element.id === name) ?? { id: name, name: `NTL_${name}`, description: `NTL_${name}` };
}

View File

@ -15,15 +15,12 @@ const frontend = async (context: APIContext, next: MiddlewareNext) => {
const user = locationManager.getUser(checkUser._id);
if(user === null) return context.redirect('/logout');
const lang = await getLocales(context.cookies.get('language')?.value ?? await getHighestWeightedLanguage(context.request.headers.get('accept-language')));
const activeId = context.cookies.get('currentPlanet')?.value ?? "0";
const active = locationManager.findId(new ObjectId(activeId));
if(active === null) return context.redirect('/logout');
context.locals.token = loggedToken;
context.locals.lang = lang;
context.locals.user = user;
context.locals.active = active;
@ -31,5 +28,10 @@ const frontend = async (context: APIContext, next: MiddlewareNext) => {
}
export const onRequest = defineMiddleware(async (context, next) => {
if(context.url.pathname.startsWith('/api')) return next();
const lang = await getLocales(context.cookies.get('language')?.value ?? await getHighestWeightedLanguage(context.request.headers.get('accept-language')));
context.locals.lang = lang;
return context.url.pathname.startsWith('/game') ? frontend(context, next) : next();
});

View File

@ -60,12 +60,12 @@ const buildingsByCategory = buildingsList.reduce((acc: { [key: string]: Array<DB
<LoggedIn id="buildings" title="Buildings">
<div id="building-modal-background">
<div id="building-modal-details" data-building-id="">
<h3>Required resources</h3>
<div class="building-modal-text" id="building-modal-req-resources">None</div>
<h3>Required buildings</h3>
<div class="building-modal-text" id="building-modal-req-buildings">None</div>
<h3>Required research</h3>
<div class="building-modal-text" id="building-modal-req-research">None</div>
<h3>{getName(lang, 'general', 'required-resources')}</h3>
<div class="building-modal-text" id="building-modal-req-resources">{getName(lang, 'general', 'none')}</div>
<h3>{getName(lang, 'general', 'required-buildings')}</h3>
<div class="building-modal-text" id="building-modal-req-buildings">{getName(lang, 'general', 'none')}</div>
<h3>{getName(lang, 'general', 'required-research')}</h3>
<div class="building-modal-text" id="building-modal-req-research">{getName(lang, 'general', 'none')}</div>
</div>
</div>
{Object.entries(buildingsByCategory).map(([category, buildings]) => <>
@ -145,19 +145,21 @@ h1 {
if(!modalDiv) return;
modalDiv.style.display = 'block';
const langNone = lang['general'].find(g => g.id === 'none').name;
const reqResources = modalSet[el.parentElement.parentElement.parentElement.dataset.id]?.resources ?? [];
const reqBuildings = modalSet[el.parentElement.parentElement.parentElement.dataset.id]?.buildings ?? [];
const reqResearch = modalSet[el.parentElement.parentElement.parentElement.dataset.id]?.research ?? [];
modalResources.innerHTML = reqResources.length === 0 ? "None" : reqResources.map(resource => {
modalResources.innerHTML = reqResources.length === 0 ? langNone : reqResources.map(resource => {
return `${lang['resources'].find(r => r.id === resource.id).name}: ${resource.amount}`;
}).join("<br />");
modalBuildings.innerHTML = reqBuildings.length === 0 ? "None" : reqBuildings.map(building => {
modalBuildings.innerHTML = reqBuildings.length === 0 ? langNone : reqBuildings.map(building => {
return `${lang['buildings'].find(b => b.id === building.id).name}: ${building.level}`;
}).join("<br />");
modalResearch.innerHTML = reqResearch.length === 0 ? "None" : reqResearch.map(research => {
modalResearch.innerHTML = reqResearch.length === 0 ? langNone : reqResearch.map(research => {
return `${lang['research'].find(r => r.id === research.id).name}: ${research.level}`;
}).join("<br />");

View File

@ -4,7 +4,7 @@ import LoggedIn from '../../layouts/LoggedIn.astro';
import { Planet } from '../../lib/classes/managers/PlanetManager';
import SystemManager from '../../lib/classes/managers/SystemManager';
import { getAllDefenses } from '../../lib/db/defenses';
import { getObj } from '../../lib/utils/langDriver';
import { getName, getObj } from '../../lib/utils/langDriver';
const { token, lang } = Astro.locals;
const active: SystemManager | Planet = Astro.locals.active;
@ -47,12 +47,12 @@ const planetId = active instanceof SystemManager ? active.data._id : active._id;
<LoggedIn id="defenses" title="Defenses">
<div id="ship-modal-background">
<div id="ship-modal-details" data-building-id="">
<h3>Required resources</h3>
<div class="ship-modal-text" id="ship-modal-req-resources">None</div>
<h3>Required buildings</h3>
<div class="ship-modal-text" id="ship-modal-req-buildings">None</div>
<h3>Required research</h3>
<div class="ship-modal-text" id="ship-modal-req-research">None</div>
<h3>{getName(lang, 'general', 'required-resources')}</h3>
<div class="ship-modal-text" id="ship-modal-req-resources">{getName(lang, 'general', 'none')}</div>
<h3>{getName(lang, 'general', 'required-buildings')}</h3>
<div class="ship-modal-text" id="ship-modal-req-buildings">{getName(lang, 'general', 'none')}</div>
<h3>{getName(lang, 'general', 'required-research')}</h3>
<div class="ship-modal-text" id="ship-modal-req-research">{getName(lang, 'general', 'none')}</div>
</div>
</div>
@ -120,19 +120,21 @@ const planetId = active instanceof SystemManager ? active.data._id : active._id;
if(!modalDiv) return;
modalDiv.style.display = 'block';
const langNone = lang['general'].find(g => g.id === 'none').name;
const reqResources = modalSet[el.parentElement.parentElement.parentElement.dataset.id]?.resources ?? [];
const reqBuildings = modalSet[el.parentElement.parentElement.parentElement.dataset.id]?.buildings ?? [];
const reqResearch = modalSet[el.parentElement.parentElement.parentElement.dataset.id]?.research ?? [];
modalResources.innerHTML = reqResources.length === 0 ? "None" : reqResources.map(resource => {
modalResources.innerHTML = reqResources.length === 0 ? langNone : reqResources.map(resource => {
return `${lang['resources'].find(r => r.id === resource.id).name}: ${resource.amount}`;
}).join("<br />");
modalBuildings.innerHTML = reqBuildings.length === 0 ? "None" : reqBuildings.map(building => {
modalBuildings.innerHTML = reqBuildings.length === 0 ? langNone : reqBuildings.map(building => {
return `${lang['buildings'].find(b => b.id === building.id).name}: ${building.level}`;
}).join("<br />");
modalResearch.innerHTML = reqResearch.length === 0 ? "None" : reqResearch.map(research => {
modalResearch.innerHTML = reqResearch.length === 0 ? langNone : reqResearch.map(research => {
return `${lang['research'].find(r => r.id === research.id).name}: ${research.level}`;
}).join("<br />");

View File

@ -2,6 +2,7 @@
import LoggedIn from '../../layouts/LoggedIn.astro';
import { Planet } from '../../lib/classes/managers/PlanetManager';
import SystemManager from '../../lib/classes/managers/SystemManager';
import { getName } from '../../lib/utils/langDriver';
const { token, lang } = Astro.locals;
const active: SystemManager | Planet = Astro.locals.active;
@ -31,13 +32,13 @@ const buildingsList = {
<form method="post" class="form-container">
<table>
<tr class="table-col-header">
<th>Building name</th>
<th>Level</th>
<th>Production %</th>
<th>Production per hour</th>
<th>Energy usage</th>
<th>{getName(lang, 'general', 'building-name')}</th>
<th>{getName(lang, 'general', 'level')}</th>
<th>{getName(lang, 'general', 'production-percent')}</th>
<th>{getName(lang, 'general', 'production-per-hour')}</th>
<th>{getName(lang, 'general', 'energy-usage')}</th>
</tr>
<tr><td colspan="5" class="table-separator">Mines</td></tr>
<tr><td colspan="5" class="table-separator">{getName(lang, 'buildings', 'cat-mines')}</td></tr>
{buildingsList.mines.map(building => <tr>
<td>{building.data.id}</td>
<td>{building.level}</td>
@ -57,7 +58,7 @@ const buildingsList = {
<td>15</td>
<td class="red">-{building.level * building.data.energy}</td>
</tr>)}
<tr><td colspan="5" class="table-separator">Power plants</td></tr>
<tr><td colspan="5" class="table-separator">{getName(lang, 'buildings', 'cat-power-plants')}</td></tr>
{buildingsList.powerPlants.map(building => <tr>
<td>{building.data.id}</td>
<td>{building.level}</td>
@ -77,7 +78,7 @@ const buildingsList = {
<td></td>
<td class="green">+{building.level * building.data.energy}</td>
</tr>)}
<tr><td colspan="5" class="table-separator">Utilities</td></tr>
<tr><td colspan="5" class="table-separator">{getName(lang, 'buildings', 'cat-utilities')}</td></tr>
{buildingsList.utilities.map(building => <tr>
<td>{building.data.id}</td>
<td>{building.level}</td>
@ -85,7 +86,7 @@ const buildingsList = {
<td></td>
<td class="red">-{building.level * building.data.energy}</td>
</tr>)}
<tr><td colspan="5" class="table-separator">Storage</td></tr>
<tr><td colspan="5" class="table-separator">{getName(lang, 'buildings', 'cat-storage')}</td></tr>
{buildingsList.storage.map(building => <tr>
<td>{building.data.id}</td>
<td>{building.level}</td>
@ -94,7 +95,7 @@ const buildingsList = {
<td class="red">-{building.level * building.data.energy}</td>
</tr>)}
</table>
<input type="submit" value="Save" class="save-button" />
<input type="submit" value={getName(lang, 'general', 'save')} class="save-button" />
</form>
</LoggedIn>
<style>

View File

@ -114,7 +114,7 @@ const sectorsList = galaxies.map(galaxy => {
const discovered = discoveredSectors.find(s => s.systemId.equals(system.data._id));
if(!discovered && !system.data.ownedBy.id.equals(user.id)) return {
_id: system.data._id,
name: `${system.data.name} (not discovered)`,
name: `${system.data.name} ${getName(lang, 'general', 'not-discovered')}`,
planets: []
}
@ -133,12 +133,25 @@ const sectorsList = galaxies.map(galaxy => {
})
}
});
const langJS = {
noSectors: getName(lang, 'general', 'no-sectors'),
noSystems: getName(lang, 'general', 'no-systems'),
noPlanets: getName(lang, 'general', 'no-planets'),
atLeastOneShip: getName(lang, 'general', 'at-least-one-ship'),
sourceDestinationSame: getName(lang, 'general', 'source-destination-same'),
notEnoughFuel: getName(lang, 'general', 'not-enough-fuel'),
notEnoughSolidCargo: getName(lang, 'general', 'not-enough-solid-cargo'),
notEnoughLiquidCargo: getName(lang, 'general', 'not-enough-liquid-cargo'),
notEnoughGasCargo: getName(lang, 'general', 'not-enough-gas-cargo'),
notEnoughGasForFuel: getName(lang, 'general', 'not-enough-gas-for-fuel'),
}
---
<LoggedIn id="fleet" title="Fleet">
<label for="fleet-toggle">
<input type="checkbox" id="fleet-toggle">
<div class="fleet-status">
<h2>Fleet status ({fleet.length} total | {own} own | {friendly} friendly | {enemy} enemy)</h2>
<h2>{getName(lang, 'general', 'fleet-status')} ({fleet.length} {getName(lang, 'general', 'total')} | {own} {getName(lang, 'general', 'own')} | {friendly} {getName(lang, 'general', 'friendly')} | {enemy} {getName(lang, 'general', 'enemy')})</h2>
<ul>
{fleet.map(f => {
const source = locationManager.findId(f.source);
@ -147,14 +160,14 @@ const sectorsList = galaxies.map(galaxy => {
return (<li>
<div class="ship-cards">
<span style={`${source instanceof SystemManager && "color:red;"}`}>{(source instanceof SystemManager ? source.data.name : source?.name) ?? "?"}</span> =&gt; <span style={`${destination instanceof SystemManager && "color:red;"}`}>{(destination instanceof SystemManager ? destination.data.name : destination?.name) ?? "?"}</span> | {f.mission}{f.returning ? " (R)" : ""}<br />
Containing: {f.ships.map(s => {
{getName(lang, 'general', 'containing')}: {f.ships.map(s => {
const ship = ships.find(ship => ship.id === s.id);
return `${getName(lang, 'ships', s.id)} x${s.amount}`;
}).join(', ')} <br />
Cargo: {typeof f.cargo === "undefined" || f.cargo.length === 0 ? <>None</> : f.cargo.map(c => `${c.amount} ${getName(lang, 'resources', c.id)}`).join(', ')} <br />
Departured at: {f.departureTime.toISOString()} <br />
Arrives: {f.arrivalTime.toISOString()} ({Math.floor((f.arrivalTime.getTime() - new Date().getTime()) / 1000)}) <br />
<button class="revert" style={`${f.returning && "display: none;"}`} data-id={f._id.toString()}>Revert</button>
{getName(lang, 'general', 'cargo')}: {typeof f.cargo === "undefined" || f.cargo.length === 0 ? <>{getName(lang, 'general', 'none')}</> : f.cargo.map(c => `${c.amount} ${getName(lang, 'resources', c.id)}`).join(', ')} <br />
{getName(lang, 'general', 'departued-at')}: {f.departureTime.toISOString()} <br />
{getName(lang, 'general', 'arrives')}: {f.arrivalTime.toISOString()} ({Math.floor((f.arrivalTime.getTime() - new Date().getTime()) / 1000)}) <br />
<button class="revert" style={`${f.returning && "display: none;"}`} data-id={f._id.toString()}>{getName(lang, 'general', 'revert')}</button>
</div>
</li>)
})}
@ -163,9 +176,9 @@ const sectorsList = galaxies.map(galaxy => {
</label>
<div class="fleet-send-container">
<form method="post" id="send-fleet">
<h1>Sending fleet from {active instanceof SystemManager ? active.data.name : active.name}</h1>
<h1>{getName(lang, 'general', 'sending-fleet-from')} {active instanceof SystemManager ? active.data.name : active.name}</h1>
<hr />
<h2>Ships</h2>
<h2>{getName(lang, 'general', 'ships')}</h2>
<div class="fleet-send-ships">
{active.ships.ships.map(ship => <div class="fleet-ship-card">
<h3>{getName(lang, 'ships', ship.data.id)} - {ship.amount}</h3>
@ -173,74 +186,74 @@ const sectorsList = galaxies.map(galaxy => {
</div>)}
</div>
<hr />
<h2>Mission</h2>
<label for="attack"><input type="radio" name="mission" value="ATTACK" id="attack" required />Attack</label>
<label for="transport"><input type="radio" name="mission" value="TRANSPORT" id="transport" />Transport</label>
<label for="transfer"><input type="radio" name="mission" value="TRANSFER" id="transfer" />Transfer</label>
<label for="expedition"><input type="radio" name="mission" value="EXPEDITION" id="expedition" />Expedition</label>
<label for="spy"><input type="radio" name="mission" value="SPY" id="spy" />Spying</label>
<label for="colonize"><input type="radio" name="mission" value="COLONIZE" id="colonize" />Colonize</label>
<label><input type="checkbox" name="toSystem" />Send to system</label>
<h2>{getName(lang, 'general', 'mission')}</h2>
<label for="attack"><input type="radio" name="mission" value="ATTACK" id="attack" required />{getName(lang, 'missions', 'ATTACK')}</label>
<label for="transport"><input type="radio" name="mission" value="TRANSPORT" id="transport" />{getName(lang, 'missions', 'TRANSPORT')}</label>
<label for="transfer"><input type="radio" name="mission" value="TRANSFER" id="transfer" />{getName(lang, 'missions', 'TRANSFER')}</label>
<label for="expedition"><input type="radio" name="mission" value="EXPEDITION" id="expedition" />{getName(lang, 'missions', 'EXPEDITION')}</label>
<label for="spy"><input type="radio" name="mission" value="SPY" id="spy" />{getName(lang, 'missions', 'SPY')}</label>
<label for="colonize"><input type="radio" name="mission" value="COLONIZE" id="colonize" />{getName(lang, 'missions', 'COLONIZE')}</label>
<label><input type="checkbox" name="toSystem" />{getName(lang, 'general', 'send-to-system')}</label>
<hr />
<h2>Send to</h2>
<h2>{getName(lang, 'general', 'send-to')}</h2>
<div class="fleet-destination">
<div>
<h3>Galaxy</h3>
<h3>{getName(lang, 'general', 'galaxy')}</h3>
<select id="destination-galaxy" name="destination-galaxy">
{galaxies.map(galaxy => <option value={galaxy._id.toString()}>{galaxy.name}</option>)}
</select>
</div>
<div>
<h3>Sector</h3>
<h3>{getName(lang, 'general', 'sector')}</h3>
<select id="destination-sector" name="destination-sector"></select>
</div>
<div>
<h3>System</h3>
<h3>{getName(lang, 'general', 'system')}</h3>
<select id="destination-system" name="destination-system"></select>
<div id="destination-system-error"></div>
</div>
<div>
<h3>Planet</h3>
<h3>{getName(lang, 'general', 'planet')}</h3>
<select id="destination-planet" name="destination-planet"></select>
<div id="destination-planet-error"></div>
</div>
</div>
<hr />
<h2>Cargo</h2>
<h2>{getName(lang, 'general', 'cargo')}</h2>
<div id="cargo-available">
Solid: <span id="available-solid">0</span><br />
Liquid: <span id="available-liquid">0</span><br />
Gas: <span id="available-gas">0</span><br />
{getName(lang, 'general', 'solid')}: <span id="available-solid">0</span><br />
{getName(lang, 'general', 'liquid')}: <span id="available-liquid">0</span><br />
{getName(lang, 'general', 'gas')}: <span id="available-gas">0</span><br />
</div>
<div class="cargo-container" id="cargo-container">
<div class="cargo-item">
<select name="cargo[0][id]" class="select">
<option value="coal">Coal</option>
<option value="iron">Iron</option>
<option value="gold">Gold</option>
<option value="water">Water</option>
<option value="sulfuric-acid">Sulfuric Acid</option>
<option value="liquid-nitrogen">Liquid Nitrogen</option>
<option value="hydrogen">Hydrogen</option>
<option value="oxygen">Oxygen</option>
<option value="helium-3">Helium-3</option>
<option value="coal">{getName(lang, 'resources', 'coal')}</option>
<option value="iron">{getName(lang, 'resources', 'iron')}</option>
<option value="gold">{getName(lang, 'resources', 'gold')}</option>
<option value="water">{getName(lang, 'resources', 'water')}</option>
<option value="sulfuric-acid">{getName(lang, 'resources', 'sulfuric-acid')}</option>
<option value="liquid-nitrogen">{getName(lang, 'resources', 'liquid-nitrogen')}</option>
<option value="hydrogen">{getName(lang, 'resources', 'hydrogen')}</option>
<option value="oxygen">{getName(lang, 'resources', 'oxygen')}</option>
<option value="helium-3">{getName(lang, 'resources', 'helium-3')}</option>
</select>
<input type="number" name="cargo[0][amount]" class="input" />
<button type="button" class="cargo-sendall" name="cargo[0][all]">All</button>
<button type="button" class="cargo-sendall" name="cargo[0][all]">{getName(lang, 'general', 'all')}</button>
</div>
</div>
<div id="cargo-add-new">Add new +</div>
<div id="cargo-add-new">{getName(lang, 'general', 'add-new')} +</div>
<hr />
<h2>Fuel consumption</h2>
<div>Base usage from ships: <span id="fuel-consumption">0</span></div>
<div>Distance: <span id="fuel-consumption-distance">0</span></div>
<div><span id="fuel-consumption-required">0</span> hydrogen will be added to cargo as fuel</div>
<h2>{getName(lang, 'general', 'fuel-consumption')}</h2>
<div>{getName(lang, 'general', 'base-usage-from-ships')}: <span id="fuel-consumption">0</span></div>
<div>{getName(lang, 'general', 'distance')}: <span id="fuel-consumption-distance">0</span></div>
<div><span id="fuel-consumption-required">0</span> {getName(lang, 'general', 'hydrogen-as-fuel')}</div>
<hr />
<h2>Estimates</h2>
<div>Fleet will arrive at destination at: <span id="arrival-time"></span></div>
<div>Fleet will return at: <span id="return-time"></span></div>
<h2>{getName(lang, 'general', 'estimates')}</h2>
<div>{getName(lang, 'general', 'fleet-arrive-at')}: <span id="arrival-time"></span></div>
<div>{getName(lang, 'general', 'fleet-return-at')}: <span id="return-time"></span></div>
<hr />
<button type="submit">Send fleet</button>
<button type="submit">{getName(lang, 'general', 'send-fleet')}</button>
</form>
</div>
</LoggedIn>
@ -376,7 +389,7 @@ label {
color: black;
}
</style>
<script define:vars={{ lang, sectorsList, url, ships, activeId }}>
<script define:vars={{ lang, sectorsList, url, ships, activeId, langJS }}>
const revertButtons = document.querySelectorAll('.revert');
const destinationGalaxy = document.getElementById('destination-galaxy');
const destinationSector = document.getElementById('destination-sector');
@ -421,7 +434,7 @@ label {
if(destinationSector.children.length === 0) {
const opt = document.createElement('option');
opt.value = '';
opt.innerText = 'No sectors';
opt.innerText = langJS.noSectors;
destinationSector.appendChild(opt);
}
@ -447,10 +460,10 @@ label {
if(destinationSystem.children.length === 0) {
const opt = document.createElement('option');
opt.value = '';
opt.innerText = 'No systems';
opt.innerText = langJS.noSystems;
destinationSystem.appendChild(opt);
document.getElementById('destination-system-error').innerHTML = "No systems";
document.getElementById('destination-system-error').innerHTML = langJS.noSystems;
}
destinationSystem.dispatchEvent(new Event('change'));
@ -470,7 +483,7 @@ label {
opt.value = '';
opt.innerText = 'No planets';
destinationPlanet.appendChild(opt);
document.getElementById('destination-planet-error').innerHTML = "No planets";
document.getElementById('destination-planet-error').innerHTML = langJS.noPlanets;
return;
}
@ -487,7 +500,7 @@ label {
if(destinationPlanet.children.length === 0) {
const opt = document.createElement('option');
opt.value = '';
opt.innerText = 'No planets';
opt.innerText = langJS.noPlanets;
destinationPlanet.appendChild(opt);
}
@ -584,14 +597,14 @@ label {
// at least one ship
if(Array.from(shipInputs).reduce((acc, cur) => acc + parseInt(cur.value), 0) === 0) {
alert('You need to send at least one ship');
alert(langJS.atLeastOneShip);
return;
}
// source === destination
const destinationId = document.querySelector('input[name="toSystem"]').checked ? document.getElementById('destination-system').value : document.getElementById('destination-planet').value;
if(destinationId === activeId) {
alert('Source and destination cannot be the same');
alert(langJS.sourceDestinationSame);
return;
}
@ -600,7 +613,7 @@ label {
const storedFuel = parseInt(document.getElementById('resource-hydrogen').dataset.resAmount);
if(storedFuel < requiredFuel) {
alert('Not enough fuel in storage');
alert(langJS.notEnoughFuel);
return;
}
@ -636,22 +649,22 @@ label {
const cargoGasCapacity = document.getElementById('available-gas').innerText;
if(cargoSolidStored > cargoSolidCapacity) {
alert('Not enough solid capacity in ships');
alert(langJS.notEnoughSolidCargo);
return;
}
if(cargoLiquidStored > cargoLiquidCapacity) {
alert('Not enough liquid capacity in ships');
alert(langJS.notEnoughLiquidCargo);
return;
}
if(cargoGasStored > cargoGasCapacity) {
alert('Not enough gas capacity in ships');
alert(langJS.notEnoughGasCargo);
return;
}
if((cargoGasStored + requiredFuel) > cargoGasCapacity) {
alert('Not enough gas capacity in ships for fuel');
alert(langJS.notEnoughGasForFuel);
return;
}

View File

@ -3,7 +3,9 @@ import LoggedIn from '../../layouts/LoggedIn.astro';
import locationManager from '../../lib/classes/managers/LocationManager';
import User from '../../lib/classes/User';
import { getUserSpyReports } from '../../lib/db/users';
import { getName } from '../../lib/utils/langDriver';
const { lang } = Astro.locals;
const user: User = Astro.locals.user;
const allGalaxies = locationManager.galaxies;
@ -34,8 +36,8 @@ const spyReports = spyReportsDB.map(spy => {
const system = locationManager.getSystem(spy.systemId);
return {
username: user?.username ?? "Unknown",
systemName: system?.data.name ?? "Unknown",
username: user?.username ?? getName(lang, 'general', 'unknown'),
systemName: system?.data.name ?? getName(lang, 'general', 'unknown'),
sectorId: system?.data.sector._id.toString(),
scannedAt: spy.scannedAt,
research: spy.research,
@ -50,7 +52,7 @@ const spyReports = spyReportsDB.map(spy => {
id: planet._id.toString(),
name: planet.name,
scanned: spy.planets.find(p => p.id.equals(planet._id))?.scanned ?? false,
scannedAt: report?.scannedAt ?? "Unknown",
scannedAt: report?.scannedAt ?? getName(lang, 'general', 'unknown'),
resources: report?.resources ?? [],
buildings: report?.buildings ?? [],
ships: report?.ships ?? [],
@ -59,40 +61,47 @@ const spyReports = spyReportsDB.map(spy => {
})
}
});
const langJS = {
scanned: getName(lang, 'general', 'scanned'),
notScanned: getName(lang, 'general', 'not-scanned'),
buildings: getName(lang, 'general', 'buildings'),
structures: getName(lang, 'general', 'structures'),
}
---
<LoggedIn id="galaxyView" title="Galaxy view">
<div id="report-modal-background">
<div id="report-modal-details">
<h3>Spy report from <span id="report-modal-date"></span> at <span id="report-modal-name"></span></h3>
<h3>{getName(lang, 'general', 'spy-report-from')} <span id="report-modal-date"></span> {getName(lang, 'general', 'at')} <span id="report-modal-name"></span></h3>
<div id="report-modal-content">
<div class="report-modal-row">
<div class="report-modal-card">
<h3>Resources:</h3>
<h3>{getName(lang, 'general', 'resources')}:</h3>
<div id="report-modal-resources"></div>
</div>
<div class="report-modal-card">
<h3 id="report-modal-structure-title">Structures:</h3>
<h3 id="report-modal-structure-title">{getName(lang, 'general', 'structures')}:</h3>
<div id="report-modal-structures"></div>
</div>
</div>
<div class="report-modal-row">
<div class="report-modal-card">
<h3>Ships:</h3>
<h3>{getName(lang, 'general', 'ships')}:</h3>
<div id="report-modal-ships"></div>
</div>
<div class="report-modal-card">
<h3>Defense:</h3>
<h3>{getName(lang, 'general', 'defense')}:</h3>
<div id="report-modal-defense"></div>
</div>
</div>
<div class="report-modal-row" id="report-modal-row-systeminfo">
<div class="report-modal-card">
<h3>Research:</h3>
<h3>{getName(lang, 'general', 'research')}:</h3>
<div id="report-modal-research"></div>
</div>
<div class="report-modal-card">
<h3>Planets:</h3>
<h3>{getName(lang, 'general', 'planets')}:</h3>
<div id="report-modal-planets"></div>
</div>
</div>
@ -221,7 +230,7 @@ const spyReports = spyReportsDB.map(spy => {
width: 45%;
}
</style>
<script define:vars={{ spyReports }}>
<script define:vars={{ spyReports, langJS }}>
function gvinit() {
const galaxyIcons = document.querySelectorAll('.galaxy-icon');
const sidebarDetails = document.querySelector('.sidebar-details');
@ -256,7 +265,7 @@ const spyReports = spyReportsDB.map(spy => {
report.planets.forEach(planet => {
const planetDiv = document.createElement('div');
planetDiv.innerText = `${planet.name} - ${planet.scanned ? "Scanned" : "Not scanned"}`;
planetDiv.innerText = `${planet.name} - ${planet.scanned ? langJS.scanned : langJS.notScanned}`;
planetDiv.classList.add('sidebar-planet');
planetDiv.addEventListener('click', () => {
@ -270,7 +279,7 @@ const spyReports = spyReportsDB.map(spy => {
document.getElementById('report-modal-date').innerHTML = planet.scannedAt;
document.getElementById('report-modal-name').innerHTML = planet.name;
document.getElementById('report-modal-resources').innerHTML = planet.resources.map(res => `${res.id}: ${res.amount}`).join('<br>');
document.getElementById('report-modal-structure-title').innerHTML = "Buildings:";
document.getElementById('report-modal-structure-title').innerHTML = `${langJS.buildings}:`;
document.getElementById('report-modal-structures').innerHTML = planet.buildings.map(str => `${str.id}: ${str.level}`).join('<br>');
document.getElementById('report-modal-ships').innerHTML = planet.ships.map(ship => `${ship.id}: ${ship.amount}`).join('<br>');
document.getElementById('report-modal-defense').innerHTML = planet.defense.map(def => `${def.id}: ${def.amount}`).join('<br>');
@ -295,7 +304,7 @@ const spyReports = spyReportsDB.map(spy => {
document.getElementById('report-modal-name').innerHTML = report.systemName;
document.getElementById('report-modal-research').innerHTML = report.research.map(res => `${res.id}: ${res.level}`).join('<br>');
document.getElementById('report-modal-resources').innerHTML = report.resources.map(res => `${res.id}: ${res.amount}`).join('<br>');
document.getElementById('report-modal-structure-title').innerHTML = "Structures:";
document.getElementById('report-modal-structure-title').innerHTML = `${langJS.structures}:`;
document.getElementById('report-modal-structures').innerHTML = report.structures.map(str => `${str.id}: ${str.level}`).join('<br>');
document.getElementById('report-modal-ships').innerHTML = report.ships.map(ship => `${ship.id}: ${ship.amount}`).join('<br>');
document.getElementById('report-modal-defense').innerHTML = report.defense.map(def => `${def.id}: ${def.amount}`).join('<br>');

View File

@ -2,11 +2,13 @@
import LoggedIn from '../../layouts/LoggedIn.astro';
import { Planet } from '../../lib/classes/managers/PlanetManager';
import SystemManager from '../../lib/classes/managers/SystemManager';
import { getName } from '../../lib/utils/langDriver';
const { lang } = Astro.locals;
const active: SystemManager | Planet = Astro.locals.active;
---
<LoggedIn id="overview" title="Overview">
<h1>{active instanceof SystemManager ? `${active.data.name} system` : `${active.name} in ${active.system.data.name}`}</h1>
<h1>{active instanceof SystemManager ? `${active.data.name} ${getName(lang, 'general', 'system')}` : `${active.name} ${getName(lang, 'general', 'at')} ${active.system.data.name}`}</h1>
</LoggedIn>
<style>
h1 {

View File

@ -1,18 +1,16 @@
---
import LoggedIn from '../../layouts/LoggedIn.astro';
import locationManager from '../../lib/classes/managers/LocationManager';
import { Planet } from '../../lib/classes/managers/PlanetManager';
import SystemManager from '../../lib/classes/managers/SystemManager';
import { getMailsByTo } from '../../lib/db/mails';
import { getName } from '../../lib/utils/langDriver';
const { user, token, lang } = Astro.locals;
const active: SystemManager | Planet = Astro.locals.active;
const { user, lang } = Astro.locals;
const mails = (await getMailsByTo(user.id)).sort((a, b) => b.date.getTime() - a.date.getTime());
---
<LoggedIn id="mail" title="Mail">
{mails.map(mail => <div class="mail-card">
<h1>{!mail.read && "(NEW) "}{mail.subject} | from: {mail.from === null ? "SYSTEM" : locationManager.getUser(mail.from)?.username ?? "Unknown"}</h1>
<h1>{!mail.read && `${getName(lang, 'general', 'mail-new')} `}{mail.subject} | {getName(lang, 'general', 'from')}: {mail.from === null ? getName(lang, 'general', 'mail-system') : locationManager.getUser(mail.from)?.username ?? getName(lang, 'general', 'unknown')}</h1>
<p>{mail.date.toLocaleString()}</p>
<hr />
<p style="white-space: pre-line">{mail.body}</p>

View File

@ -5,7 +5,7 @@ import User from '../../lib/classes/User';
import { Planet } from '../../lib/classes/managers/PlanetManager';
import SystemManager from '../../lib/classes/managers/SystemManager';
import { getAllResearch } from '../../lib/db/research';
import { getObj } from '../../lib/utils/langDriver';
import { getName, getObj } from '../../lib/utils/langDriver';
const { token, lang } = Astro.locals;
const active: SystemManager | Planet = Astro.locals.active;
@ -45,12 +45,12 @@ for(const research of researchList) {
<LoggedIn id="research" title="Research">
<div id="research-modal-background">
<div id="research-modal-details" data-building-id="">
<h3>Required resources</h3>
<div class="research-modal-text" id="research-modal-req-resources">None</div>
<h3>Required buildings</h3>
<div class="research-modal-text" id="research-modal-req-buildings">None</div>
<h3>Required research</h3>
<div class="research-modal-text" id="research-modal-req-research">None</div>
<h3>{getName(lang, 'general', 'required-resources')}</h3>
<div class="research-modal-text" id="research-modal-req-resources">{getName(lang, 'general', 'none')}</div>
<h3>{getName(lang, 'general', 'required-buildings')}</h3>
<div class="research-modal-text" id="research-modal-req-buildings">{getName(lang, 'general', 'none')}</div>
<h3>{getName(lang, 'general', 'required-research')}</h3>
<div class="research-modal-text" id="research-modal-req-research">{getName(lang, 'general', 'none')}</div>
</div>
</div>
<div class="research-cards">
@ -59,7 +59,7 @@ for(const research of researchList) {
category="research"
id={research.id}
name={getObj(lang, "research", research.id).name}
level={research.onetime === true ? user.research.getResearchById(research.id)?.level === 1 ? "Researched" : "Not researched" : user.research.getResearchById(research.id)?.level.toString() ?? "0"}
level={research.onetime === true ? user.research.getResearchById(research.id)?.level === 1 ? getName(lang, 'general', 'researched') : getName(lang, 'general', 'not-researched') : user.research.getResearchById(research.id)?.level.toString() ?? "0"}
description={getObj(lang, "research", research.id).description ?? ""}
image={`/images/research/${research.id}.jpeg`}
button_type="general"
@ -115,21 +115,21 @@ for(const research of researchList) {
if(!modalDiv) return;
modalDiv.style.display = 'block';
console.log(modalSet)
const langNone = lang['general'].find(g => g.id === 'none').name;
const reqResources = modalSet[el.parentElement.parentElement.parentElement.dataset.id]?.resources ?? [];
const reqBuildings = modalSet[el.parentElement.parentElement.parentElement.dataset.id]?.buildings ?? [];
const reqResearch = modalSet[el.parentElement.parentElement.parentElement.dataset.id]?.research ?? [];
modalResources.innerHTML = reqResources.length === 0 ? "None" : reqResources.map(resource => {
modalResources.innerHTML = reqResources.length === 0 ? langNone : reqResources.map(resource => {
return `${lang['resources'].find(r => r.id === resource.id).name}: ${resource.amount}`;
}).join("<br />");
modalBuildings.innerHTML = reqBuildings.length === 0 ? "None" : reqBuildings.map(building => {
modalBuildings.innerHTML = reqBuildings.length === 0 ? langNone : reqBuildings.map(building => {
return `${lang['buildings'].find(b => b.id === building.id).name}: ${building.level}`;
}).join("<br />");
modalResearch.innerHTML = reqResearch.length === 0 ? "None" : reqResearch.map(research => {
modalResearch.innerHTML = reqResearch.length === 0 ? langNone : reqResearch.map(research => {
return `${lang['research'].find(r => r.id === research.id).name}: ${research.level}`;
}).join("<br />");

View File

@ -4,7 +4,7 @@ import LoggedIn from '../../layouts/LoggedIn.astro';
import { Planet } from '../../lib/classes/managers/PlanetManager';
import SystemManager from '../../lib/classes/managers/SystemManager';
import { getAllShips } from '../../lib/db/ships';
import { getObj } from '../../lib/utils/langDriver';
import { getName, getObj } from '../../lib/utils/langDriver';
const { token, lang } = Astro.locals;
const active: SystemManager | Planet = Astro.locals.active;
@ -49,12 +49,12 @@ const planetId = active instanceof SystemManager ? active.data._id : active._id;
<LoggedIn id="ships" title="Ships">
<div id="ship-modal-background">
<div id="ship-modal-details" data-building-id="">
<h3>Required resources</h3>
<div class="ship-modal-text" id="ship-modal-req-resources">None</div>
<h3>Required buildings</h3>
<div class="ship-modal-text" id="ship-modal-req-buildings">None</div>
<h3>Required research</h3>
<div class="ship-modal-text" id="ship-modal-req-research">None</div>
<h3>{getName(lang, 'general', 'required-resources')}</h3>
<div class="ship-modal-text" id="ship-modal-req-resources">{getName(lang, 'general', 'none')}</div>
<h3>{getName(lang, 'general', 'required-buildings')}</h3>
<div class="ship-modal-text" id="ship-modal-req-buildings">{getName(lang, 'general', 'none')}</div>
<h3>{getName(lang, 'general', 'required-research')}</h3>
<div class="ship-modal-text" id="ship-modal-req-research">{getName(lang, 'general', 'none')}</div>
</div>
</div>
@ -122,19 +122,21 @@ const planetId = active instanceof SystemManager ? active.data._id : active._id;
if(!modalDiv) return;
modalDiv.style.display = 'block';
const langNone = lang['general'].find(g => g.id === 'none').name;
const reqResources = modalSet[el.parentElement.parentElement.parentElement.dataset.id]?.resources ?? [];
const reqBuildings = modalSet[el.parentElement.parentElement.parentElement.dataset.id]?.buildings ?? [];
const reqResearch = modalSet[el.parentElement.parentElement.parentElement.dataset.id]?.research ?? [];
modalResources.innerHTML = reqResources.length === 0 ? "None" : reqResources.map(resource => {
modalResources.innerHTML = reqResources.length === 0 ? langNone : reqResources.map(resource => {
return `${lang['resources'].find(r => r.id === resource.id).name}: ${resource.amount}`;
}).join("<br />");
modalBuildings.innerHTML = reqBuildings.length === 0 ? "None" : reqBuildings.map(building => {
modalBuildings.innerHTML = reqBuildings.length === 0 ? langNone : reqBuildings.map(building => {
return `${lang['buildings'].find(b => b.id === building.id).name}: ${building.level}`;
}).join("<br />");
modalResearch.innerHTML = reqResearch.length === 0 ? "None" : reqResearch.map(research => {
modalResearch.innerHTML = reqResearch.length === 0 ? langNone : reqResearch.map(research => {
return `${lang['research'].find(r => r.id === research.id).name}: ${research.level}`;
}).join("<br />");

View File

@ -2,6 +2,7 @@
import { ObjectId } from "mongodb";
import LoggedIn from "../../../../layouts/LoggedIn.astro";
import locationManager from "../../../../lib/classes/managers/LocationManager";
import { getName } from "../../../../lib/utils/langDriver";
const { token, lang } = Astro.locals;
@ -17,19 +18,19 @@ if(currentSystem === undefined) {
const discoveredAsteroids = currentSystem.asteroids.asteroids;
---
<LoggedIn id="systemManager" title="System Manager">
<h1>Selected system: {currentSystem.data.name} <a href="/game/systemManager/select">(change)</a></h1>
<h1>{getName(lang, 'general', 'selected-system')}: {currentSystem.data.name} <a href="/game/systemManager/select">{getName(lang, 'general', 'change')}</a></h1>
<div class="system-links">
<a href="/game/systemManager">Overview</a>
<a href="/game/systemManager/structures">System-wide structures</a>
<a href="/game/systemManager/spaceStations">Space stations</a>
<a href="/game/systemManager/asteroids">Asteroids</a>
<a href="/game/systemManager">{getName(lang, 'general', 'overview')}</a>
<a href="/game/systemManager/structures">{getName(lang, 'general', 'systemwide-structures')}</a>
<a href="/game/systemManager/spaceStations">{getName(lang, 'general', 'space-stations')}</a>
<a href="/game/systemManager/asteroids">{getName(lang, 'general', 'asteroids')}</a>
</div>
<div>
<h2>Avaliable asteroids <button id="scan">Scan for new</button></h2>
<h2>{getName(lang, 'general', 'available-asteroids')} <button id="scan">{getName(lang, 'general', 'scan-new')}</button></h2>
<div>
{discoveredAsteroids.map((asteroid) => <div>
<h3>{asteroid.name} <a href={`/game/systemManager/asteroids/send?dest=${asteroid.id}`}>Send</a></h3>
<h4>Resources left: </h4>
<h3>{asteroid.name} <a href={`/game/systemManager/asteroids/send?dest=${asteroid.id}`}>{getName(lang, 'general', 'send')}</a></h3>
<h4>{getName(lang, 'general', 'resources-left')}: </h4>
{asteroid.resources.map((resource) => <div><p>{resource.id} - {resource.amount}</p></div>)}
</div>)}
</div>

View File

@ -51,19 +51,22 @@ if(Astro.request.method === "POST") {
const params = parseParams(Astro.request.url);
const systems = locationManager.getSystemsOwnedBy(user.id).map(sys => { return { id: sys.data._id, name: sys.data.name, hasAsteroidMiner: sys.ships.ships.find(ship => ship.data.id === "asteroid-miner") !== undefined, planets: sys.planets.map(planet => { return { id: planet._id, name: planet.name, hasAsteroidMiner: planet.ships.ships.find(ship => ship.data.id === "asteroid-miner") !== undefined } }) } });
const noMiner = getName(lang, 'general', 'no-miner');
const noPlanets = getName(lang, 'general', 'no-planets');
---
<LoggedIn id="systemManager" title="System Manager">
<h1><a href="/game/systemManager/asteroids">&lt;= go back</a>Sending</h1>
<h1><a href="/game/systemManager/asteroids">&lt;= {getName(lang, 'general', 'go-back')}</a>{getName(lang, 'general', 'sending')}</h1>
<form method="post">
<input type="hidden" name="asteroid-id" value={params.dest} />
<input type="hidden" name="current-system" value={currentSystemId} />
<label><input type="checkbox" name="fromSystem" />Send from system</label>
<h3>System</h3>
<label><input type="checkbox" name="fromSystem" />{getName(lang, 'general', 'send-from-system')}</label>
<h3>{getName(lang, 'general', 'system')}</h3>
<select id="source-system" name="source-system"></select>
<h3>Planet</h3>
<h3>{getName(lang, 'general', 'planet')}</h3>
<select id="source-planet" name="source-planet"></select>
<hr />
<button type="submit">Send fleet</button>
<button type="submit">{getName(lang, 'general', 'send-fleet')}</button>
</form>
</LoggedIn>
<style>
@ -112,7 +115,7 @@ select {
background-color: darkgray;
}
</style>
<script define:vars={{ systems }}>
<script define:vars={{ systems, noMiner, noPlanets }}>
const sourceSystem = document.getElementById('source-system');
const sourcePlanet = document.getElementById('source-planet');
const fromSystemCheckbox = document.querySelector('input[name="fromSystem"]');
@ -125,7 +128,7 @@ if(!sourceSystem || !sourcePlanet || !fromSystemCheckbox) {
for(const system of systems) {
const opt = document.createElement('option');
opt.value = system.id;
opt.innerText = system.hasAsteroidMiner ? system.name : `${system.name} (no miner)`;
opt.innerText = system.hasAsteroidMiner ? system.name : `${system.name} ${noMiner}`;
sourceSystem.appendChild(opt);
}
@ -135,7 +138,7 @@ sourceSystem.addEventListener('change', () => {
sourcePlanet.innerHTML = '';
const opt = document.createElement('option');
opt.value = '';
opt.innerText = 'No planets';
opt.innerText = noPlanets;
sourcePlanet.appendChild(opt);
return;
}
@ -145,14 +148,14 @@ sourceSystem.addEventListener('change', () => {
for(const planet of system.planets) {
const opt = document.createElement('option');
opt.value = planet.id;
opt.innerText = planet.hasAsteroidMiner ? planet.name : `${planet.name} (no miner)`;
opt.innerText = planet.hasAsteroidMiner ? planet.name : `${planet.name} ${noMiner}`;
sourcePlanet.appendChild(opt);
}
if(sourcePlanet.children.length === 0) {
const opt = document.createElement('option');
opt.value = '';
opt.innerText = 'No planets';
opt.innerText = noPlanets;
sourcePlanet.appendChild(opt);
}
});

View File

@ -2,6 +2,9 @@
import { ObjectId } from "mongodb";
import LoggedIn from "../../../layouts/LoggedIn.astro";
import locationManager from "../../../lib/classes/managers/LocationManager";
import { getName } from "../../../lib/utils/langDriver";
const { lang } = Astro.locals;
const currentSystemId = Astro.cookies.get('currentSystem')?.value ?? null;
if(currentSystemId === null) return Astro.redirect('/game/systemManager/select');
@ -28,42 +31,42 @@ if(Astro.request.method === "POST") {
}
---
<LoggedIn id="systemManager" title="System Manager">
<h1>Selected system: {currentSystem.data.name} in {currentSystem.data.sector.name} in {currentSystem.data.sector.galaxy.name} <a href="/game/systemManager/select">(change)</a></h1>
<h1>{getName(lang, 'general', 'selected-system')}: {currentSystem.data.name} {getName(lang, 'general', 'in')} {currentSystem.data.sector.name} {getName(lang, 'general', 'in')} {currentSystem.data.sector.galaxy.name} <a href="/game/systemManager/select">{getName(lang, 'general', 'change')}</a></h1>
<div class="system-links">
<a href="/game/systemManager">Overview</a>
<a href="/game/systemManager/structures">System-wide structures</a>
<a href="/game/systemManager/spaceStations">Space stations</a>
<a href="/game/systemManager/asteroids">Asteroids</a>
<a href="/game/systemManager">{getName(lang, 'general', 'overview')}</a>
<a href="/game/systemManager/structures">{getName(lang, 'general', 'systemwide-structures')}</a>
<a href="/game/systemManager/spaceStations">{getName(lang, 'general', 'space-stations')}</a>
<a href="/game/systemManager/asteroids">{getName(lang, 'general', 'asteroids')}</a>
</div>
<div class="planet-list">
<div class="system-card">
<h2 style="color: red;">{currentSystem.data.name}<div><form method="post"><input type="hidden" name="planetId" value={currentSystem.data._id.toString()} /><input type="submit" value="Select" /></form></div></h2>
<h3>Resources:</h3>
<h3>{getName(lang, 'general', 'resources')}:</h3>
<div>
{currentSystem.resources.resources.length === 0 ? <span>None</span> : currentSystem.resources.resources.map(res => (
{currentSystem.resources.resources.length === 0 ? <span>{getName(lang, 'general', 'none')}</span> : currentSystem.resources.resources.map(res => (
<p>{res.data.id} - {res.amount}</p>
))}
</div>
<h3>Ships: </h3>
<h3>{getName(lang, 'general', 'ships')}: </h3>
<div>
{currentSystem.ships.ships.length === 0 ? <span>None</span> : currentSystem.ships.ships.map(ship => (
{currentSystem.ships.ships.length === 0 ? <span>{getName(lang, 'general', 'none')}</span> : currentSystem.ships.ships.map(ship => (
<p>{ship.data.id} - {ship.amount}</p>
))}
</div>
</div>
{currentSystem.planets.length === 0 ? <span>No planets in this sector</span> : currentSystem.planets.map(planet => (
{currentSystem.planets.length === 0 ? <span>{getName(lang, 'general', 'no-planets-in-this-sector')}</span> : currentSystem.planets.map(planet => (
<div class="planet-card">
<h2>{planet.name}<div><form method="post"><input type="hidden" name="planetId" value={planet._id.toString()} /><input type="submit" value="Select" /></form></div></h2>
<p>Fields: {planet.fields}</p>
<h3>Buildings:</h3>
<p>{getName(lang, 'general', 'fields')}: {planet.fields}</p>
<h3>{getName(lang, 'general', 'buildings')}:</h3>
<div>
{planet.buildings.buildings.length === 0 ? <span>None</span> : planet.buildings.buildings.map(building => (
{planet.buildings.buildings.length === 0 ? <span>{getName(lang, 'general', 'none')}</span> : planet.buildings.buildings.map(building => (
<p>{building.data.id} - {building.level}</p>
))}
</div>
<h3>Ships: </h3>
<h3>{getName(lang, 'general', 'ships')}: </h3>
<div>
{planet.ships.ships.length === 0 ? <span>None</span> : planet.ships.ships.map(ship => (
{planet.ships.ships.length === 0 ? <span>{getName(lang, 'general', 'none')}</span> : planet.ships.ships.map(ship => (
<p>{ship.data.id} - {ship.amount}</p>
))}
</div>

View File

@ -2,7 +2,9 @@
import LoggedIn from "../../../layouts/LoggedIn.astro";
import User from "../../../lib/classes/User";
import locationManager from "../../../lib/classes/managers/LocationManager";
import { getName } from "../../../lib/utils/langDriver";
const { lang } = Astro.locals;
const user: User = Astro.locals.user;
if(Astro.request.method === "POST") {
@ -27,7 +29,7 @@ const systems = locationManager.getSystemsOwnedBy(user.id);
{systems.map(system => (
<div class="system-card">
<h2>{system.data.name}</h2>
<div><form method="post"><input type="hidden" name="systemId" value={system.data._id.toString()} /><input type="submit" value="Select" /></form></div>
<div><form method="post"><input type="hidden" name="systemId" value={system.data._id.toString()} /><input type="submit" value={getName(lang, 'general', 'select')} /></form></div>
</div>
))}
</div>

View File

@ -52,21 +52,21 @@ for(const structure of structureList) {
}
---
<LoggedIn id="systemManager" title="System Manager">
<h1>Selected system: {currentSystem.data.name} <a href="/game/systemManager/select">(change)</a></h1>
<h1>{getName(lang, 'general', 'selected-system')}: {currentSystem.data.name} <a href="/game/systemManager/select">{getName(lang, 'general', 'change')}</a></h1>
<div class="system-links">
<a href="/game/systemManager">Overview</a>
<a href="/game/systemManager/structures">System-wide structures</a>
<a href="/game/systemManager/spaceStations">Space stations</a>
<a href="/game/systemManager/asteroids">Asteroids</a>
<a href="/game/systemManager">{getName(lang, 'general', 'overview')}</a>
<a href="/game/systemManager/structures">{getName(lang, 'general', 'systemwide-structures')}</a>
<a href="/game/systemManager/spaceStations">{getName(lang, 'general', 'space-stations')}</a>
<a href="/game/systemManager/asteroids">{getName(lang, 'general', 'asteroids')}</a>
</div>
<div id="structure-modal-background">
<div id="structure-modal-details" data-structure-id="">
<h3>Required resources</h3>
<div class="structure-modal-text" id="structure-modal-req-resources">None</div>
<h3>Required structures</h3>
<div class="structure-modal-text" id="structure-modal-req-structures">None</div>
<h3>Required research</h3>
<div class="structure-modal-text" id="structure-modal-req-research">None</div>
<h3>{getName(lang, 'general', 'required-resources')}</h3>
<div class="structure-modal-text" id="structure-modal-req-resources">{getName(lang, 'general', 'none')}</div>
<h3>{getName(lang, 'general', 'required-structures')}</h3>
<div class="structure-modal-text" id="structure-modal-req-structures">{getName(lang, 'general', 'none')}</div>
<h3>{getName(lang, 'general', 'required-research')}</h3>
<div class="structure-modal-text" id="structure-modal-req-research">{getName(lang, 'general', 'none')}</div>
</div>
</div>
<div class="structure-list">
@ -171,19 +171,21 @@ h1 a {
if(!modalDiv) return;
modalDiv.style.display = 'block';
const langNone = lang['general'].find(g => g.id === 'none').name;
const reqResources = modalSet[el.parentElement.parentElement.dataset.id]?.resources ?? [];
const reqStructures = modalSet[el.parentElement.parentElement.dataset.id]?.structures ?? [];
const reqResearch = modalSet[el.parentElement.parentElement.dataset.id]?.research ?? [];
modalResources.innerHTML = reqResources.length === 0 ? "None" : reqResources.map(resource => {
modalResources.innerHTML = reqResources.length === 0 ? langNone : reqResources.map(resource => {
return `${lang['resources'].find(r => r.id === resource.id).name}: ${resource.amount}`;
}).join("<br />");
modalStructures.innerHTML = reqStructures.length === 0 ? "None" : reqStructures.map(structure => {
modalStructures.innerHTML = reqStructures.length === 0 ? langNone : reqStructures.map(structure => {
return `${lang['structures'].find(s => s.id === structure.id).name}: ${structure.level}`;
}).join("<br />");
modalResearch.innerHTML = reqResearch.length === 0 ? "None" : reqResearch.map(research => {
modalResearch.innerHTML = reqResearch.length === 0 ? langNone : reqResearch.map(research => {
return `${lang['research'].find(r => r.id === research.id).name}: ${research.level}`;
}).join("<br />");

View File

@ -1,13 +1,13 @@
---
import Layout from '../layouts/Layout.astro';
import NavBar from '../components/NavBar.astro';
import { getUserByNickOrEmail, updateLastLogin } from '../lib/db/users';
import config from '../../config.json';
import { verify } from 'argon2';
import locationManager from '../lib/classes/managers/LocationManager';
import { getName } from '../lib/utils/langDriver';
const { lang } = Astro.locals;
let error = "";
@ -16,8 +16,8 @@ if(Astro.request.method === "POST") {
const username = data.get("username") as string | "";
const password = data.get("password") as string | "";
if(username === "") error = "username is required";
if(password === "") error = "password is required";
if(username === "") error = getName(lang, 'general', 'username-required');
if(password === "") error = getName(lang, 'general', 'password-required');
if(error === "") {
const userDB = await getUserByNickOrEmail(username as string);
@ -73,7 +73,7 @@ if(Astro.request.method === "POST") {
});
return Astro.redirect("/game");
} else error = "invalid username or password";
} else error = getName(lang, 'general', 'invalid-username-or-password');
}
}
---
@ -81,9 +81,9 @@ if(Astro.request.method === "POST") {
<Layout title="Login">
<NavBar loggedIn="false" active="login" />
<form method="POST" class="login-form">
<input class="login-input" type="text" name="username" placeholder="username" /><br />
<input class="login-input" type="password" name="password" placeholder="password" /><br />
<input class="login-submit" type="submit" value="login" />
<input class="login-input" type="text" name="username" placeholder={getName(lang, 'general', 'username')} /><br />
<input class="login-input" type="password" name="password" placeholder={getName(lang, 'general', 'password')} /><br />
<input class="login-submit" type="submit" value={getName(lang, 'general', 'login')} />
<p style="color: red;">{error}</p>
</form>
</Layout>

View File

@ -1,9 +1,7 @@
---
import NavBar from '../components/NavBar.astro';
import Layout from '../layouts/Layout.astro';
import { createUser } from '../lib/db/users';
import { AstroCookieSetOptions } from 'astro';
import { ObjectId } from 'mongodb';
import config from '../../config.json';
@ -16,7 +14,9 @@ import DBSystem from '../types/db/DBSystem';
import locationManager from '../lib/classes/managers/LocationManager';
import SystemManager, { System } from '../lib/classes/managers/SystemManager';
import User from '../lib/classes/User';
import ResearchManager from '../lib/classes/managers/ResearchManager';
import { getName } from '../lib/utils/langDriver';
const { lang } = Astro.locals;
let error = "";
@ -27,14 +27,14 @@ if(Astro.request.method === "POST") {
const password = data.get("password") as string | "";
const password2 = data.get("password2") as string | "";
if(username === "") error = "username is required";
if(username.match(/^[a-zA-Z0-9]{3,20}$/) === null) error = "username must be between 3 and 20 characters long and can only contain letters and numbers";
if(email === "") error = "email is required";
if(email.match(/^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/) === null) error = "email is invalid";
if(password === "") error = "password is required";
if(password2 === "") error = "password2 is required";
if(password.length < 8 || password.length > 50) error = "password must be between 8 and 50 characters long";
if(password !== password2) error = "passwords must match";
if(username === "") error = getName(lang, 'general', 'username-required');
if(username.match(/^[a-zA-Z0-9]{3,20}$/) === null) error = getName(lang, 'general', 'username-invalid')
if(email === "") error = getName(lang, 'general', 'email-required');
if(email.match(/^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/) === null) error = getName(lang, 'general', 'email-invalid');
if(password === "") error = getName(lang, 'general', 'password-required');
if(password2 === "") error = getName(lang, 'general', 'password2-required');
if(password.length < 8 || password.length > 50) error = getName(lang, 'general', 'password-length');
if(password !== password2) error = getName(lang, 'general', 'password-match');
if(error === "") {
const userId = new ObjectId();
@ -143,11 +143,11 @@ if(Astro.request.method === "POST") {
<Layout title="Register">
<NavBar loggedIn="false" active="register" />
<form method="POST" class="register-form">
<input class="register-input" type="text" name="username" placeholder="username" /><br />
<input class="register-input" type="email" name="email" placeholder="email" /><br />
<input class="register-input" type="password" name="password" placeholder="password" /><br />
<input class="register-input" type="password" name="password2" placeholder="password2" /><br />
<input class="register-submit" type="submit" value="register" />
<input class="register-input" type="text" name="username" placeholder={getName(lang, 'general', 'username')} /><br />
<input class="register-input" type="email" name="email" placeholder={getName(lang, 'general', 'email')} /><br />
<input class="register-input" type="password" name="password" placeholder={getName(lang, 'general', 'password')} /><br />
<input class="register-input" type="password" name="password2" placeholder={getName(lang, 'general', 'password2')} /><br />
<input class="register-submit" type="submit" value={getName(lang, 'general', 'register')} />
<p style="color: red;">{error}</p>
</form>
</Layout>