mapa
This commit is contained in:
@@ -51,8 +51,15 @@ class GameScene extends Phaser.Scene {
|
||||
this.terrainSystem.updateCulling(this.cameras.main);
|
||||
|
||||
// FAZA 14: Spawn Ruin (Town Project) at fixed location near player
|
||||
console.log('🏚️ Spawning Ruin...');
|
||||
console.log('🏚️ Spawning Ruin & Arena...');
|
||||
this.terrainSystem.placeStructure(55, 55, 'ruin');
|
||||
this.terrainSystem.placeStructure(75, 75, 'arena');
|
||||
|
||||
// Initialize Pathfinding (Worker)
|
||||
console.log('🗺️ Initializing Pathfinding...');
|
||||
this.pathfinding = new PathfindingSystem(this);
|
||||
this.pathfinding.updateGrid();
|
||||
|
||||
} catch (e) {
|
||||
console.error("Terrain system failed:", e);
|
||||
}
|
||||
@@ -61,8 +68,6 @@ class GameScene extends Phaser.Scene {
|
||||
console.log('👤 Initializing player...');
|
||||
this.player = new Player(this, 50, 50, this.terrainOffsetX, this.terrainOffsetY);
|
||||
|
||||
// Dodaj 3 NPCje
|
||||
console.log('🧟 Initializing NPCs...');
|
||||
// Dodaj 3 NPCje (Mixed)
|
||||
console.log('🧟 Initializing NPCs...');
|
||||
const npcTypes = ['zombie', 'villager', 'merchant'];
|
||||
@@ -81,8 +86,8 @@ class GameScene extends Phaser.Scene {
|
||||
this.npcs.push(zombie);
|
||||
}
|
||||
|
||||
// Kamera sledi igralcu z izboljšanimi nastavitvami
|
||||
this.cameras.main.startFollow(this.player.sprite, true, 1.0, 1.0); // Instant follow (was 0.1)
|
||||
// Kamera sledi igralcu
|
||||
this.cameras.main.startFollow(this.player.sprite, true, 1.0, 1.0);
|
||||
|
||||
// Nastavi deadzone (100px border)
|
||||
this.cameras.main.setDeadzone(100, 100);
|
||||
@@ -99,11 +104,10 @@ class GameScene extends Phaser.Scene {
|
||||
// Kamera kontrole
|
||||
this.setupCamera();
|
||||
|
||||
// Initialize Time & Stats
|
||||
// Initialize Weather System (Unified: Time + DayNight + Weather)
|
||||
// Initialize Systems
|
||||
console.log('🌦️ Initializing Unified Weather System...');
|
||||
this.weatherSystem = new WeatherSystem(this);
|
||||
this.timeSystem = this.weatherSystem; // Alias for compatibility with other systems (e.g. UIScene, Farming)
|
||||
this.timeSystem = this.weatherSystem; // Alias
|
||||
|
||||
this.statsSystem = new StatsSystem(this);
|
||||
this.inventorySystem = new InventorySystem(this);
|
||||
@@ -111,17 +115,24 @@ class GameScene extends Phaser.Scene {
|
||||
this.interactionSystem = new InteractionSystem(this);
|
||||
this.farmingSystem = new FarmingSystem(this);
|
||||
this.buildingSystem = new BuildingSystem(this);
|
||||
|
||||
// DayNightSystem removed (merged into WeatherSystem)
|
||||
this.pathfinding = new Pathfinding(this);
|
||||
this.questSystem = new QuestSystem(this);
|
||||
this.multiplayerSystem = new MultiplayerSystem(this);
|
||||
|
||||
// Initialize Sound Manager
|
||||
console.log('🎵 Initializing Sound Manager...');
|
||||
this.soundManager = new SoundManager(this);
|
||||
this.soundManager.startMusic();
|
||||
|
||||
// Initialize Parallax System
|
||||
console.log('🌄 Initializing Parallax System...');
|
||||
this.parallaxSystem = new ParallaxSystem(this);
|
||||
|
||||
// Initialize Particle Effects
|
||||
console.log('✨ Initializing Particle Effects...');
|
||||
this.particleEffects = new ParticleEffects(this);
|
||||
this.particleEffects.createFallingLeaves();
|
||||
|
||||
// Generate Item Sprites for UI
|
||||
TextureGenerator.createItemSprites(this);
|
||||
|
||||
@@ -135,7 +146,11 @@ class GameScene extends Phaser.Scene {
|
||||
// Auto-load if available
|
||||
this.saveSystem.loadGame();
|
||||
|
||||
console.log('✅ GameScene ready - FAZA 18 (Crafting & AI)!');
|
||||
// Debug Text
|
||||
this.add.text(10, 10, 'NovaFarma Alpha v0.6', { font: '16px monospace', fill: '#ffffff' })
|
||||
.setScrollFactor(0).setDepth(10000);
|
||||
|
||||
console.log('✅ GameScene ready - FAZA 20 (Full Features)!');
|
||||
}
|
||||
|
||||
setupCamera() {
|
||||
@@ -159,21 +174,11 @@ class GameScene extends Phaser.Scene {
|
||||
});
|
||||
|
||||
// Save/Load Keys
|
||||
this.input.keyboard.on('keydown-F8', () => {
|
||||
// Save
|
||||
if (this.saveSystem) {
|
||||
this.saveSystem.saveGame();
|
||||
console.log('💾 Game Saved! (F8)');
|
||||
}
|
||||
});
|
||||
this.input.keyboard.on('keydown-F8', () => this.saveGame());
|
||||
this.input.keyboard.on('keydown-F9', () => this.loadGame());
|
||||
|
||||
this.input.keyboard.on('keydown-F9', () => {
|
||||
// Load
|
||||
if (this.saveSystem) {
|
||||
this.saveSystem.loadGame();
|
||||
console.log('📂 Game Loaded! (F9)');
|
||||
}
|
||||
});
|
||||
// Spawn Boss (Debug)
|
||||
this.input.keyboard.on('keydown-K', () => this.spawnBoss());
|
||||
|
||||
// Build Mode Keys
|
||||
this.input.keyboard.on('keydown-B', () => {
|
||||
@@ -184,41 +189,73 @@ class GameScene extends Phaser.Scene {
|
||||
if (this.buildingSystem && this.buildingSystem.isBuildMode) this.buildingSystem.selectBuilding('fence');
|
||||
else if (this.scene.get('UIScene')) this.scene.get('UIScene').selectSlot(0);
|
||||
});
|
||||
|
||||
this.input.keyboard.on('keydown-TWO', () => {
|
||||
if (this.buildingSystem && this.buildingSystem.isBuildMode) this.buildingSystem.selectBuilding('wall');
|
||||
else if (this.scene.get('UIScene')) this.scene.get('UIScene').selectSlot(1);
|
||||
});
|
||||
|
||||
this.input.keyboard.on('keydown-THREE', () => {
|
||||
if (this.buildingSystem && this.buildingSystem.isBuildMode) this.buildingSystem.selectBuilding('house');
|
||||
else if (this.scene.get('UIScene')) this.scene.get('UIScene').selectSlot(2);
|
||||
});
|
||||
|
||||
// Soft Reset (F4) - Force Reload Page
|
||||
this.input.keyboard.on('keydown-F4', () => {
|
||||
console.log('🔄 Soft Reset Initiated (Force Reload)...');
|
||||
window.location.reload();
|
||||
});
|
||||
// Soft Reset (F4)
|
||||
this.input.keyboard.on('keydown-F4', () => window.location.reload());
|
||||
|
||||
// Mute Toggle (M key)
|
||||
this.input.keyboard.on('keydown-M', () => {
|
||||
if (this.soundManager) {
|
||||
this.soundManager.toggleMute();
|
||||
}
|
||||
if (this.soundManager) this.soundManager.toggleMute();
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
update(time, delta) {
|
||||
if (this.player) this.player.update(delta);
|
||||
|
||||
// Update Systems
|
||||
// TimeSystem update removed (handled by WeatherSystem)
|
||||
if (this.statsSystem) this.statsSystem.update(delta);
|
||||
if (this.lootSystem) this.lootSystem.update(delta); // Loot System Update
|
||||
if (this.lootSystem) this.lootSystem.update(delta);
|
||||
if (this.interactionSystem) this.interactionSystem.update(delta);
|
||||
if (this.farmingSystem) this.farmingSystem.update(delta);
|
||||
// DayNight update removed (handled by WeatherSystem)
|
||||
if (this.weatherSystem) this.weatherSystem.update(delta);
|
||||
if (this.questSystem) this.questSystem.update(delta);
|
||||
if (this.multiplayerSystem) this.multiplayerSystem.update(delta);
|
||||
|
||||
// Update Parallax (foreground grass fading)
|
||||
if (this.weatherSystem) {
|
||||
this.weatherSystem.update(delta);
|
||||
|
||||
// Night Logic
|
||||
if (this.weatherSystem.isNight()) {
|
||||
const isHorde = this.weatherSystem.isHordeNight();
|
||||
const spawnInterval = isHorde ? 2000 : 10000;
|
||||
|
||||
// Check for Horde Start Warning
|
||||
if (isHorde && !this.hordeWarningShown) {
|
||||
this.showHordeWarning();
|
||||
this.hordeWarningShown = true;
|
||||
}
|
||||
|
||||
if (!this.nightSpawnTimer) this.nightSpawnTimer = 0;
|
||||
this.nightSpawnTimer += delta;
|
||||
|
||||
if (this.nightSpawnTimer > spawnInterval) {
|
||||
this.nightSpawnTimer = 0;
|
||||
this.spawnNightZombie();
|
||||
if (isHorde) {
|
||||
this.spawnNightZombie();
|
||||
this.spawnNightZombie();
|
||||
}
|
||||
}
|
||||
} else {
|
||||
this.hordeWarningShown = false;
|
||||
}
|
||||
}
|
||||
|
||||
// NPC Update
|
||||
for (const npc of this.npcs) {
|
||||
npc.update(delta);
|
||||
}
|
||||
|
||||
// Parallax
|
||||
if (this.parallaxSystem && this.player) {
|
||||
const playerPos = this.player.getPosition();
|
||||
const screenPos = this.iso.toScreen(playerPos.x, playerPos.y);
|
||||
@@ -228,45 +265,34 @@ class GameScene extends Phaser.Scene {
|
||||
);
|
||||
}
|
||||
|
||||
// Update player
|
||||
if (this.player) {
|
||||
this.player.update(delta);
|
||||
}
|
||||
|
||||
// Update NPCs
|
||||
for (const npc of this.npcs) {
|
||||
npc.update(delta);
|
||||
}
|
||||
|
||||
// Update Terrain Culling
|
||||
// Terrain Culling
|
||||
if (this.terrainSystem) {
|
||||
this.terrainSystem.updateCulling(this.cameras.main);
|
||||
}
|
||||
|
||||
// Update clouds
|
||||
// Clouds
|
||||
if (this.clouds) {
|
||||
for (const cloud of this.clouds) {
|
||||
cloud.sprite.x += cloud.speed * (delta / 1000);
|
||||
if (cloud.sprite.x > this.terrainOffsetX + 2000) { // Reset far right
|
||||
if (cloud.sprite.x > this.terrainOffsetX + 2000) {
|
||||
cloud.sprite.x = this.terrainOffsetX - 2000;
|
||||
cloud.sprite.y = Phaser.Math.Between(0, 1000);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Send debug info to UI Scene
|
||||
// Debug Info
|
||||
if (this.player) {
|
||||
const playerPos = this.player.getPosition();
|
||||
const cam = this.cameras.main;
|
||||
|
||||
const uiScene = this.scene.get('UIScene');
|
||||
if (uiScene && uiScene.debugText) {
|
||||
const activeCrops = this.terrainSystem && this.terrainSystem.cropsMap ? this.terrainSystem.cropsMap.size : 0;
|
||||
const dropsCount = this.lootSystem ? this.lootSystem.drops.length : 0;
|
||||
const conn = this.multiplayerSystem && this.multiplayerSystem.isConnected ? '🟢 Online' : '🔴 Offline';
|
||||
|
||||
uiScene.debugText.setText(
|
||||
`FAZA 11 - Building\n` +
|
||||
`[F5] Save | [F9] Load | [B] Build Mode\n` +
|
||||
`NovaFarma v0.6 [${conn}]\n` +
|
||||
`[F5] Save | [F9] Load | [K] Boss\n` +
|
||||
`Time: ${this.timeSystem ? this.timeSystem.gameTime.toFixed(1) : '?'}h\n` +
|
||||
`Active Crops: ${activeCrops}\n` +
|
||||
`Loot Drops: ${dropsCount}\n` +
|
||||
@@ -276,25 +302,76 @@ class GameScene extends Phaser.Scene {
|
||||
}
|
||||
}
|
||||
|
||||
spawnNightZombie() {
|
||||
if (!this.player || this.npcs.length > 50) return;
|
||||
|
||||
const playerPos = this.player.getPosition();
|
||||
const angle = Math.random() * Math.PI * 2;
|
||||
const distance = Phaser.Math.Between(15, 25);
|
||||
|
||||
const spawnX = Math.floor(playerPos.x + Math.cos(angle) * distance);
|
||||
const spawnY = Math.floor(playerPos.y + Math.sin(angle) * distance);
|
||||
|
||||
if (spawnX < 0 || spawnX >= 100 || spawnY < 0 || spawnY >= 100) return;
|
||||
if (Phaser.Math.Distance.Between(spawnX, spawnY, 20, 20) < 15) return;
|
||||
|
||||
const tile = this.terrainSystem.getTile(spawnX, spawnY);
|
||||
if (tile && tile.type !== 'water') {
|
||||
console.log(`🌑 Night Spawn: Zombie at ${spawnX},${spawnY}`);
|
||||
const zombie = new NPC(this, spawnX, spawnY, this.terrainOffsetX, this.terrainOffsetY, 'zombie');
|
||||
zombie.state = 'CHASE';
|
||||
this.npcs.push(zombie);
|
||||
}
|
||||
}
|
||||
|
||||
showHordeWarning() {
|
||||
console.log('🩸 BLOOD MOON RISING!');
|
||||
if (this.soundManager) this.soundManager.playDeath();
|
||||
|
||||
const width = this.cameras.main.width;
|
||||
const height = this.cameras.main.height;
|
||||
|
||||
const text = this.add.text(width / 2, height / 3, 'THE HORDE IS APPROACHING...', {
|
||||
fontSize: '40px', fontFamily: 'Courier New', fill: '#ff0000', fontStyle: 'bold', stroke: '#000000', strokeThickness: 6
|
||||
}).setOrigin(0.5).setScrollFactor(0).setDepth(10000);
|
||||
|
||||
this.tweens.add({
|
||||
targets: text, scale: 1.2, duration: 500, yoyo: true, repeat: 5,
|
||||
onComplete: () => {
|
||||
this.tweens.add({
|
||||
targets: text, alpha: 0, duration: 2000,
|
||||
onComplete: () => text.destroy()
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
createClouds() {
|
||||
if (!this.textures.exists('cloud')) TextureGenerator.createCloudSprite(this, 'cloud');
|
||||
|
||||
this.clouds = [];
|
||||
console.log('☁️ Creating parallax clouds...');
|
||||
for (let i = 0; i < 8; i++) {
|
||||
const x = Phaser.Math.Between(-1000, 3000);
|
||||
const y = Phaser.Math.Between(-500, 1500);
|
||||
|
||||
const cloud = this.add.sprite(x, y, 'cloud');
|
||||
cloud.setAlpha(0.4);
|
||||
cloud.setScrollFactor(0.2); // Parallax effect
|
||||
cloud.setDepth(2000); // Nad vsem
|
||||
cloud.setScale(Phaser.Math.FloatBetween(2, 4)); // Veliki oblaki
|
||||
|
||||
cloud.setAlpha(0.4).setScrollFactor(0.2).setDepth(2000).setScale(Phaser.Math.FloatBetween(2, 4));
|
||||
this.clouds.push({ sprite: cloud, speed: Phaser.Math.FloatBetween(10, 30) });
|
||||
}
|
||||
}
|
||||
|
||||
spawnBoss() {
|
||||
if (!this.player) return;
|
||||
console.log('👑 SPANWING ZOMBIE KING!');
|
||||
const playerPos = this.player.getPosition();
|
||||
const spawnX = Math.floor(playerPos.x + 8);
|
||||
const spawnY = Math.floor(playerPos.y + 8);
|
||||
const boss = new Boss(this, spawnX, spawnY);
|
||||
boss.state = 'CHASE';
|
||||
this.npcs.push(boss);
|
||||
this.showHordeWarning();
|
||||
this.events.emit('show-floating-text', { x: this.player.x, y: this.player.y - 100, text: "THE KING HAS ARRIVED!", color: '#AA00FF' });
|
||||
}
|
||||
|
||||
saveGame() {
|
||||
if (this.saveSystem) this.saveSystem.saveGame();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user