the cutting room mirror

Gunslinger & West Side Remnants

This is a sub-page of Tony Hawk's Underground (PlayStation 2, Xbox, GameCube, Windows).

Remnants of something named Gunslinger can be located throughout Tony Hawk's Underground's game data, scripts, prototypes and leaked code. This is largely believed to be in relation to Neversoft's 2005 game GUN which had a two year development cycle, lining up right with THUG's release.

West Side#

The most well-known Gunslinger relic found within THUG. The final PS2 build has level folders named WWW and WWW_Sky (WWW is presumably short for Wild Wild West). Both folders only contain a single GEOM file. Thankfully the rest of the level's data is fully intact in the prototype builds. Through further editing the level, named West Side, can be loaded inside the game. (Either through the prototype builds or with further work even the final game.)

The level is a rough representation of a western landscape, taking place beside a river that is crudely connected multiple other areas. This includes a long stream that heads towards a lengthy canyon, looping back to the river area. Several horses and horse-riding peds are spawned when the level begins and go along a predetermined path. The sounds of gunfire can be heard when getting close to these riders. Beyond the river and suspended in air are two parallel rows of identical looking buildings opposing each other, making an old west or ghost town. It's even possible to spot peds wondering around this town. Unfortunately the town seems to be completely inaccessible to the player.

When first loading into the level THUG's soundtrack will cut out and instead cycle between two western themed music tracks.

West Side Scripts#

WWW_Scripts.qb, the script file for the West Side level, has a LOT of Gunslinger specific scripts suggesting that the build used additional features for the Camera and Walking system. There are mentions of strafe locking, aiming, having a target, mounting and dismounting a horse. A script named Gunslinger_SkaterChecker attempts to take the player off their board to force walking controls.

