Log encounters

This commit is contained in:
RedstonewolfX 2024-07-07 17:22:51 -04:00
parent ab96325a82
commit 9722264f1b
2 changed files with 120 additions and 16 deletions

View File

@ -1,15 +1,21 @@
import i18next from "i18next";
import * as Utils from "./utils";
import Pokemon from "./field/pokemon";
import { PlayerPokemon, EnemyPokemon } from "./field/pokemon";
import { Nature, getNatureName } from "./data/nature";
import BattleScene from "./battle-scene";
import { OptionSelectItem } from "./ui/abstact-option-select-ui-handler";
import { TrainerType } from "#enums/trainer-type";
/**
* All logs.
*
* Format: [filename, localStorage key, name, header]
* Format: [filename, localStorage key, name, header, item sprite, header suffix]
*/
export const logs: string[][] = [
["instructions.txt", "path_log", "Steps", "Run Steps", "wide_lens"],
["encounters.csv", "enc_log", "Encounters", "Encounter Data"],
["log.txt", "debug_log", "Debug", "Debug Log"],
["instructions.txt", "path_log", "Steps", "Run Steps", "wide_lens", ""],
["encounters.csv", "enc_log", "Encounters", "Encounter Data", "", ",,,,,,,,,,,,,,,,"],
["log.txt", "debug_log", "Debug", "Debug Log", "", ""],
]
export var logKeys: string[] = [
"i", // Instructions/steps
@ -29,6 +35,16 @@ export function getSize(str: string) {
return d.toString() + filesizes[unit]
}
export function generateOption(i: integer): OptionSelectItem {
return {
label: `Export ${logs[i][2]} (${getSize(localStorage.getItem(logs[i][1]))})`,
handler: () => {
downloadLogByID(i)
return false;
}
}
}
/**
* Writes data to a new line.
* @param keyword The identifier key for the log you're writing to
@ -51,7 +67,7 @@ export function appendLog(keyword: string, data: string) {
* @param keyword The identifier key for the log you want to reste
*/
export function clearLog(keyword: string) {
localStorage.setItem(logs[logKeys.indexOf(keyword)][1], "---- " + logs[logKeys.indexOf(keyword)][3] + " ----")
localStorage.setItem(logs[logKeys.indexOf(keyword)][1], "---- " + logs[logKeys.indexOf(keyword)][3] + " ----" + logs[logKeys.indexOf(keyword)][5])
}
/**
* Saves a log to your device.
@ -67,3 +83,92 @@ export function downloadLog(keyword: string) {
link.click();
link.remove();
}
export function downloadLogByID(i: integer) {
console.log(i)
var d = localStorage.getItem(logs[i][1])
const blob = new Blob([ d ], {type: "text/json"});
const link = document.createElement("a");
link.href = window.URL.createObjectURL(blob);
link.download = `${logs[i][0]}`;
link.click();
link.remove();
}
export function logTeam(scene: BattleScene, floor: integer = undefined) {
if (floor == undefined) floor = scene.currentBattle.waveIndex
var team = scene.getEnemyParty()
if (team[0].hasTrainer()) {
var sprite = scene.currentBattle.trainer.config.getSpriteKey()
var trainerCat = Utils.getEnumKeys(TrainerType)[Utils.getEnumValues(TrainerType).indexOf(scene.currentBattle.trainer.config.trainerType)]
setRow("e", floor + "," + team.length + "," + sprite + ",trainer," + trainerCat + ",,,,,,,,,,,,", floor, 0)
} else {
for (var i = 0; i < team.length; i++) {
logPokemon(scene, floor, i, team[i])
}
if (team.length == 1) {
setRow("e", ",,,,,,,,,,,,,,,,", floor, 1)
}
}
}
export function logPokemon(scene: BattleScene, floor: integer = undefined, slot: integer, pokemon: EnemyPokemon) {
if (floor == undefined) floor = scene.currentBattle.waveIndex
var modifiers: string[] = []
var mods = pokemon.getHeldItems()
for (var i = 0; i < mods.length; i++) {
modifiers.push(mods[i].type.name + (mods[i].getMaxStackCount(scene) == 1 ? "" : " x" + mods[i].getStackCount()))
}
var sprite = pokemon.getBattleSpriteAtlasPath()
// floor,party slot,encounter,species,ability,passive,level,gender,isBoss,nature,HP IV,Attack IV,Defense IV,Sp. Atk IV,Sp. Def IV,Speed IV,Items separated by slashes /
var newLine = floor + ","
+ slot + ","
+ sprite + ","
+ (pokemon.hasTrainer() ? "trainer_pokemon" : "wild") + ","
+ pokemon.species.getName(pokemon.formIndex) + (pokemon.getFormKey() == "" ? "" : " (" + pokemon.getFormKey() + ")") + ","
+ pokemon.getAbility().name.toLowerCase() + ","
+ pokemon.getPassiveAbility().name.toLowerCase() + ","
+ pokemon.level + ","
+ (pokemon.gender == 0 ? "M" : (pokemon.gender == 1 ? "F" : "")) + ","
+ (pokemon.isBoss() ? "true" : "false") + ","
+ getNatureName(pokemon.nature) + ","
+ pokemon.ivs[0] + ","
+ pokemon.ivs[1] + ","
+ pokemon.ivs[2] + ","
+ pokemon.ivs[3] + ","
+ pokemon.ivs[4] + ","
+ pokemon.ivs[5] + ","
+ modifiers.join("/")
//console.log(idx, data.slice(0, idx), newLine, data.slice(idx))
setRow("e", newLine, floor, slot)
//console.log(localStorage.getItem(logs[logKeys.indexOf("e")][1]).split("\n"))
}
export function setRow(keyword: string, newLine: string, floor: integer, slot: integer) {
var data = localStorage.getItem(logs[logKeys.indexOf(keyword)][1]).split("\n")
var idx = 1
if (slot == -1) {
while (idx < data.length && (data[idx].split(",")[0] as any) * 1 < floor) {
idx++
}
idx--
slot = ((data[idx].split(",")[1] as any) * 1) + 1
} else {
while (idx < data.length && (data[idx].split(",")[0] as any) * 1 <= floor && (data[idx].split(",")[1] as any) * 1 <= slot) {
idx++
}
}
localStorage.setItem(logs[logKeys.indexOf(keyword)][1], data.slice(0, idx).join("\n") + "\n" + newLine + (data.slice(idx).length == 0 ? "" : "\n") + data.slice(idx).join("\n"));
}
export function setRowByID(key: integer, newLine: string, floor: integer, slot: integer) {
var data = localStorage.getItem(logs[key][1]).split("\n")
var idx = 1
if (slot == -1) {
while (idx < data.length && (data[idx].split(",")[0] as any) * 1 < floor) {
idx++
}
idx--
slot = ((data[idx].split(",")[1] as any) * 1) + 1
} else {
while (idx < data.length && (data[idx].split(",")[0] as any) * 1 <= floor && (data[idx].split(",")[1] as any) * 1 <= slot) {
idx++
}
}
localStorage.setItem(logs[key][1], data.slice(0, idx).join("\n") + "\n" + newLine + (data.slice(idx).length == 0 ? "" : "\n") + data.slice(idx).join("\n"));
}

View File

@ -501,28 +501,25 @@ export class TitlePhase extends Phase {
const options: OptionSelectItem[] = [];
for (var i = 0; i < LoggerTools.logs.length; i++) {
if (localStorage.getItem(LoggerTools.logs[i][1]) != null)
options.push({
label: `Export ${LoggerTools.logs[i][2]} (${LoggerTools.getSize(LoggerTools.logs[i][2])})`,
handler: () => {
LoggerTools.downloadLog(LoggerTools.logKeys[i])
return true;
}
})
options.push(LoggerTools.generateOption(i) as OptionSelectItem)
}
options.push({
label: `Export all (${options.length})`,
handler: () => {
for (var i = 0; i < LoggerTools.logKeys[i].length; i++) {
for (var i = 0; i < LoggerTools.logKeys.length; i++) {
LoggerTools.downloadLog(LoggerTools.logKeys[i])
}
return true;
return false;
}
}, {
label: `Reset all (${LoggerTools.logKeys[i].length})`,
label: `Reset all (${LoggerTools.logKeys.length})`,
handler: () => {
for (var i = 0; i < LoggerTools.logKeys[i].length; i++) {
for (var i = 0; i < LoggerTools.logKeys.length; i++) {
LoggerTools.clearLog(LoggerTools.logKeys[i])
}
this.scene.clearPhaseQueue();
this.scene.pushPhase(new TitlePhase(this.scene));
super.end();
return true;
}
}, {
@ -1250,6 +1247,8 @@ export class EncounterPhase extends BattlePhase {
doEncounterCommon(showEncounterMessage: boolean = true) {
const enemyField = this.scene.getEnemyField();
LoggerTools.logTeam(this.scene, this.scene.currentBattle.waveIndex)
if (this.scene.currentBattle.battleType === BattleType.WILD) {
enemyField.forEach(enemyPokemon => {
enemyPokemon.untint(100, "Sine.easeOut");