1 #include "game/gltron.h"
2
3 static int startTime = 0;
4 static int frames = 0;
5
idleTimedemo(void)6 void idleTimedemo(void) {
7 int t;
8 int i, j;
9
10 List *p, *l;
11
12 Sound_idle();
13
14 game2->time.current += 20;
15
16 for(j = 0; j < 2; j++) { // run display at a theoretical 50 Hz
17 t = 10; // run game physics at 100 Hz
18
19 game2->time.dt = 10;
20
21 for(i = 0; i < game->players; i++) {
22 if(game->player[i].ai != NULL) {
23 if(game->player[i].ai->active == AI_COMPUTER &&
24 PLAYER_IS_ACTIVE(&game->player[i])) {
25 doComputer(i, 0);
26 }
27 }
28 }
29
30 /* process any outstanding events generated by the AI (turns, etc) */
31 for(p = &(game2->events); p->next != NULL; p = p->next) {
32 if(processEvent((GameEvent*) p->data))
33 return;
34 }
35
36 /* free events */
37 p = game2->events.next;
38 while(p != NULL) {
39 l = p;
40 p = p->next;
41 free(l);
42 }
43 game2->events.next = NULL;
44
45 l = doMovement(1, t); /* this can generate new events */
46 if(l != NULL) {
47 for(p = l; p->next != NULL; p = p->next) {
48 if(processEvent((GameEvent*) p->data));
49 }
50
51 }
52 /* free list */
53 p = l;
54 while(p != NULL) {
55 l = p;
56 p = p->next;
57 free(l);
58 }
59 }
60
61 game2->time.dt = 20;
62 doCameraMovement();
63 doRecognizerMovement();
64 scripting_RunGC();
65 SystemPostRedisplay();
66 frames++;
67 game2->time.lastFrame += 20;
68 }
69
keyTimedemo(int state,int key,int x,int y)70 void keyTimedemo(int state, int key, int x, int y) {
71 if(state == SYSTEM_KEYSTATE_UP)
72 return;
73
74 if(key == 27)
75 SystemExitLoop(RETURN_TIMEDEMO_ABORT);
76 }
77
78 struct {
79 float speed;
80 int eraseCrashed, grid_size;
81 } saveRules;
82
83 extern int c_resetCamera();
84
initTimedemo(void)85 void initTimedemo(void) {
86 int i = 0;
87
88 printf("-- initializing timedemo\n");
89
90 frames = 0;
91 startTime = SystemGetElapsedTime();
92
93 tsrand(12313);
94
95 resetRecognizer();
96
97 updateSettingsCache();
98
99 // overwrite AI skills & rules in settingsCache
100 gSettingsCache.ai_level = 2;
101 gSettingsCache.show_ai_status = 0;
102 gSettingsCache.show_fps = 0;
103 gSettingsCache.camType = CAM_CIRCLE;
104 gSettingsCache.show_console = 0;
105
106 saveRules.speed = getSettingf("speed");
107 saveRules.eraseCrashed = getSettingi("erase_crashed");
108 saveRules.grid_size = getSettingi("grid_size");
109
110 setSettingf("speed", 12);
111 setSettingi("erase_crashed", 1);
112 setSettingi("grid_size", 200);
113
114 game2->mode = GAME_SINGLE;
115 initData();
116 changeDisplay(-1);
117
118 for(i = 0; i < game->players; i++) {
119 game->player[i].ai->active = AI_COMPUTER;
120 // set all camera phi values to 0
121 game->player[i].camera->movement[CAM_PHI] = PI / 18;
122 game->player[i].camera->movement[CAM_CHI] = PI / 3;
123 }
124
125 SystemHidePointer();
126 SystemWarpPointer(MOUSE_ORIG_X, MOUSE_ORIG_Y);
127 game2->time.offset = SystemGetElapsedTime() - game2->time.current;
128 }
129
exitTimedemo(void)130 void exitTimedemo(void) {
131 int dt = SystemGetElapsedTime() - startTime;
132 if(dt) {
133 displayMessage(TO_STDERR | TO_CONSOLE,
134 "timedemo FPS: %.2f\n",
135 (float) frames / dt * 1000.0f);
136 // displayMessage(TO_STDERR | TO_CONSOLE, "timedemo FPS: %.2f (%d frames in %f seconds)\n", (float) frames / dt * 1000.0f, frames, dt / 1000.0f);
137 }
138 else {
139 // displayMessage(TO_STDERR | TO_CONSOLE, "dt: %d, frames: %d\n", dt, frames);
140 // actually, this would be a good reason to abort with a fatal error
141 }
142
143 setSettingf("speed", saveRules.speed);
144 setSettingi("eraseCrashed", saveRules.eraseCrashed);
145 setSettingi("grid_size", saveRules.grid_size);
146 }
147
148 Callbacks timedemoCallbacks = {
149 displayGame, idleTimedemo, keyTimedemo, initTimedemo, exitTimedemo,
150 initGLGame, NULL /* mouse button */, NULL /* mouse motion */, "timedemo"
151 };
152
153