Paper Mario DX
Paper Mario (N64) modding
 
Loading...
Searching...
No Matches
msg.c File Reference

Go to the source code of this file.

Macros

#define MSG_ROM_START   0x1B83000
 
#define CHOICE_POINTER_MOVE_RATE   6.0
 
#define CHAR_SPACE_MULTIPLIER   0.6
 

Typedefs

typedef MessageImageDataMessageImageDataList[1]
 

Enumerations

enum  RewindArrowStates {
  REWIND_ARROW_STATE_INIT = 0 , REWIND_ARROW_STATE_GROW = 1 , REWIND_ARROW_STATE_NEUTRAL = 2 , REWIND_ARROW_STATE_CHANGE_COLOR = 3 ,
  REWIND_ARROW_STATE_CHANGE_COLOR_BACK = 4
}
 

Functions

s32 draw_image_with_clipping (IMG_PTR raster, s32 width, s32 height, s32 fmt, s32 bitDepth, s16 posX, s16 posY, u16 clipULx, u16 clipULy, u16 clipLRx, u16 clipRLy)
 
s32 _update_message (MessagePrintState *printer)
 
void msg_copy_to_print_buffer (MessagePrintState *printer, s32 arg1, s32 arg2)
 
void initialize_printer (MessagePrintState *printer, s32 arg1, s32 arg2)
 
MessagePrintState_msg_get_printer_for_msg (s32 msgID, s32 *donePrintingWriteback, s32 arg2)
 
void msg_update_rewind_arrow (s32)
 
void msg_draw_rewind_arrow (s32)
 
void msg_draw_choice_pointer (MessagePrintState *printer)
 
void draw_message_window (MessagePrintState *printer)
 
void appendGfx_message (MessagePrintState *, s16, s16, u16, u16, u16, u8)
 
void clear_character_set (void)
 
void clear_printers (void)
 
void load_font_data (Addr offset, u16 size, void *dest)
 
void load_font (s32 font)
 
void update_messages (void)
 
void render_messages (void)
 
void msg_play_speech_sound (MessagePrintState *printer, u8 character)
 
void dma_load_msg (u32 msgID, void *dest)
 
s8load_message_to_buffer (s32 msgID)
 
MessagePrintStatemsg_get_printer_for_msg (s32 msgID, s32 *donePrintingWriteback)
 
s32 msg_printer_load_msg (s32 msgID, MessagePrintState *printer)
 
void msg_printer_set_origin_pos (MessagePrintState *msgPrintState, s32 x, s32 y)
 
s32 cancel_message (MessagePrintState *msgPrintState)
 
void set_message_images (MessageImageData *images)
 
void set_message_text_var (s32 msgID, s32 index)
 
void set_message_int_var (s32 value, s32 index)
 
void close_message (MessagePrintState *msgPrintState)
 
s32 msg_get_print_char_width (s32 character, s32 charset, s32 variation, f32 msgScale, s32 overrideCharWidth, u8 flags)
 
s32 msg_get_draw_char_width (s32 character, s32 charset, s32 variation, f32 msgScale, s32 overrideCharWidth, u16 flags)
 
void get_msg_properties (s32 msgID, s32 *height, s32 *width, s32 *maxLineChars, s32 *numLines, s32 *maxLinesPerPage, s32 *numSpaces, u16 charset)
 
s32 get_msg_width (s32 msgID, u16 charset)
 
s32 get_msg_lines (s32 msgID)
 
void draw_msg (s32 msgID, s32 posX, s32 posY, s32 opacity, s32 palette, u8 style)
 
void draw_digit (IMG_PTR img, s32 charset, s32 posX, s32 posY)
 
void draw_number (s32 value, s32 x, s32 y, s32 charset, s32 palette, s32 opacity, u16 style)
 

Variables

Vp D_8014C280
 
u8 MessagePlural [] = { MSG_CHAR_LOWER_S, MSG_CHAR_READ_END }
 
u8 MessageSingular [] = { MSG_CHAR_READ_ENDL, MSG_CHAR_READ_END }
 
s16 gNextMessageBuffer = 0
 
Vtx gRewindArrowQuad []
 
Gfx D_8014C2D8 []
 
s32 gMsgBGScrollAmtX
 
u16 gMsgGlobalWaveCounter
 
MessageImageDataList gMsgVarImages
 
s32 gMsgBGScrollAmtY
 
u8D_8015131C
 
GfxD_80151338
 
IMG_BIN D_80159B50 [0x200]
 
PAL_BIN D_8015C7E0 [0x10]
 
s16 MsgStyleVerticalLineOffsets []
 
IMG_BIN ui_msg_rewind_arrow_png []
 
PAL_BIN ui_msg_rewind_arrow_pal []
 
IMG_BIN ui_msg_star_png []
 
IMG_BIN ui_msg_star_silhouette_png []
 
IMG_BIN MsgCharImgTitle []
 
IMG_BIN MsgCharImgNormal []
 
MessageCharsetMsgCharsets [5]
 
IMG_BIN MsgCharImgSubtitle []
 
PAL_BIN D_802F4560 [80][8]
 
IMG_BIN ui_point_right_png []
 
PAL_BIN ui_point_right_pal []
 
MessageNumber gMsgNumbers []
 
Gfx gMsgDlistInitDrawNumber []
 
s32 gItemIconRasterOffsets []
 
s32 gItemIconPaletteOffsets []
 
IMG_PTR MsgLetterRasterOffsets []
 
PAL_PTR MsgLetterPaletteOffsets []
 
MsgVoice MsgVoices []
 

Macro Definition Documentation

◆ MSG_ROM_START

#define MSG_ROM_START   0x1B83000

Definition at line 23 of file msg.c.

Referenced by dma_load_msg().

◆ CHOICE_POINTER_MOVE_RATE

#define CHOICE_POINTER_MOVE_RATE   6.0

Definition at line 29 of file msg.c.

Referenced by msg_draw_choice_pointer().

◆ CHAR_SPACE_MULTIPLIER

#define CHAR_SPACE_MULTIPLIER   0.6

Definition at line 1577 of file msg.c.

Referenced by msg_get_draw_char_width(), and msg_get_print_char_width().

Typedef Documentation

◆ MessageImageDataList

typedef MessageImageData* MessageImageDataList[1]

Definition at line 32 of file msg.c.

Enumeration Type Documentation

◆ RewindArrowStates

Enumerator
REWIND_ARROW_STATE_INIT 
REWIND_ARROW_STATE_GROW 
REWIND_ARROW_STATE_NEUTRAL 
REWIND_ARROW_STATE_CHANGE_COLOR 
REWIND_ARROW_STATE_CHANGE_COLOR_BACK 

Definition at line 10 of file msg.c.

10 {
16};
@ REWIND_ARROW_STATE_NEUTRAL
Definition msg.c:13
@ REWIND_ARROW_STATE_INIT
Definition msg.c:11
@ REWIND_ARROW_STATE_CHANGE_COLOR_BACK
Definition msg.c:15
@ REWIND_ARROW_STATE_GROW
Definition msg.c:12
@ REWIND_ARROW_STATE_CHANGE_COLOR
Definition msg.c:14

Function Documentation

◆ draw_image_with_clipping()

s32 draw_image_with_clipping ( IMG_PTR raster,
s32 width,
s32 height,
s32 fmt,
s32 bitDepth,
s16 posX,
s16 posY,
u16 clipULx,
u16 clipULy,
u16 clipLRx,
u16 clipRLy )

Referenced by msg_draw_choice_pointer().

◆ _update_message()

s32 _update_message ( MessagePrintState * printer)

Definition at line 277 of file msg.c.

277 {
278 f32 speechPan;
279 u8 cond;
283 s32 i;
284
285 printer->effectFrameCounter++;
286 if (printer->effectFrameCounter >= 3600) {
287 printer->effectFrameCounter = 0;
288 }
289
290 speechPan = (((f32)printer->initOpenPos.x - (SCREEN_WIDTH / 2.0)) / 3.8) + 64.0;
291 if (speechPan < 5.0) {
292 speechPan = 5.0f;
293 } else if (speechPan > 122.0) {
294 speechPan = 122.0f;
295 }
296 printer->speechPan = speechPan;
297
298 cond = false;
299 if (!(printer->stateFlags & MSG_STATE_FLAG_40)) {
300 if (!(printer->stateFlags & (MSG_STATE_FLAG_20 | MSG_STATE_FLAG_10))) {
302
303 switch (printer->windowState) {
305 if (printer->stateFlags & MSG_STATE_FLAG_80000) {
307 }
309 printer->windowState = MSG_WINDOW_STATE_PRINTING;
310 printer->curPrintDelay = 0;
311 printer->stateFlags |= MSG_STATE_FLAG_4;
313 cond = true;
315 } else if (printer->srcBuffer[printer->srcBufferPos] != MSG_CHAR_READ_END) {
317 if (printer->fontVariant != 0 || printer->srcBuffer[printer->srcBufferPos] != MSG_CHAR_UNK_C3) {
319 }
321 } else if (printer->style == MSG_STYLE_RIGHT ||
322 printer->style == MSG_STYLE_LEFT ||
323 printer->style == MSG_STYLE_CENTER ||
324 printer->style == MSG_STYLE_TATTLE)
325 {
327 }
328 } else if ((gGameStatusPtr->pressedButtons[0] & BUTTON_Z) &&
329 !(printer->stateFlags & MSG_STATE_FLAG_40000) &&
330 (printer->curLine != 0))
331 {
332 printer->windowState = MSG_WINDOW_STATE_B;
333 printer->unk_4CC = 0;
334 printer->unkArraySize = printer->curLine - 1;
335 printer->unk_4C8 = abs(printer->curLinePos - printer->lineEndPos[printer->unkArraySize]);
337 }
338 break;
341 printer->windowState = MSG_WINDOW_STATE_B;
342 printer->unk_4CC = 0;
343 printer->unkArraySize = printer->curLine;
344 printer->unk_4C8 = abs(printer->curLinePos - printer->lineEndPos[printer->unkArraySize]);
346 } else if (gGameStatusPtr->pressedButtons[0] & BUTTON_Z) {
347 if (printer->unkArraySize > 0) {
348 printer->windowState = MSG_WINDOW_STATE_B;
349 printer->unk_4CC = 0;
350 printer->unkArraySize--;
351 printer->unk_4C8 = abs(printer->curLinePos - printer->lineEndPos[printer->unkArraySize]);
353 }
354 } else {
356 printer->windowState = MSG_WINDOW_STATE_B;
357 printer->unk_4CC = 0;
358 printer->unkArraySize++;
359 printer->unk_4C8 = abs(printer->curLinePos - printer->lineEndPos[printer->unkArraySize]);
361 }
362 }
363 break;
366 printer->madeChoice = 1;
367 printer->windowState = MSG_WINDOW_STATE_PRINTING;
368 printer->scrollingTime = 0;
369 printer->stateFlags |= MSG_STATE_FLAG_20000;
371 } else if (printer->cancelOption != 0xFF && (gGameStatusPtr->pressedButtons[0] & BUTTON_B)) {
372 if (printer->cancelOption >= printer->maxOption) {
373 printer->selectedOption = printer->curOption;
374 } else {
375 printer->selectedOption = printer->cancelOption;
376 }
377 printer->madeChoice = 1;
378 printer->windowState = MSG_WINDOW_STATE_PRINTING;
379 printer->scrollingTime = 0;
380 printer->curOption = printer->cancelOption;
381 printer->stateFlags |= MSG_STATE_FLAG_20000;
384 if (printer->curOption != printer->maxOption - 1) {
385 printer->targetOption = printer->curOption + 1;
387 printer->scrollingTime = 1;
389 }
390 } else if (gGameStatusPtr->heldButtons[0] & BUTTON_STICK_UP) {
391 if (printer->curOption != 0) {
392 printer->targetOption = printer->curOption - 1;
394 printer->scrollingTime = 1;
396 }
397 }
398
399 if (printer->windowState != MSG_WINDOW_STATE_SCROLLING_BACK) {
400 break;
401 }
403 printer->scrollingTime++;
404 if (printer->scrollingTime >= (s32)(5 * DT)) {
406 printer->curOption = printer->targetOption;
407 printer->selectedOption = printer->curOption;
408 }
409 break;
410 }
411 } else if (!(printer->stateFlags & MSG_STATE_FLAG_20) &&
412 printer->windowState == MSG_WINDOW_STATE_WAITING &&
414 {
415 printer->windowState = MSG_WINDOW_STATE_PRINTING;
416 printer->curPrintDelay = 0;
417 printer->stateFlags |= MSG_STATE_FLAG_4;
418 }
419
420 if (printer->stateFlags & MSG_STATE_FLAG_4 && !(gGameStatusPtr->curButtons[0] & BUTTON_A)) {
421 printer->stateFlags &= ~MSG_STATE_FLAG_4;
422 }
423
424 for (i = 0; i < ARRAY_COUNT(printer->animTimers); i++) {
425 if (printer->animTimers[i] > 0) {
426 printer->animTimers[i]--;
427 }
428 }
429
430 switch (printer->windowState) {
433 if (!(printer->stateFlags & (MSG_STATE_FLAG_20 | MSG_STATE_FLAG_10)) && !cond) {
435
436 }
437 }
438 // fallthrough
440 charsToPrint = printer->charsPerChunk;
441 if (printer->windowState == MSG_WINDOW_STATE_INIT) {
442 printer->windowState = MSG_WINDOW_STATE_PRINTING;
443 printer->curPrintDelay = 0;
444 } else if (printer->stateFlags & MSG_STATE_FLAG_PRINT_QUICKLY) {
445 charsToPrint = 12;
446 printer->curPrintDelay = 0;
447 } else if (!(printer->stateFlags & MSG_STATE_FLAG_4)) {
448 if (!(printer->stateFlags & (MSG_STATE_FLAG_20 | MSG_STATE_FLAG_10)) &&
450 {
451 charsToPrint = 6;
452 printer->curPrintDelay = 0;
453 }
454 }
455 if ((printer->curPrintDelay == 0) || --printer->curPrintDelay == 0) {
457 }
458 break;
461 if (!(printer->stateFlags & (MSG_STATE_FLAG_20 | MSG_STATE_FLAG_10))) {
463 }
464 }
465 printer->curLinePos += printer->windowScrollRate;
466 if ((printer->stateFlags & MSG_STATE_FLAG_PRINT_QUICKLY) ||
467 (!(printer->stateFlags & (MSG_STATE_FLAG_10 | MSG_STATE_FLAG_4)) &&
469 {
470 printer->curLinePos += (s32)(6 / DT);
471 }
472
473 if (printer->curLinePos >= printer->nextLinePos) {
474 printer->windowState = MSG_WINDOW_STATE_PRINTING;
475 printer->curLinePos = printer->nextLinePos;
476 printer->stateFlags |= MSG_STATE_FLAG_4;
477
478 if (printer->style == MSG_STYLE_SIGN ||
479 printer->style == MSG_STYLE_LAMPPOST ||
480 printer->srcBuffer[printer->srcBufferPos] == MSG_CHAR_READ_WAIT)
481 {
482 printer->curPrintDelay = 0;
483 } else {
484 printer->curPrintDelay = 5;
485 }
486 printer->lineEndPos[printer->curLine] = printer->curLinePos;
487 }
488 break;
490 printer->unk_4CC++;
491 endPosDist = abs(printer->curLinePos - printer->lineEndPos[printer->unkArraySize]);
492 lineIncAmt = 2;
493
494 if (printer->unk_4C8 <= 16) {
495 if (endPosDist >= 15) {
496 lineIncAmt = 4;
497 } else if (endPosDist >= 9) {
498 lineIncAmt = 3;
499 }
500 } else if (endPosDist > 96) {
501 lineIncAmt = 10;
502 } else if (endPosDist > 48) {
503 lineIncAmt = 9;
504 } else if (endPosDist >= 24) {
505 lineIncAmt = 7;
506 } else if (endPosDist >= 16) {
507 lineIncAmt = 5;
508 } else if (endPosDist >= 8) {
509 lineIncAmt = 4;
510 } else if (endPosDist > 4) {
511 lineIncAmt = 3;
512 }
513
514 printer->unk_4CA = lineIncAmt;
515
516 if (printer->lineEndPos[printer->unkArraySize] < printer->curLinePos) {
517 printer->curLinePos -= printer->unk_4CA;
518 if (printer->lineEndPos[printer->unkArraySize] >= printer->curLinePos) {
519 printer->curLinePos = printer->lineEndPos[printer->unkArraySize];
520 printer->windowState = MSG_WINDOW_STATE_C;
521 }
522 } else {
523 printer->curLinePos += printer->unk_4CA;
524 if (printer->curLinePos >= printer->lineEndPos[printer->unkArraySize]) {
525 printer->curLinePos = printer->lineEndPos[printer->unkArraySize];
526 printer->windowState = MSG_WINDOW_STATE_C;
527 if (printer->unkArraySize == printer->curLine) {
528 printer->windowState = MSG_WINDOW_STATE_WAITING;
529 printer->rewindArrowAnimState = REWIND_ARROW_STATE_INIT;
530 printer->rewindArrowCounter = 0;
531 }
532 }
533 }
534 break;
545 break;
546 }
547 }
548
549 if (printer->stateFlags & MSG_STATE_FLAG_1) {
550 printer->windowState = MSG_WINDOW_STATE_DONE;
551 printer->stateFlags = 0;
552 if (printer->letterBackgroundImg != nullptr) {
553 general_heap_free(printer->letterBackgroundImg);
554 }
555 if (printer->letterBackgroundPal != nullptr) {
556 general_heap_free(printer->letterBackgroundPal);
557 }
558 if (printer->letterContentImg != nullptr) {
559 general_heap_free(printer->letterContentImg);
560 }
561 if (printer->letterContentPal != nullptr) {
562 general_heap_free(printer->letterContentPal);
563 }
564 if (printer->closedWritebackBool != nullptr) {
565 *printer->closedWritebackBool = true;
566 printer->closedWritebackBool = nullptr;
567 }
568 }
569
570 return printer->windowState;
571}
BSS s32 PopupMenu_SelectedIndex
u32 pressedButtons[4]
@ MSG_STATE_FLAG_4
Definition enums.h:5826
@ MSG_STATE_FLAG_40
Definition enums.h:5829
@ MSG_STATE_FLAG_PRINT_QUICKLY
Definition enums.h:5831
@ MSG_STATE_FLAG_1
Definition enums.h:5824
@ MSG_STATE_FLAG_80000
Definition enums.h:5840
@ MSG_STATE_FLAG_10
Definition enums.h:5827
@ MSG_STATE_FLAG_20
Definition enums.h:5828
@ MSG_STATE_FLAG_20000
Definition enums.h:5838
@ MSG_STATE_FLAG_40000
Definition enums.h:5839
@ MSG_STATE_FLAG_SPEAKING
Definition enums.h:5830
@ BUTTON_A
Definition enums.h:2776
@ BUTTON_C_DOWN
Definition enums.h:2765
@ BUTTON_STICK_UP
Definition enums.h:2777
@ BUTTON_STICK_DOWN
Definition enums.h:2778
@ BUTTON_B
Definition enums.h:2775
@ BUTTON_Z
Definition enums.h:2774
@ MSG_STYLE_CENTER
Definition enums.h:5784
@ MSG_STYLE_LEFT
Definition enums.h:5783
@ MSG_STYLE_SIGN
Definition enums.h:5788
@ MSG_STYLE_LAMPPOST
Definition enums.h:5789
@ MSG_STYLE_RIGHT
Definition enums.h:5782
@ MSG_STYLE_TATTLE
Definition enums.h:5785
@ SOUND_MSG_REWIND
Definition enums.h:707
@ SOUND_MENU_BACK
Definition enums.h:704
@ SOUND_MSG_UNREWIND
Definition enums.h:708
@ SOUND_MENU_CHANGE_SELECTION
Definition enums.h:701
@ SOUND_MSG_SKIP
Definition enums.h:706
@ SOUND_MENU_NEXT
Definition enums.h:703
@ MSG_CHAR_READ_WAIT
Definition enums.h:5629
@ MSG_CHAR_UNK_C3
Definition enums.h:5619
@ MSG_CHAR_READ_END
Definition enums.h:5641
@ MSG_WINDOW_STATE_DONE
Definition enums.h:5852
@ MSG_WINDOW_STATE_B
Definition enums.h:5863
@ MSG_WINDOW_STATE_WAITING
Definition enums.h:5857
@ MSG_WINDOW_STATE_WAITING_FOR_CHOICE
Definition enums.h:5859
@ MSG_WINDOW_STATE_INIT
Definition enums.h:5853
@ MSG_WINDOW_STATE_OPENING
Definition enums.h:5854
@ MSG_WINDOW_STATE_SCROLLING
Definition enums.h:5858
@ MSG_WINDOW_STATE_PRINTING
Definition enums.h:5856
@ MSG_WINDOW_STATE_C
Definition enums.h:5864
@ MSG_WINDOW_STATE_E
Definition enums.h:5866
@ MSG_WINDOW_STATE_SCROLLING_BACK
Definition enums.h:5860
@ MSG_WINDOW_STATE_D
Definition enums.h:5865
@ MSG_WINDOW_STATE_CLOSING
Definition enums.h:5855
@ MSG_WINDOW_STATE_VIEWING_PREV
Definition enums.h:5861
@ MSG_WINDOW_STATE_A
Definition enums.h:5862
s32 general_heap_free(void *data)
Definition heap.c:18
void msg_copy_to_print_buffer(MessagePrintState *printer, s32 arg1, s32 arg2)
Definition msg.c:647
void sfx_play_sound_with_params(s32 soundID, u8 volume, u8 pan, s16 pitchShift)
#define SCREEN_WIDTH
Definition macros.h:108
#define ARRAY_COUNT(arr)
Definition macros.h:39
#define DT
Definition macros.h:534
GameStatus * gGameStatusPtr
Definition main_loop.c:31

Referenced by update_messages().

◆ msg_copy_to_print_buffer()

void msg_copy_to_print_buffer ( MessagePrintState * printer,
s32 arg1,
s32 arg2 )

Definition at line 647 of file msg.c.

