massive overhaul that will be the last before react

This commit is contained in:
Robert MacRae 2026-03-11 00:32:45 -03:00
parent c6b0d8f81e
commit 68f854be38
2578 changed files with 10710 additions and 59357 deletions

View File

@ -1,228 +0,0 @@
name: Build Client for All Platforms
on:
push:
branches: [ main, develop ]
paths:
- 'Client/**'
pull_request:
branches: [ main ]
paths:
- 'Client/**'
workflow_dispatch:
jobs:
build:
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-latest, windows-latest, macos-latest]
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '18'
cache: 'npm'
cache-dependency-path: Client/package-lock.json
- name: Install system dependencies (Ubuntu)
if: matrix.os == 'ubuntu-latest'
run: |
sudo apt-get update
sudo apt-get install -y libnss3-dev libatk-bridge2.0-dev libdrm2 libxkbcommon-dev libxcomposite-dev libxdamage-dev libxrandr-dev libgbm-dev libxss1 libasound2-dev
- name: Install system dependencies (macOS)
if: matrix.os == 'macos-latest'
run: |
# Install Xcode command line tools if not present
xcode-select --install 2>/dev/null || true
- name: Install system dependencies (Windows)
if: matrix.os == 'windows-latest'
run: |
# Windows builds typically have required dependencies pre-installed
# Ensure chocolatey is available for any additional packages
choco --version || echo "Chocolatey not available"
- name: Install dependencies
working-directory: ./Client
run: |
if [ "${{ matrix.os }}" = "windows-latest" ]; then
npm ci --include=dev
else
npm ci
fi
shell: bash
- name: Clean previous builds (Windows)
if: matrix.os == 'windows-latest'
working-directory: ./Client
run: if exist dist rmdir /s /q dist
shell: cmd
- name: Clean previous builds (Unix)
if: matrix.os != 'windows-latest'
working-directory: ./Client
run: rm -rf dist
shell: bash
- name: Build for Linux
if: matrix.os == 'ubuntu-latest'
working-directory: ./Client
run: npm run build-linux
- name: Build for Windows
if: matrix.os == 'windows-latest'
working-directory: ./Client
run: npm run build-win
- name: Build for macOS
if: matrix.os == 'macos-latest'
working-directory: ./Client
run: npm run build-mac
- name: Upload artifacts
uses: actions/upload-artifact@v4
with:
name: client-${{ matrix.os }}
path: |
Client/dist/*.exe
Client/dist/*.msi
Client/dist/*.dmg
Client/dist/*.zip
Client/dist/*.AppImage
Client/dist/*.deb
Client/dist/*.rpm
Client/dist/*.app
retention-days: 30
continue-on-error: true
package:
needs: build
runs-on: ubuntu-latest
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Download all artifacts
uses: actions/download-artifact@v4
with:
path: artifacts
- name: Create release directory
run: mkdir -p release
- name: Organize executables by platform
run: |
# Create platform directories
mkdir -p release/Windows
mkdir -p release/macOS
mkdir -p release/Linux
# Windows executables - copy directly from dist
if [ -d "artifacts/client-windows-latest" ]; then
cp artifacts/client-windows-latest/*.exe release/Windows/ 2>/dev/null || true
cp artifacts/client-windows-latest/*.msi release/Windows/ 2>/dev/null || true
fi
# macOS executables - copy directly from dist
if [ -d "artifacts/client-macos-latest" ]; then
cp artifacts/client-macos-latest/*.dmg release/macOS/ 2>/dev/null || true
cp artifacts/client-macos-latest/*.zip release/macOS/ 2>/dev/null || true
# Handle .app bundles (directories)
if [ -d "artifacts/client-macos-latest" ]; then
find artifacts/client-macos-latest -maxdepth 1 -name "*.app" -type d -exec cp -r {} release/macOS/ \; 2>/dev/null || true
fi
fi
# Linux executables - copy directly from dist
if [ -d "artifacts/client-ubuntu-latest" ]; then
cp artifacts/client-ubuntu-latest/*.AppImage release/Linux/ 2>/dev/null || true
cp artifacts/client-ubuntu-latest/*.deb release/Linux/ 2>/dev/null || true
cp artifacts/client-ubuntu-latest/*.rpm release/Linux/ 2>/dev/null || true
fi
# List what we actually got
echo "=== Executables Found ==="
find release -type f -name "*" -o -name "*.app" | head -20 || true
# Create platform info file
cat > release/README.txt << EOF
Galaxy Strike Online - Multi-Platform Client
==========================================
Windows:
- Run the .exe installer or portable executable
macOS:
- Open the .dmg file and drag to Applications
- Or extract the .zip and run the .app
Linux:
- Make the .AppImage executable: chmod +x *.AppImage
- Or install the .deb package: sudo dpkg -i *.deb
Build Date: $(date -u +"%Y-%m-%d %H:%M:%S UTC")
Commit: ${{ github.sha }}
EOF
- name: Create all-in-one zip
run: |
cd release
zip -r ../Galaxy-Strike-Online-Client-${{ github.sha }}.zip .
- name: Upload all-in-one zip
uses: actions/upload-artifact@v4
with:
name: galaxy-strike-online-client-all-platforms
path: Galaxy-Strike-Online-Client-${{ github.sha }}.zip
retention-days: 90
- name: Create Release (Main Branch)
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
uses: softprops/action-gh-release@v1
with:
files: Galaxy-Strike-Online-Client-${{ github.sha }}.zip
name: Galaxy Strike Online Client - Latest
body: |
Latest multi-platform client release for Galaxy Strike Online.
Includes:
- Windows (NSIS installer + Portable)
- macOS (DMG + ZIP)
- Linux (AppImage + Debian package)
Commit: ${{ github.sha }}
Build Date: ${{ github.event.head_commit.timestamp }}
**Download the all-in-one zip file below for all platforms.**
draft: false
prerelease: false
tag_name: latest
token: ${{ secrets.GITHUB_TOKEN }}
- name: Create Release (Tags)
if: startsWith(github.ref, 'refs/tags/')
uses: softprops/action-gh-release@v1
with:
files: Galaxy-Strike-Online-Client-${{ github.sha }}.zip
name: Galaxy Strike Online Client - ${{ github.ref_name }}
body: |
Multi-platform client release for Galaxy Strike Online.
Includes:
- Windows (NSIS installer + Portable)
- macOS (DMG + ZIP)
- Linux (AppImage + Debian package)
Commit: ${{ github.sha }}
draft: false
prerelease: false
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

31
API/models/PlayerData.js Normal file
View File

@ -0,0 +1,31 @@
/**
* API/models/PlayerData.js
*
* Minimal PlayerData model for the API server only what the payment webhook
* needs to read and credit gems. Shares the 'playerdatas' collection with
* the GameServer's full PlayerData model (same MongoDB, same schema name).
*
* Do NOT add complex game logic here that belongs in GameServer.
*/
const mongoose = require('mongoose');
// Minimal schema — Mixed types let us read/write without strict field validation
const playerDataSchema = new mongoose.Schema({
userId: { type: String, required: true, unique: true },
username: { type: String },
stats: { type: mongoose.Schema.Types.Mixed, default: {} },
}, {
strict: false, // allow all fields to be stored (don't strip unknown fields)
timestamps: true,
});
// Prevent model re-registration error on hot-reload
let PlayerData;
try {
PlayerData = mongoose.model('PlayerData');
} catch (e) {
PlayerData = mongoose.model('PlayerData', playerDataSchema);
}
module.exports = PlayerData;

173
API/routes/payments.js Normal file
View File

@ -0,0 +1,173 @@
/**
* routes/payments.js GSO Premium Gem Store (GDD Phase 3 Monetisation)
*
* Endpoints:
* POST /api/payments/create-checkout create Stripe Checkout session
* POST /api/payments/webhook Stripe webhook (payment confirmation)
* GET /api/payments/products list purchasable gem packages
*
* Requires ENV vars:
* STRIPE_SECRET_KEY sk_live_... (or sk_test_... for development)
* STRIPE_WEBHOOK_SECRET whsec_... (from Stripe Dashboard Webhooks)
* CLIENT_URL https://galaxystrike.online (for redirect URLs)
*
* Stripe is loaded lazily so the server starts even if the package isn't installed yet.
* Run: npm install stripe in the API directory before going live.
*/
const express = require('express');
const router = express.Router();
// ── Gem packages available for purchase ────────────────────────────────────────
const GEM_PACKAGES = [
{ id: 'gems_80', gems: 80, priceUSD: 0.99, label: 'Starter Pack', bonus: 0, popular: false },
{ id: 'gems_200', gems: 200, priceUSD: 1.99, label: 'Pilot Pack', bonus: 0, popular: false },
{ id: 'gems_500', gems: 500, priceUSD: 4.99, label: 'Commander Pack', bonus: 50, popular: true },
{ id: 'gems_1200', gems: 1200, priceUSD: 9.99, label: 'Admiral Pack', bonus: 200,popular: false },
{ id: 'gems_2500', gems: 2500, priceUSD: 19.99, label: 'Fleet Admiral', bonus: 500,popular: false },
{ id: 'gems_6500', gems: 6500, priceUSD: 49.99, label: 'Grand Admiral', bonus: 1500,popular: false},
];
// ── Helper: load Stripe lazily ────────────────────────────────────────────────
function getStripe() {
if (!process.env.STRIPE_SECRET_KEY) throw new Error('STRIPE_SECRET_KEY not configured');
// eslint-disable-next-line global-require
return require('stripe')(process.env.STRIPE_SECRET_KEY);
}
// ── GET /api/payments/products ────────────────────────────────────────────────
router.get('/products', (req, res) => {
res.json({ packages: GEM_PACKAGES });
});
// ── POST /api/payments/create-checkout ────────────────────────────────────────
// Body: { packageId, userId, username }
router.post('/create-checkout', async (req, res) => {
try {
const { packageId, userId, username } = req.body;
if (!packageId || !userId) return res.status(400).json({ error: 'packageId and userId required' });
const pkg = GEM_PACKAGES.find(p => p.id === packageId);
if (!pkg) return res.status(404).json({ error: 'Unknown package' });
const stripe = getStripe();
const totalGems = pkg.gems + pkg.bonus;
const clientUrl = process.env.CLIENT_URL || 'http://localhost:3000';
const session = await stripe.checkout.sessions.create({
mode: 'payment',
payment_method_types: ['card'],
line_items: [{
price_data: {
currency: 'usd',
unit_amount: Math.round(pkg.priceUSD * 100), // cents
product_data: {
name: `${pkg.label}${totalGems} 💎 Gems`,
description: pkg.bonus > 0
? `${pkg.gems} gems + ${pkg.bonus} bonus gems (${totalGems} total)`
: `${pkg.gems} Galaxy Strike Online gems`,
metadata: { packageId: pkg.id },
},
},
quantity: 1,
}],
client_reference_id: userId,
customer_email: req.body.email || undefined,
metadata: {
userId,
username: username || 'unknown',
packageId: pkg.id,
gems: String(totalGems),
},
success_url: `${clientUrl}/payment-success?session={CHECKOUT_SESSION_ID}`,
cancel_url: `${clientUrl}/payment-cancel`,
});
res.json({ sessionId: session.id, url: session.url });
} catch (err) {
console.error('[PAYMENTS] create-checkout error:', err.message);
res.status(500).json({ error: err.message });
}
});
// ── POST /api/payments/webhook ────────────────────────────────────────────────
// Stripe sends raw body — must use express.raw() middleware for this route.
router.post('/webhook', express.raw({ type: 'application/json' }), async (req, res) => {
const sig = req.headers['stripe-signature'];
const secret = process.env.STRIPE_WEBHOOK_SECRET;
if (!secret) {
console.error('[PAYMENTS] STRIPE_WEBHOOK_SECRET not set — webhook rejected');
return res.status(400).send('Webhook secret not configured');
}
let event;
try {
const stripe = getStripe();
event = stripe.webhooks.constructEvent(req.body, sig, secret);
} catch (err) {
console.error('[PAYMENTS] Webhook signature verification failed:', err.message);
return res.status(400).send(`Webhook Error: ${err.message}`);
}
if (event.type === 'checkout.session.completed') {
const session = event.data.object;
const { userId, username, packageId, gems } = session.metadata || {};
if (!userId || !gems) {
console.error('[PAYMENTS] Webhook missing metadata', session.metadata);
return res.json({ received: true });
}
const gemCount = parseInt(gems, 10);
const amountCents = session.amount_total || 0;
console.log(`[PAYMENTS] ✅ Payment confirmed: ${username} (${userId}) — ${gemCount} gems — $${(amountCents/100).toFixed(2)}`);
// Credit gems in the database directly
try {
const PlayerData = require('../models/PlayerData');
const player = await PlayerData.findOne({ userId });
if (player) {
player.stats.gems = (player.stats.gems || 0) + gemCount;
player.markModified('stats');
await player.save();
console.log(`[PAYMENTS] Credited ${gemCount} gems to ${username}. New balance: ${player.stats.gems}`);
} else {
console.warn(`[PAYMENTS] Player not found for userId: ${userId}`);
}
} catch (dbErr) {
console.error('[PAYMENTS] DB credit error:', dbErr.message);
// Return 200 to Stripe regardless — Stripe will retry on 5xx
}
// Attempt to push live notification to game server via internal HTTP
// (Game server will push 'gems_credited' to the player's socket if online)
const gameServerUrl = process.env.GAME_SERVER_URL || 'http://localhost:3002';
try {
const http = require('http');
const body = JSON.stringify({ userId, gems: gemCount, packageId, amountCents });
const options = {
hostname: new URL(gameServerUrl).hostname,
port: new URL(gameServerUrl).port || 3002,
path: '/internal/credit-gems',
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Content-Length': Buffer.byteLength(body),
'X-Internal-Key': process.env.INTERNAL_API_KEY || 'gso-internal',
},
};
const req2 = http.request(options);
req2.write(body);
req2.end();
} catch (notifyErr) {
// Non-fatal — player will see updated gems on next login
}
}
res.json({ received: true });
});
module.exports = router;
module.exports.GEM_PACKAGES = GEM_PACKAGES;

View File

