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