647 {
648 u8 arg;
649 u8 argQ;
650 u8 argW;
651 u8 argE;
652 u8 sp10[4];
653 s16 offset;
654 s32 i;
655 u8* romAddr;
656 u8* romEnd;
657 void* a2;
658 s8 s8 = arg2 & 1;
659 u8* printBuf = &printer->printBuffer[printer->printBufferPos];
660 u8* srcBuf = &printer->srcBuffer[printer->srcBufferPos];
661
662 do {
663 u8 c = *srcBuf++; // a1
664 u8 nextArg = *srcBuf; // a2
665 switch (c) {
668 printer->lineCount += (u8)printer->sizeScale;
669 break;
671 printer->windowState = MSG_WINDOW_STATE_WAITING;
672 printer->delayFlags |= MSG_DELAY_FLAG_1;
673 printer->delayFlags &= ~MSG_DELAY_FLAG_2;
674 printer->rewindArrowAnimState = REWIND_ARROW_STATE_INIT;
675 printer->rewindArrowCounter = 0;
676 printer->stateFlags &= ~MSG_STATE_FLAG_SPEAKING;
678 if (printer->style != MSG_STYLE_F) {
680 }
681 break;
683 printer->curPrintDelay = *srcBuf++;
684 printer->delayFlags |= MSG_DELAY_FLAG_1;
685 printer->stateFlags &= ~MSG_STATE_FLAG_SPEAKING;
686 break;
692 printer->fontVariant = c + 13;
693 break;
696 break;
699 break;
702 break;
705 arg1--;
706 break;
708 if (printer->lineCount != 0) {
709 printer->lineEndPos[printer->curLine] = printer->curLinePos;
710 printer->curLine++;
712 printer->nextLinePos = printer->curLinePos + (MsgCharsets[printer->font]->newLineY
713#if !VERSION_JP
715#endif
716 ) * printer->lineCount;
717 printer->windowState = MSG_WINDOW_STATE_SCROLLING;
718 printer->delayFlags |= MSG_DELAY_FLAG_1;
719 }
720 printer->lineCount = 0;
721 break;
724 arg = *srcBuf++;
725 printer->style = arg;
726 *printBuf++ = arg;
727 printer->fadeInCounter = 0;
728 switch (arg) {
729 case MSG_STYLE_RIGHT:
730 case MSG_STYLE_LEFT:
731 case MSG_STYLE_CENTER:
732 case MSG_STYLE_TATTLE:
734 printer->maxLinesPerPage = 3;
735 }
736 printer->delayFlags |= MSG_DELAY_FLAG_1;
738 if (nextArg != MSG_CHAR_UNK_C3) {
739 printer->stateFlags |= MSG_STATE_FLAG_SPEAKING;
740 }
741 printer->speechSoundIDA = SOUND_MSG_VOICE_1A;
742 printer->speechSoundIDB = SOUND_MSG_VOICE_1B;
743 printer->windowState = MSG_WINDOW_STATE_OPENING;
744 break;
745 case MSG_STYLE_CHOICE:
746 printer->windowBasePos.x = *srcBuf++;
747 printer->windowBasePos.y = *srcBuf++;
748 printer->windowSize.x = *srcBuf++;
749 printer->windowSize.y = *srcBuf++;
750 printer->windowState = MSG_WINDOW_STATE_OPENING;
751 printer->stateFlags |= MSG_STATE_FLAG_800;
752 break;
755 case MSG_STYLE_F:
756 if (!s8) {
757#if VERSION_JP
758 printer->windowBasePos.x = 40;
759#else
760 printer->windowBasePos.x = 20;
761#endif
762 printer->windowBasePos.y = 28;
763 printer->windowSize.y = 58;
764#if VERSION_JP
765 printer->windowSize.x = 240;
766#else
767 printer->windowSize.x = 280;
768#endif
769 printer->windowState = MSG_WINDOW_STATE_OPENING;
770 printer->stateFlags |= MSG_STATE_FLAG_800;
771 printer->delayFlags |= MSG_DELAY_FLAG_1;
772 if (arg == MSG_STYLE_INSPECT) {
774 }
775 }
776 break;
778 printer->windowBasePos.x = *srcBuf++;
779 printer->windowBasePos.y = *srcBuf++;
780 printer->windowSize.x = *srcBuf++;
781 printer->windowSize.y = *srcBuf++;
783 printer->windowState = MSG_WINDOW_STATE_OPENING;
784 printer->delayFlags |= MSG_DELAY_FLAG_1;
785 printer->stateFlags |= MSG_STATE_FLAG_800;
786 break;
788 printer->windowSize.y = *srcBuf++;
789 // fallthrough
790 case MSG_STYLE_SIGN:
791 if (!s8) {
792 printer->windowState = MSG_WINDOW_STATE_OPENING;
793 printer->stateFlags |= MSG_STATE_FLAG_800;
794 printer->delayFlags |= MSG_DELAY_FLAG_1;
795 }
796 break;
798 arg = *srcBuf++;
799 printer->windowState = MSG_WINDOW_STATE_OPENING;
800 printer->stateFlags |= MSG_STATE_FLAG_800;
801 printer->delayFlags |= MSG_DELAY_FLAG_1;
805 printer->letterBackgroundPal = heap_malloc(0x20);
807 dma_copy(romAddr, romAddr + 0x20, printer->letterBackgroundPal);
811 printer->letterContentPal = heap_malloc(0x200);
813 dma_copy(romAddr, romAddr + 0x200, printer->letterContentPal);
814 break;
815 case MSG_STYLE_POPUP:
816 case MSG_STYLE_B:
817 printer->windowSize.x = printer->msgWidth + 32;
818#if VERSION_JP
819 printer->windowSize.y = 32;
820#else
821 printer->windowSize.y = 40;
822#endif
823 printer->stateFlags |= MSG_STATE_FLAG_8000;
824 if (!s8) {
826 printer->windowState = MSG_WINDOW_STATE_D;
827 printer->delayFlags |= MSG_DELAY_FLAG_1;
828 }
829 break;
831 printer->windowState = MSG_WINDOW_STATE_PRINTING;
832 break;
833 }
834 if ((printer->delayFlags & MSG_DELAY_FLAG_1) && (printer->delayFlags & (MSG_DELAY_FLAG_4 | MSG_DELAY_FLAG_2))) {
835 printer->delayFlags &= ~MSG_DELAY_FLAG_1;
836 }
837 break;
840 if (printer->stateFlags & MSG_STATE_FLAG_800) {
841 if (printer->stateFlags & MSG_STATE_FLAG_1000) {
842 if (printer->closedWritebackBool != nullptr) {
843 *printer->closedWritebackBool = true;
844 }
845 }
846 if (printer->style != MSG_STYLE_POPUP && printer->style != MSG_STYLE_B) {
847 printer->windowState = MSG_WINDOW_STATE_CLOSING;
848 } else {
849 printer->windowState = MSG_WINDOW_STATE_E;
850 }
851 printer->fadeOutCounter = 0;
852 } else {
853 printer->stateFlags |= MSG_STATE_FLAG_1;
854 }
855 printer->delayFlags |= MSG_DELAY_FLAG_1;
856 printer->delayFlags &= ~MSG_DELAY_FLAG_2;
857 break;
859 switch (*srcBuf++) {
863 *printBuf++ = printer->font = *srcBuf++;
864 break;
868 *printBuf++ = printer->fontVariant = *srcBuf++;
869 break;
873 *printBuf++ = *srcBuf++;
874 break;
876 printer->stateFlags |= MSG_STATE_FLAG_10;
877 break;
879 printer->stateFlags |= MSG_STATE_FLAG_20;
881 break;
883 printer->stateFlags &= ~MSG_STATE_FLAG_20;
884 break;
888 *printBuf++ = *srcBuf++;
889 break;
891 printer->delayFlags |= MSG_DELAY_FLAG_2;
892 break;
894 printer->delayFlags &= ~MSG_DELAY_FLAG_2;
895 printer->delayFlags |= MSG_DELAY_FLAG_1;
896 break;
898 printer->lineEndPos[printer->curLine] = printer->curLinePos;
899 printer->curLine++;
901 arg = *srcBuf++;
902 printer->nextLinePos = printer->curLinePos + (MsgCharsets[printer->font]->newLineY
903#if !VERSION_JP
905#endif
906 ) * arg;
907 printer->windowState = MSG_WINDOW_STATE_SCROLLING;
908 printer->delayFlags |= MSG_DELAY_FLAG_1;
909 printer->lineCount = 0;
910 break;
911#if !VERSION_IQUE
915 *printBuf++ = *srcBuf++;
916 *printBuf++ = arg = *srcBuf++;
917 printer->sizeScale = (arg >> 4) + (arg & 0xF) * 0.0625f;
918 break;
922 printer->sizeScale = 1.0f;
923 break;
924#endif
926 printer->printDelayTime = *srcBuf++;
927 printer->charsPerChunk = *srcBuf++;
928 break;
932 *printBuf++ = *srcBuf++;
933 *printBuf++ = *srcBuf++;
934 break;
938 *printBuf++ = *srcBuf++;
939 break;
943 *printBuf++ = *srcBuf++;
944 break;
948 *printBuf++ = *srcBuf++;
949 break;
950 case MSG_READ_FUNC_UP:
953 *printBuf++ = *srcBuf++;
954 break;
958 *printBuf++ = *srcBuf++;
959 arg1--;
960 printer->curPrintDelay = printer->printDelayTime;
961 if (arg1 <= 0) {
962 printer->delayFlags |= MSG_DELAY_FLAG_1;
963 }
964 if (printer->delayFlags & (MSG_DELAY_FLAG_4 | MSG_DELAY_FLAG_2)) {
965 printer->delayFlags &= ~MSG_DELAY_FLAG_1;
966 }
967 break;
971 *printBuf++ = *srcBuf++;
972 *printBuf++ = *srcBuf++;
973 *printBuf++ = *srcBuf++;
974 printer->curPrintDelay = printer->printDelayTime;
975 if (--arg1 <= 0) {
976 printer->delayFlags |= MSG_DELAY_FLAG_1;
977 }
978 if (printer->delayFlags & (MSG_DELAY_FLAG_4 | MSG_DELAY_FLAG_2)) {
979 printer->delayFlags &= ~MSG_DELAY_FLAG_1;
980 }
981 break;
985
986 arg = *srcBuf++;
987 argQ = *srcBuf++;
988
989 a2 = D_80159B50;
990 offset = arg << 8 | argQ;
991
994 icon_ROM_START + gItemIconRasterOffsets[offset] + 0x200, a2);
995 romEnd = icon_ROM_START + gItemIconPaletteOffsets[offset] + 0x20;
997 romEnd, D_8015C7E0);
998 printer->curPrintDelay = printer->printDelayTime;
999 if (--arg1 <= 0) {
1000 printer->delayFlags |= MSG_DELAY_FLAG_1;
1001 }
1002 if (printer->delayFlags & (MSG_DELAY_FLAG_4 | MSG_DELAY_FLAG_2)) {
1003 printer->delayFlags &= ~MSG_DELAY_FLAG_1;
1004 }
1005 break;
1007 printer->curImageIndex = *srcBuf++;
1008 arg = *srcBuf++;
1009 argQ = *srcBuf++;
1010 printer->varImageScreenPos.x = arg << 8 | argQ;
1011 printer->varImageScreenPos.y = *srcBuf++;
1012 printer->varImgHasBorder = *srcBuf++;
1013 printer->varImgFinalAlpha = *srcBuf++;
1014 printer->varImgAlphaFadeStep = *srcBuf++;
1015 printer->varImageDisplayState = 0;
1016 printer->varImageFadeTimer = 0;
1017 if (--arg1 <= 0) {
1018 printer->delayFlags |= MSG_DELAY_FLAG_1;
1019 }
1020 if (printer->delayFlags & (MSG_DELAY_FLAG_4 | MSG_DELAY_FLAG_2)) {
1021 printer->delayFlags &= ~MSG_DELAY_FLAG_1;
1022 }
1023 break;
1025 arg = *srcBuf++;
1026 if (arg != 0) {
1027 printer->varImageDisplayState = 2;
1028 printer->varImgAlphaFadeStep = arg;
1029 printer->varImageFadeTimer = 0;
1030 } else {
1031 printer->varImageScreenPos.x = 0;
1032 }
1033 break;
1037 *printBuf++ = *srcBuf++;
1038 *printBuf++ = *srcBuf++;
1039 *printBuf++ = *srcBuf++;
1040 printer->delayFlags |= MSG_DELAY_FLAG_4;
1041 break;
1045 *printBuf++ = *srcBuf++;
1046 *printBuf++ = *srcBuf++;
1047 break;
1051 *printBuf++ = *srcBuf++;
1052 printer->delayFlags &= ~MSG_DELAY_FLAG_4;
1053 if (--arg1 <= 0) {
1054 printer->delayFlags |= MSG_DELAY_FLAG_1;
1055 }
1056 break;
1058 arg = *srcBuf++;
1059 argQ = *srcBuf++;
1060 argW = *srcBuf++;
1061 argE = *srcBuf++;
1062 printer->cursorPosX[arg] = argQ << 8 | argW;
1063 printer->cursorPosY[arg] = argE;
1064 break;
1068 *printBuf++ = *srcBuf++;
1069 break;
1072 printer->maxOption = *srcBuf++;
1073 printer->madeChoice = 0;
1074 printer->curOption = 0;
1075 printer->selectedOption = 0;
1077 printer->delayFlags |= MSG_DELAY_FLAG_1;
1078 break;
1080 printer->cancelOption = *srcBuf++;
1081 break;
1085 *printBuf++ = *srcBuf++;
1086 break;
1090 break;
1093 printer->delayFlags |= MSG_DELAY_FLAG_1;
1094 printer->stateFlags &= ~MSG_STATE_FLAG_SPEAKING;
1096 break;
1100 break;
1104 break;
1108 break;
1112 break;
1116 arg = *srcBuf++;
1117 switch (arg) {
1118 case MSG_FX_SHAKE:
1119 case MSG_FX_WAVE:
1121 case MSG_FX_RAINBOW:
1122 case MSG_FX_GLOBAL_WAVE:
1124 case MSG_FX_RISE_PRINT:
1125 case MSG_FX_GROW_PRINT:
1126 case MSG_FX_SIZE_JITTER:
1127 case MSG_FX_SIZE_WAVE:
1128 case MSG_FX_DROP_SHADOW:
1129 *printBuf++ = arg;
1130 break;
1131 case MSG_FX_STATIC:
1132 case MSG_FX_BLUR:
1133 case MSG_FX_DITHER_FADE:
1134 *printBuf++ = arg;
1135 *printBuf++ = *srcBuf++;
1136 break;
1137 }
1138 break;
1142 *printBuf++ = *srcBuf++;
1143 break;
1144 case MSG_READ_FUNC_VAR:
1145 arg = *srcBuf++;
1146 srcBuf -= 3;
1147 if (printer->varBufferReadPos == 0) {
1148 printer->unk_52A = printer->fontVariant;
1150 }
1151
1152 do {
1153 s32 a0 = 1;
1154 argQ = gMessageMsgVars[arg][printer->varBufferReadPos++];
1155 if (argQ >= MSG_CONTROL_CHAR) {
1156
1157 switch (argQ) {
1158 case MSG_CHAR_READ_ENDL:
1159 if (gMessageMsgVars[arg][printer->varBufferReadPos] != MSG_CHAR_READ_END) {
1161 } else {
1162 a0 = 0;
1163 }
1164 break;
1170 printer->fontVariant = sp10[0] + 0x10F;
1171 break;
1172#if !VERSION_JP
1175 break;
1176#endif
1179 switch (gMessageMsgVars[arg][printer->varBufferReadPos++]) {
1182 sp10[2] = gMessageMsgVars[arg][printer->varBufferReadPos++];
1183 a0 = 3;
1184 break;
1187 a0 = 2;
1188 break;
1191 a0 = 2;
1192 break;
1193 }
1194 break;
1195 }
1196 } else {
1197 sp10[0] = argQ;
1198 }
1199 for (i = 0; i < a0; i++) {
1200 arg1--;
1201 *printBuf++ = sp10[i];
1202 }
1203
1204 if (gMessageMsgVars[arg][printer->varBufferReadPos] == MSG_CHAR_READ_END) {
1205 srcBuf += 3;
1206 printer->varBufferReadPos = 0;
1207 printer->fontVariant = printer->unk_52A;
1208 *printBuf++ = MSG_CHAR_PRINT_VARIANT0 + printer->fontVariant;
1209 break;
1210 }
1211 } while ((printer->delayFlags & (MSG_DELAY_FLAG_4 | MSG_DELAY_FLAG_2)) || arg1 > 0);
1212
1213 if (!(printer->delayFlags & (MSG_DELAY_FLAG_4 | MSG_DELAY_FLAG_2)) && arg1 <= 0) {
1214 printer->delayFlags |= MSG_DELAY_FLAG_1;
1215 printer->curPrintDelay = printer->printDelayTime;
1216 }
1218 if (printer->stateFlags & MSG_STATE_FLAG_800000) {
1219 printer->stateFlags |= MSG_STATE_FLAG_SPEAKING;
1220 }
1221 break;
1223 arg = *srcBuf++;
1224 printer->speechSoundType = arg;
1225 printer->speechSoundIDA = MsgVoices[arg].voiceA;
1226 printer->speechSoundIDB = MsgVoices[arg].voiceB;
1227 printer->speechPitchShift = MsgVoices[arg].pitchShift;
1228 break;
1230 printer->volume = *srcBuf++;
1231 break;
1233 arg = *srcBuf++;
1234 argQ = *srcBuf++;
1235 argW = *srcBuf++;
1236 argE = *srcBuf++;
1237 printer->speechSoundIDA = (arg << 0x18) + (argQ << 0x10) + (argW << 0x8) + (argE);
1238 arg = *srcBuf++;
1239 argQ = *srcBuf++;
1240 argW = *srcBuf++;
1241 argE = *srcBuf++;
1242 printer->speechSoundIDB = (arg << 0x18) + (argQ << 0x10) + (argW << 0x8) + (argE);
1243 break;
1247 *printBuf++ = *srcBuf++;
1248 break;
1250 if (*srcBuf++) {
1251 printer->stateFlags |= MSG_STATE_FLAG_40000;
1252 } else {
1253 printer->stateFlags &= ~MSG_STATE_FLAG_40000;
1254 }
1255 break;
1257 printer->stateFlags |= MSG_STATE_FLAG_80000;
1258 break;
1259 }
1260 break;
1261 default:
1262 *printBuf++ = c;
1263 arg1--;
1264#if VERSION_IQUE
1266 *printBuf++ = nextArg;
1267 srcBuf++;
1268 arg1--;
1269 }
1270#endif
1271 if (printer->fontVariant == 0 && c == MSG_CHAR_UNK_C3) {
1272 printer->stateFlags &= ~MSG_STATE_FLAG_SPEAKING;
1273 } else {
1275 if (printer->stateFlags & MSG_STATE_FLAG_800000) {
1276 printer->stateFlags |= MSG_STATE_FLAG_SPEAKING;
1277 }
1278 }
1279 break;
1280 }
1281
1282 if (!(printer->delayFlags & (MSG_DELAY_FLAG_4 | MSG_DELAY_FLAG_2)) && arg1 <= 0) {
1283 printer->delayFlags |= MSG_DELAY_FLAG_1;
1284 printer->curPrintDelay = printer->printDelayTime;
1285 }
1286 if (!(printer->delayFlags & MSG_DELAY_FLAG_1)) {
1287 continue;
1288 }
1289 if (!s8) {
1290 break;
1291 }
1292 if (srcBuf[-1] == MSG_CHAR_READ_END) {
1293 break;
1294 }
1295 arg1 = 10000;
1296 } while (true);
1297
1298 printer->printBufferPos = printBuf - printer->printBuffer;
1299 printer->delayFlags = 0;
1300 printer->srcBufferPos = (u16)(s32)(srcBuf - (s32)printer->srcBuffer);
1302}
unsigned char charset_postcard_OFFSET[]
unsigned short charset_postcard_pal_OFFSET[]
@ MSG_STATE_FLAG_100000
Definition enums.h:5841
@ MSG_STATE_FLAG_800
Definition enums.h:5833
@ MSG_STATE_FLAG_800000
Definition enums.h:5842
@ MSG_STATE_FLAG_8000
Definition enums.h:5836
@ MSG_STATE_FLAG_1000
Definition enums.h:5834
@ MSG_PRINT_FUNC_RIGHT
Definition enums.h:5726
@ MSG_READ_FUNC_COLOR
Definition enums.h:5672
@ MSG_READ_FUNC_CURSOR
Definition enums.h:5697
@ MSG_READ_FUNC_RESTORE_COLOR
Definition enums.h:5704
@ MSG_READ_FUNC_VOLUME
Definition enums.h:5712
@ MSG_READ_FUNC_RESET_GFX
Definition enums.h:5670
@ MSG_PRINT_FUNC_UP
Definition enums.h:5728
@ MSG_READ_FUNC_START_FX
Definition enums.h:5705
@ MSG_READ_FUNC_INPUT_OFF
Definition enums.h:5674
@ MSG_PRINT_FUNC_COLOR
Definition enums.h:5719
@ MSG_PRINT_FUNC_OPTION
Definition enums.h:5736
@ MSG_READ_FUNC_VAR
Definition enums.h:5707
@ MSG_READ_FUNC_VARIANT
Definition enums.h:5668
@ MSG_READ_FUNC_SET_CURSOR
Definition enums.h:5696
@ MSG_READ_FUNC_SET_CANCEL
Definition enums.h:5699
@ MSG_READ_FUNC_DELAY_OFF
Definition enums.h:5676
@ MSG_PRINT_FUNC_FONT
Definition enums.h:5715
@ MSG_PRINT_FUNC_ITEM_ICON
Definition enums.h:5731
@ MSG_PRINT_FUNC_SPACING
Definition enums.h:5720
@ MSG_READ_FUNC_SAVE_COLOR
Definition enums.h:5703
@ MSG_READ_FUNC_VOICE
Definition enums.h:5713
@ MSG_READ_FUNC_SAVE_POS
Definition enums.h:5701
@ MSG_READ_FUNC_CUSTOM_VOICE
Definition enums.h:5711
@ MSG_PRINT_FUNC_ANIM_DELAY
Definition enums.h:5732
@ MSG_READ_FUNC_INLINE_IMAGE
Definition enums.h:5688
@ MSG_READ_FUNC_SET_X
Definition enums.h:5683
@ MSG_PRINT_FUNC_SET_Y
Definition enums.h:5725
@ MSG_PRINT_FUNC_ANIM_LOOP
Definition enums.h:5733
@ MSG_PRINT_FUNC_ANIM_SPRITE
Definition enums.h:5730
@ MSG_READ_FUNC_END_FX
Definition enums.h:5706
@ MSG_READ_FUNC_SET_Y
Definition enums.h:5684
@ MSG_PRINT_FUNC_INLINE_IMAGE
Definition enums.h:5729
@ MSG_PRINT_FUNC_SET_X
Definition enums.h:5724
@ MSG_PRINT_FUNC_SIZE_RESET
Definition enums.h:5723
@ MSG_READ_FUNC_SCROLL
Definition enums.h:5679
@ MSG_PRINT_FUNC_DOWN
Definition enums.h:5727
@ MSG_READ_FUNC_DOWN
Definition enums.h:5686
@ MSG_READ_FUNC_YIELD
Definition enums.h:5671
@ MSG_READ_FUNC_NO_SKIP
Definition enums.h:5673
@ MSG_PRINT_FUNC_SAVE_COLOR
Definition enums.h:5739
@ MSG_READ_FUNC_SPACING
Definition enums.h:5678
@ MSG_READ_FUNC_RESTORE_POS
Definition enums.h:5702
@ MSG_PRINT_FUNC_VARIANT
Definition enums.h:5716
@ MSG_READ_FUNC_SPEED
Definition enums.h:5682
@ MSG_READ_FUNC_OPTION
Definition enums.h:5700
@ MSG_READ_FUNC_SIZE
Definition enums.h:5680
@ MSG_READ_FUNC_ENABLE_CDOWN_NEXT
Definition enums.h:5710
@ MSG_READ_FUNC_HIDE_IMAGE
Definition enums.h:5692
@ MSG_READ_FUNC_DELAY_ON
Definition enums.h:5677
@ MSG_PRINT_FUNC_RESTORE_COLOR
Definition enums.h:5740
@ MSG_PRINT_FUNC_END_FX
Definition enums.h:5742
@ MSG_PRINT_FUNC_START_FX
Definition enums.h:5741
@ MSG_READ_FUNC_END_CHOICE
Definition enums.h:5698
@ MSG_READ_FUNC_IMAGE
Definition enums.h:5691
@ MSG_READ_FUNC_RIGHT
Definition enums.h:5685
@ MSG_PRINT_FUNC_RESTORE_POS
Definition enums.h:5738
@ MSG_READ_FUNC_ANIM_LOOP
Definition enums.h:5694
@ MSG_PRINT_FUNC_CURSOR
Definition enums.h:5735
@ MSG_READ_FUNC_CENTER_X
Definition enums.h:5708
@ MSG_READ_FUNC_ANIM_DELAY
Definition enums.h:5693
@ MSG_READ_FUNC_ITEM_ICON
Definition enums.h:5690
@ MSG_READ_FUNC_SET_REWIND
Definition enums.h:5709
@ MSG_PRINT_FUNC_SIZE
Definition enums.h:5722
@ MSG_READ_FUNC_UP
Definition enums.h:5687
@ MSG_PRINT_FUNC_ANIM_DONE
Definition enums.h:5734
@ MSG_READ_FUNC_INPUT_ON
Definition enums.h:5675
@ MSG_READ_FUNC_FONT
Definition enums.h:5667
@ MSG_READ_FUNC_SIZE_RESET
Definition enums.h:5681
@ MSG_PRINT_FUNC_CENTER_X
Definition enums.h:5743
@ MSG_PRINT_FUNC_SAVE_POS
Definition enums.h:5737
@ MSG_READ_FUNC_ANIM_SPRITE
Definition enums.h:5689
@ MSG_PRINT_RESET_GFX
Definition enums.h:5718
@ MSG_READ_FUNC_ANIM_DONE
Definition enums.h:5695
MsgVoices
Definition enums.h:5807
@ MSG_DELAY_FLAG_4
Definition enums.h:5848
@ MSG_DELAY_FLAG_2
Definition enums.h:5847
@ MSG_DELAY_FLAG_1
Definition enums.h:5846
@ MSG_STYLE_POSTCARD
Definition enums.h:5790
@ MSG_STYLE_UPGRADE
Definition enums.h:5793
@ MSG_STYLE_F
Definition enums.h:5796
@ MSG_STYLE_B
Definition enums.h:5792
@ MSG_STYLE_NARRATE
Definition enums.h:5794
@ MSG_STYLE_INSPECT
Definition enums.h:5787
@ MSG_STYLE_POPUP
Definition enums.h:5791
@ MSG_STYLE_EPILOGUE
Definition enums.h:5795
@ MSG_STYLE_CHOICE
Definition enums.h:5786
@ SOUND_MSG_VOICE_1A
Definition enums.h:565
@ SOUND_MENU_SHOW_CHOICE
Definition enums.h:557
@ SOUND_MSG_WAIT
Definition enums.h:705
@ SOUND_APPROVE
Definition enums.h:935
@ SOUND_MSG_VOICE_1B
Definition enums.h:566
@ MSG_FX_NOISE_OUTLINE
Definition enums.h:5749
@ MSG_FX_RISE_PRINT
Definition enums.h:5756
@ MSG_FX_SIZE_JITTER
Definition enums.h:5758
@ MSG_FX_SHAKE
Definition enums.h:5747
@ MSG_FX_GLOBAL_WAVE
Definition enums.h:5754
@ MSG_FX_GLOBAL_RAINBOW
Definition enums.h:5755
@ MSG_FX_DROP_SHADOW
Definition enums.h:5760
@ MSG_FX_SIZE_WAVE
Definition enums.h:5759
@ MSG_FX_STATIC
Definition enums.h:5750
@ MSG_FX_BLUR
Definition enums.h:5751
@ MSG_FX_DITHER_FADE
Definition enums.h:5753
@ MSG_FX_WAVE
Definition enums.h:5748
@ MSG_FX_RAINBOW
Definition enums.h:5752
@ MSG_FX_GROW_PRINT
Definition enums.h:5757
@ MSG_CHAR_READ_VARIANT2
Definition enums.h:5633
@ MSG_CHAR_READ_PAUSE
Definition enums.h:5630
@ MSG_CHAR_PRINT_SPACE
Definition enums.h:5652
@ MSG_CHAR_READ_HALF_SPACE
Definition enums.h:5637
@ MSG_CHAR_READ_SPACE
Definition enums.h:5635
@ MSG_CHAR_PRINT_NEXT
Definition enums.h:5657
@ MSG_CHAR_READ_VARIANT3
Definition enums.h:5634
@ MSG_CHAR_READ_STYLE
Definition enums.h:5640
@ MSG_CHAR_PRINT_END
Definition enums.h:5658
@ MSG_CHAR_PRINT_ENDL
Definition enums.h:5647
@ MSG_CHAR_READ_FULL_SPACE
Definition enums.h:5636
@ MSG_CHAR_READ_UNK_CHAR_FA
Definition enums.h:5638
@ MSG_CHAR_READ_NEXT
Definition enums.h:5639
@ MSG_CHAR_PRINT_FULL_SPACE
Definition enums.h:5653
@ MSG_CHAR_READ_VARIANT0
Definition enums.h:5631
@ MSG_CHAR_PRINT_VARIANT0
Definition enums.h:5648
@ MSG_CHAR_PRINT_FUNCTION
Definition enums.h:5662
@ MSG_CHAR_PRINT_STYLE
Definition enums.h:5655
@ MSG_CHAR_PRINT_UNK_CHAR_FA
Definition enums.h:5656
@ MSG_CHAR_READ_ENDL
Definition enums.h:5628
@ MSG_CHAR_PRINT_HALF_SPACE
Definition enums.h:5654
@ MSG_CHAR_READ_VARIANT1
Definition enums.h:5632
@ MSG_CONTROL_CHAR
Definition enums.h:5646
@ MSG_CHAR_READ_FUNCTION
Definition enums.h:5643
u32 dma_copy(Addr romStart, Addr romEnd, void *vramDest)
Definition 43F0.c:442
void * heap_malloc(s32 size)
Definition heap.c:34
s32 gItemIconPaletteOffsets[]
PAL_BIN D_8015C7E0[0x10]
Definition msg.c:105
IMG_BIN D_80159B50[0x200]
Definition msg.c:104
s16 MsgStyleVerticalLineOffsets[]
Definition msg_data.c:927
PAL_PTR MsgLetterPaletteOffsets[]
Definition msg_data.c:893
s32 gItemIconRasterOffsets[]
void msg_play_speech_sound(MessagePrintState *printer, u8 character)
Definition msg.c:614
MessageCharset * MsgCharsets[5]
Definition msg_data.c:865
IMG_PTR MsgLetterRasterOffsets[]
Definition msg_data.c:878
u8 * D_8015131C
Definition msg.c:92

