-- $Id: //depot/Projects/StarWars_Steam/FOC/Run/Data/Scripts/FreeStore/BusyTacticalFreeStore.lua#1 $ --///////////////////////////////////////////////////////////////////////////////////////////////// -- -- (C) Petroglyph Games, Inc. -- -- -- ***** ** * * -- * ** * * * -- * * * * * -- * * * * * * * * -- * * *** ****** * ** **** *** * * * ***** * *** -- * ** * * * ** * ** ** * * * * ** ** ** * -- *** ***** * * * * * * * * ** * * * * -- * * * * * * * * * * * * * * * -- * * * * * * * * * * ** * * * * -- * ** * * ** * ** * * ** * * * * -- ** **** ** * **** ***** * ** *** * * -- * * * -- * * * -- * * * -- * * * * -- **** * * -- --///////////////////////////////////////////////////////////////////////////////////////////////// -- C O N F I D E N T I A L S O U R C E C O D E -- D O N O T D I S T R I B U T E --///////////////////////////////////////////////////////////////////////////////////////////////// -- -- $File: //depot/Projects/StarWars_Steam/FOC/Run/Data/Scripts/FreeStore/BusyTacticalFreeStore.lua $ -- -- Original Author: Steve_Copeland -- -- $Author: Brian_Hayes $ -- -- $Change: 637819 $ -- -- $DateTime: 2017/03/22 10:16:16 $ -- -- $Revision: #1 $ -- --///////////////////////////////////////////////////////////////////////////////////////////////// require("pgcommands") function Base_Definitions() Common_Base_Definitions() ServiceRate = 20 UnitServiceRate = 2 if Definitions then Definitions() end FREE_STORE_ATTACK_RANGE = 600.0 end function main() if FreeStoreService then while 1 do FreeStoreService() PumpEvents() end end ScriptExit() end function On_Unit_Added(object) end function FreeStoreService() enemy_location = FindTarget.Reachable_Target(PlayerObject, "Current_Enemy_Location", "Tactical_Location", "Any_Threat", 0.5) friendly_location = FindTarget.Reachable_Target(PlayerObject, "Current_Friendly_Location", "Tactical_Location", "Any_Threat", 0.5) aggressive_mode = (EvaluatePerception("Allowed_As_Defender_Land", PlayerObject) > 0.0) --Manage the space station in space mode if Get_Game_Mode() == "Space" then if TestValid(space_station) then station_threat = FindDeadlyEnemy(space_station) if station_threat then space_station.Attack_Target(station_threat) end --Maybe this station has a special weapon? special_target = FindTarget.Reachable_Target(PlayerObject, "Needs_Hypervelocity_Shot", "Enemy_Unit", "Any_Threat", 0.5, space_station, 1500.0) if TestValid(special_target) then space_station.Fire_Special_Weapon(special_target, PlayerObject) end else space_station = PlayerObject.Get_Space_Station() end end end function On_Unit_Service(object) if not TestValid(object) then return end if object.Is_Category("Structure") or object.Is_Category("Transport") then return end current_target = object.Get_Attack_Target() if TestValid(current_target) then if Service_Heal(object, 0.6) then return end if Service_Kite(object) then return end object.Activate_Ability("SPOILER_LOCK", false) Try_Weapon_Switch(object, current_target) end if not object.Has_Active_Orders() then --Keep bored objects mobile object.Activate_Ability("SPOILER_LOCK", true) if Service_Kite(object) then return end if Service_Heal(object, 1.0) then return end -- Reset some abilities object.Activate_Ability("SPREAD_OUT", false) if Service_Garrison(object) then return end if Service_Attack(object) then return end Service_Guard(object) end end function Service_Heal(object, health_threshold) --Add difficulty factor here if object.Get_Hull() < health_threshold then -- Try to find the nearest healing structure appropriate for this unit lib_fs_healer_property_flag = Get_Special_Healer_Property_Flag(object) if not lib_fs_healer_property_flag then if object.Is_Category("Infantry") then lib_fs_healer_property_flag = "HealsInfantry" elseif object.Is_Category("Vehicle") then lib_fs_healer_property_flag = "HealsVehicles" end end if lib_fs_healer_property_flag then healer = Find_Nearest(object, lib_fs_healer_property_flag, PlayerObject, true) end if TestValid(healer) then if object.Get_Distance(healer) > 100.0 then object.Activate_Ability("SPREAD_OUT", false) Try_Ability(object,"Turbo") Try_Ability(object,"JET_PACK", healer) Try_Ability(object,"SPRINT") Try_Ability(object, "SPOILER_LOCK") Try_Ability(object, "STEALTH") Try_Ability(object, "FORCE_CLOAK") object.Move_To(healer, 10) return true end end end return false end function Service_Garrison(object) if object.Has_Property("CanContainGarrison") then lib_garrison_table = object.Get_Garrisoned_Units() if table.getn(lib_garrison_table) > 0 then lib_garrison_needs_heals = true lib_garrison_healer = Find_Nearest(object, "HealsInfantry", object.Get_Owner(), true) lib_garrison_enemy = Find_Nearest(object, object.Get_Owner(), false) lib_eject_for_heal = TestValid(lib_garrison_healer) and (object.Get_Distance(lib_garrison_healer) < 150) lib_eject_for_attack = (not object.Has_Property("GarrisonCanFire")) and TestValid(lib_garrison_enemy) and (object.Get_Distance(lib_garrison_enemy) < FREE_STORE_ATTACK_RANGE) for i,garrison in pairs(lib_garrison_table) do if garrison.Get_Hull() > 0.4 then lib_garrison_needs_heals = false if lib_eject_for_attack and garrison.Is_Good_Against(lib_garrison_enemy) then garrison.Leave_Garrison() end elseif lib_eject_for_heal then garrison.Leave_Garrison() end end if lib_garrison_needs_heals and TestValid(lib_garrison_healer) then object.Move_To(lib_garrison_healer) return true end end end return false end function Service_Attack(object) --Move to the enemy position rather than the enemy itself in order to leave us free --to run autonomous targeting. While this doesn't provide chase behavior we're probably --repeating this enough that we don't care closest_enemy = Find_Nearest(object, object.Get_Owner(), false) if TestValid(closest_enemy) and not closest_enemy.Is_Good_Against(object) then if object.Get_Distance(closest_enemy) < FREE_STORE_ATTACK_RANGE then object.Attack_Move(closest_enemy.Get_Position()) return true elseif aggressive_mode then if not Try_Garrison(nil, object, false, FREE_STORE_ATTACK_RANGE / 2.0) then object.Attack_Move(closest_enemy.Get_Position()) end return true end elseif TestValid(enemy_location) then if aggressive_mode then object.Attack_Move(enemy_location) return true end end return false end function Service_Guard(object) if Try_Deploy_Garrison(object, nil, 0.0) then return true end closest_friendly_structure = Find_Nearest(object, "Structure", object.Get_Owner(), true) if TestValid(closest_friendly_structure) then object.Guard_Target(closest_friendly_structure) return true elseif TestValid(friendly_location) then object.Attack_Move(friendly_location) return true end return false end function Service_Kite(object) lib_fs_deadly_enemy = FindDeadlyEnemy(object) if TestValid(lib_fs_deadly_enemy) then if lib_fs_deadly_enemy.Is_Good_Against(object) then if Try_Ability(object, "PROXIMITY_MINES", object) then return true end if Try_Ability(object, "BUZZ_DROIDS", object) then return true end object.Activate_Ability("SPREAD_OUT", false) Try_Ability(object, "TURBO") Try_Ability(object, "SPRINT") Try_Ability(object, "SPOILER_LOCK") Try_Ability(object, "STEALTH") Try_Ability(object, "FORCE_CLOAK") if object.Get_Hull() > 0.5 then Try_Ability(object, "STIM_PACK") end lib_fs_kite_pos = Project_By_Unit_Range(lib_fs_deadly_enemy, object) if Try_Ability(object, "JET_PACK", lib_fs_kite_pos) then return true end object.Move_To(lib_fs_kite_pos) return true end end return false end