IL-GSC/BO1/PC/ZM/animscripts/battlechatter_ai.gsc
2024-02-18 17:32:07 -05:00

305 lines
7.0 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include common_scripts\utility;
#include animscripts\utility;
#include animscripts\battlechatter;
isHero()
{
return self.npcID == "bar" ||
self.npcID == "lew";
}
addToSystem (squadName)
{
}
aiThreadThreader()
{
self endon ( "death" );
self endon ( "removed from battleChatter" );
assert(IsDefined(self.isSpeaking));
waitTime = 0.5;
wait ( waitTime );
self thread aiGrenadeDangerWaiter();
self thread aiFollowOrderWaiter();
if (self.team == "allies" )
{
wait ( waitTime );
self thread aiFlankerWaiter();
self thread aiDisplaceWaiter();
}
wait ( waitTime );
self thread aiBattleChatterLoop();
}
setNPCID()
{
assert (!IsDefined( self.npcID ) );
usedIDs = anim.usedIDs[self.voice];
numIDs = usedIDs.size;
startIndex = randomIntRange( 0, numIDs );
lowestID = startIndex;
for ( index = 0; index <= numIDs; index++ )
{
if ( usedIDs[(startIndex+index)%numIDs].count < usedIDs[lowestID].count )
{
lowestID = ( startIndex + index ) % numIDs;
}
}
self thread npcIDTracker( lowestID );
self.npcID = usedIDs[lowestID].npcID;
}
npcIDTracker( lowestID )
{
voice = self.voice;
anim.usedIDs[voice][lowestID].count++;
self waittill ( "death" );
if ( !bcsEnabled() )
{
return;
}
anim.usedIDs[voice][lowestID].count--;
}
aiBattleChatterLoop()
{
}
aiNameAndRankWaiter()
{
self endon ("death");
self endon ("removed from battleChatter");
while (1)
{
self.bcName = self animscripts\battlechatter::getName();
self.bcRank = self animscripts\battlechatter::getRank();
self waittill ("set name and rank");
}
}
removeFromSystem (squadName)
{
}
init_aiBattleChatter ()
{
self.chatQueue = [];
self.chatQueue["threat"] = SpawnStruct();
self.chatQueue["threat"].expireTime = 0;
self.chatQueue["threat"].priority = 0.0;
self.chatQueue["response"] = SpawnStruct();
self.chatQueue["response"].expireTime = 0;
self.chatQueue["response"].priority = 0.0;
self.chatQueue["reaction"] = SpawnStruct();
self.chatQueue["reaction"].expireTime = 0;
self.chatQueue["reaction"].priority = 0.0;
self.chatQueue["inform"] = SpawnStruct();
self.chatQueue["inform"].expireTime = 0;
self.chatQueue["inform"].priority = 0.0;
self.chatQueue["order"] = SpawnStruct();
self.chatQueue["order"].expireTime = 0;
self.chatQueue["order"].priority = 0.0;
self.chatQueue["custom"] = SpawnStruct();
self.chatQueue["custom"].expireTime = 0;
self.chatQueue["custom"].priority = 0.0;
self.nextSayTime = GetTime() + 50;
self.nextSayTimes["threat"] = 0;
self.nextSayTimes["reaction"] = 0;
self.nextSayTimes["response"] = 0;
self.nextSayTimes["inform"] = 0;
self.nextSayTimes["order"] = 0;
self.nextSayTimes["custom"] = 0;
self.isSpeaking = false;
self.bcs_minPriority = 0.0;
if (IsDefined (self.script_battlechatter) && !self.script_battlechatter)
{
self.battleChatter = false;
}
else
{
self.battleChatter = level.battlechatter[self.team];
}
self.chatInitialized = true;
}
squadOfficerWaiter(){}
getThreats(potentialThreats){}
squadThreatWaiter(){}
flexibleThreatWaiter(){}
filterThreats(potentialThreats){}
randomThreatWaiter(){}
aiThreatWaiter(){}
aiGrenadeDangerWaiter(){}
aiFlankerWaiter(){}
aiFlankerOrderWaiter(){}
aiDisplaceWaiter(){}
portableMG42Waiter(){}
aiFollowOrderWaiter(){}
evaluateSuppressionEvent(){}
addThreatEvent( a,b,c ) {}
endCustomEvent( x ){}
addGenericAliasEx(a,b,c){}
aiDeathFriendly ()
{
attacker = self.attacker;
if (IsDefined (self))
{
for (i = 0; i < self.squad.members.size; i++)
{
if (IsAlive(self.squad.members[i])
&& self.squad.members[i] cansee(self)
&& distance(self.origin,self.squad.members[i].origin) < 500)
{
self.squad.members[i].bcFriendDeathTime = GetTime();
}
}
}
}
aiDeathEnemy ()
{
attacker = self.attacker;
if (!IsAlive (attacker) || !IsSentient (attacker) || !IsDefined (attacker.squad))
{
return;
}
if (IsDefined (self.calledOut[attacker.squad.squadName]) &&
IsAlive (self.calledOut[attacker.squad.squadName].spotter) &&
self.calledOut[attacker.squad.squadName].spotter != attacker &&
GetTime() < self.calledOut[attacker.squad.squadName].expireTime)
{
attacker.bcKillTime = GetTime();
}
else if (!IsPlayer(attacker))
{
attacker.bcKillTime = GetTime();
}
}
addOrder(type, modifier)
{
self.bcOrderType = type;
self.bcOrderModifier = modifier;
self.bcOrderTime = GetTime();
}
evaluateMoveEvent (leavingCover)
{
}
evaluateReloadEvent()
{
}
evaluateMeleeEvent()
{
}
evaluateFiringEvent()
{
}
evaluateAttackEvent(type)
{
}
addSituationalOrder()
{
self endon ("death");
self endon ("removed from battleChatter");
if (!IsDefined (self.squad.chatInitialized))
{
return;
}
if (self.squad.squadStates["combat"].isActive)
{
self addSituationalCombatOrder();
}
else
{
self addSituationalIdleOrder();
}
}
addSituationalIdleOrder()
{
self endon ("death");
self endon ("removed from battleChatter");
squad = self.squad;
squad animscripts\squadmanager::updateStates();
if (squad.squadStates["move"].isActive)
{
self addOrder ("move", "generic");
}
}
addSituationalCombatOrder()
{
self endon ("death");
self endon ("removed from battleChatter");
squad = self.squad;
squad animscripts\squadmanager::updateStates();
if (squad.squadStates["suppressed"].isActive)
{
if (squad.squadStates["move"].isActive)
{
self addOrder("cover", "generic");
}
else if (squad.squadStates["cover"].isActive)
{
self addOrder("action", "grenade");
}
else
{
self addOrder("cover", "generic");
}
}
else
{
if ( self.team == "allies" )
{
soldiers = GetAIArray( "axis" );
}
else
{
soldiers = GetAIArray( "allies");
}
closestSoldier = undefined;
closestSoldierDistance = 1000000000;
closestSoldierInCover = undefined;
closestSoldierInCoverDistance = 1000000000;
closestSoldierInCoverLocation = undefined;
for (index = 0; index < soldiers.size; index++)
{
soldier = soldiers[index];
distance = DistanceSquared(self.origin, soldier.origin);
if(closestSoldierDistance > distance)
{
closestSoldierDistance = distance;
closestSoldier = soldier;
}
if(soldier isClaimedNodeCover())
{
if(closestSoldierInCoverDistance > distance)
{
closestSoldierInCover = soldier;
closestSoldierInCoverDistance = distance;
}
}
}
if(IsDefined(closestSoldierInCover))
{
node = closestSoldierInCover bcGetClaimedNode();
if(IsDefined(node) && IsDefined(node.script_location))
{
closestSoldierInCoverLocation = node.script_location;
}
}
if(self canshootenemy())
{
if(squad.squadStates["attacking"].isActive)
{
if(RandomFloatRange(0,1) < .3)
{
self addOrder("action", "boost");
}
if(RandomFloatRange(0,1) < .3)
{
self addOrder("action", "supress");
}
else
{
self addOrder("attack", "infantry");
}
}
}
else
{
}
}
}
beginCustomEvent ()
{
}