mirror of
https://github.com/jmarshall23/DoomRTX.git
synced 2026-08-12 16:21:04 +02:00
876 lines
24 KiB
Plaintext
876 lines
24 KiB
Plaintext
namespace map_commoutside {
|
|
|
|
#define CMD_LIFT_NONE 0
|
|
#define CMD_LIFT_UP 1
|
|
#define CMD_LIFT_DOWN 2
|
|
#define CMD_LIFT_FORWARD 3
|
|
#define CMD_LIFT_RIGHT 4
|
|
#define CMD_LIFT_LEFT 5
|
|
#define CMD_LIFT_BACK 6
|
|
#define CMD_LIFT_CALL1 7
|
|
#define CMD_LIFT_CALL2 8
|
|
#define CMD_LIFT_CALL3 9
|
|
|
|
#define LIFT_MOVE_SPEED 160
|
|
#define LIFT_TURN_TIME 2
|
|
#define LIFT_UPDOWN_TIME 2
|
|
|
|
// states for the lift
|
|
float lift_command;
|
|
boolean lift_plat_up;
|
|
float lift_dir;
|
|
entity lift_station;
|
|
|
|
void setup_lift();
|
|
void reset_guis();
|
|
void set_lift_location( entity position );
|
|
float calc_lift_path_r( entity current_pos, entity previous, entity target, float depth );
|
|
float get_lift_turn_dir( entity source, entity target );
|
|
entity check_lift_move_dir( entity current_pos, float dir );
|
|
void turn_lift_to_dir( float dir );
|
|
void move_lift_to( entity target );
|
|
|
|
void cmd_lift_up();
|
|
void cmd_lift_down();
|
|
void cmd_lift_forward();
|
|
void cmd_lift_right();
|
|
void cmd_lift_left();
|
|
void cmd_lift_back();
|
|
void cmd_lift_call_1();
|
|
void cmd_lift_call_2();
|
|
void cmd_lift_call_3();
|
|
void lift_loop();
|
|
|
|
void lift_up();
|
|
void lift_down();
|
|
void lift_forward();
|
|
void lift_right();
|
|
void lift_left();
|
|
void lift_back();
|
|
void lift_call_1();
|
|
void lift_call_2();
|
|
void lift_call_3();
|
|
|
|
void callspot1_panel_up();
|
|
void callspot1_panel_down();
|
|
void callspot2_panel_up();
|
|
void callspot2_panel_down();
|
|
void callspot3_panel_up();
|
|
void callspot3_panel_down();
|
|
|
|
void lift_main();
|
|
|
|
////////////////////////////////////////////////////
|
|
//
|
|
// Setup binds and times etc...
|
|
//
|
|
////////////////////////////////////////////////////
|
|
void setup_lift() {
|
|
// initial variable assignments
|
|
lift_command = CMD_LIFT_NONE;
|
|
lift_plat_up = true;
|
|
|
|
lift_station = $lift_bottom.getTarget( 0 );
|
|
if ( !lift_station ) {
|
|
sys.warning( "Entity 'lift_bottom' doesn't have a target." );
|
|
}
|
|
set_lift_location( lift_station );
|
|
|
|
lift_dir = 2;
|
|
|
|
// Lift binds, times, and speeds
|
|
$lift_leg_11.bind($lift_bottom);
|
|
$lift_light1.bind($lift_bottom);
|
|
|
|
$lift_axle1.bind($lift_leg_11);
|
|
$lift_axle2.bind($lift_leg_11);
|
|
$lift_leg_12.bind($lift_axle2);
|
|
$lift_axle4.bind($lift_leg_12);
|
|
$lift_axle6.bind($lift_leg_12);
|
|
$lift_leg_13.bind($lift_axle6);
|
|
$lift_axle7.bind($lift_leg_13);
|
|
|
|
$lift_leg_23.bind($lift_axle7);
|
|
$lift_axle5.bind($lift_leg_23);
|
|
$lift_leg_22.bind($lift_axle5);
|
|
$lift_axle3.bind($lift_leg_22);
|
|
$lift_leg_21.bind($lift_axle3);
|
|
|
|
$lift_connection_top_move.bind($lift_leg_13);
|
|
$lift_connection_top_static.bind($lift_leg_23);
|
|
$lift_connection_bottom_move.bind($lift_leg_21);
|
|
|
|
$lift_cage.bind($lift_connection_top_static);
|
|
|
|
$lift_leg_11.time( LIFT_UPDOWN_TIME );
|
|
$lift_leg_12.time( LIFT_UPDOWN_TIME );
|
|
$lift_leg_13.time( LIFT_UPDOWN_TIME );
|
|
$lift_connection_top_move.time( LIFT_UPDOWN_TIME );
|
|
$lift_leg_21.time( LIFT_UPDOWN_TIME );
|
|
$lift_connection_bottom_move.time( LIFT_UPDOWN_TIME );
|
|
$lift_leg_22.time( LIFT_UPDOWN_TIME );
|
|
$lift_leg_23.time( LIFT_UPDOWN_TIME );
|
|
$lift_connection_top_static.time( LIFT_UPDOWN_TIME );
|
|
|
|
$lift_leg_11.accelTime( .25 );
|
|
$lift_leg_12.accelTime( .25 );
|
|
$lift_leg_13.accelTime( .25 );
|
|
$lift_connection_top_move.accelTime( .25 );
|
|
$lift_leg_21.accelTime( .25 );
|
|
$lift_connection_bottom_move.accelTime( .25);
|
|
$lift_leg_22.accelTime( .25 );
|
|
$lift_leg_23.accelTime( .25 );
|
|
$lift_connection_top_static.accelTime( .25 );
|
|
|
|
$lift_leg_11.decelTime( .25 );
|
|
$lift_leg_12.decelTime( .25 );
|
|
$lift_leg_13.decelTime( .25 );
|
|
$lift_connection_top_move.decelTime( .25 );
|
|
$lift_leg_21.decelTime( .25 );
|
|
$lift_connection_bottom_move.decelTime( .25 );
|
|
$lift_leg_22.decelTime( .25 );
|
|
$lift_leg_23.decelTime( .25 );
|
|
$lift_connection_top_static.decelTime( .25 );
|
|
|
|
// Call spots panel stuff
|
|
$callspot1_conpan_gui.bind($callspot1_conpan);
|
|
$callspot1_conpan.time(.25);
|
|
$callspot1_conpan.rotateOnce( '63.43 0 0' );
|
|
$callspot1_conpan_trigger_down.disable();
|
|
|
|
$callspot2_conpan_gui.bind($callspot2_conpan);
|
|
$callspot2_conpan.time(.25);
|
|
$callspot2_conpan.rotateOnce( '0 0 -63.43' );
|
|
$callspot2_conpan_trigger_down.disable();
|
|
|
|
$callspot3_conpan_gui.bind($callspot3_conpan);
|
|
$callspot3_conpan.time(.25);
|
|
$callspot3_conpan.rotateOnce( '0 0 -63.43' );
|
|
$callspot3_conpan_trigger_down.disable();
|
|
|
|
$lift_light1_mover.rotateOnce( '90 0 0' );
|
|
}
|
|
|
|
////////////////////////////////////////////////////
|
|
//
|
|
// reset the gui's to an interactive state
|
|
//
|
|
////////////////////////////////////////////////////
|
|
void reset_guis() {
|
|
sys.trigger($callspot1_conpan);
|
|
$callspot1_conpan.setGuiParm ( "gui_parm3", 0 );
|
|
sys.trigger($callspot2_conpan);
|
|
$callspot2_conpan.setGuiParm ( "gui_parm3", 0 );
|
|
sys.trigger($callspot3_conpan);
|
|
$callspot3_conpan.setGuiParm ( "gui_parm3", 0 );
|
|
}
|
|
|
|
////////////////////////////////////////////////////
|
|
//
|
|
// keep track of the current path entity we're at and update the
|
|
// gui's on the call panels with our position.
|
|
//
|
|
////////////////////////////////////////////////////
|
|
void set_lift_location( entity position ) {
|
|
string position_name;
|
|
string position_num;
|
|
float pos;
|
|
|
|
lift_station = position;
|
|
position_name = position.getName();
|
|
if ( sys.strLeft( position_name, 10 ) != "lift_spot_" ) {
|
|
sys.warning( "Invalid lift target name '" + position_name + "'. Lift targets must be named 'lift_spot_#' (where # is a numeric value)" );
|
|
}
|
|
|
|
position_num = sys.strSkip( position_name, 10 );
|
|
pos = sys.strToFloat( position_num );
|
|
|
|
$lift_cage.setGuiParm( "gui_parm2", pos );
|
|
$callspot1_conpan.setGuiParm ( "gui_parm2", pos );
|
|
$callspot2_conpan.setGuiParm ( "gui_parm2", pos );
|
|
$callspot3_conpan.setGuiParm ( "gui_parm2", pos );
|
|
|
|
$callspot1_conpan.setGuiParm ( "gui_parm4", 0 );
|
|
$callspot2_conpan.setGuiParm ( "gui_parm4", 0 );
|
|
$callspot3_conpan.setGuiParm ( "gui_parm4", 0 );
|
|
|
|
//sys.print("position" + pos + "\n");
|
|
|
|
if ( ( pos == 13 ) && ( lift_dir == 0 ) && !lift_plat_up ) {
|
|
$callspot1_conpan.setGuiParm ( "gui_parm4", 1 );
|
|
reset_guis();
|
|
} else if ( ( pos == 31 ) && ( lift_dir == 1 ) && !lift_plat_up ) {
|
|
$callspot2_conpan.setGuiParm ( "gui_parm4", 1 );
|
|
reset_guis();
|
|
} else if ( ( pos == 83 ) && ( lift_dir == 1 ) && !lift_plat_up ) {
|
|
$callspot3_conpan.setGuiParm ( "gui_parm4", 1 );
|
|
reset_guis();
|
|
}
|
|
}
|
|
|
|
////////////////////////////////////////////////////
|
|
//
|
|
// Do a depth-first search of the "track" to find a path to the target entity.
|
|
// each path entity targets 1 or more other path entities. Each path entity it
|
|
// targets must also target it, so the links are forward and back. There must be
|
|
// no circular links and the longest possible path must never be more than the
|
|
// script stack can handle (around 62 path entities would be the limit, but possibly
|
|
// fewer). This could be modified to handle circular links, and be made non-recursive
|
|
// so it's not dependent on the stack size, and possibly with a bit of effort could find
|
|
// the shortest path if multiple paths exist, but for our purposes, this does the job.
|
|
//
|
|
////////////////////////////////////////////////////
|
|
float calc_lift_path_r( entity current_pos, entity previous, entity target, float depth ) {
|
|
float num;
|
|
float i;
|
|
entity next;
|
|
float path_length;
|
|
|
|
// have we reached the target?
|
|
if ( current_pos == target ) {
|
|
return depth;
|
|
}
|
|
|
|
// check each of the targets on this entity
|
|
num = current_pos.numTargets();
|
|
for( i = 0; i < num; i++ ) {
|
|
next = current_pos.getTarget( i );
|
|
if ( next == previous ) {
|
|
// don't go back the way we came
|
|
continue;
|
|
}
|
|
|
|
// check if a path exists through this target
|
|
path_length = calc_lift_path_r( next, current_pos, target, depth + 1 );
|
|
if ( path_length ) {
|
|
// found the target, so as we recurse backwards, set the name of the next path entity to go to.
|
|
// when we're done, going through the "path*" keys in order will give the order of entities
|
|
// to follow to get to the target.
|
|
$lift_bottom.setKey( "path" + depth, next.getName() );
|
|
return path_length;
|
|
}
|
|
}
|
|
|
|
// no path from this entity
|
|
return 0;
|
|
}
|
|
|
|
////////////////////////////////////////////////////
|
|
//
|
|
// calculate the direction to turn to the next target
|
|
//
|
|
////////////////////////////////////////////////////
|
|
float get_lift_turn_dir( entity source, entity target ) {
|
|
float dir;
|
|
vector delta;
|
|
vector ang;
|
|
|
|
delta = target.getOrigin();
|
|
delta = delta - source.getOrigin();
|
|
ang = sys.VecToAngles( delta );
|
|
dir = ( ( ang_y + 45 ) / 90 ) & 3;
|
|
|
|
return dir;
|
|
}
|
|
|
|
////////////////////////////////////////////////////
|
|
//
|
|
// movement test
|
|
//
|
|
////////////////////////////////////////////////////
|
|
entity check_lift_move_dir( entity current_pos, float dir ) {
|
|
float num;
|
|
float i;
|
|
float check_dir;
|
|
entity check_ent;
|
|
|
|
num = current_pos.numTargets();
|
|
for( i = 0; i < num; i++ ) {
|
|
check_ent = current_pos.getTarget( i );
|
|
check_dir = get_lift_turn_dir( current_pos, check_ent );
|
|
if ( check_dir == dir ) {
|
|
return check_ent;
|
|
}
|
|
}
|
|
return current_pos;
|
|
}
|
|
|
|
////////////////////////////////////////////////////
|
|
//
|
|
// rotates the lift back into position when blocked
|
|
//
|
|
////////////////////////////////////////////////////
|
|
void lift_rotate_blocked() {
|
|
vector delta;
|
|
vector dest_angles;
|
|
float rotateTime;
|
|
|
|
$lift_bottom.stopRotating();
|
|
sys.wait( 0.1 );
|
|
|
|
// rotate back
|
|
dest_angles_y = ( lift_dir & 3 ) * 90 + 180;
|
|
if ( dest_angles_y >= 180 ) {
|
|
dest_angles_y -= 360;
|
|
}
|
|
delta = anglemod180( dest_angles - $lift_bottom.getAngles() );
|
|
rotateTime = abs( delta_y / 90 )* LIFT_TURN_TIME + 0.5;
|
|
$lift_bottom.time( rotateTime );
|
|
$lift_bottom.accelTime( .5 );
|
|
$lift_bottom.decelTime( .5 );
|
|
$lift_bottom.rotateOnce( delta );
|
|
sys.waitFor( $lift_bottom );
|
|
|
|
reset_guis();
|
|
|
|
// update our location on the guis
|
|
set_lift_location( lift_station );
|
|
|
|
lift_loop();
|
|
}
|
|
|
|
////////////////////////////////////////////////////
|
|
//
|
|
// turns lift
|
|
//
|
|
////////////////////////////////////////////////////
|
|
void turn_lift_to_dir( float dir ) {
|
|
float turn_diff;
|
|
vector delta;
|
|
vector dest_angles;
|
|
float rotateTime;
|
|
|
|
turn_diff = ( dir - lift_dir ) & 3;
|
|
if ( turn_diff == 0 ) {
|
|
return;
|
|
}
|
|
|
|
dest_angles_y = ( dir & 3 ) * 90 + 180;
|
|
if ( dest_angles_y >= 180 ) {
|
|
dest_angles_y -= 360;
|
|
}
|
|
delta = anglemod180( dest_angles - $lift_bottom.getAngles() );
|
|
rotateTime = abs( delta_y / 90 )* LIFT_TURN_TIME + 0.5;
|
|
|
|
sys.onSignal( SIG_BLOCKED, $lift_bottom, "map_commoutside::lift_rotate_blocked" );
|
|
$lift_bottom.accelTime( .5 );
|
|
$lift_bottom.decelTime( .5 );
|
|
$lift_bottom.time( rotateTime );
|
|
|
|
$lift_bottom.startSoundShader ("co_lift_rotation", SND_CHANNEL_VOICE );
|
|
|
|
$lift_bottom.rotateOnce( delta );
|
|
sys.waitFor ($lift_bottom);
|
|
|
|
sys.clearSignalThread( SIG_BLOCKED, $lift_bottom );
|
|
lift_dir = dir;
|
|
|
|
// update our location on the guis
|
|
set_lift_location( lift_station );
|
|
}
|
|
|
|
////////////////////////////////////////////////////
|
|
//
|
|
// move lift to a specific spot
|
|
//
|
|
////////////////////////////////////////////////////
|
|
void move_lift_to( entity target ) {
|
|
float path_length;
|
|
float i;
|
|
float dir;
|
|
float next_dir;
|
|
string ent_name;
|
|
entity path_ent;
|
|
entity next_ent;
|
|
|
|
if ( lift_station == target ) {
|
|
// lower the platform if necessary
|
|
if ( lift_plat_up ) {
|
|
cmd_lift_down();
|
|
}
|
|
return;
|
|
}
|
|
|
|
// create a path to the target
|
|
path_length = calc_lift_path_r( lift_station, lift_station, target, 0 );
|
|
if ( !path_length ) {
|
|
string currentname = lift_station.getName();
|
|
string targetname = target.getName();
|
|
sys.warning( "entity 'lift_bottom' can't find path from '" + currentname + "' to '" + targetname + "'" );
|
|
return;
|
|
}
|
|
|
|
// lower the platform if necessary
|
|
if ( lift_plat_up ) {
|
|
cmd_lift_down();
|
|
}
|
|
|
|
// get the first point on the path
|
|
ent_name = $lift_bottom.getKey( "path0" );
|
|
next_ent = sys.getEntity( ent_name );
|
|
if ( !next_ent ) {
|
|
sys.warning( "entity 'lift_bottom' can't find path entity '" + ent_name + "' to get to '" + target.getName() + "'" );
|
|
return;
|
|
}
|
|
dir = get_lift_turn_dir( lift_station, next_ent );
|
|
|
|
// move to each point on the path
|
|
for( i = 0; i < path_length; i++ ) {
|
|
path_ent = next_ent;
|
|
|
|
// get the next path entity, unless we're at the last one
|
|
if ( i < path_length - 1 ) {
|
|
ent_name = $lift_bottom.getKey( "path" + ( i + 1 ) );
|
|
next_ent = sys.getEntity( ent_name );
|
|
if ( !next_ent ) {
|
|
sys.warning( "entity 'lift_bottom' can't find path entity '" + ent_name + "' to get to '" + target.getName() + "'" );
|
|
return;
|
|
}
|
|
}
|
|
|
|
// turn towards the new direction if it's different and accelerate
|
|
if ( dir != lift_dir ) {
|
|
turn_lift_to_dir( dir );
|
|
$lift_bottom.accelTime( .5 );
|
|
} else if ( i != 0 ) {
|
|
$lift_bottom.accelTime( 0 );
|
|
} else {
|
|
// always accelerate on the first path entity
|
|
$lift_bottom.accelTime( .5 );
|
|
}
|
|
|
|
// decelerate on the last path entity or if we have to turn
|
|
if ( i < path_length - 1 ) {
|
|
dir = get_lift_turn_dir( path_ent, next_ent );
|
|
if ( dir != lift_dir ) {
|
|
$lift_bottom.decelTime( .5 );
|
|
} else {
|
|
$lift_bottom.decelTime( 0 );
|
|
}
|
|
} else {
|
|
$lift_bottom.decelTime( .5 );
|
|
}
|
|
|
|
// move to the next path entity
|
|
sys.onSignal( SIG_BLOCKED, $lift_bottom, "map_commoutside::lift_move_blocked" );
|
|
$lift_bottom.speed( LIFT_MOVE_SPEED );
|
|
|
|
$lift_bottom.moveTo( path_ent );
|
|
sys.waitFor( $lift_bottom );
|
|
sys.clearSignalThread( SIG_BLOCKED, $lift_bottom );
|
|
|
|
// update our location on the guis
|
|
set_lift_location( path_ent );
|
|
}
|
|
}
|
|
|
|
////////////////////////////////////////////////////
|
|
//
|
|
// if blocked when trying to go up, go back down
|
|
//
|
|
////////////////////////////////////////////////////
|
|
void lift_up_blocked() {
|
|
cmd_lift_down();
|
|
lift_loop();
|
|
}
|
|
|
|
////////////////////////////////////////////////////
|
|
//
|
|
// move lift up
|
|
//
|
|
////////////////////////////////////////////////////
|
|
void cmd_lift_up() {
|
|
if ( lift_plat_up ) {
|
|
return;
|
|
}
|
|
|
|
float rotation = 0;
|
|
|
|
// set the amount of movment
|
|
// needed for the spots where the lift can't go up fully
|
|
if ( lift_station == $lift_spot_31 ) {
|
|
rotation = 25;
|
|
} else if ( lift_station == $lift_spot_32 ) {
|
|
rotation = 20;
|
|
} else if ( lift_station == $lift_spot_44 ) {
|
|
rotation = 20;
|
|
} else if ( lift_station == $lift_spot_73 ) {
|
|
rotation = 24;
|
|
}
|
|
|
|
lift_plat_up = true;
|
|
|
|
$lift_leg_11.startSoundShader ("co_lift_up_2s", SND_CHANNEL_VOICE );
|
|
|
|
$lift_leg_11.rotateUpTo ( 0, -rotation );
|
|
$lift_leg_12.rotateDownTo ( 0, 2 * rotation );
|
|
$lift_leg_13.rotateUpTo ( 0, -2 * rotation );
|
|
$lift_connection_top_move.rotateDownTo ( 0, rotation );
|
|
|
|
$lift_leg_21.rotateDownTo ( 0, 2 * rotation );
|
|
$lift_connection_bottom_move.rotateUpTo ( 0, -rotation );
|
|
$lift_leg_22.rotateUpTo ( 0, -2 * rotation );
|
|
$lift_leg_23.rotateDownTo ( 0, 2 * rotation );
|
|
$lift_connection_top_static.rotateUpTo ( 0, -rotation );
|
|
|
|
sys.onSignal( SIG_BLOCKED, $lift_bottom, "map_commoutside::lift_up_blocked" );
|
|
sys.waitFor( $lift_leg_23 );
|
|
sys.clearSignalThread( SIG_BLOCKED, $lift_bottom );
|
|
|
|
// update our location on the guis
|
|
set_lift_location( lift_station );
|
|
}
|
|
|
|
////////////////////////////////////////////////////
|
|
//
|
|
// if blocked when trying to go down, go back up
|
|
//
|
|
////////////////////////////////////////////////////
|
|
void lift_down_blocked() {
|
|
cmd_lift_up();
|
|
reset_guis();
|
|
lift_loop();
|
|
}
|
|
|
|
////////////////////////////////////////////////////
|
|
//
|
|
// move lift down
|
|
//
|
|
////////////////////////////////////////////////////
|
|
void cmd_lift_down() {
|
|
if ( !lift_plat_up ) {
|
|
return;
|
|
}
|
|
|
|
$lift_cage_control.disable();
|
|
|
|
lift_plat_up = false;
|
|
|
|
$lift_leg_11.startSoundShader ("co_lift_down_2s", SND_CHANNEL_VOICE );
|
|
|
|
$lift_leg_11.rotateDownTo ( 0, 320 );
|
|
$lift_leg_12.rotateUpTo ( 0, 80 );
|
|
$lift_leg_13.rotateDownTo ( 0, 280 );
|
|
$lift_connection_top_move.rotateUpTo ( 0, 40 );
|
|
|
|
$lift_leg_21.rotateUpTo ( 0, 80 );
|
|
$lift_connection_bottom_move.rotateDownTo ( 0, 320 );
|
|
$lift_leg_22.rotateDownTo ( 0, 280 );
|
|
$lift_leg_23.rotateUpTo ( 0, 80 );
|
|
$lift_connection_top_static.rotateDownTo ( 0, 320 );
|
|
|
|
sys.onSignal( SIG_BLOCKED, $lift_bottom, "map_commoutside::lift_down_blocked" );
|
|
sys.waitFor ($lift_leg_23);
|
|
sys.clearSignalThread( SIG_BLOCKED, $lift_bottom );
|
|
|
|
$lift_cage_control.enable();
|
|
|
|
// update our location on the guis
|
|
set_lift_location( lift_station );
|
|
}
|
|
|
|
////////////////////////////////////////////////////
|
|
//
|
|
// moves the lift back into position when blocked
|
|
//
|
|
////////////////////////////////////////////////////
|
|
void lift_move_blocked() {
|
|
$lift_bottom.stopMoving();
|
|
$lift_bottom.startSound( "snd_decel", SND_CHANNEL_BODY2, false );
|
|
sys.wait( 0.1 );
|
|
|
|
// move back
|
|
$lift_bottom.accelTime( .5 );
|
|
$lift_bottom.decelTime( .5 );
|
|
$lift_bottom.speed( LIFT_MOVE_SPEED );
|
|
$lift_bottom.moveTo( lift_station );
|
|
sys.waitFor( $lift_bottom );
|
|
$lift_cage_control.enable();
|
|
|
|
reset_guis();
|
|
|
|
// update our location on the guis
|
|
set_lift_location( lift_station );
|
|
|
|
lift_loop();
|
|
}
|
|
|
|
////////////////////////////////////////////////////
|
|
//
|
|
// move lift forward
|
|
//
|
|
////////////////////////////////////////////////////
|
|
void cmd_lift_forward() {
|
|
entity path_ent;
|
|
|
|
path_ent = check_lift_move_dir( lift_station, lift_dir );
|
|
if ( path_ent == lift_station ) {
|
|
return;
|
|
}
|
|
|
|
if ( lift_plat_up ) {
|
|
cmd_lift_down();
|
|
}
|
|
|
|
$lift_cage_control.disable();
|
|
|
|
sys.onSignal( SIG_BLOCKED, $lift_bottom, "map_commoutside::lift_move_blocked" );
|
|
$lift_bottom.accelTime( .5 );
|
|
$lift_bottom.decelTime( .5 );
|
|
$lift_bottom.speed( LIFT_MOVE_SPEED );
|
|
$lift_bottom.moveTo( path_ent );
|
|
sys.waitFor( $lift_bottom );
|
|
sys.clearSignalThread( SIG_BLOCKED, $lift_bottom );
|
|
set_lift_location( path_ent );
|
|
$lift_cage_control.enable();
|
|
}
|
|
|
|
////////////////////////////////////////////////////
|
|
//
|
|
// move lift back
|
|
//
|
|
////////////////////////////////////////////////////
|
|
void cmd_lift_back() {
|
|
entity path_ent;
|
|
|
|
path_ent = check_lift_move_dir( lift_station, ( lift_dir + 2 ) & 3 );
|
|
if ( path_ent == lift_station ) {
|
|
return;
|
|
}
|
|
|
|
if ( lift_plat_up ) {
|
|
cmd_lift_down();
|
|
}
|
|
|
|
$lift_cage_control.disable();
|
|
|
|
sys.onSignal( SIG_BLOCKED, $lift_bottom, "map_commoutside::lift_move_blocked" );
|
|
$lift_bottom.accelTime( .5 );
|
|
$lift_bottom.decelTime( .5 );
|
|
$lift_bottom.speed( LIFT_MOVE_SPEED );
|
|
$lift_bottom.moveTo( path_ent );
|
|
sys.waitFor( $lift_bottom );
|
|
set_lift_location( path_ent );
|
|
$lift_cage_control.enable();
|
|
}
|
|
|
|
////////////////////////////////////////////////////
|
|
//
|
|
// move lift right
|
|
//
|
|
////////////////////////////////////////////////////
|
|
void cmd_lift_right() {
|
|
turn_lift_to_dir( ( lift_dir - 1 ) & 3 );
|
|
}
|
|
|
|
////////////////////////////////////////////////////
|
|
//
|
|
// move lift left
|
|
//
|
|
////////////////////////////////////////////////////
|
|
void cmd_lift_left() {
|
|
turn_lift_to_dir( ( lift_dir + 1 ) & 3 );
|
|
}
|
|
|
|
////////////////////////////////////////////////////
|
|
//
|
|
// call lift to call spot #1
|
|
// From anywhere in the grid the lift will find
|
|
// it's way to call spot #1
|
|
//
|
|
////////////////////////////////////////////////////
|
|
void cmd_lift_call_1() {
|
|
move_lift_to( $lift_spot_13 );
|
|
turn_lift_to_dir( 0 );
|
|
}
|
|
|
|
////////////////////////////////////////////////////
|
|
//
|
|
// call lift to call spot #2
|
|
// From anywhere in the grid the lift will find
|
|
// it's way to call spot #2
|
|
//
|
|
////////////////////////////////////////////////////
|
|
void cmd_lift_call_2() {
|
|
move_lift_to( $lift_spot_31 );
|
|
turn_lift_to_dir( 1 );
|
|
}
|
|
|
|
////////////////////////////////////////////////////
|
|
//
|
|
// call lift to call spot #3
|
|
// From anywhere in the grid the lift will find
|
|
// it's way to call spot #3
|
|
//
|
|
////////////////////////////////////////////////////
|
|
void cmd_lift_call_3() {
|
|
move_lift_to( $lift_spot_83 );
|
|
turn_lift_to_dir( 1 );
|
|
}
|
|
|
|
////////////////////////////////////////////////////
|
|
//
|
|
// command processing loop
|
|
//
|
|
////////////////////////////////////////////////////
|
|
void lift_loop() {
|
|
while( 1 ) {
|
|
lift_command = CMD_LIFT_NONE;
|
|
while( lift_command == CMD_LIFT_NONE ) {
|
|
sys.waitFrame();
|
|
}
|
|
|
|
if ( lift_command == CMD_LIFT_UP ) {
|
|
cmd_lift_up();
|
|
} else if ( lift_command == CMD_LIFT_DOWN ) {
|
|
cmd_lift_down();
|
|
} else if ( lift_command == CMD_LIFT_FORWARD ) {
|
|
cmd_lift_forward();
|
|
} else if ( lift_command == CMD_LIFT_RIGHT ) {
|
|
cmd_lift_right();
|
|
} else if ( lift_command == CMD_LIFT_LEFT ) {
|
|
cmd_lift_left();
|
|
} else if ( lift_command == CMD_LIFT_BACK ) {
|
|
cmd_lift_back();
|
|
} else if ( lift_command == CMD_LIFT_CALL1 ) {
|
|
cmd_lift_call_1();
|
|
} else if ( lift_command == CMD_LIFT_CALL2 ) {
|
|
cmd_lift_call_2();
|
|
} else if ( lift_command == CMD_LIFT_CALL3 ) {
|
|
cmd_lift_call_3();
|
|
}
|
|
}
|
|
}
|
|
|
|
////////////////////////////////////////////////////
|
|
//
|
|
// Gui call back functions
|
|
//
|
|
////////////////////////////////////////////////////
|
|
void lift_up() {
|
|
lift_command = CMD_LIFT_UP;
|
|
}
|
|
void lift_down() {
|
|
lift_command = CMD_LIFT_DOWN;
|
|
}
|
|
void lift_forward() {
|
|
lift_command = CMD_LIFT_FORWARD;
|
|
}
|
|
void lift_right() {
|
|
lift_command = CMD_LIFT_RIGHT;
|
|
}
|
|
void lift_left() {
|
|
lift_command = CMD_LIFT_LEFT;
|
|
}
|
|
void lift_back() {
|
|
lift_command = CMD_LIFT_BACK;
|
|
}
|
|
void lift_call_1() {
|
|
lift_command = CMD_LIFT_CALL1;
|
|
}
|
|
void lift_call_2() {
|
|
lift_command = CMD_LIFT_CALL2;
|
|
}
|
|
void lift_call_3() {
|
|
lift_command = CMD_LIFT_CALL3;
|
|
}
|
|
|
|
////////////////////////////////////////////////////
|
|
//
|
|
// raise panel for call spot #1
|
|
//
|
|
////////////////////////////////////////////////////
|
|
void callspot1_panel_up() {
|
|
$callspot1_conpan.startSoundShader ("co_conpanel", SND_CHANNEL_VOICE );
|
|
$callspot1_conpan.rotateOnce( '-63.43 0 0' );
|
|
$callspot1_conpan_trigger_up.disable();
|
|
sys.waitFor( $callspot1_conpan );
|
|
|
|
$callspot1_conpan_trigger_down.enable();
|
|
}
|
|
|
|
////////////////////////////////////////////////////
|
|
//
|
|
// raise panel for call spot #1
|
|
//
|
|
////////////////////////////////////////////////////
|
|
void callspot1_panel_down() {
|
|
$callspot1_conpan.startSoundShader ("co_conpanel", SND_CHANNEL_VOICE );
|
|
$callspot1_conpan.rotateOnce( '63.43 0 0' );
|
|
$callspot1_conpan_trigger_down.disable();
|
|
sys.waitFor( $callspot1_conpan );
|
|
|
|
$callspot1_conpan_trigger_up.enable();
|
|
}
|
|
|
|
////////////////////////////////////////////////////
|
|
//
|
|
// raise panel for call spot #2
|
|
//
|
|
////////////////////////////////////////////////////
|
|
void callspot2_panel_up() {
|
|
$callspot2_conpan.startSoundShader ("co_conpanel", SND_CHANNEL_VOICE );
|
|
$callspot2_conpan.rotateOnce( '0 0 63.43' );
|
|
$callspot2_conpan_trigger_up.disable();
|
|
sys.waitFor( $callspot2_conpan );
|
|
|
|
$callspot2_conpan_trigger_down.enable();
|
|
}
|
|
|
|
////////////////////////////////////////////////////
|
|
//
|
|
// raise panel for call spot #2
|
|
//
|
|
////////////////////////////////////////////////////
|
|
void callspot2_panel_down() {
|
|
$callspot2_conpan.startSoundShader ("co_conpanel", SND_CHANNEL_VOICE );
|
|
$callspot2_conpan.rotateOnce( '0 0 -63.43' );
|
|
$callspot2_conpan_trigger_down.disable();
|
|
sys.waitFor( $callspot2_conpan );
|
|
|
|
$callspot2_conpan_trigger_up.enable();
|
|
}
|
|
|
|
////////////////////////////////////////////////////
|
|
//
|
|
// raise panel for call spot #3
|
|
//
|
|
////////////////////////////////////////////////////
|
|
void callspot3_panel_up() {
|
|
$callspot3_conpan.startSoundShader ("co_conpanel", SND_CHANNEL_VOICE );
|
|
$callspot3_conpan.rotateOnce( '0 0 63.43' );
|
|
$callspot3_conpan_trigger_up.disable();
|
|
sys.waitFor( $callspot3_conpan );
|
|
|
|
$callspot3_conpan_trigger_down.enable();
|
|
}
|
|
|
|
////////////////////////////////////////////////////
|
|
//
|
|
// raise panel for call spot #3
|
|
//
|
|
////////////////////////////////////////////////////
|
|
void callspot3_panel_down() {
|
|
$callspot3_conpan.startSoundShader ("co_conpanel", SND_CHANNEL_VOICE );
|
|
$callspot3_conpan.rotateOnce( '0 0 -63.43' );
|
|
$callspot3_conpan_trigger_down.disable();
|
|
sys.waitFor( $callspot3_conpan );
|
|
|
|
$callspot3_conpan_trigger_up.enable();
|
|
}
|
|
|
|
////////////////////////////////////////////////////
|
|
//
|
|
// MAIN
|
|
//
|
|
////////////////////////////////////////////////////
|
|
void lift_main() {
|
|
|
|
setup_lift();
|
|
|
|
// turn lift to the left so it can illuminate the 2nd call station area
|
|
cmd_lift_left();
|
|
lift_loop();
|
|
}
|
|
} // namespace
|