diff --git a/asm/non_matching/stockwell/sub_080650CC.inc b/asm/non_matching/stockwell/sub_080650CC.inc deleted file mode 100644 index 21f19267..00000000 --- a/asm/non_matching/stockwell/sub_080650CC.inc +++ /dev/null @@ -1,107 +0,0 @@ - .syntax unified - push {r4, r5, r6, r7, lr} - mov r7, r8 - push {r7} - adds r5, r0, #0 - ldr r6, _080650F8 @ =gRoomVars - ldr r0, [r6, #0x68] - movs r1, #1 - ands r0, r1 - cmp r0, #0 - beq _08065100 - movs r1, #0 - movs r0, #4 - strb r0, [r5, #0xc] - strb r1, [r5, #0xd] - adds r0, r5, #0 - adds r0, #0x84 - ldr r0, [r0] - ldr r1, _080650FC @ =script_StockwellDogFood - bl InitScriptExecutionContext - b _080651A6 - .align 2, 0 -_080650F8: .4byte gRoomVars -_080650FC: .4byte script_StockwellDogFood -_08065100: - adds r2, r5, #0 - adds r2, #0x5a - ldrb r1, [r2] - movs r0, #0x20 - ands r0, r1 - lsls r0, r0, #0x18 - lsrs r4, r0, #0x18 - cmp r4, #0 - bne _0806517C - adds r3, r5, #0 - adds r3, #0x39 - movs r0, #0 - ldrsb r0, [r3, r0] - cmp r0, #0 - beq _0806517C - strb r4, [r3] - ldrb r0, [r5, #0xc] - adds r0, #1 - strb r0, [r5, #0xc] - adds r0, r5, #0 - movs r1, #7 - bl InitializeAnimation - ldrb r0, [r6, #6] - cmp r0, #0 - bne _0806513C - ldr r7, _08065138 @ =0x00002C01 - b _0806515E - .align 2, 0 -_08065138: .4byte 0x00002C01 -_0806513C: - ldrb r0, [r6, #6] - bl GetSaleItemConfirmMessageID - adds r7, r0, #0 - ldrb r0, [r6, #6] - bl GetItemPrice - mov r8, r0 - movs r0, #4 - strb r0, [r5, #0xc] - strb r4, [r5, #0xd] - adds r0, r5, #0 - adds r0, #0x84 - ldr r0, [r0] - ldr r1, _08065174 @ =script_StockwellBuy - bl InitScriptExecutionContext -_0806515E: - adds r0, r7, #0 - adds r1, r5, #0 - bl MessageNoOverlap - ldr r1, _08065178 @ =gMessage - mov r2, r8 - lsls r0, r2, #0x10 - lsrs r0, r0, #0x10 - str r0, [r1, #0x10] - b _080651A6 - .align 2, 0 -_08065174: .4byte script_StockwellBuy -_08065178: .4byte gMessage -_0806517C: - ldrb r1, [r2] - movs r0, #0x40 - ands r0, r1 - cmp r0, #0 - beq _080651A0 - ldr r4, _0806519C @ =gUnk_0810FDB8 - bl Random - movs r1, #0xf - ands r1, r0 - adds r1, r1, r4 - ldrb r1, [r1] - adds r0, r5, #0 - bl InitializeAnimation - b _080651A6 - .align 2, 0 -_0806519C: .4byte gUnk_0810FDB8 -_080651A0: - adds r0, r5, #0 - bl GetNextFrame -_080651A6: - pop {r3} - mov r8, r3 - pop {r4, r5, r6, r7, pc} - .syntax divided diff --git a/asm/non_matching/stockwell/sub_08065370.inc b/asm/non_matching/stockwell/sub_08065370.inc deleted file mode 100644 index 97ca3a99..00000000 --- a/asm/non_matching/stockwell/sub_08065370.inc +++ /dev/null @@ -1,368 +0,0 @@ - .syntax unified - -.ifdef EU - push {r4, r5, r6, r7, lr} - mov r7, sb - mov r6, r8 - push {r6, r7} - adds r4, r0, #0 - mov r8, r1 - movs r6, #1 - ldr r0, _08064E14 @ =gRoomVars - ldrb r5, [r0, #6] - movs r0, #0 - mov sb, r0 - cmp r5, #0x66 - beq _08064E8E - cmp r5, #0x66 - bhi _08064E1E - cmp r5, #0x61 - beq _08064E94 - cmp r5, #0x61 - bhi _08064E18 - cmp r5, #0xd - beq _08064E44 - b _08064EAA - .align 2, 0 -_08064E14: .4byte gRoomVars -_08064E18: - cmp r5, #0x64 - beq _08064E88 - b _08064EAA -_08064E1E: - cmp r5, #0x6c - blo _08064EAA - cmp r5, #0x6d - bls _08064E60 - cmp r5, #0x6f - bhi _08064EAA - ldr r2, _08064E3C @ =gQuiverSizes - ldr r1, _08064E40 @ =gSave - adds r0, r1, #0 - adds r0, #0xaf - ldrb r0, [r0] - adds r0, r0, r2 - adds r1, #0xad - b _08064E6E - .align 2, 0 -_08064E3C: .4byte gQuiverSizes -_08064E40: .4byte gSave -_08064E44: - movs r0, #0xd - bl GetInventoryValue - cmp r0, #0 - bne _08064E58 - movs r0, #0xe - bl GetInventoryValue - cmp r0, #0 - beq _08064EAA -_08064E58: - ldr r0, _08064E5C @ =0x00002C0B - b _08064F32 - .align 2, 0 -_08064E5C: .4byte 0x00002C0B -_08064E60: - ldr r2, _08064E7C @ =gBombBagSizes - ldr r1, _08064E80 @ =gSave - adds r0, r1, #0 - adds r0, #0xae - ldrb r0, [r0] - adds r0, r0, r2 - adds r1, #0xac -_08064E6E: - ldrb r0, [r0] - ldrb r1, [r1] - cmp r0, r1 - bhi _08064EAA - ldr r0, _08064E84 @ =0x00002C0E - b _08064F32 - .align 2, 0 -_08064E7C: .4byte gBombBagSizes -_08064E80: .4byte gSave -_08064E84: .4byte 0x00002C0E -_08064E88: - movs r1, #0x55 - mov sb, r1 - b _08064EAA -_08064E8E: - movs r0, #0x56 - mov sb, r0 - b _08064EAA -_08064E94: - ldr r0, _08064F04 @ =gSave - adds r0, #0xc2 - ldrh r1, [r0] - ldr r0, _08064F08 @ =0x000003E6 - cmp r1, r0 - bls _08064EAA - ldr r0, _08064F0C @ =0x00002C0E - adds r1, r4, #0 - bl MessageNoOverlap - movs r6, #0 -_08064EAA: - cmp r6, #0 - beq _08064F38 - adds r0, r5, #0 - bl GetItemPrice - adds r6, r0, #0 - ldr r7, _08064F04 @ =gSave - adds r0, r7, #0 - adds r0, #0xc0 - ldrh r0, [r0] - cmp r6, r0 - bhi _08064F30 - rsbs r0, r6, #0 - bl ModRupees - ldr r4, _08064F10 @ =gRoomVars - ldrb r1, [r4, #7] - adds r0, r5, #0 - movs r2, #2 - bl sub_080A7C18 - movs r0, #0 - strb r0, [r4, #6] - strb r0, [r4, #7] - movs r0, #1 - mov r1, r8 - str r0, [r1, #0x14] - mov r0, sb - cmp r0, #0 - beq _08064EEA - bl SetLocalFlag -_08064EEA: - ldr r1, [r7, #0x5c] - movs r0, #2 - rsbs r0, r0, #0 - cmp r1, r0 - bhi _08064EF8 - adds r0, r1, #1 - str r0, [r7, #0x5c] -_08064EF8: - ldr r0, [r7, #0x5c] - cmp r0, #9 - bls _08064F18 - ldr r0, _08064F14 @ =0x00002C11 - b _08064F26 - .align 2, 0 -_08064F04: .4byte gSave -_08064F08: .4byte 0x000003E6 -_08064F0C: .4byte 0x00002C0E -_08064F10: .4byte gRoomVars -_08064F14: .4byte 0x00002C11 -_08064F18: - cmp r6, #0x63 - bls _08064F24 - ldr r0, _08064F20 @ =0x00002C10 - b _08064F26 - .align 2, 0 -_08064F20: .4byte 0x00002C10 -_08064F24: - ldr r0, _08064F2C @ =0x00002C0F -_08064F26: - mov r1, r8 - str r0, [r1, #4] - b _08064F3E - .align 2, 0 -_08064F2C: .4byte 0x00002C0F -_08064F30: - ldr r0, _08064F48 @ =0x00002C0D -_08064F32: - adds r1, r4, #0 - bl MessageNoOverlap -_08064F38: - movs r0, #0 - mov r1, r8 - str r0, [r1, #0x14] -_08064F3E: - pop {r3, r4} - mov r8, r3 - mov sb, r4 - pop {r4, r5, r6, r7, pc} - .align 2, 0 -_08064F48: .4byte 0x00002C0D -.else - push {r4, r5, r6, r7, lr} - mov r7, sb - mov r6, r8 - push {r6, r7} - adds r4, r0, #0 - mov r8, r1 - movs r6, #1 - ldr r0, _0806539C @ =gRoomVars - ldrb r5, [r0, #6] - movs r0, #0 - mov sb, r0 - cmp r5, #0x66 - beq _0806541A - cmp r5, #0x66 - bhi _080653AA - cmp r5, #0x61 - beq _08065426 - cmp r5, #0x61 - bhi _080653A0 - cmp r5, #0xd - beq _080653D0 - b _0806543C - .align 2, 0 -_0806539C: .4byte gRoomVars -_080653A0: - cmp r5, #0x64 - beq _08065414 - cmp r5, #0x65 - beq _08065420 - b _0806543C -_080653AA: - cmp r5, #0x6c - blo _0806543C - cmp r5, #0x6d - bls _080653EC - cmp r5, #0x6f - bhi _0806543C - ldr r2, _080653C8 @ =gQuiverSizes - ldr r1, _080653CC @ =gSave - adds r0, r1, #0 - adds r0, #0xaf - ldrb r0, [r0] - adds r0, r0, r2 - adds r1, #0xad - b _080653FA - .align 2, 0 -_080653C8: .4byte gQuiverSizes -_080653CC: .4byte gSave -_080653D0: - movs r0, #0xd - bl GetInventoryValue - cmp r0, #0 - bne _080653E4 - movs r0, #0xe - bl GetInventoryValue - cmp r0, #0 - beq _0806543C -_080653E4: - ldr r0, _080653E8 @ =0x00002C0B - b _080654C2 - .align 2, 0 -_080653E8: .4byte 0x00002C0B -_080653EC: - ldr r2, _08065408 @ =gBombBagSizes - ldr r1, _0806540C @ =gSave - adds r0, r1, #0 - adds r0, #0xae - ldrb r0, [r0] - adds r0, r0, r2 - adds r1, #0xac -_080653FA: - ldrb r0, [r0] - ldrb r1, [r1] - cmp r0, r1 - bhi _0806543C - ldr r0, _08065410 @ =0x00002C0E - b _080654C2 - .align 2, 0 -_08065408: .4byte gBombBagSizes -_0806540C: .4byte gSave -_08065410: .4byte 0x00002C0E -_08065414: - movs r1, #0x55 - mov sb, r1 - b _0806543C -_0806541A: - movs r0, #0x56 - mov sb, r0 - b _0806543C -_08065420: - movs r1, #0xcd - mov sb, r1 - b _0806543C -_08065426: - ldr r0, _08065494 @ =gSave - adds r0, #0xc2 - ldrh r1, [r0] - ldr r0, _08065498 @ =0x000003E6 - cmp r1, r0 - bls _0806543C - ldr r0, _0806549C @ =0x00002C0E - adds r1, r4, #0 - bl MessageNoOverlap - movs r6, #0 -_0806543C: - cmp r6, #0 - beq _080654C8 - adds r0, r5, #0 - bl GetItemPrice - adds r6, r0, #0 - ldr r7, _08065494 @ =gSave - adds r0, r7, #0 - adds r0, #0xc0 - ldrh r0, [r0] - cmp r6, r0 - bhi _080654C0 - rsbs r0, r6, #0 - bl ModRupees - ldr r4, _080654A0 @ =gRoomVars - ldrb r1, [r4, #7] - adds r0, r5, #0 - movs r2, #2 - bl sub_080A7C18 - movs r0, #0 - strb r0, [r4, #6] - strb r0, [r4, #7] - movs r0, #1 - mov r1, r8 - str r0, [r1, #0x14] - mov r0, sb - cmp r0, #0 - beq _0806547C - bl SetLocalFlag -_0806547C: - ldr r1, [r7, #0x5c] - movs r0, #2 - rsbs r0, r0, #0 - cmp r1, r0 - bhi _0806548A - adds r0, r1, #1 - str r0, [r7, #0x5c] -_0806548A: - ldr r0, [r7, #0x5c] - cmp r0, #9 - bls _080654A8 - ldr r0, _080654A4 @ =0x00002C11 - b _080654B6 - .align 2, 0 -_08065494: .4byte gSave -_08065498: .4byte 0x000003E6 -_0806549C: .4byte 0x00002C0E -_080654A0: .4byte gRoomVars -_080654A4: .4byte 0x00002C11 -_080654A8: - cmp r6, #0x63 - bls _080654B4 - ldr r0, _080654B0 @ =0x00002C10 - b _080654B6 - .align 2, 0 -_080654B0: .4byte 0x00002C10 -_080654B4: - ldr r0, _080654BC @ =0x00002C0F -_080654B6: - mov r1, r8 - str r0, [r1, #4] - b _080654CE - .align 2, 0 -_080654BC: .4byte 0x00002C0F -_080654C0: - ldr r0, _080654D8 @ =0x00002C0D -_080654C2: - adds r1, r4, #0 - bl MessageNoOverlap -_080654C8: - movs r0, #0 - mov r1, r8 - str r0, [r1, #0x14] -_080654CE: - pop {r3, r4} - mov r8, r3 - mov sb, r4 - pop {r4, r5, r6, r7, pc} - .align 2, 0 -_080654D8: .4byte 0x00002C0D -.endif - .syntax divided diff --git a/include/player.h b/include/player.h index d677e6eb..50f96c02 100644 --- a/include/player.h +++ b/include/player.h @@ -258,7 +258,7 @@ typedef struct { /*0x13*/ u8 hasAllFigurines; /*0x14*/ u8 filler3[4]; /*0x18*/ u16 rupees; - /*0x1a*/ u16 field_0x1a; + /*0x1a*/ u16 shells; /*0x1c*/ u16 charmTimer; /*0x1e*/ u16 picolyteTimer; /*0x20*/ u16 effectTimer; diff --git a/include/save.h b/include/save.h index af4638d5..cd5ab988 100644 --- a/include/save.h +++ b/include/save.h @@ -45,7 +45,8 @@ typedef struct { /*0x040*/ u32 windcrests; /**< Windcrest flags. */ /*0x044*/ u8 filler44[0xC]; /*0x050*/ u32 unk50; - /*0x054*/ u8 filler54[0xC]; + /*0x054*/ u8 filler54[0x8]; + /*0x05C*/ u32 unk5C; /*0x060*/ u32 areaVisitFlags[8]; /**< Area visit flags. */ /*0x080*/ char name[FILENAME_LENGTH]; /**< Save file name. */ /*0x086*/ u8 filler86[0x2]; 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 884ade4a..d633841e 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; }