home *** CD-ROM | disk | FTP | other *** search
/ Amiga ACS 1998 #6 / amigaacscoverdisc1998-061998.iso / games / descent / source / main / info.c < prev    next >
Text File  |  1998-06-08  |  14KB  |  476 lines

  1. /*
  2.  * $Source: f:/miner/source/main/editor/rcs/info.c $
  3.  * $Revision: 2.0 $
  4.  * $Author: john $
  5.  * $Date: 1995/02/27 11:35:34 $
  6.  * 
  7.  * Print debugging info in ui.
  8.  * 
  9.  * $Log: info.c $
  10.  * Revision 2.0  1995/02/27  11:35:34  john
  11.  * Version 2.0! No anonymous unions, Watcom 10.0, with no need
  12.  * for bitmaps.tbl.
  13.  * 
  14.  * Revision 1.42  1995/02/22  15:12:50  allender
  15.  * remove anonymous unions from object structure
  16.  * 
  17.  * Revision 1.41  1994/12/08  13:59:39  matt
  18.  * *** empty log message ***
  19.  * 
  20.  * Revision 1.40  1994/09/30  00:38:30  mike
  21.  * Fix some diagnostic messages
  22.  * 
  23.  * Revision 1.39  1994/09/29  20:13:12  mike
  24.  * Clean up some text, prevent it from writing outside canvas.
  25.  * 
  26.  * Revision 1.38  1994/09/29  09:32:17  mike
  27.  * Fix text clipping problem in UI keypad info text.
  28.  * 
  29.  * Revision 1.37  1994/09/25  23:42:20  matt
  30.  * Took out references to obsolete constants
  31.  * 
  32.  * Revision 1.36  1994/08/25  21:57:05  mike
  33.  * IS_CHILD stuff.
  34.  * 
  35.  * Revision 1.35  1994/08/23  16:39:50  mike
  36.  * mode replaced by behavior in ai_info.
  37.  * 
  38.  * Revision 1.34  1994/07/18  10:45:23  mike
  39.  * Fix erase window in texture pads after adding more click-boxes.
  40.  * 
  41.  * Revision 1.33  1994/07/15  12:34:10  mike
  42.  * Remove use of AIM_FOLLOW_PATH_CIRCULAR.
  43.  * 
  44.  * Revision 1.32  1994/06/17  17:13:46  yuan
  45.  * Fixed text so it doesn't overflow screen
  46.  * 
  47.  * Revision 1.31  1994/06/01  17:22:31  matt
  48.  * Set font color before drawing info; got rid of superfluous %d
  49.  * 
  50.  * Revision 1.30  1994/05/29  23:40:29  matt
  51.  * Killed reference to now-unused movement type
  52.  * 
  53.  * Revision 1.29  1994/05/29  22:52:32  matt
  54.  * Deleted unused stuff
  55.  * 
  56.  * Revision 1.28  1994/05/27  10:34:16  yuan
  57.  * Added new Dialog boxes for Walls and Triggers.
  58.  * 
  59.  * Revision 1.27  1994/05/17  10:34:35  matt
  60.  * Changed Num_objects to num_objects, since it's not really global anymore
  61.  * 
  62.  * Revision 1.26  1994/05/14  17:17:59  matt
  63.  * Got rid of externs in source (non-header) files
  64.  * 
  65.  * Revision 1.25  1994/05/12  14:47:07  mike
  66.  * Adjust for Ai_states killed, replaced by field in object structure.
  67.  * 
  68.  * Revision 1.24  1994/05/06  12:52:11  yuan
  69.  * Adding some gamesave checks...
  70.  * 
  71.  * Revision 1.23  1994/05/03  19:21:28  matt
  72.  * Removed reference to robot flythrough mode, which doesn't exist anymore
  73.  * 
  74.  * Revision 1.22  1994/05/03  11:03:06  mike
  75.  * Customize text for segment sizing keypad.
  76.  * 
  77.  * Revision 1.21  1994/04/29  15:05:40  yuan
  78.  * More info added...
  79.  * 
  80.  * Revision 1.20  1994/04/22  17:45:58  john
  81.  * MAde top 2 bits of paste-ons pick the 
  82.  * orientation of the bitmap.
  83.  * 
  84.  * Revision 1.19  1994/04/20  17:29:30  yuan
  85.  * Added tmap_num info.
  86.  * 
  87.  * Revision 1.18  1994/04/13  19:12:55  mike
  88.  * Fix font color problems in keypads.
  89.  * 
  90.  * Revision 1.17  1994/04/13  13:26:37  mike
  91.  * Kill a mprintf.
  92.  * 
  93.  * Revision 1.16  1994/04/13  13:24:44  mike
  94.  * Separate info display, customize for each keypad.
  95.  * 
  96.  * Revision 1.15  1994/03/19  17:21:31  yuan
  97.  * Wall system implemented until specific features need to be added...
  98.  * (Needs to be hammered on though.)
  99.  * 
  100.  * Revision 1.14  1994/02/22  18:13:13  yuan
  101.  * Added tmap number field.
  102.  * 
  103.  * Revision 1.13  1994/02/17  09:46:27  matt
  104.  * Removed include of slew.h
  105.  * 
  106.  * Revision 1.12  1994/02/16  19:58:56  yuan
  107.  * Added type to info
  108.  * 
  109.  * Revision 1.11  1994/02/16  16:48:08  yuan
  110.  * Added Curside.
  111.  * 
  112.  * Revision 1.10  1994/02/03  17:26:43  yuan
  113.  * Fixed formatting of vertex numbering.
  114.  * 
  115.  * Revision 1.9  1994/01/31  12:17:06  yuan
  116.  * Make sure Num_segments, etc. are drawn.
  117.  * 
  118.  * Revision 1.8  1994/01/22  13:43:12  yuan
  119.  * Cosmetic fixes.
  120.  * 
  121.  * Revision 1.7  1994/01/21  12:14:59  yuan
  122.  * Fixed cosmetic problem
  123.  * 
  124.  * Revision 1.6  1994/01/21  12:01:03  yuan
  125.  * Added segment and vertex info
  126.  * 
  127.  * Revision 1.5  1994/01/20  11:28:11  john
  128.  * *** empty log message ***
  129.  * 
  130.  * Revision 1.4  1994/01/19  10:44:42  john
  131.  * *** empty log message ***
  132.  * 
  133.  * Revision 1.3  1994/01/19  10:32:36  john
  134.  * *** empty log message ***
  135.  * 
  136.  * Revision 1.2  1994/01/19  09:34:31  john
  137.  * First version.
  138.  * 
  139.  * Revision 1.1  1994/01/19  09:30:43  john
  140.  * Initial revision
  141.  * 
  142.  * 
  143.  */
  144.  
  145.  
  146. #pragma off (unreferenced)
  147. static char rcsid[] = "$Id: info.c 2.0 1995/02/27 11:35:34 john Exp $";
  148. #pragma on (unreferenced)
  149.  
  150. #include <i86.h>
  151. #include <stdio.h>
  152. #include <stdlib.h>
  153. #include <string.h>                                                  
  154. #include <malloc.h>
  155.  
  156. #include "inferno.h"
  157. #include "segment.h"
  158. #include "gr.h"
  159. #include "ui.h"
  160. #include "editor.h"
  161.  
  162. #include "mono.h"
  163. #include "error.h"
  164. #include "textures.h"
  165. #include "object.h"
  166. #include "ai.h"
  167.  
  168. #include "texpage.h"        // Textue selection paging stuff
  169. #include "objpage.h"        // Object selection paging stuff
  170.  
  171. #include "wall.h"
  172. #include "switch.h"
  173.  
  174. int init_info;
  175.  
  176. struct meminfo {
  177.     int LargestBlockAvail;
  178.     int MaxUnlockedPage;
  179.     int LargestLockablePage;
  180.     int LinAddrSpace;
  181.     int NumFreePagesAvail;
  182.     int NumPhysicalPagesFree;
  183.     int TotalPhysicalPages;
  184.     int FreeLinAddrSpace;
  185.     int SizeOfPageFile;
  186.     int Reserved[3];
  187. } MemInfo;
  188.  
  189. #define DPMI_INT        0x31
  190.  
  191. void read_mem_info()
  192. {
  193.     union REGS regs;
  194.     struct SREGS sregs;
  195.  
  196.     regs.x.eax = 0x00000500;
  197.     memset( &sregs, 0, sizeof(sregs) );
  198.     sregs.es = FP_SEG( &MemInfo );
  199.     regs.x.edi = FP_OFF( &MemInfo );
  200.  
  201.     int386x( DPMI_INT, ®s, ®s, &sregs );
  202. }
  203.  
  204. char * get_object_type(int num, char *name)
  205. {
  206.     switch (num) {
  207.         case OBJ_NONE:            strcpy(name, "OBJ_NONE    ");    break;
  208.         case OBJ_WALL:         strcpy(name, "OBJ_WALL    ");    break;
  209.         case OBJ_FIREBALL:     strcpy(name, "OBJ_FIREBALL");    break;
  210.         case OBJ_ROBOT:         strcpy(name, "OBJ_ROBOT   ");    break;
  211.         case OBJ_HOSTAGE:     strcpy(name, "OBJ_HOSTAGE ");    break;
  212.         case OBJ_PLAYER:         strcpy(name, "OBJ_PLAYER  ");    break;
  213.         case OBJ_WEAPON:         strcpy(name, "OBJ_WEAPON  ");    break;
  214.         case OBJ_CAMERA:         strcpy(name, "OBJ_CAMERA  ");    break;
  215.         case OBJ_POWERUP:     strcpy(name, "OBJ_POWERUP ");    break;
  216.         default:                    strcpy(name, " (unknown)  ");    break;
  217.     }
  218.  
  219.     return name;
  220. }
  221.  
  222. char * get_control_type(int num, char *name)
  223. {
  224.     switch (num) {
  225.         case CT_NONE:                    strcpy(name, "CT_NONE       ");    break;
  226.         case CT_AI:                        strcpy(name, "CT_AI         ");    break;
  227.         case CT_EXPLOSION:            strcpy(name, "CT_EXPLOSION  ");    break;
  228.         //case CT_MULTIPLAYER:            strcpy(name, "CT_MULTIPLAYER");    break;
  229.         case CT_FLYING:                strcpy(name, "CT_FLYING     ");    break;
  230.         case CT_SLEW:                    strcpy(name, "CT_SLEW       ");    break;
  231.         case CT_FLYTHROUGH:            strcpy(name, "CT_FLYTHROUGH ");    break;
  232.         //case CT_DEMO:                    strcpy(name, "CT_DEMO       ");    break;
  233.         //case CT_ROBOT_FLYTHROUGH:    strcpy(name, "CT_FLYTHROUGH ");    break;
  234.         case CT_WEAPON:                strcpy(name, "CT_WEAPON     ");    break;
  235.         default:                            strcpy(name, " (unknown)    ");    break;
  236.     }
  237.     return name;
  238. }
  239.  
  240. char * get_movement_type(int num, char *name)
  241. {
  242.     switch (num) {
  243.         case MT_NONE:            strcpy(name, "MT_NONE       ");    break;
  244.         case MT_PHYSICS:        strcpy(name, "MT_PHYSICS    ");    break;
  245.         //case MT_MULTIPLAYER:    strcpy(name, "MT_MULTIPLAYER");    break;
  246.         default:                    strcpy(name, " (unknown)    ");    break;
  247.     }
  248.     return name;
  249. }
  250.  
  251. char * get_ai_behavior(int num, char *name)
  252. {
  253. #define    AIB_STILL                        0x80
  254. #define    AIB_NORMAL                        0x81
  255. #define    AIB_HIDE                            0x82
  256. #define    AIB_RUN_FROM                    0x83
  257. #define    AIB_FOLLOW_PATH                0x84
  258.  
  259.     switch (num) {
  260.         case AIB_STILL:                strcpy(name, "STILL       ");    break;
  261.         case AIB_NORMAL:                strcpy(name, "NORMAL      ");    break;
  262.         case AIB_HIDE:                    strcpy(name, "HIDE        ");    break;
  263.         case AIB_RUN_FROM:            strcpy(name, "RUN_FROM    ");    break;
  264.         case AIB_FOLLOW_PATH:        strcpy(name, "FOLLOW_PATH ");    break;
  265.         default:                            strcpy(name, " (unknown)  ");    break;
  266.     }
  267.     return name;
  268. }
  269.  
  270. //    ---------------------------------------------------------------------------------------------------
  271. void info_display_object_placement(int show_all)
  272. {
  273.     static    int    old_Cur_object_index;
  274.     static    int    old_type;
  275.     static    int    old_movement_type;
  276.     static    int    old_control_type;
  277.     static    int    old_mode;
  278.  
  279.     char        name[30];
  280.  
  281.     if (init_info | show_all) {
  282.         old_Cur_object_index = -2;
  283.         old_type = -2;
  284.         old_movement_type = -2;
  285.         old_control_type = -2;
  286.         old_mode = -2;
  287.     }
  288.  
  289.     if ( ( Cur_object_index != old_Cur_object_index) || 
  290.             ( Objects[Cur_object_index].type != old_type) || 
  291.             ( Objects[Cur_object_index].movement_type != old_movement_type) || 
  292.             ( Objects[Cur_object_index].control_type != old_control_type) || 
  293.             ( Objects[Cur_object_index].ctype.ai_info.behavior != old_mode) ) {
  294.  
  295.         gr_uprintf( 0, 0, "Object id: %4d\n", Cur_object_index);
  296.         gr_uprintf( 0, 16, "Type: %s\n", get_object_type(Objects[Cur_object_index].type , name));
  297.         gr_uprintf( 0, 32, "Movmnt: %s\n", get_movement_type(Objects[Cur_object_index].movement_type, name));
  298.         gr_uprintf( 0, 48, "Cntrl: %s\n", get_control_type(Objects[Cur_object_index].control_type, name));
  299.         gr_uprintf( 0, 64, "Mode: %s\n", get_ai_behavior(Objects[Cur_object_index].ctype.ai_info.behavior, name));
  300.  
  301.         old_Cur_object_index = Cur_object_index;
  302.         old_type = Objects[Cur_object_index].type;
  303.         old_movement_type = Objects[Cur_object_index].movement_type;
  304.         old_mode = Objects[Cur_object_index].control_type;
  305.         old_mode = Objects[Cur_object_index].ctype.ai_info.behavior;
  306.     }
  307.  
  308. }
  309.  
  310. //    ---------------------------------------------------------------------------------------------------
  311. void info_display_segsize(int show_all)
  312. {
  313.     static    int    old_SegSizeMode;
  314.  
  315.     char        name[30];
  316.  
  317.     if (init_info | show_all) {
  318.         old_SegSizeMode = -2;
  319.     }
  320.  
  321.     if (old_SegSizeMode != SegSizeMode  ) {
  322.         switch (SegSizeMode) {
  323.             case SEGSIZEMODE_FREE:        strcpy(name, "free   ");    break;
  324.             case SEGSIZEMODE_ALL:        strcpy(name, "all    ");    break;
  325.             case SEGSIZEMODE_CURSIDE:    strcpy(name, "curside");    break;
  326.             case SEGSIZEMODE_EDGE:        strcpy(name, "edge   ");    break;
  327.             case SEGSIZEMODE_VERTEX:    strcpy(name, "vertex ");    break;
  328.             default:
  329.                 Error("Illegal value for SegSizeMode in info.c/info_display_segsize\n");
  330.         }
  331.  
  332.         gr_uprintf( 0, 0, "Mode: %s\n", name);
  333.  
  334.         old_SegSizeMode = SegSizeMode;
  335.     }
  336.  
  337. }
  338.  
  339. extern int num_objects;
  340.  
  341. //    ---------------------------------------------------------------------------------------------------
  342. void info_display_default(int show_all)
  343. {
  344.     static int old_Num_segments = -1;
  345.     static int old_Num_vertices = -1;
  346.     static int old_Num_objects = -1;
  347.     static int old_Cursegp_num = -1;
  348.     static int old_Curside = -1;
  349.     static int old_Cursegp_num_for_verts = -1;
  350.     static int old_CurrentTexture = -1;
  351.     static int old_Num_walls = -1;
  352.     static int old_Num_triggers = -1;
  353.  
  354.     if (init_info | show_all) {
  355.         init_info = 0;
  356.         old_Num_segments = -1;
  357.         old_Num_vertices = -1;
  358.         old_Num_objects = -1;
  359.         old_Cursegp_num = -1;
  360.         old_Cursegp_num_for_verts = -1;
  361.         old_Curside = -1;
  362.         old_CurrentTexture = -1;
  363.         old_Num_walls = -1;
  364.         old_Num_triggers = -1;
  365.     }
  366.  
  367.     gr_set_fontcolor(CBLACK,CWHITE);
  368.  
  369.     //--------------- Number of segments ----------------
  370.  
  371.     if ( old_Num_segments != Num_segments )    {
  372.         gr_uprintf( 0, 0, "Segments: %4d/%4d", Num_segments, MAX_SEGMENTS );
  373.         old_Num_segments = Num_segments;
  374.     }
  375.  
  376.     //---------------- Number of vertics -----------------
  377.     
  378.     if ( old_Num_vertices != Num_vertices )    {
  379.         gr_uprintf( 0, 16, "Vertices: %4d/%4d", Num_vertices, MAX_VERTICES );
  380.         old_Num_vertices = Num_vertices;
  381.     }
  382.  
  383.     //---------------- Number of objects -----------------
  384.     
  385.     if ( old_Num_objects != num_objects )    {
  386.         gr_uprintf( 0, 32, "Objs: %3d/%3d", num_objects, MAX_OBJECTS );
  387.         old_Num_objects = num_objects;
  388.     }
  389.  
  390.       //--------------- Current_segment_number -------------
  391.     //--------------- Current_side_number -------------
  392.  
  393.     if (( old_Cursegp_num != Cursegp-Segments ) || ( old_Curside != Curside ))    {
  394.         gr_uprintf( 0, 48, "Cursegp/side: %3d/%1d", Cursegp-Segments, Curside);
  395.         gr_uprintf( 0, 128, " tmap1,2,o: %3d/%3dx%1d", Cursegp->sides[Curside].tmap_num, Cursegp->sides[Curside].tmap_num2 & 0x3FFF, (Cursegp->sides[Curside].tmap_num2 >> 14) & 3);
  396.         old_Cursegp_num = Cursegp-Segments;
  397.         old_Curside = Curside;
  398.     }
  399.  
  400.     //--------------- Current_vertex_numbers -------------
  401.  
  402.     if ( old_Cursegp_num_for_verts != Cursegp-Segments )    {
  403.  
  404.         gr_uprintf( 0, 64, "{%3d,%3d,%3d,%3d,", Cursegp->verts[0],Cursegp->verts[1],
  405.                                                                                              Cursegp->verts[2],Cursegp->verts[3] );
  406.         gr_uprintf( 0, 80," %3d,%3d,%3d,%3d}", Cursegp->verts[4],Cursegp->verts[5],
  407.                                                                                              Cursegp->verts[6],Cursegp->verts[7] );
  408.         old_Cursegp_num_for_verts = Cursegp-Segments;
  409.     }
  410.  
  411.     //--------------- Num walls/links/triggers -------------------------
  412.  
  413.     if ( old_Num_walls != Num_walls ) {
  414. //        gr_uprintf( 0, 96, "Walls/Links %d/%d", Num_walls, Num_links );
  415.         gr_uprintf( 0, 96, "Walls %3d", Num_walls );
  416.         old_Num_walls = Num_walls;
  417.     }
  418.  
  419.     //--------------- Num triggers ----------------------
  420.  
  421.     if ( old_Num_triggers != Num_triggers ) {
  422.         gr_uprintf( 0, 112, "Num_triggers %2d", Num_triggers );
  423.         old_Num_triggers = Num_triggers;
  424.     }
  425.  
  426.     //--------------- Current texture number -------------
  427.  
  428.     if ( old_CurrentTexture != CurrentTexture )    {
  429.         gr_uprintf( 0, 144, "Tex/Light: %3d %5.2f", CurrentTexture, f2fl(TmapInfo[CurrentTexture].lighting));
  430.         old_CurrentTexture = CurrentTexture;
  431.     }
  432.  
  433. }
  434.  
  435. //    ------------------------------------------------------------------------------------
  436. void clear_pad_display(void)
  437. {
  438.     gr_clear_canvas(CWHITE);
  439.    gr_set_fontcolor( CBLACK, CWHITE );
  440. }
  441.  
  442. //    ------------------------------------------------------------------------------------
  443. void info_display_all( UI_WINDOW * wnd )
  444. {
  445.     static    old_padnum = -1;
  446.     int        padnum,show_all = 0;
  447.     grs_canvas *save_canvas = grd_curcanv;
  448.  
  449.     wnd++;        //kill warning
  450.  
  451.     grd_curcanv = Pad_text_canvas;
  452.  
  453.     padnum = ui_pad_get_current();
  454.     Assert(padnum <= MAX_PAD_ID);
  455.  
  456.     if (padnum != old_padnum) {
  457.         clear_pad_display();
  458.         old_padnum = padnum;
  459.         show_all = 1;
  460.     }
  461.  
  462.     switch (padnum) {
  463.         case OBJECT_PAD_ID:            // Object placement
  464.             info_display_object_placement(show_all);
  465.             break;
  466.         case SEGSIZE_PAD_ID:            // Segment sizing
  467.             info_display_segsize(show_all);
  468.             break;
  469.         default:
  470.             info_display_default(show_all);
  471.             break;
  472.     }
  473.     grd_curcanv = save_canvas;
  474. }
  475.  
  476.