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

  1. /*
  2.  * $Source: f:/miner/source/main/editor/rcs/eswitch.c $
  3.  * $Revision: 2.0 $
  4.  * $Author: john $
  5.  * $Date: 1995/02/27 11:35:18 $
  6.  * 
  7.  * Editor switch functions. 
  8.  * 
  9.  * $Log: eswitch.c $
  10.  * Revision 2.0  1995/02/27  11:35:18  john
  11.  * Version 2.0! No anonymous unions, Watcom 10.0, with no need
  12.  * for bitmaps.tbl.
  13.  * 
  14.  * Revision 1.33  1995/01/14  19:18:04  john
  15.  * First version of object paging.
  16.  * 
  17.  * Revision 1.32  1994/11/27  23:18:01  matt
  18.  * Made changes for new mprintf calling convention
  19.  * 
  20.  * Revision 1.31  1994/11/07  10:55:42  yuan
  21.  * *** empty log message ***
  22.  * 
  23.  * Revision 1.30  1994/10/13  13:15:06  yuan
  24.  * Fixed trigger removal bug.
  25.  * 
  26.  * Revision 1.29  1994/10/06  21:24:16  matt
  27.  * Added switch for exit to secret level
  28.  * 
  29.  * Revision 1.28  1994/09/29  17:06:10  matt
  30.  * Took out references to obsolete external triggers
  31.  * 
  32.  * Revision 1.27  1994/09/28  13:40:34  yuan
  33.  * Fixed control center trigger bug.
  34.  * 
  35.  * Revision 1.26  1994/09/26  16:25:04  yuan
  36.  * Only allow one binding of each matcen .
  37.  * 
  38.  * Revision 1.25  1994/09/24  17:10:19  yuan
  39.  * Added Matcen triggers.
  40.  * 
  41.  * Revision 1.24  1994/09/20  18:23:58  yuan
  42.  * Killed the BOGIFYING WALL DRAGON...
  43.  * 
  44.  * There was a problem with triggers being created that had bogus
  45.  * pointers back to their segments.
  46.  * 
  47.  * Revision 1.23  1994/08/25  21:56:33  mike
  48.  * IS_CHILD stuff.
  49.  * 
  50.  * Revision 1.22  1994/08/15  18:06:54  yuan
  51.  * Added external trigger.
  52.  * 
  53.  * Revision 1.21  1994/07/22  17:18:47  yuan
  54.  * Working on dialog box for refuel/repair/material/control centers.
  55.  * 
  56.  * Revision 1.20  1994/07/06  10:55:55  john
  57.  * New structures for hostages.
  58.  * 
  59.  * Revision 1.19  1994/07/01  16:36:20  yuan
  60.  * Working on triggers that aren't always on.
  61.  * 
  62.  * Revision 1.18  1994/06/21  18:50:14  john
  63.  * Made ESC key exit dialog.
  64.  * 
  65.  * Revision 1.17  1994/06/20  22:30:36  yuan
  66.  * Fixed crazy runaway trigger bug that Adam found
  67.  * 
  68.  * Revision 1.16  1994/05/31  10:03:48  yuan
  69.  * Fixed compiler warnings...
  70.  * 
  71.  * 
  72.  * Revision 1.15  1994/05/30  20:22:30  yuan
  73.  * New triggers.
  74.  * 
  75.  * Revision 1.14  1994/05/27  12:33:50  yuan
  76.  * Fixed some bugs when adding trigger.
  77.  * 
  78.  * Revision 1.13  1994/05/27  10:34:29  yuan
  79.  * Added new Dialog boxes for Walls and Triggers.
  80.  * 
  81.  * Revision 1.12  1994/05/25  18:15:02  yuan
  82.  * Fixed make warnings to save 10 cents!
  83.  * 
  84.  * Revision 1.11  1994/05/25  18:08:03  yuan
  85.  * Revamping walls and triggers interface.
  86.  * Wall interface complete, but triggers are still in progress.
  87.  * 
  88.  * Revision 1.10  1994/04/29  15:05:50  yuan
  89.  * Trigger/Link removing stuff still needs to be fixed.
  90.  * 
  91.  * Revision 1.9  1994/04/28  23:25:34  yuan
  92.  * Obliterated warnings.
  93.  * 
  94.  * Revision 1.8  1994/04/28  18:08:06  yuan
  95.  * Fixed trigger bug.
  96.  * 
  97.  */
  98.  
  99.  
  100. #pragma off (unreferenced)
  101. static char rcsid[] = "$Id: eswitch.c 2.0 1995/02/27 11:35:18 john Exp $";
  102. #pragma on (unreferenced)
  103.  
  104. #include <stdio.h>
  105. #include <stdlib.h>
  106. #include <math.h>
  107. #include <string.h>
  108.  
  109. #include "inferno.h"
  110. #include "editor.h"
  111. #include "eswitch.h"
  112. #include "segment.h"
  113. #include "error.h"
  114. #include "gameseg.h"
  115. #include "mono.h"
  116. #include "wall.h"
  117. #include "medwall.h"
  118.  
  119. #include "screens.h"
  120.  
  121. #include "textures.h"
  122. #include "texmerge.h"
  123. #include "medrobot.h"
  124. #include "timer.h"
  125. #include "key.h"
  126. #include "ehostage.h"
  127. #include "centers.h"
  128. #include "piggy.h"
  129.  
  130. //-------------------------------------------------------------------------
  131. // Variables for this module...
  132. //-------------------------------------------------------------------------
  133. #define NUM_TRIGGER_FLAGS 10
  134.  
  135. static UI_WINDOW                 *MainWindow = NULL;
  136. static UI_GADGET_USERBOX    *WallViewBox;
  137. static UI_GADGET_BUTTON     *QuitButton;
  138. static UI_GADGET_CHECKBOX    *TriggerFlag[NUM_TRIGGER_FLAGS];
  139.  
  140. static int old_trigger_num;
  141.  
  142. //-----------------------------------------------------------------
  143. // Adds a trigger to wall, and returns the trigger number. 
  144. // If there is a trigger already present, it returns the trigger number. (To be replaced)
  145. int add_trigger(segment *seg, short side)
  146. {
  147.     int trigger_num = Num_triggers;
  148.     int wall_num = seg->sides[side].wall_num;
  149.  
  150.     Assert(trigger_num < MAX_TRIGGERS);
  151.     if (trigger_num>=MAX_TRIGGERS) return -1;
  152.  
  153.     if (wall_num == -1) {
  154.         wall_add_to_markedside(WALL_OPEN);
  155.         wall_num = seg->sides[side].wall_num;
  156.         Walls[wall_num].trigger = trigger_num;
  157.         
  158.         // Set default values first time trigger is added
  159.         Triggers[trigger_num].flags = 0;
  160.         Triggers[trigger_num].value = F1_0*5;
  161.         Triggers[trigger_num].num_links = 0;
  162.         Triggers[trigger_num].flags &= TRIGGER_ON;        
  163.  
  164.         Num_triggers++;
  165.         return trigger_num;
  166.     } else {
  167.         if (Walls[wall_num].trigger != -1)
  168.             return Walls[wall_num].trigger;
  169.  
  170.         // Create new trigger.
  171.         Walls[wall_num].trigger = trigger_num;
  172.  
  173.         // Set default values first time trigger is added
  174.         Triggers[trigger_num].flags = 0;
  175.         Triggers[trigger_num].value = F1_0*5;
  176.         Triggers[trigger_num].num_links = 0;
  177.         Triggers[trigger_num].flags &= TRIGGER_ON;
  178.  
  179.         Num_triggers++;
  180.         return trigger_num;
  181.     }
  182. }        
  183.  
  184. //-----------------------------------------------------------------
  185. // Adds a specific trigger flag to Markedsegp/Markedside if it is possible.
  186. // Automatically adds flag to Connectside if possible unless it is a control trigger.
  187. // Returns 1 if trigger flag added.
  188. // Returns 0 if trigger flag cannot be added.
  189. int trigger_add_to_Markedside(short flag) {
  190.     int trigger_num; //, ctrigger_num;
  191.  
  192.     if (!Markedsegp) {
  193.         editor_status("No Markedside.");
  194.         return 0;
  195.     }
  196.  
  197.     // If no child on Markedside return
  198.     if (!IS_CHILD(Markedsegp->children[Markedside])) return 0;
  199.  
  200.     trigger_num = add_trigger(Markedsegp, Markedside);
  201.  
  202.     if (trigger_num == -1) {
  203.         editor_status("Cannot add trigger at Markedside.");
  204.         return 0;
  205.     }
  206.  
  207.      Triggers[trigger_num].flags |= flag;
  208.  
  209.     return 1;
  210. }
  211.  
  212. int trigger_remove_flag_from_Markedside(short flag) {
  213.     int trigger_num; //, ctrigger_num;
  214.     int wall_num;
  215.     
  216.     if (!Markedsegp) {
  217.         editor_status("No Markedside.");
  218.         return 0;
  219.     }
  220.  
  221.     // If no child on Markedside return
  222.     if (!IS_CHILD(Markedsegp->children[Markedside])) return 0;
  223.  
  224.     // If no wall just return
  225.     wall_num = Markedsegp->sides[Markedside].wall_num;
  226.     if (wall_num == -1) return 0;
  227.  
  228.     trigger_num = Walls[wall_num].trigger;
  229.  
  230.     // If flag is already cleared, then don't change anything.
  231.     if ( trigger_num == -1 ) {
  232.         editor_status("No trigger at Markedside.");
  233.         return 0;
  234.     }
  235.  
  236.     if (!Triggers[trigger_num].flags & flag)
  237.         return 1;
  238.  
  239.      Triggers[trigger_num].flags &= ~flag;
  240.  
  241.     return 1;
  242. }
  243.  
  244.  
  245. int bind_matcen_to_trigger() {
  246.  
  247.     int wall_num, trigger_num, link_num;
  248.     int i;
  249.  
  250.     if (!Markedsegp) {
  251.         editor_status("No marked segment.");
  252.         return 0;
  253.     }
  254.  
  255.     wall_num = Markedsegp->sides[Markedside].wall_num;
  256.     if (wall_num == -1) {
  257.         editor_status("No wall at Markedside.");
  258.         return 0;
  259.     }
  260.  
  261.     trigger_num = Walls[wall_num].trigger;    
  262.  
  263.     if (trigger_num == -1) {
  264.         editor_status("No trigger at Markedside.");
  265.         return 0;
  266.     }
  267.  
  268.     if (!(Cursegp->special & SEGMENT_IS_ROBOTMAKER)) {
  269.         editor_status("No Matcen at Cursegp.");
  270.         return 0;
  271.     }
  272.  
  273.     link_num = Triggers[trigger_num].num_links;
  274.     for (i=0;i<link_num;i++)
  275.         if (Cursegp-Segments == Triggers[trigger_num].seg[i]) {
  276.             editor_status("Matcen already bound to Markedside.");
  277.             return 0;
  278.         }
  279.  
  280.     // Error checking completed, actual binding begins
  281.     Triggers[trigger_num].seg[link_num] = Cursegp - Segments;
  282.     Triggers[trigger_num].num_links++;
  283.  
  284.     mprintf((0, "seg %d linked to link_num %d\n",
  285.                 Triggers[trigger_num].seg[link_num], link_num)); 
  286.  
  287.     editor_status("Matcen linked to trigger");
  288.  
  289.     return 1;
  290. }
  291.  
  292.  
  293. int bind_wall_to_trigger() {
  294.  
  295.     int wall_num, trigger_num, link_num;
  296.     int i;
  297.  
  298.     if (!Markedsegp) {
  299.         editor_status("No marked segment.");
  300.         return 0;
  301.     }
  302.  
  303.     wall_num = Markedsegp->sides[Markedside].wall_num;
  304.     if (wall_num == -1) {
  305.         editor_status("No wall at Markedside.");
  306.         return 0;
  307.     }
  308.  
  309.     trigger_num = Walls[wall_num].trigger;    
  310.  
  311.     if (trigger_num == -1) {
  312.         editor_status("No trigger at Markedside.");
  313.         return 0;
  314.     }
  315.  
  316.     if (Cursegp->sides[Curside].wall_num == -1) {
  317.         editor_status("No wall at Curside.");
  318.         return 0;
  319.     }
  320.  
  321.     if ((Cursegp==Markedsegp) && (Curside==Markedside)) {
  322.         editor_status("Cannot bind wall to itself.");
  323.         return 0;
  324.     }
  325.  
  326.     link_num = Triggers[trigger_num].num_links;
  327.     for (i=0;i<link_num;i++)
  328.         if ((Cursegp-Segments == Triggers[trigger_num].seg[i]) && (Curside == Triggers[trigger_num].side[i])) {
  329.             editor_status("Curside already bound to Markedside.");
  330.             return 0;
  331.         }
  332.  
  333.     // Error checking completed, actual binding begins
  334.     Triggers[trigger_num].seg[link_num] = Cursegp - Segments;
  335.     Triggers[trigger_num].side[link_num] = Curside;
  336.     Triggers[trigger_num].num_links++;
  337.  
  338.     mprintf((0, "seg %d:side %d linked to link_num %d\n",
  339.                 Triggers[trigger_num].seg[link_num], Triggers[trigger_num].side[link_num], link_num)); 
  340.  
  341.     editor_status("Wall linked to trigger");
  342.  
  343.     return 1;
  344. }
  345.  
  346. int remove_trigger(segment *seg, short side)
  347. {        
  348.     int trigger_num, t, w;
  349.  
  350.     if (seg->sides[side].wall_num == -1) {
  351.         mprintf((0, "Can't remove trigger from wall_num -1\n"));    
  352.         return 0;
  353.     }
  354.  
  355.     trigger_num = Walls[seg->sides[side].wall_num].trigger;
  356.  
  357.     if (trigger_num != -1) {
  358.         Walls[seg->sides[side].wall_num].trigger = -1;
  359.         for (t=trigger_num;t<Num_triggers-1;t++)
  360.             Triggers[t] = Triggers[t+1];
  361.     
  362.         for (w=0; w<Num_walls; w++) {
  363.             if (Walls[w].trigger > trigger_num) 
  364.                 Walls[w].trigger--;
  365.         }
  366.  
  367.         Num_triggers--;
  368.         for (t=0;t<Num_walls;t++)
  369.             if (Walls[seg->sides[side].wall_num].trigger > trigger_num)
  370.                 Walls[seg->sides[side].wall_num].trigger--;
  371.         
  372.         return 1;
  373.     }
  374.  
  375.     editor_status("No trigger to remove");
  376.     return 0;
  377. }
  378.  
  379.  
  380. int add_trigger_control()
  381. {
  382.     trigger_add_to_Markedside(TRIGGER_CONTROL_DOORS);
  383.     Update_flags = UF_WORLD_CHANGED;
  384.     return 1;
  385. }
  386.  
  387. int trigger_remove()
  388. {
  389.     remove_trigger(Markedsegp, Markedside);
  390.     Update_flags = UF_WORLD_CHANGED;
  391.     return 1;
  392. }
  393.  
  394. int trigger_turn_all_ON()
  395. {
  396.     int t;
  397.  
  398.     for (t=0;t<Num_triggers;t++)
  399.         Triggers[t].flags &= TRIGGER_ON;
  400.     return 1;
  401. }
  402.  
  403. //-------------------------------------------------------------------------
  404. // Called from the editor... does one instance of the trigger dialog box
  405. //-------------------------------------------------------------------------
  406. int do_trigger_dialog()
  407. {
  408.     int i;
  409.  
  410.     if (!Markedsegp) {
  411.         editor_status("Trigger requires Marked Segment & Side.");
  412.         return 0;
  413.     }
  414.  
  415.     // Only open 1 instance of this window...
  416.     if ( MainWindow != NULL ) return 0;
  417.  
  418.     // Close other windows.    
  419.     robot_close_window();
  420.     close_wall_window();
  421.     close_centers_window();
  422.     hostage_close_window();
  423.  
  424.     // Open a window with a quit button
  425.     MainWindow = ui_open_window( TMAPBOX_X+20, TMAPBOX_Y+20, 765-TMAPBOX_X, 545-TMAPBOX_Y, WIN_DIALOG );
  426.  
  427.     // These are the checkboxes for each door flag.
  428.     i = 44;
  429.     TriggerFlag[0] = ui_add_gadget_checkbox( MainWindow, 22, i, 16, 16, 0, "Door Control" );      i+=22;
  430.     TriggerFlag[1] = ui_add_gadget_checkbox( MainWindow, 22, i, 16, 16, 0, "Shield damage" );     i+=22;
  431.     TriggerFlag[2] = ui_add_gadget_checkbox( MainWindow, 22, i, 16, 16, 0, "Energy drain" );        i+=22;
  432.     TriggerFlag[3] = ui_add_gadget_checkbox( MainWindow, 22, i, 16, 16, 0, "Exit" );                    i+=22;
  433.     TriggerFlag[4] = ui_add_gadget_checkbox( MainWindow, 22, i, 16, 16, 0, "One-shot" );            i+=22;
  434.     TriggerFlag[5] = ui_add_gadget_checkbox( MainWindow, 22, i, 16, 16, 0, "Illusion ON" );        i+=22;
  435.     TriggerFlag[6] = ui_add_gadget_checkbox( MainWindow, 22, i, 16, 16, 0, "Illusion OFF" );        i+=22;
  436.     TriggerFlag[7] = ui_add_gadget_checkbox( MainWindow, 22, i, 16, 16, 0, "Trigger ON" );            i+=22;
  437.     TriggerFlag[8] = ui_add_gadget_checkbox( MainWindow, 22, i, 16, 16, 0, "Matcen Trigger" );     i+=22;
  438.     TriggerFlag[9] = ui_add_gadget_checkbox( MainWindow, 22, i, 16, 16, 0, "Secret Exit" );         i+=22;
  439.  
  440.     QuitButton = ui_add_gadget_button( MainWindow, 20, i, 48, 40, "Done", NULL );
  441.                                                                                  
  442.     // The little box the wall will appear in.
  443.     WallViewBox = ui_add_gadget_userbox( MainWindow, 155, 5, 64, 64 );
  444.  
  445.     // A bunch of buttons...
  446.     i = 80;
  447. //    ui_add_gadget_button( MainWindow,155,i,140, 26, "Add Door Control", add_trigger_control ); i += 29;
  448.     ui_add_gadget_button( MainWindow,155,i,140, 26, "Remove Trigger", trigger_remove ); i += 29;
  449.     ui_add_gadget_button( MainWindow,155,i,140, 26, "Bind Wall", bind_wall_to_trigger ); i += 29;
  450.     ui_add_gadget_button( MainWindow,155,i,140, 26, "Bind Matcen", bind_matcen_to_trigger ); i += 29;
  451.     ui_add_gadget_button( MainWindow,155,i,140, 26, "All Triggers ON", trigger_turn_all_ON ); i += 29;
  452.  
  453.     old_trigger_num = -2;        // Set to some dummy value so everything works ok on the first frame.
  454.  
  455.     return 1;
  456. }
  457.  
  458. void close_trigger_window()
  459. {
  460.     if ( MainWindow!=NULL )    {
  461.         ui_close_window( MainWindow );
  462.         MainWindow = NULL;
  463.     }
  464. }
  465.  
  466. void do_trigger_window()
  467. {
  468.     int i;
  469.     short Markedwall, trigger_num;
  470.  
  471.     if ( MainWindow == NULL ) return;
  472.     if (!Markedsegp) {
  473.         close_trigger_window();
  474.         return;
  475.     }
  476.  
  477.     //------------------------------------------------------------
  478.     // Call the ui code..
  479.     //------------------------------------------------------------
  480.     ui_button_any_drawn = 0;
  481.     ui_window_do_gadgets(MainWindow);
  482.     
  483.     //------------------------------------------------------------
  484.     // If we change walls, we need to reset the ui code for all
  485.     // of the checkboxes that control the wall flags.  
  486.     //------------------------------------------------------------
  487.     Markedwall = Markedsegp->sides[Markedside].wall_num;
  488.     if (Markedwall != -1)
  489.         trigger_num = Walls[Markedwall].trigger;
  490.     else trigger_num = -1;
  491.  
  492.     if (old_trigger_num != trigger_num ) {
  493.         for (    i=0; i < NUM_TRIGGER_FLAGS; i++ )    {
  494.             TriggerFlag[i]->flag = 0;                // Tells ui that this button isn't checked
  495.             TriggerFlag[i]->status = 1;                // Tells ui to redraw button
  496.         }
  497.  
  498.         if (trigger_num != -1) {
  499.               if (Triggers[trigger_num].flags & TRIGGER_CONTROL_DOORS)
  500.                 TriggerFlag[0]->flag = 1;
  501.              if (Triggers[trigger_num].flags & TRIGGER_SHIELD_DAMAGE)
  502.                 TriggerFlag[1]->flag = 1;
  503.              if (Triggers[trigger_num].flags & TRIGGER_ENERGY_DRAIN)
  504.                 TriggerFlag[2]->flag = 1;
  505.              if (Triggers[trigger_num].flags & TRIGGER_EXIT)
  506.                 TriggerFlag[3]->flag = 1;
  507.              if (Triggers[trigger_num].flags & TRIGGER_ONE_SHOT)
  508.                 TriggerFlag[4]->flag = 1;
  509.              if (Triggers[trigger_num].flags & TRIGGER_ILLUSION_ON)
  510.                 TriggerFlag[5]->flag = 1;
  511.              if (Triggers[trigger_num].flags & TRIGGER_ILLUSION_OFF)
  512.                 TriggerFlag[6]->flag = 1;
  513.              if (Triggers[trigger_num].flags & TRIGGER_ON)
  514.                 TriggerFlag[7]->flag = 1;
  515.              if (Triggers[trigger_num].flags & TRIGGER_MATCEN)
  516.                 TriggerFlag[8]->flag = 1;
  517.              if (Triggers[trigger_num].flags & TRIGGER_SECRET_EXIT)
  518.                 TriggerFlag[9]->flag = 1;
  519.         }
  520.     }
  521.     
  522.     //------------------------------------------------------------
  523.     // If any of the checkboxes that control the wallflags are set, then
  524.     // update the cooresponding wall flag.
  525.     //------------------------------------------------------------
  526.     if (IS_CHILD(Markedsegp->children[Markedside])) {
  527.         if (TriggerFlag[0]->flag == 1) 
  528.             trigger_add_to_Markedside(TRIGGER_CONTROL_DOORS); 
  529.         else
  530.             trigger_remove_flag_from_Markedside(TRIGGER_CONTROL_DOORS);
  531.         if (TriggerFlag[1]->flag == 1)
  532.             trigger_add_to_Markedside(TRIGGER_SHIELD_DAMAGE); 
  533.         else
  534.             trigger_remove_flag_from_Markedside(TRIGGER_SHIELD_DAMAGE);
  535.         if (TriggerFlag[2]->flag == 1)
  536.             trigger_add_to_Markedside(TRIGGER_ENERGY_DRAIN); 
  537.         else
  538.             trigger_remove_flag_from_Markedside(TRIGGER_ENERGY_DRAIN);
  539.         if (TriggerFlag[3]->flag == 1)
  540.             trigger_add_to_Markedside(TRIGGER_EXIT); 
  541.         else
  542.             trigger_remove_flag_from_Markedside(TRIGGER_EXIT);
  543.         if (TriggerFlag[4]->flag == 1)
  544.             trigger_add_to_Markedside(TRIGGER_ONE_SHOT); 
  545.         else
  546.             trigger_remove_flag_from_Markedside(TRIGGER_ONE_SHOT);
  547.         if (TriggerFlag[5]->flag == 1)
  548.             trigger_add_to_Markedside(TRIGGER_ILLUSION_ON); 
  549.         else
  550.             trigger_remove_flag_from_Markedside(TRIGGER_ILLUSION_ON);
  551.         if (TriggerFlag[6]->flag == 1)
  552.             trigger_add_to_Markedside(TRIGGER_ILLUSION_OFF);
  553.         else
  554.             trigger_remove_flag_from_Markedside(TRIGGER_ILLUSION_OFF);
  555.         if (TriggerFlag[7]->flag == 1)
  556.             trigger_add_to_Markedside(TRIGGER_ON);
  557.         else
  558.             trigger_remove_flag_from_Markedside(TRIGGER_ON);
  559.  
  560.         if (TriggerFlag[8]->flag == 1) 
  561.             trigger_add_to_Markedside(TRIGGER_MATCEN);
  562.         else
  563.             trigger_remove_flag_from_Markedside(TRIGGER_MATCEN);
  564.  
  565.         if (TriggerFlag[9]->flag == 1) 
  566.             trigger_add_to_Markedside(TRIGGER_SECRET_EXIT);
  567.         else
  568.             trigger_remove_flag_from_Markedside(TRIGGER_SECRET_EXIT);
  569.  
  570.     } else
  571.         for (    i=0; i < NUM_TRIGGER_FLAGS; i++ )
  572.             if (TriggerFlag[i]->flag == 1) { 
  573.                 TriggerFlag[i]->flag = 0;                    // Tells ui that this button isn't checked
  574.                 TriggerFlag[i]->status = 1;                // Tells ui to redraw button
  575.             }
  576.     
  577.     //------------------------------------------------------------
  578.     // Draw the wall in the little 64x64 box
  579.     //------------------------------------------------------------
  580.       gr_set_current_canvas( WallViewBox->canvas );
  581.  
  582.     if ((Markedsegp->sides[Markedside].wall_num == -1) || (Walls[Markedsegp->sides[Markedside].wall_num].trigger) == -1)
  583.         gr_clear_canvas( CBLACK );
  584.     else {
  585.         if (Markedsegp->sides[Markedside].tmap_num2 > 0)  {
  586.             gr_ubitmap(0,0, texmerge_get_cached_bitmap( Markedsegp->sides[Markedside].tmap_num, Markedsegp->sides[Markedside].tmap_num2));
  587.         } else {
  588.             if (Markedsegp->sides[Markedside].tmap_num > 0)    {
  589.                 PIGGY_PAGE_IN(Textures[Markedsegp->sides[Markedside].tmap_num]);
  590.                 gr_ubitmap(0,0, &GameBitmaps[Textures[Markedsegp->sides[Markedside].tmap_num].index]);
  591.             } else
  592.                 gr_clear_canvas( CGREY );
  593.         }
  594.      }
  595.  
  596.     //------------------------------------------------------------
  597.     // If anything changes in the ui system, redraw all the text that
  598.     // identifies this robot.
  599.     //------------------------------------------------------------
  600.     if (ui_button_any_drawn || (old_trigger_num != trigger_num) ) {
  601.         if ( Markedsegp->sides[Markedside].wall_num > -1 )    {
  602.             ui_wprintf_at( MainWindow, 12, 6, "Trigger: %d    ", trigger_num);
  603.         }    else {
  604.             ui_wprintf_at( MainWindow, 12, 6, "Trigger: none ");
  605.         }
  606.         Update_flags |= UF_WORLD_CHANGED;
  607.     }
  608.  
  609.     if ( QuitButton->pressed || (last_keypress==KEY_ESC))    {
  610.         close_trigger_window();
  611.         return;
  612.     }        
  613.  
  614.     old_trigger_num = trigger_num;
  615. }
  616.  
  617.  
  618.  
  619.  
  620.  
  621.