import { SaveManager } from '../managers/SaveManager.js'; import { CardManager } from '../managers/CardManager.js'; import { PackManager } from '../managers/PackManager.js'; import { DeckManager } from '../managers/DeckManager.js'; export class BootScene extends Phaser.Scene { constructor() { super('BootScene'); } preload() { // Load custom fonts this.load.font('RaiderCrusader', 'assets/fonts/raidercrusader.ttf'); this.load.font('Audiowide', 'assets/fonts/Audiowide-Regular.ttf'); // Load all JSON data files this.load.image('vs', 'assets/images/ui/vs.png'); this.load.image('attacksFirst', 'assets/images/ui/attacksFirst.png'); this.load.spritesheet('attacks', 'assets/images/spritesheets/attacks.png', { frameWidth: 460, frameHeight: 460 }); this.load.json('cards', 'data/cards.json'); this.load.json('packs', 'data/packs.json'); this.load.json('missions', 'data/missions.json'); this.load.json('campaigns', 'data/campaigns.json'); this.load.json('skills', 'data/skills.json'); this.load.audio('sfx_attack', 'assets/audio/fx/attack.mp3'); this.load.audio('sfx_damage', 'assets/audio/fx/damage.mp3'); this.load.audio('sfx_mortar', 'assets/audio/fx/mortar.mp3'); this.load.audio('sfx_strike', 'assets/audio/fx/strike.mp3'); this.load.audio('sfx_pierce', 'assets/audio/fx/pierce.mp3'); this.load.audio('sfx_protect', 'assets/audio/fx/protect.mp3'); this.load.audio('sfx_legendary_play', 'assets/audio/fx/legendary-play.mp3'); this.load.audio('sfx_destroy', 'assets/audio/fx/destroy.mp3'); this.load.audio('sfx_rally', 'assets/audio/fx/rally.mp3'); this.load.audio('sfx_siege', 'assets/audio/fx/siege.mp3'); this.load.audio('sfx_counter', 'assets/audio/fx/counter.mp3'); this.load.audio('sfx_enfeeble', 'assets/audio/fx/enfeeble.mp3'); this.load.audio('sfx_jam', 'assets/audio/fx/jam.mp3'); this.load.audio('sfx_siphon', 'assets/audio/fx/siphon.mp3'); this.load.audio('sfx_legion', 'assets/audio/fx/legion.mp3'); this.load.audio('sfx_drain', 'assets/audio/fx/drain.mp3'); this.load.audio('sfx_bloodrage', 'assets/audio/fx/bloodrage.mp3'); this.load.audio('sfx_bloodpact', 'assets/audio/fx/bloodpact.mp3'); this.load.audio('sfx_swipe_01', 'assets/audio/fx/swipe_01.mp3'); this.load.audio('sfx_swipe_02', 'assets/audio/fx/swipe_02.mp3'); this.load.audio('sfx_menu_select', 'assets/audio/fx/menu_select.mp3'); this.load.audio('sfx_menu_hover', 'assets/audio/fx/menu_hover.mp3'); this.load.audio('sfx_venom_apply', 'assets/audio/fx/venom-apply.mp3'); this.load.audio('sfx_venom_effect', 'assets/audio/fx/venom-effect.mp3'); this.load.audio('sfx_carapace', 'assets/audio/fx/carapace.mp3'); this.load.audio('sfx_molt_stage1', 'assets/audio/fx/molt-stage1.mp3'); this.load.audio('sfx_molt_stage2', 'assets/audio/fx/molt-stage2.mp3'); this.load.audio('sfx_burrow', 'assets/audio/fx/burrow.mp3'); this.load.audio('sfx_hive_link', 'assets/audio/fx/hive_link.mp3'); this.load.audio('sfx_swarm', 'assets/audio/fx/swarm.mp3'); this.load.audio('sfx_heal', 'assets/audio/fx/heal.mp3'); this.load.audio('sfx_sanctify', 'assets/audio/fx/sanctify.mp3'); this.load.audio('sfx_hack', 'assets/audio/fx/hack.mp3'); this.load.audio('sfx_smite_cast', 'assets/audio/fx/smite-cast.mp3'); this.load.audio('sfx_smite_damage', 'assets/audio/fx/smite-damage.mp3'); this.load.audio('sfx_overcharge', 'assets/audio/fx/overcharge.mp3'); this.load.audio('sfx_fortify', 'assets/audio/fx/fortify.mp3'); this.load.audio('music_main_menu', 'assets/audio/music/main_menu.mp3'); // Once cards.json finishes, queue card art images and resume loading this.load.once('filecomplete-json-cards', (_key, _type, data) => { data.forEach(card => { if (card.artKey && !this.textures.exists(card.artKey)) { this.load.image(card.artKey, `assets/images/cards/${card.artKey}.png`); } }); this.load.start(); }); // Loading text const loadText = this.add.text(this.scale.width / 2, this.scale.height / 2, 'Loading...', { fontSize: '28px', color: '#ffffff', fontFamily: 'Audiowide' }).setOrigin(0.5); this.load.on('progress', (value) => { loadText.setText(`Loading... ${Math.floor(value * 100)}%`); }); } create() { // Initialize managers const cardsData = this.cache.json.get('cards'); const packsData = this.cache.json.get('packs'); const missionsData = this.cache.json.get('missions'); const campaignsData = this.cache.json.get('campaigns'); const cardManager = new CardManager(cardsData); const packManager = new PackManager(packsData, cardManager); // Load save const save = SaveManager.load(); // Give starter deck on first run if (!save.starterDeckReceived) { const starterDeck = DeckManager.createStarterDeck(cardManager); save.decks.push(starterDeck); // Add starter cards to collection for (const cardId of starterDeck.cards) { save.collection[cardId] = (save.collection[cardId] || 0) + 1; } save.collection[starterDeck.commander] = (save.collection[starterDeck.commander] || 0) + 1; save.starterDeckReceived = true; SaveManager.save(save); } // Store managers on game registry for global access this.registry.set('cardManager', cardManager); this.registry.set('packManager', packManager); this.registry.set('missions', missionsData); this.registry.set('campaigns', campaignsData); this.registry.set('save', save); // Start main menu music looping; store reference so other scenes can stop/resume it const menuMusic = this.sound.add('music_main_menu', { loop: true, volume: 0.5 }); menuMusic.play(); this.registry.set('music_main_menu', menuMusic); this.scene.start('MainMenuScene'); } }