summaryrefslogtreecommitdiffstats
path: root/src/game/timedemo.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/game/timedemo.c')
-rw-r--r--src/game/timedemo.c152
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"
+};
+