From 9345f0ad28b45802ebc58e6d450fdbd8a752d77c Mon Sep 17 00:00:00 2001 From: macabeus Date: Sun, 12 Jan 2025 21:26:40 +0000 Subject: [PATCH] Start Enemy Marun --- asm/enemy_marun.s | 95 +------------- ldscript.txt | 1 + src/game/enemies/marun.c | 258 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 261 insertions(+), 93 deletions(-) create mode 100644 src/game/enemies/marun.c diff --git a/asm/enemy_marun.s b/asm/enemy_marun.s index e2184feb..ea87dc18 100644 --- a/asm/enemy_marun.s +++ b/asm/enemy_marun.s @@ -5,99 +5,8 @@ .syntax unified .arm - thumb_func_start CreateEntity_Marun -CreateEntity_Marun: @ 0x080635F8 - push {r4, r5, r6, r7, lr} - mov r7, r8 - push {r7} - sub sp, #8 - mov r8, r0 - adds r5, r1, #0 - adds r6, r2, #0 - adds r4, r3, #0 - lsls r5, r5, #0x10 - lsrs r5, r5, #0x10 - lsls r6, r6, #0x10 - lsrs r6, r6, #0x10 - lsls r4, r4, #0x18 - lsrs r4, r4, #0x18 - ldr r0, _08063674 @ =sub_8063758 - movs r2, #0x84 - lsls r2, r2, #6 - ldr r1, _08063678 @ =sub_8063F08 - str r1, [sp] - movs r1, #0x68 - movs r3, #0 - bl TaskCreate - ldrh r1, [r0, #6] - movs r0, #0xc0 - lsls r0, r0, #0x12 - adds r7, r1, r0 - movs r2, #0 - strb r2, [r7, #4] - strb r4, [r7, #6] - mov r0, r8 - str r0, [r7] - ldrb r0, [r0] - strb r0, [r7, #7] - strb r2, [r7, #8] - movs r3, #0 - strh r5, [r7, #0xc] - strh r6, [r7, #0xe] - mov r4, r8 - ldrb r1, [r4] - lsls r1, r1, #0xb - str r1, [r7, #0x24] - ldrb r0, [r4, #1] - lsls r0, r0, #0xb - str r0, [r7, #0x28] - str r1, [r7, #0x1c] - str r0, [r7, #0x20] - strh r2, [r7, #0x10] - strb r3, [r7, #9] - movs r0, #0x80 - lsls r0, r0, #2 - str r0, [r7, #0x14] - str r2, [r7, #0x18] - strh r2, [r7, #0x12] - strb r3, [r7, #5] - ldrb r1, [r4, #7] - movs r0, #8 - ands r0, r1 - cmp r0, #0 - beq _0806367C - movs r0, #0xff - b _0806367E - .align 2, 0 -_08063674: .4byte sub_8063758 -_08063678: .4byte sub_8063F08 -_0806367C: - movs r0, #1 -_0806367E: - strb r0, [r7, #0xa] - add r1, sp, #4 - movs r0, #0 - strh r0, [r1] - adds r1, r7, #0 - adds r1, #0x64 - ldr r2, _080636B0 @ =0x01000002 - add r0, sp, #4 - bl CpuSet - adds r0, r7, #0 - bl sub_80636B4 - movs r1, #2 - rsbs r1, r1, #0 - adds r0, r1, #0 - mov r4, r8 - strb r0, [r4] - add sp, #8 - pop {r3} - mov r8, r3 - pop {r4, r5, r6, r7} - pop {r0} - bx r0 - .align 2, 0 -_080636B0: .4byte 0x01000002 +.if 0 +.endif thumb_func_start sub_80636B4 sub_80636B4: @ 0x080636B4 diff --git a/ldscript.txt b/ldscript.txt index 29f4ce28..2cb8aee8 100644 --- a/ldscript.txt +++ b/ldscript.txt @@ -121,6 +121,7 @@ SECTIONS { build/sa3/src/game/enemies/minimole.o(.text); build/sa3/src/game/enemies/takkon.o(.text); build/sa3/src/game/enemies/jousun.o(.text); + build/sa3/src/game/enemies/marun.o(.text); build/sa3/asm/enemy_unknown_code.o(.text); build/sa3/asm/enemy_uutsubo.o(.text); build/sa3/src/game/enemies/gaogao.o(.text); diff --git a/src/game/enemies/marun.c b/src/game/enemies/marun.c new file mode 100644 index 00000000..204d0470 --- /dev/null +++ b/src/game/enemies/marun.c @@ -0,0 +1,258 @@ +#include "global.h" +#include "sprite.h" +#include "task.h" +#include "trig.h" +#include "malloc_vram.h" +#include "game/camera.h" +#include "game/entity.h" +#include "game/enemy_unknown.h" +#include "game/player.h" +#include "game/stage.h" + +#include "constants/animations.h" +#include "constants/anim_sizes.h" + +typedef struct { + /* 0x00 */ MapEntity *me; + /* 0x04 */ u8 unk4; + /* 0x05 */ u8 unk5; + /* 0x06 */ u8 id; + /* 0x07 */ u8 spriteX; + /* 0x08 */ u8 unk8; + /* 0x09 */ u8 unk9; + /* 0x0A */ u8 direction; + /* 0x0B */ u16 region[2]; + /* 0x0F */ u16 rotation; + /* 0x12 */ u16 unk12; + /* 0x14 */ s32 unk14; + /* 0x18 */ s32 unk18; + /* 0x1C */ Vec2_32 qUnk1C; + /* 0x24 */ Vec2_32 qPos; + /* 0x2C */ SpriteTransform transform; + /* 0x38 */ Sprite s; + /* 0x60 */ Hitbox reserved; +} Marun; /* size: 0x68 */ + +// extern const TileInfo2 gUnknown_080D210C[]; + +// void TaskDestructor_Marun(struct Task *t); +void sub_8063F08(struct Task *t); +// u32 sub_8063C98(void* base); +// bool32 sub_8063EDC(Marun *enemy, EnemyUnknownStruc0 *param1); +// void sub_8063858(void); +// s32 sub_8063E5C(Marun *enemy); + +// static void Task_Marun0() {} +// void Task_MarunInit(void); +void sub_8063758(void); + +//static void InitSprite(Marun *enemy) {} +void sub_8063FE0(Marun *enemy); + +// https://decomp.me/scratch/x6Qwh +void CreateEntity_Marun(MapEntity *me, u16 regionX, u16 regionY, u8 id) +{ + struct Task *t = TaskCreate( + sub_8063758, // Task_MarunInit, + sizeof(Marun), + 0x2100, + 0, + sub_8063F08 // TaskDestructor_Marun + ); + + Marun *enemy = TASK_DATA(t); + s32 qX, qY; + + enemy->unk4 = 0; + enemy->id = id; + enemy->me = me; + enemy->spriteX = me->x; + enemy->unk8 = 0; + enemy->region[0] = regionX; + enemy->region[1] = regionY; + + qX = Q(me->x * TILE_WIDTH); + enemy->qPos.x = qX; + qY = Q(me->y * TILE_WIDTH); + enemy->qPos.y = qY; + + enemy->qUnk1C.x = qX; + enemy->qUnk1C.y = qY; + + enemy->rotation = 0; + enemy->unk9 = 0; + enemy->unk14 = 0x80 << 2; + enemy->unk18 = 0; + enemy->unk12 = 0; + enemy->unk5 = 0; + + if (me->d.uData[4] & 0x8) { + enemy->direction = -1; + } else { + enemy->direction = +1; + } + + CpuFill16(0, &enemy->reserved.b.left, sizeof(enemy->reserved.b)); + + sub_8063FE0(enemy); + + SET_MAP_ENTITY_INITIALIZED(me); +} + +// https://decomp.me/scratch/LwjhM +// bool32 sub_8063D38(void* param) { +// EnemyUnknownStruc0 unk; +// bool32 result; + +// if (*(u8*)(param + 8) != 1) { +// // Subtract 0x10 from bytes at various offsets +// *(u8*)(param + 0x5C) -= 0x10; +// *(u8*)(param + 0x5D) -= 0x10; +// *(u8*)(param + 0x5E) -= 0x10; +// *(u8*)(param + 0x5F) -= 0x10; +// *(u8*)(param + 0x64) -= 0x10; +// *(u8*)(param + 0x65) -= 0x10; +// *(u8*)(param + 0x66) -= 0x10; +// *(u8*)(param + 0x67) -= 0x10; +// } + +// if (*(u8*)(param + 8) == 1) { +// // Set specific values at offsets +// *(u8*)(param + 0x5C) = 0xFC; +// *(u8*)(param + 0x5D) = 0xFC; +// *(u8*)(param + 0x5E) = 4; +// *(u8*)(param + 0x5F) = 4; +// } + +// // Setup EnemyUnknownStruc0 fields +// unk.unk4 = sub_8063EDC(param, &unk); +// unk.spr = param + 0x38; +// unk.posX = *(int*)(param + 0x1C); +// unk.posY = *(int*)(param + 0x20); +// unk.regionX = *(uint16_t*)(param + 0xC); +// unk.regionY = *(uint16_t*)(param + 0xE); +// unk.me = *(void**)(param); +// *(u8*)((char*)&unk + 8) = *(u8*)(param + 7); + +// result = sub_805C280(&unk); + +// if (*(u8*)(param + 8) != 1) { +// // Add 0x10 to bytes at various offsets +// *(u8*)(param + 0x5C) += 0x10; +// *(u8*)(param + 0x5D) += 0x10; +// *(u8*)(param + 0x5E) += 0x10; +// *(u8*)(param + 0x5F) += 0x10; +// *(u8*)(param + 0x64) += 0x10; +// *(u8*)(param + 0x65) += 0x10; +// *(u8*)(param + 0x66) += 0x10; +// *(u8*)(param + 0x67) += 0x10; +// } + +// if (*(u8*)(param + 8) == 1) { +// // Zero out bytes at offsets +// *(u8*)(param + 0x5C) = 0; +// *(u8*)(param + 0x5D) = 0; +// *(u8*)(param + 0x5E) = 0; +// *(u8*)(param + 0x5F) = 0; +// } + +// return result; +// } + +// // https://decomp.me/scratch/ednnh +// void Task_MarunInit(void) { // sub_8063758 +// Marun *enemy = TASK_DATA(gCurTask); + +// sub_805CD70(&enemy->qPos, &enemy->qUnk1C, enemy->region, &enemy->unk9); + +// if ((gStageData.unk4 != 1) && (gStageData.unk4 != 2) && (gStageData.unk4 != 4)) { +// u32 result = sub_8063C98(enemy); + +// if ((result == 1) && ((enemy->unk4 == 0) && (enemy->unk5 == 0))) { +// // u8 temp = 0; +// Sprite *sprite; +// sprite = &enemy->s; + +// sprite->anim = gUnknown_080D210C[1].anim; +// sprite->variant = gUnknown_080D210C[1].variant; +// sprite->prevVariant = 0xFF; + +// // Clear two sections of memory using CpuSet +// CpuFill16(0, &enemy->reserved.b, sizeof(Rect8)); +// CpuFill16(0, &enemy->s.hitboxes[0].b, sizeof(Rect8)); + +// UpdateSpriteAnimation(sprite); + +// enemy->unk8 = result; +// gCurTask->main = sub_8063858; +// return; +// } +// } + +// if (sub_8063D38(enemy) == TRUE) { +// TaskDestroy(gCurTask); +// return; +// } + +// sub_8063E5C(enemy); +// } + +// // https://decomp.me/scratch/GCw5n +// bool32 sub_8063EDC(Marun *enemy, EnemyUnknownStruc0 *param1) +// { +// Sprite *s; + +// param1->me = NULL; +// param1->spriteX = 0; +// param1->unk4 = 0; + +// s = &enemy->s; +// param1->spr = s; +// param1->posX = enemy->qPos.x; +// param1->posY = enemy->qPos.y; +// param1->regionX = enemy->region[0]; +// param1->regionY = enemy->region[1]; + +// return sub_805C63C(param1); +// } + +// // https://decomp.me/scratch/2VR0x +// s32 sub_8063E5C(Marun *enemy) { +// s32 result; +// Sprite *s = &enemy->s; +// SpriteTransform *transform = &enemy->transform; +// s32 screenX, screenY; + +// // Calculate screen coordinates relative to camera +// screenX = I(enemy->qPos.x) + (enemy->region[0] * CAM_REGION_WIDTH); +// s->x = screenX - gCamera.x; + +// screenY = I(enemy->qPos.y) + (enemy->region[1] * CAM_REGION_WIDTH); +// s->y = screenY - gCamera.y; + +// // Special y-position adjustment based on sprite state +// if (s->anim == gUnknown_080D210C[2].anim && +// s->variant == gUnknown_080D210C[2].variant) { +// s->y -= 0xB; // Subtract 11 pixels +// } else { +// s->y += 6; // Add 6 pixels +// } + +// // Update transform data +// transform->rotation = enemy->rotation; +// transform->x = s->x; +// transform->y = s->y; + +// // Apply transformations and update sprite +// TransformSprite(s, transform); +// result = UpdateSpriteAnimation(s); +// DisplaySprite(s); + +// return result; +// } + +// // https://decomp.me/scratch/laLdi +// void TaskDestructor_Marun(struct Task *t) { // sub_8063F08 +// Marun *enemy = TASK_DATA(t); +// VramFree(enemy->s.tiles); +// }