313 lines
10 KiB
Lua
313 lines
10 KiB
Lua
--/////////////////////////////////////////////////////////////////////////////////////////////////
|
|
-- (c) Galyana's Ultimate Empire at War Modifications
|
|
--
|
|
-- ****** *** *** ************ *** ***
|
|
-- * * * * * * * *
|
|
-- * * * * * * *
|
|
-- * * * * * * *
|
|
-- * * * * * **** * * *
|
|
-- * * * ****** * * * *
|
|
-- * **** * * * * * * * *** *
|
|
-- * * * * * * * * * *
|
|
-- * * * * * * * * * *
|
|
-- * * * * * * * ** * * *
|
|
-- ****** ****** ************ **** ** *******
|
|
--/////////////////////////////////////////////////////////////////////////////////////////////////
|
|
-- 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: GUEaW/Data/Scripts/FreeStore/GalacticFreeStore.LUA
|
|
--
|
|
-- Original Editor: Giovanni Galyana
|
|
--
|
|
-- Final Edit By: Giovanni Galyana
|
|
--
|
|
-- Date: 7 March, 2019
|
|
--
|
|
-- Revisions: 0
|
|
--
|
|
--/////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
require("pgcommands")
|
|
require("GalacticHeroFreeStore")
|
|
|
|
function Base_Definitions()
|
|
DebugMessage("%s -- In Base_Definitions", tostring(Script))
|
|
|
|
-- how often does this script get serviced?
|
|
ServiceRate = 8
|
|
UnitServiceRate = 8
|
|
|
|
Common_Base_Definitions()
|
|
|
|
-- Percentage of units to move on each service.
|
|
SpaceMovePercent = 0.10
|
|
GroundMovePercent = 0.10
|
|
|
|
if Definitions then
|
|
Definitions()
|
|
end
|
|
end
|
|
|
|
function main()
|
|
|
|
DebugMessage("%s -- In main for %s", tostring(Script), tostring(FreeStore))
|
|
|
|
if FreeStoreService then
|
|
while 1 do
|
|
FreeStoreService()
|
|
PumpEvents()
|
|
end
|
|
end
|
|
|
|
ScriptExit()
|
|
end
|
|
|
|
function MoveUnit(object)
|
|
|
|
dest_target = nil
|
|
object_type = object.Get_Type()
|
|
if object_type.Is_Hero() then
|
|
dest_target = Find_Custom_Target(object)
|
|
end
|
|
|
|
if not TestValid(dest_target) then
|
|
if object.Is_Transport() then
|
|
dest_target = Find_Ground_Unit_Target(object)
|
|
else
|
|
dest_target = Find_Space_Unit_Target(object)
|
|
end
|
|
end
|
|
|
|
if dest_target then
|
|
FreeStore.Move_Object(object, dest_target)
|
|
return true
|
|
else
|
|
DebugMessage("%s -- Object: %s, unable to find a suitable destination for this object.", tostring(Script), tostring(object))
|
|
return false
|
|
end
|
|
end
|
|
|
|
function On_Unit_Service(object)
|
|
|
|
-- If this unit isn't in a safe spot move him regardless of the MovedUnitsThisService
|
|
-- Also, Heroes need to be where they most want to be asap
|
|
if (FreeStore.Is_Unit_Safe(object) == false) or (object.Get_Type().Is_Hero()) then
|
|
MoveUnit(object)
|
|
return
|
|
end
|
|
|
|
if object.Is_Transport() then
|
|
if GameRandom.Get_Float() < GroundAvailablePercent and GroundUnitsMoved < GroundUnitsToMove then
|
|
if FreeStore.Is_Unit_In_Transit(object) == false then
|
|
DebugMessage("%s -- Object: %s service move order issued", tostring(Script), tostring(object))
|
|
if MoveUnit(object) then
|
|
GroundUnitsMoved = GroundUnitsMoved + 1
|
|
end
|
|
end
|
|
end
|
|
else
|
|
if GameRandom.Get_Float() < SpaceAvailablePercent and SpaceUnitsMoved < SpaceUnitsToMove then
|
|
if FreeStore.Is_Unit_In_Transit(object) == false then
|
|
DebugMessage("%s -- Object: %s service move order issued", tostring(Script), tostring(object))
|
|
if MoveUnit(object) then
|
|
SpaceUnitsMoved = SpaceUnitsMoved + 1
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
-- // param 1: playerwrapper.
|
|
-- // param 2: perception function name
|
|
-- // param 3: goal application type string
|
|
-- // param 4: reachability type string
|
|
-- // param 5: The probability of selecting the target with highest desire
|
|
-- // param 6: The source from which the find target should search for relative targets.
|
|
-- // param 7: The maximum distance from source to target.
|
|
function On_Unit_Added(object)
|
|
DebugMessage("%s -- Object: %s added to freestore", tostring(Script), tostring(object))
|
|
|
|
obj_type = object.Get_Type()
|
|
if obj_type.Is_Hero() then
|
|
DebugMessage("%s -- Hero Object: %s added to freestore", tostring(Script), obj_type.Get_Name())
|
|
end
|
|
|
|
MoveUnit(object)
|
|
|
|
end
|
|
|
|
function FreeStoreService()
|
|
|
|
if PlayerObject.Get_Faction_Name() == "REBEL" then
|
|
leader_object = Find_First_Object("MON_MOTHMA")
|
|
elseif PlayerObject.Get_Faction_Name() == "EMPIRE" then
|
|
leader_object = Find_First_Object("EMPEROR_PALPATINE")
|
|
end
|
|
|
|
MovedUnitsThisService = 0
|
|
GroundUnitsMoved = 0
|
|
GroundUnitsToMove = 0
|
|
SpaceUnitsMoved = 0
|
|
SpaceUnitsToMove = 0
|
|
SpaceAvailablePercent = 0
|
|
GroundAvailablePercent = 0
|
|
|
|
object_count = FreeStore.Get_Object_Count()
|
|
|
|
if object_count ~= 0 then
|
|
-- get the count of space force in the freestore
|
|
scnt = FreeStore.Get_Object_Count(true)
|
|
-- get the count of ground force in the freestore
|
|
gcnt = FreeStore.Get_Object_Count(false)
|
|
|
|
SpaceAvailablePercent = scnt / object_count
|
|
GroundAvailablePercent = gcnt / object_count
|
|
SpaceUnitsToMove = SpaceMovePercent * scnt
|
|
GroundUnitsToMove = GroundMovePercent * gcnt
|
|
DebugMessage("%s -- SpaceAvailablePercent: %f, GroundAvailablePercent: %f, SpaceUnitsToMove: %f, GroundUnitsToMove: %f, scnt: %f, gcnt: %f",
|
|
tostring(Script), SpaceAvailablePercent, GroundAvailablePercent, SpaceUnitsToMove, GroundUnitsToMove, scnt, gcnt)
|
|
end
|
|
|
|
end
|
|
|
|
function Find_Ground_Unit_Target(object)
|
|
|
|
my_planet = object.Get_Planet_Location()
|
|
|
|
if FreeStore.Is_Unit_Safe(object) == false then
|
|
my_planet = nil
|
|
end
|
|
|
|
if leader_object then
|
|
leader_planet = leader_object.Get_Planet_Location()
|
|
end
|
|
|
|
max_force_target = 1000 * (PlayerObject.Get_Tech_Level() + 1)
|
|
force_target = EvaluatePerception("Friendly_Global_Land_Unit_Raw_Total", PlayerObject)
|
|
if not force_target then
|
|
return nil
|
|
end
|
|
force_target = force_target / 4.0
|
|
if force_target > max_force_target then
|
|
force_target = max_force_target
|
|
end
|
|
|
|
if leader_planet then
|
|
if leader_planet == my_planet then
|
|
return nil
|
|
elseif leader_planet.Get_Is_Planet_AI_Usable() and object.Can_Land_On_Planet(leader_planet) then
|
|
if EvaluatePerception("Friendly_Land_Unit_Raw_Total", PlayerObject, leader_planet) < force_target then
|
|
return leader_planet
|
|
end
|
|
end
|
|
end
|
|
|
|
priority_planet = FindTarget.Reachable_Target(PlayerObject, "Ground_Priority_Defense_Score", "Friendly", "Friendly_Only", 0.1, object)
|
|
if priority_planet then
|
|
priority_planet = priority_planet.Get_Game_Object()
|
|
end
|
|
|
|
if priority_planet then
|
|
if priority_planet == my_planet then
|
|
return nil
|
|
elseif priority_planet.Get_Is_Planet_AI_Usable() and object.Can_Land_On_Planet(priority_planet) then
|
|
if EvaluatePerception("Friendly_Land_Unit_Raw_Total", PlayerObject, priority_planet) < force_target then
|
|
return priority_planet
|
|
end
|
|
end
|
|
end
|
|
|
|
if my_planet and EvaluatePerception("Low_Ground_Defense_Score", PlayerObject, my_planet) > 0.5 then
|
|
return nil
|
|
end
|
|
|
|
poorly_defended_planet = FindTarget.Reachable_Target(PlayerObject, "Low_Ground_Defense_Score", "Friendly", "Friendly_Only", 1.0, object)
|
|
if poorly_defended_planet then
|
|
poorly_defended_planet = poorly_defended_planet.Get_Game_Object()
|
|
end
|
|
|
|
if poorly_defended_planet and poorly_defended_planet.Get_Is_Planet_AI_Usable() and object.Can_Land_On_Planet(poorly_defended_planet) then
|
|
return poorly_defended_planet
|
|
end
|
|
|
|
if not my_planet then
|
|
fallback_planet = FindTarget.Reachable_Target(PlayerObject, "One", "Friendly", "Friendly_Only", 0.1, object)
|
|
if fallback_planet then
|
|
return fallback_planet.Get_Game_Object()
|
|
end
|
|
end
|
|
|
|
return nil
|
|
end
|
|
|
|
function Find_Space_Unit_Target(object)
|
|
|
|
my_planet = object.Get_Planet_Location()
|
|
|
|
if not my_planet then
|
|
return nil
|
|
end
|
|
|
|
if leader_object then
|
|
leader_planet = leader_object.Get_Planet_Location()
|
|
end
|
|
|
|
max_force_target = 3000 * (PlayerObject.Get_Tech_Level() + 1)
|
|
force_target = EvaluatePerception("Friendly_Global_Space_Unit_Raw_Total", PlayerObject)
|
|
if not force_target then
|
|
return nil
|
|
end
|
|
force_target = force_target / 4.0
|
|
if force_target > max_force_target then
|
|
force_target = max_force_target
|
|
end
|
|
|
|
if leader_planet and leader_planet.Get_Is_Planet_AI_Usable() then
|
|
if leader_planet == my_planet then
|
|
if EvaluatePerception("Friendly_Space_Unit_Raw_Total", PlayerObject, leader_planet) < 1.5 * force_target then
|
|
return leader_planet
|
|
end
|
|
elseif EvaluatePerception("Friendly_Space_Unit_Raw_Total", PlayerObject, leader_planet) < force_target then
|
|
if EvaluatePerception("Enemy_Present", PlayerObject, leader_planet) == 0.0 then
|
|
return leader_planet
|
|
end
|
|
end
|
|
end
|
|
|
|
priority_planet = FindTarget.Reachable_Target(PlayerObject, "Space_Priority_Defense_Score", "Friendly", "Friendly_Only", 0.1, object)
|
|
if priority_planet then
|
|
priority_planet = priority_planet.Get_Game_Object()
|
|
end
|
|
|
|
if priority_planet and priority_planet.Get_Is_Planet_AI_Usable() then
|
|
if priority_planet == my_planet then
|
|
if EvaluatePerception("Friendly_Space_Unit_Raw_Total", PlayerObject, priority_planet) < 1.5 * force_target then
|
|
return priority_planet
|
|
end
|
|
elseif EvaluatePerception("Friendly_Space_Unit_Raw_Total", PlayerObject, priority_planet) < force_target then
|
|
if EvaluatePerception("Enemy_Present", PlayerObject, priority_planet) == 0.0 then
|
|
return priority_planet
|
|
end
|
|
end
|
|
end
|
|
|
|
if my_planet and EvaluatePerception("Low_Space_Defense_Score", PlayerObject, my_planet) > 0.5 then
|
|
return nil
|
|
end
|
|
|
|
poorly_defended_planet = FindTarget.Reachable_Target(PlayerObject, "Low_Space_Defense_Score", "Friendly", "Friendly_Only", 1.0, object)
|
|
if poorly_defended_planet then
|
|
poorly_defended_planet = poorly_defended_planet.Get_Game_Object()
|
|
end
|
|
|
|
if poorly_defended_planet and poorly_defended_planet.Get_Is_Planet_AI_Usable() then
|
|
if EvaluatePerception("Friendly_Space_Unit_Raw_Total", PlayerObject, poorly_defended_planet) < force_target then
|
|
if EvaluatePerception("Enemy_Present", PlayerObject, poorly_defended_planet) == 0.0 then
|
|
return poorly_defended_planet
|
|
end
|
|
end
|
|
end
|
|
|
|
return nil
|
|
end |