Add rarer candy and candy jar items
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 19 KiB |
After Width: | Height: | Size: 511 B |
After Width: | Height: | Size: 366 B |
After Width: | Height: | Size: 538 B |
After Width: | Height: | Size: 369 B |
After Width: | Height: | Size: 285 B |
|
@ -55,7 +55,7 @@ export function getPokeballCatchMultiplier(type: PokeballType): number {
|
||||||
case PokeballType.ULTRA_BALL:
|
case PokeballType.ULTRA_BALL:
|
||||||
return 2;
|
return 2;
|
||||||
case PokeballType.MASTER_BALL:
|
case PokeballType.MASTER_BALL:
|
||||||
return 10;
|
return -1;
|
||||||
case PokeballType.LUXURY_BALL:
|
case PokeballType.LUXURY_BALL:
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -243,6 +243,12 @@ export class PokemonLevelIncrementModifierType extends PokemonModifierType {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export class AllPokemonLevelIncrementModifierType extends ModifierType {
|
||||||
|
constructor(name: string, iconImage?: string) {
|
||||||
|
super(name, `Increase all party members' level by 1`, (_type, _args) => new Modifiers.PokemonLevelIncrementModifier(this, -1), iconImage);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function getBaseStatBoosterItemName(stat: Stat) {
|
function getBaseStatBoosterItemName(stat: Stat) {
|
||||||
switch (stat) {
|
switch (stat) {
|
||||||
case Stat.HP:
|
case Stat.HP:
|
||||||
|
@ -431,14 +437,15 @@ class HeldItemTransferModifierType extends PokemonHeldItemModifierType {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type ModifierTypeFunc = () => ModifierType;
|
||||||
type WeightedModifierTypeWeightFunc = (party: Pokemon[]) => integer;
|
type WeightedModifierTypeWeightFunc = (party: Pokemon[]) => integer;
|
||||||
|
|
||||||
class WeightedModifierType {
|
class WeightedModifierType {
|
||||||
public modifierType: ModifierType;
|
public modifierType: ModifierType;
|
||||||
public weight: integer | WeightedModifierTypeWeightFunc;
|
public weight: integer | WeightedModifierTypeWeightFunc;
|
||||||
|
|
||||||
constructor(modifierType: ModifierType, weight: integer | WeightedModifierTypeWeightFunc) {
|
constructor(modifierTypeFunc: ModifierTypeFunc, weight: integer | WeightedModifierTypeWeightFunc) {
|
||||||
this.modifierType = modifierType;
|
this.modifierType = modifierTypeFunc();
|
||||||
this.weight = weight;
|
this.weight = weight;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -448,46 +455,47 @@ class WeightedModifierType {
|
||||||
}
|
}
|
||||||
|
|
||||||
const modifierTypes = {
|
const modifierTypes = {
|
||||||
POKEBALL: new AddPokeballModifierType(PokeballType.POKEBALL, 5, 'pb'),
|
POKEBALL: () => new AddPokeballModifierType(PokeballType.POKEBALL, 5, 'pb'),
|
||||||
GREAT_BALL: new AddPokeballModifierType(PokeballType.GREAT_BALL, 5, 'gb'),
|
GREAT_BALL: () => new AddPokeballModifierType(PokeballType.GREAT_BALL, 5, 'gb'),
|
||||||
ULTRA_BALL: new AddPokeballModifierType(PokeballType.ULTRA_BALL, 5, 'ub'),
|
ULTRA_BALL: () => new AddPokeballModifierType(PokeballType.ULTRA_BALL, 5, 'ub'),
|
||||||
MASTER_BALL: new AddPokeballModifierType(PokeballType.MASTER_BALL, 1, 'mb'),
|
MASTER_BALL: () => new AddPokeballModifierType(PokeballType.MASTER_BALL, 1, 'mb'),
|
||||||
|
|
||||||
RARE_CANDY: new PokemonLevelIncrementModifierType('RARE CANDY'),
|
RARE_CANDY: () => new PokemonLevelIncrementModifierType('RARE CANDY'),
|
||||||
|
RARER_CANDY: () => new AllPokemonLevelIncrementModifierType('RARER CANDY'),
|
||||||
|
|
||||||
EVOLUTION_ITEM: new EvolutionItemModifierTypeGenerator(),
|
EVOLUTION_ITEM: () => new EvolutionItemModifierTypeGenerator(),
|
||||||
|
|
||||||
POTION: new PokemonHpRestoreModifierType('POTION', 20),
|
POTION: () => new PokemonHpRestoreModifierType('POTION', 20),
|
||||||
SUPER_POTION: new PokemonHpRestoreModifierType('SUPER POTION', 50),
|
SUPER_POTION: () => new PokemonHpRestoreModifierType('SUPER POTION', 50),
|
||||||
HYPER_POTION: new PokemonHpRestoreModifierType('HYPER POTION', 200),
|
HYPER_POTION: () => new PokemonHpRestoreModifierType('HYPER POTION', 200),
|
||||||
MAX_POTION: new PokemonHpRestoreModifierType('MAX POTION', 100, true),
|
MAX_POTION: () => new PokemonHpRestoreModifierType('MAX POTION', 100, true),
|
||||||
|
|
||||||
REVIVE: new PokemonReviveModifierType('REVIVE', 50),
|
REVIVE: () => new PokemonReviveModifierType('REVIVE', 50),
|
||||||
MAX_REVIVE: new PokemonReviveModifierType('MAX REVIVE', 100),
|
MAX_REVIVE: () => new PokemonReviveModifierType('MAX REVIVE', 100),
|
||||||
|
|
||||||
FULL_HEAL: new PokemonStatusHealModifierType('FULL HEAL'),
|
FULL_HEAL: () => new PokemonStatusHealModifierType('FULL HEAL'),
|
||||||
|
|
||||||
SACRED_ASH: new AllPokemonFullReviveModifierType('SACRED ASH'),
|
SACRED_ASH: () => new AllPokemonFullReviveModifierType('SACRED ASH'),
|
||||||
|
|
||||||
ETHER: new PokemonPpRestoreModifierType('ETHER', 10),
|
ETHER: () => new PokemonPpRestoreModifierType('ETHER', 10),
|
||||||
MAX_ETHER: new PokemonPpRestoreModifierType('MAX ETHER', -1),
|
MAX_ETHER: () => new PokemonPpRestoreModifierType('MAX ETHER', -1),
|
||||||
|
|
||||||
ELIXIR: new PokemonAllMovePpRestoreModifierType('ELIXIR', 10),
|
ELIXIR: () => new PokemonAllMovePpRestoreModifierType('ELIXIR', 10),
|
||||||
MAX_ELIXIR: new PokemonAllMovePpRestoreModifierType('MAX ELIXIR', -1),
|
MAX_ELIXIR: () => new PokemonAllMovePpRestoreModifierType('MAX ELIXIR', -1),
|
||||||
|
|
||||||
TEMP_STAT_BOOSTER: new ModifierTypeGenerator((party: Pokemon[]) => {
|
TEMP_STAT_BOOSTER: () => new ModifierTypeGenerator((party: Pokemon[]) => {
|
||||||
const randTempBattleStat = Utils.randInt(7) as TempBattleStat;
|
const randTempBattleStat = Utils.randInt(7) as TempBattleStat;
|
||||||
return new TempBattleStatBoosterModifierType(randTempBattleStat);
|
return new TempBattleStatBoosterModifierType(randTempBattleStat);
|
||||||
}),
|
}),
|
||||||
|
|
||||||
BASE_STAT_BOOSTER: new ModifierTypeGenerator((party: Pokemon[]) => {
|
BASE_STAT_BOOSTER: () => new ModifierTypeGenerator((party: Pokemon[]) => {
|
||||||
const randStat = Utils.randInt(6) as Stat;
|
const randStat = Utils.randInt(6) as Stat;
|
||||||
return new PokemonBaseStatBoosterModifierType(getBaseStatBoosterItemName(randStat), randStat);
|
return new PokemonBaseStatBoosterModifierType(getBaseStatBoosterItemName(randStat), randStat);
|
||||||
}),
|
}),
|
||||||
|
|
||||||
ATTACK_TYPE_BOOSTER: new AttackTypeBoosterModifierTypeGenerator(),
|
ATTACK_TYPE_BOOSTER: () => new AttackTypeBoosterModifierTypeGenerator(),
|
||||||
|
|
||||||
BERRY: new ModifierTypeGenerator((party: Pokemon[]) => {
|
BERRY: () => new ModifierTypeGenerator((party: Pokemon[]) => {
|
||||||
const berryTypes = Utils.getEnumValues(BerryType);
|
const berryTypes = Utils.getEnumValues(BerryType);
|
||||||
const randBerryType = berryTypes[Utils.randInt(berryTypes.length)];
|
const randBerryType = berryTypes[Utils.randInt(berryTypes.length)];
|
||||||
return new PokemonHeldItemModifierType(getBerryName(randBerryType), getBerryEffectDescription(randBerryType),
|
return new PokemonHeldItemModifierType(getBerryName(randBerryType), getBerryEffectDescription(randBerryType),
|
||||||
|
@ -495,7 +503,7 @@ const modifierTypes = {
|
||||||
null, 'berry');
|
null, 'berry');
|
||||||
}),
|
}),
|
||||||
|
|
||||||
TM: new ModifierTypeGenerator((party: Pokemon[]) => {
|
TM: () => new ModifierTypeGenerator((party: Pokemon[]) => {
|
||||||
const partyMemberCompatibleTms = party.map(p => (p as PlayerPokemon).compatibleTms);
|
const partyMemberCompatibleTms = party.map(p => (p as PlayerPokemon).compatibleTms);
|
||||||
const uniqueCompatibleTms = partyMemberCompatibleTms.flat().filter((tm, i, array) => array.indexOf(tm) === i);
|
const uniqueCompatibleTms = partyMemberCompatibleTms.flat().filter((tm, i, array) => array.indexOf(tm) === i);
|
||||||
if (!uniqueCompatibleTms.length)
|
if (!uniqueCompatibleTms.length)
|
||||||
|
@ -504,35 +512,37 @@ const modifierTypes = {
|
||||||
return new TmModifierType(uniqueCompatibleTms[randTmIndex]);
|
return new TmModifierType(uniqueCompatibleTms[randTmIndex]);
|
||||||
}),
|
}),
|
||||||
|
|
||||||
EXP_SHARE: new ModifierType('EXP. SHARE', 'All POKéMON in your party gain an additional 10% of a battle\'s EXP. Points',
|
EXP_SHARE: () => new ModifierType('EXP. SHARE', 'All POKéMON in your party gain an additional 10% of a battle\'s EXP. Points',
|
||||||
(type, _args) => new Modifiers.ExpShareModifier(type), 'exp_share'),
|
(type, _args) => new Modifiers.ExpShareModifier(type), 'exp_share'),
|
||||||
EXP_BALANCE: new ModifierType('EXP. BALANCE', 'All EXP. Points received from battles are split between the lower leveled party members',
|
EXP_BALANCE: () => new ModifierType('EXP. BALANCE', 'All EXP. Points received from battles are split between the lower leveled party members',
|
||||||
(type, _args) => new Modifiers.ExpBalanceModifier(type), 'exp_balance'),
|
(type, _args) => new Modifiers.ExpBalanceModifier(type), 'exp_balance'),
|
||||||
|
|
||||||
EXP_CHARM: new ExpBoosterModifierType('EXP CHARM', 25),
|
EXP_CHARM: () => new ExpBoosterModifierType('EXP CHARM', 25),
|
||||||
GOLDEN_EXP_CHARM: new ExpBoosterModifierType('GOLDEN EXP CHARM', 100),
|
GOLDEN_EXP_CHARM: () => new ExpBoosterModifierType('GOLDEN EXP CHARM', 100),
|
||||||
|
|
||||||
LUCKY_EGG: new PokemonExpBoosterModifierType('LUCKY EGG', 50),
|
LUCKY_EGG: () => new PokemonExpBoosterModifierType('LUCKY EGG', 50),
|
||||||
|
|
||||||
HEALING_CHARM: new ModifierType('HEALING CHARM', 'Doubles the effectiveness of HP restoring moves and items (excludes revives)',
|
HEALING_CHARM: () => new ModifierType('HEALING CHARM', 'Doubles the effectiveness of HP restoring moves and items (excludes revives)',
|
||||||
(type, _args) => new Modifiers.HealingBoosterModifier(type, 2), 'healing_charm'),
|
(type, _args) => new Modifiers.HealingBoosterModifier(type, 2), 'healing_charm'),
|
||||||
|
|
||||||
OVAL_CHARM: new ModifierType('OVAL CHARM', 'For every X (no. of party members) items in a POKéMON\'s held item stack, give one to each other party member',
|
OVAL_CHARM: () => new ModifierType('OVAL CHARM', 'For every X (no. of party members) items in a POKéMON\'s held item stack, give one to each other party member',
|
||||||
(type, _args) => new Modifiers.PartyShareModifier(type), 'oval_charm'),
|
(type, _args) => new Modifiers.PartyShareModifier(type), 'oval_charm'),
|
||||||
|
|
||||||
BERRY_POUCH: new ModifierType('BERRY POUCH', 'Adds a 25% chance that a used berry will not be consumed',
|
CANDY_JAR: () => new ModifierType('CANDY JAR', 'Increases the number of levels added by RARE CANDY items by 1', (type, _args) => new Modifiers.LevelIncrementBoosterModifier(type)),
|
||||||
|
|
||||||
|
BERRY_POUCH: () => new ModifierType('BERRY POUCH', 'Adds a 25% chance that a used berry will not be consumed',
|
||||||
(type, _args) => new Modifiers.PreserveBerryModifier(type)),
|
(type, _args) => new Modifiers.PreserveBerryModifier(type)),
|
||||||
|
|
||||||
LEFTOVERS: new PokemonHeldItemModifierType('LEFTOVERS', 'Heals 1/16 of a POKéMON\'s maximum HP every turn',
|
LEFTOVERS: () => new PokemonHeldItemModifierType('LEFTOVERS', 'Heals 1/16 of a POKéMON\'s maximum HP every turn',
|
||||||
(type, args) => new Modifiers.TurnHealModifier(type, (args[0] as Pokemon).id)),
|
(type, args) => new Modifiers.TurnHealModifier(type, (args[0] as Pokemon).id)),
|
||||||
SHELL_BELL: new PokemonHeldItemModifierType('SHELL BELL', 'Heals 1/8 of a POKéMON\'s dealt damage',
|
SHELL_BELL: () => new PokemonHeldItemModifierType('SHELL BELL', 'Heals 1/8 of a POKéMON\'s dealt damage',
|
||||||
(type, args) => new Modifiers.HitHealModifier(type, (args[0] as Pokemon).id)),
|
(type, args) => new Modifiers.HitHealModifier(type, (args[0] as Pokemon).id)),
|
||||||
|
|
||||||
SHINY_CHARM: new ModifierType('SHINY CHARM', 'Dramatically increases the chance of a wild POKéMON being shiny', (type, _args) => new Modifiers.ShinyRateBoosterModifier(type)),
|
SHINY_CHARM: () => new ModifierType('SHINY CHARM', 'Dramatically increases the chance of a wild POKéMON being shiny', (type, _args) => new Modifiers.ShinyRateBoosterModifier(type)),
|
||||||
|
|
||||||
MINI_BLACK_HOLE: new HeldItemTransferModifierType('MINI BLACK HOLE'),
|
MINI_BLACK_HOLE: () => new HeldItemTransferModifierType('MINI BLACK HOLE'),
|
||||||
|
|
||||||
GOLDEN_POKEBALL: new ModifierType(`GOLDEN ${getPokeballName(PokeballType.POKEBALL)}`, 'Adds 1 extra item option at the end of every battle',
|
GOLDEN_POKEBALL: () => new ModifierType(`GOLDEN ${getPokeballName(PokeballType.POKEBALL)}`, 'Adds 1 extra item option at the end of every battle',
|
||||||
(type, _args) => new Modifiers.ExtraModifierModifier(type), 'pb_gold', null, 'pb_bounce_1'),
|
(type, _args) => new Modifiers.ExtraModifierModifier(type), 'pb_gold', null, 'pb_bounce_1'),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -600,6 +610,7 @@ const modifierPool = {
|
||||||
new WeightedModifierType(modifierTypes.ULTRA_BALL, 8),
|
new WeightedModifierType(modifierTypes.ULTRA_BALL, 8),
|
||||||
new WeightedModifierType(modifierTypes.EVOLUTION_ITEM, 12),
|
new WeightedModifierType(modifierTypes.EVOLUTION_ITEM, 12),
|
||||||
new WeightedModifierType(modifierTypes.ATTACK_TYPE_BOOSTER, 5),
|
new WeightedModifierType(modifierTypes.ATTACK_TYPE_BOOSTER, 5),
|
||||||
|
new WeightedModifierType(modifierTypes.CANDY_JAR, 3),
|
||||||
//new WeightedModifierType(modifierTypes.OVAL_CHARM, 1),
|
//new WeightedModifierType(modifierTypes.OVAL_CHARM, 1),
|
||||||
new WeightedModifierType(modifierTypes.HEALING_CHARM, 1),
|
new WeightedModifierType(modifierTypes.HEALING_CHARM, 1),
|
||||||
new WeightedModifierType(modifierTypes.LEFTOVERS, 2),
|
new WeightedModifierType(modifierTypes.LEFTOVERS, 2),
|
||||||
|
@ -616,7 +627,8 @@ const modifierPool = {
|
||||||
].map(m => { m.setTier(ModifierTier.MASTER); return m; }),
|
].map(m => { m.setTier(ModifierTier.MASTER); return m; }),
|
||||||
[ModifierTier.LUXURY]: [
|
[ModifierTier.LUXURY]: [
|
||||||
new WeightedModifierType(modifierTypes.GOLDEN_EXP_CHARM, (party: Pokemon[]) => party.filter(p => p.level < 100).length ? 1 : 0),
|
new WeightedModifierType(modifierTypes.GOLDEN_EXP_CHARM, (party: Pokemon[]) => party.filter(p => p.level < 100).length ? 1 : 0),
|
||||||
new WeightedModifierType(modifierTypes.GOLDEN_POKEBALL, 1)
|
new WeightedModifierType(modifierTypes.GOLDEN_POKEBALL, 1),
|
||||||
|
new WeightedModifierType(modifierTypes.RARER_CANDY, 1)
|
||||||
].map(m => { m.setTier(ModifierTier.LUXURY); return m; }),
|
].map(m => { m.setTier(ModifierTier.LUXURY); return m; }),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -628,7 +640,7 @@ const enemyModifierPool = {
|
||||||
new WeightedModifierType(modifierTypes.BASE_STAT_BOOSTER, 1)
|
new WeightedModifierType(modifierTypes.BASE_STAT_BOOSTER, 1)
|
||||||
].map(m => { m.setTier(ModifierTier.GREAT); return m; }),
|
].map(m => { m.setTier(ModifierTier.GREAT); return m; }),
|
||||||
[ModifierTier.ULTRA]: [
|
[ModifierTier.ULTRA]: [
|
||||||
new WeightedModifierType(new AttackTypeBoosterModifierTypeGenerator(), 5),
|
new WeightedModifierType(modifierTypes.ATTACK_TYPE_BOOSTER, 5),
|
||||||
new WeightedModifierType(modifierTypes.LUCKY_EGG, 2),
|
new WeightedModifierType(modifierTypes.LUCKY_EGG, 2),
|
||||||
].map(m => { m.setTier(ModifierTier.ULTRA); return m; }),
|
].map(m => { m.setTier(ModifierTier.ULTRA); return m; }),
|
||||||
[ModifierTier.MASTER]: [
|
[ModifierTier.MASTER]: [
|
||||||
|
@ -741,7 +753,7 @@ function getNewModifierTypeOption(party: Pokemon[], player?: boolean, tier?: Mod
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getDefaultModifierTypeForTier(tier: ModifierTier): ModifierType {
|
export function getDefaultModifierTypeForTier(tier: ModifierTier): ModifierType {
|
||||||
let modifierType: ModifierType | WeightedModifierType = modifierPool[tier][tier !== ModifierTier.LUXURY ? 0 : 1];
|
let modifierType: ModifierType | WeightedModifierType = modifierPool[tier][tier !== ModifierTier.LUXURY ? 0 : 2];
|
||||||
if (modifierType instanceof WeightedModifierType)
|
if (modifierType instanceof WeightedModifierType)
|
||||||
modifierType = (modifierType as WeightedModifierType).modifierType;
|
modifierType = (modifierType as WeightedModifierType).modifierType;
|
||||||
return modifierType;
|
return modifierType;
|
||||||
|
|
|
@ -404,6 +404,30 @@ export class HitHealModifier extends PokemonHeldItemModifier {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export class LevelIncrementBoosterModifier extends PersistentModifier {
|
||||||
|
constructor(type: ModifierType, stackCount?: integer) {
|
||||||
|
super(type, stackCount);
|
||||||
|
}
|
||||||
|
|
||||||
|
match(modifier: Modifier) {
|
||||||
|
return modifier instanceof LevelIncrementBoosterModifier;
|
||||||
|
}
|
||||||
|
|
||||||
|
clone() {
|
||||||
|
return new LevelIncrementBoosterModifier(this.type, this.stackCount);
|
||||||
|
}
|
||||||
|
|
||||||
|
shouldApply(args: any[]): boolean {
|
||||||
|
return super.shouldApply(args) && args[0] instanceof Utils.IntegerHolder;
|
||||||
|
}
|
||||||
|
|
||||||
|
apply(args: any[]): boolean {
|
||||||
|
(args[0] as Utils.IntegerHolder).value += this.getStackCount();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
export class BerryModifier extends PokemonHeldItemModifier {
|
export class BerryModifier extends PokemonHeldItemModifier {
|
||||||
public berryType: BerryType;
|
public berryType: BerryType;
|
||||||
public consumed: boolean;
|
public consumed: boolean;
|
||||||
|
@ -587,7 +611,10 @@ export class PokemonLevelIncrementModifier extends ConsumablePokemonModifier {
|
||||||
|
|
||||||
apply(args: any[]): boolean {
|
apply(args: any[]): boolean {
|
||||||
const pokemon = args[0] as PlayerPokemon;
|
const pokemon = args[0] as PlayerPokemon;
|
||||||
pokemon.level++;
|
const levelCount = new Utils.IntegerHolder(1);
|
||||||
|
pokemon.scene.applyModifiers(LevelIncrementBoosterModifier, true, levelCount);
|
||||||
|
|
||||||
|
pokemon.level += levelCount.value;
|
||||||
if (pokemon.level <= 100) {
|
if (pokemon.level <= 100) {
|
||||||
pokemon.exp = getLevelTotalExp(pokemon.level, pokemon.species.growthRate);
|
pokemon.exp = getLevelTotalExp(pokemon.level, pokemon.species.growthRate);
|
||||||
pokemon.levelExp = 0;
|
pokemon.levelExp = 0;
|
||||||
|
|