pmd-red/src/code_8041AD0.c
2023-01-13 22:42:01 -05:00

862 lines
16 KiB
C

#include "global.h"
#include "constants/direction.h"
#include "constants/status.h"
#include "constants/type.h"
#include "dungeon_entity.h"
#include "dungeon_global_data.h"
#include "dungeon_pokemon_attributes.h"
#include "dungeon_util.h"
#include "item.h"
struct unkStruct_80420E8
{
u32 unk0;
u32 unk4;
u32 unk8;
};
extern u32 gStatusSpriteMasks_SleepStatus[];
extern u32 gStatusSpriteMasks_NonVolatileStatus[];
extern u32 gStatusSpriteMasks_ImmobilizeStatus[];
extern u32 gStatusSpriteMasks_VolatileStatus[];
extern u32 gStatusSpriteMasks_ChargingStatus[];
extern u32 gStatusSpriteMasks_ProtectionStatus[];
extern u32 gStatusSpriteMasks_WaitingStatus[];
extern u32 gStatusSpriteMasks_LinkedStatus[];
extern u32 gStatusSpriteMasks_MoveStatus[];
extern u32 gStatusSpriteMasks_ItemStatus[];
extern u32 gStatusSpriteMasks_TransformStatus[];
extern u32 gStatusSpriteMasks_EyesightStatus[];
extern u32 gStatusSpriteMasks_MuzzledStatus[];
extern void sub_803ED30(u8, struct Entity *pokemon, u8, u8);
extern void sub_804151C(struct Entity *pokemon, u32 r1, u8 r2);
extern void sub_80416E0(struct Entity *pokemon, u32, u32);
extern u8 sub_8042768(struct Entity *pokemon);
extern void sub_806CDD4(struct Entity *pokemon, u8, u32);
extern u32 sub_806F62C(u32);
extern void PlaySoundEffect(u32);
extern u8 sub_803F428(struct Entity *pokemon);
extern void sub_8041550(struct Entity *pokemon, u32, u32, u32, u32, u32);
void sub_80421C0(struct Entity *pokemon, u16 r1);
void EntityUpdateStatusSprites(struct Entity *entity);
extern s32 gUnknown_202EDC8;
extern u8 gUnknown_203B40D;
extern s16 gUnknown_2026E4E;
extern u8 sub_800E9FC(u8);
extern void sub_800DBBC(void);
extern void sub_803EA10(void);
extern void sub_8042E98(void);
extern void sub_803E46C(u32);
extern void sub_800EE5C(u32);
extern u32 sub_800E890(u32 *);
extern void sub_800EF64(void);
u32 sub_8041764(u32 *param_1, u8 param_2)
{
sub_800EE5C(*param_1);
sub_800EF64();
if(param_2)
sub_803E46C(0x42);
return sub_800E890(param_1);
}
void sub_804178C(u8 param_1)
{
u32 temp;
s32 counter;
counter = 0;
gDungeon->unk18204 = 0;
if (sub_800E9FC(param_1) != 0) {
while ((counter < 1000 && (sub_800E9FC(param_1) != 0))) {
sub_803E46C(0x4a);
counter++;
}
sub_803E46C(0x4a);
sub_803E46C(0x4a);
}
if ((counter == 1000) || (param_1 != 0)) {
sub_800DBBC();
}
if (gUnknown_202EDC8 < 0x1f) {
temp = gUnknown_203B40D;
gUnknown_203B40D = 1;
for(counter = 0; counter < 1000; counter++)
{
if (gUnknown_202EDC8 < 0x1f) {
gUnknown_202EDC8 += 4;
if (gUnknown_2026E4E != 0x808) {
gUnknown_2026E4E -= 0x101;
}
}
else {
gUnknown_202EDC8 = 0x1f;
}
sub_803EA10();
sub_803E46C(0x4a);
if(gUnknown_202EDC8 == 0x1f) break;
};
gUnknown_2026E4E = 0x808;
gUnknown_203B40D = temp;
}
sub_8042E98();
}
u32 EntityGetStatusSprites(struct Entity *entity)
{
return entity->info->statusIcons;
}
void sub_8041888(u8 param_1)
{
s32 index;
struct Entity *entity;
struct EntityInfo *entityInfo;
for(index = 0; index < DUNGEON_MAX_POKEMON; index++)
{
entity = gDungeon->allPokemon[index];
if(EntityExists(entity))
{
entityInfo = entity->info;
if(param_1)
{
entityInfo->unk14C = 1;
}
EntityUpdateStatusSprites(entity);
}
}
}
void EntityUpdateStatusSprites(struct Entity *entity)
{
bool32 flag;
s32 HP;
struct EntityInfo *entityInfo;
u32 spriteStatus;
u8 temp;
if (EntityExists(entity)) {
entityInfo = entity->info;
spriteStatus = 0;
flag = TRUE;
if (entityInfo->id == 0xb9) {
// NOTE: clean this up sometime
temp = entityInfo->sleepTurns;
flag = 0x7f;
temp ^= flag;
flag = (temp) != 0;
}
if (flag) {
spriteStatus = gStatusSpriteMasks_SleepStatus[entityInfo->sleep];
}
spriteStatus = spriteStatus |
gStatusSpriteMasks_NonVolatileStatus[entityInfo->nonVolatileStatus] |
gStatusSpriteMasks_ImmobilizeStatus[entityInfo->immobilizeStatus] |
gStatusSpriteMasks_VolatileStatus[entityInfo->volatileStatus] |
gStatusSpriteMasks_ChargingStatus[entityInfo->chargingStatus] |
gStatusSpriteMasks_ProtectionStatus[entityInfo->protectionStatus] |
gStatusSpriteMasks_WaitingStatus[entityInfo->waitingStatus] |
gStatusSpriteMasks_LinkedStatus[entityInfo->linkedStatus] |
gStatusSpriteMasks_MoveStatus[entityInfo->moveStatus] |
gStatusSpriteMasks_ItemStatus[entityInfo->itemStatus] |
gStatusSpriteMasks_TransformStatus[entityInfo->transformStatus] |
gStatusSpriteMasks_EyesightStatus[entityInfo->eyesightStatus] |
gStatusSpriteMasks_MuzzledStatus[entityInfo->muzzled];
if (entityInfo->grudge) {
spriteStatus = spriteStatus | STATUS_SPRITE_GRUDGE;
}
if (entityInfo->exposed) {
spriteStatus = spriteStatus | STATUS_SPRITE_EXPOSED;
}
if (!entityInfo->isNotTeamMember) {
HP = entityInfo->maxHPStat;
if (HP < 0) {
HP += 3;
}
HP >>= 2;
if (HP > entityInfo->HP) {
spriteStatus = spriteStatus | STATUS_SPRITE_LOWHP;
}
}
if ((gDungeon->itemHoldersIdentified) && (entityInfo->heldItem.flags & ITEM_FLAG_EXISTS)) {
spriteStatus = spriteStatus | STATUS_SPRITE_LOWHP;
}
if ( (entityInfo->offensiveMultipliers[0] < DEFAULT_STAT_MULTIPLIER) ||
(entityInfo->offensiveMultipliers[1] < DEFAULT_STAT_MULTIPLIER) ||
(entityInfo->defensiveMultipliers[0] < DEFAULT_STAT_MULTIPLIER) ||
(entityInfo->defensiveMultipliers[1] < DEFAULT_STAT_MULTIPLIER) ||
(entityInfo->offensiveStages[0] < DEFAULT_STAT_STAGE) ||
(entityInfo->offensiveStages[1] < DEFAULT_STAT_STAGE) ||
(entityInfo->defensiveStages[0] < DEFAULT_STAT_STAGE) ||
(entityInfo->defensiveStages[1] < DEFAULT_STAT_STAGE) ||
(entityInfo->hitChanceStages[0]) < DEFAULT_STAT_STAGE ||
(entityInfo->hitChanceStages[1] < DEFAULT_STAT_STAGE)) {
spriteStatus = spriteStatus | STATUS_SPRITE_STAT_DOWN;
}
entityInfo->statusIcons = spriteStatus;
}
}
void sub_8041AD0(struct Entity *pokemon)
{
sub_804151C(pokemon, 0xA2 << 1, 1);
}
void sub_8041AE0(struct Entity *pokemon)
{
sub_804151C(pokemon, 0x143, 1);
}
void sub_8041AF4(struct Entity *pokemon)
{
sub_804151C(pokemon, 0x25, 1);
sub_80421C0(pokemon, 0x197);
}
void nullsub_57(void)
{
}
void sub_8041B18(struct Entity *pokemon)
{
sub_804151C(pokemon, 0x141, 1);
}
void nullsub_58(void)
{
}
void nullsub_59(void)
{
}
void sub_8041B34(struct Entity *pokemon)
{
sub_804151C(pokemon, 7, 1);
}
void nullsub_60(void)
{
}
void sub_8041B48(struct Entity *pokemon)
{
sub_804151C(pokemon, 4, 0);
}
void nullsub_61(void)
{
}
void sub_8041B5C(struct Entity *pokemon)
{
sub_804151C(pokemon, 0x171, 1);
}
void nullsub_62(struct Entity *pokemon)
{
}
void sub_8041B74(struct Entity *pokemon)
{
sub_804151C(pokemon, 0x171, 0);
}
void nullsub_63(void)
{
}
void nullsub_64(void)
{
}
void sub_8041B90(struct Entity *pokemon)
{
sub_804151C(pokemon, 0xD6 << 1, 0);
}
void nullsub_65(void)
{
}
void nullsub_66(void)
{
}
void sub_8041BA8(struct Entity *pokemon)
{
sub_804151C(pokemon, 4, 1);
}
void nullsub_67(void)
{
}
void sub_8041BBC(struct Entity *pokemon)
{
sub_804151C(pokemon, 0xD4 << 1, 1);
}
void nullsub_68(void)
{
}
void sub_8041BD0(struct Entity *pokemon, u8 r1)
{
if(r1 == 0)
{
return;
}
sub_80421C0(pokemon, 0x1a5);
}
void sub_8041BE8(struct Entity *pokemon)
{
sub_80421C0(pokemon, 0xCB << 1);
}
void sub_8041BF8(struct Entity *pokemon)
{
sub_806CDD4(pokemon, 0xA, NUM_DIRECTIONS);
}
void sub_8041C08(struct Entity *pokemon)
{
sub_804151C(pokemon, 0x1a7, 1);
}
void sub_8041C1C(struct Entity *pokemon)
{
sub_804151C(pokemon, 0x1a7, 1);
}
void nullsub_69(void)
{
}
void sub_8041C34(struct Entity *pokemon)
{
sub_804151C(pokemon, 0x4C, 1);
}
void nullsub_70(void)
{
}
void nullsub_71(void)
{
}
void sub_8041C4C(struct Entity *pokemon, u32 r1)
{
sub_804151C(pokemon, r1, 1);
}
void sub_8041C58(struct Entity *pokemon)
{
sub_804151C(pokemon, 0x1a9, 1);
}
void sub_8041C6C(struct Entity *pokemon)
{
sub_804151C(pokemon, 0x9D << 1, 1);
}
void sub_8041C7C(struct Entity *pokemon)
{
sub_804151C(pokemon, 0x9D << 1, 1);
}
void nullsub_72(void)
{
}
void nullsub_73(void)
{
}
void sub_8041C94(struct Entity *pokemon)
{
sub_804151C(pokemon, 0x171, 1);
}
void sub_8041CA8(struct Entity *pokemon)
{
sub_804151C(pokemon, 7, 1);
}
void sub_8041CB8(struct Entity *pokemon)
{
sub_804151C(pokemon, 0x18b, 1);
}
void sub_8041CCC(struct Entity *pokemon)
{
sub_804151C(pokemon, 0xC5 << 1, 1);
}
void sub_8041CDC(struct Entity *pokemon)
{
sub_804151C(pokemon, 5, 1);
}
void sub_8041CEC(struct Entity *pokemon)
{
sub_80421C0(pokemon, 0x19d);
}
void nullsub_74(void)
{
}
void sub_8041D00(struct Entity *pokemon, struct Entity *target)
{
sub_804151C(target, 0x2F, 1);
sub_804151C(pokemon, 0x30, 1);
}
void nullsub_75(struct Entity *pokemon)
{
}
void nullsub_76(struct Entity *pokemon)
{
}
void nullsub_77(struct Entity *pokemon)
{
}
void nullsub_78(struct Entity *pokemon)
{
}
void nullsub_79(struct Entity *pokemon)
{
}
void nullsub_80(struct Entity *pokemon)
{
}
void sub_8041D38(struct Entity * pokemon)
{
sub_804151C(pokemon, 0x21, 1);
}
void sub_8041D48(struct Entity * pokemon)
{
sub_80421C0(pokemon, 0x191);
}
void nullsub_81(void)
{
}
void sub_8041D5C(struct Entity *pokemon)
{
if(sub_8042768(pokemon) == 0)
{
return;
}
sub_803ED30(pokemon->info->stockpileStage, pokemon, 1, 0xB);
}
void sub_8041D84(struct Entity *pokemon)
{
sub_80421C0(pokemon, 0x19f);
}
void nullsub_82(void)
{
}
void nullsub_83(void)
{
}
void sub_8041D9C(struct Entity *pokemon)
{
sub_804151C(pokemon, 0x131, 1);
}
void sub_8041DB0(struct Entity *pokemon)
{
sub_804151C(pokemon, 0x30, 1);
}
void nullsub_84(void)
{
}
void nullsub_85(void)
{
}
void nullsub_204(void)
{
}
void nullsub_86(void)
{
}
void nullsub_87(void)
{
}
void nullsub_88(void)
{
}
void sub_8041DD8(struct Entity *pokemon, s16 r1)
{
u32 temp;
temp = r1;
if(MonsterIsType(pokemon, TYPE_GHOST) != 0)
sub_804151C(pokemon, temp, 1);
else
sub_804151C(pokemon, TYPE_GHOST, 1);
}
void nullsub_89(void)
{
}
void sub_8041E0C(struct Entity *pokemon)
{
sub_804151C(pokemon, 0x41, 1);
}
void sub_8041E1C(struct Entity *pokemon)
{
sub_804151C(pokemon, 0x8F << 1, 1);
sub_80421C0(pokemon, 0xCE << 1);
}
void sub_8041E3C(struct Entity *pokemon)
{
sub_804151C(pokemon, 0xD7 << 1, 1);
}
void sub_8041E4C(struct Entity *pokemon)
{
sub_804151C(pokemon, 0x1b1, 1);
}
void sub_8041E60(struct Entity *pokemon)
{
sub_804151C(pokemon, 0x1a9, 1);
}
void sub_8041E74(struct Entity *pokemon)
{
sub_804151C(pokemon, 0xC9 << 1, 1);
}
void sub_8041E84(struct Entity *pokemon)
{
sub_804151C(pokemon, 0xC7 << 1, 1);
}
void sub_8041E94(struct Entity *pokemon)
{
sub_804151C(pokemon, 0xC8 << 1, 1);
}
void sub_8041EA4(struct Entity *pokemon)
{
sub_804151C(pokemon, 0x15, 1);
}
void sub_8041EB4(struct Entity *pokemon)
{
sub_804151C(pokemon, 0x171, 1);
}
void sub_8041EC8(struct Entity *pokemon)
{
sub_80421C0(pokemon, 0x197);
}
void sub_8041ED8(struct Entity *pokemon)
{
sub_80421C0(pokemon, 0x197);
}
void sub_8041EE8(struct Entity *pokemon)
{
sub_804151C(pokemon, 0x15, 1);
}
void sub_8041EF8(struct Entity *pokemon)
{
sub_804151C(pokemon, 0xF, 1);
}
void sub_8041F08(struct Entity *pokemon)
{
sub_8041550(pokemon, 0x15, 1, 3, 2, 0);
}
void nullsub_90(void)
{
}
void sub_8041F28(struct Entity *pokemon, u32 r1)
{
if(r1 == 0)
{
sub_804151C(pokemon, 0xCA << 1, 1);
}
else
{
sub_804151C(pokemon, 0x193, 1);
}
}
void sub_8041F4C(struct Entity *pokemon, u32 r1)
{
if(r1 == 0)
{
sub_804151C(pokemon, 0x18f, 1);
}
else
{
sub_804151C(pokemon, 0x191, 1);
}
}
void sub_8041F70(struct Entity *pokemon, u32 r1)
{
if(r1 == 0)
{
sub_804151C(pokemon, 0x1a9, 1);
}
else
{
sub_804151C(pokemon, 0xC9 << 1, 1);
}
}
void sub_8041F94(struct Entity *pokemon, u32 r1)
{
if(r1 == 0)
{
sub_804151C(pokemon, 0xC7 << 1, 1);
}
else
{
sub_804151C(pokemon, 0xC8 << 1, 1);
}
}
void sub_8041FB4(struct Entity *pokemon, u32 r1)
{
if(r1 == 0)
{
sub_804151C(pokemon, 0x1a9, 1);
}
else
{
sub_804151C(pokemon, 0xC9 << 1, 1);
}
}
void sub_8041FD8(struct Entity *pokemon, u32 r1)
{
if(r1 == 0)
{
sub_804151C(pokemon, 0xCA << 1, 1);
}
else
{
sub_804151C(pokemon, 0x193, 1);
}
}
void sub_8041FFC(struct Entity *pokemon, u32 r1)
{
if(r1 == 0)
{
sub_804151C(pokemon, 0xC7 << 1, 1);
}
else
{
sub_804151C(pokemon, 0xC8 << 1, 1);
}
}
void sub_804201C(struct Entity *pokemon, u32 r1)
{
if(r1 == 0)
{
sub_804151C(pokemon, 0x18f, 1);
}
else
{
sub_804151C(pokemon, 0x191, 1);
}
}
void sub_8042040(struct Entity *pokemon, u32 r1)
{
if(r1 == 0)
{
sub_804151C(pokemon, 0xC6 << 1, 1);
}
else
{
sub_804151C(pokemon, 0xD, 1);
}
}
void sub_8042060(struct Entity *pokemon, u32 r1)
{
if(r1 == 0)
{
sub_804151C(pokemon, 0x18d, 1);
}
else
{
sub_804151C(pokemon, 0xE, 1);
}
}
void sub_8042080(struct Entity *pokemon, u32 r1)
{
if(r1 == 0)
{
sub_804151C(pokemon, 0xC6 << 1, 1);
}
else
{
sub_804151C(pokemon, 0xD, 1);
}
}
void sub_80420A0(struct Entity *pokemon, u32 r1)
{
sub_804151C(pokemon, 0x143, 1);
}
void nullsub_91(void)
{
}
void sub_80420B8(struct Entity *pokemon, u32 r1)
{
sub_804151C(pokemon, 0x19, 1);
}
void sub_80420C8(struct Entity *pokemon)
{
sub_8041550(pokemon, 0x15, 1, 3, 2, 0);
}
void nullsub_92(struct Entity *pokemon)
{
}
void sub_80420E8(struct Entity *pokemon, struct unkStruct_80420E8 *r1)
{
u32 temp;
u32 arg;
temp = r1->unk8;
if(gDungeon->unk16D != 0)
temp = sub_806F62C(r1->unk8);
switch(temp)
{
default:
case 0:
arg = 8;
break;
case 1:
arg = 9;
break;
case 2:
arg = 10;
break;
case 3:
arg = 11;
break;
}
sub_8041550(pokemon, arg, 1, 3, 0, 1);
}
void sub_8042148(struct Entity *pokemon)
{
sub_80421C0(pokemon, 0x1a7);
sub_804151C(pokemon, 0x9F << 1, 1);
}
void nullsub_93()
{
}
void sub_804216C(struct Entity *pokemon, struct Entity *target, u32 r2)
{
if(r2 == 1)
sub_804151C(target, 0xF8, 1);
else
sub_804151C(target, 0xF9, 1);
}
void sub_804218C(struct Entity *pokemon, struct Entity *target)
{
sub_804151C(target, 0x2A, 1);
}
void sub_804219C(struct Entity *pokemon)
{
sub_80416E0(pokemon, 0x90, 1);
}
void sub_80421AC(struct Entity *pokemon, struct Entity * target)
{
sub_804151C(target, 0x167, 1);
}
void sub_80421C0(struct Entity *pokemon, u16 r1)
{
if(pokemon == NULL)
PlaySoundEffect(r1);
else
if(sub_8042768(pokemon) != 0)
PlaySoundEffect(r1);
}
void sub_80421EC(struct Entity *pokemon, u16 r1)
{
if(sub_803F428(pokemon) != 0)
PlaySoundEffect(r1);
}
void sub_8042208(struct Entity *pokemon, u8 r1)
{
if(r1 == 0)
PlaySoundEffect(0x152);
else if(r1 == 1)
PlaySoundEffect(0x151);
else
PlaySoundEffect(0x150);
}
void sub_8042238(struct Entity *pokemon, struct Entity *target)
{
if(target->info->isNotTeamMember)
PlaySoundEffect(0x157);
else
PlaySoundEffect(0x156);
}