This commit is contained in:
2025-12-08 17:49:30 +01:00
parent 2c446abbbb
commit 3096490a0c
8 changed files with 905 additions and 179 deletions

193
src/systems/MountSystem.js Normal file
View File

@@ -0,0 +1,193 @@
/**
* MOUNT SYSTEM
* Handles rideable animals (Donkey, Horse, etc.)
*/
class MountSystem {
constructor(scene, player) {
this.scene = scene;
this.player = player;
this.currentMount = null;
this.isMounted = false;
// Mount definitions
this.mountData = {
'donkey': {
name: 'Donkey',
speed: 200, // Movement speed when mounted
texture: 'donkey',
inventorySlots: 10, // Extra inventory from saddlebags
color: 0x8B7355 // Brown
},
'horse': {
name: 'Horse',
speed: 300,
texture: 'horse',
inventorySlots: 5,
color: 0x654321
}
};
}
/**
* Spawn a mount in the world
*/
spawnMount(gridX, gridY, type) {
if (!this.mountData[type]) {
console.error('Unknown mount type:', type);
return null;
}
const data = this.mountData[type];
const screenPos = this.scene.iso.toScreen(gridX, gridY);
const mount = {
type,
gridX,
gridY,
sprite: null,
inventory: [], // Saddlebag storage
tamed: true
};
// Create sprite
mount.sprite = this.scene.add.sprite(
screenPos.x + this.scene.terrainOffsetX,
screenPos.y + this.scene.terrainOffsetY,
data.texture || 'npc_zombie' // Fallback
);
mount.sprite.setOrigin(0.5, 1);
mount.sprite.setScale(0.4);
mount.sprite.setTint(data.color);
mount.sprite.setDepth(this.scene.iso.getDepth(gridX, gridY, this.scene.iso.LAYER_OBJECTS));
mount.sprite.setInteractive({ useHandCursor: true });
mount.sprite.on('pointerdown', () => {
this.mountUp(mount);
});
console.log(`🐴 Spawned ${data.name} at ${gridX},${gridY}`);
return mount;
}
/**
* Mount up on a donkey/horse
*/
mountUp(mount) {
if (this.isMounted) {
console.log('Already mounted!');
return;
}
this.currentMount = mount;
this.isMounted = true;
const data = this.mountData[mount.type];
// Hide mount sprite
mount.sprite.setVisible(false);
// Increase player speed
if (this.player) {
this.player.originalSpeed = this.player.speed || 100;
this.player.speed = data.speed;
}
// Visual feedback
this.scene.events.emit('show-floating-text', {
x: this.player.sprite.x,
y: this.player.sprite.y - 40,
text: `🐴 Mounted ${data.name}!`,
color: '#ffaa00'
});
console.log(`🐴 Mounted on ${data.name}! Speed: ${data.speed}`);
}
/**
* Dismount
*/
dismount() {
if (!this.isMounted || !this.currentMount) {
return;
}
const mount = this.currentMount;
const data = this.mountData[mount.type];
// Restore player speed
if (this.player && this.player.originalSpeed) {
this.player.speed = this.player.originalSpeed;
}
// Place mount at player location
const playerPos = this.player.getPosition();
mount.gridX = Math.round(playerPos.x);
mount.gridY = Math.round(playerPos.y);
const screenPos = this.scene.iso.toScreen(mount.gridX, mount.gridY);
mount.sprite.setPosition(
screenPos.x + this.scene.terrainOffsetX,
screenPos.y + this.scene.terrainOffsetY
);
mount.sprite.setVisible(true);
// Visual feedback
this.scene.events.emit('show-floating-text', {
x: this.player.sprite.x,
y: this.player.sprite.y - 40,
text: `Dismounted`,
color: '#888888'
});
this.currentMount = null;
this.isMounted = false;
console.log(`🐴 Dismounted from ${data.name}`);
}
/**
* Toggle mount/dismount (E key)
*/
toggleMount() {
if (this.isMounted) {
this.dismount();
} else {
// Try to find nearby mount
const nearbyMount = this.findNearbyMount();
if (nearbyMount) {
this.mountUp(nearbyMount);
}
}
}
findNearbyMount() {
// TODO: Search for mounts near player
return null;
}
/**
* Access saddlebag inventory
*/
openSaddlebag() {
if (!this.isMounted || !this.currentMount) {
return null;
}
const data = this.mountData[this.currentMount.type];
console.log(`🎒 Opening saddlebag (${data.inventorySlots} slots)`);
return this.currentMount.inventory;
}
update(delta) {
// Update mount position if mounted
if (this.isMounted && this.currentMount && this.player) {
const playerPos = this.player.getPosition();
this.currentMount.gridX = Math.round(playerPos.x);
this.currentMount.gridY = Math.round(playerPos.y);
}
}
isMountedOnAnything() {
return this.isMounted;
}
}