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
342
343
344
345
346
347
348
349
350
351
352
|
#ifndef Z64MESSAGE_H
#define Z64MESSAGE_H
#include "PR/ultratypes.h"
#include "z64view.h"
#include "unk.h"
struct Actor;
struct MessageTableEntry;
struct OcarinaStaff;
struct PlayState;
typedef enum TextBoxType {
/* 0x00 */ TEXTBOX_TYPE_0,
/* 0x01 */ TEXTBOX_TYPE_1,
/* 0x02 */ TEXTBOX_TYPE_2,
/* 0x03 */ TEXTBOX_TYPE_3,
/* 0x04 */ TEXTBOX_TYPE_4,
/* 0x05 */ TEXTBOX_TYPE_5,
/* 0x06 */ TEXTBOX_TYPE_6,
/* 0x07 */ TEXTBOX_TYPE_7,
/* 0x08 */ TEXTBOX_TYPE_8,
/* 0x09 */ TEXTBOX_TYPE_9,
/* 0x0A */ TEXTBOX_TYPE_A,
/* 0x0B */ TEXTBOX_TYPE_B,
/* 0x0C */ TEXTBOX_TYPE_C,
/* 0x0D */ TEXTBOX_TYPE_D,
/* 0x0E */ TEXTBOX_TYPE_E,
/* 0x0F */ TEXTBOX_TYPE_F,
/* 0x10 */ TEXTBOX_TYPE_MAX
} TextBoxType;
#define TEXTBOX_ENDTYPE_00 0x00
#define TEXTBOX_ENDTYPE_10 0x10
#define TEXTBOX_ENDTYPE_11 0x11
#define TEXTBOX_ENDTYPE_12 0x12
#define TEXTBOX_ENDTYPE_20 0x20
#define TEXTBOX_ENDTYPE_30 0x30
#define TEXTBOX_ENDTYPE_40 0x40
#define TEXTBOX_ENDTYPE_41 0x41
#define TEXTBOX_ENDTYPE_42 0x42
#define TEXTBOX_ENDTYPE_50 0x50
#define TEXTBOX_ENDTYPE_52 0x52
#define TEXTBOX_ENDTYPE_55 0x55
#define TEXTBOX_ENDTYPE_56 0x56
#define TEXTBOX_ENDTYPE_57 0x57
#define TEXTBOX_ENDTYPE_60 0x60
#define TEXTBOX_ENDTYPE_61 0x61
#define TEXTBOX_ENDTYPE_62 0x62
#define TEXTBOX_ENDTYPE_63 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_1,
/* 2 */ TEXT_STATE_CLOSING,
/* 3 */ TEXT_STATE_3,
/* 4 */ TEXT_STATE_CHOICE,
/* 5 */ TEXT_STATE_5,
/* 6 */ TEXT_STATE_DONE,
/* 7 */ TEXT_STATE_7,
/* 8 */ TEXT_STATE_8,
/* 9 */ TEXT_STATE_9,
/* 10 */ TEXT_STATE_10,
/* 11 */ TEXT_STATE_11,
/* 12 */ TEXT_STATE_12,
/* 13 */ TEXT_STATE_13,
/* 14 */ TEXT_STATE_14,
/* 15 */ TEXT_STATE_15,
/* 16 */ TEXT_STATE_16,
/* 17 */ TEXT_STATE_17,
/* 18 */ TEXT_STATE_18
} TextState;
#define FONT_CHAR_TEX_WIDTH 16
#define FONT_CHAR_TEX_HEIGHT 16
//! TODO: Make this use `sizeof(AnyFontTextureSymbol)`
#define FONT_CHAR_TEX_SIZE ((16 * 16) / 2) // 16x16 I4 texture
// TODO: should Font be in its own header or is it fine to have it here?
// Font textures are loaded into here
typedef struct {
/* 0x00000 */ union {
u8 charBuf[2][FONT_CHAR_TEX_SIZE * 120];
u64 force_structure_alignment_charTex;
};
/* 0x07800 */ union {
u8 iconBuf[FONT_CHAR_TEX_SIZE];
u64 force_structure_alignment_icon;
};
/* 0x07880 */ union {
u8 fontBuf[FONT_CHAR_TEX_SIZE * 320];
u64 force_structure_alignment_font;
};
/* 0x11880 */ union {
char schar[1280]; // msgBuf
u16 wchar[640]; // msgBufWide
u64 force_structure_alignment_msg;
} msgBuf;
/* 0x11D80 */ uintptr_t messageStart;
/* 0x11D84 */ uintptr_t messageEnd;
/* 0x11D88 */ u8 unk_11D88; // current Char Buffer ?
} Font; // size = 0x11D90
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 unk11F08;
/* 0x11F0A */ u8 textBoxType;
/* 0x11F0B */ u8 textBoxPos;
/* 0x11F0C */ u8 unk11F0C;
/* 0x11F10 */ s32 msgLength;
/* 0x11F14 */ u16 nextTextId;
/* 0x11F16 */ u16 itemId;
/* 0x11F18 */ u8 unk11F18;
/* 0x11F1A */ s16 unk11F1A[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 unk11FF8;
/* 0x11FFA */ s16 unk11FFA;
/* 0x11FFC */ s16 unk11FFC;
/* 0x11FFE */ s16 unk11FFE[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 unk12054[6]; // First, second and third digits in lottery code guess
/* 0x1205A */ UNK_TYPE1 unk12060[0x8];
/* 0x12068 */ s16 textboxX;
/* 0x1206A */ s16 textboxY;
/* 0x1206C */ s32 unk1206C;
/* 0x12070 */ s32 unk12070;
/* 0x12074 */ s32 unk12074;
/* 0x12078 */ s32 bankRupeesSelected;
/* 0x1207C */ s32 bankRupees;
/* 0x12080 */ struct MessageTableEntry* messageEntryTable;
/* 0x12084 */ struct MessageTableEntry* messageEntryTableNes;
/* 0x12088 */ UNK_TYPE1 unk12088[0x4];
/* 0x1208C */ struct MessageTableEntry* messageTableStaff;
/* 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;
/* 0x120BE */ s16 unk120BE;
/* 0x120C0 */ s16 unk120C0;
/* 0x120C2 */ s16 unk120C2;
/* 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 unk120D8;
/* 0x120DA */ UNK_TYPE1 unk_120DA[0x6];
} MessageContext; // size = 0x120E0
s32 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_SetupLoadItemIcon(struct PlayState* play);
void func_801514B0(struct PlayState* play, u16 arg1, u8 arg2);
void Message_StartTextbox(struct PlayState* play, u16 textId, 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
|