[Bug][UI] Fixes to Run History Logging (#4716)

* new function

* weak attempt of documentation

* mysterious chest handled...? maybe.

* override comments

* one more instruction

* fixing up the logging lol

* lah

* fixing it up

* coommrent

* lalal

* run info fixes

* Addressed PigeonBar's comments

* Centered run info text + fixed trainer sprites.

* Fixed function name.

* Update tsdoc in `overrides.ts`

Co-authored-by: Moka <54149968+MokaStitcher@users.noreply.github.com>

* Fix tsdoc comment

* sligthly rewrite centering of biome and wave text in run info

---------

Co-authored-by: frutescens <info@laptop>
Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com>
Co-authored-by: Moka <54149968+MokaStitcher@users.noreply.github.com>
Co-authored-by: Moka <millennium.stitcher@gmail.com>
This commit is contained in:
Mumble 2024-12-01 10:48:43 -08:00 committed by GitHub
parent fad29ffc51
commit 2b59a53285
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 68 additions and 13 deletions

View File

@ -34,6 +34,7 @@ export const MysteriousChestEncounter: MysteryEncounter =
MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.MYSTERIOUS_CHEST) MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.MYSTERIOUS_CHEST)
.withEncounterTier(MysteryEncounterTier.COMMON) .withEncounterTier(MysteryEncounterTier.COMMON)
.withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES) .withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES)
.withScenePartySizeRequirement(2, 6, true)
.withAutoHideIntroVisuals(false) .withAutoHideIntroVisuals(false)
.withCatchAllowed(true) .withCatchAllowed(true)
.withIntroSpriteConfigs([ .withIntroSpriteConfigs([

View File

@ -290,7 +290,10 @@ export function applyDamageToPokemon(scene: BattleScene, pokemon: PlayerPokemon,
if (damage <= 0) { if (damage <= 0) {
console.warn("Healing pokemon with `applyDamageToPokemon` is not recommended! Please use `applyHealToPokemon` instead."); console.warn("Healing pokemon with `applyDamageToPokemon` is not recommended! Please use `applyHealToPokemon` instead.");
} }
// If a Pokemon would faint from the damage applied, its HP is instead set to 1.
if (pokemon.isAllowedInBattle() && pokemon.hp - damage <= 0) {
damage = pokemon.hp - 1;
}
applyHpChangeToPokemon(scene, pokemon, -damage); applyHpChangeToPokemon(scene, pokemon, -damage);
} }

View File

@ -177,7 +177,11 @@ class DefaultOverrides {
// MYSTERY ENCOUNTER OVERRIDES // MYSTERY ENCOUNTER OVERRIDES
// ------------------------- // -------------------------
/** 1 to 256, set to null to ignore */ /**
* `1` (almost never) to `256` (always), set to `null` to disable the override
*
* Note: Make sure `STARTING_WAVE_OVERRIDE > 10`, otherwise MEs won't trigger
*/
readonly MYSTERY_ENCOUNTER_RATE_OVERRIDE: number | null = null; readonly MYSTERY_ENCOUNTER_RATE_OVERRIDE: number | null = null;
readonly MYSTERY_ENCOUNTER_TIER_OVERRIDE: MysteryEncounterTier | null = null; readonly MYSTERY_ENCOUNTER_TIER_OVERRIDE: MysteryEncounterTier | null = null;
readonly MYSTERY_ENCOUNTER_OVERRIDE: MysteryEncounterType | null = null; readonly MYSTERY_ENCOUNTER_OVERRIDE: MysteryEncounterType | null = null;

View File

@ -23,6 +23,12 @@ import * as Utils from "#app/utils";
import { PlayerGender } from "#enums/player-gender"; import { PlayerGender } from "#enums/player-gender";
import { TrainerType } from "#enums/trainer-type"; import { TrainerType } from "#enums/trainer-type";
import i18next from "i18next"; import i18next from "i18next";
import { SessionSaveData } from "#app/system/game-data";
import PersistentModifierData from "#app/system/modifier-data";
import PokemonData from "#app/system/pokemon-data";
import ChallengeData from "#app/system/challenge-data";
import TrainerData from "#app/system/trainer-data";
import ArenaData from "#app/system/arena-data";
import { pokerogueApi } from "#app/plugins/api/pokerogue-api"; import { pokerogueApi } from "#app/plugins/api/pokerogue-api";
export class GameOverPhase extends BattlePhase { export class GameOverPhase extends BattlePhase {
@ -109,7 +115,7 @@ export class GameOverPhase extends BattlePhase {
this.scene.gameData.gameStats.dailyRunSessionsWon++; this.scene.gameData.gameStats.dailyRunSessionsWon++;
} }
} }
this.scene.gameData.saveRunHistory(this.scene, this.scene.gameData.getSessionSaveData(this.scene), this.isVictory);
const fadeDuration = this.isVictory ? 10000 : 5000; const fadeDuration = this.isVictory ? 10000 : 5000;
this.scene.fadeOutBgm(fadeDuration, true); this.scene.fadeOutBgm(fadeDuration, true);
const activeBattlers = this.scene.getField().filter(p => p?.isActive(true)); const activeBattlers = this.scene.getField().filter(p => p?.isActive(true));
@ -135,8 +141,11 @@ export class GameOverPhase extends BattlePhase {
this.scene.unshiftPhase(new GameOverModifierRewardPhase(this.scene, modifierTypes.VOUCHER_PREMIUM)); this.scene.unshiftPhase(new GameOverModifierRewardPhase(this.scene, modifierTypes.VOUCHER_PREMIUM));
} }
} }
this.getRunHistoryEntry().then(runHistoryEntry => {
this.scene.gameData.saveRunHistory(this.scene, runHistoryEntry, this.isVictory);
this.scene.pushPhase(new PostGameOverPhase(this.scene, endCardPhase)); this.scene.pushPhase(new PostGameOverPhase(this.scene, endCardPhase));
this.end(); this.end();
});
}; };
if (this.isVictory && this.scene.gameMode.isClassic) { if (this.isVictory && this.scene.gameMode.isClassic) {
@ -212,5 +221,34 @@ export class GameOverPhase extends BattlePhase {
this.firstRibbons.push(getPokemonSpecies(pokemon.species.getRootSpeciesId(forStarter))); this.firstRibbons.push(getPokemonSpecies(pokemon.species.getRootSpeciesId(forStarter)));
} }
} }
/**
* Slightly modified version of {@linkcode GameData.getSessionSaveData}.
* @returns A promise containing the {@linkcode SessionSaveData}
*/
private async getRunHistoryEntry(): Promise<SessionSaveData> {
const preWaveSessionData = await this.scene.gameData.getSession(this.scene.sessionSlotId);
return {
seed: this.scene.seed,
playTime: this.scene.sessionPlayTime,
gameMode: this.scene.gameMode.modeId,
party: this.scene.getPlayerParty().map(p => new PokemonData(p)),
enemyParty: this.scene.getEnemyParty().map(p => new PokemonData(p)),
modifiers: preWaveSessionData ? preWaveSessionData.modifiers : this.scene.findModifiers(() => true).map(m => new PersistentModifierData(m, true)),
enemyModifiers: preWaveSessionData ? preWaveSessionData.enemyModifiers : this.scene.findModifiers(() => true, false).map(m => new PersistentModifierData(m, false)),
arena: new ArenaData(this.scene.arena),
pokeballCounts: this.scene.pokeballCounts,
money: Math.floor(this.scene.money),
score: this.scene.score,
waveIndex: this.scene.currentBattle.waveIndex,
battleType: this.scene.currentBattle.battleType,
trainer: this.scene.currentBattle.trainer ? new TrainerData(this.scene.currentBattle.trainer) : null,
gameVersion: this.scene.game.config.gameVersion,
timestamp: new Date().getTime(),
challenges: this.scene.gameMode.challenges.map(c => new ChallengeData(c)),
mysteryEncounterType: this.scene.currentBattle.mysteryEncounter?.encounterType ?? -1,
mysteryEncounterSaveData: this.scene.mysteryEncounterSaveData
} as SessionSaveData;
}
} }

