diff options
Diffstat (limited to 'src/game/timedemo.c')
-rw-r--r-- | src/game/timedemo.c | 152 |
1 files changed, 152 insertions, 0 deletions
diff --git a/src/game/timedemo.c b/src/game/timedemo.c new file mode 100644 index 0000000..38b9d05 --- /dev/null +++ b/src/game/timedemo.c @@ -0,0 +1,152 @@ +#include "game/gltron.h" + +static int startTime = 0; +static int frames = 0; + +void idleTimedemo(void) { + int t; + int i, j; + + List *p, *l; + + Sound_idle(); + + game2->time.current += 20; + + for(j = 0; j < 2; j++) { // run display at a theoretical 50 Hz + t = 10; // run game physics at 100 Hz + + game2->time.dt = 10; + + for(i = 0; i < game->players; i++) { + if(game->player[i].ai != NULL) { + if(game->player[i].ai->active == AI_COMPUTER && + PLAYER_IS_ACTIVE(&game->player[i])) { + doComputer(i, 0); + } + } + } + + /* process any outstanding events generated by the AI (turns, etc) */ + for(p = &(game2->events); p->next != NULL; p = p->next) { + if(processEvent((GameEvent*) p->data)) + return; + } + + /* free events */ + p = game2->events.next; + while(p != NULL) { + l = p; + p = p->next; + free(l); + } + game2->events.next = NULL; + + l = doMovement(1, t); /* this can generate new events */ + if(l != NULL) { + for(p = l; p->next != NULL; p = p->next) { + if(processEvent((GameEvent*) p->data)); + } + + } + /* free list */ + p = l; + while(p != NULL) { + l = p; + p = p->next; + free(l); + } + } + + game2->time.dt = 20; + doCameraMovement(); + doRecognizerMovement(); + scripting_RunGC(); + SystemPostRedisplay(); + frames++; + game2->time.lastFrame += 20; +} + +void keyTimedemo(int state, int key, int x, int y) { + if(state == SYSTEM_KEYSTATE_UP) + return; + + if(key == 27) + SystemExitLoop(RETURN_TIMEDEMO_ABORT); +} + +struct { + float speed; + int eraseCrashed, grid_size; +} saveRules; + +extern int c_resetCamera(); + +void initTimedemo(void) { + int i = 0; + + printf("-- initializing timedemo\n"); + + frames = 0; + startTime = SystemGetElapsedTime(); + + tsrand(12313); + + resetRecognizer(); + + updateSettingsCache(); + + // overwrite AI skills & rules in settingsCache + gSettingsCache.ai_level = 2; + gSettingsCache.show_ai_status = 0; + gSettingsCache.show_fps = 0; + gSettingsCache.camType = CAM_CIRCLE; + gSettingsCache.show_console = 0; + + saveRules.speed = getSettingf("speed"); + saveRules.eraseCrashed = getSettingi("erase_crashed"); + saveRules.grid_size = getSettingi("grid_size"); + + setSettingf("speed", 12); + setSettingi("erase_crashed", 1); + setSettingi("grid_size", 200); + + game2->mode = GAME_SINGLE; + initData(); + changeDisplay(-1); + + for(i = 0; i < game->players; i++) { + game->player[i].ai->active = AI_COMPUTER; + // set all camera phi values to 0 + game->player[i].camera->movement[CAM_PHI] = PI / 18; + game->player[i].camera->movement[CAM_CHI] = PI / 3; + } + + SystemHidePointer(); + SystemWarpPointer(MOUSE_ORIG_X, MOUSE_ORIG_Y); + game2->time.offset = SystemGetElapsedTime() - game2->time.current; +} + +void exitTimedemo(void) { + int dt = SystemGetElapsedTime() - startTime; + if(dt) { + displayMessage(TO_STDERR | TO_CONSOLE, + "timedemo FPS: %.2f\n", + (float) frames / dt * 1000.0f); + // displayMessage(TO_STDERR | TO_CONSOLE, "timedemo FPS: %.2f (%d frames in %f seconds)\n", (float) frames / dt * 1000.0f, frames, dt / 1000.0f); + } + else { + // displayMessage(TO_STDERR | TO_CONSOLE, "dt: %d, frames: %d\n", dt, frames); + // actually, this would be a good reason to abort with a fatal error + } + + setSettingf("speed", saveRules.speed); + setSettingi("eraseCrashed", saveRules.eraseCrashed); + setSettingi("grid_size", saveRules.grid_size); +} + +Callbacks timedemoCallbacks = { + displayGame, idleTimedemo, keyTimedemo, initTimedemo, exitTimedemo, + initGLGame, NULL /* mouse button */, NULL /* mouse motion */, "timedemo" +}; + |