Referenced by _update_message(), and draw_msg().

◆ initialize_printer()

void initialize_printer ( MessagePrintState * printer,
s32 arg1,
s32 arg2 )

Definition at line 1305 of file msg.c.

1305 {
1306 s32 i;
1307
1308 printer->printBufferSize = ARRAY_COUNT(printer->printBuffer);
1309 printer->printBuffer[0] = MSG_CHAR_PRINT_END;
1310 printer->printDelayTime = 1;
1311 printer->charsPerChunk = 1;
1312 printer->windowScrollRate = (s32)(6 / DT);
1313 printer->srcBuffer = nullptr;
1314 printer->msgID = 0;
1315 printer->curPrintDelay = 0;
1316 printer->windowOffsetPos.x = 0;
1317 printer->windowOffsetPos.y = 0;
1318 printer->windowBasePos.x = 0;
1319 printer->windowBasePos.y = 0;
1320 printer->rewindArrowAnimState = REWIND_ARROW_STATE_INIT;
1321 printer->rewindArrowCounter = 0;
1322 printer->rewindArrowPos.x = 0;
1323 printer->rewindArrowPos.y = 0;
1324 printer->curLine = 0;
1325 printer->unkArraySize = 0;
1326 printer->maxOption = 0;
1327 printer->madeChoice = 0;
1328 printer->curOption = 0;
1329 printer->selectedOption = 0;
1330 printer->cancelOption = -1;
1331 printer->windowState = MSG_WINDOW_STATE_DONE;
1332 printer->stateFlags = 0;
1333 printer->delayFlags = 0;
1334 printer->closedWritebackBool = nullptr;
1335 printer->printBufferPos = 0;
1336 printer->srcBufferPos = 0;
1337 printer->font = 0;
1338 printer->fontVariant = 0;
1339 printer->effectFrameCounter = 0;
1340 printer->curLinePos = 0;
1341 printer->unk_46C = 0;
1342 printer->lineCount = 0;
1343
1344 for (i = 0; i < ARRAY_COUNT(printer->animTimers); i++) {
1345 printer->curAnimFrame[i] = 0;
1346 printer->animTimers[i] = -1;
1347 }
1348
1349 printer->initOpenPos.x = 160;
1350 printer->initOpenPos.y = 40;
1351 printer->speechSoundType = -1;
1352 printer->speechPan = 64;
1353 printer->volume = 75;
1354 printer->rewindArrowCounter = 0;
1355 printer->style = 0;
1356 printer->fadeInCounter = 0;
1357 printer->openStartPos.x = 0;
1358 printer->openStartPos.y = 0;
1359 printer->fadeOutCounter = 0;
1360 printer->windowSize.y = 0;
1361 printer->windowSize.x = 0;
1362 printer->speechPitchShift = 0;
1363 printer->speechSoundIDA = 0;
1364 printer->speechSoundIDB = 0;
1365 printer->varBufferReadPos = 0;
1366 printer->curImageIndex = 0;
1367 printer->varImageScreenPos.x = 0;
1368 printer->varImageScreenPos.y = 0;
1369 printer->varImgHasBorder = 0;
1370 printer->varImgFinalAlpha = 255;
1371 printer->varImageDisplayState = 0;
1372 printer->varImageFadeTimer = 0;
1373 printer->letterBackgroundImg = nullptr;
1374 printer->letterBackgroundPal = nullptr;
1375 printer->letterContentImg = nullptr;
1376 printer->letterContentPal = nullptr;
1377 printer->sizeScale = 1.0f;
1378}

Referenced by _msg_get_printer_for_msg(), clear_printers(), and draw_msg().

◆ _msg_get_printer_for_msg()

MessagePrintState * _msg_get_printer_for_msg ( s32 msgID,
s32 * donePrintingWriteback,
s32 arg2 )

Definition at line 1430 of file msg.c.

1430 {
1432 s8* srcBuffer;
1433 s32 height;
1434 s32 width;
1435 s32 maxLineChars;
1436 s32 numLines;
1437 s32 maxLinesPerPage;
1438 s32 i;
1439
1440 if (msgID == MSG_NONE) {
1441 return nullptr;
1442 }
1443
1444 srcBuffer = (s8*) msgID;
1445 if (msgID >= 0) {
1446 srcBuffer = load_message_to_buffer((s32)srcBuffer);
1447 }
1448
1449 for (i = 0; i < ARRAY_COUNT(gMessagePrinters); i++) {
1450 printer = &gMessagePrinters[i];
1451
1452 if (!(printer->stateFlags & MSG_STATE_FLAG_2)) {
1453 initialize_printer(printer, 1, arg2);
1454 printer->windowState = MSG_WINDOW_STATE_INIT;
1455 printer->srcBuffer = srcBuffer;
1456 printer->msgID = msgID;
1457 printer->stateFlags |= MSG_STATE_FLAG_2;
1458 get_msg_properties(msgID, &height, &width, &maxLineChars, &numLines, &maxLinesPerPage, nullptr, 0);
1459 printer->msgHeight = height;
1460 printer->msgWidth = width;
1461 printer->maxLineChars = maxLineChars;
1462 printer->numLines = numLines;
1463 printer->maxLinesPerPage = maxLinesPerPage;
1464 printer->closedWritebackBool = donePrintingWriteback;
1465
1466 if (donePrintingWriteback != nullptr) {
1467 *donePrintingWriteback = false;
1468 }
1469 return printer;
1470 }
1471 }
1472
1473 return nullptr;
1474}
@ MSG_STATE_FLAG_2
Definition enums.h:5825
void get_msg_properties(s32 msgID, s32 *height, s32 *width, s32 *maxLineChars, s32 *numLines, s32 *maxLinesPerPage, s32 *numSpaces, u16 charset)
Definition msg.c:1673
s8 * load_message_to_buffer(s32 msgID)
Definition msg.c:1412
void initialize_printer(MessagePrintState *printer, s32 arg1, s32 arg2)
Definition msg.c:1305

Referenced by msg_get_printer_for_msg().

◆ msg_update_rewind_arrow()

void msg_update_rewind_arrow ( s32 printerIndex)

Definition at line 2063 of file msg.c.

2063 {
2064 MessagePrintState* printer = &gMessagePrinters[printerIndex];
2065 f32 angle = 0.0f;
2066 f32 scale = 1.0f;
2067 f32 colorG = 255.0f;
2068 f32 colorR = 255.0f;
2069 f32 colorB = 255.0f;
2070 Matrix4f sp18;
2071 Matrix4f sp58;
2072 f32 temp;
2073
2076
2077 switch (printer->rewindArrowAnimState) {
2079 printer->rewindArrowCounter = 0;
2080 printer->rewindArrowSwingPhase = 0;
2081 printer->rewindArrowAnimState = REWIND_ARROW_STATE_GROW;
2082 // fallthrough
2084 temp = printer->rewindArrowCounter;
2085 scale = temp * 0.2 + 0.5;
2086 if (++printer->rewindArrowCounter >= 4) {
2087 printer->rewindArrowCounter = 0;
2088 printer->rewindArrowAnimState = REWIND_ARROW_STATE_NEUTRAL;
2089 }
2090 break;
2092 if (++printer->rewindArrowCounter >= 25) {
2093 printer->rewindArrowCounter = 0;
2094 printer->rewindArrowAnimState = REWIND_ARROW_STATE_CHANGE_COLOR;
2095 }
2096 break;
2098 colorR = update_lerp(EASING_LINEAR, 255.0f, 224.0f, printer->rewindArrowCounter, 15);
2099 colorG = update_lerp(EASING_LINEAR, 255.0f, 224.0f, printer->rewindArrowCounter, 15);
2100 colorB = update_lerp(EASING_LINEAR, 255.0f, 208.0f, printer->rewindArrowCounter, 15);
2101 if (++printer->rewindArrowCounter >= 15) {
2102 printer->rewindArrowCounter = 0;
2103 printer->rewindArrowAnimState = REWIND_ARROW_STATE_CHANGE_COLOR_BACK;
2104 }
2105 break;
2107 colorR = update_lerp(EASING_LINEAR, 224.0f, 255.0f, printer->rewindArrowCounter, 15);
2108 colorG = update_lerp(EASING_LINEAR, 224.0f, 255.0f, printer->rewindArrowCounter, 15);
2109 colorB = update_lerp(EASING_LINEAR, 208.0f, 255.0f, printer->rewindArrowCounter, 15);
2110 if (++printer->rewindArrowCounter >= 15) {
2111 printer->rewindArrowCounter = 0;
2112 printer->rewindArrowAnimState = REWIND_ARROW_STATE_NEUTRAL;
2113 }
2114 break;
2115 }
2116
2118
2119 if (printer->rewindArrowAnimState == REWIND_ARROW_STATE_NEUTRAL ||
2120 printer->rewindArrowAnimState == REWIND_ARROW_STATE_CHANGE_COLOR ||
2121 printer->rewindArrowAnimState == REWIND_ARROW_STATE_CHANGE_COLOR_BACK) {
2122 angle = cosine(printer->rewindArrowSwingPhase) * 30.0f;
2123 printer->rewindArrowSwingPhase += 15;
2124 if (printer->rewindArrowSwingPhase >= 360) {
2125 printer->rewindArrowSwingPhase -= 360;
2126 }
2127 }
2128
2129 guTranslateF(sp18, printer->rewindArrowPos.x + 12, -(printer->rewindArrowPos.y + 12), 0);
2130 if (angle != 0.0) {
2131 guRotateF(sp58, angle, 0, 0, 1.0f);
2133 }
2134 if (scale != 1.0) {
2135 guScaleF(sp58, scale, scale, 1.0f);
2137 }
2138
2144 gSP2Triangles(gMainGfxPos++, 0, 2, 1, 0, 1, 2, 3, 0);
2145}
Mtx matrixStack[0x200]
f32 Matrix4f[4][4]
#define guRotateF
#define guMtxF2L
#define guTranslateF
#define guMtxCatF
#define guScaleF
@ EASING_LINEAR
Definition enums.h:510
f32 update_lerp(s32 easing, f32 start, f32 end, s32 elapsed, s32 duration)
Definition 43F0.c:735
f32 cosine(s16 arg0)
Definition 43F0.c:352
Vtx gRewindArrowQuad[]
Definition msg.c:64
IMG_BIN ui_msg_star_png[]
Gfx D_8014C2D8[]
Definition msg.c:71
IMG_BIN ui_msg_star_silhouette_png[]
#define VIRTUAL_TO_PHYSICAL(addr)
Definition macros.h:46
Gfx * gMainGfxPos
Definition cam_main.c:14
u16 gMatrixListPos
Definition main_loop.c:44
DisplayContext * gDisplayContext
Definition cam_main.c:15

Referenced by render_messages().

◆ msg_draw_rewind_arrow()

void msg_draw_rewind_arrow ( s32 printerIndex)

Definition at line 2147 of file msg.c.

2147 {
2148 MessagePrintState* printer = &gMessagePrinters[printerIndex];
2149
2150 if (printer->rewindArrowCounter < 6) {
2152 printer->rewindArrowPos.y, 10, 10, SCREEN_WIDTH - 20, SCREEN_HEIGHT - 20, 255);
2153 }
2154
2155 printer->rewindArrowCounter++;
2156 if (printer->rewindArrowCounter >= 12) {
2157 printer->rewindArrowCounter = 0;
2158 }
2159}
s32 draw_ci_image_with_clipping(u8 *raster, s32 width, s32 height, s32 fmt, s32 bitDepth, u16 *palette, s16 posX, s16 posY, u16 clipULx, u16 clipULy, u16 clipLRx, u16 clipRLy, u8 opacity)
IMG_BIN ui_msg_rewind_arrow_png[]
PAL_BIN ui_msg_rewind_arrow_pal[]
#define SCREEN_HEIGHT
Definition macros.h:109

Referenced by render_messages().

◆ msg_draw_choice_pointer()

void msg_draw_choice_pointer ( MessagePrintState * printer)

Definition at line 2161 of file msg.c.

2161 {
2162 s32 pointerAlpha = 255;
2163 s32 shadowAlpha = 72;
2165 s32 posX, posY;
2166
2167 if (printer->windowState == MSG_WINDOW_STATE_WAITING_FOR_CHOICE || (printer->stateFlags & MSG_STATE_FLAG_20000)) {
2168 posX = printer->windowOffsetPos.x + printer->windowBasePos.x + printer->cursorPosX[printer->selectedOption];
2169 posY = printer->windowOffsetPos.y + printer->windowBasePos.y + printer->cursorPosY[printer->selectedOption];
2170 } else {
2171 s32 baseX, baseY, targetX, targetY;
2172 f32 moveToTargetAlpha = (f32)(printer->scrollingTime + 1.0) / CHOICE_POINTER_MOVE_RATE;
2173
2174 baseX = printer->windowOffsetPos.x + printer->windowBasePos.x + printer->cursorPosX[printer->selectedOption];
2175 targetX = printer->windowOffsetPos.x + printer->windowBasePos.x + printer->cursorPosX[printer->targetOption];
2176 posX = baseX + (targetX - baseX) * moveToTargetAlpha;
2177
2178 baseY = printer->windowOffsetPos.y + printer->windowBasePos.y + printer->cursorPosY[printer->selectedOption];
2179 targetY = printer->windowOffsetPos.y + printer->windowBasePos.y + printer->cursorPosY[printer->targetOption];
2180 posY = baseY + (targetY - baseY) * moveToTargetAlpha;
2181 }
2182
2183 posY++;
2184 posX += (cosine(posInterpPhase * 38 + 270) + 1.0) * 0.5 * 3.2;
2185 posX -= 2;
2186
2187 if (printer->stateFlags & MSG_STATE_FLAG_20000) {
2188 u32 opacity;
2189 opacity = 255.0 - printer->fadeOutCounter * 46.0;
2190 pointerAlpha = opacity;
2191 opacity = 72.0 - printer->fadeOutCounter * 14.4;
2192 shadowAlpha = opacity;
2193 }
2194
2200 gDPSetPrimColor(gMainGfxPos++, 0, 0, 40, 40, 40, shadowAlpha);
2201 draw_image_with_clipping(ui_point_right_png, 16, 16, G_IM_FMT_CI, G_IM_SIZ_4b, posX + 2, posY + 2, 10, 10, 300, 220);
2203}
s32 draw_image_with_clipping(IMG_PTR raster, s32 width, s32 height, s32 fmt, s32 bitDepth, s16 posX, s16 posY, u16 clipULx, u16 clipULy, u16 clipLRx, u16 clipRLy)
#define CHOICE_POINTER_MOVE_RATE
Definition msg.c:29
IMG_BIN ui_point_right_png[]
PAL_BIN ui_point_right_pal[]
#define PM_CC_07
Definition macros.h:294

Referenced by render_messages().

◆ draw_message_window()

void draw_message_window ( MessagePrintState * printer)

Definition at line 137 of file msg_draw.c.

137 {
138 f32 scale = 1.0f;
139 s32 rotZ = 0;
140
141 switch (printer->windowState) {
143 scale = (f32)D_8014C580[printer->fadeInCounter] / 100.0;
144 rotZ = (4 - printer->fadeInCounter) * 3;
145 printer->fadeInCounter++;
146 if (D_8014C580[printer->fadeInCounter] == 0) {
147 printer->windowState = MSG_WINDOW_STATE_PRINTING;
148 }
149 break;
151 scale = (f32)D_8014C588[printer->fadeOutCounter] / 100.0;
152 rotZ = -printer->fadeOutCounter;
153 printer->fadeOutCounter++;
154 if (D_8014C588[printer->fadeOutCounter] == 0) {
155 printer->stateFlags |= MSG_STATE_FLAG_1;
156 }
157 break;
158 }
159
160 switch (printer->windowState) {
163 printer->windowBasePos.x = 160 - (printer->windowSize.x / 2);
164 printer->windowBasePos.y = 56;
165 draw_box(DRAW_FLAG_ROTSCALE, WINDOW_STYLE_0, printer->windowBasePos.x, 56, 0, printer->windowSize.x, printer->windowSize.y, 255, 0,
166 scale, scale, 0.0f, 0.0f, rotZ, drawbox_message_delegate, printer, nullptr, SCREEN_WIDTH,
167 SCREEN_HEIGHT, nullptr);
168 break;
169 default:
170 appendGfx_message(printer, printer->windowOffsetPos.x, printer->windowOffsetPos.y, printer->unk_46C,
171 printer->curLinePos, 4, 0);
172 break;
173 }
174}
#define draw_box
@ WINDOW_STYLE_0
Definition enums.h:5955
@ DRAW_FLAG_ROTSCALE
Definition enums.h:4588
void drawbox_message_delegate(s32 data, s32 baseX, s32 baseY, s32 width, s32 height, s32 opacity, s32 darkening)
Definition msg_draw.c:131
u8 D_8014C588[]
Definition msg_draw.c:114
void appendGfx_message(MessagePrintState *, s16, s16, u16, u16, u16, u8)
Definition msg_draw.c:213
u8 D_8014C580[]
Definition msg_draw.c:113

Referenced by render_messages().

◆ appendGfx_message()

void appendGfx_message ( MessagePrintState * printer,
s16 posX,
s16 posY,
u16 additionalOffsetX,
u16 additionalOffsetY,
u16 flag,
u8 alpha )

Definition at line 213 of file msg_draw.c.