@ -11,6 +11,7 @@ const logger = require('./utils/logger');
const connectDB = require('./config/database'); const connectDB = require('./config/database');
const authRoutes = require('./routes/auth'); const authRoutes = require('./routes/auth');
const serverRoutes = require('./routes/servers'); const serverRoutes = require('./routes/servers');
const paymentRoutes = require('./routes/payments');
const { errorHandler, notFound } = require('./middleware/errorHandler'); const { errorHandler, notFound } = require('./middleware/errorHandler');
const GameServer = require('./models/GameServer'); const GameServer = require('./models/GameServer');
@ -96,6 +97,7 @@ app.use('/api/', async (req, res, next) => {
// Routes - API Server Only (Auth + Server Browser) // Routes - API Server Only (Auth + Server Browser)
app.use('/api/auth', authRoutes); app.use('/api/auth', authRoutes);
app.use('/api/servers', serverRoutes); app.use('/api/servers', serverRoutes);
app.use('/api/payments', paymentRoutes);
// Manual cleanup endpoint (for testing) // Manual cleanup endpoint (for testing)
app.post('/api/admin/cleanup-dead-servers', async (req, res) => { app.post('/api/admin/cleanup-dead-servers', async (req, res) => {

View File

@ -1,4 +1,4 @@
const { app, BrowserWindow, Menu, shell, ipcMain } = require('electron'); const { app, BrowserWindow, Menu, shell, ipcMain, Notification } = require('electron');
const path = require('path'); const path = require('path');
const fs = require('fs'); const fs = require('fs');
const logger = require('./js/core/Logger'); const logger = require('./js/core/Logger');
@ -312,6 +312,35 @@ ipcMain.handle('delete-save-file', async (event, slot) => {
}); });
// IPC handlers for window controls // IPC handlers for window controls
// ── Push Notifications (Electron desktop) ────────────────────────────────────
ipcMain.on('show-notification', (event, { title, body, icon, tag }) => {
try {
if (!Notification.isSupported()) return;
const n = new Notification({
title: title || 'Galaxy Strike Online',
body: body || '',
icon: icon || path.join(__dirname, 'assets/icon.png'),
silent: false,
urgency: 'normal', // 'low' | 'normal' | 'critical'
});
n.on('click', () => {
if (mainWindow) {
if (mainWindow.isMinimized()) mainWindow.restore();
mainWindow.focus();
}
});
n.show();
} catch (err) {
console.error('[MAIN PROCESS] Notification error:', err.message);
}
});
// Allow renderer to check if window is focused (suppress notifications when in focus)
ipcMain.handle('is-window-focused', () => {
return mainWindow ? mainWindow.isFocused() : true;
});
// Handle logging from renderer process // Handle logging from renderer process
ipcMain.on('log-message', async (event, { level, message, data }) => { ipcMain.on('log-message', async (event, { level, message, data }) => {
try { try {

File diff suppressed because it is too large Load Diff

View File

@ -264,6 +264,40 @@ class GameInitializer {
if (typeof showNotification === 'function') showNotification(data.error || 'Craft failed', 'error'); if (typeof showNotification === 'function') showNotification(data.error || 'Craft failed', 'error');
} }
}); });
// Craft queue events (v3.3)
this.socket.on('craft_queue_update', (data) => {
if (typeof GSO_Crafting !== 'undefined') GSO_Crafting.onQueueUpdate(data);
});
this.socket.on('collect_craft_result', (data) => {
if (typeof GSO_Crafting !== 'undefined') GSO_Crafting.onCollectResult(data);
});
// Gem speed-up result
this.socket.on('speedup_craft_result', (data) => {
if (data.success) {
if (typeof showNotification === 'function') showNotification('⚡ Craft instant-finished!', 'success');
this.socket.emit('get_craft_queue');
if (this.serverPlayerData) this.serverPlayerData.stats.gems = data.gems;
this._updateEconomyDisplay({ gems: data.gems });
} else {
if (typeof showNotification === 'function') showNotification(data.error || 'Speed-up failed', 'error');
}
});
// Gem store purchase result (v3.3)
this.socket.on('gem_purchase_result', (data) => {
if (typeof GSO_GemStore !== 'undefined') GSO_GemStore.onPurchaseResult(data);
if (data.success) {
if (this.serverPlayerData) {
this.serverPlayerData.stats.gems = data.gems;
// If purchase added an inventory item, sync it
if (data.newItem) {
this.serverPlayerData.inventory = this.serverPlayerData.inventory || { items: [] };
this.serverPlayerData.inventory.items = this.serverPlayerData.inventory.items || [];
this.serverPlayerData.inventory.items.push(data.newItem);
}
}
this._updateEconomyDisplay({ gems: data.gems });
}
});
this.socket.on('inventory_update', (data) => { this.socket.on('inventory_update', (data) => {
if (this.serverPlayerData) { if (this.serverPlayerData) {
this.serverPlayerData.inventory = data; this.serverPlayerData.inventory = data;
@ -319,6 +353,13 @@ class GameInitializer {
GSO_Leaderboard.onSeasonData(data); GSO_Leaderboard.onSeasonData(data);
} }
}); });
// ── Phase 3: Raids, PvP Rankings, Alliance Wars, Push Notifications, Gem Purchase ──
if (typeof GSO_Raids !== 'undefined') GSO_Raids.init(this.socket);
if (typeof GSO_PvpRankings !== 'undefined') GSO_PvpRankings.init(this.socket);
if (typeof GSO_AllianceWars !== 'undefined') GSO_AllianceWars.init(this.socket);
if (typeof GSO_PushNotifications !== 'undefined') GSO_PushNotifications.init(this.socket);
if (typeof GSO_GemPurchase !== 'undefined') GSO_GemPurchase.init(this.socket);
} }
onSocketConnected() { onSocketConnected() {

View File

@ -612,19 +612,77 @@ class StarbaseWorld {
const bob = Math.sin(now*2+obj.col)*3; const bob = Math.sin(now*2+obj.col)*3;
const cy2 = cy - 28 - bob; const cy2 = cy - 28 - bob;
// ── Construction animation overlay ────────────────────────────────
const bldState = this._buildingStates?.[obj.id];
const isConstructing = bldState?.constructing;
const isUpgrading = bldState?.upgrading;
const justCompleted = bldState?.completedAt && (Date.now() - bldState.completedAt) < 3000;
const grad = ctx.createRadialGradient(cx, cy+this.TH/2, 0, cx, cy+this.TH/2, 30); const grad = ctx.createRadialGradient(cx, cy+this.TH/2, 0, cx, cy+this.TH/2, 30);
grad.addColorStop(0, obj.glowColor.replace('.6','.35')); grad.addColorStop(0, obj.glowColor.replace('.6','.35'));
grad.addColorStop(1,'transparent'); grad.addColorStop(1,'transparent');
ctx.fillStyle=grad; ctx.fillStyle=grad;
ctx.beginPath(); ctx.ellipse(cx, cy+this.TH/2, 28, 14, 0, 0, Math.PI*2); ctx.fill(); ctx.beginPath(); ctx.ellipse(cx, cy+this.TH/2, 28, 14, 0, 0, Math.PI*2); ctx.fill();
// Dim box if under construction
if (isConstructing || isUpgrading) ctx.globalAlpha = 0.5;
this._drawIsoBox(cx, cy, 36, 36, 20, obj.color); this._drawIsoBox(cx, cy, 36, 36, 20, obj.color);
ctx.globalAlpha = 1;
ctx.font='22px serif'; ctx.textAlign='center'; ctx.textBaseline='middle'; ctx.font='22px serif'; ctx.textAlign='center'; ctx.textBaseline='middle';
ctx.fillText(obj.icon, cx, cy2); ctx.fillText(obj.icon, cx, cy2);
ctx.font='600 9px "Orbitron",monospace'; ctx.textAlign='center'; ctx.textBaseline='top'; ctx.font='600 9px "Orbitron",monospace'; ctx.textAlign='center'; ctx.textBaseline='top';
ctx.fillStyle='rgba(0,0,0,.8)'; ctx.fillText(obj.label, cx+1, cy2+20); ctx.fillStyle='rgba(0,0,0,.8)'; ctx.fillText(obj.label, cx+1, cy2+20);
ctx.fillStyle=obj.color; ctx.fillText(obj.label, cx, cy2+19); ctx.fillStyle=obj.color; ctx.fillText(obj.label, cx, cy2+19);
// ── Spinning construction ring ─────────────────────────────────────
if (isConstructing || isUpgrading) {
const angle = (now * 2) % (Math.PI * 2);
const ringR = 22;
ctx.save();
ctx.strokeStyle = isUpgrading ? '#ffd700' : '#00ff88';
ctx.lineWidth = 2.5;
ctx.setLineDash([10, 6]);
ctx.lineDashOffset = -now * 20;
ctx.globalAlpha = 0.85;
ctx.beginPath();
ctx.arc(cx, cy - 10, ringR, angle, angle + Math.PI * 1.4);
ctx.stroke();
// Small progress arc
const progress = bldState.progress || 0;
ctx.setLineDash([]);
ctx.strokeStyle = isUpgrading ? 'rgba(255,215,0,.2)' : 'rgba(0,255,136,.2)';
ctx.lineWidth = 4;
ctx.beginPath();
ctx.arc(cx, cy - 10, ringR, -Math.PI/2, -Math.PI/2 + Math.PI*2*progress);
ctx.stroke();
// Label
ctx.font = '700 8px "Orbitron",monospace';
ctx.fillStyle = isUpgrading ? '#ffd700' : '#00ff88';
ctx.textAlign = 'center';
ctx.textBaseline = 'middle';
ctx.fillText(isUpgrading ? '↑ UPG' : '⚙ BLD', cx, cy - 10);
ctx.restore();
}
// ── Completion pulse flash ─────────────────────────────────────────
if (justCompleted) {
const age = (Date.now() - bldState.completedAt) / 3000;
const pulseAlpha = Math.max(0, 0.7 - age);
ctx.save();
ctx.globalAlpha = pulseAlpha;
ctx.strokeStyle = '#ffffff';
ctx.lineWidth = 3;
ctx.beginPath();
ctx.arc(cx, cy - 10, 22 + age * 20, 0, Math.PI * 2);
ctx.stroke();
ctx.restore();
}
}
/** Call this from the game update loop to set building states for animation */
setBuildingStates(states) {
this._buildingStates = states || {};
} }
_drawIsoBox(cx, cy, w, d, h, color) { _drawIsoBox(cx, cy, w, d, h, color) {

View File

@ -2,7 +2,7 @@
"_meta": { "_meta": {
"lang": "de", "lang": "de",
"name": "Deutsch", "name": "Deutsch",
"version": "1.0" "version": "1.2"
}, },
"nav": { "nav": {
"dashboard": "Dashboard", "dashboard": "Dashboard",
@ -20,7 +20,8 @@
"missions": "Missionen", "missions": "Missionen",
"alliance": "Allianz", "alliance": "Allianz",
"market": "Markt", "market": "Markt",
"social": "Sozial" "social": "Sozial",
"settings": "Einstellungen"
}, },
"base": { "base": {
"buildings": "🏗 Gebäude", "buildings": "🏗 Gebäude",
@ -49,14 +50,126 @@
"deposit": "Einzahlen", "deposit": "Einzahlen",
"withdraw": "Abheben", "withdraw": "Abheben",
"buy": "Kaufen", "buy": "Kaufen",
"sell": "Verkaufen" "sell": "Verkaufen",
"craft": "Herstellen",
"research": "Forschen",
"repair": "Reparieren",
"equip": "Ausrüsten",
"save": "Speichern",
"send": "Senden",
"speedUp": "Beschleunigen",
"collectAll": "Alle einsammeln",
"unequip": "Ablegen"
}, },
"status": { "status": {
"online": "Online", "online": "Online",
"offline": "Offline", "offline": "Offline",
"inProgress": "In Arbeit", "inProgress": "Läuft",
"completed": "Abgeschlossen", "completed": "Abgeschlossen",
"locked": "Gesperrt", "locked": "Gesperrt",
"maxLevel": "Max. Level" "maxLevel": "Max. Stufe",
"ready": "Fertig!",
"queued": "Eingereiht",
"failed": "Fehlgeschlagen"
},
"dungeons": {
"title": "Dungeons",
"selectPrompt": "Wähle einen Dungeon",
"difficulty": "Schwierigkeit",
"minLevel": "Min. Stufe",
"energyCost": "Energiekosten",
"enter": "Dungeon betreten",
"easy": "Einfach",
"medium": "Mittel",
"hard": "Schwer",
"extreme": "Extrem",
"legendary": "Legendär",
"boss": "Boss",
"room": "Raum",
"rooms": "Räume",
"loot": "Beute",
"rewardMultiplier": "Belohnungsmultiplikator",
"maxPlayers": "Max. Spieler",
"clearBonus": "Abschlussbonus"
},
"quests": {
"title": "Aufgaben",
"main": "Hauptgeschichte",
"daily": "Täglich",
"weekly": "Wöchentlich",
"monthly": "Monatlich",
"completed": "Abgeschlossen",
"failed": "Fehlgeschlagen",
"resetsIn": "Zurückgesetzt in",
"claim": "Belohnung einfordern",
"objective": "Ziel",
"reward": "Belohnung"
},
"crafting": {
"title": "Herstellung",
"queue": "Warteschlange",
"queueEmpty": "Keine Gegenstände in der Warteschlange",
"speedUpCost": "Beschleunigen ({n} Edelsteine)",
"collectAll": "Alle fertigen einsammeln",
"completes": "Fertig",
"progress": "Fortschritt"
},
"alliance": {
"title": "Allianz",
"create": "Allianz gründen",
"find": "Allianz suchen",
"chat": "Allianz-Chat",
"research": "Allianzforschung",
"warehouse": "Allianzlager",
"members": "Mitglieder",
"deposit": "Einzahlen",
"withdraw": "Abheben"
},
"market": {
"title": "Spielermarkt",
"browse": "Durchsuchen",
"sell": "Verkaufen",
"myListings": "Meine Angebote",
"priceHistory": "Preisverlauf",
"fee": "2% Listungsgebühr"
},
"inventory": {
"title": "Inventar",
"empty": "Inventar ist leer",
"equip": "Ausrüsten",
"use": "Verwenden",
"drop": "Ablegen",
"slot": {
"helmet": "Helm",
"body": "Rüstung",
"hands": "Handschuhe",
"pants": "Beine",
"boots": "Stiefel",
"backpack": "Rucksack"
}
},
"shop": {
"title": "Laden",
"gems": "Edelstein-Laden",
"ships": "Schiffe",
"weapons": "Waffen",
"armour": "Rüstung",
"consumables": "Verbrauchsgüter"
},
"settings": {
"title": "Einstellungen",
"language": "Sprache",
"fontSize": "Schriftgröße",
"colorBlind": "Farbenblindmodus",
"reducedMotion": "Reduzierte Bewegung",
"volume": "Lautstärke",
"reset": "Auf Standard zurücksetzen"
},
"a11y": {
"skipToContent": "Zum Hauptinhalt springen",
"closeModal": "Modal schließen",
"openMenu": "Navigationsmenü öffnen",
"loading": "Lädt...",
"toastRegion": "Benachrichtigungen"
} }
} }

View File

@ -1,5 +1,9 @@
{ {
"_meta": { "lang": "en", "name": "English", "version": "1.0" }, "_meta": {
"lang": "en",
"name": "English",
"version": "1.2"
},
"nav": { "nav": {
"dashboard": "Dashboard", "dashboard": "Dashboard",
"dungeons": "Dungeons", "dungeons": "Dungeons",
@ -16,7 +20,8 @@
"missions": "Missions", "missions": "Missions",
"alliance": "Alliance", "alliance": "Alliance",
"market": "Market", "market": "Market",
"social": "Social" "social": "Social",
"settings": "Settings"
}, },
"base": { "base": {
"buildings": "🏗 Buildings", "buildings": "🏗 Buildings",
@ -45,7 +50,16 @@
"deposit": "Deposit", "deposit": "Deposit",
"withdraw": "Withdraw", "withdraw": "Withdraw",
"buy": "Buy", "buy": "Buy",
"sell": "Sell" "sell": "Sell",
"craft": "Craft",
"research": "Research",
"repair": "Repair",
"equip": "Equip",
"save": "Save",
"send": "Send",
"speedUp": "Speed Up",
"collectAll": "Collect All",
"unequip": "Unequip"
}, },
"status": { "status": {
"online": "Online", "online": "Online",
@ -53,6 +67,109 @@
"inProgress": "In Progress", "inProgress": "In Progress",
"completed": "Completed", "completed": "Completed",
"locked": "Locked", "locked": "Locked",
"maxLevel": "Max Level" "maxLevel": "Max Level",
"ready": "Ready!",
"queued": "Queued",
"failed": "Failed"
},
"dungeons": {
"title": "Dungeons",
"selectPrompt": "Select a dungeon to begin",
"difficulty": "Difficulty",
"minLevel": "Min. Level",
"energyCost": "Energy Cost",
"enter": "Enter Dungeon",
"easy": "Easy",
"medium": "Medium",
"hard": "Hard",
"extreme": "Extreme",
"legendary": "Legendary",
"boss": "Boss",
"room": "Room",
"rooms": "Rooms",
"loot": "Loot",
"rewardMultiplier": "Reward Multiplier",
"maxPlayers": "Max Players",
"clearBonus": "Clear Bonus"
},
"quests": {
"title": "Quests",
"main": "Main Story",
"daily": "Daily",
"weekly": "Weekly",
"monthly": "Monthly",
"completed": "Completed",
"failed": "Failed",
"resetsIn": "Resets in",
"claim": "Claim Reward",
"objective": "Objective",
"reward": "Reward"
},
"crafting": {
"title": "Crafting",
"queue": "Queue",
"queueEmpty": "No items in queue",
"speedUpCost": "Speed Up ({n} Gems)",
"collectAll": "Collect All Ready",
"completes": "Completes",
"progress": "Progress"
},
"alliance": {
"title": "Alliance",
"create": "Create Alliance",
"find": "Find Alliance",
"chat": "Alliance Chat",
"research": "Alliance Research",
"warehouse": "Alliance Warehouse",
"members": "Members",
"deposit": "Deposit",
"withdraw": "Withdraw"
},
"market": {
"title": "Player Market",
"browse": "Browse",
"sell": "Sell",
"myListings": "My Listings",
"priceHistory": "Price History",
"fee": "2% listing fee"
},
"inventory": {
"title": "Inventory",
"empty": "Inventory is empty",
"equip": "Equip",
"use": "Use",
"drop": "Drop",
"slot": {
"helmet": "Helmet",
"body": "Body Armour",
"hands": "Gloves",
"pants": "Legs",
"boots": "Boots",
"backpack": "Backpack"
}
},
"shop": {
"title": "Shop",
"gems": "Gem Store",
"ships": "Ships",
"weapons": "Weapons",
"armour": "Armour",
"consumables": "Consumables"
},
"settings": {
"title": "Settings",
"language": "Language",
"fontSize": "Font Size",
"colorBlind": "Colour Blind Mode",
"reducedMotion": "Reduced Motion",
"volume": "Sound Volume",
"reset": "Reset to Defaults"
},
"a11y": {
"skipToContent": "Skip to main content",
"closeModal": "Close modal",
"openMenu": "Open navigation menu",
"loading": "Loading...",
"toastRegion": "Notifications"
} }
} }

View File

@ -2,7 +2,7 @@
"_meta": { "_meta": {
"lang": "es", "lang": "es",
"name": "Español", "name": "Español",
"version": "1.0" "version": "1.2"
}, },
"nav": { "nav": {
"dashboard": "Panel", "dashboard": "Panel",
@ -20,7 +20,8 @@
"missions": "Misiones", "missions": "Misiones",
"alliance": "Alianza", "alliance": "Alianza",
"market": "Mercado", "market": "Mercado",
"social": "Social" "social": "Social",
"settings": "Ajustes"
}, },
"base": { "base": {
"buildings": "🏗 Edificios", "buildings": "🏗 Edificios",
@ -32,7 +33,7 @@
"metal": "Metal", "metal": "Metal",
"gas": "Gas", "gas": "Gas",
"crystal": "Cristal", "crystal": "Cristal",
"energyCells": "Células de energía", "energyCells": "Celdas de energía",
"darkMatter": "Materia oscura", "darkMatter": "Materia oscura",
"credits": "Créditos", "credits": "Créditos",
"gems": "Gemas" "gems": "Gemas"
@ -41,7 +42,7 @@
"build": "Construir", "build": "Construir",
"upgrade": "Mejorar", "upgrade": "Mejorar",
"cancel": "Cancelar", "cancel": "Cancelar",
"collect": "Recoger", "collect": "Recolectar",
"launch": "Lanzar", "launch": "Lanzar",
"search": "Buscar", "search": "Buscar",
"join": "Unirse", "join": "Unirse",
@ -49,14 +50,126 @@
"deposit": "Depositar", "deposit": "Depositar",
"withdraw": "Retirar", "withdraw": "Retirar",
"buy": "Comprar", "buy": "Comprar",
"sell": "Vender" "sell": "Vender",
"craft": "Fabricar",
"research": "Investigar",
"repair": "Reparar",
"equip": "Equipar",
"save": "Guardar",
"send": "Enviar",
"speedUp": "Acelerar",
"collectAll": "Recolectar todo",
"unequip": "Desequipar"
}, },
"status": { "status": {
"online": "En línea", "online": "En línea",
"offline": "Desconectado", "offline": "Sin conexión",
"inProgress": "En progreso", "inProgress": "En progreso",
"completed": "Completado", "completed": "Completado",
"locked": "Bloqueado", "locked": "Bloqueado",
"maxLevel": "Nivel máx." "maxLevel": "Nivel máx.",
"ready": "¡Listo!",
"queued": "En cola",
"failed": "Fallido"
},
"dungeons": {
"title": "Mazmorras",
"selectPrompt": "Selecciona una mazmorra",
"difficulty": "Dificultad",
"minLevel": "Nivel mín.",
"energyCost": "Costo de energía",
"enter": "Entrar a la mazmorra",
"easy": "Fácil",
"medium": "Medio",
"hard": "Difícil",
"extreme": "Extremo",
"legendary": "Legendario",
"boss": "Jefe",
"room": "Sala",
"rooms": "Salas",
"loot": "Botín",
"rewardMultiplier": "Multiplicador de recompensa",
"maxPlayers": "Jugadores máx.",
"clearBonus": "Bonificación de limpieza"
},
"quests": {
"title": "Misiones",
"main": "Historia principal",
"daily": "Diario",
"weekly": "Semanal",
"monthly": "Mensual",
"completed": "Completado",
"failed": "Fallido",
"resetsIn": "Se reinicia en",
"claim": "Reclamar recompensa",
"objective": "Objetivo",
"reward": "Recompensa"
},
"crafting": {
"title": "Fabricación",
"queue": "Cola",
"queueEmpty": "Sin objetos en cola",
"speedUpCost": "Acelerar ({n} gemas)",
"collectAll": "Recolectar todos",
"completes": "Completa",
"progress": "Progreso"
},
"alliance": {
"title": "Alianza",
"create": "Crear alianza",
"find": "Buscar alianza",
"chat": "Chat de alianza",
"research": "Investigación de alianza",
"warehouse": "Almacén de alianza",
"members": "Miembros",
"deposit": "Depositar",
"withdraw": "Retirar"
},
"market": {
"title": "Mercado de jugadores",
"browse": "Explorar",
"sell": "Vender",
"myListings": "Mis listados",
"priceHistory": "Historial de precios",
"fee": "2% de tarifa de listado"
},
"inventory": {
"title": "Inventario",
"empty": "El inventario está vacío",
"equip": "Equipar",
"use": "Usar",
"drop": "Soltar",
"slot": {
"helmet": "Casco",
"body": "Armadura",
"hands": "Guantes",
"pants": "Piernas",
"boots": "Botas",
"backpack": "Mochila"
}
},
"shop": {
"title": "Tienda",
"gems": "Tienda de gemas",
"ships": "Naves",
"weapons": "Armas",
"armour": "Armadura",
"consumables": "Consumibles"
},
"settings": {
"title": "Ajustes",
"language": "Idioma",
"fontSize": "Tamaño de fuente",
"colorBlind": "Modo daltónico",
"reducedMotion": "Movimiento reducido",
"volume": "Volumen",
"reset": "Restablecer ajustes"
},
"a11y": {
"skipToContent": "Ir al contenido principal",
"closeModal": "Cerrar ventana",
"openMenu": "Abrir menú de navegación",
"loading": "Cargando...",
"toastRegion": "Notificaciones"
} }
} }

View File

@ -2,7 +2,7 @@
"_meta": { "_meta": {
"lang": "fr", "lang": "fr",
"name": "Français", "name": "Français",
"version": "1.0" "version": "1.2"
}, },
"nav": { "nav": {
"dashboard": "Tableau de bord", "dashboard": "Tableau de bord",
@ -11,7 +11,7 @@
"base": "Base", "base": "Base",
"quests": "Quêtes", "quests": "Quêtes",
"inventory": "Inventaire", "inventory": "Inventaire",
"crafting": "Artisanat", "crafting": "Fabrication",
"shop": "Boutique", "shop": "Boutique",
"fleet": "Flotte", "fleet": "Flotte",
"galaxy": "Galaxie", "galaxy": "Galaxie",
@ -20,12 +20,13 @@
"missions": "Missions", "missions": "Missions",
"alliance": "Alliance", "alliance": "Alliance",
"market": "Marché", "market": "Marché",
"social": "Social" "social": "Social",
"settings": "Paramètres"
}, },
"base": { "base": {
"buildings": "🏗 Bâtiments", "buildings": "🏗 Bâtiments",
"shipyard": "🚀 Chantier naval", "shipyard": "🚀 Chantier naval",
"starbase": "🌌 Base stellaire", "starbase": "🌌 Étoile de base",
"overview": "📊 Vue d'ensemble" "overview": "📊 Vue d'ensemble"
}, },
"resources": { "resources": {
@ -43,13 +44,22 @@
"cancel": "Annuler", "cancel": "Annuler",
"collect": "Collecter", "collect": "Collecter",
"launch": "Lancer", "launch": "Lancer",
"search": "Rechercher", "search": "Chercher",
"join": "Rejoindre", "join": "Rejoindre",
"leave": "Quitter", "leave": "Quitter",
"deposit": "Déposer", "deposit": "Déposer",
"withdraw": "Retirer", "withdraw": "Retirer",
"buy": "Acheter", "buy": "Acheter",
"sell": "Vendre" "sell": "Vendre",
"craft": "Fabriquer",
"research": "Rechercher",
"repair": "Réparer",
"equip": "Équiper",
"save": "Sauvegarder",
"send": "Envoyer",
"speedUp": "Accélérer",
"collectAll": "Tout collecter",
"unequip": "Déséquiper"
}, },
"status": { "status": {
"online": "En ligne", "online": "En ligne",
@ -57,6 +67,109 @@
"inProgress": "En cours", "inProgress": "En cours",
"completed": "Terminé", "completed": "Terminé",
"locked": "Verrouillé", "locked": "Verrouillé",
"maxLevel": "Niveau max" "maxLevel": "Niveau max",
"ready": "Prêt !",
"queued": "En file",
"failed": "Échoué"
},
"dungeons": {
"title": "Donjons",
"selectPrompt": "Sélectionner un donjon",
"difficulty": "Difficulté",
"minLevel": "Niveau min.",
"energyCost": "Coût en énergie",
"enter": "Entrer dans le donjon",
"easy": "Facile",
"medium": "Moyen",
"hard": "Difficile",
"extreme": "Extrême",
"legendary": "Légendaire",
"boss": "Boss",
"room": "Salle",
"rooms": "Salles",
"loot": "Butin",
"rewardMultiplier": "Multiplicateur de récompense",
"maxPlayers": "Joueurs max",
"clearBonus": "Bonus de victoire"
},
"quests": {
"title": "Quêtes",
"main": "Histoire principale",
"daily": "Quotidien",
"weekly": "Hebdomadaire",
"monthly": "Mensuel",
"completed": "Terminé",
"failed": "Échoué",
"resetsIn": "Réinitialisé dans",
"claim": "Réclamer la récompense",
"objective": "Objectif",
"reward": "Récompense"
},
"crafting": {
"title": "Fabrication",
"queue": "File d'attente",
"queueEmpty": "Aucun objet en attente",
"speedUpCost": "Accélérer ({n} gemmes)",
"collectAll": "Tout collecter",
"completes": "Terminé",
"progress": "Progression"
},
"alliance": {
"title": "Alliance",
"create": "Créer une alliance",
"find": "Trouver une alliance",
"chat": "Chat d'alliance",
"research": "Recherche d'alliance",
"warehouse": "Entrepôt d'alliance",
"members": "Membres",
"deposit": "Déposer",
"withdraw": "Retirer"
},
"market": {
"title": "Marché des joueurs",
"browse": "Parcourir",
"sell": "Vendre",
"myListings": "Mes annonces",
"priceHistory": "Historique des prix",
"fee": "2% de frais d'inscription"
},
"inventory": {
"title": "Inventaire",
"empty": "L'inventaire est vide",
"equip": "Équiper",
"use": "Utiliser",
"drop": "Jeter",
"slot": {
"helmet": "Casque",
"body": "Armure",
"hands": "Gants",
"pants": "Jambes",
"boots": "Bottes",
"backpack": "Sac à dos"
}
},
"shop": {
"title": "Boutique",
"gems": "Boutique de gemmes",
"ships": "Vaisseaux",
"weapons": "Armes",
"armour": "Armure",
"consumables": "Consommables"
},
"settings": {
"title": "Paramètres",
"language": "Langue",
"fontSize": "Taille de police",
"colorBlind": "Mode daltonien",
"reducedMotion": "Mouvement réduit",
"volume": "Volume sonore",
"reset": "Rétablir les paramètres"
},
"a11y": {
"skipToContent": "Aller au contenu principal",
"closeModal": "Fermer la fenêtre",
"openMenu": "Ouvrir le menu de navigation",
"loading": "Chargement...",
"toastRegion": "Notifications"
} }
} }

View File

@ -2,7 +2,7 @@
"_meta": { "_meta": {
"lang": "ja", "lang": "ja",
"name": "日本語", "name": "日本語",
"version": "1.0" "version": "1.2"
}, },
"nav": { "nav": {
"dashboard": "ダッシュボード", "dashboard": "ダッシュボード",
@ -20,12 +20,13 @@
"missions": "ミッション", "missions": "ミッション",
"alliance": "アライアンス", "alliance": "アライアンス",
"market": "マーケット", "market": "マーケット",
"social": "ソーシャル" "social": "ソーシャル",
"settings": "設定"
}, },
"base": { "base": {
"buildings": "🏗 建物", "buildings": "🏗 建物",
"shipyard": "🚀 造船所", "shipyard": "🚀 造船所",
"starbase": "🌌 星基地", "starbase": "🌌 星基地",
"overview": "📊 概要" "overview": "📊 概要"
}, },
"resources": { "resources": {
@ -39,17 +40,26 @@
}, },
"actions": { "actions": {
"build": "建設", "build": "建設",
"upgrade": "アップグレード", "upgrade": "強化",
"cancel": "キャンセル", "cancel": "キャンセル",
"collect": "収集", "collect": "収集",
"launch": "発射", "launch": "起動",
"search": "検索", "search": "検索",
"join": "参加", "join": "参加",
"leave": "退出", "leave": "退出",
"deposit": "入金", "deposit": "預け入れ",
"withdraw": "出金", "withdraw": "引き出し",
"buy": "購入", "buy": "購入",
"sell": "売却" "sell": "売却",
"craft": "製作",
"research": "研究",
"repair": "修理",
"equip": "装備",
"save": "保存",
"send": "送信",
"speedUp": "加速",
"collectAll": "全て収集",
"unequip": "外す"
}, },
"status": { "status": {
"online": "オンライン", "online": "オンライン",
@ -57,6 +67,109 @@
"inProgress": "進行中", "inProgress": "進行中",
"completed": "完了", "completed": "完了",
"locked": "ロック中", "locked": "ロック中",
"maxLevel": "最大レベル" "maxLevel": "最大レベル",
"ready": "準備完了!",
"queued": "待機中",
"failed": "失敗"
},
"dungeons": {
"title": "ダンジョン",
"selectPrompt": "ダンジョンを選択",
"difficulty": "難易度",
"minLevel": "最低レベル",
"energyCost": "エネルギーコスト",
"enter": "ダンジョンに入る",
"easy": "簡単",
"medium": "普通",
"hard": "難しい",
"extreme": "極難",
"legendary": "伝説",
"boss": "ボス",
"room": "部屋",
"rooms": "部屋数",
"loot": "戦利品",
"rewardMultiplier": "報酬倍率",
"maxPlayers": "最大プレイヤー数",
"clearBonus": "クリアボーナス"
},
"quests": {
"title": "クエスト",
"main": "メインストーリー",
"daily": "デイリー",
"weekly": "ウィークリー",
"monthly": "マンスリー",
"completed": "完了",
"failed": "失敗",
"resetsIn": "リセットまで",
"claim": "報酬を受け取る",
"objective": "目標",
"reward": "報酬"
},
"crafting": {
"title": "クラフト",
"queue": "キュー",
"queueEmpty": "キューにアイテムがありません",
"speedUpCost": "加速({n}ジェム)",
"collectAll": "全て収集",
"completes": "完了",
"progress": "進捗"
},
"alliance": {
"title": "アライアンス",
"create": "アライアンス作成",
"find": "アライアンス検索",
"chat": "アライアンスチャット",
"research": "アライアンス研究",
"warehouse": "アライアンス倉庫",
"members": "メンバー",
"deposit": "預け入れ",
"withdraw": "引き出し"
},
"market": {
"title": "プレイヤーマーケット",
"browse": "閲覧",
"sell": "売却",
"myListings": "出品リスト",
"priceHistory": "価格履歴",
"fee": "2%出品手数料"
},
"inventory": {
"title": "インベントリ",
"empty": "インベントリが空です",
"equip": "装備",
"use": "使用",
"drop": "捨てる",
"slot": {
"helmet": "ヘルメット",
"body": "ボディアーマー",
"hands": "グローブ",
"pants": "レッグ",
"boots": "ブーツ",
"backpack": "バックパック"
}
},
"shop": {
"title": "ショップ",
"gems": "ジェムストア",
"ships": "艦船",
"weapons": "武器",
"armour": "防具",
"consumables": "消耗品"
},
"settings": {
"title": "設定",
"language": "言語",
"fontSize": "フォントサイズ",
"colorBlind": "色覚補正モード",
"reducedMotion": "アニメーション軽減",
"volume": "音量",
"reset": "デフォルトに戻す"
},
"a11y": {
"skipToContent": "メインコンテンツへスキップ",
"closeModal": "モーダルを閉じる",
"openMenu": "ナビゲーションメニューを開く",
"loading": "読み込み中...",
"toastRegion": "通知"
} }
} }

