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