GunslingerInvertAiming = 1 
GunslingerTargetDistance = 1500.00000000000 
GunslingerLookaroundHeadingKa = 1.00000000000 
GunslingerLookaroundHeadingEa = 2.00000000000 
GunslingerLookaroundHeadingKs = 1.00000000000 
GunslingerLookaroundHeadingEs = 2.00000000000 
GunslingerHorseLookaroundHeadingKa = 1.00000000000 
GunslingerHorseLookaroundHeadingEa = 2.00000000000 
GunslingerHorseLookaroundHeadingKs = 1.00000000000 
GunslingerHorseLookaroundHeadingEs = 2.00000000000 
GunslingerLookaroundTiltKa = 1.00000000000 
GunslingerLookaroundTiltEa = 2.00000000000 
GunslingerLookaroundTiltKs = 1.00000000000 
GunslingerLookaroundTiltEs = 2.00000000000 
GunslingerHorseLookaroundTiltKa = 1.00000000000 
GunslingerHorseLookaroundTiltEa = 2.00000000000 
GunslingerHorseLookaroundTiltKs = 1.00000000000 
GunslingerHorseLookaroundTiltEs = 2.00000000000 
GunslingerLookaroundHeadingSpeed = 3.75000000000 
GunslingerLookaroundTiltSpeed = 0.69999998808 
GunslingerHorseLookaroundHeadingSpeed = 3.75000000000 
GunslingerHorseLookaroundTiltSpeed = 0.69999998808 
GunslingerLookaroundModulationDistance = 36.00000000000 
GunslingerLookaroundDamping = 0.40000000596 
GunslingerLookaroundTiltCursorSuck = 0.50000000000 
GunslingerLookaroundHeadingCursorSuck = 0.25000000000 
GunslingerStrafeLockTargetKickInTime = 0.50000000000 
GunslingerCameraParameters = { 
    matrix_slerp_rate = 0.01999999955 
    lookaround_slerp_rate = 0.03999999911 
    run_slerp_factor = 1.75000000000 
    min_slerp_speed = 130 
    full_slerp_speed = 450 
    dpad_min_slerp_speed = 50 
    dpad_full_slerp_speed = 150 
    flush_slerp_factor = 12 
    above = 72.00000000000 
    behind = 144.00000000000 
    lerp_xz = 0.25000000000 
    lerp_y = 0.75000000000 
    lock_angle = 135 
    tilt = 0.00000000000 
    zoom_lerp = 0.06250000000 
    facing_control = 1.70000004768 
    control_slerp_factor = 1.29999995232 
} 
GunslingerWalkParameters = { 
    walk_speed = 100 
    run_speed = 350 
    max_stand_speed = 0 
    decel_factor = 5 
    run_accel_rate = 1500 
    walk_accel_rate = 350 
    walk_point = 0.85000002384 
    stop_skidding_speed = 50 
    forced_run_delay = 200 
    dpad_control_damping_factor = 1.29999995232 
    start_run_dpad_delay = 1000 
    full_run_dpad_delay = 1700 
    jump_velocity = 600 
    min_jump_factor = 0.89999997616 
    gravity = 1750 
    hold_time_for_max_jump = 600 
    hang_jump_horiz_vel = 50 
    hang_jump_factor = 0.60000002384 
    rotate_in_place_rate = 1200 
    max_rotate_in_place_speed = 150 
    max_rotate_in_place_angle = 20 
    walk_rotate_factor = 0.50000000000 
    max_pop_speed = 100 
    worse_turn_factor = 10 
    best_turn_factor = 25 
    jump_adjust_speed = 200 
    jump_accel_factor = 12 
    snap_up_height = 24 
    snap_down_height = 18 
    max_unnoticed_ground_snap = 4 
    feeler_length = 18 
    feeler_height = 23 
    push_feeler_length = 15 
    push_strength = 30 
    curb_float_lerp_up_rate = 54 
    curb_float_lerp_down_rate = 18 
    curb_float_feeler_length = 24 
    min_curb_height_adjust_vel = 50 
    walker_height = 70 
    min_skid_speed = 150 
    skid_accel = 1400 
    max_reverse_angle = 45 
    wall_turn_factor = 5 
    wall_turn_speed_threshold = 20 
    max_wall_turn_speed_threshold = 400 
    forward_tolerance = 15 
    lerp_upright_rate = 6 
    hang_move_speed = 46.20000076294 
    hang_horiz_control_tolerance = 45 
    hang_vert_control_tolerance = 45 
    hang_control_delay = 400 
    hang_hop_max_rail_angle = 45 
    hang_max_rail_ascent = 30 
    ledge_top_feeler_up = 6 
    ledge_top_feeler_down = 6 
    ledge_front_feeler_forward = 12 
    ledge_front_feeler_back = 12 
    hang_obstruction_feeler_back = 12 
    hang_obstruction_feeler_up = 6 
    pull_up_obstruction_height = 12 
    rehang_delay = ( 0.30000001192 * 1000 ) 
    hang_init_anim_feeler_height = 36 
    hang_init_anim_feeler_length = 12 
    lowest_hang_height = 92 
    max_hop_to_hang_height = 173 
    max_hop_to_hang_forward_reach = 48 
    max_hop_to_hang_backward_reach = 24 
    hop_obstruction_feeler_up = 24 
    hop_target_vert_vel = 100 
    hop_delay = ( 0.20000000298 * 1000 ) 
    barrier_jump_delay = ( 0 * 1000 ) 
    barrier_jump_min_clearance = 3 
    barrier_jump_max_angle = 75 
    max_horiz_snap_distance = 24 
    button_horiz_snap_distance = 48 
    max_vert_snap_distance = 6 
    max_onto_ladder_angle = 60 
    ladder_move_speed = 45 
    ladder_control_tolerance = 45 
    ladder_climb_offset = 4 
    max_slow_walk_speed = 50 
    max_fast_walk_speed = 100 
    max_slow_run_speed = 150 
    min_anim_run_speed = 50 
    hang_vert_origin_offset = 91 
    pull_up_offset_forward = 10.83500003815 
    pull_up_offset_up = 86.27828216553 
    ladder_top_offset_forward = 6.00362014771 
    ladder_top_offset_up = 59.59719848633 
    ladder_bottom_offset_forward = 23.98740005493 
    ladder_bottom_offset_up = 13.03870010376 
} 
GunslingerHorseParameters = { 
    walk_speed = 300 
    run_speed = 620 
    max_stand_speed = 0 
    decel_factor = 5 
    run_accel_rate = 1500 
    walk_accel_rate = 350 
    walk_point = 0.75000000000 
    stop_skidding_speed = 50 
    forced_run_delay = 200 
    dpad_control_damping_factor = 1.29999995232 
    start_run_dpad_delay = 1000 
    full_run_dpad_delay = 1700 
    jump_velocity = 600 
    min_jump_factor = 0.89999997616 
    gravity = 1750 
    hold_time_for_max_jump = 600 
    hang_jump_horiz_vel = 50 
    hang_jump_factor = 0.60000002384 
    rotate_in_place_rate = 400 
    max_rotate_in_place_speed = 150 
    max_rotate_in_place_angle = 20 
    walk_rotate_factor = 0.50000000000 
    max_pop_speed = 100 
    worse_turn_factor = 10 
    best_turn_factor = 25 
    jump_adjust_speed = 200 
    jump_accel_factor = 12 
    snap_up_height = 24 
    snap_down_height = 18 
    max_unnoticed_ground_snap = 4 
    feeler_length = 18 
    feeler_height = 23 
    push_feeler_length = 15 
    push_strength = 30 
    curb_float_lerp_up_rate = 54 
    curb_float_lerp_down_rate = 18 
    curb_float_feeler_length = 24 
    min_curb_height_adjust_vel = 50 
    walker_height = 70 
    min_skid_speed = 150 
    skid_accel = 1400 
    max_reverse_angle = 45 
    wall_turn_factor = 15 
    wall_turn_speed_threshold = 20 
    max_wall_turn_speed_threshold = 200 
    forward_tolerance = 15 
    lerp_upright_rate = 6 
    hang_move_speed = 46.20000076294 
    hang_horiz_control_tolerance = 45 
    hang_vert_control_tolerance = 45 
    hang_control_delay = 400 
    hang_hop_max_rail_angle = 45 
    hang_max_rail_ascent = 30 
    ledge_top_feeler_up = 6 
    ledge_top_feeler_down = 6 
    ledge_front_feeler_forward = 12 
    ledge_front_feeler_back = 12 
    hang_obstruction_feeler_back = 12 
    hang_obstruction_feeler_up = 6 
    pull_up_obstruction_height = 12 
    rehang_delay = ( 0.30000001192 * 1000 ) 
    hang_init_anim_feeler_height = 36 
    hang_init_anim_feeler_length = 12 
    lowest_hang_height = 92 
    max_hop_to_hang_height = 173 
    max_hop_to_hang_forward_reach = 48 
    max_hop_to_hang_backward_reach = 24 
    hop_obstruction_feeler_up = 24 
    hop_target_vert_vel = 100 
    hop_delay = ( 0.20000000298 * 1000 ) 
    barrier_jump_delay = ( 0 * 1000 ) 
    barrier_jump_min_clearance = 3 
    barrier_jump_max_angle = 75 
    max_horiz_snap_distance = 24 
    button_horiz_snap_distance = 48 
    max_vert_snap_distance = 6 
    max_onto_ladder_angle = 60 
    ladder_move_speed = 45 
    ladder_control_tolerance = 45 
    ladder_climb_offset = 4 
    max_slow_walk_speed = 100 
    max_fast_walk_speed = 200 
    max_slow_run_speed = 300 
    min_anim_run_speed = 50 
    hang_vert_origin_offset = 91 
    pull_up_offset_forward = 10.83500003815 
    pull_up_offset_up = 86.27828216553 
    ladder_top_offset_forward = 6.00362014771 
    ladder_top_offset_up = 59.59719848633 
    ladder_bottom_offset_forward = 23.98740005493 
    ladder_bottom_offset_up = 13.03870010376 
} 
SCRIPT PlayGunshot 
    SpawnSound WWW_Gunshot_Pistol 
