125 lines
5.8 KiB
JavaScript
125 lines
5.8 KiB
JavaScript
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');
|
|
}
|
|
}
|