View File

@ -2,7 +2,7 @@
"_meta": { "_meta": {
"lang": "ko", "lang": "ko",
"name": "한국어", "name": "한국어",
"version": "1.0" "version": "1.2"
}, },
"nav": { "nav": {
"dashboard": "대시보드", "dashboard": "대시보드",
@ -14,18 +14,19 @@
"crafting": "제작", "crafting": "제작",
"shop": "상점", "shop": "상점",
"fleet": "함대", "fleet": "함대",
"galaxy": "은하", "galaxy": "은하",
"research": "연구", "research": "연구",
"leaderboard": "랭킹", "leaderboard": "순위",
"missions": "미션", "missions": "임무",
"alliance": "동맹", "alliance": "동맹",
"market": "시장", "market": "시장",
"social": "소셜" "social": "소셜",
"settings": "설정"
}, },
"base": { "base": {
"buildings": "🏗 건물", "buildings": "🏗 건물",
"shipyard": "🚀 조선소", "shipyard": "🚀 조선소",
"starbase": "🌌 우주기지", "starbase": "🌌 항성기지",
"overview": "📊 개요" "overview": "📊 개요"
}, },
"resources": { "resources": {
@ -39,24 +40,136 @@
}, },
"actions": { "actions": {
"build": "건설", "build": "건설",
"upgrade": "업그레이드", "upgrade": "강화",
"cancel": "취소", "cancel": "취소",
"collect": "수집", "collect": "수집",
"launch": "발사", "launch": "발사",
"search": "검색", "search": "검색",
"join": "참가", "join": "참가",
"leave": "나가기", "leave": "나가기",
"deposit": "입금", "deposit": "예치",
"withdraw": "출금", "withdraw": "출금",
"buy": "구매", "buy": "구매",
"sell": "판매" "sell": "판매",
"craft": "제작",
"research": "연구",
"repair": "수리",
"equip": "장착",
"save": "저장",
"send": "전송",
"speedUp": "가속",
"collectAll": "모두 수집",
"unequip": "해제"
}, },
"status": { "status": {
"online": "온라인", "online": "온라인",
"offline": "오프라인", "offline": "오프라인",
"inProgress": "진행 중", "inProgress": "진행 중",
"completed": "완료", "completed": "완료",
"locked": "잠김", "locked": "잠금",
"maxLevel": "최대 레벨" "maxLevel": "최고 레벨",
"ready": "준비 완료!",
"queued": "대기 중",
"failed": "실패"
},
"dungeons": {
"title": "던전",
"selectPrompt": "던전을 선택하세요",
"difficulty": "난이도",
"minLevel": "최소 레벨",
"energyCost": "에너지 비용",
"enter": "던전 입장",
"easy": "쉬움",
"medium": "보통",
"hard": "어려움",
"extreme": "극한",
"legendary": "전설",
"boss": "보스",
"room": "방",
"rooms": "방 수",
"loot": "전리품",
"rewardMultiplier": "보상 배율",
"maxPlayers": "최대 플레이어",
"clearBonus": "클리어 보너스"
},
"quests": {
"title": "퀘스트",
"main": "메인 스토리",
"daily": "일일",
"weekly": "주간",
"monthly": "월간",
"completed": "완료",
"failed": "실패",
"resetsIn": "초기화까지",
"claim": "보상 받기",
"objective": "목표",
"reward": "보상"
},
"crafting": {
"title": "제작",
"queue": "대기열",
"queueEmpty": "대기열에 아이템 없음",
"speedUpCost": "가속 ({n}젬)",
"collectAll": "모두 수집",
"completes": "완료",
"progress": "진행도"
},
"alliance": {
"title": "동맹",
"create": "동맹 창설",
"find": "동맹 찾기",
"chat": "동맹 채팅",
"research": "동맹 연구",
"warehouse": "동맹 창고",
"members": "멤버",
"deposit": "예치",
"withdraw": "출금"
},
"market": {
"title": "플레이어 마켓",
"browse": "탐색",
"sell": "판매",
"myListings": "내 목록",
"priceHistory": "가격 기록",
"fee": "2% 등록 수수료"
},
"inventory": {
"title": "인벤토리",
"empty": "인벤토리가 비어 있습니다",
"equip": "장착",
"use": "사용",
"drop": "버리기",
"slot": {
"helmet": "투구",
"body": "갑옷",
"hands": "장갑",
"pants": "하의",
"boots": "부츠",
"backpack": "배낭"
}
},
"shop": {
"title": "상점",
"gems": "젬 상점",
"ships": "함선",
"weapons": "무기",
"armour": "방어구",
"consumables": "소모품"
},
"settings": {
"title": "설정",
"language": "언어",
"fontSize": "글꼴 크기",
"colorBlind": "색맹 모드",
"reducedMotion": "애니메이션 줄이기",
"volume": "음량",
"reset": "기본값으로 재설정"
},
"a11y": {
"skipToContent": "주요 콘텐츠로 건너뛰기",
"closeModal": "모달 닫기",
"openMenu": "내비게이션 메뉴 열기",
"loading": "로딩 중...",
"toastRegion": "알림"
} }
} }

