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 |
BIN
public/images/items/mint_atk.png
Normal file
After Width: | Height: | Size: 567 B |
BIN
public/images/items/mint_def.png
Normal file
After Width: | Height: | Size: 576 B |
BIN
public/images/items/mint_neutral.png
Normal file
After Width: | Height: | Size: 556 B |
BIN
public/images/items/mint_spatk.png
Normal file
After Width: | Height: | Size: 586 B |
BIN
public/images/items/mint_spd.png
Normal file
After Width: | Height: | Size: 602 B |
BIN
public/images/items/mint_spdef.png
Normal file
After Width: | Height: | Size: 581 B |
@ -30,7 +30,7 @@ export enum Nature {
|
|||||||
QUIRKY
|
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]);
|
let ret = Utils.toReadableString(Nature[nature]);
|
||||||
if (includeStatEffects) {
|
if (includeStatEffects) {
|
||||||
const stats = Utils.getEnumValues(Stat).slice(1);
|
const stats = Utils.getEnumValues(Stat).slice(1);
|
||||||
@ -44,10 +44,11 @@ export function getNatureName(nature: Nature, includeStatEffects: boolean = fals
|
|||||||
decreasedStat = stat;
|
decreasedStat = stat;
|
||||||
}
|
}
|
||||||
const textStyle = forStarterSelect ? TextStyle.SUMMARY_ALT : TextStyle.WINDOW;
|
const textStyle = forStarterSelect ? TextStyle.SUMMARY_ALT : TextStyle.WINDOW;
|
||||||
|
const getTextFrag = !ignoreBBCode ? getBBCodeFrag : (text: string, style: TextStyle) => text;
|
||||||
if (increasedStat && decreasedStat)
|
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
|
else
|
||||||
ret = getBBCodeFrag(`${ret}${!forStarterSelect ? '\n' : ' '}(-)`, textStyle);
|
ret = getTextFrag(`${ret}${!forStarterSelect ? '\n' : ' '}(-)`, textStyle);
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -18,6 +18,7 @@ import BattleScene from '../battle-scene';
|
|||||||
import { VoucherType, getVoucherTypeIcon, getVoucherTypeName } from '../system/voucher';
|
import { VoucherType, getVoucherTypeIcon, getVoucherTypeName } from '../system/voucher';
|
||||||
import { FormChangeItem, SpeciesFormChangeItemTrigger, pokemonFormChanges } from '../data/pokemon-forms';
|
import { FormChangeItem, SpeciesFormChangeItemTrigger, pokemonFormChanges } from '../data/pokemon-forms';
|
||||||
import { ModifierTier } from './modifier-tier';
|
import { ModifierTier } from './modifier-tier';
|
||||||
|
import { Nature, getNatureName, getNatureStatMultiplier } from '#app/data/nature';
|
||||||
|
|
||||||
const outputModifierData = false;
|
const outputModifierData = false;
|
||||||
const useMaxWeightForOutput = 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 {
|
export class RememberMoveModifierType extends PokemonModifierType {
|
||||||
constructor(name: string, description: string, iconImage?: string, group?: string) {
|
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)),
|
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(),
|
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[]) => {
|
TERA_SHARD: () => new ModifierTypeGenerator((party: Pokemon[], pregenArgs?: any[]) => {
|
||||||
if (pregenArgs)
|
if (pregenArgs)
|
||||||
return new TerastallizeModifierType(pregenArgs[0] as Type);
|
return new TerastallizeModifierType(pregenArgs[0] as Type);
|
||||||
@ -981,6 +1003,7 @@ const modifierPool: ModifierPool = {
|
|||||||
new WeightedModifierType(modifierTypes.BIG_NUGGET, 12),
|
new WeightedModifierType(modifierTypes.BIG_NUGGET, 12),
|
||||||
new WeightedModifierType(modifierTypes.PP_UP, 9),
|
new WeightedModifierType(modifierTypes.PP_UP, 9),
|
||||||
new WeightedModifierType(modifierTypes.PP_MAX, 3),
|
new WeightedModifierType(modifierTypes.PP_MAX, 3),
|
||||||
|
new WeightedModifierType(modifierTypes.MINT, 4),
|
||||||
new WeightedModifierType(modifierTypes.RARE_EVOLUTION_ITEM, (party: Pokemon[]) => {
|
new WeightedModifierType(modifierTypes.RARE_EVOLUTION_ITEM, (party: Pokemon[]) => {
|
||||||
return Math.min(Math.ceil(party[0].scene.currentBattle.waveIndex / 15) * 4, 32);
|
return Math.min(Math.ceil(party[0].scene.currentBattle.waveIndex / 15) * 4, 32);
|
||||||
}, 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.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.SOUL_DEW, 2),
|
||||||
new WeightedModifierType(modifierTypes.GOLDEN_PUNCH, 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_CHARM, 8),
|
||||||
new WeightedModifierType(modifierTypes.EXP_SHARE, 12),
|
new WeightedModifierType(modifierTypes.EXP_SHARE, 12),
|
||||||
new WeightedModifierType(modifierTypes.EXP_BALANCE, 4),
|
new WeightedModifierType(modifierTypes.EXP_BALANCE, 4),
|
||||||
|
@ -18,6 +18,7 @@ import { MoneyAchv, achvs } from '../system/achv';
|
|||||||
import { VoucherType } from '../system/voucher';
|
import { VoucherType } from '../system/voucher';
|
||||||
import { PreventBerryUseAbAttr, applyAbAttrs } from '../data/ability';
|
import { PreventBerryUseAbAttr, applyAbAttrs } from '../data/ability';
|
||||||
import { FormChangeItem, SpeciesFormChangeItemTrigger } from '../data/pokemon-forms';
|
import { FormChangeItem, SpeciesFormChangeItemTrigger } from '../data/pokemon-forms';
|
||||||
|
import { Nature } from '#app/data/nature';
|
||||||
|
|
||||||
type ModifierType = ModifierTypes.ModifierType;
|
type ModifierType = ModifierTypes.ModifierType;
|
||||||
export type ModifierPredicate = (modifier: Modifier) => boolean;
|
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 {
|
export class PokemonLevelIncrementModifier extends ConsumablePokemonModifier {
|
||||||
constructor(type: ModifierType, pokemonId: integer) {
|
constructor(type: ModifierType, pokemonId: integer) {
|
||||||
super(type, pokemonId);
|
super(type, pokemonId);
|
||||||
|