Taisen Renai Simulation: Trifels Mahou Gakuen is a battle dating simulation game.
Debug Mode#
Use the following code, after that select "はじめから" in title screen to display a debug menu. Select "DEBUG MODE" to switch to next page, select "GAME START" to crash the game.
8005652C 0009
8008BE84 0000
8008BE86 0400
8008BE88 4000
8008BE8A E801
(Source: Original TCRF research)
STAGE START#
Execute some program.
Text |
Notes |
|---|---|
START |
|
AITE |
Set player 2 mode. |
1P PLYAYER |
Player 1 character. |
2P PLYAYER |
Player 2 character. |
DAY |
Date |
TIME |
GOZEN (AM), GOGO (PM), YUUGATA (Afternoon) |
TASK |
Select load program. |
OPT ALBM |
Enable/Disable album viewer in option menu. |
OPT BUTO |
|
ALBM ALL PIC |
Unlock all pictures in album. |
SETUMEI GAL |
Commentary Character. |
Sound Test#
SOUND TEST MODE#
Sound test.
- Circle: SFX test mode.
- Square: Instrument test mode.
- Left, Right: Select file.
- Start: Exit.
- Left, Right: Select number.
- Up, Down: Select menu.
- Circle: Play.
- X: Exit.
XA TEST MODE#
CD-XA test.
- Left, Right: Select number.
- Start: Exit.
Uncompiled Source Code#
|
|
'...But what does it mean?' |
Present in OVR/SL.BIN.
address 0x8000
//==================================================================================
//==================================================================================
// staff.cpp : スタッフロ-ル
//==================================================================================
//==================================================================================
//==================================================================================
// INCLUDE FILES
//==================================================================================
#include "AllInOne.h"
#include "ts_def.h"
#include "gm_ctrl.h"
#include <libpress.h>
#include "ts_movie.h"
#include "
address 0x82B8
ame.h"
#include "se.h"
#include "savedata.h"
#include "staff.h"
#include "stf.def"
//==================================================================================
// DEFINE
//=============================
Present in OVR/FOL.BIN.
address 0x16C00
creenOfA(); // 画面設定:OFF
ClipOff(); // CLIP設定:閉じる
setMmV1(); //
Wx(); // GsClip():設定
// 魔法祭1日目、夕方か?
if( (*syscom==SC_PLY2)&&(stage==ST_SCHOOL)&&(gmday==0) ){
// 武闘大会
// タスク実行
_ButoMain *stb;
stb = NewMt(_ButoMain)(&loop_flg);
while( loop_flg ){
stb->Execute();
Wx();
}
*syscom = SC_DOK;
} else {
// この指止まれ
switch( *syscom ){
case SC_PLY0: gmtime = 0; break;
case SC_PLY1: gmtime = 1; break;
case SC_PLY2: gmtime = 2; break;
}
GameGetPlay();
// タスク実行
_YubiMain *sty;
sty = NewMt(_YubiMain)(&loop_flg);
while( loop_flg ){
sty->Execute();
Wx();
}
// 次のシステム番号設定
#if( 1 )
switch( *syscom ){
case SC_PLY0: *syscom = SC_SIN0; break;
case SC_PLY1: *syscom = SC_SIN1; break;
case SC_PLY2: *syscom = SC_SIN2; break;
#else
switch( *syscom ){
case SC_PLY0: *syscom = SC_ISU; break;
case SC_PLY1: *syscom = SC_ISU; break;
case SC_PLY2: *syscom = SC_ISU; break;
#endif
}
}
// *syscom = SC_PLY0; // for debug
*flg = 1;
// 関数終了と、ともに、Delete();
}
//==================================================================================
// タスク設定関数
//==================================================================================
void func_ply(int *syscom)
{
byte *cp = gbWork;
int flag = 0;
TG(0).Insert(NewMt(_scPly)(syscom,&flag));
vloop(&flag,vwfast);
gbWork = cp;
}
//==================================================================================
// 午前・午後・夕方の遊び(この指とまれ)
//==================================================================================
void (*func_PLY0)(int *sysco) = func_ply;
void (*func_PLY1)(int *sysco) = func_ply;
void (*func_PLY2)(int *sysco) = func_ply;
//==================================================================================
//==================================================================================
// この指とまれ:INIT
//==================================================================================
static void GameGetPlay( void )
{
GameStageSel();
NowOn();
if( gmday+gmtime ) Bgm(3+stage);
LoadFileProg(0);
#ifndef ROM
// push_wait2();
// NowOf();
#endif
}
//==================================================================================
// BGを消す
//==================================================================================
void _OtherProcClear( void )
{
BgOff(); //
ScreenGain = 0x10; //
srand(vscnt); // 乱数設定は、ここでしよう
}
//==================================================================================
// デバック設定
//==================================================================================
//#define DEB
#define DEBP0 1
#define DEBP1 2
#define DEBTP 0
#define DEBSC SC_PLY0
#define DEB_ST 1
//==================================================================================
extern void GameStageInit(void);
static void InitGame(void)
{
int i;
pdmode=0;
gmode=-1;
gmtype=DEBTP;
trgply=0;
// *sysco=0;
senko=1;
stage=DEB_ST;
chcwait=0;
player[0]=0;
player[1]=1;
menuco=menufg=nowfg=0;
sprog=eveco=evefg=wdf=0;
for(i=0; i<7; i++) itemlist[i]=-1;
//#ifdef DEB
// sysco=DEBSC;
player[0]=DEBP0;
player[1]=DEBP1;
ParaInitGame();
GameStageInit();
ParaInitDay(0);
ParaInitDay(1);
gmode=1;
gmday=0;
//#endif
}
//=========================================================================
// DEBUG 情報 設定
//=========================================================================
int Debug_DataSet( void )
{
#if( START_DATA_SET )
InitGame();
gmtype = 0; // 相手プレイヤ- : 0:COM , 1:人
trgply = 0; // 0:先行 1:後行
player[0] = 0; // プレイヤ-1P
player[1] = 1; // プレイヤ-2P
// stage = ST_SEA; // ステ-ジ : ST_SEA,ST_SCHOOL,ST_STAN,ST_SNOW
// stage = ST_SCHOOL; // ステ-ジ : ST_SEA,ST_SCHOOL,ST_STAN,ST_SNOW
// stage = ST_STAN; // ステ-ジ : ST_SEA,ST_SCHOOL,ST_STAN,ST_SNOW
stage = ST_SNOW; // ステ-ジ : ST_SEA,ST_SCHOOL,ST_STAN,ST_SNOW
if(gmtype==0) comply=1; // CPUフラクグ設定
else comply=-1;
GameStageInit();
gmday = 0; // 何日め? : 0,1,2
gmtime = 2; // 午前/昼/午後 : 0,1,2
// trggal = 0x140; //
#if( 0 )
//この指特別イベント
if(stage==ST_SEA){
// playevf[0]=0x00; //マリエン
playevf[1]=0x01; //大波
}
if(stage==ST_SCHOOL){
playevf[0]=0x10; //校長
playevf[1]=0x00; //突風:1Pが先行の場合のみ
}
if(stage==ST_STAN){
// playevf[0]=0; //お披露目:1日目午前
}
#endif
DEBUG_START_MODE(); // 開始ステ-ジ設定
return( SC_ISU ); // 椅子取り
// return( SC_STT ); // タイトル
// return( SC_PSL ); // プレイヤ-セレクト
// return( SC_PLY2 ); // 夕方の遊び:(武踏大会)
// return( SC_PLY1 ); // 午後の遊び
// return( SC_PLY0 ); // 午前の遊び
// return( SC_FOL ); // フォロ-合戦
// return( SC_DOK ); // ドキドキ ランキング
// return( SC_CHO ); // チョコもらい
// return( SC_TEA ); // おやつ
// return( SC_SIN0 ); // イベント
// return( SC_YUU ); // 夕暮れ
// return( SC_NIG ); // 夜のイベント
// return( SC_DBG ); // デバックモ-ド
// return( SC_GMP ); // プロロ-グ
#else
gmtype = 0; // 相手プレイヤ- : 0:COM , 1:人
player[0] = 0; // プレイヤ-1P
player[1] = 1; // プレイヤ-2P
stage = ST_SNOW; // ステ-ジ : ST_SEA,ST_SCHOOL,ST_STAN,ST_SNOW
gmday = 0; // 何日め? : 0,1,2
gmtime = 0; // 午前/昼/午後 : 0,1,2
if(gmtype==0) comply=1; // CPUフラクグ設定
else comply=-1;
DEBUG_START_MODE(); // 開始ステ-ジ設定
return( SC_STT ); // タイトル
#endif
}
//==================================================================================
//==================================================================================
// 開始デバックモ-ド
//==================================================================================
//==================================================================================
typedef struct {
char *str;
int code;
int data;
} DEBUG_GAME_DATA;
struct _DebugStart : public tMtUser{
private:
int *flg;
int prog_no;
public:
_DebugStart( int *_flg ) { flg = _flg; }
_DebugStart() { ; }
void Start(int code);
void func000( void );
void func001( void );
void func002( void );
};
//==================================================================================
// 呼び出しメイン
//==================================================================================
void DEBUG_START_MODE( void )
{
int flag = 0;
TG(0).Insert(NewMt(_DebugStart)(&flag));
vloop(&flag,vwfast);
}
//==================================================================================
//
//==================================================================================
void _DebugStart::Start( int code )
{
#if( 0 )
static DEBUG_GAME_DATA data[]={
{ "SELECT STAGE", 0, 0 }, //
{ "NORMAL GAME START\n", SC_STT, 0 }, //
{ "ISU-TORI AND FOLLOW\n", SC_ISU, 0 }, //
{ "DOKIDOKI RANKING\n", SC_DOK, 0 }, //
{ "ASOBI GOZEN\n", SC_PLY0, 0 }, //
{ "ASOBI GOGO\n", SC_PLY1, 0 }, //
{ "ASOBI YUUGATA\n", SC_PLY2, 0 }, //
{ "OYATU\n", SC_TEA, 0 }, //
{ "IVENT\n", SC_SIN0, 0 }, //
{ "NIGHT\n", SC_NIG, 0 }, //
{ "GAME PROLOGUE\n", SC_GMP, 0 }, //
{ "CHOKO\n", SC_CHO, 0 }, //
};
#endif
static char stbl[4] ={ST_SNOW,ST_SEA,ST_SCHOOL,ST_STAN};
static char *ttbl[4]={"SNOW","SEA","SCHOOL","STAN"};
int stgno;
FntLoad( 64*15 , 256*0 );
SetDumpFnt( FntOpen(16,16,320,240,0,1024) );
Wx();
stgno = 0;
while(1){
if( CHKPAD(0,Push,PAD_RI) ) stgno++;
if( CHKPAD(0,Push,PAD_LE) ) stgno--;
if( stgno < 0 ) stgno = 3;
if( stgno > 3 ) stgno = 0;
if( CHKPAD(0,Push,BTN_RI) ){
stage = stbl[stgno];
break;
}
FntPrint("\nSELECT STAGE NO = %s\n" , ttbl[stgno]);
Wx();
FntFlush(-1);
}
Wx();
*flg = 1;
// 関数終了と、ともに、Delete();
}
//==================================================================================
//==================================================================================
// デバック VRAM関連
//==================================================================================
//==================================================================================
//=========================================================================
// 初回 DEBUG VRAM 設定
//=========================================================================
void DebugFirstVramSet( void )
{
RECT rect;
int x;
#if( SUB_MASTER_MODE )
return;
#endif
// return;
setRECT( &rect, 0, 0, 1024, 512 );
ClearImage( &rect, 0x60, 0x60, 0x60 );
setRECT( &rect, 0, 0, 64, 256 );
for( x=0 ; x<32 ; x+=2 ){
rect.x = 64*x;
ClearImage( &rect, 0x30, 0x30, 0x30 );
}
setRECT( &rect, 0, 256, 64, 256 );
for( x=1 ; x<32 ; x+=2 ){
rect.x = 64*x;
ClearImage( &rect, 0x30, 0x30, 0x30 );
}
DrawSync(0);
}
//=========================================================================
// VRAM VIEW
//=========================================================================
void DebugVramViewer( void )
{
DISPENV disp;
u_short padd, opadd, tpadd;
GetDispEnv(&disp);
padd = CHKPAD(0,Data,0xffff);
do {
PutDispEnv(&disp);
opadd = padd;
padd = PadRead(0) & 0x0000ffff;
tpadd = ~opadd & padd;
if (padd & PADLleft) disp.disp.x -= 8;
if (padd & PADLright) disp.disp.x += 8;
if (padd & PADLup) disp.disp.y -= 8;
if (padd & PADLdown) disp.disp.y += 8;
if (tpadd & PADRright) {
switch (disp.disp.w) {
default:
disp.disp.w = 640;
break;
case 320:
disp.disp.w = 256;
break;
case 360:
disp.disp.w = 320;
break;
case 512:
disp.disp.w = 360;
break;
case 640:
disp.disp.w = 512;
break;
}
}
if (tpadd & PADRdown) disp.disp.h = (disp.disp.h == 240? 480: 240);
if (tpadd & PADRup) disp.isrgb24 ^= 1;
VSync(0);
} while (!(tpadd & PADstart));
}
//=========================================================================
// SAOUND MODE
//=========================================================================
void DebugSoundMode( tMtUser *user )
{
static int seno,idno;
// DebInit2( 64*5, 256*1, 16, 16 );
seno = 0;
idno = SE_TYPE_EVE;
while( 1 ){
if( CHKPAD(0,Push,BTN_ST) ) break;
if( CHKPAD(0,Push,PAD_UP) ) idno++;
if( CHKPAD(0,Push,PAD_DO) ) idno--;
if( CHKPAD(0,Push,PAD_RI) ) seno++;
if( CHKPAD(0,Push,PAD_LE) ) seno--;
if( CHKPAD(0,Push,BTN_RI) ) SeExe( seno ,idno );
if( CHKPAD(0,Push,BTN_DO) ) SeClose( idno );
if( CHKPAD(0,Push,BTN_UP) ) printf("SENO=%d : ID=%d\n",seno,idno);
FntPrint("SENO=%d : ID=%d\n",seno,idno);
FntFlush(-1);
user->Wx();
}
}
//=========================================================================
// VRAM VIEW 呼び出しメイン
//=========================================================================
void DebugProcCheck( void )
{
if( CHKPAD(0,Data,TRG_R2 ) ){
if( CHKPAD(0,Push,BTN_ST) ){
DebugVramViewer();
}
}
if( CHKPAD(0,Data,TRG_L2) ){
VSync(3);
}
}
address 0x1C000
// ============================================================ //
// //
// ロード/セーブ 回り //
// //
// 使いまわし To 吉丸 慎一郎 //
// //
// ============================================================ //
// ========================== //
// | | //
// | インクルードファイル部 | //
// | | //
// ========================== // ------------------------------
//↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
#include "AllInOne.h"
#include <libmcrd.h>
#include "ts_def.h"
#include "gm_ctrl.h"
#include "com.h"
#include "gam.h"
//#include "rom.h"
#include "m.h"
//#include "mtask.h"
#define DEBM 1
//#include "card.h"
#include "sl.h"
#if( 0 )
#include "p_cp.h" // 追加
#include "p_cpw.h" // 追加
#include "p_ch.h" // 追加
#include "p_sf.h" // 追加
#include "p_dpsy.h" // 追加
#include "p_sys.h" // 追加
#include "p_gam.h" // 追加
#include "p_card.h" // 追加
#include "p_para.h" // 追加
#endif
#include "savedata.h"
#define SLMODE_LOAD 0
#define SLMODE_SAVE 1
////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////
//↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
// SE
#define SE_SETTLE 0
#define SE_SERECT 1
#define SE_BOO 2
// セーブエリア
extern SYSTEM_DATA_WORK sysdat_work; // システム関連
extern char MSaveBuff[0x5000]; //
SLINF savehead[6]; //
SAVE_DATA_WORK savedata[6]; // セーブ関連
// ●SL画面で使用するバッファ
char *SLnewbuff_GD ; // 0x7000
// ●スプライト表示ワーク
static u_long SlOt[100]; // OT Work
static u_long SlOtb[100 ]; //
static SPRT SlSp [ 36+1]; //
static SPRT SlkSp[ 6+1]; //
static SPRT SlBg [ 20 ]; //
static DR_TPAGE SlDrm[ 4 ]; //
#if( 0 )
// ●ステージで初期化されるがサンプル
static SLINF slt[6]= //
{ //
{ 0, 0, 0, 0, 1 }, //
{ 1, 1, 0, 0, 2 }, //
{ 2, 0, 0, 0, 3 }, //
{-1, 1, 0, 1, 2 }, //
{ 0, 0, 0, 1, 3 }, //
{ 0, 1, 0, 2, 3 }, //
}; //
// ●
static int slmode; // 実行IDになる (SlControl)
static int slcd; // 現在選択中の場所
static int sl_flag; // 0:ロード 1:セーブ
extern void _MCardSysInit (void); // カード初期化
extern int SL_ChkCard (int mode); // カードチェック
static int slmess; //
static int cinfo2; //
int SL_EXIT = 0; // モードEXIT
extern int SlScriptMesPut( int no );
////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////
//↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
//extern void MmVs (void); // 追加
static void SlControl (void);
static int SlMescon (void);
static void SlModeCheck (void);
static void SlGetData (void);
int SlSelMes (int type);
void SlSetMes (int type);
extern int vscnt;
extern int wdf;
extern int gmode;
extern int PadDataRead (int p, int nn); // パッドデータ更新 ( )
extern int ClipFade (int type); // クリップエリアによる画面の ON/OFF ( R:\tr_main\gc.cpp )
int SL_loaddata (void) { ; }
int cinfo;
char *cardbuf;
static void SlChkInf (void); //
void SlV (void); //
static void LoadFileSlCG (void); // SLのGDデータを読み出す
static void MEM_SEPUT (int id); // SLでのSEプット
////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////
//↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
// ===================================== //
// 内部:初期化 //
// //
// SL_CG(SL.H) にてアドレスを切ってある //
// にグラフィックデータを読み込む //
// ===================================== //
// 確認
static void LoadFileSlCG(void)
{
#ifdef ROM
MmFileRead("\\ET\\SL.GD;1" , (void *)SLnewbuff_GD );
#else
read_in_file("ET\\sl.gd" , (char *)SLnewbuff_GD );
#endif
}
// ==================================== //
// ●テクスチャ転送 //
// ==================================== //
static void SL_SetTexture(ULONG *addr, int tpnum, int clnum, int tu, int tv)
{
RECT rect;
SXY *t = &Textbl[tpnum];
GsGetTimInfo(addr+1, &timinf);
if(tpnum < 0x100)
{
texRect.x=t->x + tu;
texRect.y=t->y + tv;
texRect.w=timinf.pw;
texRect.h=timinf.ph;
LoadImage(&texRect,timinf.pixel);
}
if(clnum < 0x100)
{
SXY *c=&Cluttbl[clnum];
rect.x=c->x+640;
rect.y=c->y;
rect.w=timinf.cw;
rect.h=timinf.ch;
LoadImage(&rect,timinf.clut);
}
}
// ==================================== //
// ●スプライト転送 //
// ==================================== //
static void SL_SetSprFirst(SPRT *sp, SPRDF *d)
{
SPRD *sd;
sd=&d->sd;
SetSprt (sp);
SetShadeTex (sp, (d->atr & 2)? 0:1);
SetSemiTrans (sp, d->atr & 1);
// SetSemiTrans (sp, 1);
setRGB0 (sp, 128,128,128);
SetSprData (sp, sd);
sp->clut = ((clut[d->cl])+40);
}
// ==================================== //
// スプライト初期化 //
// ==================================== //
static void SlDpInit(void)
{
int i , j , x , y;
short *td;
char *buf;
SPRT *sp;
SPRT *sp1;
SPRT *sp2;
// ==================== //
// 常駐CG //
// ==================== //
LoadFileSlCG();
for(i=0; i<FILE_CNT; i++)
{
td = &cgtd[i][0];
SL_SetTexture((ulong *)GTfdata(i,(byte *)SLnewbuff_GD), *td, *(td+1), *(td+2), *(td+3));
}
ClearOTag ( SlOt , 100 ); // OTを初期化する
ClearOTag ( SlOtb , 100 ); //
SetDr0 ( &SlDrm[0] , SLTP0 ); //
SetDr0 ( &SlDrm[1] , SLTP0 ); //
SetDr0 ( &SlDrm[2] , SLTP1 ); //
SetDr2 ( &SlDrm[3] , SLTP1 ); //
sp=SlSp, sp1=&SlSp[12], sp2=SlkSp;
x=INFX;
for(i=0; i<6; i++, sp1++,sp2++)
{
if(i==3) x+=INFW;
y=INFY+INFH*(i%3);
for(j=0;j<2;j++,sp++)
{
SL_SetSprFirst(sp, &SlSpd[1]); //name
sp->x0=x;
if(j) sp->x0+=60;
sp->y0=y+15+0x100;
}
SL_SetSprFirst(sp1, &SlSpd[2]); //stage
sp1->x0=x, sp1->y0=y+0x100;
sp1++;
SL_SetSprFirst(sp1, &SlSpd[3]); //day
sp1->x0=x+84, sp1->y0=y+1+0x100;
sp1++;
SL_SetSprFirst(sp1, &SlSpd[8]); //mess
sp1->x0=x+8, sp1->y0=y+8+0x100;
sp1++;
SL_SetSprFirst(sp1, &SlSpd[4]); //waku
sp1->x0=x-4, sp1->y0=y-4;
// SL_SetSprFirst(sp2, &SlSpd[5]); //kage
sp2->x0=sp1->x0, sp2->y0=sp1->y0;
}
SL_SetSprFirst(sp1, &SlSpd[6]); //back
// SL_SetSprFirst(sp2, &SlSpd[7]); //back kage
sp = SlSp;
for(i=0;i<12;i++,sp++)
{
// if(i>=2) SSH(sp,50);
SSH(sp,50);
AddPrim(&SlOt, sp);
}
AddPrim(&SlOt, &SlDrm[1]); // プリミティブをOTに登録
for(i=0;i<24+1;i++,sp++)
{
// if(i>=4) SSH(sp,80);
SSH(sp,80);
AddPrim(&SlOt, sp);
}
AddPrim(&SlOt, &SlDrm[2]);
sp = SlkSp;
for(i=0;i<6+1;i++,sp++)
AddPrim(&SlOt, sp);
AddPrim(&SlOt, &SlDrm[3]);
sp = SlBg;
for(i=0; i<20; i++,sp++)
{
SL_SetSprFirst(sp, &SlSpd[0]);
sp->x0 = (i%5)*64 ;
sp->y0 = (i/5)*64 ;
AddPrim (&SlOtb, sp);
}
AddPrim(&SlOtb, &SlDrm[0]);
gmode=8; // DrawAll時の分岐ID
}
// ===================================== //
// //
// ===================================== //
static void SlChkInf(void)
{
int i,j;
SPRT *sp,*sp1;
SLINF *t;
t=slt;
sp=SlSp, sp1=&SlSp[12];
// メモリーカード内に記憶する場所の数(6回)ループ
//
//
for(i=0;i<6;i++,t++,sp+=2,sp1+=4)
{
if(t->stage<0)
{
// データがありません
((sp1+2) ->y0) &= 0xff; //no data
( sp ->y0) |= 0x100;
((sp+1) ->y0) |= 0x100;
( sp1 ->y0) |= 0x100;
((sp1+1) ->y0) |= 0x100;
}
else
{
((sp1+2) ->y0) |= 0x100; //data
( sp ->y0) &= 0xff;
((sp+1) ->y0) &= 0xff;
( sp1 ->y0) &= 0xff;
((sp1+1) ->y0) &= 0xff;
( sp ->v0) = (t->p1) *32;
((sp+1) ->v0) = (t->p2) *32+16;
( sp1 ->v0) = (t->stage)*16;
((sp1+1) ->v0) = (t->day) *12;
}
}
}
//
//
static void SlModeCheck(void)
{
int i; //
// メモリーカード詳細等
for(i=0;i<6;i++) // 初期化を行う
slt[i].stage = -1; //
slmode = MODE_CHECK; // card check
slmess = 0; //
slcd = 6; //
SlChkInf(); // メモリ記憶内容をスプライトを定義
SlMescon(); // メッセージ表示
SlV(); // Vwait
} //
static void SlSel(int old)
{
int i;
SPRT *sp;
if(old!=-1)
{
if(old == 6)
{
sp = &SlSp[36];
SSH(sp,80);
}
else
{
sp = &SlSp[old*2];
for(i=0;i<2;i++,sp++) SSH(sp,50);
sp=&SlSp[12+old*4];
for(i=0;i<4;i++,sp++) SSH(sp,80);
}
}
if(slcd==6)
{
sp=&SlSp[36];
SSH(sp,128);
}
else
{
sp=&SlSp[slcd*2];
for(i=0;i<2;i++,sp++) SSH(sp,128);
sp=&SlSp[12+slcd*4];
for(i=0;i<4;i++,sp++) SSH(sp,128);
}
}
// ===================================== //
// 内部: セーブデータをメインに設定 //
// //
// //
// ===================================== //
// 確認
static void SlGetData(void)
{
// char *buf;
//
// buf = cardbuf + INF_DATA + slcd * INF_MAS;
// GetGameSave0(buf);
//
// buf = cardbuf + FILE_HDSIZE + slcd * DAT_MAS;
// GetGameSave1(buf );
// GetParaSave (buf+64 );
//
}
////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////
//↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
// ===================================== //
// 外部参照:セーブデータをメインに設定 //
// //
// //
// ===================================== //
// 確認
void SlSetData(void)
{
// char *buf=cardbuf+INF_DATA+slcd*INF_MAS;
//
// SetGameSave0 ( buf );
// buf = cardbuf+FILE_HDSIZE + slcd*DAT_MAS;
// SetGameSave1 ( buf );
// SetParaSave ( buf+64);
}
// ===================================== //
// VSync //
// //
// ===================================== //
// 確認
extern tMtUser *texec;
void SlV(void)
{
extern void DebugProcCheck( void );
DebugProcCheck();
texec->Wx();
// WordsConLite(); //
// VsyncWait(); // 起動からの絶対時間を垂直同期間隔を返す
//
// DrawSync (0); // キュー登録すべて描画終了を待つ
// ComDraw (); // クリッピング領域指定?
// //
// DrawOTag(&SlOtb); //
// if(sl_flag>=0) //
// DrawOTag(&SlOt); // 登録されたプリミティブをまとめて実行。
//
// DrawCpDp (); //
// ComDrawSet (); //
//
// MmVs(); //
// PadDataRead(0, 3); // パッドーデータ更新
//
// #ifndef ROM //
// DebPrintFnt(1); //
// #endif //
}
void SL_Sync(void)
{
ComDraw ( ); // クリッピング領域指定?
//
DrawOTag (SlOtb); //
if(sl_flag>=0) //
DrawOTag(SlOt ); // 登録されたプリミティブをまとめて実行。
//
DrawSync (0); // キュー登録すべて描画終了を待つ
//
//DrawCpDp ( ); //
//ComDrawSet ( ); //
//MmVs(); //
//PadDataRead(0, 3); // パッドーデータ更新
}
// 情報書き換えです。
static void SlSelc(void)
{
int n;
SPRT *sp;
n=112+(vscnt&0xf)*2;
sp=&SlSp[36];
if(slcd!=6) sp=&SlSp[12+slcd*4+3];
SSH(sp,n);
}
static int SlSelcon2(void)
{
static int cd=-1;
if(cd!=slcd)
{
SlSel(cd);
cd=slcd;
MEM_SEPUT( SE_SERECT );
}
else
{
SlSelc();
}
}
// ●6個選択可能時
//
static int SlSelcon(void)
{
static int old;
int n,cnt;
// if(slcd==6)
// {
// // Exit 機能(なくなります)
//
// if(cbMARU) return -1;
// else
// if(lev1u)
// slcd=old;
//
// SL_EXIT
// }
// else
// {
old=slcd;
if (PuBATU)
{
SL_EXIT = 1;
return -1;
}
if(cbMARU)
{
if((sl_flag==SLMODE_LOAD)&&(slt[slcd].stage<0))
{
//そこにデータはありません
slmess = (10+sl_flag+0x100);
MEM_SEPUT( SE_BOO );
}
else
{
MEM_SEPUT( SE_SETTLE );
return 1;
}
}
if((lev1l)&&(slcd>=3))
slcd-=3;
if((lev1r)&&(slcd<3))
slcd+=3;
if(lev1u)
{
if((slcd!=0)&&(slcd!=3)) slcd--;
}
// ↓なくなります。
if(lev1d)
{
if((slcd==2)||(slcd==5)) slcd=old;
else
slcd++;
}
// }
return 0;
}
static int SlControlS(int cond)
{
if( (cinfo2=SL_ChkCard(1) ) == cond )
{
SlModeCheck();
return 1;
}
return 0;
}
// Main -> Card
void M2C_DATASET(int pos)
{
int i;
if ((pos<0) || (pos>5))
{}
else
{
// 今回のデータを入力
savehead[pos].stage = stage ;
savehead[pos].day = gmday ;
savehead[pos].type = gmtype ;
savehead[pos].p1 = player[0] ;
savehead[pos].p2 = player[1] ;
savehead[pos].senko = senko ;
for(i=0;i<7;i++) savedata[pos].comtvt [i] = 0;//comtvt [i];
for(i=0;i<5;i++) savedata[pos].asobit [i] = 0;//asobit [i];
for(i=0;i<2;i++) savedata[pos].oyatu [i] = 0;//oyatu [i];
for(i=0;i<6;i++) savedata[pos].oyatu_s [i] = 0;//oyatu_s [i];
for(i=0;i<7;i++) savedata[pos].itemlist [i] = 0;//itemlist [i];
for(i=0;i<2;i++) savedata[pos].yu_henji [i] = 0;//yu_henji [i];
for(i=0;i<2;i++) savedata[pos].ap [i] = 0;//ap [i];
for(i=0;i<4;i++) savedata[pos].playevf [i] = 0;//playevf [i];
for(i=0;i<4;i++) savedata[pos].lunchw [i] = 0;//lunchw [i];
// ●メモリーカード表示部分
//
int size ,i;
char *Sadr;
char *Dadr = &MSaveBuff[0];
long Asize = 0;
long Bsize = 0;
size = (int )(sizeof(SLINF) * 6);
Sadr = (char*)&savehead[0];
for ( i=0 ; i<size ; i++ )
{
*Dadr++ = *Sadr++ ;
}
Asize += size;
// ●アルバム
//
size = (int )(sizeof(SYSTEM_DATA_WORK) );
Sadr = (char*)&sysdat_work;
for ( i=0 ; i<size ; i++ )
{
*Dadr++ = *Sadr++ ;
}
Asize += size;
Bsize = Asize;
// ●内部データ
//
size = (int )(sizeof(SAVE_DATA_WORK) * 6);
Sadr = (char*)&savedata[0];
for ( i=0 ; i<size ; i++ )
{
*Dadr++ = *Sadr++ ;
}
Asize += size;
}
}
static void SlControl(void)
{
int i;
int n;
int r;
long test;
long fc;
deb[16] = slmode;
deb[17] = slmess;
switch(slmode)
{
// ======================== //
// ●カードをチェックする //
// ======================== //
case MODE_CHECK:
n = SL_ChkCard(0);
cinfo = n;
if(
( (sl_flag==SLMODE_SAVE) && ((n==CARDSTS_OK) || (n==CARDSTS_NEW) || (n==CARDSTS_UNFMT)) )
|| ( (sl_flag==SLMODE_LOAD) && ((n==CARDSTS_OK) || (n==CARDSTS_NEW) ) )
)
{
r = 0;
// if( SL_read(1) )
// {
// }
SlChkInf(); // 表示用のスプライト初期化
if(sl_flag==SLMODE_LOAD)
{ // load
if(r==0)
{
slmode = MODE_NOFILE; //
//slmess = 2; // セーブデータ無
}
else
{
slmode = MODE_SELECT_L; //
slcd = 0; //
}
}
else
{ // SAVE
slmode = MODE_SELECT_S; //
slcd = 0;
}
}
else
{
slmode = MODE_WAIT;
if( (sl_flag==SLMODE_LOAD) && (n==CARDSTS_UNFMT) )
{
slmess=4; // 別のカードを挿入してください
}
if(n==CARDSTS_NOCARD)
{
slmess=1; // カードが挿入されていない
}
if(n==CARDSTS_ERR)
{
slmess=6; // 壊れ
}
}
break;
// ======================== //
// ●カードチェック //
// ======================== //
case MODE_WAIT:
SlControlS(CARDSTS_NOCARD); // カードが抜かれたら初期化
if(cinfo2==CARDSTS_NEW) // 新しいカードがささったらチェックへ
slmode = MODE_CHECK;
break;
// ======================== //
// ●該当ファイルなし // ただし!LOADからしか来ません
// ======================== //
case MODE_NOFILE:
SlSelMes (2) ; // 別のカードを挿入してください
SL_EXIT = 1 ; //
// SlControlS(CARDSTS_NOCARD); // カードが抜かれたら初期化
// if(cinfo2 == CARDSTS_NEW)
// slmode = MODE_CHECK;
//
// if (PuBATU)
// {
// SL_EXIT = 1;
// }
break;
// ======================== //
// ●SAVE/LOAD位置決定 //
// ======================== //
case MODE_SELECT_S:
case MODE_SELECT_L:
// カードを抜かれたらやり直し
// n = SL_ChkCard(0);
// if(n==CARDSTS_NOCARD)
// slmode = MODE_CHECK;
slmess = 10+ sl_flag ;
n = SlSelcon(); // 6個自由選択
if(n==1)
{
slmode++;
}
// SlControlS(CARDSTS_NOCARD); // カードが抜かれたら初期化
break;
// ======================== //
// ●SAVE/LOAD行動決定 //
// ======================== //
case MODE_LOAD_CHECK:
case MODE_SAVE_CHECK:
r = SlSelMes(12+sl_flag); // メッセージ処理
if(r==0) slmode++;
if(r==1) slmode--;
SlControlS(CARDSTS_NOCARD); // カードが抜かれたら初期化
break;
// ======================== //
// ●セーブ //
// ======================== //
case MODE_SAVE: //
// M2C_DATASET(slcd); // ←現在のデータをつむ
extern int SL_savedata(void); //
n=SL_savedata(); //
//
SlModeCheck(); //
//
switch(n) //
{
case CARDSTS_OK: // 完了
slmode = MODE_END; //
break; //
case CARDSTS_FULL: // memory full
slmess = 5; //
slmode = MODE_WAIT; //
break; //
case CARDSTS_UNFMT: // not format
slmess = 4; //
slmode = MODE_WAIT; //
break; //
case CARDSTS_NOCARD: // No Card
slmess = 1; //
slmode = MODE_WAIT; //
break; //
case CARDSTS_DATAERROR: // error format
slmess = 6; //
slmode = MODE_WAIT; //
break; //
}
break;
// ======================== //
// ●ロードチェック //
// ======================== //
case MODE_LOAD:
n = SL_loaddata();
slmode = MODE_SELECT_L; // 中止
if(n==0) // load comp.
slmode=-2;
break;
// ======================== //
// ●エグジット処理 //
// ======================== //
case MODE_END:
slmode=-1;
break;
}
SlSelcon2(); // 移動によるオブジェの輝度変更
if(SL_EXIT)
{
MEM_SEPUT( SE_SETTLE );
slmode=-1;
}
}
// ===================================== //
// 内部:メッセージ処理? //
// //
// //
// ===================================== //
// 確認
int oldsm = -1;
static int SlMescon(void)
{
if(slmess!=oldsm)
{
slmess&= 0xff ;
oldsm = slmess ;
//CpWords((u_char*)mes[sm]); //?
SlScriptMesPut(oldsm);
return 1;
}
return 0;
}
int SlSelMes(int type) //
{ //
static int cd = 0; //
slmess = type; //
oldsm = slmess ;
cd = SlScriptMesPut(type); //
//
return( cd ); //
//#if( 0 )
// if(SlMescon()) // メッセージ処理
// { //
// SfBarPos(-1); // Sf.cpp
// cd=0; //
// } //
// else //
// { //
// if (cbMARU) //
// { //
// MEM_SEPUT( SE_SETTLE ); //
// return cd+1; //
// } //
// if ((lev1l) && (cd==1)) //
// { //
// MEM_SEPUT( SE_SERECT ); //
// SfBarPos(-1); // Sf.cpp
// cd=0; //
// } //
// if((lev1r)&&(cd==0)) //
// { //
// MEM_SEPUT( SE_SERECT ); //
// SfBarPos(6); // Sf.cpp
// cd=1; //
// } //
// } //
// return 0; //
//#endif
} //
void SlSetMes(int type)
{ //
slmess = type; //
SlMescon(); // メッセージ処理
//
SlV(); // Vwait
SlV(); // Vwait
}
////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////
#include "se.h"
extern void SeDataPut(int Type);
extern void SeSettle (void);
extern void SeCansel (void);
extern void SeSelect (void);
extern void SeFale (void);
static void MEM_SEPUT(int id)
{
// SE 出力する関数
switch(id)
{
case SE_SETTLE:
SeSettle();
break;
case SE_SERECT:
SeSelect();
break;
case SE_BOO:
SeFale();
break;
}
}
////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////
// ===================================== //
// 0:ロード、1:セーブ //
// //
// ===================================== //
int SlC ( int mode )
{
int r ;
sl_flag = -1;
gmode = -1;
#if( 0 )
extern void SlScttest( void );
SlScttest();
#endif
SLnewbuff_GD = new char[ 0x7000]; // グラフィックリードバッファ
Bgm(1+1); // BGM 開始:BgmCall直接呼び出しは使用禁止
wdf = 0; //
_MCardSysInit(); // メモリーカード初期化
SlModeCheck(); // とりあえず初期化
SlDpInit(); // SAVE / LOAD 画像初期化
// フェードイン
while(1) //
{ //
if(ClipFade(0x102)==1) //
break; // hi-speed
SlV(); // Vwait
} //
sl_flag = mode; // 0:ロード、1:セーブ
SL_EXIT = 0; // モードEXIT
while (1)
{
r=1;
if(mode==SLMODE_SAVE)
{ // セーブ時
r = SlSelMes(7); // メッセージ?処理
if(r==1) break; //
} //
//
if(r==1)
{
SlSetMes(0); // メッセージ処理
// InitMemCard(); // メモリーカード初期化
SlModeCheck(); // 記憶内容表示(メモリーカード)
while(1)
{
SlMescon (); // メッセージ処理
SlV (); // Vwait
SlControl (); //
if(slmode<0) //
break; //
}
//StopMemCard(); //メモリーカード終了
if(slmode==-2) //
{ // データロード
// SlGetData(); // メインメモリへデータを転送
} //
break; //
}
SlV(); // Vwait
}
while(1) //
{ //
SlV(); // Vwait
if(ClipFade(2)==1) break;
}
DisCpDp(-1); //cp all off
gmode = 1; //
//////////////////////////////////////////////
// ●メモリ開放
release SLnewbuff_GD;
return slmode;
}
////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////
// ヘッダー設定
void headset(void)
{
char *Sadr;
char *Dadr;
int size;
int i;
Sadr = &MSaveBuff[0] ;
Dadr = (char*)&savehead[0];
size = (int )(sizeof(SLINF) * 6);
for ( i=0 ; i<size ; i++ )
{
*Dadr++ = *Sadr++ ;
}
Dadr = (char*)&sysdat_work;
size = (int )(sizeof(SYSTEM_DATA_WORK) );
for ( i=0 ; i<size ; i++ )
{
*Dadr++ = *Sadr++ ;
}
}
#endif
address 0x24000
//----------------------------------------------------------------------------------
#ifndef _SL_H
#define _SL_H
//==================================================================================
#define SL_CG 0x80180000
#define SL_DATA 0x8017E000
#define INF_DATA 8192-128 //ブロックの後ろ
#define INF_MAS 16 //データ情報
#define DAT_MAS 1200 //1ファイルのデータ
#define FILE_HDSIZE 128*4
#define FILE_CNT 7
#define SLTP0 6
#define SLTP1 26
#define SLCL0 10
#define SLCL1 11
#define SLCL2 32
#define SLCL3 33
#define SLCL4 34
#define SLCLK 68
#define INFX 32
#define INFY 20
#define INFW 134
#define INFH 44
enum cont_mode{
MODE_CHECK=0,
MODE_WAIT,
MODE_NOFILE,
MODE_SELECT_S,
MODE_SAVE_CHECK,
MODE_SAVE,
MODE_SELECT_L,
MODE_LOAD_CHECK,
MODE_LOAD,
MODE_END,
};
typedef struct {
int stage,day,type,p1,p2;
} SLINF;
static SPRT SlSp[36+1], SlkSp[6+1];
static SPRT SlBg[20];
static ULONG SlOt,SlOtb;
static DR_TPAGE SlDrm[4];
static int slf,slmode,slcd,slmess,cinfo2;
static SLINF slt[6]={
{0,0,0,0,1},
{1,1,0,0,2},
{2,0,0,0,3},
{-1,1,0,1,2},
{0,0,0,1,3},
{0,1,0,2,3},
};
static short cgtd[][4]={
//bg0,sl_cname,sl_data,sl_w,back,sl_ws,backs,
{SLTP0,SLCL0, 0,0},
{SLTP0,SLCL1, 64/2,0},
{SLTP1,SLCL2, 0,0},
{SLTP1,SLCL3, 128/4,0},
{SLTP1,SLCL4, 128/4,96},
{SLTP1,0x100, 120/4,40},
{SLTP1,0x100, 128/4,96+12},
};
static SPRDF SlSpd[]={
{ 0, SLTP0,SLCL0, { 0,0, 64,64, 0,0}}, //0:BG
{ 2, SLTP0,SLCL1, { 0,0, 62,16, 64,0}}, //1:Name
{ 2, SLTP1,SLCL2, { 0,0, 84,16, 0,0}}, //2:Stage name
{ 2, SLTP1,SLCL2, { 0,0, 32,12, 84,0}}, //3:Day
{ 3, SLTP1,SLCL3, { 0,0, 128,40, 128,0}}, //4:Waku
{ 1, SLTP1,SLCLK, { 0,0, 132,42, 120,40}}, //5:Waku kage
{ 2, SLTP1,SLCL4, { 160-14,150, 28,12, 128,96}}, //6:Back
{ 1, SLTP1,SLCLK, { 160-14,150, 32,20, 128,96+12}}, //7:Back kage
{ 2, SLTP1,SLCL2, { 0,0, 116,12, 0,64}}, //8:mess
};
// とりあえず・・・
#if( 0 )
// =======================================================================
static char mes0[]="
メモリーカードのチェック中です。E";
static char mes1[]="
メモリーカードをセットしてください。E";
static char mes2[]="
セーブデータがありません。
ほかのメモリーカードをセットしてください。E";
static char mes3[]="
メモリーカードがフォーマットされていません。
フォーマットしてよろしいですか?
BR5は い いいえ
E";
static char mes4[]="
メモリーカードがフォーマットされていません。
ほかのメモリーカードをセットしてください。E";
static char mes5[]="
1ブロック必要です。ほかのメモリーカードを
セットするか、メモリーカード管理画面で
不要なデータを消してください。E";
static char mes6[]="
メモリーカードが壊れています。
ほかのメモリーカードをセットしてください。E";
static char mes7[]="
セーブするのか?
BR5は い いいえ
E";
static char mes9[]="
データのセーブに失敗しました。
もう一度セーブしますか?
BR5は い いいえ
E";
static char mes8[]="
データのロードに失敗しました。
もう一度ロードしますか?
BR5は い いいえ
E";
static char mes10[]="
ロードするファイルを選んでください。
○ボタンで決定します。E";
static char mes11[]="
セーブするファイルを選んでください。
○ボタンで決定します。E";
static char mes13[]="
このファイルにデータをセーブします。
よろしいですか?
BR5は い いいえ
E";
static char mes12[]="
このファイルのデータをロードします。
よろしいですか?
BR5は い いいえ
E";
static char mes14[]="
セーブ中です。
メモリーカードを抜かないでください。E";
static char mes15[]="
ロード中です。
メモリーカードを抜かないでください。E";
// =======================================================================
#else
// =======================================================================
static char mes0[]=" メモリーカードのチェック中です。E";
static char mes1[]=" メモリーカードをセットしてください。E";
static char mes2[]=" セーブデータがありません。 ほかのメモリーカードをセットしてください。E";
static char mes3[]="メモリーカードがフォーマットされていません。フォーマットしてよろしいですか? BR5は い いいえE";
static char mes4[]="メモリーカードがフォーマットされていません。ほかのメモリーカードをセットしてください。E";
static char mes5[]="1ブロック必要です。ほかのメモリーカードをセットするか、メモリーカード管理画面で不要なデータを消してください。E";
static char mes6[]="メモリーカードが壊れています。ほかのメモリーカードをセットしてください。E";
static char mes7[]=" セーブするのか? BR5は い いいえE";
static char mes9[]=" データのセーブに失敗しました。 もう一度セーブしますか? BR5は い いいえE";
static char mes8[]=" データのロードに失敗しました。 もう一度ロードしますか? BR5は い いいえE";
static char mes10[]=" ロードするファイルを選んでください。 ○ボタンで決定します。E";
static char mes11[]=" セーブするファイルを選んでください。 ○ボタンで決定します。E";
static char mes13[]=" このファイルにデータをセーブします。 よろしいですか? BR5は い いいえE";
static char mes12[]=" このファイルのデータをロードします。 よろしいですか? BR5は・
address 0x25530
s14[]=" セーブ中です。 メモリーカードを抜かないでください。E";
static char mes15[
(Source: Original TCRF research)
|
The Worland series | |
|---|---|
|
PlayStation |
Eberouge • Eberouge Special • Eberouge 2 • Trifels Mahou Gakuen |
|
Sega Saturn |
|