mirror of
https://github.com/pagefaultgames/pokerogue.git
synced 2025-07-01 14:02:18 +02:00
Splitting up held-item file
This commit is contained in:
parent
8ae0898229
commit
fc790b77c5
@ -1,237 +1,7 @@
|
|||||||
import type Pokemon from "#app/field/pokemon";
|
import { HeldItems } from "#enums/held-items";
|
||||||
import { globalScene } from "#app/global-scene";
|
import type { PokemonType } from "#enums/pokemon-type";
|
||||||
import type { Localizable } from "#app/interfaces/locales";
|
import { AttackTypeBoosterHeldItem, attackTypeToHeldItem } from "./held-items/attack-type-booster";
|
||||||
import { getPokemonNameWithAffix } from "#app/messages";
|
import { TurnHealHeldItem } from "./held-items/turn-heal";
|
||||||
import { PokemonHealPhase } from "#app/phases/pokemon-heal-phase";
|
|
||||||
import { toDmgValue, type NumberHolder } from "#app/utils/common";
|
|
||||||
import { HeldItemNames, HeldItems } from "#enums/held-items";
|
|
||||||
import { PokemonType } from "#enums/pokemon-type";
|
|
||||||
import i18next from "i18next";
|
|
||||||
|
|
||||||
export class HeldItem implements Localizable {
|
|
||||||
// public pokemonId: number;
|
|
||||||
public type: HeldItems;
|
|
||||||
public maxStackCount: number;
|
|
||||||
public isTransferable = true;
|
|
||||||
public isStealable = true;
|
|
||||||
public isSuppressable = true;
|
|
||||||
|
|
||||||
public name = "";
|
|
||||||
public description = "";
|
|
||||||
public icon = "";
|
|
||||||
|
|
||||||
constructor(type: HeldItems, maxStackCount = 1) {
|
|
||||||
this.type = type;
|
|
||||||
this.maxStackCount = maxStackCount;
|
|
||||||
|
|
||||||
this.isTransferable = true;
|
|
||||||
this.isStealable = true;
|
|
||||||
this.isSuppressable = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
localize(): void {
|
|
||||||
this.name = this.getName();
|
|
||||||
this.description = this.getDescription();
|
|
||||||
this.icon = this.getIcon();
|
|
||||||
}
|
|
||||||
|
|
||||||
getName(): string {
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
getDescription(): string {
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
getIcon(): string {
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
untransferable(): HeldItem {
|
|
||||||
this.isTransferable = false;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
unstealable(): HeldItem {
|
|
||||||
this.isStealable = false;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsuppressable(): HeldItem {
|
|
||||||
this.isSuppressable = false;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
getMaxStackCount(): number {
|
|
||||||
return this.maxStackCount;
|
|
||||||
}
|
|
||||||
|
|
||||||
createSummaryIcon(stackCount: number): Phaser.GameObjects.Container {
|
|
||||||
const container = globalScene.add.container(0, 0);
|
|
||||||
|
|
||||||
const item = globalScene.add.sprite(0, 12, "items").setFrame(this.getIcon()).setOrigin(0, 0.5);
|
|
||||||
container.add(item);
|
|
||||||
|
|
||||||
const stackText = this.getIconStackText(stackCount);
|
|
||||||
if (stackText) {
|
|
||||||
container.add(stackText);
|
|
||||||
}
|
|
||||||
|
|
||||||
container.setScale(0.5);
|
|
||||||
|
|
||||||
return container;
|
|
||||||
}
|
|
||||||
|
|
||||||
createPokemonIcon(stackCount: number, pokemon: Pokemon): Phaser.GameObjects.Container {
|
|
||||||
const container = globalScene.add.container(0, 0);
|
|
||||||
|
|
||||||
const pokemonIcon = globalScene.addPokemonIcon(pokemon, -2, 10, 0, 0.5, undefined, true);
|
|
||||||
container.add(pokemonIcon);
|
|
||||||
container.setName(pokemon.id.toString());
|
|
||||||
|
|
||||||
const item = globalScene.add
|
|
||||||
.sprite(16, 16, "items")
|
|
||||||
.setScale(0.5)
|
|
||||||
.setOrigin(0, 0.5)
|
|
||||||
.setTexture("items", this.getIcon());
|
|
||||||
container.add(item);
|
|
||||||
|
|
||||||
const stackText = this.getIconStackText(stackCount);
|
|
||||||
if (stackText) {
|
|
||||||
container.add(stackText);
|
|
||||||
}
|
|
||||||
|
|
||||||
return container;
|
|
||||||
}
|
|
||||||
|
|
||||||
getIconStackText(stackCount: number): Phaser.GameObjects.BitmapText | null {
|
|
||||||
if (this.getMaxStackCount() === 1) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
const text = globalScene.add.bitmapText(10, 15, "item-count", stackCount.toString(), 11);
|
|
||||||
text.letterSpacing = -0.5;
|
|
||||||
if (stackCount >= this.getMaxStackCount()) {
|
|
||||||
text.setTint(0xf89890);
|
|
||||||
}
|
|
||||||
text.setOrigin(0);
|
|
||||||
|
|
||||||
return text;
|
|
||||||
}
|
|
||||||
|
|
||||||
getScoreMultiplier(): number {
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
interface AttackTypeToHeldItemMap {
|
|
||||||
[key: number]: HeldItems;
|
|
||||||
}
|
|
||||||
|
|
||||||
export const attackTypeToHeldItem: AttackTypeToHeldItemMap = {
|
|
||||||
[PokemonType.NORMAL]: HeldItems.SILK_SCARF,
|
|
||||||
[PokemonType.FIGHTING]: HeldItems.BLACK_BELT,
|
|
||||||
[PokemonType.FLYING]: HeldItems.SHARP_BEAK,
|
|
||||||
[PokemonType.POISON]: HeldItems.POISON_BARB,
|
|
||||||
[PokemonType.GROUND]: HeldItems.SOFT_SAND,
|
|
||||||
[PokemonType.ROCK]: HeldItems.HARD_STONE,
|
|
||||||
[PokemonType.BUG]: HeldItems.SILVER_POWDER,
|
|
||||||
[PokemonType.GHOST]: HeldItems.SPELL_TAG,
|
|
||||||
[PokemonType.STEEL]: HeldItems.METAL_COAT,
|
|
||||||
[PokemonType.FIRE]: HeldItems.CHARCOAL,
|
|
||||||
[PokemonType.WATER]: HeldItems.MYSTIC_WATER,
|
|
||||||
[PokemonType.GRASS]: HeldItems.MIRACLE_SEED,
|
|
||||||
[PokemonType.ELECTRIC]: HeldItems.MAGNET,
|
|
||||||
[PokemonType.PSYCHIC]: HeldItems.TWISTED_SPOON,
|
|
||||||
[PokemonType.ICE]: HeldItems.NEVER_MELT_ICE,
|
|
||||||
[PokemonType.DRAGON]: HeldItems.DRAGON_FANG,
|
|
||||||
[PokemonType.DARK]: HeldItems.BLACK_GLASSES,
|
|
||||||
[PokemonType.FAIRY]: HeldItems.FAIRY_FEATHER,
|
|
||||||
};
|
|
||||||
|
|
||||||
export class AttackTypeBoosterHeldItem extends HeldItem {
|
|
||||||
public moveType: PokemonType;
|
|
||||||
public powerBoost: number;
|
|
||||||
|
|
||||||
constructor(type: HeldItems, maxStackCount = 1, moveType: PokemonType, powerBoost: number) {
|
|
||||||
super(type, maxStackCount);
|
|
||||||
this.moveType = moveType;
|
|
||||||
this.powerBoost = powerBoost;
|
|
||||||
this.localize();
|
|
||||||
}
|
|
||||||
|
|
||||||
getName(): string {
|
|
||||||
return i18next.t(`modifierType:AttackTypeBoosterItem.${HeldItemNames[this.type]?.toLowerCase()}`);
|
|
||||||
}
|
|
||||||
|
|
||||||
getDescription(): string {
|
|
||||||
return i18next.t("modifierType:ModifierType.AttackTypeBoosterModifierType.description", {
|
|
||||||
moveType: i18next.t(`pokemonInfo:Type.${PokemonType[this.moveType]}`),
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
getIcon(): string {
|
|
||||||
return `${HeldItemNames[this.type]?.toLowerCase()}`;
|
|
||||||
}
|
|
||||||
|
|
||||||
apply(stackCount: number, moveType: PokemonType, movePower: NumberHolder): void {
|
|
||||||
if (moveType === this.moveType && movePower.value >= 1) {
|
|
||||||
movePower.value = Math.floor(movePower.value * (1 + stackCount * this.powerBoost));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export function applyAttackTypeBoosterHeldItem(pokemon: Pokemon, moveType: PokemonType, movePower: NumberHolder) {
|
|
||||||
if (pokemon) {
|
|
||||||
for (const [item, props] of Object.entries(pokemon.heldItemManager.getHeldItems())) {
|
|
||||||
if (allHeldItems[item] instanceof AttackTypeBoosterHeldItem) {
|
|
||||||
allHeldItems[item].apply(props.stack, moveType, movePower);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export class TurnHealHeldItem extends HeldItem {
|
|
||||||
getName(): string {
|
|
||||||
return i18next.t("modifierType:ModifierType.LEFTOVERS.name") + " (new)";
|
|
||||||
}
|
|
||||||
|
|
||||||
getDescription(): string {
|
|
||||||
return i18next.t("modifierType:ModifierType.LEFTOVERS.description");
|
|
||||||
}
|
|
||||||
|
|
||||||
getIcon(): string {
|
|
||||||
return "leftovers";
|
|
||||||
}
|
|
||||||
|
|
||||||
apply(stackCount: number, pokemon: Pokemon): boolean {
|
|
||||||
if (pokemon.isFullHp()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
globalScene.unshiftPhase(
|
|
||||||
new PokemonHealPhase(
|
|
||||||
pokemon.getBattlerIndex(),
|
|
||||||
toDmgValue(pokemon.getMaxHp() / 16) * stackCount,
|
|
||||||
i18next.t("modifier:turnHealApply", {
|
|
||||||
pokemonNameWithAffix: getPokemonNameWithAffix(pokemon),
|
|
||||||
typeName: this.name,
|
|
||||||
}),
|
|
||||||
true,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export function applyTurnHealHeldItem(pokemon: Pokemon) {
|
|
||||||
if (pokemon) {
|
|
||||||
for (const [item, props] of Object.entries(pokemon.heldItemManager.getHeldItems())) {
|
|
||||||
if (allHeldItems[item] instanceof TurnHealHeldItem) {
|
|
||||||
allHeldItems[item].apply(props.stack, pokemon);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export const allHeldItems = {};
|
export const allHeldItems = {};
|
||||||
|
|
||||||
|
109
src/modifier/held-item.ts
Normal file
109
src/modifier/held-item.ts
Normal file
@ -0,0 +1,109 @@
|
|||||||
|
import type Pokemon from "#app/field/pokemon";
|
||||||
|
import { globalScene } from "#app/global-scene";
|
||||||
|
import type { HeldItems } from "#enums/held-items";
|
||||||
|
|
||||||
|
export class HeldItem {
|
||||||
|
// public pokemonId: number;
|
||||||
|
public type: HeldItems;
|
||||||
|
public maxStackCount: number;
|
||||||
|
public isTransferable = true;
|
||||||
|
public isStealable = true;
|
||||||
|
public isSuppressable = true;
|
||||||
|
|
||||||
|
constructor(type: HeldItems, maxStackCount = 1) {
|
||||||
|
this.type = type;
|
||||||
|
this.maxStackCount = maxStackCount;
|
||||||
|
|
||||||
|
this.isTransferable = true;
|
||||||
|
this.isStealable = true;
|
||||||
|
this.isSuppressable = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
get name(): string {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
get description(): string {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
get iconName(): string {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
untransferable(): HeldItem {
|
||||||
|
this.isTransferable = false;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
unstealable(): HeldItem {
|
||||||
|
this.isStealable = false;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsuppressable(): HeldItem {
|
||||||
|
this.isSuppressable = false;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
getMaxStackCount(): number {
|
||||||
|
return this.maxStackCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
createSummaryIcon(stackCount: number): Phaser.GameObjects.Container {
|
||||||
|
const container = globalScene.add.container(0, 0);
|
||||||
|
|
||||||
|
const item = globalScene.add.sprite(0, 12, "items").setFrame(this.iconName).setOrigin(0, 0.5);
|
||||||
|
container.add(item);
|
||||||
|
|
||||||
|
const stackText = this.getIconStackText(stackCount);
|
||||||
|
if (stackText) {
|
||||||
|
container.add(stackText);
|
||||||
|
}
|
||||||
|
|
||||||
|
container.setScale(0.5);
|
||||||
|
|
||||||
|
return container;
|
||||||
|
}
|
||||||
|
|
||||||
|
createPokemonIcon(stackCount: number, pokemon: Pokemon): Phaser.GameObjects.Container {
|
||||||
|
const container = globalScene.add.container(0, 0);
|
||||||
|
|
||||||
|
const pokemonIcon = globalScene.addPokemonIcon(pokemon, -2, 10, 0, 0.5, undefined, true);
|
||||||
|
container.add(pokemonIcon);
|
||||||
|
container.setName(pokemon.id.toString());
|
||||||
|
|
||||||
|
const item = globalScene.add
|
||||||
|
.sprite(16, 16, "items")
|
||||||
|
.setScale(0.5)
|
||||||
|
.setOrigin(0, 0.5)
|
||||||
|
.setTexture("items", this.iconName);
|
||||||
|
container.add(item);
|
||||||
|
|
||||||
|
const stackText = this.getIconStackText(stackCount);
|
||||||
|
if (stackText) {
|
||||||
|
container.add(stackText);
|
||||||
|
}
|
||||||
|
|
||||||
|
return container;
|
||||||
|
}
|
||||||
|
|
||||||
|
getIconStackText(stackCount: number): Phaser.GameObjects.BitmapText | null {
|
||||||
|
if (this.getMaxStackCount() === 1) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
const text = globalScene.add.bitmapText(10, 15, "item-count", stackCount.toString(), 11);
|
||||||
|
text.letterSpacing = -0.5;
|
||||||
|
if (stackCount >= this.getMaxStackCount()) {
|
||||||
|
text.setTint(0xf89890);
|
||||||
|
}
|
||||||
|
text.setOrigin(0);
|
||||||
|
|
||||||
|
return text;
|
||||||
|
}
|
||||||
|
|
||||||
|
getScoreMultiplier(): number {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
73
src/modifier/held-items/attack-type-booster.ts
Normal file
73
src/modifier/held-items/attack-type-booster.ts
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
import { HeldItemNames, HeldItems } from "#enums/held-items";
|
||||||
|
import { PokemonType } from "#enums/pokemon-type";
|
||||||
|
import i18next from "i18next";
|
||||||
|
import type { NumberHolder } from "#app/utils/common";
|
||||||
|
import type Pokemon from "#app/field/pokemon";
|
||||||
|
import { HeldItem } from "../held-item";
|
||||||
|
import { allHeldItems } from "../all-held-items";
|
||||||
|
|
||||||
|
interface AttackTypeToHeldItemMap {
|
||||||
|
[key: number]: HeldItems;
|
||||||
|
}
|
||||||
|
|
||||||
|
export const attackTypeToHeldItem: AttackTypeToHeldItemMap = {
|
||||||
|
[PokemonType.NORMAL]: HeldItems.SILK_SCARF,
|
||||||
|
[PokemonType.FIGHTING]: HeldItems.BLACK_BELT,
|
||||||
|
[PokemonType.FLYING]: HeldItems.SHARP_BEAK,
|
||||||
|
[PokemonType.POISON]: HeldItems.POISON_BARB,
|
||||||
|
[PokemonType.GROUND]: HeldItems.SOFT_SAND,
|
||||||
|
[PokemonType.ROCK]: HeldItems.HARD_STONE,
|
||||||
|
[PokemonType.BUG]: HeldItems.SILVER_POWDER,
|
||||||
|
[PokemonType.GHOST]: HeldItems.SPELL_TAG,
|
||||||
|
[PokemonType.STEEL]: HeldItems.METAL_COAT,
|
||||||
|
[PokemonType.FIRE]: HeldItems.CHARCOAL,
|
||||||
|
[PokemonType.WATER]: HeldItems.MYSTIC_WATER,
|
||||||
|
[PokemonType.GRASS]: HeldItems.MIRACLE_SEED,
|
||||||
|
[PokemonType.ELECTRIC]: HeldItems.MAGNET,
|
||||||
|
[PokemonType.PSYCHIC]: HeldItems.TWISTED_SPOON,
|
||||||
|
[PokemonType.ICE]: HeldItems.NEVER_MELT_ICE,
|
||||||
|
[PokemonType.DRAGON]: HeldItems.DRAGON_FANG,
|
||||||
|
[PokemonType.DARK]: HeldItems.BLACK_GLASSES,
|
||||||
|
[PokemonType.FAIRY]: HeldItems.FAIRY_FEATHER,
|
||||||
|
};
|
||||||
|
|
||||||
|
export class AttackTypeBoosterHeldItem extends HeldItem {
|
||||||
|
public moveType: PokemonType;
|
||||||
|
public powerBoost: number;
|
||||||
|
|
||||||
|
constructor(type: HeldItems, maxStackCount = 1, moveType: PokemonType, powerBoost: number) {
|
||||||
|
super(type, maxStackCount);
|
||||||
|
this.moveType = moveType;
|
||||||
|
this.powerBoost = powerBoost;
|
||||||
|
}
|
||||||
|
|
||||||
|
getName(): string {
|
||||||
|
return i18next.t(`modifierType:AttackTypeBoosterItem.${HeldItemNames[this.type]?.toLowerCase()}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
getDescription(): string {
|
||||||
|
return i18next.t("modifierType:ModifierType.AttackTypeBoosterModifierType.description", {
|
||||||
|
moveType: i18next.t(`pokemonInfo:Type.${PokemonType[this.moveType]}`),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
getIcon(): string {
|
||||||
|
return `${HeldItemNames[this.type]?.toLowerCase()}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
apply(stackCount: number, moveType: PokemonType, movePower: NumberHolder): void {
|
||||||
|
if (moveType === this.moveType && movePower.value >= 1) {
|
||||||
|
movePower.value = Math.floor(movePower.value * (1 + stackCount * this.powerBoost));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export function applyAttackTypeBoosterHeldItem(pokemon: Pokemon, moveType: PokemonType, movePower: NumberHolder) {
|
||||||
|
if (pokemon) {
|
||||||
|
for (const [item, props] of Object.entries(pokemon.heldItemManager.getHeldItems())) {
|
||||||
|
if (allHeldItems[item] instanceof AttackTypeBoosterHeldItem) {
|
||||||
|
allHeldItems[item].apply(props.stack, moveType, movePower);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
50
src/modifier/held-items/turn-heal.ts
Normal file
50
src/modifier/held-items/turn-heal.ts
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
import type Pokemon from "#app/field/pokemon";
|
||||||
|
import { globalScene } from "#app/global-scene";
|
||||||
|
import i18next from "i18next";
|
||||||
|
import { HeldItem } from "../held-item";
|
||||||
|
import { PokemonHealPhase } from "#app/phases/pokemon-heal-phase";
|
||||||
|
import { toDmgValue } from "#app/utils/common";
|
||||||
|
import { getPokemonNameWithAffix } from "#app/messages";
|
||||||
|
import { allHeldItems } from "../all-held-items";
|
||||||
|
|
||||||
|
export class TurnHealHeldItem extends HeldItem {
|
||||||
|
get name(): string {
|
||||||
|
return i18next.t("modifierType:ModifierType.LEFTOVERS.name") + " (new)";
|
||||||
|
}
|
||||||
|
|
||||||
|
get description(): string {
|
||||||
|
return i18next.t("modifierType:ModifierType.LEFTOVERS.description");
|
||||||
|
}
|
||||||
|
|
||||||
|
get icon(): string {
|
||||||
|
return "leftovers";
|
||||||
|
}
|
||||||
|
|
||||||
|
apply(stackCount: number, pokemon: Pokemon): boolean {
|
||||||
|
if (pokemon.isFullHp()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
globalScene.unshiftPhase(
|
||||||
|
new PokemonHealPhase(
|
||||||
|
pokemon.getBattlerIndex(),
|
||||||
|
toDmgValue(pokemon.getMaxHp() / 16) * stackCount,
|
||||||
|
i18next.t("modifier:turnHealApply", {
|
||||||
|
pokemonNameWithAffix: getPokemonNameWithAffix(pokemon),
|
||||||
|
typeName: this.name,
|
||||||
|
}),
|
||||||
|
true,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export function applyTurnHealHeldItem(pokemon: Pokemon) {
|
||||||
|
if (pokemon) {
|
||||||
|
for (const [item, props] of Object.entries(pokemon.heldItemManager.getHeldItems())) {
|
||||||
|
if (allHeldItems[item] instanceof TurnHealHeldItem) {
|
||||||
|
allHeldItems[item].apply(props.stack, pokemon);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user