248 lines
9.0 KiB
JavaScript
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;
|
|
}
|
|
}
|