decompile noddy

This commit is contained in:
Zhengwen Jiang 2021-11-21 00:12:47 -06:00 committed by Cleverking2003
parent 67279ecd35
commit d2e736f704
8 changed files with 238 additions and 1130 deletions

File diff suppressed because it is too large Load Diff

9
include/noddy.h Normal file
View File

@ -0,0 +1,9 @@
#ifndef GUARD_NODDY_H
#define GUARD_NODDY_H
#include "global.h"
#include "data.h"
void *CreateNoddy(struct Object *, u8);
#endif

View File

@ -243,6 +243,23 @@
Macro_08107BA8_3(objBase, sprite); \
})
#define Macro_081050E8(obj4 /* objBase */, sprite, param, cond) \
({ \
if (gKirbys[gUnk_0203AD3C].base.base.unk60__42 == (obj4)->unk60__42) \
{ \
if (cond) \
{ \
(sprite)->unk1F = sub_0803DF24(param); \
if ((sprite)->unk1F == 0xFF) \
(sprite)->unk1F = sub_0803DFAC((param), 0); \
} \
} \
else \
(sprite)->unk1F = 0; \
})
void ObjectMain(void);
void ObjectDestroy(struct Task *);
void InitObject(struct Object2 *, struct Object *, u8);

7
include/parasol.h Normal file
View File

@ -0,0 +1,7 @@
#ifndef GUARD_PARASOL_H
#define GUARD_PARASOL_H
#include "global.h"
#include "data.h"
#endif

View File

