Make do_trigger_window into a proper callback
This commit is contained in:
parent
46a816572d
commit
6ceb7d560f
|
@ -3,6 +3,7 @@ D1X-Rebirth Changelog
|
|||
20120317
|
||||
--------
|
||||
editor/ehostage.c, editor/med.c: Make do_hostage_window into a proper callback (seems to be unused for now)
|
||||
editor/eswitch, editor/med.c: Make do_trigger_window into a proper callback
|
||||
|
||||
20120312
|
||||
--------
|
||||
|
|
215
editor/eswitch.c
215
editor/eswitch.c
|
@ -46,11 +46,15 @@ COPYRIGHT 1993-1998 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED.
|
|||
#define NUM_TRIGGER_FLAGS 10
|
||||
|
||||
static UI_DIALOG *MainWindow = NULL;
|
||||
static UI_GADGET_USERBOX *WallViewBox;
|
||||
static UI_GADGET_BUTTON *QuitButton;
|
||||
static UI_GADGET_CHECKBOX *TriggerFlag[NUM_TRIGGER_FLAGS];
|
||||
|
||||
static int old_trigger_num;
|
||||
typedef struct trigger_dialog
|
||||
{
|
||||
UI_GADGET_USERBOX *wallViewBox;
|
||||
UI_GADGET_BUTTON *quitButton;
|
||||
UI_GADGET_CHECKBOX *triggerFlag[NUM_TRIGGER_FLAGS];
|
||||
int old_trigger_num;
|
||||
} trigger_dialog;
|
||||
|
||||
|
||||
//-----------------------------------------------------------------
|
||||
// Adds a trigger to wall, and returns the trigger number.
|
||||
|
@ -99,30 +103,8 @@ int add_trigger(segment *seg, short side)
|
|||
// Automatically adds flag to Connectside if possible unless it is a control trigger.
|
||||
// Returns 1 if trigger flag added.
|
||||
// Returns 0 if trigger flag cannot be added.
|
||||
int trigger_add_to_Markedside(short flag) {
|
||||
int trigger_num; //, ctrigger_num;
|
||||
|
||||
if (!Markedsegp) {
|
||||
editor_status("No Markedside.");
|
||||
return 0;
|
||||
}
|
||||
|
||||
// If no child on Markedside return
|
||||
if (!IS_CHILD(Markedsegp->children[Markedside])) return 0;
|
||||
|
||||
trigger_num = add_trigger(Markedsegp, Markedside);
|
||||
|
||||
if (trigger_num == -1) {
|
||||
editor_status("Cannot add trigger at Markedside.");
|
||||
return 0;
|
||||
}
|
||||
|
||||
Triggers[trigger_num].flags |= flag;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
int trigger_remove_flag_from_Markedside(short flag) {
|
||||
int trigger_flag_Markedside(short flag, int value)
|
||||
{
|
||||
int trigger_num; //, ctrigger_num;
|
||||
int wall_num;
|
||||
|
||||
|
@ -136,25 +118,22 @@ int trigger_remove_flag_from_Markedside(short flag) {
|
|||
|
||||
// If no wall just return
|
||||
wall_num = Markedsegp->sides[Markedside].wall_num;
|
||||
if (wall_num == -1) return 0;
|
||||
if (!value && wall_num == -1) return 0;
|
||||
trigger_num = value ? add_trigger(Markedsegp, Markedside) : Walls[wall_num].trigger;
|
||||
|
||||
trigger_num = Walls[wall_num].trigger;
|
||||
|
||||
// If flag is already cleared, then don't change anything.
|
||||
if ( trigger_num == -1 ) {
|
||||
editor_status("No trigger at Markedside.");
|
||||
if (trigger_num == -1) {
|
||||
editor_status(value ? "Cannot add trigger at Markedside." : "No trigger at Markedside.");
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!(Triggers[trigger_num].flags & flag))
|
||||
return 1;
|
||||
|
||||
Triggers[trigger_num].flags &= ~flag;
|
||||
if (value)
|
||||
Triggers[trigger_num].flags |= flag;
|
||||
else
|
||||
Triggers[trigger_num].flags &= ~flag;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
int bind_matcen_to_trigger() {
|
||||
|
||||
int wall_num, trigger_num, link_num;
|
||||
|
@ -289,7 +268,7 @@ int remove_trigger(segment *seg, short side)
|
|||
|
||||
int add_trigger_control()
|
||||
{
|
||||
trigger_add_to_Markedside(TRIGGER_CONTROL_DOORS);
|
||||
trigger_flag_Markedside(TRIGGER_CONTROL_DOORS, 1);
|
||||
Update_flags = UF_WORLD_CHANGED;
|
||||
return 1;
|
||||
}
|
||||
|
@ -310,12 +289,15 @@ int trigger_turn_all_ON()
|
|||
return 1;
|
||||
}
|
||||
|
||||
int trigger_dialog_handler(UI_DIALOG *dlg, d_event *event, trigger_dialog *t);
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
// Called from the editor... does one instance of the trigger dialog box
|
||||
//-------------------------------------------------------------------------
|
||||
int do_trigger_dialog()
|
||||
{
|
||||
int i;
|
||||
trigger_dialog *t;
|
||||
|
||||
if (!Markedsegp) {
|
||||
editor_status("Trigger requires Marked Segment & Side.");
|
||||
|
@ -324,6 +306,10 @@ int do_trigger_dialog()
|
|||
|
||||
// Only open 1 instance of this window...
|
||||
if ( MainWindow != NULL ) return 0;
|
||||
|
||||
MALLOC(t, trigger_dialog, 1);
|
||||
if (!t)
|
||||
return 0;
|
||||
|
||||
// Close other windows.
|
||||
robot_close_window();
|
||||
|
@ -332,25 +318,25 @@ int do_trigger_dialog()
|
|||
hostage_close_window();
|
||||
|
||||
// Open a window with a quit button
|
||||
MainWindow = ui_create_dialog( TMAPBOX_X+20, TMAPBOX_Y+20, 765-TMAPBOX_X, 545-TMAPBOX_Y, DF_DIALOG, NULL, NULL );
|
||||
MainWindow = ui_create_dialog( TMAPBOX_X+20, TMAPBOX_Y+20, 765-TMAPBOX_X, 545-TMAPBOX_Y, DF_DIALOG, (int (*)(UI_DIALOG *, d_event *, void *))trigger_dialog_handler, t );
|
||||
|
||||
// These are the checkboxes for each door flag.
|
||||
i = 44;
|
||||
TriggerFlag[0] = ui_add_gadget_checkbox( MainWindow, 22, i, 16, 16, 0, "Door Control" ); i+=22;
|
||||
TriggerFlag[1] = ui_add_gadget_checkbox( MainWindow, 22, i, 16, 16, 0, "Shield damage" ); i+=22;
|
||||
TriggerFlag[2] = ui_add_gadget_checkbox( MainWindow, 22, i, 16, 16, 0, "Energy drain" ); i+=22;
|
||||
TriggerFlag[3] = ui_add_gadget_checkbox( MainWindow, 22, i, 16, 16, 0, "Exit" ); i+=22;
|
||||
TriggerFlag[4] = ui_add_gadget_checkbox( MainWindow, 22, i, 16, 16, 0, "One-shot" ); i+=22;
|
||||
TriggerFlag[5] = ui_add_gadget_checkbox( MainWindow, 22, i, 16, 16, 0, "Illusion ON" ); i+=22;
|
||||
TriggerFlag[6] = ui_add_gadget_checkbox( MainWindow, 22, i, 16, 16, 0, "Illusion OFF" ); i+=22;
|
||||
TriggerFlag[7] = ui_add_gadget_checkbox( MainWindow, 22, i, 16, 16, 0, "Trigger ON" ); i+=22;
|
||||
TriggerFlag[8] = ui_add_gadget_checkbox( MainWindow, 22, i, 16, 16, 0, "Matcen Trigger" ); i+=22;
|
||||
TriggerFlag[9] = ui_add_gadget_checkbox( MainWindow, 22, i, 16, 16, 0, "Secret Exit" ); i+=22;
|
||||
t->triggerFlag[0] = ui_add_gadget_checkbox( MainWindow, 22, i, 16, 16, 0, "Door Control" ); i+=22;
|
||||
t->triggerFlag[1] = ui_add_gadget_checkbox( MainWindow, 22, i, 16, 16, 0, "Shield damage" ); i+=22;
|
||||
t->triggerFlag[2] = ui_add_gadget_checkbox( MainWindow, 22, i, 16, 16, 0, "Energy drain" ); i+=22;
|
||||
t->triggerFlag[3] = ui_add_gadget_checkbox( MainWindow, 22, i, 16, 16, 0, "Exit" ); i+=22;
|
||||
t->triggerFlag[4] = ui_add_gadget_checkbox( MainWindow, 22, i, 16, 16, 0, "One-shot" ); i+=22;
|
||||
t->triggerFlag[5] = ui_add_gadget_checkbox( MainWindow, 22, i, 16, 16, 0, "Illusion ON" ); i+=22;
|
||||
t->triggerFlag[6] = ui_add_gadget_checkbox( MainWindow, 22, i, 16, 16, 0, "Illusion OFF" ); i+=22;
|
||||
t->triggerFlag[7] = ui_add_gadget_checkbox( MainWindow, 22, i, 16, 16, 0, "Trigger ON" ); i+=22;
|
||||
t->triggerFlag[8] = ui_add_gadget_checkbox( MainWindow, 22, i, 16, 16, 0, "Matcen Trigger" ); i+=22;
|
||||
t->triggerFlag[9] = ui_add_gadget_checkbox( MainWindow, 22, i, 16, 16, 0, "Secret Exit" ); i+=22;
|
||||
|
||||
QuitButton = ui_add_gadget_button( MainWindow, 20, i, 48, 40, "Done", NULL );
|
||||
t->quitButton = ui_add_gadget_button( MainWindow, 20, i, 48, 40, "Done", NULL );
|
||||
|
||||
// The little box the wall will appear in.
|
||||
WallViewBox = ui_add_gadget_userbox( MainWindow, 155, 5, 64, 64 );
|
||||
t->wallViewBox = ui_add_gadget_userbox( MainWindow, 155, 5, 64, 64 );
|
||||
|
||||
// A bunch of buttons...
|
||||
i = 80;
|
||||
|
@ -360,7 +346,7 @@ int do_trigger_dialog()
|
|||
ui_add_gadget_button( MainWindow,155,i,140, 26, "Bind Matcen", bind_matcen_to_trigger ); i += 29;
|
||||
ui_add_gadget_button( MainWindow,155,i,140, 26, "All Triggers ON", trigger_turn_all_ON ); i += 29;
|
||||
|
||||
old_trigger_num = -2; // Set to some dummy value so everything works ok on the first frame.
|
||||
t->old_trigger_num = -2; // Set to some dummy value so everything works ok on the first frame.
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
@ -373,15 +359,17 @@ void close_trigger_window()
|
|||
}
|
||||
}
|
||||
|
||||
void do_trigger_window()
|
||||
int trigger_dialog_handler(UI_DIALOG *dlg, d_event *event, trigger_dialog *t)
|
||||
{
|
||||
int i;
|
||||
short Markedwall, trigger_num;
|
||||
int keypress = 0;
|
||||
int rval = 0;
|
||||
|
||||
if ( MainWindow == NULL ) return;
|
||||
Assert(MainWindow != NULL);
|
||||
if (!Markedsegp) {
|
||||
close_trigger_window();
|
||||
return;
|
||||
return 0;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------
|
||||
|
@ -389,6 +377,9 @@ void do_trigger_window()
|
|||
//------------------------------------------------------------
|
||||
ui_button_any_drawn = 0;
|
||||
|
||||
if (event->type == EVENT_KEY_COMMAND)
|
||||
keypress = event_key_get(event);
|
||||
|
||||
//------------------------------------------------------------
|
||||
// If we change walls, we need to reset the ui code for all
|
||||
// of the checkboxes that control the wall flags.
|
||||
|
@ -398,22 +389,22 @@ void do_trigger_window()
|
|||
trigger_num = Walls[Markedwall].trigger;
|
||||
else trigger_num = -1;
|
||||
|
||||
if (old_trigger_num != trigger_num)
|
||||
if (t->old_trigger_num != trigger_num)
|
||||
{
|
||||
if (trigger_num != -1)
|
||||
{
|
||||
trigger *trig = &Triggers[trigger_num];
|
||||
|
||||
ui_checkbox_check(TriggerFlag[0], trig->flags & TRIGGER_CONTROL_DOORS);
|
||||
ui_checkbox_check(TriggerFlag[1], trig->flags & TRIGGER_SHIELD_DAMAGE);
|
||||
ui_checkbox_check(TriggerFlag[2], trig->flags & TRIGGER_ENERGY_DRAIN);
|
||||
ui_checkbox_check(TriggerFlag[3], trig->flags & TRIGGER_EXIT);
|
||||
ui_checkbox_check(TriggerFlag[4], trig->flags & TRIGGER_ONE_SHOT);
|
||||
ui_checkbox_check(TriggerFlag[5], trig->flags & TRIGGER_ILLUSION_ON);
|
||||
ui_checkbox_check(TriggerFlag[6], trig->flags & TRIGGER_ILLUSION_OFF);
|
||||
ui_checkbox_check(TriggerFlag[7], trig->flags & TRIGGER_ON);
|
||||
ui_checkbox_check(TriggerFlag[8], trig->flags & TRIGGER_MATCEN);
|
||||
ui_checkbox_check(TriggerFlag[9], trig->flags & TRIGGER_SECRET_EXIT);
|
||||
ui_checkbox_check(t->triggerFlag[0], trig->flags & TRIGGER_CONTROL_DOORS);
|
||||
ui_checkbox_check(t->triggerFlag[1], trig->flags & TRIGGER_SHIELD_DAMAGE);
|
||||
ui_checkbox_check(t->triggerFlag[2], trig->flags & TRIGGER_ENERGY_DRAIN);
|
||||
ui_checkbox_check(t->triggerFlag[3], trig->flags & TRIGGER_EXIT);
|
||||
ui_checkbox_check(t->triggerFlag[4], trig->flags & TRIGGER_ONE_SHOT);
|
||||
ui_checkbox_check(t->triggerFlag[5], trig->flags & TRIGGER_ILLUSION_ON);
|
||||
ui_checkbox_check(t->triggerFlag[6], trig->flags & TRIGGER_ILLUSION_OFF);
|
||||
ui_checkbox_check(t->triggerFlag[7], trig->flags & TRIGGER_ON);
|
||||
ui_checkbox_check(t->triggerFlag[8], trig->flags & TRIGGER_MATCEN);
|
||||
ui_checkbox_check(t->triggerFlag[9], trig->flags & TRIGGER_SECRET_EXIT);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -421,58 +412,41 @@ void do_trigger_window()
|
|||
// If any of the checkboxes that control the wallflags are set, then
|
||||
// update the cooresponding wall flag.
|
||||
//------------------------------------------------------------
|
||||
if (IS_CHILD(Markedsegp->children[Markedside])) {
|
||||
if (TriggerFlag[0]->flag == 1)
|
||||
trigger_add_to_Markedside(TRIGGER_CONTROL_DOORS);
|
||||
if (IS_CHILD(Markedsegp->children[Markedside]))
|
||||
{
|
||||
rval = 1;
|
||||
|
||||
if (GADGET_PRESSED(t->triggerFlag[0]))
|
||||
trigger_flag_Markedside(TRIGGER_CONTROL_DOORS, t->triggerFlag[0]->flag);
|
||||
else if (GADGET_PRESSED(t->triggerFlag[1]))
|
||||
trigger_flag_Markedside(TRIGGER_SHIELD_DAMAGE, t->triggerFlag[1]->flag);
|
||||
else if (GADGET_PRESSED(t->triggerFlag[2]))
|
||||
trigger_flag_Markedside(TRIGGER_ENERGY_DRAIN, t->triggerFlag[2]->flag);
|
||||
else if (GADGET_PRESSED(t->triggerFlag[3]))
|
||||
trigger_flag_Markedside(TRIGGER_EXIT, t->triggerFlag[3]->flag);
|
||||
else if (GADGET_PRESSED(t->triggerFlag[4]))
|
||||
trigger_flag_Markedside(TRIGGER_ONE_SHOT, t->triggerFlag[4]->flag);
|
||||
else if (GADGET_PRESSED(t->triggerFlag[5]))
|
||||
trigger_flag_Markedside(TRIGGER_ILLUSION_ON, t->triggerFlag[5]->flag);
|
||||
else if (GADGET_PRESSED(t->triggerFlag[6]))
|
||||
trigger_flag_Markedside(TRIGGER_ILLUSION_OFF, t->triggerFlag[6]->flag);
|
||||
else if (GADGET_PRESSED(t->triggerFlag[7]))
|
||||
trigger_flag_Markedside(TRIGGER_ON, t->triggerFlag[7]->flag);
|
||||
else if (GADGET_PRESSED(t->triggerFlag[8]))
|
||||
trigger_flag_Markedside(TRIGGER_MATCEN, t->triggerFlag[8]->flag);
|
||||
else if (GADGET_PRESSED(t->triggerFlag[9]))
|
||||
trigger_flag_Markedside(TRIGGER_SECRET_EXIT, t->triggerFlag[9]->flag);
|
||||
else
|
||||
trigger_remove_flag_from_Markedside(TRIGGER_CONTROL_DOORS);
|
||||
if (TriggerFlag[1]->flag == 1)
|
||||
trigger_add_to_Markedside(TRIGGER_SHIELD_DAMAGE);
|
||||
else
|
||||
trigger_remove_flag_from_Markedside(TRIGGER_SHIELD_DAMAGE);
|
||||
if (TriggerFlag[2]->flag == 1)
|
||||
trigger_add_to_Markedside(TRIGGER_ENERGY_DRAIN);
|
||||
else
|
||||
trigger_remove_flag_from_Markedside(TRIGGER_ENERGY_DRAIN);
|
||||
if (TriggerFlag[3]->flag == 1)
|
||||
trigger_add_to_Markedside(TRIGGER_EXIT);
|
||||
else
|
||||
trigger_remove_flag_from_Markedside(TRIGGER_EXIT);
|
||||
if (TriggerFlag[4]->flag == 1)
|
||||
trigger_add_to_Markedside(TRIGGER_ONE_SHOT);
|
||||
else
|
||||
trigger_remove_flag_from_Markedside(TRIGGER_ONE_SHOT);
|
||||
if (TriggerFlag[5]->flag == 1)
|
||||
trigger_add_to_Markedside(TRIGGER_ILLUSION_ON);
|
||||
else
|
||||
trigger_remove_flag_from_Markedside(TRIGGER_ILLUSION_ON);
|
||||
if (TriggerFlag[6]->flag == 1)
|
||||
trigger_add_to_Markedside(TRIGGER_ILLUSION_OFF);
|
||||
else
|
||||
trigger_remove_flag_from_Markedside(TRIGGER_ILLUSION_OFF);
|
||||
if (TriggerFlag[7]->flag == 1)
|
||||
trigger_add_to_Markedside(TRIGGER_ON);
|
||||
else
|
||||
trigger_remove_flag_from_Markedside(TRIGGER_ON);
|
||||
|
||||
if (TriggerFlag[8]->flag == 1)
|
||||
trigger_add_to_Markedside(TRIGGER_MATCEN);
|
||||
else
|
||||
trigger_remove_flag_from_Markedside(TRIGGER_MATCEN);
|
||||
|
||||
if (TriggerFlag[9]->flag == 1)
|
||||
trigger_add_to_Markedside(TRIGGER_SECRET_EXIT);
|
||||
else
|
||||
trigger_remove_flag_from_Markedside(TRIGGER_SECRET_EXIT);
|
||||
rval = 0;
|
||||
|
||||
} else
|
||||
for (i = 0; i < NUM_TRIGGER_FLAGS; i++ )
|
||||
ui_checkbox_check(TriggerFlag[i], 0);
|
||||
ui_checkbox_check(t->triggerFlag[i], 0);
|
||||
|
||||
//------------------------------------------------------------
|
||||
// Draw the wall in the little 64x64 box
|
||||
//------------------------------------------------------------
|
||||
gr_set_current_canvas( WallViewBox->canvas );
|
||||
gr_set_current_canvas( t->wallViewBox->canvas );
|
||||
|
||||
if ((Markedsegp->sides[Markedside].wall_num == -1) || (Walls[Markedsegp->sides[Markedside].wall_num].trigger) == -1)
|
||||
gr_clear_canvas( CBLACK );
|
||||
|
@ -492,7 +466,7 @@ void do_trigger_window()
|
|||
// If anything changes in the ui system, redraw all the text that
|
||||
// identifies this robot.
|
||||
//------------------------------------------------------------
|
||||
if (ui_button_any_drawn || (old_trigger_num != trigger_num) ) {
|
||||
if (ui_button_any_drawn || (t->old_trigger_num != trigger_num) ) {
|
||||
if ( Markedsegp->sides[Markedside].wall_num > -1 ) {
|
||||
ui_dprintf_at( MainWindow, 12, 6, "Trigger: %d ", trigger_num);
|
||||
} else {
|
||||
|
@ -500,13 +474,22 @@ void do_trigger_window()
|
|||
}
|
||||
Update_flags |= UF_WORLD_CHANGED;
|
||||
}
|
||||
|
||||
if (event->type == EVENT_WINDOW_CLOSE)
|
||||
{
|
||||
d_free(t);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if ( QuitButton->pressed || (last_keypress==KEY_ESC)) {
|
||||
if ( GADGET_PRESSED(t->quitButton) || (keypress==KEY_ESC))
|
||||
{
|
||||
close_trigger_window();
|
||||
return;
|
||||
return 1;
|
||||
}
|
||||
|
||||
old_trigger_num = trigger_num;
|
||||
t->old_trigger_num = trigger_num;
|
||||
|
||||
return rval;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -1080,7 +1080,6 @@ void editor(void)
|
|||
do_robot_window();
|
||||
do_object_window();
|
||||
do_wall_window();
|
||||
do_trigger_window();
|
||||
check_wall_validity();
|
||||
Assert(Num_walls>=0);
|
||||
|
||||
|
|
Loading…
Reference in a new issue