1215 lines
29 KiB
Plaintext
1215 lines
29 KiB
Plaintext
// IW6 GSC SOURCE
|
|
// Generated by https://github.com/xensik/gsc-tool
|
|
|
|
addtosystem( var_0 )
|
|
{
|
|
self endon( "death" );
|
|
|
|
if ( !animscripts\battlechatter::bcsenabled() )
|
|
return;
|
|
|
|
if ( self.chatinitialized )
|
|
return;
|
|
|
|
if ( !isdefined( self.squad.chatinitialized ) || !self.squad.chatinitialized )
|
|
self.squad animscripts\battlechatter::init_squadbattlechatter();
|
|
|
|
self.enemyclass = "infantry";
|
|
self.calledout = [];
|
|
|
|
if ( isplayer( self ) )
|
|
{
|
|
self.battlechatter = 0;
|
|
self.flavorbursts = 0;
|
|
self.type = "human";
|
|
return;
|
|
}
|
|
|
|
if ( self.type == "dog" )
|
|
{
|
|
self.enemyclass = undefined;
|
|
self.battlechatter = 0;
|
|
self.flavorbursts = 0;
|
|
return;
|
|
}
|
|
|
|
if ( self.team == "neutral" )
|
|
{
|
|
self.enemyclass = undefined;
|
|
self.battlechatter = 0;
|
|
self.flavorbursts = 0;
|
|
return;
|
|
}
|
|
|
|
if ( forceenglish() )
|
|
{
|
|
if ( self.team == "allies" )
|
|
self.script_battlechatter = 0;
|
|
else
|
|
self.voice = "american";
|
|
}
|
|
|
|
self.countryid = anim.countryids[self.voice];
|
|
assign_npcid();
|
|
thread ainameandrankwaiter();
|
|
init_aibattlechatter();
|
|
thread aithreadthreader();
|
|
}
|
|
|
|
assign_npcid()
|
|
{
|
|
if ( isdefined( self.script_friendname ) )
|
|
{
|
|
var_0 = tolower( self.script_friendname );
|
|
|
|
if ( issubstr( var_0, "hesh" ) )
|
|
{
|
|
self.npcid = "hsh";
|
|
return;
|
|
}
|
|
|
|
if ( issubstr( var_0, "keegan" ) )
|
|
{
|
|
self.npcid = "kgn";
|
|
return;
|
|
}
|
|
|
|
if ( issubstr( var_0, "merrick" ) )
|
|
{
|
|
self.npcid = "mrk";
|
|
return;
|
|
}
|
|
|
|
if ( issubstr( var_0, "elias" ) )
|
|
{
|
|
self.npcid = "els";
|
|
return;
|
|
}
|
|
|
|
if ( issubstr( var_0, "rorke" ) )
|
|
{
|
|
self.npcid = "rke";
|
|
return;
|
|
}
|
|
|
|
if ( issubstr( var_0, "ajax" ) )
|
|
{
|
|
self.npcid = "1";
|
|
return;
|
|
}
|
|
|
|
if ( issubstr( var_0, "kick" ) )
|
|
{
|
|
self.npcid = "0";
|
|
return;
|
|
}
|
|
|
|
setnpcid();
|
|
return;
|
|
return;
|
|
return;
|
|
return;
|
|
return;
|
|
return;
|
|
return;
|
|
}
|
|
else
|
|
setnpcid();
|
|
}
|
|
|
|
forceenglish()
|
|
{
|
|
if ( !getdvarint( "bcs_forceEnglish", 0 ) )
|
|
return 0;
|
|
|
|
switch ( level.script )
|
|
{
|
|
case "pmc_strike":
|
|
return 1;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
aithreadthreader()
|
|
{
|
|
self endon( "death" );
|
|
self endon( "removed from battleChatter" );
|
|
var_0 = 0.5;
|
|
wait( var_0 );
|
|
thread aigrenadedangerwaiter();
|
|
thread aifolloworderwaiter();
|
|
|
|
if ( self.team == "allies" )
|
|
{
|
|
wait( var_0 );
|
|
thread aidisplacewaiter();
|
|
|
|
if ( self.countryid == "CZ" )
|
|
thread aihostileburstloop();
|
|
}
|
|
else if ( ( self.team == "axis" || self.team == "team3" ) && !isalliedcountryid( self.countryid ) )
|
|
thread aihostileburstloop();
|
|
|
|
if ( self.team == level.player.team )
|
|
thread player_friendlyfire_waiter();
|
|
|
|
wait( var_0 );
|
|
thread aibattlechatterloop();
|
|
}
|
|
|
|
isalliedcountryid( var_0 )
|
|
{
|
|
if ( var_0 == "UK" || var_0 == "US" || var_0 == "NS" || var_0 == "TF" || var_0 == "SS" )
|
|
return 1;
|
|
|
|
return 0;
|
|
}
|
|
|
|
setnpcid()
|
|
{
|
|
var_0 = anim.usedids[self.voice];
|
|
var_1 = var_0.size;
|
|
var_2 = randomintrange( 0, var_1 );
|
|
var_3 = var_2;
|
|
|
|
for ( var_4 = 0; var_4 <= var_1; var_4++ )
|
|
{
|
|
if ( var_0[( var_2 + var_4 ) % var_1].count < var_0[var_3].count )
|
|
var_3 = ( var_2 + var_4 ) % var_1;
|
|
}
|
|
|
|
thread npcidtracker( var_3 );
|
|
self.npcid = var_0[var_3].npcid;
|
|
}
|
|
|
|
npcidtracker( var_0 )
|
|
{
|
|
anim.usedids[self.voice][var_0].count++;
|
|
common_scripts\utility::waittill_either( "death", "removed from battleChatter" );
|
|
|
|
if ( !animscripts\battlechatter::bcsenabled() )
|
|
return;
|
|
|
|
anim.usedids[self.voice][var_0].count--;
|
|
}
|
|
|
|
aihostileburstloop()
|
|
{
|
|
self endon( "death" );
|
|
self endon( "removed from battleChatter" );
|
|
wait 2;
|
|
|
|
for (;;)
|
|
{
|
|
if ( distancesquared( self.origin, level.player.origin ) < 1048576 )
|
|
{
|
|
if ( isdefined( self.squad.membercount ) && self.squad.membercount > 1 )
|
|
addreactionevent( "taunt", "hostileburst" );
|
|
}
|
|
|
|
wait( randomfloatrange( 2, 5 ) );
|
|
}
|
|
}
|
|
|
|
aibattlechatterloop()
|
|
{
|
|
self endon( "death" );
|
|
self endon( "removed from battleChatter" );
|
|
|
|
for (;;)
|
|
{
|
|
animscripts\battlechatter::playbattlechatter();
|
|
wait( 0.3 + randomfloat( 0.2 ) );
|
|
}
|
|
}
|
|
|
|
ainameandrankwaiter()
|
|
{
|
|
self endon( "death" );
|
|
self endon( "removed from battleChatter" );
|
|
|
|
for (;;)
|
|
{
|
|
self.bcname = animscripts\battlechatter::getname();
|
|
self.bcrank = animscripts\battlechatter::getrank();
|
|
self waittill( "set name and rank" );
|
|
}
|
|
}
|
|
|
|
removefromsystem( var_0 )
|
|
{
|
|
if ( !isalive( self ) && animscripts\battlechatter::bcsenabled() )
|
|
{
|
|
if ( isdefined( self ) )
|
|
{
|
|
aideathfriendly();
|
|
aideathenemy();
|
|
}
|
|
}
|
|
|
|
if ( isdefined( self ) )
|
|
{
|
|
self.battlechatter = 0;
|
|
self.chatinitialized = 0;
|
|
}
|
|
|
|
self notify( "removed from battleChatter" );
|
|
|
|
if ( isdefined( self ) )
|
|
{
|
|
self.chatqueue = undefined;
|
|
self.nextsaytime = undefined;
|
|
self.nextsaytimes = undefined;
|
|
self.isspeaking = undefined;
|
|
self.enemyclass = undefined;
|
|
self.calledout = undefined;
|
|
self.countryid = undefined;
|
|
self.npcid = undefined;
|
|
}
|
|
}
|
|
|
|
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 = 0;
|
|
self.bcs_minpriority = 0.0;
|
|
self.allowedcallouts = [];
|
|
|
|
if ( common_scripts\utility::get_template_level() == "loki" )
|
|
{
|
|
animscripts\battlechatter::addallowedthreatcallout( "ai_contact_clock" );
|
|
animscripts\battlechatter::addallowedthreatcallout( "ai_obvious" );
|
|
}
|
|
else
|
|
{
|
|
animscripts\battlechatter::addallowedthreatcallout( "rpg" );
|
|
animscripts\battlechatter::addallowedthreatcallout( "exposed" );
|
|
animscripts\battlechatter::addallowedthreatcallout( "ai_contact_clock" );
|
|
animscripts\battlechatter::addallowedthreatcallout( "ai_target_clock" );
|
|
animscripts\battlechatter::addallowedthreatcallout( "ai_cardinal" );
|
|
|
|
if ( self.team == "allies" )
|
|
{
|
|
if ( common_scripts\utility::array_contains( anim.playernameids, self.voice ) )
|
|
{
|
|
animscripts\battlechatter::addallowedthreatcallout( "player_contact_clock" );
|
|
animscripts\battlechatter::addallowedthreatcallout( "player_target_clock" );
|
|
animscripts\battlechatter::addallowedthreatcallout( "player_cardinal" );
|
|
animscripts\battlechatter::addallowedthreatcallout( "player_obvious" );
|
|
animscripts\battlechatter::addallowedthreatcallout( "player_object_clock" );
|
|
animscripts\battlechatter::addallowedthreatcallout( "player_location" );
|
|
}
|
|
|
|
animscripts\battlechatter::addallowedthreatcallout( "ai_location" );
|
|
animscripts\battlechatter::addallowedthreatcallout( "generic_location" );
|
|
|
|
if ( self.voice == "delta" || self.voice == "taskforce" || self.voice == "seal" )
|
|
{
|
|
animscripts\battlechatter::addallowedthreatcallout( "ai_obvious" );
|
|
animscripts\battlechatter::addallowedthreatcallout( "ai_casual_clock" );
|
|
animscripts\battlechatter::addallowedthreatcallout( "concat_location" );
|
|
animscripts\battlechatter::addallowedthreatcallout( "concat_location" );
|
|
animscripts\battlechatter::addallowedthreatcallout( "player_distance" );
|
|
animscripts\battlechatter::addallowedthreatcallout( "player_target_clock_high" );
|
|
animscripts\battlechatter::addallowedthreatcallout( "ai_distance" );
|
|
animscripts\battlechatter::addallowedthreatcallout( "ai_target_clock_high" );
|
|
}
|
|
}
|
|
}
|
|
|
|
if ( isdefined( self.script_battlechatter ) && !self.script_battlechatter )
|
|
self.battlechatter = 0;
|
|
else
|
|
self.battlechatter = level.battlechatter[self.team];
|
|
|
|
if ( animscripts\battlechatter::voicecanburst() )
|
|
self.flavorbursts = 1;
|
|
else
|
|
self.flavorbursts = 0;
|
|
|
|
if ( level.friendlyfire_warnings )
|
|
maps\_utility::set_friendlyfire_warnings( 1 );
|
|
else
|
|
maps\_utility::set_friendlyfire_warnings( 0 );
|
|
|
|
self.chatinitialized = 1;
|
|
}
|
|
|
|
addthreatevent( var_0, var_1, var_2 )
|
|
{
|
|
self endon( "death" );
|
|
self endon( "removed from battleChatter" );
|
|
|
|
if ( !animscripts\battlechatter::cansay( "threat", var_0, var_2 ) )
|
|
return;
|
|
|
|
if ( animscripts\battlechatter::threatwasalreadycalledout( var_1 ) && !isplayer( var_1 ) )
|
|
return;
|
|
|
|
var_3 = animscripts\battlechatter::createchatevent( "threat", var_0, var_2 );
|
|
|
|
switch ( var_0 )
|
|
{
|
|
case "infantry":
|
|
var_3.threat = var_1;
|
|
break;
|
|
}
|
|
|
|
if ( isdefined( var_1.squad ) )
|
|
self.squad animscripts\battlechatter::updatecontact( var_1.squad.squadname, self );
|
|
|
|
self.chatqueue["threat"] = undefined;
|
|
self.chatqueue["threat"] = var_3;
|
|
}
|
|
|
|
addresponseevent( var_0, var_1, var_2, var_3, var_4, var_5 )
|
|
{
|
|
thread addresponseevent_internal( var_0, var_1, var_2, var_3, var_4, var_5 );
|
|
}
|
|
|
|
addresponseevent_internal( var_0, var_1, var_2, var_3, var_4, var_5 )
|
|
{
|
|
self endon( "death" );
|
|
self endon( "removed from battleChatter" );
|
|
self endon( "responseEvent_failsafe" );
|
|
thread responseevent_failsafe( var_2 );
|
|
var_6 = var_2 common_scripts\utility::waittill_any_return( "death", "done speaking", "cancel speaking" );
|
|
|
|
if ( var_6 == "cancel speaking" )
|
|
return;
|
|
|
|
if ( !isalive( var_2 ) )
|
|
return;
|
|
|
|
if ( !animscripts\battlechatter::cansay( "response", var_0, var_3, var_1 ) )
|
|
return;
|
|
|
|
if ( !isplayer( var_2 ) )
|
|
{
|
|
if ( animscripts\battlechatter::isusingsamevoice( var_2 ) )
|
|
return;
|
|
}
|
|
|
|
var_7 = animscripts\battlechatter::createchatevent( "response", var_0, var_3 );
|
|
|
|
if ( isdefined( var_4 ) )
|
|
var_7.reportalias = var_4;
|
|
|
|
if ( isdefined( var_5 ) )
|
|
var_7.location = var_5;
|
|
|
|
var_7.respondto = var_2;
|
|
var_7.modifier = var_1;
|
|
self.chatqueue["response"] = undefined;
|
|
self.chatqueue["response"] = var_7;
|
|
}
|
|
|
|
responseevent_failsafe( var_0 )
|
|
{
|
|
self endon( "death" );
|
|
self endon( "removed from battleChatter" );
|
|
var_0 endon( "death" );
|
|
var_0 endon( "done speaking" );
|
|
var_0 endon( "cancel speaking" );
|
|
wait 25;
|
|
self notify( "responseEvent_failsafe" );
|
|
}
|
|
|
|
addinformevent( var_0, var_1, var_2, var_3 )
|
|
{
|
|
self endon( "death" );
|
|
self endon( "removed from battleChatter" );
|
|
|
|
if ( !animscripts\battlechatter::cansay( "inform", var_0, var_3, var_1 ) )
|
|
return;
|
|
|
|
var_4 = animscripts\battlechatter::createchatevent( "inform", var_0, var_3 );
|
|
|
|
switch ( var_0 )
|
|
{
|
|
case "reloading":
|
|
var_4.modifier = var_1;
|
|
var_4.informto = var_2;
|
|
break;
|
|
default:
|
|
var_4.modifier = var_1;
|
|
}
|
|
|
|
self.chatqueue["inform"] = undefined;
|
|
self.chatqueue["inform"] = var_4;
|
|
}
|
|
|
|
addreactionevent( var_0, var_1, var_2, var_3 )
|
|
{
|
|
self endon( "death" );
|
|
self endon( "removed from battleChatter" );
|
|
|
|
if ( !isdefined( self.chatqueue ) )
|
|
return;
|
|
|
|
var_4 = animscripts\battlechatter::createchatevent( "reaction", var_0, var_3 );
|
|
var_4.reactto = var_2;
|
|
var_4.modifier = var_1;
|
|
self.chatqueue["reaction"] = undefined;
|
|
self.chatqueue["reaction"] = var_4;
|
|
}
|
|
|
|
addorderevent( var_0, var_1, var_2, var_3 )
|
|
{
|
|
self endon( "death" );
|
|
self endon( "removed from battleChatter" );
|
|
|
|
if ( !animscripts\battlechatter::cansay( "order", var_0, var_3, var_1 ) )
|
|
return;
|
|
|
|
if ( isdefined( var_2 ) && var_2.type == "dog" )
|
|
return;
|
|
|
|
var_4 = animscripts\battlechatter::createchatevent( "order", var_0, var_3 );
|
|
var_4.modifier = var_1;
|
|
var_4.orderto = var_2;
|
|
self.chatqueue["order"] = undefined;
|
|
self.chatqueue["order"] = var_4;
|
|
}
|
|
|
|
squadofficerwaiter()
|
|
{
|
|
anim endon( "battlechatter disabled" );
|
|
anim endon( "squad deleted " + self.squadname );
|
|
|
|
for (;;)
|
|
{
|
|
var_0 = undefined;
|
|
|
|
if ( self.officers.size )
|
|
var_1 = self.officers;
|
|
else
|
|
var_1 = self.members;
|
|
|
|
var_2 = [];
|
|
|
|
foreach ( var_4 in var_1 )
|
|
{
|
|
if ( isalive( var_4 ) )
|
|
var_2[var_2.size] = var_4;
|
|
}
|
|
|
|
if ( var_2.size )
|
|
{
|
|
var_0 = common_scripts\utility::getclosest( level.player.origin, var_2 );
|
|
var_0 aiofficerorders();
|
|
var_0 waittill( "death" );
|
|
}
|
|
|
|
wait 3.0;
|
|
}
|
|
}
|
|
|
|
getthreatsovertime( var_0, var_1 )
|
|
{
|
|
var_2 = var_0.size;
|
|
|
|
if ( var_2 == 0 )
|
|
{
|
|
wait( var_1 );
|
|
return var_0;
|
|
}
|
|
|
|
var_3 = var_1 * 20;
|
|
var_4 = var_2 / var_3;
|
|
var_5 = [];
|
|
|
|
for ( var_6 = 0; var_6 < var_2; var_6++ )
|
|
{
|
|
var_7 = var_0[var_6];
|
|
|
|
if ( !isdefined( var_7.enemyclass ) )
|
|
continue;
|
|
|
|
var_5[var_5.size] = var_0[var_6];
|
|
}
|
|
|
|
if ( var_5.size == 0 )
|
|
{
|
|
wait( var_1 );
|
|
return var_5;
|
|
}
|
|
|
|
var_5 = sortbydistance( var_5, level.player.origin );
|
|
var_8 = [];
|
|
var_9 = [];
|
|
var_10 = 0;
|
|
|
|
foreach ( var_12 in var_5 )
|
|
{
|
|
if ( isdefined( var_12 ) && threatisviable( var_12 ) )
|
|
{
|
|
var_13 = var_12 animscripts\battlechatter::getlocation();
|
|
|
|
if ( isdefined( var_13 ) && !animscripts\battlechatter::location_called_out_recently( var_13 ) )
|
|
var_8[var_8.size] = var_12;
|
|
else
|
|
var_9[var_9.size] = var_12;
|
|
}
|
|
|
|
var_10++;
|
|
|
|
if ( var_10 >= var_4 )
|
|
{
|
|
wait 0.05;
|
|
var_10 = 0;
|
|
}
|
|
}
|
|
|
|
var_5 = [];
|
|
|
|
foreach ( var_16 in var_8 )
|
|
var_5[var_5.size] = var_16;
|
|
|
|
foreach ( var_16 in var_9 )
|
|
var_5[var_5.size] = var_16;
|
|
|
|
return var_5;
|
|
}
|
|
|
|
threatisviable( var_0 )
|
|
{
|
|
if ( distancesquared( level.player.origin, var_0.origin ) > level.bcs_maxthreatdistsqrdfromplayer )
|
|
return 0;
|
|
|
|
if ( !level.player animscripts\battlechatter::entinfrontarc( var_0 ) )
|
|
return 0;
|
|
|
|
return 1;
|
|
}
|
|
|
|
squadthreatwaiter()
|
|
{
|
|
anim endon( "battlechatter disabled" );
|
|
anim endon( "squad deleted " + self.squadname );
|
|
|
|
for (;;)
|
|
{
|
|
if ( self.team == "allies" )
|
|
var_0 = getthreatsovertime( getaiarray( "axis", "team3" ), 0.5 );
|
|
else if ( self.team == "team3" )
|
|
var_0 = getthreatsovertime( getaiarray( "allies", "axis" ), 0.5 );
|
|
else
|
|
{
|
|
wait 0.5;
|
|
var_0 = getaiarray( "allies", "team3" );
|
|
var_0[var_0.size] = level.player;
|
|
}
|
|
|
|
if ( !var_0.size )
|
|
continue;
|
|
|
|
var_1 = [];
|
|
|
|
foreach ( var_11, var_3 in self.members )
|
|
{
|
|
if ( !isalive( var_3 ) )
|
|
continue;
|
|
|
|
if ( !var_0.size )
|
|
{
|
|
var_0 = var_1;
|
|
var_1 = [];
|
|
}
|
|
|
|
foreach ( var_10, var_5 in var_0 )
|
|
{
|
|
if ( !isdefined( var_5 ) )
|
|
{
|
|
if ( var_10 == 0 )
|
|
var_0 = [];
|
|
|
|
continue;
|
|
}
|
|
|
|
if ( !isalive( var_5 ) )
|
|
continue;
|
|
|
|
if ( !isdefined( var_5.enemyclass ) )
|
|
continue;
|
|
|
|
if ( !var_3 cansee( var_5 ) )
|
|
{
|
|
if ( isplayer( var_5 ) )
|
|
continue;
|
|
|
|
if ( var_5.team == level.player.team )
|
|
continue;
|
|
|
|
if ( !maps\_utility::player_can_see_ai( var_5, 250 ) )
|
|
continue;
|
|
}
|
|
|
|
var_3 addthreatevent( var_5.enemyclass, var_5 );
|
|
var_1[var_1.size] = var_5;
|
|
var_6 = [];
|
|
|
|
foreach ( var_8 in var_0 )
|
|
{
|
|
if ( var_8 != var_5 )
|
|
var_6[var_6.size] = var_8;
|
|
}
|
|
|
|
var_0 = var_6;
|
|
break;
|
|
}
|
|
|
|
wait 0.05;
|
|
}
|
|
}
|
|
}
|
|
|
|
aideathfriendly()
|
|
{
|
|
var_0 = self.attacker;
|
|
common_scripts\utility::array_thread( self.squad.members, ::aideatheventthread );
|
|
|
|
if ( isalive( var_0 ) && issentient( var_0 ) && isdefined( var_0.squad ) && var_0.battlechatter )
|
|
{
|
|
if ( isdefined( var_0.calledout[var_0.squad.squadname] ) )
|
|
var_0.calledout[var_0.squad.squadname] = undefined;
|
|
|
|
if ( !isdefined( var_0.enemyclass ) )
|
|
return;
|
|
|
|
if ( !var_0 animscripts\battlechatter::is_in_callable_location() )
|
|
return;
|
|
|
|
foreach ( var_2 in self.squad.members )
|
|
{
|
|
if ( gettime() > var_2.lastenemysighttime + 2000 )
|
|
continue;
|
|
|
|
var_2 addthreatevent( var_0.enemyclass, var_0 );
|
|
}
|
|
}
|
|
}
|
|
|
|
aideatheventthread()
|
|
{
|
|
if ( !isalive( self ) )
|
|
return;
|
|
|
|
self endon( "death" );
|
|
self endon( "removed from battleChatter" );
|
|
self notify( "aiDeathEventThread" );
|
|
self endon( "aiDeathEventThread" );
|
|
wait 1.5;
|
|
addreactionevent( "casualty", "generic", self, 0.9 );
|
|
}
|
|
|
|
aideathenemy()
|
|
{
|
|
var_0 = self.attacker;
|
|
|
|
if ( !isalive( var_0 ) || !issentient( var_0 ) || !isdefined( var_0.squad ) )
|
|
return;
|
|
|
|
if ( !isdefined( var_0.countryid ) )
|
|
return;
|
|
|
|
if ( !isplayer( var_0 ) )
|
|
{
|
|
if ( var_0.countryid == "GS" || var_0.countryid == "GM" || var_0.countryid == "GL" )
|
|
var_0 thread aikilleventthread();
|
|
}
|
|
}
|
|
|
|
aikilleventthread()
|
|
{
|
|
self endon( "death" );
|
|
self endon( "removed from battleChatter" );
|
|
wait 1.5;
|
|
addinformevent( "killfirm", "generic" );
|
|
}
|
|
|
|
aiofficerorders()
|
|
{
|
|
self endon( "death" );
|
|
self endon( "removed from battleChatter" );
|
|
|
|
if ( !isdefined( self.squad.chatinitialized ) )
|
|
self.squad waittill( "squad chat initialized" );
|
|
|
|
for (;;)
|
|
{
|
|
if ( getdvarint( "bcs_enable" ) == 0 )
|
|
{
|
|
wait 1.0;
|
|
continue;
|
|
}
|
|
|
|
addsituationalorder();
|
|
wait( randomfloatrange( 3.0, 6.0 ) );
|
|
}
|
|
}
|
|
|
|
aigrenadedangerwaiter()
|
|
{
|
|
self endon( "death" );
|
|
self endon( "removed from battleChatter" );
|
|
|
|
for (;;)
|
|
{
|
|
self waittill( "grenade danger", var_0 );
|
|
|
|
if ( getdvarint( "bcs_enable" ) == 0 )
|
|
continue;
|
|
|
|
if ( !isdefined( var_0 ) || var_0.model != "projectile_m67fraggrenade" )
|
|
continue;
|
|
|
|
if ( distancesquared( var_0.origin, level.player.origin ) < 262144 )
|
|
addinformevent( "incoming", "grenade" );
|
|
}
|
|
}
|
|
|
|
aidisplacewaiter()
|
|
{
|
|
self endon( "death" );
|
|
self endon( "removed from battleChatter" );
|
|
|
|
for (;;)
|
|
{
|
|
self waittill( "trigger" );
|
|
|
|
if ( getdvarint( "bcs_enable" ) == 0 )
|
|
continue;
|
|
|
|
if ( gettime() < self.a.paintime + 4000 )
|
|
continue;
|
|
|
|
addresponseevent( "ack", "yes", level.player, 1.0 );
|
|
}
|
|
}
|
|
|
|
evaluatemoveevent( var_0 )
|
|
{
|
|
self endon( "death" );
|
|
self endon( "removed from battleChatter" );
|
|
|
|
if ( !animscripts\battlechatter::bcsenabled() )
|
|
return;
|
|
|
|
if ( !isdefined( self.node ) )
|
|
return;
|
|
|
|
if ( distancesquared( self.origin, self.node.origin ) < 262144 )
|
|
return;
|
|
|
|
if ( !animscripts\battlechatter::isnodecoverorconceal() )
|
|
return;
|
|
|
|
if ( !nationalityokformoveorder() )
|
|
return;
|
|
|
|
var_1 = animscripts\battlechatter::getresponder( 24, 1024, "response" );
|
|
|
|
if ( self.team != "axis" && self.team != "team3" )
|
|
{
|
|
if ( !isdefined( var_1 ) )
|
|
var_1 = level.player;
|
|
else if ( randomint( 100 ) < anim.eventchance["moveEvent"]["ordertoplayer"] )
|
|
var_1 = level.player;
|
|
}
|
|
|
|
if ( self.combattime > 0.0 )
|
|
{
|
|
if ( randomint( 100 ) < anim.eventchance["moveEvent"]["coverme"] )
|
|
addorderevent( "action", "coverme", var_1 );
|
|
else
|
|
addorderevent( "move", "combat", var_1 );
|
|
}
|
|
else if ( nationalityokformoveordernoncombat() )
|
|
addorderevent( "move", "noncombat", var_1 );
|
|
}
|
|
|
|
nationalityokformoveorder()
|
|
{
|
|
if ( self.countryid == "SS" )
|
|
return 0;
|
|
|
|
return 1;
|
|
}
|
|
|
|
nationalityokformoveordernoncombat()
|
|
{
|
|
if ( self.countryid == "US" )
|
|
return 1;
|
|
|
|
return 0;
|
|
}
|
|
|
|
aifolloworderwaiter()
|
|
{
|
|
self endon( "death" );
|
|
self endon( "removed from battleChatter" );
|
|
|
|
for (;;)
|
|
{
|
|
level waittill( "follow order", var_0 );
|
|
|
|
if ( !animscripts\battlechatter::bcsenabled() )
|
|
return;
|
|
|
|
if ( !isdefined( var_0 ) )
|
|
continue;
|
|
|
|
if ( !isalive( var_0 ) || var_0.team != self.team )
|
|
continue;
|
|
|
|
if ( distancesquared( self.origin, var_0.origin ) < 360000 )
|
|
addresponseevent( "ack", "yes", var_0, 0.9 );
|
|
}
|
|
}
|
|
|
|
player_friendlyfire_waiter()
|
|
{
|
|
self endon( "death" );
|
|
self endon( "removed from battleChatter" );
|
|
thread player_friendlyfire_waiter_damage();
|
|
|
|
for (;;)
|
|
{
|
|
self waittill( "bulletwhizby", var_0, var_1 );
|
|
|
|
if ( !animscripts\battlechatter::bcsenabled() )
|
|
continue;
|
|
|
|
if ( !isplayer( var_0 ) )
|
|
{
|
|
if ( anim.countryids[self.voice] == "GM" && animscripts\battlechatter::cansay( "reaction", "takingfire", 1.0, undefined ) )
|
|
addreactionevent( "takingfire", undefined, var_0, 1.0 );
|
|
|
|
continue;
|
|
}
|
|
|
|
if ( friendlyfire_whizby_distances_valid( var_0, var_1 ) )
|
|
{
|
|
player_friendlyfire_addreactionevent();
|
|
wait 3;
|
|
}
|
|
}
|
|
}
|
|
|
|
player_friendlyfire_addreactionevent()
|
|
{
|
|
addreactionevent( "friendlyfire", undefined, level.player, 1.0 );
|
|
}
|
|
|
|
player_friendlyfire_waiter_damage()
|
|
{
|
|
self endon( "death" );
|
|
self endon( "removed from battleChatter" );
|
|
|
|
for (;;)
|
|
{
|
|
self waittill( "damage", var_0, var_1, var_2, var_3, var_4 );
|
|
|
|
if ( isdefined( var_1 ) && isplayer( var_1 ) )
|
|
{
|
|
if ( damage_is_valid_for_friendlyfire_warning( var_4 ) )
|
|
player_friendlyfire_addreactionevent();
|
|
}
|
|
}
|
|
}
|
|
|
|
damage_is_valid_for_friendlyfire_warning( var_0 )
|
|
{
|
|
if ( !isdefined( var_0 ) )
|
|
return 0;
|
|
|
|
switch ( var_0 )
|
|
{
|
|
case "MOD_IMPACT":
|
|
case "MOD_CRUSH":
|
|
case "MOD_MELEE":
|
|
case "MOD_GRENADE_SPLASH":
|
|
case "MOD_GRENADE":
|
|
return 0;
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
friendlyfire_whizby_distances_valid( var_0, var_1 )
|
|
{
|
|
var_2 = 65536;
|
|
var_3 = 42;
|
|
|
|
if ( distancesquared( var_0.origin, self.origin ) < var_2 )
|
|
return 0;
|
|
|
|
if ( var_1 > var_3 )
|
|
return 0;
|
|
|
|
return 1;
|
|
}
|
|
|
|
evaluatereloadevent()
|
|
{
|
|
self endon( "death" );
|
|
self endon( "removed from battleChatter" );
|
|
|
|
if ( !animscripts\battlechatter::bcsenabled() )
|
|
return;
|
|
|
|
addinformevent( "reloading", "generic" );
|
|
}
|
|
|
|
evaluatemeleeevent()
|
|
{
|
|
self endon( "death" );
|
|
self endon( "removed from battleChatter" );
|
|
|
|
if ( !animscripts\battlechatter::bcsenabled() )
|
|
return 0;
|
|
|
|
if ( !isdefined( self.enemy ) )
|
|
return 0;
|
|
|
|
return 0;
|
|
}
|
|
|
|
evaluatefiringevent()
|
|
{
|
|
self endon( "death" );
|
|
self endon( "removed from battleChatter" );
|
|
|
|
if ( !animscripts\battlechatter::bcsenabled() )
|
|
return;
|
|
|
|
if ( !isdefined( self.enemy ) )
|
|
return;
|
|
}
|
|
|
|
evaluatesuppressionevent()
|
|
{
|
|
self endon( "death" );
|
|
self endon( "removed from battleChatter" );
|
|
|
|
if ( !animscripts\battlechatter::bcsenabled() )
|
|
return;
|
|
|
|
if ( !self.suppressed )
|
|
return;
|
|
|
|
addinformevent( "suppressed", "generic" );
|
|
}
|
|
|
|
evaluateattackevent( var_0 )
|
|
{
|
|
self endon( "death" );
|
|
self endon( "removed from battleChatter" );
|
|
|
|
if ( !animscripts\battlechatter::bcsenabled() )
|
|
return;
|
|
|
|
addinformevent( "attack", "grenade" );
|
|
}
|
|
|
|
addsituationalorder()
|
|
{
|
|
self endon( "death" );
|
|
self endon( "removed from battleChatter" );
|
|
|
|
if ( self.squad.squadstates["combat"].isactive )
|
|
addsituationalcombatorder();
|
|
}
|
|
|
|
addsituationalcombatorder()
|
|
{
|
|
self endon( "death" );
|
|
self endon( "removed from battleChatter" );
|
|
var_0 = self.squad;
|
|
var_0 animscripts\squadmanager::updatestates();
|
|
|
|
if ( var_0.squadstates["suppressed"].isactive )
|
|
{
|
|
if ( var_0.squadstates["cover"].isactive )
|
|
{
|
|
var_1 = animscripts\battlechatter::getresponder( 96, 512, "response" );
|
|
addorderevent( "action", "grenade", var_1 );
|
|
}
|
|
else
|
|
addorderevent( "displace", "generic" );
|
|
}
|
|
else if ( var_0.squadstates["combat"].isactive )
|
|
{
|
|
if ( self.countryid != "SS" )
|
|
{
|
|
var_1 = animscripts\battlechatter::getresponder( 24, 1024, "response" );
|
|
addorderevent( "action", "suppress", var_1 );
|
|
}
|
|
}
|
|
}
|
|
|
|
custom_battlechatter_init_valid_phrases()
|
|
{
|
|
var_0 = [];
|
|
var_0[var_0.size] = "order_move_combat";
|
|
var_0[var_0.size] = "order_move_noncombat";
|
|
var_0[var_0.size] = "order_action_coverme";
|
|
var_0[var_0.size] = "inform_reloading";
|
|
level.custombcs_validphrases = var_0;
|
|
}
|
|
|
|
custom_battlechatter_validate_phrase( var_0 )
|
|
{
|
|
var_1 = 0;
|
|
|
|
foreach ( var_3 in level.custombcs_validphrases )
|
|
{
|
|
if ( var_3 == var_0 )
|
|
{
|
|
var_1 = 1;
|
|
break;
|
|
}
|
|
}
|
|
|
|
return var_1;
|
|
}
|
|
|
|
get_phraseinvalidstr( var_0 )
|
|
{
|
|
return anim.bcprintfailprefix + "custom battlechatter phrase '" + var_0 + "' isn't valid. look at _utility::custom_battlechatter_init_valid_phrases(), or the util script documentation for custom_battlechatter(), for a list of valid phrases.";
|
|
}
|
|
|
|
get_badcountryidstr( var_0 )
|
|
{
|
|
return anim.bcprintfailprefix + "AI at origin " + self.origin + "wasn't able to play custom battlechatter because his nationality is '" + self.countryid + "'.";
|
|
}
|
|
|
|
custom_battlechatter_internal( var_0 )
|
|
{
|
|
if ( !isdefined( level.custombcs_validphrases ) )
|
|
custom_battlechatter_init_valid_phrases();
|
|
|
|
var_0 = tolower( var_0 );
|
|
|
|
if ( !custom_battlechatter_validate_phrase( var_0 ) )
|
|
{
|
|
var_1 = get_phraseinvalidstr( var_0 );
|
|
return 0;
|
|
}
|
|
|
|
var_2 = animscripts\battlechatter::getresponder( 24, 512, "response" );
|
|
begincustomevent();
|
|
|
|
switch ( var_0 )
|
|
{
|
|
case "order_move_combat":
|
|
if ( !nationalityokformoveorder() )
|
|
return 0;
|
|
|
|
animscripts\battlechatter::tryorderto( self.customchatphrase, var_2 );
|
|
addmovecombataliasex();
|
|
break;
|
|
case "order_move_noncombat":
|
|
if ( !nationalityokformoveordernoncombat() )
|
|
return 0;
|
|
|
|
addmovenoncombataliasex();
|
|
break;
|
|
case "order_action_coverme":
|
|
animscripts\battlechatter::tryorderto( self.customchatphrase, var_2 );
|
|
addactioncovermealiasex();
|
|
break;
|
|
case "inform_reloading":
|
|
addinformreloadingaliasex();
|
|
break;
|
|
default:
|
|
var_1 = get_phraseinvalidstr( var_0 );
|
|
return 0;
|
|
}
|
|
|
|
endcustomevent( 2000 );
|
|
return 1;
|
|
}
|
|
|
|
begincustomevent()
|
|
{
|
|
if ( !animscripts\battlechatter::bcsenabled() )
|
|
return;
|
|
|
|
self.customchatphrase = animscripts\battlechatter::createchatphrase();
|
|
}
|
|
|
|
addactioncovermealiasex()
|
|
{
|
|
self.customchatphrase animscripts\battlechatter::addorderalias( "action", "coverme" );
|
|
}
|
|
|
|
addmovecombataliasex()
|
|
{
|
|
self.customchatphrase animscripts\battlechatter::addorderalias( "move", "combat" );
|
|
}
|
|
|
|
addmovenoncombataliasex()
|
|
{
|
|
self.customchatphrase animscripts\battlechatter::addorderalias( "move", "noncombat" );
|
|
}
|
|
|
|
addinformreloadingaliasex()
|
|
{
|
|
self.customchatphrase animscripts\battlechatter::addinformalias( "reloading", "generic" );
|
|
}
|
|
|
|
addnamealiasex( var_0 )
|
|
{
|
|
if ( !animscripts\battlechatter::bcsenabled() )
|
|
return;
|
|
|
|
self.customchatphrase animscripts\battlechatter::addnamealias( var_0 );
|
|
}
|
|
|
|
endcustomevent( var_0, var_1 )
|
|
{
|
|
if ( !animscripts\battlechatter::bcsenabled() )
|
|
return;
|
|
|
|
var_2 = animscripts\battlechatter::createchatevent( "custom", "generic", 1.0 );
|
|
|
|
if ( isdefined( var_0 ) )
|
|
var_2.expiretime = gettime() + var_0;
|
|
|
|
if ( isdefined( var_1 ) )
|
|
var_2.type = var_1;
|
|
else
|
|
var_2.type = "custom";
|
|
|
|
self.chatqueue["custom"] = undefined;
|
|
self.chatqueue["custom"] = var_2;
|
|
}
|