ENDSCRIPT

SCRIPT HorsePlaySpeedChosenAnim 
    Horse_GetSpeedScale 
    SWITCH <SpeedScale> 
        CASE HORSE_WALK 
            PlayAnim Anim = ( <Anims> [ 0 ] ) <...> 
        CASE HORSE_TROT 
            PlayAnim Anim = ( <Anims> [ 1 ] ) <...> 
        CASE HORSE_CANTER 
            PlayAnim Anim = ( <Anims> [ 2 ] ) <...> 
        CASE HORSE_GALLOP 
            PlayAnim Anim = ( <Anims> [ 3 ] ) <...> 
    ENDSWITCH 
ENDSCRIPT

SCRIPT HorseRunSpeedChosenAnim 
    HorsePlaySpeedChosenAnim NoRestart <...> 
    BEGIN 
        IF AnimFinished 
            BREAK 
        ENDIF 
        Wait 1 GameFrame 
        HorsePlaySpeedChosenAnim NoRestart <...> 
    REPEAT 
ENDSCRIPT

SCRIPT HorseCycleSpeedChosenAnim 
    HorsePlaySpeedChosenAnim Cycle NoRestart <...> 
    BEGIN 
        Wait 1 GameFrame 
        HorsePlaySpeedChosenAnim Cycle NoRestart <...> 
    REPEAT 