214 {
217 s16 sp8E;
218 s16 sp96;
219 s16 sp9E;
220 s16 palette;
221 s16 spAE;
222 u16 spB6;
223 u8 spB8;
224#if VERSION_IQUE
225 u16 byte = 0;
226#endif
234 f32 bubbleX;
235 f32 bubbleY;
238 f32 temp_f8;
240 f64 temp_f0;
243 f32 temp_f2;
247 s32 temp_a2;
249 s32 i;
250 s16 temp_s3;
251 s16 temp_s4;
254 s16 temp_s5;
255 s16 temp_s6;
257 s32 animIdx;
262 s32 phi_a0;
265 s32 height;
266 s32 frameX;
267 s32 frameY;
272 u16 fading;
273 u8 phi_s0_5;
276 s8 phi_s2_4;
277 u8 phi_s3_2;
280 s16 phi_t5;
282 s16 phi_t3;
283 s32 dbPos;
289 s8 varImgHasBorder;
292 f32 z1;
293 f32 z2;
294 f32 temp1;
295 f32 temp2;
296#if VERSION_JP
298#else
300#endif
302
303 msg_drawState = &D_80155D20;
304 msg_drawState->printBuffer = printer->printBuffer;
305 msg_drawState->printModeFlags = 0;
306 if (gMainGfxPos != D_80151338) {
308 }
310 sp8E = 255;
311 if (flag & 1) {
312 sp8E = alpha;
313 }
314 msg_drawState->textStartPos[0] = 0;
315 msg_drawState->textStartPos[1] = 0;
316 msg_drawState->clipX[0] = 0;
317 msg_drawState->clipY[0] = 0;
318 msg_drawState->clipX[1] = SCREEN_WIDTH - 1;
319 msg_drawState->clipY[1] = SCREEN_HEIGHT - 1;
320 msg_drawState->msgScale.x = 1.0f;
321 msg_drawState->msgScale.y = 1.0f;
322 msg_drawState->unk_29 = 0;
323 msg_drawState->framePalette = 0;
324 msg_drawState->unk_2C = 0;
325 msg_drawState->visiblePrintedCount = 0;
326 msg_drawState->centerPos = 0;
327 msg_drawState->fontVariant = 0;
328 msg_drawState->curPosX = 0;
329 msg_drawState->nextPos[0] = 0;
330 msg_drawState->nextPos[1] = 0;
331 msg_drawState->font = 0;
332 msg_drawState->effectFlags = 0;
333 msg_drawState->nextCounter = 0;
334 msg_drawState->textColor = MSG_PAL_WHITE;
335 sp96 = 0xFF;
336 spAE = 0xFF;
337 spB6 = 0;
338 spB8 = 0;
339 sp9E = -1;
340
341 if (flag & 2) {
342 msg_drawState->font = 1;
343 }
344
345 if (flag & 4) {
347 }
348
349 sp80bool = false;
350 msg_drawState->drawBufferPos = 0;
351
352 while (!sp80bool) {
353#if VERSION_IQUE
355
356 lastbyte = byte;
357 byte = msg_drawState->printBuffer[msg_drawState->drawBufferPos];
358 byte2 = msg_drawState->printBuffer[msg_drawState->drawBufferPos + 1];
359
360 switch (byte)
361#else
362 switch (msg_drawState->printBuffer[msg_drawState->drawBufferPos])
363#endif
364 {
366 msg_drawState->nextPos[0] = 0;
367 msg_drawState->nextPos[1] += (s32)((msg_drawState->msgScale.y * MsgCharsets[msg_drawState->font]->newLineY)
368#if !VERSION_JP
370#endif
371 );
372 if (msg_drawState->printModeFlags & MSG_PRINT_FLAG_40) {
373 msg_drawState->printModeFlags |= MSG_PRINT_FLAG_80;
374 }
375 msg_drawState->drawBufferPos++;
376 break;
378 msg_drawState->drawBufferPos++;
379 break;
384 msg_drawState->fontVariant = msg_drawState->printBuffer[msg_drawState->drawBufferPos] - MSG_CHAR_PRINT_VARIANT0;
385 msg_drawState->drawBufferPos++;
386 break;
390 msg_drawState->nextPos[0] += msg_get_draw_char_width(msg_drawState->printBuffer[msg_drawState->drawBufferPos],
391 msg_drawState->font, msg_drawState->fontVariant, msg_drawState->msgScale.x, msg_drawState->curPosX,
392 msg_drawState->printModeFlags);
393 msg_drawState->drawBufferPos++;
394 break;
396 switch (msg_drawState->printBuffer[msg_drawState->drawBufferPos + 1]) {
397 case MSG_STYLE_RIGHT:
398#if VERSION_IQUE
399 msg_drawState->nextPos[1] += 5;
400#endif
401 case MSG_STYLE_LEFT:
402 case MSG_STYLE_CENTER:
403 case MSG_STYLE_TATTLE:
404 if (printer->windowState == MSG_WINDOW_STATE_OPENING && printer->fadeInCounter == 0) {
405 printer->openStartPos.x = printer->initOpenPos.x;
406 printer->openStartPos.y = printer->initOpenPos.y;
407 }
408 temp_s6 = printer->openStartPos.x;
409 temp_s5 = printer->openStartPos.y;
410 temp_s4 = printer->windowBasePos.x + (f32) printer->windowSize.x * 0.5;
411 temp_s3 = printer->windowBasePos.y + (f32) printer->windowSize.y * 0.5;
412 msg_drawState->textColor = MSG_PAL_STANDARD;
413 msg_drawState->printModeFlags |= MSG_PRINT_FLAG_10;
414
415 if (printer->style == MSG_STYLE_RIGHT || printer->style == MSG_STYLE_LEFT || printer->style == MSG_STYLE_CENTER) {
417 printer->windowBasePos.x = MSG_NORMAL_X;
418 printer->windowBasePos.y = 13;
419 printer->windowSize.x = MSG_NORMAL_WIN_WIDTH;
420 printer->windowSize.y = MSG_NORMAL_WIN_HEIGHT;
421 msg_drawState->textStartPos[0] = 26;
422 msg_drawState->textStartPos[1] = MSG_NORMAL_TEXT_Y;
423 printer->rewindArrowPos.x = MSG_NORMAL_ARROW_X;
424 printer->rewindArrowPos.y = MSG_NORMAL_ARROW_Y;
425 curveWidth = 32;
426 height = MSG_NORMAL_HEIGHT_CAP;
427 } else {
428 straightWidth = 218;
429
430#if VERSION_JP
431 if (printer->maxLinesPerPage == 1) {
432 msg_drawState->textStartPos[0] = 18;
433 msg_drawState->textStartPos[1] = 10;
434 curveWidth = 24;
435 } else if (printer->maxLinesPerPage == 2) {
436 msg_drawState->textStartPos[0] = 22;
437 msg_drawState->textStartPos[1] = 8;
438 curveWidth = 28;
439 } else {
440 msg_drawState->textStartPos[0] = 26;
441 msg_drawState->textStartPos[1] = 8;
442 curveWidth = 32;
443 }
444#else
445 switch (printer->maxLinesPerPage) {
446 case 1:
447 msg_drawState->textStartPos[0] = 18;
448 msg_drawState->textStartPos[1] = 10;
449 curveWidth = 24;
450 break;
451 case 2:
452 msg_drawState->textStartPos[0] = 22;
453 msg_drawState->textStartPos[1] = 6;
454 curveWidth = 28;
455 break;
456 case 3:
457 msg_drawState->textStartPos[0] = 26;
458 msg_drawState->textStartPos[1] = 8;
459 curveWidth = 32;
460 break;
461 default:
462 msg_drawState->textStartPos[0] = 26;
463 msg_drawState->textStartPos[1] = 6;
464 curveWidth = 32;
465 break;
466 }
467#endif
468
469 straightWidth = printer->msgWidth;
470 if (straightWidth > 256) {
471 straightWidth = 256;
472 }
473 if (straightWidth < 70) {
474 straightWidth = 70;
475 }
476 straightWidth -= 12;
477
478 printer->windowSize.x = straightWidth + (curveWidth * 2);
479
480 height = (printer->maxLinesPerPage * MSG_NORMAL_PAGE_HT) + 16;
481 if (height > MSG_NORMAL_HEIGHT_CAP) {
482 height = MSG_NORMAL_HEIGHT_CAP;
483 }
484 if (height < 36) {
485 height = 36;
486 }
487 printer->windowSize.y = height;
488
489 temp_a2 = printer->openStartPos.x - printer->windowSize.x / 2;
490 if (temp_a2 < 18) {
491 temp_a2 = 18;
492 }
493 if (temp_a2 + printer->windowSize.x > SCREEN_WIDTH - 18) {
494 temp_a2 = SCREEN_WIDTH - 18 - printer->windowSize.x;
495 }
496 phi_a0 = printer->openStartPos.y - 38 - printer->windowSize.y;
497 if (phi_a0 < 20) {
498 phi_a0 = 20;
499 }
500 if (phi_a0 + printer->windowSize.y > 170) {
501 phi_a0 = 170 - printer->windowSize.y;
502 }
503 printer->windowBasePos.x = temp_a2;
504 printer->windowBasePos.y = phi_a0;
505 printer->rewindArrowPos.x = (printer->windowSize.x + temp_a2) - 30;
506 printer->rewindArrowPos.y = (printer->windowSize.y + phi_a0) - 18;
507 }
508
509 if (printer->windowState == MSG_WINDOW_STATE_B || printer->windowState == MSG_WINDOW_STATE_C) {
510 msg_drawState->framePalette = 1;
511 }
512
513 if (printer->windowState == MSG_WINDOW_STATE_OPENING) {
514 windowScaleX = update_lerp(EASING_LINEAR, 0.07f, 1.0f, printer->fadeInCounter, 7);
515 windowScaleY = update_lerp(EASING_LINEAR, 0.3f, 1.0f, printer->fadeInCounter, 7);
516 temp_f28 = update_lerp(EASING_LINEAR, 96.0f, 200.0f, printer->fadeInCounter, 7);
519 temp_f2_2 = printer->windowSize.x * windowScaleX;
520 temp_f0_2 = printer->windowSize.y * windowScaleY;
521 bubbleX = (temp_f24 - temp_f2_2 * 0.5) + 0.5;
522 bubbleY = (temp_f20 - temp_f0_2 * 0.5) + 0.5;
524 printer->fadeInCounter++;
525 if (printer->fadeInCounter == 7) {
526 printer->windowState = MSG_WINDOW_STATE_PRINTING;
527 }
528 } else if (printer->windowState == MSG_WINDOW_STATE_CLOSING) {
529 printer->fadeOutCounter++;
530 windowScaleX = update_lerp(EASING_LINEAR, 1.0f, 0.6f, printer->fadeOutCounter, 5);
531 windowScaleY = update_lerp(EASING_LINEAR, 1.0f, 0.8f, printer->fadeOutCounter, 5);
532 temp_f2 = (printer->windowSize.x * windowScaleX);
533 temp_f0 = (printer->windowSize.y * windowScaleY);
536 bubbleX = (temp_f24 - temp_f2 * 0.5) + 0.5;
537 bubbleY = (temp_f20 - temp_f0 * 0.5) + 0.5;
538 temp_f22_2 = (temp_f24 + temp_f2 * 0.5) - 0.5;
539 temp_f20_3 = (temp_f20 + temp_f0 * 0.5) - 0.5;
540 temp_f28 = update_lerp(EASING_LINEAR, 255.0f, 64.0f, printer->fadeOutCounter, 5);
541 sp8E = temp_f28 * 0.35;
542 spAE = temp_f28;
543 msg_drawState->clipX[0] = bubbleX + msg_drawState->textStartPos[0];
544 msg_drawState->clipY[0] = bubbleY + msg_drawState->textStartPos[1];
545 msg_drawState->clipX[1] = temp_f22_2 - msg_drawState->textStartPos[0];
546 msg_drawState->clipY[1] = temp_f20_3 - msg_drawState->textStartPos[1];
548 if (printer->fadeOutCounter >= 5) {
549 printer->stateFlags |= MSG_STATE_FLAG_1;
550 }
551 } else {
552 bubbleX = posX + printer->windowBasePos.x;
553 bubbleY = posY + printer->windowBasePos.y;
554
555 msg_draw_speech_bubble(printer, bubbleX, bubbleY, straightWidth, curveWidth, height, 1.0f, 1.0f, 255, 1);
556 if (((u32)(printer->openStartPos.x - 20) <= 280) && (printer->openStartPos.y <= 220)) {
558 }
559 }
560
561 if (printer->windowState != MSG_WINDOW_STATE_CLOSING) {
562 msg_drawState->clipX[0] = 20;
563 msg_drawState->clipY[0] = printer->windowOffsetPos.y + printer->windowBasePos.y +
564 msg_drawState->textStartPos[1];
565 msg_drawState->clipX[1] = SCREEN_WIDTH - 20;
566 msg_drawState->clipY[1] = msg_drawState->clipY[0] + printer->windowSize.y - 16;
567 }
569 msg_drawState->drawBufferPos += 2;
570 break;
571 case MSG_STYLE_CHOICE:
572 frameFading = 0;
573 windowSizeX = printer->windowSize.x;
574 windowSizeY = printer->windowSize.y;
577 msg_drawState->framePalette = 0;
578 msg_drawState->textStartPos[0] = 12;
579 msg_drawState->textStartPos[1] = 6;
580 frameAlpha = 255;
581 if (printer->windowState == MSG_WINDOW_STATE_OPENING) {
582
583 printer->fadeInCounter++;
584 if (printer->fadeInCounter == 6) {
585 printer->windowState = MSG_WINDOW_STATE_PRINTING;
586 }
587
588 temp_f10 = ((f32) printer->fadeInCounter * (2.0 / 15.0)) + 0.2;
589
590 z1 = printer->windowBasePos.x + (windowSizeX / 2);
591 z2 = printer->windowBasePos.y + (windowSizeY / 2);
592 temp1 = z1 - (windowSizeX * temp_f10 * 0.5);
593 temp2 = z2 - (windowSizeY * temp_f10 * 0.5);
594 frameX = temp1 + 0.5;
595 frameY = temp2 + 0.5;
598
599 if (frameSizeX < 24) {
600 frameSizeX = 24;
601 }
602 if (frameSizeY < 24) {
603 frameSizeY = 24;
604 }
605
606 sp8E = (u8)(temp_f10 * 255.0) * 0.6;
607 } else if (printer->windowState == MSG_WINDOW_STATE_CLOSING) {
608 printer->fadeOutCounter++;
609 if (printer->fadeOutCounter >= 5) {
610 printer->stateFlags |= MSG_STATE_FLAG_1;
611 }
612 frameAlpha = -(printer->fadeOutCounter * 46) - 1;
613 sp8E = ((u8)frameAlpha) * 0.6;
614 frameFading = 1;
615 if (sp8E >= 32) {
616 sp8E -= 32;
617 }
618 frameX = printer->windowBasePos.x;
619 frameY = printer->windowBasePos.y;
620 } else {
621 frameX = printer->windowBasePos.x;
622 frameY = printer->windowBasePos.y;
623 msg_draw_prim_rect(255, 32, 32, 0, frameX - 1, frameY - 1, windowSizeX + 2, windowSizeY + 2);
624 }
625 msg_drawState->clipX[0] = frameX + 2;
626 msg_drawState->clipY[0] = frameY + 2;
627 msg_drawState->clipX[1] = frameX + frameSizeX - 2;
628 msg_drawState->clipY[1] = frameY + frameSizeY - 2;
630 frameAlpha);
632 spAE = frameAlpha & 0xFF;
633 msg_drawState->textColor = MSG_PAL_STANDARD;
634 msg_drawState->drawBufferPos += 2;
635 msg_drawState->printModeFlags |= MSG_PRINT_FLAG_10;
636 break;
640 case MSG_STYLE_F:
641 fading = 0;
642 msg_drawState->textStartPos[0] = 16;
643 msg_drawState->textStartPos[1] = MSG_INSPECT_TEXT_Y;
644 msg_drawState->clipX[0] = printer->windowBasePos.x + 5;
645 msg_drawState->clipY[0] = printer->windowBasePos.y + 4;
646 msg_drawState->clipX[1] = printer->windowBasePos.x + printer->windowSize.x - 8;
647 msg_drawState->clipY[1] = printer->windowBasePos.y + printer->windowSize.y - 5;
648 printer->rewindArrowPos.x = msg_drawState->clipX[1] - 17;
649 printer->rewindArrowPos.y = msg_drawState->clipY[1] - 17;
650 msg_drawState->textColor = MSG_PAL_WHITE;
651 phi_s0_5 = 0xFF;
652 msg_draw_prim_rect(255, 32, 32, 0, printer->windowBasePos.x + 3, printer->windowBasePos.y - 1,
653 printer->windowSize.x - 6, 1);
654 msg_draw_prim_rect(32, 255, 32, 0, printer->windowBasePos.x + 3,
655 printer->windowBasePos.y + printer->windowSize.y, printer->windowSize.x - 6,
656 1);
657
658 if (printer->windowState == MSG_WINDOW_STATE_OPENING) {
659 phi_s0_5 = (printer->fadeInCounter * 0x30) + 0x50;
660 sp8E = (phi_s0_5 & 0xFF) - 0x30;
661 printer->fadeInCounter++;
662 fading = 1;
663 if ((s16)printer->fadeInCounter == 4) { // TODO why is this cast needed
664 printer->windowState = MSG_WINDOW_STATE_PRINTING;
665 }
666 } else if (printer->windowState == MSG_WINDOW_STATE_CLOSING) {
667 phi_s0_5 = -0x30 - (printer->fadeOutCounter * 40);
668 sp8E = (phi_s0_5 & 0xFF) - 0x30;
669 printer->fadeOutCounter++;
670 fading = 1;
671 if (printer->fadeOutCounter == 4) {
672 printer->stateFlags |= MSG_STATE_FLAG_1;
673 }
674 }
675
676 msg_draw_frame(printer->windowBasePos.x, printer->windowBasePos.y, printer->windowSize.x, printer->windowSize.y, MSG_STYLE_INSPECT,
677 msg_drawState->framePalette, fading, phi_s0_5, phi_s0_5);
679 spAE = phi_s0_5 & 0xFF;
680 msg_drawState->drawBufferPos += 2;
681 break;
682 case MSG_STYLE_SIGN:
684 msg_drawState->textStartPos[0] = 18;
685 msg_drawState->textStartPos[1] = MSG_SIGN_TEXT_Y;
686 printer->windowBasePos.x = 20 + MSG_SIGN_OFFSET_X;
687 printer->windowBasePos.y = 28;
688 printer->windowSize.x = MSG_SIGN_WIDTH;
689 msg_drawState->framePalette = 15;
690#if VERSION_IQUE
691 msg_drawState->nextPos[1] -= 2;
692#endif
693 temp_s1_5 = 0xFF;
694 if (printer->style == MSG_STYLE_SIGN) {
696 printer->windowSize.y = 72;
697 msg_drawState->textColor = MSG_PAL_18;
699 } else {
702 msg_drawState->textColor = MSG_PAL_1C;
703 }
704 msg_drawState->clipX[0] = 20 + MSG_SIGN_OFFSET_X + 14;
705 msg_drawState->clipY[0] = 40;
706 msg_drawState->clipX[1] = 283 - MSG_SIGN_OFFSET_X;
707 msg_drawState->clipY[1] = printer->windowSize.y + 17;
708 printer->rewindArrowPos.x = msg_drawState->clipX[1] - 16;
709 printer->rewindArrowPos.y = msg_drawState->clipY[1] - 9;
710
711 if (printer->windowState == MSG_WINDOW_STATE_OPENING) {
712 temp_s1_5 = (printer->fadeInCounter << 6) + 0x50;
713 sp8E = (temp_s1_5 & 0xFF) - 0x30;
714 printer->fadeInCounter++;
715 if (printer->fadeInCounter == 3) {
716 printer->windowState = MSG_WINDOW_STATE_PRINTING;
717 }
718 } else {
719 if (printer->windowState == MSG_WINDOW_STATE_CLOSING) {
720 temp_s1_5 = -0x30 - (printer->fadeOutCounter * 0x30);
721 sp8E = (temp_s1_5 & 0xFF) - 0x30;
722 printer->fadeOutCounter++;
723 if (printer->fadeOutCounter == 3) {
724 printer->stateFlags |= MSG_STATE_FLAG_1;
725 }
726 }
727 }
728 spAE = (u8)temp_s1_5;
730 28, 10, 10, 310, 230, temp_s1_5);
732 28, 10, 10, 310, 230, temp_s1_5);
734 printer->windowSize.y + 12, 10, 10, 310, 230, temp_s1_5);
736 10, 10, 310, 230, temp_s1_5);
739 gSPTextureRectangle(gMainGfxPos++, (36 + MSG_SIGN_OFFSET_X) * 4, 28 * 4, (284 - MSG_SIGN_OFFSET_X) * 4, 44 * 4, G_TX_RENDERTILE, 0, 0,
740 0x0400, 0x0400);
743 gSPTextureRectangle(gMainGfxPos++, (20 + MSG_SIGN_OFFSET_X) * 4, 44 * 4, (36 + MSG_SIGN_OFFSET_X) * 4, (printer->windowSize.y + 12) * 4,
744 G_TX_RENDERTILE, 0, 0, 0x0400, 0x0400);
747 gSPTextureRectangle(gMainGfxPos++, (284 - MSG_SIGN_OFFSET_X) * 4, 44 * 4, (300 - MSG_SIGN_OFFSET_X) * 4, (printer->windowSize.y + 12) * 4,
748 G_TX_RENDERTILE, 0, 0, 0x0400, 0x0400);
751 gSPTextureRectangle(gMainGfxPos++, (36 + MSG_SIGN_OFFSET_X) * 4, (printer->windowSize.y + 12) * 4, (284 - MSG_SIGN_OFFSET_X) * 4,
752 (printer->windowSize.y + 28) * 4, G_TX_RENDERTILE, 0, 0, 0x0400, 0x0400);
755 gSPTextureRectangle(gMainGfxPos++, (36 + MSG_SIGN_OFFSET_X) * 4, 44 * 4, (283 - MSG_SIGN_OFFSET_X + 1) * 4, (printer->windowSize.y + 12) * 4,
756 G_TX_RENDERTILE, 0, 0, 0x0400, 0x0400);
758 msg_drawState->drawBufferPos += 2;
759 break;
761 phi_s2_4 = 0;
762 msg_drawState->textStartPos[0] = 12;
763 msg_drawState->textStartPos[1] = 5;
764 printer->windowBasePos.x = 40;
765 printer->windowBasePos.y = 28;
766 msg_drawState->clipX[0] = 45;
767 msg_drawState->clipY[0] = 32;
768 msg_drawState->clipX[1] = 272;
769 msg_drawState->clipY[1] = 81;
770 printer->rewindArrowPos.x = msg_drawState->clipX[1] - 21;
771 printer->rewindArrowPos.y = msg_drawState->clipY[1] - 20;
772 msg_drawState->framePalette = 0;
773 msg_drawState->textColor = MSG_PAL_WHITE;
774 msg_draw_prim_rect(255, 32, 32, 0, 43, 27, 234, 1);
775 msg_draw_prim_rect(32, 255, 32, 0, 43, 86, 234, 1);
776 phi_s3_2 = 0xFF;
777 if (printer->windowState == MSG_WINDOW_STATE_OPENING) {
778 phi_s3_2 = (printer->fadeInCounter * 64) + 80;
779 sp8E = (phi_s3_2 & 0xFF) - 0x30;
780 printer->fadeInCounter++;
781 if (printer->fadeInCounter == 3) {
782 printer->windowState = MSG_WINDOW_STATE_PRINTING;
783 }
784 phi_s2_4 = 1;
785 } else if (printer->windowState == MSG_WINDOW_STATE_CLOSING) {
786 phi_s3_2 = -0x30 - (printer->fadeOutCounter * 0x30);
787 sp8E = (phi_s3_2 & 0xFF) - 0x30;
788 printer->fadeOutCounter++;
789 if (printer->fadeOutCounter == 3) {
790 printer->stateFlags |= MSG_STATE_FLAG_1;
791 }
792 phi_s2_4 = 1;
793 }
794 msg_draw_frame(40, 28, 240, 58, MSG_STYLE_INSPECT, msg_drawState->framePalette, phi_s2_4, phi_s3_2, phi_s3_2);
795 draw_ci_image_with_clipping(printer->letterBackgroundImg, 150, 105, G_IM_FMT_CI, G_IM_SIZ_4b,
796 printer->letterBackgroundPal, 85, 97, 10, 10, 300, 220, phi_s3_2);
798 printer->letterContentPal, 160, 102, 10, 10, 300, 220, phi_s3_2);
800 spAE = phi_s3_2 & 0xFF;
801 msg_drawState->drawBufferPos += 2;
802 break;
803 case MSG_STYLE_POPUP:
804 case MSG_STYLE_B:
805 msg_drawState->textStartPos[0] = 16;
806 msg_drawState->textStartPos[1] = MSG_POPUP_TEXT_Y;
807 msg_drawState->clipX[0] = 0;
808 msg_drawState->clipX[1] = SCREEN_WIDTH - 1;
809 msg_drawState->clipY[0] = 0;
810 msg_drawState->clipY[1] = SCREEN_HEIGHT - 1;
811 msg_drawState->textColor = MSG_PAL_WHITE;
812 msg_drawState->printModeFlags |= MSG_PRINT_FLAG_10;
813 if (printer->windowState == MSG_WINDOW_STATE_D || printer->windowState == MSG_WINDOW_STATE_E) {
814 printer->windowBasePos.x = 0;
815 printer->windowBasePos.y = 0;
816 } else {
817 printer->windowBasePos.x = 160 - printer->windowSize.x / 2;
818 printer->windowBasePos.y = 56;
819 draw_box(0, WINDOW_STYLE_0, printer->windowBasePos.x, 56, 0, printer->windowSize.x,
820 printer->windowSize.y, 255, 0, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, nullptr, 0, nullptr,
821 SCREEN_WIDTH, SCREEN_HEIGHT, nullptr);
822 }
824 msg_drawState->drawBufferPos += 2;
825 break;
827 printer->windowBasePos.x = 60;
828 printer->windowBasePos.y = 110;
829 printer->windowSize.x = 200;
830 printer->windowSize.y = 50;
831 msg_drawState->textStartPos[0] = 0;
832 msg_drawState->textStartPos[1] = MSG_EPILOGUE_TEXT_Y;
833 msg_drawState->clipX[0] = printer->windowBasePos.x;
834 msg_drawState->clipY[0] = printer->windowBasePos.y;
835 msg_drawState->clipX[1] = printer->windowBasePos.x + printer->windowSize.x;
836 msg_drawState->clipY[1] = printer->windowBasePos.y + printer->windowSize.y;
837 printer->rewindArrowPos.x = printer->windowBasePos.x + printer->windowSize.x - 10;
838 printer->rewindArrowPos.y = printer->windowBasePos.y + printer->windowSize.y - 10;
840 msg_drawState->drawBufferPos += 2;
841 break;
842 }
843 break;
845 if (printer->windowState == MSG_WINDOW_STATE_C) {
846 if (msg_drawState->nextCounter >= printer->unkArraySize) {
847 sp80bool = true;
848 }
849 } else if (printer->windowState == MSG_WINDOW_STATE_B) {
850 if (printer->curLinePos < printer->lineEndPos[printer->unkArraySize]) {
851 if (msg_drawState->nextCounter >= printer->unkArraySize) {
852 sp80bool = true;
853 }
854 } else {
855 if (printer->unkArraySize < msg_drawState->nextCounter) {
856 sp80bool = true;
857 } else if (msg_drawState->nextCounter >= printer->unkArraySize) {
858 phi_a0_4 = 36;
859 if (printer->maxLinesPerPage >= 2) {
860 phi_v0_3 = 48;
861 if (printer->maxLinesPerPage == 2) {
862 phi_v0_3 = 32;
863 }
864 if (printer->unk_4C8 < phi_v0_3) {
865 if (printer->unk_4C8 <= 0x10) {
866 phi_a0_4 = 56;
867 }
868 sp8E = 0xFF - (phi_a0_4 * printer->unk_4CC);
869 if (sp8E < 0) {
870 sp8E = 0;
871 }
872 }
873 }
874 }
875 }
876 }
877 msg_drawState->nextCounter++;
878 msg_drawState->drawBufferPos++;
879 break;
881 sp80bool = true;
882 break;
884 msg_drawState->drawBufferPos++;
885 switch (msg_drawState->printBuffer[msg_drawState->drawBufferPos]) {
887 msg_drawState->font = msg_drawState->printBuffer[msg_drawState->drawBufferPos + 1];
888 msg_drawState->drawBufferPos += 2;
889 msg_drawState->printModeFlags |= MSG_PRINT_FLAG_10;
890 break;
892 msg_drawState->fontVariant = msg_drawState->printBuffer[msg_drawState->drawBufferPos + 1];
893 msg_drawState->drawBufferPos += 2;
894 break;
896 msg_drawState->textColor = msg_drawState->printBuffer[msg_drawState->drawBufferPos + 1];
897 msg_drawState->printModeFlags |= MSG_PRINT_FLAG_10;
898 msg_drawState->drawBufferPos += 2;
899 break;
901 msg_drawState->curPosX = msg_drawState->printBuffer[msg_drawState->drawBufferPos + 1];
902 msg_drawState->drawBufferPos += 2;
903 break;
904#if !VERSION_IQUE
906 packedScaleX = msg_drawState->printBuffer[msg_drawState->drawBufferPos + 1];
907 msg_drawState->msgScale.x = (f32)(packedScaleX >> 4) + ((packedScaleX & 0xF) * 0.0625f);
908 packedScaleY = msg_drawState->printBuffer[msg_drawState->drawBufferPos + 2];
909 msg_drawState->msgScale.y = (f32)(packedScaleY >> 4) + ((packedScaleY & 0xF) * 0.0625f);
910 msg_drawState->drawBufferPos += 3;
911 if (msg_drawState->msgScale.x > 1.0 || msg_drawState->msgScale.y > 1.0) {
913 } else if (msg_drawState->msgScale.x < 1.0 || msg_drawState->msgScale.y < 1.0) {
915 }
916 break;
918 msg_drawState->msgScale.x = 1.0f;
919 msg_drawState->msgScale.y = 1.0f;
920 msg_drawState->drawBufferPos++;
922 break;
923#endif
925 msg_drawState->nextPos[0] = msg_drawState->printBuffer[msg_drawState->drawBufferPos + 1] * 256 +
926 (msg_drawState->printBuffer[msg_drawState->drawBufferPos + 2]);
927 msg_drawState->drawBufferPos += 3;
928 break;
930 msg_drawState->nextPos[1] = msg_drawState->printBuffer[msg_drawState->drawBufferPos + 1];
931 msg_drawState->drawBufferPos += 2;
932 break;
934 msg_drawState->nextPos[0] += msg_drawState->printBuffer[msg_drawState->drawBufferPos + 1];
935 msg_drawState->drawBufferPos += 2;
936 break;
938 msg_drawState->nextPos[1] += msg_drawState->printBuffer[msg_drawState->drawBufferPos + 1];
939 msg_drawState->drawBufferPos += 2;
940 break;
942 msg_drawState->nextPos[1] -= msg_drawState->printBuffer[msg_drawState->drawBufferPos + 1];
943 msg_drawState->drawBufferPos += 2;
944 break;
946 msgImageData = &(*gMsgVarImages)[msg_drawState->printBuffer[msg_drawState->drawBufferPos + 1]];
947 phi_t5 = sp8E;
948 if (sp8E < 0xFF) {
949 phi_t5 = (s32)(sp8E * 0.7);
950 }
951 imgDrawPosX = (s16)((msg_drawState->nextPos[0] + (msg_drawState->textStartPos[0] + (printer->windowBasePos.x + posX))) -
953 imgDrawPosY = (s16)((msg_drawState->nextPos[1] + (msg_drawState->textStartPos[1] + (printer->windowBasePos.y + posY))) -
955
957 msgImageData->palette, imgDrawPosX, imgDrawPosY, (s32) msg_drawState->clipX[0], (s32) msg_drawState->clipY[0],
958 msg_drawState->clipX[1] - msg_drawState->clipX[0], msg_drawState->clipY[1] - msg_drawState->clipY[0], phi_t5);
960 msg_drawState->drawBufferPos += 2;
961 break;
963 phi_s0_6 = sp8E;
964 if (sp8E < 0xFF) {
965 phi_s0_6 = (s32)(sp8E * 0.7);
966 }
967
968 if (spr_get_npc_raster_info(&sprRasterInfo, (msg_drawState->printBuffer[msg_drawState->drawBufferPos + 1] << 8) |
969 msg_drawState->printBuffer[msg_drawState->drawBufferPos + 2],
970 msg_drawState->printBuffer[msg_drawState->drawBufferPos + 3]) != 0) {
971 imgDrawPosX = (s16)((msg_drawState->nextPos[0] + (msg_drawState->textStartPos[0] + (printer->windowBasePos.x + posX))) -
973 imgDrawPosY = (s16)((msg_drawState->nextPos[1] + (msg_drawState->textStartPos[1] + (printer->windowBasePos.y + posY))) -
975
977 msg_drawState->clipX[0], msg_drawState->clipY[0], msg_drawState->clipX[1] - msg_drawState->clipX[0],
978 msg_drawState->clipY[1] - msg_drawState->clipY[0], phi_s0_6);
979 msg_drawState->printModeFlags |= MSG_PRINT_FLAG_10;
980 }
981 msg_drawState->drawBufferPos += 4;
982 break;
984 if (D_8015131C != 0) {
985 phi_t3 = sp8E;
986 if (sp8E < 0xFF) {
987 phi_t3 = (s32)(sp8E * 0.7);
988 }
989 imgDrawPosX = (s16)((msg_drawState->nextPos[0] + (msg_drawState->textStartPos[0] + (printer->windowBasePos.x + posX))) -
991 imgDrawPosY = (s16)((msg_drawState->nextPos[1] + (msg_drawState->textStartPos[1] + (printer->windowBasePos.y + posY))) -
993
995 msg_drawState->clipY[0], msg_drawState->clipX[1] - msg_drawState->clipX[0],
996 msg_drawState->clipY[1] - msg_drawState->clipY[0], phi_t3);
997 msg_drawState->printModeFlags |= MSG_PRINT_FLAG_10;
998 }
999 msg_drawState->drawBufferPos++;
1000 break;
1002 animIdx = msg_drawState->printBuffer[msg_drawState->drawBufferPos + 1];
1003 if (printer->animTimers[animIdx] == -1) {
1004 printer->animTimers[animIdx] = msg_drawState->printBuffer[msg_drawState->drawBufferPos + 3];
1005 }
1006 if (printer->animTimers[animIdx] == 0) {
1007 printer->curAnimFrame[animIdx]++;
1008 }
1009
1010 dbPos = msg_drawState->drawBufferPos;
1011 while (true) {
1012 if ((msg_drawState->printBuffer[dbPos - 1] == MSG_CHAR_PRINT_FUNCTION) &&
1013 (msg_drawState->printBuffer[dbPos] == MSG_PRINT_FUNC_ANIM_DELAY) &&
1014 (msg_drawState->printBuffer[dbPos + 1] == animIdx)) {
1015 if (msg_drawState->printBuffer[dbPos + 2] != printer->curAnimFrame[animIdx]) {
1016 dbPos += 4;
1017 } else {
1018 break;
1019 }
1020 } else {
1021 if ((msg_drawState->printBuffer[dbPos] == MSG_CHAR_PRINT_FUNCTION) &&
1022 (msg_drawState->printBuffer[dbPos + 1] == MSG_PRINT_FUNC_ANIM_LOOP) &&
1023 (msg_drawState->printBuffer[dbPos + 2] == animIdx)) {
1024
1025 if (printer->animTimers[animIdx] == 0) {
1026 printer->curAnimFrame[animIdx] = msg_drawState->printBuffer[dbPos + 3];
1027 dbPos = msg_drawState->drawBufferPos;
1028 continue;
1029 } else {
1030 dbPos++;
1031 break;
1032 }
1033 } else {
1034 if (msg_drawState->printBuffer[dbPos] == MSG_CHAR_PRINT_FUNCTION &&
1035 msg_drawState->printBuffer[dbPos + 1] == MSG_PRINT_FUNC_ANIM_DONE) {
1036 if (msg_drawState->printBuffer[dbPos + 2] == animIdx) {
1037 dbPos++;
1038 break;
1039 }
1040 }
1041 }
1042 }
1043 dbPos++;
1044 }
1045 msg_drawState->drawBufferPos = dbPos;
1046
1047 switch (msg_drawState->printBuffer[msg_drawState->drawBufferPos]) {
1049 if (printer->animTimers[animIdx] == 0) {
1050 if (msg_drawState->printBuffer[msg_drawState->drawBufferPos + 3] == 0) {
1051 printer->animTimers[animIdx] = -2;
1052 } else {
1053 printer->animTimers[animIdx] = msg_drawState->printBuffer[msg_drawState->drawBufferPos + 3];
1054 }
1055 }
1056 msg_drawState->drawBufferPos += 4;
1057 break;
1059 msg_drawState->drawBufferPos += 3;
1060 break;
1062 msg_drawState->drawBufferPos += 2;
1063 break;
1064 }
1065 break;
1067 msg_drawState->drawBufferPos += 3;
1068 break;
1070 msg_drawState->drawBufferPos += 2;
1071 break;
1073 printer->cursorPosX[msg_drawState->printBuffer[msg_drawState->drawBufferPos + 1]] = msg_drawState->textStartPos[0] +
1074 msg_drawState->nextPos[0] - additionalOffsetX - 6;
1075 printer->cursorPosY[msg_drawState->printBuffer[msg_drawState->drawBufferPos + 1]] = msg_drawState->textStartPos[1] +
1076 msg_drawState->nextPos[1] - additionalOffsetY - 1;
1077 msg_drawState->drawBufferPos += 2;
1078 break;
1080 if (msg_drawState->printBuffer[msg_drawState->drawBufferPos + 1] == 0xFF) {
1081 msg_drawState->printModeFlags &= ~MSG_PRINT_FLAG_20;
1082 } else {
1083 msg_drawState->unk_2D = msg_drawState->printBuffer[msg_drawState->drawBufferPos + 1];
1084 msg_drawState->printModeFlags |= MSG_PRINT_FLAG_20;
1085 msg_drawState->nextPos[0] += 14;
1086 }
1087 msg_drawState->drawBufferPos += 2;
1088 break;
1090 msg_drawState->framePalette = msg_drawState->printBuffer[msg_drawState->drawBufferPos + 1];
1091 msg_drawState->drawBufferPos += 2;
1092 break;
1095 msg_drawState->drawBufferPos++;
1096 break;
1098 msg_drawState->savedPos[0] = msg_drawState->nextPos[0];
1099 msg_drawState->savedPos[1] = msg_drawState->nextPos[1];
1100 msg_drawState->drawBufferPos++;
1101 break;
1103 msg_drawState->nextPos[0] = msg_drawState->savedPos[0];
1104 msg_drawState->nextPos[1] = msg_drawState->savedPos[1];
1105 msg_drawState->drawBufferPos++;
1106 break;
1108 msg_drawState->savedColor = msg_drawState->textColor;
1109 msg_drawState->drawBufferPos++;
1110 break;
1112 msg_drawState->textColor = msg_drawState->savedColor;
1113 msg_drawState->drawBufferPos++;
1114 break;
1116 switch (msg_drawState->printBuffer[msg_drawState->drawBufferPos + 1]) {
1117 case MSG_FX_SHAKE:
1118 msg_drawState->effectFlags |= MSG_FX_FLAG_SHAKE;
1119 msg_drawState->drawBufferPos += 2;
1120 break;
1121 case MSG_FX_WAVE:
1122 msg_drawState->effectFlags |= MSG_FX_FLAG_WAVE;
1123 msg_drawState->drawBufferPos += 2;
1124 break;
1126 msg_drawState->effectFlags |= MSG_FX_FLAG_NOISE_OUTLINE;
1128 msg_drawState->drawBufferPos += 2;
1129 break;
1130 case MSG_FX_STATIC:
1131 msg_drawState->effectFlags |= MSG_FX_FLAG_STATIC;
1133 msg_drawState->printBuffer[msg_drawState->drawBufferPos + 2],
1134 msg_drawState->printBuffer[msg_drawState->drawBufferPos + 2],
1135 msg_drawState->printBuffer[msg_drawState->drawBufferPos + 2],
1136 0);
1138 msg_drawState->drawBufferPos += 3;
1139 break;
1140 case MSG_FX_BLUR:
1141 msg_drawState->effectFlags |= MSG_FX_FLAG_BLUR;
1142 spB8 = msg_drawState->printBuffer[msg_drawState->drawBufferPos + 2];
1143 msg_drawState->drawBufferPos += 3;
1144 break;
1145 case MSG_FX_RAINBOW:
1146 msg_drawState->effectFlags |= MSG_FX_FLAG_RAINBOW;
1147 msg_drawState->drawBufferPos += 2;
1148 break;
1149 case MSG_FX_DITHER_FADE:
1150 msg_drawState->effectFlags |= MSG_FX_FLAG_DITHER_FADE;
1151 spB6 = msg_drawState->printBuffer[msg_drawState->drawBufferPos + 2];
1152 msg_drawState->drawBufferPos += 3;
1153 break;
1154 case MSG_FX_GLOBAL_WAVE:
1155 msg_drawState->effectFlags |= MSG_FX_FLAG_GLOBAL_WAVE;
1156 msg_drawState->drawBufferPos += 2;
1157 break;
1159 msg_drawState->effectFlags |= MSG_FX_FLAG_GLOBAL_RAINBOW;
1160 msg_drawState->drawBufferPos += 2;
1161 break;
1162 case MSG_FX_RISE_PRINT:
1163 msg_drawState->effectFlags |= MSG_FX_FLAG_RISE_PRINT;
1164 msg_drawState->drawBufferPos += 2;
1165 break;
1166 case MSG_FX_GROW_PRINT:
1167 msg_drawState->effectFlags |= MSG_FX_FLAG_GROW_PRINT;
1168 msg_drawState->drawBufferPos += 2;
1169 break;
1170 case MSG_FX_SIZE_JITTER:
1171 msg_drawState->effectFlags |= MSG_FX_FLAG_SIZE_JITTER;
1172 msg_drawState->drawBufferPos += 2;
1173 break;
1174 case MSG_FX_SIZE_WAVE:
1175 msg_drawState->effectFlags |= MSG_FX_FLAG_SIZE_WAVE;
1176 msg_drawState->drawBufferPos += 2;
1177 break;
1178 case MSG_FX_DROP_SHADOW:
1179 msg_drawState->effectFlags |= MSG_FX_FLAG_DROP_SHADOW;
1180 msg_drawState->drawBufferPos += 2;
1181 break;
1182 }
1183 break;
1185 switch (msg_drawState->printBuffer[msg_drawState->drawBufferPos + 1]) {
1186 case MSG_FX_SHAKE:
1187 msg_drawState->effectFlags &= ~MSG_FX_FLAG_SHAKE;
1188 break;
1189 case MSG_FX_WAVE:
1190 msg_drawState->effectFlags &= ~MSG_FX_FLAG_WAVE;
1191 break;
1193 msg_drawState->effectFlags &= ~MSG_FX_FLAG_NOISE_OUTLINE;
1194 break;
1195 case MSG_FX_STATIC:
1196 msg_drawState->effectFlags &= ~MSG_FX_FLAG_STATIC;
1197 break;
1198 case MSG_FX_BLUR:
1199 msg_drawState->effectFlags &= ~MSG_FX_FLAG_BLUR;
1200 break;
1201 case MSG_FX_RAINBOW:
1202 msg_drawState->effectFlags &= ~MSG_FX_FLAG_RAINBOW;
1203 msg_drawState->printModeFlags |= MSG_PRINT_FLAG_10;
1204 break;
1205 case MSG_FX_DITHER_FADE:
1206 msg_drawState->effectFlags &= ~MSG_FX_FLAG_DITHER_FADE;
1207 break;
1208 case MSG_FX_GLOBAL_WAVE:
1209 msg_drawState->effectFlags &= ~MSG_FX_FLAG_GLOBAL_WAVE;
1210 break;
1212 msg_drawState->effectFlags &= ~MSG_FX_FLAG_GLOBAL_RAINBOW;
1213 msg_drawState->printModeFlags |= MSG_PRINT_FLAG_10;
1214 break;
1215 case MSG_FX_RISE_PRINT:
1216 msg_drawState->effectFlags &= ~MSG_FX_FLAG_RISE_PRINT;
1217 break;
1218 case MSG_FX_GROW_PRINT:
1219 msg_drawState->effectFlags &= ~MSG_FX_FLAG_GROW_PRINT;
1220 break;
1221 case MSG_FX_SIZE_JITTER:
1222 msg_drawState->effectFlags &= ~MSG_FX_FLAG_SIZE_JITTER;
1223 break;
1224 case MSG_FX_SIZE_WAVE:
1225 msg_drawState->effectFlags &= ~MSG_FX_FLAG_SIZE_WAVE;
1226 break;
1227 case MSG_FX_DROP_SHADOW:
1228 msg_drawState->effectFlags &= ~MSG_FX_FLAG_DROP_SHADOW;
1229 break;
1230 }
1231 msg_drawState->drawBufferPos += 2;
1232 break;
1234 if (msg_drawState->printBuffer[msg_drawState->drawBufferPos + 1] != 0) {
1235 msg_drawState->centerPos = msg_drawState->printBuffer[msg_drawState->drawBufferPos + 1];
1236 if (msg_drawState->centerPos == 0xFF) {
1237 msg_drawState->centerPos = printer->windowSize.x / 2;
1238 }
1240 } else {
1241 msg_drawState->nextPos[0] = 0;
1242 msg_drawState->printModeFlags &= ~(MSG_PRINT_FLAG_40 | MSG_PRINT_FLAG_80);
1243 }
1244 msg_drawState->drawBufferPos += 2;
1245 break;
1246 }
1247 break;
1248 default:
1249#if VERSION_IQUE
1250 if (lastbyte >= 0x5f && lastbyte <= 0x8f) {
1251 msg_drawState->drawBufferPos++;
1252 break;
1253 }
1254#endif
1255
1256 if (msg_drawState->printModeFlags & MSG_PRINT_FLAG_2) {
1257 sp96 = 0xFF;
1260 }
1261 msg_drawState->charScale.x = msg_drawState->msgScale.x;
1262 msg_drawState->charScale.y = msg_drawState->msgScale.y;
1263 if (msg_drawState->printModeFlags & MSG_PRINT_FLAG_80) {
1264 msg_drawState->nextPos[0] += msg_drawState->centerPos - printer->msgWidth / 2;
1265 msg_drawState->printModeFlags &= ~MSG_PRINT_FLAG_80;
1266 }
1267 if (msg_drawState->printModeFlags & MSG_PRINT_FLAG_40) {
1268 charPosX = msg_drawState->nextPos[0] + (printer->windowBasePos.x + posX);
1269 } else {
1270 charPosX = msg_drawState->nextPos[0] + (msg_drawState->textStartPos[0] + (printer->windowBasePos.x +
1271 posX));
1272 }
1273
1274 baseOffsetY = msg_drawState->nextPos[1] + (msg_drawState->textStartPos[1] + (printer->windowBasePos.y + posY));
1275 msgCharset = MsgCharsets[msg_drawState->font];
1278
1279 if ((sp8E != 0) &&
1280 (charPosX < msg_drawState->clipX[1]) &&
1281 (charPosY < msg_drawState->clipY[1]) &&
1282 (msg_drawState->clipX[0] < charPosX + (s32)(msg_drawState->msgScale.x *
1283 msgCharset->rasters[msg_drawState->fontVariant].monospaceWidth)) &&
1284 (msg_drawState->clipY[0] < charPosY + (s32)(msg_drawState->msgScale.y * msgCharset->newLineY
1285#if !VERSION_JP
1287#endif
1288 ))) {
1289 palette = msg_drawState->textColor;
1290 phi_s2_5 = sp8E;
1291 if (msg_drawState->effectFlags & MSG_FX_FLAG_BLUR) {
1292 phi_s2_5 = (f32) phi_s2_5 * 0.35;
1293 }
1294 if ((printer->windowState == MSG_WINDOW_STATE_WAITING_FOR_CHOICE) && (msg_drawState->printModeFlags & MSG_PRINT_FLAG_20)) {
1295 if (msg_drawState->unk_2D == printer->curOption) {
1297 } else {
1298 msg_drawState->effectFlags &= ~MSG_FX_FLAG_GLOBAL_RAINBOW;
1299 msg_drawState->effectFlags &= ~MSG_FX_FLAG_GLOBAL_WAVE;
1300 msg_drawState->effectFlags &= ~MSG_FX_FLAG_DROP_SHADOW;
1301 palette = msg_drawState->textColor;
1302 msg_drawState->printModeFlags |= MSG_PRINT_FLAG_10;
1303 }
1304 }
1305 if (msg_drawState->effectFlags & MSG_FX_FLAG_SHAKE) {
1306 charPosX += rand_int(10000) % 2;
1307 charPosY += rand_int(10000) % 2;
1308 }
1309 if (msg_drawState->effectFlags & MSG_FX_FLAG_WAVE) {
1310 temp_f2_3 = msg_drawState->msgScale.x - 1.0;
1311 temp_s0_7 = (printer->effectFrameCounter * (s32)(20.0 - (temp_f2_3 * 5.0))) - (msg_drawState->visiblePrintedCount *
1312 (s32)(45.0 - (temp_f2_3 * 15.0)));
1313 charPosX += cosine(temp_s0_7) * ((msg_drawState->msgScale.x - 1.0) + 1.6);
1314 charPosY += cosine((temp_s0_7 + 180.0 + 90.0)) * (msg_drawState->msgScale.y - 1.0 + 1.6);
1315 }
1316 if (msg_drawState->effectFlags & MSG_FX_FLAG_GLOBAL_WAVE) {
1317 temp_s0_8 = (gMsgGlobalWaveCounter * (s32)(20.0 - ((msg_drawState->msgScale.x - 1.0) * 5.0))) -
1318 (msg_drawState->visiblePrintedCount * 45);
1319 charPosX += cosine(temp_s0_8) * ((msg_drawState->msgScale.x - 1.0) + 1.6);
1320 charPosY += cosine((temp_s0_8 + 180.0 + 90.0)) * ((msg_drawState->msgScale.y - 1.0) + 1.6);
1321 }
1322 if (msg_drawState->effectFlags & MSG_FX_FLAG_RAINBOW) {
1323 palette = abs(msg_drawState->visiblePrintedCount - (u16)(printer->effectFrameCounter / 3)) % 10;
1324 }
1325 if (msg_drawState->effectFlags & MSG_FX_FLAG_GLOBAL_RAINBOW) {
1326 palette = abs(msg_drawState->visiblePrintedCount - (u16)(gGameStatusPtr->frameCounter / 3)) % 10;
1327 }
1328 if (msg_drawState->effectFlags & MSG_FX_FLAG_DITHER_FADE) {
1331 phi_s2_5 = spB6 * (phi_s2_5 / 255.0);
1332 }
1333 if ((msg_drawState->printModeFlags & MSG_PRINT_FLAG_2) || (phi_s2_5 != sp96)) {
1334 if ((sp96 < 0xFF) && (phi_s2_5 < 0xFF)) {
1335 gDPSetPrimColor(gMainGfxPos++, 0, 0, 0, 0, 0, phi_s2_5);
1336 } else if ((sp96 == 0xFF) && (phi_s2_5 < 0xFF)) {
1338 if (printer->stateFlags & MSG_STATE_FLAG_4000) {
1341 G_BL_1MA));
1342
1343 } else {
1346 G_BL_1MA));
1347
1348 }
1350 gDPSetPrimColor(gMainGfxPos++, 0, 0, 0, 0, 0, phi_s2_5);
1351 } else if ((sp96 < 0xFF) && (phi_s2_5 == 0xFF)) {
1355 }
1356 sp96 = phi_s2_5;
1357 }
1358 if (phi_s2_5 > 0) {
1359 if (msg_drawState->effectFlags & MSG_FX_FLAG_RISE_PRINT) {
1360 if ((msg_drawState->printBuffer[msg_drawState->drawBufferPos + 1] != MSG_CHAR_PRINT_ENDL) &&
1361 (msg_drawState->printBuffer[msg_drawState->drawBufferPos + 2] != MSG_CHAR_PRINT_ENDL) &&
1362 (msg_drawState->printBuffer[msg_drawState->drawBufferPos + 3] != MSG_CHAR_PRINT_ENDL) &&
1363 (msg_drawState->printBuffer[msg_drawState->drawBufferPos + 4] != MSG_CHAR_PRINT_ENDL)) {
1364 if ((msg_drawState->printBuffer[msg_drawState->drawBufferPos + 1] == MSG_CHAR_PRINT_END) &&
1365 (printer->windowState == MSG_WINDOW_STATE_PRINTING)) {
1366 msg_drawState->charScale.x = msg_drawState->msgScale.x * 1.7;
1367 msg_drawState->charScale.y = msg_drawState->msgScale.y * 1.7;
1368 temp_f8 = (msg_drawState->charScale.y / 1.7) * 6.0;
1369 charPosX -= temp_f8;
1370 charPosY -= temp_f8;
1371 } else if ((msg_drawState->printBuffer[msg_drawState->drawBufferPos + 2] == MSG_CHAR_PRINT_END) &&
1372 (printer->windowState == MSG_WINDOW_STATE_PRINTING)) {
1373 msg_drawState->charScale.x = msg_drawState->msgScale.x * 1.4;
1374 msg_drawState->charScale.y = msg_drawState->msgScale.y * 1.4;
1375 temp_f8 = (msg_drawState->charScale.y / 1.4) * 3.0;
1376 charPosX -= temp_f8;
1377 charPosY -= temp_f8;
1378 } else if ((msg_drawState->printBuffer[msg_drawState->drawBufferPos + 3] == MSG_CHAR_PRINT_END) &&
1379 (printer->windowState == MSG_WINDOW_STATE_PRINTING)) {
1380 msg_drawState->charScale.x = msg_drawState->msgScale.x * 1.2;
1381 msg_drawState->charScale.y = msg_drawState->msgScale.y * 1.2;
1382 temp_f8 = (msg_drawState->charScale.y / 1.2) * 2.0;
1383 charPosX -= temp_f8;
1384 charPosY -= temp_f8;
1385 }
1386 }
1387 } else if (msg_drawState->effectFlags & MSG_FX_FLAG_GROW_PRINT) {
1388 if ((msg_drawState->printBuffer[msg_drawState->drawBufferPos + 1] != MSG_CHAR_PRINT_ENDL) &&
1389 (msg_drawState->printBuffer[msg_drawState->drawBufferPos + 2] != MSG_CHAR_PRINT_ENDL) &&
1390 (msg_drawState->printBuffer[msg_drawState->drawBufferPos + 3] != MSG_CHAR_PRINT_ENDL) &&
1391 (msg_drawState->printBuffer[msg_drawState->drawBufferPos + 4] != MSG_CHAR_PRINT_ENDL)) {
1392 if ((msg_drawState->printBuffer[msg_drawState->drawBufferPos + 1] == MSG_CHAR_PRINT_END) &&
1393 (printer->windowState == MSG_WINDOW_STATE_PRINTING)) {
1394 msg_drawState->charScale.x = msg_drawState->msgScale.x * 0.3;
1395 msg_drawState->charScale.y = msg_drawState->msgScale.y * 0.3;
1396 charPosX += 5;
1397 charPosY += 5;
1398 } else if ((msg_drawState->printBuffer[msg_drawState->drawBufferPos + 2] == MSG_CHAR_PRINT_END) &&
1399 (printer->windowState == MSG_WINDOW_STATE_PRINTING)) {
1400 msg_drawState->charScale.x = msg_drawState->msgScale.x * 0.5;
1401 msg_drawState->charScale.y = msg_drawState->msgScale.y * 0.5;
1402 charPosX += 3;
1403 charPosY += 3;
1404 } else if ((msg_drawState->printBuffer[msg_drawState->drawBufferPos + 3] == MSG_CHAR_PRINT_END) &&
1405 (printer->windowState == MSG_WINDOW_STATE_PRINTING)) {
1406 msg_drawState->charScale.x = msg_drawState->msgScale.x * 0.75;
1407 msg_drawState->charScale.y = msg_drawState->msgScale.y * 0.75;
1408 charPosX += 2;
1409 charPosY += 2;
1410 }
1411 }
1412 } else if (msg_drawState->effectFlags & MSG_FX_FLAG_SIZE_JITTER) {
1413 temp_f8_5 = rand_int(10000) % 101;
1414 temp_f8_5 /= 100.0;
1415 temp_f8_5 = ((temp_f8_5 * 0.5) + 1.0) - 0.25;
1416
1417 if (temp_f8_5 > 1.0) {
1418 msg_drawState->charScale.x = msg_drawState->msgScale.x * temp_f8_5;
1419 msg_drawState->charScale.y = msg_drawState->msgScale.y * temp_f8_5;
1420 charPosX -= (temp_f8_5 * 8.0) - 8.5;
1421 charPosY -= (temp_f8_5 * 8.0) - 8.5;
1422 } else if (temp_f8_5 < 1.0) {
1423 msg_drawState->charScale.x = msg_drawState->msgScale.x * temp_f8_5;
1424 msg_drawState->charScale.y = msg_drawState->msgScale.y * temp_f8_5;
1425 charPosX += 8.0 - (temp_f8_5 * 16.0) * 0.5;
1426 charPosY += 8.0 - (temp_f8_5 * 16.0) * 0.5;
1427 }
1428 } else if (msg_drawState->effectFlags & MSG_FX_FLAG_SIZE_WAVE) {
1429 s32 mod360;
1430
1431 temp_a0_49 = printer->effectFrameCounter * 15;
1432 temp_a0_49 -= msg_drawState->visiblePrintedCount * 15;
1433 mod360 = temp_a0_49 % 360;
1434 temp_f8_5 = (cosine(mod360) * 0.25) + 1.0;
1435
1436 if (temp_f8_5 > 1.0) {
1437 msg_drawState->charScale.x = msg_drawState->msgScale.x * temp_f8_5;
1438 msg_drawState->charScale.y = msg_drawState->msgScale.y * temp_f8_5;
1439 charPosX -= (temp_f8_5 * 8.0) - 8.5;
1440 charPosY -= (temp_f8_5 * 8.0) - 8.5;
1441 } else if (temp_f8_5 < 1.0) {
1442 msg_drawState->charScale.x = msg_drawState->msgScale.x * temp_f8_5;
1443 msg_drawState->charScale.y = msg_drawState->msgScale.y * temp_f8_5;
1444 charPosX += 8.0 - (temp_f8_5 * 16.0) * 0.5;
1445 charPosY += 8.0 - (temp_f8_5 * 16.0) * 0.5;
1446 }
1447 }
1448
1449 if ((printer->windowState == MSG_WINDOW_STATE_B || printer->windowState == MSG_WINDOW_STATE_C) &&
1450 (printer->style == MSG_STYLE_RIGHT ||
1451 printer->style == MSG_STYLE_LEFT ||
1452 printer->style == MSG_STYLE_CENTER ||
1453 printer->style == MSG_STYLE_TATTLE))
1454 {
1455 switch (palette) {
1456 case MSG_PAL_WHITE:
1457 case MSG_PAL_RED:
1458 case MSG_PAL_10:
1459 case MSG_PAL_11:
1460 case MSG_PAL_12:
1461 case MSG_PAL_13:
1462 case MSG_PAL_14:
1463 break;
1464#if !VERSION_IQUE
1465 case MSG_PAL_STANDARD:
1466 palette = MSG_PAL_40;
1467 break;
1468#endif
1469 case MSG_PAL_20:
1470 palette = MSG_PAL_41;
1471 break;
1472 case MSG_PAL_22:
1473 palette = MSG_PAL_42;
1474 break;
1475 case MSG_PAL_23:
1476 palette = MSG_PAL_43;
1477 break;
1478 case MSG_PAL_25:
1479 palette = MSG_PAL_44;
1480 break;
1481 default:
1482 palette = MSG_PAL_40;
1483 break;
1484 }
1485 }
1486 if (palette != sp9E) {
1487 sp9E = palette;
1488 msg_drawState->printModeFlags |= MSG_PRINT_FLAG_10;
1489 }
1490 if ((msg_drawState->effectFlags & MSG_FX_FLAG_DROP_SHADOW) && (phi_s2_5 == 0xFF)) {
1494 gDPSetPrimColor(gMainGfxPos++, 0, 0, 40, 40, 40, 72);
1495#if VERSION_IQUE
1496 if (byte >= MSG_CHAR_MULTIBYTE_FIRST && byte <= MSG_CHAR_MULTIBYTE_LAST) {
1499 msg_draw_char(printer, msg_drawState, glyph_index,
1500 palette, charPosX + 2, charPosY + 2);
1501 } else {
1502 msg_draw_char(printer, msg_drawState, byte,
1503 palette, charPosX + 2, charPosY + 2);
1504 }
1505#else
1506 msg_draw_char(printer, msg_drawState,
1507 msg_drawState->printBuffer[msg_drawState->drawBufferPos],
1508 palette, charPosX + 2, charPosY + 2);
1509#endif
1511 if (phi_s2_5 < 0xFF) {
1514 } else {
1517 }
1518 }
1519
1520 if (msg_drawState->effectFlags & MSG_FX_FLAG_BLUR) {
1521 for (i = 0; i < 5; i++) {
1524 if (spB8 != 2) {
1525 phi_s0_7 += (rand_int(10000) % 3) - 1;
1526 }
1527 if (spB8 != 1) {
1528 phi_s1_8 += (rand_int(10000) % 3) - 1;
1529 }
1530#if VERSION_IQUE
1531 if (byte >= MSG_CHAR_MULTIBYTE_FIRST && byte <= MSG_CHAR_MULTIBYTE_LAST) {
1534 msg_draw_char(printer, msg_drawState, glyph_index,
1535 palette, charPosX + 2, charPosY + 2);
1536 } else {
1537 msg_draw_char(printer, msg_drawState, byte,
1538 palette, charPosX + 2, charPosY + 2);
1539 }
1540#else
1541 msg_draw_char(printer, msg_drawState,
1542 msg_drawState->printBuffer[msg_drawState->drawBufferPos], palette,
1544#endif
1545 }
1546 } else {
1547#if VERSION_IQUE
1548 if (byte >= MSG_CHAR_MULTIBYTE_FIRST && byte <= MSG_CHAR_MULTIBYTE_LAST) {
1551 msg_draw_char(printer, msg_drawState, glyph_index,
1552 palette, charPosX + 2, charPosY + 2);
1553 } else {
1554 msg_draw_char(printer, msg_drawState, byte,
1555 palette, charPosX + 2, charPosY + 2);
1556 }
1557#else
1558 msg_draw_char(printer, msg_drawState,
1559 msg_drawState->printBuffer[msg_drawState->drawBufferPos], palette, charPosX,
1560 charPosY);
1561#endif
1562 }
1563 }
1564 }
1565 if (msg_drawState->printModeFlags & MSG_PRINT_FLAG_2) {
1566 msg_drawState->printModeFlags &= ~MSG_PRINT_FLAG_2;
1567 }
1568 msg_drawState->visiblePrintedCount++;
1569 msg_drawState->nextPos[0] +=
1570#if VERSION_IQUE
1571 msg_drawState->msgScale.x * 14.0f;
1572#else
1573 msg_get_draw_char_width(msg_drawState->printBuffer[msg_drawState->drawBufferPos],
1574 msg_drawState->font, msg_drawState->fontVariant, msg_drawState->msgScale.x,
1575 msg_drawState->curPosX, msg_drawState->printModeFlags);
1576#endif
1577 msg_drawState->drawBufferPos++;
1578 break;
1579 }
1580 }
1581
1582 varImgHasBorder = false;
1583 if (printer->varImageScreenPos.x != 0) {
1584 s16 varImgFinalAlpha;
1585
1586 varImgFinalAlpha = printer->varImgFinalAlpha;
1587 msgVarImage = &(*gMsgVarImages)[printer->curImageIndex];
1588
1589 switch (printer->varImgHasBorder) {
1590 case 0:
1591 case 1:
1592 if (printer->varImgHasBorder) {
1593 varImgHasBorder = true;
1594 }
1595 switch (printer->varImageDisplayState) {
1596 case 0:
1597 printer->varImageFadeTimer++;
1598 varImgFinalAlpha = printer->varImageFadeTimer * printer->varImgAlphaFadeStep;
1599 if (printer->varImgFinalAlpha <= varImgFinalAlpha) {
1600 varImgFinalAlpha = printer->varImgFinalAlpha;
1601 printer->varImageFadeTimer = 0;
1602 printer->varImageDisplayState = 1;
1603 }
1604 break;
1605 case 1:
1606 varImgFinalAlpha = (u8)(((f32) spAE / 255.0) * (f32) printer->varImgFinalAlpha);
1607 break;
1608 case 2:
1609 printer->varImageFadeTimer++;
1610 varImgFinalAlpha = printer->varImgFinalAlpha - printer->varImgAlphaFadeStep * printer->varImageFadeTimer;
1611 if (varImgFinalAlpha < 1) {
1612 printer->varImageScreenPos.x = 0;
1613 }
1614 break;
1615 }
1616 break;
1617 case 2:
1618 varImgFinalAlpha = (u8)(((f32) spAE / 255.0) * (f32) printer->varImgFinalAlpha);
1619 break;
1620 }
1621
1622 if (varImgFinalAlpha > 0) {
1623 if (varImgHasBorder) {
1624 draw_box(0, WINDOW_STYLE_15, printer->varImageScreenPos.x - 7, printer->varImageScreenPos.y - 7, 0,
1625 msgVarImage->width + 15, msgVarImage->height + 14, varImgFinalAlpha, 0, 0.0f, 0.0f, 0.0f, 0.0f,
1626 0.0f, nullptr, 0, nullptr, SCREEN_WIDTH, SCREEN_HEIGHT, nullptr);
1627 }
1629 msgVarImage->format, msgVarImage->bitDepth, msgVarImage->palette,
1630 printer->varImageScreenPos.x, printer->varImageScreenPos.y, 0, 0,
1631 SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1, varImgFinalAlpha);
1632 }
1633
1634 }
1637}
MessageCharData * rasters
#define PAL_PTR
#define IMG_PTR
#define rand_int
@ WINDOW_STYLE_15
Definition enums.h:5970
@ MSG_FX_FLAG_RISE_PRINT
Definition enums.h:5772
@ MSG_FX_FLAG_DROP_SHADOW
Definition enums.h:5776
@ MSG_FX_FLAG_BLUR
Definition enums.h:5767
@ MSG_FX_FLAG_GLOBAL_WAVE
Definition enums.h:5770
@ MSG_FX_FLAG_WAVE
Definition enums.h:5765
@ MSG_FX_FLAG_GROW_PRINT
Definition enums.h:5773
@ MSG_FX_FLAG_GLOBAL_RAINBOW
Definition enums.h:5771
@ MSG_FX_FLAG_SHAKE
Definition enums.h:5764
@ MSG_FX_FLAG_SIZE_WAVE
Definition enums.h:5775
@ MSG_FX_FLAG_NOISE_OUTLINE
Definition enums.h:5766
@ MSG_FX_FLAG_STATIC
Definition enums.h:5777
@ MSG_FX_FLAG_RAINBOW
Definition enums.h:5768
@ MSG_FX_FLAG_SIZE_JITTER
Definition enums.h:5774
@ MSG_FX_FLAG_DITHER_FADE
Definition enums.h:5769
@ MSG_STATE_FLAG_4000
Definition enums.h:5835
@ MSG_PRINT_FUNC_SET_FRAME_PALETTE
Definition enums.h:5717
@ MSG_PAL_14
Definition enums.h:5010
@ MSG_PAL_13
Definition enums.h:5009
@ MSG_PAL_22
Definition enums.h:5024
@ MSG_PAL_43
Definition enums.h:5057
@ MSG_PAL_42
Definition enums.h:5056
@ MSG_PAL_WHITE
Definition enums.h:4990
@ MSG_PAL_20
Definition enums.h:5022
@ MSG_PAL_23
Definition enums.h:5025
@ MSG_PAL_1C
Definition enums.h:5018
@ MSG_PAL_STANDARD
Definition enums.h:5000
@ MSG_PAL_10
Definition enums.h:5006
@ MSG_PAL_12
Definition enums.h:5008
@ MSG_PAL_25
Definition enums.h:5027
@ MSG_PAL_44
Definition enums.h:5058
@ MSG_PAL_40
Definition enums.h:5054
@ MSG_PAL_RED
Definition enums.h:4997
@ MSG_PAL_41
Definition enums.h:5055
@ MSG_PAL_18
Definition enums.h:5014
@ MSG_PAL_11
Definition enums.h:5007
@ EASING_SIN_OUT
Definition enums.h:521
@ MSG_PRINT_FLAG_2
Definition enums.h:5815
@ MSG_PRINT_FLAG_40
Definition enums.h:5818
@ MSG_PRINT_FLAG_100
Definition enums.h:5820
@ MSG_PRINT_FLAG_1
Definition enums.h:5814
@ MSG_PRINT_FLAG_20
Definition enums.h:5817
@ MSG_PRINT_FLAG_10
Definition enums.h:5816
@ MSG_PRINT_FLAG_80
Definition enums.h:5819
@ MSG_CHAR_PRINT_VARIANT2
Definition enums.h:5650
@ MSG_CHAR_PRINT_VARIANT1
Definition enums.h:5649
@ MSG_CHAR_PRINT_VARIANT3
Definition enums.h:5651
#define MSG_SIGN_OFFSET_X
Definition msg_draw.c:205
void msg_draw_speech_bubble(MessagePrintState *printer, s16 posX, s16 posY, s16 straightWidth, s16 curveWidth, s16 height, f32 scaleX, f32 scaleY, u8 opacity, s32 arg9)
Definition msg_draw.c:1821
#define MSG_SIGN_WIDTH
Definition msg_draw.c:204
PAL_BIN D_8015C7E0[0x10]
Definition msg.c:105
IMG_BIN ui_msg_lamppost_corner_bottomright_png[]
IMG_BIN D_80159B50[0x200]
Definition msg.c:104
IMG_BIN ui_msg_sign_side_top_png[]
s16 MsgStyleVerticalLineOffsets[]
Definition msg_data.c:927
PAL_BIN ui_msg_lamppost_pal[]
void msg_draw_char(MessagePrintState *printer, MessageDrawState *drawState, s32 charIndex, s32 palette, s32 posX, s32 posY)
Definition msg_draw.c:1645
IMG_BIN ui_msg_sign_corner_topright_png[]
Gfx * D_80151338
Definition msg.c:93
#define MSG_POPUP_TEXT_Y
Definition msg_draw.c:206
#define MSG_NORMAL_WIN_WIDTH
Definition msg_draw.c:195
void msg_draw_frame(s32 posX, s32 posY, s32 sizeX, s32 sizeY, s32 style, s32 palette, s32 fading, s32 bgAlpha, s32 frameAlpha)
Definition msg_draw.c:2041
#define MSG_SIGN_TEXT_Y
Definition msg_draw.c:203
#define MSG_EPILOGUE_TEXT_Y
Definition msg_draw.c:207
#define MSG_NORMAL_X
Definition msg_draw.c:194
IMG_BIN ui_msg_sign_fill_png[]
#define MSG_NORMAL_WIDTH
Definition msg_draw.c:193
u16 gMsgGlobalWaveCounter
Definition msg.c:89
void msg_draw_prim_rect(u8 r, u8 g, u8 b, u8 a, u16 posX, u16 posY, u16 sizeX, u16 sizeY)
Definition msg_draw.c:1786
s32 msg_get_draw_char_width(s32 character, s32 charset, s32 variation, f32 msgScale, s32 overrideCharWidth, u16 flags)
Definition msg.c:1630
PAL_BIN ui_msg_sign_pal[]
#define MSG_NORMAL_TEXT_Y
Definition msg_draw.c:197
void msg_reset_gfx_state(void)
Definition msg_draw.c:1640
#define MSG_NORMAL_ARROW_X
Definition msg_draw.c:198
IMG_BIN ui_msg_sign_side_bottom_png[]
#define MSG_NORMAL_PAGE_HT
Definition msg_draw.c:201
IMG_BIN ui_msg_sign_side_right_png[]
IMG_BIN ui_msg_sign_corner_bottomleft_png[]
#define MSG_NORMAL_WIN_HEIGHT
Definition msg_draw.c:196
void msg_draw_speech_arrow(MessagePrintState *printer)
Definition msg_draw.c:1926
IMG_BIN ui_msg_sign_corner_bottomright_png[]
Gfx D_8014C500[]
Definition msg_draw.c:94
#define MSG_INSPECT_TEXT_Y
Definition msg_draw.c:202
IMG_BIN ui_msg_sign_corner_topleft_png[]
#define MSG_NORMAL_ARROW_Y
Definition msg_draw.c:199
#define MSG_NORMAL_HEIGHT_CAP
Definition msg_draw.c:200
MessageCharset * MsgCharsets[5]
Definition msg_data.c:865
IMG_BIN ui_msg_sign_side_left_png[]
u8 * D_8015131C
Definition msg.c:92
#define PM_CC_MSG_NOISE_OUTLINE
Definition macros.h:462
#define PM_CC_MSG_STATIC
Definition macros.h:463
#define PM_CC_02
Definition macros.h:288
s32 spr_get_npc_raster_info(SpriteRasterInfo *out, s32 npcSpriteID, s32 rasterIndex)
Definition sprite.c:1279