@ -346,7 +346,8 @@ SECTIONS {
src/giant_rocky.o(.text);
src/foley.o(.text);
asm/shooty.o(.text);
asm/noddy.o(.text);
src/noddy.o(.text);
src/parasol.o(.text);
asm/parasol.o(.text);
asm/hot_head.o(.text);
src/sparky.o(.text);

View File

@ -3104,21 +3104,6 @@ void sub_08104E04(struct DarkMindForm1 *r4)
}
}
#define Macro_081050E8(obj4 /* objBase */, sprite, param, cond) \
({ \
if (gKirbys[gUnk_0203AD3C].base.base.unk60__42 == (obj4)->unk60__42) \
{ \
if (cond) \
{ \
(sprite)->unk1F = sub_0803DF24(param); \
if ((sprite)->unk1F == 0xFF) \
(sprite)->unk1F = sub_0803DFAC((param), 0); \
} \
} \
else \
(sprite)->unk1F = 0; \
})
void sub_081050E8(struct Object2 *r5, u8 r7)
{
struct Task *t = TaskCreate(sub_08105278, sizeof(struct Object4), 0x3500, 0x10, sub_0803DCCC);

190
src/noddy.c Normal file
View File

@ -0,0 +1,190 @@
#include "object.h"
#include "noddy.h"
#include "functions.h"
static void sub_080C233C(struct Object2 *);
static void sub_080C2438(struct Object2 *);
static void sub_080C25CC(void);
static void sub_080C2900(struct Object2 *);
static void sub_080C2914(struct Object2 *);
static void sub_080C293C(struct Object2 *);
static void sub_080C2950(struct Object2 *);
static void sub_080C2978(struct Object2 *);
static void sub_080C2994(struct Object2 *);
static void sub_080C29A4(struct Object2 *);
void *CreateNoddy(struct Object *r6, u8 r4) {
struct Task *t = TaskCreate(ObjectMain, sizeof(struct Object2), 0x1000, 0x10, ObjectDestroy);
struct Object2 *r0, *r5 = TaskGetStructPtr(t, r0);
InitObject(r5, r6, r4);
if (r5->base.x > r5->kirby3->base.base.x)
r5->base.flags |= 1;
else
r5->base.flags &= ~1;
sub_0803E2B0(&r5->base, -5, -6, 5, 5);
sub_0803E308(&r5->base, -6, -7, 6, 7);
ObjectInitSprite(r5);
switch (r6->subtype1) {
case 0:
gUnk_08351648[r5->type].unk10(r5);
break;
case 1:
sub_080C2978(r5);
break;
}
r5->unk9E = 0;
r5->unk7C = 0;
return r5;
}
static void sub_080C22E4(struct Object2 *r4) {
if (r4->object->subtype1 == 1) {
sub_080C2978(r4);
} else {
ObjectSetFunc(r4, 0, sub_080C233C);
r4->base.xspeed = 0x80;
r4->base.xspeed <<= r4->subtype;
if (r4->subtype) r4->unk83 = 1;
if (r4->base.flags & 1)
r4->base.xspeed = -r4->base.xspeed;
}
}
static void sub_080C233C(struct Object2 *r4) {
r4->base.flags |= 4;
if (r4->base.unk62 & 1) {
r4->base.flags ^= 1;
r4->base.xspeed = -r4->base.xspeed;
}
if (r4->base.unk62 & 4 && sub_0809D998(r4)) {
r4->base.flags ^= 1;
r4->base.xspeed = -r4->base.xspeed;
}
if (r4->base.counter > 120 << r4->subtype)
sub_080C2900(r4);
++r4->base.counter;
}
static void sub_080C23B0(struct Object2 *r4) {
r4->base.flags |= 4;
if (r4->base.flags & 2)
r4->kirby3 = sub_0803D368(r4);
if (r4->base.counter > 226)
sub_080C293C(r4);
if (r4->subtype && r4->base.counter > 120
&& abs(r4->kirby3->base.base.x - r4->base.x) < 0x6000)
sub_080C293C(r4);
if (r4->base.unk1 == 0x30)
sub_080C2438(r4);
++r4->base.counter;
}
static void sub_080C2438(struct Object2 *r6) {
struct Task *t = TaskCreate(sub_080C25CC, sizeof(struct Object4), 0x3500, 0x10, sub_0803DCCC);
struct Object4 *r0, *r4 = TaskGetStructPtr(t, r0);
sub_0803E3B0(r4);
r4->unk0 = 3;
r4->unk34 = r6->base.x;
r4->unk38 = r6->base.y;
r4->unk44 = r6;
r4->unk60__42 = r6->base.unk60__42;
r4->unk3C = 0x20;
r4->unk3E = 0x40;
if (r6->base.flags & 1) {
r4->unk34 += 0xC00;
r4->unk3C = -r4->unk3C;
} else {
r4->flags |= 1;
r4->unk34 -= 0xC00;
}
if (Macro_0810B1F4(&r6->base))
r4->flags |= 0x2000;
sub_080709F8(r4, &r4->unkC, 1, 0x322, 6, 12);
r4->unkC.unk1F = 0;
if (r6->base.unkC & 0x10)
Macro_081050E8(r4, &r4->unkC, gUnk_08351648[0x32].unk8, 1);
else
Macro_081050E8(r4, &r4->unkC, 0x322, 1);
}
static void sub_080C25CC(void) {
struct Object4 *r0, *r5 = TaskGetStructPtr(gCurTask, r0);
struct Object2 *r6 = r5->unk44, *r3;
struct Sprite sprite;
if (r5->flags & 0x1000) {
TaskDestroy(gCurTask);
return;
}
Macro_08107BA8_4(r5, &r5->unkC, &sprite, 1, &r5->unkC);
if (r6->base.unkC & 0x10)
Macro_081050E8(r5, &r5->unkC, gUnk_08351648[0x32].unk8, !r5->unkC.unk1F);
else
Macro_081050E8(r5, &r5->unkC, 0x322, !r5->unkC.unk1F);
r3 = r5->unk44;
if (r3) {
if (r3->base.unk0 && r3->base.flags & 0x1000) {
r5->unk44 = NULL;
r3 = NULL;
}
if (!r3)
goto _080C27E4;
if (Macro_0810B1F4(&r3->base) && !(r5->flags & 0x2000)) {
sub_0803DBC8(r5);
return;
}
}
else {
_080C27E4:
KirbySomething(r5);
}
Macro_0809E55C(r5);
if (++r5->unk4 > 0x30) {
r5->flags |= 0x1000;
} else {
if (!(r5->flags & 0x800)) {
r5->unk34 += r5->unk3C;
r5->unk38 -= r5->unk3E;
}
sub_0806FAC8(r5);
}
}
static void sub_080C2900(struct Object2 *r0) {
ObjectSetFunc(r0, 2, sub_080C2914);
}
static void sub_080C2914(struct Object2 *r4) {
r4->base.xspeed = 0;
if (r4->base.flags & 2)
sub_080C29A4(r4);
++r4->base.counter;
}
static void sub_080C293C(struct Object2 *r0) {
ObjectSetFunc(r0, 2, sub_080C2950);
}
static void sub_080C2950(struct Object2 *r4) {
r4->base.xspeed = 0;
if (r4->base.flags & 2)
sub_080C22E4(r4);
++r4->base.counter;
}
static void sub_080C2978(struct Object2 *r4) {
ObjectSetFunc(r4, 3, sub_080C2994);
r4->base.yspeed = 0;
}
static void sub_080C2994(struct Object2 *r0) {
r0->base.flags |= 4;
r0->base.xspeed = 0;
}
static void sub_080C29A4(struct Object2 *r4) {
ObjectSetFunc(r4, 3, sub_080C23B0);
r4->base.xspeed = 0;
}

13
src/parasol.c Normal file
View File

@ -0,0 +1,13 @@
#include "object.h"
#include "parasol.h"
#include "functions.h"
void sub_080C29C0(struct Object2 *r5, u8 r8) {
s16 x = r5->base.x >> 8;
s16 y = r5->base.y >> 8;
CreateObjTemplateAndObjWithSettingParent(r5, 1, 36, x, y,
0, 31, 0, 0, OBJ_PARASOL, r8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
}
// TODO: decompile parasol.s