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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
|
#ifndef Z64MESSAGE_H
#define Z64MESSAGE_H
#include "PR/ultratypes.h"
#include "stdbool.h"
#include "versions.h"
#include "z64bombers_notebook.h"
#include "z64font.h"
#include "z64view.h"
#include "unk.h"
struct Actor;
struct MessageTableEntry;
struct OcarinaStaff;
struct PlayState;
typedef enum TextBoxType {
/* 0x00 */ TEXTBOX_TYPE_BLACK,
/* 0x01 */ TEXTBOX_TYPE_WOODEN,
/* 0x02 */ TEXTBOX_TYPE_BLUE_FADED,
/* 0x03 */ TEXTBOX_TYPE_OCARINA,
/* 0x04 */ TEXTBOX_TYPE_4,
/* 0x05 */ TEXTBOX_TYPE_CLEAR,
/* 0x06 */ TEXTBOX_TYPE_DISPLAY_ALL,
/* 0x07 */ TEXTBOX_TYPE_CLEAR_DISPLAY_ALL,
/* 0x08 */ TEXTBOX_TYPE_BLUE,
/* 0x09 */ TEXTBOX_TYPE_PAUSE_INFO,
/* 0x0A */ TEXTBOX_TYPE_A,
/* 0x0B */ TEXTBOX_TYPE_B,
/* 0x0C */ TEXTBOX_TYPE_TITLE_CARD,
/* 0x0D */ TEXTBOX_TYPE_NOTEBOOK_NOTIFICATION,
/* 0x0E */ TEXTBOX_TYPE_OCARINA_FREE_PLAY,
/* 0x0F */ TEXTBOX_TYPE_F,
/* 0x10 */ TEXTBOX_TYPE_MAX
} TextBoxType;
typedef enum TextBoxBackground {
/* 0x0 */ TEXTBOX_BG_DEFAULT,
/* 0x1 */ TEXTBOX_BG_WOODEN,
/* 0x2 */ TEXTBOX_BG_OCARINA,
/* 0x3 */ TEXTBOX_BG_FADED,
/* 0x4 */ TEXTBOX_BG_NOTEBOOK,
/* 0xE */ TEXTBOX_BG_NONE = 14,
} TextBoxBackground;
#define TEXTBOX_ENDTYPE_DEFAULT 0x00
#define TEXTBOX_ENDTYPE_TWO_CHOICE 0x10
#define TEXTBOX_ENDTYPE_THREE_CHOICE 0x11
#define TEXTBOX_ENDTYPE_12 0x12
#define TEXTBOX_ENDTYPE_NEXT 0x20
#define TEXTBOX_ENDTYPE_PERSISTENT 0x30
#define TEXTBOX_ENDTYPE_EVENT 0x40
#define TEXTBOX_ENDTYPE_PAUSE_MENU 0x41
#define TEXTBOX_ENDTYPE_EVENT2 0x42
#define TEXTBOX_ENDTYPE_FADE_NORMAL 0x50
#define TEXTBOX_ENDTYPE_FADE_SKIPPABLE 0x52
#define TEXTBOX_ENDTYPE_FADE_STAGES_1 0x55
#define TEXTBOX_ENDTYPE_FADE_STAGES_2 0x56
#define TEXTBOX_ENDTYPE_FADE_STAGES_3 0x57
#define TEXTBOX_ENDTYPE_INPUT_BANK 0x60
#define TEXTBOX_ENDTYPE_INPUT_DOGGY_RACETRACK_BET 0x61
#define TEXTBOX_ENDTYPE_INPUT_BOMBER_CODE 0x62
#define TEXTBOX_ENDTYPE_INPUT_LOTTERY_CODE 0x63
#define TEXTBOX_ENDTYPE_64 0x64
typedef enum MessageMode {
/* 0x00 */ MSGMODE_NONE,
/* 0x01 */ MSGMODE_TEXT_START,
/* 0x02 */ MSGMODE_TEXT_BOX_GROWING,
/* 0x03 */ MSGMODE_TEXT_STARTING,
/* 0x04 */ MSGMODE_TEXT_NEXT_MSG,
/* 0x05 */ MSGMODE_TEXT_CONTINUING,
/* 0x06 */ MSGMODE_TEXT_DISPLAYING,
/* 0x07 */ MSGMODE_TEXT_AWAIT_INPUT,
/* 0x08 */ MSGMODE_TEXT_DELAYED_BREAK,
/* 0x09 */ MSGMODE_9,
/* 0x0A */ MSGMODE_OCARINA_STARTING,
/* 0x0B */ MSGMODE_SONG_DEMONSTRATION_STARTING,
/* 0x0C */ MSGMODE_SONG_PROMPT_STARTING,
/* 0x0D */ MSGMODE_OCARINA_PLAYING,
/* 0x0E */ MSGMODE_E,
/* 0x0F */ MSGMODE_OCARINA_FAIL,
/* 0x10 */ MSGMODE_OCARINA_FAIL_NO_TEXT,
/* 0x11 */ MSGMODE_OCARINA_NOTES_DROP,
/* 0x12 */ MSGMODE_SONG_PLAYED,
/* 0x13 */ MSGMODE_SETUP_DISPLAY_SONG_PLAYED,
/* 0x14 */ MSGMODE_DISPLAY_SONG_PLAYED,
/* 0x15 */ MSGMODE_DISPLAY_SONG_PLAYED_TEXT_BEGIN,
/* 0x16 */ MSGMODE_16,
/* 0x17 */ MSGMODE_17,
/* 0x18 */ MSGMODE_18,
/* 0x19 */ MSGMODE_19,
/* 0x1A */ MSGMODE_SONG_DEMONSTRATION,
/* 0x1B */ MSGMODE_SONG_DEMONSTRATION_DONE,
/* 0x1C */ MSGMODE_SONG_PROMPT,
/* 0x1D */ MSGMODE_SONG_PROMPT_SUCCESS,
/* 0x1E */ MSGMODE_SONG_PROMPT_FAIL,
/* 0x1F */ MSGMODE_SONG_PROMPT_NOTES_DROP,
/* 0x20 */ MSGMODE_OCARINA_AWAIT_INPUT,
/* 0x21 */ MSGMODE_21,
/* 0x22 */ MSGMODE_22,
/* 0x23 */ MSGMODE_23,
/* 0x24 */ MSGMODE_24,
/* 0x25 */ MSGMODE_25,
/* 0x26 */ MSGMODE_26,
/* 0x27 */ MSGMODE_SCARECROW_LONG_RECORDING_START,
/* 0x28 */ MSGMODE_SCARECROW_LONG_RECORDING_ONGOING,
/* 0x29 */ MSGMODE_SCARECROW_LONG_DEMONSTRATION,
/* 0x2A */ MSGMODE_SCARECROW_SPAWN_RECORDING_START,
/* 0x2B */ MSGMODE_SCARECROW_SPAWN_RECORDING_ONGOING,
/* 0x2C */ MSGMODE_SCARECROW_SPAWN_RECORDING_FAILED,
/* 0x2D */ MSGMODE_SCARECROW_SPAWN_RECORDING_DONE,
/* 0x2E */ MSGMODE_SCARECROW_SPAWN_DEMONSTRATION,
/* 0x2F */ MSGMODE_2F,
/* 0x30 */ MSGMODE_30,
/* 0x31 */ MSGMODE_31,
/* 0x32 */ MSGMODE_32,
/* 0x33 */ MSGMODE_33,
/* 0x34 */ MSGMODE_34,
/* 0x35 */ MSGMODE_35,
/* 0x36 */ MSGMODE_36,
/* 0x37 */ MSGMODE_37,
/* 0x38 */ MSGMODE_38,
/* 0x39 */ MSGMODE_39,
/* 0x3A */ MSGMODE_3A,
/* 0x3B */ MSGMODE_3B,
/* 0x3C */ MSGMODE_3C,
/* 0x3D */ MSGMODE_3D,
/* 0x3E */ MSGMODE_3E,
/* 0x3F */ MSGMODE_3F,
/* 0x40 */ MSGMODE_40,
/* 0x41 */ MSGMODE_TEXT_AWAIT_NEXT,
/* 0x42 */ MSGMODE_TEXT_DONE,
/* 0x43 */ MSGMODE_TEXT_CLOSING,
/* 0x44 */ MSGMODE_PAUSED, // Causes the message system to do nothing until external code sets a new message mode or calls a public function
/* 0x45 */ MSGMODE_SCENE_TITLE_CARD_FADE_IN_BACKGROUND, // Scene Title Card
/* 0x46 */ MSGMODE_SCENE_TITLE_CARD_FADE_IN_TEXT,
/* 0x47 */ MSGMODE_SCENE_TITLE_CARD_DISPLAYING,
/* 0x48 */ MSGMODE_SCENE_TITLE_CARD_FADE_OUT_TEXT,
/* 0x49 */ MSGMODE_SCENE_TITLE_CARD_FADE_OUT_BACKGROUND,
/* 0x4A */ MSGMODE_NEW_CYCLE_0, // End of cycle?
/* 0x4B */ MSGMODE_NEW_CYCLE_1,
/* 0x4C */ MSGMODE_NEW_CYCLE_2,
/* 0x4D */ MSGMODE_OWL_SAVE_0,
/* 0x4E */ MSGMODE_OWL_SAVE_1,
/* 0x4F */ MSGMODE_OWL_SAVE_2
} MessageMode;
typedef enum FaceReactionSet {
/* 0x11 */ FACE_REACTION_SET_JIM = 0x11,
/* 0x12 */ FACE_REACTION_SET_BOMBERS,
/* 0x15 */ FACE_REACTION_SET_BOMBERS_HIDEOUT_GUARD = 0x15,
/* 0x2D */ FACE_REACTION_SET_TREASURE_CHEST_SHOP_GAL = 0x2D,
/* 0x2F */ FACE_REACTION_SET_CURIOSITY_SHOP_MAN = 0x2F,
/* 0x30 */ FACE_REACTION_SET_TOWN_SHOOTING_GALLERY_MAN,
/* 0x31 */ FACE_REACTION_SET_SWAMP_SHOOTING_GALLERY_MAN,
/* 0x36 */ FACE_REACTION_SET_PART_TIMER = 0x36
} FaceReactionSet;
u16 Text_GetFaceReaction(struct PlayState* play, FaceReactionSet reactionSet);
typedef enum TextState {
/* 0 */ TEXT_STATE_NONE,
/* 1 */ TEXT_STATE_NEXT,
/* 2 */ TEXT_STATE_CLOSING,
/* 3 */ TEXT_STATE_FADING,
/* 4 */ TEXT_STATE_CHOICE,
/* 5 */ TEXT_STATE_EVENT,
/* 6 */ TEXT_STATE_DONE,
/* 7 */ TEXT_STATE_SONG_DEMO_DONE,
/* 8 */ TEXT_STATE_8,
/* 9 */ TEXT_STATE_9,
/* 10 */ TEXT_STATE_AWAITING_NEXT,
/* 11 */ TEXT_STATE_11,
/* 12 */ TEXT_STATE_12,
/* 13 */ TEXT_STATE_13,
/* 14 */ TEXT_STATE_INPUT_RUPEES,
/* 15 */ TEXT_STATE_INPUT_BOMBER_CODE,
/* 16 */ TEXT_STATE_PAUSE_MENU,
/* 17 */ TEXT_STATE_INPUT_LOTTERY_CODE,
/* 18 */ TEXT_STATE_18
} TextState;
typedef struct MessageContext {
/* 0x00000 */ View view;
/* 0x00168 */ Font font;
/* 0x11EF8 */ u8* textboxSegment;
/* 0x11EFC */ UNK_TYPE1 unk11EFC[0x4];
/* 0x11F00 */ struct OcarinaStaff* ocarinaStaff;
/* 0x11F04 */ u16 currentTextId;
/* 0x11F06 */ u16 choiceTextId; // s16?
/* 0x11F08 */ u16 textBoxProperties;
/* 0x11F0A */ u8 textBoxType;
/* 0x11F0B */ u8 textBoxPos;
/* 0x11F0C */ u8 unk11F0C;
/* 0x11F10 */ s32 msgLength;
/* 0x11F14 */ u16 nextTextId;
/* 0x11F16 */ u16 itemId;
/* 0x11F18 */ u8 hasChoices;
/* 0x11F1A */ s16 lineIndent[3];
/* 0x11F20 */ UNK_TYPE1 unk11F20[0x2];
/* 0x11F22 */ u8 msgMode;
/* 0x11F23 */ UNK_TYPE1 unk11F23;
/* 0x11F24 */ union {
char schar[200];
u16 wchar[100];
} decodedBuffer;
/* 0x11FEC */ u16 msgBufPos;
/* 0x11FEE */ u16 textDrawPos;
/* 0x11FF0 */ u16 decodedTextLen;
/* 0x11FF2 */ u16 textUnskippable;
/* 0x11FF4 */ s16 textPosX;
/* 0x11FF6 */ s16 textPosY;
/* 0x11FF8 */ s16 textPosXTarget;
/* 0x11FFA */ s16 textPosYTarget;
/* 0x11FFC */ s16 lineHeight;
/* 0x11FFE */ s16 choicePosY[0x3];
/* 0x12004 */ s16 textboxXTarget;
/* 0x12006 */ s16 textboxYTarget;
/* 0x12008 */ s16 unk12008;
/* 0x1200A */ s16 unk1200A;
/* 0x1200C */ s16 unk1200C;
/* 0x1200E */ s16 unk1200E;
/* 0x12010 */ s16 unk12010;
/* 0x12012 */ s16 unk12012;
/* 0x12014 */ s16 unk12014;
/* 0x12014 */ s16 unk12016;
/* 0x12018 */ s16 textColorR;
/* 0x1201A */ s16 textColorG;
/* 0x1201C */ s16 textColorB;
/* 0x1201E */ s16 textColorAlpha;
/* 0x12020 */ u8 textboxEndType;
/* 0x12021 */ u8 choiceIndex;
/* 0x12022 */ u8 choiceNum;
/* 0x12023 */ u8 stateTimer;
/* 0x12024 */ u16 textDelayTimer;
/* 0x12026 */ u16 textDelay;
/* 0x12028 */ u16 songPlayed;
/* 0x1202A */ u16 ocarinaMode;
/* 0x1202C */ u16 ocarinaAction;
/* 0x1202E */ u16 lastPlayedSong;
/* 0x12030 */ s16 unk_12030;
/* 0x12032 */ UNK_TYPE1 unk_12032[0x2];
/* 0x12034 */ s16 textboxColorRed;
/* 0x12036 */ s16 textboxColorGreen;
/* 0x12038 */ s16 textboxColorBlue;
/* 0x1203A */ s16 textboxColorAlphaTarget;
/* 0x1203C */ s16 textboxColorAlphaCurrent;
/* 0x1203E */ s16 unk1203E;
/* 0x12040 */ struct Actor* talkActor;
/* 0x12044 */ s16 unk12044;
/* 0x12046 */ s16 blockSunsSong;
/* 0x12048 */ u8 ocarinaButtonIndex;
/* 0x1204A */ s16 ocarinaButtonsPosY[5];
/* 0x12054 */ s16 codeGuessDigits[6];
/* 0x1205A */ UNK_TYPE1 unk12060[0x8];
/* 0x12068 */ s16 textboxX;
/* 0x1206A */ s16 textboxY;
/* 0x1206C */ s32 firstChoicePrice;
/* 0x12070 */ s32 secondChoicePrice;
/* 0x12074 */ s32 unk12074;
/* 0x12078 */ s32 rupeesSelected; // Used for bank and doggy racetrack bet
/* 0x1207C */ s32 rupeesTotal; // Used for bank and doggy racetrack bet
/* 0x12080 */ struct MessageTableEntry* messageTable;
/* 0x12084 */ struct MessageTableEntry* messageTableNES;
#if MM_VERSION >= N64_US
/* 0x12088 */ UNK_TYPE1 unk12088[0x4];
#endif
/* 0x1208C */ struct MessageTableEntry* messageTableCredits;
/* 0x12090 */ s16 textIsCredits;
/* 0x12092 */ s16 messageHasSetSfx;
/* 0x12094 */ u8 textboxSkipped;
/* 0x12098 */ f32 textCharScale;
/* 0x1209C */ s16 textFade;
/* 0x120A0 */ s32 ocarinaAvailableSongs;
/* 0x120A4 */ s16 stickAdjX;
/* 0x120A6 */ s16 stickAdjY;
/* 0x120A8 */ s16 stickXRepeatState;
/* 0x120AA */ s16 stickYRepeatState;
/* 0x120AC */ s16 stickXRepeatTimer;
/* 0x120AE */ s16 stickYRepeatTimer;
/* 0x120B0 */ u8 ocarinaSongEffectActive;
/* 0x120B1 */ u8 bombersNotebookEventQueueCount;
/* 0x120B2 */ u8 bombersNotebookEventQueue[10];
/* 0x120BC */ u16 hudVisibility;
#if MM_VERSION >= N64_US
/* 0x120BE */ s16 inputLineNumber;
/* 0x120C0 */ s16 codeBufOffset;
/* 0x120C2 */ s16 inputDigitIndex;
/* 0x120C4 */ s32 unk120C4;
/* 0x120C8 */ s16 unk120C8;
/* 0x120CA */ s16 unk120CA;
/* 0x120CC */ s16 unk120CC;
/* 0x120CE */ s16 unk120CE;
/* 0x120D0 */ s16 unk120D0;
/* 0x120D2 */ s16 unk120D2;
/* 0x120D4 */ s16 unk120D4;
/* 0x120D6 */ s16 unk120D6;
/* 0x120D8 */ s16 lineCount;
/* 0x120DA */ UNK_TYPE1 unk_120DA[0x6];
#endif
} MessageContext; // size = 0x120E0
bool Message_ShouldAdvance(struct PlayState* play);
void Message_CloseTextbox(struct PlayState* play);
void Message_DrawTextChar(struct PlayState* play, TexturePtr texture, Gfx** gfxP);
void Message_DrawItemIcon(struct PlayState* play, Gfx** gfxP);
void Message_HandleOcarina(struct PlayState* play);
void Message_LoadItemIcon(struct PlayState* play, u16 itemId, s16 arg2);
void Message_DecodeHeader(struct PlayState* play);
void Message_PauseMenu_ShowDescription(struct PlayState* play, u16 textId, u8 textBoxPos);
void Message_StartTextbox(struct PlayState* play, u16 textId, struct Actor* actor);
void Message_ContinueTextbox(struct PlayState* play, u16 textId);
void Message_DisplaySceneTitleCard(struct PlayState* play, u16 textId);
void Message_BombersNotebookQueueEvent(struct PlayState* play, u8 event);
void Message_DisplayOcarinaStaff(struct PlayState* play, u16 ocarinaAction);
void Message_DisplayOcarinaStaffBlockSunsSong(struct PlayState* play, u16 ocarinaAction);
u8 Message_GetState(MessageContext* msgCtx);
void Message_Draw(struct PlayState* play);
void Message_Update(struct PlayState* play);
void Message_Init(struct PlayState* play);
void Message_FindMessageNES(struct PlayState* play, u16 textId);
void Message_DrawTextNES(struct PlayState* play, Gfx** gfxP, u16 textDrawPos);
void Message_DecodeNES(struct PlayState* play);
void Message_FindCreditsMessage(struct PlayState* play, u16 textId);
void Message_DrawTextCredits(struct PlayState* play, Gfx** gfxP);
void Message_DecodeCredits(struct PlayState* play);
extern u8 gPageSwitchNextButtonStatus[6][5];
extern u16 gBombersNotebookWeekEventFlags[BOMBERS_NOTEBOOK_EVENT_MAX];
extern s16 gOcarinaSongItemMap[];
#endif
|