Referenced by draw_message_window(), draw_msg(), and drawbox_message_delegate().

◆ clear_character_set()

void clear_character_set ( void )

Definition at line 192 of file msg.c.

192 {
193 D_80155C98 = -1;
194}

Referenced by load_engine_data().

◆ clear_printers()

void clear_printers ( void )

Definition at line 196 of file msg.c.

196 {
197 s32 i;
198
199 for (i = 0; i < ARRAY_COUNT(gMessagePrinters); i++) {
200 initialize_printer(&gMessagePrinters[i], 0, 0);
201 }
202
205
206 for (i = 0; i < ARRAY_COUNT(gMessageMsgVars); i++) {
207 gMessageMsgVars[i][0] = 0;
208 }
209
210 D_80151338 = nullptr;
212 load_font(0);
213}
Gfx * D_80151338
Definition msg.c:93
u16 gMsgGlobalWaveCounter
Definition msg.c:89
s32 gMsgBGScrollAmtY
Definition msg.c:91
void load_font(s32 font)
Definition msg.c:225
s32 gMsgBGScrollAmtX
Definition msg.c:88

Referenced by load_demo_battle(), load_engine_data(), load_map_by_IDs(), state_init_title_screen(), state_step_demo(), state_step_intro(), and state_step_startup().

