Merge pull request #3 from DayKev/pr/6248-review

Review for PR 6248
This commit is contained in:
Jimmybald1 2025-08-10 15:30:04 +02:00 committed by GitHub
commit 7a4e50bb18
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -25,7 +25,7 @@ export function fetchDailyRunSeed(): Promise<string | null> {
} }
export function getDailyRunStarters(seed: string): Starter[] { export function getDailyRunStarters(seed: string): Starter[] {
let starters: Starter[] = []; const starters: Starter[] = [];
globalScene.executeWithSeedOffset( globalScene.executeWithSeedOffset(
() => { () => {
@ -33,7 +33,7 @@ export function getDailyRunStarters(seed: string): Starter[] {
const eventStarters = getDailyEventSeedStarters(seed); const eventStarters = getDailyEventSeedStarters(seed);
if (!isNullOrUndefined(eventStarters)) { if (!isNullOrUndefined(eventStarters)) {
starters = eventStarters; starters.push(...eventStarters);
return; return;
} }
@ -158,18 +158,20 @@ export function getDailyStartingBiome(): BiomeId {
} }
/** /**
* If this is Daily Mode and the seed is longer than a default seed then it has been modified and could contain a custom event seed. * If this is Daily Mode and the seed is longer than a default seed
* Default seeds are always 24 characters. * then it has been modified and could contain a custom event seed. \
* @returns True if it is a Daily Event Seed. * Default seeds are always exactly 24 characters.
* @returns `true` if it is a Daily Event Seed.
*/ */
export function isDailyEventSeed(seed: string): boolean { export function isDailyEventSeed(seed: string): boolean {
return globalScene.gameMode.isDaily && seed.length > 24; return globalScene.gameMode.isDaily && seed.length > 24;
} }
/** /**
* Expects the seed to contain: /starters\d{18}/ * Expects the seed to contain `/starters\d{18}/`
* Where each Starter is 4 digits for the SpeciesId and 2 digits for the FormIndex * where the digits alternate between 4 digits for the species ID and 2 digits for the form index
* @returns An {@linkcode Starter[]} containing the starters or null if no valid match. * (left padded with `0`s as necessary).
* @returns An array of {@linkcode Starter}s, or `null` if no valid match.
*/ */
export function getDailyEventSeedStarters(seed: string): Starter[] | null { export function getDailyEventSeedStarters(seed: string): Starter[] | null {
if (!isDailyEventSeed(seed)) { if (!isDailyEventSeed(seed)) {
@ -178,32 +180,34 @@ export function getDailyEventSeedStarters(seed: string): Starter[] | null {
const starters: Starter[] = []; const starters: Starter[] = [];
const match = /starters(\d{4})(\d{2})(\d{4})(\d{2})(\d{4})(\d{2})/g.exec(seed); const match = /starters(\d{4})(\d{2})(\d{4})(\d{2})(\d{4})(\d{2})/g.exec(seed);
if (match && match.length === 7) {
for (let i = 1; i < match.length; i += 2) {
const speciesId = Number.parseInt(match[i]) as SpeciesId;
const formIndex = Number.parseInt(match[i + 1]);
if (!Object.values(SpeciesId).includes(speciesId)) { if (!match || match.length !== 7) {
// Incorrect event seed, abort. return null;
return null;
}
const starterForm = getPokemonSpeciesForm(speciesId, formIndex);
const startingLevel = globalScene.gameMode.getStartingLevel();
const starter = getDailyRunStarter(starterForm, startingLevel);
starters.push(starter);
}
return starters;
} }
return null; for (let i = 1; i < match.length; i += 2) {
const speciesId = Number.parseInt(match[i]) as SpeciesId;
const formIndex = Number.parseInt(match[i + 1]);
if (!getEnumValues(SpeciesId).includes(speciesId)) {
console.warn("Invalid species ID used for custom daily run seed starter:", speciesId);
return null;
}
const starterForm = getPokemonSpeciesForm(speciesId, formIndex);
const startingLevel = globalScene.gameMode.getStartingLevel();
const starter = getDailyRunStarter(starterForm, startingLevel);
starters.push(starter);
}
return starters;
} }
/** /**
* Expects the seed to contain: /boss\d{4}\d{2}/ * Expects the seed to contain `/boss\d{4}\d{2}/`
* Where the boss is 4 digits for the SpeciesId and 2 digits for the form index * where the first 4 digits are the species ID and the next 2 digits are the form index
* @returns A {@linkcode PokemonSpeciesForm} containing the boss or null if no valid match. * (left padded with `0`s as necessary).
* @returns A {@linkcode PokemonSpeciesForm} to be used for the boss, or `null` if no valid match.
*/ */
export function getDailyEventSeedBoss(seed: string): PokemonSpeciesForm | null { export function getDailyEventSeedBoss(seed: string): PokemonSpeciesForm | null {
if (!isDailyEventSeed(seed)) { if (!isDailyEventSeed(seed)) {
@ -211,26 +215,25 @@ export function getDailyEventSeedBoss(seed: string): PokemonSpeciesForm | null {
} }
const match = /boss(\d{4})(\d{2})/g.exec(seed); const match = /boss(\d{4})(\d{2})/g.exec(seed);
if (match && match.length === 3) { if (!match || match.length !== 3) {
const speciesId = Number.parseInt(match[1]) as SpeciesId; return null;
const formIndex = Number.parseInt(match[2]);
if (!Object.values(SpeciesId).includes(speciesId)) {
// Incorrect event seed, abort.
return null;
}
const starterForm = getPokemonSpeciesForm(speciesId, formIndex);
return starterForm;
} }
return null; const speciesId = Number.parseInt(match[1]) as SpeciesId;
const formIndex = Number.parseInt(match[2]);
if (!getEnumValues(SpeciesId).includes(speciesId)) {
console.warn("Invalid species ID used for custom daily run seed boss:", speciesId);
return null;
}
const starterForm = getPokemonSpeciesForm(speciesId, formIndex);
return starterForm;
} }
/** /**
* Expects the seed to contain: /biome\d{2}/ or /biome\d{2}/ * Expects the seed to contain `/biome\d{2}/` where the 2 digits are a biome ID (left padded with `0` if necessary).
* Where the biome is 2 digits for the BiomeId. * @returns The biome to use or `null` if no valid match.
* @returns A {@linkcode DailyEventSeedBiome} containing the Biome or null if no valid match.
*/ */
export function getDailyEventSeedBiome(seed: string): BiomeId | null { export function getDailyEventSeedBiome(seed: string): BiomeId | null {
if (!isDailyEventSeed(seed)) { if (!isDailyEventSeed(seed)) {
@ -238,24 +241,24 @@ export function getDailyEventSeedBiome(seed: string): BiomeId | null {
} }
const match = /biome(\d{2})/g.exec(seed); const match = /biome(\d{2})/g.exec(seed);
if (match && match.length === 2) { if (!match || match.length !== 2) {
const startingBiome = Number.parseInt(match[1]) as BiomeId; return null;
if (!Object.values(BiomeId).includes(startingBiome)) {
// Incorrect event seed, abort.
return null;
}
return startingBiome;
} }
return null; const startingBiome = Number.parseInt(match[1]) as BiomeId;
if (!getEnumValues(BiomeId).includes(startingBiome)) {
console.warn("Invalid biome ID used for custom daily run seed:", startingBiome);
return null;
}
return startingBiome;
} }
/** /**
* Expects the seed to contain: /luck\d{2}/ * Expects the seed to contain `/luck\d{2}/` where the 2 digits are a number between `0` and `14`
* Where the Luck has 2 digits for the number. * (left padded with `0` if necessary).
* @returns A {@linkcode number} representing the Daily Luck value or null if no valid match. * @returns The custom luck value or `null` if no valid match.
*/ */
export function getDailyEventSeedLuck(seed: string): number | null { export function getDailyEventSeedLuck(seed: string): number | null {
if (!isDailyEventSeed(seed)) { if (!isDailyEventSeed(seed)) {
@ -263,16 +266,16 @@ export function getDailyEventSeedLuck(seed: string): number | null {
} }
const match = /luck(\d{2})/g.exec(seed); const match = /luck(\d{2})/g.exec(seed);
if (match && match.length === 2) { if (!match || match.length !== 2) {
const luck = Number.parseInt(match[1]); return null;
if (luck < 0 || luck > 14) {
// Incorrect event seed, abort.
return null;
}
return luck;
} }
return null; const luck = Number.parseInt(match[1]);
if (luck < 0 || luck > 14) {
console.warn("Invalid luck value used for custom daily run seed:", luck);
return null;
}
return luck;
} }