ENDSCRIPT

SCRIPT WaitAnimHorse 
    BEGIN 
        IF AnimFinished 
            BREAK 
        ENDIF 
        Wait 1 GameFrame 
    REPEAT 
ENDSCRIPT

SCRIPT WaitHorse 
    BEGIN 
        Wait 1 GameFrame 
    REPEAT 
ENDSCRIPT

SCRIPT ClearAllHorseExceptions 
    ClearExceptionGroup HorseStateExceptions 
    ClearExceptionGroup HorseEvents 
ENDSCRIPT

SCRIPT HorseJumpRequestedEvent 
    IF Walk_Ground 
        FireEvent type = Jump 
        Horse_Jump 
    ENDIF 
    ClearException JumpRequested 
ENDSCRIPT

SCRIPT HorseJumpButton 
    printf "HorseJumpRequested" 
    FireEvent type = HorseJumpRequested 
ENDSCRIPT

SCRIPT HorseJustCreated 
    printf "HorseJustCreated entry" 
    ClearExceptionGroup HorseStateExceptions 
    SetException Ex = Run Scr = HorseJustCreatedToRunState Group = HorseStateExceptions 
    EnableInputEvents 
    SetEventHandler Ex = Release_X Scr = HorseJumpButton Group = HorseEvents 
    WaitHorse 
    printf "HorseJustCreated exit" 
ENDSCRIPT

SCRIPT HorseJustCreatedToRunState 
    ClearExceptionGroup HorseStateExceptions 
    HorsePlaySpeedChosenAnim Cycle NoRestart Anims = [ HORSE_WALK HORSE_TROT HORSE_CANTER HORSE_GALLOP ] Speeds = [ 63.88000106812 130.44000244141 400 520 ] BlendPeriod = 0.10000000149 <...> 
    Goto HorseRunState 
ENDSCRIPT

SCRIPT HorseRunState 
    ClearExceptionGroup HorseStateExceptions 
    SetException Ex = Stand Scr = HorseStandState Group = HorseStateExceptions 
    SetException Ex = Jump Scr = HorseRunJumpState Group = WalkingStateExceptions 
    SetEventHandler Ex = HorseJumpRequested Scr = HorseJumpRequestedEvent Group = HorseEvents 
    BEGIN 
        HorsePlaySpeedChosenAnim Cycle NoRestart Anims = [ HORSE_WALK HORSE_TROT HORSE_CANTER HORSE_GALLOP ] Speeds = [ 63.88000106812 130.44000244141 400 520 ] BlendPeriod = 0.10000000149 <...> 
        Wait 1 GameFrame 
    REPEAT 
ENDSCRIPT

SCRIPT HorseRunJumpState 
    ClearExceptionGroup HorseStateExceptions 
    SetException Ex = Land Scr = HorseLandState Group = HorseStateExceptions 
    PlayAnim Anim = Horse_Jump BlendPeriod = 0.10000000149 
    BEGIN 
        IF AnimFinished 
            BREAK 
        ENDIF 
        Wait 1 GameFrame 
    REPEAT 
    Goto HorseAirState 
ENDSCRIPT