◆ load_font_data()

void load_font_data ( Addr offset,
u16 size,
void * dest )

Definition at line 218 of file msg.c.

218 {
219#endif
220 u8* base = charset_ROM_START + (s32) offset;
221
222 dma_copy(base, base + size, dest);
223}

Referenced by filemenu_draw_char(), load_font(), and msg_draw_char().

◆ load_font()

void load_font ( s32 font)

Definition at line 225 of file msg.c.

225 {
226 if (font != D_80155C98) {
227 if (font == 0) {
228#if VERSION_JP
235#else
237#endif
239
240 // fix outline color after loading
241 for (s32 i = 0; i < 80; i++) {
242 // set the transparent color to the outline color but with alpha = 0
243 D_802F4560[i][0] = D_802F4560[i][6] & ~1;
244 }
245 } else if (font == 1) {
249 }
250 }
251}
unsigned char charset_standard_pal_OFFSET[]
unsigned char charset_standard_OFFSET[]
unsigned char charset_subtitle_pal_OFFSET[]
unsigned char charset_subtitle_OFFSET[]
unsigned char charset_title_OFFSET[]
IMG_BIN MsgCharImgSubtitle[]
Definition msg_img.c:92
IMG_BIN MsgCharImgTitle[]
Definition msg_img.c:90
void load_font_data(Addr offset, u16 size, void *dest)
Definition msg.c:218
IMG_BIN MsgCharImgNormal[]
Definition msg_img.c:91
PAL_BIN D_802F4560[80][8]
IMG_BIN MsgCharImgLatin[]
IMG_BIN MsgCharImgMenuKana[]
IMG_BIN MsgCharImgMenuLatin[]
IMG_BIN MsgCharImgKana[]

