393 lines
12 KiB
C
393 lines
12 KiB
C
/***************************************************************************************************
|
|
Ultra64 Mario Damege Gauge
|
|
|
|
Programed by Iwamoto Daiki
|
|
***************************************************************************************************/
|
|
#include "headers.h"
|
|
#include "include/iwa_select.h"
|
|
|
|
#define COINPOS 168
|
|
#define STARPOS 242
|
|
#define GAUGEY 209
|
|
|
|
#define TIMEPOSX 170
|
|
#define TIMEPOSY 185
|
|
|
|
#define degree(x) 182.04444 * (x)
|
|
|
|
/*----- Meter Struct -----*/
|
|
typedef struct {
|
|
char flag;
|
|
short posx;
|
|
short posy;
|
|
float size;
|
|
} MEter;
|
|
|
|
MEter meter = {0,140,166,1};
|
|
|
|
extern void iwa_LoadImatrix(void);
|
|
extern Gfx RCP_damegemeter_base[];
|
|
extern Gfx RCP_damegemeter_pow_on[];
|
|
extern Gfx RCP_damegemeter_pow_off[];
|
|
|
|
extern unsigned char MeterDataPtr[];
|
|
|
|
static short be_dameter;
|
|
static count = 0;
|
|
static unsigned short offt = 0;
|
|
static short len = 10;
|
|
|
|
/***************************************************************************************************
|
|
Copy 16 bit
|
|
****************************************************************************************************/
|
|
extern void Copy16BitTexture(unsigned int posx,unsigned int posy, unsigned short* tex)
|
|
{
|
|
|
|
gDPPipeSync(graphPtr++);
|
|
gDPSetTextureImage(graphPtr++,G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, tex);
|
|
gSPDisplayList(graphPtr++, RCP_tfont_main);
|
|
|
|
gSPTextureRectangle(graphPtr++,( posx << 2), (posy << 2), (posx+15 << 2), (posy+15 << 2), 0,
|
|
(0 << 5), (0 << 5), (4 << 10), (1 << 10) );
|
|
|
|
}
|
|
/***************************************************************************************************
|
|
Copy 88 (16bit)
|
|
****************************************************************************************************/
|
|
extern void Copy88Texture(unsigned int posx,unsigned int posy, unsigned short* tex)
|
|
{
|
|
|
|
gDPSetTile(graphPtr++, G_IM_FMT_RGBA,G_IM_SIZ_16b, 0, 0, 7, 0, 0,0,0, 0,0,0);
|
|
|
|
g_Tani_SetUpTileDescrip(graphPtr++, G_IM_FMT_RGBA,G_IM_SIZ_16b, 8, 8, 0, 0, G_TX_CLAMP|G_TX_NOMIRROR, 3, G_TX_NOLOD, G_TX_CLAMP|G_TX_NOMIRROR, 3, G_TX_NOLOD);
|
|
gDPPipeSync(graphPtr++);
|
|
g_Tani_LoadTextureImage2(graphPtr++, tex ,G_IM_FMT_RGBA , G_IM_SIZ_16b, 8, 8,0, 7);
|
|
|
|
gSPTextureRectangle(graphPtr++,( posx << 2), (posy << 2), (posx+7 << 2), (posy+7 << 2), 0,
|
|
(0 << 5), (0 << 5), (4 << 10), (1 << 10) );
|
|
|
|
|
|
}
|
|
/*==================================================================================================*/
|
|
/***************************************************************************************************
|
|
Load Texture Image
|
|
****************************************************************************************************/
|
|
static void LoadGaugeTexture(short txtchar)
|
|
{
|
|
unsigned short** texture = (unsigned short **)SegmentToVirtual(MeterDataPtr);
|
|
|
|
gDPPipeSync(graphPtr++);
|
|
g_Tani_LoadTextureImage2(graphPtr++,texture[txtchar-1], G_IM_FMT_RGBA, G_IM_SIZ_16b, 32, 32, 0, 7);
|
|
gSP1Triangle(graphPtr++, 0, 1, 2, 0);
|
|
gSP1Triangle(graphPtr++, 0, 2, 3, 0);
|
|
|
|
}
|
|
/***************************************************************************************************
|
|
Draw Damege Gage
|
|
****************************************************************************************************/
|
|
static void DrawDamegeGage(short mario_damege)
|
|
{
|
|
Mtx* matrix;
|
|
|
|
if ( (matrix = (Mtx *) AllocDynamic(sizeof(Mtx)) ) == NULL ) { rmonpf(("AllocDynamic error in message!!\n")); return;}
|
|
|
|
guTranslate(matrix,meter.posx,meter.posy,0);
|
|
gSPMatrix(graphPtr++,K0_TO_PHYS((u32) (matrix++)), G_MTX_MODELVIEW|G_MTX_MUL|G_MTX_PUSH);
|
|
|
|
gSPDisplayList(graphPtr++, RCP_damegemeter_base);
|
|
|
|
if (mario_damege != 0) {
|
|
gSPDisplayList(graphPtr++, RCP_damegemeter_pow_on);
|
|
LoadGaugeTexture(mario_damege);
|
|
gSPDisplayList(graphPtr++, RCP_damegemeter_pow_off);
|
|
}
|
|
|
|
gSPPopMatrix(graphPtr++,G_MTX_MODELVIEW);
|
|
|
|
}
|
|
/***************************************************************************************************
|
|
Gage Open
|
|
****************************************************************************************************/
|
|
static void GaugeOpen(void)
|
|
{
|
|
short flag = playerMeter.flags;
|
|
|
|
if ((flag & 0x8000) == 0) {
|
|
|
|
if (count == FRAMENUM*1.5) meter.flag = 2;
|
|
}
|
|
else count = 0;
|
|
}
|
|
/***************************************************************************************************
|
|
Gage Up
|
|
****************************************************************************************************/
|
|
static void GaugeUp(void)
|
|
{
|
|
short speed;
|
|
|
|
speed = 5;
|
|
if (meter.posy > 180) speed = 3;
|
|
if (meter.posy > 190) speed = 2;
|
|
if (meter.posy > 195) speed = 1;
|
|
|
|
meter.posy += speed;
|
|
|
|
if (meter.posy > 200) {
|
|
meter.posy = 200;
|
|
meter.flag = 4;
|
|
}
|
|
}
|
|
/***************************************************************************************************
|
|
Gage Close
|
|
****************************************************************************************************/
|
|
static void GaugeClose(void)
|
|
{
|
|
|
|
meter.posy += 20;
|
|
|
|
if (meter.posy > 300) {
|
|
meter.flag = 0;
|
|
count = 0;
|
|
}
|
|
|
|
|
|
}
|
|
/***************************************************************************************************
|
|
Damege Gauge Event
|
|
****************************************************************************************************/
|
|
static void DamegeStateCheck(short mario_damege)
|
|
{
|
|
|
|
if (mario_damege < 8 && be_dameter == 8 && meter.flag == 0) {
|
|
meter.flag = 1;
|
|
meter.posy = 166;
|
|
}
|
|
|
|
if (mario_damege == 8 && be_dameter == 7) count = 0;
|
|
if (mario_damege == 8 && count > FRAMENUM*1.5 ) meter.flag = 3;
|
|
|
|
be_dameter = mario_damege;
|
|
|
|
if (camPlayerInfo[0].status & PS_TYPE_SWIM) { //under water
|
|
if (meter.flag == 0 || meter.flag == 1) {
|
|
meter.flag = 2;
|
|
meter.posy = 166;
|
|
}
|
|
count = 0;
|
|
}
|
|
|
|
}
|
|
/***************************************************************************************************
|
|
Damege Gauge Event
|
|
****************************************************************************************************/
|
|
static void DamegeGaugeEvent(void)
|
|
{
|
|
short mario_damege = playerMeter.power;
|
|
|
|
|
|
if (meter.flag != 3) DamegeStateCheck(mario_damege);
|
|
|
|
if (meter.flag == 0) return;
|
|
|
|
|
|
switch (meter.flag) {
|
|
case 1: GaugeOpen(); break;
|
|
case 2: GaugeUp(); break;
|
|
case 3: GaugeClose(); break;
|
|
default: break;
|
|
|
|
}
|
|
|
|
|
|
DrawDamegeGage(mario_damege);
|
|
|
|
count ++;
|
|
}
|
|
|
|
|
|
/*==================================================================================================*/
|
|
|
|
/***************************************************************************************************
|
|
Player life
|
|
****************************************************************************************************/
|
|
static void PlayerLifeEvent(void)
|
|
{
|
|
|
|
dmprintf(22,GAUGEY,","); // player num
|
|
dmprintf(38,GAUGEY,"*");
|
|
dprintf(54,GAUGEY,"%d",playerMeter.life );
|
|
}
|
|
|
|
/***************************************************************************************************
|
|
Coin Number
|
|
****************************************************************************************************/
|
|
static void CoinNumBerEvent(void)
|
|
{
|
|
|
|
dmprintf(COINPOS ,GAUGEY,"+"); // coin num
|
|
dmprintf(COINPOS+16,GAUGEY,"*");
|
|
dprintf(COINPOS+30 ,GAUGEY,"%d",playerMeter.coin );
|
|
|
|
}
|
|
/***************************************************************************************************
|
|
Star Number
|
|
****************************************************************************************************/
|
|
static void StarNumBerEvent(void)
|
|
{
|
|
char st_flag = 0;
|
|
|
|
if (getStar_flag == 1 && (frameCounter & 0x000000008)) return;
|
|
|
|
if (playerMeter.star < 100) st_flag = 1;
|
|
|
|
dmprintf(STARPOS,GAUGEY,"-"); // star num
|
|
if (st_flag == 1) {dmprintf(STARPOS+16,GAUGEY,"*"); }
|
|
dprintf(STARPOS+16+14*st_flag,GAUGEY,"%d",playerMeter.star );
|
|
|
|
|
|
|
|
}
|
|
|
|
/***************************************************************************************************
|
|
Key Number
|
|
****************************************************************************************************/
|
|
static void KeyNumBerEvent(void)
|
|
{
|
|
short i;
|
|
|
|
for (i=0; i<playerMeter.key; i++) {
|
|
dmprintf(220+i*16,142,"/");
|
|
}
|
|
}
|
|
/***************************************************************************************************
|
|
TIMER Event
|
|
****************************************************************************************************/
|
|
static void TimerEvent(void)
|
|
{
|
|
unsigned short **texture = (unsigned short**)SegmentToVirtual(texDataPtr);
|
|
unsigned short time = playerMeter.timer;
|
|
unsigned short min;
|
|
unsigned short sec;
|
|
unsigned short dec;
|
|
#if CHINA
|
|
unsigned char str[] = {0xc0, 0x00}; // "TIME"
|
|
#endif
|
|
|
|
min = (unsigned short) (time/1800);
|
|
sec = (unsigned short) ((time - min*1800)/30);
|
|
dec = (unsigned short) ((time - min*1800 - sec*30))/3;
|
|
|
|
#if CHINA
|
|
dcprintf(TIMEPOSX ,TIMEPOSY, str);
|
|
#else
|
|
dmprintf(TIMEPOSX ,TIMEPOSY,"TIME");
|
|
#endif
|
|
dprintf(TIMEPOSX+59 ,TIMEPOSY,"%0d",(int)min);
|
|
dprintf(TIMEPOSX+79 ,TIMEPOSY,"%02d",(int)sec);
|
|
dprintf(TIMEPOSX+113 ,TIMEPOSY,"%d",(int)dec);
|
|
|
|
gSPDisplayList(graphPtr++, RCP_tfont_on);
|
|
Copy16BitTexture(TIMEPOSX+69 ,32, texture[0x38]);
|
|
Copy16BitTexture(TIMEPOSX+104,32, texture[0x39]);
|
|
gSPDisplayList(graphPtr++, RCP_tfont_off);
|
|
|
|
|
|
}
|
|
/*==================================================================================================*/
|
|
|
|
/*==================================================================================================*/
|
|
/* Camera Icon Event */
|
|
/*==================================================================================================*/
|
|
|
|
#define CAMERA_ICON 0
|
|
#define MARIO_ICON 1
|
|
#define JUGEM_ICON 2
|
|
#define STOP_ICON 3
|
|
#define UP_ICON 4
|
|
#define DOWN_ICON 5
|
|
|
|
static short camIconFlag = 0;
|
|
|
|
/***************************************************************************************************
|
|
Camera Icon Set
|
|
****************************************************************************************************/
|
|
extern void CameraIconSet(short flag)
|
|
{
|
|
camIconFlag = flag;
|
|
|
|
}
|
|
/***************************************************************************************************
|
|
Gauge Event
|
|
****************************************************************************************************/
|
|
extern void CameraIconEvent(void)
|
|
{
|
|
unsigned short **texture = (unsigned short**)SegmentToVirtual(camIconPtr);
|
|
unsigned int posix = 266;
|
|
unsigned int posiy = 205;
|
|
|
|
if (camIconFlag == 0) return;
|
|
|
|
gSPDisplayList(graphPtr++, RCP_tfont_on);
|
|
|
|
Copy16BitTexture(posix,posiy,texture[CAMERA_ICON]);
|
|
|
|
switch (camIconFlag & 0x0007) {
|
|
case CAMICON_MARIO: Copy16BitTexture(posix+16,posiy,texture[MARIO_ICON]);
|
|
break;
|
|
case CAMICON_JUGEM: Copy16BitTexture(posix+16,posiy,texture[JUGEM_ICON]);
|
|
break;
|
|
case CAMICON_STOP: Copy16BitTexture(posix+16,posiy,texture[STOP_ICON]);
|
|
break;
|
|
}
|
|
|
|
|
|
switch (camIconFlag & 0x0018) {
|
|
case CAMICON_LONG: Copy88Texture(posix+4,posiy+16,texture[DOWN_ICON]);
|
|
break;
|
|
case CAMICON_UP: Copy88Texture(posix+4,posiy-8,texture[UP_ICON]);
|
|
break;
|
|
}
|
|
|
|
gSPDisplayList(graphPtr++, RCP_tfont_off);
|
|
|
|
|
|
}
|
|
|
|
|
|
/*==================================================================================================*/
|
|
|
|
/***************************************************************************************************
|
|
Gauge Event
|
|
****************************************************************************************************/
|
|
extern void MeterGaugeEvent(void)
|
|
{
|
|
short flags = playerMeter.flags;
|
|
|
|
if (flags == 0) {
|
|
meter.flag = 0;
|
|
be_dameter = 8;
|
|
count = 0;
|
|
}
|
|
else {
|
|
MakeSelectProjection();
|
|
|
|
if (snSceneInfo != NULL && snSceneInfo->camera->mode == CAM_CANNON) {
|
|
CannonSightEvent();
|
|
}
|
|
|
|
if (flags & METER_LIFE) PlayerLifeEvent();
|
|
if (flags & METER_COIN) CoinNumBerEvent();
|
|
if (flags & METER_STAR) StarNumBerEvent();
|
|
if (flags & METER_KEY) KeyNumBerEvent();
|
|
if (flags & METER_POWER) {
|
|
DamegeGaugeEvent();
|
|
CameraIconEvent();
|
|
}
|
|
if (flags & METER_TIMER) TimerEvent();
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|