resolve conflicts, import issues, and cleanup from rebase
This commit is contained in:
parent
8907073b6e
commit
ce55c13c12
|
@ -240,7 +240,7 @@ export default class BattleScene extends SceneBase {
|
||||||
public money: integer;
|
public money: integer;
|
||||||
public pokemonInfoContainer: PokemonInfoContainer;
|
public pokemonInfoContainer: PokemonInfoContainer;
|
||||||
private party: PlayerPokemon[];
|
private party: PlayerPokemon[];
|
||||||
public mysteryEncounterFlags: MysteryEncounterFlags = new MysteryEncounterFlags(null);
|
public mysteryEncounterData: MysteryEncounterData = new MysteryEncounterData(null);
|
||||||
public lastMysteryEncounter: MysteryEncounter;
|
public lastMysteryEncounter: MysteryEncounter;
|
||||||
/** Combined Biome and Wave count text */
|
/** Combined Biome and Wave count text */
|
||||||
private biomeWaveText: Phaser.GameObjects.Text;
|
private biomeWaveText: Phaser.GameObjects.Text;
|
||||||
|
@ -1222,7 +1222,6 @@ export default class BattleScene extends SceneBase {
|
||||||
pokemon.resetBattleData();
|
pokemon.resetBattleData();
|
||||||
applyPostBattleInitAbAttrs(PostBattleInitAbAttr, pokemon);
|
applyPostBattleInitAbAttrs(PostBattleInitAbAttr, pokemon);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
this.unshiftPhase(new ShowTrainerPhase(this));
|
this.unshiftPhase(new ShowTrainerPhase(this));
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,7 +14,7 @@ import { PlayerGender } from "#enums/player-gender";
|
||||||
import { Species } from "#enums/species";
|
import { Species } from "#enums/species";
|
||||||
import { TrainerType } from "#enums/trainer-type";
|
import { TrainerType } from "#enums/trainer-type";
|
||||||
import i18next from "#app/plugins/i18n";
|
import i18next from "#app/plugins/i18n";
|
||||||
import MysteryEncounter, { MysteryEncounterVariant } from "./data/mystery-encounter";
|
import MysteryEncounter, { MysteryEncounterVariant } from "./data/mystery-encounters/mystery-encounter";
|
||||||
|
|
||||||
export enum BattleType {
|
export enum BattleType {
|
||||||
WILD,
|
WILD,
|
||||||
|
|
|
@ -7,35 +7,12 @@ import { Status, StatusEffect } from "../status-effect";
|
||||||
import { TrainerConfig, trainerConfigs, TrainerSlot } from "../trainer-config";
|
import { TrainerConfig, trainerConfigs, TrainerSlot } from "../trainer-config";
|
||||||
import Pokemon, { FieldPosition, PlayerPokemon } from "#app/field/pokemon";
|
import Pokemon, { FieldPosition, PlayerPokemon } from "#app/field/pokemon";
|
||||||
import Trainer, { TrainerVariant } from "../../field/trainer";
|
import Trainer, { TrainerVariant } from "../../field/trainer";
|
||||||
import {
|
import { ExpBalanceModifier, ExpShareModifier, MultipleParticipantExpBonusModifier, PokemonExpBoosterModifier } from "#app/modifier/modifier";
|
||||||
ExpBalanceModifier,
|
import { CustomModifierSettings, getModifierPoolForType, ModifierPoolType, ModifierType, ModifierTypeFunc, ModifierTypeGenerator, modifierTypes, PokemonHeldItemModifierType, regenerateModifierPoolThresholds } from "#app/modifier/modifier-type";
|
||||||
ExpShareModifier,
|
import { BattleEndPhase, EggLapsePhase, ExpPhase, ModifierRewardPhase, SelectModifierPhase, ShowPartyExpBarPhase, TrainerVictoryPhase } from "#app/phases";
|
||||||
MultipleParticipantExpBonusModifier,
|
|
||||||
PokemonExpBoosterModifier
|
|
||||||
} from "#app/modifier/modifier";
|
|
||||||
import {
|
|
||||||
CustomModifierSettings,
|
|
||||||
getModifierPoolForType,
|
|
||||||
ModifierPoolType,
|
|
||||||
ModifierType,
|
|
||||||
ModifierTypeFunc,
|
|
||||||
ModifierTypeGenerator,
|
|
||||||
modifierTypes,
|
|
||||||
PokemonHeldItemModifierType,
|
|
||||||
regenerateModifierPoolThresholds
|
|
||||||
} from "#app/modifier/modifier-type";
|
|
||||||
import {
|
|
||||||
BattleEndPhase,
|
|
||||||
EggLapsePhase,
|
|
||||||
ExpPhase,
|
|
||||||
ModifierRewardPhase,
|
|
||||||
ShowPartyExpBarPhase,
|
|
||||||
TrainerVictoryPhase
|
|
||||||
} from "#app/phases";
|
|
||||||
import { MysteryEncounterBattlePhase, MysteryEncounterRewardsPhase } from "#app/phases/mystery-encounter-phase";
|
import { MysteryEncounterBattlePhase, MysteryEncounterRewardsPhase } from "#app/phases/mystery-encounter-phase";
|
||||||
import * as Utils from "../../utils";
|
import * as Utils from "../../utils";
|
||||||
import { isNullOrUndefined } from "#app/utils";
|
import { isNullOrUndefined } from "#app/utils";
|
||||||
import { SelectModifierPhase } from "#app/phases/select-modifier-phase";
|
|
||||||
import { TrainerType } from "#enums/trainer-type";
|
import { TrainerType } from "#enums/trainer-type";
|
||||||
import { Species } from "#enums/species";
|
import { Species } from "#enums/species";
|
||||||
import { Type } from "#app/data/type";
|
import { Type } from "#app/data/type";
|
||||||
|
|
|
@ -8,9 +8,8 @@ import Pokemon, { EnemyPokemon, PlayerPokemon } from "./field/pokemon";
|
||||||
import { Mode } from "./ui/ui";
|
import { Mode } from "./ui/ui";
|
||||||
import PartyUiHandler from "./ui/party-ui-handler";
|
import PartyUiHandler from "./ui/party-ui-handler";
|
||||||
import { BattleSpec } from "#enums/battle-spec";
|
import { BattleSpec } from "#enums/battle-spec";
|
||||||
import { MovePhase, PokemonHealPhase } from "./phases";
|
import { BattlePhase, MovePhase, PokemonHealPhase } from "./phases";
|
||||||
import { getTypeRgb } from "./data/type";
|
import { getTypeRgb } from "./data/type";
|
||||||
import { BattlePhase } from "#app/phases/battle-phase";
|
|
||||||
|
|
||||||
export class FormChangePhase extends EvolutionPhase {
|
export class FormChangePhase extends EvolutionPhase {
|
||||||
private formChange: SpeciesFormChange;
|
private formChange: SpeciesFormChange;
|
||||||
|
|
305
src/phases.ts
305
src/phases.ts
|
@ -5,7 +5,7 @@ import { allMoves, applyMoveAttrs, BypassSleepAttr, ChargeAttr, applyFilteredMov
|
||||||
import { Mode } from "./ui/ui";
|
import { Mode } from "./ui/ui";
|
||||||
import { Command } from "./ui/command-ui-handler";
|
import { Command } from "./ui/command-ui-handler";
|
||||||
import { Stat } from "./data/pokemon-stat";
|
import { Stat } from "./data/pokemon-stat";
|
||||||
import { BerryModifier, ContactHeldItemTransferChanceModifier, EnemyAttackStatusEffectChanceModifier, EnemyPersistentModifier, EnemyStatusEffectHealChanceModifier, EnemyTurnHealModifier, ExpBalanceModifier, ExpBoosterModifier, ExpShareModifier, FlinchChanceModifier, HealingBoosterModifier, HitHealModifier, LapsingPersistentModifier, MapModifier, Modifier, MultipleParticipantExpBonusModifier, PersistentModifier, PokemonExpBoosterModifier, PokemonHeldItemModifier, PokemonInstantReviveModifier, SwitchEffectTransferModifier, TempBattleStatBoosterModifier, TurnHealModifier, TurnHeldItemTransferModifier, MoneyMultiplierModifier, MoneyInterestModifier, IvScannerModifier, LapsingPokemonHeldItemModifier, PokemonMultiHitModifier, PokemonMoveAccuracyBoosterModifier, overrideModifiers, overrideHeldItems, BypassSpeedChanceModifier, TurnStatusEffectModifier } from "./modifier/modifier";
|
import { BerryModifier, ContactHeldItemTransferChanceModifier, EnemyAttackStatusEffectChanceModifier, EnemyPersistentModifier, EnemyStatusEffectHealChanceModifier, EnemyTurnHealModifier, ExpBalanceModifier, ExpBoosterModifier, ExpShareModifier, FlinchChanceModifier, HealingBoosterModifier, HitHealModifier, LapsingPersistentModifier, MapModifier, Modifier, MultipleParticipantExpBonusModifier, PersistentModifier, PokemonExpBoosterModifier, PokemonHeldItemModifier, PokemonInstantReviveModifier, SwitchEffectTransferModifier, TempBattleStatBoosterModifier, TurnHealModifier, TurnHeldItemTransferModifier, MoneyMultiplierModifier, MoneyInterestModifier, IvScannerModifier, LapsingPokemonHeldItemModifier, PokemonMultiHitModifier, PokemonMoveAccuracyBoosterModifier, overrideModifiers, overrideHeldItems, BypassSpeedChanceModifier, TurnStatusEffectModifier, ExtraModifierModifier } from "./modifier/modifier";
|
||||||
import PartyUiHandler, { PartyOption, PartyUiMode } from "./ui/party-ui-handler";
|
import PartyUiHandler, { PartyOption, PartyUiMode } from "./ui/party-ui-handler";
|
||||||
import { doPokeballBounceAnim, getPokeballAtlasKey, getPokeballCatchMultiplier, getPokeballTintColor, PokeballType } from "./data/pokeball";
|
import { doPokeballBounceAnim, getPokeballAtlasKey, getPokeballCatchMultiplier, getPokeballTintColor, PokeballType } from "./data/pokeball";
|
||||||
import { CommonAnim, CommonBattleAnim, MoveAnim, initMoveAnim, loadMoveAnimAssets } from "./data/battle-anims";
|
import { CommonAnim, CommonBattleAnim, MoveAnim, initMoveAnim, loadMoveAnimAssets } from "./data/battle-anims";
|
||||||
|
@ -17,7 +17,7 @@ import { Phase } from "./phase";
|
||||||
import { BattleStat, getBattleStatLevelChangeDescription, getBattleStatName } from "./data/battle-stat";
|
import { BattleStat, getBattleStatLevelChangeDescription, getBattleStatName } from "./data/battle-stat";
|
||||||
import { biomeLinks, getBiomeName } from "./data/biomes";
|
import { biomeLinks, getBiomeName } from "./data/biomes";
|
||||||
import { ModifierTier } from "./modifier/modifier-tier";
|
import { ModifierTier } from "./modifier/modifier-tier";
|
||||||
import { ModifierPoolType, ModifierType, ModifierTypeFunc, getDailyRunStarterModifiers, getEnemyBuffModifierForWave, getModifierType, modifierTypes, regenerateModifierPoolThresholds } from "./modifier/modifier-type";
|
import { ModifierPoolType, ModifierType, ModifierTypeFunc, getDailyRunStarterModifiers, getEnemyBuffModifierForWave, getModifierType, modifierTypes, regenerateModifierPoolThresholds, CustomModifierSettings, ModifierTypeOption, getPlayerShopModifierTypeOptionsForWave, PokemonModifierType, FusePokemonModifierType, PokemonMoveModifierType, TmModifierType, RememberMoveModifierType, PokemonPpRestoreModifierType, PokemonPpUpModifierType, getPlayerModifierTypeOptions } from "./modifier/modifier-type";
|
||||||
import SoundFade from "phaser3-rex-plugins/plugins/soundfade";
|
import SoundFade from "phaser3-rex-plugins/plugins/soundfade";
|
||||||
import { BattlerTagLapseType, CenterOfAttentionTag, EncoreTag, ProtectedTag, SemiInvulnerableTag, TrappedTag, MysteryEncounterPostSummonTag } from "./data/battler-tags";
|
import { BattlerTagLapseType, CenterOfAttentionTag, EncoreTag, ProtectedTag, SemiInvulnerableTag, TrappedTag, MysteryEncounterPostSummonTag } from "./data/battler-tags";
|
||||||
import { getPokemonMessage, getPokemonNameWithAffix } from "./messages";
|
import { getPokemonMessage, getPokemonNameWithAffix } from "./messages";
|
||||||
|
@ -64,11 +64,11 @@ import { Moves } from "#enums/moves";
|
||||||
import { PlayerGender } from "#enums/player-gender";
|
import { PlayerGender } from "#enums/player-gender";
|
||||||
import { Species } from "#enums/species";
|
import { Species } from "#enums/species";
|
||||||
import { TrainerType } from "#enums/trainer-type";
|
import { TrainerType } from "#enums/trainer-type";
|
||||||
import { BattlePhase } from "#app/phases/battle-phase";
|
|
||||||
import { MysteryEncounterVariant } from "#app/data/mystery-encounters/mystery-encounter";
|
import { MysteryEncounterVariant } from "#app/data/mystery-encounters/mystery-encounter";
|
||||||
import { MysteryEncounterPhase } from "#app/phases/mystery-encounter-phase";
|
import { MysteryEncounterPhase } from "#app/phases/mystery-encounter-phase";
|
||||||
import { getEncounterText, handleMysteryEncounterVictory } from "#app/data/mystery-encounters/mystery-encounter-utils";
|
import { getEncounterText, handleMysteryEncounterVictory } from "#app/data/mystery-encounters/mystery-encounter-utils";
|
||||||
import { SelectModifierPhase } from "#app/phases/select-modifier-phase";
|
import ModifierSelectUiHandler, { SHOP_OPTIONS_ROW_LIMIT } from "#app/ui/modifier-select-ui-handler";
|
||||||
|
import { isNullOrUndefined } from "./utils";
|
||||||
|
|
||||||
const { t } = i18next;
|
const { t } = i18next;
|
||||||
|
|
||||||
|
@ -671,6 +671,17 @@ export class BattlePhase extends Phase {
|
||||||
duration: 750
|
duration: 750
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
hideEnemyTrainer(): void {
|
||||||
|
this.scene.tweens.add({
|
||||||
|
targets: this.scene.currentBattle.trainer,
|
||||||
|
x: "+=16",
|
||||||
|
y: "-=16",
|
||||||
|
alpha: 0,
|
||||||
|
ease: "Sine.easeInOut",
|
||||||
|
duration: 750
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
type PokemonFunc = (pokemon: Pokemon) => void;
|
type PokemonFunc = (pokemon: Pokemon) => void;
|
||||||
|
@ -1660,57 +1671,6 @@ export class SummonPhase extends PartyMemberPokemonPhase {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
summonWild(): void {
|
|
||||||
const pokemon = this.getPokemon();
|
|
||||||
|
|
||||||
if (this.fieldIndex === 1) {
|
|
||||||
pokemon.setFieldPosition(FieldPosition.RIGHT, 0);
|
|
||||||
} else {
|
|
||||||
const availablePartyMembers = this.getParty().filter(p => !p.isFainted()).length;
|
|
||||||
pokemon.setFieldPosition(!this.scene.currentBattle.double || availablePartyMembers === 1 ? FieldPosition.CENTER : FieldPosition.LEFT);
|
|
||||||
}
|
|
||||||
|
|
||||||
this.scene.add.existing(pokemon);
|
|
||||||
this.scene.field.add(pokemon);
|
|
||||||
if (!this.player) {
|
|
||||||
const playerPokemon = this.scene.getPlayerPokemon() as Pokemon;
|
|
||||||
if (playerPokemon?.visible) {
|
|
||||||
this.scene.field.moveBelow(pokemon, playerPokemon);
|
|
||||||
}
|
|
||||||
this.scene.currentBattle.seenEnemyPartyMemberIds.add(pokemon.id);
|
|
||||||
}
|
|
||||||
this.scene.updateModifiers(this.player);
|
|
||||||
this.scene.updateFieldScale();
|
|
||||||
pokemon.showInfo();
|
|
||||||
pokemon.playAnim();
|
|
||||||
pokemon.setVisible(true);
|
|
||||||
pokemon.getSprite().setVisible(true);
|
|
||||||
pokemon.setScale(0.75);
|
|
||||||
pokemon.tint(getPokeballTintColor(pokemon.pokeball));
|
|
||||||
pokemon.untint(250, "Sine.easeIn");
|
|
||||||
this.scene.updateFieldScale();
|
|
||||||
pokemon.x += 16;
|
|
||||||
pokemon.y -= 16;
|
|
||||||
pokemon.alpha = 0;
|
|
||||||
|
|
||||||
// Ease pokemon in
|
|
||||||
this.scene.tweens.add({
|
|
||||||
targets: pokemon,
|
|
||||||
x: "-=16",
|
|
||||||
y: "+=16",
|
|
||||||
alpha: 1,
|
|
||||||
duration: 1000,
|
|
||||||
ease: "Sine.easeIn",
|
|
||||||
scale: pokemon.getSpriteScale(),
|
|
||||||
onComplete: () => {
|
|
||||||
pokemon.cry(pokemon.getHpRatio() > 0.25 ? undefined : { rate: 0.85 });
|
|
||||||
pokemon.getSprite().clearTint();
|
|
||||||
pokemon.resetSummonData();
|
|
||||||
this.scene.time.delayedCall(1000, () => this.end());
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
onEnd(): void {
|
onEnd(): void {
|
||||||
const pokemon = this.getPokemon();
|
const pokemon = this.getPokemon();
|
||||||
|
|
||||||
|
@ -5296,6 +5256,241 @@ export class AttemptRunPhase extends PokemonPhase {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export class SelectModifierPhase extends BattlePhase {
|
||||||
|
private rerollCount: integer;
|
||||||
|
private modifierTiers: ModifierTier[];
|
||||||
|
private customModifierSettings: CustomModifierSettings;
|
||||||
|
|
||||||
|
constructor(scene: BattleScene, rerollCount: integer = 0, modifierTiers?: ModifierTier[], customModifierSettings?: CustomModifierSettings) {
|
||||||
|
super(scene);
|
||||||
|
|
||||||
|
this.rerollCount = rerollCount;
|
||||||
|
this.modifierTiers = modifierTiers;
|
||||||
|
this.customModifierSettings = customModifierSettings;
|
||||||
|
}
|
||||||
|
|
||||||
|
start() {
|
||||||
|
super.start();
|
||||||
|
|
||||||
|
if (!this.rerollCount) {
|
||||||
|
this.updateSeed();
|
||||||
|
} else {
|
||||||
|
this.scene.reroll = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const party = this.scene.getParty();
|
||||||
|
regenerateModifierPoolThresholds(party, this.getPoolType(), this.rerollCount);
|
||||||
|
const modifierCount = new Utils.IntegerHolder(3);
|
||||||
|
if (this.isPlayer()) {
|
||||||
|
this.scene.applyModifiers(ExtraModifierModifier, true, modifierCount);
|
||||||
|
}
|
||||||
|
|
||||||
|
// If custom modifiers are specified, overrides default item count
|
||||||
|
if (!!this.customModifierSettings) {
|
||||||
|
const newItemCount = (this.customModifierSettings.guaranteedModifierTiers?.length || 0) +
|
||||||
|
(this.customModifierSettings.guaranteedModifierTypeOptions?.length || 0) +
|
||||||
|
(this.customModifierSettings.guaranteedModifierTypeFuncs?.length || 0);
|
||||||
|
if (this.customModifierSettings.fillRemaining) {
|
||||||
|
const originalCount = modifierCount.value;
|
||||||
|
modifierCount.value = originalCount > newItemCount ? originalCount : newItemCount;
|
||||||
|
} else {
|
||||||
|
modifierCount.value = newItemCount;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const typeOptions: ModifierTypeOption[] = this.getModifierTypeOptions(modifierCount.value);
|
||||||
|
|
||||||
|
const modifierSelectCallback = (rowCursor: integer, cursor: integer) => {
|
||||||
|
if (rowCursor < 0 || cursor < 0) {
|
||||||
|
this.scene.ui.showText(i18next.t("battle:skipItemQuestion"), null, () => {
|
||||||
|
this.scene.ui.setOverlayMode(Mode.CONFIRM, () => {
|
||||||
|
this.scene.ui.revertMode();
|
||||||
|
this.scene.ui.setMode(Mode.MESSAGE);
|
||||||
|
super.end();
|
||||||
|
}, () => this.scene.ui.setMode(Mode.MODIFIER_SELECT, this.isPlayer(), typeOptions, modifierSelectCallback, this.getRerollCost(typeOptions, this.scene.lockModifierTiers)));
|
||||||
|
});
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
let modifierType: ModifierType;
|
||||||
|
let cost: integer;
|
||||||
|
switch (rowCursor) {
|
||||||
|
case 0:
|
||||||
|
switch (cursor) {
|
||||||
|
case 0:
|
||||||
|
const rerollCost = this.getRerollCost(typeOptions, this.scene.lockModifierTiers);
|
||||||
|
if (rerollCost === 0 || this.scene.money < rerollCost) {
|
||||||
|
this.scene.ui.playError();
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
this.scene.reroll = true;
|
||||||
|
this.scene.unshiftPhase(new SelectModifierPhase(this.scene, this.rerollCount + 1, typeOptions.map(o => o.type.tier)));
|
||||||
|
this.scene.ui.clearText();
|
||||||
|
this.scene.ui.setMode(Mode.MESSAGE).then(() => super.end());
|
||||||
|
this.scene.money -= rerollCost;
|
||||||
|
this.scene.updateMoneyText();
|
||||||
|
this.scene.animateMoneyChanged(false);
|
||||||
|
this.scene.playSound("buy");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
this.scene.ui.setModeWithoutClear(Mode.PARTY, PartyUiMode.MODIFIER_TRANSFER, -1, (fromSlotIndex: integer, itemIndex: integer, itemQuantity: integer, toSlotIndex: integer) => {
|
||||||
|
if (toSlotIndex !== undefined && fromSlotIndex < 6 && toSlotIndex < 6 && fromSlotIndex !== toSlotIndex && itemIndex > -1) {
|
||||||
|
const itemModifiers = this.scene.findModifiers(m => m instanceof PokemonHeldItemModifier
|
||||||
|
&& (m as PokemonHeldItemModifier).getTransferrable(true) && (m as PokemonHeldItemModifier).pokemonId === party[fromSlotIndex].id) as PokemonHeldItemModifier[];
|
||||||
|
const itemModifier = itemModifiers[itemIndex];
|
||||||
|
this.scene.tryTransferHeldItemModifier(itemModifier, party[toSlotIndex], true, itemQuantity);
|
||||||
|
} else {
|
||||||
|
this.scene.ui.setMode(Mode.MODIFIER_SELECT, this.isPlayer(), typeOptions, modifierSelectCallback, this.getRerollCost(typeOptions, this.scene.lockModifierTiers));
|
||||||
|
}
|
||||||
|
}, PartyUiHandler.FilterItemMaxStacks);
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
this.scene.ui.setModeWithoutClear(Mode.PARTY, PartyUiMode.CHECK, -1, () => {
|
||||||
|
this.scene.ui.setMode(Mode.MODIFIER_SELECT, this.isPlayer(), typeOptions, modifierSelectCallback, this.getRerollCost(typeOptions, this.scene.lockModifierTiers));
|
||||||
|
});
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
this.scene.lockModifierTiers = !this.scene.lockModifierTiers;
|
||||||
|
const uiHandler = this.scene.ui.getHandler() as ModifierSelectUiHandler;
|
||||||
|
uiHandler.setRerollCost(this.getRerollCost(typeOptions, this.scene.lockModifierTiers));
|
||||||
|
uiHandler.updateLockRaritiesText();
|
||||||
|
uiHandler.updateRerollCostText();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
case 1:
|
||||||
|
if (typeOptions.length === 0) {
|
||||||
|
this.scene.ui.revertMode();
|
||||||
|
this.scene.ui.setMode(Mode.MESSAGE);
|
||||||
|
super.end();
|
||||||
|
}
|
||||||
|
modifierType = typeOptions[cursor].type;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
const shopOptions = getPlayerShopModifierTypeOptionsForWave(this.scene.currentBattle.waveIndex, this.scene.getWaveMoneyAmount(1));
|
||||||
|
const shopOption = shopOptions[rowCursor > 2 || shopOptions.length <= SHOP_OPTIONS_ROW_LIMIT ? cursor : cursor + SHOP_OPTIONS_ROW_LIMIT];
|
||||||
|
modifierType = shopOption.type;
|
||||||
|
cost = shopOption.cost;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cost && this.scene.money < cost) {
|
||||||
|
this.scene.ui.playError();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const applyModifier = (modifier: Modifier, playSound: boolean = false) => {
|
||||||
|
const result = this.scene.addModifier(modifier, false, playSound);
|
||||||
|
if (cost) {
|
||||||
|
result.then(success => {
|
||||||
|
if (success) {
|
||||||
|
this.scene.money -= cost;
|
||||||
|
this.scene.updateMoneyText();
|
||||||
|
this.scene.animateMoneyChanged(false);
|
||||||
|
this.scene.playSound("buy");
|
||||||
|
(this.scene.ui.getHandler() as ModifierSelectUiHandler).updateCostText();
|
||||||
|
} else {
|
||||||
|
this.scene.ui.playError();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
const doEnd = () => {
|
||||||
|
this.scene.ui.clearText();
|
||||||
|
this.scene.ui.setMode(Mode.MESSAGE);
|
||||||
|
super.end();
|
||||||
|
};
|
||||||
|
if (result instanceof Promise) {
|
||||||
|
result.then(() => doEnd());
|
||||||
|
} else {
|
||||||
|
doEnd();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
if (modifierType instanceof PokemonModifierType) {
|
||||||
|
if (modifierType instanceof FusePokemonModifierType) {
|
||||||
|
this.scene.ui.setModeWithoutClear(Mode.PARTY, PartyUiMode.SPLICE, -1, (fromSlotIndex: integer, spliceSlotIndex: integer) => {
|
||||||
|
if (spliceSlotIndex !== undefined && fromSlotIndex < 6 && spliceSlotIndex < 6 && fromSlotIndex !== spliceSlotIndex) {
|
||||||
|
this.scene.ui.setMode(Mode.MODIFIER_SELECT, this.isPlayer()).then(() => {
|
||||||
|
const modifier = modifierType.newModifier(party[fromSlotIndex], party[spliceSlotIndex]);
|
||||||
|
applyModifier(modifier, true);
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
this.scene.ui.setMode(Mode.MODIFIER_SELECT, this.isPlayer(), typeOptions, modifierSelectCallback, this.getRerollCost(typeOptions, this.scene.lockModifierTiers));
|
||||||
|
}
|
||||||
|
}, modifierType.selectFilter);
|
||||||
|
} else {
|
||||||
|
const pokemonModifierType = modifierType as PokemonModifierType;
|
||||||
|
const isMoveModifier = modifierType instanceof PokemonMoveModifierType;
|
||||||
|
const isTmModifier = modifierType instanceof TmModifierType;
|
||||||
|
const isRememberMoveModifier = modifierType instanceof RememberMoveModifierType;
|
||||||
|
const isPpRestoreModifier = (modifierType instanceof PokemonPpRestoreModifierType || modifierType instanceof PokemonPpUpModifierType);
|
||||||
|
const partyUiMode = isMoveModifier ? PartyUiMode.MOVE_MODIFIER
|
||||||
|
: isTmModifier ? PartyUiMode.TM_MODIFIER
|
||||||
|
: isRememberMoveModifier ? PartyUiMode.REMEMBER_MOVE_MODIFIER
|
||||||
|
: PartyUiMode.MODIFIER;
|
||||||
|
const tmMoveId = isTmModifier
|
||||||
|
? (modifierType as TmModifierType).moveId
|
||||||
|
: undefined;
|
||||||
|
this.scene.ui.setModeWithoutClear(Mode.PARTY, partyUiMode, -1, (slotIndex: integer, option: PartyOption) => {
|
||||||
|
if (slotIndex < 6) {
|
||||||
|
this.scene.ui.setMode(Mode.MODIFIER_SELECT, this.isPlayer()).then(() => {
|
||||||
|
const modifier = !isMoveModifier
|
||||||
|
? !isRememberMoveModifier
|
||||||
|
? modifierType.newModifier(party[slotIndex])
|
||||||
|
: modifierType.newModifier(party[slotIndex], option as integer)
|
||||||
|
: modifierType.newModifier(party[slotIndex], option - PartyOption.MOVE_1);
|
||||||
|
applyModifier(modifier, true);
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
this.scene.ui.setMode(Mode.MODIFIER_SELECT, this.isPlayer(), typeOptions, modifierSelectCallback, this.getRerollCost(typeOptions, this.scene.lockModifierTiers));
|
||||||
|
}
|
||||||
|
}, pokemonModifierType.selectFilter, modifierType instanceof PokemonMoveModifierType ? (modifierType as PokemonMoveModifierType).moveSelectFilter : undefined, tmMoveId, isPpRestoreModifier);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
applyModifier(modifierType.newModifier());
|
||||||
|
}
|
||||||
|
|
||||||
|
return !cost;
|
||||||
|
};
|
||||||
|
this.scene.ui.setMode(Mode.MODIFIER_SELECT, this.isPlayer(), typeOptions, modifierSelectCallback, this.getRerollCost(typeOptions, this.scene.lockModifierTiers));
|
||||||
|
}
|
||||||
|
|
||||||
|
updateSeed(): void {
|
||||||
|
this.scene.resetSeed();
|
||||||
|
}
|
||||||
|
|
||||||
|
isPlayer(): boolean {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
getRerollCost(typeOptions: ModifierTypeOption[], lockRarities: boolean): integer {
|
||||||
|
let baseValue = 0;
|
||||||
|
if (lockRarities) {
|
||||||
|
const tierValues = [50, 125, 300, 750, 2000];
|
||||||
|
for (const opt of typeOptions) {
|
||||||
|
baseValue += tierValues[opt.type.tier];
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
baseValue = 250;
|
||||||
|
}
|
||||||
|
const multiplier = !isNullOrUndefined(this.customModifierSettings?.rerollMultiplier) ? this.customModifierSettings.rerollMultiplier : 1;
|
||||||
|
return Math.min(Math.ceil(this.scene.currentBattle.waveIndex / 10) * baseValue * Math.pow(2, this.rerollCount) * multiplier, Number.MAX_SAFE_INTEGER);
|
||||||
|
}
|
||||||
|
|
||||||
|
getPoolType(): ModifierPoolType {
|
||||||
|
return ModifierPoolType.PLAYER;
|
||||||
|
}
|
||||||
|
|
||||||
|
getModifierTypeOptions(modifierCount: integer): ModifierTypeOption[] {
|
||||||
|
return getPlayerModifierTypeOptions(modifierCount, this.scene.getParty(), this.scene.lockModifierTiers ? this.modifierTiers : undefined, this.customModifierSettings);
|
||||||
|
}
|
||||||
|
|
||||||
|
addModifier(modifier: Modifier): Promise<boolean> {
|
||||||
|
return this.scene.addModifier(modifier, false, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
export class EggLapsePhase extends Phase {
|
export class EggLapsePhase extends Phase {
|
||||||
constructor(scene: BattleScene) {
|
constructor(scene: BattleScene) {
|
||||||
super(scene);
|
super(scene);
|
||||||
|
|
|
@ -1,47 +0,0 @@
|
||||||
import { Phase } from "#app/phase";
|
|
||||||
import BattleScene from "#app/battle-scene";
|
|
||||||
import { TrainerSlot } from "#app/data/trainer-config";
|
|
||||||
|
|
||||||
export class BattlePhase extends Phase {
|
|
||||||
constructor(scene: BattleScene) {
|
|
||||||
super(scene);
|
|
||||||
}
|
|
||||||
|
|
||||||
showEnemyTrainer(trainerSlot: TrainerSlot = TrainerSlot.NONE): void {
|
|
||||||
const sprites = this.scene.currentBattle.trainer.getSprites();
|
|
||||||
const tintSprites = this.scene.currentBattle.trainer.getTintSprites();
|
|
||||||
for (let i = 0; i < sprites.length; i++) {
|
|
||||||
const visible = !trainerSlot || !i === (trainerSlot === TrainerSlot.TRAINER) || sprites.length < 2;
|
|
||||||
[sprites[i], tintSprites[i]].map(sprite => {
|
|
||||||
if (visible) {
|
|
||||||
sprite.x = trainerSlot || sprites.length < 2 ? 0 : i ? 16 : -16;
|
|
||||||
}
|
|
||||||
sprite.setVisible(visible);
|
|
||||||
sprite.clearTint();
|
|
||||||
});
|
|
||||||
sprites[i].setVisible(visible);
|
|
||||||
tintSprites[i].setVisible(visible);
|
|
||||||
sprites[i].clearTint();
|
|
||||||
tintSprites[i].clearTint();
|
|
||||||
}
|
|
||||||
this.scene.tweens.add({
|
|
||||||
targets: this.scene.currentBattle.trainer,
|
|
||||||
x: "-=16",
|
|
||||||
y: "+=16",
|
|
||||||
alpha: 1,
|
|
||||||
ease: "Sine.easeInOut",
|
|
||||||
duration: 750
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
hideEnemyTrainer(): void {
|
|
||||||
this.scene.tweens.add({
|
|
||||||
targets: this.scene.currentBattle.trainer,
|
|
||||||
x: "+=16",
|
|
||||||
y: "-=16",
|
|
||||||
alpha: 0,
|
|
||||||
ease: "Sine.easeInOut",
|
|
||||||
duration: 750
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -5,16 +5,15 @@ import { Mode } from "../ui/ui";
|
||||||
import {
|
import {
|
||||||
getEncounterText
|
getEncounterText
|
||||||
} from "../data/mystery-encounters/mystery-encounter-utils";
|
} from "../data/mystery-encounters/mystery-encounter-utils";
|
||||||
import { CheckSwitchPhase, NewBattlePhase, PostSummonPhase, ReturnPhase, ScanIvsPhase, SummonPhase, ToggleDoublePositionPhase } from "../phases";
|
import { CheckSwitchPhase, NewBattlePhase, PostSummonPhase, ReturnPhase, ScanIvsPhase, SelectModifierPhase, SummonPhase, ToggleDoublePositionPhase } from "../phases";
|
||||||
import MysteryEncounterOption from "../data/mystery-encounters/mystery-encounter-option";
|
import MysteryEncounterOption from "../data/mystery-encounters/mystery-encounter-option";
|
||||||
import { MysteryEncounterVariant } from "../data/mystery-encounters/mystery-encounter";
|
import { MysteryEncounterVariant } from "../data/mystery-encounters/mystery-encounter";
|
||||||
import { getCharVariantFromDialogue } from "../data/dialogue";
|
import { getCharVariantFromDialogue } from "../data/dialogue";
|
||||||
import { TrainerSlot } from "../data/trainer-config";
|
import { TrainerSlot } from "../data/trainer-config";
|
||||||
import { BattleSpec } from "../enums/battle-spec";
|
import { BattleSpec } from "#enums/battle-spec";
|
||||||
import { Tutorial, handleTutorial } from "../tutorial";
|
import { Tutorial, handleTutorial } from "../tutorial";
|
||||||
import { IvScannerModifier } from "../modifier/modifier";
|
import { IvScannerModifier } from "../modifier/modifier";
|
||||||
import * as Utils from "../utils";
|
import * as Utils from "../utils";
|
||||||
import { SelectModifierPhase } from "#app/phases/select-modifier-phase";
|
|
||||||
import { isNullOrUndefined } from "../utils";
|
import { isNullOrUndefined } from "../utils";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -1,259 +0,0 @@
|
||||||
import { ModifierTier } from "#app/modifier/modifier-tier";
|
|
||||||
import {
|
|
||||||
CustomModifierSettings,
|
|
||||||
FusePokemonModifierType, getPlayerModifierTypeOptions,
|
|
||||||
getPlayerShopModifierTypeOptionsForWave, ModifierPoolType,
|
|
||||||
ModifierType,
|
|
||||||
ModifierTypeOption,
|
|
||||||
PokemonModifierType,
|
|
||||||
PokemonMoveModifierType,
|
|
||||||
PokemonPpRestoreModifierType,
|
|
||||||
PokemonPpUpModifierType,
|
|
||||||
regenerateModifierPoolThresholds,
|
|
||||||
RememberMoveModifierType,
|
|
||||||
TmModifierType
|
|
||||||
} from "#app/modifier/modifier-type";
|
|
||||||
import BattleScene from "#app/battle-scene";
|
|
||||||
import * as Utils from "#app/utils";
|
|
||||||
import { ExtraModifierModifier, Modifier, PokemonHeldItemModifier } from "#app/modifier/modifier";
|
|
||||||
import i18next from "#app/plugins/i18n";
|
|
||||||
import { Mode } from "#app/ui/ui";
|
|
||||||
import PartyUiHandler, { PartyOption, PartyUiMode } from "#app/ui/party-ui-handler";
|
|
||||||
import ModifierSelectUiHandler, { SHOP_OPTIONS_ROW_LIMIT } from "#app/ui/modifier-select-ui-handler";
|
|
||||||
import { BattlePhase } from "#app/phases/battle-phase";
|
|
||||||
import { isNullOrUndefined } from "#app/utils";
|
|
||||||
|
|
||||||
export class SelectModifierPhase extends BattlePhase {
|
|
||||||
private rerollCount: integer;
|
|
||||||
private modifierTiers: ModifierTier[];
|
|
||||||
private customModifierSettings: CustomModifierSettings;
|
|
||||||
|
|
||||||
constructor(scene: BattleScene, rerollCount: integer = 0, modifierTiers?: ModifierTier[], customModifierSettings?: CustomModifierSettings) {
|
|
||||||
super(scene);
|
|
||||||
|
|
||||||
this.rerollCount = rerollCount;
|
|
||||||
this.modifierTiers = modifierTiers;
|
|
||||||
this.customModifierSettings = customModifierSettings;
|
|
||||||
}
|
|
||||||
|
|
||||||
start() {
|
|
||||||
super.start();
|
|
||||||
|
|
||||||
if (!this.rerollCount) {
|
|
||||||
this.updateSeed();
|
|
||||||
} else {
|
|
||||||
this.scene.reroll = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
const party = this.scene.getParty();
|
|
||||||
regenerateModifierPoolThresholds(party, this.getPoolType(), this.rerollCount);
|
|
||||||
const modifierCount = new Utils.IntegerHolder(3);
|
|
||||||
if (this.isPlayer()) {
|
|
||||||
this.scene.applyModifiers(ExtraModifierModifier, true, modifierCount);
|
|
||||||
}
|
|
||||||
|
|
||||||
// If custom modifiers are specified, overrides default item count
|
|
||||||
if (!!this.customModifierSettings) {
|
|
||||||
const newItemCount = (this.customModifierSettings.guaranteedModifierTiers?.length || 0) +
|
|
||||||
(this.customModifierSettings.guaranteedModifierTypeOptions?.length || 0) +
|
|
||||||
(this.customModifierSettings.guaranteedModifierTypeFuncs?.length || 0);
|
|
||||||
if (this.customModifierSettings.fillRemaining) {
|
|
||||||
const originalCount = modifierCount.value;
|
|
||||||
modifierCount.value = originalCount > newItemCount ? originalCount : newItemCount;
|
|
||||||
} else {
|
|
||||||
modifierCount.value = newItemCount;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const typeOptions: ModifierTypeOption[] = this.getModifierTypeOptions(modifierCount.value);
|
|
||||||
|
|
||||||
const modifierSelectCallback = (rowCursor: integer, cursor: integer) => {
|
|
||||||
if (rowCursor < 0 || cursor < 0) {
|
|
||||||
this.scene.ui.showText(i18next.t("battle:skipItemQuestion"), null, () => {
|
|
||||||
this.scene.ui.setOverlayMode(Mode.CONFIRM, () => {
|
|
||||||
this.scene.ui.revertMode();
|
|
||||||
this.scene.ui.setMode(Mode.MESSAGE);
|
|
||||||
super.end();
|
|
||||||
}, () => this.scene.ui.setMode(Mode.MODIFIER_SELECT, this.isPlayer(), typeOptions, modifierSelectCallback, this.getRerollCost(typeOptions, this.scene.lockModifierTiers)));
|
|
||||||
});
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
let modifierType: ModifierType;
|
|
||||||
let cost: integer;
|
|
||||||
switch (rowCursor) {
|
|
||||||
case 0:
|
|
||||||
switch (cursor) {
|
|
||||||
case 0:
|
|
||||||
const rerollCost = this.getRerollCost(typeOptions, this.scene.lockModifierTiers);
|
|
||||||
if (rerollCost === 0 || this.scene.money < rerollCost) {
|
|
||||||
this.scene.ui.playError();
|
|
||||||
return false;
|
|
||||||
} else {
|
|
||||||
this.scene.reroll = true;
|
|
||||||
this.scene.unshiftPhase(new SelectModifierPhase(this.scene, this.rerollCount + 1, typeOptions.map(o => o.type.tier)));
|
|
||||||
this.scene.ui.clearText();
|
|
||||||
this.scene.ui.setMode(Mode.MESSAGE).then(() => super.end());
|
|
||||||
this.scene.money -= rerollCost;
|
|
||||||
this.scene.updateMoneyText();
|
|
||||||
this.scene.animateMoneyChanged(false);
|
|
||||||
this.scene.playSound("buy");
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
this.scene.ui.setModeWithoutClear(Mode.PARTY, PartyUiMode.MODIFIER_TRANSFER, -1, (fromSlotIndex: integer, itemIndex: integer, itemQuantity: integer, toSlotIndex: integer) => {
|
|
||||||
if (toSlotIndex !== undefined && fromSlotIndex < 6 && toSlotIndex < 6 && fromSlotIndex !== toSlotIndex && itemIndex > -1) {
|
|
||||||
const itemModifiers = this.scene.findModifiers(m => m instanceof PokemonHeldItemModifier
|
|
||||||
&& (m as PokemonHeldItemModifier).getTransferrable(true) && (m as PokemonHeldItemModifier).pokemonId === party[fromSlotIndex].id) as PokemonHeldItemModifier[];
|
|
||||||
const itemModifier = itemModifiers[itemIndex];
|
|
||||||
this.scene.tryTransferHeldItemModifier(itemModifier, party[toSlotIndex], true, itemQuantity);
|
|
||||||
} else {
|
|
||||||
this.scene.ui.setMode(Mode.MODIFIER_SELECT, this.isPlayer(), typeOptions, modifierSelectCallback, this.getRerollCost(typeOptions, this.scene.lockModifierTiers));
|
|
||||||
}
|
|
||||||
}, PartyUiHandler.FilterItemMaxStacks);
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
this.scene.ui.setModeWithoutClear(Mode.PARTY, PartyUiMode.CHECK, -1, () => {
|
|
||||||
this.scene.ui.setMode(Mode.MODIFIER_SELECT, this.isPlayer(), typeOptions, modifierSelectCallback, this.getRerollCost(typeOptions, this.scene.lockModifierTiers));
|
|
||||||
});
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
this.scene.lockModifierTiers = !this.scene.lockModifierTiers;
|
|
||||||
const uiHandler = this.scene.ui.getHandler() as ModifierSelectUiHandler;
|
|
||||||
uiHandler.setRerollCost(this.getRerollCost(typeOptions, this.scene.lockModifierTiers));
|
|
||||||
uiHandler.updateLockRaritiesText();
|
|
||||||
uiHandler.updateRerollCostText();
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
case 1:
|
|
||||||
if (typeOptions.length === 0) {
|
|
||||||
this.scene.ui.revertMode();
|
|
||||||
this.scene.ui.setMode(Mode.MESSAGE);
|
|
||||||
super.end();
|
|
||||||
}
|
|
||||||
modifierType = typeOptions[cursor].type;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
const shopOptions = getPlayerShopModifierTypeOptionsForWave(this.scene.currentBattle.waveIndex, this.scene.getWaveMoneyAmount(1));
|
|
||||||
const shopOption = shopOptions[rowCursor > 2 || shopOptions.length <= SHOP_OPTIONS_ROW_LIMIT ? cursor : cursor + SHOP_OPTIONS_ROW_LIMIT];
|
|
||||||
modifierType = shopOption.type;
|
|
||||||
cost = shopOption.cost;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (cost && this.scene.money < cost) {
|
|
||||||
this.scene.ui.playError();
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
const applyModifier = (modifier: Modifier, playSound: boolean = false) => {
|
|
||||||
const result = this.scene.addModifier(modifier, false, playSound);
|
|
||||||
if (cost) {
|
|
||||||
result.then(success => {
|
|
||||||
if (success) {
|
|
||||||
this.scene.money -= cost;
|
|
||||||
this.scene.updateMoneyText();
|
|
||||||
this.scene.animateMoneyChanged(false);
|
|
||||||
this.scene.playSound("buy");
|
|
||||||
(this.scene.ui.getHandler() as ModifierSelectUiHandler).updateCostText();
|
|
||||||
} else {
|
|
||||||
this.scene.ui.playError();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
const doEnd = () => {
|
|
||||||
this.scene.ui.clearText();
|
|
||||||
this.scene.ui.setMode(Mode.MESSAGE);
|
|
||||||
super.end();
|
|
||||||
};
|
|
||||||
if (result instanceof Promise) {
|
|
||||||
result.then(() => doEnd());
|
|
||||||
} else {
|
|
||||||
doEnd();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
if (modifierType instanceof PokemonModifierType) {
|
|
||||||
if (modifierType instanceof FusePokemonModifierType) {
|
|
||||||
this.scene.ui.setModeWithoutClear(Mode.PARTY, PartyUiMode.SPLICE, -1, (fromSlotIndex: integer, spliceSlotIndex: integer) => {
|
|
||||||
if (spliceSlotIndex !== undefined && fromSlotIndex < 6 && spliceSlotIndex < 6 && fromSlotIndex !== spliceSlotIndex) {
|
|
||||||
this.scene.ui.setMode(Mode.MODIFIER_SELECT, this.isPlayer()).then(() => {
|
|
||||||
const modifier = modifierType.newModifier(party[fromSlotIndex], party[spliceSlotIndex]);
|
|
||||||
applyModifier(modifier, true);
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
this.scene.ui.setMode(Mode.MODIFIER_SELECT, this.isPlayer(), typeOptions, modifierSelectCallback, this.getRerollCost(typeOptions, this.scene.lockModifierTiers));
|
|
||||||
}
|
|
||||||
}, modifierType.selectFilter);
|
|
||||||
} else {
|
|
||||||
const pokemonModifierType = modifierType as PokemonModifierType;
|
|
||||||
const isMoveModifier = modifierType instanceof PokemonMoveModifierType;
|
|
||||||
const isTmModifier = modifierType instanceof TmModifierType;
|
|
||||||
const isRememberMoveModifier = modifierType instanceof RememberMoveModifierType;
|
|
||||||
const isPpRestoreModifier = (modifierType instanceof PokemonPpRestoreModifierType || modifierType instanceof PokemonPpUpModifierType);
|
|
||||||
const partyUiMode = isMoveModifier ? PartyUiMode.MOVE_MODIFIER
|
|
||||||
: isTmModifier ? PartyUiMode.TM_MODIFIER
|
|
||||||
: isRememberMoveModifier ? PartyUiMode.REMEMBER_MOVE_MODIFIER
|
|
||||||
: PartyUiMode.MODIFIER;
|
|
||||||
const tmMoveId = isTmModifier
|
|
||||||
? (modifierType as TmModifierType).moveId
|
|
||||||
: undefined;
|
|
||||||
this.scene.ui.setModeWithoutClear(Mode.PARTY, partyUiMode, -1, (slotIndex: integer, option: PartyOption) => {
|
|
||||||
if (slotIndex < 6) {
|
|
||||||
this.scene.ui.setMode(Mode.MODIFIER_SELECT, this.isPlayer()).then(() => {
|
|
||||||
const modifier = !isMoveModifier
|
|
||||||
? !isRememberMoveModifier
|
|
||||||
? modifierType.newModifier(party[slotIndex])
|
|
||||||
: modifierType.newModifier(party[slotIndex], option as integer)
|
|
||||||
: modifierType.newModifier(party[slotIndex], option - PartyOption.MOVE_1);
|
|
||||||
applyModifier(modifier, true);
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
this.scene.ui.setMode(Mode.MODIFIER_SELECT, this.isPlayer(), typeOptions, modifierSelectCallback, this.getRerollCost(typeOptions, this.scene.lockModifierTiers));
|
|
||||||
}
|
|
||||||
}, pokemonModifierType.selectFilter, modifierType instanceof PokemonMoveModifierType ? (modifierType as PokemonMoveModifierType).moveSelectFilter : undefined, tmMoveId, isPpRestoreModifier);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
applyModifier(modifierType.newModifier());
|
|
||||||
}
|
|
||||||
|
|
||||||
return !cost;
|
|
||||||
};
|
|
||||||
this.scene.ui.setMode(Mode.MODIFIER_SELECT, this.isPlayer(), typeOptions, modifierSelectCallback, this.getRerollCost(typeOptions, this.scene.lockModifierTiers));
|
|
||||||
}
|
|
||||||
|
|
||||||
updateSeed(): void {
|
|
||||||
this.scene.resetSeed();
|
|
||||||
}
|
|
||||||
|
|
||||||
isPlayer(): boolean {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
getRerollCost(typeOptions: ModifierTypeOption[], lockRarities: boolean): integer {
|
|
||||||
let baseValue = 0;
|
|
||||||
if (lockRarities) {
|
|
||||||
const tierValues = [50, 125, 300, 750, 2000];
|
|
||||||
for (const opt of typeOptions) {
|
|
||||||
baseValue += tierValues[opt.type.tier];
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
baseValue = 250;
|
|
||||||
}
|
|
||||||
const multiplier = !isNullOrUndefined(this.customModifierSettings?.rerollMultiplier) ? this.customModifierSettings.rerollMultiplier : 1;
|
|
||||||
return Math.min(Math.ceil(this.scene.currentBattle.waveIndex / 10) * baseValue * Math.pow(2, this.rerollCount) * multiplier, Number.MAX_SAFE_INTEGER);
|
|
||||||
}
|
|
||||||
|
|
||||||
getPoolType(): ModifierPoolType {
|
|
||||||
return ModifierPoolType.PLAYER;
|
|
||||||
}
|
|
||||||
|
|
||||||
getModifierTypeOptions(modifierCount: integer): ModifierTypeOption[] {
|
|
||||||
return getPlayerModifierTypeOptions(modifierCount, this.scene.getParty(), this.scene.lockModifierTiers ? this.modifierTiers : undefined, this.customModifierSettings);
|
|
||||||
}
|
|
||||||
|
|
||||||
addModifier(modifier: Modifier): Promise<boolean> {
|
|
||||||
return this.scene.addModifier(modifier, false, true);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -125,7 +125,7 @@ export interface SessionSaveData {
|
||||||
timestamp: integer;
|
timestamp: integer;
|
||||||
challenges: ChallengeData[];
|
challenges: ChallengeData[];
|
||||||
mysteryEncounter: MysteryEncounter;
|
mysteryEncounter: MysteryEncounter;
|
||||||
mysteryEncounterFlags: MysteryEncounterData;
|
mysteryEncounterData: MysteryEncounterData;
|
||||||
}
|
}
|
||||||
|
|
||||||
interface Unlocks {
|
interface Unlocks {
|
||||||
|
@ -842,7 +842,7 @@ export class GameData {
|
||||||
timestamp: new Date().getTime(),
|
timestamp: new Date().getTime(),
|
||||||
challenges: scene.gameMode.challenges.map(c => new ChallengeData(c)),
|
challenges: scene.gameMode.challenges.map(c => new ChallengeData(c)),
|
||||||
mysteryEncounter: scene.currentBattle.mysteryEncounter,
|
mysteryEncounter: scene.currentBattle.mysteryEncounter,
|
||||||
mysteryEncounterFlags: scene.mysteryEncounterData
|
mysteryEncounterData: scene.mysteryEncounterData
|
||||||
} as SessionSaveData;
|
} as SessionSaveData;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -933,7 +933,7 @@ export class GameData {
|
||||||
scene.score = sessionData.score;
|
scene.score = sessionData.score;
|
||||||
scene.updateScoreText();
|
scene.updateScoreText();
|
||||||
|
|
||||||
scene.mysteryEncounterData = sessionData?.mysteryEncounterFlags ? sessionData?.mysteryEncounterFlags : new MysteryEncounterData(null);
|
scene.mysteryEncounterData = sessionData?.mysteryEncounterData ? sessionData?.mysteryEncounterData : new MysteryEncounterData(null);
|
||||||
|
|
||||||
scene.newArena(sessionData.arena.biome);
|
scene.newArena(sessionData.arena.biome);
|
||||||
|
|
||||||
|
@ -1158,7 +1158,7 @@ export class GameData {
|
||||||
return new MysteryEncounter(v);
|
return new MysteryEncounter(v);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (k === "mysteryEncounterFlags") {
|
if (k === "mysteryEncounterData") {
|
||||||
return new MysteryEncounterData(v);
|
return new MysteryEncounterData(v);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -9,7 +9,7 @@ import {
|
||||||
EncounterPhase,
|
EncounterPhase,
|
||||||
EnemyCommandPhase,
|
EnemyCommandPhase,
|
||||||
LoginPhase,
|
LoginPhase,
|
||||||
SelectGenderPhase,
|
SelectGenderPhase, SelectModifierPhase,
|
||||||
SelectStarterPhase,
|
SelectStarterPhase,
|
||||||
SummonPhase,
|
SummonPhase,
|
||||||
TitlePhase,
|
TitlePhase,
|
||||||
|
@ -23,7 +23,6 @@ import { Abilities } from "#enums/abilities";
|
||||||
import { Moves } from "#enums/moves";
|
import { Moves } from "#enums/moves";
|
||||||
import { PlayerGender } from "#enums/player-gender";
|
import { PlayerGender } from "#enums/player-gender";
|
||||||
import { Species } from "#enums/species";
|
import { Species } from "#enums/species";
|
||||||
import {SelectModifierPhase} from "#app/phases/select-modifier-phase";
|
|
||||||
|
|
||||||
describe("Test Battle Phase", () => {
|
describe("Test Battle Phase", () => {
|
||||||
let phaserGame: Phaser.Game;
|
let phaserGame: Phaser.Game;
|
||||||
|
|
|
@ -7,11 +7,11 @@ import {ModifierTier} from "#app/modifier/modifier-tier";
|
||||||
import * as Utils from "#app/utils";
|
import * as Utils from "#app/utils";
|
||||||
import { CustomModifierSettings, ModifierTypeOption, modifierTypes } from "#app/modifier/modifier-type";
|
import { CustomModifierSettings, ModifierTypeOption, modifierTypes } from "#app/modifier/modifier-type";
|
||||||
import BattleScene from "#app/battle-scene";
|
import BattleScene from "#app/battle-scene";
|
||||||
import {SelectModifierPhase} from "#app/phases/select-modifier-phase";
|
|
||||||
import { Species } from "#enums/species";
|
import { Species } from "#enums/species";
|
||||||
import { Mode } from "#app/ui/ui";
|
import { Mode } from "#app/ui/ui";
|
||||||
import { PlayerPokemon } from "#app/field/pokemon";
|
import { PlayerPokemon } from "#app/field/pokemon";
|
||||||
import { getPokemonSpecies } from "#app/data/pokemon-species";
|
import { getPokemonSpecies } from "#app/data/pokemon-species";
|
||||||
|
import { SelectModifierPhase } from "#app/phases";
|
||||||
|
|
||||||
describe("SelectModifierPhase", () => {
|
describe("SelectModifierPhase", () => {
|
||||||
let phaserGame: Phaser.Game;
|
let phaserGame: Phaser.Game;
|
||||||
|
|
|
@ -4,7 +4,7 @@ import { Species } from "#app/enums/species";
|
||||||
import { Button } from "#app/enums/buttons";
|
import { Button } from "#app/enums/buttons";
|
||||||
import * as overrides from "#app/overrides";
|
import * as overrides from "#app/overrides";
|
||||||
import {
|
import {
|
||||||
BattleEndPhase,
|
BattleEndPhase, SelectModifierPhase,
|
||||||
} from "#app/phases";
|
} from "#app/phases";
|
||||||
import GameManager from "#app/test/utils/gameManager";
|
import GameManager from "#app/test/utils/gameManager";
|
||||||
import ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler";
|
import ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler";
|
||||||
|
@ -14,7 +14,6 @@ import Phaser from "phaser";
|
||||||
import BBCodeText from "phaser3-rex-plugins/plugins/bbcodetext";
|
import BBCodeText from "phaser3-rex-plugins/plugins/bbcodetext";
|
||||||
import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
|
import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
|
||||||
import { getMovePosition } from "../utils/gameManagerUtils";
|
import { getMovePosition } from "../utils/gameManagerUtils";
|
||||||
import {SelectModifierPhase} from "#app/phases/select-modifier-phase";
|
|
||||||
|
|
||||||
|
|
||||||
describe("UI - Transfer Items", () => {
|
describe("UI - Transfer Items", () => {
|
||||||
|
|
|
@ -16,7 +16,7 @@ import {
|
||||||
NewBattlePhase,
|
NewBattlePhase,
|
||||||
NextEncounterPhase,
|
NextEncounterPhase,
|
||||||
PostSummonPhase,
|
PostSummonPhase,
|
||||||
SelectGenderPhase,
|
SelectGenderPhase, SelectModifierPhase,
|
||||||
SelectStarterPhase,
|
SelectStarterPhase,
|
||||||
SelectTargetPhase,
|
SelectTargetPhase,
|
||||||
ShinySparklePhase,
|
ShinySparklePhase,
|
||||||
|
@ -37,7 +37,6 @@ import UI, {Mode} from "#app/ui/ui";
|
||||||
import { Phase } from "#app/phase";
|
import { Phase } from "#app/phase";
|
||||||
import ErrorInterceptor from "#app/test/utils/errorInterceptor";
|
import ErrorInterceptor from "#app/test/utils/errorInterceptor";
|
||||||
import { QuietFormChangePhase } from "#app/form-change-phase";
|
import { QuietFormChangePhase } from "#app/form-change-phase";
|
||||||
import {SelectModifierPhase} from "#app/phases/select-modifier-phase";
|
|
||||||
import {
|
import {
|
||||||
MysteryEncounterBattlePhase,
|
MysteryEncounterBattlePhase,
|
||||||
MysteryEncounterOptionSelectedPhase,
|
MysteryEncounterOptionSelectedPhase,
|
||||||
|
|
|
@ -9,13 +9,13 @@ import { initMoves } from "#app/data/move";
|
||||||
import { initPokemonPrevolutions } from "#app/data/pokemon-evolutions";
|
import { initPokemonPrevolutions } from "#app/data/pokemon-evolutions";
|
||||||
import { initPokemonForms } from "#app/data/pokemon-forms";
|
import { initPokemonForms } from "#app/data/pokemon-forms";
|
||||||
import { initSpecies } from "#app/data/pokemon-species";
|
import { initSpecies } from "#app/data/pokemon-species";
|
||||||
import { initAchievements } from "#app/system/achv.js";
|
|
||||||
import { initVouchers } from "#app/system/voucher.js";
|
|
||||||
import { initStatsKeys } from "#app/ui/game-stats-ui-handler";
|
import { initStatsKeys } from "#app/ui/game-stats-ui-handler";
|
||||||
import { beforeAll, beforeEach, vi } from "vitest";
|
import { beforeAll, beforeEach, vi } from "vitest";
|
||||||
import * as overrides from "#app/overrides";
|
import * as overrides from "#app/overrides";
|
||||||
import { initMysteryEncounterDialogue } from "#app/data/mystery-encounters/dialogue/mystery-encounter-dialogue";
|
|
||||||
import { initMysteryEncounters } from "#app/data/mystery-encounters/mystery-encounters";
|
import { initMysteryEncounters } from "#app/data/mystery-encounters/mystery-encounters";
|
||||||
|
import { initMysteryEncounterDialogue } from "#app/data/mystery-encounters/mystery-encounter-dialogue";
|
||||||
|
import { initVouchers } from "#app/system/voucher";
|
||||||
|
import { initAchievements } from "#app/system/achv";
|
||||||
|
|
||||||
initVouchers();
|
initVouchers();
|
||||||
initAchievements();
|
initAchievements();
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import { CommandPhase } from "../phases";
|
import { CommandPhase, SelectModifierPhase } from "../phases";
|
||||||
import BattleScene from "../battle-scene";
|
import BattleScene from "../battle-scene";
|
||||||
import { PlayerPokemon, PokemonMove } from "../field/pokemon";
|
import { PlayerPokemon, PokemonMove } from "../field/pokemon";
|
||||||
import { addBBCodeTextObject, addTextObject, getTextColor, TextStyle } from "./text";
|
import { addBBCodeTextObject, addTextObject, getTextColor, TextStyle } from "./text";
|
||||||
|
@ -21,7 +21,6 @@ import MoveInfoOverlay from "./move-info-overlay";
|
||||||
import i18next from "i18next";
|
import i18next from "i18next";
|
||||||
import BBCodeText from "phaser3-rex-plugins/plugins/bbcodetext";
|
import BBCodeText from "phaser3-rex-plugins/plugins/bbcodetext";
|
||||||
import { Moves } from "#enums/moves";
|
import { Moves } from "#enums/moves";
|
||||||
import { SelectModifierPhase } from "#app/phases/select-modifier-phase";
|
|
||||||
|
|
||||||
const defaultMessage = i18next.t("partyUiHandler:choosePokemon");
|
const defaultMessage = i18next.t("partyUiHandler:choosePokemon");
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue