summaryrefslogtreecommitdiff
path: root/include/z64message.h
blob: da4349d69f9e9514252c79af8fe5d24f168c00c9 (plain)
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
#ifndef Z64MESSAGE_H
#define Z64MESSAGE_H

#include "PR/ultratypes.h"
#include "stdbool.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_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_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 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 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;
    /* 0x12088 */ UNK_TYPE1 unk12088[0x4];
    /* 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;
    /* 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

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