1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
|
#include "ActorBehavior.h"
#include <libultraship/bridge/consolevariablebridge.h>
#include "2s2h/CustomMessage/CustomMessage.h"
extern "C" {
#include "variables.h"
#include "overlays/actors/ovl_En_Bal/z_en_bal.h"
void EnBal_SetupTalk(EnBal* enBal);
}
std::map<int16_t, std::vector<RandoCheckId>> tingleMap = {
{ SCENE_BACKTOWN, { RC_CLOCK_TOWN_NORTH_TINGLE_MAP_01, RC_CLOCK_TOWN_NORTH_TINGLE_MAP_02 } },
{ SCENE_24KEMONOMITI, { RC_ROAD_TO_SOUTHERN_SWAMP_TINGLE_MAP_01, RC_ROAD_TO_SOUTHERN_SWAMP_TINGLE_MAP_02 } },
{ SCENE_17SETUGEN, { RC_TWIN_ISLANDS_TINGLE_MAP_01, RC_TWIN_ISLANDS_TINGLE_MAP_02 } },
{ SCENE_17SETUGEN2, { RC_TWIN_ISLANDS_TINGLE_MAP_01, RC_TWIN_ISLANDS_TINGLE_MAP_02 } },
{ SCENE_ROMANYMAE, { RC_MILK_ROAD_TINGLE_MAP_01, RC_MILK_ROAD_TINGLE_MAP_02 } },
{ SCENE_30GYOSON, { RC_GREAT_BAY_COAST_TINGLE_MAP_01, RC_GREAT_BAY_COAST_TINGLE_MAP_02 } },
{ SCENE_IKANA, { RC_IKANA_CANYON_TINGLE_MAP_01, RC_IKANA_CANYON_TINGLE_MAP_02 } }
};
void OnOpenShopText(u16* textId, bool* loadFromMessageTable) {
RandoCheckId randoCheckId1 = tingleMap[gPlayState->sceneId][0];
RandoCheckId randoCheckId2 = tingleMap[gPlayState->sceneId][1];
auto entry = CustomMessage::LoadVanillaMessageTableEntry(*textId);
entry.autoFormat = false;
entry.msg = "\x02\xC3{item1}\x01 {price1} Rupees\x11"
"\x02{item2}\x01 {price2} Rupees\x11"
"\x02No thanks";
CustomMessage::Replace(
&entry.msg, "{item1}",
Rando::StaticData::GetItemName(RANDO_SAVE_CHECKS[randoCheckId1].randoItemId, false, randoCheckId1));
CustomMessage::Replace(
&entry.msg, "{item2}",
Rando::StaticData::GetItemName(RANDO_SAVE_CHECKS[randoCheckId2].randoItemId, false, randoCheckId2));
CustomMessage::Replace(&entry.msg, "{price1}", std::to_string(RANDO_SAVE_CHECKS[randoCheckId1].price));
CustomMessage::Replace(&entry.msg, "{price2}", std::to_string(RANDO_SAVE_CHECKS[randoCheckId2].price));
CustomMessage::EnsureMessageEnd(&entry.msg);
CustomMessage::LoadCustomMessageIntoFont(entry);
*loadFromMessageTable = false;
};
void OnOpenCantGetText(u16* textId, bool* loadFromMessageTable) {
auto entry = CustomMessage::LoadVanillaMessageTableEntry(*textId);
entry.msg = "I'm sorry, but it seems I cannot sell this to you now.";
CustomMessage::LoadCustomMessageIntoFont(entry);
*loadFromMessageTable = false;
};
void Rando::ActorBehavior::InitEnBalBehavior() {
bool shouldRegister = IS_RANDO && RANDO_SAVE_OPTIONS[RO_SHUFFLE_TINGLE_SHOPS];
COND_VB_SHOULD(VB_NOT_AFFORD_TINGLE_MAP, shouldRegister, {
EnBal* enBal = va_arg(args, EnBal*);
s32* price = va_arg(args, s32*);
auto randoCheckId = tingleMap[gPlayState->sceneId][gPlayState->msgCtx.choiceIndex];
*price = RANDO_SAVE_CHECKS[randoCheckId].price;
*should = gSaveContext.save.saveInfo.playerData.rupees < *price;
});
COND_VB_SHOULD(VB_ALREADY_HAVE_TINGLE_MAP, shouldRegister, {
EnBal* enBal = va_arg(args, EnBal*);
auto randoCheckId = tingleMap[gPlayState->sceneId][gPlayState->msgCtx.choiceIndex];
if (Rando::IsItemObtainable(RANDO_SAVE_CHECKS[randoCheckId].randoItemId, randoCheckId)) {
*should = false;
} else {
*should = true;
}
});
COND_VB_SHOULD(VB_TINGLE_GIVE_MAP_UNLOCK, shouldRegister, {
EnBal* enBal = va_arg(args, EnBal*);
RANDO_SAVE_CHECKS[tingleMap[gPlayState->sceneId][gPlayState->msgCtx.choiceIndex]].eligible = true;
Message_StartTextbox(gPlayState, 0x1D17, &enBal->picto.actor);
enBal->textId = 0x1D17;
EnBal_SetupTalk(enBal);
*should = false;
});
COND_ID_HOOK(OnOpenText, 0x1D11, shouldRegister, OnOpenShopText);
COND_ID_HOOK(OnOpenText, 0x1D12, shouldRegister, OnOpenShopText);
COND_ID_HOOK(OnOpenText, 0x1D13, shouldRegister, OnOpenShopText);
COND_ID_HOOK(OnOpenText, 0x1D14, shouldRegister, OnOpenShopText);
COND_ID_HOOK(OnOpenText, 0x1D15, shouldRegister, OnOpenShopText);
COND_ID_HOOK(OnOpenText, 0x1D16, shouldRegister, OnOpenShopText);
COND_ID_HOOK(OnOpenText, 0x1D09, shouldRegister, OnOpenCantGetText);
COND_VB_SHOULD(VB_HAVE_MAGIC_FOR_TINGLE, shouldRegister, { *should = true; });
}
|