378 lines
11 KiB
C
378 lines
11 KiB
C
/***************************************************************************************************
|
|
Ultra 64 MARIO Brothers
|
|
|
|
star select module
|
|
|
|
Copyright 1996 Nintendo co., ltd. All rights reserved
|
|
|
|
This module was programmed by Iwamoto Daiki
|
|
|
|
Junuary 19, 1996
|
|
***************************************************************************************************/
|
|
#include "headers.h"
|
|
#include "include/iwa_select.h"
|
|
|
|
#define state_flag stw_work0
|
|
#define counter stw_work1
|
|
#define str_scale stw_work5
|
|
#define STARMAX 6
|
|
|
|
static StrategyRecord* CourseStar[8];
|
|
|
|
static char goTogame;
|
|
|
|
|
|
static unsigned char get_starNum;
|
|
static char star_num;
|
|
static unsigned char next_level;
|
|
|
|
extern Gfx RCP_selectpict[];
|
|
extern unsigned long e_select_polystar[];
|
|
|
|
static char cursor = 0;
|
|
static char cursor_flag = 0;
|
|
static int select_counter = 0;
|
|
|
|
/*================================================================================================*/
|
|
/*================================================================================================*/
|
|
|
|
/**************************************************************************************************/
|
|
/* Select Star Strategy Polygon. */
|
|
/**************************************************************************************************/
|
|
extern void s_select_polystar(void)
|
|
{
|
|
|
|
switch (execstp->s[state_flag].d) {
|
|
case 0: execstp->s[str_scale].f -= 0.1;
|
|
if (execstp->s[str_scale].f <1.0 ) execstp->s[str_scale].f = 1.0;
|
|
execstp->s[stw_animeangleY].d = 0;
|
|
break;
|
|
|
|
case 1: execstp->s[str_scale].f += 0.1;
|
|
if (execstp->s[str_scale].f > 1.3) execstp->s[str_scale].f = 1.3;
|
|
execstp->s[stw_animeangleY].d += 0x800;
|
|
break;
|
|
|
|
case 2: execstp->s[stw_animeangleY].d += 0x800;
|
|
break;
|
|
}
|
|
|
|
s_set_scale(execstp->s[str_scale].f);
|
|
execstp->s[counter].d++;
|
|
|
|
|
|
}
|
|
|
|
/**************************************************************************************************/
|
|
/* Select Star Main Init. */
|
|
/**************************************************************************************************/
|
|
static void HiscoreStarSet(unsigned char get_starFlag)
|
|
{
|
|
|
|
if (get_starFlag & (0x01 << 6)) {
|
|
CourseStar[6] = s_makeobj_absolute(execstp,0,S_polystar,e_select_polystar, 370, 24,-300,0,0,0);
|
|
CourseStar[6]->s[str_scale].f = 0.8;
|
|
CourseStar[6]->s[state_flag].d = 2;
|
|
}
|
|
}
|
|
/**************************************************************************************************/
|
|
/* Select Star Main Init. */
|
|
/**************************************************************************************************/
|
|
extern void s_CoStarmain_init(void)
|
|
{
|
|
short i=0;
|
|
int shapeNo[10];
|
|
unsigned char get_starFlag = BuGetStarFlag(activePlayerNo-1,activeCourseNo-1);
|
|
|
|
star_num = 0;
|
|
|
|
while (i != get_starNum) {
|
|
if (get_starFlag & (0x01 << star_num) ) {
|
|
shapeNo[star_num] = S_polystar;
|
|
i++;
|
|
}
|
|
else {
|
|
shapeNo[star_num] = S_shadestar;
|
|
if (next_level == 0) {
|
|
next_level = star_num+1;
|
|
cursor_flag = star_num;
|
|
}
|
|
}
|
|
star_num++;
|
|
}
|
|
|
|
if (star_num == get_starNum && star_num != STARMAX) {
|
|
shapeNo[star_num] = S_shadestar;
|
|
next_level = star_num+1;
|
|
cursor_flag = star_num;
|
|
star_num++;
|
|
}
|
|
|
|
if ( get_starNum == STARMAX) next_level = star_num;
|
|
if ( get_starNum == 0) next_level = 1;
|
|
|
|
for (i=0; i< star_num; i++) {
|
|
CourseStar[i] = s_makeobj_absolute(execstp,0,shapeNo[i],e_select_polystar,(-75)*(star_num-1) + 152*i, 248, -300, 0,0,0);
|
|
CourseStar[i]->s[str_scale].f = 1.0;
|
|
}
|
|
|
|
|
|
HiscoreStarSet(get_starFlag);
|
|
|
|
|
|
}
|
|
/**************************************************************************************************/
|
|
/* Select Star Main Init. */
|
|
/**************************************************************************************************/
|
|
extern void s_CoStar_main(void)
|
|
{
|
|
char i;
|
|
unsigned char flag;
|
|
unsigned char get_starFlag = BuGetStarFlag(activePlayerNo-1,activeCourseNo-1);
|
|
|
|
|
|
if (get_starNum != STARMAX) {
|
|
|
|
cursor = 0;
|
|
ContCursorEvent(2,&cursor_flag,0,(get_starNum+1)-1);
|
|
|
|
flag = cursor_flag;
|
|
for (i=0; i<star_num; i++) {
|
|
if (get_starFlag & (0x01 << i) || i == (next_level-1) ) {
|
|
if (flag == 0) {
|
|
cursor = i;
|
|
break;
|
|
}
|
|
flag--;
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
|
|
ContCursorEvent(2,&cursor_flag,0,(star_num)-1);
|
|
|
|
cursor = cursor_flag;
|
|
}
|
|
//rmonpf(("flag %d\n",cursor_flag));
|
|
//rmonpf(("cursor %d\n",cursor));
|
|
|
|
|
|
|
|
for (i=0; i<star_num; i++) {
|
|
if (cursor == i) CourseStar[i]->s[state_flag].d = 1;
|
|
else CourseStar[i]->s[state_flag].d = 0;
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*================================================================================================*/
|
|
/* Star Select Message */
|
|
/*================================================================================================*/
|
|
/********************************************************************************/
|
|
/* Star Select Picture. */
|
|
/********************************************************************************/
|
|
static void DrawCoursePicture(void)
|
|
{
|
|
unsigned char Number[8];
|
|
|
|
iTranslate(1,158,81,0);
|
|
gSPDisplayList(graphPtr++, RCP_selectpict);
|
|
gSPPopMatrix(graphPtr++,G_MTX_MODELVIEW);
|
|
|
|
gSPDisplayList(graphPtr++, RCP_tfont2_on);
|
|
gDPSetEnvColor(graphPtr++,255,255,255,255);
|
|
#if CHINA
|
|
I_itochar_16((activeCourseNo-1)+1,Number);
|
|
#else
|
|
I_itochar((activeCourseNo-1)+1,Number);
|
|
#endif
|
|
|
|
if (activeCourseNo< 10){ Draw16bitFont(2,152,158, Number); }
|
|
else { Draw16bitFont(2,143,158, Number); }
|
|
|
|
gSPDisplayList(graphPtr++, RCP_tfont2_off);
|
|
|
|
}
|
|
/********************************************************************************/
|
|
/* Star Select message. */
|
|
/********************************************************************************/
|
|
|
|
static void StarSelectScene(void)
|
|
{
|
|
#if ENGLISH
|
|
unsigned char se8_hiscore[]= {f8_M, f8_Y, f8_S, f8_C, f8_O, f8_R, f8_E, 0xff,}; //maiscore
|
|
#elif CHINA
|
|
unsigned char se8_hiscore[]= {0x1, 0x0, 0x1, 0x1, 0x1, 0x2, 0x1, 0x3, 0xff, 0xff,}; //maiscore
|
|
#else
|
|
unsigned char se8_hiscore[]= {0x8e, 0x71, 0x7c, 0x79, 0x70, 0xff,}; //maiscore
|
|
#endif
|
|
unsigned char se88_num[]= {0x00, 0xff,};
|
|
unsigned char **crs = (unsigned char**)(SegmentToVirtual(crsNamePtr));
|
|
unsigned char *crsname = (unsigned char* )(SegmentToVirtual(crs[activeCourseNo-1]));
|
|
unsigned char **starnamep = (unsigned char**)(SegmentToVirtual(starnamePtr));
|
|
unsigned char *starname;
|
|
|
|
short ce_posx,ce_posx2;
|
|
char i;
|
|
|
|
MakeSelectProjection();
|
|
|
|
/*------------- Draw 16 Bit ----------------------------------*/
|
|
|
|
gSPDisplayList(graphPtr++, RCP_tfont2_on);
|
|
gDPSetEnvColor(graphPtr++,255,255,255,255);
|
|
DrawMyScore(activePlayerNo-1,activeCourseNo-1, 155, 106);
|
|
gSPDisplayList(graphPtr++, RCP_tfont2_off);
|
|
|
|
/*------------- Draw 8 Bit ----------------------------------*/
|
|
|
|
gSPDisplayList(graphPtr++, RCP_mess_font_on);
|
|
gDPSetEnvColor(graphPtr++,0,0,0,255);
|
|
|
|
if (BuGetNumCoins(activePlayerNo-1,activeCourseNo-1) != 0)
|
|
#if CHINA
|
|
Draw8bitFont(89,118,se8_hiscore);
|
|
#else
|
|
Draw8bitFont(102,118,se8_hiscore);
|
|
#endif
|
|
|
|
#if CHINA
|
|
ce_posx = CharCentering(160,(crsname+6),16.);
|
|
Draw8bitFont(ce_posx,30,(crsname+6));
|
|
#else
|
|
ce_posx = CharCentering(160,(crsname+3),10.);
|
|
Draw8bitFont(ce_posx,33,(crsname+3));
|
|
#endif
|
|
|
|
gSPDisplayList(graphPtr++, RCP_mess_font_off);
|
|
|
|
|
|
/*------------- Draw Picture ----------------------------------*/
|
|
DrawCoursePicture();
|
|
|
|
/*------------- Draw 88 Bit ----------------------------------*/
|
|
|
|
#if CHINA
|
|
gSPDisplayList(graphPtr++, RCP_mess_font_on);
|
|
gDPSetEnvColor(graphPtr++,0,0,0,255);
|
|
if (star_num != 0) {
|
|
starname = (unsigned char*)(SegmentToVirtual(starnamep[(activeCourseNo-1)*6
|
|
+cursor]));
|
|
ce_posx2 = CharCentering(163,starname,16.);
|
|
Draw8bitFont(ce_posx2,141,starname );
|
|
}
|
|
gSPDisplayList(graphPtr++, RCP_mess_font_off);
|
|
|
|
gSPDisplayList(graphPtr++, RCP_s88font_on);
|
|
gDPSetEnvColor(graphPtr++,0,0,0,255);
|
|
for (i=1; i<=star_num; i++) {
|
|
se88_num[0] = i;
|
|
DrawS88Font((156-17*(star_num-1)) + 34*(i-1),38 ,se88_num);
|
|
}
|
|
gSPDisplayList(graphPtr++, RCP_s88font_off);
|
|
#else
|
|
gSPDisplayList(graphPtr++, RCP_s88font_on);
|
|
gDPSetEnvColor(graphPtr++,0,0,0,255);
|
|
if (star_num != 0) {
|
|
starname = (unsigned char*)(SegmentToVirtual(starnamep[(activeCourseNo-1)*6+cursor]));
|
|
ce_posx2 = CharCentering(163,starname,8.);
|
|
DrawS88Font(ce_posx2,81,starname );
|
|
}
|
|
|
|
for (i=1; i<=star_num; i++) {
|
|
se88_num[0] = i;
|
|
DrawS88Font((156-17*(star_num-1)) + 34*(i-1),38 ,se88_num);
|
|
}
|
|
gSPDisplayList(graphPtr++, RCP_s88font_off);
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
/*==============================================================================*/
|
|
/*==============================================================================*/
|
|
|
|
/*==============================================================================*/
|
|
/* Star Select Message Main. */
|
|
/*==============================================================================*/
|
|
/********************************************************************************/
|
|
/* Star Select message. */
|
|
/********************************************************************************/
|
|
extern ulong StarSelectSceneProc(short code, long param)
|
|
{
|
|
|
|
if (code == MAP_CBACK_EXEC) {
|
|
StarSelectScene();
|
|
}
|
|
|
|
return(0);
|
|
}
|
|
/*==============================================================================*/
|
|
/* Star Select Init. */
|
|
/*==============================================================================*/
|
|
/********************************************************************************/
|
|
/* Star Select main Init. */
|
|
/********************************************************************************/
|
|
extern ulong SeStarSelectInitProc(short code, long param)
|
|
{
|
|
unsigned char get_starFlag = BuGetStarFlag(activePlayerNo-1,activeCourseNo-1);
|
|
|
|
goTogame = 0;
|
|
next_level = 0;
|
|
star_num = 0;
|
|
select_counter = 0;
|
|
|
|
get_starNum = BuGetCourseStars(activePlayerNo-1,activeCourseNo-1);
|
|
|
|
if (get_starFlag & (0x01<<6)) get_starNum--;
|
|
|
|
}
|
|
|
|
/*==============================================================================*/
|
|
/* Star Select Main. */
|
|
/*==============================================================================*/
|
|
/********************************************************************************/
|
|
/* Star Select main process. */
|
|
/********************************************************************************/
|
|
extern ulong SeStarSelectProcess(short code, long param)
|
|
{
|
|
|
|
if (select_counter>10 && ((contOr->trigger & CONT_A) || (contOr->trigger & CONT_START)|| (contOr->trigger & CONT_B))) {
|
|
Na_FixSeFlagEntry(NA_SYS_LETS_GO);
|
|
SendMotorEvent(60,70); /* MOTOR 1997.6.5 */
|
|
SendMotorDecay(1); /* MOTOR 1997.6.5 */
|
|
|
|
if (next_level >= (cursor+1)) {
|
|
goTogame = cursor+1;
|
|
}
|
|
else {
|
|
goTogame = next_level;
|
|
}
|
|
|
|
select_starNo = cursor+1;
|
|
|
|
//rmonpf(("hh %d\n",goTogame));
|
|
}
|
|
|
|
|
|
SnExecuteStrategy();
|
|
select_counter++;
|
|
|
|
return((ulong)goTogame);
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|