//=============================================================================
//
//  Oil Raid Final - oilraid.gm
//
//  Who         When                What
//-----------------------------------------------------------------------------
//  Mateos      16th August 2016    Updates done
//  Mateos      23rd May 2012       Further updates planned
//  ^4Tardis    10 October 2010     Updated Script - 0.8
//  Mateos      21st December 2009  Based on incomplete .way file
//                                  Added script for 0.71
//
//=============================================================================

/****************************************************
Path mapping and script by Mateos
Correspondant WAY file size: 79,8 Ko (81 732 octets)
Last update: 16th August 2016
****************************************************/

/*
 * TODO:
 *  - Review current ROUTE... Not by me, lot of redundancy, has to be cleaned a bit;
 *      * Looks better now, still the code could be reduced a bit though.
 *  - Heavy weapon goals. Perhaps SNIPE too? Check Fops ones.
 *
 * Optionnal:
 *  - [...].
 */

global Map =
{
    Debug = 0, // Please set to zero before distributing your script

    Allied_Command_Post_Dyno = 0,
    Assault_Ramp_Dyno = 0,
    Axis_Command_Post_Dyno = 0,
    Depot_Gate_Dyno = 0,
    Detonator_Dyno = 0,
    Tank_Barrier_Dyno = 0,

    isDepotGateDestroyed = false,

    Movers =
    {
        // Retain these movers
        "MOVER_tank",
        "MOVER_train",
    },

    Navigation =
    {
        // /bot waypoint_setproperty paththrough Navigation_PT:north_mg
        north_mg =
        {
            navigate = function( _this )
            {
                wpTable = {};
                yield();
                Wp.GetWaypointByName( "north_mg", wpTable );
                if ( _this.Goto( wpTable.position ) == EVENT.PATH_SUCCESS )
                {
                    Util.MapDebugPrint( "north_mg", true );
                    _this.Bot.HoldButton( BTN.STRAFE_L, 2 );
                    sleep( 2 );
                }
            },
        },

        // /bot waypoint_setproperty paththrough Navigation_PT:south_mg
        south_mg =
        {
            navigate = function( _this )
            {
                wpTable = {};
                yield();
                Wp.GetWaypointByName( "south_mg", wpTable );
                if ( _this.Goto( wpTable.position ) == EVENT.PATH_SUCCESS )
                {
                    Util.MapDebugPrint( "south_mg", true );
                    _this.Bot.HoldButton( BTN.STRAFE_R, 2 );
                    sleep( 2 );
                }
            },
        },

        // /bot waypoint_setproperty paththrough Navigation_PT:window_jump
        window_jump =
        {
            navigate = function( _this )
            {
                wpTable = {};
                Wp.GetWaypointByName( "window", wpTable );
                _this.AddAimRequest( Priority.VeryHigh, "facing", wpTable.facing );
                sleep( 0.55 );
                _this.Bot.HoldButton( BTN.JUMP, 0.5 );
                sleep( 0.5 );
                _this.Bot.HoldButton( BTN.CROUCH, 1 );
                sleep( 1 );
            },
        },
    },

    TrainStartTrigger =
    {
        TriggerOnEntity = GetGoal( "MOVER_train" ).GetEntity(),

        OnEnter = function( ent )
        {
            if ( Map.isDepotGateDestroyed ) { return; }

            SetAvailableMapGoals( TEAM.ALLIES, true, "RIDE_TRAIN" );

            Util.MapDebugPrint( GetEntName( ent ) + " Train Start Entering", true );
        },

        OnExit = function( ent )
        {
            if ( Map.isDepotGateDestroyed ) { return; }

            SetAvailableMapGoals( TEAM.AXIS, true, "RIDE_AXI_train" );

            Util.MapDebugPrint( GetEntName( ent ) + " Train Start Leaving", true );
        }
    },

    TrainEndTrigger =
    {
        TriggerOnEntity = GetGoal( "MOVER_train" ).GetEntity(),

        OnEnter = function( ent )
        {
            if ( Map.isDepotGateDestroyed ) { return; }

            SetAvailableMapGoals( TEAM.ALLIES, false, "RIDE_TRAIN" );
            SetAvailableMapGoals( TEAM.AXIS, false, "RIDE_AXI_train" );

            Util.MapDebugPrint( GetEntName( ent ) + " Train End Entering", true );
        },

        OnExit = function( ent )
        {
            if ( Map.isDepotGateDestroyed ) { return; }

            SetAvailableMapGoals( TEAM.AXIS, false, "RIDE_AXI_train" );
            SetAvailableMapGoals( TEAM.ALLIES, false, "RIDE_TRAIN" );

            Util.MapDebugPrint( GetEntName( ent ) + " Train End Leaving", true );
        }
    },

    Allied_Command_Post_Built = function( trigger )
    {
        Util.MapDebugPrint( "Allied_Command_Post_Built" );
    },

    Allied_Command_Post_Planted = function( trigger )
    {
        Map.Allied_Command_Post_Dyno += 1;

        Util.MapDebugPrint( "Allied_Command_Post_Planted" );
    },

    Allied_Command_Post_Defused = function( trigger )
    {
        Map.Allied_Command_Post_Dyno -= 1;

        Util.MapDebugPrint( "Allied_Command_Post_Defused" );
    },

    Allied_Command_Post_Destroyed = function( trigger )
    {
        Util.MapDebugPrint( "Allied_Command_Post_Destroyed" );
    },

    Assault_Ramp_Built = function( trigger )
    {
        SetAvailableMapGoals( TEAM.ALLIES, true, "ROUTE_Assault_Ramp.*" );

        Util.MapDebugPrint( "Assault_Ramp_Built" );
    },

    Assault_Ramp_Planted = function( trigger )
    {
        Map.Assault_Ramp_Dyno += 1;

        Util.MapDebugPrint( "Assault_Ramp_Planted" );
    },

    Assault_Ramp_Defused = function( trigger )
    {
        Map.Assault_Ramp_Dyno -= 1;

        Util.MapDebugPrint( "Assault_Ramp_Defused" );
    },

    Assault_Ramp_Destroyed = function( trigger )
    {
        SetAvailableMapGoals( TEAM.ALLIES, false, "ROUTE_Assault_Ramp.*" );

        Util.MapDebugPrint( "Assault_Ramp_Destroyed" );
    },

    Axis_Command_Post_Built = function( trigger )
    {
        Util.MapDebugPrint( "Axis_Command_Post_Built" );
    },

    Axis_Command_Post_Planted = function( trigger )
    {
        Map.Axis_Command_Post_Dyno += 1;

        Util.MapDebugPrint( "Axis_Command_Post_Planted" );
    },

    Axis_Command_Post_Defused = function( trigger )
    {
        Map.Axis_Command_Post_Dyno -= 1;

        Util.MapDebugPrint( "Axis_Command_Post_Defused" );
    },

    Axis_Command_Post_Destroyed = function( trigger )
    {
        Util.MapDebugPrint( "Axis_Command_Post_Destroyed" );
    },

    Tank_Built = function( trigger )
    {
        Util.MapDebugPrint( "Tank_Built" );
    },

    Tank_Destroyed = function( trigger )
    {
        Util.MapDebugPrint( "Tank_Destroyed" );
    },

    Tank_At_First_Barrier = function( trigger )
    {
        // Disable side of the Tank offsets
        ETUtil.SetExcludeIndexes( "ESCORT_Tank" );
        ETUtil.SetExcludeIndexes( "ESCORT_Tank", { 0, 1 } );

        SetAvailableMapGoals( TEAM.AXIS, true, {
            "MOUNTMG42_NorthMG42",
            "REPAIRMG42_NorthMG42",
        });

        Util.MapDebugPrint( "Tank_At_First_Barrier" );
    },

    Tank_Barrier_Built = function( trigger )
    {
        Util.MapDebugPrint( "Tank_Barrier_Built" );
    },

    Tank_Barrier_Planted = function( trigger )
    {
        Map.Tank_Barrier_Dyno += 1;

        Util.MapDebugPrint( "Tank_Barrier_Planted" );
    },

    Tank_Barrier_Defused = function( trigger )
    {
        Map.Tank_Barrier_Dyno -= 1;

        Util.MapDebugPrint( "Tank_Barrier_Defused" );
    },

    Tank_Barrier_Destroyed = function( trigger )
    {
        Util.MapDebugPrint( "Tank_Barrier_Destroyed" );
    },

    Depot_Gate_Planted = function( trigger )
    {
        Map.Depot_Gate_Dyno += 1;

        Util.MapDebugPrint( "Depot_Gate_Planted" );
    },

    Depot_Gate_Defused = function( trigger )
    {
        Map.Depot_Gate_Dyno -= 1;

        Util.MapDebugPrint( "Depot_Gate_Defused" );
    },

    Depot_Gate_Destroyed = function( trigger )
    {
        Map.isDepotGateDestroyed = true;

        Util.DisableGoal( "RIDE_.*" );

        // Absolute focus on the Depot protection
        SetAvailableMapGoals( TEAM.AXIS, false, {
            "BUILD_.*",
            "DEFEND_Charlie.*",
            "PLANT_.*"
            "RIDE_AXI_train",
        });
        SetAvailableMapGoals( TEAM.AXIS, true, {
            "ARTILLERY_S_fuze",
            "ATTACK_Delta7",
            "CALLARTILLERY_fuze",
            "DEFEND_Charlie[9-11]",
            "DEFEND_Echo.*",
        });

        SetAvailableMapGoals( TEAM.ALLIES, true, {
            "FLAG_fuzeredflag",
            "CAPPOINT_FuzeDropoff",
        });
        SetAvailableMapGoals( TEAM.ALLIES, false, "RIDE_TRAIN" );

        Util.MapDebugPrint( "Depot_Gate_Destroyed" );
    },

    Detonator_Planted = function( trigger )
    {
        Map.Detonator_Dyno += 1;

        Util.MapDebugPrint( "Detonator_Planted" );
    },

    Detonator_Defused = function( trigger )
    {
        Map.Detonator_Dyno -= 1;

        SetAvailableMapGoals( TEAM.AXIS, true, "PLANT_Detonator" );

        Util.MapDebugPrint( "Detonator_Defused" );
    },

    Detonator_Destroyed = function( trigger )
    {
        // Like fuzeredflag_Secured, but inverted
        SetAvailableMapGoals( TEAM.ALLIES, false, "ATTACK_FuzeDropoff" );
        SetAvailableMapGoals( TEAM.ALLIES, true, {
            "ATTACK_Delta.*",
            "FLAG_fuzeredflag",
            "CAPPOINT_FuzeDropoff",
        });

        SetAvailableMapGoals( TEAM.AXIS, true, {
            "ARTILLERY_S_fuze",
            "ATTACK_Delta7",
            "CALLARTILLERY_fuze",
            "DEFEND_Charlie[9-11]",
            "DEFEND_Echo.*",
        });
        SetAvailableMapGoals( TEAM.AXIS, false, {
            "DEFEND_Foxtrot.*",
            "PLANT_Detonator",
        });

        Util.MapDebugPrint( "Detonator_Destroyed" );
    },

    Main_Gate_Destroyed = function( trigger )
    {
        // Both teams should selfkill to be ready for the next objective
        foreach ( id and bot in BotTable )
        {
            bot.ExecCommand( "kill" );
        }

        // City Spawn instead of Outside City
        // Probably a mapper mistake... Perhaps this one was meant to be CP-dependant?
        Util.ChangeSpawn( TEAM.ALLIES, 1 );

        sleep( 1 );

        Util.DisableGoal( ".*", true ); // All but Routes
        Util.DisableGoal( "ROUTE_Assault_Ramp.*" );

        SetAvailableMapGoals( TEAM.AXIS, true, {
            "DEFEND_Charlie.*",
            "BUILD_Axis_Command_Post",
            "MOBILEMG42_Charlie",
            "MOBILEMORTAR_Charlie",
        });

        SetAvailableMapGoals( TEAM.ALLIES, true, {
            "ATTACK_Delta.*",
            "BUILD_Allied_Command_Post",
            "BUILD_Assault_Ramp",
            "MOBILEMG42_Delta",
            "PLANT_Axis_Command_Post",
            "PLANT_Depot_Gate",
            "RIDE_TRAIN",
        });

        Util.MapDebugPrint( "Main_Gate_Destroyed" );
    },

    fuzeredflag_Taken = function( trigger )
    {
        SetAvailableMapGoals( TEAM.ALLIES, false, "FLAG_fuzeredflag" );

        Util.MapDebugPrint( "fuzeredflag_Taken" );
    },

    fuzeredflag_Returned = function( trigger )
    {
        SetAvailableMapGoals( TEAM.ALLIES, true, {
            "FLAG_fuzeredflag",
            "CAPPOINT_FuzeDropoff",
        });

        Util.MapDebugPrint( "fuzeredflag_Returned" );
    },

    fuzeredflag_Secured = function( trigger )
    {
        // Make sure Allied Engineers detonate the explosive
        SetAvailableMapGoals( TEAM.ALLIES, true, "ATTACK_FuzeDropoff" );
        SetAvailableMapGoals( TEAM.ALLIES, false, {
            "FLAG_fuzeredflag",
            "CAPPOINT_FuzeDropoff",
        });

        SetAvailableMapGoals( TEAM.AXIS, false, {
            "ARTILLERY_S_fuze",
            "ATTACK_Delta7",
            "CALLARTILLERY_fuze",
            "DEFEND_Charlie[9-11]",
            "DEFEND_Echo.*",
        });
        SetAvailableMapGoals( TEAM.AXIS, true, {
            "DEFEND_Foxtrot.*",
            "PLANT_Detonator",
        });

        Util.MapDebugPrint( "fuzeredflag_Secured" );
    },

    AlliesWin = function( trigger )
    {
        Util.MapDebugPrint( "AlliesWin" );
    },
};

