phase 11 part1
This commit is contained in:
160
src/systems/ScooterRepairSystem.js
Normal file
160
src/systems/ScooterRepairSystem.js
Normal file
@@ -0,0 +1,160 @@
|
||||
/**
|
||||
* SCOOTER REPAIR SYSTEM
|
||||
* Broken scooter needs parts + tools to repair before being driveable
|
||||
*/
|
||||
class ScooterRepairSystem {
|
||||
constructor(scene) {
|
||||
this.scene = scene;
|
||||
|
||||
// Required parts for repair
|
||||
this.requiredParts = {
|
||||
scooter_engine: 1,
|
||||
scooter_wheel: 2,
|
||||
scooter_fuel_tank: 1,
|
||||
scooter_handlebars: 1
|
||||
};
|
||||
|
||||
// Required tools
|
||||
this.requiredTools = {
|
||||
wrench: 1,
|
||||
screwdriver: 1
|
||||
};
|
||||
|
||||
this.isRepaired = false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if player has all required parts
|
||||
*/
|
||||
hasAllParts() {
|
||||
const inv = this.scene.inventorySystem;
|
||||
if (!inv) return false;
|
||||
|
||||
for (const [part, count] of Object.entries(this.requiredParts)) {
|
||||
if (!inv.hasItem(part) || inv.getItemCount(part) < count) {
|
||||
console.log(`🚫 Missing: ${part} (Need ${count})`);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if player has required tools
|
||||
*/
|
||||
hasAllTools() {
|
||||
const inv = this.scene.inventorySystem;
|
||||
if (!inv) return false;
|
||||
|
||||
for (const [tool, count] of Object.entries(this.requiredTools)) {
|
||||
if (!inv.hasItem(tool) || inv.getItemCount(tool) < count) {
|
||||
console.log(`🚫 Missing tool: ${tool} (Need ${count})`);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Attempt to repair scooter
|
||||
*/
|
||||
repairScooter() {
|
||||
if (this.isRepaired) {
|
||||
console.log('✅ Scooter already repaired!');
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!this.hasAllParts()) {
|
||||
console.log('🚫 Missing required parts!');
|
||||
this.listMissingParts();
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!this.hasAllTools()) {
|
||||
console.log('🚫 Missing required tools!');
|
||||
return false;
|
||||
}
|
||||
|
||||
// Consume parts (tools are NOT consumed)
|
||||
const inv = this.scene.inventorySystem;
|
||||
for (const [part, count] of Object.entries(this.requiredParts)) {
|
||||
inv.removeItem(part, count);
|
||||
}
|
||||
|
||||
this.isRepaired = true;
|
||||
console.log('✅🛵 SCOOTER REPAIRED! Press V to drive!');
|
||||
|
||||
// Find scooter entity and enable it
|
||||
if (this.scene.vehicles) {
|
||||
for (const vehicle of this.scene.vehicles) {
|
||||
if (vehicle.type === 'scooter') {
|
||||
vehicle.isEnabled = true;
|
||||
vehicle.updateVisual(); // Make it look new
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Visual feedback
|
||||
this.scene.events.emit('show-floating-text', {
|
||||
x: this.scene.player.sprite.x,
|
||||
y: this.scene.player.sprite.y - 100,
|
||||
text: '🛵 REPAIRED!',
|
||||
color: '#00FF00'
|
||||
});
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* List missing parts for repair
|
||||
*/
|
||||
listMissingParts() {
|
||||
const inv = this.scene.inventorySystem;
|
||||
if (!inv) return;
|
||||
|
||||
console.log('📋 SCOOTER REPAIR CHECKLIST:');
|
||||
console.log('===========================');
|
||||
|
||||
console.log('PARTS:');
|
||||
for (const [part, needed] of Object.entries(this.requiredParts)) {
|
||||
const has = inv.getItemCount(part) || 0;
|
||||
const status = has >= needed ? '✅' : '🚫';
|
||||
console.log(`${status} ${part}: ${has}/${needed}`);
|
||||
}
|
||||
|
||||
console.log('\nTOOLS:');
|
||||
for (const [tool, needed] of Object.entries(this.requiredTools)) {
|
||||
const has = inv.getItemCount(tool) || 0;
|
||||
const status = has >= needed ? '✅' : '🚫';
|
||||
console.log(`${status} ${tool}: ${has}/${needed}`);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Spawn scooter part as loot
|
||||
*/
|
||||
spawnPart(x, y, partType) {
|
||||
if (!this.scene.interactionSystem) return;
|
||||
|
||||
const validParts = Object.keys(this.requiredParts);
|
||||
const part = partType || validParts[Math.floor(Math.random() * validParts.length)];
|
||||
|
||||
this.scene.interactionSystem.spawnLoot(x, y, part, 1);
|
||||
console.log(`🔧 Spawned scooter part: ${part} at ${x},${y}`);
|
||||
}
|
||||
|
||||
/**
|
||||
* Random loot drop chance for parts (from zombies, chests, etc.)
|
||||
*/
|
||||
tryDropPart(x, y, dropChance = 0.1) {
|
||||
if (this.isRepaired) return; // Don't drop if already repaired
|
||||
|
||||
if (Math.random() < dropChance) {
|
||||
this.spawnPart(x, y);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user