Add Annihilape with Rage Fist move

This commit is contained in:
Flashfyre 2023-11-28 21:35:52 -05:00
parent 233e33bbed
commit ad9d8a8507
24 changed files with 13781 additions and 45 deletions

BIN
public/audio/cry/979.mp3 Normal file

Binary file not shown.

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

View File

@ -0,0 +1,41 @@
{
"textures": [
{
"image": "979.png",
"format": "RGBA8888",
"size": {
"w": 72,
"h": 75
},
"scale": 1,
"frames": [
{
"filename": "0001.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 74,
"h": 77
},
"spriteSourceSize": {
"x": 1,
"y": 1,
"w": 72,
"h": 75
},
"frame": {
"x": 0,
"y": 0,
"w": 72,
"h": 75
}
}
]
}
],
"meta": {
"app": "https://www.codeandweb.com/texturepacker",
"version": "3.0",
"smartupdate": "$TexturePacker:SmartUpdate:91e878fd2a0bca81b918e97740b65869:a640148a929eeb1aa680eed467e4eb62:351422d30d3be13e0d9d234ec7c8c043$"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@ -0,0 +1,41 @@
{
"textures": [
{
"image": "979.png",
"format": "RGBA8888",
"size": {
"w": 72,
"h": 75
},
"scale": 1,
"frames": [
{
"filename": "0001.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 74,
"h": 77
},
"spriteSourceSize": {
"x": 1,
"y": 1,
"w": 72,
"h": 75
},
"frame": {
"x": 0,
"y": 0,
"w": 72,
"h": 75
}
}
]
}
],
"meta": {
"app": "https://www.codeandweb.com/texturepacker",
"version": "3.0",
"smartupdate": "$TexturePacker:SmartUpdate:91e878fd2a0bca81b918e97740b65869:a640148a929eeb1aa680eed467e4eb62:351422d30d3be13e0d9d234ec7c8c043$"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

View File

@ -4,8 +4,8 @@
"image": "pokemon_icons_6.png",
"format": "RGBA8888",
"size": {
"w": 99,
"h": 98
"w": 192,
"h": 58
},
"scale": 1,
"frames": [
@ -44,32 +44,11 @@
"w": 55,
"h": 42
},
"frame": {
"x": 0,
"y": 56,
"w": 55,
"h": 42
}
},
{
"filename": "717",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 56,
"h": 42
},
"spriteSourceSize": {
"x": 13,
"y": 14,
"w": 32,
"h": 28
},
"frame": {
"x": 67,
"y": 0,
"w": 32,
"h": 28
"w": 55,
"h": 42
}
},
{
@ -87,8 +66,8 @@
"h": 31
},
"frame": {
"x": 67,
"y": 28,
"x": 122,
"y": 0,
"w": 31,
"h": 31
}
@ -108,11 +87,53 @@
"h": 27
},
"frame": {
"x": 55,
"y": 59,
"x": 122,
"y": 31,
"w": 38,
"h": 27
}
},
{
"filename": "979",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 40,
"h": 30
},
"spriteSourceSize": {
"x": 3,
"y": 0,
"w": 32,
"h": 30
},
"frame": {
"x": 160,
"y": 0,
"w": 32,
"h": 30
}
},
{
"filename": "717",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 56,
"h": 42
},
"spriteSourceSize": {
"x": 13,
"y": 14,
"w": 32,
"h": 28
},
"frame": {
"x": 160,
"y": 30,
"w": 32,
"h": 28
}
}
]
}
@ -120,6 +141,6 @@
"meta": {
"app": "https://www.codeandweb.com/texturepacker",
"version": "3.0",
"smartupdate": "$TexturePacker:SmartUpdate:da1c77f10b290cc824b731ed2920ec48:84485c60eaa201508ddb6ef0365267bf:96737d38f2029744a75c1ee001bc1929$"
"smartupdate": "$TexturePacker:SmartUpdate:56c494a24236874eac973adb00bb5fd9:06e134328126c54e98e3c55aa35c82b0:6a6cc46d6db7bee1b3e18054101832f5$"
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.4 KiB

After

Width:  |  Height:  |  Size: 9.6 KiB

View File

@ -34,6 +34,7 @@ import { Species } from "./data/species";
import { HealAchv, LevelAchv, MoneyAchv, achvs } from "./system/achv";
import { DexEntry } from "./system/game-data";
import { pokemonPrevolutions } from "./data/pokemon-evolutions";
import { getPokemonSpecies } from "./data/pokemon-species";
export class CheckLoadPhase extends BattlePhase {
private loaded: boolean;
@ -312,10 +313,15 @@ export class EncounterPhase extends BattlePhase {
doEncounter() {
this.scene.playBgm(undefined, true);
if (startingWave > 10) {
/*if (startingWave > 10) {
for (let m = 0; m < Math.min(Math.floor(startingWave / 10), 99); m++)
this.scene.addModifier(getPlayerModifierTypeOptionsForWave((m + 1) * 10, 1, this.scene.getParty())[0].type.newModifier(), true);
this.scene.updateModifiers(true);
}*/
for (let pokemon of this.scene.getParty()) {
if (pokemon)
pokemon.resetBattleData();
}
this.scene.arena.trySetWeather(getRandomWeatherType(this.scene.arena.biomeType), false);
@ -441,6 +447,11 @@ export class NewBiomeEncounterPhase extends NextEncounterPhase {
}
doEncounter(): void {
for (let pokemon of this.scene.getParty()) {
if (pokemon)
pokemon.resetBattleData();
}
this.scene.arena.trySetWeather(getRandomWeatherType(this.scene.arena.biomeType), false);
const enemyField = this.scene.getEnemyField();

View File

@ -682,6 +682,10 @@ export default class BattleScene extends Phaser.Scene {
if (showTrainer) {
playerField.forEach((_, p) => this.unshiftPhase(new ReturnPhase(this, p)));
this.unshiftPhase(new ShowTrainerPhase(this));
for (let pokemon of this.getParty()) {
if (pokemon)
pokemon.resetBattleData();
}
}
if (this.gameMode === GameMode.CLASSIC && !isNewBiome)
this.pushPhase(new NextEncounterPhase(this));

View File

@ -207,6 +207,7 @@ export class ConfusedTag extends BattlerTag {
pokemon.scene.queueMessage('It hurt itself in its\nconfusion!');
pokemon.scene.unshiftPhase(new DamagePhase(pokemon.scene, pokemon.getBattlerIndex()));
pokemon.damage(damage);
pokemon.battleData.hitCount++;
(pokemon.scene.getCurrentPhase() as MovePhase).cancel();
}
}

View File

@ -820,7 +820,8 @@ export enum Moves {
PHANTOM_FORCE,
GEOMANCY,
OBLIVION_WING,
DYNAMAX_CANNON
DYNAMAX_CANNON,
RAGE_FIST
}
export abstract class MoveAttr {
@ -1618,7 +1619,7 @@ export class SolarBeamPowerAttr extends VariablePowerAttr {
}
}
export class WinCountPowerMoveAttr extends VariablePowerAttr {
export class WinCountPowerAttr extends VariablePowerAttr {
private invert: boolean;
constructor(invert?: boolean) {
@ -1639,6 +1640,14 @@ export class WinCountPowerMoveAttr extends VariablePowerAttr {
}
}
export class HitCountPowerAttr extends VariablePowerAttr {
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
(args[0] as Utils.NumberHolder).value += Math.min(user.battleData.hitCount, 6) * 50;
return true;
}
}
export class VariableAccuracyAttr extends MoveAttr {
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
//const accuracy = args[0] as Utils.NumberHolder;
@ -2901,11 +2910,11 @@ export function initMoves() {
.target(MoveTarget.USER_AND_ALLIES)
.soundBased(),
new AttackMove(Moves.RETURN, "Return", Type.NORMAL, MoveCategory.PHYSICAL, -1, 100, 20, -1, "Power increases with higher Friendship.", -1, 0, 2)
.attr(WinCountPowerMoveAttr),
.attr(WinCountPowerAttr),
new AttackMove(Moves.PRESENT, "Present (N)", Type.NORMAL, MoveCategory.PHYSICAL, -1, 90, 15, -1, "Either deals damage or heals.", -1, 0, 2)
.makesContact(false),
new AttackMove(Moves.FRUSTRATION, "Frustration", Type.NORMAL, MoveCategory.PHYSICAL, -1, 100, 20, -1, "Power decreases with higher Friendship.", -1, 0, 2)
.attr(WinCountPowerMoveAttr, true),
.attr(WinCountPowerAttr, true),
new SelfStatusMove(Moves.SAFEGUARD, "Safeguard (N)", Type.NORMAL, -1, 25, -1, "The user's party is protected from status conditions.", -1, 0, 2)
.target(MoveTarget.USER_SIDE),
new StatusMove(Moves.PAIN_SPLIT, "Pain Split", Type.NORMAL, -1, 20, -1, "The user's and opponent's HP becomes the average of both.", -1, 0, 2)
@ -3634,6 +3643,8 @@ export function initMoves() {
.target(MoveTarget.OTHER),
new AttackMove(Moves.DYNAMAX_CANNON, "Dynamax Cannon", Type.DRAGON, MoveCategory.SPECIAL, 100, 100, 5, -1, "Power is doubled if the target is over level 200.", -1, 0, 8)
.attr(MovePowerMultiplierAttr, (user: Pokemon, target: Pokemon, move: Move) => target.level > 200 ? 2 : 1)
.ignoresVirtual()
.ignoresVirtual(),
new AttackMove(Moves.RAGE_FIST, "Rage Fist", Type.GHOST, MoveCategory.PHYSICAL, 50, 100, 10, -1, "The more times the user has been hit by attacks, the greater the move's power.", -1, 0, 9)
.attr(HitCountPowerAttr)
);
}

View File

@ -951,6 +951,9 @@ export const pokemonEvolutions: PokemonEvolutions = {
[Species.SHELMET]: [
new SpeciesEvolution(Species.ACCELGOR, 1, EvolutionItem.LINKING_CORD, new SpeciesEvolutionCondition((p: Pokemon) => !!p.scene.getParty().find(p => p.species.speciesId === Species.KARRABLAST)), SpeciesWildEvolutionDelay.LONG)
],
[Species.PRIMEAPE]: [
new SpeciesEvolution(Species.ANNIHILAPE, 1, null, new SpeciesEvolutionCondition((p: Pokemon) => p.moveset.filter(m => m.moveId === Moves.RAGE_FIST).length > 0), SpeciesWildEvolutionDelay.VERY_LONG)
],
[Species.PICHU]: [
new SpeciesEvolution(Species.PIKACHU, 1, null, new SpeciesEvolutionCondition((p: Pokemon) => p.winCount >= 10), SpeciesWildEvolutionDelay.SHORT)
],

View File

@ -886,10 +886,11 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = {
[ 9, Moves.FURY_SWIPES ],
[ 13, Moves.KARATE_CHOP ],
[ 17, Moves.SEISMIC_TOSS ],
[ 19, Moves.SWAGGER ],
[ 21, Moves.SCREECH ],
[ 25, Moves.ASSURANCE ],
[ 28, Moves.RAGE ],
[ 35, Moves.SWAGGER ],
[ 35, Moves.RAGE_FIST ],
[ 41, Moves.CROSS_CHOP ],
[ 47, Moves.THRASH ],
[ 53, Moves.PUNISHMENT ],
@ -10974,7 +10975,28 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = {
[ 72, Moves.RECOVER ],
[ 80, Moves.HYPER_BEAM ],
[ 88, Moves.OUTRAGE ]
]
],
[Species.ANNIHILAPE]: [
[ 1, Moves.LEER ],
[ 1, Moves.FOCUS_ENERGY ],
[ 1, Moves.LOW_KICK ],
[ 1, Moves.SCRATCH ],
[ 1, Moves.FLING ],
[ 9, Moves.FURY_SWIPES ],
[ 13, Moves.KARATE_CHOP ],
[ 17, Moves.SEISMIC_TOSS ],
[ 19, Moves.SWAGGER ],
[ 21, Moves.SCREECH ],
[ 25, Moves.ASSURANCE ],
[ 28, Moves.RAGE ],
[ 35, Moves.RAGE_FIST ],
[ 41, Moves.CROSS_CHOP ],
[ 47, Moves.THRASH ],
[ 53, Moves.PUNISHMENT ],
[ 59, Moves.CLOSE_COMBAT ],
[ 63, Moves.FINAL_GAMBIT ],
[ 68, Moves.OUTRAGE ]
],
};
export const pokemonFormLevelMoves: PokemonSpeciesFormLevelMoves = {

View File

@ -1,4 +1,4 @@
import { Abilities } from './ability';
import { Abilities, Ability } from './ability';
import BattleScene, { AnySound } from '../battle-scene';
import { GrowthRate } from './exp';
import { SpeciesWildEvolutionDelay, pokemonEvolutions, pokemonPrevolutions } from './pokemon-evolutions';
@ -82,7 +82,7 @@ export abstract class PokemonSpeciesForm {
}
isObtainable() {
return this.generation <= 5 && this.getFormSpriteKey(this.formIndex) !== 'mega';
return (this.generation <= 5 || pokemonPrevolutions.hasOwnProperty(this.speciesId)) && this.getFormSpriteKey(this.formIndex) !== 'mega';
}
getSpriteAtlasPath(female: boolean, formIndex?: integer, shiny?: boolean): string {
@ -1186,9 +1186,10 @@ export function initSpecies() {
),
new PokemonSpecies(Species.XERNEAS, "Xerneas", 6, false, true, false, "Life Pokémon", Type.FAIRY, null, 3, 215, Abilities.FAIRY_AURA, Abilities.NONE, Abilities.NONE, 680, 126, 131, 95, 131, 98, 99, 45, 0, 306, GrowthRate.SLOW, "Undiscovered", null, null, 120, false),
new PokemonSpecies(Species.YVELTAL, "Yveltal", 6, false, true, false, "Destruction Pokémon", Type.DARK, Type.FLYING, 5.8, 203, Abilities.DARK_AURA, Abilities.NONE, Abilities.NONE, 680, 126, 131, 95, 131, 98, 99, 45, 0, 306, GrowthRate.SLOW, "Undiscovered", null, null, 120, false),
new PokemonSpecies(Species.ETERNATUS, "Eternatus", 8, false, true, false, "Gigantic Pokemon", Type.POISON, Type.DRAGON, 20, 950, Abilities.PRESSURE, Abilities.NONE, Abilities.NONE, 690, 140, 85, 95, 145, 95, 130, 255, 0, 345, GrowthRate.SLOW, "Undiscovered", null, null, 120, false, false,
new PokemonSpecies(Species.ETERNATUS, "Eternatus", 8, false, true, false, "Gigantic Pokémon", Type.POISON, Type.DRAGON, 20, 950, Abilities.PRESSURE, Abilities.NONE, Abilities.NONE, 690, 140, 85, 95, 145, 95, 130, 255, 0, 345, GrowthRate.SLOW, "Undiscovered", null, null, 120, false, false,
new PokemonForm("Normal", "", Type.POISON, Type.DRAGON, 20, 950, Abilities.PRESSURE, Abilities.NONE, Abilities.NONE, 690, 140, 85, 95, 145, 95, 130, 255, 0, 345, GrowthRate.SLOW, "Undiscovered", null, null, 120, false),
new PokemonForm("Eternamax", "eternamax", Type.POISON, Type.DRAGON, 100, 950, Abilities.PRESSURE, Abilities.NONE, Abilities.NONE, 1125, 255, 115, 250, 125, 250, 130, 255, 0, 345, GrowthRate.SLOW, "Undiscovered", null, null, 120, false))
new PokemonForm("Eternamax", "eternamax", Type.POISON, Type.DRAGON, 100, 950, Abilities.PRESSURE, Abilities.NONE, Abilities.NONE, 1125, 255, 115, 250, 125, 250, 130, 255, 0, 345, GrowthRate.SLOW, "Undiscovered", null, null, 120, false)),
new PokemonSpecies(Species.ANNIHILAPE, "Annihilape", 9, false, false, false, "Rage Monkey Pokémon", Type.FIGHTING, Type.GHOST, 1.2, 56, Abilities.VITAL_SPIRIT, Abilities.INNER_FOCUS, Abilities.DEFIANT, 535, 110, 115, 80, 50, 90, 90, 45, 50, 268, GrowthRate.MEDIUM_FAST, "Field", null, 50, 20, false)
);
}

View File

@ -650,5 +650,6 @@ export enum Species {
GENESECT,
XERNEAS = 716,
YVELTAL,
ETERNATUS = 890
ETERNATUS = 890,
ANNIHILAPE = 979
};

View File

@ -381,7 +381,7 @@ export abstract class PokemonHeldItemModifier extends PersistentModifier {
const isIconShown = pokemon instanceof PlayerPokemon || scene.currentBattle.seenEnemyPartyMemberIds.has(pokemon.id);
const iconAtlasKey = isIconShown ? pokemon.getIconAtlasKey() : 'pokemon_icons_0';
const pokemonIcon = scene.add.sprite(0, 8, iconAtlasKey);
if (pokemon.getSpeciesForm().isObtainable()) {
if (pokemon.getSpeciesForm().generation <= 5) {
const iconKey = isIconShown ? pokemon.getIconKey() : 'pkmn_icon__000';
pokemonIcon.play(iconKey).stop();
} else {

View File

@ -74,6 +74,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
public fusionGender: Gender;
public summonData: PokemonSummonData;
public battleData: PokemonBattleData;
public battleSummonData: PokemonBattleSummonData;
public turnData: PokemonTurnData;
@ -921,6 +922,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
if (source.isPlayer())
this.scene.validateAchvs(DamageAchv, damage);
source.turnData.damageDealt += damage.value;
this.battleData.hitCount++;
this.turnData.attacksReceived.unshift({ move: move.id, result: result as DamageResult, damage: damage.value, critical: isCritical, sourceId: source.id });
if (source.isPlayer() && !this.isPlayer())
this.scene.applyModifiers(DamageMoneyRewardModifier, true, source, damage)
@ -1302,9 +1304,15 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
this.updateFusionPalette();
}
this.summonData = new PokemonSummonData();
if (!this.battleData)
this.resetBattleData();
this.resetBattleSummonData();
}
resetBattleData(): void {
this.battleData = new PokemonBattleData();
}
resetBattleSummonData(): void {
this.battleSummonData = new PokemonBattleSummonData();
if (this.getTag(BattlerTagType.SEEDED))
@ -1983,6 +1991,10 @@ export class PokemonSummonData {
public types: Type[];
}
export class PokemonBattleData {
public hitCount: integer = 0;
}
export class PokemonBattleSummonData {
public turnCount: integer = 1;
public moveHistory: TurnMove[] = [];

View File

@ -740,7 +740,12 @@ class PartySlot extends Phaser.GameObjects.Container {
this.add(slotPb);
const pokemonIcon = this.scene.add.sprite(slotPb.x, slotPb.y, this.pokemon.getIconAtlasKey(true));
pokemonIcon.play(this.pokemon.getIconKey(true));
if (this.pokemon.getSpeciesForm().generation <= 5)
pokemonIcon.play(this.pokemon.getIconKey(true));
else {
pokemonIcon.setFrame(this.pokemon.getIconId());
pokemonIcon.setScale(0.75);
}
this.add(pokemonIcon);