Referenced by clear_printers().

◆ update_messages()

void update_messages ( void )

Definition at line 253 of file msg.c.

253 {
254 s32 i;
255
257 if (gMsgGlobalWaveCounter >= 360) {
259 }
260
261 for (i = 0; i < ARRAY_COUNT(gMessagePrinters); i++) {
262 if (gMessagePrinters[i].stateFlags & MSG_STATE_FLAG_2) {
263 _update_message(&gMessagePrinters[i]);
264 }
265 }
266
267 gMsgBGScrollAmtX += 12;
268 gMsgBGScrollAmtY -= 12;
269 if (gMsgBGScrollAmtX >= 2048) {
270 gMsgBGScrollAmtX -= 2048;
271 }
272 if (gMsgBGScrollAmtY < 0) {
273 gMsgBGScrollAmtY += 2048;
274 }
275}
s32 _update_message(MessagePrintState *printer)
Definition msg.c:277

Referenced by step_game_loop().

◆ render_messages()

void render_messages ( void )

Definition at line 573 of file msg.c.

573 {
574 Mtx* matrix = &gMessageWindowProjMatrix[gCurrentDisplayContextIndex];
575 s32 i;
576
577 for (i = 0; i < ARRAY_COUNT(gMessagePrinters); i++) {
578 if (gMessagePrinters[i].stateFlags & MSG_STATE_FLAG_2) {
580 guOrtho(matrix, 0.0f, 319.0f, -240.0f, 0.0f, -500.0f, 500.0f, 1.0f);
587 break;
588 }
589 }
590
591 for (i = 0; i < ARRAY_COUNT(gMessagePrinters); i++) {
592 if (gMessagePrinters[i].stateFlags & MSG_STATE_FLAG_2) {
593 draw_message_window(&gMessagePrinters[i]);
594
595 if (gMessagePrinters[i].windowState == MSG_WINDOW_STATE_WAITING) {
596 if (!(gMessagePrinters[i].stateFlags & MSG_STATE_FLAG_8000) &&
597 !(gMessagePrinters[i].stateFlags & MSG_STATE_FLAG_40))
598 {
600 }
601 } else if (gMessagePrinters[i].windowState == MSG_WINDOW_STATE_C) {
603 } else if (gMessagePrinters[i].windowState == MSG_WINDOW_STATE_WAITING_FOR_CHOICE ||
604 gMessagePrinters[i].windowState == MSG_WINDOW_STATE_SCROLLING_BACK ||
605 gMessagePrinters[i].stateFlags & MSG_STATE_FLAG_10000 ||
606 gMessagePrinters[i].stateFlags & MSG_STATE_FLAG_20000)
607 {
608 msg_draw_choice_pointer(&gMessagePrinters[i]);
609 }
610 }
611 }
612}
@ MSG_STATE_FLAG_10000
Definition enums.h:5837
void msg_draw_rewind_arrow(s32)
Definition msg.c:2147
Vp D_8014C280
Definition msg.c:34
void msg_update_rewind_arrow(s32)
Definition msg.c:2063
void draw_message_window(MessagePrintState *printer)
Definition msg_draw.c:137
void msg_draw_choice_pointer(MessagePrintState *printer)
Definition msg.c:2161
s32 gCurrentDisplayContextIndex
Definition main_loop.c:46

Referenced by gfx_draw_frame().

◆ msg_play_speech_sound()

void msg_play_speech_sound ( MessagePrintState * printer,
u8 character )

Definition at line 614 of file msg.c.

614 {
615 f32 volTemp;
616 s16 volume;
617 s32 pitchShift;
618 s32 flag = 1;
619 s32 baseShift = 100;
620
621 if (printer->stateFlags & MSG_STATE_FLAG_800000 && !(printer->delayFlags & (MSG_DELAY_FLAG_2 | MSG_DELAY_FLAG_4)) && printer->volume != 0) {
622 volTemp = (f32)printer->volume / 100.0;
623 pitchShift = ((character % 20) * 10) + (printer->speechPitchShift - baseShift);
624 volume = ((rand_int(15) + 78) * volTemp);
625
626 if (volume > 255) {
627 volume = 255;
628 }
629
630 if (character & flag) {
631 sfx_play_sound_with_params(printer->speechSoundIDA, volume, printer->speechPan, pitchShift);
632 } else {
633 sfx_play_sound_with_params(printer->speechSoundIDB, volume, printer->speechPan, pitchShift);
634 }
635 }
636}

Referenced by msg_copy_to_print_buffer().

◆ dma_load_msg()

void dma_load_msg ( u32 msgID,
void * dest )

Definition at line 1398 of file msg.c.

1398 {
1399 u8* addr = (u8*) MSG_ROM_START + (msgID >> 14); // (msgID >> 16) * 4
1400 u8* offset[2]; // start, end
1401
1402 dma_copy(addr, addr + 4, &offset[0]); // Load section offset
1403
1404 addr = MSG_ROM_START + offset[0] + (msgID & 0xFFFF) * 4;
1405 dma_copy(addr, addr + 8, &offset); // Load message start and end offsets
1406
1407 // Load the msg data
1408 dma_copy(MSG_ROM_START + offset[0], MSG_ROM_START + offset[1], dest);
1409}
#define MSG_ROM_START
Definition msg.c:23

Referenced by draw_msg(), get_msg_properties(), load_message_to_buffer(), and set_message_text_var().

◆ load_message_to_buffer()

s8 * load_message_to_buffer ( s32 msgID)

Definition at line 1412 of file msg.c.

1412 {
1414
1415 dma_load_msg(msgID, &gMessageBuffers[gNextMessageBuffer]);
1416 prevBufferPos = gMessageBuffers[gNextMessageBuffer];
1417
1419 if (gNextMessageBuffer >= ARRAY_COUNT(gMessageBuffers)) {
1421 }
1422
1423 return prevBufferPos;
1424}
s16 gNextMessageBuffer
Definition msg.c:62
void dma_load_msg(u32 msgID, void *dest)
Definition msg.c:1398

Referenced by _msg_get_printer_for_msg(), and msg_printer_load_msg().

◆ msg_get_printer_for_msg()

MessagePrintState * msg_get_printer_for_msg ( s32 msgID,
s32 * donePrintingWriteback )

Definition at line 1426 of file msg.c.

1426 {
1428}
MessagePrintState * _msg_get_printer_for_msg(s32 msgID, s32 *donePrintingWriteback, s32 arg2)
Definition msg.c:1430

Referenced by _show_message(), entity_HeartBlock_show_tutorial_message(), entity_SaveBlock_show_choice_message(), entity_SaveBlock_show_tutorial_message(), popup_menu_update(), and update_item_entity_pickup().

◆ msg_printer_load_msg()

s32 msg_printer_load_msg ( s32 msgID,
MessagePrintState * printer )

Definition at line 1476 of file msg.c.

1476 {
1477 s8* buffer;
1478
1479 if (msgID >= 0) {
1480 buffer = load_message_to_buffer(msgID);
1481 } else {
1482 buffer = (s8*) msgID;
1483 }
1484
1485 printer->srcBuffer = buffer;
1486 printer->srcBufferPos = 0;
1487 printer->stateFlags &= ~MSG_STATE_FLAG_40;
1488 return 1;
1489}

Referenced by _show_message(), and entity_SaveBlock_show_result_message().

◆ msg_printer_set_origin_pos()

void msg_printer_set_origin_pos ( MessagePrintState * msgPrintState,
s32 x,
s32 y )

Definition at line 1491 of file msg.c.

1491 {
1492 msgPrintState->initOpenPos.x = x;
1493 msgPrintState->initOpenPos.y = y;
1494
1495 if (msgPrintState->initOpenPos.x < 0) {
1496 msgPrintState->initOpenPos.x = 0;
1497 }
1498 if (msgPrintState->initOpenPos.x > SCREEN_WIDTH) {
1499 msgPrintState->initOpenPos.x = SCREEN_WIDTH;
1500 }
1501 if (msgPrintState->initOpenPos.y < 0) {
1502 msgPrintState->initOpenPos.y = 0;
1503 }
1504 if (msgPrintState->initOpenPos.y > 220) {
1505 msgPrintState->initOpenPos.y = 220;
1506 }
1507}

Referenced by _show_message(), popup_menu_update(), and update_item_entity_pickup().

◆ cancel_message()

s32 cancel_message ( MessagePrintState * msgPrintState)

Definition at line 1509 of file msg.c.

1509 {
1510 if (!(msgPrintState->stateFlags & MSG_STATE_FLAG_2)) {
1511 return false;
1512 }
1513
1514 msgPrintState->stateFlags |= MSG_STATE_FLAG_1;
1515 return true;
1516}

Referenced by cancel_current_message().

◆ set_message_images()

void set_message_images ( MessageImageData * images)

Definition at line 1518 of file msg.c.

1518 {
1520}
MessageImageDataList gMsgVarImages
Definition msg.c:90

◆ set_message_text_var()

void set_message_text_var ( s32 msgID,
s32 index )

Definition at line 1522 of file msg.c.

1522 {
1523 u8* mallocSpace = nullptr;
1524 s32 i;
1525 u8* msgVars;
1526
1527 if (msgID >= 0) {
1529 dma_load_msg(msgID, mallocSpace);
1530 msgID = (s32)mallocSpace;
1531 }
1532
1533 i = 0;
1534 msgVars = gMessageMsgVars[index];
1535 while (true) {
1536 msgVars[i] = ((u8*)msgID)[i];
1537 if (((u8*)msgID)[i] == MSG_CHAR_READ_END) {
1538 break;
1539 }
1540
1541 if (++i >= 32) {
1542 msgVars[i - 1] = MSG_CHAR_READ_END;
1543 break;
1544 }
1545 }
1546
1547 if (mallocSpace != nullptr) {
1549 }
1550}
#define general_heap_malloc

Referenced by btl_message_popup_draw_content(), btl_show_message_popup(), draw_content_pickup_item_header(), func_801363A0(), shop_owner_buy_dialog(), and shop_owner_continue_speech_with_quantity().

◆ set_message_int_var()

void set_message_int_var ( s32 value,
s32 index )

Definition at line 1552 of file msg.c.

1552 {
1553 s8 strBuffer[ARRAY_COUNT(gMessageMsgVars[index])];
1554 s8* bufferIt;
1555 s32 i;
1556
1557 int_to_string(value, strBuffer, 10);
1558
1559 for (i = 0, bufferIt = strBuffer; i < ARRAY_COUNT(gMessageMsgVars[index]) - 1; i++) {
1560 s8 thisChar = bufferIt[i];
1561
1562 if (thisChar == 0) {
1563 break;
1564 }
1565 gMessageMsgVars[index][i] = thisChar - '0' + MSG_CHAR_DIGIT_0;
1566 }
1567 gMessageMsgVars[index][i] = MSG_CHAR_READ_END;
1568}
@ MSG_CHAR_DIGIT_0
Definition enums.h:5457
char * int_to_string(s32, char *, s32)
Definition 43F0.c:384

Referenced by btl_message_popup_draw_content(), btl_show_message_popup(), popup_draw_menu_content(), shop_owner_buy_dialog(), and shop_owner_continue_speech_with_quantity().

◆ close_message()

void close_message ( MessagePrintState * msgPrintState)

Definition at line 1570 of file msg.c.

1570 {
1571 msgPrintState->stateFlags &= ~MSG_STATE_FLAG_40;
1572}

Referenced by _show_message(), and entity_SaveBlock_wait_for_close_choice().

◆ msg_get_print_char_width()

s32 msg_get_print_char_width ( s32 character,
s32 charset,
s32 variation,
f32 msgScale,
s32 overrideCharWidth,
u8 flags )

Definition at line 1580 of file msg.c.

1580 {
1581 f32 charWidth;
1582
1587 return 0;
1588 }
1589
1590#if VERSION_IQUE
1592 charWidth = 16.0;
1593 return charWidth * msgScale;
1594 }
1595#endif
1596
1597 if (overrideCharWidth != 0) {
1598 charWidth = overrideCharWidth;
1599 } else if (flags != 0) {
1600 u8* charWidthTable = MsgCharsets[charset]->rasters[variation].charWidthTable;
1601
1602 if (charWidthTable != nullptr
1606 charWidth = charWidthTable[character];
1607 } else {
1608 charWidth = MsgCharsets[charset]->rasters[variation].monospaceWidth;
1609 }
1610 } else {
1611 charWidth = MsgCharsets[charset]->rasters[variation].monospaceWidth;
1612 }
1613
1615 return charWidth * msgScale * CHAR_SPACE_MULTIPLIER;
1616 }
1618 f64 retWidth = charWidth * msgScale;
1619 return retWidth;
1620 }
1622 return charWidth * msgScale * 0.5;
1623 }
1624 if (character >= MSG_CONTROL_CHAR) {
1625 return 0;
1626 }
1627 return charWidth * msgScale;
1628}
s8 flags
Definition demo_api.c:15
#define CHAR_SPACE_MULTIPLIER
Definition msg.c:1577

Referenced by filemenu_draw_contents_choose_name(), filemenu_draw_file_name(), and get_msg_properties().

◆ msg_get_draw_char_width()

s32 msg_get_draw_char_width ( s32 character,
s32 charset,
s32 variation,
f32 msgScale,
s32 overrideCharWidth,
u16 flags )

Definition at line 1630 of file msg.c.

1630 {
1631 f32 baseWidth;
1632
1637 return 0;
1638 }
1639
1640 if (overrideCharWidth != 0) {
1642 } else if (flags & MSG_PRINT_FLAG_100) {
1643 u8* charWidthTable = MsgCharsets[charset]->rasters[variation].charWidthTable;
1644
1645 if (charWidthTable != nullptr
1649 baseWidth = charWidthTable[character];
1650 } else {
1652 }
1653 } else {
1655 }
1656
1658 return baseWidth * msgScale * CHAR_SPACE_MULTIPLIER;
1659 }
1661 f64 charWidth = baseWidth * msgScale;
1662 return charWidth;
1663 }
1665 return baseWidth * msgScale * 0.5;
1666 }
1667 if (character >= MSG_CONTROL_CHAR) {
1668 return 0;
1669 }
1670 return baseWidth * msgScale;
1671}

Referenced by appendGfx_message(), and msg_get_glyph().

◆ get_msg_properties()

void get_msg_properties ( s32 msgID,
s32 * height,
s32 * width,
s32 * maxLineChars,
s32 * numLines,
s32 * maxLinesPerPage,
s32 * numSpaces,
u16 charset )

Definition at line 1673 of file msg.c.

