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.
16 * Editor switch functions.
37 //-------------------------------------------------------------------------
38 // Variables for this module...
39 //-------------------------------------------------------------------------
40 #define NUM_TRIGGER_FLAGS 10
42 static UI_WINDOW *MainWindow = NULL;
43 static UI_GADGET_USERBOX *WallViewBox;
44 static UI_GADGET_BUTTON *QuitButton;
45 static UI_GADGET_CHECKBOX *TriggerFlag[NUM_TRIGGER_FLAGS];
47 static int old_trigger_num;
49 //-----------------------------------------------------------------
50 // Adds a trigger to wall, and returns the trigger number.
51 // If there is a trigger already present, it returns the trigger number. (To be replaced)
52 int add_trigger(segment *seg, short side)
54 int trigger_num = Num_triggers;
55 int wall_num = seg->sides[side].wall_num;
57 Assert(trigger_num < MAX_TRIGGERS);
58 if (trigger_num>=MAX_TRIGGERS) return -1;
61 wall_add_to_markedside(WALL_OPEN);
62 wall_num = seg->sides[side].wall_num;
63 Walls[wall_num].trigger = trigger_num;
65 // Set default values first time trigger is added
66 Triggers[trigger_num].flags = 0;
67 Triggers[trigger_num].value = F1_0*5;
68 Triggers[trigger_num].num_links = 0;
69 Triggers[trigger_num].flags &= TRIGGER_ON;
74 if (Walls[wall_num].trigger != -1)
75 return Walls[wall_num].trigger;
77 // Create new trigger.
78 Walls[wall_num].trigger = trigger_num;
80 // Set default values first time trigger is added
81 Triggers[trigger_num].flags = 0;
82 Triggers[trigger_num].value = F1_0*5;
83 Triggers[trigger_num].num_links = 0;
84 Triggers[trigger_num].flags &= TRIGGER_ON;
91 //-----------------------------------------------------------------
92 // Adds a specific trigger flag to Markedsegp/Markedside if it is possible.
93 // Automatically adds flag to Connectside if possible unless it is a control trigger.
94 // Returns 1 if trigger flag added.
95 // Returns 0 if trigger flag cannot be added.
96 int trigger_add_to_Markedside(short flag) {
97 int trigger_num; //, ctrigger_num;
100 editor_status("No Markedside.");
104 // If no child on Markedside return
105 if (!IS_CHILD(Markedsegp->children[Markedside])) return 0;
107 trigger_num = add_trigger(Markedsegp, Markedside);
109 if (trigger_num == -1) {
110 editor_status("Cannot add trigger at Markedside.");
114 Triggers[trigger_num].flags |= flag;
119 int trigger_remove_flag_from_Markedside(short flag) {
120 int trigger_num; //, ctrigger_num;
124 editor_status("No Markedside.");
128 // If no child on Markedside return
129 if (!IS_CHILD(Markedsegp->children[Markedside])) return 0;
131 // If no wall just return
132 wall_num = Markedsegp->sides[Markedside].wall_num;
133 if (wall_num == -1) return 0;
135 trigger_num = Walls[wall_num].trigger;
137 // If flag is already cleared, then don't change anything.
138 if ( trigger_num == -1 ) {
139 editor_status("No trigger at Markedside.");
143 if (!Triggers[trigger_num].flags & flag)
146 Triggers[trigger_num].flags &= ~flag;
152 int bind_matcen_to_trigger() {
154 int wall_num, trigger_num, link_num;
158 editor_status("No marked segment.");
162 wall_num = Markedsegp->sides[Markedside].wall_num;
163 if (wall_num == -1) {
164 editor_status("No wall at Markedside.");
168 trigger_num = Walls[wall_num].trigger;
170 if (trigger_num == -1) {
171 editor_status("No trigger at Markedside.");
175 if (!(Curseg2p->special & SEGMENT_IS_ROBOTMAKER))
177 editor_status("No Matcen at Cursegp.");
181 link_num = Triggers[trigger_num].num_links;
182 for (i=0;i<link_num;i++)
183 if (SEGMENT_NUMBER(Cursegp) == Triggers[trigger_num].seg[i]) {
184 editor_status("Matcen already bound to Markedside.");
188 // Error checking completed, actual binding begins
189 Triggers[trigger_num].seg[link_num] = SEGMENT_NUMBER(Cursegp);
190 Triggers[trigger_num].num_links++;
192 mprintf((0, "seg %d linked to link_num %d\n",
193 Triggers[trigger_num].seg[link_num], link_num));
195 editor_status("Matcen linked to trigger");
201 int bind_wall_to_trigger() {
203 int wall_num, trigger_num, link_num;
207 editor_status("No marked segment.");
211 wall_num = Markedsegp->sides[Markedside].wall_num;
212 if (wall_num == -1) {
213 editor_status("No wall at Markedside.");
217 trigger_num = Walls[wall_num].trigger;
219 if (trigger_num == -1) {
220 editor_status("No trigger at Markedside.");
224 if (Cursegp->sides[Curside].wall_num == -1) {
225 editor_status("No wall at Curside.");
229 if ((Cursegp==Markedsegp) && (Curside==Markedside)) {
230 editor_status("Cannot bind wall to itself.");
234 link_num = Triggers[trigger_num].num_links;
235 for (i=0;i<link_num;i++)
236 if ((SEGMENT_NUMBER(Cursegp) == Triggers[trigger_num].seg[i]) && (Curside == Triggers[trigger_num].side[i])) {
237 editor_status("Curside already bound to Markedside.");
241 // Error checking completed, actual binding begins
242 Triggers[trigger_num].seg[link_num] = SEGMENT_NUMBER(Cursegp);
243 Triggers[trigger_num].side[link_num] = Curside;
244 Triggers[trigger_num].num_links++;
246 mprintf((0, "seg %d:side %d linked to link_num %d\n",
247 Triggers[trigger_num].seg[link_num], Triggers[trigger_num].side[link_num], link_num));
249 editor_status("Wall linked to trigger");
254 int remove_trigger_num(int trigger_num)
256 if (trigger_num != -1)
261 for (t = trigger_num; t < Num_triggers; t++)
262 Triggers[t] = Triggers[t + 1];
264 for (w = 0; w < Num_walls; w++)
266 if (Walls[w].trigger == trigger_num)
267 Walls[w].trigger = -1; // a trigger can be shared by multiple walls
268 else if (Walls[w].trigger > trigger_num)
275 editor_status("No trigger to remove");
279 int remove_trigger(segment *seg, short side)
281 if (seg->sides[side].wall_num == -1)
283 mprintf((0, "Can't remove trigger from wall_num -1\n"));
287 return remove_trigger_num(Walls[seg->sides[side].wall_num].trigger);
291 int add_trigger_control()
293 trigger_add_to_Markedside(TRIGGER_CONTROL_DOORS);
294 Update_flags = UF_WORLD_CHANGED;
300 remove_trigger(Markedsegp, Markedside);
301 Update_flags = UF_WORLD_CHANGED;
305 int trigger_turn_all_ON()
309 for (t=0;t<Num_triggers;t++)
310 Triggers[t].flags &= TRIGGER_ON;
314 //-------------------------------------------------------------------------
315 // Called from the editor... does one instance of the trigger dialog box
316 //-------------------------------------------------------------------------
317 int do_trigger_dialog()
322 editor_status("Trigger requires Marked Segment & Side.");
326 // Only open 1 instance of this window...
327 if ( MainWindow != NULL ) return 0;
329 // Close other windows.
330 robot_close_window();
332 close_centers_window();
333 hostage_close_window();
335 // Open a window with a quit button
336 MainWindow = ui_open_window( TMAPBOX_X+20, TMAPBOX_Y+20, 765-TMAPBOX_X, 545-TMAPBOX_Y, WIN_DIALOG );
338 // These are the checkboxes for each door flag.
340 TriggerFlag[0] = ui_add_gadget_checkbox( MainWindow, 22, i, 16, 16, 0, "Door Control" ); i+=22;
341 TriggerFlag[1] = ui_add_gadget_checkbox( MainWindow, 22, i, 16, 16, 0, "Shield damage" ); i+=22;
342 TriggerFlag[2] = ui_add_gadget_checkbox( MainWindow, 22, i, 16, 16, 0, "Energy drain" ); i+=22;
343 TriggerFlag[3] = ui_add_gadget_checkbox( MainWindow, 22, i, 16, 16, 0, "Exit" ); i+=22;
344 TriggerFlag[4] = ui_add_gadget_checkbox( MainWindow, 22, i, 16, 16, 0, "One-shot" ); i+=22;
345 TriggerFlag[5] = ui_add_gadget_checkbox( MainWindow, 22, i, 16, 16, 0, "Illusion ON" ); i+=22;
346 TriggerFlag[6] = ui_add_gadget_checkbox( MainWindow, 22, i, 16, 16, 0, "Illusion OFF" ); i+=22;
347 TriggerFlag[7] = ui_add_gadget_checkbox( MainWindow, 22, i, 16, 16, 0, "Trigger ON" ); i+=22;
348 TriggerFlag[8] = ui_add_gadget_checkbox( MainWindow, 22, i, 16, 16, 0, "Matcen Trigger" ); i+=22;
349 TriggerFlag[9] = ui_add_gadget_checkbox( MainWindow, 22, i, 16, 16, 0, "Secret Exit" ); i+=22;
351 QuitButton = ui_add_gadget_button( MainWindow, 20, i, 48, 40, "Done", NULL );
353 // The little box the wall will appear in.
354 WallViewBox = ui_add_gadget_userbox( MainWindow, 155, 5, 64, 64 );
356 // A bunch of buttons...
358 // ui_add_gadget_button( MainWindow,155,i,140, 26, "Add Door Control", add_trigger_control ); i += 29;
359 ui_add_gadget_button( MainWindow,155,i,140, 26, "Remove Trigger", trigger_remove ); i += 29;
360 ui_add_gadget_button( MainWindow,155,i,140, 26, "Bind Wall", bind_wall_to_trigger ); i += 29;
361 ui_add_gadget_button( MainWindow,155,i,140, 26, "Bind Matcen", bind_matcen_to_trigger ); i += 29;
362 ui_add_gadget_button( MainWindow,155,i,140, 26, "All Triggers ON", trigger_turn_all_ON ); i += 29;
364 old_trigger_num = -2; // Set to some dummy value so everything works ok on the first frame.
369 void close_trigger_window()
371 if ( MainWindow!=NULL ) {
372 ui_close_window( MainWindow );
377 void do_trigger_window()
380 short Markedwall, trigger_num;
382 if ( MainWindow == NULL ) return;
384 close_trigger_window();
388 //------------------------------------------------------------
389 // Call the ui code..
390 //------------------------------------------------------------
391 ui_button_any_drawn = 0;
392 ui_window_do_gadgets(MainWindow);
394 //------------------------------------------------------------
395 // If we change walls, we need to reset the ui code for all
396 // of the checkboxes that control the wall flags.
397 //------------------------------------------------------------
398 Markedwall = Markedsegp->sides[Markedside].wall_num;
399 if (Markedwall != -1)
400 trigger_num = Walls[Markedwall].trigger;
401 else trigger_num = -1;
403 if (old_trigger_num != trigger_num)
405 if (trigger_num != -1)
407 trigger *trig = &Triggers[trigger_num];
409 ui_checkbox_check(TriggerFlag[0], trig->flags & TRIGGER_CONTROL_DOORS);
410 ui_checkbox_check(TriggerFlag[1], trig->flags & TRIGGER_SHIELD_DAMAGE);
411 ui_checkbox_check(TriggerFlag[2], trig->flags & TRIGGER_ENERGY_DRAIN);
412 ui_checkbox_check(TriggerFlag[3], trig->flags & TRIGGER_EXIT);
413 ui_checkbox_check(TriggerFlag[4], trig->flags & TRIGGER_ONE_SHOT);
414 ui_checkbox_check(TriggerFlag[5], trig->flags & TRIGGER_ILLUSION_ON);
415 ui_checkbox_check(TriggerFlag[6], trig->flags & TRIGGER_ILLUSION_OFF);
416 ui_checkbox_check(TriggerFlag[7], trig->flags & TRIGGER_ON);
417 ui_checkbox_check(TriggerFlag[8], trig->flags & TRIGGER_MATCEN);
418 ui_checkbox_check(TriggerFlag[9], trig->flags & TRIGGER_SECRET_EXIT);
422 //------------------------------------------------------------
423 // If any of the checkboxes that control the wallflags are set, then
424 // update the cooresponding wall flag.
425 //------------------------------------------------------------
426 if (IS_CHILD(Markedsegp->children[Markedside])) {
427 if (TriggerFlag[0]->flag == 1)
428 trigger_add_to_Markedside(TRIGGER_CONTROL_DOORS);
430 trigger_remove_flag_from_Markedside(TRIGGER_CONTROL_DOORS);
431 if (TriggerFlag[1]->flag == 1)
432 trigger_add_to_Markedside(TRIGGER_SHIELD_DAMAGE);
434 trigger_remove_flag_from_Markedside(TRIGGER_SHIELD_DAMAGE);
435 if (TriggerFlag[2]->flag == 1)
436 trigger_add_to_Markedside(TRIGGER_ENERGY_DRAIN);
438 trigger_remove_flag_from_Markedside(TRIGGER_ENERGY_DRAIN);
439 if (TriggerFlag[3]->flag == 1)
440 trigger_add_to_Markedside(TRIGGER_EXIT);
442 trigger_remove_flag_from_Markedside(TRIGGER_EXIT);
443 if (TriggerFlag[4]->flag == 1)
444 trigger_add_to_Markedside(TRIGGER_ONE_SHOT);
446 trigger_remove_flag_from_Markedside(TRIGGER_ONE_SHOT);
447 if (TriggerFlag[5]->flag == 1)
448 trigger_add_to_Markedside(TRIGGER_ILLUSION_ON);
450 trigger_remove_flag_from_Markedside(TRIGGER_ILLUSION_ON);
451 if (TriggerFlag[6]->flag == 1)
452 trigger_add_to_Markedside(TRIGGER_ILLUSION_OFF);
454 trigger_remove_flag_from_Markedside(TRIGGER_ILLUSION_OFF);
455 if (TriggerFlag[7]->flag == 1)
456 trigger_add_to_Markedside(TRIGGER_ON);
458 trigger_remove_flag_from_Markedside(TRIGGER_ON);
460 if (TriggerFlag[8]->flag == 1)
461 trigger_add_to_Markedside(TRIGGER_MATCEN);
463 trigger_remove_flag_from_Markedside(TRIGGER_MATCEN);
465 if (TriggerFlag[9]->flag == 1)
466 trigger_add_to_Markedside(TRIGGER_SECRET_EXIT);
468 trigger_remove_flag_from_Markedside(TRIGGER_SECRET_EXIT);
471 for (i = 0; i < NUM_TRIGGER_FLAGS; i++ )
472 ui_checkbox_check(TriggerFlag[i], 0);
474 //------------------------------------------------------------
475 // Draw the wall in the little 64x64 box
476 //------------------------------------------------------------
477 gr_set_current_canvas( WallViewBox->canvas );
479 if ((Markedsegp->sides[Markedside].wall_num == -1) || (Walls[Markedsegp->sides[Markedside].wall_num].trigger) == -1)
480 gr_clear_canvas( CBLACK );
482 if (Markedsegp->sides[Markedside].tmap_num2 > 0) {
483 gr_ubitmap(0,0, texmerge_get_cached_bitmap( Markedsegp->sides[Markedside].tmap_num, Markedsegp->sides[Markedside].tmap_num2));
485 if (Markedsegp->sides[Markedside].tmap_num > 0) {
486 PIGGY_PAGE_IN(Textures[Markedsegp->sides[Markedside].tmap_num]);
487 gr_ubitmap(0,0, &GameBitmaps[Textures[Markedsegp->sides[Markedside].tmap_num].index]);
489 gr_clear_canvas( CGREY );
493 //------------------------------------------------------------
494 // If anything changes in the ui system, redraw all the text that
495 // identifies this robot.
496 //------------------------------------------------------------
497 if (ui_button_any_drawn || (old_trigger_num != trigger_num) ) {
498 if ( Markedsegp->sides[Markedside].wall_num > -1 ) {
499 ui_wprintf_at( MainWindow, 12, 6, "Trigger: %d ", trigger_num);
501 ui_wprintf_at( MainWindow, 12, 6, "Trigger: none ");
503 Update_flags |= UF_WORLD_CHANGED;
506 if ( QuitButton->pressed || (last_keypress==KEY_ESC)) {
507 close_trigger_window();
511 old_trigger_num = trigger_num;