//=============================================================================
//
//  D-Rush (Beta 2) - drush.gm
//
//  Who         When                What
//-----------------------------------------------------------------------------
//  Mateos       8 October 2019     Moved to nav
//  Mateos      10   March 2014     Back to work
//  Mateos      19  August 2012     Initial Script
//
//=============================================================================

/****************************************************
Path mapping and script by Mateos
Correspondant WAY file size: 43,8 Ko (44 875 octets)
Last Update: 8th October 2019
****************************************************/

/*
 * FIXME:   The Hotel spawn is screwed: if the Axis own it while the Gate
 *          is destroyed, it will stay Axis...
 *          Try to see with the mapper for a update.
 *
 * Note:    ROUTE_gold1_node3 and ROUTE_gold1_node4 available for all Teams,
 *          even if the Cave Wall isn't destroyed,
 *          so disguised Allied Covert-Ops can use both ways.
 */

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

    Gold_Crate1_Status = 0,     // Not stolen/secured
    Gold_Crate2_Status = 0,     // Not stolen/secured

    // *** TRIGGER CALLBACKS ***
    Allied_Ladder_Built = function( trigger )
    {
        Util.MapDebugPrint( "Allied_Ladder_Built", true );
    },

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

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

    Gate_Destroyed = function( trigger )
    {
        // *** AXIS GOALS ***
        SetAvailableMapGoals( TEAM.AXIS, false, "DEFEND_Alpha.*" );
        SetAvailableMapGoals( TEAM.AXIS, true, "DEFEND_Charlie.*" );

        // *** ALLIED GOALS ***
        SetAvailableMapGoals( TEAM.ALLIES, false, "ATTACK_Bravo.*" );
        SetAvailableMapGoals( TEAM.ALLIES, true, {
            "ATTACK_Charlie.*",
            "CAPPOINT_Escape_Truck",
            "FLAG_.*",
            "PLANT_Cave_Wall",
        });

        Util.MapDebugPrint( "Gate_Destroyed" );
    },

    Gold_Crate_Taken_Dispatch = function( trigger )
    {
        entName = GetEntityName( trigger.Entity );
        if ( entName == "gold_crate1" )
        {
            Map.gold_crate1_Taken( trigger );
        }
        else if ( entName == "gold_crate2" )
        {
            Map.gold_crate2_Taken( trigger );
        }
        else
        {
            // When dropped on ground then re-taken... null
            Util.MapDebugPrint( "Unexpected entity name: " + entName, true );
        }
    },

    gold_crate1_Taken = function( trigger )
    {
        Map.Gold_Crate1_Status = 1;

        // Enable the CAMP goals around the Truck for both Teams
        Util.EnableGoal( "CAMP_Truck.*" );

        // Disable the 3 spots of FLAG_gold_crate1
        SetAvailableMapGoals( TEAM.AXIS, false, "DEFEND_Charlie[123]" );

        SetAvailableMapGoals( TEAM.ALLIES, false, "ATTACK_Charlie.*" );

        Util.MapDebugPrint( "gold_crate1_Taken" );
    },

    gold_crate2_Taken = function( trigger )
    {
        Map.Gold_Crate2_Status = 1;

        // Enable the CAMP goals around the Truck for both Teams
        Util.EnableGoal( "CAMP_Truck.*" );

        // Disable the 3 spots of FLAG_gold_crate2
        SetAvailableMapGoals( TEAM.AXIS, false, "DEFEND_Charlie[456]" );

        SetAvailableMapGoals( TEAM.ALLIES, false, "ATTACK_Charlie.*" );

        Util.MapDebugPrint( "gold_crate2_Taken" );
    },

    gold_crate1_Returned = function( trigger )
    {
        Map.Gold_Crate1_Status = 0;

        /*
         * If both Crates are either returned or secured,
         * disable the CAMP goals around the Truck
         */
        if ( Map.Gold_Crate2_Status == 0 )
        {
            Util.DisableGoal( "CAMP_Truck.*" );
        }

        // Re-enable the DEFEND goals around FLAG_gold_crate1
        SetAvailableMapGoals( TEAM.AXIS, true, "DEFEND_Charlie[123]" );

        Util.MapDebugPrint( "gold_crate1_Returned" );
    },

    gold_crate2_Returned = function( trigger )
    {
        Map.Gold_Crate2_Status = 0;

        /*
         * If both Crates are either returned or secured,
         * disable the CAMP goals around the Truck
         */
        if ( Map.Gold_Crate1_Status == 0 )
        {
            Util.DisableGoal( "CAMP_Truck.*" );
        }

        // Re-enable the DEFEND goals around FLAG_gold_crate2
        SetAvailableMapGoals( TEAM.AXIS, true, "DEFEND_Charlie[456]" );

        Util.MapDebugPrint( "gold_crate2_Returned" );
    },

    gold_crate1_Secured = function( trigger )
    {
        Map.Gold_Crate1_Status = 0;

        Map.Handle_Camp_Spots_OnSecured();

        Util.MapDebugPrint( "gold_crate1_Secured" );
    },

    gold_crate2_Secured = function( trigger )
    {
        Map.Gold_Crate2_Status = 0;

        Map.Handle_Camp_Spots_OnSecured();

        Util.MapDebugPrint( "gold_crate2_Secured" );
    },

    Handle_Camp_Spots_OnSecured = function()
    {
        if ( Map.Gold_Crate1_Status == 0 && Map.Gold_Crate2_Status == 0 )
        {
            Util.DisableGoal( "CAMP_Truck.*" );
        }
    },

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

    flag_Allies_Captured = function( trigger )
    {
        // If it has been reached once, be more aggressive
        SetAvailableMapGoals( TEAM.ALLIES, true, "ATTACK_Bravo.*" );

        Util.MapDebugPrint( "flag_Allies_Captured" );
    },
};

