460 lines
9.0 KiB
C
460 lines
9.0 KiB
C
/* *************************************
|
|
* Includes
|
|
* *************************************/
|
|
#include "PSXSDKIntro.h"
|
|
#include "System.h"
|
|
#include "Gfx.h"
|
|
#include "Sfx.h"
|
|
|
|
/* *************************************
|
|
* Defines
|
|
* *************************************/
|
|
/* **************************************
|
|
* Structs and enums *
|
|
* *************************************/
|
|
enum
|
|
{
|
|
PSX_W = 48,
|
|
PSX_H = 32,
|
|
PSX_U = 30,
|
|
PSX_V = 0,
|
|
PSX_X = (X_SCREEN_RESOLUTION >> 1) - (PSX_W >> 1),
|
|
PSX_Y = (Y_SCREEN_RESOLUTION >> 1) - (PSX_H >> 1),
|
|
|
|
DISK_X = PSX_X + 11,
|
|
DISK_Y = PSX_Y + 2,
|
|
DISK_W = 27,
|
|
DISK_H = 27,
|
|
DISK_U = 2,
|
|
DISK_V = 2,
|
|
MAX_DISK_SPIN = 5,
|
|
|
|
READER_X = PSX_X + 9,
|
|
READER_Y = PSX_Y + 1,
|
|
|
|
CLOSED_READER_W = 30,
|
|
CLOSED_READER_H = 30,
|
|
CLOSED_READER_U = 0,
|
|
CLOSED_READER_V = 30,
|
|
|
|
OPEN_READER_W = CLOSED_READER_W,
|
|
OPEN_READER_H = 15,
|
|
OPEN_READER_U = 0,
|
|
OPEN_READER_V = (CLOSED_READER_H << 1) + 1,
|
|
|
|
TRANSPARENT_CLOSED_READER_W = CLOSED_READER_W,
|
|
TRANSPARENT_CLOSED_READER_H = CLOSED_READER_H,
|
|
TRANSPARENT_CLOSED_READER_U = CLOSED_READER_W,
|
|
TRANSPARENT_CLOSED_READER_V = PSX_H,
|
|
|
|
TRANSPARENT_OPEN_READER_W = OPEN_READER_W,
|
|
TRANSPARENT_OPEN_READER_H = OPEN_READER_H,
|
|
TRANSPARENT_OPEN_READER_U = OPEN_READER_W,
|
|
TRANSPARENT_OPEN_READER_V = TRANSPARENT_CLOSED_READER_V +
|
|
TRANSPARENT_CLOSED_READER_H
|
|
};
|
|
|
|
enum
|
|
{
|
|
CLOSE_SHELL_EV_TIM = 50,
|
|
DISK_SPIN_EV_TIM = 30,
|
|
TEXT_APPEAR_RANDOM_TIM = 100,
|
|
TEXT_APPEAR_STRING_TIM = 100,
|
|
INTRO_CLOSE_TIM = 100
|
|
};
|
|
|
|
enum
|
|
{
|
|
FONT_COLUMNS = 5,
|
|
FONT_SIZE_BITSHIFT = 4,
|
|
FONT_SIZE = 16,
|
|
FONT_TPAGE = 6,
|
|
FONT_U = 0,
|
|
FONT_V = 76,
|
|
FONT_X = 64,
|
|
FONT_Y = 144,
|
|
FONT_X2 = 88,
|
|
FONT_Y2 = 160
|
|
};
|
|
|
|
enum
|
|
{
|
|
BG_LUMINANCE_TARGET = NORMAL_LUMINANCE,
|
|
BG_LUMINANCE_STEP = 2,
|
|
};
|
|
|
|
enum
|
|
{
|
|
GPL_LOGO_LUMINANCE_STEP = 1,
|
|
GPL_LOGO_LUMINANCE_TARGET = NORMAL_LUMINANCE,
|
|
GPL_LOGO_X = 16,
|
|
GPL_LOGO_Y = 16
|
|
};
|
|
|
|
/* *************************************
|
|
* Local Prototypes
|
|
* *************************************/
|
|
static void PSXSDKIntroDrawConsole(void);
|
|
static void PSXSDKIntroRunTimers(void);
|
|
static void PSXSDKIntroDrawDisk(void);
|
|
static void PSXSDKIntroDrawTransCase(void);
|
|
static void PSXSDKIntroDrawChar(short x, short y, char ch);
|
|
|
|
/* *************************************
|
|
* Local variables
|
|
* *************************************/
|
|
// Events
|
|
static bool PSXSDKIntroCloseShellEvent;
|
|
static bool PSXSDKIntroCloseShellEventReminder;
|
|
static bool PSXSDKIntroSpinDiskEvent;
|
|
static bool PSXSDKIntroSpinDiskEventReminder;
|
|
static bool PSXSDKIntroRandTextEvent;
|
|
static bool PSXSDKIntroRandTextEventReminder;
|
|
static bool PSXSDKIntroStringEvent;
|
|
static bool PSXSDKIntroClose;
|
|
|
|
// Text
|
|
static const char* strPSXSDKIntro = {"MADE WITH PSXSDK"};
|
|
static const char* strPSXSDKIntroAuthor = {"BY NEXTVOLUME"};
|
|
|
|
/* *************************************
|
|
* Global variables
|
|
* *************************************/
|
|
GsSprite PsxDisk;
|
|
GsSprite PSXSDKIntroFont;
|
|
GsSprite GPL_Logo;
|
|
SsVag TrayClSnd;
|
|
SsVag SpinDiskSnd;
|
|
|
|
void PSXSDKIntroDrawChar(short x, short y, char ch)
|
|
{
|
|
PSXSDKIntroFont.w = FONT_SIZE;
|
|
PSXSDKIntroFont.h = FONT_SIZE;
|
|
PSXSDKIntroFont.tpage = FONT_TPAGE;
|
|
|
|
if ( (ch >= 'A') && (ch <= 'Z') )
|
|
{
|
|
ch -= 'A'; // Reset offset
|
|
|
|
PSXSDKIntroFont.x = x;
|
|
PSXSDKIntroFont.y = y;
|
|
|
|
PSXSDKIntroFont.u = FONT_U + ( (ch % FONT_COLUMNS) << FONT_SIZE_BITSHIFT);
|
|
PSXSDKIntroFont.v = FONT_V + ((short)(ch / FONT_COLUMNS) << FONT_SIZE_BITSHIFT);
|
|
|
|
GfxSortSprite(&PSXSDKIntroFont);
|
|
}
|
|
|
|
if (ch == ' ')
|
|
{
|
|
return;
|
|
}
|
|
}
|
|
|
|
void PSXSDKIntro(void)
|
|
{
|
|
int i;
|
|
|
|
PSXSDKIntroCloseShellEvent = false;
|
|
PSXSDKIntroCloseShellEventReminder = false;
|
|
PSXSDKIntroSpinDiskEvent = false;
|
|
PSXSDKIntroSpinDiskEventReminder = false;
|
|
PSXSDKIntroRandTextEvent = false;
|
|
PSXSDKIntroRandTextEventReminder = false;
|
|
PSXSDKIntroStringEvent = false;
|
|
PSXSDKIntroClose = false;
|
|
|
|
GfxSetGlobalLuminance(NORMAL_LUMINANCE);
|
|
|
|
while (1)
|
|
{
|
|
while (GfxIsGPUBusy());
|
|
|
|
if ( ( (GfxGetGlobalLuminance() - BG_LUMINANCE_STEP) > 0)
|
|
&&
|
|
(PSXSDKIntroClose) )
|
|
{
|
|
GfxIncreaseGlobalLuminance(-BG_LUMINANCE_STEP);
|
|
}
|
|
|
|
if ( (GfxGetGlobalLuminance() <= BG_LUMINANCE_STEP)
|
|
&&
|
|
(PSXSDKIntroClose) )
|
|
{
|
|
break;
|
|
}
|
|
|
|
GsSortCls(0,0,0);
|
|
|
|
for (i = 0; i < strlen(strPSXSDKIntro) ; i++)
|
|
{
|
|
if ( (PSXSDKIntroRandTextEvent)
|
|
&&
|
|
(PSXSDKIntroStringEvent == false) )
|
|
{
|
|
if (PSXSDKIntroRandTextEventReminder == false)
|
|
{
|
|
PSXSDKIntroRandTextEventReminder = true;
|
|
SfxPlaySound(&SpinDiskSnd);
|
|
}
|
|
|
|
PSXSDKIntroDrawChar(FONT_X + (i << FONT_SIZE_BITSHIFT),FONT_Y,SystemRand('A','Z'));
|
|
|
|
GPL_Logo.r = 0;
|
|
GPL_Logo.g = 0;
|
|
GPL_Logo.b = 0;
|
|
}
|
|
else if ( (PSXSDKIntroRandTextEvent)
|
|
&&
|
|
(PSXSDKIntroStringEvent) )
|
|
{
|
|
PSXSDKIntroDrawChar(FONT_X + (i << FONT_SIZE_BITSHIFT),FONT_Y,strPSXSDKIntro[i]);
|
|
|
|
if (System100msTick())
|
|
{
|
|
if (GPL_Logo.r < GPL_LOGO_LUMINANCE_TARGET)
|
|
{
|
|
GPL_Logo.r += GPL_LOGO_LUMINANCE_STEP;
|
|
GPL_Logo.g += GPL_LOGO_LUMINANCE_STEP;
|
|
GPL_Logo.b += GPL_LOGO_LUMINANCE_STEP;
|
|
}
|
|
|
|
GPL_Logo.x = GPL_LOGO_X;
|
|
GPL_Logo.y = GPL_LOGO_Y;
|
|
}
|
|
|
|
GfxSortSprite(&GPL_Logo);
|
|
}
|
|
}
|
|
|
|
for (i = 0; i < strlen(strPSXSDKIntroAuthor) ; i++)
|
|
{
|
|
if ( (PSXSDKIntroRandTextEvent)
|
|
&&
|
|
(PSXSDKIntroStringEvent == false) )
|
|
{
|
|
PSXSDKIntroDrawChar(FONT_X2 + (i << FONT_SIZE_BITSHIFT),FONT_Y2,SystemRand('A','Z'));
|
|
}
|
|
else if ( (PSXSDKIntroRandTextEvent)
|
|
&&
|
|
(PSXSDKIntroStringEvent) )
|
|
{
|
|
PSXSDKIntroDrawChar(FONT_X2 + (i << FONT_SIZE_BITSHIFT),FONT_Y2,strPSXSDKIntroAuthor[i]);
|
|
}
|
|
}
|
|
|
|
PSXSDKIntroDrawConsole();
|
|
|
|
PSXSDKIntroDrawDisk();
|
|
|
|
if (PSXSDKIntroCloseShellEvent)
|
|
{
|
|
if (PSXSDKIntroCloseShellEventReminder == false)
|
|
{
|
|
PSXSDKIntroCloseShellEventReminder = true;
|
|
|
|
SfxPlaySound(&TrayClSnd);
|
|
}
|
|
|
|
PsxDisk.x = READER_X;
|
|
PsxDisk.y = READER_Y;
|
|
|
|
PsxDisk.w = CLOSED_READER_W;
|
|
PsxDisk.h = CLOSED_READER_H;
|
|
|
|
PsxDisk.u = CLOSED_READER_U;
|
|
PsxDisk.v = CLOSED_READER_V;
|
|
|
|
GfxSortSprite(&PsxDisk);
|
|
}
|
|
else
|
|
{
|
|
PsxDisk.x = READER_X;
|
|
PsxDisk.y = READER_Y;
|
|
|
|
PsxDisk.w = OPEN_READER_W;
|
|
PsxDisk.h = OPEN_READER_H;
|
|
|
|
PsxDisk.u = OPEN_READER_U;
|
|
PsxDisk.v = OPEN_READER_V;
|
|
|
|
GfxSortSprite(&PsxDisk);
|
|
}
|
|
|
|
PSXSDKIntroDrawTransCase();
|
|
|
|
GfxDrawScene();
|
|
|
|
PSXSDKIntroRunTimers();
|
|
}
|
|
}
|
|
|
|
void PSXSDKIntroRunTimers(void)
|
|
{
|
|
static uint16_t intro_timer = 0;
|
|
|
|
intro_timer++;
|
|
|
|
if ( (intro_timer >= CLOSE_SHELL_EV_TIM)
|
|
&&
|
|
(PSXSDKIntroCloseShellEvent == false) )
|
|
{
|
|
PSXSDKIntroCloseShellEvent = true;
|
|
intro_timer = 0;
|
|
}
|
|
|
|
if ( (intro_timer >= DISK_SPIN_EV_TIM)
|
|
&&
|
|
(PSXSDKIntroCloseShellEvent)
|
|
&&
|
|
(PSXSDKIntroSpinDiskEvent == false) )
|
|
{
|
|
PSXSDKIntroSpinDiskEvent = true;
|
|
intro_timer = 0;
|
|
}
|
|
|
|
if ( (intro_timer >= TEXT_APPEAR_RANDOM_TIM)
|
|
&&
|
|
(PSXSDKIntroCloseShellEvent)
|
|
&&
|
|
(PSXSDKIntroSpinDiskEvent)
|
|
&&
|
|
(PSXSDKIntroRandTextEvent == false) )
|
|
{
|
|
PSXSDKIntroRandTextEvent = true;
|
|
intro_timer = 0;
|
|
}
|
|
|
|
if ( (intro_timer >= TEXT_APPEAR_STRING_TIM)
|
|
&&
|
|
(PSXSDKIntroCloseShellEvent)
|
|
&&
|
|
(PSXSDKIntroSpinDiskEvent)
|
|
&&
|
|
(PSXSDKIntroRandTextEvent)
|
|
&&
|
|
(PSXSDKIntroStringEvent == false) )
|
|
{
|
|
PSXSDKIntroStringEvent = true;
|
|
SfxPlayTrack(INTRO_TRACK);
|
|
intro_timer = 0;
|
|
}
|
|
|
|
if ( (intro_timer >= INTRO_CLOSE_TIM)
|
|
&&
|
|
(PSXSDKIntroCloseShellEvent)
|
|
&&
|
|
(PSXSDKIntroSpinDiskEvent)
|
|
&&
|
|
(PSXSDKIntroRandTextEvent)
|
|
&&
|
|
(PSXSDKIntroStringEvent) )
|
|
{
|
|
PSXSDKIntroClose = true;
|
|
intro_timer = 0;
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
void PSXSDKIntroDrawDisk(void)
|
|
{
|
|
static int spin_rotate = 0;
|
|
static int spin_speed = 0;
|
|
|
|
PsxDisk.x = DISK_X;
|
|
PsxDisk.y = DISK_Y;
|
|
|
|
PsxDisk.w = DISK_W;
|
|
PsxDisk.h = DISK_H;
|
|
|
|
PsxDisk.u = DISK_U;
|
|
PsxDisk.v = DISK_V;
|
|
|
|
if (PSXSDKIntroSpinDiskEvent)
|
|
{
|
|
if (PSXSDKIntroSpinDiskEventReminder == false)
|
|
{
|
|
PSXSDKIntroSpinDiskEventReminder = true;
|
|
|
|
//SfxPlaySound(&SpinDiskSnd);
|
|
}
|
|
|
|
if (spin_speed < MAX_DISK_SPIN)
|
|
{
|
|
spin_speed++;
|
|
}
|
|
|
|
if (spin_rotate < GfxRotateFromDegrees(360) )
|
|
{
|
|
spin_rotate += GfxRotateFromDegrees(spin_speed++);
|
|
}
|
|
else
|
|
{
|
|
spin_rotate = SystemRand(0,GfxRotateFromDegrees(360));
|
|
}
|
|
|
|
PsxDisk.rotate = spin_rotate;
|
|
PsxDisk.mx = DISK_W >> 1;
|
|
PsxDisk.my = DISK_H >> 1;
|
|
}
|
|
|
|
GfxSortSprite(&PsxDisk);
|
|
|
|
PsxDisk.rotate = 0;
|
|
}
|
|
|
|
void PSXSDKIntroDrawTransCase(void)
|
|
{
|
|
/*if (PSXSDKIntroCloseShellEvent == false)
|
|
{
|
|
PsxDisk.x = READER_X;
|
|
PsxDisk.y = READER_Y;
|
|
|
|
PsxDisk.w = TRANSPARENT_OPEN_READER_W;
|
|
PsxDisk.h = TRANSPARENT_OPEN_READER_H;
|
|
|
|
PsxDisk.u = TRANSPARENT_OPEN_READER_U;
|
|
PsxDisk.v = TRANSPARENT_OPEN_READER_V;
|
|
|
|
PsxDisk.attribute |= ENABLE_TRANS | TRANS_MODE(0);
|
|
|
|
GfxSortSprite(&PsxDisk);
|
|
|
|
PsxDisk.attribute &= ~(ENABLE_TRANS | TRANS_MODE(0) );
|
|
}
|
|
else
|
|
{
|
|
PsxDisk.x = READER_X;
|
|
PsxDisk.y = READER_Y;
|
|
|
|
PsxDisk.w = TRANSPARENT_CLOSED_READER_W;
|
|
PsxDisk.h = TRANSPARENT_CLOSED_READER_H;
|
|
|
|
PsxDisk.u = TRANSPARENT_CLOSED_READER_U;
|
|
PsxDisk.v = TRANSPARENT_CLOSED_READER_V;
|
|
|
|
PsxDisk.attribute |= ENABLE_TRANS | TRANS_MODE(0);
|
|
|
|
GfxSortSprite(&PsxDisk);
|
|
|
|
PsxDisk.attribute &= ~(ENABLE_TRANS | TRANS_MODE(0) );
|
|
}*/
|
|
|
|
}
|
|
|
|
void PSXSDKIntroDrawConsole(void)
|
|
{
|
|
PsxDisk.x = PSX_X;
|
|
PsxDisk.y = PSX_Y;
|
|
|
|
PsxDisk.w = PSX_W;
|
|
PsxDisk.h = PSX_H;
|
|
|
|
PsxDisk.u = PSX_U;
|
|
PsxDisk.v = PSX_V;
|
|
|
|
GfxSortSprite(&PsxDisk);
|
|
}
|