summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTal Hayon <talhayon1@gmail.com>2022-02-14 06:25:19 +0200
committerTal Hayon <talhayon1@gmail.com>2022-02-14 06:25:19 +0200
commit03c6c4a8a8548274a75b41ffe93aa7aba3ed0cc0 (patch)
treef867f947e0769cf13d9d9276c70deac5274d027b /src
parent8a2a8f620726095faddca2ebfa775a92d4438a0c (diff)
Decompile stockwell asm_funcs
Diffstat (limited to 'src')
-rw-r--r--src/npc/stockwell.c128
-rw-r--r--src/script.c2
2 files changed, 124 insertions, 6 deletions
diff --git a/src/npc/stockwell.c b/src/npc/stockwell.c
index 16d7b5f7..dced086b 100644
--- a/src/npc/stockwell.c
+++ b/src/npc/stockwell.c
@@ -6,12 +6,16 @@
#include "npc.h"
#include "object.h"
#include "item.h"
+#include "game.h"
extern void (*const gUnk_0810FDC8[])(Entity*);
-
extern void (*const gUnk_0810FDA4[])(Entity*);
+extern u16 script_StockwellBuy[];
+extern u16 script_StockwellDogFood[];
+extern u8 gUnk_0810FDB8[];
extern void sub_08078850(Entity*, u32, u8, u32*);
+extern void InitScriptExecutionContext(ScriptExecutionContext* context, u16* script);
extern u32 gUnk_0810FDA0;
extern u16 script_Stockwell;
@@ -36,7 +40,41 @@ void sub_08065080(Entity* this) {
*(ScriptExecutionContext**)&this->cutsceneBeh = context;
}
-ASM_FUNC("asm/non_matching/stockwell/sub_080650CC.inc", void sub_080650CC(Entity* this))
+void sub_080650CC(Entity* this) {
+ u32 bVar2;
+ u32 confirmMsgId;
+ u32 itemPrice;
+
+ if ((gRoomVars.animFlags & 1)) {
+ this->action = 4;
+ this->subAction = 0;
+ InitScriptExecutionContext(*(ScriptExecutionContext**)&this->cutsceneBeh, script_StockwellDogFood);
+ } else {
+ bVar2 = this->frame & 0x20;
+ if ((bVar2 == 0) && (this->interactType != 0)) {
+ this->interactType = bVar2;
+ this->action = this->action + 1;
+ InitializeAnimation(this, 7);
+ if (gRoomVars.shopItemType == 0) {
+ confirmMsgId = 0x2c01;
+ } else {
+ confirmMsgId = GetSaleItemConfirmMessageID(gRoomVars.shopItemType);
+ itemPrice = GetItemPrice(gRoomVars.shopItemType);
+ this->action = 4;
+ this->subAction = bVar2;
+ InitScriptExecutionContext(*(ScriptExecutionContext**)&this->cutsceneBeh, script_StockwellBuy);
+ }
+ MessageNoOverlap(confirmMsgId, this);
+
+ //! @bug itemPrice (r8) is not initialized if gRoomVars.shopItemType == 0
+ gMessage.field_0x10 = (u16)itemPrice;
+ } else if ((this->frame & 0x40)) {
+ InitializeAnimation(this, gUnk_0810FDB8[Random() & 0xf]);
+ } else {
+ GetNextFrame(this);
+ }
+ }
+}
void sub_080651AC(Entity* this) {
GetNextFrame(this);
@@ -97,7 +135,7 @@ void sub_080652B0(Entity* this) {
this->subAction += 1;
this->actionDelay = 10;
gRoomVars.animFlags = this->field_0xf;
- CreateItemEntity(0x36, 0, 0);
+ CreateItemEntity(ITEM_QST_DOGFOOD, 0, 0);
}
}
@@ -132,8 +170,88 @@ void sub_08065368(Entity* this) {
GetNextFrame(this);
}
-ASM_FUNC("asm/non_matching/stockwell/sub_08065370.inc",
- void sub_08065370(Entity* this, ScriptExecutionContext* context))
+void sub_08065370(Entity* this, ScriptExecutionContext* context) {
+ u32 bVar1;
+ u32 shopItemType;
+ u32 itemPrice;
+ u32 messageIndex;
+ int localFlag;
+
+ bVar1 = 1;
+ shopItemType = gRoomVars.shopItemType;
+ localFlag = 0;
+ switch (shopItemType) {
+ case ITEM_ARROWS10:
+ case ITEM_ARROWS30:
+ if (gQuiverSizes[gSave.stats.quiverType] <= gSave.stats.arrowCount) {
+ messageIndex = 0x2c0e;
+ goto showmsg;
+ }
+ break;
+ case ITEM_SHIELD:
+ if (GetInventoryValue(ITEM_SHIELD) || GetInventoryValue(ITEM_MIRROR_SHIELD)) {
+ messageIndex = 0x2c0b;
+ goto showmsg;
+ }
+ break;
+ case ITEM_BOMBS10:
+ case ITEM_BOMBS30:
+ if (gBombBagSizes[gSave.stats.bombBagType] <= gSave.stats.bombCount) {
+ messageIndex = 0x2c0e;
+ goto showmsg;
+ }
+ break;
+ case ITEM_WALLET:
+ localFlag = 0x55;
+ break;
+ case ITEM_LARGE_QUIVER:
+ localFlag = 0x56;
+ break;
+#ifndef EU
+ case ITEM_BOMBBAG:
+ localFlag = SHOP00_BOMBBAG;
+ break;
+#endif
+ case ITEM_SHELLS30:
+ if (999 <= gSave.stats.shells) {
+ MessageNoOverlap(0x2c0e, this);
+ bVar1 = 0;
+ }
+ break;
+ }
+
+ if (bVar1) {
+ itemPrice = GetItemPrice(shopItemType);
+ if (itemPrice <= gSave.stats.rupees) {
+ ModRupees(-itemPrice);
+ sub_080A7C18(shopItemType, gRoomVars.shopItemType2, 2);
+ gRoomVars.shopItemType = 0;
+ gRoomVars.shopItemType2 = 0;
+ context->condition = 1;
+ if (localFlag) {
+ SetLocalFlag(localFlag);
+ }
+ if (gSave.unk5C <= -2) {
+ gSave.unk5C += 1;
+ }
+
+ if (gSave.unk5C >= 10) {
+ context->intVariable = 0x2c11;
+ } else {
+ if (itemPrice >= 100) {
+ context->intVariable = 0x2c10;
+ } else {
+ context->intVariable = 0x2c0f;
+ }
+ }
+ return;
+ }
+ messageIndex = 0x2c0d;
+ showmsg:
+ MessageNoOverlap(messageIndex, this);
+ }
+ context->condition = 0;
+}
void sub_080654DC(Entity* this) {
CreateSpeechBubbleQuestionMark(this, 8, 0xffffffe8);
diff --git a/src/script.c b/src/script.c
index 6c837afd..40dc0edd 100644
--- a/src/script.c
+++ b/src/script.c
@@ -823,7 +823,7 @@ void ScriptCommand_HasRupees(Entity* entity, ScriptExecutionContext* context) {
}
void ScriptCommand_HasShells(Entity* entity, ScriptExecutionContext* context) {
- context->condition = (context->scriptInstructionPointer[1] <= gSave.stats.field_0x1a);
+ context->condition = (context->scriptInstructionPointer[1] <= gSave.stats.shells);
gActiveScriptInfo.flags |= 1;
}