今日の雑記

生きることでいっぱいいっぱい

なんかもう酷いことになってきた

今作ってるゲームの「gctrl.d」内の「TSKgctrl」が。
まあ具体的にどう酷いかと言うと、「ネストした関数」の嵐になってしまった。
ここまでいくともう可読性云々ではない。悪くなってるよ明らかに。
ここにぺたっと張るとあれなので、以下は続きを...。


void TSKgctrl(int id)
{
void game_init(int id){
for(int i = 0; i < bullet_tbl.length; i++){
bullet_tbl[i] = i;
}
setTSK(GROUP_SHIP, &TSKship);
setTSK(GROUP_CURSOLE, &TSKcursole);
setTSK(GROUP_INFO, &TSKbonus);
setTSK(GROUP_INFO, &TSKsysinfo);
setTSK(GROUP_INFO, &TSKphase);
bullet_cnt = 0;
bullet_tbl_num = 0;
bullet_cnt_max = 0;
bullet_level_max = BULLET_LV_MIN;
level_step = 0;
ship_left = LEFT_DEFAULT;
ship_energy = ENERGY_DEFAULT;
score = 0;
score_tmp = 0;
result_ship = 0;
generate_bullets = 0;
break_bullets = 0;
warp_cnt = 0;
energy_used = 0;
max_chain = 0;
phase = 1;
rank = 0.0f;

init_genrand(1443);
if(g_step == GSTEP_GAME) replay_flag = 0;
if(g_step == GSTEP_REPLAY) replay_flag = 1;
replay_cnt = 0;
replay_bulcnt = 0;
}

void init_highscore(){
if(exists("score.dat") ){
hi_score = cast(int[])read("score.dat");
}else{
hi_score.length = RANKING_MAX * RANKING_RECORD;
for(int i = 0; i < RANKING_MAX; i++){
hi_score[i * RANKING_RECORD + RANKING_SCORE] = 100000 - 5000 * i;
hi_score[i * RANKING_RECORD + RANKING_PTIME] = ONE_MIN * 99 + ONE_SEC * 59 + (ONE_SEC - 1);
hi_score[i * RANKING_RECORD + RANKING_PHASE] = 1;
hi_score[i * RANKING_RECORD + RANKING_CHAIN] = 1;
}
write("score.dat", cast(void[])hi_score);
}
debug{
for(int i = 0; i < RANKING_MAX; i++){
writefln("high score %02d:%d,%d,%d,%d", i + 1
, hi_score[i * RANKING_RECORD + RANKING_SCORE]
, hi_score[i * RANKING_RECORD + RANKING_PTIME]
, hi_score[i * RANKING_RECORD + RANKING_PHASE]
, hi_score[i * RANKING_RECORD + RANKING_CHAIN]);

}
}
}

int record_highscore(){
if(replay_flag) return -1;
int i;
for(i = 0; i < RANKING_MAX; i++){
if(hi_score[i * RANKING_RECORD + RANKING_SCORE] < score){
for(int j = RANKING_MAX - 1; j > RANKING_MAX; j++){
hi_score[j * RANKING_RECORD + RANKING_SCORE] = hi_score[(j - 1) * RANKING_RECORD + RANKING_SCORE];
hi_score[j * RANKING_RECORD + RANKING_PTIME] = hi_score[(j - 1) * RANKING_RECORD + RANKING_PTIME];
hi_score[j * RANKING_RECORD + RANKING_PHASE] = hi_score[(j - 1) * RANKING_RECORD + RANKING_PHASE];
hi_score[j * RANKING_RECORD + RANKING_CHAIN] = hi_score[(j - 1) * RANKING_RECORD + RANKING_CHAIN];
}
hi_score[i * RANKING_RECORD + RANKING_SCORE] = score;
hi_score[i * RANKING_RECORD + RANKING_PTIME] = time;
hi_score[i * RANKING_RECORD + RANKING_PHASE] = phase;
hi_score[i * RANKING_RECORD + RANKING_CHAIN] = max_chain;
write("score.dat", cast(void[])hi_score);
break;
}
}
return i;
}

void replay_load(){
char[][] fpath;
int fcnt = 0;
replay_ok = 0;
fpath = listdir(std.path.curdir);
for(int i = 0; i < fpath.length; i++){
if(fnmatch(fpath[i], "rep*.dat") ){
replay_file.length = fcnt + 1;
replay_file[fcnt] = fpath[i];
fcnt++;
}
}
debug{
for(int i = 0; i < replay_file.length; i++){
writefln("%s", replay_file[i]);
}
}
for(int i = 0; i < replay_file.length; i++){
if(fnmatch(replay_file[i], "rep_rec1.dat") ){
replay_move = cast(float[])read("rep_rec1.dat");
replay_ok++;
}
if(fnmatch(replay_file[i], "rep_rec2.dat") ){
replay_trgs = cast(int[])read("rep_rec2.dat");
replay_ok++;
}
if(fnmatch(replay_file[i], "rep_rec3.dat") ){
replay_bullet = cast(int[])read("rep_rec3.dat");
replay_ok++;
}
}
}

void replay_save(){
write("rep_rec1.dat", cast(void[])replay_move);
write("rep_rec2.dat", cast(void[])replay_trgs);
write("rep_rec3.dat", cast(void[])replay_bullet);
}

switch(TskBuf[id].step){
case 0:
TskBuf[id].tskid |= TSKID_SYSTEM+TSKID_NPAUSE;
setTSK(GROUP_SYSTEM, &TSKluminous);
setTSK(GROUP_BG, &TSKbg00);
setTSK(GROUP_BG, &TSKbg01);
setTSK(GROUP_BG, &TSKbg02);
replay_move.length = 1;
replay_trgs.length = 1;
replay_bullet.length = 0;
init_highscore();
replay_load();
TskBuf[id].step++;
break;
case 1:
debug{
pause_flag = 1;
}
stopSNDmusic();
setTSK(GROUP_08, &TSKtitle);
g_step = GSTEP_TITLE;
TskBuf[id].step++;
break;
case 2:
if(g_step == GSTEP_GAME || g_step == GSTEP_REPLAY){
playSNDse(SE_START);
TSKclrAll();
TskBuf[id].step++;
}
if(g_step == GSTEP_RANKING){
TSKclrAll();
TskBuf[id].wait = RANKING_TIME;
setTSK(GROUP_TOPFRAME, &TSKranking);
TskBuf[id].step = 10;
}
if(g_step == GSTEP_EXIT){
TSKclrAll();
TskBuf[id].step = -1;
}
break;
// game start
case 3:
if(checkSNDse(SE_START) ) break;
pause_flag = 1;
TskBuf[id].wait = 30;
TskBuf[id].step++;
break;
case 4:
TskBuf[id].wait -= TskBuf[id].wait ? 1 : 0;
if(TskBuf[id].wait) break;
game_init(id);
playSNDmusicLoop(SND_BGM01, SND_BGM02);
TskBuf[id].wait = 60;
time = 0;
TskBuf[id].step++;
// game loop
case 5:
if(!pause){
TskBuf[id].wait -= TskBuf[id].wait ? 1 : 0;
if(TskBuf[id].wait) break;
time++;
TSKgctrlLevelCtrl(id);
if(g_step == GSTEP_GAMEOVER){
if(record_highscore() == 0) replay_save();
playSNDse(SE_GAMEOVER);
gover_id = setTSK(GROUP_TOPFRAME, &TSKgameover);
TskBuf[id].wait = 120;
TskBuf[id].step++;
}
}
break;
// game over
case 6:
TskBuf[id].wait -= TskBuf[id].wait ? 1 : 0;
if(TskBuf[id].wait) break;
TskBuf[id].step++;
// result
case 7:
TskBuf[id].wait -= TskBuf[id].wait ? 1 : 0;
if(TskBuf[id].wait) break;
if( (mouse_trg & SDL_BUTTON(1) ) || (trgs & PAD_BUTTON1) ){
stopSNDall();
}
if(!checkSNDse(SE_GAMEOVER) ){
if(gover_id != -1) clrTSK(gover_id);
TskBuf[id].wait = RESULT_TIME;
stopSNDall();
stopSNDmusic();
setTSK(GROUP_TOPFRAME, &TSKresult);
TskBuf[id].step++;
}
break;
case 8:
TskBuf[id].wait -= TskBuf[id].wait ? 1 : 0;
if(TskBuf[id].wait < RESULT_TIME2 && ( (mouse_trg & SDL_BUTTON(1) ) || (trgs & PAD_BUTTON1) )){
TskBuf[id].wait = 0;
}
if(TskBuf[id].wait) break;
TSKclrAll();
TskBuf[id].step = 1;
break;

// ranking
case 10:
TskBuf[id].wait -= TskBuf[id].wait ? 1 : 0;
if(TskBuf[id].wait > RANKING_TIME2) break;
if( (mouse_trg & SDL_BUTTON(1) ) || (trgs & PAD_BUTTON1) ){
TSKclrAll();
TskBuf[id].step = 1;
break;
}
if(TskBuf[id].wait) break;
TSKclrAll();
TskBuf[id].step = 1;
break;

default:
clrTSK(id);
break;
}
}

なんかもう、見るのもアレというか、掲載するのもナニというか。どうにも。
まあそんな感じでよろしく(どんな感じだよ