global OnMapLoad = function()
{
    // *** TRIGGERS ***
    OnTrigger( "Allied have constucted a command post", Map.Allied_Command_Post_Built );
    OnTrigger( "Allies have constucted the ramp", Map.Assault_Ramp_Built );
    OnTrigger( "Axis have constucted a command post", Map.Axis_Command_Post_Built );
    OnTrigger( "The Tank has been repaired!", Map.Tank_Built );
    OnTrigger( "The Tank Barrier has been constructed.", Map.Tank_Barrier_Built );
    OnTrigger( "Planted at the Allied Command Post.", Map.Allied_Command_Post_Planted );
    OnTrigger( "Planted at the Assault Ramp.", Map.Assault_Ramp_Planted );
    OnTrigger( "Planted at the Axis Command Post.", Map.Axis_Command_Post_Planted );
    OnTrigger( "Planted at the Depot Gate.", Map.Depot_Gate_Planted );
    OnTrigger( "Planted at Tank Barrier.", Map.Tank_Barrier_Planted );
    OnTrigger( "Defused at the Allied Command Post.", Map.Allied_Command_Post_Defused );
    OnTrigger( "Defused at the Assault Ramp.", Map.Assault_Ramp_Defused );
    OnTrigger( "Defused at the Axis Command Post.", Map.Axis_Command_Post_Defused );
    OnTrigger( "Defused at the Depot Gate.", Map.Depot_Gate_Defused );
    OnTrigger( "Defused at Tank Barrier.", Map.Tank_Barrier_Defused );
    OnTrigger( "Axis have destroyed the Allied command post", Map.Allied_Command_Post_Destroyed );
    OnTrigger( "Axis have destroyed the ramp", Map.Assault_Ramp_Destroyed );
    OnTrigger( "Allies have destroyed the Axis command post", Map.Axis_Command_Post_Destroyed );
    OnTrigger( "Depot Gate destroyed", Map.Depot_Gate_Destroyed );
    OnTrigger( "Allied team has destroyed the Main Gate!", Map.Main_Gate_Destroyed );
    OnTrigger( "The Tank Barrier has been destroyed.", Map.Tank_Barrier_Destroyed );
    OnTrigger( "The Tank has been damaged!", Map.Tank_Destroyed );
    OnTrigger( "Allies have stolen the fuze!", Map.fuzeredflag_Taken );
    OnTrigger( "Axis have returned the fuze!", Map.fuzeredflag_Returned );
    OnTrigger( "Allies have layed the fuze!", Map.fuzeredflag_Secured );
    OnTrigger( "Allied win!", Map.AlliesWin );

    // Detonator triggers
    OnTrigger( "Planted at the Detonator.", Map.Detonator_Planted );
    OnTrigger( "Defused at the Detonator.", Map.Detonator_Defused );
    OnTrigger( "Axis have destroyed the detonator!", Map.Detonator_Destroyed );

    OnTriggerRegion( AABB( 1187.964, -264.241, 249.125, 1736.933, 219.518, 341.125 ), Map.TrainStartTrigger );
    OnTriggerRegion( AABB( 5048.166, -227.690, 249.125, 5164.860, 81.666, 331.125 ), Map.TrainEndTrigger );

    // *** CLEAR ALL GOALS FOR BOTH TEAMS ***
    Util.DisableGoal( ".*", true ); // All but Routes

    // *** AXIS GOALS ***
    SetAvailableMapGoals( TEAM.AXIS, true, {
        "ARTILLERY_S_AxisStart",
        "DEFEND_Alpha.*",
        "BUILD_Tank_Barrier",
        "CALLARTILLERY_AxisStart",
        "MOBILEMG42_AxisStart.*",
        "MOBILEMORTAR_AxisStart",
        "MOUNTMG42_SouthMG42",
        "REPAIRMG42_SouthMG42",
        "SNIPE_AxisStart",
    });

    // *** ALLIED GOALS ***
    SetAvailableMapGoals( TEAM.ALLIES, true, {
        "ATTACK_Bravo.*",
        "BUILD_Tank",
        "ESCORT_Tank",
        "MOUNT_tank",
        "PLANT_Tank_Barrier",
    });

    // *** AXIS GOALS PRIORITY ***
    SetGoalPriority( "DEFEND_Echo.*", 0.51 );
    SetGoalPriority( "DEFEND_Foxtrot.*", 0.51 );
    SetGoalPriority( "BUILD_Axis_Command_Post", 0.82 );
    SetGoalPriority( "PLANT_Assault_Ramp", 0.83 );
    SetGoalPriority( "BUILD_Tank_Barrier", 0.84 );
    SetGoalPriority( "PLANT_Detonator", 0.85 );

    // *** ALLIED GOALS PRIORITY ***
    SetGoalPriority( "PLANT_Depot_Gate", 0.82 );
    SetGoalPriority( "BUILD_Allied_Command_Post", 0.91 );
    SetGoalPriority( "ATTACK_FuzeDropoff", 1.1, TEAM.ALLIES, CLASS.ENGINEER );

    // *** GOALS PROPERTIES ***

    // Disable back of the Tank offsets
    ETUtil.SetExcludeIndexes( "ESCORT_Tank", { 2, 3 } );

    Util.AddInvVehicle( "MOVER_train" );

    Util.AddUseWp( "PLANT_Assault_Ramp", "assault_ramp" );  // Above Axis Spawn, on the crates
    Util.AddUseWp( "PLANT_Assault_Ramp", "assault_ramp2" ); // In the Axis CP building
    Util.AddUseWp( "PLANT_Depot_Gate", "depotgate" );
    Util.AddUseWp( "PLANT_Depot_Gate", "depotgate1" );

    Util.LimitToClass( "ATTACK_FuzeDropoff", TEAM.ALLIES, CLASS.ENGINEER );
    Util.ExcludeClass( "MOUNTMG42_.*", TEAM.AXIS, CLASS.MEDIC, CLASS.ENGINEER );
    Util.ExcludeClass( "MOUNTMG42_.*", TEAM.ALLIES, CLASS.MEDIC, CLASS.ENGINEER );

    Util.SetGoalOffset( -450, -370, -50, "PLANT_Tank_Barrier" );

    Util.SetMaxUsersInProgress( 2, "BUILD.*" );
    Util.SetMaxUsersInProgress( 1, "ATTACK_.*" );
    Util.SetMaxUsersInProgress( 1, "DEFEND_.*" );
    Util.SetMaxUsersInProgress( 1, "MOUNTMG42_.*" );
    Util.SetMaxUsersInProgress( 1, "PLANT.*" );
    Util.SetMaxUsersInProgress( 1, "REPAIRMG42_.*" );
    Util.SetMaxUsersInProgress( 1, "RIDE_.*" );

    Util.OnTriggerPosition( "MOVER_tank", Vector3( -6035.0, -540.0, 200.0 ), 200.0, Map.Tank_At_First_Barrier );

    SetMapGoalProperties( "DEFEND_.*",      { mincamptime = 60, maxcamptime = 120 } );
    SetMapGoalProperties( "ATTACK_.*",      { mincamptime = 60, maxcamptime = 120 } );
    SetMapGoalProperties( "MOBILEMG42_.*",  { mincamptime = 60, maxcamptime = 120 } );

    Util.FixMoverPos( "train", Vec3( 496.016, -53.204, 350.126 ), Vec3( 588.516, -54.203, 261.625 ) );

    Util.MapDebugPrint( "Omni-bot map script for " + GetMapName() + " executed." );
};

