home *** CD-ROM | disk | FTP | other *** search
/ Amiga ACS 1998 #6 / amigaacscoverdisc1998-061998.iso / games / descent / source / main / demo.c < prev    next >
C/C++ Source or Header  |  1998-06-08  |  9KB  |  356 lines

  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.  
  92.  
  93. #pragma off (unreferenced)
  94. static char rcsid[] = "$Id: demo.c 2.0 1995/02/27 11:30:55 john Exp $";
  95. #pragma on (unreferenced)
  96.  
  97.  
  98. #include <stdlib.h>
  99. #include <stdio.h>
  100.  
  101. #include "inferno.h"
  102. #include "game.h"
  103. #include "key.h"
  104. #include "object.h"
  105. #include "error.h"
  106. #include "mono.h"
  107. #include "timer.h"
  108. #include "render.h"
  109. #include "screens.h"
  110. #include "vecmat.h"
  111. #include "demo.h"
  112. #include "slew.h"
  113. #include "player.h"
  114.  
  115. #include "demorecs.c"
  116.  
  117. int    Num_demo_recs=0, Demo_record_index, Demo_last_time;
  118. fix    Demo_start_time;
  119.  
  120. int    Demo_mode, Auto_demo = 0;
  121.  
  122. demorec Demo_records[MAX_DEMO_RECS];
  123.  
  124. void print_demo_message(void)
  125. {
  126. //    gr_set_curfont( game_font );
  127. //    gr_set_fontcolor(gr_getcolor(0,55,0), gr_getcolor(0,0,0));
  128. //    gr_printf(24, 20, "AUTO DEMO    ");
  129. //    gr_printf(24, 28, "ESC TO END   ");
  130. }
  131.  
  132. void start_demo_playback(void)
  133. {
  134. //    print_demo_message();
  135. //
  136. //    Player_stats.time_total = 0;
  137. //    Demo_start_time = Player_stats.time_total; // = 0;
  138. }
  139.  
  140. //    For curtime, return location and pbh
  141. //    Return 1 if demo playback over.
  142. //    Curtime should be current absolute time.  Internally, Demo_start_time is subtracted.
  143. int get_demo_data(fix curtime, vms_vector *pos, vms_angvec *pbh, short *segnum, int *do_fire)
  144. {
  145.     int        rec;
  146.     demorec    *demo_ptr, *demo_ptr2;
  147.     fix        base_x, base_y, base_z;
  148.     fixang    base_p, base_b, base_h;
  149.  
  150.     fix        delta_x, delta_y, delta_z;
  151.     fixang    delta_p, delta_b, delta_h;
  152.     fix        delta_time, scale_time, extra_time;
  153.  
  154.     rec = 0;
  155.  
  156.     curtime -= Demo_start_time;
  157.  
  158.     while ((curtime > Demo_records[rec].time) && (rec < Num_demo_recs-1))
  159.         rec++;
  160.  
  161.     if (rec > 0)
  162.         rec--;        // we overshot
  163.  
  164. //mprintf(0,"Record = %3i ", rec);
  165.  
  166.     if (rec >= Num_demo_recs-2) {
  167.         // mprintf(0, "DONE!\n");
  168.         start_demo_playback();
  169.         return 1;        // done doing demo playback
  170.     }
  171.  
  172.     demo_ptr = &Demo_records[rec];
  173.     demo_ptr2 = &Demo_records[rec+1];
  174.  
  175.     extra_time = curtime - demo_ptr->time;
  176.  
  177.     base_x = demo_ptr->x;
  178.     base_y = demo_ptr->y;
  179.     base_z = demo_ptr->z;
  180.     base_p = demo_ptr->p;
  181.     base_b = demo_ptr->b;
  182.     base_h = demo_ptr->h;
  183.  
  184.     delta_x = demo_ptr2->x - base_x;
  185.     delta_y = demo_ptr2->y - base_y;
  186.     delta_z = demo_ptr2->z - base_z;
  187.     delta_p = demo_ptr2->p - base_p;
  188.     delta_b = demo_ptr2->b - base_b;
  189.     delta_h = demo_ptr2->h - base_h;
  190.  
  191.     delta_time = demo_ptr2->time - demo_ptr->time;
  192.  
  193.     if (curtime != 0) {
  194.         scale_time = fixdiv(extra_time, delta_time);
  195.         base_x += fixmul(delta_x, scale_time);
  196.         base_y += fixmul(delta_y, scale_time);
  197.         base_z += fixmul(delta_z, scale_time);
  198.         base_p += fixmul(delta_p, scale_time);
  199.         base_b += fixmul(delta_b, scale_time);
  200.         base_h += fixmul(delta_h, scale_time);
  201.     }
  202.  
  203. //mprintf(0, "%8x %8x %8x %4x %4x %4x\n", base_x, base_y, base_z, base_p, base_b, base_h);
  204.  
  205.     pos->x = base_x;
  206.     pos->y = base_y;
  207.     pos->z = base_z;
  208.  
  209.     pbh->p = base_p;
  210.     pbh->b = base_b;
  211.     pbh->h = base_h;
  212.  
  213.     *segnum = demo_ptr->segnum;
  214.  
  215. //    if (demo_ptr->specials)
  216. //        *do_fire = 1;
  217. //    else
  218.         *do_fire = 0;
  219. //    if (demo_ptr->specials)
  220. //        switch (Demo_frame_count %10) {
  221. //            case 0:
  222. //            case 1:
  223. //            case 3:
  224. //            case 5:
  225. //            case 8:
  226. //                *do_fire = 1;
  227. //                break;
  228. //            default:
  229. //                *do_fire = 0;
  230. //        }
  231.     return 0;
  232.  
  233. }
  234.  
  235. void start_demo_recording(void)
  236. {
  237. //    Demo_record_index = 0;
  238. //    Demo_start_time = Player_stats.time_total;
  239. //    Demo_last_time = Demo_start_time - 65536;
  240.  
  241. }
  242.  
  243. void matrix_compare(vms_matrix *mat1, vms_matrix *mat2)
  244. {
  245.     int    totdiff;
  246.  
  247.     totdiff = 0;
  248.     totdiff += abs(mat1->m1 - mat2->m1);
  249.     totdiff += abs(mat1->m2 - mat2->m2);
  250.     totdiff += abs(mat1->m3 - mat2->m3);
  251.     totdiff += abs(mat1->m4 - mat2->m4);
  252.     totdiff += abs(mat1->m5 - mat2->m5);
  253.     totdiff += abs(mat1->m6 - mat2->m6);
  254.     totdiff += abs(mat1->m7 - mat2->m7);
  255.     totdiff += abs(mat1->m8 - mat2->m8);
  256.     totdiff += abs(mat1->m9 - mat2->m9);
  257.  
  258.     //mprintf(0, "Matt's matrix error = %i\n", totdiff);
  259. }
  260.  
  261. void record_demo_frame(void)
  262. {
  263.     vms_angvec    pbh;
  264.  
  265. //mprintf(0, "Record start...");
  266.  
  267. mprintf(0, "Curtime = %6i, Last time = %6i\n", Player_stats.time_total, Demo_last_time);
  268.  
  269.   if (GameTime - Demo_last_time >= 65536) {
  270.     Demo_last_time = GameTime;
  271.     if (Demo_record_index < MAX_DEMO_RECS) {
  272.         demorec *demo_ptr = &Demo_records[Demo_record_index];
  273.         vms_matrix tempmat;
  274.  
  275.         demo_ptr->time = GameTime - Demo_start_time;
  276.  
  277.         demo_ptr->x = Player->pos.x;
  278.         demo_ptr->y = Player->pos.y;
  279.         demo_ptr->z = Player->pos.z;
  280.  
  281.         vm_extract_angles_matrix(&pbh, &Player->orient);
  282.         vm_angles_2_matrix(&tempmat, &pbh);
  283.         matrix_compare(&tempmat, &Player->orient);
  284.         demo_ptr->p = pbh.p;
  285.         demo_ptr->b = pbh.b;
  286.         demo_ptr->h = pbh.h;
  287.  
  288.         demo_ptr->segnum = Player->segnum;
  289.  
  290.         Demo_record_index++;
  291.         Num_demo_recs = Demo_record_index;
  292.  
  293. //        if (firing)
  294. //            demo_ptr->specials = 1;
  295. //        else
  296. //            demo_ptr->specials = 0;
  297.     }
  298.   }
  299. //mprintf(0, "Record end\n");
  300. }
  301.  
  302. void setup_predefined_demo(void)
  303. {
  304.     int    i;
  305.  
  306.     Num_demo_recs = Num_predefined_demo_recs;
  307.  
  308.     for (i=0; i<Num_predefined_demo_recs; i++)
  309.         Demo_records[i] = Predefined_demo_records[i];
  310.  
  311.     slew_stop( Player );
  312.     start_demo_playback();
  313.     Demo_mode = DEMO_PLAYBACK;
  314.     //??Player->mode = CAMERA_MODE_SLEW;
  315.  
  316. }
  317.  
  318. //    This function should be called when the game is loaded.
  319. //    The first time it is called, if the variable Auto_demo is set, then it will run the auto-demo.
  320. //    If the variable is not set, it just returns.
  321. void demo_startup(void)
  322. {
  323.     //    Warning!  Danger!  Shameful hack!  Don't know how to tell if demo1.min is loaded, so
  324.     //    just make sure there are a bunch of segments.
  325.     
  326.     // Fixed hack to check if Demo mine is loaded.
  327.  
  328. //    mprintf(0, "demo_loaded for startup %d\n", demo_loaded); 
  329. //    if (Auto_demo && (demo_loaded==1)) {
  330. //        setup_predefined_demo();
  331. //    }
  332. //    Auto_demo = 0;
  333. }
  334.  
  335. void write_demo_as_source(void)
  336. {
  337.     int    i;
  338.     FILE    *fp;
  339.  
  340.     fp = fopen( "demorecs.c", "wt" );
  341.  
  342.     fprintf(fp, "int Num_predefined_demo_recs = %i;\n", Num_demo_recs);
  343.  
  344.     fprintf(fp, "demorec Predefined_demo_records[] = {\n");
  345.     for (i=0; i<Num_demo_recs; i++) {
  346.         demorec *dp = &Demo_records[i];
  347.         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);
  348.     }
  349.     fprintf(fp, "};\n");
  350.  
  351.     fclose(fp);
  352. }
  353.  
  354.  
  355.  
  356.