global OnMapLoad = function()
{
    // *** TRIGGERS ***
    OnTrigger( "Allies have constructed the Ladder!", Map.Allied_Ladder_Built );

    OnTrigger( "Axis have destroyed the Ladder!", Map.Allied_Ladder_Destroyed );
    OnTrigger( "The Allies have destroyed Cave Wall!", Map.Cave_Wall_Destroyed );
    OnTrigger( "The Allies have destroyed the Gate and secured the Spawn!", Map.Gate_Destroyed );

    // Most gold-related events need disambiguation...
    // gold_crate1: East
    // gold_crate2: North
    OnTrigger( "Allies have stolen the Gold Crate!", Map.Gold_Crate_Taken_Dispatch );
    OnTrigger( "Flag returned gold_crate1!", Map.gold_crate1_Returned );
    OnTrigger( "Flag returned gold_crate2!", Map.gold_crate2_Returned );
    OnTrigger( "Allies have secured a Gold crate!", Map.gold_crate1_Secured );
    OnTrigger( "Allies have secured a Gold Crate!", Map.gold_crate2_Secured );

    OnTrigger( "The Axis have reclaim the Flag!", Map.flag_Axis_Captured );
    OnTrigger( "The Allies have captured the Flag!", Map.flag_Allies_Captured );

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

    // Note: BUILD/PLANT_Allied_Ladder are unreachable in Beta 1/2

    // *** AXIS GOALS ***
    SetAvailableMapGoals( TEAM.AXIS, true, "DEFEND_Alpha.*" );

    // *** ALLIED GOALS ***
    // All bots on the flag, thus no Attack spots
    SetAvailableMapGoals( TEAM.ALLIES, true, "PLANT_Gate" );

    // *** GOALS PROPERTIES ***
    // Not for CAMP goals since they're for both Teams :D
    Util.SetMaxUsers( 1, "ATTACK_.*" );
    Util.SetMaxUsers( 1, "DEFEND_.*" );

    //Util.SetMaxUsers( 3, "CHECKPOINT_.*" );

    SetGoalPriority( "CAMP_.*", 0.60 );                     // ATTACK/DEFEND goals are 0.50
    Util.SetGoalOffset( -50, -100, -100, "PLANT_Gate" );    // A bit in the back and more on the right
    Util.SetGoalOffset( -50, 0, -100, "PLANT_Cave_Wall" );  // They were planting the other side...

    SetMapGoalProperties( "CAMP_.*",    { DisableCM = 1, MinCampTime = 20, MaxCampTime = 42 } );
    SetMapGoalProperties( "ATTACK_.*",  { DisableCM = 1, MinCampTime = 20, MaxCampTime = 42 } );
    SetMapGoalProperties( "DEFEND_.*",  { DisableCM = 1, MinCampTime = 20, MaxCampTime = 42 } );

    Util.MapDebugPrint( "Omni-bot 0.8x map script for D-Rush (Beta 2) by Mateos executed." );
};

global InitializeRoutes = function()
{
    MapRoutes =
    {
        // Unreachable in Beta 1/2
        BUILD_Allied_Ladder =
        {
        },
        // Unreachable in Beta 1/2
        PLANT_Allied_Ladder =
        {
        },

        // A single way to reach it, no Route needed
        CHECKPOINT_flag =
        {
        },

        // A single way to reach it, no Route needed
        PLANT_Cave_Wall =
        {
        },
        // A single way to reach it, no Route needed
        PLANT_Gate =
        {
        },

        /*
         * Now the interesting goals...
         */

        // For Axis, use the Cave way
        CAMP_Truck1 =
        {
            ROUTE_AxisSpawn_FirstFloor =
            {
                ROUTE_gold1_node3 =
                {
                    ROUTE_gold1_node4 = {},
                },
            },
            ROUTE_AxisSpawn_SecondFloor =
            {
                ROUTE_gold1_node3 =
                {
                    ROUTE_gold1_node4 = {},
                },
            },
        },

        // For both, a straigth way is fine
        FLAG_gold_crate1 =
        {
        },
        FLAG_gold_crate2 =
        {
        },

        // Use the Cave if its Wall is destroyed
        CAPPOINT_Escape_Truck =
        {
			ROUTE_gold1_node1 =
			{
				ROUTE_gold1_node2 =
				{
					ROUTE_gold1_node3 =
					{
                        Weight = 2,     // Prefer ROUTE_gold1_node3 twice more
						ROUTE_gold1_node4 = {},
					},
					ROUTE_gold2_node3 = {},
				},
			},
			ROUTE_gold2_node1  =
			{
				ROUTE_gold2_node2  =
				{
					ROUTE_gold2_node3  = {},
				},
			},
		},
    };

    // Copy routes
	MapRoutes.CAMP_Truck2 = MapRoutes.CAMP_Truck1;
    MapRoutes.CAMP_Truck3 = MapRoutes.CAMP_Truck1;
    MapRoutes.CAMP_Truck4 = MapRoutes.CAMP_Truck1;
    MapRoutes.CAMP_Truck5 = MapRoutes.CAMP_Truck1;

    Util.Routes(MapRoutes);
};