View File

@ -2,7 +2,7 @@
"_meta": { "_meta": {
"lang": "pt", "lang": "pt",
"name": "Português", "name": "Português",
"version": "1.0" "version": "1.2"
}, },
"nav": { "nav": {
"dashboard": "Painel", "dashboard": "Painel",
@ -11,7 +11,7 @@
"base": "Base", "base": "Base",
"quests": "Missões", "quests": "Missões",
"inventory": "Inventário", "inventory": "Inventário",
"crafting": "Criação", "crafting": "Fabricação",
"shop": "Loja", "shop": "Loja",
"fleet": "Frota", "fleet": "Frota",
"galaxy": "Galáxia", "galaxy": "Galáxia",
@ -20,7 +20,8 @@
"missions": "Missões", "missions": "Missões",
"alliance": "Aliança", "alliance": "Aliança",
"market": "Mercado", "market": "Mercado",
"social": "Social" "social": "Social",
"settings": "Configurações"
}, },
"base": { "base": {
"buildings": "🏗 Edifícios", "buildings": "🏗 Edifícios",
@ -47,9 +48,18 @@
"join": "Entrar", "join": "Entrar",
"leave": "Sair", "leave": "Sair",
"deposit": "Depositar", "deposit": "Depositar",
"withdraw": "Retirar", "withdraw": "Sacar",
"buy": "Comprar", "buy": "Comprar",
"sell": "Vender" "sell": "Vender",
"craft": "Fabricar",
"research": "Pesquisar",
"repair": "Reparar",
"equip": "Equipar",
"save": "Salvar",
"send": "Enviar",
"speedUp": "Acelerar",
"collectAll": "Coletar tudo",
"unequip": "Desequipar"
}, },
"status": { "status": {
"online": "Online", "online": "Online",
@ -57,6 +67,109 @@
"inProgress": "Em andamento", "inProgress": "Em andamento",
"completed": "Concluído", "completed": "Concluído",
"locked": "Bloqueado", "locked": "Bloqueado",
"maxLevel": "Nível máx." "maxLevel": "Nível máximo",
"ready": "Pronto!",
"queued": "Na fila",
"failed": "Falhou"
},
"dungeons": {
"title": "Masmorras",
"selectPrompt": "Selecione uma masmorra",
"difficulty": "Dificuldade",
"minLevel": "Nível mín.",
"energyCost": "Custo de energia",
"enter": "Entrar na masmorra",
"easy": "Fácil",
"medium": "Médio",
"hard": "Difícil",
"extreme": "Extremo",
"legendary": "Lendário",
"boss": "Chefe",
"room": "Sala",
"rooms": "Salas",
"loot": "Saque",
"rewardMultiplier": "Multiplicador de recompensa",
"maxPlayers": "Máx. jogadores",
"clearBonus": "Bônus de limpeza"
},
"quests": {
"title": "Missões",
"main": "História principal",
"daily": "Diário",
"weekly": "Semanal",
"monthly": "Mensal",
"completed": "Concluído",
"failed": "Falhou",
"resetsIn": "Reinicia em",
"claim": "Reivindicar recompensa",
"objective": "Objetivo",
"reward": "Recompensa"
},
"crafting": {
"title": "Fabricação",
"queue": "Fila",
"queueEmpty": "Sem itens na fila",
"speedUpCost": "Acelerar ({n} gemas)",
"collectAll": "Coletar todos",
"completes": "Conclui",
"progress": "Progresso"
},
"alliance": {
"title": "Aliança",
"create": "Criar aliança",
"find": "Encontrar aliança",
"chat": "Chat da aliança",
"research": "Pesquisa da aliança",
"warehouse": "Armazém da aliança",
"members": "Membros",
"deposit": "Depositar",
"withdraw": "Sacar"
},
"market": {
"title": "Mercado dos jogadores",
"browse": "Explorar",
"sell": "Vender",
"myListings": "Meus anúncios",
"priceHistory": "Histórico de preços",
"fee": "2% de taxa de listagem"
},
"inventory": {
"title": "Inventário",
"empty": "Inventário vazio",
"equip": "Equipar",
"use": "Usar",
"drop": "Soltar",
"slot": {
"helmet": "Capacete",
"body": "Armadura",
"hands": "Luvas",
"pants": "Calças",
"boots": "Botas",
"backpack": "Mochila"
}
},
"shop": {
"title": "Loja",
"gems": "Loja de gemas",
"ships": "Naves",
"weapons": "Armas",
"armour": "Armadura",
"consumables": "Consumíveis"
},
"settings": {
"title": "Configurações",
"language": "Idioma",
"fontSize": "Tamanho da fonte",
"colorBlind": "Modo daltônico",
"reducedMotion": "Movimento reduzido",
"volume": "Volume",
"reset": "Redefinir para padrão"
},
"a11y": {
"skipToContent": "Ir para o conteúdo principal",
"closeModal": "Fechar janela",
"openMenu": "Abrir menu de navegação",
"loading": "Carregando...",
"toastRegion": "Notificações"
} }
} }

View File

