t2-mapper/docs/base/@vl2/scripts.vl2/scripts/aiObjectiveBuilder.cs
2025-09-11 16:56:30 -07:00

646 lines
21 KiB
C#

// used to automatically create all objectives for a mission
function AIgeneratorObjectiveInit(%object)
{
if(%object.isUnderTerrain)
return; // no objectives for generators that act as a simple power sources
if(%object.team > 0)
{
%homeTeam = %object.team;
if(%homeTeam == 1)
%enemyTeam = 2;
else
%enemyTeam = 1;
addAIObjective(%enemyTeam, createDefaultAttack(%object, $AIWeightAttackGenerator[1], $AIWeightAttackGenerator[2]));
addAIObjective(%homeTeam, createDefaultRepair(%object, $AIWeightRepairGenerator[1], $AIWeightRepairGenerator[2]));
addAIObjective(%homeTeam, createDefaultDefend(%object, $AIWeightDefendGenerator[1], $AIWeightDefendGenerator[2]));
}
else
{
addAIObjective(1, createDefaultRepair(%object, $AIWeightRepairGenerator[1], $AIWeightRepairGenerator[2]));
addAIObjective(1, createDefaultAttack(%object, $AIWeightAttackGenerator[1], $AIWeightAttackGenerator[2]));
addAIObjective(1, createDefaultDefend(%object, $AIWeightDefendGenerator[1], $AIWeightDefendGenerator[2]));
addAIObjective(2, createDefaultRepair(%object, $AIWeightRepairGenerator[1], $AIWeightRepairGenerator[2]));
addAIObjective(2, createDefaultAttack(%object, $AIWeightAttackGenerator[1], $AIWeightAttackGenerator[2]));
addAIObjective(2, createDefaultDefend(%object, $AIWeightDefendGenerator[1], $AIWeightDefendGenerator[2]));
}
}
//--------------------------------------------------------------------------------------------------------
function AIsensorObjectiveInit(%object)
{
if(%object.team > 0)
{
%homeTeam = %object.team;
if(%homeTeam == 1)
%enemyTeam = 2;
else
%enemyTeam = 1;
addAIObjective(%homeTeam, createDefaultRepair(%object, $AIWeightRepairTurret[1], $AIWeightRepairTurret[2]));
addAIObjective(%enemyTeam, createDefaultMortar(%object, $AIWeightMortarTurret[1], $AIWeightMortarTurret[2]));
}
else
{
addAIObjective(1, createDefaultRepair(%object, $AIWeightRepairTurret[1], $AIWeightRepairTurret[2]));
addAIObjective(1, createDefaultMortar(%object, $AIWeightMortarTurret[1], $AIWeightMortarTurret[2]));
addAIObjective(2, createDefaultRepair(%object, $AIWeightRepairTurret[1], $AIWeightRepairTurret[2]));
addAIObjective(2, createDefaultMortar(%object, $AIWeightMortarTurret[1], $AIWeightMortarTurret[2]));
}
}
//--------------------------------------------------------------------------------------------------------
function AIflipflopObjectiveInit(%object)
{
// this will always start out neutral (Team 0)
addAIObjective(1, createDefaultDefend(%object, $AIWeightDefendFlipFlop[1], $AIWeightDefendFlipFlop[2]));
addAIObjective(1, createDefaultTouch(%object, $AIWeightCaptureFlipFlop[1], $AIWeightCaptureFlipFlop[2]));
addAIObjective(2, createDefaultDefend(%object, $AIWeightDefendFlipFlop[1], $AIWeightDefendFlipFlop[2]));
addAIObjective(2, createDefaultTouch(%object, $AIWeightCaptureFlipFlop[1], $AIWeightCaptureFlipFlop[2]));
}
//--------------------------------------------------------------------------------------------------------
function AIturretObjectiveInit(%object)
{
if(%object.team > 0)
{
%homeTeam = %object.team;
if(%homeTeam == 1)
%enemyTeam = 2;
else
%enemyTeam = 1;
addAIObjective(%homeTeam, createDefaultRepair(%object, $AIWeightRepairTurret[1], $AIWeightRepairTurret[2]));
// attack for indoor turrets, mortar for outside turrets
if(%object.getDataBlock().getName() $= "SentryTurret")
addAIObjective(%enemyTeam, createDefaultAttack(%object, $AIWeightAttackInventory[1], $AIWeightAttackInventory[2]));
else
addAIObjective(%enemyTeam, createDefaultMortar(%object, $AIWeightMortarTurret[1], $AIWeightMortarTurret[2]));
}
else
{
addAIObjective(1, createDefaultRepair(%object, $AIWeightRepairTurret[1], $AIWeightRepairTurret[2]));
addAIObjective(1, createDefaultMortar(%object, $AIWeightMortarTurret[1], $AIWeightMortarTurret[2]));
addAIObjective(2, createDefaultRepair(%object, $AIWeightRepairTurret[1], $AIWeightRepairTurret[2]));
addAIObjective(2, createDefaultMortar(%object, $AIWeightMortarTurret[1], $AIWeightMortarTurret[2]));
}
}
//--------------------------------------------------------------------------------------------------------
function AIinventoryObjectiveInit(%object)
{
if(%object.team > 0)
{
%homeTeam = %object.team;
if(%homeTeam == 1)
%enemyTeam = 2;
else
%enemyTeam = 1;
addAIObjective(%homeTeam, createDefaultRepair(%object, $AIWeightRepairInventory[1], $AIWeightRepairInventory[2]));
addAIObjective(%enemyTeam, createDefaultAttack(%object, $AIWeightAttackInventory[1], $AIWeightAttackInventory[2]));
}
else
{
addAIObjective(1, createDefaultRepair(%object, $AIWeightRepairInventory[1], $AIWeightRepairInventory[2]));
addAIObjective(1, createDefaultAttack(%object, $AIWeightAttackInventory[1], $AIWeightAttackInventory[2]));
addAIObjective(2, createDefaultRepair(%object, $AIWeightRepairInventory[1], $AIWeightRepairInventory[2]));
addAIObjective(2, createDefaultAttack(%object, $AIWeightAttackInventory[1], $AIWeightAttackInventory[2]));
}
}
//--------------------------------------------------------------------------------------------------------
function createDefaultTouch(%object, %weight1, %weight2)
{
%objective = new AIObjective(AIOTouchObject)
{
dataBlock = "AIObjectiveMarker";
description = "Capture the " @ %object.getName();
weightLevel1 = %weight1;
weightLevel2 = %weight2;
mode = "TouchFlipFlop";
targetObject = %object.getName();
targetClientId = -1;
targetObjectId = -1;
offense = true;
location = %object.getWorldBoxCenter();
desiredEquipment = "Light EnergyPack";
buyEquipmentSet = "LightEnergyDefault";
};
if(%object.missionTypesList !$= "")
%objective.gameType = %object.missionTypesList;
%objective.position = %objective.location;
return %objective;
}
//--------------------------------------------------------------------------------------------------------
function createDefaultMortar(%object, %weight1, %weight2)
{
%objective = new AIObjective(AIOMortarObject)
{
dataBlock = "AIObjectiveMarker";
description = "Mortar the " @ %object.getDataBlock().getName();
targetObject = %object.getName();
targetObjectId = %object;
targetClientId = -1;
weightLevel1 = %weight1;
weightLevel2 = %weight2;
location = %object.getWorldBoxCenter();
offense = true;
equipment = "Mortar MortarAmmo";
buyEquipmentSet = "HeavyAmmoSet";
};
if(%object.missionTypesList !$= "")
%objective.gameType = %object.missionTypesList;
%objective.position = %objective.location;
return %objective;
}
//--------------------------------------------------------------------------------------------------------
function createDefaultRepair(%object, %weight1, %weight2)
{
%objective = new AIObjective(AIORepairObject)
{
dataBlock = "AIObjectiveMarker";
description = "Repair the " @ %object.getDataBlock().getName();
targetObject = %object.getName();
targetObjectId = %object;
targetClientId = -1;
weightLevel1 = %weight1;
weightLevel2 = %weight2;
location = %object.getWorldBoxCenter();
defense = true;
equipment = "RepairPack";
buyEquipmentSet = "MediumRepairSet";
};
if(%object.missionTypesList !$= "")
%objective.gameType = %object.missionTypesList;
%objective.position = %objective.location;
return %objective;
}
//--------------------------------------------------------------------------------------------------------
function createDefaultAttack(%object, %weight1, %weight2)
{
%objective = new AIObjective(AIOAttackObject)
{
dataBlock = "AIObjectiveMarker";
description = "Attack the " @ %object.getDataBlock().getName();
targetObject = %object.getName();
targetObjectId = %object;
targetClientId = -1;
weightLevel1 = %weight1;
weightLevel2 = %weight2;
location = %object.getWorldBoxCenter();
offense = true;
desiredEquipment = "ShieldPack";
buyEquipmentSet = "HeavyAmmoSet";
};
if(%object.missionTypesList !$= "")
%objective.gameType = %object.missionTypesList;
%objective.position = %objective.location;
return %objective;
}
//--------------------------------------------------------------------------------------------------------
function createDefaultDefend(%object, %weight1, %weight2)
{
%objective = new AIObjective(AIODefendLocation)
{
dataBlock = "AIObjectiveMarker";
description = "Defend the " @ %object.getDataBlock().getName();
targetObject = %object.getName();
targetObjectId = %object;
targetClientId = -1;
weightLevel1 = %weight1;
weightLevel2 = %weight2;
location = %object.getWorldBoxCenter();
defense = true;
desiredEquipment = "ShieldPack Plasma PlasmaAmmo";
buyEquipmentSet = "HeavyShieldSet";
};
if(%object.missionTypesList !$= "")
%objective.gameType = %object.missionTypesList;
%objective.position = %objective.location;
return %objective;
}
//--------------------------------------------------------------------------------------------------------
function AIflagObjectiveInit(%flag)
{
%homeTeam = %flag.team;
if(%homeTeam == 1)
%enemyTeam = 2;
else
%enemyTeam = 1;
if(%flag.missionTypesList !$= "")
{
%missionSpecific = true;
%misType = %flag.missionTypesList;
}
%newObjective = new AIObjective(AIODefendLocation)
{
dataBlock = "AIObjectiveMarker";
weightLevel1 = $AIWeightDefendFlag[1];
weightLevel2 = $AIWeightDefendFlag[2];
description = "Defend our flag";
targetObject = %flag.getName();
targetObjectId = %flag;
targetClientId = -1;
location = %flag.getWorldBoxCenter();
defense = true;
desiredEquipment = "ShieldPack Plasma PlasmaAmmo";
buyEquipmentSet = "HeavyShieldSet";
chat = "ChatSelfDefendFlag DefendBase";
};
if(%missionSpecific)
%newObjective.gameType = %misType;
else
%newObjective.gameType = "all";
%newObjective.position = %newObjective.location;
addAIObjective(%homeTeam, %newObjective);
%newObjective = new AIObjective(AIOTouchObject)
{
dataBlock = "AIObjectiveMarker";
weightLevel1 = $AIWeightGrabFlag[1];
weightLevel2 = $AIWeightGrabFlag[2];
description = "Grab the enemy flag";
targetObject = %flag.getName();
targetObjectId = %flag;
targetClientId = -1;
location = %flag.getWorldBoxCenter();
mode = "FlagGrab";
offense = true;
desiredEquipment = "Light EnergyPack";
buyEquipmentSet = "LightEnergyDefault";
};
if(%missionSpecific)
%newObjective.gameType = %misType;
else
%newObjective.gameType = "all";
%newObjective.position = %newObjective.location;
addAIObjective(%enemyTeam, %newObjective);
//NOTE: for this objective, we need to fill in the targetClientId when the flag is taken
%newObjective = new AIObjective(AIOAttackPlayer)
{
dataBlock = "AIObjectiveMarker";
weightLevel1 = $AIWeightKillFlagCarrier[1];
weightLevel2 = $AIWeightKillFlagCarrier[2];
description = "Kill the enemy flag carrier";
mode = "FlagCarrier";
targetObject = %flag.getName();
targetObjectId = -1;
targetClientId = -1;
offense = true;
desiredEquipment = "Light EnergyPack";
buyEquipmentSet = "LightEnergySniper";
};
if(%missionSpecific)
%newObjective.gameType = %misType;
else
%newObjective.gameType = "all";
%newObjective.position = %flag.getWorldBoxCenter();
addAIObjective(%homeTeam, %newObjective);
//NOTE: for this objective, we need to fill in the location when the flag is grabbed
%newObjective = new AIObjective(AIOTouchObject)
{
dataBlock = "AIObjectiveMarker";
weightLevel1 = $AIWeightCapFlag[1];
weightLevel2 = $AIWeightCapFlag[2];
description = "Capture the flag!";
targetObject = %flag.getName();
targetObjectId = %flag;
targetClientId = -1;
mode = "FlagCapture";
offense = true;
defense = true;
};
if(%missionSpecific)
%newObjective.gameType = %misType;
else
%newObjective.gameType = "all";
%newObjective.position = %flag.getWorldBoxCenter();
addAIObjective(%enemyTeam, %newObjective);
%newObjective = new AIObjective(AIOTouchObject)
{
dataBlock = "AIObjectiveMarker";
weightLevel1 = $AIWeightReturnFlag[1];
weightLevel2 = $AIWeightReturnFlag[2];
description = "Return our flag";
targetObject = %flag.getName();
targetObjectId = %flag;
targetClientId = -1;
location = %flag.getWorldBoxCenter();
mode = "FlagDropped";
offense = true;
defense = true;
};
if(%missionSpecific)
%newObjective.gameType = %misType;
else
%newObjective.gameType = "all";
%newObjective.position = %newObjective.location;
addAIObjective(%homeTeam, %newObjective);
%newObjective = new AIObjective(AIOTouchObject)
{
dataBlock = "AIObjectiveMarker";
weightLevel1 = $AIWeightReturnFlag[1];
weightLevel2 = $AIWeightReturnFlag[2];
description = "Grab the dropped enemy flag";
targetObject = %flag.getName();
targetObjectId = %flag;
targetClientId = -1;
mode = "FlagDropped";
offense = true;
defense = true;
};
if(%missionSpecific)
%newObjective.gameType = %misType;
else
%newObjective.gameType = "all";
%newObjective.position = %flag.getWorldBoxCenter();
addAIObjective(%enemyTeam, %newObjective);
}
//--------------------------------------------------------------------------------------------------------
function addAIObjective(%team, %objective)
{
if(AIObjectiveExists(%objective, %team) == false)
nameToId("MissionGroup/Teams/team" @ %team @ "/AIObjectives").add(%objective);
else
%objective.delete();
}
//--------------------------------------------------------------------------------------------------------
function AICreateObjectives()
{
messageBoxOkCancel("Build Objectives", "Are you sure you want to build all mission objectives?", "AIBuildObjectives();");
}
function AIBuildObjectives()
{
// make sure there exists our objectives group
for(%i = 0; %i <= Game.numTeams; %i++)
{
%objGroup = nameToId("MissionGroup/Teams/team" @ %i @ "/AIObjectives");
%teamGroup = nameToID("MissionGroup/Teams/team" @ %i);
if(%objGroup <= 0)
{
%set = new SimGroup(AIObjectives);
%teamGroup.add(%set);
}
else
{
// there already exists a folder for AIobjectives
// remove any objectives that are not locked
%count = 0;
while(%objGroup.getCount() && (%count != %objGroup.getCount()))
{
%obj = %objGroup.getObject(%count);
if(!%obj.locked)
%objGroup.remove(%obj);
else
%count++;
}
}
}
for(%k = 0; %k <= Game.numTeams; %k++)
{
%teamGroup = nameToID("MissionGroup/Teams/team" @ %k);
%teamGroup.AIobjectiveInit(false);
}
}
//--------------------------------------------------------------------------------------------------------
function SimGroup::AIobjectiveInit(%this)
{
for(%i = 0; %i < %this.getCount(); %i++)
%this.getObject(%i).AIobjectiveInit();
}
//--------------------------------------------------------------------------------------------------------
function GameBase::AIobjectiveInit(%this)
{
%this.getDataBlock().AIobjectiveInit(%this);
}
//--------------------------------------------------------------------------------------------------------
function AssignName(%object)
{
%root = %object.getDataBlock().getName();
if (%root $= "")
%root = "Unknown";
if (%object.team >= 0)
%newName = "Team" @ %object.team @ %root;
else
%newName = "Unnamed" @ %root;
%i = 1;
while (isObject(%newName @ %i))
%i++;
%object.setName(%newName @ %i);
}
//--------------------------------------------------------------------------------------------------------
function StationInventory::AIobjectiveInit(%data, %object)
{
if(%object.getName() $= "")
AssignName(%object);
AIinventoryObjectiveInit(%object);
}
//--------------------------------------------------------------------------------------------------------
function Generator::AIobjectiveInit(%data, %object)
{
if(%object.getName() $= "")
AssignName(%object);
if(!%object.isUnderTerrain)
AIgeneratorObjectiveInit(%object);
}
//--------------------------------------------------------------------------------------------------------
function TurretData::AIobjectiveInit(%data, %object)
{
if(%object.getName() $= "")
AssignName(%object);
AIturretObjectiveInit(%object);
}
//--------------------------------------------------------------------------------------------------------
function Sensor::AIobjectiveInit(%data, %object)
{
if(%object.getName() $= "")
AssignName(%object);
AIsensorObjectiveInit(%object);
}
//--------------------------------------------------------------------------------------------------------
function Flag::AIobjectiveInit(%data, %object)
{
if(%object.getName() $= "")
AssignName(%object);
AIflagObjectiveInit(%object);
}
//--------------------------------------------------------------------------------------------------------
function FlipFlop::AIobjectiveInit(%data, %object)
{
if(%object.getName() $= "")
AssignName(%object);
AIflipflopObjectiveInit(%object);
}
//--------------------------------------------------------------------------------------------------------
function saveObjectives()
{
for(%i = 1; %i <= 2; %i++)
saveObjectives(%i);
}
//--------------------------------------------------------------------------------------------------------
function saveObjectiveFile(%team)
{
// check for read-only
%fileName = $CurrentMission @ "team" @ %team @ ".cs";
%file = "base/missions/" @ %fileName;
if(!isWriteableFileName(%file))
{
error("Objectives file '" @ %fileName @ "' is not writeable.");
return;
}
// ok, were good to save.
%objectives = nameToId("MissionGroup/Teams/team" @ %team @ "/AIObjectives");
%objectives.save("missions/" @ %fileName);
}
//--------------------------------------------------------------------------------------------------------
function LoadObjectives(%numTeams)
{
for(%i = 1; %i <= %numTeams; %i++)
loadObjectivesFile(%i);
}
//--------------------------------------------------------------------------------------------------------
function LoadObjectivesFile(%team)
{
%file = $CurrentMission @ "team" @ %team;
exec("missions/" @ %file);
%newObjSet = nameToId("MissionCleanup/AIObjectives");
if(%newObjSet > 0)
{
%group = NameToId("MissionGroup/Teams/team" @ %team);
%oldObjSet = NameToId("MissionGroup/Teams/team" @ %team @ "/AIObjectives");
if(%oldObjSet > 0)
{
%oldObjSet.delete();
%group.add(%newObjSet);
}
}
else
error("no objectives file for team" @ %team @ ". Loading defaults...");
}
//--------------------------------------------------------------------------------------------------------
function AIObjectiveExists(%newObjective, %team)
{
%objGroup = nameToId("MissionGroup/Teams/team" @ %team @ "/AIObjectives");
%objCount = %objGroup.getCount();
%exists = false;
for(%i = 0; %i < %objCount; %i++)
{
%obj = %objGroup.getObject(%i);
if(%obj.getName() $= %newObjective.getName())
{
if((%obj.getName() $= "AIOMortarObject") ||
(%obj.getName() $= "AIORepairObject") ||
(%obj.getName() $= "AIOAttackObject") ||
(%obj.getName() $= "AIODefendLocation"))
{
if(%obj.targetObjectId == %newObjective.targetObjectId)
%exists = true;
}
else if((%obj.getName() $= "AIOTouchObject") ||
(%obj.getName() $= "AIOAttackPlayer"))
{
if(%obj.mode $= %newObjective.mode)
if(%obj.description $= %newObjective.description)
%exists = true;
}
}
}
return %exists;
}