Paper Mario DX
Paper Mario (N64) modding
 
Loading...
Searching...
No Matches
state_title_screen.c
Go to the documentation of this file.
1#include "common.h"
2#include "nu/nusys.h"
3#include "hud_element.h"
4#include "sprite.h"
5#include "game_modes.h"
6#include "fio.h"
7#include "dx/config.h"
8#include "dx/versioning.h"
9
10#if VERSION_JP
11#define TITLE_WIDTH 272
12#define TITLE_TILE_HEIGHT 2
13#define TITLE_HEIGHT 88
14#define TITLE_POS_LEFT 25
15#define TITLE_POS_TOP 34
16#define FILENAME_ERROR "\x54\x77\xA2\xF7\xF7\xf7\xf7\xf7"
17#else
18// Properties of the title screen Paper Mario logo
19#define TITLE_WIDTH 200 // Width of the texture
20#define TITLE_HEIGHT 112 // Height of the texture
21#define TITLE_TILE_HEIGHT 2 // Height of an individually loaded tile in the texture
22#define TITLE_POS_LEFT ((SCREEN_WIDTH - TITLE_WIDTH) / 2) // Left edge of the texture on screen
23#define TITLE_POS_TOP 15 // Top edge of the texture on screen (with no offset)
24#define FILENAME_ERROR "ERROR\xf7\xf7\xf7"
25#endif
26
27#define TITLE_NUM_TILES (TITLE_HEIGHT / TITLE_TILE_HEIGHT) // Number of tiles in the texture
28#define TITLE_TILE_PIXELS (TITLE_WIDTH * TITLE_TILE_HEIGHT) // Number of pixels in a single tile of the texture
29
39
40enum {
44 NEXT_STATE_NONE = 0, // used only for the initial value
45};
46
48
50 { .filename = { FILENAME_ERROR } },
51 { .filename = { FILENAME_ERROR } },
52 { .filename = { FILENAME_ERROR } },
53 { .filename = { FILENAME_ERROR } },
54};
55
57 { .hasData = true },
58 { .hasData = true },
59 { .hasData = true },
60 { .hasData = true },
61};
62
63s32 PressStart_Alpha = 0; // the opacity of "PRESS START" text
64b32 PressStart_IsVisible = false; // toggles the visibility of "PRESS START"
65s32 PressStart_BlinkCounter = 0; // counts to 16, then toggles PressStart_IsVisible
66
67// controls whether the intro story or the demo will player after TITLE_STATE_HOLD is done
68// since this state is reached for the first time after the intro has already played once or was skipped,
69// this is initially false and the demo is will play first.
71
72Lights1 D_80077A38 = gdSPDefLights1(255, 255, 255, 0, 0, 0, 0, 0, 0);
73
94
95typedef struct TitleDataStruct {
96 /* 0x0 */ s32 logo;
97 /* 0x4 */ s32 copyright;
98 /* 0x8 */ s32 pressStart;
100} TitleDataStruct; // size = 0x10
101
102#if VERSION_JP
103#define COPYRIGHT_WIDTH 128
104#else
105#define COPYRIGHT_WIDTH 144
106#endif
107
115
116void appendGfx_title_screen(void);
121
124 void* titleDataDst;
125 void* titleData;
126
127 gOverrideFlags = 0;
141
145#if VERSION_JP
147#endif
148
154 gCameras[CAM_DEFAULT].vfov = 25.0f;
155 set_cam_viewport(CAM_DEFAULT, 12, 28, 296, 184);
156
157 gCameras[CAM_DEFAULT].params.basic.skipRecalc = false;
158 gCameras[CAM_DEFAULT].params.basic.pitch = 0;
159 gCameras[CAM_DEFAULT].params.basic.dist = 40;
160 gCameras[CAM_DEFAULT].params.basic.fovScale = 100;
161
163 gCameras[CAM_DEFAULT].lookAt_eye.y = 1000.0f;
164 gCameras[CAM_DEFAULT].lookAt_eye.z = 1500.0f;
165
169
173
175
180
187 clear_npcs();
190 clear_entity_data(true);
196 load_map_bg("title_bg");
198 bgm_set_song(0, SONG_MAIN_THEME, 0, 500, 8);
200}
201
203 u32 pressedButtons = gGameStatusPtr->pressedButtons[0];
204
205 set_curtain_scale(1.0f);
206 set_curtain_fade(0.0f);
207
208 if (TitleScreen_TimeLeft > 0) {
210 }
211
212 switch (gGameStatusPtr->startupState) {
213 case TITLE_STATE_INIT:
219 break;
221 if (TitleScreen_AppearDelay != 0) {
223 break;
224 }
227 }
229 if (startup_fade_screen_in(6) != 0) {
232 }
233 }
235 break;
236 case TITLE_STATE_HOLD:
237
238 #if DX_SKIP_DEMO && DX_SKIP_STORY
239 // play neither demo nor story
241 #elif DX_SKIP_DEMO
242 // only the story may play
243 if (TitleScreen_TimeLeft == 120) {
244 bgm_set_song(0, -1, 0, 3900, 8);
245 }
246 if (TitleScreen_TimeLeft == 0) {
249 return;
250 }
251 #elif DX_SKIP_STORY
252 // only the demo may play
253 if (TitleScreen_TimeLeft == 0) {
256 return;
257 }
258 #else
259 // allow either demo or story to play
260 if (PlayIntroNext && TitleScreen_TimeLeft == 120) {
261 bgm_set_song(0, -1, 0, 3900, 8);
262 }
263 if (TitleScreen_TimeLeft == 0) {
265 if (!PlayIntroNext) {
267 } else {
269 }
270 PlayIntroNext ^= 1;
271 return;
272 }
273 #endif
274 if (pressedButtons & (BUTTON_A | BUTTON_START)) {
278 bgm_set_song(0, SONG_FILE_SELECT, 0, 500, 8);
279 return;
280 }
281 break;
287 } else {
289 }
291 break;
296 }
297 if (startup_fade_screen_out(10) != 0) {
302 }
303 }
310 } else {
312 }
313 } else {
317 }
318 break;
319 case TITLE_STATE_EXIT:
322 break;
323 }
329 clear_npcs();
332 clear_entity_data(true);
337
338 switch (TitleScreenNextState) {
339 case NEXT_STATE_INTRO:
342 break;
343 case NEXT_STATE_DEMO:
345 break;
348 gGameStatusPtr->mapID = 0xB; //TODO hardcoded map IDs
351 break;
352 }
353 return;
354 }
355
357 update_npcs();
359 }
360}
361
363 switch (gGameStatusPtr->startupState) {
364 case TITLE_STATE_INIT:
366 PressStart_IsVisible = false;
368 break;
369 case TITLE_STATE_HOLD:
372 }
374 break;
378 break;
379 }
380}
381
383 f32 alpha;
384
385 switch (gGameStatusPtr->startupState) {
386 case TITLE_STATE_INIT:
388 break;
392 alpha = SQ(alpha);
393 title_screen_draw_images(alpha, alpha);
394 break;
395 case TITLE_STATE_HOLD:
396 title_screen_draw_images(0.0f, 0.0f);
397 break;
399 title_screen_draw_images(0.0f, 0.0f);
400 break;
404 alpha = SQ(alpha);
405 title_screen_draw_images(alpha, alpha);
406 break;
407 }
408
418
428 render_frame(false);
429 render_frame(true);
430}
431
436
438 s32 yOffset;
439 s32 i;
440
443 yOffset = -100 * moveAlpha;
444
445 for (i = 0; i < TITLE_NUM_TILES; i++) {
446 // Load a tile from the logo texture
448 TITLE_WIDTH, TITLE_TILE_HEIGHT, // width, height
449 0, 0, (TITLE_WIDTH - 1), (TITLE_TILE_HEIGHT - 1), // uls, ult, lrs, lrt
450 0, // pal
452 G_TX_NOMASK, G_TX_NOMASK, // masks, maskt
453 G_TX_NOLOD, G_TX_NOLOD); // shifts, shiftt
454 // Draw a scissored texture rectangle with the loaded tile
456 (TITLE_POS_LEFT) << 2, // ulx
457 (TITLE_POS_TOP + TITLE_TILE_HEIGHT * i + yOffset) << 2, // uly
458 (TITLE_POS_LEFT + TITLE_WIDTH) << 2, // lrx
459 (TITLE_POS_TOP + TITLE_TILE_HEIGHT + TITLE_TILE_HEIGHT * i + yOffset) << 2, // lry
460 G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10);
461 }
462
464}
465
466#if VERSION_IQUE
467#define VAR_1 20
468#define VAR_2 628
469#else
470#define VAR_1 32
471#define VAR_2 676
472#endif
473
511
512#if VERSION_IQUE
513#define RECT_SIZE 0x28
514#define YL_BASE 724
515#define YH_BASE 764
516#define COPYRIGHT_TEX_CHUNKS 4
517#define COPYRIGHT_IMG(k, i) &TitleScreen_ImgList_Copyright[k]
518#define LTT_LRT 9
519#else
520#define RECT_SIZE 0x40
521#define YL_BASE 764
522#define YH_BASE 828
523#define COPYRIGHT_TEX_CHUNKS 2
524#define COPYRIGHT_IMG(k, i) &TitleScreen_ImgList_Copyright[16 * i]
525#define LTT_LRT 15
526#endif
527
529 s32 alpha;
530 s32 i;
531
533#if VERSION_JP
535#endif
537
538 alpha = 255.0f - (moveAlpha * 255.0f);
539 if (alpha < 255) {
540 if (alpha < 0) {
541 alpha = 0;
542 }
544 gDPSetPrimColor(gMainGfxPos++, 0, 0, 0, 0, 0, alpha);
545 }
546
547#if VERSION_JP
550 COPYRIGHT_WIDTH, 0, 0, 0, 127, 31, 0,
552 G_TX_NOLOD);
554 0, 0, 0x0400, 0x0400);
555#else
556 for (i = 0; i < COPYRIGHT_TEX_CHUNKS; i++) {
557 alpha = 0; // TODO figure out why this is needed
558
560 COPYRIGHT_WIDTH, 32, 0, 0, 143, LTT_LRT, 0,
562 G_TX_NOLOD);
564 G_TX_RENDERTILE, 0, 0, 0x0400, 0x0400);
565 }
566#endif
568}
BSS s32 PopupMenu_SelectedIndex
s32 bgm_set_song(s32 playerIndex, s32 songID, s32 variation, s32 fadeOutTime, s16 volume)
u16 * nuGfxCfb_ptr
Definition cam_main.c:13
u32 pressedButtons[4]
s32 b32
@ BUTTON_A
Definition enums.h:2776
@ BUTTON_START
Definition enums.h:2773
@ CAMERA_FLAG_DISABLED
Definition enums.h:4306
@ SONG_FILE_SELECT
Definition enums.h:387
@ SONG_MAIN_THEME
Definition enums.h:388
@ CAM_UPDATE_NO_INTERP
Definition enums.h:4346
@ INTRO_PART_NONE
Definition enums.h:3589
@ INTRO_PART_0
Definition enums.h:3585
@ AREA_KMR
Definition enums.h:2994
@ TIME_FREEZE_NONE
Definition enums.h:3498
@ CONTEXT_WORLD
Definition enums.h:3562
@ SOUND_FILE_MENU_IN
Definition enums.h:713
@ PLAYER_SPRITES_MARIO_WORLD
Definition enums.h:5931
@ GLOBAL_OVERRIDES_DISABLE_RENDER_WORLD
Definition enums.h:3906
@ GLOBAL_OVERRIDES_DISABLE_DRAW_FRAME
Definition enums.h:3907
@ CAM_TATTLE
Definition enums.h:1828
@ CAM_DEFAULT
Definition enums.h:1826
@ CAM_HUD
Definition enums.h:1829
@ CAM_BATTLE
Definition enums.h:1827
void clear_script_list(void)
void create_cameras(void)
Definition cam_main.c:254
void clear_animator_list(void)
Definition animator.c:222
void clear_render_tasks(void)
Definition model.c:4530
void * load_asset_by_name(const char *assetName, u32 *decompressedSize)
Definition world.c:251
void set_curtain_fade(f32 fade)
Definition curtains.c:302
void set_background(BackgroundHeader *)
Definition background.c:40
b32 startup_fade_screen_in(s16 subtractAlpha)
void clear_entity_data(b32)
Definition entity.c:787
void startup_fade_screen_update(void)
void load_map_bg(char *optAssetName)
Definition background.c:14
void clear_printers(void)
Definition msg.c:196
void update_cameras(void)
Definition cam_main.c:18
void clear_effect_data(void)
Definition effects.c:39
HeapNode * general_heap_create(void)
Definition heap.c:6
void clear_worker_list(void)
Definition worker.c:10
void set_curtain_scale(f32 scale)
Definition curtains.c:289
void clear_windows(void)
Definition windows.c:135
s32 general_heap_free(void *data)
Definition heap.c:18
void startup_set_fade_screen_color(s16 color)
void clear_player_data(void)
Definition inventory.c:54
void decode_yay0(void *src, void *dst)
void render_frame(s32 flag)
Definition cam_main.c:90
b32 startup_fade_screen_out(s16 addAlpha)
void clear_entity_models(void)
void reset_background_settings(void)
Definition background.c:33
void * heap_malloc(s32 size)
Definition heap.c:34
void set_cam_viewport(s16 id, s16 x, s16 y, s16 width, s16 height)
Definition cam_main.c:372
void set_game_mode_render_frontUI(void(*fn)(void))
Definition game_modes.c:154
void set_game_mode(s32 modeID)
Definition game_modes.c:127
@ GAME_MODE_DEMO
Definition game_modes.h:22
@ GAME_MODE_FILE_SELECT
Definition game_modes.h:19
@ GAME_MODE_INTRO
Definition game_modes.h:21
void hud_element_clear_cache(void)
void clear_npcs(void)
Definition npc.c:59
void update_npcs(void)
Updates all NPCs.
Definition npc.c:616
void sfx_set_reverb_mode(s32 arg0)
void sfx_play_sound(s32 soundID)
#define CAM_NEAR_CLIP
Definition macros.h:128
#define SCREEN_WIDTH
Definition macros.h:108
#define BSS
Definition macros.h:6
#define CAM_FAR_CLIP
Definition macros.h:129
#define SCREEN_HEIGHT
Definition macros.h:109
#define SQ(x)
Definition macros.h:177
#define PM_CC_02
Definition macros.h:288
void spr_init_sprites(s32 playerSpriteSet)
Definition sprite.c:765
b32 PressStart_IsVisible
s16 TitleScreenNextState
#define YL_BASE
void appendGfx_title_screen(void)
#define TITLE_POS_TOP
#define COPYRIGHT_WIDTH
BSS s32 * TitleScreen_ImgList_CopyrightPalette
s32 PressStart_BlinkCounter
s32 PressStart_Alpha
#define YH_BASE
#define FILENAME_ERROR
void state_drawUI_title_screen(void)
void state_step_title_screen(void)
Gfx TitleSetupGfx[]
void title_screen_draw_images(f32, f32)
SaveFileSummary gSaveSlotSummary[4]
BSS s32 * TitleScreen_ImgList_PressStart
#define TITLE_POS_LEFT
void title_screen_draw_copyright(f32)
#define COPYRIGHT_TEX_CHUNKS
SaveSlotMetadata gSaveSlotMetadata[4]
#define TITLE_TILE_PIXELS
BSS TitleDataStruct * TitleScreen_ImgList
#define TITLE_NUM_TILES
#define VAR_1
#define TITLE_WIDTH
#define LTT_LRT
BSS u8(* TitleScreen_ImgList_Copyright)[144]
BSS s16 TitleScreen_TimeLeft
s32 PlayIntroNext
#define RECT_SIZE
void title_screen_draw_logo(f32)
#define COPYRIGHT_IMG(k, i)
void state_init_title_screen(void)
#define VAR_2
BSS s32 * TitleScreen_ImgList_Logo
void title_screen_draw_press_start(void)
Lights1 D_80077A38
BSS s16 TitleScreen_AppearDelay
TitleScreenStates
@ TITLE_STATE_EXIT
@ TITLE_STATE_INIT
@ TITLE_STATE_HOLD
@ TITLE_STATE_UNUSED
@ TITLE_STATE_DISMISS
@ TITLE_STATE_BEGIN_DISMISS
@ TITLE_STATE_APPEAR
#define TITLE_TILE_HEIGHT
@ NEXT_STATE_INTRO
@ NEXT_STATE_DEMO
@ NEXT_STATE_FILE_SELECT
@ NEXT_STATE_NONE
s16 bgColor[3]
Vec3f lookAt_obj_target
union Camera::@17 params
Vec3f lookAt_eye
s32 gOverrideFlags
Definition main_loop.c:10
BackgroundHeader gBackgroundImage
GameStatus * gGameStatusPtr
Definition main_loop.c:31
Camera gCameras[4]
Definition cam_main.c:16
Gfx * gMainGfxPos
Definition cam_main.c:14
s32 gCurrentCameraID
Definition cam_math.c:5
s32 gTimeFreezeMode
Definition main_loop.c:11