SCRIPT HorseAirState 
    ClearExceptionGroup HorseStateExceptions 
    SetException Ex = Land Scr = HorseLandState Group = HorseStateExceptions 
    PlayAnim Anim = Horse_Airidle Cycle NoRestart BlendPeriod = 0.10000000149 
    BEGIN 
        Wait 1 GameFrame 
    REPEAT 
ENDSCRIPT

SCRIPT HorseLandState 
    ClearExceptionGroup HorseStateExceptions 
    SetException Ex = Stand Scr = HorseStandLandState Group = HorseStateExceptions 
    SetException Ex = Run Scr = HorseRunLandState Group = HorseStateExceptions 
    SetEventHandler Ex = JumpRequested Scr = HorseJumpRequestedEvent Group = HorseEvents 
    BEGIN 
        Wait 1 GameFrame 
    REPEAT 
ENDSCRIPT

SCRIPT HorseRunLandState 
    ClearExceptionGroup HorseStateExceptions 
    SetException Ex = Stand Scr = HorseStandState Group = HorseStateExceptions 
    PlayAnim Anim = Horse_Land BlendPeriod = 0.10000000149 
    BEGIN 
        IF AnimFinished 
            BREAK 
        ENDIF 
        Wait 1 GameFrame 
    REPEAT 
    Goto HorseRunState 
ENDSCRIPT

SCRIPT HorseStandLandState 
    ClearExceptionGroup HorseStateExceptions 
    SetException Ex = Run Scr = HorseRunState Group = HorseStateExceptions 
    PlayAnim Anim = HorseLand BlendPeriod = 0.05000000075 
    BEGIN 
        IF AnimFinished 
            BREAK 
        ENDIF 
        Wait 1 GameFrame 
    REPEAT 
    Goto HorseStandState 
ENDSCRIPT

SCRIPT HorseStandState 
    ClearExceptionGroup HorseStateExceptions 
    SetException Ex = Run Scr = HorseStandToRunState Group = HorseStateExceptions 
    PlayAnim Anim = Horse_StandIdle BlendPeriod = 0.10000000149 
    BEGIN 
        IF AnimFinished 
            PlayAnim Anim = Horse_StandIdle BlendPeriod = 0.10000000149 
        ENDIF 
        Wait 1 GameFrame 
    REPEAT 
ENDSCRIPT

SCRIPT HorseStandToRunState 
    ClearExceptionGroup HorseStateExceptions 
    SetException Ex = Stand Scr = HorseStandState Group = HorseStateExceptions 
    HorsePlaySpeedChosenAnim Cycle NoRestart Anims = [ HORSE_WALK HORSE_TROT HORSE_CANTER HORSE_GALLOP ] Speeds = [ 63.88000106812 130.44000244141 400 520 ] BlendPeriod = 0.10000000149 <...> 
    Goto HorseRunState 
ENDSCRIPT

SCRIPT PlayerHorseAi 
    SetEventHandler Ex = Landed Scr = HorseLandedEvent Group = PlayerHorse 
    Wait 
ENDSCRIPT

SCRIPT HorseLandedEvent 
    Skater : ClearPanel_Landed 
    Goto HorseJustCreated 
ENDSCRIPT

horse_mode = 0 
SCRIPT MountHorse 
    SetActiveCamera id = playerHorseCamera 
ENDSCRIPT

SCRIPT DismountHorse 
    SkaterCam0 : UnPause 
    SetActiveCamera id = SkaterCam0 
    playerHorseCamera : VehicleCamera_Reset 
ENDSCRIPT

SCRIPT ToggleHorseMode 
    IF ( horse_mode = 0 ) 
        refreshHorse vehicleSetup = <vehicleSetup> 
        PlayerHorse : Vehicle_PlaceBeforeCamera 
        playerHorseCamera : VehicleCamera_Reset 
        PlayerHorse : Unhide 
        Skater : SkaterLoopingSound_TurnOff 
    ELSE 
        SkaterCam0 : UnPause 
        SetActiveCamera id = SkaterCam0 
        PlayerHorse : Die 
        playerHorseCamera : Die 
        Skater : SkaterLoopingSound_TurnOn 
        Skater : SetCustomRestart set 
    ENDIF 
