This is a sub-page of Kinniku Banzuke Vol.2: Aratanaru Genkai he no Chousen!.
0x14600#
CARD2
8009DB24 InitG2dRepPlate00
8009AE3C InitG2dRepPlate01
800956D0 InitG2dRepPlate02
80095AF0 InitG2dRepPlate03
8009D810 InitG2dRepPlate04
80098750 InitG2dRepPlate05
800A075C InitG2dRepPlate06
80095FA0 InitG2dRepPlate07
80099DE8 InitG2dRepPlate08
8002A8EC InitGeom
80021A64 InitHeap
8001D9F0 InitOpd
8001DAE8 InitOpdAnm
80039F18 InitPAD
8003A16C InitPAD2
8001C9C8 InitWork
80013454 Init_Demo
800131A0 Init_Trans
800348E4 InterruptCallback
80027480 In
0x29C00#
;
static void ba_key_flush(int,Ushort);
static void key_flush_sub(Ushort,int);
static void ba_spd_alloff(void);
static int start_dash_chk(int,Ushort);
static void crush_mark(void);
static int chk_newrec(void);
static int chk_entry_man(void);
static void result_camera_set(int);
static short get_skip_time(int);
static int intro_func00(CLASS_W*,int);
static int intro_func01(CLASS_W*,int);
static int intro_func02(CLASS_W*,int);
static int intro_func03(CLASS_W*,int);
static int intro_func04(CLASS_W*,int);
static int intro_func05(CLASS_W*,int);
static int intro_camera(int);
static int intro_camera0(void);
static int (*intro_main_func[])(CLASS_W*,int) = {
intro_func00, /* 選手紹介時のモーション */
intro_func01,
intro_func02,
intro_func03,
intro_func04,
intro_func05,
};
static int pre_func00(CLASS_W*,int);
static int pre_func01(CLASS_W*,int);
static int (*pre_main_func[])(CLASS_W*,int) = {
pre_func00, /* b50m_pre内でのモーション */
pre_func01,
};
void bm_disp2d(void);
v
0x42E00#
]->pose-30)/4,2,200,0);
}
break;
case bm_mot_risek:
if (cls[no]->pose >= 36){
effect_Smoke(cls[no]->xposi,cls[no]->yposi,cls[no]->zposi,10,(cls[no]->pose-36)/2,2,200,0);
}
break;
}
}
static void ba_set_SE(int mode)
{
static int hand[] = {SD_14_HAND1,SD_14_HAND2};
static int foot[] = {SD_14_FOOT1,SD_14_FOOT2};
int i;
volatile int j;
// b50m_cls;
if (mode == 0){
chk_se(0,0,0);
chk_se(0,1,0);
return;
}
for (i=0; i<PLAYER_NUM; i++){
if (b50mw
0x4A400#
>b.endtime)/*最終カウント*/
{
boundno=Sh_Boundnumber(cnt);/* バウンド回数チェック */
Sh_Ball_Coordinate(boundno,sh->b.endtime-sh->b.starttime-sh->b.tra[boundno].starttime,&vec);
SH_setClass1Vec(&s->classw1[SH_OBJ_BALL],(short)vec.vx,(short)vec.vy,(short)vec.vz);
}
/**************/
/* パネル移動 */
/**************/
ballcnt=cnt;
for(i=0;i<10;i++)
{
#if 0
if(sh->p[i].vanish !=4 && sh->p[i].vanish)
{
if(ballcnt<sh->p[i].starttime) /* ボールが当たっていない */
{
Sh_Panel_Coordinate(i,0,&vec,&s->classw1[i].rot);
SH_setClass1Vec(&s->classw1[i],(short)vec.vx,(short)vec.vy,(short)vec.vz);
}
else
{
if((ballcnt>=sh->p[i].starttime) && (ballcnt<sh->p[i].downtime))
{
Sh_Panel_Coordinate(i,((ballcnt)-sh->p[i].starttime),&vec,&rot);
SH_setClass1Vec(&s->classw1[i],(short)vec.vx,(short)vec.vy,(short)vec.vz);
s->classw1[i].rot=rot;
}
else if(ballcnt>=sh->p[i].downtime)
{
Sh_Panel_Coordinate(i,sh->p[i].downtime-sh->p
0xE7BD0#
.dat=1
virscan9.dat=1
virscan.dat=1
[NU_200_F
0x169200#
T t, p;
uso_pcload( ".\\ST07\\FREE.TIM", buf, 0 );
uso_set_tim( ( unsigned long * )buf, &t, &p );
uso_print.cx = p.x;
uso_print.cy = p.y;
uso_print.tp = GetTPage( 0, 0, ( t.x / 64 ) * 64, ( t.y / 256 ) * 256 );
uso_print.dx = ( t.x % 64 ) * 4;
uso_print.dy = t.y % 256;
uso_print.x = x;
uso_print.y = y;
uso_print.line = 0;
uso_print.column = 0;
}
int uso_printf( char *buf, int n, GsOT *ot )
{
int i;
GsSPRITE spr;
short str;
for( i = 0; i < n; i++ )
{
str = *( buf + i ) - 0x20;
if( ( *( buf + i ) > 0x1f ) && ( *( buf + i ) < 0x7f ) )
{
spr.attribute = ( 1 << 30 );
spr.x = uso_print.x + uso_print.column * 8;
spr.y = uso_print.y + uso_print.line * 16;
spr.w = 8;
spr.h = 16;
spr.tpage = uso_print.tp;
spr.u = ( str % 16 ) * 8 + 128;
spr.v = ( str / 16 ) * 16 + 128;
spr.cx = uso_print.cx;
spr.cy = uso_print.cy;
spr.r = 0x80;
spr.g = 0x80;
spr.b = 0x80;
GsSortFastSprite( &spr, ot, 0 );
uso_print.column++;
}else
{
switch( *( buf + i ) )
{
case 0x09:
uso_print.column += 4;
break;
case 0x0a:
uso_print.column = 0;
uso_print.line++;
break;
}
}
}
return( 0 );
}
void uso_flush( void )
{
uso_print.line = 0;
uso_print.column = 0;
}
#endif
void ddp_draw( void )
{
sys_w;
class_gs3d( &s->classw[0] );
class_gs3d( &s->classw[1] );
Himor( ddp_env.pau );
ddp_effect( 1 );
if( ddp_gauged != 0 )
{
ddp_gauge_draw();
0x17C400#
ddp_replay.sd );
}else
{
if( id == DDP_ANA_YURUMERU )
{
ddp_announcer.first = 1;
ddp_replay.sd = *( *( ddp_announcer.tbl + DDP_ANA_IKINARI ) + dice( 6 ) + 6 );
SD_call( ddp_replay.sd );
}else
{
if( ++ddp_announcer.timer > 10 )
{
ddp_announcer.first = 1;
ddp_replay.sd = *( *( ddp_announcer.tbl + DDP_ANA_IKINARI ) + dice( 3 ) + 0 );
SD_call( ddp_replay.sd );
}
}
}
}
/* 死因 */
unsigned char ddp_critical_hit( void )
{
/*
・よろけ以外の状態で相手の腕力がないのに前落下は自爆
・ゆるめられてないのに後落下は自爆
・紐の長さが1/3だと逆転勝利
・試合時間が3秒以内だとあっという間
*/
sys_w;
int i;
switch( s->classw[1 ^ ddp_replay.winner].anime_no )
{
case DDP_A_FALLDOWN0:
case DDP_A_FALLDOWN1:
case DDP_A_FALLDOWN2:
for( i = 0; i < 8; i++ )
{
if( dead_man[ddp_replay.winner].motion[i] >= DDP_A_PULL && dead_man[ddp_replay.winner].motion[i] <= DDP_A_STRAIN0 )
{
break;
}
}
if( i == 8 )
{
0x191E00#
T,0x10,0x10,0xa0,0xb0,0xffa6,0xffe8,0x03},
{DAT,0x10,0x10,0x90,0xc0,0xffb2,0xffe8,0x03},
{DAT,0x10,0x10,0x70,0x10,0xff75,0xfff2,0x2b}, // PUNCH OUT
{DAT,0x10,0x10,0x40,0x20,0xff7d,0xfff2,0x2b},
{DAT,0x10,0x10,0x50,0x10,0xff86,0xfff2,0x2b},
{DAT,0x10,0x10,0x20,0x00,0xff8f,0xfff2,0x2b},
{DAT,0x10,0x10,0x70,0x00,0xff98,0xfff2,0x2b},
{DAT,0x10,0x10,0x60,0x10,0xffa4,0xfff2,0x2b},
{DAT,0x10,0x10,0x40,0x20,0xffae,0xfff2,0x2b},
{END,0x10,0x10,0x30,0x20,0xffb7,0xfff2,0x2b},
};
SPD_W ver_set1_spd
0x193E00#
0,0xf0,0xb0,0x008d,0x000e,0x10},
};
SPD_W h_exgm_spd[]={ // カーソル非選択時
{DAT,0x58,0x20,0x00,0xe0,0xff58,0xffe6,0x72}, // パンチアウト
{DAT,0x10,0x20,0x70,0xe0,0xffb0,0xffe6,0x72},
{DAT,0x60,0x20,0x00,0xe0,0xff58,0x0002,0x72}, // ナインフープス
{DAT,0x10,0x20,0x70,0xe0,0xffb8,0x0002,0x72},
{DAT,0x70,0x20,0x00,0xe0,0xff58,0x001e,0x72}, // ガロンスロー
{DAT,0x18,0x20,0x68,0xe0,0xffc8,0x001e,0x72},
{DAT,0x68,0x20,0x00,0xe0,0x002d,0xfff2,0x72}, // スプレーヒッター
{DAT,0x10,0x20,0x70,0xe0,0x0095,0xfff2,0x72},
0x195A00#
,0x10,0x18,0x90,0x00,0x0008,0xffc2,0x01},
{DAT,0x10,0x18,0x90,0x00,0x0018,0xffc2,0x01},
{END,0x18,0x18,0xa0,0x00,0x0028,0xffc2,0x01},
};
SPD_W pl_mark2_spd[]={
{END,0x28,0x10,0x30,0x10,0xffb0,0xffc6,0x22}, // プレイヤーマーク (P n)
};
SPD_W pl_name_spd[]={ // 選手名
{DAT,0x10,0x10,0x00,0x00,0xffe7,0xffc6,0x04},
{DAT,0x10,0x10,0x00,0x00,0xfff5,0xffc6,0x04},
{DAT,0x10,0x10,0x00,0x00,0x0003,0xffc6,0x04},
{DAT,0x10,0x10,0x00,0x00,0x0011,0xffc6,0x04},
{DAT,0x10,0x10,0x00,0x00,0x001f,0xffc6,0x04},
{DAT,0x10,0x10,0x00,0x00,0x002d,0xffc6,0x04},
{DAT,0x10,0x10,0x00,0x00,0x003b,0xffc6,0x04},
{END,0x10,0x10,0x00,0x00,0x0049,0xffc6,0x04},
};
SPD_W chasel2_spd[]={
{DAT,0x10,0x10,0xf0,0x00,0xff9f,0x0021,0x22}, // 上 0
{DAT,0x10,0x10,0xf0,0x00,0xffc7,0x0021,0x22}, // 上 1
{DAT,0x10,0x10,0xf0,0x00,0xffef,0x0021,0x22}, // 上 2
{DAT,0x10,0x10,0xf0,0x00,0x0017,0x0021,0x22}, // 上 3
{DAT,0x10,0x10,0xf0,0x00,0x003f,0x0021,0x22}, // 上 4
{DAT,0x10,0x10,0xf0,0x00,0x0067,0x0021,0x22}, // 上 5
{DAT,0x10,0x10,0xf0,0x00,0xff9f,0x004b,0x22}, // 下 6
{DAT,0x10,0x10,0xf0,0x00,0xffc7,0x004b,0x22}, // 下 7
{DAT,0x10,0x10,0xf0,0x00,0x003f,0x004b,0x22}, // 下 8
{DAT,0x10,0x10,0xf0,0x00,0x0067,0x004b,0x22}, // 下 9
{DAT,0x10,0x10,0xf0,0x00,0xff77,0x0021,0x22}, // 上 左 隠し
{DAT,0x10,0x10,0xf0,0x00,0xff77,0x004b,0x22}, // 下 左 隠し
{DAT,0x10,0x10,0xf0,0x00,0x008f,0x0021,0x22}, // 上 右 隠し
{DAT,0x10,0x10,0xf0,0x00,0x008f,0x004b,0x22}, // 下 右 隠し
{DAT,0x10,0x10,0xf0,0x00,0xf
0x19AE00#
/* 腰から腰 */
void himoIV( void )
{
sp_w;
sys_w;
long otz, p, flag;
int i, parry[2];
int tmp_l;
MATRIX mat, ls;
VECTOR vec;
short length, r;
short tooth[2];
// SVECTOR svc[HIMO_MAX + 1];
GsGetLsUnit( &himo.unit, &ls );
GsSetLsMatrix( &ls );
hj_i4++;
hj_i4 %= HJ_I4;
PushMatrix();
/* ZYXの順番で回転マトリックス生成 */
RotMatrix( &s->classw[0].rot, &mat );
/* ジョイントをローカルの回転角で回転 */
ApplyMatrix( &mat, &himo.j[0][HIMO_JOINT_RHIP].vec, &vec
0x1A3A00#
{ 0x0014e800/0x800+CD_DATA00, (0x00007648+0x7ff)/0x800, (Ulong)TIM_TABLE2 }, /* 44 テクスチャB */
{ 0x00156000/0x800+CD_DATA00, (0x000057ad+0x7ff)/0x800, (Ulong)HOMEMODEL_TABLE }, /* 45 03 高橋B1*/
{ 0x0015b800/0x800+CD_DATA00, (0x000057ad+0x7ff)/0x800, (Ulong)AWAYMODEL_TABLE }, /* 46 高橋B2*/
{ 0x00161000/0x800+CD_DATA00, (0x00007648+0x7ff)/0x800, (Ulong)TIM_TABLE2 }, /* 47 テクスチャB */
{ 0x00168800/0x800+CD_DATA00, (0x000057ad+0x7ff)/0x800, (Ulong)HOMEMODEL_TABLE }, /* 48 04 飯田B1*/
{ 0x0016e000/0x800+CD_DATA00, (0x000057ad+0x7ff)/0x800, (Ulong)AWAYMODEL_TABLE }, /* 49 飯田B2*/
{ 0x00173800/0x800+CD_DATA00, (0x00007648+0x7ff)/0x800, (Ulong)TIM_TABLE2 }, /* 4a テクスチャB */
{ 0x0017b000/0x800+CD_DATA00, (0x000057ad+0x7ff)/0x800, (Ulong)HOMEMODEL_TABLE }, /* 4b 05 井原B1*/
{ 0x00180800/0x800+CD_DATA00, (0x000057ad+0x7ff)/0x800, (Ulong)AWAYMODEL_TABLE }, /* 4c 井原B2*/
{ 0x00186000/0x800+CD_DATA00, (0x00007648+0x7ff)/0x800, (Ulong)TIM_TABLE2 }, /* 4d テクスチャB */
{ 0x0018d800/0x800+CD_DATA00, (0x000057ad+0x7ff)/0x800, (Ulong)HOMEMODEL_TABLE }, /* 4e 06 中山B1*/
{ 0x00193000/0x800+CD_DATA00, (0x000057ad+0x7ff)/0x800, (Ulong)AWAYMODEL_TABLE }, /* 4f 中山B2*/
{ 0x00198800/0x800+CD_DATA00, (0x00007648+0x7ff)/0x800, (Ulong)TIM_TABLE2 }, /* 50 テクスチャB */
{ 0x001a0000/0x800+CD_DATA00, (0x000057ad+0x7ff)/0x800, (Ulong)HOMEMODEL_TABLE }, /* 51 09 古田B1*/
{ 0x001a5800/0x800+CD_DATA00, (0x000057ad+0x7ff)/0x800, (Ul
0x1ABC00#
-------------*/
/* ローカル変数 */
/*------------------------------------------------------------------------------*/
static Uchar u_wk[2];
/*------------------------------------------------------------------------------*/
/* プロトタイプ宣言 */
/*------------------------------------------------------------------------------*/
void TourSet( Uchar, Uchar, Uchar, short, short, Uchar ); /* トーナメント表セット */
Uchar TourRes( Uchar, Uchar *, Uchar ); /* トーナメント結果表示 */
void TourOFF( Uchar, Uchar ); /* トーナメント表消去 */
/*==============================================================================*/
/* トーナメント表セット (専用モジュールなのでいろいろ固定してあるっす!) */
/*------------------------------------------------------------------------------*/
/* パラメータ */
/* type : トーナメント表タイプ (0:8人用 1:4チーム用 2:2チーム用) */
/* */
/* cB : 登録パーツ(クラス)番号 (トーナメント表 ベース用) */
/* cL : 登録パーツ(クラス)番号 (トーナメント表 ライン�
0x1B4E00#
y=tw->y+tim_y;
}else{
rect.x=tw->x;
rect.y=tw->y;
}
rect.w=tw->w;
rect.h=tw->h;
LoadImage(&rect,(Ulong *)UNPRESS_BUFF);
break;
case DAT:/* キャラデータ */
if (tim_trans_fg){
rect.x=tw->x+tim_x;
rect.y=tw->y+tim_y;
}else{
rect.x=tw->x;
rect.y=tw->y;
}
rect.w=tw->w;
rect.h=tw->h;
LoadImage(&rect,tw->tim);
break;
#if 0
case PACKDAT:/* TIMデータ */
GsGetTimInfo((Ulong *)(tw->tim)+1,&tim);
0x1BB600#
->imgbuf[0] = ( unsigned short * )IMG_BUF0;
dec->imgbuf[1] = ( unsigned short * )IMG_BUF1;
dec->imgid = 0;
/* 表示・描画の切り替えとタイミングをとる */
dec->rectid = 1 ^ movW.tttt;
dec->isdone = 0;
/* rect[]の幅/高さはSTRデータの値によってセットされる */
dec->rect[0].x = x0;
dec->rect[0].y = y0;
dec->rect[1].x = x1;
dec->rect[1].y = y1;
dec->slice.w = VRAMPIX( 16, mov->is24bit );
dec->is24bit = mov->is24bit;
if( dec->rectid )
{
dec->slice.x = x1;
dec->slice.y = y1;
0x1C6E00#
i会社員) */
(Ulong)j_0a_spd, /* 0x17 職業(鳶職) */
(Ulong)j_0b_spd, /* 0x18 職業(消防士) */
(Ulong)j_0c_spd, /* 0x19 職業(ダンサー) */
(Ulong)j_0d_spd, /* 0x1a 職業(店員) */
(Ulong)j_0e_spd, /* 0x1b 職業(教師) */
(Ulong)j_0f_spd, /* 0x1c 職業(学生) */
(Ulong)j_0h_spd, /* 0x1e 職業(騎手) */
(Ulong)j_0g_spd, /* 0x1d 職業(元力士) */
(Ulong)s_name_spd, /* 0x1f 選手名 */
(Ulong)s_suuchi_spd,/* 0x20 年齢・身長・体重 */
(Ulong)s_tanni_spd, /* 0x21
0x4A5E00#
ことに承諾されたものとします。これらの条項および条件に同意されない場合、マイクロソフトは、お客様にアドイン コンポーネントまたはそのいかなる部分のインストール、使用または複製のいずれも許諾できません。本追加契約書で使用されている定義語は、原契約書または本ソフトウェア製品の使用を規定する契約書の用語と同じ意味を持ちます。
注意:お客様が Microsoft Office の正規のライセンスをお持ちでない場合、マイクロソフトは、お客様に上記のアドイン コンポーネントのインストール、使用または複製のいずれも許諾できません。
1.
0x4A8E00#
ハ置選択時の人モーションキック
static void playerKickSelectPos( void )
{
glw.state = SP_STATE_STAND;
glw.count = 0;
PlayerSetMot( MOT_021, 0, 256 );
}
// 投擲位置選択時の人モーション制御
static int playerSelectPos( u_short pad )
{
sys_w;
CLASS_W *man = &s->classw[CLS_HUMAN];
// 操作で歩き
if ( pad & (PADLleft|PADLright) )
{
if ( glw.state == SP_STATE_NEUTRAL )
{
// ニュートラルなら歩きに移行
glw.state = SP_STATE_MOVE;
PlayerSetMot( MOT_026, 0, 256 );
man->rev
0x4AB600#
///////////////////////////////////////////////////
/***************************************************************************
スパークのアニメパターン
総合優勝の時に使う
***************************************************************************/
static short anime_vram[] = {
0x0380, 0x0080
};
OPD_PATTERN_HEADER EF_S_00_p[] = {
{0x0001, 0x0000, 0x00, 0x00, 0, 0, 0, 0},
{0x0190, 0x00a4, 0x02, 0x0a, 0x30, 0x18, 0x08, 0x00},
};
OPD_PATTERN_HEADER EF_S_01_p[] = {
{0x0001, 0x0000, 0x00,
0x4BB400#
2100211,0x02211112,
0x0aa00aaa,0x002aa660,0x08aaaaa8,0x02288222,0x0222aa22,0x02200aa2,0x02200222,0x00222220,
/* FG:white, BG:transparent */
0x7fff0000,0x00008000,0x7fff0000,0x00008000,0x7fff0000,0x00008000,0x7fff0000,0x00008000,
0x00000000,0x00000000,0x7fff7fff,0x7fff7fff,0x80008000,0x80008000,0x00000000,0x00000000,
/* FG:white, BG:translucent */
0x7fff8000,0x08000421,0x7fff8000,0x08000421,0x7fff8000,0x08000421,0x7fff8000,0x08000421,
0x80008000,0x80008000,0x7fff7fff,0x7fff7fff,0x04210421,0x04210421,0x80008000,0x80008000,
#endif
};
#if USE_SIZE == SIZE_16x8
#define N_LAYER 4 // 縮退度
#define CLUT_OFSY 48 // CLUTまでのy差分
#define SIZE_H 16 // 1文字の高さ
static SPRT _sp[2][D_FONT_MAX]; // 登録用プリミティブ
#elif USE_SIZE == SIZE_8x8
#define N_LAYER 4
#define CLUT_OFSY 24
#define SIZE_H 8
static SPRT_8 _sp[2][D_FONT_MAX];
#else
#define N_LAYER 2
#define CLUT_OFSY 48
#define SIZE_H 8
static SPRT_8 _sp[2][D_FONT_MAX];
#endif
0x4C2AA0#
・ス来た来たっ」*/
FK4_D19, /*「今日はなにかありそうだ」「(選手名)」*/
};
/*************************************************************
リプレイ
*************************************************************/
enum {
/*開始コール*/
/*通常テンション*/
FK1_C01 = (FK4_D19+1), /*「それではリプレイです」*/
FK1_C02, /*「リプレ
0x4CF200#
spd[1].palette = 0x01;
for ( i=2; i<5; i++ ){
spd[i].palette = mode ? 0x01 : 0x03;
}
/*リプレー用メニュー2*/
set2d( G_CLSR_MENU2, SPD_REP_MENU2, MODE16, 0,0, 11, 0, 10, 1 );
spd = GetSpd( SPD_REP_MENU2 );
spd[0].palette = mode ? 0x01 : 0x03;
spd[1].palette = mode ? 0x01 : 0x03;
/*L、Rの文字*/
set2d( G_CLSR_LR, SPD_REP_LR, MODE16, 0,0, 13, 0, 10, 1 );
spd = GetSpd( SPD_REP_LR );
spd[0].palette = mode ? 0x01 : 0x03;
spd[1].palette = mode ? 0x01 : 0x03;
/*戻しマーク*/
set2d( G_CLSR_REW, SPD_REP_REW, MODE16, 0,0, 13, 0, 10, 1 );
/*送りマーク*/
set2d( G_CLSR_FEW, SPD_REP_FEW, MODE16, 0,0, 13, 0, 10, 1 );
if ( !mode ){ /*操作不能時*/
/*輝度を半分に*/
cls = &s->classw0[ G_CLSR_REW ];
cls->r = cls->g = cls->b = 0x40;
cls = &s->classw0[ G_CLSR_FEW ];
cls->r = cls->g = cls->b = 0x40;
}else{ /*操作可能時*/
cls = &s->classw0[ G_CLSR_REW ];
cls->r = cls->g = cls->b = 0x80;
cls = &s->classw0[ G_CLSR_FEW ];
cls->r = cls->g = cls->b = 0x80;
}
/*デフォルトのカラーを転送してやる palette#0x64 col 1~3, 4~6*/
rect.x = PALETU( 0x64 )+1;
rect.y = PALETV( 0x64 );
rect.w = 6;
rect.h = 1;
LoadImage(&rect,(void*)rep_def_col);
DrawSync(0);
/*プレート*/
set2d( G_CLSR_PLATE, SPD_REP_PLATE, MODE16, 0,0, 11, 0, 10, 1 );
}
/***************************************************************************
リプレープレート・メインタスク
リプレー中は毎フレーム実行してもらう
この関数の前にセットされたモードがこの関数で反映される。
out: s
0x4D1E00#
/* 0x1002 2回目チャレンジ*/
(Ulong)clear_spd, /* 0x1003 成功*/
(Ulong)miss_spd, /* 0x1004 失敗*/
(Ulong)kiroku_1_spd, /* 0x1005 結果表示1*/
(Ulong)kiroku_2_spd, /* 0x1006 結果表示2*/
(Ulong)chal_spd, /* 0x1007 チャレンジ*/
};
/**************************************************************************
競技説明音声テーブル
**************************************************************************/
//short st_explain[] = {SA_A20,SA_A21,0, SA_A22,-1};
///////////////////////////////
0x4D8C00#
}
}
// デモモーションを復帰する
// 0 : 通常モーションのケツを使いたい
// 1 : デモモーションを使いたい
// demo_mot_f == 0 : 通常モーションが入っている
// != 0 : デモモーションが入っている
int G3dRestore03_Demo( int mode )
{
if ( ( demo_mot_f != 0 && mode == 0 ) || ( demo_mot_f == 0 && mode != 0 ) )
{
// スワップするので、アドレスの順はとりあえずどーでもいい
memswap( (u_char *)TIM_TABLE2+0x20000, (u_char *)ANIME_TABLE2, 0x10000 );
demo_mot_f ^= 1;
}
return ( 0 );
0x4E1A00#
==================
return ( ret );
}
// 床に跳ねる
//=============
static void taruRefrectFloor( GALLON_W *gl )
{
long v = gl->vel.vy/DELTA_T2;
long pz = gl->pos.vz/DELTA_T2;
// SE
if ( MAT_MIN_Z < pz && pz < WALL_POS_Z )
{
// 板部に落下
if ( v > 12*ONE_CM )
TaruSEset( ((rand()>>8)&0x01) == 0 ? SD_13_BOUNDa1 : SD_13_BOUNDb1 );
else if ( v > 5*ONE_CM )
TaruSEset( ((rand()>>8)&0x01) == 0 ? SD_13_BOUNDa2 : SD_13_BOUNDb2 );
} else if ( pz < MAT_MAX_Z )
{
if ( v > 5*ONE_CM )
TaruSEset( SD_13_MAT ); /* マットに落下 */
} else
{
// 床に落下
if ( v > 5*ONE_CM )
TaruSEset( ((rand()>>8)&0x01) == 0 ? SD_13_BOUNDa2 : SD_13_BOUNDb2 );
}
// xz軸方向の速度は減衰 (手抜き)
gl->vel.vx = ( gl->vel.vx * 22 ) / 32;
gl->vel.vz = ( gl->vel.vz * 22 ) / 32;
// y軸方向のみ反射減衰 (手抜き)
if ( glw.play_type != PLAY_TYPE_EXTRA )
{
if ( WALL_POS_Z < pz && pz < MAT_MAX_Z )
{ // マット
gl->pos.vy -= ( ( gl->pos.vy - (0-GALLON_R)*DELTA_T2 ) * 24 ) / 32;
gl->vel.vy = -( gl->vel.vy * 9 ) / 32;
} else if ( MAT_MIN_Z < pz && pz < WALL_POS_Z )
{ // 板
gl->pos.vy -= ( ( gl->pos.vy - (0-GALLON_R)*DELTA_T2 ) * 24 ) / 32;
gl->vel.vy = -( gl->vel.vy * 13 ) / 32;
} else
{ // 床
gl->pos.vy -= ( ( gl->pos.vy - (INIT_POS_Y-GALLON_R)*DELTA_T2 ) * 24 ) / 32;
gl->vel.vy = -( gl->vel.vy * 13 ) / 32;
}
} else
{ // 全面床
gl->pos.vy -= ( ( gl->pos.vy - (0-GALLON_R)*DELTA_T2 ) * 24 ) / 32;
gl->vel.vy = -( gl->vel.vy * 13 ) /
0x4E4C00#
n_init( GALLON_W *gl, long m, VECTOR *pos, VECTOR *v )
{
gl->m = m;
setVector( &gl->pos, pos->vx*DELTA_T2, pos->vy*DELTA_T2, pos->vz*DELTA_T2 );
setVector( &gl->vel, v->vx*DELTA_T, v->vy*DELTA_T, v->vz*DELTA_T );
setVector( &gl->accel, 0, 0, 0 );
gln_resetForce( gl );
gl->time = 0;
// 回転とか
// gl->rotx = 0; // ←これは外でやっている (child03s.c)
setVector( &gl->rotm, 0, 0, 0 );
gl->roty = 0; // 樽の進行方向への回転、最初はゼロ
gl->rotvx = ( gl->vel.vz < 0 ? 8 : -8 ) * ( 8 + (rand()>>12)%8 );
setVector( &gl->rotvm, 0, 0, 0 );
gl->rotvy = 0; // 樽の進行方向
}
static void gln_resetForce( GALLON_W *gl )
{
gl->force.vx = 0;
gl->force.vy = 0;
gl->force.vz = 0;
}
static void gln_addForce( GALLON_W *gl, VECTOR *f )
{
gl->force.vx += f->vx;
gl->force.vy += f->vy;
gl->force.vz += f->vz;
}
static void gln_calcPosition( GALLON_W *gl )
{
short c, s;
c = rcos( gl->rotvy );
s = rsin( gl->rotvy );
// 加速度の計算
gl->ac
0x4E8E00#
驍ゥも 1999.11.27 (矢)
Pose_Set( &s->classw[CLS_HUMAN], mot, f );
s->classw[CLS_HUMAN].merge_timer = 0;
return ( 0 );
}
// 手の形をセットする
// 0:パー, 1:グー
void PlayerSetHand( int l, int r )
{
sys_w;
CLASS_W *man = &s->classw[CLS_HUMAN];
man->obj3D_w[PARTS_RHAND].be = ( r == 0 ); // 右・パー
man->obj3D_w[PARTS_LHAND].be = ( l == 0 ); // 左・パー
man->obj3D_w[PARTS_RHAND2].be = ( r != 0 ); // 右・グー
man->obj3D_w[PARTS_LHAND2].be = ( l != 0 ); // 左・グー
}
0x4EC200#
_SUU )
op = RENSHA_MAX_SUU;
// 計算結果
glw.ren = op;
glw.rensha += op; // 加算
if ( glw.rensha > 0 )
glw.rensha -= ( glw.rensha < 16 ? 1 : glw.rensha/16 ); // 減衰
//glw.power = PPPP;
glw.power = PlayerCalcPower( glw.rensha );
// 操作 (angle)
// 有る程度持ち上げていないと投げられない
if ( ( cls->pose < THROW_NG_START || THROW_NG_END < cls->pose ) && (trg&PAD_ANGLE) != 0 )
{
// 決定SE
SD_call( SD_13_GAGE2 );
// モーションの繋ぎ方の違いを吸収するか、投げるかの分岐
if ( cls->pose < THROW_NG_START )
{
glw.state = THROW_STATE_THROW_DOWN;
PlayerSetMot( MOT_030, pose_trans_tbl[cls->pose], 256 );
glw.frame_end = 0;
} else
glw.state = THROW_STATE_LINK;
// 操作を「投げ」に
glw.op_state = OP_STATE_ANGLE;
// ゲージをちょっと変える
gl_gageChange_Power();
}
break;
case OP_STATE_ANGLE:
// 操作 (angle / throw)
#if 1 // 2通りの操作方法
// 押しっぱなしで、離すと投げる
if ( rel & PAD_THROW )
{
glw.op_state = OP_STATE_THROW;
// 決定SE
SD_call( SD_13_GAGE2 );
// まだ最低角に達していなければ、インデックスも増加
if ( glw.rad <= throw_rad_min[glw.play_type] )
//glw.rad = RRRR;
glw.rad = PlayerCalcAngle( ++glw.rad_time );
} else if ( pad & PAD_ANGLE )
#else
// いったん離して、もう一度押すと投げる
if ( trg & PAD_THROW )
{
// まだ最低角に達していなければ、投げない
if ( glw.rad <= throw_rad_min[glw.play_ty
0x4F0E00#
ld, &tmp );
}
static u_char get_hand( CLASS_W *man )
{
u_char ret = 0;
ret |= ( man->obj3D_w[PARTS_RHAND].be != 0 ? 0 : 0x80 );
ret |= ( man->obj3D_w[PARTS_LHAND].be != 0 ? 0 : 0x40 );
return ( ret );
}
static void set_hand( CLASS_W *man, u_char info )
{
int g, p;
if ( (info&0x80) == 0 )
{
p = 1;
g = 0;
} else
{
p = 0;
g = 1;
}
man->obj3D_w[PARTS_RHAND].be = p; // 右・パー
man->obj3D_w[PARTS_RHAND2].be = g; // 右・グー
if ( (info&0x40) == 0 )
{
0x4F9A00#
& 0x1ff)<<14;
zip |= (s->time&0x0f)<<23;
*addr = zip;
}
}
return ( addr );
}
// 煙の状態を復帰する
void SmokeLoad( NOZZLE_DT *nzl )
{
int i, j;
SMOKE_W *s;
u_long *addr, zip;
for ( i = 0; i < NOZZLE_MAX; i++, nzl++ )
{
// 噴出口の状態
nozzle[i].pos = nzl->pos;
nozzle[i].status = nzl->pos.pad;
nozzle[i].rot = nzl->rot;
nozzle[i].n_use = nzl->rot.pad;
// 煙の状態
if ( nozzle[i].n_use > 0 )
{
for ( j = nozzle[i].n_use, s = nozzle[i].smoke, addr = nzl->smoke; j > 0; j--, s++, addr++ )
{
zip = *addr;
s->pos.vx = ((zip&0x07f)-64)<<14;
s->pos.vy = (((zip>>7)&0x07f)-64)<<14;
s->pos.vz = (((zip>>14)&0x1ff)-32)<<14;
s->time = (zip>>23)&0x0f;
// リンクを繋ぐ
s->next = s+1;
}
// リンク端の処理
nozzle[i].use = nozzle[i].smoke;
s--;
s->next = NULL;
} else
nozzle[i].use = NULL;
}
}
// スモークの噴出を何回するか設定して噴出
void SmokeBlow( int time )
{
blow_tm = BLOW_GAP * (time-1);
}
// スモークの噴出時間を設定して、噴出
void SmokeSetBlow( int time )
{
int i;
int sd_flag = 0;
for ( i = 0; i < NOZZLE_MAX; i++ )
{
if ( nozzle[i].status != NOZZLE_STATUS_NOUSE )
{
nozzle[i].status = NOZZLE_STATUS_BLOW;
nozzle[i].time = 0;
nozzle[i].tm0 = time;
sd_flag = 1;
}
}
// SE付けるか?
if ( sd_flag != 0 )
{
SD_call( SD_13_SMOKE );
ReplaySmokeSE();
}
}
// スモークの噴出を停止
void SmokeStopBlow( void )
{
int i;
for
0x51BA00#
0x80,0x44,0x80,0x7e,0x80,0x7c,0xc0,0x7e,0x40,0x7e,0x40,
0xbd,0x55,0xc0,0x44,0x70,0x01,0x7c,0xc0,0x6c,0xc0,0x74,0x80,0x33,0x70,0x01,0xff,
0x74,0x80,0x7d,0x00,0x7c,0x80,0x7c,0x80,0x5c,0x80,0x74,0x40,0x7e,0x80,0x7e,0x80,
0xbf,0x64,0x40,0x75,0xc0,0x7e,0x00,0x7e,0x00,0x7e,0x00,0x58,0x01,0x65,0x7c,0xc0,
0xff,0x7c,0x80,0x64,0x80,0x74,0x40,0x74,0x80,0x75,0xc0,0x75,0x40,0x75,0xc0,0x7c,
0x40,0xff,0x7e,0x00,0x7e,0x40,0x7c,0x80,0x7c,0x80,0x7c,0x80,0x44,0x80,0x77,0x80,
0x74,0xc0,0xde,0x99,0x70,0x01,0x7c,0x80,0x6c,0x80,0x7a,0xc0,0x56,0x1a,0xab,0x4a,
0xcb,0xfd,0x75,0x40,0xaa,0x70,0x01,0x75,0x00,0x74,0x40,0x77,0x80,0x7d,0xc0,0x6d,
0x40,0xfd,0x73,0xc0,0x66,0x7d,0xc0,0x7d,0xc0,0x7d,0x00,0x7d,0x40,0x7c,0xc0,0x4c,
0x01,0x8a,0x11,0x70,0x01,0xbb,0x80,0xba,0xbb,0xab,0x94,0xfe,0xba,0xa4,0xa9,0x00,
0x12,0x8f,0x89,0xb0,0x86,0xff,0x7f,0x40,0x6d,0x80,0x75,0xc0,0x7d,0x40,0x6d,0x00,
0x0c,0xa8,0x5c,0x01,0x7e,0xc0,0xfd,0x6d,0x80,0xcc,0x70,0x01,0x50,0x80,0x01,0x40,
0x0d,0x43,0x7e,0x00,0x7f,0x00,0xff,0x65,0x40,0x74,0xa0,0x74,0x40,0x75,0x40,0x74,
0xc0,0x74,0x80,0x7d,0xc0,0x7c,0x80,0xff,0x7c,0x40,0x5e,0x00,0x7d,0x00,0x7e,0x40,
0x66,0x40,0x7c,0xc0,0x7c,0xc0,0x7c,0x80,0x6f,0x7c,0x01,0x7c,0x01,0x4c,0xc0,0x2d,
0xce,0xdc,0x74,0xaf,0x3a,0x00,0xcd,0x98,0xdc,0xcc,0xcd,0x95,0x96,0xcc,0xcc,0x8a,
0x25,0x06,0x0f,0xdc,0x10,0x07,0xcd,0xdd,0x82,0xcd,0xcd,0xff,0x76,0xc0,0x7e,0x60,
0x7f,0x80,0x7d,0x80,0x7c,0x01,0x54,0x01,0x7c,0xc0,0x6c,0x40,0x5f,0x7d,0x80,0x7c,
0x01,0x7c,0x60,0x5c,0x01,0x74,0xc0,0xef,0x70,0xa0,0x00,0xff,0x70,0x01,0x77,0x20,
0x7
0x52BA00#
R_W pow_gage;
WALLDIST_W walldist;
} GL_W;
// 飛んでいる樽の状況(実況やモーション判別用)
#define TARU_STATE_NONE 0x0000 // 特になし
#define TARU_STATE_HIT_WALL 0x0001 // 壁に当たった
#define TARU_STATE_HIGHEST 0x0002 // 最高到達点を越えた
#define TARU_STATE_OVER_WALL 0x0004 // 壁を越えた
// 各種宣言
//===========
// ガロンスローを統括するワーク
extern GL_W glw;
// GL_throw_main()内の子関数を納めた配列
extern int (*gl_subfunc[])();
enum {
GLs_INITIALIZE = 0,
GLs_SELECT_HEIGHT,
GLs_SELECT_POSITION,
GLs_THROW,
GLs_FLYING_GALLON,
GLs_SUCCESS,
GLs_FALSE,
GLs_RESULT,
};
extern int G3dTrans03_Stage( void );
extern int G2dTrans03( void );
#endif
WallInit( void );
extern void WallSet( long height );
extern void WallSetVib( short pz, short vz, short h, short time );
extern void WallVibration( void );
extern void wallSetCoord( void );
// 入力
#define N_PAD 3
#define PAD_NOW 0
#define PAD_TRG 1
#define PAD_REL ground_clip(CLIP_GALLERY);
po_view_set(CAMERA_BALL_SELECT);
Pose_Set(cls, MOT_STOP, 0);
work->next_anime = 0xffff;
po_pin_model_change(MODEL_2D);
po_step1_up();
}
break;
}
return 0;
}
static void set_pin_pos(void)
{
Uchar pin_no, obj_kind;
short i;
CLASS1_W *cls1;
PO_PIN_W *pPin;
PO_GAME_W *work;
PO_EX_OBJ_W *pEx_obj;
work = &po_game_w;
pPin = &po_pin_w[0];
pEx_obj = &po_ex_obj_w[0];
bzero((Uchar *)pPin , sizeof(PO_PIN_W)*MAX_PIN_NUM);
bzer
0x532C00#
ay_main(void)
{
sp_w;
sys_w;
short counter, play_speed;
CLASS_W *cls;
CLASS1_W *clsb;
PO_GAME_W *work;
PO_REPLAY_W *replay_w;
PO_BALL_W *pBall;
PO_PIN_W *pPin;
cls = &s->classw[0];
clsb = &po_local_cls[L_CLS_BALL];
work = &po_game_w;
replay_w = &po_replay_w;
pBall = &po_ball_w;
pPin = &po_pin_w[0];
po_set_common_io();
G2dReplayCtrl00();
switch (sp->step3) {
case 0: /* 画面が暗転してるうちにあらかじめ全フレーム分を計算 */
while (work->mot_end != 1) {
po_character();
po_ball_move();
if (end_check() && work->mot_end == 0) {
if (work->success_fg) {
if ((work->clear_lane | (1<<work->lane_no)) == 0x1ff) { /* パーフェクト */
po_pose_set(MOT_SUCCESS1);
} else {
if (GET_RESULT_MOT(work->mot_no)) po_pose_set(MOT_SUCCESS1);
else po_pose_set(MOT_SUCCESS2);
}
if (work->mot_end == 0) work->mot_end = 2;
replay_w->result_frame = replay_w->frame;
} else {
if (G
0x538A00#
ne SmokeBlow Smoke03Blow
#define SmokeSetBlow Smoke03SetBlow
#define SmokeStopBlow Smoke03StopBlow
#define SmokeClearBlow Smoke03ClearBlow
#define SmokeIsBlow Smoke03IsBlow
#define SmokeSetSpeed Smoke03SetSpeed
#define SmokeGetSpeed Smoke03GetSpeed
#define SmokeStore Smoke03Store
#define SmokeLoad Smoke03Load
extern void SmokeInit( SVECTOR pos[], short latitude[], short longitude[], int n );
extern void SmokeMokuMoku( void );
extern void SmokeDraw( void );
extern void SmokeBlow( int time );
extern void SmokeSetBlow( int time );
extern void SmokeStopBlow( void );
extern void SmokeClearBlow( void );
extern int SmokeIsBlow( void );
extern void SmokeSetSpeed( int speed );
extern int SmokeGetSpeed( void );
extern u_long *SmokeStore( NOZZLE_DT *nzl, u_long *addr );
extern void SmokeLoad( NOZZLE_DT *nzl );
#endif
0x538E00#
oid)
{
sp_w;
sys_w;
CLASS_W *cls;
PO_GAME_W *work;
PO_BALL_W *pBall;
PO_PIN_W *pPin;
PO_EX_OBJ_W *pEx_obj;
PO_REPLAY_W *replay_w;
cls = &s->classw[0];
work = &po_game_w;
pBall = &po_ball_w;
pPin = &po_pin_w[0];
replay_w = &po_replay_w;
pEx_obj = &po_ex_obj_w[0];
tim_trans((TIM_W *)TIM_TABLE2[0], 0);
tim_trans((TIM_W *)TIM_TABLE2[4], 0);
work->play_mode = NORMAL_MODE;
work->try_num = work->miss_count = 0;
work->try_this_lane = 0;
work->clear_lane = work->lane_no = 0
0x53D600#
ime_no;
CLASS_W *cls;
PO_GAME_W *work;
PO_BALL_W *pBall;
cls = &s->classw[0];
work = &po_game_w;
pBall = &po_ball_w;
if (cls->animeType == MOTION_TYPE_DEMO) anime_no = cls->anime_no + DEMO_MOTION_OFFSET;
else if (cls->animeType == MOTION_TYPE_NO1) anime_no = cls->anime_no + MOTION_TYPE_NO1;
else anime_no = cls->anime_no;
if (cls->anime[cls->pose+1].pd == (void *)STOP) {/* 最終フレームの場合 */
switch (anime_no) {
case MOT_WALK:
case MOT_ENTER1:
case MOT_ENTER2:
if (
0x546A00#
GsSortPoly(pg3, &SepOT[0].ot[ACTIVE_SIDE], otz>>(14-OT_LENGTH));
box.attribute = STP10M10;
GsSortBoxFill(&box, &(SepOT[0].ot[ACTIVE_SIDE]), otz>>(14-OT_LENGTH));
PopMatrix();
}
0x54DA00#
){
TRANS_STEP = 0;
return 1;
}
}
return 0;
}
/***************************************************************************
画面中央から拡大して出現
in: void* arg EM_ACT型変数へのアドレス
EM_ACTのflagメンバーがONのときは収束時にフラッシュする
out: int ==0:継続中 ==1:終了
***************************************************************************/
static int Em03_func00( void* arg )
{
sys_w;
EM_ACT* tag;
CLASS0_W* cls;
tag = (EM_ACT*)arg;
cls = &s->classw0[ tag->cls ]; /*編集対象のクラス*/
switch ( tag->step ){
case 0: /*下ごしらえ*/
/*拡大率等の設定*/
scale_work03 = 256;
cls->scalex = ONE*4;
cls->scaley = ONE*4;
cls->my = 0x40;
cls->kind = 1;
tag->tmp = tag->timer = 0;
tag->step++;
break;
case 1:
if ( decrease_size_classw0( tag->cls, ONE, ONE, scale_work03 ) ){ /*縮小終了なら*/
if ( tag->flag ){
set_rgb_classw0( tag->cls, 0xff );
}
SD_call(SD_RESULT2);
tag->step++;
break;
}
scale_work03 += 256;
break;
case 2: /*収束時にガクガク*/
if ( tag->tmp%2 ){
if ( enlarge_size_classw0( tag->cls, ONE+64, ONE+64, ONE+64 ) ){
if ( tag->flag ){
set_rgb_classw0( tag->cls, 0x80 );
}
tag->tmp++;
tag->timer++;
}
}else{
if ( decrease_size_classw0( tag->cls, ONE, ONE, ONE ) ){
if ( tag->flag ){
set_rgb_classw0( tag->cls, 0xff );
}
tag->tmp++;
tag->timer++;
}
}
if ( tag->timer == 5 ){
0x557C00#
e 4
.byte 135
.byte 95
.byte 139
.byte 143
.byte 165
.byte 164
.byte 170
.byte 170
.byte 68
.byte 64
.byte 112
.byte 60
.byte 0
.byte 227
.byte 10
.byte 0
.byte 109
.byte 110
.byte 249
.byte 11
.byte 175
.byte 8
.byte 63
.byte 3
.byte 195
.byte 249
.byte 4
.byte 237
.byte 135
.byte 149
.byte 17
.byte 4
.byte 64
.byte 67
.byte 56
.byte 95
.byte 140
.byte 95
.byte 160
.byte 102
.byte 158
.byte 102
.byte 0
.byte 39
.byte 56
.byte 64
.byte 4
.byte 105
.byte 3
.byte 218
.byte 96
.byte 250
.byte 1
.byte 49
.byte 71
.byte 21
.byte 93
.byte 5
.byte 108
.byte 5
.byte 109
.byte 240
.byte 255
.byte 155
.byte 0
.byte 85
.byte 127
.byte 53
.byte 156
.byte 111
.byte 9
.byte 161
.byte 255
.byte 0
.byte 44
.byte 82
.byte 64
.byte 128
.byte 70
.byte 249
.byte 114
.byte 113
.byte 53
.byte 34
.byte 144
.byte 10
.byte 181
.byte 126
.byte 128
.byte 124
0x55D600#
フみ
if ( glw.walldist.time == 0 )
{
// 背景半透明のベース位置を変更
glw.walldist.base.vx = DIST_PX_1-16;
glw.walldist.base.vy = DIST_PY_1-2;
// 描画開始
set_kind_classw0( CLS0_POSREC, ON );
set_kind_classw0( CLS0_DIST_100_CM, ON );
set_kind_classw0( CLS0_DIST_10_CM, ON );
set_kind_classw0( CLS0_DIST_1_CM, ON );
}
gl_gageMove1_Walldist();
// 拡大率の制限
if ( (glw.walldist.scale -= ONE/MOVE_TIME0) < 0 )
glw.walldist.scale = -1;
// 移動終了か?
if ( glw.walldis
0x56C400#
se_speed /= 2;
pPin->direct_angle = SIGN(pPin->direct_angle) * (0x800 - abs(pPin->direct_angle));
pPin->direct_angle = (pPin->direct_angle + 0x10) / 0x20 * 0x20;/* Šp“x‚ð‚Q‹’µ‚тɊۂ߂é */
pPin->direct_angle = ROT_NORM(pPin->direct_angle);
if (pPin->base_speed > SPIN_HAPPEN_SPEED) {
if (ROT_NORM2(pPin->direct_angle) > 0x200) {
pPin->angle_step = 0x100 / time_slice;
} else if (ROT_NORM2(pPin->direct_angle) > 0x100) {
pPin->angle_step = 0x80 / time_slice;
} else if (ROT_NORM2(pPin->direct_angle) < -0x200) {
pPin->angle_step = -0x100 / time_slice;
} else if (ROT_NORM2(pPin->direct_angle) < -0x100) {
pPin->angle_step = -0x80 / time_slice;
}
}
}
dist = (PIN_HEIGHT - PIN_G) * rsin(pPin->rotate) * rsin(pPin->angle) / ONE;
dist = abs(dist);
if (pPin->pos.vz > (LANE_END-dist)) {
/* ‰œ’[ */
pPin->pos.vz = (LANE_END-dist);
pPin->base_speed = 0;
pPin->base_accel = 0;
}
}
return 0;
}
/*-----------------------------
0x571200#
_D16, /*「確実に記録を残せるようにがんばるか」*/
FGT_D17, /*「あまり無理はしないと話しておりました」*/
};
static short gl_F_intro13[] = {
/*締め*/
FGT_D21, /*「確実に記録を残すのか、それとも冒険に挑むのか」*/
FGT_D22, /*「自分で満足のいく結果を残せるようがんばってもらいたい」*/
// FGT_D23,// 未使用 /*「記録無しで終わってしまうようなことがないようにトライするか」*/
FGT_D24, /*「すべてを捨てる覚悟というものが、あってもよいのかもしれません」*/
FGT_D25, /*「地の果てまで樽を飛ばしてしまいそうな雰囲気であります」*/
FGT_D26, /*「さあ、この体格でどんな記録を出してくれるのか」*/
FGT_D27, /*「気合い充分、スカッと一発、投げ飛ばしてもらいましょう」*/
};
static short gl_F_intro20[] = {
/*2回目以降の最初、選手名は呼ばない*/
FK4_A00, /*「集中力は持続しています」「(選手名)」*/
FK4_A01, /*「これは目が離せません」「(選手名)」*/
FK4_A02, /*「見せ場をわきまえています」「(選手名)」*/
FK4_A03, /*「まるで精密機械のようです」「(選手名)」*/
FK4_A04, /*「もう止まりません」「(選手名)」*/
FK3_C00, /*「気分的に余裕が感じられます」*/
FK3_C01, /*「まだ余裕を感じます」*/
FK3_C02, /*「大胆な攻めを見せて欲しい」*/
FK3_C03, /*「強気な攻めも必要だ」*/
FK3_C04, /*「緊張しすぎないようにして欲しい!」*/
FK3_C05, /*「緊張しすぎないようにコントロールしなくてはいけません」*/
FK3_C06, /*「緊張しすぎないように自らをコントロールしなくてはいけません」*/
};
0x57AA00#
amera_kind = mode;
}
void po_view_no_set(short camera_no)
{
PO_VIEW_W *view_w;
view_w = &po_view_w;
view_w->camera_no = camera_no;
}
#if 0 /* 今は使ってない */
static void po_view_value_set(PO_VIEW_DATA data)
{
sp_w;
sp->rview.vrx = data.vrx;
sp->rview.vry = data.vry;
sp->rview.vrz = data.vrz;
sp->rview.vpx = data.vpx;
sp->rview.vpy = data.vpy;
sp->rview.vpz = data.vpz;
}
#endif
static short po_view_projection_interpolate(short total_time)
{
sp_w;
PO_VIEW_W *view_w;
view_w = &po_view_w;
sp->projection = view_w->prev_pro + (view_w->next_pro - view_w->prev_pro) * view_w->timer / total_time;
GsSetProjection(sp->projection);
return 0;
}
static short po_view_interpolate(short total_time)
{
sp_w;
PO_VIEW_W *view_w;
view_w = &po_view_w;
sp->rview.vrx = view_w->prev.vrx + (view_w->next.vrx - view_w->prev.vrx) * view_w->timer / total_time;
sp->rview.vry = view_w->prev.vry + (view_w->next.vry - view_w->prev.vry) * view_w->timer / total_time;
sp->rview.vrz = view_w->prev.vrz + (view_w->next.vrz - view_w->prev.vrz) * view_w->timer / total_time;
sp->rview.vpx = view_w->prev.vpx + (view_w->next.vpx - view_w->prev.vpx) * view_w->timer / total_time;
sp->rview.vpy = view_w->prev.vpy + (view_w->next.vpy - view_w->prev.vpy) * view_w->timer / total_time;
sp->rview.vpz = view_w->prev.vpz + (view_w->next.vpz - view_w->prev.vpz) * view_w->timer / total_time;
view_w->timer++;
if (view_w->timer > total_time) {
view_w->timer = 0;
return 1;
} els
0x582200#
%= ONE;
}
if (sp->joyw[1].joy_w & P_LRIGHT) {
t_angle1 += ROTATE_QUANT;
t_angle1 %= ONE;
}
if (sp->joyw[1].joy_w & P_LLEFT) {
t_angle1 -= ROTATE_QUANT;
t_angle1 %= ONE;
}
if (sp->joyw[1].joy_w & P_TR) {
t_distance -= TRANS_QUANT;
} else if (sp->joyw[1].joy_w & P_TL) {
t_distance += TRANS_QUANT;
}
if (t_angle0 > 0x380) t_angle0 = 0x380;
if (t_angle0 < -0x380) t_angle0 = -0x380;
tmp_dist = t_distance * rcos(t_angle0) / ONE;
sp->rview.vrx = sp->rview.vpx - tmp_dist * rcos(t_angle1) / ONE;
sp->rview.vry = sp->rview.vpy - t_distance * rsin(t_angle0) / ONE;
sp->rview.vrz = sp->rview.vpz + tmp_dist * rsin(t_angle1) / ONE;
} else { /* 視点のみの移動 */
if (sp->joyw[1].joy_w & P_LUP) {
t_angle0 -= ROTATE_QUANT;
t_angle0 %= ONE;
}
if (sp->joyw[1].joy_w & P_LDOWN) {
t_angle0 += ROTATE_QUANT;
t_angle0 %= ONE;
}
if (sp->joyw[1].joy_w & P_LRIGHT) {
t_angle1 -= ROTATE_QUANT;
t_angle1 %= ONE;
}
if (sp->joyw[1].joy_w & P_LLEFT) {
t_angle1 += ROTATE_QUANT;
t_angle1 %= ONE;
}
if (sp->joyw[1].joy_w & P_TR) {
t_distance -= TRANS_QUANT;
} else if (sp->joyw[1].joy_w & P_TL) {
t_distance += TRANS_QUANT;
}
if (t_angle0 > 0x380) t_angle0 = 0x380;
if (t_angle0 < -0x380) t_angle0 = -0x380;
tmp_dist = t_distance * rcos(t_angle0) / ONE;
sp->rview.vpx = sp->rview.vrx + tmp_dist * rcos(t_angle1) / ONE;
sp->rview.vpy = sp->rv
0x588C00#
E, // 初期化とステージ読み込み
GL_PRE, // 競技前演出
GL_ORDER, // 競技順表示
GL_CHALLENGE, // 高さ決定デモ
GL_THROW_INIT, // 人読み込み
GL_THROW_PRE, // 選手紹介
GL_THROW_SET_H, // 投擲条件設定(高さ)
GL_THROW_READY, // 樽取り演出
GL_THROW_SET_P, // 投擲条件設定(位置)
GL_THROW_MAIN, // 投擲
GL_THROW_PSEUDO, // COMスキップ時の結果算出用
GL_THROW_RESULT, // 結果
GL_REPLAY_INIT, // リプレイ用初期化
GL_REPLAY_AUTO, // 自動リプレイ
GL_REPLAY_MANUAL, // 手動リプレイ
GL_REPLAY_SAVE, // リプレイセーブ
GL_THROW_END, // 投擲終了演出
GL_THROW_OVER, // 競技終了演出
GL_GAME_CHECK, // 投擲後の色々判定
GL_RESULT, // 表彰
GL_TERMINATE, // 後始末
GL_RESTORE, // やり直し時の初期化
};
static int (*GL_func[])() = {
GL_initialize, // 初期化とステージ読み込み
GL_pre, // 競技前演出
GL_order, // 競技順表示
GL_challenge, // 高さ決定デモ
GL_throw_init, //
0x590C00#
//break;
case 1: // フェードイン待ち
if ( MenuFadeIn( 256/8 ) && glw.high.state == HIGH_MOVE0 )
gstep_up();
break;
case 2:
// 高さ決定処理
if ( gl_subfunc[glw.step0 = GLs_SELECT_HEIGHT]() )
{
// 決定したので次に
glw.step1 = glw.step2 = 0;
glw.time0 = glw.time1 = glw.time2 = 0;
// モーションを進める
glw.count = 1;
gl_gageOff_Height();
gstep_up();
}
break;
case 3: // モーション終了待ち
// ココは、すぐ下のplayerSelectHeight()で抜けていく
break;
case 4: // フェードアウト待ち
if ( MenuFadeOut( 256/12, 0 ) )
gstep_up();
break;
default:
// 記録付き選手名非表示
SetG2dName03( &s->classw[CLS_HUMAN], OFF );
// 獲得ポイント非表示
SetG2dPoint03( &s->classw[CLS_HUMAN], OFF );
// 競技形式別の跳び先を決定
sstep_set( GL_THROW_READY ); // ここに来たら、次は必ず樽取り演出に飛ぶ
sp->gstepw = 0;
}
if ( playerSelectHeight() )
{
gstep_set( 4 );
// 実況クリア
SD_call( SD_CTL_XAKILL );
}
TVcam
0x596A00#
gstep_up();
}
break;
default:
// カメラ停止
TVcamAutoStop();
CheerCall( CHEER_STOP );
// 競技形式別の跳び先を決定
sstep_set( GL_GAME_CHECK );
sp->gstepw = 0;
glw.gtime = 0;
}
// フェード終了から、モーションスタートして、ケツで停止
if ( sp->gstepw > 1 && !Pose_IsTail03( &s->classw[CLS_HUMAN] ) )
Pose_Change( &s->classw[CLS_HUMAN] );
TVcamSetPosition(); // 自前カメラをメイン側に設定する
return ( 0 );
}
// 投擲後の色々判定
//===================
static int GL_game_check( void )
{
sp_w;
sys_w;
// 競技形式別の跳び先を決定
switch ( glw.play_type )
{
case PLAY_TYPE_MUSCLE:
// まだ生きてる?
if ( glw.status == PLAYER_STATUS_JOIN )
{
// 成功して且つ一周してたらORDERへ、でなければ次の選手
if ( PlayerGetThrowN() == 0 && PlayerIsLast() )
{
glw.try_n++;
// COM競技見ないで残り全員CPUならORDERには行かない
if ( OP_CP && PlayerHumanN() == 0 )
sstep_set( GL_THROW_INIT );
else
sstep_set( GL_ORDER );
} else
sstep_set( GL_THROW_INIT );
} else
{
// まだ残り選手が居る?
if ( PlayerCheckNum() )
{
// 一周したか?
if ( PlayerIsLast() )
{
glw.try_n++;
// COM競技見ないで残り全員CPUならORDERには行かない
if ( OP_CP && PlayerHumanN() == 0 )
sstep_set( GL_THROW_INIT );
else
sstep_set( GL_ORDER );
} else
sstep_set( GL_THROW_INIT );
} else
sstep_set( GL_ORDER );
}
break;
case PLAY_TYPE_PRACTICE:
sstep_set( GL
0x5A3E00#
);
}
break;
case 5: /* Work Init etc. */
AllWork_Clear(0); /* <other.c> */
Screen_Set2(512, 240); /* 解像度設定 */
ligit_init(); /* ライト再設定 */
View_Init(); /* <camera.c> */
sp->projection = B50M_PROJECTION;
GsSetProjection(sp->projection); /* プロジェクション変更 */
sp->clear_fg = 0;
sp->fade_fg = ON;
gstep_up();
break;
case 6:
/* アナウンサー用テクスチャをVRAMに転送 */
tim_trans((TIM_W *)A_TIM_TABLE[0],0); /* Text
0x5AAE00#
case 3:
g_MAEjun(1,1);
if (MenuFadeIn(32)){
gstep_up();
}
break;
case 4:
g_MAEjun(1,1);
if (b50m_keychk_trg(P_RRIGHT,0)){
gstep_up();
}
break;
case 5:
g_MAEjun(1,1);
if (MenuFadeOut(32,0)){
SD_call(SD_CTL_FADEOUTX);
gstep_up();
}
break;
case 6:
if (g_MAEjun(0,1)){
gstep_set(0);
sstep_up();
}
break;
default:
break;
}
// NOWGAME = 4;
return 0;
}
/* --------------------
0x5B6850#
{
mw.io = 2;
tno = (msg==MES_FORMAT1)?MES_NOWFM: /* フォーマット中 */
(msg==MES_NOWLD )?MES_NOWLD: /* ロード中 */
(msg==MES_LDYN )?MES_NOWLD: /* ロード中 */
MES_NOWSV; /* セーブ中 */
SetMsg( 1, MSG_1, mess[tno].sno, mess[tno].cur, 0 );
}
else
{
mw.mstep = 1;
}
break;
case 0xff:
ret = 1;
break;
}
set_spr_cpal( MSG_C );
return ret;
}
/* eof */
p = bm_mot_stan1+Random(4);
tmp = 3;
Pose_Set(cls,tmp,0);
bm_pwork[no].step++;
ret = 1;
break;
}
cls->xposi-=10;
break;
case 4:
Pose_Change(cls);
ret = 1;
break;
default:
break;
}
return (ret);
}
static int intro_func01(CLASS_W *cls, int no)
{
B50M_PLYR_WORK *p = &bm_pwork[no];
int ret = 0;
switch (bm_pwork[no].step){
case 0:
cls->xposi = START_LINE;
Pose_Set(cls,bm_mot_r2b,0);
bm_rgauge[no].spd = ROT_SPD_MIN;
p->step++;
break;
case 1:
if (cls->pose < R2B_FRAME){
Pose_Change(cls);
}else{
if (player_move(no)){
Pose_Set(cls,bm_mot_back,0);
p->step++;
}
}
break;
case 2:
if (player_move(no)){
Pose_Set(cls,bm_mot_stan1,0);
p->timer = 30*1;
p->step++;
}
break;
case 3:
Pose_Change(cls);
if (--p->timer < 0){
bm_Pose_TInit(no,bm_mot_s2w,bm_mot_walk1);
p->step++;
}
break;
case 4:
cls->xposi -= 10;
if ((bm_Pose_Trans(no) == 2) && (cls->xposi < START_LINE+30*4)){
bm_Pose_TInit(no,bm_mot_w2s,bm_mot_stan1);
p->step++;
}
break;
case 5:
if (bm_Pose_Trans(no)){
p->timer = 30*1;
p->step++;
ret = 1;
break;
}
cls->xposi -= 10;
break;
case 6:
if (--p->timer < 0){
Pose_Set(cls,bm_mot_r2b,0);
p->step = 1;
}
break;
}
return (ret);
}
static int intro_func02(CLASS_W *cls, int no)
{
int ret = 0;
B50M_PLY
0x5BD200#
FY,13,0,9,1);
set2d_BA(SNo_NUM11,0x200a,MODE16,0x0b4 +NUM_OFX,0xa8 +NUM_OFY,13,0,9,1);
/* 2Pタイム */
set2d_BA(SNo_NUM12,0x200a,MODE16,0x144 +NUM_OFX,0xa8 +NUM_OFY,13,0,9,1);
set2d_BA(SNo_NUM13,0x200a,MODE16,0x14e +NUM_OFX,0xa8 +NUM_OFY,13,0,9,1);
set2d_BA(SNo_NUM14,0x200a,MODE16,0x16a +NUM_OFX,0xa8 +NUM_OFY,13,0,9,1);
set2d_BA(SNo_NUM15,0x200a,MODE16,0x174 +NUM_OFX,0xa8 +NUM_OFY,13,0,9,1);
/* デジタル */
set2d_BA(SNo_NUM16,0x2014,MODE16,0x0d4 +NUM_OFX,0x9e +NUM_OFY,13,0,9,1);
set2d_BA(SNo_NUM17,0x2014,MODE16,0x0e6 +NUM_OFX,0x9e +NUM_OFY,13,0,9,1);
set2d_BA(SNo_NUM18,0x2014,MODE16,0x10a +NUM_OFX,0x9e +NUM_OFY,13,0,9,1);
set2d_BA(SNo_NUM19,0x2014,MODE16,0x11c +NUM_OFX,0x9e +NUM_OFY,13,0,9,1);
}
static void set_cellophane()
{
POLY_F4 *p;
POLY_F4 poly;
POLY_F3 p3;
sp_w;
sys_w;
SPD_W *spd;
CLASS0_W *cls;
GsBOXF box;
Ushort theta,theta2;
short radius,x0,x1,x2,y0,y1,y2;
int i;
p = &poly;
SetPolyF4(p);
SetShadeTex(p,0);
SetSemiTrans(p,0);
setRGB0(p,0,0,0);
if (s->classw0[SNo_TIME].kind){
/* TIMEゲージ */
spd = (SPD_W*)s->classw0[SNo_TIME].chara;
cls = &s->classw0[SNo_TIME];
setXYWH(p,cls->xposi+spd->offset_x,cls->yposi+spd->offset_y,100,20);
GsSortPoly(p,&SepOT[0].ot[sp->active_side],20);
}
/* 回転ゲージ1 */
SetPolyF3(&p3);
SetSemiTrans(&p3,0);
setRGB0(&p3,0,0,0);
if (s->classw0[SNo_SPDM1].kind){
spd = (SPD_W*)s->classw0[SNo_SPDM1].chara;
cls = &s->classw0[SNo_SPDM1];
theta = 0;
theta2 = 256;
radius = 32;
x
0x5C1E00#
0130866,0x00551937,0x00754c66,0x00300473,0x00641126,
0x003808b3,0x004cbb04,0x006200df,0x00710867,0x00451826,0x00310866,0x00300473,0x00645562,
0x00a111ba,0x0047f770,0x009ffffd,0x0025d572,0x00677e62,0x006555f3,0x00211572,0x00463320,
0x00000000,0x00000880,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00044440,
/* FG:white, BG:transparent */
0x7fff0000,0x7fff0000,0x7fff0000,0x7fff0000,0x7fff0000,0x7fff0000,0x7fff0000,0x7fff0000,
0x00000000,0x7fff7fff,0x00000000,0x7fff7fff,0x00000000,0x7
0x5CAD00#
o 下
#else
{END,0x10,0x10,0x90,0xf0,0x0050,0xfff3,0x04}, // P
#endif
};
SPD_W _data4_spd[]={ /* データ情報4 */
// パンチアウト パンチアウト EX
{END,0x28,0x08,0x58,0x08,0x0033,0xfff8,0x04}, // "レーン"
// ナインフープス
{END,0x10,0x10,0x00,0x30,0x0036,0xffy, real_ability, lucky, difficulty, result;
CLASS_W *cls;
NH_GAME_W *work;
NH_BALL_W *pBall;
NH_THEORY_DATA *pTheory;
cls = &s->classw[0];
work = &nh_game_w;
pBall = &nh_ball_w;
/* リングを狙う立ち位置と方向に関するセオリー */
pTheory = &theory_data[work->version][work->target_no];
cpu_skip = 0;
if (cls->cpu) { /* CPU思考ルーチン */
JOY_W = 0;
JOY_TRG = 0;
JOY_NTRG = 0;
if ((sp->joyw[0].joytrg & P_RRIGHT) && (sp->step2 < 2)) cpu_skip = 1;
switch (cls->step0) {
cas
0x5E7600#
,0x003e,0x000c,0x4d},
};
SPD_W kiroku_2_spd[]={
/* ccode,xsize,ysize,u,v,offset_x,offset_y palette */
{DAT,0x28,0x18,0xa0,0x18,0xffb3,0x001e,0x4d},
{DAT,0x28,0x18,0xc8,0x18,0xffd8,0x001e,0x4d},
{DAT,0x28,0x18,0x00,0x00,0x0004,0x001e,0x4d},
{DAT,0x28,0x18,0x80,0xa0,0x002b,0x001e,0x4d},
{END,0x10,0x18,0x70,0xd8,0x0051,0x001e,0x4d},
};
Ulong em_01_spd[] = {
(Ulong)parfect_spd, /* 0x1000 パーフェクト達成 */
(Ulong)target_1_spd, /* 0x1001 ターゲット宣言 */
(Ulong)get_1_spd, /* 0x1002 ゲット
0x5F7200#
------------------------------------
リングをバブルソートする際に使用するスワップ関数
--------------------------------------------------------------------*/
static void swap(NH_RING_W *value1, NH_RING_W *value2)
{
NH_RING_W tmp;
/* リングワーク変数をスワップ */
tmp = *value1;
*value1 = *value2;
*value2 = tmp;
}
static short vector_normalize(VECTOR *in_vec, VECTOR *out_vec)
{
long min = 0x7fffffff;
if (min > abs(in_vec->vx) && in_vec->vx != 0) min = abs(in_vec->vx);
if (min > abs(in_vec->vy) && in_vec->vy != 0) min = abs(in_vec->vy);
if (min > abs(in_vec->vz) && in_vec->vz != 0) min = abs(in_vec->vz);
if (min == 0x7fffffff) min = 1;
out_vec->vx = in_vec->vx / min * ONE;
out_vec->vy = in_vec->vy / min * ONE;
out_vec->vz = in_vec->vz / min * ONE;
return 0;
}
#endif
0x5FBA00#
-----------*/
//static void nh_view_value_set(NH_VIEW_DATA data);
static short nh_view_projection_interpolate(short total_time);
//static short nh_view_interpolate(short total_time);
static short nh_view_rot_interpolate(short total_time);
//static void nh_view_xyz_to_polar(short *rot0, short *rot1, short *distance);
static void nh_view_polar_to_xyz1(short *rot0, short *rot1, short *distance);
//static void nh_view_polar_to_xyz2(short *rot0, short *rot1, short *distance);
static void nh_view_intro(void);
static void nh_view_enter(void);
static void nh_view_kongoh_up(void);
static void nh_view_select_ring(void);
static void nh_view_declare(void);
static void nh_view_set_pos(void);
static void nh_view_shoot(void);
static void nh_view_ball(void);
static void nh_view_backboard(void);
static void nh_view_success(void);
static void nh_view_miss(void);
static void nh_view_good_result(void);
static void nh_view_perfect(void);
static void nh_view_bad_result(void);
static void nh_view_final_demo(void);
static void nh_view_bustup(void);
static void nh_view_forced_replay(void);
static void nh_view_free_replay(void);
static void nh_view_no1(void);
static void nh_view_konami(void);
#if NH_VIEW_TEST
static void nh_view_test(void);
#endif
static void (*nh_view[])(void) = {
nh_view_intro,
nh_view_enter,
nh_view_kongoh_up,
nh_view_select_ring,
nh_view_declare,
nh_view_set_pos,
nh_view_shoot,
nh_view_ball,
nh_view_backboard,
nh_view_success,
nh_view_miss,
nh_view_good_
0x603C00#
FntPrint("%d FRAME\n", nh_test_frame);
FntPrint("CAMERA TEST\n");
if (view_w->step == 0) {
nh_view_test_init();
} else {
switch (flg) {
case 0: nh_view_test_camera_move(); break;
case 1: nh_view_test_camera_play(); break;
case 2: nh_view_test_camera_menu(); break;
}
for (i=0; i<index; i++) FntPrint("MARK %d [%dFRAME]\n", i, frame_no[i]);
}
}
static void nh_view_test_init(void)
{
sp_w;
NH_VIEW_W *view_w;
view_w = &nh_view_w;
t_distance = (sp->rview.vrx - sp->rview.vpx) * (sp->rview.vrx - sp->rview.vpx);
t_distance += (sp->rview.vrz - sp->rview.vpz) * (sp->rview.vrz - sp->rview.vpz);
tmp_dist = t_distance;
t_distance += (sp->rview.vry - sp->rview.vpy) * (sp->rview.vry - sp->rview.vpy);
t_distance = SquareRoot0(t_distance);
tmp_dist = SquareRoot0(tmp_dist);
t_angle0 = ratan2(sp->rview.vpy-sp->rview.vry, tmp_dist);
t_angle1 = ratan2(sp->rview.vrz-sp->rview.vpz, sp->rview.vpx-sp->rview.vrx);
nh_test_frame = 0;
view_w->step++;
}
static void
0x611A00#
汲ェ向かったその先にはリングが全くなかった」*/
FN_F15, /*「残念ながらボールはリングまで届いておりません」*/
FN_F16, /*「まだリングまでの距離がありました」*/
FN_F13, /*「狙いがそれて、ボールは大きく外れてバックボードの上をとおります」*/
FN_F14, /*「狙いが狂ったか、ボールは大きく外れてバックボードの脇を通ってしまいました」*/
};
/*リプレイ後の一言*/
static short furu_rep_end[] = {
FK1_D00, /*「さあ」*/
FK1_D01, /*「それでは」*/
FK1_D03, /*「競技に戻ります」*/
FK1_D04, /*「競技に戻りましょう」*/
};
static void furu_speak_replay(void)
{
Uchar prev_hit, hit, lucky_chk;
short rnd;
NH_GAME_W *work;
work = &nh_game_w;
prev_hit = (work->ring_hit&0xf0)>>4;
hit = work->ring_hit & 0x0f;
lucky_chk = 0;
SD_call(FK1_E02); /* 一呼吸おく */
SD_call(FK1_E01); /* 一呼吸おく */
if (work->success & 0x10) { /* 成功 */
if (prev_hit != 0)
/* 2つ以上のリングを経由して成功 */
lucky_chk = 1;
if ((hit != 0) && (hit != (work->success & 0x0f) + 1))
/* 直前に当たったリングと成功したリングが違う */
lucky_chk = 1;
if (lucky_chk && Random(10) < 8) { /* 運に救われた */
SD_call(furu_rep_get[Random(3)]);
} else if ((work->success & 0x0f) == work->target_no) { /* 宣言通り */
rnd = Random(25);
if (rnd < 2) SD_call(FK2_F01 + (work->success & 0x0f));
SD_call(furu_rep_declare_get[rnd]);
} else { /* 宣言とは違うリングへ */
if (work->backboa
0x619200#
SPD_NUM01, /* */
SPD_NUM02, /* */
SPD_NUM03, /* */
SPD_NUM04, /* */
SPD_NUM05, /* */
SPD_NUM06, /* */
SPD_NUM07, /* */
SPD_NUM08, /* */
SPD_NUM09, /* */
SPD_NUM10, /* */
SPD_NUM11, /* */
SPD_NUM12, /* */
SPD_NUM_UNIT, /* */
};
/* ---------- ゲームステップ ---------- */
enum {
NINEHOOPS_INIT,
NINEHOOPS_INTRO,
NINEHOOPS_MAIN,
NINEHOOPS_RESULT,
};
enum {
NH_ENTER,
NH_MAIN,
NH_RESULT,
NH_RANKING,
};
enum {
SELECT_RING_STEP,
SHOOT_STEP,
FORCED_REPLAY_STEP,
RESULT_STEP,
REPLAY_STEP,
FINAL_DEMO_STEP,
};
/* ---------- ボールのステータス---------- */
enum {
BEFORE_SHOOT, /* 投球前 */
BALL_MOVE, /* 転がってる */
BALL_STOP, /* 止まってる */
};
/* ---------- カメラワーク ---------- */
enum {
CAMERA_INTRO,
CAMERA_ENTER,
CAMERA_KONGOH_UP,
CAMERA_SELECT_RING,
CAMERA_DECLARE,
CAMERA_SET_POS,
CAMERA_SHOOT,
CAMERA_BALL,
CAMERA_BACKBOARD,
CAMERA_SUCCESS,
CAMERA_MISS,
CAMERA_GOOD_RESULT,
CAMERA_PERFECT,
CAMERA_BAD_RESULT,
CAMERA_FINAL_DEMO,
CAMERA_BUSTUP,
CAMERA_FORCED_REPLAY,
CAMERA_FREE_REPLAY,
CAMERA_NO1,
CAMERA_KONAMI,
CAMERA_TEST,
};
/* ---------- キャラモーション ---------- */
enum {
MOT_WALK, /* ??? 35 */
MOT_ENTER1, /* 入場 26 */
MOT_STOP1, /* 入場→ニュートラル 30 */
MOT_ENTER2, /* 入場 35 */
MOT_STOP2, /* 入場 30 */
M
0x623600#
L録表示
初期表示と演出
in: short num:何球成功したのか(0~9)
out: ==0: 処理中 ==1:終了
***************************************************************************/
int SetG2dResult01( short num )
{
sp_w;
sys_w;
SPD_W* spd;
if ( !TRANS_STEP ){ /*パターン初期表示*/
set2d( G_CLS_EM_B, SPD_EM01_RESULT1, MODE16, 0,0, 12, 0, 10, 1 );
set2d( G_CLS_EM_A, SPD_EM01_RESULT2, MODE16, 0,0, 12, 0, 10, 0 );
em01_act[0].step = 0;
em01_act[0].cls = G_CLS_EM_B;
em01_act[0].func = Em01_f
0x631D00#
=======================================================================
// 選択項目 表示初期位置設定
//------------------------------------------------------------------------------
// パラメータ
// cno : 選択項目登録パーツ番号
// sno : 選択項目SPD番号
>entry_no] ){
case CR_KNE:
case CR_OSA:
case CR_KON:
set2d(G_CLS_NAME02,SPD_NAM_00+entrybox[cls->entry_no],MODE16,0x0032,0x0052,10,0,10,1);
break;
default:
set2d(G_CLS_NAME02,SPD_NAM_00+entrybox[cls->entry_no],MODE16,0x0032,0x0052,11,0,10,1);
break;
}
}else{
set2d(G_CLS_NAME02,SPD_NAME03,MODE16,0,0,10,0,10,1); /*選手名*/
disp2dName( G_CLS_NAME02, 0, s->edit_head[entrybox[cls->entry_no]-CR_ED1].name ); /*名前を変える*/
}
}
#undef PLT_TYPE_V
#undef PLT
0x638400#
\..\inc\mr_cmn2.h"
#include "..\..\inc\sd_ouen2.h"
#include "..\..\inc\g2d.h"
/* ---------------------------------------------------------
ローカル include
--------------------------------------------------------- */
#include "b50m.h"
#include "d_font4.h"
#include "replay.h"
#include "player4.h"
#include "effect04.h"
#include "prot04.h"
#define TAIKENBAN 0
#define NOWGAME (sp->ModSel.game)
#define RISE_F_THETA (3072)
#define RISE_H_THETA (0)
#ifndef PD_AB_BA
#define PD_AB_BA PD_AB_TW
#endif /* PD_AB_BA */
/* ---------------------------------------------------------
prototype
--------------------------------------------------------- */
static int b50m_init(void);
static int b50m_opening(void);
static int b50m_list(void);
static int b50m_plyrinfo(void);
static int b50m_chara(void);
static int b50m_intro(void);
static int b50m_pre(void);
static int b50m_main(void);
static int b50m_result(void);
static int b50m_replay(void);
static int b50m_operate(void);
static int b50m_s
0x63FA00#
b50mw.save_flg = 0;
b50mw.false[0] = 0;
b50mw.false[1] = 0;
b50mw.dash[0] = 0;
b50mw.dash[1] = 0;
bm_camera.step = 0;
bm_camera.timer = 0;
ReplayInitJoy();
// crush_random_init();
cpu_key_input(0,0);
speak04_main(0); /* 実況ワーククリア */
clap = 0;
gstep_up();
break;
case 2:
bm_Pose_Trans2();
#if B50M_DEVELOP
if (b50m_keychk_trg(P_RRIGHT,0)){
gstep_up();
for (i=0; i<PLAYER_NUM; i++){
if (b50mw.joy[i] == 0){
continue;
}
k = bm_mot_ready;
if (cls[i]->anime_no == bm_mot_post1){
j = bm_mot_p2r1;
}else{
if (sp->chara[i] != PNo_KONGO){
j = bm_mot_p2r2;
}else{
j = bm_mot_p2rk;
k = bm_mot_readk;
}
}
bm_Pose_TInit(i,j,k);
SD_call(SD_14_VOICE);
}
B50M_TIMER = 0;
}
#else
if (--B50M_TIMER < 0){
for (i=0; i<PLAYER_NUM; i++){
if (b50mw.joy[i] == 0){
continue;
}
k = bm_mot_ready;
if (cls[i]->anime_no == bm_mot_post1){
j = bm_mot_p2r1;
}else{
if (sp->chara[i] != PNo_KONGO){
j = bm_mot_p2r2;
}else{
j = bm_mot_p2rk;
k = bm_mot_readk;
}
}
bm_Pose_TInit(i,j,k);
}
B50M_TIMER = 0;
SD_call(SD_14_VOICE);
gstep_up();
}
#endif
break;
case 3: /* よ~い */
if (disp_ready(0)){
loop = 3; /* 仮 */
gstep_up();
break;
}
for
0x645E10#
0,0x10,0x70,0xd0,0x0040,0xffcc,0x03},
{DAT,0x10,0x10,0x70,0x50,0x004c,0xffcc,0x03},
{DAT,0x10,0x10,0x20,0xd0,0x0058,0xffcc,0x03},
{DAT,0x10,0x10,0x70,0xf0,0x0067,0xffcc,0x03},
{DAT,0x10,0x10,0x60,0xd0,0x0076,0xffcc,0x03},
{DAT,0x10,0x10,0x20,0x20,0x001f,0xffd9,0x2b}, // セーブ・ロード
{DAT,0x10,0x10,0x00,0x00,0x0027,0xffd9,0x2b},
{DAT,0x10,0x10,0x50,0x20,0x002f,0xffd9,0x2b},
{DAT,0x10,0x10,0x40,0x00,0x0037,0xffd9,0x2b},
{DAT,0x08,0x10,0x68,0x70,0x0042,0xffd9,0x2b},
{DAT,0x10
0x64DA00#
= z + SHADOW_RADIUS * SquareRoot0(r1/2)/2;
#endif
PushMatrix();
{
SetRotMatrix(&GsWSMATRIX);
SetTransMatrix(&GsWSMATRIX);
otz = RotAverage4(&vec[0],&vec[1],&vec[2],&vec[3],&xy[0].l,&xy[1].l,&xy[2].l,&xy[3].l,&p,&flg);
otz >>= (14 - OT_LENGTH);
setXY4(poly2,xy[0].s.x,xy[0].s.y,
xy[1].s.x,xy[1].s.y,
xy[2].s.x,xy[2].s.y,
xy[3].s.x,xy[3].s.y
);
GsSortPoly(poly2,&SepOT[0].ot[sp->active_side],otz);
}
PopMatrix();
}
}
/* ---------------------------------------------------------
static long get_shadow_add(int no)
モーション別の影幅増加分を計算
--------------------------------------------------------- */
static long get_shadow_add(int no)
{
short p,min,max;
int i;
// sys_w;
b50m_cls;
min = +30000;
max = -30000;
for (i=KARADA2; i<L_ASHI+1; i++){
p = cls[no]->obj3D_w[PARTS_BODY].pCoordSect[i].workm.t[0];
if (p > max){
max = p;
}
if (p < min){
min = p;
}
}
p = abs(max - min)/2 - SHADOW_RADIUS/2;
if (p < 0){
p = 0;
}
return p;
}
static void b50m_shadow_sub(POLY_FT4 *poly, SVECTOR *vec)
{
sp_w;
long p,flg,otz;
KAGE_LXY xy[4];
PushMatrix();
SetRotMatrix(&GsWSMATRIX);
SetTransMatrix(&GsWSMATRIX);
otz = RotAverage4(vec,vec+1,vec+2,vec+3,&xy[0].l,&xy[1].l,&xy[2].l,&xy[3].l,&p,&flg);
otz >>= (14 - OT_LENGTH);
setXY4(poly,xy[0].s.x,xy[0].s.y,
xy[1].s.x,xy[1].s.y,
xy[2].s.x,xy[2].s.y,
xy[3].s.x,xy[3].s.y);
GsSort
0x654E00#
d_BA(SNo_NUM17,0x2014,MODE16,0x0e6 +NUM_OFX,0x9e +NUM_OFY,13,0,9,1);
set2d_BA(SNo_NUM18,0x2014,MODE16,0x10a +NUM_OFX,0x9e +NUM_OFY,13,0,9,1);
set2d_BA(SNo_NUM19,0x2014,MODE16,0x11c +NUM_OFX,0x9e +NUM_OFY,13,0,9,1);
}
static void set_cellophane()
{
POLY_F4 *p;
POLY_F4 poly;
POLY_F3 p3;
sp_w;
sys_w;
SPD_W *spd;
CLASS0_W *cls;
GsBOXF box;
Ushort theta,theta2;
short radius,x0,x1,x2,y0,y1,y2;
int i;
p = &poly;
SetPolyF4(p);
SetShadeTex(p,0);
SetSemiTrans(p,0);
setRG
0x65C600#
オーバーチェック */
if(sh->restpanel>sh->restballnum)
{
sh->gameover=1;
}
Sh_Point_Calc(); /* 得点計算 */
return;
}
/*----------------------------------------------*/
/* リプレイ操作 */
/*----------------------------------------------*/
void Sh_Replay_Operation(void)
{
sp_w;
u_short joy_t = sp->joyw[0].joytrg; /*いっかい*/
//u_short joy_w = sp->joyw[0].joy_w; /*ずっと*/
int ret;
#if 0
if((*sh->joy_w[0] & P_TL) && (sh->r.pbcnt>2)){sh->r.pbc
0x662C00#
JOB(entrybox[cls->entry_no]) );
set2d( G_CLS_IT_JOB, SPD_JOB_00+PD_JOB(entrybox[cls->entry_no]), MODE16, 0,0, 10, 0, 10, 1 ); /*職業表示*/
if ( entrybox[cls->entry_no] < CR_ED1 ){
/*デフォルトの選手名のパターンを表示させる*/
/*テクスチャページのセット*/
switch( entrybox[cls->entry_no] ){
case CR_KNE: /*ケイン*/
case CR_OSA: /*おさる*/
case CR_KON: /*金剛くん*/
tp = 10;
break;
default:
tp = 11;
break;
}
spd = GetSpd( SPD_NAM_00+entrybox[cls->entry_no] );
set2d(G_CLS_IT_NAME,SPD_NAM_00+entrybox[cls->entry_no],MODE16,
name_pos_tbl[ entrybox[cls->entry_no] ]-spd->offset_x,IN_POS_Y-spd->offset_y,tp,0x69,10,1); /*選手名*/
}else{
/*名前の文字数を数える*/
for( tp=0,i=0; i<NAME_LENGTH; i++ ){
if ( s->edit_head[entrybox[cls->entry_no]-CR_ED1].name[i] != F_SPC )
tp++;
}
/*エディット選手の名前を表示させる*/
if ( tp ){
spd = GetSpd(SPD_IT_NAME);
set2d( G_CLS_IT_NAME, SPD_IT_NAME, MODE16, IN_M7_X,0, 10, 0x69, 10, 1 ); /*選
0x681E00#
_Set(int num)
{
sh->fadecol=num;
if(sh->fadecol<0){sh->fadecol=0;} /* 最小値チェック */
if(sh->fadecol>255){sh->fadecol=255;} /* 最大値チェック */
}
/*----------------------------------------------*/
/*フェードアウト */
/*----------------------------------------------*/
int Sh_Fade_Out(int speed)
{
if(!sh->fadestep){Sh_Fade_Set(64);sh->fadestep=1;}
sh->fadecol-=speed;
if(sh->fadecol<1)
{
sh->fadecol=0;
sh->fadestep=0;
return 1;
}
else
{
0x6A2C00#
ヲ現在はダミー */
/*----------------------------------------------*/
void Sh_Debug_Compulsion_Motion(void)
{
sys_w;
Pose_Set2(&s->classw[0],12, 6);
Pose_Set2(&s->classw[1],36,35);
}
/*----------------------------------------------*/
/* 選手紹介 */
/* ※現在はダミー */
/*----------------------------------------------*/
void Sh_Meet_Move(void)
{
sys_w;
if(*sh->joy_w[0] & P_LRIGHT){sh->meetx+=1;}
if(*sh->joy_w[0] & P_LLEFT){sh->meetx-=1;}
if(*sh->joy_w[0] & P_LUP){sh->meety-=1;}
if(*sh->joy_w[0] & P_LDOWN){sh->meety+=1;}
limitRange(sh->meetx,-40,40);
limitRange(sh->meety,-21,24);
}
#if 1
/*----------------------------------------------*/
/* フレーム当たり判定 */
/*----------------------------------------------*/
void Sh_Frame_Hit_Check(void)
{
//sys_w;
int i;
RECT rect1,rect2;
int hit;
int start,end;
int fno;
int sa;
RECT framerect={-1000,-20
0x6AD400#
Sh_Init(1);
sp_gstep_set(SH_FIRST_INIT);
}
break;
}
return 0;
}
/*----------------------------------------------*/
/* 表彰式 */
/*----------------------------------------------*/
int Sh_Ceremony(void)
{
sys_w;
sp_w;
static u_char cnum[8];
static u_short point[8];
static short winnum,motmove; /* 優勝人数,優勝者 */
int i;
switch(sp->step0)
{
case 0: /* sp->step0 */
if(MenuFadeOut(32,0) == 1)
{
Sh_Sound_All_Stop();
Sh_Panel_Init();
// Sh_View_Set(SV_CEREMONY);
s->classw[0].kind=OFF;
/* ボード初期化 */
// SH_setClass1Vec(&s->classw1[SH_OBJ_FRAME1],0,0,0); /* ボード座標初期化 */
// setVector(&s->classw1[SH_OBJ_FRAME1].rot,0,0,0); /* ボード回転初期化 */
sh->dispflg=0; /* 表示消去 */
motmove=0;
sp_step0_up();
}
break;
case 1: /* sp->step0 */
sp_step0_up();
break;
case 2: /* sp->step0 */
g_RankInfo(cnum, point); /* ランキング情報取得 */
winnum=0;
for(i=0;i<entry_num;i++)
0x6BAA00#
OR col;
_SH_XY4 xy4;
POLY_FT4 ft4;
POLY_F4 f4;
u_char twflg; /* トス横角度フラグ */
u_char thflg; /* トス縦角度フラグ */
/* タイマー ※誤って混同しないよう多めに取る */
int compeltimer; /* 強制ステップアップ用タイマー */
int timer[1]; /* 汎用タイマー */
/* ミートカーソル */
short meetx,meety;
/* フラグ */
u_long dispflg; /* 表示フラグ ビット管理[32] */
short fadenum;
/* パワプロゲージ用 */
short pmarkx,pmarky; /* 目標のX,Y */
short downpanelnum;
short downpanel[25]; /* 抜いたパネルナンバー */
/* モーション用 */
short battingmotno;
short motstate[2]; /* モーション状態 */
char batting; /* バッティングをしたか? */
short dispballnum;
short restballnum;
char restpanel;
char clearpanel;
char pitchingnum;
char failurenum;
char gameover;
char parfect;
short pawaofsx,pawaofsy; /* パワプロゲージオフセット */
short emotno; /* モーションナンバー */
char justflg;
char reverse; /* 0:右打ち(左バッターボックス) 1:左打ち */
char fadetype; /* 2Dフェード管理用フラグ */
char fadestep; /* フェードステップ */
short fadecol; /* フェードカラー */
int decx,decy;
short sengenp[2]; /* 宣言パネル */
char sengenflg; /* 二枚抜きフラグ */
char sengenofs; /* 二枚抜き用オフセット */
char extentstep[2]; /* 枠広がりステップ 0:トス枠 1:バッター枠 */
char ann;
char gmode;
/* 0:スイング音 */
/* 1:パネルヒット音 */
/* 2:フレームヒット音 */
/* 3:バットヒット音 */
short se[10]; /* 効果音保存用 */
/* ポイント用 */
short point[3]; /* [0]:全ポイント [1]:昔のポ
0x7C1540#
byte 95
.byte 85
.byte 144
.byte 196
.byte 245
.byte 10
.byte 0
.byte 243
.byte 15
.byte 48
.byte 254
.byte 8
.byte 144
.byte 191
.byte 0
.byte 177
.byte 8
.b
0x829FB0#
m_gmak.bin",
"..\\bin\\anm_ddrp.bin",
"..\\bin\\anm_lsht.bin",
"..\\bin\\a