sm64/gauge.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();
}
}