2023-04-20 15:46:05 -04:00
|
|
|
import * as Utils from "../utils";
|
2024-07-02 23:22:46 +09:00
|
|
|
import i18next, { ParseKeys } from "i18next";
|
2023-04-11 19:08:03 -04:00
|
|
|
|
2023-04-03 23:38:31 -04:00
|
|
|
export enum StatusEffect {
|
|
|
|
NONE,
|
|
|
|
POISON,
|
|
|
|
TOXIC,
|
|
|
|
PARALYSIS,
|
|
|
|
SLEEP,
|
|
|
|
FREEZE,
|
2023-04-16 18:40:32 -04:00
|
|
|
BURN,
|
|
|
|
FAINT
|
2023-04-03 23:38:31 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
export class Status {
|
2023-04-11 19:08:03 -04:00
|
|
|
public effect: StatusEffect;
|
2023-04-03 23:38:31 -04:00
|
|
|
public turnCount: integer;
|
2023-04-11 19:08:03 -04:00
|
|
|
public cureTurn: integer;
|
|
|
|
|
2024-01-02 21:31:59 -05:00
|
|
|
constructor(effect: StatusEffect, turnCount: integer = 0, cureTurn?: integer) {
|
2023-04-11 19:08:03 -04:00
|
|
|
this.effect = effect;
|
2023-04-28 15:03:42 -04:00
|
|
|
this.turnCount = turnCount === undefined ? 0 : turnCount;
|
2024-01-02 21:31:59 -05:00
|
|
|
this.cureTurn = cureTurn;
|
2023-04-11 19:08:03 -04:00
|
|
|
}
|
2023-04-03 23:38:31 -04:00
|
|
|
|
2023-04-11 19:08:03 -04:00
|
|
|
incrementTurn(): void {
|
|
|
|
this.turnCount++;
|
2023-04-03 23:38:31 -04:00
|
|
|
}
|
2023-04-11 19:08:03 -04:00
|
|
|
|
|
|
|
isPostTurn(): boolean {
|
|
|
|
return this.effect === StatusEffect.POISON || this.effect === StatusEffect.TOXIC || this.effect === StatusEffect.BURN;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-07-02 23:22:46 +09:00
|
|
|
function getStatusEffectMessageKey(statusEffect: StatusEffect): string {
|
2023-04-11 19:08:03 -04:00
|
|
|
switch (statusEffect) {
|
2024-05-23 17:03:10 +02:00
|
|
|
case StatusEffect.POISON:
|
2024-07-02 23:22:46 +09:00
|
|
|
return "statusEffect:poison";
|
2024-05-23 17:03:10 +02:00
|
|
|
case StatusEffect.TOXIC:
|
2024-07-02 23:22:46 +09:00
|
|
|
return "statusEffect:toxic";
|
2024-05-23 17:03:10 +02:00
|
|
|
case StatusEffect.PARALYSIS:
|
2024-07-02 23:22:46 +09:00
|
|
|
return "statusEffect:paralysis";
|
2024-05-23 17:03:10 +02:00
|
|
|
case StatusEffect.SLEEP:
|
2024-07-02 23:22:46 +09:00
|
|
|
return "statusEffect:sleep";
|
2024-05-23 17:03:10 +02:00
|
|
|
case StatusEffect.FREEZE:
|
2024-07-02 23:22:46 +09:00
|
|
|
return "statusEffect:freeze";
|
2024-05-23 17:03:10 +02:00
|
|
|
case StatusEffect.BURN:
|
2024-07-02 23:22:46 +09:00
|
|
|
return "statusEffect:burn";
|
|
|
|
default:
|
|
|
|
return "statusEffect:none";
|
2023-04-11 19:08:03 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-07-02 23:22:46 +09:00
|
|
|
export function getStatusEffectObtainText(statusEffect: StatusEffect, pokemonNameWithAffix: string, sourceText?: string): string {
|
|
|
|
if (!sourceText) {
|
|
|
|
const i18nKey = `${getStatusEffectMessageKey(statusEffect)}.obtain`as ParseKeys;
|
|
|
|
return i18next.t(i18nKey, { pokemonNameWithAffix: pokemonNameWithAffix });
|
2023-04-11 19:08:03 -04:00
|
|
|
}
|
2024-07-02 23:22:46 +09:00
|
|
|
const i18nKey = `${getStatusEffectMessageKey(statusEffect)}.obtainSource`as ParseKeys;
|
|
|
|
return i18next.t(i18nKey, { pokemonNameWithAffix: pokemonNameWithAffix, sourceText: sourceText });
|
2023-04-11 19:08:03 -04:00
|
|
|
}
|
|
|
|
|
2024-07-02 23:22:46 +09:00
|
|
|
export function getStatusEffectActivationText(statusEffect: StatusEffect, pokemonNameWithAffix: string): string {
|
|
|
|
const i18nKey = `${getStatusEffectMessageKey(statusEffect)}.activation` as ParseKeys;
|
|
|
|
return i18next.t(i18nKey, { pokemonNameWithAffix: pokemonNameWithAffix });
|
2023-04-11 19:08:03 -04:00
|
|
|
}
|
|
|
|
|
2024-07-02 23:22:46 +09:00
|
|
|
export function getStatusEffectOverlapText(statusEffect: StatusEffect, pokemonNameWithAffix: string): string {
|
|
|
|
const i18nKey = `${getStatusEffectMessageKey(statusEffect)}.overlap` as ParseKeys;
|
|
|
|
return i18next.t(i18nKey, { pokemonNameWithAffix: pokemonNameWithAffix });
|
|
|
|
}
|
2023-04-11 19:08:03 -04:00
|
|
|
|
2024-07-02 23:22:46 +09:00
|
|
|
export function getStatusEffectHealText(statusEffect: StatusEffect, pokemonNameWithAffix: string): string {
|
|
|
|
const i18nKey = `${getStatusEffectMessageKey(statusEffect)}.heal` as ParseKeys;
|
|
|
|
return i18next.t(i18nKey, { pokemonNameWithAffix: pokemonNameWithAffix });
|
2023-04-18 22:09:37 -04:00
|
|
|
}
|
|
|
|
|
2023-04-20 19:44:56 -04:00
|
|
|
export function getStatusEffectDescriptor(statusEffect: StatusEffect): string {
|
2024-07-02 23:22:46 +09:00
|
|
|
const i18nKey = `${getStatusEffectMessageKey(statusEffect)}.description` as ParseKeys;
|
|
|
|
return i18next.t(i18nKey);
|
2023-04-19 16:52:14 -04:00
|
|
|
}
|
|
|
|
|
2023-04-20 19:44:56 -04:00
|
|
|
export function getStatusEffectCatchRateMultiplier(statusEffect: StatusEffect): number {
|
2023-04-18 22:09:37 -04:00
|
|
|
switch (statusEffect) {
|
2024-05-23 17:03:10 +02:00
|
|
|
case StatusEffect.POISON:
|
|
|
|
case StatusEffect.TOXIC:
|
|
|
|
case StatusEffect.PARALYSIS:
|
|
|
|
case StatusEffect.BURN:
|
|
|
|
return 1.5;
|
|
|
|
case StatusEffect.SLEEP:
|
|
|
|
case StatusEffect.FREEZE:
|
|
|
|
return 2.5;
|
2023-04-18 22:09:37 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
return 1;
|
2024-05-04 22:16:59 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns a random non-volatile StatusEffect
|
|
|
|
*/
|
|
|
|
export function generateRandomStatusEffect(): StatusEffect {
|
|
|
|
return Utils.randIntRange(1, 6);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns a random non-volatile StatusEffect between the two provided
|
|
|
|
* @param statusEffectA The first StatusEffect
|
|
|
|
* @param statusEffectA The second StatusEffect
|
|
|
|
*/
|
|
|
|
export function getRandomStatusEffect(statusEffectA: StatusEffect, statusEffectB: StatusEffect): StatusEffect {
|
|
|
|
if (statusEffectA === StatusEffect.NONE || statusEffectA === StatusEffect.FAINT) {
|
|
|
|
return statusEffectB;
|
|
|
|
}
|
|
|
|
if (statusEffectB === StatusEffect.NONE || statusEffectB === StatusEffect.FAINT) {
|
|
|
|
return statusEffectA;
|
|
|
|
}
|
|
|
|
|
|
|
|
return Utils.randIntRange(0, 2) ? statusEffectA : statusEffectB;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns a random non-volatile StatusEffect between the two provided
|
|
|
|
* @param statusA The first Status
|
|
|
|
* @param statusB The second Status
|
|
|
|
*/
|
2024-05-24 01:45:04 +02:00
|
|
|
export function getRandomStatus(statusA: Status, statusB: Status): Status {
|
2024-05-04 22:16:59 -05:00
|
|
|
if (statusA === undefined || statusA.effect === StatusEffect.NONE || statusA.effect === StatusEffect.FAINT) {
|
|
|
|
return statusB;
|
|
|
|
}
|
|
|
|
if (statusB === undefined || statusB.effect === StatusEffect.NONE || statusB.effect === StatusEffect.FAINT) {
|
|
|
|
return statusA;
|
|
|
|
}
|
2024-05-24 01:45:04 +02:00
|
|
|
|
2024-05-04 22:16:59 -05:00
|
|
|
|
|
|
|
return Utils.randIntRange(0, 2) ? statusA : statusB;
|
2024-05-23 17:03:10 +02:00
|
|
|
}
|
2024-05-25 05:01:23 -06:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Gets all non volatile status effects
|
|
|
|
* @returns A list containing all non volatile status effects
|
|
|
|
*/
|
|
|
|
export function getNonVolatileStatusEffects():Array<StatusEffect> {
|
|
|
|
return [
|
|
|
|
StatusEffect.POISON,
|
|
|
|
StatusEffect.TOXIC,
|
|
|
|
StatusEffect.PARALYSIS,
|
|
|
|
StatusEffect.SLEEP,
|
|
|
|
StatusEffect.FREEZE,
|
|
|
|
StatusEffect.BURN
|
|
|
|
];
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns whether a statuss effect is non volatile.
|
|
|
|
* Non-volatile status condition is a status that remains after being switched out.
|
|
|
|
* @param status The status to check
|
|
|
|
*/
|
|
|
|
export function isNonVolatileStatusEffect(status: StatusEffect): boolean {
|
|
|
|
return getNonVolatileStatusEffects().includes(status);
|
|
|
|
}
|