@ -2,11 +2,11 @@
"_meta": { "_meta": {
"lang": "zh", "lang": "zh",
"name": "中文", "name": "中文",
"version": "1.0" "version": "1.2"
}, },
"nav": { "nav": {
"dashboard": "仪表板", "dashboard": "仪表板",
"dungeons": "地下城", "dungeons": "地",
"skills": "技能", "skills": "技能",
"base": "基地", "base": "基地",
"quests": "任务", "quests": "任务",
@ -14,19 +14,20 @@
"crafting": "制作", "crafting": "制作",
"shop": "商店", "shop": "商店",
"fleet": "舰队", "fleet": "舰队",
"galaxy": "银河", "galaxy": "银河",
"research": "研究", "research": "研究",
"leaderboard": "排行榜", "leaderboard": "排行榜",
"missions": "任务", "missions": "任务",
"alliance": "联盟", "alliance": "联盟",
"market": "市场", "market": "市场",
"social": "社交" "social": "社交",
"settings": "设置"
}, },
"base": { "base": {
"buildings": "🏗 建筑", "buildings": "🏗 建筑",
"shipyard": "🚀 造船厂", "shipyard": "🚀 造船厂",
"starbase": "🌌 星际基地", "starbase": "🌌 星际基地",
"overview": "📊 览" "overview": "📊 览"
}, },
"resources": { "resources": {
"metal": "金属", "metal": "金属",
@ -47,9 +48,18 @@
"join": "加入", "join": "加入",
"leave": "离开", "leave": "离开",
"deposit": "存入", "deposit": "存入",
"withdraw": "取", "withdraw": "",
"buy": "购买", "buy": "购买",
"sell": "出售" "sell": "出售",
"craft": "制作",
"research": "研究",
"repair": "修理",
"equip": "装备",
"save": "保存",
"send": "发送",
"speedUp": "加速",
"collectAll": "全部收集",
"unequip": "卸下"
}, },
"status": { "status": {
"online": "在线", "online": "在线",
@ -57,6 +67,109 @@
"inProgress": "进行中", "inProgress": "进行中",
"completed": "已完成", "completed": "已完成",
"locked": "已锁定", "locked": "已锁定",
"maxLevel": "最高等级" "maxLevel": "最高等级",
"ready": "就绪!",
"queued": "排队中",
"failed": "失败"
},
"dungeons": {
"title": "地牢",
"selectPrompt": "选择一个地牢",
"difficulty": "难度",
"minLevel": "最低等级",
"energyCost": "能量消耗",
"enter": "进入地牢",
"easy": "简单",
"medium": "普通",
"hard": "困难",
"extreme": "极限",
"legendary": "传奇",
"boss": "首领",
"room": "房间",
"rooms": "房间数",
"loot": "战利品",
"rewardMultiplier": "奖励倍数",
"maxPlayers": "最多玩家",
"clearBonus": "清关奖励"
},
"quests": {
"title": "任务",
"main": "主线故事",
"daily": "每日",
"weekly": "每周",
"monthly": "每月",
"completed": "已完成",
"failed": "失败",
"resetsIn": "重置于",
"claim": "领取奖励",
"objective": "目标",
"reward": "奖励"
},
"crafting": {
"title": "制作",
"queue": "队列",
"queueEmpty": "队列中没有物品",
"speedUpCost": "加速({n}宝石)",
"collectAll": "全部收集",
"completes": "完成",
"progress": "进度"
},
"alliance": {
"title": "联盟",
"create": "创建联盟",
"find": "查找联盟",
"chat": "联盟聊天",
"research": "联盟研究",
"warehouse": "联盟仓库",
"members": "成员",
"deposit": "存入",
"withdraw": "取出"
},
"market": {
"title": "玩家市场",
"browse": "浏览",
"sell": "出售",
"myListings": "我的列表",
"priceHistory": "价格历史",
"fee": "2%上架费"
},
"inventory": {
"title": "背包",
"empty": "背包是空的",
"equip": "装备",
"use": "使用",
"drop": "丢弃",
"slot": {
"helmet": "头盔",
"body": "胸甲",
"hands": "手套",
"pants": "腿甲",
"boots": "靴子",
"backpack": "背包"
}
},
"shop": {
"title": "商店",
"gems": "宝石商店",
"ships": "飞船",
"weapons": "武器",
"armour": "护甲",
"consumables": "消耗品"
},
"settings": {
"title": "设置",
"language": "语言",
"fontSize": "字体大小",
"colorBlind": "色盲模式",
"reducedMotion": "减少动画",
"volume": "音量",
"reset": "恢复默认"
},
"a11y": {
"skipToContent": "跳至主内容",
"closeModal": "关闭窗口",
"openMenu": "打开导航菜单",
"loading": "加载中...",
"toastRegion": "通知"
} }
} }

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,842 +0,0 @@
/* Table Styles for Galaxy Strike Online */
/* Base Table Styles */
.dungeon-table,
.skills-table,
.base-rooms-table,
.base-upgrades-table,
.ship-gallery-table,
.starbase-management-table,
.starbase-shop-table,
.quests-table,
.inventory-table,
.shop-table {
width: 100%;
border-collapse: collapse;
background: var(--card-bg);
border-radius: 8px;
overflow: hidden;
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.3);
margin: 10px 0;
}
.dungeon-table th,
.skills-table th,
.base-rooms-table th,
.base-upgrades-table th,
.ship-gallery-table th,
.starbase-management-table th,
.starbase-shop-table th,
.quests-table th,
.inventory-table th,
.shop-table th {
background: var(--gradient-primary);
color: var(--text-primary);
padding: 12px 15px;
text-align: left;
font-weight: 600;
font-size: 14px;
border-bottom: 2px solid rgba(255, 255, 255, 0.1);
}
.dungeon-table td,
.skills-table td,
.base-rooms-table td,
.base-upgrades-table td,
.ship-gallery-table td,
.starbase-management-table td,
.starbase-shop-table td,
.quests-table td,
.inventory-table td,
.shop-table td {
padding: 12px 15px;
border-bottom: 1px solid rgba(255, 255, 255, 0.1);
color: #e0e0e0;
font-size: 14px;
}
.dungeon-table tr:hover,
.skills-table tr:hover,
.base-rooms-table tr:hover,
.base-upgrades-table tr:hover,
.ship-gallery-table tr:hover,
.starbase-management-table tr:hover,
.starbase-shop-table tr:hover,
.quests-table tr:hover,
.inventory-table tr:hover,
.shop-table tr:hover {
background: rgba(102, 126, 234, 0.1);
transition: background 0.3s ease;
}
/* Dungeon Table Specific */
.dungeon-table .difficulty-easy { color: #00ff00; }
.dungeon-table .difficulty-medium { color: #ffff00; }
.dungeon-table .difficulty-hard { color: #ff9900; }
.dungeon-table .difficulty-extreme { color: #ff0000; }
/* Skills Table Specific */
.skills-table .skill-level {
font-weight: bold;
color: #667eea;
}
.skills-table .skill-progress {
width: 100px;
height: 8px;
background: rgba(255, 255, 255, 0.1);
border-radius: 4px;
overflow: hidden;
}
.skills-table .progress-fill {
height: 100%;
background: linear-gradient(90deg, #667eea, #764ba2);
transition: width 0.3s ease;
}
/* Base Tables Specific */
.base-rooms-table .room-status-active { color: #00ff00; }
.base-rooms-table .room-status-inactive { color: #ff0000; }
.base-rooms-table .room-status-upgrading { color: #ffff00; }
.base-upgrades-table .upgrade-level {
font-weight: bold;
color: #667eea;
}
/* Ship Gallery Grid Specific */
.ship-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
gap: 15px;
padding: 20px 0;
}
.ship-card {
background: var(--card-bg);
border-radius: 12px;
padding: 15px;
border: 2px solid var(--primary-color);
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.3);
transition: all 0.3s ease;
position: relative;
overflow: hidden;
text-align: center;
}
.ship-card:hover {
transform: translateY(-5px);
border-color: var(--primary-color);
box-shadow: 0 8px 30px rgba(0, 212, 255, 0.4);
}
.ship-card.active {
border-color: var(--success-color);
box-shadow: 0 8px 30px rgba(0, 255, 136, 0.2);
}
.ship-card.active::before {
content: "ACTIVE";
position: absolute;
top: 10px;
right: 10px;
background: var(--gradient-secondary);
color: var(--text-primary);
padding: 4px 8px;
border-radius: 4px;
font-size: 10px;
font-weight: bold;
text-transform: uppercase;
letter-spacing: 0.5px;
}
.ship-card-header {
display: flex;
flex-direction: column;
align-items: center;
gap: 10px;
margin-bottom: 15px;
}
.ship-card-image {
width: 80px;
height: 80px;
border-radius: 8px;
object-fit: cover;
border: 2px solid var(--primary-color);
margin: 0 auto;
}
.ship-card-info {
text-align: center;
}
.ship-card-rarity {
color: var(--text-secondary);
font-size: 14px;
font-weight: bold;
text-transform: uppercase;
letter-spacing: 0.5px;
padding: 4px 8px;
border-radius: 4px;
background: var(--hover-bg);
border: 1px solid var(--border-color);
}
.ship-card-rarity.common {
color: #888;
border-color: #888;
}
.ship-card-rarity.rare {
color: var(--primary-color);
border-color: var(--primary-color);
}
.ship-card-rarity.epic {
color: var(--accent-color);
border-color: var(--accent-color);
}
.ship-card-rarity.legendary {
color: var(--warning-color);
border-color: var(--warning-color);
}
.ship-card-stats {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 8px;
margin-bottom: 15px;
}
.ship-card-stat {
display: flex;
justify-content: space-between;
align-items: center;
padding: 6px 10px;
background: rgba(255, 255, 255, 0.05);
border-radius: 4px;
border: 1px solid rgba(255, 255, 255, 0.1);
}
.ship-card-stat .stat-label {
color: var(--text-muted);
font-size: 11px;
text-transform: uppercase;
letter-spacing: 0.5px;
}
.ship-card-stat .stat-value {
color: var(--text-secondary);
font-weight: bold;
font-size: 12px;
}
.ship-card-stat .stat-value.health {
color: var(--success-color);
}
.ship-card-stat .stat-value.attack {
color: var(--warning-color);
}
.ship-card-stat .stat-value.defense {
color: var(--accent-color);
}
.ship-card-stat .stat-value.speed {
color: var(--secondary-color);
}
.ship-card-actions {
display: flex;
gap: 10px;
justify-content: space-between;
}
.ship-card-actions .btn-action {
flex: 1;
padding: 8px 12px;
border: none;
border-radius: 6px;
cursor: pointer;
font-size: 12px;
font-weight: 600;
transition: all 0.3s ease;
text-transform: uppercase;
text-align: center;
}
.btn-action.btn-switch {
background: var(--gradient-primary);
color: var(--text-primary);
}
.btn-action.btn-switch:hover {
background: var(--gradient-secondary);
transform: translateY(-2px);
}
.btn-action.btn-switch:disabled {
background: var(--text-muted);
cursor: not-allowed;
transform: none;
}
.btn-action.btn-upgrade {
background: var(--gradient-secondary);
color: var(--text-primary);
}
.btn-action.btn-upgrade:hover {
background: var(--gradient-primary);
transform: translateY(-2px);
}
.btn-action.btn-repair {
background: var(--gradient-secondary);
color: var(--text-primary);
}
.btn-action.btn-repair:hover {
background: var(--gradient-primary);
transform: translateY(-2px);
}
/* Ship Gallery Layout */
.ship-layout {
display: flex;
gap: 30px;
margin-top: 20px;
}
.current-ship-section {
flex: 0 0 400px;
background: var(--card-bg);
border-radius: 8px;
padding: 20px;
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.3);
border: 2px solid var(--primary-color);
}
.ship-grid-section {
flex: 1;
min-width: 0; /* Prevent flex item from overflowing */
}
.ship-grid-section h4 {
color: var(--primary-color);
margin-bottom: 20px;
font-size: 16px;
text-transform: uppercase;
letter-spacing: 1px;
}
.current-ship-section h4 {
color: var(--primary-color);
margin-bottom: 15px;
font-size: 18px;
text-transform: uppercase;
letter-spacing: 1px;
text-align: center;
}
/* Current Ship Display */
.current-ship-display {
display: flex;
flex-direction: column;
align-items: center;
gap: 20px;
text-align: center;
}
.current-ship-image {
flex-shrink: 0;
order: 1;
}
.current-ship-image img {
width: 120px;
height: 120px;
object-fit: cover;
border-radius: 8px;
border: 2px solid var(--primary-color);
box-shadow: 0 4px 15px rgba(0, 212, 255, 0.3);
}
.current-ship-details {
flex: 1;
order: 2;
min-width: 0;
text-align: center;
}
.current-ship-details h5 {
color: var(--text-primary);
margin-bottom: 15px;
font-size: 20px;
font-weight: bold;
text-align: center;
}
.current-ship-stats {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 10px;
}
.ship-stat {
display: flex;
justify-content: space-between;
align-items: center;
padding: 8px 12px;
background: var(--hover-bg);
border-radius: 4px;
border: 1px solid var(--border-color);
}
.ship-stat .stat-label {
color: var(--text-muted);
font-size: 12px;
text-transform: uppercase;
letter-spacing: 0.5px;
}
.ship-stat .stat-value {
color: var(--text-secondary);
font-weight: bold;
font-size: 14px;
}
.ship-stat .stat-value.health {
color: var(--success-color);
}
.ship-stat .stat-value.attack {
color: var(--warning-color);
}
.ship-stat .stat-value.defense {
color: var(--accent-color);
}
.ship-stat .stat-value.speed {
color: var(--secondary-color);
}
.ship-table-section {
margin-top: 30px;
}
.ship-table-section h4 {
color: #667eea;
margin-bottom: 15px;
font-size: 16px;
text-transform: uppercase;
letter-spacing: 1px;
}
/* Responsive Design */
@media (max-width: 768px) {
.ship-layout {
flex-direction: column;
gap: 20px;
}
.current-ship-section {
flex: 1;
width: 100%;
}
.current-ship-display {
flex-direction: row;
align-items: flex-start;
gap: 15px;
}
.current-ship-image img {
width: 100px;
height: 100px;
}
.current-ship-stats {
grid-template-columns: 1fr;
}
.ship-grid {
grid-template-columns: 1fr;
gap: 15px;
padding: 15px 0;
}
.ship-card {
padding: 15px;
}
.ship-card-header {
flex-direction: row;
align-items: flex-start;
gap: 12px;
}
.ship-card-image {
width: 80px;
height: 80px;
}
.ship-card-stats {
grid-template-columns: 1fr;
gap: 6px;
}
.ship-card-actions {
flex-direction: column;
gap: 8px;
}
.ship-card-actions .btn-action {
padding: 10px 12px;
font-size: 11px;
}
}
@media (max-width: 480px) {
.ship-layout {
gap: 15px;
}
.current-ship-section {
padding: 15px;
}
.current-ship-display {
flex-direction: column;
align-items: center;
text-align: center;
gap: 15px;
}
.current-ship-image {
order: 1;
}
.current-ship-details {
order: 2;
text-align: center;
}
.ship-grid {
grid-template-columns: 1fr;
gap: 10px;
padding: 10px 0;
}
.ship-card {
padding: 12px;
}
.ship-card-header {
flex-direction: column;
align-items: center;
text-align: center;
gap: 10px;
}
.ship-card-image {
width: 80px;
height: 80px;
margin: 0 auto;
}
.ship-card-info {
text-align: center;
}
.ship-card-name {
font-size: 14px;
}
.ship-card-class {
font-size: 11px;
}
}
/* Console Window Styles */
.console-window {
position: fixed;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 600px;
height: 400px;
background: var(--bg-secondary);
border: 2px solid var(--primary-color);
border-radius: 8px;
box-shadow: 0 8px 30px rgba(0, 0, 0, 0.8);
z-index: 10000;
display: none;
flex-direction: column;
font-family: 'Courier New', monospace;
}
.console-header {
background: var(--gradient-primary);
color: var(--text-primary);
padding: 10px 15px;
border-radius: 6px 6px 0 0;
display: flex;
justify-content: space-between;
align-items: center;
font-weight: bold;
font-size: 14px;
}
.console-close {
background: none;
border: none;
color: var(--text-primary);
font-size: 20px;
cursor: pointer;
padding: 0;
width: 24px;
height: 24px;
display: flex;
align-items: center;
justify-content: center;
border-radius: 4px;
transition: background 0.3s ease;
}
.console-close:hover {
background: rgba(255, 255, 255, 0.2);
}
.console-content {
flex: 1;
display: flex;
flex-direction: column;
overflow: hidden;
}
.console-output {
flex: 1;
padding: 15px;
overflow-y: auto;
background: var(--bg-primary);
color: var(--text-primary);
font-size: 12px;
line-height: 1.4;
border-bottom: 1px solid var(--border-color);
}
.console-output .console-line {
margin-bottom: 5px;
word-wrap: break-word;
}
.console-output .console-error {
color: var(--error-color);
}
.console-output .console-success {
color: var(--success-color);
}
.console-output .console-warning {
color: var(--warning-color);
}
.console-output .console-info {
color: var(--primary-color);
}
.console-input-container {
padding: 10px;
background: var(--bg-secondary);
}
.console-input {
width: 100%;
background: var(--bg-primary);
border: 1px solid var(--border-color);
color: var(--text-primary);
padding: 8px 12px;
font-family: 'Courier New', monospace;
font-size: 12px;
border-radius: 4px;
outline: none;
}
.console-input:focus {
border-color: var(--primary-color);
box-shadow: 0 0 0 2px rgba(0, 212, 255, 0.2);
}
/* Starbase Tables Specific */
.starbase-management-table .starbase-level {
font-weight: bold;
color: #667eea;
}
.starbase-shop-table .starbase-cost {
font-weight: bold;
color: #ffd700;
}
/* Quests Table Specific */
.quests-table .quest-type-main { color: #667eea; }
.quests-table .quest-type-daily { color: #00ff00; }
.quests-table .quest-type-procedural { color: #ff9900; }
.quests-table .quest-type-completed { color: #888888; }
.quests-table .quest-type-failed { color: #ff0000; }
.quests-table .quest-progress {
width: 100px;
height: 8px;
background: rgba(255, 255, 255, 0.1);
border-radius: 4px;
overflow: hidden;
}
.quests-table .progress-fill {
height: 100%;
background: linear-gradient(90deg, #00ff00, #00cc00);
transition: width 0.3s ease;
}
/* Inventory Table Specific */
.inventory-table .item-rarity-common { color: #888888; }
.inventory-table .item-rarity-uncommon { color: #00ff00; }
.inventory-table .item-rarity-rare { color: #0088ff; }
.inventory-table .item-rarity-epic { color: #8833ff; }
.inventory-table .item-rarity-legendary { color: #ff8800; }
.inventory-table .item-stats {
font-size: 12px;
color: #cccccc;
}
/* Shop Table Specific */
.shop-table .item-price {
font-weight: bold;
color: #ffd700;
}
.shop-table .item-description {
font-size: 12px;
color: #cccccc;
max-width: 200px;
}
/* Action Buttons */
.dungeon-table .btn-action,
.skills-table .btn-action,
.base-rooms-table .btn-action,
.base-upgrades-table .btn-action,
.ship-gallery-table .btn-action,
.starbase-management-table .btn-action,
.starbase-shop-table .btn-action,
.quests-table .btn-action,
.inventory-table .btn-action,
.shop-table .btn-action {
padding: 6px 12px;
border: none;
border-radius: 4px;
cursor: pointer;
font-size: 12px;
font-weight: 600;
transition: all 0.3s ease;
text-transform: uppercase;
}
.btn-action.btn-primary {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
color: white;
}
.btn-action.btn-primary:hover {
background: linear-gradient(135deg, #764ba2 0%, #667eea 100%);
transform: translateY(-1px);
}
.btn-action.btn-secondary {
background: rgba(255, 255, 255, 0.1);
color: white;
border: 1px solid rgba(255, 255, 255, 0.2);
}
.btn-action.btn-secondary:hover {
background: rgba(255, 255, 255, 0.2);
transform: translateY(-1px);
}
.btn-action.btn-success {
background: linear-gradient(135deg, #00ff00 0%, #00cc00 100%);
color: white;
}
.btn-action.btn-success:hover {
background: linear-gradient(135deg, #00cc00 0%, #00ff00 100%);
transform: translateY(-1px);
}
.btn-action.btn-danger {
background: linear-gradient(135deg, #ff0000 0%, #cc0000 100%);
color: white;
}
.btn-action.btn-danger:hover {
background: linear-gradient(135deg, #cc0000 0%, #ff0000 100%);
transform: translateY(-1px);
}
/* Responsive Design */
@media (max-width: 768px) {
.dungeon-table,
.skills-table,
.base-rooms-table,
.base-upgrades-table,
.ship-gallery-table,
.starbase-management-table,
.starbase-shop-table,
.quests-table,
.inventory-table,
.shop-table {
font-size: 12px;
}
.dungeon-table th,
.skills-table th,
.base-rooms-table th,
.base-upgrades-table th,
.ship-gallery-table th,
.starbase-management-table th,
.starbase-shop-table th,
.quests-table th,
.inventory-table th,
.shop-table th {
padding: 8px 10px;
font-size: 12px;
}
.dungeon-table td,
.skills-table td,
.base-rooms-table td,
.base-upgrades-table td,
.ship-gallery-table td,
.starbase-management-table td,
.starbase-shop-table td,
.quests-table td,
.inventory-table td,
.shop-table td {
padding: 8px 10px;
font-size: 12px;
}
.btn-action {
padding: 4px 8px;
font-size: 10px;
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 45 KiB

View File

@ -0,0 +1,28 @@
{
"version": "1.0",
"tiers": [
{
"tier": 1,
"techs": [
{ "id": "alliance_storage_1", "name": "Expanded Warehouse I", "desc": "Increase alliance warehouse cap by 10,000 per resource.", "cost": {"credits":5000,"metal":2000}, "effect": {"warehouseCap":10000}, "prereq": [], "icon": "fa-warehouse", "maxLevel": 3 },
{ "id": "alliance_xp_1", "name": "Shared Knowledge I", "desc": "+5% XP for all members.", "cost": {"credits":8000,"crystal":500}, "effect": {"memberXpBonus":0.05}, "prereq": [], "icon": "fa-graduation-cap", "maxLevel": 3 },
{ "id": "alliance_credits_1", "name": "Trade Network I", "desc": "Reduce market listing fee by 0.5% for all members.", "cost": {"credits":6000,"gas":1000}, "effect": {"marketFeeReduction":0.005}, "prereq": [], "icon": "fa-coins", "maxLevel": 2 }
]
},
{
"tier": 2,
"techs": [
{ "id": "alliance_storage_2", "name": "Expanded Warehouse II", "desc": "Increase warehouse cap by an additional 25,000.", "cost": {"credits":15000,"metal":8000}, "effect": {"warehouseCap":25000}, "prereq": ["alliance_storage_1"], "icon": "fa-warehouse", "maxLevel": 1 },
{ "id": "alliance_craft_1", "name": "Collective Crafting", "desc": "All members gain -10% craft time.", "cost": {"credits":12000,"crystal":1500},"effect": {"craftTimeReduction":0.10}, "prereq": ["alliance_xp_1"], "icon": "fa-hammer", "maxLevel": 2 },
{ "id": "alliance_defense_1", "name": "Defensive Grid I", "desc": "+10% PvP defense for all members.", "cost": {"credits":10000,"metal":5000}, "effect": {"pvpDefenseBonus":0.10}, "prereq": ["alliance_credits_1"],"icon": "fa-shield-alt", "maxLevel": 3 }
]
},
{
"tier": 3,
"techs": [
{ "id": "alliance_dm_1", "name": "Void Tap", "desc": "+15% dark matter production for all members.", "cost": {"credits":25000,"darkMatter":50},"effect": {"darkMatterBonus":0.15}, "prereq": ["alliance_storage_2","alliance_craft_1"], "icon": "fa-atom", "maxLevel": 1 },
{ "id": "alliance_fleet_1", "name": "Fleet Coordination", "desc": "+20% fleet mission rewards for all members.", "cost": {"credits":20000,"gas":5000}, "effect": {"fleetRewardBonus":0.20}, "prereq": ["alliance_defense_1"],"icon": "fa-fighter-jet","maxLevel": 2 }
]
}
]
}

View File

@ -26,5 +26,25 @@
"ui": { "ui": {
"icon": "fa-monument", "icon": "fa-monument",
"color": "#4488cc" "color": "#4488cc"
},
"lootTable": [
{
"itemId": "wp_alien_ruins",
"weight": 8,
"qtyMin": 1,
"qtyMax": 1
},
{
"itemId": "energy_boost_small",
"weight": 60,
"qtyMin": 1,
"qtyMax": 3
},
{
"itemId": "health_kit_small",
"weight": 60,
"qtyMin": 1,
"qtyMax": 2
} }
]
} }

View File

@ -26,5 +26,25 @@
"ui": { "ui": {
"icon": "fa-meteor", "icon": "fa-meteor",
"color": "#888844" "color": "#888844"
},
"lootTable": [
{
"itemId": "wp_arctic_station",
"weight": 8,
"qtyMin": 1,
"qtyMax": 1
},
{
"itemId": "fuel_cell",
"weight": 60,
"qtyMin": 1,
"qtyMax": 5
},
{
"itemId": "health_kit_small",
"weight": 50,
"qtyMin": 1,
"qtyMax": 3
} }
]
} }

View File

@ -26,5 +26,31 @@
"ui": { "ui": {
"icon": "fa-microchip", "icon": "fa-microchip",
"color": "#44cc44" "color": "#44cc44"
},
"lootTable": [
{
"itemId": "room_vault",
"weight": 12,
"qtyMin": 1,
"qtyMax": 1
},
{
"itemId": "wp_void_black",
"weight": 10,
"qtyMin": 1,
"qtyMax": 1
},
{
"itemId": "credit_multiplier",
"weight": 40,
"qtyMin": 1,
"qtyMax": 1
},
{
"itemId": "xp_booster",
"weight": 40,
"qtyMin": 1,
"qtyMax": 2
} }
]
} }

View File

@ -26,5 +26,25 @@
"ui": { "ui": {
"icon": "fa-star", "icon": "fa-star",
"color": "#cc44ff" "color": "#cc44ff"
},
"lootTable": [
{
"itemId": "wp_nebula_dawn",
"weight": 10,
"qtyMin": 1,
"qtyMax": 1
},
{
"itemId": "wp_deep_ocean",
"weight": 8,
"qtyMin": 1,
"qtyMax": 1
},
{
"itemId": "xp_booster",
"weight": 60,
"qtyMin": 1,
"qtyMax": 2
} }
]
} }

View File

@ -26,5 +26,25 @@
"ui": { "ui": {
"icon": "fa-skull-crossbones", "icon": "fa-skull-crossbones",
"color": "#cc4444" "color": "#cc4444"
},
"lootTable": [
{
"itemId": "wp_lava_forge",
"weight": 6,
"qtyMin": 1,
"qtyMax": 1
},
{
"itemId": "health_kit_large",
"weight": 40,
"qtyMin": 1,
"qtyMax": 2
},
{
"itemId": "fuel_cell",
"weight": 50,
"qtyMin": 1,
"qtyMax": 3
} }
]
} }

View File

@ -26,5 +26,86 @@
"ui": { "ui": {
"icon": "fa-circle-radiation", "icon": "fa-circle-radiation",
"color": "#ff4488" "color": "#ff4488"
},
"lootTable": [
{
"itemId": "wp_void_rift",
"weight": 5,
"qtyMin": 1,
"qtyMax": 1
},
{
"itemId": "room_vault",
"weight": 3,
"qtyMin": 1,
"qtyMax": 1
},
{
"itemId": "xp_booster",
"weight": 50,
"qtyMin": 1,
"qtyMax": 2
},
{
"itemId": "credit_multiplier",
"weight": 30,
"qtyMin": 1,
"qtyMax": 1
},
{
"itemId": "quantum_hull_plate",
"weight": 2,
"qtyMin": 1,
"qtyMax": 1
},
{
"itemId": "void_capacitor",
"weight": 8,
"qtyMin": 1,
"qtyMax": 2
},
{
"itemId": "advanced_circuit_board",
"weight": 12,
"qtyMin": 1,
"qtyMax": 3
},
{
"itemId": "phase_alloy",
"weight": 20,
"qtyMin": 2,
"qtyMax": 5
},
{
"itemId": "chrono_alloy",
"weight": 15,
"qtyMin": 1,
"qtyMax": 3
},
{
"itemId": "sniper_epic",
"weight": 4,
"qtyMin": 1,
"qtyMax": 1
},
{
"itemId": "laser_bow_epic",
"weight": 4,
"qtyMin": 1,
"qtyMax": 1
},
{
"itemId": "helmet_tactical_epic",
"weight": 6,
"qtyMin": 1,
"qtyMax": 1
},
{
"itemId": "body_exosuit_epic",
"weight": 3,
"qtyMin": 1,
"qtyMax": 1
} }
],
"bossGuaranteedRare": true
} }

View File

@ -0,0 +1,11 @@
{
"id": "defense_turret",
"name": "Defense Turret",
"health": 35,
"attack": 14,
"defense": 8,
"speed": 0,
"experience": 20,
"credits": 15,
"rarity": "common"
}

View File

@ -1,14 +0,0 @@
{
"templates": {
"armour": {
"id": "backpack_basic_common",
"texture": "assets/gso/textures/armour/backpack/backpack_basic_common.png",
"stats": {
"health": 20,
"resistance": 0.03,
"defenceRating": 1,
"reflectChance": 0.0
}
}
}
}

View File

@ -1,14 +0,0 @@
{
"templates": {
"armour": {
"id": "backpack_field_rare",
"texture": "assets/gso/textures/armour/backpack/backpack_field_rare.png",
"stats": {
"health": 40,
"resistance": 0.08,
"defenceRating": 3,
"reflectChance": 0.01
}
}
}
}

View File

@ -1,14 +0,0 @@
{
"templates": {
"armour": {
"id": "backpack_reactor_epic",
"texture": "assets/gso/textures/armour/backpack/backpack_reactor_epic.png",
"stats": {
"health": 70,
"resistance": 0.15,
"defenceRating": 6,
"reflectChance": 0.03
}
}
}
}

View File

@ -1,14 +0,0 @@
{
"templates": {
"armour": {
"id": "body_basic_common",
"texture": "assets/gso/textures/armour/body/body_basic_common.png",
"stats": {
"health": 60,
"resistance": 0.1,
"defenceRating": 4,
"reflectChance": 0.0
}
}
}
}

View File

@ -1,14 +0,0 @@
{
"templates": {
"armour": {
"id": "body_exosuit_epic",
"texture": "assets/gso/textures/armour/body/body_exosuit_epic.png",
"stats": {
"health": 180,
"resistance": 0.3,
"defenceRating": 14,
"reflectChance": 0.05
}
}
}
}

View File

@ -1,14 +0,0 @@
{
"templates": {
"armour": {
"id": "body_plated_rare",
"texture": "assets/gso/textures/armour/body/body_plated_rare.png",
"stats": {
"health": 110,
"resistance": 0.2,
"defenceRating": 8,
"reflectChance": 0.02
}
}
}
}

View File

@ -1,14 +0,0 @@
{
"templates": {
"armour": {
"id": "boots_assault_rare",
"texture": "assets/gso/textures/armour/boots/boots_assault_rare.png",
"stats": {
"health": 40,
"resistance": 0.12,
"defenceRating": 4,
"reflectChance": 0.01
}
}
}
}

View File

@ -1,14 +0,0 @@
{
"templates": {
"armour": {
"id": "boots_basic_common",
"texture": "assets/gso/textures/armour/boots/boots_basic_common.png",
"stats": {
"health": 20,
"resistance": 0.05,
"defenceRating": 2,
"reflectChance": 0.0
}
}
}
}

View File

@ -1,14 +0,0 @@
{
"templates": {
"armour": {
"id": "boots_gravity_epic",
"texture": "assets/gso/textures/armour/boots/boots_gravity_epic.png",
"stats": {
"health": 65,
"resistance": 0.2,
"defenceRating": 7,
"reflectChance": 0.025
}
}
}
}

View File

@ -1,14 +0,0 @@
{
"templates": {
"armour": {
"id": "hands_basic_common",
"texture": "assets/gso/textures/armour/hands/hands_basic_common.png",
"stats": {
"health": 15,
"resistance": 0.04,
"defenceRating": 1,
"reflectChance": 0.0
}
}
}
}

View File

@ -1,14 +0,0 @@
{
"templates": {
"armour": {
"id": "hands_combat_rare",
"texture": "assets/gso/textures/armour/hands/hands_combat_rare.png",
"stats": {
"health": 30,
"resistance": 0.1,
"defenceRating": 3,
"reflectChance": 0.01
}
}
}
}

View File

@ -1,14 +0,0 @@
{
"templates": {
"armour": {
"id": "hands_elite_epic",
"texture": "assets/gso/textures/armour/hands/hands_elite_epic.png",
"stats": {
"health": 50,
"resistance": 0.18,
"defenceRating": 6,
"reflectChance": 0.025
}
}
}
}

View File

@ -1,14 +0,0 @@
{
"templates": {
"armour": {
"id": "helmet_basic_common",
"texture": "assets/gso/textures/armour/helmet/helmet_basic_common.png",
"stats": {
"health": 25,
"resistance": 0.05,
"defenceRating": 2,
"reflectChance": 0.0
}
}
}
}

View File

@ -1,14 +0,0 @@
{
"templates": {
"armour": {
"id": "helmet_reinforced_rare",
"texture": "assets/gso/textures/armour/helmet/helmet_reinforced_rare.png",
"stats": {
"health": 45,
"resistance": 0.12,
"defenceRating": 5,
"reflectChance": 0.01
}
}
}
}

View File

@ -1,14 +0,0 @@
{
"templates": {
"armour": {
"id": "helmet_tactical_epic",
"texture": "assets/gso/textures/armour/helmet/helmet_tactical_epic.png",
"stats": {
"health": 70,
"resistance": 0.2,
"defenceRating": 8,
"reflectChance": 0.03
}
}
}
}

View File

@ -1,14 +0,0 @@
{
"templates": {
"armour": {
"id": "pants_basic_common",
"texture": "assets/gso/textures/armour/pants/pants_basic_common.png",
"stats": {
"health": 30,
"resistance": 0.06,
"defenceRating": 2,
"reflectChance": 0.0
}
}
}
}

View File

@ -1,14 +0,0 @@
{
"templates": {
"armour": {
"id": "pants_exo_epic",
"texture": "assets/gso/textures/armour/pants/pants_exo_epic.png",
"stats": {
"health": 85,
"resistance": 0.22,
"defenceRating": 9,
"reflectChance": 0.03
}
}
}
}

View File

@ -1,14 +0,0 @@
{
"templates": {
"armour": {
"id": "pants_reinforced_rare",
"texture": "assets/gso/textures/armour/pants/pants_reinforced_rare.png",
"stats": {
"health": 55,
"resistance": 0.14,
"defenceRating": 5,
"reflectChance": 0.015
}
}
}
}

View File

@ -0,0 +1,28 @@
{
"templates": {
"armour": {
"id": "backpack_field_rare",
"texture": "assets/gso/textures/armour/backpack/backpack_field_rare.png",
"stats": {
"health": 40,
"resistance": 0.08,
"defenceRating": 3,
"reflectChance": 0.01
},
"name": "Backpack Field Rare",
"type": "armour",
"rarity": "rare",
"price": 3000,
"currency": "credits",
"description": "Backpack Field Rare.",
"categories": [
"shop",
"dungeon_loot"
],
"requirements": {
"level": 5
},
"stackable": false
}
}
}

View File

@ -0,0 +1,28 @@
{
"templates": {
"armour": {
"id": "backpack_reactor_epic",
"texture": "assets/gso/textures/armour/backpack/backpack_reactor_epic.png",
"stats": {
"health": 70,
"resistance": 0.15,
"defenceRating": 6,
"reflectChance": 0.03
},
"name": "Backpack Reactor Epic",
"type": "armour",
"rarity": "epic",
"price": 8000,
"currency": "credits",
"description": "Backpack Reactor Epic.",
"categories": [
"shop",
"dungeon_loot"
],
"requirements": {
"level": 10
},
"stackable": false
}
}
}

View File

@ -6,7 +6,7 @@
"type": "armour", "type": "armour",
"slot": "body", "slot": "body",
"rarity": "epic", "rarity": "epic",
"price": 300, "price": 18000,
"currency": "gems", "currency": "gems",
"description": "Powered exosuit that amplifies strength and endurance", "description": "Powered exosuit that amplifies strength and endurance",
"texture": "assets/gso/textures/armour/body/body_exosuit_epic.png", "texture": "assets/gso/textures/armour/body/body_exosuit_epic.png",

View File

@ -0,0 +1,28 @@
{
"templates": {
"armour": {
"id": "boots_assault_rare",
"texture": "assets/gso/textures/armour/boots/boots_assault_rare.png",
"stats": {
"health": 40,
"resistance": 0.12,
"defenceRating": 4,
"reflectChance": 0.01
},
"name": "Boots Assault Rare",
"type": "armour",
"rarity": "rare",
"price": 3000,
"currency": "credits",
"description": "Boots Assault Rare.",
"categories": [
"shop",
"dungeon_loot"
],
"requirements": {
"level": 5
},
"stackable": false
}
}
}

View File

@ -0,0 +1,28 @@
{
"templates": {
"armour": {
"id": "boots_gravity_epic",
"texture": "assets/gso/textures/armour/boots/boots_gravity_epic.png",
"stats": {
"health": 65,
"resistance": 0.2,
"defenceRating": 7,
"reflectChance": 0.025
},
"name": "Boots Gravity Epic",
"type": "armour",
"rarity": "epic",
"price": 8000,
"currency": "credits",
"description": "Boots Gravity Epic.",
"categories": [
"shop",
"dungeon_loot"
],
"requirements": {
"level": 10
},
"stackable": false
}
}
}

View File

@ -0,0 +1,28 @@
{
"templates": {
"armour": {
"id": "hands_basic_common",
"texture": "assets/gso/textures/armour/hands/hands_basic_common.png",
"stats": {
"health": 15,
"resistance": 0.04,
"defenceRating": 1,
"reflectChance": 0.0
},
"name": "Hands Basic Common",
"type": "armour",
"rarity": "common",
"price": 1000,
"currency": "credits",
"description": "Hands Basic Common.",
"categories": [
"shop",
"dungeon_loot"
],
"requirements": {
"level": 1
},
"stackable": false
}
}
}

View File

@ -0,0 +1,28 @@
{
"templates": {
"armour": {
"id": "hands_combat_rare",
"texture": "assets/gso/textures/armour/hands/hands_combat_rare.png",
"stats": {
"health": 30,
"resistance": 0.1,
"defenceRating": 3,
"reflectChance": 0.01
},
"name": "Hands Combat Rare",
"type": "armour",
"rarity": "rare",
"price": 3000,
"currency": "credits",
"description": "Hands Combat Rare.",
"categories": [
"shop",
"dungeon_loot"
],
"requirements": {
"level": 5
},
"stackable": false
}
}
}

View File

@ -0,0 +1,28 @@
{
"templates": {
"armour": {
"id": "hands_elite_epic",
"texture": "assets/gso/textures/armour/hands/hands_elite_epic.png",
"stats": {
"health": 50,
"resistance": 0.18,
"defenceRating": 6,
"reflectChance": 0.025
},
"name": "Hands Elite Epic",
"type": "armour",
"rarity": "epic",
"price": 8000,
"currency": "credits",
"description": "Hands Elite Epic.",
"categories": [
"shop",
"dungeon_loot"
],
"requirements": {
"level": 10
},
"stackable": false
}
}
}

View File

@ -0,0 +1,28 @@
{
"templates": {
"armour": {
"id": "helmet_tactical_epic",
"texture": "assets/gso/textures/armour/helmet/helmet_tactical_epic.png",
"stats": {
"health": 70,
"resistance": 0.2,
"defenceRating": 8,
"reflectChance": 0.03
},
"name": "Helmet Tactical Epic",
"type": "armour",
"rarity": "epic",
"price": 8000,
"currency": "credits",
"description": "Helmet Tactical Epic.",
"categories": [
"shop",
"dungeon_loot"
],
"requirements": {
"level": 10
},
"stackable": false
}
}
}

View File

@ -0,0 +1,28 @@
{
"templates": {
"armour": {
"id": "pants_exo_epic",
"texture": "assets/gso/textures/armour/pants/pants_exo_epic.png",
"stats": {
"health": 85,
"resistance": 0.22,
"defenceRating": 9,
"reflectChance": 0.03
},
"name": "Pants Exo Epic",
"type": "armour",
"rarity": "epic",
"price": 8000,
"currency": "credits",
"description": "Pants Exo Epic.",
"categories": [
"shop",
"dungeon_loot"
],
"requirements": {
"level": 10
},
"stackable": false
}
}
}

View File

@ -0,0 +1,28 @@
{
"templates": {
"armour": {
"id": "pants_reinforced_rare",
"texture": "assets/gso/textures/armour/pants/pants_reinforced_rare.png",
"stats": {
"health": 55,
"resistance": 0.14,
"defenceRating": 5,
"reflectChance": 0.015
},
"name": "Pants Reinforced Rare",
"type": "armour",
"rarity": "rare",
"price": 3000,
"currency": "credits",
"description": "Pants Reinforced Rare.",
"categories": [
"shop",
"dungeon_loot"
],
"requirements": {
"level": 5
},
"stackable": false
}
}
}

View File

@ -5,7 +5,7 @@
"name": "Credit Multiplier", "name": "Credit Multiplier",
"type": "consumable", "type": "consumable",
"rarity": "rare", "rarity": "rare",
"price": 50, "price": 6500,
"currency": "gems", "currency": "gems",
"description": "Doubles credits earned for 1 hour", "description": "Doubles credits earned for 1 hour",
"texture": "assets/gso/textures/consumables/credit_multiplier.png", "texture": "assets/gso/textures/consumables/credit_multiplier.png",

View File

@ -5,7 +5,7 @@
"name": "Max Energy Boost", "name": "Max Energy Boost",
"type": "consumable", "type": "consumable",
"rarity": "uncommon", "rarity": "uncommon",
"price": 100, "price": 2750,
"currency": "credits", "currency": "credits",
"description": "Restores full energy", "description": "Restores full energy",
"texture": "assets/gso/textures/consumables/energy_boost_large.png", "texture": "assets/gso/textures/consumables/energy_boost_large.png",

View File

@ -5,7 +5,7 @@
"name": "Energy Boost", "name": "Energy Boost",
"type": "consumable", "type": "consumable",
"rarity": "common", "rarity": "common",
"price": 30, "price": 1250,
"currency": "credits", "currency": "credits",
"description": "Restores 50 energy", "description": "Restores 50 energy",
"texture": "assets/gso/textures/consumables/energy_boost_small.png", "texture": "assets/gso/textures/consumables/energy_boost_small.png",

View File

@ -5,7 +5,7 @@
"name": "Fuel Cell", "name": "Fuel Cell",
"type": "consumable", "type": "consumable",
"rarity": "common", "rarity": "common",
"price": 20, "price": 1250,
"currency": "credits", "currency": "credits",
"description": "Restores 25 energy \u2014 handy for long dungeon runs", "description": "Restores 25 energy \u2014 handy for long dungeon runs",
"texture": "assets/gso/textures/consumables/fuel_cell.png", "texture": "assets/gso/textures/consumables/fuel_cell.png",

View File

@ -5,20 +5,16 @@
"name": "Large Health Kit", "name": "Large Health Kit",
"type": "consumable", "type": "consumable",
"rarity": "uncommon", "rarity": "uncommon",
"price": 150, "price": 1200,
"currency": "credits", "currency": "credits",
"description": "Restores full health", "description": "A comprehensive medical kit that restores significant hull integrity",
"texture": "assets/gso/textures/consumables/health_kit_large.png", "texture": "assets/gso/textures/consumables/health_kit_large.png",
"effect": { "effect": {
"heal": 999 "healAmount": 500,
}, "type": "heal"
"categories": [
"shop",
"dungeon_loot"
],
"requirements": {
"level": 1
}, },
"categories": ["shop", "dungeon_loot", "quest_reward"],
"requirements": { "level": 5 },
"stackable": true, "stackable": true,
"maxStack": 10 "maxStack": 10
} }

View File

@ -5,7 +5,7 @@
"name": "Small Health Kit", "name": "Small Health Kit",
"type": "consumable", "type": "consumable",
"rarity": "common", "rarity": "common",
"price": 50, "price": 1250,
"currency": "credits", "currency": "credits",
"description": "Restores 50 health", "description": "Restores 50 health",
"texture": "assets/gso/textures/consumables/health_kit_small.png", "texture": "assets/gso/textures/consumables/health_kit_small.png",

View File

@ -5,7 +5,7 @@
"name": "Small Scrap Pack", "name": "Small Scrap Pack",
"type": "consumable", "type": "consumable",
"rarity": "common", "rarity": "common",
"price": 0, "price": 350,
"currency": "credits", "currency": "credits",
"description": "A bundle of mixed crafting scraps", "description": "A bundle of mixed crafting scraps",
"texture": "assets/gso/textures/consumables/scrap_pack_small.png", "texture": "assets/gso/textures/consumables/scrap_pack_small.png",
@ -22,6 +22,7 @@
] ]
}, },
"categories": [ "categories": [
"shop",
"quest_reward", "quest_reward",
"dungeon_loot" "dungeon_loot"
], ],

View File

@ -5,7 +5,7 @@
"name": "Starter Crate", "name": "Starter Crate",
"type": "consumable", "type": "consumable",
"rarity": "uncommon", "rarity": "uncommon",
"price": 0, "price": 800,
"currency": "credits", "currency": "credits",
"description": "A crate of starter supplies for new recruits", "description": "A crate of starter supplies for new recruits",
"texture": "assets/gso/textures/consumables/starter_crate.png", "texture": "assets/gso/textures/consumables/starter_crate.png",
@ -26,6 +26,7 @@
] ]
}, },
"categories": [ "categories": [
"shop",
"quest_reward", "quest_reward",
"starter" "starter"
], ],

View File

@ -5,7 +5,7 @@
"name": "XP Booster", "name": "XP Booster",
"type": "consumable", "type": "consumable",
"rarity": "rare", "rarity": "rare",
"price": 75, "price": 6500,
"currency": "gems", "currency": "gems",
"description": "Doubles XP gained for 30 minutes", "description": "Doubles XP gained for 30 minutes",
"texture": "assets/gso/textures/consumables/xp_booster.png", "texture": "assets/gso/textures/consumables/xp_booster.png",

View File

@ -0,0 +1,24 @@
{
"templates": {
"decoration": {
"id": "room_armory",
"name": "Armory Wing",
"type": "decoration",
"subtype": "room_unlock",
"rarity": "rare",
"price": 5000,
"currency": "credits",
"description": "Unlock the Armory Wing of your starbase. Houses weapon racks, armour stands, and a personal combat trainer.",
"texture": "assets/gso/textures/decorations/room_armory.png",
"roomId": "left_wing",
"categories": [
"shop",
"decoration"
],
"stackable": false,
"requirements": {
"level": 8
}
}
}
}

View File

@ -0,0 +1,24 @@
{
"templates": {
"decoration": {
"id": "room_operations",
"name": "Operations Centre",
"type": "decoration",
"subtype": "room_unlock",
"rarity": "epic",
"price": 200,
"currency": "gems",
"description": "Unlock the Operations Centre. A private command room for coordinating missions and monitoring your empire.",
"texture": "assets/gso/textures/decorations/room_operations.png",
"roomId": "operations",
"categories": [
"shop",
"decoration"
],
"stackable": false,
"requirements": {
"level": 16
}
}
}
}

View File

@ -0,0 +1,24 @@
{
"templates": {
"decoration": {
"id": "room_research_lab",
"name": "Research Lab",
"type": "decoration",
"subtype": "room_unlock",
"rarity": "rare",
"price": 6000,
"currency": "credits",
"description": "Unlock the Research Lab. Advanced crafting terminals and science equipment for developing new technologies.",
"texture": "assets/gso/textures/decorations/room_research_lab.png",
"roomId": "right_wing",
"categories": [
"shop",
"decoration"
],
"stackable": false,
"requirements": {
"level": 8
}
}
}
}

View File

@ -0,0 +1,24 @@
{
"templates": {
"decoration": {
"id": "room_throne",
"name": "Throne Room",
"type": "decoration",
"subtype": "room_unlock",
"rarity": "legendary",
"price": 0,
"currency": "credits",
"description": "A legendary throne room earned only by those who have completed the Commander's Story Arc.",
"texture": "assets/gso/textures/decorations/room_throne.png",
"roomId": "throne_room",
"categories": [
"quest_reward",
"decoration"
],
"stackable": false,
"requirements": {
"level": 24
}
}
}
}

View File

@ -0,0 +1,24 @@
{
"templates": {
"decoration": {
"id": "room_vault",
"name": "Commander's Vault",
"type": "decoration",
"subtype": "room_unlock",
"rarity": "epic",
"price": 0,
"currency": "credits",
"description": "A legendary vault room \u2014 only accessible to those who have conquered the Corrupted Vault dungeon.",
"texture": "assets/gso/textures/decorations/room_vault.png",
"roomId": "commanders_vault",
"categories": [
"dungeon_loot",
"decoration"
],
"stackable": false,
"requirements": {
"level": 16
}
}
}
}

View File

@ -0,0 +1,33 @@
{
"templates": {
"decoration": {
"id": "wp_alien_ruins",
"name": "Alien Ruins",
"type": "decoration",
"subtype": "wallpaper",
"rarity": "epic",
"price": 0,
"currency": "credits",
"description": "Cryptic green glyphs on ancient stone. Salvaged from the Alien Ruins dungeon.",
"texture": "assets/gso/textures/decorations/wp_alien_ruins.png",
"preview": {
"floorColorEven": "#0a1508",
"floorColorOdd": "#081208",
"wallColor": "#44ff88",
"wallColorLeft": "#0a1e0a",
"wallColorRight": "#081808",
"wallColorTop": "#102a10",
"doorColor": "#88ffaa",
"doorFrameColor": "#44cc66"
},
"categories": [
"dungeon_loot",
"decoration"
],
"stackable": false,
"requirements": {
"level": 16
}
}
}
}

View File

@ -0,0 +1,12 @@
{
"templates": { "decoration": {
"id": "wp_arctic_station", "name": "Arctic Station", "type": "decoration",
"subtype": "wallpaper", "rarity": "uncommon", "price": 1000, "currency": "credits",
"description": "Crisp whites and icy blues. A frozen outpost at the edge of the galaxy.",
"texture": "assets/gso/textures/decorations/wp_arctic_station.png",
"preview": { "floorColorEven": "#0e1820", "floorColorOdd": "#0c1418",
"wallColor": "#aaddff", "wallColorLeft": "#0c1828", "wallColorRight": "#0a1420", "wallColorTop": "#122030",
"doorColor": "#ddeeff", "doorFrameColor": "#88ccff" },
"categories": ["shop", "decoration"], "stackable": false
}}
}

View File

@ -0,0 +1,12 @@
{
"templates": { "decoration": {
"id": "wp_deep_ocean", "name": "Deep Ocean", "type": "decoration",
"subtype": "wallpaper", "rarity": "uncommon", "price": 900, "currency": "credits",
"description": "Bioluminescent blues and teals. Like a starbase built beneath an alien sea.",
"texture": "assets/gso/textures/decorations/wp_deep_ocean.png",
"preview": { "floorColorEven": "#081820", "floorColorOdd": "#061418",
"wallColor": "#00cccc", "wallColorLeft": "#062030", "wallColorRight": "#041820", "wallColorTop": "#083040",
"doorColor": "#00ffee", "doorFrameColor": "#00bbcc" },
"categories": ["shop", "decoration"], "stackable": false
}}
}

View File

@ -0,0 +1,33 @@
{
"templates": {
"decoration": {
"id": "wp_golden_empire",
"name": "Golden Empire",
"type": "decoration",
"subtype": "wallpaper",
"rarity": "epic",
"price": 150,
"currency": "gems",
"description": "Opulent golds and deep bronzes. Reserved for commanders of the highest rank.",
"texture": "assets/gso/textures/decorations/wp_golden_empire.png",
"preview": {
"floorColorEven": "#1a1200",
"floorColorOdd": "#140e00",
"wallColor": "#ffcc00",
"wallColorLeft": "#221500",
"wallColorRight": "#1a1000",
"wallColorTop": "#2e1c00",
"doorColor": "#ffee88",
"doorFrameColor": "#ddaa00"
},
"categories": [
"shop",
"decoration"
],
"stackable": false,
"requirements": {
"level": 16
}
}
}
}

View File

@ -0,0 +1,33 @@
{
"templates": {
"decoration": {
"id": "wp_lava_forge",
"name": "Lava Forge",
"type": "decoration",
"subtype": "wallpaper",
"rarity": "rare",
"price": 2000,
"currency": "credits",
"description": "Volcanic orange and molten red. A station carved from the heart of a dying star.",
"texture": "assets/gso/textures/decorations/wp_lava_forge.png",
"preview": {
"floorColorEven": "#1e0a00",
"floorColorOdd": "#180800",
"wallColor": "#ff4400",
"wallColorLeft": "#2a0800",
"wallColorRight": "#200600",
"wallColorTop": "#350a00",
"doorColor": "#ffaa00",
"doorFrameColor": "#ff6600"
},
"categories": [
"shop",
"decoration"
],
"stackable": false,
"requirements": {
"level": 8
}
}
}
}

View File

@ -0,0 +1,12 @@
{
"templates": { "decoration": {
"id": "wp_nebula_dawn", "name": "Nebula Dawn", "type": "decoration",
"subtype": "wallpaper", "rarity": "uncommon", "price": 800, "currency": "credits",
"description": "Soft pink and purple nebula clouds. A peaceful dawn among the stars.",
"texture": "assets/gso/textures/decorations/wp_nebula_dawn.png",
"preview": { "floorColorEven": "#1a1228", "floorColorOdd": "#150e20",
"wallColor": "#cc66ff", "wallColorLeft": "#1a0a28", "wallColorRight": "#140820", "wallColorTop": "#220d35",
"doorColor": "#ff88ff", "doorFrameColor": "#cc44cc" },
"categories": ["shop", "decoration"], "stackable": false
}}
}

View File

@ -0,0 +1,33 @@
{
"templates": {
"decoration": {
"id": "wp_void_black",
"name": "Void Black",
"type": "decoration",
"subtype": "wallpaper",
"rarity": "rare",
"price": 1500,
"currency": "credits",
"description": "Absolute darkness. The walls absorb all light \u2014 only edges glow.",
"texture": "assets/gso/textures/decorations/wp_void_black.png",
"preview": {
"floorColorEven": "#060608",
"floorColorOdd": "#040406",
"wallColor": "#444455",
"wallColorLeft": "#0a0a0f",
"wallColorRight": "#060608",
"wallColorTop": "#111118",
"doorColor": "#8888ff",
"doorFrameColor": "#6666cc"
},
"categories": [
"shop",
"decoration"
],
"stackable": false,
"requirements": {
"level": 8
}
}
}
}

View File

@ -0,0 +1,33 @@
{
"templates": {
"decoration": {
"id": "wp_void_rift",
"name": "Void Rift",
"type": "decoration",
"subtype": "wallpaper",
"rarity": "legendary",
"price": 0,
"currency": "credits",
"description": "Fractured space-time tears through the walls. Only found deep in the Void Rift.",
"texture": "assets/gso/textures/decorations/wp_void_rift.png",
"preview": {
"floorColorEven": "#060010",
"floorColorOdd": "#04000c",
"wallColor": "#8800ff",
"wallColorLeft": "#0c0020",
"wallColorRight": "#080018",
"wallColorTop": "#100028",
"doorColor": "#cc44ff",
"doorFrameColor": "#9900ee"
},
"categories": [
"dungeon_loot",
"decoration"
],
"stackable": false,
"requirements": {
"level": 24
}
}
}
}

View File

@ -8,6 +8,20 @@
"resistance": 0.0, "resistance": 0.0,
"defenceRating": 0, "defenceRating": 0,
"reflectChance": 0.0 "reflectChance": 0.0
},
"name": "Ballistic Alloy Common",
"type": "hullPlating",
"rarity": "common",
"price": 500,
"currency": "credits",
"description": "Ballistic Alloy Common.",
"categories": [
"shop",
"dungeon_loot"
],
"stackable": true,
"requirements": {
"level": 1
} }
} }
} }