ENDSCRIPT

SCRIPT refreshHorse 
    IF NOT ObjectExists id = PlayerHorse 
        createHorse vehicleSetup = <vehicleSetup> 
    ELSE 
        PlayerHorse : Vehicle_Reset <vehicleSetup> 
    ENDIF 
ENDSCRIPT

SCRIPT createHorse 
    IF NOT ObjectExists id = PlayerHorse 
        CreateCompositeObject { 
            components = [ 
                { component = suspend 
                    NeverSuspend 
                } 
                { 
                    component = skeleton 
                    skeletonName = horse 
                } 
                { 
                    component = animation 
                    AnimName = animload_anl_horse 
                } 
                { 
                    component = horse 
                } 
                { 
                    component = input 
                    controller = 0 
                } 
                { 
                    component = model 
                } 
                { 
                    component = movablecontact 
                } 
            ] 
            params = { 
                name = PlayerHorse 
                <vehicleSetup> 
            } 
        } 
        CreateCompositeObject { 
            components = [ 
                { 
                    component = horsecamera 
                    subject = PlayerHorse 
                    horseCameraSetup 
                } 
                { 
                    component = input 
                    controller = 0 
                } 
                { 
                    component = camera 
                } 
            ] 
            params = { name = playerHorseCamera } 
        } 
    ENDIF 
    PlayerHorse : Obj_SwitchScript HorseJustCreated 
ENDSCRIPT

horseCameraSetup = { 
    alignment_rate = 2.50000000000 
    offset_height = 100 
    offset_distance = 180 
    offset_tilt = 10.00000000000 
} 
customHorseSetup = { 
    model = "west\\horse.skin" 
    skeletonName = horse 
    texDictOffset = 66 
    use_asset_manager = 1 
} 
SCRIPT WWW_Setup 
    IF IsCareerMode 
    ELSE 
    ENDIF 
    Create_Panel_Message style = panel_message_death text = " " 
ENDSCRIPT

SCRIPT WWW_startup 
    WWW_LoadingSounds 
    SetTerrainGrindWire 
    SetTerrainWood 
    SetTerrainConcSmooth 
    SetTerrainMetalSmooth 
    SpawnSkaterScript Gunslinger_SkaterChecker 
ENDSCRIPT

SCRIPT Gunslinger_SkaterChecker 
    BEGIN 
        IF ObjectExists id = Skater 
            MakeskaterGoto Switch_OnGroundAI params = { newscript = walking_ongroundai } 
            IF Gunslinger 
                Skater : Move x = 50 
                ToggleHorseMode vehicleSetup = customHorseSetup 
                Skater : Move x = -50 
            ENDIF 
            BREAK 
            SetMusicVolume 0 
        ELSE 
            Wait 0.50000000000 seconds 
            printf "NO SKATER YET =============================================================" 
        ENDIF 
    REPEAT 
    Wait 3 seconds 
    SetMusicVolume 0 
    Wait 3 seconds 
    stopstream 
    BEGIN 
        playstream WWW_Track02 priority = 100 
        Wait 180 seconds 
        playstream WWW_Track01 priority = 100 
        Wait 260 seconds 
    REPEAT 
ENDSCRIPT

SCRIPT WWW_Goals 
    IF InMultiplayerGame 
        add_multiplayer_mode_goals 
    ENDIF 
    IF NOT InSplitScreenGame 
        IF NOT GameModeEquals is_singlesession 
        ENDIF 
    ENDIF 
    IF NOT InSplitScreenGame 
        IF NOT GameModeEquals is_singlesession 
            IF NOT InNetGame 
            ENDIF 
        ENDIF 
    ENDIF 
ENDSCRIPT

SCRIPT TOD_Script 
    SWITCH <current_tod> 
        CASE morning 
        CASE day 
        CASE evening 
        CASE night 
        DEFAULT 
            printf "### no tod set ###" 
    ENDSWITCH 
ENDSCRIPT

SCRIPT trstscripts 
    BEGIN 
        Wait 10 frames 
    REPEAT 
ENDSCRIPT

