Files
pmd-red/src/code_8048480.c
T
2022-08-22 11:54:53 -07:00

299 lines
9.3 KiB
C

#include "global.h"
#include "constants/iq_skill.h"
#include "constants/status.h"
#include "dungeon_entity.h"
#include "dungeon_global_data.h"
#include "dungeon_pokemon_attributes.h"
#include "dungeon_random.h"
#include "number_util.h"
#include "moves.h"
#include "code_8077274_1.h"
extern u8 *gUnknown_80F89F4[];
extern u8 gAvailablePokemonNames[0x58];
extern u8 *gUnknown_80FB580[];
extern s16 gUnknown_80F4FB6;
extern s16 gUnknown_80F4FB8;
extern s16 gUnknown_80F4FBA;
extern s16 gUnknown_80F4FBC;
extern s16 gUnknown_80F4FBE;
extern s16 gUnknown_80F4F46; // 0xC
extern s16 gUnknown_80F4FAA; // 0x1E
extern s16 gUnknown_80F4FA8; // 0xF
extern s16 gUnknown_80F4FA4; // 0x14
extern s16 gUnknown_80F4FA6; // 0x2D
extern u8 *gUnknown_80FEAE8[];
extern u8 *gUnknown_80FDBA0[];
extern u8 *gUnknown_80FE434[];
extern u8 *gUnknown_80FE40C[];
extern u8 *gUnknown_80FE454[];
extern u8 *gPtrSelfHealPreventedHungerMessage[];
extern u8 *gUnknown_80F9740[];
extern u8 *gUnknown_80F9760[];
extern void sub_807D148(struct DungeonEntity *pokemon, struct DungeonEntity *r1, u32 r2, u32 r3);
extern void sub_8075FCC(struct DungeonEntity *pokemon, struct DungeonEntity *r1);
extern void sub_8077AE4(struct DungeonEntity *pokemon, struct DungeonEntity *r1, u32 r2);
extern void sub_8072008(struct DungeonEntity *pokemon, struct DungeonEntity *r1, u32 r2, u8 r3, u32);
extern void sub_8076D10(struct DungeonEntity *pokemon, struct DungeonEntity *r1);
extern void LevelDownTarget(struct DungeonEntity *pokemon, struct DungeonEntity *r1, u32 r2);
extern void sub_8078B5C(struct DungeonEntity *, struct DungeonEntity *, u32, u32, u32);
extern void SetMessageArgument(u8 *buffer, struct DungeonEntity *r1, u32);
extern void sub_80522F4(struct DungeonEntity *pokemon, struct DungeonEntity *r1, const char[]);
extern void sub_8077910(struct DungeonEntity *pokemon, struct DungeonEntity *r1, u32, u32);
extern void HealTargetHP(struct DungeonEntity *pokemon, struct DungeonEntity *r1, s16, s16, u32);
extern void sub_806F370(struct DungeonEntity *pokemon, struct DungeonEntity *r1, u32, u32, u8 *, u8, s32, u32, u32, u32);
extern void sub_8078A58(struct DungeonEntity *, struct DungeonEntity *, s16, u32);
extern s32 sub_8042520(struct DungeonEntity *);
struct DungeonEntity *sub_80696FC(struct DungeonEntity *);
extern void sub_80943A0(void*, s32);
extern void sub_803E708(u32 r0, u32 r1);
void sub_8048340(struct DungeonEntity *pokemon, struct DungeonEntity *target, u32 r2)
{
sub_806F370(pokemon, target, r2, 1, 0, 0, 528, 0, 0, 0);
}
void sub_8048364(struct DungeonEntity *pokemon, struct DungeonEntity *target, u8 r2)
{
sub_8079F20(pokemon, target, 1, r2);
}
void sub_8048374(struct DungeonEntity *pokemon, struct DungeonEntity *target)
{
HealTargetHP(pokemon, target, gUnknown_80F4FB6, gUnknown_80F4FB8, 1);
}
void sub_804839C(struct DungeonEntity *pokemon, struct DungeonEntity *target)
{
HealTargetHP(pokemon, target, gUnknown_80F4FBA, gUnknown_80F4FBC, 1);
}
void sub_80483C4(struct DungeonEntity *pokemon, struct DungeonEntity *target)
{
RestorePPTarget(pokemon, target, 999);
}
void sub_80483D4(struct DungeonEntity *pokemon, struct DungeonEntity *target)
{
HealTargetHP(pokemon, target, 0, gUnknown_80F4FBE, 1);
}
void sub_80483F4(struct DungeonEntity *pokemon, struct DungeonEntity *target)
{
BlindTarget(pokemon, target);
}
void sub_8048400(struct DungeonEntity *pokemon, struct DungeonEntity *target)
{
CrossEyeVisionTarget(pokemon, target);
}
void sub_804840C(struct DungeonEntity *pokemon, struct DungeonEntity *target)
{
sub_8077910(pokemon, target, 0, 1);
}
void sub_804841C(struct DungeonEntity *pokemon, struct DungeonEntity *target)
{
RestoreVisionTarget(pokemon, target);
}
void sub_8048428(struct DungeonEntity *pokemon, struct DungeonEntity *target)
{
if(target->entityData->nonVolatileStatus == NON_VOLATILE_STATUS_PARALYZED)
SendNonVolatileEndMessage(pokemon, target);
else
// Pointer to "But nothing happened!"
sub_80522F4(pokemon, target, *gUnknown_80F89F4);
}
void sub_8048450(struct DungeonEntity *pokemon, struct DungeonEntity *target)
{
if((u8)(target->entityData->nonVolatileStatus - 2) <= 1)
SendNonVolatileEndMessage(pokemon, target);
else
// Pointer to "But nothing happened!"
sub_80522F4(pokemon, target, *gUnknown_80F89F4);
}
void sub_8048480(struct DungeonEntity *pokemon, struct DungeonEntity *target)
{
sub_807D148(pokemon, target, 0, 0);
}
void sub_8048490(struct DungeonEntity *pokemon, struct DungeonEntity *target)
{
sub_8075FCC(pokemon, target);
}
void sub_804849C(struct DungeonEntity *pokemon, struct DungeonEntity *target)
{
sub_8077AE4(pokemon, target, 1);
}
void sub_80484A8(struct DungeonEntity *pokemon, struct DungeonEntity *target)
{
sub_8072008(pokemon, target, 1, 1, 1);
}
void sub_80484BC(struct DungeonEntity *pokemon, struct DungeonEntity *target)
{
sub_8076D10(pokemon, target);
}
void sub_80484C8(struct DungeonEntity *pokemon, struct DungeonEntity *target)
{
// Pointer to "But nothing happened!"
sub_80522F4(pokemon, target, *gUnknown_80F89F4);
}
void sub_80484DC(struct DungeonEntity *pokemon, struct DungeonEntity *target)
{
LevelDownTarget(pokemon, target, 1);
}
void sub_80484E8(struct DungeonEntity *pokemon, struct DungeonEntity *target)
{
if(target->entityData->nonVolatileStatus == NON_VOLATILE_STATUS_BURNED)
SendNonVolatileEndMessage(pokemon, target);
else
{
SetMessageArgument(gAvailablePokemonNames, target, 0);
// Pointer to "But nothing happened!"
sub_80522F4(pokemon, target, *gUnknown_80FB580);
}
}
void sub_8048524(struct DungeonEntity *pokemon, struct DungeonEntity * target)
{
struct DungeonEntityData *entityData;
struct DungeonEntityData *entityData_1;
u32 *belly;
u32 newBelly;
entityData = target->entityData;
entityData_1 = entityData;
if (entityData->isLeader)
sub_8078A58(pokemon, target, 0, 5);
else
{
SetMessageArgument(gAvailablePokemonNames, target, 0);
if (HasIQSkill(target, IQ_SKILL_SELF_CURER))
sub_80522F4(pokemon, target, *gPtrSelfHealPreventedHungerMessage);
else
{
belly = &entityData_1->belly;
if (RoundUpFixedPoint(*belly) != 0) {
sub_80943A0(&newBelly, 0);
*belly = newBelly;
sub_80522F4(pokemon, target, *gUnknown_80F9740);
}
else
sub_80522F4(pokemon, target, *gUnknown_80F9760);
}
}
}
void sub_80485B0(struct DungeonEntity *pokemon, struct DungeonEntity * target)
{
bool8 isMoveBoosted;
s32 moveIndex;
struct DungeonEntityData *iVar5;
register struct PokemonMove *movePtr1 asm("r4"); // r4
register struct PokemonMove *movePtr2 asm("r5"); // r5
u8 cVar8;
s32 movePowerBoost;
s32 maxPowerBoost;
isMoveBoosted = FALSE;
cVar8 = 1;
iVar5 = target->entityData;
if (DungeonRandomCapped(100) < gUnknown_80F4F46)
cVar8 = 3;
if (iVar5->isLeader) {
for(moveIndex = 0, movePtr1 = &iVar5->moves[0], movePtr2 = movePtr1; moveIndex < MAX_MON_MOVES; movePtr1++, movePtr2++, moveIndex++)
{
if((movePtr1->moveFlags & MOVE_FLAG_EXISTS) && (movePtr1->moveFlags & MOVE_FLAG_SET))
{
if(GetMovePower(movePtr2) == 0) continue;
movePowerBoost = movePtr1->powerBoost;
maxPowerBoost = GetMoveMaxPowerBoost(movePtr2);
movePtr1->powerBoost += cVar8;
if(movePtr1->powerBoost >= maxPowerBoost)
movePtr1->powerBoost = maxPowerBoost;
if(movePowerBoost != movePtr1->powerBoost)
isMoveBoosted = TRUE;
}
}
if (isMoveBoosted) {
sub_80522F4(pokemon,target,*gUnknown_80FE454);
if (cVar8 != 1) {
sub_803E708(10,0x40);
sub_80522F4(pokemon,target,*gUnknown_80FE434);
}
}
else
sub_80522F4(pokemon,target,*gUnknown_80FE40C);
}
else
sub_80522F4(pokemon,target,*gUnknown_80FE40C);
}
void sub_804869C(struct DungeonEntity *pokemon, struct DungeonEntity * target, u8 param_3)
{
s32 uVar1;
struct DungeonEntityData *entityData;
struct DungeonEntityData *entityData_1;
struct DungeonEntity *entity;
u8 auStack28 [4];
if (param_3 != '\0') {
entityData = target->entityData;
entityData_1 = entityData;
if (gDungeonGlobalData->unk675 != 0) {
uVar1 = gUnknown_80F4FA8;
sub_80522F4(pokemon, target, *gUnknown_80FEAE8);
}
else {
uVar1 = gUnknown_80F4FA4;
}
if (entityData_1->immobilizeStatus == IMMOBILIZE_STATUS_FROZEN) {
SendImmobilizeEndMessage(pokemon, target);
}
sub_806F370(pokemon, target, uVar1, 1, auStack28, 0, 0x216, 0, 0, 0);
}
else
{
sub_8042520(pokemon);
entity = sub_80696FC(pokemon);
if (entity == NULL)
{
sub_80522F4(pokemon, target, *gUnknown_80FDBA0);
}
else
{
entityData = entity->entityData;
if (gDungeonGlobalData->unk675 != 0) {
uVar1 = gUnknown_80F4FAA;
sub_80522F4(pokemon, target, *gUnknown_80FEAE8);
}
else {
uVar1 = gUnknown_80F4FA6;
}
if (entityData->immobilizeStatus == IMMOBILIZE_STATUS_FROZEN) {
SendImmobilizeEndMessage(pokemon, entity);
}
sub_806F370(pokemon, entity, uVar1, 1, auStack28, 0, 0x216, 0, 0, 0);
}
}
}
void sub_80487CC(struct DungeonEntity *pokemon, struct DungeonEntity * target, u32 param_3, u32 param_4)
{
sub_8078B5C(pokemon, target, param_3, param_4, 1);
}