View File

@ -8,6 +8,20 @@
"resistance": 0.0, "resistance": 0.0,
"defenceRating": 0, "defenceRating": 0,
"reflectChance": 0.0 "reflectChance": 0.0
},
"name": "Carbon Titanium Composite Common",
"type": "hullPlating",
"rarity": "common",
"price": 500,
"currency": "credits",
"description": "Carbon Titanium Composite Common.",
"categories": [
"shop",
"dungeon_loot"
],
"stackable": true,
"requirements": {
"level": 1
} }
} }
} }

View File

@ -8,6 +8,20 @@
"resistance": 0.0, "resistance": 0.0,
"defenceRating": 0, "defenceRating": 0,
"reflectChance": 0.0 "reflectChance": 0.0
},
"name": "Chrono Alloy Common",
"type": "hullPlating",
"rarity": "common",
"price": 500,
"currency": "credits",
"description": "Chrono Alloy Common.",
"categories": [
"shop",
"dungeon_loot"
],
"stackable": true,
"requirements": {
"level": 1
} }
} }
} }

View File

@ -8,6 +8,20 @@
"resistance": 0.0, "resistance": 0.0,
"defenceRating": 0, "defenceRating": 0,
"reflectChance": 0.0 "reflectChance": 0.0
},
"name": "Dimensional Alloy Common",
"type": "hullPlating",
"rarity": "common",
"price": 500,
"currency": "credits",
"description": "Dimensional Alloy Common.",
"categories": [
"shop",
"dungeon_loot"
],
"stackable": true,
"requirements": {
"level": 1
} }
} }
} }