View File

@ -118,6 +118,7 @@ export default class RunInfoUiHandler extends UiHandler {
this.runResultContainer = this.scene.add.container(0, 24); this.runResultContainer = this.scene.add.container(0, 24);
const runResultWindow = addWindow(this.scene, 0, 0, this.statsBgWidth - 11, 65); const runResultWindow = addWindow(this.scene, 0, 0, this.statsBgWidth - 11, 65);
runResultWindow.setOrigin(0, 0); runResultWindow.setOrigin(0, 0);
runResultWindow.setName("Run_Result_Window");
this.runResultContainer.add(runResultWindow); this.runResultContainer.add(runResultWindow);
if (this.runDisplayMode === RunDisplayMode.RUN_HISTORY) { if (this.runDisplayMode === RunDisplayMode.RUN_HISTORY) {
this.parseRunResult(); this.parseRunResult();
@ -254,8 +255,6 @@ export default class RunInfoUiHandler extends UiHandler {
* Mystery Encounters contain sprites associated with MEs + the title of the specific ME. * Mystery Encounters contain sprites associated with MEs + the title of the specific ME.
*/ */
private parseRunStatus() { private parseRunStatus() {
const runStatusText = addTextObject(this.scene, 6, 5, `${i18next.t("saveSlotSelectUiHandler:wave")} ${this.runInfo.waveIndex} - ${getBiomeName(this.runInfo.arena.biome)}`, TextStyle.WINDOW, { fontSize : "65px", lineSpacing: 0.1 });
const enemyContainer = this.scene.add.container(0, 0); const enemyContainer = this.scene.add.container(0, 0);
this.runResultContainer.add(enemyContainer); this.runResultContainer.add(enemyContainer);
if (this.runInfo.battleType === BattleType.WILD) { if (this.runInfo.battleType === BattleType.WILD) {
@ -271,7 +270,7 @@ export default class RunInfoUiHandler extends UiHandler {
const pokeball = this.scene.add.sprite(0, 0, "pb"); const pokeball = this.scene.add.sprite(0, 0, "pb");
pokeball.setFrame(getPokeballAtlasKey(p.pokeball)); pokeball.setFrame(getPokeballAtlasKey(p.pokeball));
pokeball.setScale(0.5); pokeball.setScale(0.5);
pokeball.setPosition(52 + ((i % row_limit) * 8), (i <= 2) ? 18 : 25); pokeball.setPosition(58 + ((i % row_limit) * 8), (i <= 2) ? 18 : 25);
enemyContainer.add(pokeball); enemyContainer.add(pokeball);
}); });
const trainerObj = this.runInfo.trainer.toTrainer(this.scene); const trainerObj = this.runInfo.trainer.toTrainer(this.scene);
@ -286,7 +285,7 @@ export default class RunInfoUiHandler extends UiHandler {
const descContainer = this.scene.add.container(0, 0); const descContainer = this.scene.add.container(0, 0);
const textBox = addTextObject(this.scene, 0, 0, boxString, TextStyle.WINDOW, { fontSize : "35px", wordWrap: { width: 200 }}); const textBox = addTextObject(this.scene, 0, 0, boxString, TextStyle.WINDOW, { fontSize : "35px", wordWrap: { width: 200 }});
descContainer.add(textBox); descContainer.add(textBox);
descContainer.setPosition(52, 29); descContainer.setPosition(55, 32);
this.runResultContainer.add(descContainer); this.runResultContainer.add(descContainer);
} else if (this.runInfo.battleType === BattleType.MYSTERY_ENCOUNTER) { } else if (this.runInfo.battleType === BattleType.MYSTERY_ENCOUNTER) {
const encounterExclaim = this.scene.add.sprite(0, 0, "encounter_exclaim"); const encounterExclaim = this.scene.add.sprite(0, 0, "encounter_exclaim");
@ -303,7 +302,17 @@ export default class RunInfoUiHandler extends UiHandler {
this.runResultContainer.add([ encounterExclaim, subSprite, descContainer ]); this.runResultContainer.add([ encounterExclaim, subSprite, descContainer ]);
} }
this.runResultContainer.add(runStatusText); const runResultWindow = this.runResultContainer.getByName("Run_Result_Window") as Phaser.GameObjects.Image;
const windowCenterX = runResultWindow.getTopCenter().x;
const windowBottomY = runResultWindow.getBottomCenter().y;
const runStatusText = addTextObject(this.scene, windowCenterX, 5, `${i18next.t("saveSlotSelectUiHandler:wave")} ${this.runInfo.waveIndex}`, TextStyle.WINDOW, { fontSize : "60px", lineSpacing: 0.1 });
runStatusText.setOrigin(0.5, 0);
const currentBiomeText = addTextObject(this.scene, windowCenterX, windowBottomY - 5, `${getBiomeName(this.runInfo.arena.biome)}`, TextStyle.WINDOW, { fontSize: "60px" });
currentBiomeText.setOrigin(0.5, 1);
this.runResultContainer.add([ runStatusText, currentBiomeText ]);
this.runContainer.add(this.runResultContainer); this.runContainer.add(this.runResultContainer);
} }
@ -387,12 +396,12 @@ export default class RunInfoUiHandler extends UiHandler {
tObjSprite.setPosition(-9, -3); tObjSprite.setPosition(-9, -3);
tObjPartnerSprite.setScale(0.55); tObjPartnerSprite.setScale(0.55);
doubleContainer.add([ tObjSprite, tObjPartnerSprite ]); doubleContainer.add([ tObjSprite, tObjPartnerSprite ]);
doubleContainer.setPosition(28, 40); doubleContainer.setPosition(28, 34);
} }
enemyContainer.add(doubleContainer); enemyContainer.add(doubleContainer);
} else { } else {
const scale = (this.runDisplayMode === RunDisplayMode.RUN_HISTORY) ? 0.35 : 0.65; const scale = (this.runDisplayMode === RunDisplayMode.RUN_HISTORY) ? 0.35 : 0.55;
const position = (this.runDisplayMode === RunDisplayMode.RUN_HISTORY) ? [ 12, 28 ] : [ 32, 36 ]; const position = (this.runDisplayMode === RunDisplayMode.RUN_HISTORY) ? [ 12, 28 ] : [ 30, 32 ];
tObjSprite.setScale(scale, scale); tObjSprite.setScale(scale, scale);
tObjSprite.setPosition(position[0], position[1]); tObjSprite.setPosition(position[0], position[1]);
enemyContainer.add(tObjSprite); enemyContainer.add(tObjSprite);