Make more arrays readonly

This commit is contained in:
Sirz Benjie 2025-09-22 14:12:37 -05:00
parent 6896e9abaa
commit e938ff608d
No known key found for this signature in database
GPG Key ID: 4A524B4D196C759E
9 changed files with 41 additions and 62 deletions

View File

@ -6699,7 +6699,7 @@ function getPokemonWithWeatherBasedForms() {
// biome-ignore format: prevent biome from removing the newlines (e.g. prevent `new Ability(...).attr(...)`) // biome-ignore format: prevent biome from removing the newlines (e.g. prevent `new Ability(...).attr(...)`)
export function initAbilities() { export function initAbilities() {
allAbilities.push( (allAbilities as Ability[]).push(
new Ability(AbilityId.NONE, 3), new Ability(AbilityId.NONE, 3),
new Ability(AbilityId.STENCH, 3) new Ability(AbilityId.STENCH, 3)
.attr(PostAttackApplyBattlerTagAbAttr, false, (user, target, move) => !move.hasAttr("FlinchAttr") && !move.hitsSubstitute(user, target) ? 10 : 0, BattlerTagType.FLINCHED), .attr(PostAttackApplyBattlerTagAbAttr, false, (user, target, move) => !move.hasAttr("FlinchAttr") && !move.hitsSubstitute(user, target) ? 10 : 0, BattlerTagType.FLINCHED),

View File

@ -8,7 +8,7 @@ import { SpeciesId } from "#enums/species-id";
// biome-ignore format: manually formatted // biome-ignore format: manually formatted
export function initSpecies() { export function initSpecies() {
allSpecies.push( (allSpecies as PokemonSpecies[]).push(
new PokemonSpecies(SpeciesId.BULBASAUR, 1, false, false, false, "Seed Pokémon", PokemonType.GRASS, PokemonType.POISON, 0.7, 6.9, AbilityId.OVERGROW, AbilityId.NONE, AbilityId.CHLOROPHYLL, 318, 45, 49, 49, 65, 65, 45, 45, 50, 64, GrowthRate.MEDIUM_SLOW, 87.5, false), new PokemonSpecies(SpeciesId.BULBASAUR, 1, false, false, false, "Seed Pokémon", PokemonType.GRASS, PokemonType.POISON, 0.7, 6.9, AbilityId.OVERGROW, AbilityId.NONE, AbilityId.CHLOROPHYLL, 318, 45, 49, 49, 65, 65, 45, 45, 50, 64, GrowthRate.MEDIUM_SLOW, 87.5, false),
new PokemonSpecies(SpeciesId.IVYSAUR, 1, false, false, false, "Seed Pokémon", PokemonType.GRASS, PokemonType.POISON, 1, 13, AbilityId.OVERGROW, AbilityId.NONE, AbilityId.CHLOROPHYLL, 405, 60, 62, 63, 80, 80, 60, 45, 50, 142, GrowthRate.MEDIUM_SLOW, 87.5, false), new PokemonSpecies(SpeciesId.IVYSAUR, 1, false, false, false, "Seed Pokémon", PokemonType.GRASS, PokemonType.POISON, 1, 13, AbilityId.OVERGROW, AbilityId.NONE, AbilityId.CHLOROPHYLL, 405, 60, 62, 63, 80, 80, 60, 45, 50, 142, GrowthRate.MEDIUM_SLOW, 87.5, false),
new PokemonSpecies(SpeciesId.VENUSAUR, 1, false, false, false, "Seed Pokémon", PokemonType.GRASS, PokemonType.POISON, 2, 100, AbilityId.OVERGROW, AbilityId.NONE, AbilityId.CHLOROPHYLL, 525, 80, 82, 83, 100, 100, 80, 45, 50, 263, GrowthRate.MEDIUM_SLOW, 87.5, true, true, new PokemonSpecies(SpeciesId.VENUSAUR, 1, false, false, false, "Seed Pokémon", PokemonType.GRASS, PokemonType.POISON, 2, 100, AbilityId.OVERGROW, AbilityId.NONE, AbilityId.CHLOROPHYLL, 525, 80, 82, 83, 100, 100, 80, 45, 50, 263, GrowthRate.MEDIUM_SLOW, 87.5, true, true,

View File

@ -3,9 +3,9 @@ import type { PokemonSpecies } from "#data/pokemon-species";
import type { ModifierTypes } from "#modifiers/modifier-type"; import type { ModifierTypes } from "#modifiers/modifier-type";
import type { Move } from "#moves/move"; import type { Move } from "#moves/move";
export const allAbilities: Ability[] = []; export const allAbilities: readonly Ability[] = [];
export const allMoves: Move[] = []; export const allMoves: readonly Move[] = [];
export const allSpecies: PokemonSpecies[] = []; export const allSpecies: readonly PokemonSpecies[] = [];
// TODO: Figure out what this is used for and provide an appropriate tsdoc comment // TODO: Figure out what this is used for and provide an appropriate tsdoc comment
export const modifierTypes = {} as ModifierTypes; export const modifierTypes = {} as ModifierTypes;

View File

@ -8394,7 +8394,7 @@ const MoveAttrs = Object.freeze({
export type MoveAttrConstructorMap = typeof MoveAttrs; export type MoveAttrConstructorMap = typeof MoveAttrs;
export function initMoves() { export function initMoves() {
allMoves.push( (allMoves as Move[]).push(
new SelfStatusMove(MoveId.NONE, PokemonType.NORMAL, MoveCategory.STATUS, -1, -1, 0, 1), new SelfStatusMove(MoveId.NONE, PokemonType.NORMAL, MoveCategory.STATUS, -1, -1, 0, 1),
new AttackMove(MoveId.POUND, PokemonType.NORMAL, MoveCategory.PHYSICAL, 40, 100, 35, -1, 0, 1), new AttackMove(MoveId.POUND, PokemonType.NORMAL, MoveCategory.PHYSICAL, 40, 100, 35, -1, 0, 1),
new AttackMove(MoveId.KARATE_CHOP, PokemonType.FIGHTING, MoveCategory.PHYSICAL, 50, 100, 25, -1, 0, 1) new AttackMove(MoveId.KARATE_CHOP, PokemonType.FIGHTING, MoveCategory.PHYSICAL, 50, 100, 25, -1, 0, 1)

View File

@ -78,7 +78,7 @@ const POOL_1_POKEMON = [
SpeciesId.RIBOMBEE, SpeciesId.RIBOMBEE,
SpeciesId.SPIDOPS, SpeciesId.SPIDOPS,
SpeciesId.LOKIX, SpeciesId.LOKIX,
]; ] as const;
const POOL_2_POKEMON = [ const POOL_2_POKEMON = [
SpeciesId.SCYTHER, SpeciesId.SCYTHER,
@ -104,41 +104,20 @@ const POOL_2_POKEMON = [
SpeciesId.CENTISKORCH, SpeciesId.CENTISKORCH,
SpeciesId.FROSMOTH, SpeciesId.FROSMOTH,
SpeciesId.KLEAVOR, SpeciesId.KLEAVOR,
]; ] as const;
const POOL_3_POKEMON: { species: SpeciesId; formIndex?: number }[] = [ const POOL_3_POKEMON = [
{ { species: SpeciesId.PINSIR, formIndex: 1 },
species: SpeciesId.PINSIR, { species: SpeciesId.SCIZOR, formIndex: 1 },
formIndex: 1, { species: SpeciesId.HERACROSS, formIndex: 1 },
}, { species: SpeciesId.ORBEETLE, formIndex: 1 },
{ { species: SpeciesId.CENTISKORCH, formIndex: 1 },
species: SpeciesId.SCIZOR, { species: SpeciesId.DURANT } as { species: SpeciesId.DURANT; formIndex: undefined },
formIndex: 1, { species: SpeciesId.VOLCARONA } as { species: SpeciesId.VOLCARONA; formIndex: undefined },
}, { species: SpeciesId.GOLISOPOD } as { species: SpeciesId.GOLISOPOD; formIndex: undefined },
{ ] as const;
species: SpeciesId.HERACROSS,
formIndex: 1,
},
{
species: SpeciesId.ORBEETLE,
formIndex: 1,
},
{
species: SpeciesId.CENTISKORCH,
formIndex: 1,
},
{
species: SpeciesId.DURANT,
},
{
species: SpeciesId.VOLCARONA,
},
{
species: SpeciesId.GOLISOPOD,
},
];
const POOL_4_POKEMON = [SpeciesId.GENESECT, SpeciesId.SLITHER_WING, SpeciesId.BUZZWOLE, SpeciesId.PHEROMOSA]; const POOL_4_POKEMON = [SpeciesId.GENESECT, SpeciesId.SLITHER_WING, SpeciesId.BUZZWOLE, SpeciesId.PHEROMOSA] as const;
const PHYSICAL_TUTOR_MOVES = [ const PHYSICAL_TUTOR_MOVES = [
MoveId.MEGAHORN, MoveId.MEGAHORN,
@ -146,7 +125,7 @@ const PHYSICAL_TUTOR_MOVES = [
MoveId.BUG_BITE, MoveId.BUG_BITE,
MoveId.FIRST_IMPRESSION, MoveId.FIRST_IMPRESSION,
MoveId.LUNGE, MoveId.LUNGE,
]; ] as const;
const SPECIAL_TUTOR_MOVES = [ const SPECIAL_TUTOR_MOVES = [
MoveId.SILVER_WIND, MoveId.SILVER_WIND,
@ -154,7 +133,7 @@ const SPECIAL_TUTOR_MOVES = [
MoveId.BUG_BUZZ, MoveId.BUG_BUZZ,
MoveId.POLLEN_PUFF, MoveId.POLLEN_PUFF,
MoveId.STRUGGLE_BUG, MoveId.STRUGGLE_BUG,
]; ] as const;
const STATUS_TUTOR_MOVES = [ const STATUS_TUTOR_MOVES = [
MoveId.STRING_SHOT, MoveId.STRING_SHOT,
@ -162,14 +141,20 @@ const STATUS_TUTOR_MOVES = [
MoveId.RAGE_POWDER, MoveId.RAGE_POWDER,
MoveId.STICKY_WEB, MoveId.STICKY_WEB,
MoveId.SILK_TRAP, MoveId.SILK_TRAP,
]; ] as const;
const MISC_TUTOR_MOVES = [MoveId.LEECH_LIFE, MoveId.U_TURN, MoveId.HEAL_ORDER, MoveId.QUIVER_DANCE, MoveId.INFESTATION]; const MISC_TUTOR_MOVES = [
MoveId.LEECH_LIFE,
MoveId.U_TURN,
MoveId.HEAL_ORDER,
MoveId.QUIVER_DANCE,
MoveId.INFESTATION,
] as const;
/** /**
* Wave breakpoints that determine how strong to make the Bug-Type Superfan's team * Wave breakpoints that determine how strong to make the Bug-Type Superfan's team
*/ */
const WAVE_LEVEL_BREAKPOINTS = [30, 50, 70, 100, 120, 140, 160]; const WAVE_LEVEL_BREAKPOINTS = [30, 50, 70, 100, 120, 140, 160] as const;
/** /**
* Bug Type Superfan encounter. * Bug Type Superfan encounter.
@ -517,8 +502,8 @@ function getTrainerConfigForWave(waveIndex: number) {
const config = trainerConfigs[TrainerType.BUG_TYPE_SUPERFAN].clone(); const config = trainerConfigs[TrainerType.BUG_TYPE_SUPERFAN].clone();
config.name = i18next.t("trainerNames:bugTypeSuperfan"); config.name = i18next.t("trainerNames:bugTypeSuperfan");
let pool3Copy = POOL_3_POKEMON.slice(0); const pool3Copy = randSeedShuffle(POOL_3_POKEMON.slice());
pool3Copy = randSeedShuffle(pool3Copy); // Bang is fine here, as we know pool3Copy has at least 1 entry
const pool3Mon = pool3Copy.pop()!; const pool3Mon = pool3Copy.pop()!;
if (waveIndex < WAVE_LEVEL_BREAKPOINTS[0]) { if (waveIndex < WAVE_LEVEL_BREAKPOINTS[0]) {
@ -579,7 +564,6 @@ function getTrainerConfigForWave(waveIndex: number) {
}), }),
); );
} else if (waveIndex < WAVE_LEVEL_BREAKPOINTS[5]) { } else if (waveIndex < WAVE_LEVEL_BREAKPOINTS[5]) {
pool3Copy = randSeedShuffle(pool3Copy);
const pool3Mon2 = pool3Copy.pop()!; const pool3Mon2 = pool3Copy.pop()!;
config config
.setPartyTemplates(new TrainerPartyTemplate(5, PartyMemberStrength.AVERAGE)) .setPartyTemplates(new TrainerPartyTemplate(5, PartyMemberStrength.AVERAGE))
@ -657,7 +641,6 @@ function getTrainerConfigForWave(waveIndex: number) {
) )
.setPartyMemberFunc(4, getRandomPartyMemberFunc(POOL_4_POKEMON, TrainerSlot.TRAINER, true)); .setPartyMemberFunc(4, getRandomPartyMemberFunc(POOL_4_POKEMON, TrainerSlot.TRAINER, true));
} else { } else {
pool3Copy = randSeedShuffle(pool3Copy);
const pool3Mon2 = pool3Copy.pop()!; const pool3Mon2 = pool3Copy.pop()!;
config config
.setPartyTemplates( .setPartyTemplates(

View File

@ -35,7 +35,7 @@ export class SpeciesFormChange {
public formKey: string; public formKey: string;
public trigger: SpeciesFormChangeTrigger; public trigger: SpeciesFormChangeTrigger;
public quiet: boolean; public quiet: boolean;
public readonly conditions: SpeciesFormChangeCondition[]; public readonly conditions: readonly SpeciesFormChangeCondition[];
constructor( constructor(
speciesId: SpeciesId, speciesId: SpeciesId,

View File

@ -1000,7 +1000,7 @@ let t = 0;
* @param postProcess * @param postProcess
*/ */
export function getRandomPartyMemberFunc( export function getRandomPartyMemberFunc(
speciesPool: SpeciesId[], speciesPool: readonly SpeciesId[],
trainerSlot: TrainerSlot = TrainerSlot.TRAINER, trainerSlot: TrainerSlot = TrainerSlot.TRAINER,
ignoreEvolution = false, ignoreEvolution = false,
postProcess?: (enemyPokemon: EnemyPokemon) => void, postProcess?: (enemyPokemon: EnemyPokemon) => void,

View File

@ -588,7 +588,7 @@ export class Arena {
overrideTint(): [number, number, number] { overrideTint(): [number, number, number] {
switch (Overrides.ARENA_TINT_OVERRIDE) { switch (Overrides.ARENA_TINT_OVERRIDE) {
case TimeOfDay.DUSK: case TimeOfDay.DUSK:
return [98, 48, 73].map(c => Math.round((c + 128) / 2)) as [number, number, number]; return [113, 88, 101];
case TimeOfDay.NIGHT: case TimeOfDay.NIGHT:
return [64, 64, 64]; return [64, 64, 64];
case TimeOfDay.DAWN: case TimeOfDay.DAWN:

View File

@ -132,20 +132,16 @@ export function randSeedItem<T>(items: ArrayLike<T>): T {
} }
/** /**
* Shuffle a list using the seeded rng. Utilises the Fisher-Yates algorithm. * Shuffle a list in place using the seeded rng and the Fisher-Yates algorithm.
* @param items An array of items. * @param items An array of items.
* @returns A new shuffled array of items. * @returns `items` shuffled in place.
*/ */
export function randSeedShuffle<T>(items: T[]): T[] { export function randSeedShuffle<T>(items: T[]): T[] {
if (items.length <= 1) {
return items;
}
const newArray = items.slice(0);
for (let i = items.length - 1; i > 0; i--) { for (let i = items.length - 1; i > 0; i--) {
const j = Phaser.Math.RND.integerInRange(0, i); const j = Phaser.Math.RND.integerInRange(0, i);
[newArray[i], newArray[j]] = [newArray[j], newArray[i]]; [items[i], items[j]] = [items[j], items[i]];
} }
return newArray; return items;
} }
export function getFrameMs(frameCount: number): number { export function getFrameMs(frameCount: number): number {
@ -338,7 +334,7 @@ export function rgbToHsv(r: number, g: number, b: number) {
* @param rgb1 First RGB color in array * @param rgb1 First RGB color in array
* @param rgb2 Second RGB color in array * @param rgb2 Second RGB color in array
*/ */
export function deltaRgb(rgb1: number[], rgb2: number[]): number { export function deltaRgb(rgb1: readonly number[], rgb2: readonly number[]): number {
const [r1, g1, b1] = rgb1; const [r1, g1, b1] = rgb1;
const [r2, g2, b2] = rgb2; const [r2, g2, b2] = rgb2;
const drp2 = Math.pow(r1 - r2, 2); const drp2 = Math.pow(r1 - r2, 2);
@ -362,7 +358,7 @@ export function rgbHexToRgba(hex: string) {
}; };
} }
export function rgbaToInt(rgba: number[]): number { export function rgbaToInt(rgba: readonly number[]): number {
return (rgba[0] << 24) + (rgba[1] << 16) + (rgba[2] << 8) + rgba[3]; return (rgba[0] << 24) + (rgba[1] << 16) + (rgba[2] << 8) + rgba[3];
} }