summaryrefslogtreecommitdiff
path: root/src/31_Shop/Actor/ActorItemSellerBase.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/31_Shop/Actor/ActorItemSellerBase.cpp')
-rw-r--r--src/31_Shop/Actor/ActorItemSellerBase.cpp471
1 files changed, 434 insertions, 37 deletions
diff --git a/src/31_Shop/Actor/ActorItemSellerBase.cpp b/src/31_Shop/Actor/ActorItemSellerBase.cpp
index d051a075..9309f0d7 100644
--- a/src/31_Shop/Actor/ActorItemSellerBase.cpp
+++ b/src/31_Shop/Actor/ActorItemSellerBase.cpp
@@ -1,39 +1,436 @@
+#include "Actor/ActorShopItem.hpp"
+#include "Actor/ActorSpawner.hpp"
+#include "Actor/ActorTypeId.hpp"
#include "Actor/Character/ActorItemSeller.hpp"
+#include "DTCM/UnkStruct_027e0c54.hpp"
+#include "DTCM/UnkStruct_027e0f64.hpp"
+#include "Item/Item.hpp"
+#include "Item/ItemManager.hpp"
+#include "Message/MessageManager.hpp"
+#include "Message/MsgProc.hpp"
+#include "Player/PlayerLinkBase.hpp"
+#include "Player/TouchControl.hpp"
+#include "Unknown/UnkStruct_02037628.hpp"
+#include "Unknown/UnkStruct_027e0dbc.hpp"
+#include "nds/math.h"
-ActorItemSellerBase::ActorItemSellerBase() {}
-ActorItemSellerBase::~ActorItemSellerBase() {}
-
-bool ActorItemSellerBase::Init() {}
-void ActorItemSellerBase::vfunc_20(bool param1) {}
-bool ActorItemSellerBase::vfunc_c0() {}
-void ActorItemSellerBase::vfunc_c4() {}
-
-void ActorItemSellerBase::func_ov031_0217d588() {}
-void ActorItemSellerBase::func_ov031_0217d5c0() {}
-void ActorItemSellerBase::func_ov031_0217d5c4() {}
-void ActorItemSellerBase::func_ov031_0217d5e8() {}
-void ActorItemSellerBase::func_ov031_0217d610() {}
-void ActorItemSellerBase::func_ov031_0217d62c() {}
-void ActorItemSellerBase::func_ov031_0217d638() {}
-void ActorItemSellerBase::func_ov031_0217d6ac() {}
-void ActorItemSellerBase::func_ov031_0217d6d0() {}
-void ActorItemSellerBase::func_ov031_0217d760() {}
-void ActorItemSellerBase::func_ov031_0217d784() {}
-void ActorItemSellerBase::func_ov031_0217d7ac() {}
-void ActorItemSellerBase::func_ov031_0217d830() {}
-void ActorItemSellerBase::func_ov031_0217d858() {}
-void ActorItemSellerBase::func_ov031_0217d890() {}
-void ActorItemSellerBase::func_ov031_0217d8d0() {}
-void ActorItemSellerBase::func_ov031_0217d8dc() {}
-void ActorItemSellerBase::func_ov031_0217d93c() {}
-void ActorItemSellerBase::func_ov031_0217d974() {}
-
-unk32 ActorItemSellerBase::vfunc_d4() {}
-bool ActorItemSellerBase::vfunc_8c() {}
-
-void ActorItemSellerBase::func_ov031_0217da20(unk32 param1) {}
-
-void ActorItemSellerBase::vfunc_68() {}
-bool ActorItemSellerBase::CollidesWithLink() {}
-void ActorItemSellerBase::vfunc_11c() {}
-bool ActorItemSellerBase::IsHitboxTouched(bool param1) {}
+static ActorItemSellerBase *sCurrentSeller;
+
+ARM ActorItemSellerBase *ActorItemSellerBase::GetCurrentSeller() {
+ return sCurrentSeller;
+}
+
+ARM ActorItemSellerBase::ActorItemSellerBase() {
+ mUnk_470 = 3;
+ sCurrentSeller = this;
+}
+
+ARM ActorItemSellerBase::~ActorItemSellerBase() {
+ sCurrentSeller = NULL;
+}
+
+static const ActorTypeId sShopItemActorTypes[ShopItem_BASE_COUNT] = {
+ [ShopItem_Test] = ActorTypeId_ShopItemDM,
+ [ShopItem_SoldOut] = ActorTypeId_ShopItemSoldOut,
+ [ShopItem_Bombs] = ActorTypeId_ShopItemBombs,
+ [ShopItem_Arrows] = ActorTypeId_ShopItemArrows,
+ [ShopItem_Bombchus] = ActorTypeId_ShopItemBombchus,
+ [ShopItem_HeartContainer] = ActorTypeId_ShopItemHeartContainer,
+ [ShopItem_BombBag] = ActorTypeId_ShopItemBombBag,
+ [ShopItem_Quiver] = ActorTypeId_ShopItemQuiver,
+ [ShopItem_BombchuBag] = ActorTypeId_ShopItemBombchuBag,
+ [ShopItem_ShipPart] = ActorTypeId_ShopItemShipPart,
+ [ShopItem_Treasure] = ActorTypeId_ShopItemTreasure,
+ [ShopItem_CourageGem] = ActorTypeId_ShopItemGem,
+ [ShopItem_PowerGem] = ActorTypeId_ShopItemGem,
+ [ShopItem_WisdomGem] = ActorTypeId_ShopItemGem,
+ [ShopItem_Shield] = ActorTypeId_ShopItemShield,
+ [ShopItem_RedPotion] = ActorTypeId_ShopItemPotion,
+ [ShopItem_PurplePotion] = ActorTypeId_ShopItemPotion,
+ [ShopItem_YellowPotion] = ActorTypeId_ShopItemPotion,
+};
+
+ARM bool ActorItemSellerBase::Init() {
+ UnkStruct_ov031_02183e80 *pUVar2;
+ unk32 numShipParts;
+ s32 numTreasure;
+
+ ActorCharacter_1d8 *pUnk_1d8 = &mUnk_1d8;
+ pUnk_1d8->mUnk_020.mUnk_5c = 0x3800;
+ pUnk_1d8->mUnk_020.mUnk_64 = 0x4000;
+ pUnk_1d8->mUnk_020.mUnk_60 = 0x5000;
+ pUnk_1d8->mUnk_020.mUnk_66 = 0x5555;
+ mUnk_1d8.mUnk_020.mUnk_8d = 0;
+ mUnk_1d8.func_ov014_02145e48(0);
+ mUnk_1d8.mUnk_10->mUnk_0c.mUnk_04 = 0x1000;
+ this->func_ov031_0217d588();
+
+ ActorSpawnOptions options;
+ Vec3p pos = mPos;
+ pos.x -= FLOAT_TO_Q20(0.8);
+ pos.y += FLOAT_TO_Q20(0.65);
+ pos.z += FLOAT_TO_Q20(1.2);
+ numShipParts = 0;
+ numTreasure = 0;
+ for (s32 i = 0; i < 5; ++i) {
+ ShopItem shopItem = this->vfunc_114(i);
+ options.mUnk_24 = 0;
+ ActorTypeId actorType = sShopItemActorTypes[shopItem];
+ switch (actorType) {
+ case ActorTypeId_ShopItemBombBag:
+ if (!gItemManager->HasItem(ItemFlag_BombBag)) {
+ actorType = ActorTypeId_ShopItemSoldOut;
+ }
+ break;
+ case ActorTypeId_ShopItemQuiver:
+ if (!gItemManager->HasItem(ItemFlag_Bow)) {
+ actorType = ActorTypeId_ShopItemSoldOut;
+ }
+ break;
+ case ActorTypeId_ShopItemBombchuBag:
+ if (!gItemManager->HasItem(ItemFlag_BombchuBag)) {
+ actorType = ActorTypeId_ShopItemSoldOut;
+ }
+ break;
+ case ActorTypeId_ShopItemShipPart:
+ options.mUnk_24 = numShipParts;
+ if (data_027e0dbc.func_ov003_020f3d5c(numShipParts + 8)) {
+ actorType = ActorTypeId_ShopItemSoldOut;
+ }
+ numShipParts++;
+ break;
+ case ActorTypeId_ShopItemTreasure: {
+ bool unk;
+ if (mUnk_470 == 2) {
+ options.mUnk_24 = numTreasure + 2;
+ unk = data_027e0dbc.func_ov003_020f3d5c(numTreasure + 7);
+ } else {
+ options.mUnk_24 = numTreasure;
+ unk = data_027e0dbc.func_ov003_020f3d5c(numTreasure + 5);
+ }
+ if (unk) {
+ actorType = ActorTypeId_ShopItemSoldOut;
+ }
+ numTreasure++;
+ break;
+ }
+ case ActorTypeId_ShopItemGem:
+ options.mUnk_24 = shopItem - ShopItem_CourageGem;
+ break;
+ case ActorTypeId_ShopItemPotion:
+ options.mUnk_24 = shopItem - ShopItem_RedPotion;
+ break;
+ }
+ gActorSpawner->Spawn(actorType, &pos, &options, &UnkStruct_ov031_02183e80::GetInstance()->mShopItemRefs[i]);
+ pos.x += FLOAT_TO_Q20(0.4);
+ if (i % 2 == 0) {
+ pos.z += FLOAT_TO_Q20(0.8);
+ } else {
+ pos.z -= FLOAT_TO_Q20(0.8);
+ }
+ }
+ options.mUnk_24 = 0;
+ pos.x = mPos.x - FLOAT_TO_Q20(1.0);
+ pos.y = mPos.y + FLOAT_TO_Q20(0.5);
+ pos.z = mPos.z + FLOAT_TO_Q20(2.5);
+ gActorSpawner->Spawn(ActorTypeId_ShopItemBK, &pos, &options, &UnkStruct_ov031_02183e80::GetInstance()->mShopItemRefBK);
+ pos.x = mPos.x + FLOAT_TO_Q20(1.0);
+ pos.y = mPos.y + FLOAT_TO_Q20(0.5);
+ pos.z = mPos.z + FLOAT_TO_Q20(2.5);
+ gActorSpawner->Spawn(ActorTypeId_ShopItemCC, &pos, &options, &UnkStruct_ov031_02183e80::GetInstance()->mShopItemRefCC);
+ pos.x = mPos.x + FLOAT_TO_Q20(1.0);
+ pos.y = mPos.y + FLOAT_TO_Q20(0.5);
+ pos.z = mPos.z + FLOAT_TO_Q20(2.5);
+ gActorSpawner->Spawn(ActorTypeId_ShopItemBY, &pos, &options, &UnkStruct_ov031_02183e80::GetInstance()->mShopItemRefBY);
+ mUnk_478 = 0;
+ mUnk_47c = data_027e0dbc.GetUnk_24()->mUnk_0b;
+ mUnk_480 = 0;
+ return ActorCharacter::Init();
+}
+
+ARM void ActorItemSellerBase::vfunc_20(bool param1) {
+ if (!data_027e0c54.func_020361d0()) {
+ ActorCharacter::vfunc_20(param1);
+ }
+}
+
+ARM bool ActorItemSellerBase::vfunc_c0() {
+ if (ActorCharacterBase::vfunc_c0()) {
+ return true;
+ }
+ return mUnk_474 != 0;
+}
+
+ARM void ActorItemSellerBase::vfunc_c4() {
+ Vec3p offsetPos;
+ if (mInactive) {
+ mAngle = mUnk_012;
+ mUnk_1d8.mUnk_020.mUnk_8d = 0;
+ return;
+ }
+ mPrevPos.x = mPos.x;
+ mPrevPos.y = mPos.y;
+ mPrevPos.z = mPos.z;
+ mUnk_1d8.mActor->GetOffsetPos(&offsetPos);
+ mUnk_1d8.mUnk_020.func_ov014_0214aa0c(&offsetPos, mUnk_1d8.mActor->mAngle);
+ switch (mUnk_474) {
+ case 0:
+ this->func_ov031_0217d5c0();
+ break;
+ case 1:
+ this->func_ov031_0217d5e8();
+ break;
+ case 2:
+ this->func_ov031_0217d638();
+ break;
+ case 3:
+ case 4:
+ this->func_ov031_0217d6d0();
+ break;
+ case 5:
+ this->func_ov031_0217d784();
+ break;
+ case 6:
+ this->func_ov031_0217d830();
+ break;
+ case 7:
+ this->func_ov031_0217d890();
+ break;
+ case 8:
+ this->func_ov031_0217d8dc();
+ break;
+ }
+ mUnk_1d8.func_ov014_02145cac();
+ this->func_ov014_02145178();
+}
+
+ARM void ActorItemSellerBase::func_ov031_0217d588() {
+ mUnk_474 = 0;
+ mUnk_1d8.func_ov014_02145f0c(0);
+ mUnk_1d8.mUnk_10->mUnk_0c.mUnk_04 = 0x1000;
+ this->vfunc_b4();
+}
+
+ARM void ActorItemSellerBase::func_ov031_0217d5c0() {}
+
+ARM void ActorItemSellerBase::func_ov031_0217d5c4() {
+ mUnk_474 = 1;
+ this->func_ov014_0214591c();
+ mUnk_1d8.mUnk_10->mUnk_0c.mUnk_04 = 0x1000;
+}
+
+ARM void ActorItemSellerBase::func_ov031_0217d5e8() {
+ if (this->vfunc_bc()) {
+ this->func_ov031_0217d588();
+ }
+}
+
+ARM void ActorItemSellerBase::func_ov031_0217d610() {
+ mUnk_474 = 2;
+ this->vfunc_118();
+}
+
+ARM void ActorItemSellerBase::func_ov031_0217d62c() {
+ mUnk_474 = 2;
+}
+
+ARM void ActorItemSellerBase::func_ov031_0217d638() {
+ if (UnkStruct_ov031_02183e80::GetInstance()->mUnk_000 != 5) {
+ return;
+ }
+ if (UnkStruct_ov031_02183e80::GetInstance()->mUnk_194 != -1) {
+ this->func_ov031_0217d858();
+ return;
+ }
+ if (mUnk_470 == 0 && this->vfunc_11c()) {
+ this->func_ov031_0217d6ac();
+ return;
+ }
+ this->func_ov031_0217d760();
+}
+
+ARM bool ActorItemSellerBase::func_ov031_0217d6ac() {
+ mUnk_474 = 3;
+ return data_027e0e28.func_ov018_02160a64(-1, 1);
+}
+
+ARM void ActorItemSellerBase::func_ov031_0217d6d0() {
+ UnkStruct_02037628 auStack_20;
+
+ switch (mUnk_474) {
+ case 3:
+ auStack_20.func_02037628();
+ if (auStack_20.mUnk_15 == 0) {
+ mUnk_474 = 4;
+ this->vfunc_b4();
+ this->SetUnk_11c(1);
+ }
+ break;
+ case 4:
+ default:
+ if (this->vfunc_bc()) {
+ this->func_ov031_0217d588();
+ }
+ }
+}
+
+ARM void ActorItemSellerBase::func_ov031_0217d760() {
+ mUnk_474 = 5;
+ data_027e0e28.func_ov018_02160a64(-1, 1);
+}
+
+ARM void ActorItemSellerBase::func_ov031_0217d784() {
+ if (this->vfunc_bc()) {
+ this->func_ov031_0217d588();
+ }
+}
+
+ARM void ActorItemSellerBase::func_ov031_0217d7ac() {
+ mUnk_474 = 6;
+ data_027e0f64->mUnk_4->func_ov000_0208726c(0);
+ data_027e0f64->mUnk_8->func_ov000_0208726c(0);
+ this->vfunc_b4();
+ this->SetUnk_11c(1);
+ for (s32 i = 0; i < 5; ++i) {
+ ActorShopItem *shopItem = UnkStruct_ov031_02183e80::GetInstance()->func_ov031_0217cdd8(i);
+ if (shopItem != NULL) {
+ shopItem->func_ov031_0217f0b4();
+ }
+ }
+}
+
+ARM void ActorItemSellerBase::func_ov031_0217d830() {
+ if (this->vfunc_bc()) {
+ this->func_ov031_0217d588();
+ }
+}
+
+extern "C" bool HasFreebieCard();
+ARM void ActorItemSellerBase::func_ov031_0217d858() {
+
+ mUnk_474 = 7;
+ unk32 unk = UnkStruct_ov031_02183e80::GetInstance()->mUnk_194;
+ data_027e0e28.func_ov018_02160a64(unk, !HasFreebieCard());
+}
+
+ARM void ActorItemSellerBase::func_ov031_0217d890() {
+ PlayerLinkBase *pPlayerLink = gPlayerLink;
+ if (UnkStruct_ov031_02183e80::GetInstance()->mUnk_198 || pPlayerLink->GetStateId() == 6) {
+ this->func_ov031_0217d8d0();
+ }
+}
+
+ARM void ActorItemSellerBase::func_ov031_0217d8d0() {
+ mUnk_474 = 8;
+}
+
+ARM void ActorItemSellerBase::func_ov031_0217d8dc() {
+ PlayerLinkBase *pPlayerLink = gPlayerLink;
+ if (UnkStruct_ov031_02183e80::GetInstance()->mUnk_198 || pPlayerLink->GetStateId() != 6) {
+ UnkStruct_ov031_02183e80::GetInstance()->mUnk_198 = false;
+ if (HasFreebieCard()) {
+ this->func_ov031_0217d7ac();
+ } else {
+ this->func_ov031_0217d62c();
+ }
+ }
+}
+
+ARM void ActorItemSellerBase::func_ov031_0217d93c() {
+ UnkStruct_027e0f64_04 *unk = data_027e0f64->mUnk_4;
+ mUnk_1d8.mUnk_020.mUnk_78.x = unk->mUnk_260.x;
+ mUnk_1d8.mUnk_020.mUnk_78.y = unk->mUnk_260.y;
+ mUnk_1d8.mUnk_020.mUnk_78.z = unk->mUnk_260.z;
+ mUnk_1d8.mUnk_020.mUnk_8c = true;
+ mUnk_1d8.mUnk_020.mUnk_8f = true;
+}
+
+ARM void ActorItemSellerBase::func_ov031_0217d974() {
+ mUnk_1d8.mUnk_020.mUnk_8c = false;
+ mUnk_1d8.mUnk_020.mUnk_8f = true;
+}
+
+ARM unk32 ActorItemSellerBase::vfunc_d4() {
+ return ActorCharacterBase::vfunc_d4();
+}
+
+ARM bool ActorItemSellerBase::vfunc_8c() {
+ switch (mUnk_474) {
+ case 1:
+ if (UnkStruct_ov031_02183e80::GetInstance()->func_ov031_0217ce18()) {
+ return true;
+ }
+ if (mUnk_480) {
+ mUnk_480 = false;
+ return true;
+ }
+ this->func_ov031_0217d610();
+ return false;
+ case 2:
+ case 7:
+ case 8:
+ return false;
+ }
+ return true;
+}
+
+ARM void ActorItemSellerBase::func_ov031_0217da20(unk32 param1) {
+ UnkStruct_020397f8 *iVar1;
+ UnkStruct_02037628 auStack_28;
+ auStack_28.func_020376c0(&mPos);
+ auStack_28.mUnk_15 = 0;
+ auStack_28.mUnk_16 = 1;
+ iVar1 = gMessageManager.func_02036f68(param1, &auStack_28, &mUnk_158);
+ iVar1->mUnk_38 = &mUnk_478;
+ iVar1->mUnk_3c = 2;
+}
+
+ARM void ActorItemSellerBase::vfunc_68(unk32 param1, UnkStruct_020397f8 *param2) {
+ param2->mUnk_38 = &mUnk_478;
+ param2->mUnk_3c = 2;
+ ActorCharacterBase::vfunc_68(param1, param2);
+ if (!mUnk_474) {
+ this->func_ov031_0217d5c4();
+ }
+}
+
+ARM bool ActorItemSellerBase::CollidesWithLink() {
+ Vec3p pos = mPos;
+ Vec3p playerPos = gPlayerPos;
+ if (playerPos.z < pos.z - FLOAT_TO_Q20(1.0)) {
+ return false;
+ }
+ if (playerPos.z > pos.z + FLOAT_TO_Q20(4.0)) {
+ return false;
+ }
+ if (playerPos.x < pos.x - FLOAT_TO_Q20(3.0)) {
+ return false;
+ }
+ if (playerPos.x > pos.x + FLOAT_TO_Q20(3.0)) {
+ return false;
+ }
+ return true;
+}
+
+ARM bool ActorItemSellerBase::vfunc_11c() {
+ return false;
+}
+
+ARM bool ActorItemSellerBase::IsHitboxTouched(bool param1) {
+ if (ActorCharacter::IsHitboxTouched(param1)) {
+ return true;
+ }
+ for (s32 i = 0; i < 5; ++i) {
+ ActorShopItem *shopItem = UnkStruct_ov031_02183e80::GetInstance()->func_ov031_0217cdd8(i);
+ if (param1) {
+ if (TouchControl::func_0202b864(&shopItem->mPos, 0x4cd, 8)) {
+ return true;
+ }
+ } else {
+ if (TouchControl::func_0202b894(&shopItem->mPos, 0x4cd, 8)) {
+ return true;
+ }
+ }
+ }
+ return false;
+}