Bots now all have an engage task; bots now all have a return flag task; AI engage has some basic engage functionality; began work on the new AI-player interaction system; Bots will spot players via their view cone now

This commit is contained in:
Robert MacGregor 2015-10-05 05:03:45 -04:00
parent 57a25dd872
commit 5e53dd91ef
5 changed files with 342 additions and 6 deletions

View file

@ -20,7 +20,7 @@
function AIEnhancedEscort::initFromObjective(%task, %objective, %client) { }
function AIEnhancedEscort::assume(%task, %client) { %task.setMonitorFreq(1); }
function AIEnhancedEscort::retire(%task, %client) { %client.isMoving = false; %client.manualAim = false; }
function AIEnhancedEscort::weight(%task, %client) { %task.setWeight(1000); }
function AIEnhancedEscort::weight(%task, %client) { %task.setWeight(500); }
function AIEnhancedEscort::monitor(%task, %client)
{
@ -53,7 +53,7 @@ function AIEnhancedEscort::monitor(%task, %client)
function AIEnhancedDefendLocation::initFromObjective(%task, %objective, %client) { }
function AIEnhancedDefendLocation::assume(%task, %client) { %task.setMonitorFreq(1); }
function AIEnhancedDefendLocation::retire(%task, %client) { %client.isMoving = false; }
function AIEnhancedDefendLocation::weight(%task, %client) { %task.setWeight(1000); }
function AIEnhancedDefendLocation::weight(%task, %client) { %task.setWeight(500); }
function AIEnhancedDefendLocation::monitor(%task, %client)
{
@ -103,7 +103,7 @@ function AIEnhancedDefendLocation::monitor(%task, %client)
function AIEnhancedScoutLocation::initFromObjective(%task, %objective, %client) { }
function AIEnhancedScoutLocation::assume(%task, %client) { %task.setMonitorFreq(1); %client.currentNode = -1; }
function AIEnhancedScoutLocation::retire(%task, %client) { }
function AIEnhancedScoutLocation::weight(%task, %client) { %task.setWeight(1000); }
function AIEnhancedScoutLocation::weight(%task, %client) { %task.setWeight(500); }
function AIEnhancedScoutLocation::monitor(%task, %client)
{
@ -159,4 +159,191 @@ function AIEnhancedScoutLocation::monitor(%task, %client)
}
}
}
//------------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------------
// +Param %bot.engangeDistance: The maximum distance at which the bot will go out to
// attack a hostile.
// +Param %bot.engageTarget: A manually assigned engage target to go after.
// +Description: The AIEnhancedEngageTarget is a better implementation of the base
// AI engage logic.
//------------------------------------------------------------------------------------------`
function AIEnhancedEngageTarget::initFromObjective(%task, %objective, %client) { }
function AIEnhancedEngageTarget::assume(%task, %client) { %task.setMonitorFreq(1); }
function AIEnhancedEngageTarget::retire(%task, %client) { }
function AIEnhancedEngageTarget::weight(%task, %client)
{
if (!isObject(%client.engageTarget))
{
%visibleObjects = %client.getObjectsInViewcone($TypeMasks::PlayerObjectType, %client.viewDistance, true);
// Choose the closest target
// TODO: Choose on more advanced metrics like HP
%chosenTarget = -1;
%chosenTargetDistance = 9999;
for (%iteration = 0; %iteration < %visibleObjects.getCount(); %iteration++)
{
%potentialTarget = %visibleObjects.getObject(%iteration);
%potentialTargetDistance = vectorDist(%potentialTarget.getPosition(), %client.player.getPosition());
if (%potentialTarget.client.team != %client.team && %potentialTargetDistance < %chosenTargetDistance)
{
%chosenTargetDistance = %potentialTargetDistance;
%chosenTarget = %potentialTarget;
}
}
%visibleObjects.delete();
%client.engageTarget = %chosenTarget;
}
else
{
// Can we still see them?
%rayCast = containerRayCast(%client.player.getWorldBoxCenter(), %client.engageTarget.getWorldBoxCenter(), -1, %client.player);
%hitObject = getWord(%raycast, 0);
// TODO: Go to the last known position.
if (%hitObject != %client.engageTarget)
%client.engageTarget = -1;
}
if (!isObject(%client.engageTarget) && %client.engageTargetLastPosition $= "")
%task.setWeight(0);
else
%task.setWeight(1000);
}
function AIEnhancedEngageTarget::monitor(%task, %client)
{
if (isObject(%client.engageTarget))
{
%player = %client.player;
%targetDistance = vectorDist(%player.getPosition(), %client.engageTarget.getPosition());
// Firstly, just aim at them for now
%client.aimAt(%client.engageTarget.getWorldBoxCenter());
// What is our current best weapon? Right now we just check target distance and weapon spread.
%bestWeapon = 0;
for (%iteration = 0; %iteration < %player.weaponSlotCount; %iteration++)
{
// Weapons with a decent bit of spread should be used <= 20m
}
%player.selectWeaponSlot(%bestWeapon);
%client.engageTargetLastPosition = %client.engageTarget.getWorldBoxCenter();
%client.isMoving = true;
%client.moveLocation = getRandomPositionOnTerrain(%client.engageTargetLastPosition, 40);
%client.pressFire();
}
else if (%client.engageTargetLastPosition !$= "")
{
%client.isMoving = true;
%client.moveLocation = %client.engageTargetLastPosition;
if (vectorDist(%client.player.getPosition(), %client.engageTargetLastPosition) <= 10)
{
%client.engageTargetLastPosition = "";
%client.isMoving = false;
}
}
}
//------------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------------
// +Param %bot.shouldRearm: A boolean representing whether or not this bot should go
// and rearm.
// +Param %bot.targetInventory: The ID of the inventory station to rearm at.
//------------------------------------------------------------------------------------------`
function AIEnhancedRearmTask::initFromObjective(%task, %objective, %client) { }
function AIEnhancedRearmTask::assume(%task, %client) { %task.setMonitorFreq(1); }
function AIEnhancedRearmTask::retire(%task, %client) { }
function AIEnhancedRearmTask::weight(%task, %client)
{
if (%client.shouldRearm)
%task.setWeight(600);
else
%task.setWeight(0);
}
function AIEnhancedRearmTask::monitor(%task, %client)
{
if (!isObject(%client.targetInventory))
%client.targetInventory = %client.getClosestInventory();
if (isObject(%client.targetInventory))
{
// Politely wait if someone is already on it.
if (vectorDist(%client.targetInventory.getPosition(), %client.player.getPosition()) <= 7 && isObject(%client.targetInventory.triggeredBy))
%client.isMoving = false;
else
{
%client.isMoving = true;
%client.moveLocation = %client.targetInventory.getPosition();
}
}
else
%client.shouldRearm = false; // No inventories?
}
//------------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------------
// Description: A task that actually makes the bots return a flag that's nearby.
//------------------------------------------------------------------------------------------`
function AIEnhancedReturnFlagTask::initFromObjective(%task, %objective, %client) { }
function AIEnhancedReturnFlagTask::assume(%task, %client) { %task.setMonitorFreq(1); }
function AIEnhancedReturnFlagTask::retire(%task, %client) { }
function AIEnhancedReturnFlagTask::weight(%task, %client)
{
%flag = nameToID("Team" @ %client.team @ "Flag1");
if (!isObject(%flag) || %flag.isHome)
{
%task.setWeight(0);
%client.targetFlag = -1;
%client.isMoving = false;
}
else
{
// TODO: For now, all the bots go after it! Make this check if the bot is range.
%task.setWeight(700);
%client.targetFlag = %flag;
}
}
function AIEnhancedReturnFlagTask::monitor(%task, %client)
{
if (!isObject(%client.targetFlag))
return;
// TODO: Make the bot engage the flag runner if its currently held.
%client.isMoving = true;
%client.moveLocation = %client.targetFlag.getPosition();
}
//------------------------------------------------------------------------------------------
function ObjectiveNameToVoice(%objective)
{
%result = "avo.grunt";
switch$(%objective)
{
case "AIEnhancedReturnFlagTask":
%result = "slf.def.flag";
case "AIEnhancedRearmTask":
%result = "avo.grunt";
case "AIEnhancedEngageTarget":
%result = "slf.att.attack";
case "AIEnhancedScoutLocation":
%result = "slf.def.defend";
case "AIEnhancedEscort":
%result = "slf.tsk.cover";
}
return %result;
}