summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/npc/phonograph.c169
1 files changed, 165 insertions, 4 deletions
diff --git a/src/npc/phonograph.c b/src/npc/phonograph.c
index 8bde7e7c..3627a725 100644
--- a/src/npc/phonograph.c
+++ b/src/npc/phonograph.c
@@ -3,9 +3,18 @@
#include "functions.h"
#include "fileselect.h"
#include "screen.h"
+#include "common.h"
+#include "flags.h"
+
+#ifdef EU
+void sub_0806EABC(Entity* this);
+#else
+void sub_0806EABC(Entity* this, u32 param);
+#endif
extern void sub_08057044(u32, struct_020227E8*, u32);
extern u32 gUnk_081146B8;
+extern s8 gUnk_081145E4[];
void Phonograph(Entity* this) {
if (this->action == 0) {
@@ -20,15 +29,167 @@ void Phonograph(Entity* this) {
HandleEntity0x82Actions(this);
}
-ASM_FUNC("asm/non_matching/phonograph/sub_0806E964.inc",
- void sub_0806E964(Entity* this, ScriptExecutionContext* context))
+#ifdef EU
+void sub_0806E964(Entity* this, ScriptExecutionContext* context) {
+ if (gInput.newKeys & B_BUTTON) {
+ sub_08050384();
+ return;
+ }
+
+ if (context->unk_18 == 0) {
+ context->unk_18++;
+ this->field_0x6c.HWORD = 0;
+ sub_0806EABC(this);
+ }
+
+ if (gInput.unk4 & 0xc0) {
+ s32 val2, val3;
+ s32 val = (s16)this->field_0x68.HWORD;
+ if (gInput.unk4 & 0x40) {
+ val++;
+ } else {
+ val--;
+ }
+
+ if (val <= 0) {
+ val = 1;
+ }
+
+ val2 = 0x1c;
+ if (CheckGlobalFlag(0x55)) {
+ val2 = 0x34;
+ }
+
+ if (val > val2) {
+ val = val2;
+ }
+
+ this->field_0x68.HWORD = val;
+ sub_0806EABC(this);
+ if ((s16)this->field_0x6c.HWORD > 0) {
+ this->field_0x6c.HWORD--;
+ }
+ }
+
+ if (gInput.newKeys & A_BUTTON) {
+ if ((s16)this->field_0x68.HWORD != (s16)this->field_0x6a.HWORD || (s16)this->field_0x6c.HWORD == 0) {
+ s8* ptr2 = gUnk_081145E4;
+ s32 field_0x68;
+ SoundReq(*(s16*)(ptr2 + (s16)this->field_0x68.HWORD * 4));
+ this->field_0x6a.HWORD = this->field_0x68.HWORD;
+ field_0x68 = (s16)this->field_0x68.HWORD * 4;
+ ptr2 += 2;
+ this->field_0x6c.HWORD = *(s16*)(((ptr2 + field_0x68)));
+ } else {
+ SoundReq(SONG_STOP_ALL);
+ this->field_0x6a.HWORD = 0;
+ }
+ }
+
+ if ((s16)this->field_0x6c.HWORD > 0) {
+ if ((s16)-- this->field_0x6c.HWORD <= 0) {
+ this->field_0x6a.HWORD = 0;
+ this->field_0x6c.HWORD = 0;
+ }
+ }
+
+ gActiveScriptInfo.commandSize = 0;
+}
+#else
+void sub_0806E964(Entity* this, ScriptExecutionContext* context) {
+ s32 val, val2, val3;
+ if (gInput.newKeys & B_BUTTON) {
+ sub_08050384();
+ return;
+ }
+
+ if (context->unk_18 == 0) {
+ context->unk_18++;
+ this->field_0x6c.HWORD = 0;
+ sub_0806EABC(this, (s16)this->field_0x68.HWORD);
+ }
+
+ val2 = 0x1c;
+ if (CheckGlobalFlag(0x55)) {
+ val2 = 0x34;
+ }
+ val = (s16)this->field_0x68.HWORD;
+ if (gInput.newKeys & 0xc0) {
+ if (gInput.newKeys & 0x40) {
+ val++;
+ } else {
+ val--;
+ }
+
+ if (val <= 0) {
+ val = val2;
+ }
+
+ if (val > val2) {
+ val = 1;
+ }
+ } else if (gInput.unk4 & 0xc0) {
+ if (gInput.unk4 & 0x40) {
+ val++;
+ } else {
+ val--;
+ }
+
+ if (val <= 0) {
+ val = 1;
+ }
+
+ if (val > val2) {
+ val = val2;
+ }
+ }
+
+ if (val != (s16)this->field_0x68.HWORD) {
+ sub_0806EABC(this, val);
+ if ((s16)this->field_0x6c.HWORD > 0) {
+ this->field_0x6c.HWORD--;
+ }
+ }
+
+ this->field_0x68.HWORD = val;
+
+ if (gInput.newKeys & A_BUTTON) {
+ if ((s16)this->field_0x68.HWORD != (s16)this->field_0x6a.HWORD || (s16)this->field_0x6c.HWORD == 0) {
+ s8* ptr2 = gUnk_081145E4;
+ s32 field_0x68;
+ SoundReq(*(s16*)(ptr2 + (s16)this->field_0x68.HWORD * 4));
+ this->field_0x6a.HWORD = this->field_0x68.HWORD;
+ field_0x68 = (s16)this->field_0x68.HWORD * 4;
+ ptr2 += 2;
+ this->field_0x6c.HWORD = *(s16*)(((ptr2 + field_0x68)));
+ } else {
+ SoundReq(SONG_STOP_ALL);
+ this->field_0x6a.HWORD = 0;
+ }
+ }
+
+ if ((s16)this->field_0x6c.HWORD > 0) {
+ if ((s16)-- this->field_0x6c.HWORD <= 0) {
+ this->field_0x6a.HWORD = 0;
+ this->field_0x6c.HWORD = 0;
+ }
+ }
+
+ gActiveScriptInfo.commandSize = 0;
+}
+#endif
#ifdef EU
-ASM_FUNC("asm/non_matching/eu/sub_0806EABC.inc", void sub_0806EABC(Entity* this, u32 param))
+void sub_0806EABC(Entity* this) {
+ sub_08050384();
+ sub_08057044((s16)this->field_0x68.HWORD, gUnk_020227E8, 0x202020);
+ sub_0805F46C(0x3302, &gUnk_081146B8);
+ gScreen.bg0.updated = 1;
+}
#else
void sub_0806EABC(Entity* this, u32 param) {
sub_08050384();
- sub_08057044(param, &gUnk_020227E8[0], 0x202020);
+ sub_08057044(param, gUnk_020227E8, 0x202020);
sub_0805F46C(0x3302, &gUnk_081146B8);
gScreen.bg0.updated = 1;
}