From f03e66dd33f30fd43a12f3aa69a8fc93b80012f1 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 8 Mar 2025 15:45:24 +0100 Subject: [PATCH] sub_8041500 --- asm/code_8040094.s | 499 ------------------------------------------- src/code_8040094_1.c | 210 ++++++++++++++++++ 2 files changed, 210 insertions(+), 499 deletions(-) diff --git a/asm/code_8040094.s b/asm/code_8040094.s index 6299338d8..2824379e2 100644 --- a/asm/code_8040094.s +++ b/asm/code_8040094.s @@ -7,505 +7,6 @@ - thumb_func_start sub_8041168 -sub_8041168: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x18 - mov r8, r0 - adds r6, r1, 0 - adds r7, r2, 0 - mov r9, r3 - adds r1, r7, 0 - bl sub_804143C - adds r5, r0, 0 - cmp r5, 0 - beq _0804118A - movs r5, 0x1 -_0804118A: - ldrh r4, [r7, 0x2] - mov r0, r8 - bl GetApparentWeather - adds r1, r0, 0 - lsls r1, 24 - lsrs r1, 24 - adds r0, r4, 0 - adds r2, r5, 0 - bl sub_80412E0 - lsls r0, 16 - lsrs r0, 16 - mov r10, r0 - bl sub_800ECB8 - movs r1, 0x4 - ldrsh r5, [r0, r1] - movs r2, 0 - str r2, [sp, 0x14] - adds r0, r6, 0 - bl EntityIsValid - lsls r0, 24 - cmp r0, 0 - beq _080411CA - ldr r0, [r6, 0x70] - str r0, [sp, 0x14] - adds r0, r6, 0 - bl sub_8042768 - b _080411D0 -_080411CA: - mov r0, r9 - bl sub_803F428 -_080411D0: - lsls r0, 24 - cmp r0, 0 - beq _080412CE - mov r0, r8 - adds r1, r7, 0 - bl sub_80414C0 - lsls r0, 24 - lsrs r4, r0, 24 - cmp r4, 0 - bne _080412CE - cmp r5, 0 - beq _080412CE - adds r0, r5, 0 - bl sub_800ECA4 - ldr r5, [r0, 0x1C] - movs r0, 0x1 - negs r0, r0 - cmp r5, r0 - beq _08041216 - adds r0, r6, 0 - bl EntityIsValid - lsls r0, 24 - cmp r0, 0 - beq _08041216 - add r0, sp, 0x8 - adds r1, r6, 0 - adds r1, 0x28 - lsls r2, r5, 24 - lsrs r2, 24 - bl sub_800569C - b _08041218 -_08041216: - str r4, [sp, 0x8] -_08041218: - mov r0, sp - mov r1, r10 - strh r1, [r0] - ldr r2, [sp, 0x14] - cmp r2, 0 - beq _08041248 - mov r1, sp - ldrh r0, [r2, 0x4] - strh r0, [r1, 0x2] - ldr r0, [r6, 0xC] - cmp r0, 0 - bge _08041232 - adds r0, 0xFF -_08041232: - asrs r0, 8 - strh r0, [r1, 0x4] - mov r1, sp - ldr r0, [r6, 0x10] - cmp r0, 0 - bge _08041240 - adds r0, 0xFF -_08041240: - asrs r0, 8 - strh r0, [r1, 0x6] - movs r0, 0 - b _0804128C -_08041248: - mov r1, sp - movs r0, 0x1 - strh r0, [r1, 0x2] - mov r0, r9 - movs r2, 0 - ldrsh r1, [r0, r2] - lsls r0, r1, 1 - adds r0, r1 - lsls r0, 11 - mov r1, sp - movs r2, 0xC0 - lsls r2, 4 - adds r0, r2 - cmp r0, 0 - bge _08041268 - adds r0, 0xFF -_08041268: - asrs r0, 8 - strh r0, [r1, 0x4] - mov r0, r9 - movs r2, 0x2 - ldrsh r1, [r0, r2] - lsls r0, r1, 1 - adds r0, r1 - lsls r0, 11 - mov r1, sp - movs r2, 0x80 - lsls r2, 5 - adds r0, r2 - cmp r0, 0 - bge _08041286 - adds r0, 0xFF -_08041286: - asrs r0, 8 - strh r0, [r1, 0x6] - ldr r0, [sp, 0x14] -_0804128C: - str r0, [sp, 0xC] - movs r0, 0 - str r0, [sp, 0x10] - mov r0, sp - bl sub_8041500 - mov r0, r10 - bl sub_800EEE0 - bl sub_800EF64 - mov r0, sp - bl sub_800EBC8 - adds r4, r0, 0 - movs r0, 0x5B - bl sub_803E46C - adds r0, r4, 0 - adds r1, r6, 0 - movs r2, 0x6 - bl sub_8042DD4 - b _080412C2 -_080412BC: - movs r0, 0x28 - bl sub_803E46C -_080412C2: - adds r0, r4, 0 - bl sub_800E9A8 - lsls r0, 24 - cmp r0, 0 - bne _080412BC -_080412CE: - add sp, 0x18 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - thumb_func_end sub_8041168 - - thumb_func_start sub_80412E0 -sub_80412E0: - push {r4,lr} - lsls r0, 16 - lsrs r4, r0, 16 - lsls r1, 24 - lsrs r0, r1, 24 - adds r3, r4, 0 - cmp r3, 0x1F - bne _08041344 - cmp r0, 0x7 - bls _080412F6 - b _080413F6 -_080412F6: - lsls r0, 2 - ldr r1, _08041300 - adds r0, r1 - ldr r0, [r0] - mov pc, r0 - .align 2, 0 -_08041300: .4byte _08041304 - .align 2, 0 -_08041304: - .4byte _080413F4 - .4byte _08041324 - .4byte _0804132A - .4byte _080413F4 - .4byte _08041334 - .4byte _0804133A - .4byte _080413F4 - .4byte _0804133A -_08041324: - movs r3, 0xCF - lsls r3, 1 - b _080413F6 -_0804132A: - ldr r3, _08041330 - b _080413F6 - .align 2, 0 -_08041330: .4byte 0x000001a1 -_08041334: - movs r3, 0xD0 - lsls r3, 1 - b _080413F6 -_0804133A: - ldr r3, _08041340 - b _080413F6 - .align 2, 0 -_08041340: .4byte 0x0000019f -_08041344: - cmp r2, 0 - beq _080413F6 - cmp r3, 0x97 - beq _080413B4 - cmp r3, 0x97 - bgt _0804136C - cmp r3, 0x3C - beq _0804139C - cmp r3, 0x3C - bgt _08041362 - cmp r3, 0x8 - beq _08041396 - cmp r3, 0x19 - beq _080413E4 - b _080413F4 -_08041362: - cmp r3, 0x4B - beq _080413A4 - cmp r3, 0x64 - beq _080413AA - b _080413F4 -_0804136C: - cmp r3, 0xCD - beq _080413CA - cmp r3, 0xCD - bgt _0804137E - cmp r3, 0x99 - beq _080413BA - cmp r3, 0x9C - beq _080413C4 - b _080413F4 -_0804137E: - cmp r3, 0xED - beq _080413DA - cmp r3, 0xED - bgt _0804138C - cmp r3, 0xE3 - beq _080413EA - b _080413F4 -_0804138C: - movs r0, 0xAE - lsls r0, 1 - cmp r3, r0 - beq _080413D4 - b _080413F4 -_08041396: - movs r3, 0xD1 - lsls r3, 1 - b _080413F6 -_0804139C: - ldr r3, _080413A0 - b _080413F6 - .align 2, 0 -_080413A0: .4byte 0x000001a3 -_080413A4: - movs r3, 0xD2 - lsls r3, 1 - b _080413F6 -_080413AA: - ldr r3, _080413B0 - b _080413F6 - .align 2, 0 -_080413B0: .4byte 0x000001a5 -_080413B4: - movs r3, 0xD3 - lsls r3, 1 - b _080413F6 -_080413BA: - ldr r3, _080413C0 - b _080413F6 - .align 2, 0 -_080413C0: .4byte 0x000001a7 -_080413C4: - movs r3, 0xD4 - lsls r3, 1 - b _080413F6 -_080413CA: - ldr r3, _080413D0 - b _080413F6 - .align 2, 0 -_080413D0: .4byte 0x000001a9 -_080413D4: - movs r3, 0xD5 - lsls r3, 1 - b _080413F6 -_080413DA: - ldr r3, _080413E0 - b _080413F6 - .align 2, 0 -_080413E0: .4byte 0x000001ab -_080413E4: - movs r3, 0xD6 - lsls r3, 1 - b _080413F6 -_080413EA: - ldr r3, _080413F0 - b _080413F6 - .align 2, 0 -_080413F0: .4byte 0x000001ad -_080413F4: - adds r3, r4, 0 -_080413F6: - adds r0, r3, 0 - pop {r4} - pop {r1} - bx r1 - thumb_func_end sub_80412E0 - - thumb_func_start sub_8041400 -sub_8041400: - push {lr} - lsls r0, 16 - lsrs r0, 16 - lsls r1, 24 - lsrs r1, 24 - bl sub_80412E0 - lsls r0, 16 - lsrs r0, 16 - bl sub_800ED20 - pop {r1} - bx r1 - thumb_func_end sub_8041400 - - thumb_func_start sub_804141C -sub_804141C: - push {lr} - lsls r0, 16 - lsrs r0, 16 - lsls r1, 24 - lsrs r1, 24 - bl sub_80412E0 - lsls r0, 16 - lsrs r0, 16 - bl sub_800EC84 - lsls r0, 24 - lsrs r0, 24 - pop {r1} - bx r1 - thumb_func_end sub_804141C - - thumb_func_start sub_804143C -sub_804143C: - push {r4,r5,lr} - adds r4, r0, 0 - adds r5, r1, 0 - ldrh r0, [r5, 0x2] - cmp r0, 0xED - bne _08041476 - adds r0, r4, 0 - bl EntityIsValid - lsls r0, 24 - cmp r0, 0 - beq _080414A4 - adds r0, r4, 0 - bl GetEntityType - cmp r0, 0x1 - bne _080414A4 - ldr r1, [r4, 0x70] - adds r0, r1, 0 - adds r0, 0x5C - ldrb r0, [r0] - cmp r0, 0xE - beq _080414A0 - adds r0, r1, 0 - adds r0, 0x5D - ldrb r0, [r0] - cmp r0, 0xE - beq _080414A0 - b _0804148A -_08041476: - cmp r0, 0x19 - beq _0804147E - cmp r0, 0xE3 - bne _0804148E -_0804147E: - adds r0, r4, 0 - bl IsSleeping - lsls r0, 24 - cmp r0, 0 - beq _080414A0 -_0804148A: - movs r0, 0 - b _080414B8 -_0804148E: - cmp r0, 0x97 - bne _080414A4 - adds r0, r4, 0 - bl GetApparentWeather - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x1 - bne _080414A4 -_080414A0: - movs r0, 0x1 - b _080414B8 -_080414A4: - adds r0, r4, 0 - adds r1, r5, 0 - bl MoveMatchesBideClassStatus - adds r1, r0, 0 - lsls r1, 24 - lsrs r1, 24 - negs r0, r1 - orrs r0, r1 - lsrs r0, 31 -_080414B8: - pop {r4,r5} - pop {r1} - bx r1 - thumb_func_end sub_804143C - - thumb_func_start sub_80414C0 -sub_80414C0: - push {r4,r5,lr} - adds r5, r0, 0 - adds r4, r1, 0 - ldrh r0, [r4, 0x2] - cmp r0, 0x9C - bne _080414DC - adds r0, r5, 0 - bl GetTileAtEntitySafe - bl IsTileGround - lsls r0, 24 - cmp r0, 0 - bne _080414F2 -_080414DC: - ldrh r0, [r4, 0x2] - cmp r0, 0x8 - bne _080414F6 - adds r0, r5, 0 - bl GetTileAtEntitySafe - ldrh r1, [r0] - movs r0, 0x3 - ands r0, r1 - cmp r0, 0x1 - beq _080414F6 -_080414F2: - movs r0, 0x1 - b _080414F8 -_080414F6: - movs r0, 0 -_080414F8: - pop {r4,r5} - pop {r1} - bx r1 - thumb_func_end sub_80414C0 - - thumb_func_start sub_8041500 -sub_8041500: - push {lr} - bl sub_800E7D0 - lsls r0, 24 - cmp r0, 0 - beq _08041518 - movs r0, 0x5C - bl sub_803E46C - movs r0, 0x5D - bl sub_8052740 -_08041518: - pop {r0} - bx r0 - thumb_func_end sub_8041500 - thumb_func_start sub_804151C sub_804151C: push {r4-r6,lr} diff --git a/src/code_8040094_1.c b/src/code_8040094_1.c index 01bc18eab..891875abb 100644 --- a/src/code_8040094_1.c +++ b/src/code_8040094_1.c @@ -10,7 +10,10 @@ #include "dungeon_util.h" #include "code_804267C.h" #include "weather.h" +#include "tile_types.h" #include "constants/move_id.h" +#include "constants/weather.h" +#include "constants/type.h" struct UnkStruct_8040094 { @@ -40,6 +43,14 @@ extern bool8 sub_800E9A8(s32 a0); extern void sub_803EA10(void); extern void sub_803E708(s32, u32); extern void sub_800EEF8(u16 a0); +extern bool8 sub_803F428(DungeonPos *pos); +extern void sub_800EEE0(u16 a0); +extern s32 sub_800EBC8(struct UnkStruct_8040094 *a0); +extern bool8 sub_800E7D0(struct UnkStruct_8040094 *a0); +extern s32 sub_800ED20(u16 param_1); +extern u8 sub_800EC84(s32 param_1); +extern bool8 MoveMatchesBideClassStatus(Entity *pokemon, Move *move); +extern bool8 IsSleeping(Entity *pokemon); extern u8 gUnknown_203B40D; extern s16 gUnknown_2026E4E; @@ -273,4 +284,203 @@ void sub_8041108(struct UnkStruct_8040094 *a0, Entity *entity, Move *move, bool3 } } +void sub_8041168(Entity *entity, Entity *entity2, Move *move, DungeonPos *pos) +{ + s32 var2; + s32 var3; + struct UnkStruct_8040094 sp; + bool32 r5 = (sub_804143C(entity, move) != 0); + u16 r10 = sub_80412E0(move->id, GetApparentWeather(entity), r5); + s32 var = sub_800ECB8(r10)->unk4; + EntityInfo *ent2Info = NULL; + + if (EntityIsValid(entity2)) { + ent2Info = GetEntInfo(entity2); + if (!sub_8042768(entity2)) + return; + } + else { + if (!sub_803F428(pos)) + return; + } + + if (sub_80414C0(entity, move)) + return; + if (var == 0) + return; + + var2 = sub_800ECA4(var)->unk1c; + if (var2 != -1) { + if (EntityIsValid(entity2)) { + sub_800569C(&sp.unk8, &entity2->axObj.axdata, var2); + } + else { + sp.unk8 = (DungeonPos) {0}; + } + } + else { + sp.unk8 = (DungeonPos) {0}; + } + + sp.unk0 = r10; + if (ent2Info != NULL) { + sp.unk2 = ent2Info->apparentID; + sp.unk4.x = entity2->pixelPos.x / 256; + sp.unk4.y = entity2->pixelPos.y / 256; + sp.unkC = 0; + } + else { + s32 x, y; + + sp.unk2 = 1; + x = X_POS_TO_PIXELPOS(pos->x); + sp.unk4.x = x / 256; + y = Y_POS_TO_PIXELPOS(pos->y); + sp.unk4.y = y / 256; + sp.unkC = 0; + } + + sp.unk10 = 0; + sub_8041500(&sp); + sub_800EEE0(r10); + sub_800EF64(); + var3 = sub_800EBC8(&sp); + sub_803E46C(0x5B); + sub_8042DD4(var3, entity2, 6); + while (1) { + if (!sub_800E9A8(var3)) + break; + sub_803E46C(0x28); + } +} + +u16 sub_80412E0(u16 moveId, u8 weather, bool32 a2) +{ + u16 ret = moveId; + + if (moveId == MOVE_WEATHER_BALL) { + switch (weather) { + case WEATHER_CLEAR: + case WEATHER_FOG: + case WEATHER_CLOUDY: + ret = moveId; + break; + case WEATHER_SUNNY: + ret = 0x19E; + break; + case WEATHER_SANDSTORM: + ret = 0x1A1; + break; + case WEATHER_RAIN: + ret = 0x1A0; + break; + case WEATHER_HAIL: + case WEATHER_SNOW: + ret = 0x19F; + break; + } + } + else if (a2) { + switch (moveId) { + case MOVE_DIG: + ret = 0x1A2; + break; + case MOVE_RAZOR_WIND: + ret = 0x1A3; + break; + case MOVE_FOCUS_PUNCH: + ret = 0x1A4; + break; + case MOVE_SKY_ATTACK: + ret = 0x1A5; + break; + case MOVE_SOLARBEAM: + ret = 0x1A6; + break; + case MOVE_FLY: + ret = 0x1A7; + break; + case MOVE_DIVE: + ret = 0x1A8; + break; + case MOVE_BOUNCE: + ret = 0x1A9; + break; + case MOVE_SKULL_BASH: + ret = 0x1AA; + break; + case MOVE_CURSE: + ret = 0x1AB; + break; + case MOVE_SNORE: + ret = 0x1AC; + break; + case MOVE_SLEEP_TALK: + ret = 0x1AD; + break; + default: + ret = moveId; + break; + } + } + + return ret; +} + +UNUSED static s32 sub_8041400(u16 moveId, u8 weather, bool32 a2) +{ + return sub_800ED20(sub_80412E0(moveId, weather, a2)); +} + +bool8 sub_804141C(u16 moveId, u8 weather, bool32 a2) +{ + return sub_800EC84(sub_80412E0(moveId, weather, a2)); +} + +bool32 sub_804143C(Entity *entity, Move *move) +{ + if (move->id == MOVE_CURSE) { + if (EntityIsValid(entity) && GetEntityType(entity) == ENTITY_MONSTER) { + if (GetEntInfo(entity)->types[0] == TYPE_GHOST || GetEntInfo(entity)->types[1] == TYPE_GHOST) + return TRUE; + else + return FALSE; + } + } + else if (move->id == MOVE_SNORE || move->id == MOVE_SLEEP_TALK) { + if (!IsSleeping(entity)) + return TRUE; + else + return FALSE; + } + else if (move->id == MOVE_SOLARBEAM) { + if (GetApparentWeather(entity) == WEATHER_SUNNY) + return TRUE; + } + + return MoveMatchesBideClassStatus(entity, move) != FALSE; +} + +bool8 sub_80414C0(Entity *entity, Move *move) +{ + if (move->id == MOVE_DIVE) { + if (IsTileGround(GetTileAtEntitySafe(entity))) + return TRUE; + } + if (move->id == MOVE_DIG) { + if (GetTerrainType(GetTileAtEntitySafe(entity)) != TERRAIN_TYPE_NORMAL) + return TRUE; + } + + return FALSE; +} + +void sub_8041500(struct UnkStruct_8040094 *a0) +{ + if (sub_800E7D0(a0)) { + sub_803E46C(0x5C); + sub_8052740(0x5D); + } +} + //