View File

@ -8,6 +8,20 @@
"resistance": 0.0, "resistance": 0.0,
"defenceRating": 0, "defenceRating": 0,
"reflectChance": 0.0 "reflectChance": 0.0
},
"name": "Flux Core Alloy Common",
"type": "hullPlating",
"rarity": "common",
"price": 500,
"currency": "credits",
"description": "Flux Core Alloy Common.",
"categories": [
"shop",
"dungeon_loot"
],
"stackable": true,
"requirements": {
"level": 1
} }
} }
} }

View File

@ -8,6 +8,20 @@
"resistance": 0.0, "resistance": 0.0,
"defenceRating": 0, "defenceRating": 0,
"reflectChance": 0.0 "reflectChance": 0.0
},
"name": "Neutronium Composite Common",
"type": "hullPlating",
"rarity": "common",
"price": 500,
"currency": "credits",
"description": "Neutronium Composite Common.",
"categories": [
"shop",
"dungeon_loot"
],
"stackable": true,
"requirements": {
"level": 1
} }
} }
} }

View File

@ -8,6 +8,20 @@
"resistance": 0.0, "resistance": 0.0,
"defenceRating": 0, "defenceRating": 0,
"reflectChance": 0.0 "reflectChance": 0.0
},
"name": "Phase Alloy Common",
"type": "hullPlating",
"rarity": "common",
"price": 500,
"currency": "credits",
"description": "Phase Alloy Common.",
"categories": [
"shop",
"dungeon_loot"
],
"stackable": true,
"requirements": {
"level": 1
} }
} }
} }

