DEMO.C 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356
  1. /*
  2. THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX
  3. SOFTWARE CORPORATION ("PARALLAX"). PARALLAX, IN DISTRIBUTING THE CODE TO
  4. END-USERS, AND SUBJECT TO ALL OF THE TERMS AND CONDITIONS HEREIN, GRANTS A
  5. ROYALTY-FREE, PERPETUAL LICENSE TO SUCH END-USERS FOR USE BY SUCH END-USERS
  6. IN USING, DISPLAYING, AND CREATING DERIVATIVE WORKS THEREOF, SO LONG AS
  7. SUCH USE, DISPLAY OR CREATION IS FOR NON-COMMERCIAL, ROYALTY OR REVENUE
  8. FREE PURPOSES. IN NO EVENT SHALL THE END-USER USE THE COMPUTER CODE
  9. CONTAINED HEREIN FOR REVENUE-BEARING PURPOSES. THE END-USER UNDERSTANDS
  10. AND AGREES TO THE TERMS HEREIN AND ACCEPTS THE SAME BY USE OF THIS FILE.
  11. COPYRIGHT 1993-1998 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED.
  12. */
  13. /*
  14. * $Source: f:/miner/source/main/rcs/demo.c $
  15. * $Revision: 2.0 $
  16. * $Author: john $
  17. * $Date: 1995/02/27 11:30:55 $
  18. *
  19. * Demo playback and recording.
  20. *
  21. * $Log: demo.c $
  22. * Revision 2.0 1995/02/27 11:30:55 john
  23. * New version 2.0, which has no anonymous unions, builds with
  24. * Watcom 10.0, and doesn't require parsing BITMAPS.TBL.
  25. *
  26. * Revision 1.19 1994/12/15 13:04:11 mike
  27. * Replace Players[Player_num].time_total references with GameTime.
  28. *
  29. * Revision 1.18 1994/07/02 13:49:49 matt
  30. * Cleaned up includes
  31. *
  32. * Revision 1.17 1994/06/24 17:01:37 john
  33. * Add VFX support; Took Game Sequencing, like EndGame and stuff and
  34. * took it out of game.c and into gameseq.c
  35. *
  36. * Revision 1.16 1994/06/20 12:02:10 john
  37. * Made demo only start if the -autostart switch is on ...
  38. *
  39. *
  40. * Revision 1.15 1994/05/19 18:53:21 yuan
  41. * Changing player structure...
  42. *
  43. * Revision 1.14 1994/05/14 17:16:08 matt
  44. * Got rid of externs in source (non-header) files
  45. *
  46. * Revision 1.13 1994/02/17 11:32:33 matt
  47. * Changes in object system
  48. *
  49. * Revision 1.12 1994/02/11 21:51:12 matt
  50. * Made auto_demo off by default
  51. *
  52. * Revision 1.11 1994/02/10 17:45:38 yuan
  53. * Integrated some hacks which still need to be fixed.
  54. *
  55. * Revision 1.10 1994/02/09 13:42:31 john
  56. * Fix demo playback bug with Slew_object->pos and
  57. * Slew_object->seg_id not being in sync by call
  58. * ing check_object_seg after the demo code computes
  59. * x,y,z and segment each frame.
  60. *
  61. * Revision 1.9 1994/02/08 12:38:29 yuan
  62. * fixed demo_loaded variable, so it must be 1 (first time)
  63. * to run demo.
  64. *
  65. * Revision 1.8 1994/02/07 17:25:01 yuan
  66. * Fixed hack, reset time.
  67. *
  68. * Revision 1.7 1994/02/02 09:41:51 mike
  69. * much auto-demo stuff.
  70. *
  71. * Revision 1.6 1994/02/01 18:04:19 yuan
  72. * Tweaked gauges
  73. *
  74. * Revision 1.5 1994/02/01 16:26:51 yuan
  75. * Removed mprintf debugs.
  76. *
  77. * Revision 1.4 1994/02/01 16:21:03 yuan
  78. * Checked in.
  79. *
  80. * Revision 1.3 1994/02/01 15:14:53 mike
  81. * Self-running demo code.
  82. *
  83. * Revision 1.2 1994/02/01 11:49:46 mike
  84. * Demo system.
  85. *
  86. * Revision 1.1 1994/01/31 18:10:23 mike
  87. * Initial revision
  88. *
  89. *
  90. */
  91. #pragma off (unreferenced)
  92. static char rcsid[] = "$Id: demo.c 2.0 1995/02/27 11:30:55 john Exp $";
  93. #pragma on (unreferenced)
  94. #include <stdlib.h>
  95. #include <stdio.h>
  96. #include "inferno.h"
  97. #include "game.h"
  98. #include "key.h"
  99. #include "object.h"
  100. #include "error.h"
  101. #include "mono.h"
  102. #include "timer.h"
  103. #include "render.h"
  104. #include "screens.h"
  105. #include "vecmat.h"
  106. #include "demo.h"
  107. #include "slew.h"
  108. #include "player.h"
  109. #include "demorecs.c"
  110. int Num_demo_recs=0, Demo_record_index, Demo_last_time;
  111. fix Demo_start_time;
  112. int Demo_mode, Auto_demo = 0;
  113. demorec Demo_records[MAX_DEMO_RECS];
  114. void print_demo_message(void)
  115. {
  116. // gr_set_curfont( game_font );
  117. // gr_set_fontcolor(gr_getcolor(0,55,0), gr_getcolor(0,0,0));
  118. // gr_printf(24, 20, "AUTO DEMO ");
  119. // gr_printf(24, 28, "ESC TO END ");
  120. }
  121. void start_demo_playback(void)
  122. {
  123. // print_demo_message();
  124. //
  125. // Player_stats.time_total = 0;
  126. // Demo_start_time = Player_stats.time_total; // = 0;
  127. }
  128. // For curtime, return location and pbh
  129. // Return 1 if demo playback over.
  130. // Curtime should be current absolute time. Internally, Demo_start_time is subtracted.
  131. int get_demo_data(fix curtime, vms_vector *pos, vms_angvec *pbh, short *segnum, int *do_fire)
  132. {
  133. int rec;
  134. demorec *demo_ptr, *demo_ptr2;
  135. fix base_x, base_y, base_z;
  136. fixang base_p, base_b, base_h;
  137. fix delta_x, delta_y, delta_z;
  138. fixang delta_p, delta_b, delta_h;
  139. fix delta_time, scale_time, extra_time;
  140. rec = 0;
  141. curtime -= Demo_start_time;
  142. while ((curtime > Demo_records[rec].time) && (rec < Num_demo_recs-1))
  143. rec++;
  144. if (rec > 0)
  145. rec--; // we overshot
  146. //mprintf(0,"Record = %3i ", rec);
  147. if (rec >= Num_demo_recs-2) {
  148. // mprintf(0, "DONE!\n");
  149. start_demo_playback();
  150. return 1; // done doing demo playback
  151. }
  152. demo_ptr = &Demo_records[rec];
  153. demo_ptr2 = &Demo_records[rec+1];
  154. extra_time = curtime - demo_ptr->time;
  155. base_x = demo_ptr->x;
  156. base_y = demo_ptr->y;
  157. base_z = demo_ptr->z;
  158. base_p = demo_ptr->p;
  159. base_b = demo_ptr->b;
  160. base_h = demo_ptr->h;
  161. delta_x = demo_ptr2->x - base_x;
  162. delta_y = demo_ptr2->y - base_y;
  163. delta_z = demo_ptr2->z - base_z;
  164. delta_p = demo_ptr2->p - base_p;
  165. delta_b = demo_ptr2->b - base_b;
  166. delta_h = demo_ptr2->h - base_h;
  167. delta_time = demo_ptr2->time - demo_ptr->time;
  168. if (curtime != 0) {
  169. scale_time = fixdiv(extra_time, delta_time);
  170. base_x += fixmul(delta_x, scale_time);
  171. base_y += fixmul(delta_y, scale_time);
  172. base_z += fixmul(delta_z, scale_time);
  173. base_p += fixmul(delta_p, scale_time);
  174. base_b += fixmul(delta_b, scale_time);
  175. base_h += fixmul(delta_h, scale_time);
  176. }
  177. //mprintf(0, "%8x %8x %8x %4x %4x %4x\n", base_x, base_y, base_z, base_p, base_b, base_h);
  178. pos->x = base_x;
  179. pos->y = base_y;
  180. pos->z = base_z;
  181. pbh->p = base_p;
  182. pbh->b = base_b;
  183. pbh->h = base_h;
  184. *segnum = demo_ptr->segnum;
  185. // if (demo_ptr->specials)
  186. // *do_fire = 1;
  187. // else
  188. *do_fire = 0;
  189. // if (demo_ptr->specials)
  190. // switch (Demo_frame_count %10) {
  191. // case 0:
  192. // case 1:
  193. // case 3:
  194. // case 5:
  195. // case 8:
  196. // *do_fire = 1;
  197. // break;
  198. // default:
  199. // *do_fire = 0;
  200. // }
  201. return 0;
  202. }
  203. void start_demo_recording(void)
  204. {
  205. // Demo_record_index = 0;
  206. // Demo_start_time = Player_stats.time_total;
  207. // Demo_last_time = Demo_start_time - 65536;
  208. }
  209. void matrix_compare(vms_matrix *mat1, vms_matrix *mat2)
  210. {
  211. int totdiff;
  212. totdiff = 0;
  213. totdiff += abs(mat1->m1 - mat2->m1);
  214. totdiff += abs(mat1->m2 - mat2->m2);
  215. totdiff += abs(mat1->m3 - mat2->m3);
  216. totdiff += abs(mat1->m4 - mat2->m4);
  217. totdiff += abs(mat1->m5 - mat2->m5);
  218. totdiff += abs(mat1->m6 - mat2->m6);
  219. totdiff += abs(mat1->m7 - mat2->m7);
  220. totdiff += abs(mat1->m8 - mat2->m8);
  221. totdiff += abs(mat1->m9 - mat2->m9);
  222. //mprintf(0, "Matt's matrix error = %i\n", totdiff);
  223. }
  224. void record_demo_frame(void)
  225. {
  226. vms_angvec pbh;
  227. //mprintf(0, "Record start...");
  228. mprintf(0, "Curtime = %6i, Last time = %6i\n", Player_stats.time_total, Demo_last_time);
  229. if (GameTime - Demo_last_time >= 65536) {
  230. Demo_last_time = GameTime;
  231. if (Demo_record_index < MAX_DEMO_RECS) {
  232. demorec *demo_ptr = &Demo_records[Demo_record_index];
  233. vms_matrix tempmat;
  234. demo_ptr->time = GameTime - Demo_start_time;
  235. demo_ptr->x = Player->pos.x;
  236. demo_ptr->y = Player->pos.y;
  237. demo_ptr->z = Player->pos.z;
  238. vm_extract_angles_matrix(&pbh, &Player->orient);
  239. vm_angles_2_matrix(&tempmat, &pbh);
  240. matrix_compare(&tempmat, &Player->orient);
  241. demo_ptr->p = pbh.p;
  242. demo_ptr->b = pbh.b;
  243. demo_ptr->h = pbh.h;
  244. demo_ptr->segnum = Player->segnum;
  245. Demo_record_index++;
  246. Num_demo_recs = Demo_record_index;
  247. // if (firing)
  248. // demo_ptr->specials = 1;
  249. // else
  250. // demo_ptr->specials = 0;
  251. }
  252. }
  253. //mprintf(0, "Record end\n");
  254. }
  255. void setup_predefined_demo(void)
  256. {
  257. int i;
  258. Num_demo_recs = Num_predefined_demo_recs;
  259. for (i=0; i<Num_predefined_demo_recs; i++)
  260. Demo_records[i] = Predefined_demo_records[i];
  261. slew_stop( Player );
  262. start_demo_playback();
  263. Demo_mode = DEMO_PLAYBACK;
  264. //??Player->mode = CAMERA_MODE_SLEW;
  265. }
  266. // This function should be called when the game is loaded.
  267. // The first time it is called, if the variable Auto_demo is set, then it will run the auto-demo.
  268. // If the variable is not set, it just returns.
  269. void demo_startup(void)
  270. {
  271. // Warning! Danger! Shameful hack! Don't know how to tell if demo1.min is loaded, so
  272. // just make sure there are a bunch of segments.
  273. // Fixed hack to check if Demo mine is loaded.
  274. // mprintf(0, "demo_loaded for startup %d\n", demo_loaded);
  275. // if (Auto_demo && (demo_loaded==1)) {
  276. // setup_predefined_demo();
  277. // }
  278. // Auto_demo = 0;
  279. }
  280. void write_demo_as_source(void)
  281. {
  282. int i;
  283. FILE *fp;
  284. fp = fopen( "demorecs.c", "wt" );
  285. fprintf(fp, "int Num_predefined_demo_recs = %i;\n", Num_demo_recs);
  286. fprintf(fp, "demorec Predefined_demo_records[] = {\n");
  287. for (i=0; i<Num_demo_recs; i++) {
  288. demorec *dp = &Demo_records[i];
  289. fprintf(fp, " { %li, %li, %li, %li, %li, %li, %li, %li },\n", dp->time, dp->x, dp->y, dp->z, dp->p, dp->b, dp->h, dp->segnum); //, dp->specials);
  290. }
  291. fprintf(fp, "};\n");
  292. fclose(fp);
  293. }