Game-Server/Client/js/systems/ShipSystem.js
2026-01-26 18:46:53 -04:00

248 lines
9.0 KiB
JavaScript

class ShipSystem {
constructor(game) {
this.game = game;
this.ships = [];
this.currentShip = null;
this.initializeShips();
}
initializeShips() {
// Initialize with player's current ship instead of static data
this.ships = [];
// Wait for game systems to be ready, then sync with player ship
setTimeout(() => {
this.syncWithPlayerShip();
}, 100);
}
syncWithPlayerShip() {
const player = this.game.systems.player;
if (!player || !player.ship) {
return;
}
if (player && player.ship) {
// Create ship object from player's current ship
const playerShip = {
id: 'current_ship',
name: player.ship.name || 'Starter Cruiser',
class: player.ship.class || 'Cruiser',
level: player.ship.level || 1,
health: player.ship.health || player.ship.maxHealth || 100,
maxHealth: player.ship.maxHealth || 100,
attack: player.ship.attack || player.attributes.attack || 10,
defense: player.ship.defence || player.attributes.defense || 5,
speed: player.ship.speed || player.attributes.speed || 10,
image: player.ship.texture || 'assets/textures/ships/starter_cruiser.png',
status: 'active',
experience: 0,
requiredExp: 100,
rarity: 'Common'
};
this.ships = [playerShip];
this.currentShip = playerShip;
// Update the display immediately
this.updateCurrentShipDisplay();
}
}
renderShips() {
const shipGrid = document.getElementById('shipGrid');
if (!shipGrid) return;
shipGrid.innerHTML = '';
this.ships.forEach(ship => {
const shipCard = this.createShipCard(ship);
shipGrid.appendChild(shipCard);
});
}
/**
* Get ship image URL from server or local
*/
getShipImageUrl(ship) {
if (!ship) return 'https://dev.gameserver.galaxystrike.online/images/ui/placeholder.png';
// For multiplayer, get from server
if (window.smartSaveManager?.isMultiplayer && window.game?.socket) {
const serverUrl = window.game.socket.io?.uri?.replace('/socket.io', '') || process.env.SERVER_URL || 'https://dev.gameserver.galaxystrike.online';
return `${serverUrl}/images/ships/${ship.id}.png`;
}
// For singleplayer, use local path
return ship.image || ship.texture || 'assets/textures/ships/starter_cruiser.png';
}
createShipCard(ship) {
const card = document.createElement('div');
card.className = `ship-card ${ship.status === 'active' ? 'active' : ''}`;
card.dataset.shipId = ship.id;
card.innerHTML = `
<div class="ship-card-header">
<img src="${this.getShipImageUrl(ship)}" alt="${ship.name}"
onerror="this.src='${window.smartSaveManager?.isMultiplayer ? 'https://dev.gameserver.galaxystrike.online/images/ui/placeholder.png' : 'assets/textures/missing-texture.png'}'"
class="ship-card-image">
<div class="ship-card-info">
<div class="ship-card-rarity ${ship.rarity.toLowerCase()}">${ship.rarity}</div>
</div>
</div>
`;
return card;
}
updateCurrentShipDisplay() {
// Use player's ship data instead of this.currentShip
const player = this.game.systems.player;
if (!player || !player.ship) {
return;
}
const elements = {
currentShipImage: document.getElementById('currentShipImage'),
currentShipName: document.getElementById('currentShipName'),
currentShipClass: document.getElementById('currentShipClass'),
currentShipLevel: document.getElementById('currentShipLevel'),
currentShipHealth: document.getElementById('currentShipHealth'),
currentShipAttack: document.getElementById('currentShipAttack'),
currentShipDefense: document.getElementById('currentShipDefense'),
currentShipSpeed: document.getElementById('currentShipSpeed')
};
// Use player's ship data
const ship = player.ship;
if (elements.currentShipImage) {
// Use server image for multiplayer, local for singleplayer
let imagePath;
if (window.smartSaveManager?.isMultiplayer && window.game?.socket) {
const serverUrl = window.game.socket.io?.uri?.replace('/socket.io', '') || 'http://localhost:3002';
imagePath = `${serverUrl}/images/ships/${ship.class || 'starter_cruiser'}.png`;
} else {
imagePath = ship.texture || `assets/textures/ships/starter_cruiser.png`;
}
elements.currentShipImage.src = imagePath;
elements.currentShipImage.alt = ship.name;
elements.currentShipImage.onerror = function() {
this.src = window.smartSaveManager?.isMultiplayer ?
'https://dev.gameserver.galaxystrike.online/images/ui/placeholder.png' :
'assets/textures/missing-texture.png';
};
}
if (elements.currentShipName) elements.currentShipName.textContent = ship.name;
if (elements.currentShipClass) elements.currentShipClass.textContent = ship.class || 'Unknown';
if (elements.currentShipLevel) elements.currentShipLevel.textContent = ship.level || 1;
if (elements.currentShipHealth) elements.currentShipHealth.textContent = `${ship.health}/${ship.maxHealth}`;
if (elements.currentShipAttack) elements.currentShipAttack.textContent = ship.attack || 0;
if (elements.currentShipDefense) elements.currentShipDefense.textContent = ship.defence || ship.defense || 0;
if (elements.currentShipSpeed) elements.currentShipSpeed.textContent = ship.speed || 0;
}
switchShip(shipId) {
const ship = this.ships.find(s => s.id === shipId);
if (!ship || ship.status === 'active') return;
// Deactivate current ship
if (this.currentShip) {
this.currentShip.status = 'inactive';
}
// Activate new ship
ship.status = 'active';
this.currentShip = ship;
// Update displays
this.renderShips();
this.updateCurrentShipDisplay();
// Show notification
this.game.showNotification(`Switched to ${ship.name}!`, 'success', 3000);
}
upgradeShip(shipId) {
const ship = this.ships.find(s => s.id === shipId);
if (!ship) return;
const upgradeCost = ship.level * 1000;
if (this.game.systems.economy.getCredits() < upgradeCost) {
this.game.showNotification(`Not enough credits! Need ${upgradeCost} credits.`, 'error', 3000);
return;
}
// Upgrade ship
this.game.systems.economy.removeCredits(upgradeCost);
ship.level++;
ship.maxHealth += 10;
ship.health = ship.maxHealth; // Full heal on upgrade
ship.attack += 2;
ship.defense += 1;
ship.speed += 1;
ship.requiredExp = ship.level * 100;
// Update displays
this.renderShips();
this.updateCurrentShipDisplay();
this.game.showNotification(`${ship.name} upgraded to level ${ship.level}!`, 'success', 3000);
}
repairShip(shipId) {
const ship = this.ships.find(s => s.id === shipId);
if (!ship || ship.health >= ship.maxHealth) return;
const repairCost = Math.floor((ship.maxHealth - ship.health) * 0.5);
if (this.game.systems.economy.getCredits() < repairCost) {
this.game.showNotification(`Not enough credits! Need ${repairCost} credits.`, 'error', 3000);
return;
}
// Repair ship
this.game.systems.economy.removeCredits(repairCost);
ship.health = ship.maxHealth;
// Update displays
this.renderShips();
this.updateCurrentShipDisplay();
this.game.showNotification(`${ship.name} fully repaired!`, 'success', 3000);
}
addExperience(shipId, amount) {
const ship = this.ships.find(s => s.id === shipId);
if (!ship) return;
ship.experience += amount;
// Check for level up
while (ship.experience >= ship.requiredExp) {
ship.experience -= ship.requiredExp;
this.upgradeShip(shipId);
}
this.renderShips();
if (this.currentShip && this.currentShip.id === shipId) {
this.updateCurrentShipDisplay();
}
}
getShip(shipId) {
return this.ships.find(s => s.id === shipId);
}
getCurrentShip() {
return this.currentShip;
}
getAllShips() {
return this.ships;
}
}