View File

@ -8,6 +8,20 @@
"resistance": 0.0, "resistance": 0.0,
"defenceRating": 0, "defenceRating": 0,
"reflectChance": 0.0 "reflectChance": 0.0
},
"name": "Plasma Channel Alloy Common",
"type": "hullPlating",
"rarity": "common",
"price": 500,
"currency": "credits",
"description": "Plasma Channel Alloy Common.",
"categories": [
"shop",
"dungeon_loot"
],
"stackable": true,
"requirements": {
"level": 1
} }
} }
} }

View File

@ -8,6 +8,20 @@
"resistance": 0.0, "resistance": 0.0,
"defenceRating": 0, "defenceRating": 0,
"reflectChance": 0.0 "reflectChance": 0.0
},
"name": "Reinforced Steel Common",
"type": "hullPlating",
"rarity": "common",
"price": 500,
"currency": "credits",
"description": "Reinforced Steel Common.",
"categories": [
"shop",
"dungeon_loot"
],
"stackable": true,
"requirements": {
"level": 1
} }
} }
} }

View File

@ -8,6 +8,20 @@
"resistance": 0.0, "resistance": 0.0,
"defenceRating": 0, "defenceRating": 0,
"reflectChance": 0.0 "reflectChance": 0.0
},
"name": "Superconductive Alloy Common",
"type": "hullPlating",
"rarity": "common",
"price": 500,
"currency": "credits",
"description": "Superconductive Alloy Common.",
"categories": [
"shop",
"dungeon_loot"
],
"stackable": true,
"requirements": {
"level": 1
} }
} }
} }

View File

@ -8,6 +8,20 @@
"resistance": 0.0, "resistance": 0.0,
"defenceRating": 0, "defenceRating": 0,
"reflectChance": 0.0 "reflectChance": 0.0
},
"name": "Voidsteel Common",
"type": "hullPlating",
"rarity": "common",
"price": 500,
"currency": "credits",
"description": "Voidsteel Common.",
"categories": [
"shop",
"dungeon_loot"
],
"stackable": true,
"requirements": {
"level": 1
} }
} }
} }

Some files were not shown because too many files have changed in this diff Show More