SCRIPT WWW_Horse_Test01 
    Obj_StickToGround distAbove = 3 distBelow = 6 
    Obj_Playanim Anim = HORSE_GALLOP Cycle 
    Obj_SetPathAcceleration 50 mphps 
    Obj_SetPathDeceleration 50 mphps 
    Obj_SetPathVelocity 30 mph 
    Obj_FollowPathLinked TurnDist = 5 
    Wait RANDOM(1, 1, 1, 1, 1) RANDOMCASE 1 RANDOMCASE 5 RANDOMCASE 10 RANDOMCASE 30 RANDOMCASE 60 RANDOMEND frames 
    BEGIN 
        IF Obj_ObjectInRadius radius = 10 type = Skater 
            Obj_SetPathVelocity 60 fps 
        ELSE 
            IF Obj_ObjectInRadius radius = 120 type = Skater 
                RANDOM(1, 1, 1, 1, 1) RANDOMCASE RANDOMCASE RANDOMCASE RANDOMCASE 
                    RANDOMCASE Obj_Playstream RANDOM(1, 1, 1, 1, 1) RANDOMCASE FL_Gunshots01 RANDOMCASE FL_Gunshots02 RANDOMCASE FL_Gunshots03 RANDOMCASE FL_Gunshots04 RANDOMCASE FL_Gunshots05 RANDOMEND 
                RANDOMEND 
                Obj_SetPathVelocity RANDOM(1, 1, 1, 1, 1, 1, 1) RANDOMCASE 30 RANDOMCASE 32 RANDOMCASE 32 RANDOMCASE 35 RANDOMCASE 35 RANDOMCASE 40 RANDOMCASE 45 RANDOMEND fps 
            ELSE 
                IF Obj_ObjectInRadius radius = 200 type = Skater 
                    Obj_SetPathVelocity 25 fps 
                ELSE 
                    Obj_SetPathVelocity 15 fps 
                ENDIF 
            ENDIF 
        ENDIF 
        Wait RANDOM(1, 1, 1, 1, 1) RANDOMCASE 0.50000000000 RANDOMCASE 0.60000002384 RANDOMCASE 0.69999998808 RANDOMCASE 0.80000001192 RANDOMCASE 0.89999997616 RANDOMEND seconds 
        obj_playsound HORSE_GALLOP pitch = RANDOM(1, 1, 1) RANDOMCASE 95 RANDOMCASE 100 RANDOMCASE 105 RANDOMEND 
        Wait RANDOM(1, 1, 1, 1, 1) RANDOMCASE 0.50000000000 RANDOMCASE 0.60000002384 RANDOMCASE 0.69999998808 RANDOMCASE 0.80000001192 RANDOMCASE 0.89999997616 RANDOMEND seconds 
        obj_playsound HORSE_GALLOP pitch = RANDOM(1, 1, 1) RANDOMCASE 95 RANDOMCASE 100 RANDOMCASE 105 RANDOMEND 
    REPEAT 
ENDSCRIPT

SCRIPT WWW_Rider_Test01 HorseName = TRG_Enemy_Horse01 
    Obj_LockToObject ObjectName = <HorseName> VECTOR(0.00000000000, 0.00000000000, 0.00000000000) 
    BEGIN 
        Obj_Playanim Anim = Rider_Gallop Cycle 
        Obj_WaitAnimFinished 
    REPEAT 
ENDSCRIPT

Startup Script#

The startup.qb script mentions a Gunslinger build type. If this is detected in the executable the game will attempt to jump to the gun_startup script, or if unavailable it falls back to default_gun_startup. default_gun_startup begins by forcing the player skater into a predetermined appearance that is defined in cas_skater_m.qb, afterwards the game runs an autolaunch for the West Side level.

SCRIPT Call_Personal_StartUp_Script 
    IF Gunslinger 
        IF ScriptExists gun_startup 
            gun_startup 
        ELSE 
            default_gun_startup 
        ENDIF 
    ELSE 
        IF ScriptExists startup 
            startup 
        ELSE 
            printf "WARNING: Missing the startup script" 
            Hideloadingscreen 
            CreateScreenElement { 
                parent = root_window 
                type = textelement 
                id = ns_rules 
                text = "Neversoft and Activision 2002" 
                font = newtrickfont 
                pos = PAIR(320.00000000000, 420.00000000000) 
                rgba = [ 140 128 128 55 ] 
                Scale = 0.60000002384 
                just = [ center center ] 
                not_focusable 
            } 
            RunScriptOnScreenElement id = ns_rules missing_startup 
        ENDIF 
    ENDIF 
