phase 11 part1
This commit is contained in:
@@ -1,27 +1,163 @@
|
||||
/**
|
||||
* EXPANSION SYSTEM
|
||||
* - Manages Unlockable Zones (Farm, Forest, City...)
|
||||
* - Fog of War logic (Visual blocking)
|
||||
* - Unlock costs and requirements
|
||||
*/
|
||||
class ExpansionSystem {
|
||||
constructor(scene) {
|
||||
this.scene = scene;
|
||||
this.unlockedZones = ['FARM_START']; // List of IDs
|
||||
this.islandsDiscovered = [];
|
||||
console.log('🌍 ExpansionSystem: Initialized');
|
||||
|
||||
// Define Zones
|
||||
this.zones = {
|
||||
'farm': {
|
||||
id: 'farm',
|
||||
name: 'Starter Farm',
|
||||
x: 0, y: 0, w: 40, h: 40, // 0-40 coordinates
|
||||
unlocked: true,
|
||||
cost: 0,
|
||||
color: 0x00FF00
|
||||
},
|
||||
'forest': {
|
||||
id: 'forest',
|
||||
name: 'Dark Forest',
|
||||
x: 40, y: 0, w: 60, h: 40, // Right of farm
|
||||
unlocked: false,
|
||||
cost: 100, // 100 Gold Coins
|
||||
req: 'None',
|
||||
color: 0x006400
|
||||
},
|
||||
'city': {
|
||||
id: 'city',
|
||||
name: 'Ruined City',
|
||||
x: 0, y: 40, w: 100, h: 60, // Below farm & forest
|
||||
unlocked: false,
|
||||
cost: 500,
|
||||
req: 'Kill Boss',
|
||||
color: 0x808080
|
||||
}
|
||||
};
|
||||
|
||||
// Fog Graphics
|
||||
this.fogGraphics = this.scene.add.graphics();
|
||||
this.fogGraphics.setDepth(9999); // Very high depth
|
||||
this.fogGraphics.setScrollFactor(1); // Moves with camera? No, world coordinates.
|
||||
// wait, graphics draw in world coords? Yes if not scrollFactor 0
|
||||
// We want it to cover the world terrain.
|
||||
|
||||
this.drawFog();
|
||||
}
|
||||
|
||||
// Preveri, če je igralec v dovoljeni coni
|
||||
checkAccess(x, y) {
|
||||
// TODO: Map coordinates to Zone ID
|
||||
/**
|
||||
* Unlock a zone
|
||||
*/
|
||||
unlockZone(zoneId) {
|
||||
const zone = this.zones[zoneId];
|
||||
if (!zone) return false;
|
||||
if (zone.unlocked) return false; // Already unlocked
|
||||
|
||||
// Check Logic (Payment) would be here or called before.
|
||||
// For now, just unlock logic.
|
||||
|
||||
zone.unlocked = true;
|
||||
console.log(`🗺️ Zone Unlocked: ${zone.name}`);
|
||||
|
||||
// Visual feedback
|
||||
this.scene.events.emit('show-floating-text', {
|
||||
x: this.scene.player.sprite.x,
|
||||
y: this.scene.player.sprite.y - 100,
|
||||
text: `UNLOCKED: ${zone.name}`,
|
||||
color: '#FFFFFF'
|
||||
});
|
||||
|
||||
// Sound
|
||||
if (this.scene.soundManager) this.scene.soundManager.playSuccess(); // Assuming sound exists
|
||||
|
||||
this.drawFog(); // Redraw fog
|
||||
return true;
|
||||
}
|
||||
|
||||
unlockZone(zoneId) {
|
||||
if (!this.unlockedZones.includes(zoneId)) {
|
||||
this.unlockedZones.push(zoneId);
|
||||
console.log('🔓 Zone Unlocked:', zoneId);
|
||||
// TODO: Remove fog/barrier
|
||||
/**
|
||||
* Check if player is in an unlocked zone
|
||||
* Used for restricting movement or camera
|
||||
*/
|
||||
isPointUnlocked(x, y) {
|
||||
for (const key in this.zones) {
|
||||
const z = this.zones[key];
|
||||
if (x >= z.x && x < z.x + z.w && y >= z.y && y < z.y + z.h) {
|
||||
return z.unlocked;
|
||||
}
|
||||
}
|
||||
return false; // Default blocked
|
||||
}
|
||||
|
||||
/**
|
||||
* Draw Fog of War over locked zones
|
||||
*/
|
||||
drawFog() {
|
||||
this.fogGraphics.clear();
|
||||
|
||||
// Fill semi-transparent black over locked zones
|
||||
this.fogGraphics.fillStyle(0x000000, 0.7); // 70% opacity black fog
|
||||
|
||||
for (const key in this.zones) {
|
||||
const z = this.zones[key];
|
||||
if (!z.unlocked) {
|
||||
// Convert grid coords to world coords logic
|
||||
// Isometric conversion might be tricky for rectangular fog on isometric grid.
|
||||
// But for simplicity let's assume raw screen overlay or draw huge loose shapes?
|
||||
// Actually, our map coordinates (gridX, gridY) map to iso.
|
||||
|
||||
// Let's try drawing tile-by-tile or chunks? Too slow.
|
||||
// Better approach: Draw a huge rectangle? No, iso is diamond shape.
|
||||
|
||||
// Hack: Just draw simple polygons for now, or use the tile tinting system?
|
||||
// Real Fog of War in Iso is complex.
|
||||
// Let's stick to "Tinting" locked tiles or something simpler first.
|
||||
// Or: Render a shape that covers the locked area logic.
|
||||
|
||||
// Since our world is 100x100 grid.
|
||||
// Zone Forest: x:40, y:0, w:60, h:40.
|
||||
|
||||
// Let's just draw 'clouds' or text over locked areas?
|
||||
// Or simplified: Just don't let player walk there.
|
||||
|
||||
// Let's skip heavy graphics fog for now and just add Floating Text Labels
|
||||
// "LOCKED AREA: FOREST" over the center.
|
||||
|
||||
// Drawing 4 points of the zone in iso:
|
||||
const p1 = this.scene.iso.toScreen(z.x, z.y);
|
||||
const p2 = this.scene.iso.toScreen(z.x + z.w, z.y);
|
||||
const p3 = this.scene.iso.toScreen(z.x + z.w, z.y + z.h);
|
||||
const p4 = this.scene.iso.toScreen(z.x, z.y + z.h);
|
||||
|
||||
const offX = this.scene.terrainOffsetX;
|
||||
const offY = this.scene.terrainOffsetY;
|
||||
|
||||
const poly = new Phaser.Geom.Polygon([
|
||||
p1.x + offX, p1.y + offY,
|
||||
p2.x + offX, p2.y + offY,
|
||||
p3.x + offX, p3.y + offY,
|
||||
p4.x + offX, p4.y + offY
|
||||
]);
|
||||
|
||||
this.fogGraphics.fillPoints(poly.points, true);
|
||||
|
||||
// Add label? (We'd need to manage text objects separately, simple redraw is easier)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
travelToIsland(islandId) {
|
||||
console.log('🚤 Traveling to:', islandId);
|
||||
// TODO: Load island map / scene
|
||||
update(delta) {
|
||||
// Maybe check if player tries to enter locked zone and push back?
|
||||
if (this.scene.player) {
|
||||
const p = this.scene.player;
|
||||
if (!this.isPointUnlocked(p.gridX, p.gridY)) {
|
||||
// Player is in locked zone! Push back!
|
||||
// Simple bounce back logic
|
||||
// Or just show warning
|
||||
// console.log("Player in locked zone!");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user