mirror of
https://github.com/InfinityLoader/IL-GSC.git
synced 2025-06-07 17:17:50 -05:00
305 lines
7.0 KiB
Plaintext
305 lines
7.0 KiB
Plaintext
|
||
#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 ()
|
||
{
|
||
}
|
||
|
||
|