// gameutil.c // タイマ,乱数,サウンド,etc. #include #include #include #include #include #include #include /* エラー出力 */ void Fatal(char *msg) { endwin(); fprintf(stderr, "%s\n", msg); exit(1); } /* デバッグ出力 */ void Debug(char *msg) { fprintf(stderr, "%s\n", msg); } /* curses の補助 */ // 色の初期化 void InitColor(int bg) { if (bg < -1) return; start_color(); use_default_colors(); /* 文字表示用の色 */ assume_default_colors(COLOR_BLACK, bg); // init_pair(0, ...); init_pair(1, COLOR_RED, bg); init_pair(2, COLOR_GREEN, bg); init_pair(3, COLOR_YELLOW, bg); init_pair(4, COLOR_BLUE, bg); init_pair(5, COLOR_MAGENTA, bg); init_pair(6, COLOR_CYAN, bg); init_pair(7, COLOR_WHITE, bg); /* ブロックキャラクタ表示用の色 */ init_pair(10, COLOR_BLACK, COLOR_BLACK); init_pair(11, COLOR_RED, COLOR_RED); init_pair(12, COLOR_GREEN, COLOR_GREEN); init_pair(13, COLOR_YELLOW, COLOR_YELLOW); init_pair(14, COLOR_BLUE, COLOR_BLUE); init_pair(15, COLOR_MAGENTA, COLOR_MAGENTA); init_pair(16, COLOR_CYAN, COLOR_CYAN); init_pair(17, COLOR_WHITE, COLOR_WHITE); /* 背景の色 */ if (bg >= 0) { bkgd(COLOR_PAIR(7-bg)); } else { bkgd(COLOR_PAIR(0)); } } // 色の利用 void UseColor(int c) { attron(COLOR_PAIR(c)); } // ブロック列の表示 void DrawBlocks(int y, int x, char *s) { int w, h; getmaxyx(stdscr, h, w); if (y < 0) return; if (y >= h) return; while (*s != '\0') { if (x < 0); else if (x >= w); else if (*s != ' ') mvaddch(y, x, *s); s++; x++; } } // 文字列の中央寄せ表示 void CenterStr(int y, int x, char *s) { int n; n = strlen(s); x -= n/2; mvaddstr(y, x, s); } /* 乱数の処理 */ // 乱数の初期化 void InitRand() { srand(time(NULL)); } // 0 以上 n 未満の整数乱数 int Rand(int n) { return ((int)(n*(rand()/(RAND_MAX + 1.0)))); } /* サウンドの処理 */ static int sound = 0; // サウンド On/Off void SetSnd(int sw) { sound = sw; } // サウンド再生 void PlaySnd(char *file) { static char cmd[256]; if (sound == 0) return; // サイレントモード if (strlen(file) > 200) return; // バッファオーバフロー防止 sprintf(cmd, "esdplay %s 2> /dev/null &", file); // 再生 system(cmd); } /* タイマーの処理 */ static struct timeval start_time; // タイマー初期化 void InitWait() { gettimeofday(&start_time, NULL); } static int diffTime(struct timeval *t1, struct timeval *t2) { static int sec, msec; sec = t1->tv_sec - t2->tv_sec; msec = (t1->tv_usec - t2->tv_usec)/1000; if (msec < 0) { sec -= 1; msec += 1000; } return (sec*1000 + msec); } static int getTime() { static struct timeval now; gettimeofday(&now, NULL); return (diffTime(&now, &start_time)); } // 処理時間一定版 sleep() void Wait(int msec) { while (1) { if (getTime() >= msec) return; } }