mirror of
https://github.com/pret/pmd-red.git
synced 2026-08-03 01:00:09 -05:00
492 lines
14 KiB
C
492 lines
14 KiB
C
#include "global.h"
|
|
#include "constants/status.h"
|
|
#include "constants/weather.h"
|
|
#include "charge_move.h"
|
|
#include "dungeon_global_data.h"
|
|
#include "dungeon_entity.h"
|
|
#include "dungeon_util.h"
|
|
#include "code_8077274_1.h"
|
|
#include "code_808417C.h"
|
|
#include "map.h"
|
|
#include "moves.h"
|
|
#include "status_checks_1.h"
|
|
#include "tile_types.h"
|
|
#include "weather.h"
|
|
|
|
extern u8 gUnknown_202DE58[];
|
|
extern u8 gAvailablePokemonNames[];
|
|
|
|
extern s16 gUnknown_80F4DB6;
|
|
extern u16 gUnknown_80F4F42;
|
|
extern u8 *gUnknown_80FAC88;
|
|
extern u8 *gUnknown_80FD018[];
|
|
extern u8 *gUnknown_80FCFBC[];
|
|
extern u8 *gUnknown_80FCFE4[];
|
|
extern u32 gUnknown_8106A4C;
|
|
extern s16 gUnknown_80F4DF6;
|
|
extern s16 gUnknown_80F4E0A;
|
|
extern u8 gUnknown_80F51E4[];
|
|
extern u32 gUnknown_80F51EC[];
|
|
extern u8 *gUnknown_80FC734[];
|
|
extern u8 *gUnknown_80FC7EC[];
|
|
extern u8 *gUnknown_80FCF74[];
|
|
extern u8 *gUnknown_80FCF80[];
|
|
extern u32 gUnknown_8106A50;
|
|
extern s16 gUnknown_80F4E08;
|
|
extern u8 *gUnknown_80FD14C[];
|
|
extern u8 *gUnknown_80FAD4C[];
|
|
extern u32 gUnknown_80F4F68;
|
|
extern s16 gUnknown_80F502A[];
|
|
extern s16 gUnknown_80F4E74[];
|
|
extern s16 gUnknown_80F4E78[];
|
|
extern s16 gUnknown_80F4F28[];
|
|
extern u32 gUnknown_202F21C;
|
|
extern bool8 gUnknown_202F220;
|
|
extern u32 gUnknown_8106A54[];
|
|
|
|
struct unkStruct_80928C0
|
|
{
|
|
u32 unk0;
|
|
s32 unk4;
|
|
u8 unk8;
|
|
u8 unk9;
|
|
};
|
|
|
|
void sub_80928C0(u8 *buffer, struct PokemonMove *move, struct unkStruct_80928C0 *param_3);
|
|
|
|
extern void sub_80775DC(struct DungeonEntity *r0, struct DungeonEntity *r1, u32, u32);
|
|
extern void sub_80768DC(struct DungeonEntity *, struct DungeonEntity *, u32, u32);
|
|
extern void sub_80772C0(struct DungeonEntity *r0, struct DungeonEntity *r1, u32, u32, u32);
|
|
extern u8 sub_807EAA0(u32, u32);
|
|
extern void sub_80522F4(struct DungeonEntity *r1, struct DungeonEntity *r2, const char[]);
|
|
extern void sub_8077434(struct DungeonEntity *r0, struct DungeonEntity *r1, u32 , u32, u32);
|
|
extern s32 sub_80556BC(struct DungeonEntity *, struct DungeonEntity *, u8, struct PokemonMove *, u32, u32);
|
|
extern u8 sub_805727C(struct DungeonEntity *, struct DungeonEntity *, s16);
|
|
extern void sub_80779F0(struct DungeonEntity *, struct DungeonEntity *, u32, u32);
|
|
extern void sub_8078968(struct DungeonEntity *r0, struct DungeonEntity *r1);
|
|
extern void sub_8077AE4(struct DungeonEntity *pokemon, struct DungeonEntity *target, u32);
|
|
extern void sub_8077084(struct DungeonEntity *pokemon, struct DungeonEntity *target, u32, u32);
|
|
extern u8 sub_80776C0(struct DungeonEntity *, struct DungeonEntity *, u8);
|
|
extern void sub_8076F80(struct DungeonEntity *, struct DungeonEntity *, u32, u32, u32, u32);
|
|
extern void sub_806F370(struct DungeonEntity *r0, struct DungeonEntity *r1, u32, u32, u8 *, u8, s32, u32, u32, u32);
|
|
extern void SetMessageArgument(char[], struct DungeonEntity*, u32);
|
|
extern u32 sub_8055640(struct DungeonEntity *, struct DungeonEntity *, struct PokemonMove *, u32, u32);
|
|
extern void HealTargetHP(struct DungeonEntity *pokemon, struct DungeonEntity *r1, s16, s16, u32);
|
|
extern void sub_8075DBC(struct DungeonEntity *, struct DungeonEntity *, s32);
|
|
extern void sub_8075F34(struct DungeonEntity *, struct DungeonEntity *, s32);
|
|
extern void sub_8075C58(struct DungeonEntity *, struct DungeonEntity *, s32, s32);
|
|
u8 sub_8057620(u32 param_1);
|
|
extern s16 sub_8094828(u16, u8);
|
|
|
|
extern s16 gUnknown_80F4DB4;
|
|
extern u32 gUnknown_8106A4C;
|
|
|
|
bool8 sub_805755C(struct DungeonEntity* pokemon, u16 moveID)
|
|
{
|
|
if ((moveID == MOVE_SOLARBEAM) && (GetWeather(pokemon) == WEATHER_SUNNY)) {
|
|
return FALSE;
|
|
}
|
|
else {
|
|
return DoesMoveCharge(moveID);
|
|
}
|
|
}
|
|
|
|
void sub_8057588(struct DungeonEntity * pokemon, u8 param_2)
|
|
{
|
|
struct PokemonMove *move;
|
|
s32 index;
|
|
s32 PPtoRemove;
|
|
s32 PPCounter;
|
|
struct DungeonEntityData *entityData;
|
|
|
|
if (EntityExists(pokemon)) {
|
|
entityData = pokemon->entityData;
|
|
for(index = 0; index < MAX_MON_MOVES; index++)
|
|
{
|
|
move = &entityData->moves[index];
|
|
if ((move->moveFlags & MOVE_FLAG_EXISTS)) {
|
|
PPtoRemove = 1;
|
|
if ((move->moveFlags2 & MOVE_FLAG_LAST_USED)) {
|
|
move->moveFlags2 &= ~(MOVE_FLAG_LAST_USED);
|
|
PPtoRemove = 2;
|
|
}
|
|
if (((move->moveFlags2 & MOVE_FLAG_SET)) && (move->moveFlags2 &= ~(MOVE_FLAG_SET), param_2 != 0))
|
|
{
|
|
if(PPtoRemove != 0)
|
|
{
|
|
PPCounter = PPtoRemove;
|
|
for (; PPCounter != 0; PPCounter--) {
|
|
if (move->PP != 0) {
|
|
move->PP--;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
s16 sub_8057600(struct PokemonMove *param_1, s32 param_2)
|
|
{
|
|
return sub_8094828(param_1->moveID, sub_8057620(param_2));
|
|
}
|
|
|
|
u8 sub_8057620(u32 param_1)
|
|
{
|
|
if(param_1 == 0)
|
|
return 0;
|
|
else
|
|
return param_1;
|
|
}
|
|
|
|
bool8 sub_8057634(struct DungeonEntity *pokemon, struct DungeonEntity *target, struct PokemonMove *move, s32 param_4)
|
|
{
|
|
bool8 uVar3;
|
|
|
|
uVar3 = FALSE;
|
|
if (sub_8055640(pokemon, target, move, 0x100, param_4) != 0) {
|
|
uVar3 = TRUE;
|
|
if (sub_805727C(pokemon, target, gUnknown_80F4DB4) != 0) {
|
|
sub_8076F80(pokemon, target, gUnknown_8106A4C, 1, 1, 0);
|
|
}
|
|
}
|
|
return uVar3;
|
|
}
|
|
|
|
bool8 sub_805768C(struct DungeonEntity *pokemon, struct DungeonEntity *target, struct PokemonMove *move, s32 param_4)
|
|
{
|
|
bool8 iVar1;
|
|
|
|
iVar1 = FALSE;
|
|
gUnknown_202F21C++;
|
|
|
|
if (sub_8055640(pokemon, target, move, gUnknown_8106A54[gUnknown_202F21C], param_4) == 0)
|
|
gUnknown_202F220 = 1;
|
|
else
|
|
iVar1 = TRUE;
|
|
return iVar1;
|
|
}
|
|
|
|
bool8 sub_80576D0(struct DungeonEntity * pokemon, struct DungeonEntity *target)
|
|
{
|
|
sub_8075F34(pokemon, target, CalculateStatusTurns(target,gUnknown_80F4F28,TRUE) + 1);
|
|
return TRUE;
|
|
}
|
|
|
|
bool8 sub_80576F8(struct DungeonEntity * pokemon, struct DungeonEntity *target)
|
|
{
|
|
sub_8075C58(pokemon, target, CalculateStatusTurns(target, gUnknown_80F4E74, TRUE), 1);
|
|
return TRUE;
|
|
}
|
|
|
|
bool8 sub_8057720(struct DungeonEntity * pokemon, struct DungeonEntity *target)
|
|
{
|
|
sub_8075DBC(pokemon, target, CalculateStatusTurns(target,gUnknown_80F4E78,TRUE));
|
|
return TRUE;
|
|
}
|
|
|
|
bool8 sub_8057748(struct DungeonEntity * pokemon,struct DungeonEntity * target)
|
|
{
|
|
HealTargetHP(pokemon, target, gUnknown_80F502A[GetWeather(pokemon)], 0, 1);
|
|
return TRUE;
|
|
}
|
|
|
|
bool8 sub_805777C(struct DungeonEntity * pokemon, struct DungeonEntity * target)
|
|
{
|
|
VitalThrowStatusTarget(pokemon, target);
|
|
return TRUE;
|
|
}
|
|
|
|
bool8 sub_8057788(struct DungeonEntity * pokemon, struct DungeonEntity * target, struct PokemonMove *move, s32 param_4)
|
|
{
|
|
struct MapTile *tile;
|
|
bool8 uVar3;
|
|
|
|
uVar3 = FALSE;
|
|
tile = GetMapTileForDungeonEntity_2(pokemon);
|
|
if ((!IsTileGround(tile)) || ((tile->tileType & (TILE_TYPE_FLOOR | TILE_TYPE_LIQUID)) != 1)) {
|
|
sub_80522F4(pokemon,target,*gUnknown_80FD14C); // It can only be used on land!
|
|
}
|
|
else {
|
|
if (MoveMatchesChargingStatus(pokemon,move)) {
|
|
sub_8055640(pokemon,target,move,gUnknown_80F4F68,param_4);
|
|
sub_8079764(pokemon);
|
|
}
|
|
else {
|
|
sub_8079618(pokemon,pokemon,10,move,*gUnknown_80FAD4C); // $m0 burrowed underground!
|
|
}
|
|
uVar3 = TRUE;
|
|
}
|
|
return uVar3;
|
|
}
|
|
|
|
bool32 sub_8057824(struct DungeonEntity *pokemon, struct DungeonEntity *target)
|
|
{
|
|
// Lower evasion?
|
|
sub_80775DC(pokemon,target,gUnknown_8106A50,1);
|
|
return TRUE;
|
|
}
|
|
|
|
bool32 sub_805783C(struct DungeonEntity *pokemon, struct DungeonEntity *target)
|
|
{
|
|
// Lower attack?
|
|
sub_80772C0(pokemon,target,gUnknown_8106A4C,0x80,1);
|
|
return TRUE;
|
|
}
|
|
|
|
bool32 sub_805785C(struct DungeonEntity *pokemon, struct DungeonEntity *target)
|
|
{
|
|
gDungeonGlobalData->unkE26B = gUnknown_80F4F42;
|
|
if (sub_807EAA0(1,0) == 0) {
|
|
// The weather remains unchanged
|
|
sub_80522F4(pokemon,target,*gUnknown_80FCF74);
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
bool32 sub_80578A4(struct DungeonEntity *pokemon, struct DungeonEntity *target)
|
|
{
|
|
gDungeonGlobalData->weatherTurnsLeft = gUnknown_80F4F42;
|
|
if (sub_807EAA0(1,0) == 0) {
|
|
// The weather remains unchanged
|
|
sub_80522F4(pokemon,target,*gUnknown_80FCF80);
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
bool32 sub_80578EC(struct DungeonEntity *r0, struct DungeonEntity *r1)
|
|
{
|
|
sub_8079F20(r0, r1, 1, 0);
|
|
return TRUE;
|
|
}
|
|
|
|
bool32 sub_80578FC(struct DungeonEntity *pokemon, struct DungeonEntity *target, struct PokemonMove * move, u32 param_4)
|
|
{
|
|
bool32 uVar3;
|
|
|
|
uVar3 = FALSE;
|
|
if (sub_8055640(pokemon, target, move, 0x100, param_4) != 0) {
|
|
uVar3 = TRUE;
|
|
if (sub_805727C(pokemon,target, gUnknown_80F4DB6) != 0) {
|
|
sub_80779F0(pokemon, target, 1, 0);
|
|
}
|
|
}
|
|
return uVar3;
|
|
}
|
|
|
|
bool32 sub_8057948(struct DungeonEntity *pokemon, struct DungeonEntity *target)
|
|
{
|
|
sub_8078968(pokemon, target);
|
|
return TRUE;
|
|
}
|
|
|
|
bool32 sub_8057954(struct DungeonEntity *pokemon, struct DungeonEntity *target, struct PokemonMove *move)
|
|
{
|
|
// {ARG_POKEMON_0} is enraged
|
|
sub_8079618(pokemon,target,0xc,move,gUnknown_80FAC88);
|
|
return TRUE;
|
|
}
|
|
|
|
bool32 sub_8057974(struct DungeonEntity *pokemon, struct DungeonEntity *target, struct PokemonMove *move, u32 param_4)
|
|
{
|
|
s32 newHP;
|
|
bool8 local_24;
|
|
|
|
newHP = target->entityData->HP / 2;
|
|
local_24 = FALSE;
|
|
if (newHP != 0) {
|
|
sub_806F370(pokemon,target,newHP,1,&local_24,GetMoveType(move),sub_8057600(move,param_4),0,1,0);
|
|
local_24 = local_24 == 0;
|
|
}
|
|
else
|
|
{
|
|
// The target's HP can't be halved anymore
|
|
sub_80522F4(pokemon,target,*gUnknown_80FD018);
|
|
}
|
|
return local_24;
|
|
}
|
|
|
|
bool8 PainSplitMoveAction(struct DungeonEntity *pokemon, struct DungeonEntity *target)
|
|
{
|
|
s32 newHP;
|
|
struct DungeonEntityData *iVar2;
|
|
struct DungeonEntityData *iVar3;
|
|
struct DungeonEntityData *iVar4;
|
|
struct DungeonEntityData *iVar5;
|
|
|
|
// Need copies for some reason to match..
|
|
iVar3 = (pokemon->entityData);
|
|
iVar4 = iVar3;
|
|
iVar2 = (target->entityData);
|
|
iVar5 = iVar2;
|
|
|
|
newHP = ((iVar3->HP + iVar2->HP) / 2);
|
|
iVar3->HP = newHP;
|
|
iVar5->HP = newHP;
|
|
if (iVar3->HP > iVar3->maxHP) {
|
|
iVar3->HP = iVar3->maxHP;
|
|
}
|
|
if (iVar5->HP > iVar5->maxHP) {
|
|
iVar5->HP = iVar5->maxHP;
|
|
}
|
|
SetMessageArgument(gAvailablePokemonNames,pokemon,0);
|
|
SetMessageArgument(gAvailablePokemonNames + 0x50,target,0);
|
|
if (iVar4->unkFB == 0) {
|
|
iVar4->unkFB = 1;
|
|
}
|
|
// $m0 and $m1 shared their HP
|
|
sub_80522F4(pokemon,target,*gUnknown_80FC7EC);
|
|
return TRUE;
|
|
}
|
|
|
|
bool8 TormentMoveAction(struct DungeonEntity *pokemon, struct DungeonEntity *target)
|
|
{
|
|
struct PokemonMove *movePtr;
|
|
s32 iVar4;
|
|
struct PokemonMove struggleMove;
|
|
struct DungeonEntityData *entityData;
|
|
bool8 isTormented;
|
|
|
|
entityData = target->entityData;
|
|
isTormented = FALSE;
|
|
|
|
for(iVar4 = 0; iVar4 < MAX_MON_MOVES; iVar4++)
|
|
{
|
|
movePtr = &entityData->moves[iVar4];
|
|
if ((movePtr->moveFlags & MOVE_FLAG_EXISTS) != 0) {
|
|
if ((movePtr->moveFlags & MOVE_FLAG_DISABLED) == 0) {
|
|
if ((movePtr->moveFlags & MOVE_FLAG_LAST_USED) != 0) {
|
|
sub_80928C0(gUnknown_202DE58,movePtr,0);
|
|
// $i0 was tormented
|
|
sub_80522F4(pokemon,target,*gUnknown_80FCFBC);
|
|
movePtr->moveFlags |= MOVE_FLAG_DISABLED;
|
|
isTormented = TRUE;
|
|
}
|
|
}
|
|
else if ((movePtr->moveFlags & MOVE_FLAG_LAST_USED) == 0) {
|
|
movePtr->moveFlags &= ~(MOVE_FLAG_DISABLED);
|
|
}
|
|
}
|
|
};
|
|
|
|
if ((entityData->struggleMoveFlags & MOVE_FLAG_DISABLED) == 0) {
|
|
if ((entityData->struggleMoveFlags & MOVE_FLAG_LAST_USED) != 0) {
|
|
InitPokemonMove(&struggleMove, MOVE_STRUGGLE);
|
|
entityData->struggleMoveFlags |= MOVE_FLAG_DISABLED;
|
|
isTormented = TRUE;
|
|
sub_80928C0(gUnknown_202DE58,&struggleMove,0);
|
|
// $i0 was tormented
|
|
sub_80522F4(pokemon,target,*gUnknown_80FCFBC);
|
|
}
|
|
}
|
|
else if ((entityData->struggleMoveFlags & MOVE_FLAG_LAST_USED) == 0) {
|
|
entityData->struggleMoveFlags &= ~(MOVE_FLAG_DISABLED);
|
|
}
|
|
if (isTormented)
|
|
{
|
|
if(entityData->chargingStatus == CHARGING_STATUS_BIDE) {
|
|
entityData->chargingStatus = CHARGING_STATUS_NONE;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// The target couldn't be tormented
|
|
sub_80522F4(pokemon,target,*gUnknown_80FCFE4);
|
|
}
|
|
return isTormented;
|
|
}
|
|
|
|
bool8 sub_8057BB4(struct DungeonEntity *pokemon, struct DungeonEntity *target)
|
|
{
|
|
sub_80779F0(pokemon, target, 1, 1);
|
|
return TRUE;
|
|
}
|
|
|
|
bool8 sub_8057BC4(struct DungeonEntity *pokemon, struct DungeonEntity *target)
|
|
{
|
|
sub_8077AE4(pokemon, target, 1);
|
|
sub_8077084(pokemon, target, gUnknown_8106A4C, 2);
|
|
return TRUE;
|
|
}
|
|
|
|
bool8 sub_8057BEC(struct DungeonEntity *pokemon, struct DungeonEntity *target, struct PokemonMove * move, u32 param_4)
|
|
{
|
|
bool8 uVar3;
|
|
|
|
uVar3 = FALSE;
|
|
if (IsSleeping(pokemon)) {
|
|
if (sub_8055640(pokemon,target,move,0x100,param_4) != 0) {
|
|
uVar3 = TRUE;
|
|
if (sub_805727C(pokemon,target,gUnknown_80F4E0A) != 0) {
|
|
sub_80776C0(pokemon,target,0);
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
sub_80522F4(pokemon,target,*gUnknown_80FC734);
|
|
}
|
|
return uVar3;
|
|
}
|
|
|
|
bool8 sub_8057C68(struct DungeonEntity *pokemon, struct DungeonEntity *target)
|
|
{
|
|
sub_8077434(pokemon, target, gUnknown_8106A4C, 0x40, 1);
|
|
return TRUE;
|
|
}
|
|
|
|
bool8 sub_8057C88(struct DungeonEntity *pokemon, struct DungeonEntity *target, struct PokemonMove * move, u32 param_4)
|
|
{
|
|
u8 uVar3;
|
|
|
|
uVar3 = FALSE;
|
|
if (sub_8055640(pokemon, target, move, 0x100, param_4) != 0) {
|
|
uVar3 = TRUE;
|
|
if (sub_805727C(pokemon,target,gUnknown_80F4DF6) != 0) {
|
|
sub_80776C0(pokemon,target,0);
|
|
}
|
|
}
|
|
return uVar3;
|
|
}
|
|
|
|
s32 sub_8057CD0(struct DungeonEntity * pokemon, struct DungeonEntity * target, struct PokemonMove * move, u32 param_4)
|
|
{
|
|
u32 uVar1;
|
|
s32 iVar2;
|
|
|
|
uVar1 = GetWeather(pokemon);
|
|
iVar2 = sub_80556BC(pokemon,target,gUnknown_80F51E4[uVar1],move,
|
|
gUnknown_80F51EC[uVar1],param_4);
|
|
if (iVar2 != 0) {
|
|
iVar2 = 1;
|
|
}
|
|
return iVar2;
|
|
}
|
|
|
|
bool8 sub_8057D20(struct DungeonEntity * pokemon, struct DungeonEntity * target, struct PokemonMove * move, u32 param_4)
|
|
{
|
|
u32 uVar3;
|
|
bool8 uVar4;
|
|
u8 chargeStatus;
|
|
|
|
uVar4 = FALSE;
|
|
chargeStatus = target->entityData->chargingStatus;
|
|
uVar3 = 0x100;
|
|
if (chargeStatus == CHARGING_STATUS_DIVE) {
|
|
uVar3 = 0x200;
|
|
}
|
|
if (sub_8055640(pokemon,target,move,uVar3,param_4) != 0) {
|
|
uVar4 = TRUE;
|
|
if (sub_805727C(pokemon,target,gUnknown_80F4E08) != 0) {
|
|
sub_80768DC(pokemon,target,0x3b,0);
|
|
}
|
|
}
|
|
return uVar4;
|
|
}
|
|
|
|
bool8 sub_8057D7C(struct DungeonEntity * param_1, struct DungeonEntity * param_2)
|
|
{
|
|
sub_8076F80(param_1, param_2, gUnknown_8106A50, 2, 1, 1);
|
|
return TRUE;
|
|
}
|