//============================================================================= // // le_events.mel - handles all event editor/exporter stuff // //============================================================================= // current indices into the three text lists for the trigger editor global int $le_cur_event_group, $le_cur_trigger, $le_cur_action; // indices into le_event_data of currently selected trigger and action (from above) global int $le_event_group_index, $le_trigger_index, $le_action_index; // event data broken down into one entry per array entry global string $le_event_data[]; // the three text lists are stored here global string $le_event_groups[], $le_triggers[], $le_actions[]; // these contain the grammar for trigger/action data global string $le_trigger_tab[], $le_action_tab[]; // here are all of the parameter types global string $le_trigger_param_types[], $le_action_param_types[]; // here are some tables for menu paramater types global string $le_ai_states[], $le_team_types[]; global string $le_death_types[]; global string $le_uber_bits[], $le_camera_offsets[]; global string $le_shake_types[]; global string $le_dummy_tab[]; // area to save cut/paste event data global string $le_clipboard_data[]; //&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& global proc le_init_string_tab() { global string $le_trigger_tab[], $le_action_tab[]; global string $le_trigger_param_types[], $le_action_param_types[]; global string $le_ai_states[], $le_team_types[]; global string $le_death_types[]; global string $le_camera_offsets[]; global string $le_shake_types[]; global string $le_dummy_tab[]; clear ($le_trigger_tab); clear ($le_action_tab); $le_trigger_tab = { "Do always", "", // "Is mission complete (1-n)", "int1", // "Has next message started", "", // "Has message been canceled", "", "Have all msgs finished playing", "", "Are some messages still playing", "", // "Was _YES_ chosen", "", // "Was _NO_ chosen", "", // "Does object exist", "object1", // "Does object not exist", "object1", "Chance of event to occur 0-100%", "int1", "Has key just been pressed", "string1", "Is key being pressed", "string1", "-------------------------------", "dir", "", "undir", "AI tests", "dir", "Am I (AI) alive", "", "Am I (AI) dead", "", "Is AI object alive", "object1", "Is AI object dead", "object1", "-------------------------------", "dir", "", "undir", "Am I in AI state", "ai_state1", "Am I not in AI state", "ai_state1", "Is object in AI state", "object1,ai_state2", "Is object not in AI state", "object1,ai_state2", "-------------------------------", "dir", "", "undir", // "Am I alarmed", "", // "Am I not alarmed", "", // "Is obj alarmed", "object1", // "Is obj not alarmed", "object1", "**********","undir", "Animation tests", "dir", // "Is my anim at first frame", "", // "Is my anim at last frame", "", // "Is my animation playing", "", // "Is my animation stopped", "", // "Is my anim on or past frame", "float1", // "Is my anim on or before frame", "float1", // "Is my anim between these frames", "float1,float2", // "-------------------------------", "dir", "", "undir", "Is object anim at first frame", "object1", "Is object anim at last frame", "object1", "Is object animation playing", "object1", "Is object animation stopped", "object1", "Is obj anim on or past frame", "object1,float2", "Is obj anim on or before frame", "object1,float2", "Is obj anim btween these frames", "object1,float2,float3", "**********","undir", "Camera tests", "dir", "Is my camera active", "", "Is my camera not active", "", // "Has my cam hold time finished", "", // "Is my camera on", "", // "Is my camera off", "", // "Has my cam time out finished", "", "-------------------------------", "dir", "", "undir", "Is objs cam active", "object1", "Is objs cam not active", "object1", // "Has objs cam hold time finished", "object1", // "Is objects camera on", "object1", // "Is objects camera off", "object1", // "Has objs cam time out finished", "object1", "**********","undir", "Flags", "dir", "Is my flag raised (1-8)", "int1", "Is my flag lowered (1-8)", "int1", "Is objects flag raised (1-8)", "object1,int2", "Is objects flag lowered (1-8)", "object1,int2", "-------------------------------", "dir", "", "undir", "Is my global flag raised", "", "Is my global flag lowered", "", "Is objects global flag raised", "object1", "Is objects global flag lowered", "object1", "-------------------------------", "dir", "", "undir", "Is uber-bit raised", "uberbit1", "Is uber-bit lowered", "uberbit1", "**********","undir", // "Health", "dir", // "Is my health more than value", "float1", // "Is my health less than value", "float1", // "Is my health between values", "float1,float2", // "-------------------------------", "dir", "", "undir", // "Is objs health more than value", "object1,float2", // "Is objs health less than value", "object1,float2", // "Is objs health between values", "object1,float2,float3", // "**********","undir", "Number tests", "dir", "Is my number less than value", "float1", "Is my number greater than value", "float1", "Is my number between values", "float1,float2", "Is my number not between values", "float1,float2", "-------------------------------", "dir", "", "undir", "Is objs number less than value", "object1,float2", "Is objs num greater than value", "object1,float2", "Is objs number between values", "object1,float2,float3", "Is objs num not between values", "object1,float2,float3", "**********","undir", "Path tests", "dir", "Am I at path point", "path1,int2", "Did I just enter path point", "path1,int2", "Did I just leave path point", "path1,int2", "Is object at path point", "object1,path2,int3", "Did obj just enter path point", "object1,path2,int3", "Did obj just leave path point", "object1,path2,int3", "**********","undir", "Timer tests", "dir", "Is my time at or before (secs)", "float1", "Is my time at or past (secs)", "float1", "Is my time between secs & secs", "float1,float2", "Is my timer at beginning", "", "Is my timer running", "", "Is my timer paused", "", "Has my timer finished", "", "-------------------------------", "dir", "", "undir", "Is obj time at or before (secs)", "object1,float2", "Is obj time at or past (secs)", "object1,float2", "Is obj time between secs & secs", "object1,float2,float3", "Is obj timer at beginning", "object1", "Is obj timer running", "object1", "Is obj timer paused", "object1", "Has obj timer finished", "object1", "**********","undir", "Unit tests", "dir", "Men dead >= % of initial men", "team1,float2", "Men dead <= % of initial men", "team1,float2", "Men alive >= % of initial men", "team1,float2", "Men alive <= % of initial men", "team1,float2", "**********","undir", "Visibility", "dir", // "Am I visible from any dist", "", // "Is my visibility normal", "", // "Is obj visible from any dist", "object1", // "Is objs visibility normal", "object1", // "-----------------------------", "dir", "", "undir", "Am I hidden", "", // "Am I being revealed", "", "Am I visible", "", "Is object hidden", "object1", // "Is object being revealed", "object1", "Is object visible", "object1", "**********","undir", // should add some edge tests here too ('Did I enter objs zone', etc) "Zone tests", "dir", "Am I in objs zone", "object1", "Am I not in objs zone", "object1", "Is object in my zone", "object1", "Is object not in my zone", "object1", "Is object in objs zone", "object1,object2", "Is object not in objs zone", "object1,object2", "-----------------------------", "dir", "", "undir", "Is camera in my zone", "", "Is camera not in my zone", "", "Is camera in objs zone", "object1", "Is camera not in objs zone", "object1", "**********","undir", "No longer supported triggers", "dir", "**********","undir" }; $le_action_tab = { "AI/Path actions", "dir", "Set AI path", "path1", "Set AI path point", "int1", "Set AI path and point", "path1,int2", "Set AI state", "ai_state1", "Set AI attack zone", "object1", "Set guard spot to current pos", "", "Set guard spot to obj pos", "object1", "Release AI path", "", "Release AI attack zone", "", "-----------------------------", "dir", "", "undir", "Set objects AI path", "object1,path2", "Set objects AI path point", "object1,int2", "Set objects AI path and point", "object1,path2,int3", "Set objects AI state", "object1,ai_state2", "Set objects AI attack zone", "object1,object2", "Set objs guard spot to cur pos", "object1", "Set objs guard spot to obj pos", "object1,object2", "Release objects AI path", "object1", "Release objects AI attack zone", "object1", "**********","undir", "Animation control", "dir", // "Play my animation fwd once", "", // "Play my animation fwd loop", "", // "Play my animation bkwd once", "", // "Play my animation bkwd loop", "", // "Play my animation to frame", "float1", // "Play my animation to my num", "", // "Play my animation to objs num", "object1", // "Set my animation speed (scale)", "float1", // "Scale my anim speed", "float1", // "Scale my anim speed with limit", "float1,float2", // "Add to my anim speed", "float1", // "Add to my anim speed with limit", "float1,float2", // "Set my animation frame", "float1", // "-----------------------------", "dir", "", "undir", "Play obj animation fwd once", "object1", // "Play obj animation fwd loop", "object1", // "Play obj animation bkwd once", "object1", // "Play obj animation bkwd loop", "object1", "Play obj animation to frame", "object1,float2", // "Play obj animation to my num", "object1", // "Play obj animation to objs num", "object1,object2", // "Set obj animation speed (scale)", "object1,float2", // "Scale obj anim speed", "object1,float2", // "Scale obj anim speed with limit", "object1,float2,float3", // "Add to obj anim speed", "object1,float2", // "Add to obj anim spd with limit", "object1,float2,float3", "Set obj animation frame", "object1,float2", "Set obj anim frame and play", "object1,float2", "------------------------------", "dir", "", "undir", "Stop obj animation", "object1", // "Reset my animation", "", "Reset obj animation", "object1", "**********","undir", "Audio", "dir", "Play 3d sound", "sound1", "Stop 3d sound", "sound1", "Play local sound", "string1", "Play voice stream", "string1", "Stop voice streams", "", "Play music stream", "string1", "Stop music streams", "", "Pause music", "", "Unpause music", "", // "Parent snd to wobj (snd->wobj)", "sound1,object2", "**********","undir", "Camera", "dir", "Set cam near dist", "float1", "Set cam far dist", "float1", "Set cam near height", "float1", "Set cam far height", "float1", "Set cam speed", "float1", "Set cam max vel", "float1", "Set cam focus offset", "float1", "Set cam min height", "float1", "Set cam default vals", "", "Set camera to spline path", "object1", "Activate my camera", "", "Deactivate my camera", "", "Activate obj camera", "object1", "Deactivate obj camera", "object1", // "Shake camera (force:time:fade)", "shake1,float2,float3,float4", "**********","undir", "Flags", "dir", "Raise my flag (1-8)", "int1", "Lower my flag (1-8)", "int1", "Raise objects flag (1-8)", "object1,int2", "Lower objects flag (1-8)", "object1,int2", "-------------------------", "dir", "", "undir", "Raise my global flag", "", "Lower my global flag", "", "Raise objects global flag", "object1", "Lower objects global flag", "object1", "-------------------------", "dir", "", "undir", "Raise uber-bit", "uberbit1", "Lower uber-bit", "uberbit1", "**********","undir", "Messages", "dir", // "Set my message", "message1,message2", // "Set objects message", "object1,message2,message3", "Play message", "message1,message2", "Play message (timed)", "message1,message2,float3", "Clear all msgs and portraits", "", // "Play message at speed", "message1,message2,float3", // "Play message then hide", "message1,message2", // "Play message now", "message1,message2", // "Play message now then hide", "message1,message2", // "Allow player to cancel message", "", // "Clear message cancel mode", "", // "Set nothing for my head", "", // "Set Al for my head", "", // "Set Janky for my head", "", // "Set Madsci for my head", "", // "Set nothing for objs head", "object1", // "Set Al for objs head", "object1", // "Set Janky for objs head", "object1", // "Set Madsci for objs head", "object1", // "Set no head", "", // "Set Al head", "", // "Set Janky head", "", // "Set Madsci head", "", "**********","undir", "Miscellaneous", "dir", "End mission", "", // "Set my health", "float1", // "Set obj health", "float1,object2", // "Parent me to world obj", "object1", // "Parent obj to wobj (obj->wobj)", "object1,object2", // "Re-attach wobjs (child->parent)", "object1,object2", // "Set next mission (1-n)", "int1", // "Mark mission as completed (1-n)", "int1", // "Activate victory screen", "", // "Skip all other groups", "", // "Hide my shadow", "", // "Hide objects shadow", "object1", // "Deactivate me", "", // "Deactivate object", "object1", "**********","undir", "Numbers", "dir", "My number", "dir", "My number = 0", "", "My number = value", "float1", "My number = random value", "float1,float2", "My number += value", "float1", "My number -= value", "float1", "My number *= value", "float1", "My number /= value", "float1", "My number = objs number", "object1", "My number += objs number", "object1", "My number -= objs number", "object1", "My number *= objs number", "object1", "My number /= objs number", "object1", "-----------------------------", "dir", "", "undir", // "My number = my anim speed", "", // "My number = my anim frame", "", // "My number = my last frame", "", // "My number = my time", "", // "My number = objs anim speed", "object1", "My number = objs anim frame", "object1", "My number = objs last frame", "object1", "My number = objs time", "object1", "-----------------------------", "dir", "", "undir", // "Set my anim speed to my number", "", // "Set my anim frame to my number", "", "Set my time to my number", "", // "Set my anim speed to objs num", "object1", // "Set my anim frame to objs num", "object1", "Set my time to objs number", "object1", "**********","undir", "Objects number", "dir", "Objs number = 0", "object1", "Objs number = value", "object1,float2", "Objs number = random value", "object1,float2,float3", "Objs number += value", "object1,float2", "Objs number -= value", "object1,float2", "Objs number *= value", "object1,float2", "Objs number /= value", "object1,float2", "Objs number = my number", "object1", "Objs number += my number", "object1", "Objs number -= my number", "object1", "Objs number *= my number", "object1", "Objs number /= my number", "object1", "Objs number = objs number", "object1, object2", "Objs number += objs number", "object1,object2", "Objs number -= objs number", "object1,object2", "Objs number *= objs number", "object1,object2", "Objs number /= objs number", "object1,object2", "-----------------------------", "dir", "", "undir", // "Objs number = my anim speed", "object1", // "Objs number = my anim frame", "object1", // "Objs number = my last frame", "object1", "Objs number = my time", "object1", // "Objs number = objs anim speed", "object1,object2", "Objs number = objs anim frame", "object1,object2", "Objs number = objs last frame", "object1,object2", "Objs number = objs time", "object1,object2", // "-----------------------------", "dir", "", "undir", // "Set objs anim speed to my num", "object1", "Set objs anim frame to my num", "object1", "Set objs time to my number", "object1", // "Set objs anim speed to objs num", "object1,object2", "Set objs anim frame to objs num", "object1,object2", "Set objs time to objs number", "object1,object2", "**********","undir", "**********","undir", // "Table of numbers", "dir", // "Random table (groups:total)", "int1,int2", // "Random table (range:total)", "int1,int2", // "Clear table", "", // "Set table index", "int1", // "Add number to table", "int1", // "-----------------------------", "dir", "", "undir", // "My number = rand table (1-N)", "int1", // "My number = cur rand num", "", // "My number = next rand num", "", // "-----------------------------", "dir", "", "undir", // "Objs number = rand table (1-N)", "int1", // "Objs number = cur rand num", "", // "Objs number = next rand num", "", // "**********","undir", "Timer actions", "dir", "Set my time (secs)", "float1", "Set my time (secs) and start", "float1", "Start my timer", "", "Pause my timer", "", "Reset my timer", "", "-----------------------------", "dir", "", "undir", "Set obj time (secs)", "object1,float2", "Set obj time (secs) and start", "object1,float2", "Start obj timer", "object1", "Pause obj timer", "object1", "Reset obj timer", "object1", // "-----------------------------", "dir", "", "undir", // "Show my timer on hud", "", // "Show obj timer on hud", "object1", // "Remove timer from hud", "", "**********","undir", "Unit/Men actions", "dir", "Set my allegiance", "team1", "Set my unit size", "int1", "Set my stamina", "float1", "Set my morale", "float1", "Set my leader", "object1", "Set my leader type", "obj_type1", "-----------------------------", "dir", "", "undir", "Set objs allegiance", "object1,team2", "Set objs unit size", "object1,int2", "Set objs stamina", "object1,float2", "Set objs morale", "object1,float2", "Set objs leader", "object1,object2", "Set objs leader type", "object1,obj_type2", "**********","undir", "Visibility/reveal", "dir", // "Set my visibility dist", "float1", // "Make me visible from any dist", "", // "Make my visibility normal", "", // "Set objs visibility dist", "object1,float2", // "Make obj visible from any dist", "object1", // "Make objs visibility normal", "object1", // "-----------------------------", "dir", "", "undir", "Hide me", "", "Reveal me", "", "Hide object", "object1", "Reveal object", "object1", "**********","undir", "No longer supported actions", "dir", "**********","undir" }; $le_trigger_param_types = { "object1", "t_object", "object2", "t_object2", "object3", "t_object3", "object4", "t_object4", "zone1", "t_zone", "zone2", "t_zone2", "zone3", "t_zone3", "zone4", "t_zone4", "float1", "t_float", "float2", "t_float2", "float3", "t_float3", "float4", "t_float4", "int1", "t_int1", "int2", "t_int2", "int3", "t_int3", "int4", "t_int4", "path1", "t_path1", "path2", "t_path2", "path3", "t_path3", "path4", "t_path4", "ai_state1", "t_ai_state1", "ai_state2", "t_ai_state2", "obj_type1", "t_obj_type1", "obj_type2", "t_obj_type2", "string1", "t_string1", "team1", "t_team1", "uberbit1", "t_uberbit1" }; $le_action_param_types = { "object1", "a_object", "object2", "a_object2", "object3", "a_object3", "object4", "a_object4", "zone1", "a_zone", "zone2", "a_zone2", "zone3", "a_zone3", "zone4", "a_zone4", "float1", "a_float", "float2", "a_float2", "float3", "a_float3", "float4", "a_float4", "int1", "a_int1", "int2", "a_int2", "int3", "a_int3", "int4", "a_int4", "path1", "a_path1", "path2", "a_path2", "path3", "a_path3", "path4", "a_path4", "ai_state1", "a_ai_state1", "ai_state2", "a_ai_state2", "obj_type1", "a_obj_type1", "obj_type2", "a_obj_type2", "cam_offst1","a_cam_offst1", "shake1", "a_shake1", "death1", "a_death1", "uberbit1", "a_uberbit1", "message1", "a_message1", "message2", "a_message2", "message3", "a_message3", "string1", "a_string1", "string2", "a_string2", "team1", "a_team1", "team2", "a_team2", "sound1", "a_sound1" }; $le_ai_states = { "ai_Idle", "ai_Walk_to_path", "ai_Walk_to_path", "ai_Run_to_target", "ai_Stop", "ai_Melee_under", "ai_Melee_over", "ai_Projectile", "ai_Charge", "ai_Flee", "ai_Fortify", "ai_Crippled", "ai_Dead", "ai_Test" }; $le_team_types = { "team_Greeks", "team_Trojans", "team_Neutral" }; $le_death_types = { "death_normal", "death_fall_plane", "death_falling", "death_squished", "death_crushed", "death_small_space" }; $le_camera_offsets = { "cam_offset_straightback_close", "cam_offset_straightback_normal", "cam_offset_straightback_far", "cam_offset_overshoulder_close", "cam_offset_overshoulder_normal", "cam_offset_overshoulder_far", "cam_offset_topdown_close", "cam_offset_topdown_normal", "cam_offset_topdown_far", "cam_offset_special_1", "cam_offset_special_2", "cam_offset_special_3", "cam_offset_special_4", "cam_offset_special_5", "cam_offset_special_6", "cam_offset_special_7", "cam_offset_special_8", "cam_offset_special_9", "cam_offset_special_10", "cam_offset_special_11", "cam_offset_special_12", "cam_offset_special_13", "cam_offset_special_14", "cam_offset_special_15", "cam_offset_special_16", "cam_offset_special_17", "cam_offset_special_18", "cam_offset_special_19", "cam_offset_special_20" }; $le_shake_types = { "shake_in_X", "shake_in_Y", "shake_in_Z", "shake_in_XY", "shake_in_YZ", "shake_in_XZ", "shake_in_XYZ" }; $le_dummy_tab = { "" }; le_load_uber_bits(); } //&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& global proc le_display_event_lists (string $thing) { global int $le_cur_event_group, $le_cur_trigger, $le_cur_action; global string $le_event_data[]; global string $le_event_groups[], $le_triggers[], $le_actions[]; string $parent = `setParent -query`; string $layout; int $cwidth1 = (`layout -query -width $parent`)/3 - 6; int $i, $num, $max_rows; $layout = `rowColumnLayout -numberOfColumns 3 -columnWidth 1 $cwidth1 -columnSpacing 1 4 -columnWidth 2 $cwidth1 -columnSpacing 2 4 -columnWidth 3 $cwidth1 -columnSpacing 3 4 ("stringLayout_events")`; $num = size ($le_event_groups); if ($num == 0) text " "; else { if ($num > 8) $max_rows = 8; else $max_rows = $num; string $control = `textScrollList -numberOfRows $max_rows ("textScrollList_event_groups")`; for ($i=0; $i<$num; $i++) textScrollList -edit -append $le_event_groups[$i] $control; if ($le_cur_event_group > $num) $le_cur_event_group = $num; textScrollList -edit -allowMultiSelection false -selectIndexedItem $le_cur_event_group $control; textScrollList -edit -deleteKeyCommand ("le_delete_group (\"" + $thing + "\")") $control; textScrollList -edit -selectCommand ("le_event_group_changed()") $control; } //------------------------------------------------------------------------- $num = size ($le_triggers); if ($num == 0) text " "; else { if ($num > 8) $max_rows = 8; else $max_rows = $num; string $control = `textScrollList -numberOfRows $max_rows ("textScrollList_triggers")`; for ($i=0; $i<$num; $i++) textScrollList -edit -append $le_triggers[$i] $control; if ($le_cur_trigger > $num) $le_cur_trigger = $num; textScrollList -edit -allowMultiSelection false -selectIndexedItem $le_cur_trigger $control; textScrollList -edit -deleteKeyCommand ("le_delete_trigger (\"" + $thing + "\")") $control; textScrollList -edit -selectCommand ("le_trigger_changed()") $control; } //------------------------------------------------------------------------- $num = size ($le_actions); if ($num == 0) text " "; else { if ($num > 8) $max_rows = 8; else $max_rows = $num; string $control = `textScrollList -numberOfRows $max_rows ("textScrollList_actions")`; for ($i=0; $i<$num; $i++) textScrollList -edit -append $le_actions[$i] $control; if ($le_cur_action > $num) $le_cur_action = $num; textScrollList -edit -allowMultiSelection false -selectIndexedItem $le_cur_action $control; textScrollList -edit -deleteKeyCommand ("le_delete_action (\"" + $thing + "\")") $control; textScrollList -edit -selectCommand ("le_action_changed()") $control; } // button -command ("le_noderef_select (\"" + $layout + "\", \"" + $callback + "\")") -label "select" ("button_" + $name); setParent ..; } //&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& proc int le_find_type_in_tab (string $tab[], string $type) { int $i, $num; $num = size ($tab); // items are saved in pairs in table (type, params) for ($i=0; $i<$num; $i+=2) { // found type? if ($type == $tab[$i]) { break; } } if ($i >= $num) return -1; else return $i; } //&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& global proc int le_find_in_tab (string $tab[], string $data) { int $i, $num; $num = size ($tab); // search all table entries for data and return first one found for ($i=0; $i<$num; $i++) { // found data? if ($data == $tab[$i]) { break; } } if ($i >= $num) return -1; else return $i; } //&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& global proc int[] le_find_dir_in_tab (string $tab[], string $dir_name) { int $i, $num, $ret_tab[]; $num = size ($tab); // items are saved in pairs in table (type, params) for ($i=0; $i<$num; $i+=2) { // found dir start? if ($dir_name == $tab[$i] && $tab[$i+1] == "dir") { break; } } if ($i >= $num) { $ret_tab[0] = -1; } else { $ret_tab[0] = $i+2; // items are saved in pairs in table (type, params) for ($i=$ret_tab[0]; $i<$num; $i+=2) { // found dir end? if ($tab[$i+1] == "undir") { break; } } if ($i >= $num) { $ret_tab[1] = -1; print ("Bad table data\n"); } else $ret_tab[1] = $i - 2; } return $ret_tab; } //&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& global proc le_build_trigger_params() { global string $le_triggers[]; global string $le_event_data[]; global int $le_trigger_index; global string $le_trigger_tab[]; global string $le_trigger_param_types[]; int $tindex = $le_trigger_index; string $name = $le_event_data[$tindex++]; // find entry in table int $index = le_find_type_in_tab ($le_trigger_tab, $name); if ($index != -1 && $le_triggers[0] != "") { string $tok, $tokens[], $values[]; // tokenize the parameter types tokenize $le_trigger_tab[$index+1] "," $tokens; // now bump past the data by the number of the parameters if (size($tokens[0]) != 0) { for ($tok in $tokens) { int $p_index = le_find_type_in_tab ($le_trigger_param_types, $tok); switch ($tok) { case "object1": case "object2": case "object3": case "object4": $values[0] = $le_event_data[$tindex++]; le_build_noderef ($le_trigger_tab[$index], $le_trigger_param_types[$p_index+1], $values, "le_handle_object"); break; case "zone1": case "zone2": case "zone3": case "zone4": $values[0] = $le_event_data[$tindex++]; le_build_noderef ($le_trigger_tab[$index], $le_trigger_param_types[$p_index+1], $values, "le_handle_object"); break; case "float1": case "float2": case "float3": case "float4": $values[0] = $le_event_data[$tindex++]; le_build_float ($le_trigger_tab[$index], $le_trigger_param_types[$p_index+1], $values, "le_handle_object", 0); break; case "int1": case "int2": case "int3": case "int4": $values[0] = $le_event_data[$tindex++]; le_build_int ($le_trigger_tab[$index], $le_trigger_param_types[$p_index+1], $values, "le_handle_object"); break; case "path1": case "path2": case "path3": case "path4": $values[0] = $le_event_data[$tindex++]; le_build_noderef ($le_trigger_tab[$index], $le_trigger_param_types[$p_index+1], $values, "le_handle_object"); break; case "obj_type1": case "obj_type2": $values[0] = $le_event_data[$tindex++]; le_build_object_type_selector ($le_trigger_tab[$index], $le_trigger_param_types[$p_index+1], $values[0], "le_handle_object"); break; case "string1": $values[0] = $le_event_data[$tindex++]; le_build_text ($le_trigger_tab[$index], $le_trigger_param_types[$p_index+1], $values, "le_handle_object"); break; case "": break; default: // all other 'menu' types $values[0] = $le_event_data[$tindex++]; le_build_menu_selector ($le_trigger_tab[$index], $le_trigger_param_types[$p_index+1], $values[0], le_get_menu ($tok), "le_handle_object"); break; } } } } } //&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& global proc le_build_action_params() { global string $le_actions[]; global string $le_event_data[]; global int $le_action_index; global string $le_action_tab[]; global string $le_action_param_types[]; int $tindex = $le_action_index; string $name = $le_event_data[$tindex++]; // find entry in table int $index = le_find_type_in_tab ($le_action_tab, $name); if ($index != -1 && $le_actions[0] != "") { string $tok, $tokens[]; // tokenize the parameter types tokenize $le_action_tab[$index+1] "," $tokens; // now bump past the data by the number of the parameters if (size($tokens[0]) != 0) { for ($tok in $tokens) { int $p_index = le_find_type_in_tab ($le_action_param_types, $tok); switch ($tok) { case "object1": case "object2": case "object3": case "object4": $values[0] = $le_event_data[$tindex++]; le_build_noderef ($le_action_tab[$index], $le_action_param_types[$p_index+1], $values, "le_handle_object"); break; case "float1": case "float2": case "float3": case "float4": $values[0] = $le_event_data[$tindex++]; le_build_float ($le_action_tab[$index], $le_action_param_types[$p_index+1], $values, "le_handle_object", 0); break; case "int1": case "int2": case "int3": case "int4": $values[0] = $le_event_data[$tindex++]; le_build_int ($le_action_tab[$index], $le_action_param_types[$p_index+1], $values, "le_handle_object"); break; case "path1": case "path2": case "path3": case "path4": case "sound1": $values[0] = $le_event_data[$tindex++]; le_build_noderef ($le_action_tab[$index], $le_action_param_types[$p_index+1], $values, "le_handle_object"); break; case "obj_type1": case "obj_type2": $values[0] = $le_event_data[$tindex++]; le_build_object_type_selector ($le_action_tab[$index], $le_action_param_types[$p_index+1], $values[0], "le_handle_object"); break; case "message1": case "message2": case "message3": case "string1": case "string2": $values[0] = $le_event_data[$tindex++]; le_build_text ($le_action_tab[$index], $le_action_param_types[$p_index+1], $values, "le_handle_object"); break; case "": break; default: // all other 'menu' types $values[0] = $le_event_data[$tindex++]; le_build_menu_selector ($le_action_tab[$index], $le_action_param_types[$p_index+1], $values[0], le_get_menu ($tok), "le_handle_object"); break; } } } } } //&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& proc int le_get_next_trigger (int $tindex) { global string $le_event_data[]; global string $le_trigger_tab[]; string $name = $le_event_data[$tindex++]; // find entry in table int $index = le_find_type_in_tab ($le_trigger_tab, $name); if ($index != -1) { string $tokens[]; tokenize $le_trigger_tab[$index+1] "," $tokens; // now bump past the data by the number of the parameters if (size($tokens[0]) != 0) $tindex += size ($tokens); } return $tindex; } //&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& proc int le_get_next_action (int $tindex) { global string $le_event_data[]; global string $le_action_tab[]; string $name = $le_event_data[$tindex++]; // find entry in table int $index = le_find_type_in_tab ($le_action_tab, $name); if ($index != -1) { string $tokens[]; tokenize $le_action_tab[$index+1] "," $tokens; // now bump past the data by the number of the parameters if (size($tokens[0]) != 0) $tindex += size ($tokens); } return $tindex; } //&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& global proc le_build_event_lists() { global int $le_cur_event_group, $le_cur_trigger, $le_cur_action; global int $le_event_group_index, $le_trigger_index, $le_action_index; global string $le_event_data[]; global string $le_event_groups[], $le_triggers[], $le_actions[]; int $i, $num; int $index = 0; clear ($le_event_groups); clear ($le_triggers); clear ($le_actions); $num = (int ("0"+$le_event_data[$index++])); // fix out of bounds on index into group text list if ($le_cur_event_group > $num) $le_cur_event_group = $num; for ($i=0; $i<$num; $i++) { // are we at the currently selected one? if ($i == ($le_cur_event_group-1)) // yes, save it for later $le_event_group_index = $index; $le_event_groups[$i] = $le_event_data[$index++]; // pass by triggers int $num2 = int ($le_event_data[$index++]); int $j; for ($j=0; $j<$num2; $j++) { // add this trigger to list? if ($i == ($le_cur_event_group-1)) { $le_triggers[$j] = $le_event_data[$index]; if ($j == ($le_cur_trigger-1)) $le_trigger_index = $index; } $index = le_get_next_trigger ($index); } // pass by actions $num2 = int ($le_event_data[$index++]); for ($j=0; $j<$num2; $j++) { // add this trigger to list? if ($i == ($le_cur_event_group-1)) { $le_actions[$j] = $le_event_data[$index]; if ($j == ($le_cur_action-1)) $le_action_index = $index; } $index = le_get_next_action ($index); } } } //&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& proc le_build_trigger_choice_menu (string $thing, string $mode) { global string $le_trigger_tab[]; int $i; for ($i=0; $i $num) $le_cur_event_group = $num; // now rebuild the event entity entry from le_event_data le_rebuild_event_data ($thing); le_handle_object ("touch"); if (`textScrollList -exists "textScrollList_event_groups"`) setFocus "textScrollList_event_groups"; } //&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& global proc le_add_change_trigger (string $thing, int $index, string $mode) { global string $le_trigger_tab[], $str_tab[]; string $new_data[]; int $data_index = 0; // get type of trigger to add $new_data[$data_index++] = $le_trigger_tab[$index]; // get number of params string $tok, $tokens[]; tokenize $le_trigger_tab[$index+1] "," $tokens; for ($tok in $tokens) { switch ($tok) { case "object1": case "object2": case "object3": case "object4": case "zone1": case "zone2": case "zone3": case "zone4": case "path1": case "path2": case "path3": case "path4": case "uberbit1": case "obj_type1": case "obj_type2": case "string1": $new_data[$data_index++] = ""; break; case "float1": case "float2": case "float3": case "float4": case "int1": case "int2": case "int3": case "int4": $new_data[$data_index++] = "1"; break; case "": break; default: // all other 'menu' types $str_tab = le_get_menu ($tok); $new_data[$data_index++] = $str_tab[0]; break; } } if ($mode == "add") le_add_event_data (1, $new_data); else { string $old_data[], $old_tokens[]; int $old_index; $old_data = le_delete_event_data (1); // find entry in table if (size ($old_data) > 1) { $old_index = le_find_type_in_tab ($le_trigger_tab, $old_data[0]); tokenize $le_trigger_tab[$old_index+1] "," $old_tokens; $index = 0; for ($tok in $tokens) { if ($tok == $old_tokens[$index]) $new_data[$index+1] = $old_data[$index+1]; $index++; } } le_add_event_data (1, $new_data); } // now rebuild the event entity entry from le_event_data le_rebuild_event_data ($thing); le_handle_object ("touch"); setFocus "textScrollList_triggers"; } //&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& global proc le_delete_trigger (string $thing) { le_delete_event_data (1); // now rebuild the event entity entry from le_event_data le_rebuild_event_data ($thing); le_handle_object ("touch"); if (`textScrollList -exists "textScrollList_triggers"`) setFocus "textScrollList_triggers"; } //&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& global proc le_add_change_action (string $thing, int $index, string $mode) { global string $le_action_tab[], $str_tab[]; string $new_data[]; int $data_index = 0; // get type of action to add $new_data[$data_index++] = $le_action_tab[$index]; // get number of params string $tok, $tokens[]; tokenize $le_action_tab[$index+1] "," $tokens; for ($tok in $tokens) { switch ($tok) { case "object1": case "object2": case "object3": case "object4": case "path1": case "path2": case "path3": case "path4": case "obj_type1": case "obj_type2": case "message1": case "message2": case "message3": case "string1": case "string2": case "uberbit1": case "sound1": $new_data[$data_index++] = ""; break; case "float1": case "float2": case "float3": case "float4": case "int1": case "int2": case "int3": case "int4": $new_data[$data_index++] = "1"; break; case "": break; default: // all other 'menu' types $str_tab = le_get_menu ($tok); $new_data[$data_index++] = $str_tab[0]; break; } } if ($mode == "add") le_add_event_data (2, $new_data); else { string $old_data[], $old_tokens[]; int $old_index; $old_data = le_delete_event_data (2); // find entry in table if (size ($old_data) > 1) { $old_index = le_find_type_in_tab ($le_action_tab, $old_data[0]); tokenize $le_action_tab[$old_index+1] "," $old_tokens; $index = 0; for ($tok in $tokens) { if ($tok == $old_tokens[$index] || ($tok == "sound1" && $old_tokens[$index] == "object1")) $new_data[$index+1] = $old_data[$index+1]; $index++; } le_add_event_data (2, $new_data); } } // now rebuild the event entity entry from le_event_data le_rebuild_event_data ($thing); le_handle_object ("touch"); setFocus "textScrollList_actions"; } //&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& global proc le_delete_action (string $thing) { le_delete_event_data (2); // now rebuild the event entity entry from le_event_data le_rebuild_event_data ($thing); le_handle_object ("touch"); if (`textScrollList -exists "textScrollList_actions"`) setFocus "textScrollList_actions"; } //&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& global proc le_copy_group (string $thing) { global string $le_clipboard_data[]; string $data[] = le_delete_event_data (3); clear ($le_clipboard_data); if (size ($data) > 0) { $le_clipboard_data[0] = "1"; for ($i=0; $i 0) { button -l "Change"; popupMenu -button 1; le_build_trigger_choice_menu ($thing, "change"); } else text " " ; text "Action:"; button -l "Add"; popupMenu -button 1; le_build_action_choice_menu ($thing, "add"); if ($num_actions > 0) { button -l "Change"; popupMenu -button 1; le_build_action_choice_menu ($thing, "change"); } else text " "; } setParent ..; // draw them le_display_event_lists ($thing); // bubble up/down buttons if ($le_event_groups[0] != "") { $parent = `setParent -query`; $cwidth = (`layout -query -width $parent`)/6 - 3; $layout = `rowColumnLayout -numberOfColumns 9 -columnWidth 1 $cwidth -columnSpacing 1 4 -columnWidth 2 $cwidth -columnSpacing 2 1 -columnWidth 3 $cwidth -columnSpacing 3 4 -columnWidth 4 $cwidth -columnSpacing 4 1 -columnWidth 5 $cwidth -columnSpacing 5 4 -columnWidth 6 $cwidth -columnSpacing 6 1`; if ($num_groups > 1) { if ($le_cur_event_group != 1) button -l "Move up" -c ("le_move_event_group (\"" + $thing + "\", \"up\")"); else text " "; if ($le_cur_event_group != $num_groups) button -l "Move down" -c ("le_move_event_group (\"" + $thing + "\", \"down\")"); else text " "; } else { text " "; text " "; } if ($num_triggers > 1) { if ($le_cur_trigger != 1) button -l "Move up" -c ("le_move_trigger (\"" + $thing + "\", \"up\")"); else text " "; if ($le_cur_trigger != $num_triggers) button -l "Move down" -c ("le_move_trigger (\"" + $thing + "\", \"down\")"); else text " "; } else { text " "; text " "; } if ($num_actions > 1) { if ($le_cur_action != 1) button -l "Move up" -c ("le_move_action (\"" + $thing + "\", \"up\")"); else text " "; if ($le_cur_action != $num_actions) button -l "Move down" -c ("le_move_action (\"" + $thing + "\", \"down\")"); else text " "; } else { text " "; text " "; } setParent ..; } // draw trigger params (le_trigger_index is set by le_build_event_lists) le_build_separator(); text " ------ Triggers: ------------------------------------------------------------------------------------------------"; le_build_trigger_params(); // draw actions params le_build_separator(); text " ------ Actions: -------------------------------------------------------------------------------------------------"; le_build_action_params(); if ($le_last_focus != "" && `textScrollList -exists $le_last_focus`) setFocus $le_last_focus; $le_last_focus = ""; } //&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& global proc le_event_group_changed() { global int $le_cur_event_group; global string $le_last_focus; // get all event groups selected (there should only be one!) int $cur_event_group[] = `textScrollList -q -selectIndexedItem "textScrollList_event_groups"`; // only one is allowed to be selected $le_cur_event_group = $cur_event_group[0]; if ($le_last_focus == "") $le_last_focus = "textScrollList_event_groups"; le_handle_object ("update"); } //&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& global proc le_trigger_changed() { global int $le_cur_trigger; global string $le_last_focus; // get all triggers selected (there should only be one!) int $cur_trigger[] = `textScrollList -q -selectIndexedItem "textScrollList_triggers"`; // update index $le_cur_trigger = $cur_trigger[0]; if ($le_last_focus == "") $le_last_focus = "textScrollList_triggers"; le_handle_object ("update"); } //&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& global proc le_action_changed() { global int $le_cur_action; global string $le_last_focus; // get all actions selected (there should only be one!) int $cur_action[] = `textScrollList -q -selectIndexedItem "textScrollList_actions"`; // update it $le_cur_action = $cur_action[0]; if ($le_last_focus == "") $le_last_focus = "textScrollList_actions"; le_handle_object ("update"); } //&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& global proc le_move_event_group (string $thing, string $type) { global int $le_cur_event_group; string $new_data[] = le_delete_event_data (0); if ($type == "up") $le_cur_event_group--; else $le_cur_event_group++; // add it to the appropriate place le_add_event_data (0, $new_data); // now rebuild the event entity entry from le_event_data le_rebuild_event_data ($thing); le_handle_object ("touch"); setFocus "textScrollList_event_groups"; } //&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& global proc le_move_trigger (string $thing, string $type) { global int $le_cur_trigger; string $new_data[] = `le_delete_event_data (1)`; if ($type == "up") $le_cur_trigger--; else $le_cur_trigger++; le_add_event_data (1, $new_data); // now rebuild the event entity entry from le_event_data le_rebuild_event_data ($thing); le_handle_object ("touch"); setFocus "textScrollList_triggers"; } //&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& global proc le_move_action (string $thing, string $type) { global int $le_cur_action; string $new_data[] = `le_delete_event_data (2)`; if ($type == "up") $le_cur_action--; else $le_cur_action++; le_add_event_data (2, $new_data); // now rebuild the event entity entry from le_event_data le_rebuild_event_data ($thing); le_handle_object ("touch"); setFocus "textScrollList_actions"; } //&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& // // Rebuild the event entity entry from le_event_data global proc le_rebuild_event_data (string $thing) { global string $le_event_data[]; string $events; if ($le_event_data[0] != "") { string $tok; for ($tok in $le_event_data) { $events += $tok + ","; } int $num = size ($events); $events = `substring $events 1 ($num-1)` + ";"; } string $attr = le_get_attributes ($thing); string $pairs[] = le_pairs_from_attr ($attr); string $type = le_find_param_in_pairs ($pairs, "type"); string $zone = le_find_param_in_pairs ($pairs, "zone"); string $ref_path = le_find_param_in_pairs ($pairs, "path"); if ($pairs[0] == "object") le_update_object ($thing, $type, $ref_path, $zone, $events); else le_update_camera ($thing, $type, $zone, $events); } //&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& // // Save new trigger parameter data into event_data array global proc le_update_trigger_param (string $type, string $data) { global string $le_event_data[]; global int $le_trigger_index; global string $le_trigger_tab[]; string $attr, $pairs[]; // we already know where the data for the currently selected trigger is int $tindex = $le_trigger_index; // get the name of the trigger type string $name = $le_event_data[$tindex++]; // find entry in table int $index = le_find_type_in_tab ($le_trigger_tab, $name); if ($index != -1) { string $tok, $tokens[], $values[]; // tokenize the parameter types tokenize $le_trigger_tab[$index+1] "," $tokens; // now bump past the data by the number of the parameters if (size($tokens[0]) != 0) { for ($tok in $tokens) { if ($tok == $type) { switch ($tok) { case "object1": case "object2": case "object3": case "object4": case "zone1": //??????????????? right now zones must be objs case "zone2": case "zone3": case "zone4": $attr = le_get_attributes ($data); if ($attr != "") { $pairs = le_pairs_from_attr ($attr); if ($pairs[0] == "zone" || $pairs[0] == "path" || $pairs[0] == "sound_object") $data = ""; } $le_event_data[$tindex] = $data; break; case "float1": case "float2": case "float3": case "float4": case "int1": case "int2": case "int3": case "int4": case "obj_type1": case "obj_type2": case "string1": $le_event_data[$tindex] = $data; break; case "path1": case "path2": case "path3": case "path4": $attr = le_get_attributes ($data); if ($attr != "") { $pairs = le_pairs_from_attr ($attr); if ($pairs[0] != "path") $data = ""; } $le_event_data[$tindex] = $data; break; case "": break; default: // all other 'menu' types $le_event_data[$tindex] = $data; break; } // okay, we're done let's get out break; } $tindex++; } } } } //&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& // // Save new action parameter data into event_data array global proc le_update_action_param (string $type, string $data) { global string $le_event_data[]; global int $le_action_index; global string $le_action_tab[]; string $attr, $pairs[]; // we already know where the data for the currently selected action is int $tindex = $le_action_index; // get the name of the action type string $name = $le_event_data[$tindex++]; // find entry in table int $index = le_find_type_in_tab ($le_action_tab, $name); if ($index != -1) { string $tok, $tokens[], $values[]; // tokenize the parameter types tokenize $le_action_tab[$index+1] "," $tokens; // now bump past the data by the number of the parameters if (size($tokens[0]) != 0) { for ($tok in $tokens) { if ($tok == $type) { switch ($tok) { case "object1": case "object2": case "object3": case "object4": $attr = le_get_attributes ($data); if ($attr != "") { $pairs = le_pairs_from_attr ($attr); if ($pairs[0] == "zone" || $pairs[0] == "path" || $pairs[0] == "sound_object") $data = ""; } $le_event_data[$tindex] = $data; break; case "float1": case "float2": case "float3": case "float4": case "int1": case "int2": case "int3": case "int4": case "obj_type1": case "obj_type2": case "message1": case "message2": case "message3": case "string1": case "string2": $le_event_data[$tindex] = $data; break; case "": break; default: // all other 'menu' types $le_event_data[$tindex] = $data; break; case "sound1": $attr = le_get_attributes ($data); if ($attr != "") { $pairs = le_pairs_from_attr ($attr); if ($pairs[0] != "sound_object") $data = ""; } $le_event_data[$tindex] = $data; break; case "path1": case "path2": case "path3": case "path4": $attr = le_get_attributes ($data); if ($attr != "") { $pairs = le_pairs_from_attr ($attr); if ($pairs[0] != "path") $data = ""; } $le_event_data[$tindex] = $data; break; } // okay, we're done let's get out break; } $tindex++; } } } } //&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& // // Save new parameter data into event_data array global proc le_update_event_data (string $thing, string $pairs[]) { global string $le_trigger_param_types[], $le_action_param_types[]; int $i, $num; string $values[]; // do trigger parameters $num = size ($le_trigger_param_types); for ($i=0; $i<$num; $i+=2) { $values = le_values_from_pairs ($pairs, $le_trigger_param_types[$i+1]); if ($values[0] != "") le_update_trigger_param ($le_trigger_param_types[$i], $values[0]); } // do action parameters $num = size ($le_action_param_types); for ($i=0; $i<$num; $i+=2) { $values = le_values_from_pairs ($pairs, $le_action_param_types[$i+1]); if ($values[0] != "") le_update_action_param ($le_action_param_types[$i], $values[0]); } } //&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& // // Upon entry: $type -> 0 = remove event group // 1 = remove trigger // 2 = remove action // 3 = copy event group // Upon exit: returned -> string array of deleted/copied data global proc string[] le_delete_event_data (int $type) { global int $le_cur_event_group, $le_cur_trigger, $le_cur_action; global int $le_trigger_index, $le_action_index; global string $le_event_data[]; global string $le_event_groups[], $le_triggers[], $le_actions[]; string $new_event_data[], $deleted_data[]; int $i, $j, $k, $num; int $remove_group; int $in_cur_group; int $start_index, $end_index; int $new_index = 0; int $index = 0; int $num2, $remove_flag; $num = int ("0"+$le_event_data[$index++]); if ($type == 0 && $num > 0) // remove current group $new_event_data[$new_index++] = $num - 1; else $new_event_data[$new_index++] = $num; for ($i=0; $i<$num; $i++) { // true if target is in this group $in_cur_group = ($i == ($le_cur_event_group-1)); // remove group ? if ($type == 0 && $in_cur_group) // yes, skip group and continue { $start_index = $index; // skip the group $index++; // skip triggers int $num2 = int ($le_event_data[$index++]); int $j; for ($j=0; $j<$num2; $j++) $index = le_get_next_trigger ($index); // skip actions $num2 = int ($le_event_data[$index++]); for ($j=0; $j<$num2; $j++) $index = le_get_next_action ($index); // copy to return buffer for ($k=$start_index; $k<$index; $k++) $deleted_data[$k-$start_index] = $le_event_data[$k]; continue; } // copy group ? else if ($type == 3 && $in_cur_group) // yes, skip group and continue { $start_index = $index; // skip the group $index++; // skip triggers int $num2 = int ($le_event_data[$index++]); int $j; for ($j=0; $j<$num2; $j++) $index = le_get_next_trigger ($index); // skip actions $num2 = int ($le_event_data[$index++]); for ($j=0; $j<$num2; $j++) $index = le_get_next_action ($index); // copy to return buffer for ($k=$start_index; $k<$index; $k++) $deleted_data[$k-$start_index] = $le_event_data[$k]; return ($deleted_data); } //--------------------------------------------------------------------- else // save group name $new_event_data[$new_index++] = $le_event_data[$index++]; // do triggers $num2 = int ($le_event_data[$index++]); // removing a trigger from this group? $remove_flag = ($in_cur_group == true && $type == 1 && $num2 > 0); if ($remove_flag == true) // yes $new_event_data[$new_index++] = $num2 - 1; else $new_event_data[$new_index++] = $num2; for ($j=0; $j<$num2; $j++) { $end_index = le_get_next_trigger ($index); if ($remove_flag == false || $j != ($le_cur_trigger-1)) // here if it's not to be deleted { for ($k=$index; $k<$end_index; $k++) $new_event_data[$new_index++] = $le_event_data[$k]; } else { // copy to return buffer for ($k=$index; $k<$end_index; $k++) $deleted_data[$k-$index] = $le_event_data[$k]; } $index = $end_index; } // do actions $num2 = int ($le_event_data[$index++]); // removing an action from this group? $remove_flag = ($in_cur_group == true && $type == 2 && $num2 > 0); if ($remove_flag == true) // yes $new_event_data[$new_index++] = $num2 - 1; else $new_event_data[$new_index++] = $num2; for ($j=0; $j<$num2; $j++) { $end_index = le_get_next_action ($index); if ($remove_flag == false || $j != ($le_cur_action-1)) // here if it's not to be deleted { for ($k=$index; $k<$end_index; $k++) $new_event_data[$new_index++] = $le_event_data[$k]; } else { // copy to return buffer for ($k=$index; $k<$end_index; $k++) $deleted_data[$k-$index] = $le_event_data[$k]; } $index = $end_index; } } clear ($le_event_data); $le_event_data = $new_event_data; return ($deleted_data); } //&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& // // Upon entry: $type -> 0 = add event group // 1 = add trigger // 2 = add action global proc le_add_event_data (int $type, string $new_data[]) { global int $le_cur_event_group, $le_cur_trigger, $le_cur_action; global string $le_event_data[]; string $new_event_data[], $data; int $i, $num; int $remove_group; int $in_cur_group; int $new_index = 0; int $index = 0; $num = int ("0"+$le_event_data[$index++]); if ($type == 0) // add a group { $num++; //???????????????? at some point we should be able to insert at top of list // this fixes problem when there are currently no groups if ($le_cur_event_group == 0) $le_cur_event_group = 1; } $new_event_data[$new_index++] = $num; for ($i=0; $i<$num; $i++) { // true if target is in this group $in_cur_group = ($i == ($le_cur_event_group-1)); // add a group if ($in_cur_group && $type == 0) { for ($data in $new_data) $new_event_data[$new_index++] = $data; $le_cur_trigger = 1; $le_cur_action = 1; // do next real group continue; } // save group name $new_event_data[$new_index++] = $le_event_data[$index++]; // do triggers int $num2 = int ($le_event_data[$index++]); int $j, $k, $add_flag, $end_index; // adding a trigger to this group? $add_flag = ($in_cur_group == true && $type == 1); if ($add_flag == true) $num2++; $new_event_data[$new_index++] = $num2; for ($j=0; $j<$num2; $j++) { // add a new trigger here? if ($add_flag && $j == ($le_cur_trigger-1)) { // copy new data for ($data in $new_data) $new_event_data[$new_index++] = $data; // now do the next real one continue; } $end_index = le_get_next_trigger ($index); // copy old data for ($k=$index; $k<$end_index; $k++) $new_event_data[$new_index++] = $le_event_data[$k]; $index = $end_index; } // do actions $num2 = int ($le_event_data[$index++]); // removing an action from this group? $add_flag = ($in_cur_group == true && $type == 2); if ($add_flag == true) // yes $num2++; $new_event_data[$new_index++] = $num2; for ($j=0; $j<$num2; $j++) { // add a new action here? if ($add_flag && $j == ($le_cur_action-1)) { // copy new data for ($data in $new_data) $new_event_data[$new_index++] = $data; // come around and do next real one continue; } $end_index = le_get_next_action ($index); // copy old data for ($k=$index; $k<$end_index; $k++) $new_event_data[$new_index++] = $le_event_data[$k]; $index = $end_index; } } clear ($le_event_data); $le_event_data = $new_event_data; } //&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& global int $le_cur_export_index; //&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& // // Export triggers proc string le_export_triggers() { global int $le_cur_export_index; global string $le_event_data[]; global string $le_trigger_tab[]; int $tindex = $le_cur_export_index; string $cr = "\r\n"; // DOS carriage return string $out; int $num2 = int ($le_event_data[$tindex++]); int $j, $k; $out += "OBJ_NUM_TRIGGERS " + $num2 + $cr; for ($j=0; $j<$num2; $j++) { // get the name of the trigger type string $name = $le_event_data[$tindex++]; // find entry in table int $index = le_find_type_in_tab ($le_trigger_tab, $name); $out += "OBJ_TRIGGER " + $name; if ($index == -1) $out += ",0"; else { string $tok, $tokens[], $values[]; // tokenize the parameter types tokenize $le_trigger_tab[$index+1] "," $tokens; int $num; if ($tokens[0] == "") $num = 0; else $num = size ($tokens); $out += "," + $num; // now bump past the data by the number of the parameters if ($num != 0) { for ($tok in $tokens) { // N = Name, S = String, F = Float, I = Int switch ($tok) { case "object1": case "object2": case "object3": case "object4": case "zone1": case "zone2": case "zone3": case "zone4": case "path1": case "path2": case "path3": case "path4": $out += ",N," + $le_event_data[$tindex++]; break; case "float1": case "float2": case "float3": case "float4": $out += ",F," + $le_event_data[$tindex++]; break; case "int1": case "int2": case "int3": case "int4": $out += ",I," + $le_event_data[$tindex++]; break; case "obj_type1": case "obj_type2": $out += ",O," + $le_event_data[$tindex++]; break; case "string1": $data = $le_event_data[$tindex++]; if ($data == "") $data = " "; $out += ",S," + $data; break; case "": break; default: // all other 'menu' types $out += ",I,$(" + $le_event_data[$tindex++] +")"; break; } } } } $out += $cr; } $le_cur_export_index = $tindex; return $out; } //&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& // // Export actions proc string le_export_actions() { global int $le_cur_export_index; global string $le_event_data[]; global string $le_action_tab[]; int $tindex = $le_cur_export_index; string $cr = "\r\n"; // DOS carriage return string $out, $data; int $num2 = int ($le_event_data[$tindex++]); int $j, $k; $out += "OBJ_NUM_ACTIONS " + $num2 + $cr; for ($j=0; $j<$num2; $j++) { // get the name of the action type string $name = $le_event_data[$tindex++]; // find entry in table int $index = le_find_type_in_tab ($le_action_tab, $name); $out += "OBJ_ACTION " + $name; if ($index == -1) $out += ",0"; else { string $tok, $tokens[], $values[]; // tokenize the parameter types tokenize $le_action_tab[$index+1] "," $tokens; int $num; if ($tokens[0] == "") $num = 0; else $num = size ($tokens); $out += "," + $num; // now bump past the data by the number of the parameters if ($num != 0) { for ($tok in $tokens) { // N = Name, S = String, F = Float, I = Int switch ($tok) { case "object1": case "object2": case "object3": case "object4": case "zone1": case "zone2": case "zone3": case "zone4": case "path1": case "path2": case "path3": case "path4": case "sound1": $data = $le_event_data[$tindex++]; if ($data == "") $data = " "; $out += ",N," + $data; break; case "float1": case "float2": case "float3": case "float4": $out += ",F," + $le_event_data[$tindex++]; break; case "int1": case "int2": case "int3": case "int4": $out += ",I," + $le_event_data[$tindex++]; break; case "cam_offst1": if (le_is_it_a_number ($le_event_data[$tindex]) == 1) $out += ",I," + $le_event_data[$tindex++]; else if ($le_event_data[$tindex] != "" && `substring $le_event_data[$tindex] 1 1` == "$") $out += ",I," + $le_event_data[$tindex++]; else $out += ",I,$(" + $le_event_data[$tindex++] + ")"; break; case "obj_type1": case "obj_type2": $out += ",O," + $le_event_data[$tindex++]; break; case "message1": case "message2": case "message3": $data = $le_event_data[$tindex++]; if ($data == "") $data = " "; $out += ",C," + $data; break; case "string1": case "string2": $data = $le_event_data[$tindex++]; if ($data == "") $data = " "; $out += ",S," + $data; break; case "": break; default: // all other 'menu' types $out += ",I,$(" + $le_event_data[$tindex++] +")"; break; } } } } $out += $cr; } $le_cur_export_index = $tindex; return $out; } //&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& global proc string le_build_event_export_data() { global string $le_event_data[]; global int $le_cur_export_index; string $out; string $cr = "\r\n"; // DOS carriage return int $i, $num, $end_index; $le_cur_export_index = 0; $num = (int ("0"+$le_event_data[$le_cur_export_index++])); if ($num == 0) return $out; $out += "OBJ_NUM_EVENT_GROUPS " + $num + $cr; //------------------------------------------------------------------------- for ($i=0; $i<$num; $i++) { $out += "// " + $le_event_data[$le_cur_export_index++] + $cr; $out += le_export_triggers(); $out += le_export_actions(); } return $out; } //&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& global proc string[] le_get_menu (string $name) { global string $le_ai_states[], $le_team_types[]; global string $le_death_types[]; global string $le_camera_offsets[]; global string $le_shake_types[]; global string $le_uber_bits[], $le_dummy_tab[]; switch ($name) { case "ai_state1": case "ai_state2": return ($le_ai_states); break; case "cam_offst1": return ($le_camera_offsets); break; case "death1": return ($le_death_types); break; case "shake1": return ($le_shake_types); break; case "team1": case "team2": return ($le_team_types); break; case "uberbit1": return ($le_uber_bits); break; } return ($le_dummy_tab); }