Add proper title screen and logo

This commit is contained in:
Flashfyre 2024-03-21 13:12:05 -04:00
parent 7189258095
commit cf959c6e1b
9 changed files with 108 additions and 40 deletions

BIN
public/images/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@ -54,7 +54,6 @@ import CharSprite from './ui/char-sprite';
import DamageNumberHandler from './field/damage-number-handler';
import PokemonInfoContainer from './ui/pokemon-info-container';
import { biomeDepths } from './data/biomes';
import { DailyRunScoreboard } from './ui/daily-run-scoreboard';
export const bypassLogin = false;
@ -124,8 +123,8 @@ export default class BattleScene extends Phaser.Scene {
public pbTrayEnemy: PokeballTray;
public abilityBar: AbilityBar;
public partyExpBar: PartyExpBar;
public arenaBg: Phaser.GameObjects.Sprite;
public arenaBgTransition: Phaser.GameObjects.Sprite;
public arenaBg: Phaser.GameObjects.NineSlice;
public arenaBgTransition: Phaser.GameObjects.NineSlice;
public arenaPlayer: ArenaBase;
public arenaPlayerTransition: ArenaBase;
public arenaEnemy: ArenaBase;
@ -139,7 +138,6 @@ export default class BattleScene extends Phaser.Scene {
public pokeballCounts: PokeballCounts;
public money: integer;
public pokemonInfoContainer: PokemonInfoContainer;
public dailyRunScoreboard: DailyRunScoreboard;
private party: PlayerPokemon[];
private waveCountText: Phaser.GameObjects.Text;
private moneyText: Phaser.GameObjects.Text;
@ -316,6 +314,8 @@ export default class BattleScene extends Phaser.Scene {
this.loadImage('default_bg', 'arenas');
this.loadImage('logo', '');
// Load arena images
Utils.getEnumValues(Biome).map(bt => {
const btKey = Biome[bt].toLowerCase();
@ -480,12 +480,14 @@ export default class BattleScene extends Phaser.Scene {
}
launchBattle() {
this.arenaBg = this.addFieldSprite(0, 0, 'plains_bg', null, 0);
this.arenaBgTransition = this.addFieldSprite(0, 0, `plains_bg`, null, 1);
this.arenaBg = this.add.nineslice(0, 0, 'plains_bg', null, 320, 180, 0, 0, 132, 0);
this.arenaBgTransition = this.add.nineslice(0, 0, 'plains_bg', null, 320, 180, 0, 0, 132, 0);
[ this.arenaBgTransition, this.arenaBg ].forEach(a => {
a.setPipeline(this.fieldSpritePipeline);
a.setScale(6);
a.setOrigin(0);
a.setSize(320, 240);
});
const field = this.add.container(0, 0);
@ -569,11 +571,6 @@ export default class BattleScene extends Phaser.Scene {
this.fieldUI.add(this.pokemonInfoContainer);
this.dailyRunScoreboard = new DailyRunScoreboard(this, 1, -(this.game.canvas.height / 6) + 1);
this.dailyRunScoreboard.setup();
this.fieldUI.add(this.dailyRunScoreboard);
this.party = [];
let loadPokemonAssets = [];

View File

@ -43,7 +43,7 @@ import { EggHatchPhase } from "./egg-hatch-phase";
import { Egg } from "./data/egg";
import { vouchers } from "./system/voucher";
import { loggedInUser, updateUserInfo } from "./account";
import { GameDataType, PlayerGender } from "./system/game-data";
import { GameDataType, PlayerGender, SessionSaveData } from "./system/game-data";
import { addPokeballCaptureStars, addPokeballOpenParticles } from "./field/anims";
import { SpeciesFormChangeActiveTrigger, SpeciesFormChangeManualTrigger, SpeciesFormChangeMoveLearnedTrigger, SpeciesFormChangeMoveUsedTrigger } from "./data/pokemon-forms";
import { battleSpecDialogue, getCharVariantFromDialogue } from "./data/dialogue";
@ -127,6 +127,7 @@ export class LoginPhase extends Phase {
export class TitlePhase extends Phase {
private loaded: boolean;
private lastSessionData: SessionSaveData;
constructor(scene: BattleScene) {
super(scene);
@ -142,7 +143,13 @@ export class TitlePhase extends Phase {
this.scene.fadeOutBgm(0, false);
this.showOptions();
this.scene.gameData.getSession(loggedInUser.lastSessionSlot).then(sessionData => {
this.lastSessionData = sessionData;
const biomeKey = getBiomeKey(sessionData.arena.biome);
const bgTexture = `${biomeKey}_bg`;
this.scene.arenaBg.setTexture(bgTexture);
this.showOptions();
});
}
showOptions(): void {
@ -150,7 +157,7 @@ export class TitlePhase extends Phase {
if (loggedInUser?.lastSessionSlot > -1) {
options.push({
label: 'Continue',
handler: () => this.loadSaveSlot(loggedInUser.lastSessionSlot)
handler: () => this.loadSaveSlot(-1)
});
}
options.push({
@ -178,18 +185,16 @@ export class TitlePhase extends Phase {
});
const config: OptionSelectConfig = {
options: options,
noCancel: true
noCancel: true,
yOffset: 47
};
this.scene.ui.setMode(Mode.OPTION_SELECT, config);
this.scene.dailyRunScoreboard.showAndUpdate();
this.scene.ui.setMode(Mode.TITLE, config);
}
loadSaveSlot(slotId: integer): void {
this.scene.sessionSlotId = slotId;
this.scene.sessionSlotId = slotId > -1 ? slotId : loggedInUser.lastSessionSlot;
this.scene.ui.setMode(Mode.MESSAGE);
this.scene.dailyRunScoreboard.hide();
this.scene.gameData.loadSession(this.scene, slotId).then((success: boolean) => {
this.scene.gameData.loadSession(this.scene, slotId, slotId === -1 ? this.lastSessionData : null).then((success: boolean) => {
if (success) {
this.loaded = true;
this.scene.ui.showText('Session loaded successfully.', null, () => this.end());
@ -256,8 +261,6 @@ export class TitlePhase extends Phase {
}
end(): void {
this.scene.dailyRunScoreboard.hide();
if (!this.loaded && !this.scene.gameMode.isDaily) {
this.scene.arena.preloadBgm();
this.scene.pushPhase(new SelectStarterPhase(this.scene));

View File

@ -109,7 +109,7 @@ vec3 hsl2rgb(vec3 hsl) {
rgb.r = hue2rgb(f1, f2, hsl.x + (1.0/3.0));
rgb.g = hue2rgb(f1, f2, hsl.x);
rgb.b= hue2rgb(f1, f2, hsl.x - (1.0/3.0));
rgb.b = hue2rgb(f1, f2, hsl.x - (1.0/3.0));
}
return rgb;

View File

@ -537,10 +537,10 @@ export class GameData {
});
}
loadSession(scene: BattleScene, slotId: integer): Promise<boolean> {
loadSession(scene: BattleScene, slotId: integer, sessionData?: SessionSaveData): Promise<boolean> {
return new Promise(async (resolve, reject) => {
try {
this.getSession(slotId).then(async sessionData => {
const initSessionFromData = async sessionData => {
console.debug(sessionData);
scene.setSeed(sessionData.seed || scene.game.config.seed[0]);
@ -614,10 +614,17 @@ export class GameData {
scene.updateModifiers(false);
Promise.all(loadPokemonAssets).then(() => resolve(true));
}).catch(err => {
reject(err);
return;
});
};
if (sessionData)
initSessionFromData(sessionData);
else {
this.getSession(slotId)
.then(data => initSessionFromData(data))
.catch(err => {
reject(err);
return;
});
}
} catch (err) {
reject(err);
return;

View File

@ -40,8 +40,6 @@ export class DailyRunScoreboard extends Phaser.GameObjects.Container {
this.loadingLabel.setVisible(false);
this.add(this.loadingLabel);
this.setVisible(false);
}
updateRankings(rankings: RankingEntry[]) {
@ -72,7 +70,7 @@ export class DailyRunScoreboard extends Phaser.GameObjects.Container {
});
}
showAndUpdate() {
update() {
this.rankingsContainer.removeAll(true);
this.loadingLabel.setText('Loading…');
@ -87,12 +85,6 @@ export class DailyRunScoreboard extends Phaser.GameObjects.Container {
} else
this.loadingLabel.setText('No Rankings');
});
this.setVisible(true);
}
hide() {
this.setVisible(false);
}
}

View File

@ -290,7 +290,7 @@ class SessionSlot extends Phaser.GameObjects.Container {
this.hasData = true;
await this.setupWithData(sessionData);
resolve(true);
})
});
});
}
}

View File

@ -0,0 +1,65 @@
import BattleScene from "../battle-scene";
import { DailyRunScoreboard } from "./daily-run-scoreboard";
import OptionSelectUiHandler from "./option-select-ui-handler";
import { Mode } from "./ui";
import * as Utils from "../utils";
export default class TitleUiHandler extends OptionSelectUiHandler {
private titleContainer: Phaser.GameObjects.Container;
private dailyRunScoreboard: DailyRunScoreboard;
constructor(scene: BattleScene, mode: Mode = Mode.TITLE) {
super(scene, mode);
}
setup() {
super.setup();
const ui = this.getUi();
this.titleContainer = this.scene.add.container(0, -(this.scene.game.canvas.height / 6));
this.titleContainer.setAlpha(0);
ui.add(this.titleContainer);
const logo = this.scene.add.image((this.scene.game.canvas.width / 6) / 2, 8, 'logo');
logo.setOrigin(0.5, 0);
this.titleContainer.add(logo);
this.dailyRunScoreboard = new DailyRunScoreboard(this.scene, 1, 49);
this.dailyRunScoreboard.setup();
this.titleContainer.add(this.dailyRunScoreboard);
}
show(args: any[]): boolean {
const ret = super.show(args);
if (ret) {
const ui = this.getUi();
this.dailyRunScoreboard.update();
this.scene.tweens.add({
targets: [ this.titleContainer, ui.getMessageHandler().bg ],
duration: Utils.fixedInt(325),
alpha: (target: any) => target === this.titleContainer ? 1 : 0,
ease: 'Sine.easeInOut'
});
}
return ret;
}
clear(): void {
super.clear();
const ui = this.getUi();
this.scene.tweens.add({
targets: [ this.titleContainer, ui.getMessageHandler().bg ],
duration: Utils.fixedInt(325),
alpha: (target: any) => target === this.titleContainer ? 0 : 1,
ease: 'Sine.easeInOut'
});
}
}

View File

@ -31,9 +31,11 @@ import * as Utils from "../utils";
import GameStatsUiHandler from './game-stats-ui-handler';
import AwaitableUiHandler from './awaitable-ui-handler';
import SaveSlotSelectUiHandler from './save-slot-select-ui-handler';
import TitleUiHandler from './title-ui-handler';
export enum Mode {
MESSAGE,
TITLE,
COMMAND,
FIGHT,
BALL,
@ -73,6 +75,7 @@ const transitionModes = [
];
const noTransitionModes = [
Mode.TITLE,
Mode.CONFIRM,
Mode.OPTION_SELECT,
Mode.MENU,
@ -107,6 +110,7 @@ export default class UI extends Phaser.GameObjects.Container {
this.modeChain = [];
this.handlers = [
new BattleMessageUiHandler(scene),
new TitleUiHandler(scene),
new CommandUiHandler(scene),
new FightUiHandler(scene),
new BallUiHandler(scene),