diff --git a/asm/code_8040094.s b/asm/code_8040094.s index cdf03f43b..525209af4 100644 --- a/asm/code_8040094.s +++ b/asm/code_8040094.s @@ -2873,446 +2873,4 @@ _08041758: bx r1 thumb_func_end sub_80416E0 - thumb_func_start sub_8041764 -sub_8041764: - push {r4,r5,lr} - adds r5, r0, 0 - lsls r4, r1, 24 - lsrs r4, 24 - ldr r0, [r5] - bl sub_800EE5C - bl sub_800EF64 - cmp r4, 0 - beq _08041780 - movs r0, 0x42 - bl sub_803E46C -_08041780: - adds r0, r5, 0 - bl sub_800E890 - pop {r4,r5} - pop {r1} - bx r1 - thumb_func_end sub_8041764 - - thumb_func_start sub_804178C -sub_804178C: - push {r4-r7,lr} - lsls r0, 24 - lsrs r5, r0, 24 - movs r4, 0 - ldr r0, _080417B0 - ldr r0, [r0] - ldr r1, _080417B4 - adds r0, r1 - str r4, [r0] - adds r0, r5, 0 - bl sub_800E9FC - lsls r0, 24 - cmp r0, 0 - beq _080417E0 - ldr r6, _080417B8 - b _080417C4 - .align 2, 0 -_080417B0: .4byte gDungeonGlobalData -_080417B4: .4byte 0x00018204 -_080417B8: .4byte 0x000003e7 -_080417BC: - movs r0, 0x4A - bl sub_803E46C - adds r4, 0x1 -_080417C4: - cmp r4, r6 - bgt _080417D4 - adds r0, r5, 0 - bl sub_800E9FC - lsls r0, 24 - cmp r0, 0 - bne _080417BC -_080417D4: - movs r0, 0x4A - bl sub_803E46C - movs r0, 0x4A - bl sub_803E46C -_080417E0: - movs r0, 0xFA - lsls r0, 2 - cmp r4, r0 - beq _080417EC - cmp r5, 0 - beq _080417F0 -_080417EC: - bl sub_800DBBC -_080417F0: - ldr r2, _08041824 - ldr r0, [r2] - cmp r0, 0x1E - bgt _08041860 - ldr r1, _08041828 - ldrb r7, [r1] - movs r0, 0x1 - strb r0, [r1] - movs r4, 0 - adds r5, r2, 0 - ldr r6, _0804182C -_08041806: - ldr r0, [r5] - cmp r0, 0x1E - bgt _08041838 - adds r0, 0x4 - str r0, [r5] - ldr r1, _08041830 - ldrh r2, [r1] - movs r3, 0 - ldrsh r0, [r1, r3] - cmp r0, r6 - beq _0804183C - ldr r3, _08041834 - adds r0, r2, r3 - strh r0, [r1] - b _0804183C - .align 2, 0 -_08041824: .4byte gUnknown_202EDC8 -_08041828: .4byte gUnknown_203B40D -_0804182C: .4byte 0x00000808 -_08041830: .4byte gUnknown_2026E4E -_08041834: .4byte 0xfffffeff -_08041838: - movs r0, 0x1F - str r0, [r5] -_0804183C: - bl sub_803EA10 - movs r0, 0x4A - bl sub_803E46C - ldr r0, [r5] - cmp r0, 0x1F - beq _08041854 - adds r4, 0x1 - ldr r0, _0804186C - cmp r4, r0 - ble _08041806 -_08041854: - ldr r0, _08041870 - ldr r2, _08041874 - adds r1, r2, 0 - strh r1, [r0] - ldr r0, _08041878 - strb r7, [r0] -_08041860: - bl sub_8042E98 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_0804186C: .4byte 0x000003e7 -_08041870: .4byte gUnknown_2026E4E -_08041874: .4byte 0x00000808 -_08041878: .4byte gUnknown_203B40D - thumb_func_end sub_804178C - - thumb_func_start EntityGetStatusSprites - @ int EntityGetStatusSprites(struct DungeonEntity *entity) -EntityGetStatusSprites: - ldr r0, [r0, 0x70] - movs r1, 0x80 - lsls r1, 2 - adds r0, r1 - ldr r0, [r0] - bx lr - thumb_func_end EntityGetStatusSprites - - thumb_func_start sub_8041888 -sub_8041888: - push {r4-r6,lr} - lsls r0, 24 - lsrs r6, r0, 24 - movs r5, 0 -_08041890: - ldr r0, _080418CC - ldr r0, [r0] - lsls r1, r5, 2 - ldr r2, _080418D0 - adds r0, r2 - adds r0, r1 - ldr r4, [r0] - adds r0, r4, 0 - bl EntityExists - lsls r0, 24 - cmp r0, 0 - beq _080418C0 - ldr r1, [r4, 0x70] - cmp r6, 0 - beq _080418BA - movs r0, 0xA6 - lsls r0, 1 - adds r1, r0 - movs r0, 0x1 - strb r0, [r1] -_080418BA: - adds r0, r4, 0 - bl DungeonEntityUpdateStatusSprites -_080418C0: - adds r5, 0x1 - cmp r5, 0x13 - ble _08041890 - pop {r4-r6} - pop {r0} - bx r0 - .align 2, 0 -_080418CC: .4byte gDungeonGlobalData -_080418D0: .4byte 0x000135cc - thumb_func_end sub_8041888 - - thumb_func_start DungeonEntityUpdateStatusSprites -DungeonEntityUpdateStatusSprites: - push {r4,lr} - adds r4, r0, 0 - bl EntityExists - lsls r0, 24 - cmp r0, 0 - bne _080418E4 - b _08041A8C -_080418E4: - ldr r2, [r4, 0x70] - movs r3, 0 - movs r1, 0x1 - movs r4, 0x2 - ldrsh r0, [r2, r4] - cmp r0, 0xB9 - bne _08041902 - adds r0, r2, 0 - adds r0, 0xA9 - ldrb r0, [r0] - movs r1, 0x7F - eors r0, r1 - negs r1, r0 - orrs r1, r0 - lsrs r1, 31 -_08041902: - cmp r1, 0 - beq _08041914 - ldr r1, _08041A94 - adds r0, r2, 0 - adds r0, 0xA8 - ldrb r0, [r0] - lsls r0, 2 - adds r0, r1 - ldr r3, [r0] -_08041914: - ldr r1, _08041A98 - adds r0, r2, 0 - adds r0, 0xAC - ldrb r0, [r0] - lsls r0, 2 - adds r0, r1 - ldr r0, [r0] - orrs r3, r0 - ldr r1, _08041A9C - adds r0, r2, 0 - adds r0, 0xB0 - ldrb r0, [r0] - lsls r0, 2 - adds r0, r1 - ldr r0, [r0] - orrs r3, r0 - ldr r1, _08041AA0 - adds r0, r2, 0 - adds r0, 0xBC - ldrb r0, [r0] - lsls r0, 2 - adds r0, r1 - ldr r0, [r0] - orrs r3, r0 - ldr r1, _08041AA4 - adds r0, r2, 0 - adds r0, 0xC0 - ldrb r0, [r0] - lsls r0, 2 - adds r0, r1 - ldr r0, [r0] - orrs r3, r0 - ldr r1, _08041AA8 - adds r0, r2, 0 - adds r0, 0xC4 - ldrb r0, [r0] - lsls r0, 2 - adds r0, r1 - ldr r0, [r0] - orrs r3, r0 - ldr r1, _08041AAC - adds r0, r2, 0 - adds r0, 0xC8 - ldrb r0, [r0] - lsls r0, 2 - adds r0, r1 - ldr r0, [r0] - orrs r3, r0 - ldr r1, _08041AB0 - adds r0, r2, 0 - adds r0, 0xD0 - ldrb r0, [r0] - lsls r0, 2 - adds r0, r1 - ldr r0, [r0] - orrs r3, r0 - ldr r1, _08041AB4 - adds r0, r2, 0 - adds r0, 0xDC - ldrb r0, [r0] - lsls r0, 2 - adds r0, r1 - ldr r0, [r0] - orrs r3, r0 - ldr r1, _08041AB8 - adds r0, r2, 0 - adds r0, 0xE0 - ldrb r0, [r0] - lsls r0, 2 - adds r0, r1 - ldr r0, [r0] - orrs r3, r0 - ldr r1, _08041ABC - adds r0, r2, 0 - adds r0, 0xE4 - ldrb r0, [r0] - lsls r0, 2 - adds r0, r1 - ldr r0, [r0] - orrs r3, r0 - ldr r1, _08041AC0 - adds r0, r2, 0 - adds r0, 0xE8 - ldrb r0, [r0] - lsls r0, 2 - adds r0, r1 - ldr r0, [r0] - orrs r3, r0 - ldr r1, _08041AC4 - adds r0, r2, 0 - adds r0, 0xEC - ldrb r0, [r0] - lsls r0, 2 - adds r0, r1 - ldr r0, [r0] - orrs r3, r0 - adds r0, r2, 0 - adds r0, 0xF4 - ldrb r0, [r0] - cmp r0, 0 - beq _080419E4 - movs r0, 0x80 - lsls r0, 17 - orrs r3, r0 -_080419E4: - adds r0, r2, 0 - adds r0, 0xF5 - ldrb r0, [r0] - cmp r0, 0 - beq _080419F4 - movs r0, 0x80 - lsls r0, 18 - orrs r3, r0 -_080419F4: - ldrb r0, [r2, 0x6] - cmp r0, 0 - bne _08041A14 - movs r0, 0x10 - ldrsh r1, [r2, r0] - cmp r1, 0 - bge _08041A04 - adds r1, 0x3 -_08041A04: - asrs r1, 2 - movs r4, 0xE - ldrsh r0, [r2, r4] - cmp r1, r0 - ble _08041A14 - movs r0, 0x80 - lsls r0, 6 - orrs r3, r0 -_08041A14: - ldr r0, _08041AC8 - ldr r0, [r0] - ldr r1, _08041ACC - adds r0, r1 - ldrb r0, [r0] - cmp r0, 0 - beq _08041A36 - adds r0, r2, 0 - adds r0, 0x60 - ldrb r1, [r0] - movs r0, 0x1 - ands r0, r1 - cmp r0, 0 - beq _08041A36 - movs r0, 0x80 - lsls r0, 6 - orrs r3, r0 -_08041A36: - ldr r0, [r2, 0x2C] - cmp r0, 0xFF - ble _08041A7E - ldr r0, [r2, 0x30] - cmp r0, 0xFF - ble _08041A7E - ldr r0, [r2, 0x34] - cmp r0, 0xFF - ble _08041A7E - ldr r0, [r2, 0x38] - cmp r0, 0xFF - ble _08041A7E - movs r4, 0x1C - ldrsh r0, [r2, r4] - cmp r0, 0x9 - ble _08041A7E - movs r1, 0x1E - ldrsh r0, [r2, r1] - cmp r0, 0x9 - ble _08041A7E - movs r4, 0x20 - ldrsh r0, [r2, r4] - cmp r0, 0x9 - ble _08041A7E - movs r1, 0x22 - ldrsh r0, [r2, r1] - cmp r0, 0x9 - ble _08041A7E - movs r4, 0x24 - ldrsh r0, [r2, r4] - cmp r0, 0x9 - ble _08041A7E - movs r1, 0x26 - ldrsh r0, [r2, r1] - cmp r0, 0x9 - bgt _08041A84 -_08041A7E: - movs r0, 0x80 - lsls r0, 20 - orrs r3, r0 -_08041A84: - movs r4, 0x80 - lsls r4, 2 - adds r0, r2, r4 - str r3, [r0] -_08041A8C: - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_08041A94: .4byte gStatusSpriteMasks_SleepStatus -_08041A98: .4byte gStatusSpriteMasks_NonVolatileStatus -_08041A9C: .4byte gStatusSpriteMasks_ImmobilizeStatus -_08041AA0: .4byte gStatusSpriteMasks_VolatileStatus -_08041AA4: .4byte gStatusSpriteMasks_ChargingStatus -_08041AA8: .4byte gStatusSpriteMasks_ProtectionStatus -_08041AAC: .4byte gStatusSpriteMasks_WaitingStatus -_08041AB0: .4byte gStatusSpriteMasks_LinkedStatus -_08041AB4: .4byte gStatusSpriteMasks_MoveStatus -_08041AB8: .4byte gStatusSpriteMasks_ItemStatus -_08041ABC: .4byte gStatusSpriteMasks_TransformStatus -_08041AC0: .4byte gStatusSpriteMasks_EyesightStatus -_08041AC4: .4byte gStatusSpriteMasks_MuzzledStatus -_08041AC8: .4byte gDungeonGlobalData -_08041ACC: .4byte 0x00000676 - thumb_func_end DungeonEntityUpdateStatusSprites - .align 2,0 diff --git a/include/dungeon_entity.h b/include/dungeon_entity.h index a89961d40..1b334d36f 100644 --- a/include/dungeon_entity.h +++ b/include/dungeon_entity.h @@ -199,7 +199,9 @@ struct DungeonEntityData /* 0x148 */ bool8 attacking; /* 0x149 */ u8 unk149; /* 0x14A */ u8 unk14A; - u8 fill14B[0x14E - 0x14B]; + /* 0x14B */ u8 unk14B; + /* 0x14C */ u8 unk14C; + /* 0x14D */ u8 unk14D; /* 0x14E */ u16 visualFlags; /* 0x150 */ u16 previousVisualFlags; /* 0x152 */ u8 unk152; diff --git a/src/code_8041AD0.c b/src/code_8041AD0.c index 126aca11a..c3f27df0a 100644 --- a/src/code_8041AD0.c +++ b/src/code_8041AD0.c @@ -1,9 +1,12 @@ #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 { @@ -12,6 +15,20 @@ struct unkStruct_80420E8 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 DungeonEntity *pokemon, u8, u8); extern void sub_804151C(struct DungeonEntity *pokemon, u32 r1, u8 r2); @@ -25,8 +42,170 @@ extern void sub_8041550(struct DungeonEntity *pokemon, u32, u32, u32, u32, u32); void sub_80421C0(struct DungeonEntity *pokemon, u16 r1); +void DungeonEntityUpdateStatusSprites(struct DungeonEntity *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; + gDungeonGlobalData->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 DungeonEntity *entity) +{ + return entity->entityData->statusSprites; +} + +void sub_8041888(u8 param_1) +{ + s32 index; + struct DungeonEntity *entity; + struct DungeonEntityData *entityData; + for(index = 0; index < DUNGEON_MAX_POKEMON; index++) + { + entity = gDungeonGlobalData->allPokemon[index]; + if(EntityExists(entity)) + { + entityData = entity->entityData; + if(param_1) + { + entityData->unk14C = 1; + } + DungeonEntityUpdateStatusSprites(entity); + } + } +} + +void DungeonEntityUpdateStatusSprites(struct DungeonEntity *entity) +{ + bool32 flag; + s32 HP; + struct DungeonEntityData *entityData; + u32 spriteStatus; + u8 temp; + + if (EntityExists(entity)) { + entityData = entity->entityData; + spriteStatus = 0; + flag = TRUE; + + if (entityData->entityID == 0xb9) { + // NOTE: clean this up sometime + temp = entityData->sleepStatusTurnsLeft; + flag = 0x7f; + temp ^= flag; + flag = (temp) != 0; + } + if (flag) { + spriteStatus = gStatusSpriteMasks_SleepStatus[entityData->sleepStatus]; + } + spriteStatus = spriteStatus | + gStatusSpriteMasks_NonVolatileStatus[entityData->nonVolatileStatus] | + gStatusSpriteMasks_ImmobilizeStatus[entityData->immobilizeStatus] | + gStatusSpriteMasks_VolatileStatus[entityData->volatileStatus] | + gStatusSpriteMasks_ChargingStatus[entityData->chargingStatus] | + gStatusSpriteMasks_ProtectionStatus[entityData->protectionStatus] | + gStatusSpriteMasks_WaitingStatus[entityData->waitingStatus] | + gStatusSpriteMasks_LinkedStatus[entityData->linkedStatus] | + gStatusSpriteMasks_MoveStatus[entityData->moveStatus] | + gStatusSpriteMasks_ItemStatus[entityData->itemStatus] | + gStatusSpriteMasks_TransformStatus[entityData->transformStatus] | + gStatusSpriteMasks_EyesightStatus[entityData->eyesightStatus] | + gStatusSpriteMasks_MuzzledStatus[entityData->muzzledStatus]; + + if (entityData->grudgeStatus) { + spriteStatus = spriteStatus | STATUS_SPRITE_GRUDGE; + } + if (entityData->exposedStatus) { + spriteStatus = spriteStatus | STATUS_SPRITE_EXPOSED; + } + if (!entityData->isEnemy) { + HP = entityData->maxHP; + if (HP < 0) { + HP += 3; + } + HP >>= 2; + if (HP > entityData->HP) { + spriteStatus = spriteStatus | STATUS_SPRITE_LOWHP; + } + } + if ((gDungeonGlobalData->itemHoldersIdentified) && (entityData->heldItem.itemFlags & ITEM_FLAG_EXISTS)) { + spriteStatus = spriteStatus | STATUS_SPRITE_LOWHP; + } + if ( (entityData->attackMultipliers[0] < DEFAULT_STAT_MULTIPLIER) || + (entityData->attackMultipliers[1] < DEFAULT_STAT_MULTIPLIER) || + (entityData->defenseMultipliers[0] < DEFAULT_STAT_MULTIPLIER) || + (entityData->defenseMultipliers[1] < DEFAULT_STAT_MULTIPLIER) || + (entityData->attackStages[0] < DEFAULT_STAT_STAGE) || + (entityData->attackStages[1] < DEFAULT_STAT_STAGE) || + (entityData->defenseStages[0] < DEFAULT_STAT_STAGE) || + (entityData->defenseStages[1] < DEFAULT_STAT_STAGE) || + (entityData->accuracyStages[0]) < DEFAULT_STAT_STAGE || + (entityData->accuracyStages[1] < DEFAULT_STAT_STAGE)) { + spriteStatus = spriteStatus | STATUS_SPRITE_STAT_DOWN; + } + entityData->statusSprites = spriteStatus; + } +} + void sub_8041AD0(struct DungeonEntity *pokemon) { sub_804151C(pokemon, 0xA2 << 1, 1);