/** * WEATHER INTEGRATION EXAMPLES - ALL BIOMES * * Copy-paste ready examples for every biome scene * Just change the class name and scene key */ import BaseScene from '../BaseScene.js'; // ======================================== // 1. GRASSLAND SCENE (Tutorial) // ======================================== export class GrasslandScene extends BaseScene { constructor() { super({ key: 'GrasslandScene' }); } create() { // Medium wind, can rain this.initWeather('grassland'); // Apply wind to ALL grass sprites for (let i = 0; i < 50; i++) { const grass = this.add.sprite( Phaser.Math.Between(0, 800), Phaser.Math.Between(0, 600), 'grass_tuft' ); this.weather.windSystem.applyWindToSprite(grass, 'grass'); } // Trees drop leaves const tree = this.add.sprite(200, 150, 'oak_tree'); this.weather.windSystem.createLeafEmitter(200, 150, 0.3); } update(time, delta) { this.updateWeather(delta); } } // ======================================== // 2. FOREST SCENE // ======================================== export class ForestScene extends BaseScene { constructor() { super({ key: 'ForestScene' }); } create() { // Moderate wind, frequent rain this.initWeather('forest'); this.weather.setWeather('rain', 0.3); // Light drizzle // MANY trees = MANY falling leaves! for (let i = 0; i < 20; i++) { const x = Phaser.Math.Between(0, 800); const y = Phaser.Math.Between(0, 600); this.weather.windSystem.createLeafEmitter(x, y, 0.5); } } update(time, delta) { this.updateWeather(delta); } } // ======================================== // 3. DESERT SCENE // ======================================== export class DesertScene extends BaseScene { constructor() { super({ key: 'DesertScene' }); } create() { // Strong wind, hot, dry this.initWeather('desert'); // Sand blows (use grass sprites tinted yellow) for (let i = 0; i < 30; i++) { const sand = this.add.sprite( Phaser.Math.Between(0, 800), Phaser.Math.Between(0, 600), 'grass_tuft' ).setTint(0xF4A460); // Sandy brown this.weather.windSystem.applyWindToSprite(sand, 'grass'); } // Occasionally trigger sandstorm this.time.addEvent({ delay: 60000, // Every minute callback: () => { if (Math.random() < 0.3) { this.weather.setWeather('sandstorm', 0.8); this.showMessage("PEŠČENA VIHRA!"); } }, loop: true }); } update(time, delta) { this.updateWeather(delta); } showMessage(text) { console.log(text); } } // ======================================== // 4. TUNDRA/SNOW SCENE (HARDCORE!) // ======================================== export class TundraScene extends BaseScene { constructor() { super({ key: 'TundraScene' }); } create() { // VERY strong wind, blizzard this.initWeather('snow'); this.weather.setWeather('blizzard', 0.9); // Camera shake from wind this.cameras.main.shake(10000, 0.003); // Kai dialogue this.time.delayedCall(500, () => { this.showDialogue("Jebemti... MRZNEMMM... -6 stopinj..."); }); // Create campfire for warmth this.campfire = this.weather.createFireSource(400, 300, 1.5); // Near fire = safe, away = freezing to death this.checkTemperature(); } checkTemperature() { this.time.addEvent({ delay: 1000, callback: () => { const distToFire = Phaser.Math.Distance.Between( this.player.x, this.player.y, 400, 300 ); if (distToFire > 150) { this.player.health -= 1; // Freezing! this.showMessage("MRZNEM!"); } else { this.player.temperature += 5; // Warming up } }, loop: true }); } update(time, delta) { this.updateWeather(delta); } showDialogue(text) { console.log(`Kai: ${text}`); } showMessage(text) { console.log(text); } } // ======================================== // 5. SWAMP SCENE // ======================================== export class SwampScene extends BaseScene { constructor() { super({ key: 'SwampScene' }); } create() { // Very light wind, constant rain this.initWeather('swamp'); this.weather.setWeather('rain', 0.5); // Water zones everywhere this.waterZones = this.add.group(); for (let i = 0; i < 10; i++) { const puddle = this.add.rectangle( Phaser.Math.Between(0, 800), Phaser.Math.Between(0, 600), 100, 60, 0x4682B4, 0.4 ); this.waterZones.add(puddle); } // Player walking creates ripples this.events.on('update', () => { if (this.player && this.player.body.velocity.length() > 0) { this.weather.createRipple(this.player.x, this.player.y, 0.3); } }); } update(time, delta) { this.updateWeather(delta); } } // ======================================== // 6. VOLCANIC SCENE (FIRE EVERYWHERE!) // ======================================== export class VolcanicScene extends BaseScene { constructor() { super({ key: 'VolcanicScene' }); } create() { // Turbulent wind, ash rain this.initWeather('volcanic'); this.weather.setWeather('ash_rain', 0.6); // MANY fire sources const firePositions = [ [100, 200], [300, 180], [500, 220], [700, 190], [200, 400], [600, 350] ]; firePositions.forEach(([x, y]) => { this.weather.createFireSource(x, y, Phaser.Math.FloatBetween(1.5, 2.5)); }); // Kai dialogue this.time.delayedCall(1000, () => { this.showDialogue("Vroče kot v pekluuu..."); }); // Near fire = damage! this.checkHeat(); } checkHeat() { this.time.addEvent({ delay: 1000, callback: () => { // TODO: Check distance to all fires // if (tooClose) player.health -= 2; }, loop: true }); } update(time, delta) { this.updateWeather(delta); } showDialogue(text) { console.log(`Kai: ${text}`); } } // ======================================== // 7. WATER BIOME (Cenotes, Atlantis) // ======================================== export class CenoteScene extends BaseScene { constructor() { super({ key: 'CenoteScene' }); } create() { // Clear weather, calm this.initWeather('cenote'); // Large water zone this.waterZone = this.add.rectangle(0, 300, 800, 300, 0x4682B4, 0.3); // Player enters water this.physics.add.overlap(this.player, this.waterZone, () => { // Ripples! this.weather.createRipple(this.player.x, this.player.y, 0.5); // Hair floats upward if (this.kaiHair) { // Buoyancy mode activates this.weather.windSystem.windAffectedLayers.forEach(layer => { if (layer.sprite === this.kaiHair) { layer.buoyantMode = true; layer.floatStrength = 1.5; } }); } // Kai dialogue (once) if (!this.saidWaterLine) { this.showDialogue("Voda je... čist? Wow..."); this.saidWaterLine = true; } }); } update(time, delta) { this.updateWeather(delta); } showDialogue(text) { console.log(`Kai: ${text}`); } } // ======================================== // 8. MOUNTAINS SCENE (EXTREME WIND!) // ======================================== export class MountainScene extends BaseScene { constructor() { super({ key: 'MountainScene' }); } create() { // STRONGEST wind! Player gets pushed! this.initWeather('mountains'); // Wind physically pushes player this.events.on('update', () => { if (this.player) { const windPush = this.weather.windSystem.wind.strength * 10; this.player.body.velocity.x += windPush; } }); // Random storms this.time.addEvent({ delay: 30000, // Every 30s callback: () => { if (Math.random() < 0.5) { this.weather.setWeather('storm', 1.0); this.cameras.main.shake(2000, 0.01); this.showMessage("VIHAR!"); } }, loop: true }); } update(time, delta) { this.updateWeather(delta); } showMessage(text) { console.log(text); } } // ======================================== // READY TO USE! // Just import and add to game. // All weather is automatic! // ========================================