1673 {
1674 u8* message;
1675 s32 i;
1676 u16 pageCount;
1678 u8 stop;
1679 s32 lineWidth;
1680 s32 charCount;
1681 u16 lineIndex;
1682 s32 msgStyle;
1685 f32 scale;
1686 s32 temp;
1687
1688 u16 lineWidths[32];
1689 u16 lineCharNumbers[32];
1690 u16 linesPerPage[32];
1691 s32 lineCount;
1692 u16 varIndex;
1693 u16 font;
1694 u8* buffer;
1699 u16 endl;
1700
1701 u8 c;
1702 u8 prevChar;
1703
1704 scale = 1.0f;
1705 c = 0;
1706 lineIndex = 0;
1707 pageCount = 0;
1708 varIndex = 0;
1709 font = 0;
1710 buffer = nullptr;
1711 maxLineWidth = 0;
1712 maxCharsPerLine = 0;
1713 maxLinesOnPage = 0;
1714 spaceCount = 0;
1715
1716 if (msgID == MSG_NONE) {
1717 return;
1718 }
1719
1720 if (msgID >= 0) {
1721 buffer = general_heap_malloc(0x400);
1722 dma_load_msg(msgID, buffer);
1723 message = buffer;
1724 } else {
1725 message = (u8*)msgID;
1726 }
1727
1728 if (charset & 1) {
1729 font = 1;
1730 }
1731
1732 i = 0;
1733 stop = false;
1734 lineWidth = 0;
1735 linesOnPage = 0;
1736 charCount = 0;
1737 endl = true;
1738 lineCount = 0;
1739
1740 do {
1741 prevChar = c;
1742 c = message[i++];
1743 switch (c) {
1748 varIndex = c - MSG_CHAR_READ_VARIANT0;
1749 break;
1751 i++;
1752 break;
1753 case MSG_CHAR_READ_WAIT:
1754 case MSG_CHAR_READ_NEXT:
1755 if (linesOnPage != 0) {
1757 pageCount++;
1758 if (pageCount >= 32) {
1759 stop = 1;
1760 }
1761 linesOnPage = 0;
1762 }
1763 break;
1764 case MSG_CHAR_READ_ENDL:
1767 lineIndex++;
1768 if (lineIndex >= 32) {
1769 stop = 1;
1770 }
1771 lineWidth = 0;
1772 charCount = 0;
1773 endl = true;
1774 break;
1776 msgStyle = message[i++];
1777 switch (msgStyle) {
1778 case MSG_STYLE_CHOICE:
1779 i += 4;
1780 break;
1781 case MSG_STYLE_POSTCARD:
1782 i++;
1783 break;
1784 case MSG_STYLE_RIGHT:
1785 case MSG_STYLE_LEFT:
1786 case MSG_STYLE_CENTER:
1787 case MSG_STYLE_TATTLE:
1788 case MSG_STYLE_INSPECT:
1789 case MSG_STYLE_SIGN:
1790 case MSG_STYLE_LAMPPOST:
1791 case MSG_STYLE_POPUP:
1792 case MSG_STYLE_B:
1793 break;
1794 }
1795 break;
1796 case MSG_CHAR_READ_END:
1799 lineIndex++;
1800 stop = true;
1801 break;
1803 functionCode = message[i++];
1804 switch (functionCode) {
1805 case MSG_READ_FUNC_FONT:
1806 font = message[i++];
1807 break;
1819 break;
1820 default:
1821 stop = true;
1822 break;
1824 i++;
1825 // fallthrough
1826 temp = 4;
1828 i += temp;
1829 // fallthrough
1832 i++;
1833 // fallthrough
1837 i++;
1838 // fallthrough
1844 case MSG_READ_FUNC_DOWN:
1845 case MSG_READ_FUNC_UP:
1857 i++;
1858 break;
1860 if (message[i] == 0) {
1861 stop = true;
1862 }
1863 i++;
1864 break;
1866 if (message[i] == MSG_CHAR_READ_END) {
1867 stop = true;
1868 }
1869 break;
1870 case MSG_READ_FUNC_SIZE:
1871 packedScaleY = message[i + 1];
1872 i += 2;
1873 scale = (f32)(packedScaleY >> 4) + ((packedScaleY & 0xF) * 0.0625f);
1874 break;
1876 scale = 1.0f;
1877 break;
1879 switch (message[i++]) {
1880 case MSG_FX_STATIC:
1881 case MSG_FX_BLUR:
1882 case MSG_FX_DITHER_FADE:
1883 i++;
1884 break;
1885 case MSG_FX_SHAKE:
1886 case MSG_FX_WAVE:
1888 case MSG_FX_RAINBOW:
1889 case MSG_FX_GLOBAL_WAVE:
1891 case MSG_FX_RISE_PRINT:
1892 case MSG_FX_GROW_PRINT:
1893 case MSG_FX_SIZE_JITTER:
1894 case MSG_FX_SIZE_WAVE:
1895 case MSG_FX_DROP_SHADOW:
1896 break;
1897 }
1898 break;
1899 case MSG_READ_FUNC_VAR:
1900 lineWidth += get_msg_width((s32)gMessageMsgVars[message[i++]], 0);
1901 break;
1902 }
1903 break;
1905 break;
1909 spaceCount++;
1910 // fallthrough
1911 default:
1912 if (endl) {
1913 lineCount++;
1914 linesOnPage++;
1915 endl = false;
1916 }
1917
1918#if VERSION_IQUE
1920 break;
1921 }
1922#endif
1923
1924 lineWidth += msg_get_print_char_width(c, font, varIndex, scale, 0, 1);
1925 charCount++;
1926 break;
1927 }
1928 } while (!stop);
1929
1930 if (buffer != nullptr) {
1931 general_heap_free(buffer);
1932 }
1933
1934 for (i = 0; i < lineIndex; i++) {
1935 if (maxLineWidth < lineWidths[i]) {
1937 }
1940 }
1941 }
1942
1943 if (pageCount == 0) {
1945 } else {
1946 for (i = 0; i < pageCount; i++) {
1947 if (maxLinesOnPage < linesPerPage[i]) {
1949 }
1950 }
1951 }
1952
1953 if (width != nullptr) {
1954 *width = maxLineWidth;
1955 }
1956 if (height != nullptr) {
1957 *height = lineCount * MsgCharsets[font]->newLineY;
1958 }
1959 if (maxLineChars != nullptr) {
1960 *maxLineChars = maxCharsPerLine;
1961 }
1962 if (numLines != nullptr) {
1963 *numLines = lineCount;
1964 }
1965 if (maxLinesPerPage != nullptr) {
1966 *maxLinesPerPage = maxLinesOnPage;
1967 }
1968 if (numSpaces != nullptr) {
1970 }
1971}
#define get_msg_width
s32 msg_get_print_char_width(s32 character, s32 charset, s32 variation, f32 msgScale, s32 overrideCharWidth, u8 flags)
Definition msg.c:1580

Referenced by _msg_get_printer_for_msg(), draw_msg(), get_msg_lines(), get_msg_width(), pause_handle_input(), and pause_tutorial_draw_contents().

◆ get_msg_width()

s32 get_msg_width ( s32 msgID,
u16 charset )

Definition at line 1973 of file msg.c.

1973 {
1974 s32 width;
1975
1976 get_msg_properties(msgID, nullptr, &width, nullptr, nullptr, nullptr, nullptr, charset);
1977 return width;
1978}

◆ get_msg_lines()

s32 get_msg_lines ( s32 msgID)

Definition at line 1981 of file msg.c.

1981 {
1982 s32 numLines;
1983
1984 get_msg_properties(msgID, nullptr, nullptr, nullptr, &numLines, nullptr, nullptr, 0);
1985 return numLines;
1986}

Referenced by btl_menu_moves_show_error(), btl_message_popup_draw_content(), btl_show_message_popup(), btl_submenu_moves_update(), draw_content_pickup_item_header(), draw_merlee_message(), draw_merlee_message_string(), func_801363A0(), popup_draw_dip_query_content(), and popup_menu_update().

◆ draw_msg()

void draw_msg ( s32 msgID,
s32 posX,
s32 posY,
s32 opacity,
s32 palette,
u8 style )

Definition at line 1989 of file msg.c.

1989 {
1992 u16 bufferPos;
1993 s8* mallocSpace;
1994 s32 charset;
1995 u16 flags;
1996 s32 width;
1997
1998 flags = 0;
1999 bufferPos = 0;
2000 mallocSpace = nullptr;
2001 charset = 0;
2002
2003 if (msgID != 0) {
2004 if (style & DRAW_MSG_STYLE_MENU) {
2005 flags = 2;
2006 charset = 1;
2007 }
2008
2009 if (opacity < 0xFF) {
2010 flags |= 1;
2011 }
2012
2015
2016 if (msgID < 0) {
2017 printer->srcBuffer = (u8*)msgID;
2018 } else {
2020 dma_load_msg(msgID, mallocSpace);
2021 printer->srcBuffer = mallocSpace;
2022 get_msg_properties((s32) printer->srcBuffer, 0, &width, 0, 0, 0, 0, charset);
2023 printer->msgWidth = width;
2024 }
2025
2026 if (palette >= 0) {
2027 printer->printBuffer[bufferPos++] = MSG_CHAR_PRINT_FUNCTION;
2028 printer->printBuffer[bufferPos++] = MSG_PRINT_FUNC_COLOR;
2029 printer->printBuffer[bufferPos++] = palette;
2030 printer->printBufferPos += 3;
2031 }
2032
2033 if (style & DRAW_MSG_STYLE_WAVY) {
2034 printer->printBuffer[bufferPos++] = MSG_CHAR_PRINT_FUNCTION;
2035 printer->printBuffer[bufferPos++] = MSG_PRINT_FUNC_START_FX;
2036 printer->printBuffer[bufferPos++] = MSG_FX_GLOBAL_WAVE;
2037 printer->printBufferPos += 3;
2038 }
2039
2040 if (style & DRAW_MSG_STYLE_RAINBOW) {
2041 printer->printBuffer[bufferPos++] = MSG_CHAR_PRINT_FUNCTION;
2042 printer->printBuffer[bufferPos++] = MSG_PRINT_FUNC_START_FX;
2043 printer->printBuffer[bufferPos++] = MSG_FX_GLOBAL_RAINBOW;
2044 printer->printBufferPos += 3;
2045 }
2046
2047 if (style & DRAW_MSG_STYLE_DROP_SHADOW) {
2048 printer->printBuffer[bufferPos++] = MSG_CHAR_PRINT_FUNCTION;
2049 printer->printBuffer[bufferPos++] = MSG_PRINT_FUNC_START_FX;
2050 printer->printBuffer[bufferPos++] = MSG_FX_DROP_SHADOW;
2051 printer->printBufferPos += 3;
2052 }
2053
2055 appendGfx_message(printer, (s16)posX, (s16)posY, 0, 0, flags, opacity & 0xFF);
2056
2057 if (mallocSpace != nullptr) {
2059 }
2060 }
2061}
@ DRAW_MSG_STYLE_DROP_SHADOW
Definition enums.h:4973
@ DRAW_MSG_STYLE_MENU
Definition enums.h:4970
@ DRAW_MSG_STYLE_RAINBOW
Definition enums.h:4972
@ DRAW_MSG_STYLE_WAVY
Definition enums.h:4971
void appendGfx_message(MessagePrintState *, s16, s16, u16, u16, u16, u8)
Definition msg_draw.c:213

◆ draw_digit()

void draw_digit ( IMG_PTR img,
s32 charset,
s32 posX,
s32 posY )

Definition at line 2205 of file msg.c.

2205 {
2207
2210 num->texWidth , num->texHeight,
2211 0, 0,
2212 num->texWidth - 1, num->texHeight - 1,
2213 0,
2218 4 * posX, 4 * posY,
2219 4 * (posX + num->texWidth), 4 * (posY + num->texHeight),
2221 0, 0,
2222 1 << 10, 1 << 10);
2223}
MessageNumber gMsgNumbers[]
Definition msg.c:129

Referenced by draw_number().

◆ draw_number()

void draw_number ( s32 value,
s32 x,
s32 y,
s32 charset,
s32 palette,
s32 opacity,
u16 style )

Definition at line 2225 of file msg.c.

2225 {
2226 u8 valueStr[24];
2227 s8 digits[24];
2228 s32 digitPosX[24];
2229 s32 i;
2230 s32 count;
2231 s32 posX;
2233 s32 texSize = gMsgNumbers[charset].texSize;
2234
2235#if !VERSION_JP
2236 y -= 2;
2237#endif
2238 if (y < 0 || y > 240) {
2239 return;
2240 }
2241
2242 int_to_string(value, valueStr, 10);
2243
2244 for (i = 0; i < 10; i++) {
2245 u8 digit;
2246 if (valueStr[i] == '\0') {
2247 break;
2248 }
2249
2250 // handle negative numbers
2251 if (valueStr[i] == '-') {
2253 continue;
2254 }
2255
2256 digit = valueStr[i] - '0';
2257 if (digit < 10){
2258 digits[i] = digit;
2259 }
2260 }
2261 posX = x;
2262 count = i;
2263
2265
2266 if (style & DRAW_NUMBER_STYLE_ALIGN_RIGHT) {
2267 for (i = count - 1; i >= 0; i--) {
2268 if ((style & DRAW_NUMBER_STYLE_MONOSPACE) || digits[i] < 0) {
2270 } else {
2271 posX -= gMsgNumbers[charset].digitWidth[digits[i]];
2272 }
2273 digitPosX[i] = posX;
2274 }
2275 } else {
2276 for (i = 0; i < count; i++) {
2277 digitPosX[i] = posX;
2278 if ((style & DRAW_NUMBER_STYLE_MONOSPACE) || digits[i] < 0) {
2280 } else {
2281 posX += gMsgNumbers[charset].digitWidth[digits[i]];
2282 }
2283 }
2284 }
2285
2286 if (style & DRAW_NUMBER_STYLE_DROP_SHADOW) {
2287 for (i = 0; i < count; i++) {
2291 gDPSetPrimColor(gMainGfxPos++, 0, 0, 40, 40, 40, 72);
2292 draw_digit(raster + digits[i] * texSize, charset, digitPosX[i] + 2, y + 2);
2294 }
2295 }
2296
2297 if (opacity == 255) {
2300 } else {
2303 gDPSetPrimColor(gMainGfxPos++, 0, 0, 255, 255, 255, opacity);
2304 }
2305
2307 for (i = 0; i < count; i++) {
2308 posX = digitPosX[i];
2309 if (posX > 0 && posX < 320) {
2310 draw_digit(raster + digits[i] * texSize, charset, posX, y);
2311 }
2312 }
2314}
@ DRAW_NUMBER_STYLE_ALIGN_RIGHT
drawn to the left of posX
Definition enums.h:4978
@ DRAW_NUMBER_STYLE_DROP_SHADOW
Definition enums.h:4981
@ DRAW_NUMBER_STYLE_MONOSPACE
Definition enums.h:4979
@ MSG_CHAR_MINUS
Definition enums.h:5454
void draw_digit(IMG_PTR img, s32 charset, s32 posX, s32 posY)
Definition msg.c:2205
Gfx gMsgDlistInitDrawNumber[]
Definition msg.c:165
#define PM_CC_01
Definition macros.h:287

Referenced by btl_menu_moves_draw_content(), coin_counter_draw_content(), draw_shop_items(), filemenu_draw_contents_file_info(), filemenu_draw_contents_file_title(), filemenu_info_draw_message_contents(), filemenu_yesno_draw_prompt_contents(), pause_badges_draw_contents(), pause_partners_draw_movelist(), pause_stats_draw_contents(), popup_draw_menu_content(), popup_draw_star_pieces_content(), and popup_draw_title_content().

Variable Documentation

◆ D_8014C280

Vp D_8014C280
Initial value:
= {
.vp = {
.vscale = {640, 480, 511, 0},
.vtrans = {640, 480, 511, 0},
}
}

Definition at line 34 of file msg.c.

34 {
35 .vp = {
36 .vscale = {640, 480, 511, 0},
37 .vtrans = {640, 480, 511, 0},
38 }
39};

Referenced by render_messages().

◆ MessagePlural

u8 MessagePlural[] = { MSG_CHAR_LOWER_S, MSG_CHAR_READ_END }

Definition at line 42 of file msg.c.

@ MSG_CHAR_LOWER_S
Definition enums.h:5524

Referenced by shop_owner_buy_dialog(), and shop_owner_continue_speech_with_quantity().

◆ MessageSingular

◆ gNextMessageBuffer

s16 gNextMessageBuffer = 0

Definition at line 62 of file msg.c.

Referenced by load_message_to_buffer().

◆ gRewindArrowQuad

Vtx gRewindArrowQuad[]
Initial value:
= {
{{{ -16, 9, 0 }, 0, { 0x000, 0x000 }, { 255, 255, 255, 255 }}},
{{{ 16, 9, 0 }, 0, { 0x400, 0x000 }, { 255, 255, 255, 255 }}},
{{{ -16, -9, 0 }, 0, { 0x000, 0x240 }, { 255, 255, 255, 255 }}},
{{{ 16, -9, 0 }, 0, { 0x400, 0x240 }, { 255, 255, 255, 255 }}},
}

Definition at line 64 of file msg.c.

64 {
65 {{{ -16, 9, 0 }, 0, { 0x000, 0x000 }, { 255, 255, 255, 255 }}},
66 {{{ 16, 9, 0 }, 0, { 0x400, 0x000 }, { 255, 255, 255, 255 }}},
67 {{{ -16, -9, 0 }, 0, { 0x000, 0x240 }, { 255, 255, 255, 255 }}},
68 {{{ 16, -9, 0 }, 0, { 0x400, 0x240 }, { 255, 255, 255, 255 }}},
69};

Referenced by msg_update_rewind_arrow().

◆ D_8014C2D8

◆ gMsgBGScrollAmtX

s32 gMsgBGScrollAmtX

Definition at line 88 of file msg.c.

Referenced by clear_printers(), msg_draw_frame(), and update_messages().

◆ gMsgGlobalWaveCounter

u16 gMsgGlobalWaveCounter

Definition at line 89 of file msg.c.

Referenced by appendGfx_message(), clear_printers(), and update_messages().

◆ gMsgVarImages

MessageImageDataList gMsgVarImages

Definition at line 90 of file msg.c.

Referenced by set_message_images().

◆ gMsgBGScrollAmtY

s32 gMsgBGScrollAmtY

Definition at line 91 of file msg.c.

Referenced by clear_printers(), msg_draw_frame(), and update_messages().

◆ D_8015131C

u8* D_8015131C

Definition at line 92 of file msg.c.

Referenced by appendGfx_message(), and msg_copy_to_print_buffer().

◆ D_80151338

Gfx* D_80151338

Definition at line 93 of file msg.c.

Referenced by appendGfx_message(), and clear_printers().

◆ D_80159B50

IMG_BIN D_80159B50[0x200]

Definition at line 104 of file msg.c.

Referenced by appendGfx_message(), and msg_copy_to_print_buffer().

◆ D_8015C7E0

PAL_BIN D_8015C7E0[0x10]

Definition at line 105 of file msg.c.

Referenced by appendGfx_message(), and msg_copy_to_print_buffer().

◆ MsgStyleVerticalLineOffsets

s16 MsgStyleVerticalLineOffsets[]
extern

Definition at line 927 of file msg_data.c.

927 {
928 [MSG_STYLE_NONE] 0,
929 [MSG_STYLE_RIGHT] -4,
930 [MSG_STYLE_LEFT] -4,
931 [MSG_STYLE_CENTER] -4,
932 [MSG_STYLE_TATTLE] -4,
935 [MSG_STYLE_SIGN] -4,
938 [MSG_STYLE_POPUP] 0,
939 [MSG_STYLE_B] 0,
943 [MSG_STYLE_F] 0,
944};
@ MSG_STYLE_NONE
Definition enums.h:5781

Referenced by msg_copy_to_print_buffer().

◆ ui_msg_rewind_arrow_png

IMG_BIN ui_msg_rewind_arrow_png[]
extern

Referenced by msg_draw_rewind_arrow().

◆ ui_msg_rewind_arrow_pal

PAL_BIN ui_msg_rewind_arrow_pal[]
extern

Referenced by msg_draw_rewind_arrow().

◆ ui_msg_star_png

IMG_BIN ui_msg_star_png[]
extern

Referenced by msg_update_rewind_arrow().

◆ ui_msg_star_silhouette_png

IMG_BIN ui_msg_star_silhouette_png[]
extern

Referenced by msg_update_rewind_arrow().

◆ MsgCharImgTitle

IMG_BIN MsgCharImgTitle[]
extern

Definition at line 90 of file msg_img.c.

Referenced by load_font().

◆ MsgCharImgNormal

IMG_BIN MsgCharImgNormal[]
extern

Definition at line 91 of file msg_img.c.

Referenced by load_font().

◆ MsgCharsets

MessageCharset* MsgCharsets[5]
extern

Definition at line 865 of file msg_data.c.

865 {
868#if VERSION_JP
870#else
872#endif
875 nullptr
876};
@ MSG_FONT_MENU
Definition enums.h:5801
@ MSG_FONT_TITLE
Definition enums.h:5803
@ MSG_FONT_2
Definition enums.h:5802
@ MSG_FONT_NORMAL
Definition enums.h:5800
@ MSG_FONT_SUBTITLE
Definition enums.h:5804
MessageCharset MsgCharsetTitle
Definition msg_data.c:849
MessageCharset MsgCharsetNormal
Definition msg_data.c:794
MessageCharset MsgCharsetSubtitle
Definition msg_data.c:857
MessageCharset MsgCharsetMenu
Definition msg_data.c:802

Referenced by get_msg_properties(), msg_copy_to_print_buffer(), msg_get_draw_char_width(), and msg_get_print_char_width().

◆ MsgCharImgSubtitle

IMG_BIN MsgCharImgSubtitle[]
extern

Definition at line 92 of file msg_img.c.

Referenced by load_font().

◆ D_802F4560

PAL_BIN D_802F4560[80][8]
extern

Referenced by draw_number(), and load_font().

◆ ui_point_right_png

IMG_BIN ui_point_right_png[]
extern

Referenced by msg_draw_choice_pointer().

◆ ui_point_right_pal

PAL_BIN ui_point_right_pal[]
extern

Referenced by msg_draw_choice_pointer().

◆ gMsgNumbers

MessageNumber gMsgNumbers[]

Definition at line 129 of file msg.c.

129 {
130#if VERSION_JP
131 {
132 .rasters = &MsgCharImgKana[0x4910],
133 .texSize = 112,
134 .texWidth = 16,
135 .texHeight = 14,
136 .digitWidth = {11, 8, 11, 11, 11, 11, 11, 11, 11, 11},
137 .fixedWidth = 11
138 }, {
139 .rasters = &MsgCharImgMenuKana[0x2EF8],
140 .texSize = 72,
141 .texWidth = 12,
142 .texHeight = 12,
143 .digitWidth = {9, 8, 9, 9, 9, 9, 9, 9, 9, 9},
144 .fixedWidth = 9
145 }
146#else
147 {
148 .rasters = &MsgCharImgNormal[0x800],
149 .texSize = 128,
150 .texWidth = 16,
151 .texHeight = 16,
152 .digitWidth = {11, 8, 11, 11, 11, 11, 11, 11, 11, 11},
153 .fixedWidth = 11
154 }, {
155 .rasters = &MsgCharImgNormal[0x800],
156 .texSize = 128,
157 .texWidth = 16,
158 .texHeight = 16,
159 .digitWidth = {9, 8, 9, 9, 9, 9, 9, 9, 9, 9},
160 .fixedWidth = 9
161 }
162#endif
163};

Referenced by draw_digit(), and draw_number().

◆ gMsgDlistInitDrawNumber

◆ gItemIconRasterOffsets

s32 gItemIconRasterOffsets[]
extern

◆ gItemIconPaletteOffsets

s32 gItemIconPaletteOffsets[]
extern

◆ MsgLetterRasterOffsets

IMG_PTR MsgLetterRasterOffsets[]
extern

Definition at line 878 of file msg_data.c.

878 {
891};
unsigned char charset_letter_content_3_OFFSET[]
unsigned char charset_letter_content_9_OFFSET[]
unsigned char charset_letter_content_8_OFFSET[]
unsigned char charset_letter_content_7_OFFSET[]
unsigned char charset_letter_content_4_OFFSET[]
unsigned char charset_letter_content_6_OFFSET[]
unsigned char charset_letter_content_11_OFFSET[]
unsigned char charset_letter_content_5_OFFSET[]
unsigned char charset_letter_content_10_OFFSET[]
unsigned char charset_letter_content_2_OFFSET[]
unsigned char charset_letter_content_1_OFFSET[]
unsigned char charset_letter_content_12_OFFSET[]

Referenced by msg_copy_to_print_buffer().

◆ MsgLetterPaletteOffsets

PAL_PTR MsgLetterPaletteOffsets[]
extern

Definition at line 893 of file msg_data.c.

893 {
906};
unsigned short charset_letter_content_2_pal_OFFSET[]
unsigned short charset_letter_content_12_pal_OFFSET[]
unsigned short charset_letter_content_5_pal_OFFSET[]
unsigned short charset_letter_content_10_pal_OFFSET[]
unsigned short charset_letter_content_4_pal_OFFSET[]
unsigned short charset_letter_content_11_pal_OFFSET[]
unsigned short charset_letter_content_7_pal_OFFSET[]
unsigned short charset_letter_content_1_pal_OFFSET[]
unsigned short charset_letter_content_6_pal_OFFSET[]
unsigned short charset_letter_content_3_pal_OFFSET[]
unsigned short charset_letter_content_8_pal_OFFSET[]
unsigned short charset_letter_content_9_pal_OFFSET[]

Referenced by msg_copy_to_print_buffer().

◆ MsgVoices

MsgVoice MsgVoices[]
extern

Definition at line 908 of file msg_data.c.

908 {
910 .voiceA = SOUND_MSG_VOICE_1A,
911 .voiceB = SOUND_MSG_VOICE_1B,
912 .pitchShift = 0
913 },
915 .voiceA = SOUND_MSG_VOICE_4A,
916 .voiceB = SOUND_MSG_VOICE_4B,
917 .pitchShift = -50
918 },
920 .voiceA = SOUND_MSG_VOICE_STAR,
921 .voiceB = SOUND_MSG_VOICE_STAR,
922 .pitchShift = 0
923 },
924};
@ MSG_VOICE_STAR
Definition enums.h:5810
@ MSG_VOICE_NORMAL
Definition enums.h:5808
@ MSG_VOICE_BOWSER
Definition enums.h:5809
@ SOUND_MSG_VOICE_4A
Definition enums.h:571
@ SOUND_MSG_VOICE_4B
Definition enums.h:572
@ SOUND_MSG_VOICE_STAR
Definition enums.h:575