global InitializeRoutes = function()
{
    MapRoutes =
    {
        BUILD_Tank_Barrier =
        {
            ROUTE_outsidecity_spawn =
            {
                ROUTE_Main_Gate_North =
                {
                    ROUTE_Main_Gate_North2 = {},
                }
            },

            ROUTE_outsidecity_spawn2 =
            {
                ROUTE_Main_Gate_North =
                {
                    ROUTE_Main_Gate_North2 = {},
                }
            },
        },

        ATTACK_Bravo1 =
        {
            ROUTE_Tank_Spawn =
            {
                ROUTE_Tank_route =
                {
                    ROUTE_Tank_route_1 = {},
                },

                ROUTE_des_route =
                {
                    ROUTE_des_route_1 =
                    {
                        ROUTE_des_route_2 =
                        {
                            ROUTE_des_route_3 = {},

                            ROUTE_deswall_route =
                            {
                                ROUTE_deswall_route_1 =
                                {
                                    ROUTE_deswall_route_2 = {},
                                },
                            },
                        },
                    },
                },
            },
        },

        PLANT_Depot_Gate =
        {
            ROUTE_outsidecity_spawn =
            {
                ROUTE_outsidecity =
                {
                    ROUTE_cityA =
                    {
                        ROUTE_cityA_1 =
                        {
                            ROUTE_cityA_2 =
                            {
                                ROUTE_cityA_3 =
                                {
                                    ROUTE_cityA_4 =
                                    {
                                        ROUTE_cityA_5 = {},

                                        ROUTE_arch =
                                        {
                                            ROUTE_arch_1 = {},
                                        },

                                        ROUTE_cityD_3 =
                                        {
                                            ROUTE_cityD_4 = {},
                                        },
                                    },
                                },
                            },
                        },
                    },

                    ROUTE_cityB =
                    {
                        ROUTE_cityB_1 =
                        {
                            ROUTE_cityB_2 =
                            {
                                // Assault Ramp
                                ROUTE_Assault_Ramp1 =
                                {
                                    ROUTE_Assault_Ramp2 =
                                    {
                                        ROUTE_Assault_Ramp3 =
                                        {
                                            ROUTE_cityback_2 = {},
                                        },
                                    },
                                },

                                // Axis spawn front
                                ROUTE_cityB_3 =
                                {
                                    ROUTE_cityback_1 =
                                    {
                                        ROUTE_cityback_2 = {},
                                    },

                                    ROUTE_cityA_5 =
                                    {
                                        ROUTE_cityD_3 =
                                        {
                                            ROUTE_cityD_4 = {},

                                            ROUTE_arch =
                                            {
                                                ROUTE_arch_1 = {},
                                            },
                                        },
                                    },
                                },
                            },
                        },
                    },
                },
            },

            ROUTE_cityspawn =
            {
                ROUTE_cityA =
                {
                    ROUTE_cityA_1 =
                    {
                        ROUTE_cityA_2 =
                        {
                            ROUTE_cityA_3 =
                            {
                                ROUTE_cityA_4 =
                                {
                                    ROUTE_cityA_5 =
                                    {
                                        ROUTE_cityB_3 =
                                        {
                                            ROUTE_cityback_1 =
                                            {
                                                ROUTE_cityback_2 = {},
                                            },
                                        },

                                        ROUTE_cityD_3 =
                                        {
                                            ROUTE_arch =
                                            {
                                                ROUTE_arch_1 = {},
                                            },

                                            ROUTE_cityD_4 = {},
                                        },
                                    },
                                },
                            },
                        },
                    },
                },

                ROUTE_cityspawn_1 =
                {
                    ROUTE_cityspawn_2 =
                    {
                        ROUTE_cityD =
                        {
                            ROUTE_cityD_1 =
                            {
                                ROUTE_cityD_2 =
                                {
                                    ROUTE_cityD_3 =
                                    {
                                        ROUTE_cityD_4 = {},
                                    },

                                    ROUTE_arch =
                                    {
                                        ROUTE_arch_1 = {},
                                    },
                                },
                            },
                        },

                        ROUTE_cityA_2 =
                        {
                            ROUTE_cityA_3 =
                            {
                                ROUTE_cityA_4 =
                                {
                                    ROUTE_cityA_5 =
                                    {
                                        ROUTE_cityB_3 =
                                        {
                                            ROUTE_cityback_1 =
                                            {
                                                ROUTE_cityback_2 = {},
                                            },
                                        },

                                        ROUTE_cityD_3 =
                                        {
                                            ROUTE_cityD_4 = {},

                                            ROUTE_arch =
                                            {
                                                ROUTE_arch_1 = {},
                                            },
                                        },
                                    },
                                },
                            },
                        },
                    },

                    ROUTE_cityA_1 =
                    {
                        ROUTE_cityA_2 =
                        {
                            ROUTE_cityA_3 =
                            {
                                ROUTE_cityA_4 =
                                {
                                    ROUTE_cityA_5 =
                                    {
                                        ROUTE_cityB_3 =
                                        {
                                            ROUTE_cityback_1 =
                                            {
                                                ROUTE_cityback_2 = {},
                                            },
                                        },

                                        ROUTE_cityD_3 =
                                        {
                                            ROUTE_cityD_4 = {},

                                            ROUTE_arch =
                                            {
                                                ROUTE_arch_1 = {},
                                            },
                                        },
                                    },
                                },
                            },
                        },
                    },
                },
            },

            ROUTE_cityspawn_1 =
            {
                ROUTE_cityA_1 =
                {
                    ROUTE_cityA_2 =
                    {
                        ROUTE_cityA_3 =
                        {
                            ROUTE_cityA_4 =
                            {
                                ROUTE_cityA_5 = {},

                                ROUTE_cityD_3 =
                                {
                                    ROUTE_cityD_4 = {},

                                    ROUTE_arch =
                                    {
                                        ROUTE_arch_1 = {},
                                    },
                                },
                            },
                        },
                    },
                },

                ROUTE_cityspawn_2 =
                {
                    ROUTE_cityD =
                    {
                        ROUTE_cityD_1 =
                        {
                            ROUTE_cityD_2 =
                            {
                                ROUTE_cityD_3 =
                                {
                                    ROUTE_cityD_4 = {},

                                    ROUTE_arch =
                                    {
                                        ROUTE_arch_1 = {},
                                    },
                                },
                            },
                        },
                    },

                    ROUTE_cityA_2 =
                    {
                        ROUTE_cityA_3 =
                        {
                            ROUTE_cityA_4 =
                            {
                                ROUTE_cityA_5 =
                                {
                                    ROUTE_cityB_3 =
                                    {
                                        ROUTE_cityback_1 =
                                        {
                                            ROUTE_cityback_2 = {},
                                        },
                                    },

                                    ROUTE_cityD_3 =
                                    {
                                        ROUTE_cityD_4 = {},

                                        ROUTE_arch =
                                        {
                                            ROUTE_arch_1 = {},
                                        },
                                    },
                                },
                            },
                        },
                    },
                },
            },

            ROUTE_cityspawn_2 =
            {
                ROUTE_cityA_2 =
                {
                    ROUTE_cityA_3 =
                    {
                        ROUTE_cityA_4 =
                        {
                            ROUTE_cityA_5 =
                            {
                                ROUTE_cityB_3 =
                                {
                                    ROUTE_cityback_1 =
                                    {
                                        ROUTE_cityback_2 = {},
                                    },
                                },

                                ROUTE_cityD_3 =
                                {
                                    ROUTE_cityD_4 = {},

                                    ROUTE_arch =
                                    {
                                        ROUTE_arch_1 = {},
                                    },
                                },
                            },
                        },
                    },
                },

                ROUTE_cityD =
                {
                    ROUTE_cityD_1 =
                    {
                        ROUTE_cityD_2 =
                        {
                            ROUTE_cityD_3 =
                            {
                                ROUTE_cityD_4 = {},

                                ROUTE_cityA_5 =
                                {
                                    ROUTE_cityB_3 =
                                    {
                                        ROUTE_cityback_1 =
                                        {
                                            ROUTE_cityback_2 = {},
                                        },
                                    },
                                },
                            },

                            ROUTE_arch =
                            {
                                ROUTE_arch_1 = {},
                            },
                        },
                    },
                },
            },
        },
    };

    MapRoutes.ATTACK_Bravo2 = MapRoutes.ATTACK_Bravo1;
    MapRoutes.ATTACK_Bravo3 = MapRoutes.ATTACK_Bravo1;
    MapRoutes.ATTACK_Bravo4 = MapRoutes.ATTACK_Bravo1;

    MapRoutes.ATTACK_Delta1 = MapRoutes.PLANT_Depot_Gate;
    MapRoutes.ATTACK_Delta2 = MapRoutes.PLANT_Depot_Gate;
    MapRoutes.ATTACK_Delta3 = MapRoutes.PLANT_Depot_Gate;
    MapRoutes.ATTACK_Delta4 = MapRoutes.PLANT_Depot_Gate;
    MapRoutes.ATTACK_Delta5 = MapRoutes.PLANT_Depot_Gate;
    MapRoutes.ATTACK_Delta6 = MapRoutes.PLANT_Depot_Gate;
    MapRoutes.ATTACK_Delta7 = MapRoutes.PLANT_Depot_Gate;

    MapRoutes.ATTACK_FuzeDropoff = MapRoutes.PLANT_Depot_Gate;

    MapRoutes.DEFEND_Alpha4 = MapRoutes.BUILD_Tank_Barrier;

    MapRoutes.DEFEND_Charlie1 = MapRoutes.PLANT_Depot_Gate;
    MapRoutes.DEFEND_Charlie2 = MapRoutes.PLANT_Depot_Gate;
    MapRoutes.DEFEND_Charlie3 = MapRoutes.PLANT_Depot_Gate;
    MapRoutes.DEFEND_Charlie4 = MapRoutes.PLANT_Depot_Gate;
    MapRoutes.DEFEND_Charlie5 = MapRoutes.PLANT_Depot_Gate;
    MapRoutes.DEFEND_Charlie6 = MapRoutes.PLANT_Depot_Gate;
    MapRoutes.DEFEND_Charlie7 = MapRoutes.PLANT_Depot_Gate;
    MapRoutes.DEFEND_Charlie8 = MapRoutes.PLANT_Depot_Gate;
    MapRoutes.DEFEND_Charlie9 = MapRoutes.PLANT_Depot_Gate;
    MapRoutes.DEFEND_Charlie10 = MapRoutes.PLANT_Depot_Gate;
    MapRoutes.DEFEND_Charlie11 = MapRoutes.PLANT_Depot_Gate;

    Util.Routes( MapRoutes );
};

global OnBotJoin = function( bot )
{
    bot.TargetBreakableDist = 90.0;

    foreach ( id and weap in
    {
        WEAPON.THOMPSON, WEAPON.MP40, WEAPON.SHOTGUN,
        WEAPON.STEN, WEAPON.MP34, WEAPON.M97, WEAPON.M7,
        WEAPON.STG44, WEAPON.FG42, WEAPON.GARAND,
        WEAPON.K43, WEAPON.BAR
    } )
    {
        bot.GetWeapon( weap ).PrimaryFire.SetTargetBias( CLASS.BREAKABLE, 1.2 );
    }

    bot.GetWeapon( WEAPON.KNIFE ).PrimaryFire.SetDesirabilityRange( 0, 48, 0.6 );
};
