Implement Mints (#27)
* Implement mints to change natures * Merge main * Merge main
13558
public/images/items.json
Before Width: | Height: | Size: 45 KiB After Width: | Height: | Size: 47 KiB |
After Width: | Height: | Size: 567 B |
After Width: | Height: | Size: 576 B |
After Width: | Height: | Size: 556 B |
After Width: | Height: | Size: 586 B |
After Width: | Height: | Size: 602 B |
After Width: | Height: | Size: 581 B |
|
@ -30,7 +30,7 @@ export enum Nature {
|
|||
QUIRKY
|
||||
}
|
||||
|
||||
export function getNatureName(nature: Nature, includeStatEffects: boolean = false, forStarterSelect: boolean = false): string {
|
||||
export function getNatureName(nature: Nature, includeStatEffects: boolean = false, forStarterSelect: boolean = false, ignoreBBCode: boolean = false): string {
|
||||
let ret = Utils.toReadableString(Nature[nature]);
|
||||
if (includeStatEffects) {
|
||||
const stats = Utils.getEnumValues(Stat).slice(1);
|
||||
|
@ -44,10 +44,11 @@ export function getNatureName(nature: Nature, includeStatEffects: boolean = fals
|
|||
decreasedStat = stat;
|
||||
}
|
||||
const textStyle = forStarterSelect ? TextStyle.SUMMARY_ALT : TextStyle.WINDOW;
|
||||
const getTextFrag = !ignoreBBCode ? getBBCodeFrag : (text: string, style: TextStyle) => text;
|
||||
if (increasedStat && decreasedStat)
|
||||
ret = `${getBBCodeFrag(`${ret}${!forStarterSelect ? '\n' : ' '}(`, textStyle)}${getBBCodeFrag(`+${getStatName(increasedStat, true)}`, TextStyle.SUMMARY_PINK)}${getBBCodeFrag('/', textStyle)}${getBBCodeFrag(`-${getStatName(decreasedStat, true)}`, TextStyle.SUMMARY_BLUE)}${getBBCodeFrag(')', textStyle)}`;
|
||||
ret = `${getTextFrag(`${ret}${!forStarterSelect ? '\n' : ' '}(`, textStyle)}${getTextFrag(`+${getStatName(increasedStat, true)}`, TextStyle.SUMMARY_PINK)}${getTextFrag('/', textStyle)}${getTextFrag(`-${getStatName(decreasedStat, true)}`, TextStyle.SUMMARY_BLUE)}${getTextFrag(')', textStyle)}`;
|
||||
else
|
||||
ret = getBBCodeFrag(`${ret}${!forStarterSelect ? '\n' : ' '}(-)`, textStyle);
|
||||
ret = getTextFrag(`${ret}${!forStarterSelect ? '\n' : ' '}(-)`, textStyle);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
|
|
@ -18,6 +18,7 @@ import BattleScene from '../battle-scene';
|
|||
import { VoucherType, getVoucherTypeIcon, getVoucherTypeName } from '../system/voucher';
|
||||
import { FormChangeItem, SpeciesFormChangeItemTrigger, pokemonFormChanges } from '../data/pokemon-forms';
|
||||
import { ModifierTier } from './modifier-tier';
|
||||
import { Nature, getNatureName, getNatureStatMultiplier } from '#app/data/nature';
|
||||
|
||||
const outputModifierData = false;
|
||||
const useMaxWeightForOutput = false;
|
||||
|
@ -264,6 +265,21 @@ export class PokemonPpUpModifierType extends PokemonMoveModifierType {
|
|||
}
|
||||
}
|
||||
|
||||
export class PokemonNatureChangeModifierType extends PokemonModifierType {
|
||||
protected nature: Nature;
|
||||
|
||||
constructor(nature: Nature) {
|
||||
super(`${getNatureName(nature)} Mint`, `Changes a Pokémon\'s nature to ${getNatureName(nature, true, true, true)}`, ((_type, args) => new Modifiers.PokemonNatureChangeModifier(this, (args[0] as PlayerPokemon).id, this.nature)),
|
||||
((pokemon: PlayerPokemon) => {
|
||||
if (pokemon.nature === this.nature)
|
||||
return PartyUiHandler.NoEffectMessage;
|
||||
return null;
|
||||
}), `mint_${Utils.getEnumKeys(Stat).find(s => getNatureStatMultiplier(nature, Stat[s]) > 1)?.toLowerCase() || 'neutral' }`, 'mint');
|
||||
|
||||
this.nature = nature;
|
||||
}
|
||||
}
|
||||
|
||||
export class RememberMoveModifierType extends PokemonModifierType {
|
||||
constructor(name: string, description: string, iconImage?: string, group?: string) {
|
||||
super(name, description, (type, args) => new Modifiers.RememberMoveModifier(type, (args[0] as PlayerPokemon).id, (args[1] as integer)),
|
||||
|
@ -771,6 +787,12 @@ export const modifierTypes = {
|
|||
|
||||
ATTACK_TYPE_BOOSTER: () => new AttackTypeBoosterModifierTypeGenerator(),
|
||||
|
||||
MINT: () => new ModifierTypeGenerator((party: Pokemon[], pregenArgs?: any[]) => {
|
||||
if (pregenArgs)
|
||||
return new PokemonNatureChangeModifierType(pregenArgs[0] as Nature);
|
||||
return new PokemonNatureChangeModifierType(Utils.randSeedInt(Utils.getEnumValues(Nature).length) as Nature);
|
||||
}),
|
||||
|
||||
TERA_SHARD: () => new ModifierTypeGenerator((party: Pokemon[], pregenArgs?: any[]) => {
|
||||
if (pregenArgs)
|
||||
return new TerastallizeModifierType(pregenArgs[0] as Type);
|
||||
|
@ -981,6 +1003,7 @@ const modifierPool: ModifierPool = {
|
|||
new WeightedModifierType(modifierTypes.BIG_NUGGET, 12),
|
||||
new WeightedModifierType(modifierTypes.PP_UP, 9),
|
||||
new WeightedModifierType(modifierTypes.PP_MAX, 3),
|
||||
new WeightedModifierType(modifierTypes.MINT, 4),
|
||||
new WeightedModifierType(modifierTypes.RARE_EVOLUTION_ITEM, (party: Pokemon[]) => {
|
||||
return Math.min(Math.ceil(party[0].scene.currentBattle.waveIndex / 15) * 4, 32);
|
||||
}, 32),
|
||||
|
@ -993,7 +1016,7 @@ const modifierPool: ModifierPool = {
|
|||
new WeightedModifierType(modifierTypes.SOOTHE_BELL, (party: Pokemon[]) => party.find(p => (pokemonEvolutions.hasOwnProperty(p.species.speciesId) && pokemonEvolutions[p.species.speciesId].find(e => e.condition && e.condition instanceof SpeciesFriendshipEvolutionCondition)) || p.moveset.find(m => m.moveId === Moves.RETURN)) ? 16 : 0, 16),
|
||||
new WeightedModifierType(modifierTypes.SOUL_DEW, 2),
|
||||
new WeightedModifierType(modifierTypes.GOLDEN_PUNCH, 2),
|
||||
new WeightedModifierType(modifierTypes.IV_SCANNER, 2),
|
||||
new WeightedModifierType(modifierTypes.IV_SCANNER, 4),
|
||||
new WeightedModifierType(modifierTypes.EXP_CHARM, 8),
|
||||
new WeightedModifierType(modifierTypes.EXP_SHARE, 12),
|
||||
new WeightedModifierType(modifierTypes.EXP_BALANCE, 4),
|
||||
|
|
|
@ -18,6 +18,7 @@ import { MoneyAchv, achvs } from '../system/achv';
|
|||
import { VoucherType } from '../system/voucher';
|
||||
import { PreventBerryUseAbAttr, applyAbAttrs } from '../data/ability';
|
||||
import { FormChangeItem, SpeciesFormChangeItemTrigger } from '../data/pokemon-forms';
|
||||
import { Nature } from '#app/data/nature';
|
||||
|
||||
type ModifierType = ModifierTypes.ModifierType;
|
||||
export type ModifierPredicate = (modifier: Modifier) => boolean;
|
||||
|
@ -1093,6 +1094,23 @@ export class PokemonPpUpModifier extends ConsumablePokemonMoveModifier {
|
|||
}
|
||||
}
|
||||
|
||||
export class PokemonNatureChangeModifier extends ConsumablePokemonModifier {
|
||||
public nature: Nature;
|
||||
|
||||
constructor(type: ModifierType, pokemonId: integer, nature: Nature) {
|
||||
super(type, pokemonId);
|
||||
|
||||
this.nature = nature;
|
||||
}
|
||||
|
||||
apply(args: any[]): boolean {
|
||||
const pokemon = args[0] as Pokemon;
|
||||
pokemon.nature = this.nature;
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
export class PokemonLevelIncrementModifier extends ConsumablePokemonModifier {
|
||||
constructor(type: ModifierType, pokemonId: integer) {
|
||||
super(type, pokemonId);
|
||||
|
|