ToHeart2のソースコードをのぞいてみる・その1

オープニングムービーの解像度

オープニングムービーってCPUのパワーでその種類を選択しているのね。

int	mov_cpu;
if(fCpuClock>1400){
mov_cpu=2;
}else if(fCpuClock>900){
mov_cpu=1;
}else{
mov_cpu=0;
}
Avg.mov_lv = ReadIniFileAmount( "mov_lv", mov_cpu );
Avg.mov1 = PAC_CheckFile( "mov", "TH2_OP_480x272_2M.avi" );
Avg.mov2 = PAC_CheckFile( "mov", "TH2_OP_640x352_4M.avi" );
Avg.mov3 = PAC_CheckFile( "mov", "TH2_OP_800x448_5M.avi" );
OverLay = ReadIniFileAmount( "OverLay", OverLay );

開発者の魂の叫び?

開発者の嘆き、というかデバッグ表示だな、こりゃ。(笑)

void AVG_SetScenarioFlag( int block_no )
{
int	i;
for(i=0;i<SCRIPT_MAX;i++){
if(ScenarioNameTable[i]==ScenarioNo){
break;
}
}
if( block_no >= BLOCK_MAX ){
DebugBox(NULL,"ちょぉいと文章が多過ぎやしませんか?[%d]",block_no);
}else{
if(BlockNo!=-1){
STD_SetBit( ScenarioFlag[i], 1, BlockNo, ON );
if(!TentouFlag)
STD_WriteFilePos( SysFlagName, (char*)ScenarioFlag, EXEC_POS, SCRIPT_MAX*BLOCK_MAX/8 );
}
BlockNo = block_no;
}
}
BOOL AVG_CheckScenarioFlag( void )
{
int	i;
for(i=0;i<SCRIPT_MAX;i++){
if(ScenarioNameTable[i]==ScenarioNo){
break;
}
}
if( BlockNo >= BLOCK_MAX ){
DebugBox(NULL,"ちょぉいとシナリオブロックが多過ぎやしませんか?[%d]",BlockNo);
return FALSE;
}else{
if( BlockNo!=-1){
return STD_GetBit( ScenarioFlag[i], 1, BlockNo ) || Avg.omake;
}else{
return FALSE;
}
}
return TRUE;
}

Pakファイルの読み取り

すでにこの辺は解析されまくってますから今更なんですけどねぇ。(笑)

int ClReadFile::DecodePackFile(int read_size,BYTE *readFile, char **fileBuf)
{
int i, j, k, r, c;
unsigned int flags;
int out_size,write_size;
unsigned char	*rfP,*ofP;
unsigned char text[Ns+Fs-1];
out_size  = *(int *)readFile;
rfP = readFile + 4;
*fileBuf = (char *)cl_malloc(out_size+1);
if(NULL==*fileBuf){
return 0;
}
ofP = (unsigned char *)*fileBuf;
write_size = 0;
ZeroMemory(text, Ns - Fs);
r = Ns - Fs;  flags = 0;
for ( ; ; ) {
if (((flags >>= 1) & 256) == 0) {
c = *(rfP ++); read_size --;
if (read_size < 0) break;
flags = c | 0xff00;
}
if (flags & 1) {
c = *(rfP ++); read_size --;
if (read_size < 0) break;
*(ofP ++) = c;  write_size ++;
if(write_size>out_size){
cl_free(readFile);	cl_free(*fileBuf);
return 0;
}
text[r++] = c;  r &= (Ns - 1);
} else {
i = *(rfP ++); read_size --;
if (read_size < 0) break;
j = *(rfP ++); read_size --;
if (read_size < 0) break;
i |= ((j & 0xf0) << 4);  j = (j & 0x0f) + 2;
for (k = 0; k <= j; k++) {
c = text[(i + k) & (Ns - 1)];
*(ofP ++) = c; write_size ++;
if(write_size>out_size){
cl_free(readFile);	cl_free(*fileBuf);
return 0;
}
text[r++] = c;  r &= (Ns - 1);
}
}
}
(*fileBuf)[out_size] = 0;
return (out_size);
}

コメントがことごとく取り去られているのをのぞけば、コードとしてはそこまで難解なコードではない感じです。

ライブラリさえそろえればコンパイルはできそうだなぁ。暇なときにでもやってみよう。