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.
50 //-------------------------------------------------------------------------
51 // Variables for this module...
52 //-------------------------------------------------------------------------
53 #define NUM_TRIGGER_FLAGS 10
55 static UI_WINDOW *MainWindow = NULL;
56 static UI_GADGET_USERBOX *WallViewBox;
57 static UI_GADGET_BUTTON *QuitButton;
58 static UI_GADGET_CHECKBOX *TriggerFlag[NUM_TRIGGER_FLAGS];
60 static int old_trigger_num;
62 //-----------------------------------------------------------------
63 // Adds a trigger to wall, and returns the trigger number.
64 // If there is a trigger already present, it returns the trigger number. (To be replaced)
65 int add_trigger(segment *seg, short side)
67 int trigger_num = Num_triggers;
68 int wall_num = seg->sides[side].wall_num;
70 Assert(trigger_num < MAX_TRIGGERS);
71 if (trigger_num>=MAX_TRIGGERS) return -1;
74 wall_add_to_markedside(WALL_OPEN);
75 wall_num = seg->sides[side].wall_num;
76 Walls[wall_num].trigger = trigger_num;
78 // Set default values first time trigger is added
79 Triggers[trigger_num].flags = 0;
80 Triggers[trigger_num].value = F1_0*5;
81 Triggers[trigger_num].num_links = 0;
82 Triggers[trigger_num].flags &= TRIGGER_ON;
87 if (Walls[wall_num].trigger != -1)
88 return Walls[wall_num].trigger;
90 // Create new trigger.
91 Walls[wall_num].trigger = trigger_num;
93 // Set default values first time trigger is added
94 Triggers[trigger_num].flags = 0;
95 Triggers[trigger_num].value = F1_0*5;
96 Triggers[trigger_num].num_links = 0;
97 Triggers[trigger_num].flags &= TRIGGER_ON;
104 //-----------------------------------------------------------------
105 // Adds a specific trigger flag to Markedsegp/Markedside if it is possible.
106 // Automatically adds flag to Connectside if possible unless it is a control trigger.
107 // Returns 1 if trigger flag added.
108 // Returns 0 if trigger flag cannot be added.
109 int trigger_add_to_Markedside(short flag) {
110 int trigger_num; //, ctrigger_num;
113 editor_status("No Markedside.");
117 // If no child on Markedside return
118 if (!IS_CHILD(Markedsegp->children[Markedside])) return 0;
120 trigger_num = add_trigger(Markedsegp, Markedside);
122 if (trigger_num == -1) {
123 editor_status("Cannot add trigger at Markedside.");
127 Triggers[trigger_num].flags |= flag;
132 int trigger_remove_flag_from_Markedside(short flag) {
133 int trigger_num; //, ctrigger_num;
137 editor_status("No Markedside.");
141 // If no child on Markedside return
142 if (!IS_CHILD(Markedsegp->children[Markedside])) return 0;
144 // If no wall just return
145 wall_num = Markedsegp->sides[Markedside].wall_num;
146 if (wall_num == -1) return 0;
148 trigger_num = Walls[wall_num].trigger;
150 // If flag is already cleared, then don't change anything.
151 if ( trigger_num == -1 ) {
152 editor_status("No trigger at Markedside.");
156 if (!Triggers[trigger_num].flags & flag)
159 Triggers[trigger_num].flags &= ~flag;
165 int bind_matcen_to_trigger() {
167 int wall_num, trigger_num, link_num;
171 editor_status("No marked segment.");
175 wall_num = Markedsegp->sides[Markedside].wall_num;
176 if (wall_num == -1) {
177 editor_status("No wall at Markedside.");
181 trigger_num = Walls[wall_num].trigger;
183 if (trigger_num == -1) {
184 editor_status("No trigger at Markedside.");
188 if (!(Curseg2p->special & SEGMENT_IS_ROBOTMAKER))
190 editor_status("No Matcen at Cursegp.");
194 link_num = Triggers[trigger_num].num_links;
195 for (i=0;i<link_num;i++)
196 if (SEGMENT_NUMBER(Cursegp) == Triggers[trigger_num].seg[i]) {
197 editor_status("Matcen already bound to Markedside.");
201 // Error checking completed, actual binding begins
202 Triggers[trigger_num].seg[link_num] = SEGMENT_NUMBER(Cursegp);
203 Triggers[trigger_num].num_links++;
205 mprintf((0, "seg %d linked to link_num %d\n",
206 Triggers[trigger_num].seg[link_num], link_num));
208 editor_status("Matcen linked to trigger");
214 int bind_wall_to_trigger() {
216 int wall_num, trigger_num, link_num;
220 editor_status("No marked segment.");
224 wall_num = Markedsegp->sides[Markedside].wall_num;
225 if (wall_num == -1) {
226 editor_status("No wall at Markedside.");
230 trigger_num = Walls[wall_num].trigger;
232 if (trigger_num == -1) {
233 editor_status("No trigger at Markedside.");
237 if (Cursegp->sides[Curside].wall_num == -1) {
238 editor_status("No wall at Curside.");
242 if ((Cursegp==Markedsegp) && (Curside==Markedside)) {
243 editor_status("Cannot bind wall to itself.");
247 link_num = Triggers[trigger_num].num_links;
248 for (i=0;i<link_num;i++)
249 if ((SEGMENT_NUMBER(Cursegp) == Triggers[trigger_num].seg[i]) && (Curside == Triggers[trigger_num].side[i])) {
250 editor_status("Curside already bound to Markedside.");
254 // Error checking completed, actual binding begins
255 Triggers[trigger_num].seg[link_num] = SEGMENT_NUMBER(Cursegp);
256 Triggers[trigger_num].side[link_num] = Curside;
257 Triggers[trigger_num].num_links++;
259 mprintf((0, "seg %d:side %d linked to link_num %d\n",
260 Triggers[trigger_num].seg[link_num], Triggers[trigger_num].side[link_num], link_num));
262 editor_status("Wall linked to trigger");
267 int remove_trigger_num(int trigger_num)
269 if (trigger_num != -1)
274 for (t = trigger_num; t < Num_triggers; t++)
275 Triggers[t] = Triggers[t + 1];
277 for (w = 0; w < Num_walls; w++)
279 if (Walls[w].trigger == trigger_num)
280 Walls[w].trigger = -1; // a trigger can be shared by multiple walls
281 else if (Walls[w].trigger > trigger_num)
288 editor_status("No trigger to remove");
292 int remove_trigger(segment *seg, short side)
294 if (seg->sides[side].wall_num == -1)
296 mprintf((0, "Can't remove trigger from wall_num -1\n"));
300 return remove_trigger_num(Walls[seg->sides[side].wall_num].trigger);
304 int add_trigger_control()
306 trigger_add_to_Markedside(TRIGGER_CONTROL_DOORS);
307 Update_flags = UF_WORLD_CHANGED;
313 remove_trigger(Markedsegp, Markedside);
314 Update_flags = UF_WORLD_CHANGED;
318 int trigger_turn_all_ON()
322 for (t=0;t<Num_triggers;t++)
323 Triggers[t].flags &= TRIGGER_ON;
327 //-------------------------------------------------------------------------
328 // Called from the editor... does one instance of the trigger dialog box
329 //-------------------------------------------------------------------------
330 int do_trigger_dialog()
335 editor_status("Trigger requires Marked Segment & Side.");
339 // Only open 1 instance of this window...
340 if ( MainWindow != NULL ) return 0;
342 // Close other windows.
343 robot_close_window();
345 close_centers_window();
346 hostage_close_window();
348 // Open a window with a quit button
349 MainWindow = ui_open_window( TMAPBOX_X+20, TMAPBOX_Y+20, 765-TMAPBOX_X, 545-TMAPBOX_Y, WIN_DIALOG );
351 // These are the checkboxes for each door flag.
353 TriggerFlag[0] = ui_add_gadget_checkbox( MainWindow, 22, i, 16, 16, 0, "Door Control" ); i+=22;
354 TriggerFlag[1] = ui_add_gadget_checkbox( MainWindow, 22, i, 16, 16, 0, "Shield damage" ); i+=22;
355 TriggerFlag[2] = ui_add_gadget_checkbox( MainWindow, 22, i, 16, 16, 0, "Energy drain" ); i+=22;
356 TriggerFlag[3] = ui_add_gadget_checkbox( MainWindow, 22, i, 16, 16, 0, "Exit" ); i+=22;
357 TriggerFlag[4] = ui_add_gadget_checkbox( MainWindow, 22, i, 16, 16, 0, "One-shot" ); i+=22;
358 TriggerFlag[5] = ui_add_gadget_checkbox( MainWindow, 22, i, 16, 16, 0, "Illusion ON" ); i+=22;
359 TriggerFlag[6] = ui_add_gadget_checkbox( MainWindow, 22, i, 16, 16, 0, "Illusion OFF" ); i+=22;
360 TriggerFlag[7] = ui_add_gadget_checkbox( MainWindow, 22, i, 16, 16, 0, "Trigger ON" ); i+=22;
361 TriggerFlag[8] = ui_add_gadget_checkbox( MainWindow, 22, i, 16, 16, 0, "Matcen Trigger" ); i+=22;
362 TriggerFlag[9] = ui_add_gadget_checkbox( MainWindow, 22, i, 16, 16, 0, "Secret Exit" ); i+=22;
364 QuitButton = ui_add_gadget_button( MainWindow, 20, i, 48, 40, "Done", NULL );
366 // The little box the wall will appear in.
367 WallViewBox = ui_add_gadget_userbox( MainWindow, 155, 5, 64, 64 );
369 // A bunch of buttons...
371 // ui_add_gadget_button( MainWindow,155,i,140, 26, "Add Door Control", add_trigger_control ); i += 29;
372 ui_add_gadget_button( MainWindow,155,i,140, 26, "Remove Trigger", trigger_remove ); i += 29;
373 ui_add_gadget_button( MainWindow,155,i,140, 26, "Bind Wall", bind_wall_to_trigger ); i += 29;
374 ui_add_gadget_button( MainWindow,155,i,140, 26, "Bind Matcen", bind_matcen_to_trigger ); i += 29;
375 ui_add_gadget_button( MainWindow,155,i,140, 26, "All Triggers ON", trigger_turn_all_ON ); i += 29;
377 old_trigger_num = -2; // Set to some dummy value so everything works ok on the first frame.
382 void close_trigger_window()
384 if ( MainWindow!=NULL ) {
385 ui_close_window( MainWindow );
390 void do_trigger_window()
393 short Markedwall, trigger_num;
395 if ( MainWindow == NULL ) return;
397 close_trigger_window();
401 //------------------------------------------------------------
402 // Call the ui code..
403 //------------------------------------------------------------
404 ui_button_any_drawn = 0;
405 ui_window_do_gadgets(MainWindow);
407 //------------------------------------------------------------
408 // If we change walls, we need to reset the ui code for all
409 // of the checkboxes that control the wall flags.
410 //------------------------------------------------------------
411 Markedwall = Markedsegp->sides[Markedside].wall_num;
412 if (Markedwall != -1)
413 trigger_num = Walls[Markedwall].trigger;
414 else trigger_num = -1;
416 if (old_trigger_num != trigger_num)
418 if (trigger_num != -1)
420 trigger *trig = &Triggers[trigger_num];
422 ui_checkbox_check(TriggerFlag[0], trig->flags & TRIGGER_CONTROL_DOORS);
423 ui_checkbox_check(TriggerFlag[1], trig->flags & TRIGGER_SHIELD_DAMAGE);
424 ui_checkbox_check(TriggerFlag[2], trig->flags & TRIGGER_ENERGY_DRAIN);
425 ui_checkbox_check(TriggerFlag[3], trig->flags & TRIGGER_EXIT);
426 ui_checkbox_check(TriggerFlag[4], trig->flags & TRIGGER_ONE_SHOT);
427 ui_checkbox_check(TriggerFlag[5], trig->flags & TRIGGER_ILLUSION_ON);
428 ui_checkbox_check(TriggerFlag[6], trig->flags & TRIGGER_ILLUSION_OFF);
429 ui_checkbox_check(TriggerFlag[7], trig->flags & TRIGGER_ON);
430 ui_checkbox_check(TriggerFlag[8], trig->flags & TRIGGER_MATCEN);
431 ui_checkbox_check(TriggerFlag[9], trig->flags & TRIGGER_SECRET_EXIT);
435 //------------------------------------------------------------
436 // If any of the checkboxes that control the wallflags are set, then
437 // update the cooresponding wall flag.
438 //------------------------------------------------------------
439 if (IS_CHILD(Markedsegp->children[Markedside])) {
440 if (TriggerFlag[0]->flag == 1)
441 trigger_add_to_Markedside(TRIGGER_CONTROL_DOORS);
443 trigger_remove_flag_from_Markedside(TRIGGER_CONTROL_DOORS);
444 if (TriggerFlag[1]->flag == 1)
445 trigger_add_to_Markedside(TRIGGER_SHIELD_DAMAGE);
447 trigger_remove_flag_from_Markedside(TRIGGER_SHIELD_DAMAGE);
448 if (TriggerFlag[2]->flag == 1)
449 trigger_add_to_Markedside(TRIGGER_ENERGY_DRAIN);
451 trigger_remove_flag_from_Markedside(TRIGGER_ENERGY_DRAIN);
452 if (TriggerFlag[3]->flag == 1)
453 trigger_add_to_Markedside(TRIGGER_EXIT);
455 trigger_remove_flag_from_Markedside(TRIGGER_EXIT);
456 if (TriggerFlag[4]->flag == 1)
457 trigger_add_to_Markedside(TRIGGER_ONE_SHOT);
459 trigger_remove_flag_from_Markedside(TRIGGER_ONE_SHOT);
460 if (TriggerFlag[5]->flag == 1)
461 trigger_add_to_Markedside(TRIGGER_ILLUSION_ON);
463 trigger_remove_flag_from_Markedside(TRIGGER_ILLUSION_ON);
464 if (TriggerFlag[6]->flag == 1)
465 trigger_add_to_Markedside(TRIGGER_ILLUSION_OFF);
467 trigger_remove_flag_from_Markedside(TRIGGER_ILLUSION_OFF);
468 if (TriggerFlag[7]->flag == 1)
469 trigger_add_to_Markedside(TRIGGER_ON);
471 trigger_remove_flag_from_Markedside(TRIGGER_ON);
473 if (TriggerFlag[8]->flag == 1)
474 trigger_add_to_Markedside(TRIGGER_MATCEN);
476 trigger_remove_flag_from_Markedside(TRIGGER_MATCEN);
478 if (TriggerFlag[9]->flag == 1)
479 trigger_add_to_Markedside(TRIGGER_SECRET_EXIT);
481 trigger_remove_flag_from_Markedside(TRIGGER_SECRET_EXIT);
484 for (i = 0; i < NUM_TRIGGER_FLAGS; i++ )
485 ui_checkbox_check(TriggerFlag[i], 0);
487 //------------------------------------------------------------
488 // Draw the wall in the little 64x64 box
489 //------------------------------------------------------------
490 gr_set_current_canvas( WallViewBox->canvas );
492 if ((Markedsegp->sides[Markedside].wall_num == -1) || (Walls[Markedsegp->sides[Markedside].wall_num].trigger) == -1)
493 gr_clear_canvas( CBLACK );
495 if (Markedsegp->sides[Markedside].tmap_num2 > 0) {
496 gr_ubitmap(0,0, texmerge_get_cached_bitmap( Markedsegp->sides[Markedside].tmap_num, Markedsegp->sides[Markedside].tmap_num2));
498 if (Markedsegp->sides[Markedside].tmap_num > 0) {
499 PIGGY_PAGE_IN(Textures[Markedsegp->sides[Markedside].tmap_num]);
500 gr_ubitmap(0,0, &GameBitmaps[Textures[Markedsegp->sides[Markedside].tmap_num].index]);
502 gr_clear_canvas( CGREY );
506 //------------------------------------------------------------
507 // If anything changes in the ui system, redraw all the text that
508 // identifies this robot.
509 //------------------------------------------------------------
510 if (ui_button_any_drawn || (old_trigger_num != trigger_num) ) {
511 if ( Markedsegp->sides[Markedside].wall_num > -1 ) {
512 ui_wprintf_at( MainWindow, 12, 6, "Trigger: %d ", trigger_num);
514 ui_wprintf_at( MainWindow, 12, 6, "Trigger: none ");
516 Update_flags |= UF_WORLD_CHANGED;
519 if ( QuitButton->pressed || (last_keypress==KEY_ESC)) {
520 close_trigger_window();
524 old_trigger_num = trigger_num;