ENDSCRIPT

SCRIPT default_gun_startup 
    GetCurrentSkaterProfileIndex 
    SetPlayerAppearance player = <currentSkaterProfileIndex> appearance_structure = appearance_custom_skater_male_09 
    change show_career_startup_menu = 0 
    autolaunch level = load_www game = career 
ENDSCRIPT

Pre-Made Skater#

The previously mentioned skater appearance does not appear in Create-A-Skater's list of Pre-Made Skaters but is defined with them. It refers to the body type 'MaleBody1' which appears to be invalid and also lacks an entry for hair which is unlike the others. The used CAS parts are as follows: Cowboy for hat, Handle Bars for facial hair, Light Skin 2 for the face, Western Vest (or the ID Baggy Vest as used in the script file) for torso, Tight for pants and Cowboy Boots for shoes.

Animations#

WWW.pre contains an 'anims\west' directory with a big chunk of animation files not seen elsewhere. Subdirectories include 'anl_horse', 'Cowboy' and 'rider'.

anl_horse\default.ska.ps2
anl_horse\Horse_Airidle.ska.ps2
anl_horse\Horse_Canter.ska.ps2
anl_horse\Horse_EatIdle.ska.ps2
anl_horse\Horse_Gallop.ska.ps2
anl_horse\Horse_Gallop_Left.ska.ps2
anl_horse\Horse_Gallop_Right.ska.ps2
anl_horse\Horse_Jump.ska.ps2
anl_horse\Horse_Land.ska.ps2
anl_horse\Horse_StandFromEat.ska.ps2
anl_horse\Horse_StandIdle.ska.ps2
anl_horse\Horse_StandToEat.ska.ps2
anl_horse\Horse_Stop.ska.ps2
anl_horse\Horse_Trot.ska.ps2
anl_horse\Horse_Walk.ska.ps2
Cowboy\Cowboy_Run_HighGun.ska.ps2
Cowboy\Cowboy_Run_LowGun.ska.ps2
Cowboy\Cowboy_Run_NoGun.ska.ps2
Cowboy\Cowboy_StandIdle_HighGun.ska.ps2
Cowboy\Cowboy_StandIdle_LowGun.ska.ps2
Cowboy\Cowboy_StandIdle_NoGun.ska.ps2
Cowboy\Cowboy_Walk_HighGun.ska.ps2
Cowboy\Cowboy_Walk_LowGun.ska.ps2
Cowboy\Cowboy_Walk_NoGun.ska.ps2
rider\Rider_Airidle.ska.ps2
rider\Rider_Canter.ska.ps2
rider\Rider_EatIdle.ska.ps2
rider\Rider_Gallop.ska.ps2
rider\Rider_Gallop_Left.ska.ps2
rider\Rider_Gallop_Right.ska.ps2
rider\Rider_Jump.ska.ps2
rider\Rider_Land.ska.ps2
rider\Rider_StandFromEat.ska.ps2
rider\Rider_StandIdle.ska.ps2
rider\Rider_StandToEat.ska.ps2
rider\Rider_Stop.ska.ps2
rider\Rider_Trot.ska.ps2
rider\Rider_Walk.ska.ps2

Cowboy#

Remnants in C++ Code#

THUG1's source code contains multiple files relating to Gunslinger specific code within the GEL (Game Engine Library) folder tree.

components\GunslingerCameraLookAroundComponent.cpp
components\GunslingerWalkCameraComponent.cpp
components\GunslingerWalkComponent.cpp
components\HorseCameraComponent.cpp
components\HorseCameraComponent.h
components\HorseComponent.cpp
components\HorseComponent.h
components\RiderComponent.cpp
components\RiderComponent.h
components\weaponcomponent.cpp
components\weaponcomponent.h