Paper Mario DX
Paper Mario (N64) modding
 
Loading...
Searching...
No Matches
msg_api.c
Go to the documentation of this file.
1#include "common.h"
2
5extern s32 D_802DAE58[2]; // unused?
6extern char D_802DAE60[0x400]; // unused?
8extern s32 D_802DB264;
10
11ApiStatus _show_message(Evt* script, s32 isInitialCall, s32 mode);
12
13enum {
18};
19
20API_CALLABLE(SpeakToPlayer) {
21 return _show_message(script, isInitialCall, SHOW_MESSAGE_SPEAK_TO_PLAYER);
22}
23
24API_CALLABLE(EndSpeech) {
25 return _show_message(script, isInitialCall, SHOW_MESSAGE_END_SPEECH);
26}
27
28API_CALLABLE(ContinueSpeech) {
29 return _show_message(script, isInitialCall, SHOW_MESSAGE_CONTINUE_SPEECH);
30}
31
32API_CALLABLE(SpeakToNpc) {
33 return _show_message(script, isInitialCall, SHOW_MESSAGE_SPEAK_TO_NPC);
34}
35
36s32 _show_message(Evt* script, s32 isInitialCall, s32 mode) {
37 PlayerStatus* playerStatus = &gPlayerStatus;
38 Bytecode* args = script->ptrReadPos;
39 s32 screenX, screenY, screenZ;
40 Npc* speakerNpc;
41 Npc* targetNpc;
42 f32 reverseAngle;
43 f32 angle;
44 f32* listenerYaw;
45 s32 speakerNpcID;
46 s32 targetNpcID;
47 s32 msgID;
48 s32 animID;
49
50 targetNpc = nullptr;
51
52 if (isInitialCall) {
53 D_802DB264 = 0;
54 speakerNpcID = evt_get_variable(script, *args++);
55 script->varTable[13] = evt_get_variable(script, *args++);
56 script->varTable[14] = evt_get_variable(script, *args++);
57 script->functionTemp[1] = evt_get_variable(script, *args++);
60
61 if (script->functionTemp[1] & SPEECH_FLAG_HAS_OFFSET) {
64 }
65
66 switch (mode) {
68 msgID = evt_get_variable(script, *args++);
70 break;
73 break;
75 msgID = evt_get_variable(script, *args++);
77 break;
79 targetNpcID = evt_get_variable(script, *args++);
80 msgID = evt_get_variable(script, *args++);
81 targetNpc = resolve_npc(script, targetNpcID);
83 break;
84 }
85
86 if (speakerNpcID == NPC_PLAYER) {
88 playerStatus->pos.y + playerStatus->colliderHeight, playerStatus->pos.z,
89 &screenX, &screenY, &screenZ);
90 script->functionTemp[3] = playerStatus->anim;
91 speakerNpc = (Npc*) NPC_PLAYER;
92 script->varTable[15] = playerStatus->targetYaw;
93 } else {
94 speakerNpc = resolve_npc(script, speakerNpcID);
95 get_screen_coords(gCurrentCameraID, speakerNpc->pos.x, speakerNpc->pos.y + speakerNpc->collisionHeight, speakerNpc->pos.z,
96 &screenX, &screenY, &screenZ);
97 script->functionTemp[3] = speakerNpc->curAnim;
98 script->varTable[15] = speakerNpc->yaw;
99 }
100
102 screenX + ShowMessageScreenOffsetX,
103 screenY + ShowMessageScreenOffsetY);
104 script->varTablePtr[12] = speakerNpc;
105
106 if (speakerNpc != (Npc*) NPC_PLAYER) {
107 if (mode == SHOW_MESSAGE_SPEAK_TO_NPC) {
108 listenerYaw = &targetNpc->yaw;
109 angle = atan2(speakerNpc->pos.x, speakerNpc->pos.z, targetNpc->pos.x, targetNpc->pos.z);
110 } else {
111 listenerYaw = &playerStatus->targetYaw;
112 angle = atan2(speakerNpc->pos.x, speakerNpc->pos.z, playerStatus->pos.x, playerStatus->pos.z);
113 }
114
115 reverseAngle = clamp_angle(angle + 180.0f);
116 switch (script->functionTemp[1] & SPEECH_ORIENTATION_MASK) {
118 speakerNpc->yaw = angle;
119 *listenerYaw = reverseAngle;
120 break;
122 speakerNpc->yaw = reverseAngle;
123 *listenerYaw = reverseAngle;
124 break;
126 speakerNpc->yaw = angle;
127 *listenerYaw = angle;
128 break;
130 speakerNpc->yaw = reverseAngle;
131 *listenerYaw = angle;
132 break;
134 speakerNpc->yaw = angle;
135 break;
136 case 5:
137 break;
138 }
139 }
140 }
141
142 speakerNpc = script->varTablePtr[12];
143 if (speakerNpc != (Npc*) NPC_PLAYER) {
144 get_screen_coords(gCurrentCameraID, speakerNpc->pos.x, speakerNpc->pos.y + speakerNpc->collisionHeight, speakerNpc->pos.z, &screenX, &screenY, &screenZ);
145 animID = script->varTable[13];
146 if (animID != -1) {
148 animID = script->varTable[14];
149 }
150 set_npc_animation(speakerNpc, animID);
151 }
152 } else {
153 get_screen_coords(gCurrentCameraID, playerStatus->pos.x, playerStatus->pos.y + playerStatus->colliderHeight, playerStatus->pos.z, &screenX, &screenY, &screenZ);
154 if (script->varTable[13] != -1) {
156 playerStatus->anim = script->varTable[13];
157 } else {
158 playerStatus->anim = script->varTable[14];
159 }
160 }
161 }
162
163 if (!(script->functionTemp[1] & SPEECH_FLAG_200)) {
165 }
166
168 return true;
169 }
170
171 if (D_802DB264 != 1) {
172 return false;
173 }
174
175 if (script->varTable[13] != -1) {
176 if (speakerNpc != (Npc*) NPC_PLAYER) {
177 set_npc_animation(speakerNpc, script->functionTemp[3]);
178 } else {
179 playerStatus->anim = script->functionTemp[3];
180 }
181 }
182 if (script->functionTemp[1] & SPEECH_FLAG_10) {
183 speakerNpc->yaw = script->varTable[0xF];
184 }
185 return true;
186}
187
188API_CALLABLE(ShowMessageAtScreenPos) {
189 Bytecode* args = script->ptrReadPos;
190
191 if (isInitialCall) {
192 s32 msgID = evt_get_variable(script, *args++);
193 s32 x = evt_get_variable(script, *args++);
194 s32 y = evt_get_variable(script, *args++);
195 s32* temp802DB264 = &D_802DB264;
196
197 *temp802DB264 = 0;
198 gCurrentPrintContext = msg_get_printer_for_msg(msgID, temp802DB264);
200 }
201
203 return ApiStatus_DONE1;
204 }
205
206 if (D_802DB264 != 1) {
207 return ApiStatus_BLOCK;
208 }
209
210 script->varTable[0] = gCurrentPrintContext->curOption;
211 return ApiStatus_DONE1;
212}
213
214API_CALLABLE(ShowMessageAtWorldPos) {
215 Bytecode* args = script->ptrReadPos;
216 MessagePrintState** currentPrintContext;
217 s32* currentCameraID = &gCurrentCameraID;
218
219 if (isInitialCall) {
220 s32 msgID = evt_get_variable(script, *args++);
221 s32 x = evt_get_variable(script, *args++);
222 s32 y = evt_get_variable(script, *args++);
223 s32 z = evt_get_variable(script, *args++);
224 s32 x2;
225 s32 y2;
226 s32 z2;
227 s32* temp802DB264 = &D_802DB264;
228
229 *temp802DB264 = 0;
230 currentPrintContext = &gCurrentPrintContext;
231 *currentPrintContext = msg_get_printer_for_msg(msgID, temp802DB264);
232 get_screen_coords(*currentCameraID, x, y, z, &x2, &y2, &z2);
233 msg_printer_set_origin_pos(*currentPrintContext, x2, y2);
234 }
235
237 return ApiStatus_DONE1;
238 }
239
240 if (D_802DB264 != 1) {
241 return ApiStatus_BLOCK;
242 }
243
244 script->varTable[0] = gCurrentPrintContext->curOption;
245 return ApiStatus_DONE1;
246}
247
248API_CALLABLE(CloseMessage) {
249 if (isInitialCall) {
251 }
252
254 return ApiStatus_DONE1;
255 } else if (D_802DB264 != 1) {
256 return ApiStatus_BLOCK;
257 } else {
258 script->varTable[0] = gCurrentPrintContext->curOption;
259 return ApiStatus_DONE1;
260 }
261}
262
263API_CALLABLE(SwitchMessage) {
264 Bytecode* args = script->ptrReadPos;
265
266 if (isInitialCall) {
268 }
269
271 return ApiStatus_DONE1;
272 } else if (D_802DB264 != 1) {
273 return ApiStatus_BLOCK;
274 } else {
275 script->varTable[0] = gCurrentPrintContext->curOption;
276 return ApiStatus_DONE1;
277 }
278}
279
280API_CALLABLE(ShowChoice) {
281 Bytecode* args = script->ptrReadPos;
282 MessagePrintState** temp802DB268;
283
284 if (isInitialCall) {
285 s32 msgID = evt_get_variable(script, *args++);
286
287 script->functionTemp[1] = 0;
288 D_802DB268 = msg_get_printer_for_msg(msgID, &script->functionTemp[1]);
289 }
290
291 temp802DB268 = &D_802DB268;
292 script->varTable[0] = gCurrentPrintContext->curOption = (*temp802DB268)->curOption;
293
294 if ((*temp802DB268)->stateFlags & MSG_STATE_FLAG_40) {
295 return ApiStatus_DONE1;
296 }
297
298 return script->functionTemp[1] == 1;
299}
300
301API_CALLABLE(CloseChoice) {
303 return ApiStatus_DONE1;
304}
305
306API_CALLABLE(CancelMessage) {
308 return ApiStatus_DONE2;
309}
310
313 return 0;
314}
315
316API_CALLABLE(SetMessageImages) {
317 Bytecode* args = script->ptrReadPos;
318
320 return ApiStatus_DONE2;
321}
322
323API_CALLABLE(func_802D0C94) {
324 Bytecode* args = script->ptrReadPos;
325
326 if (evt_get_variable(script, *args++) == 0) {
328 } else {
329 gOverrideFlags &= ~GLOBAL_OVERRIDES_MESSAGES_OVER_FRONTUI;
330 }
331 return ApiStatus_DONE2;
332}
333
334API_CALLABLE(SetMessageText) {
335 Bytecode* args = script->ptrReadPos;
336 s32 msg = evt_get_variable(script, *args++);
337 s32 index = evt_get_variable(script, *args++);
338
339 set_message_text_var(msg, index);
340 return ApiStatus_DONE2;
341}
342
343API_CALLABLE(SetMessageValue) {
344 Bytecode* ptrReadPos = script->ptrReadPos;
345 s32 value = evt_get_variable(script, *ptrReadPos++);
346 s32 index = evt_get_variable(script, *ptrReadPos);
347
348 set_message_int_var(value, index);
349 return ApiStatus_DONE2;
350}
Bytecode * ptrReadPos
#define clamp_angle
#define atan2
@ MSG_STATE_FLAG_40
Definition enums.h:5829
@ MSG_STATE_FLAG_SPEAKING
Definition enums.h:5830
@ SPEECH_FLAG_10
Definition enums.h:1962
@ SPEECH_FACE_LIKE_LISTENER
Definition enums.h:1970
@ SPEECH_FACE_SPEAKER_ONLY
Definition enums.h:1967
@ SPEECH_FLAG_HAS_OFFSET
Definition enums.h:1963
@ SPEECH_ORIENTATION_MASK
Definition enums.h:1966
@ SPEECH_FACE_AWAY_FROM
Definition enums.h:1968
@ SPEECH_FACE_EACH_OTHER
Definition enums.h:1971
@ SPEECH_FLAG_200
Definition enums.h:1964
@ SPEECH_FACE_LIKE_SPEAKER
Definition enums.h:1969
@ NPC_PLAYER
Definition enums.h:2513
@ GLOBAL_OVERRIDES_MESSAGES_OVER_FRONTUI
Definition enums.h:3908
s32 ApiStatus
Definition evt.h:116
#define ApiStatus_DONE2
Definition evt.h:119
s32 Bytecode
Definition evt.h:7
#define ApiStatus_DONE1
Definition evt.h:118
#define ApiStatus_BLOCK
Definition evt.h:117
s32 evt_get_variable(Evt *script, Bytecode var)
Definition evt.c:1730
void set_npc_animation(Npc *npc, u32 animID)
Definition npc_api.c:18
void msg_printer_set_origin_pos(MessagePrintState *msgPrintState, s32 x, s32 y)
Definition msg.c:1491
void get_screen_coords(s32 camID, f32 x, f32 y, f32 z, s32 *screenX, s32 *screenY, s32 *screenZ)
Definition cam_main.c:409
s32 cancel_message(MessagePrintState *msgPrintState)
Definition msg.c:1509
void close_message(MessagePrintState *msgPrintState)
Definition msg.c:1570
MessagePrintState * msg_get_printer_for_msg(s32 msgID, s32 *a1)
Definition msg.c:1426
void set_message_int_var(s32 value, s32 index)
Definition msg.c:1552
void set_message_text_var(s32 msgID, s32 index)
Definition msg.c:1522
Npc * resolve_npc(Evt *script, s32 npcIdOrPtr)
Definition npc_api.c:8
void set_message_images(MessageImageData *images)
Definition msg.c:1518
s32 msg_printer_load_msg(s32 msgID, MessagePrintState *printer)
Definition msg.c:1476
s32 ShowMessageScreenOffsetY
Definition script_list.c:39
MessagePrintState * gCurrentPrintContext
Definition script_list.c:40
char D_802DAE60[0x400]
s32 D_802DAE58[2]
ApiStatus _show_message(Evt *script, s32 isInitialCall, s32 mode)
Definition msg_api.c:36
MessagePrintState * D_802DB268
Definition script_list.c:41
s32 ShowMessageScreenOffsetX
Definition script_list.c:38
s32 D_802DB264
Definition script_list.c:42
@ SHOW_MESSAGE_END_SPEECH
Definition msg_api.c:15
@ SHOW_MESSAGE_SPEAK_TO_NPC
Definition msg_api.c:17
@ SHOW_MESSAGE_CONTINUE_SPEECH
Definition msg_api.c:16
@ SHOW_MESSAGE_SPEAK_TO_PLAYER
Definition msg_api.c:14
s32 cancel_current_message(void)
Definition msg_api.c:311
#define EndSpeech(ARGS...)
Definition msg_api.h:10
#define SpeakToNpc(ARGS...)
Definition msg_api.h:18
#define ContinueSpeech(ARGS...)
Definition msg_api.h:14
#define SpeakToPlayer(ARGS...)
Definition msg_api.h:6
ApiStatus SetMessageText(Evt *script, b32 isInitialCall)
ApiStatus ShowMessageAtWorldPos(Evt *script, b32 isInitialCall)
ApiStatus SwitchMessage(Evt *script, b32 isInitialCall)
ApiStatus ShowChoice(Evt *script, b32 isInitialCall)
ApiStatus SetMessageImages(Evt *script, b32 isInitialCall)
ApiStatus CloseMessage(Evt *script, b32 isInitialCall)
ApiStatus func_802D0C94(Evt *script, b32 isInitialCall)
ApiStatus CancelMessage(Evt *script, b32 isInitialCall)
ApiStatus ShowMessageAtScreenPos(Evt *script, b32 isInitialCall)
ApiStatus SetMessageValue(Evt *script, b32 isInitialCall)
ApiStatus CloseChoice(Evt *script, b32 isInitialCall)
AnimID curAnim
s16 collisionHeight
Vec3f pos
s32 gOverrideFlags
Definition main_loop.c:10
PlayerStatus gPlayerStatus
Definition 77480.c:38
s32 gCurrentCameraID
Definition cam_math.c:5