// IW6 GSC SOURCE // Generated by https://github.com/xensik/gsc-tool init_battlechatter() { if ( isdefined( anim.chatinitialized ) && anim.chatinitialized ) return; setdvarifuninitialized( "bcs_enable", 1 ); if ( getdvarint( "bcs_enable" ) == 0 ) { anim.chatinitialized = 0; anim.player.chatinitialized = 0; return; } anim.chatinitialized = 1; anim.player.chatinitialized = 0; setdvarifuninitialized( "bcs_filterThreat", "off" ); setdvarifuninitialized( "bcs_filterInform", "off" ); setdvarifuninitialized( "bcs_filterOrder", "off" ); setdvarifuninitialized( "bcs_filterReaction", "off" ); setdvarifuninitialized( "bcs_filterResponse", "off" ); setdvarifuninitialized( "bcs_forceEnglish", "0" ); setdvarifuninitialized( "bcs_allowsamevoiceresponse", "off" ); setdvarifuninitialized( "debug_bcprint", "off" ); setdvarifuninitialized( "debug_bcprintdump", "off" ); setdvarifuninitialized( "debug_bcprintdumptype", "csv" ); setdvarifuninitialized( "debug_bcshowqueue", "off" ); anim.bcprintfailprefix = "^3***** BCS FAILURE: "; anim.bcprintwarnprefix = "^3***** BCS WARNING: "; bcs_setup_teams_array(); bcs_setup_countryids(); anim.playernameids["american"] = "1"; anim.playernameids["seal"] = "1"; anim.playernameids["taskforce"] = "1"; anim.playernameids["secretservice"] = "1"; anim.playernameids["delta"] = "1"; thread setplayerbcnameid(); init_flavorbursts(); if ( !isdefined( level.friendlyfire_warnings ) ) level.friendlyfire_warnings = 0; anim.eventtypeminwait = []; anim.eventtypeminwait["threat"] = []; anim.eventtypeminwait["response"] = []; anim.eventtypeminwait["reaction"] = []; anim.eventtypeminwait["order"] = []; anim.eventtypeminwait["inform"] = []; anim.eventtypeminwait["custom"] = []; anim.eventtypeminwait["direction"] = []; if ( isdefined( level._stealth ) ) { anim.eventactionminwait["threat"]["self"] = 20000; anim.eventactionminwait["threat"]["squad"] = 30000; } else { anim.eventactionminwait["threat"]["self"] = 12500; anim.eventactionminwait["threat"]["squad"] = 7500; } anim.eventactionminwait["threat"]["location_repeat"] = 15000; anim.eventactionminwait["response"]["self"] = 1000; anim.eventactionminwait["response"]["squad"] = 1000; anim.eventactionminwait["reaction"]["self"] = 1000; anim.eventactionminwait["reaction"]["squad"] = 1000; anim.eventactionminwait["order"]["self"] = 8000; anim.eventactionminwait["order"]["squad"] = 10000; anim.eventactionminwait["inform"]["self"] = 6000; anim.eventactionminwait["inform"]["squad"] = 8000; anim.eventactionminwait["custom"]["self"] = 0; anim.eventactionminwait["custom"]["squad"] = 0; anim.eventtypeminwait["playername"] = 50000; anim.eventtypeminwait["reaction"]["casualty"] = 14000; anim.eventtypeminwait["reaction"]["friendlyfire"] = 5000; anim.eventtypeminwait["reaction"]["takingfire"] = 40000; anim.eventtypeminwait["reaction"]["ask_ok"] = 15000; anim.eventtypeminwait["reaction"]["taunt"] = 30000; anim.eventtypeminwait["inform"]["reloading"] = 20000; anim.eventtypeminwait["inform"]["killfirm"] = 15000; anim.eventpriority["threat"]["infantry"] = 0.5; anim.eventpriority["threat"]["vehicle"] = 0.7; anim.eventpriority["response"]["ack"] = 0.9; anim.eventpriority["response"]["exposed"] = 0.8; anim.eventpriority["response"]["callout"] = 0.9; anim.eventpriority["response"]["echo"] = 0.9; anim.eventpriority["response"]["covering"] = 0.9; anim.eventpriority["response"]["im"] = 0.9; anim.eventpriority["reaction"]["casualty"] = 0.5; anim.eventpriority["reaction"]["friendlyfire"] = 1.0; anim.eventpriority["reaction"]["takingfire"] = 1.0; anim.eventpriority["reaction"]["ask_ok"] = 1.0; anim.eventpriority["reaction"]["taunt"] = 0.9; anim.eventpriority["order"]["action"] = 0.3; anim.eventpriority["order"]["move"] = 0.3; anim.eventpriority["order"]["displace"] = 0.5; anim.eventpriority["inform"]["attack"] = 0.9; anim.eventpriority["inform"]["incoming"] = 0.9; anim.eventpriority["inform"]["reloading"] = 0.2; anim.eventpriority["inform"]["suppressed"] = 0.2; anim.eventpriority["inform"]["killfirm"] = 0.7; anim.eventpriority["custom"]["generic"] = 1.0; anim.eventduration["threat"]["infantry"] = 1000; anim.eventduration["threat"]["vehicle"] = 1000; anim.eventduration["response"]["exposed"] = 2000; anim.eventduration["response"]["callout"] = 2000; anim.eventduration["response"]["echo"] = 2000; anim.eventduration["response"]["ack"] = 1750; anim.eventduration["response"]["covering"] = 1500; anim.eventduration["response"]["im"] = 1500; anim.eventduration["reaction"]["casualty"] = 2000; anim.eventduration["reaction"]["friendlyfire"] = 1000; anim.eventduration["reaction"]["takingfire"] = 1500; anim.eventduration["reaction"]["ask_ok"] = 1500; anim.eventduration["reaction"]["taunt"] = 2000; anim.eventduration["order"]["action"] = 3000; anim.eventduration["order"]["move"] = 3000; anim.eventduration["order"]["displace"] = 3000; anim.eventduration["inform"]["attack"] = 1000; anim.eventduration["inform"]["incoming"] = 1500; anim.eventduration["inform"]["reloading"] = 1000; anim.eventduration["inform"]["suppressed"] = 2000; anim.eventduration["inform"]["killfirm"] = 2000; anim.eventduration["custom"]["generic"] = 1000; anim.eventchance["response"]["exposed"] = 75; anim.eventchance["response"]["reload"] = 65; anim.eventchance["response"]["callout"] = 75; anim.eventchance["response"]["callout_negative"] = 20; anim.eventchance["response"]["order"] = 40; anim.eventchance["moveEvent"]["coverme"] = 70; anim.eventchance["moveEvent"]["ordertoplayer"] = 10; anim.fbt_desireddistmax = 620; anim.fbt_waitmin = 12; anim.fbt_waitmax = 24; anim.fbt_linebreakmin = 2; anim.fbt_linebreakmax = 5; anim.moveorigin = spawn( "script_origin", ( 0, 0, 0 ) ); if ( !isdefined( level.bcs_maxtalkingdistsqrdfromplayer ) ) level.bcs_maxtalkingdistsqrdfromplayer = squared( 1500 ); if ( !isdefined( level.bcs_maxthreatdistsqrdfromplayer ) ) level.bcs_maxthreatdistsqrdfromplayer = squared( 2500 ); level.heightforhighcallout = 96.0; level.mindistancecallout = 8.0; level.maxdistancecallout = 45.0; common_scripts\_bcs_location_trigs::bcs_location_trigs_init(); anim.scripteddialoguebuffertime = 4000; anim.bcs_threatresettime = 3000; anim.squadcreatefuncs[anim.squadcreatefuncs.size] = ::init_squadbattlechatter; anim.squadcreatestrings[anim.squadcreatestrings.size] = "::init_squadBattleChatter"; foreach ( var_1 in anim.teams ) { anim.isteamspeaking[var_1] = 0; anim.isteamsaying[var_1]["threat"] = 0; anim.isteamsaying[var_1]["order"] = 0; anim.isteamsaying[var_1]["reaction"] = 0; anim.isteamsaying[var_1]["response"] = 0; anim.isteamsaying[var_1]["inform"] = 0; anim.isteamsaying[var_1]["custom"] = 0; } bcs_setup_chatter_toggle_array(); bcs_setup_flavorburst_toggle_array(); anim.lastteamspeaktime = []; anim.lastnamesaid = []; anim.lastnamesaidtime = []; foreach ( var_1 in anim.teams ) { anim.lastteamspeaktime[var_1] = -50000; anim.lastnamesaid[var_1] = "none"; anim.lastnamesaidtime[var_1] = -100000; } anim.lastnamesaidtimeout = 120000; for ( var_5 = 0; var_5 < anim.squadindex.size; var_5++ ) { if ( isdefined( anim.squadindex[var_5].chatinitialized ) && anim.squadindex[var_5].chatinitialized ) continue; anim.squadindex[var_5] init_squadbattlechatter(); } anim.threatcallouts = []; anim.threatcallouts["rpg"] = 80; anim.threatcallouts["exposed"] = 25; anim.threatcallouts["player_distance"] = 25; anim.threatcallouts["player_obvious"] = 25; anim.threatcallouts["player_contact_clock"] = 25; anim.threatcallouts["player_target_clock"] = 25; anim.threatcallouts["player_target_clock_high"] = 25; anim.threatcallouts["player_cardinal"] = 20; anim.threatcallouts["ai_distance"] = 25; anim.threatcallouts["ai_obvious"] = 25; anim.threatcallouts["ai_contact_clock"] = 20; anim.threatcallouts["ai_casual_clock"] = 20; anim.threatcallouts["ai_target_clock"] = 20; anim.threatcallouts["ai_target_clock_high"] = 25; anim.threatcallouts["ai_cardinal"] = 10; anim.threatcallouts["concat_location"] = 90; anim.threatcallouts["player_location"] = 90; anim.threatcallouts["ai_location"] = 100; anim.threatcallouts["generic_location"] = 95; anim.lastteamthreatcallout = []; anim.lastteamthreatcallouttime = []; foreach ( var_1 in anim.teams ) { anim.lastteamthreatcallout[var_1] = undefined; anim.lastteamthreatcallouttime[var_1] = undefined; } anim.teamthreatcalloutlimittimeout = 120000; level notify( "battlechatter initialized" ); anim notify( "battlechatter initialized" ); } bcs_setup_teams_array() { if ( !isdefined( anim.teams ) ) { anim.teams = []; anim.teams[anim.teams.size] = "axis"; anim.teams[anim.teams.size] = "allies"; anim.teams[anim.teams.size] = "team3"; anim.teams[anim.teams.size] = "neutral"; } } bcs_setup_countryids() { if ( !isdefined( anim.usedids ) ) { anim.usedids = []; anim.flavorburstvoices = []; anim.countryids = []; bcs_setup_voice( "british", "UK", 2 ); bcs_setup_voice( "secretservice", "SS", 4 ); bcs_setup_voice( "french", "FR", 3 ); bcs_setup_voice( "czech", "CZ", 3 ); bcs_setup_voice( "pmc", "PC", 3 ); bcs_setup_voice( "arab", "AB", 3 ); bcs_setup_voice( "portugese", "PG", 3 ); bcs_setup_voice( "african", "AF", 3 ); bcs_setup_voice( "american", "US", 3, 1 ); bcs_setup_voice( "delta", "GL", 1 ); bcs_setup_voice( "taskforce", "GM", 1 ); bcs_setup_voice( "seal", "GS", 1 ); bcs_setup_voice( "shadowcompany", "SP", 6 ); bcs_setup_voice( "russian", "SP", 6 ); } } bcs_setup_voice( var_0, var_1, var_2, var_3 ) { if ( !isdefined( var_3 ) ) var_3 = 0; anim.usedids[var_0] = []; for ( var_4 = 0; var_4 < var_2; var_4++ ) { anim.usedids[var_0][var_4] = spawnstruct(); anim.usedids[var_0][var_4].count = 0; anim.usedids[var_0][var_4].npcid = "" + var_4; } anim.countryids[var_0] = var_1; anim.flavorburstvoices[var_0] = var_3; } bcs_setup_chatter_toggle_array() { bcs_setup_teams_array(); if ( !isdefined( level.battlechatter ) ) { level.battlechatter = []; foreach ( var_1 in anim.teams ) maps\_utility::set_battlechatter_variable( var_1, 1 ); } } bcs_setup_flavorburst_toggle_array() { bcs_setup_teams_array(); if ( !isdefined( level.flavorbursts ) ) { level.flavorbursts = []; foreach ( var_1 in anim.teams ) level.flavorbursts[var_1] = 1; } } init_flavorbursts() { anim.flavorbursts["american"] = []; var_0 = 41; for ( var_1 = 0; var_1 < var_0; var_1++ ) anim.flavorbursts["american"][var_1] = maps\_utility::string( var_1 + 1 ); anim.flavorbursts["shadowcompany"] = []; var_0 = 9; for ( var_1 = 1; var_1 <= var_0; var_1++ ) anim.flavorbursts["shadowcompany"][var_1] = maps\_utility::string( var_1 + 1 ); anim.flavorburstsused = []; } shutdown_battlechatter() { anim.countryids = undefined; anim.eventtypeminwait = undefined; anim.eventactionminwait = undefined; anim.eventtypeminwait = undefined; anim.eventpriority = undefined; anim.eventduration = undefined; anim.moveorigin = undefined; anim.scripteddialoguebuffertime = undefined; anim.bcs_threatresettime = undefined; anim.locationlastcallouttimes = undefined; anim.usedids = undefined; anim.flavorburstsused = undefined; anim.lastteamthreatcallout = undefined; anim.lastteamthreatcallouttime = undefined; anim.lastnamesaidtimeout = undefined; anim.lastnamesaid = undefined; anim.lastnamesaidtime = undefined; anim.chatinitialized = 0; anim.player.chatinitialized = 0; level.battlechatter = undefined; anim.bcs_locations = undefined; for ( var_0 = 0; var_0 < anim.squadcreatefuncs.size; var_0++ ) { if ( anim.squadcreatestrings[var_0] != "::init_squadBattleChatter" ) continue; if ( var_0 != anim.squadcreatefuncs.size - 1 ) { anim.squadcreatefuncs[var_0] = anim.squadcreatefuncs[anim.squadcreatefuncs.size - 1]; anim.squadcreatestrings[var_0] = anim.squadcreatestrings[anim.squadcreatestrings.size - 1]; } anim.squadcreatefuncs[anim.squadcreatefuncs.size - 1] = undefined; anim.squadcreatestrings[anim.squadcreatestrings.size - 1] = undefined; } level notify( "battlechatter disabled" ); anim notify( "battlechatter disabled" ); } init_squadbattlechatter() { var_0 = self; var_0.numspeakers = 0; var_0.maxspeakers = 1; var_0.nextsaytime = gettime() + 50; var_0.nextsaytimes["threat"] = gettime() + 50; var_0.nextsaytimes["order"] = gettime() + 50; var_0.nextsaytimes["reaction"] = gettime() + 50; var_0.nextsaytimes["response"] = gettime() + 50; var_0.nextsaytimes["inform"] = gettime() + 50; var_0.nextsaytimes["custom"] = gettime() + 50; var_0.nexttypesaytimes["threat"] = []; var_0.nexttypesaytimes["order"] = []; var_0.nexttypesaytimes["reaction"] = []; var_0.nexttypesaytimes["response"] = []; var_0.nexttypesaytimes["inform"] = []; var_0.nexttypesaytimes["custom"] = []; var_0.ismembersaying["threat"] = 0; var_0.ismembersaying["order"] = 0; var_0.ismembersaying["reaction"] = 0; var_0.ismembersaying["response"] = 0; var_0.ismembersaying["inform"] = 0; var_0.ismembersaying["custom"] = 0; var_0.lastdirection = ""; var_0.memberaddfuncs[var_0.memberaddfuncs.size] = animscripts\battlechatter_ai::addtosystem; var_0.memberaddstrings[var_0.memberaddstrings.size] = "::addToSystem"; var_0.memberremovefuncs[var_0.memberremovefuncs.size] = animscripts\battlechatter_ai::removefromsystem; var_0.memberremovestrings[var_0.memberremovestrings.size] = "::removeFromSystem"; var_0.squadupdatefuncs[var_0.squadupdatefuncs.size] = ::initcontact; var_0.squadupdatestrings[var_0.squadupdatestrings.size] = "::initContact"; var_0.fbt_firstburst = 1; var_0.fbt_lastbursterid = undefined; for ( var_1 = 0; var_1 < anim.squadindex.size; var_1++ ) var_0 thread initcontact( anim.squadindex[var_1].squadname ); var_0 thread animscripts\battlechatter_ai::squadthreatwaiter(); var_0 thread animscripts\battlechatter_ai::squadofficerwaiter(); var_0 thread squadflavorbursttransmissions(); var_0.chatinitialized = 1; var_0 notify( "squad chat initialized" ); } shutdown_squadbattlechatter() { var_0 = self; var_0.numspeakers = undefined; var_0.maxspeakers = undefined; var_0.nextsaytime = undefined; var_0.nextsaytimes = undefined; var_0.nexttypesaytimes = undefined; var_0.ismembersaying = undefined; var_0.fbt_firstburst = undefined; var_0.fbt_lastbursterid = undefined; for ( var_1 = 0; var_1 < var_0.memberaddfuncs.size; var_1++ ) { if ( var_0.memberaddstrings[var_1] != "::addToSystem" ) continue; if ( var_1 != var_0.memberaddfuncs.size - 1 ) { var_0.memberaddfuncs[var_1] = var_0.memberaddfuncs[var_0.memberaddfuncs.size - 1]; var_0.memberaddstrings[var_1] = var_0.memberaddstrings[var_0.memberaddstrings.size - 1]; } var_0.memberaddfuncs[var_0.memberaddfuncs.size - 1] = undefined; var_0.memberaddstrings[var_0.memberaddstrings.size - 1] = undefined; } for ( var_1 = 0; var_1 < var_0.memberremovefuncs.size; var_1++ ) { if ( var_0.memberremovestrings[var_1] != "::removeFromSystem" ) continue; if ( var_1 != var_0.memberremovefuncs.size - 1 ) { var_0.memberremovefuncs[var_1] = var_0.memberremovefuncs[var_0.memberremovefuncs.size - 1]; var_0.memberremovestrings[var_1] = var_0.memberremovestrings[var_0.memberremovestrings.size - 1]; } var_0.memberremovefuncs[var_0.memberremovefuncs.size - 1] = undefined; var_0.memberremovestrings[var_0.memberremovestrings.size - 1] = undefined; } for ( var_1 = 0; var_1 < var_0.squadupdatefuncs.size; var_1++ ) { if ( var_0.squadupdatestrings[var_1] != "::initContact" ) continue; if ( var_1 != var_0.squadupdatefuncs.size - 1 ) { var_0.squadupdatefuncs[var_1] = var_0.squadupdatefuncs[var_0.squadupdatefuncs.size - 1]; var_0.squadupdatestrings[var_1] = var_0.squadupdatestrings[var_0.squadupdatestrings.size - 1]; } var_0.squadupdatefuncs[var_0.squadupdatefuncs.size - 1] = undefined; var_0.squadupdatestrings[var_0.squadupdatestrings.size - 1] = undefined; } for ( var_1 = 0; var_1 < anim.squadindex.size; var_1++ ) var_0 shutdowncontact( anim.squadindex[var_1].squadname ); var_0.chatinitialized = 0; } bcsenabled() { return anim.chatinitialized; } bcsdebugwaiter() { var_0 = getdvarint( "bcs_enable" ); for (;;) { var_1 = getdvarint( "bcs_enable" ); if ( var_1 != var_0 ) { switch ( var_1 ) { case 1: if ( !anim.chatinitialized ) enablebattlechatter(); break; case 0: if ( anim.chatinitialized ) disablebattlechatter(); break; } var_0 = var_1; } wait 1.0; } } enablebattlechatter() { init_battlechatter(); anim.player thread animscripts\battlechatter_ai::addtosystem(); var_0 = getaiarray(); for ( var_1 = 0; var_1 < var_0.size; var_1++ ) var_0[var_1] animscripts\battlechatter_ai::addtosystem(); } disablebattlechatter() { if ( !isdefined( anim.chatinitialized ) ) return; shutdown_battlechatter(); var_0 = getaiarray(); for ( var_1 = 0; var_1 < var_0.size; var_1++ ) { if ( isdefined( var_0[var_1].squad ) && var_0[var_1].squad.chatinitialized ) var_0[var_1].squad shutdown_squadbattlechatter(); var_0[var_1] animscripts\battlechatter_ai::removefromsystem(); } } setplayerbcnameid( var_0, var_1 ) { if ( isdefined( var_0 ) && isdefined( var_1 ) ) { level.player.bcnameid = var_0; level.player.bccountryid = var_1; return; } while ( !isdefined( level.campaign ) ) wait 0.1; var_2 = level.campaign; var_3 = anim.playernameids[var_2]; var_4 = anim.countryids[var_2]; if ( isdefined( var_3 ) ) level.player.bcnameid = var_3; if ( isdefined( var_4 ) ) level.player.bccountryid = var_4; } playbattlechatter() { if ( !isalive( self ) ) return; if ( !bcsenabled() ) return; if ( self._animactive > 0 ) return; if ( isdefined( self.isspeaking ) && self.isspeaking ) return; if ( self.team == "allies" && isdefined( anim.scripteddialoguestarttime ) ) { if ( anim.scripteddialoguestarttime + anim.scripteddialoguebuffertime > gettime() ) return; } if ( friendlyfire_warning() ) return; if ( !isdefined( self.battlechatter ) || !self.battlechatter ) return; if ( self.team == "allies" && getdvarint( "bcs_forceEnglish", 0 ) ) return; if ( anim.isteamspeaking[self.team] ) return; self endon( "death" ); var_0 = gethighestpriorityevent(); if ( !isdefined( var_0 ) ) return; switch ( var_0 ) { case "custom": thread playcustomevent(); break; case "response": thread playresponseevent(); break; case "order": thread playorderevent(); break; case "threat": thread playthreatevent(); break; case "reaction": thread playreactionevent(); break; case "inform": thread playinformevent(); break; } } playthreatevent() { self endon( "death" ); self endon( "removed from battleChatter" ); self endon( "cancel speaking" ); self.curevent = self.chatqueue["threat"]; var_0 = self.chatqueue["threat"].threat; if ( !isalive( var_0 ) ) return; if ( threatwasalreadycalledout( var_0 ) && !isplayer( var_0 ) ) return; anim thread lockaction( self, "threat" ); var_1 = 0; switch ( self.chatqueue["threat"].eventtype ) { case "infantry": if ( isplayer( var_0 ) || !isdefined( var_0 getturret() ) ) var_1 = threatinfantry( var_0 ); else { } break; case "dog": var_1 = threatdog( var_0 ); break; case "vehicle": break; } self notify( "done speaking" ); if ( !var_1 ) return; if ( !isalive( var_0 ) ) return; var_0.calledout[self.squad.squadname] = spawnstruct(); var_0.calledout[self.squad.squadname].spotter = self; var_0.calledout[self.squad.squadname].threattype = self.chatqueue["threat"].eventtype; var_0.calledout[self.squad.squadname].expiretime = gettime() + anim.bcs_threatresettime; if ( isdefined( var_0.squad ) ) self.squad.squadlist[var_0.squad.squadname].calledout = 1; } threatwasalreadycalledout( var_0 ) { if ( isdefined( var_0.calledout ) && isdefined( var_0.calledout[self.squad.squadname] ) ) { if ( var_0.calledout[self.squad.squadname].expiretime < gettime() ) return 1; } return 0; } threatinfantry( var_0, var_1 ) { self endon( "cancel speaking" ); var_2 = createchatphrase(); var_2.master = 1; var_2.threatent = var_0; var_3 = getthreatinfantrycallouttype( var_0 ); if ( !isdefined( var_3 ) || isdefined( var_3 ) && !isdefined( var_3.type ) ) return 0; switch ( var_3.type ) { case "rpg": var_2 threatinfantryrpg( var_0 ); break; case "exposed": var_4 = doexposedcalloutresponse( var_3.responder ); if ( var_4 && cansayname( var_3.responder ) ) { var_2 addnamealias( var_3.responder.bcname ); var_2.looktarget = var_3.responder; } var_2 threatinfantryexposed( var_0 ); if ( var_4 ) { if ( randomint( 100 ) < anim.eventchance["response"]["callout_negative"] ) var_3.responder animscripts\battlechatter_ai::addresponseevent( "callout", "neg", self, 0.9 ); else var_3.responder animscripts\battlechatter_ai::addresponseevent( "exposed", "acquired", self, 0.9 ); } break; case "player_obvious": var_2 addplayernamealias(); var_2 addthreatobviousalias(); break; case "player_distance": var_5 = getdistanceyardsnormalized( level.player.origin, var_0.origin ); var_2 addplayernamealias(); var_2 addthreatdistancealias( var_5 ); break; case "player_contact_clock": var_2 addplayernamealias(); var_2 addthreatcalloutalias( "contactclock", var_3.playerclockdirection ); break; case "player_target_clock": var_2 addplayernamealias(); var_2 addthreatcalloutalias( "targetclock", var_3.playerclockdirection ); break; case "player_target_clock_high": var_2 addplayernamealias(); var_6 = getdegreeselevation( level.player.origin, var_0.origin ); if ( var_6 >= 20 && var_6 <= 50 ) { var_2 addthreatcalloutalias( "targetclock", var_3.playerclockdirection ); var_2 addthreatelevationalias( var_6 ); } else var_2 addthreatcalloutalias( "targetclock", var_3.playerclockdirection + "_high" ); break; case "player_cardinal": var_2 addplayernamealias(); var_7 = getdirectioncompass( level.player.origin, var_0.origin ); var_8 = normalizecompassdirection( var_7 ); if ( var_8 == "impossible" ) return 0; var_2 addthreatcalloutalias( "cardinal", var_8 ); break; case "ai_obvious": if ( isdefined( var_3.responder ) && cansayname( var_3.responder ) ) { var_2 addnamealias( var_3.responder.bcname ); var_2.looktarget = var_3.responder; } var_2 addthreatobviousalias(); var_2 addcalloutresponseevent( self, var_3, var_0 ); break; case "ai_distance": var_9 = self; if ( self.team == "allies" ) var_9 = level.player; else if ( isdefined( var_3.responder ) && randomint( 100 ) < anim.eventchance["response"]["callout"] ) var_9 = var_3.responder; var_5 = getdistanceyardsnormalized( var_9.origin, var_0.origin ); var_2 addthreatdistancealias( var_5 ); var_2 addcalloutresponseevent( self, var_3, var_0 ); break; case "ai_contact_clock": var_9 = self; if ( self.team == "allies" ) var_9 = level.player; else if ( isdefined( var_3.responder ) && randomint( 100 ) < anim.eventchance["response"]["callout"] ) var_9 = var_3.responder; var_10 = getrelativeangles( var_9 ); var_11 = getdirectionfacingclock( var_10, var_9.origin, var_0.origin ); var_2 addthreatcalloutalias( "contactclock", var_11 ); var_2 addcalloutresponseevent( self, var_3, var_0 ); break; case "ai_casual_clock": var_9 = self; if ( self.team == "allies" ) var_9 = level.player; else if ( isdefined( var_3.responder ) && randomint( 100 ) < anim.eventchance["response"]["callout"] ) var_9 = var_3.responder; var_10 = getrelativeangles( var_9 ); var_11 = getdirectionfacingclock( var_10, var_9.origin, var_0.origin ); var_2 addthreatcalloutalias( "casualclock", var_11 ); var_2 addcalloutresponseevent( self, var_3, var_0 ); break; case "ai_target_clock": var_9 = self; if ( self.team == "allies" ) var_9 = level.player; else if ( isdefined( var_3.responder ) && randomint( 100 ) < anim.eventchance["response"]["callout"] ) var_9 = var_3.responder; var_10 = getrelativeangles( var_9 ); var_11 = getdirectionfacingclock( var_10, var_9.origin, var_0.origin ); var_2 addthreatcalloutalias( "targetclock", var_11 ); var_2 addcalloutresponseevent( self, var_3, var_0 ); break; case "ai_target_clock_high": var_9 = self; if ( self.team == "allies" ) var_9 = level.player; else if ( isdefined( var_3.responder ) && randomint( 100 ) < anim.eventchance["response"]["callout"] ) var_9 = var_3.responder; var_10 = getrelativeangles( var_9 ); var_11 = getdirectionfacingclock( var_10, var_9.origin, var_0.origin ); var_6 = getdegreeselevation( var_9.origin, var_0.origin ); if ( var_6 >= 20 && var_6 <= 50 ) { var_2 addthreatcalloutalias( "targetclock", var_11 ); var_2 addthreatelevationalias( var_6 ); } else var_2 addthreatcalloutalias( "targetclock", var_11 + "_high" ); var_2 addcalloutresponseevent( self, var_3, var_0 ); break; case "ai_cardinal": var_9 = self; if ( self.team == "allies" ) var_9 = level.player; var_7 = getdirectioncompass( var_9.origin, var_0.origin ); var_8 = normalizecompassdirection( var_7 ); if ( var_8 == "impossible" ) return 0; var_2 addthreatcalloutalias( "cardinal", var_8 ); break; case "generic_location": var_12 = var_2 threatinfantry_docalloutlocation( var_3 ); if ( !var_12 ) return 0; break; case "player_location": var_2 addplayernamealias(); var_12 = var_2 threatinfantry_docalloutlocation( var_3 ); if ( !var_12 ) return 0; break; case "concat_location": var_2 addconcattargetalias( var_0 ); var_9 = self; if ( self.team == "allies" ) var_9 = level.player; var_12 = var_2 threatinfantry_docalloutlocation( var_3, 1 ); if ( !var_12 ) return 0; var_2 addconcatdirectionalias( var_9, var_0 ); var_2 addcalloutresponseevent( self, var_3, var_0 ); break; case "ai_location": if ( cansayname( var_3.responder ) ) { var_2 addnamealias( var_3.responder.bcname ); var_2.looktarget = var_3.responder; } var_12 = var_2 threatinfantry_docalloutlocation( var_3 ); if ( !var_12 ) return 0; var_13 = var_2.soundaliases.size - 1; var_14 = var_2.soundaliases[var_13]; if ( iscallouttypereport( var_14 ) ) var_3.responder animscripts\battlechatter_ai::addresponseevent( "callout", "echo", self, 0.9, var_14 ); else if ( iscallouttypeqa( var_14, self ) ) var_3.responder animscripts\battlechatter_ai::addresponseevent( "callout", "QA", self, 0.9, var_14, var_3.location ); else if ( randomint( 100 ) < anim.eventchance["response"]["callout_negative"] ) var_3.responder animscripts\battlechatter_ai::addresponseevent( "callout", "neg", self, 0.9 ); else var_3.responder animscripts\battlechatter_ai::addresponseevent( "exposed", "acquired", self, 0.9 ); break; } setlastcallouttype( var_3.type ); playphrase( var_2 ); return 1; } doexposedcalloutresponse( var_0 ) { if ( !isdefined( var_0 ) ) return 0; if ( var_0.countryid != "US" && var_0.countryid != "NS" && var_0.countryid != "TF" ) return 0; if ( randomint( 100 ) > anim.eventchance["response"]["exposed"] ) return 0; return 1; } threatinfantry_docalloutlocation( var_0, var_1 ) { var_2 = addthreatcalloutlocationalias( var_0.location, var_1 ); return var_2; } addcalloutresponseevent( var_0, var_1, var_2 ) { if ( !isdefined( var_1.responder ) ) return; if ( randomint( 100 ) > anim.eventchance["response"]["callout"] ) return; var_3 = "affirm"; if ( !var_1.responder cansee( var_2 ) && randomint( 100 ) < anim.eventchance["response"]["callout_negative"] ) var_3 = "neg"; var_1.responder animscripts\battlechatter_ai::addresponseevent( "callout", var_3, var_0, 0.9 ); } getthreatinfantrycallouttype( var_0 ) { var_1 = var_0 getvalidlocation( self ); var_2 = getdirectionfacingclock( self.angles, self.origin, var_0.origin ); var_3 = getresponder( 64, 1024, "response" ); var_4 = undefined; if ( isdefined( var_3 ) ) var_4 = getdirectionfacingclock( var_3.angles, var_3.origin, var_0.origin ); var_5 = getdirectionfacingclock( level.player.angles, level.player.origin, var_0.origin ); if ( self.team == "allies" ) { var_6 = var_5; var_7 = level.player; } else if ( isdefined( var_3 ) ) { var_6 = var_4; var_7 = var_3; } else { var_6 = var_2; var_7 = self; } var_8 = getdistanceyards( var_7.origin, var_0.origin ); self.possiblethreatcallouts = []; if ( !isplayer( var_0 ) && var_0 animscripts\utility::usingrocketlauncher() ) addpossiblethreatcallout( "rpg" ); if ( !isdefined( var_1 ) && var_0 isexposed( 0 ) ) addpossiblethreatcallout( "exposed" ); if ( self.team == "allies" ) { var_9 = 0; if ( var_0.origin[2] - var_7.origin[2] >= level.heightforhighcallout ) { if ( addpossiblethreatcallout( "player_target_clock_high" ) ) var_9 = 1; } if ( !var_9 ) { if ( var_6 == "12" ) { addpossiblethreatcallout( "player_obvious" ); if ( var_8 > level.mindistancecallout && var_8 < level.maxdistancecallout ) addpossiblethreatcallout( "player_distance" ); } if ( cansayplayername() && var_6 != "12" ) { addpossiblethreatcallout( "player_contact_clock" ); addpossiblethreatcallout( "player_target_clock" ); addpossiblethreatcallout( "player_cardinal" ); } } } var_9 = 0; if ( var_0.origin[2] - var_7.origin[2] >= level.heightforhighcallout ) { if ( addpossiblethreatcallout( "ai_target_clock_high" ) ) var_9 = 1; } addpossiblethreatcallout( "ai_casual_clock" ); if ( !var_9 ) { if ( var_6 == "12" ) { addpossiblethreatcallout( "ai_distance" ); if ( var_8 > level.mindistancecallout && var_8 < level.maxdistancecallout ) addpossiblethreatcallout( "ai_obvious" ); } addpossiblethreatcallout( "ai_contact_clock" ); addpossiblethreatcallout( "ai_target_clock" ); addpossiblethreatcallout( "ai_cardinal" ); } if ( isdefined( var_1 ) ) { if ( canconcat( var_1 ) ) addpossiblethreatcallout( "concat_location" ); else if ( isdefined( var_1 getcannedresponse( self ) ) ) { if ( isdefined( var_3 ) ) addpossiblethreatcallout( "ai_location" ); else { if ( cansayplayername() ) addpossiblethreatcallout( "player_location" ); addpossiblethreatcallout( "generic_location" ); } } else { if ( isdefined( var_3 ) ) addpossiblethreatcallout( "ai_location" ); if ( cansayplayername() ) addpossiblethreatcallout( "player_location" ); addpossiblethreatcallout( "generic_location" ); } } if ( !self.possiblethreatcallouts.size ) return undefined; var_11 = getweightedchanceroll( self.possiblethreatcallouts, anim.threatcallouts ); var_12 = spawnstruct(); var_12.type = var_11; var_12.responder = var_3; var_12.responderclockdirection = var_4; var_12.playerclockdirection = var_5; if ( isdefined( var_1 ) ) var_12.location = var_1; return var_12; } cancalloutlocation( var_0 ) { foreach ( var_2 in var_0.locationaliases ) { var_3 = getloccalloutalias( "co_loc_" + var_2 ); var_4 = getqacalloutalias( var_2, 0 ); var_5 = getloccalloutalias( "concat_loc_" + var_2 ); var_6 = soundexists( var_3 ) || soundexists( var_4 ) || soundexists( var_5 ); if ( var_6 ) return var_6; } return 0; } canconcat( var_0 ) { var_1 = var_0.locationaliases; foreach ( var_3 in var_1 ) { if ( iscallouttypeconcat( var_3, self ) ) return 1; } return 0; } getcannedresponse( var_0 ) { var_1 = undefined; var_2 = self.locationaliases; foreach ( var_4 in var_2 ) { if ( iscallouttypeqa( var_4, var_0 ) && !isdefined( self.qafinished ) ) { var_1 = var_4; break; } if ( iscallouttypereport( var_4 ) ) var_1 = var_4; } return var_1; } iscallouttypereport( var_0 ) { return issubstr( var_0, "_report" ); } iscallouttypeconcat( var_0, var_1 ) { var_2 = var_1 getloccalloutalias( "concat_loc_" + var_0 ); if ( soundexists( var_2 ) ) return 1; return 0; } iscallouttypeqa( var_0, var_1 ) { if ( issubstr( var_0, "_qa" ) && soundexists( var_0 ) ) return 1; var_2 = var_1 getqacalloutalias( var_0, 0 ); if ( soundexists( var_2 ) ) return 1; return 0; } getloccalloutalias( var_0 ) { var_1 = self.countryid + "_" + self.npcid + "_"; var_1 = var_1 + var_0; return var_1; } getqacalloutalias( var_0, var_1 ) { var_2 = getloccalloutalias( "co_loc_" + var_0 ); var_2 = var_2 + ( "_qa" + var_1 ); return var_2; } addallowedthreatcallout( var_0 ) { self.allowedcallouts[self.allowedcallouts.size] = var_0; } addpossiblethreatcallout( var_0 ) { var_1 = 0; foreach ( var_3 in self.allowedcallouts ) { if ( var_3 == var_0 ) { if ( !callouttypewillrepeat( var_0 ) ) var_1 = 1; break; } } if ( !var_1 ) return var_1; self.possiblethreatcallouts[self.possiblethreatcallouts.size] = var_0; return var_1; } callouttypewillrepeat( var_0 ) { if ( !isdefined( anim.lastteamthreatcallout[self.team] ) ) return 0; if ( !isdefined( anim.lastteamthreatcallouttime[self.team] ) ) return 0; var_1 = anim.lastteamthreatcallout[self.team]; var_2 = anim.lastteamthreatcallouttime[self.team]; var_3 = anim.teamthreatcalloutlimittimeout; if ( var_0 == var_1 && gettime() - var_2 < var_3 ) return 1; return 0; } setlastcallouttype( var_0 ) { anim.lastteamthreatcallout[self.team] = var_0; anim.lastteamthreatcallouttime[self.team] = gettime(); } getweightedchanceroll( var_0, var_1 ) { var_2 = undefined; var_3 = -1; foreach ( var_5 in var_0 ) { if ( var_1[var_5] <= 0 ) continue; var_6 = randomint( var_1[var_5] ); if ( isdefined( var_2 ) && var_1[var_2] >= 100 ) { if ( var_1[var_5] < 100 ) continue; } else { if ( var_1[var_5] >= 100 ) { var_2 = var_5; var_3 = var_6; continue; } if ( var_6 > var_3 ) { var_2 = var_5; var_3 = var_6; } } } return var_2; } threatdog( var_0, var_1 ) { self endon( "cancel speaking" ); var_2 = createchatphrase(); var_2.master = 1; var_2.threatent = var_0; var_2 addthreatalias( "dog", "generic" ); playphrase( var_2 ); return 1; } threatinfantryexposed( var_0 ) { var_1 = []; var_1 = common_scripts\utility::array_add( var_1, "open" ); if ( self.owner.countryid != "GS" ) var_1 = common_scripts\utility::array_add( var_1, "breaking" ); if ( self.owner.team == "allies" && self.owner.countryid != "RU" ) var_1 = common_scripts\utility::array_add( var_1, "movement" ); var_2 = var_1[randomint( var_1.size )]; addthreatexposedalias( var_2 ); } threatinfantryrpg( var_0 ) { addthreatalias( "rpg" ); } playreactionevent() { self endon( "death" ); self endon( "removed from battleChatter" ); self.curevent = self.chatqueue["reaction"]; var_0 = self.chatqueue["reaction"].reactto; var_1 = self.chatqueue["reaction"].modifier; anim thread lockaction( self, "reaction" ); switch ( self.chatqueue["reaction"].eventtype ) { case "casualty": reactioncasualty( var_0, var_1 ); break; case "taunt": reactiontaunt( var_0, var_1 ); break; case "friendlyfire": reactionfriendlyfire( var_0, var_1 ); break; case "takingfire": reactiontakingfire( var_0, var_1 ); if ( common_scripts\utility::cointoss() ) { var_2 = getresponder( 64, 1024, "response" ); if ( isdefined( var_2 ) ) { if ( common_scripts\utility::cointoss() ) { if ( var_2 cansay( "reaction", "ask_ok", 1.0, undefined ) ) var_2 animscripts\battlechatter_ai::addreactionevent( "ask_ok", undefined, self, 1.0 ); } else var_2 animscripts\battlechatter_ai::addresponseevent( "covering", "fire", self, 1.0 ); } } break; case "ask_ok": responsetakingfire( var_0, "ask", "ok" ); var_2 = getresponder( 64, 1024, "response" ); if ( isdefined( var_2 ) ) var_2 animscripts\battlechatter_ai::addresponseevent( "im", "ok", self, 1.0 ); break; } self notify( "done speaking" ); } reactioncasualty( var_0, var_1 ) { self endon( "death" ); self endon( "removed from battleChatter" ); var_2 = createchatphrase(); var_2 addreactionalias( "casualty", "generic" ); playphrase( var_2 ); } reactiontaunt( var_0, var_1 ) { self endon( "death" ); self endon( "removed from battleChatter" ); var_2 = createchatphrase(); if ( isdefined( var_1 ) && var_1 == "hostileburst" ) var_2 addhostileburstalias(); else var_2 addtauntalias( "taunt", "generic" ); playphrase( var_2 ); } reactionfriendlyfire( var_0, var_1 ) { self endon( "death" ); self endon( "removed from battleChatter" ); var_2 = createchatphrase(); var_2 addcheckfirealias(); playphrase( var_2 ); } reactiontakingfire( var_0, var_1 ) { self endon( "death" ); self endon( "removed from battleChatter" ); var_2 = createchatphrase(); var_2 addtakingfirealias(); playphrase( var_2 ); } responsetakingfire( var_0, var_1, var_2 ) { self endon( "death" ); self endon( "removed from battleChatter" ); var_3 = createchatphrase(); var_3 addresponsealias( var_1, var_2 ); playphrase( var_3 ); } playresponseevent() { self endon( "death" ); self endon( "removed from battleChatter" ); self.curevent = self.chatqueue["response"]; var_0 = self.chatqueue["response"].modifier; var_1 = self.chatqueue["response"].respondto; if ( !isalive( var_1 ) ) return; if ( self.chatqueue["response"].modifier == "follow" && self.a.state != "move" ) return; anim thread lockaction( self, "response" ); switch ( self.chatqueue["response"].eventtype ) { case "exposed": responsethreatexposed( var_1, var_0 ); break; case "callout": responsethreatcallout( var_1, var_0 ); break; case "ack": responsegeneric( var_1, var_0 ); break; default: responsegeneric( var_1, var_0 ); break; } self notify( "done speaking" ); } responsethreatexposed( var_0, var_1 ) { self endon( "death" ); self endon( "removed from battleChatter" ); if ( !isalive( var_0 ) ) return; var_2 = createchatphrase(); var_2 addthreatexposedalias( var_1 ); var_2.looktarget = var_0; var_2.master = 1; playphrase( var_2 ); } responsethreatcallout( var_0, var_1 ) { self endon( "death" ); self endon( "removed from battleChatter" ); if ( !isalive( var_0 ) ) return; var_2 = createchatphrase(); var_3 = 0; if ( var_1 == "echo" ) var_3 = var_2 addthreatcalloutecho( self.curevent.reportalias, var_0 ); else if ( var_1 == "QA" ) var_3 = var_2 addthreatcalloutqa_nextline( var_0, self.curevent.reportalias, self.curevent.location ); else var_3 = var_2 addthreatcalloutresponsealias( var_1 ); if ( !var_3 ) return; var_2.looktarget = var_0; var_2.master = 1; playphrase( var_2 ); } responsegeneric( var_0, var_1 ) { self endon( "death" ); self endon( "removed from battleChatter" ); if ( !isalive( var_0 ) ) return; var_2 = self.chatqueue["response"].eventtype; var_3 = createchatphrase(); var_3 addresponsealias( var_2, var_1 ); var_3.looktarget = var_0; var_3.master = 1; playphrase( var_3 ); } playorderevent() { self endon( "death" ); self endon( "removed from battleChatter" ); self.curevent = self.chatqueue["order"]; var_0 = self.chatqueue["order"].modifier; var_1 = self.chatqueue["order"].orderto; anim thread lockaction( self, "order" ); switch ( self.chatqueue["order"].eventtype ) { case "action": orderaction( var_0, var_1 ); break; case "move": ordermove( var_0, var_1 ); break; case "displace": orderdisplace( var_0 ); break; } self notify( "done speaking" ); } orderaction( var_0, var_1 ) { self endon( "death" ); self endon( "removed from battleChatter" ); var_2 = createchatphrase(); tryorderto( var_2, var_1 ); var_2 addorderalias( "action", var_0 ); playphrase( var_2 ); } ordermove( var_0, var_1 ) { self endon( "death" ); self endon( "removed from battleChatter" ); var_2 = createchatphrase(); tryorderto( var_2, var_1 ); var_2 addorderalias( "move", var_0 ); playphrase( var_2 ); } orderdisplace( var_0 ) { self endon( "death" ); self endon( "removed from battleChatter" ); var_1 = createchatphrase(); var_1 addorderalias( "displace", var_0 ); playphrase( var_1, 1 ); } tryorderto( var_0, var_1 ) { if ( randomint( 100 ) > anim.eventchance["response"]["order"] ) { if ( !isdefined( var_1 ) || isdefined( var_1 ) && !isplayer( var_1 ) ) return; } if ( isdefined( var_1 ) && isplayer( var_1 ) && isdefined( level.player.bcnameid ) ) { var_0 addplayernamealias(); var_0.looktarget = level.player; } else if ( isdefined( var_1 ) && cansayname( var_1 ) ) { var_0 addnamealias( var_1.bcname ); var_0.looktarget = var_1; var_1 animscripts\battlechatter_ai::addresponseevent( "ack", "yes", self, 0.9 ); } else level notify( "follow order", self ); } playinformevent() { self endon( "death" ); self endon( "removed from battleChatter" ); self.curevent = self.chatqueue["inform"]; var_0 = self.chatqueue["inform"].modifier; anim thread lockaction( self, "inform" ); switch ( self.chatqueue["inform"].eventtype ) { case "incoming": informincoming( var_0 ); break; case "attack": informattacking( var_0 ); break; case "reloading": informreloading( var_0 ); break; case "suppressed": informsuppressed( var_0 ); break; case "killfirm": informkillfirm( var_0 ); break; } self notify( "done speaking" ); } informreloading( var_0 ) { self endon( "death" ); self endon( "removed from battleChatter" ); var_1 = createchatphrase(); var_1 addinformalias( "reloading", var_0 ); playphrase( var_1 ); } informsuppressed( var_0 ) { self endon( "death" ); self endon( "removed from battleChatter" ); var_1 = createchatphrase(); var_1 addinformalias( "suppressed", var_0 ); playphrase( var_1 ); } informincoming( var_0 ) { self endon( "death" ); self endon( "removed from battleChatter" ); var_1 = createchatphrase(); if ( var_0 == "grenade" ) var_1.master = 1; var_1 addinformalias( "incoming", var_0 ); playphrase( var_1 ); } informattacking( var_0 ) { self endon( "death" ); self endon( "removed from battleChatter" ); var_1 = createchatphrase(); var_1 addinformalias( "attack", var_0 ); playphrase( var_1 ); } informkillfirm( var_0 ) { self endon( "death" ); self endon( "removed from battleChatter" ); var_1 = createchatphrase(); var_1 addinformalias( "killfirm", var_0 ); playphrase( var_1 ); } playcustomevent() { self endon( "death" ); self endon( "removed from battleChatter" ); self.curevent = self.chatqueue["custom"]; anim thread lockaction( self, self.curevent.type, 1 ); playphrase( self.customchatphrase ); self notify( "done speaking" ); self.customchatevent = undefined; self.customchatphrase = undefined; } playphrase( var_0, var_1 ) { anim endon( "battlechatter disabled" ); self endon( "dog_attacks_ai" ); self endon( "death" ); if ( isdefined( var_1 ) ) return; if ( battlechatter_canprint() || battlechatter_canprintdump() ) { var_2 = []; foreach ( var_4 in var_0.soundaliases ) var_2[var_2.size] = var_4; if ( battlechatter_canprint() ) battlechatter_print( var_2 ); if ( battlechatter_canprintdump() ) { var_6 = self.curevent.eventaction + "_" + self.curevent.eventtype; if ( isdefined( self.curevent.modifier ) ) var_6 = var_6 + ( "_" + self.curevent.modifier ); thread battlechatter_printdump( var_2, var_6 ); } } for ( var_7 = 0; var_7 < var_0.soundaliases.size; var_7++ ) { if ( !self.battlechatter ) { if ( !is_friendlyfire_event( self.curevent ) ) continue; else if ( !can_say_friendlyfire( 0 ) ) continue; } if ( self._animactive > 0 ) continue; if ( isfiltered( self.curevent.eventaction ) ) { wait 0.85; continue; } if ( !soundexists( var_0.soundaliases[var_7] ) ) continue; var_8 = gettime(); var_9 = spawn( "script_origin", self gettagorigin( "j_head" ) ); var_9 linkto( self ); thread stop_speaking( var_0.soundaliases[var_7], var_9 ); if ( var_0.master && self.team == "allies" ) { thread maps\_anim::anim_facialfiller( var_0.soundaliases[var_7], var_0.looktarget ); var_9 playsound( var_0.soundaliases[var_7], var_0.soundaliases[var_7], 1 ); var_9 waittill( var_0.soundaliases[var_7] ); self notify( var_0.soundaliases[var_7] ); } else { thread maps\_anim::anim_facialfiller( var_0.soundaliases[var_7], var_0.looktarget ); if ( getdvarint( "bcs_forceEnglish", 0 ) ) var_9 playsound( var_0.soundaliases[var_7], var_0.soundaliases[var_7], 1 ); else var_9 playsound( var_0.soundaliases[var_7], var_0.soundaliases[var_7], 1 ); var_9 waittill( var_0.soundaliases[var_7] ); self notify( var_0.soundaliases[var_7] ); } var_9 delete(); if ( gettime() < var_8 + 250 ) { } } self notify( "playPhrase_done" ); dotypelimit( self.curevent.eventaction, self.curevent.eventtype ); } stop_speaking( var_0, var_1 ) { var_1 endon( "death" ); common_scripts\utility::waittill_either( "death", "dog_attacks_ai" ); var_1 stopsounds(); common_scripts\utility::waitframe(); var_1 notify( var_0 ); var_1 delete(); } is_friendlyfire_event( var_0 ) { if ( !isdefined( var_0.eventaction ) || !isdefined( var_0.eventtype ) ) return 0; if ( var_0.eventaction == "reaction" && var_0.eventtype == "friendlyfire" ) return 1; return 0; } isspeakingfailsafe( var_0 ) { self endon( "death" ); self endon( "removed from battleChatter" ); wait 25; clearisspeaking( var_0 ); } clearisspeaking( var_0 ) { self.isspeaking = 0; self.chatqueue[var_0].expiretime = 0; self.chatqueue[var_0].priority = 0.0; self.nextsaytimes[var_0] = gettime() + anim.eventactionminwait[var_0]["self"]; } lockaction( var_0, var_1, var_2 ) { anim endon( "battlechatter disabled" ); var_3 = var_0.squad; var_4 = var_0.team; var_0.isspeaking = 1; var_0 thread isspeakingfailsafe( var_1 ); var_3.ismembersaying[var_1] = 1; var_3.numspeakers++; anim.isteamspeaking[var_4] = 1; anim.isteamsaying[var_4][var_1] = 1; var_5 = var_0 common_scripts\utility::waittill_any_return( "death", "done speaking", "cancel speaking" ); var_3.ismembersaying[var_1] = 0; var_3.numspeakers--; anim.isteamspeaking[var_4] = 0; anim.isteamsaying[var_4][var_1] = 0; if ( var_5 == "cancel speaking" ) return; anim.lastteamspeaktime[var_4] = gettime(); if ( isalive( var_0 ) ) var_0 clearisspeaking( var_1 ); var_3.nextsaytimes[var_1] = gettime() + anim.eventactionminwait[var_1]["squad"]; } updatecontact( var_0, var_1 ) { if ( gettime() - self.squadlist[var_0].lastcontact > 10000 ) { var_2 = 0; for ( var_3 = 0; var_3 < self.members.size; var_3++ ) { if ( self.members[var_3] != var_1 && isalive( self.members[var_3].enemy ) && isdefined( self.members[var_3].enemy.squad ) && self.members[var_3].enemy.squad.squadname == var_0 ) var_2 = 1; } if ( !var_2 ) { self.squadlist[var_0].firstcontact = gettime(); self.squadlist[var_0].calledout = 0; } } self.squadlist[var_0].lastcontact = gettime(); } cansay( var_0, var_1, var_2, var_3 ) { self endon( "death" ); self endon( "removed from battleChatter" ); if ( isplayer( self ) ) return 0; if ( distance( level.player.origin, self.origin ) > level.bcs_maxtalkingdistsqrdfromplayer ) return 0; if ( !isdefined( self.battlechatter ) || !self.battlechatter ) return 0; if ( isdefined( var_2 ) && var_2 >= 1 ) return 1; if ( gettime() + anim.eventactionminwait[var_0]["self"] < self.nextsaytimes[var_0] ) return 0; if ( gettime() + anim.eventactionminwait[var_0]["squad"] < self.squad.nextsaytimes[var_0] ) return 0; if ( isdefined( var_1 ) && typelimited( var_0, var_1 ) ) return 0; if ( isdefined( var_1 ) && anim.eventpriority[var_0][var_1] < self.bcs_minpriority ) return 0; return 1; } gethighestpriorityevent() { var_0 = undefined; var_1 = -999999999; foreach ( var_4, var_3 in self.chatqueue ) { if ( isvalidevent( var_4 ) ) { if ( var_3.priority > var_1 ) { var_0 = var_4; var_1 = var_3.priority; } } } return var_0; } gettargettingai( var_0 ) { var_1 = self.squad; var_2 = []; for ( var_3 = 0; var_3 < var_1.members.size; var_3++ ) { if ( isdefined( var_1.members[var_3].enemy ) && var_1.members[var_3].enemy == var_0 ) var_2[var_2.size] = var_1.members[var_3]; } if ( !isdefined( var_2[0] ) ) return undefined; var_4 = undefined; for ( var_3 = 0; var_3 < var_2.size; var_3++ ) { if ( var_2[var_3] cansay( "response" ) ) return var_4; } return common_scripts\utility::getclosest( self.origin, var_2 ); } getqueueevents() { var_0 = []; var_1 = []; var_0[0] = "custom"; var_0[1] = "response"; var_0[2] = "order"; var_0[3] = "threat"; var_0[4] = "inform"; for ( var_2 = var_0.size - 1; var_2 >= 0; var_2-- ) { for ( var_3 = 1; var_3 <= var_2; var_3++ ) { if ( self.chatqueue[var_0[var_3 - 1]].priority < self.chatqueue[var_0[var_3]].priority ) { var_4 = var_0[var_3 - 1]; var_0[var_3 - 1] = var_0[var_3]; var_0[var_3] = var_4; } } } var_5 = 0; for ( var_2 = 0; var_2 < var_0.size; var_2++ ) { var_6 = geteventstate( var_0[var_2] ); if ( var_6 == " valid" && !var_5 ) { var_5 = 1; var_1[var_2] = "g " + var_0[var_2] + var_6 + " " + self.chatqueue[var_0[var_2]].priority; continue; } if ( var_6 == " valid" ) { var_1[var_2] = "y " + var_0[var_2] + var_6 + " " + self.chatqueue[var_0[var_2]].priority; continue; } if ( self.chatqueue[var_0[var_2]].expiretime == 0 ) { var_1[var_2] = "b " + var_0[var_2] + var_6 + " " + self.chatqueue[var_0[var_2]].priority; continue; } var_1[var_2] = "r " + var_0[var_2] + var_6 + " " + self.chatqueue[var_0[var_2]].priority; } return var_1; } geteventstate( var_0 ) { var_1 = ""; if ( self.squad.ismembersaying[var_0] ) var_1 = var_1 + " playing"; if ( gettime() > self.chatqueue[var_0].expiretime ) var_1 = var_1 + " expired"; if ( gettime() < self.squad.nextsaytimes[var_0] ) var_1 = var_1 + " cantspeak"; if ( var_1 == "" ) var_1 = " valid"; return var_1; } isfiltered( var_0 ) { if ( getdvar( "bcs_filter" + var_0, "off" ) == "on" || getdvar( "bcs_filter" + var_0, "off" ) == "1" ) return 1; return 0; } isvalidevent( var_0 ) { if ( !self.squad.ismembersaying[var_0] && !anim.isteamsaying[self.team][var_0] && gettime() < self.chatqueue[var_0].expiretime && gettime() > self.squad.nextsaytimes[var_0] ) { if ( !typelimited( var_0, self.chatqueue[var_0].eventtype ) ) return 1; } return 0; } typelimited( var_0, var_1 ) { if ( !isdefined( anim.eventtypeminwait[var_0][var_1] ) ) return 0; if ( !isdefined( self.squad.nexttypesaytimes[var_0][var_1] ) ) return 0; if ( gettime() > self.squad.nexttypesaytimes[var_0][var_1] ) return 0; return 1; } dotypelimit( var_0, var_1 ) { if ( !isdefined( anim.eventtypeminwait[var_0][var_1] ) ) return; self.squad.nexttypesaytimes[var_0][var_1] = gettime() + anim.eventtypeminwait[var_0][var_1]; } bcissniper() { if ( isplayer( self ) ) return 0; if ( isexposed() ) return 0; return animscripts\utility::issniperrifle( self.weapon ); } isexposed( var_0 ) { if ( distancesquared( self.origin, level.player.origin ) > 2250000 ) return 0; if ( isdefined( var_0 ) && var_0 && isdefined( getlocation() ) ) return 0; var_1 = bcgetclaimednode(); if ( !isdefined( var_1 ) ) return 1; if ( !isnodecoverorconceal() ) return 0; return 1; } isnodecoverorconceal() { var_0 = self.node; if ( !isdefined( var_0 ) ) return 0; if ( issubstr( var_0.type, "Cover" ) || issubstr( var_0.type, "Conceal" ) ) return 1; return 0; } squadhasofficer( var_0 ) { if ( var_0.officercount > 0 ) return 1; else return 0; } isofficer() { var_0 = getrank(); if ( !isdefined( var_0 ) ) return 0; if ( var_0 == "sergeant" || var_0 == "lieutenant" || var_0 == "captain" || var_0 == "sergeant" ) return 1; return 0; } bcgetclaimednode() { if ( isplayer( self ) ) return self.node; else return animscripts\utility::getclaimednode(); } enemy_team_name() { if ( self isbadguy() ) return 1; else return 0; } getname() { if ( enemy_team_name() ) var_0 = self.ainame; else if ( self.team == "allies" ) var_0 = self.name; else var_0 = undefined; if ( !isdefined( var_0 ) ) return undefined; var_1 = strtok( var_0, " " ); if ( var_1.size < 2 ) return var_0; return var_1[1]; } getrank() { return self.airank; } getclosestfriendlyspeaker( var_0 ) { var_1 = getspeakers( var_0, self.team ); var_2 = common_scripts\utility::getclosest( self.origin, var_1 ); return var_2; } getspeakers( var_0, var_1 ) { var_2 = []; var_3 = getaiarray( var_1 ); for ( var_4 = 0; var_4 < var_3.size; var_4++ ) { if ( var_3[var_4] == self ) continue; if ( !var_3[var_4] cansay( var_0 ) ) continue; var_2[var_2.size] = var_3[var_4]; } return var_2; } getresponder( var_0, var_1, var_2 ) { var_3 = undefined; if ( !isdefined( var_2 ) ) var_2 = "response"; var_4 = common_scripts\utility::array_randomize( self.squad.members ); var_0 = var_0 * var_0; var_1 = var_1 * var_1; for ( var_5 = 0; var_5 < var_4.size; var_5++ ) { if ( var_4[var_5] == self ) continue; if ( !isalive( var_4[var_5] ) ) continue; var_6 = distancesquared( self.origin, var_4[var_5].origin ); if ( var_6 < var_0 ) continue; if ( var_6 > var_1 ) continue; if ( isusingsamevoice( var_4[var_5] ) ) continue; if ( !var_4[var_5] cansay( var_2 ) ) continue; var_3 = var_4[var_5]; if ( cansayname( var_3 ) ) break; } return var_3; } getlocation() { var_0 = get_all_my_locations(); var_0 = common_scripts\utility::array_randomize( var_0 ); if ( var_0.size ) { foreach ( var_2 in var_0 ) { if ( !location_called_out_ever( var_2 ) ) return var_2; } foreach ( var_2 in var_0 ) { if ( !location_called_out_recently( var_2 ) ) return var_2; } } return undefined; } getvalidlocation( var_0 ) { var_1 = get_all_my_locations(); var_1 = common_scripts\utility::array_randomize( var_1 ); if ( var_1.size ) { foreach ( var_3 in var_1 ) { if ( !location_called_out_ever( var_3 ) && var_0 cancalloutlocation( var_3 ) ) return var_3; } foreach ( var_3 in var_1 ) { if ( !location_called_out_recently( var_3 ) && var_0 cancalloutlocation( var_3 ) ) return var_3; } } return undefined; } get_all_my_locations() { var_0 = anim.bcs_locations; var_1 = self getistouchingentities( var_0 ); var_2 = []; foreach ( var_4 in var_1 ) { if ( isdefined( var_4.locationaliases ) ) var_2[var_2.size] = var_4; } return var_2; } update_bcs_locations() { if ( isdefined( anim.bcs_locations ) ) anim.bcs_locations = common_scripts\utility::array_removeundefined( anim.bcs_locations ); } is_in_callable_location() { var_0 = get_all_my_locations(); foreach ( var_2 in var_0 ) { if ( !location_called_out_recently( var_2 ) ) return 1; } return 0; } location_called_out_ever( var_0 ) { var_1 = location_get_last_callout_time( var_0 ); if ( !isdefined( var_1 ) ) return 0; return 1; } location_called_out_recently( var_0 ) { var_1 = location_get_last_callout_time( var_0 ); if ( !isdefined( var_1 ) ) return 0; var_2 = var_1 + anim.eventactionminwait["threat"]["location_repeat"]; if ( gettime() < var_2 ) return 1; return 0; } location_add_last_callout_time( var_0 ) { anim.locationlastcallouttimes[var_0.classname] = gettime(); } location_get_last_callout_time( var_0 ) { if ( isdefined( anim.locationlastcallouttimes[var_0.classname] ) ) return anim.locationlastcallouttimes[var_0.classname]; return undefined; } getrelativeangles( var_0 ) { var_1 = var_0.angles; if ( !isplayer( var_0 ) ) { var_2 = var_0 bcgetclaimednode(); if ( isdefined( var_2 ) ) var_1 = var_2.angles; } return var_1; } sideisleftright( var_0 ) { if ( var_0 == "left" || var_0 == "right" ) return 1; return 0; } getdirectionfacingflank( var_0, var_1, var_2 ) { var_3 = vectortoangles( var_2 ); var_4 = vectortoangles( var_1 - var_0 ); var_5 = var_3[1] - var_4[1]; var_5 = var_5 + 360; var_5 = int( var_5 ) % 360; if ( var_5 > 315 || var_5 < 45 ) var_6 = "front"; else if ( var_5 < 135 ) var_6 = "right"; else if ( var_5 < 225 ) var_6 = "rear"; else var_6 = "left"; return var_6; } normalizecompassdirection( var_0 ) { var_1 = undefined; switch ( var_0 ) { case "north": var_1 = "n"; break; case "northwest": var_1 = "nw"; break; case "west": var_1 = "w"; break; case "southwest": var_1 = "sw"; break; case "south": var_1 = "s"; break; case "southeast": var_1 = "se"; break; case "east": var_1 = "e"; break; case "northeast": var_1 = "ne"; break; case "impossible": var_1 = "impossible"; break; default: return; } return var_1; } getdirectioncompass( var_0, var_1 ) { var_2 = vectortoangles( var_1 - var_0 ); var_3 = var_2[1]; var_4 = getnorthyaw(); var_3 = var_3 - var_4; if ( var_3 < 0 ) var_3 = var_3 + 360; else if ( var_3 > 360 ) var_3 = var_3 - 360; if ( var_3 < 22.5 || var_3 > 337.5 ) var_5 = "north"; else if ( var_3 < 67.5 ) var_5 = "northwest"; else if ( var_3 < 112.5 ) var_5 = "west"; else if ( var_3 < 157.5 ) var_5 = "southwest"; else if ( var_3 < 202.5 ) var_5 = "south"; else if ( var_3 < 247.5 ) var_5 = "southeast"; else if ( var_3 < 292.5 ) var_5 = "east"; else if ( var_3 < 337.5 ) var_5 = "northeast"; else var_5 = "impossible"; return var_5; } getdistanceyards( var_0, var_1 ) { var_2 = distance2d( var_0, var_1 ); var_3 = 0.0254 * var_2; return var_3; } getdistanceyardsnormalized( var_0, var_1 ) { var_2 = getdistanceyards( var_0, var_1 ); if ( var_2 < 15.0 ) return "10"; else if ( var_2 < 25.0 ) return "20"; else if ( var_2 < 35.0 ) return "30"; else return "40"; } getfrontarcclockdirection( var_0 ) { var_1 = "undefined"; if ( var_0 == "10" || var_0 == "11" ) var_1 = "10"; else if ( var_0 == "12" ) var_1 = var_0; else if ( var_0 == "1" || var_0 == "2" ) var_1 = "2"; return var_1; } getdirectionfacingclock( var_0, var_1, var_2 ) { var_3 = anglestoforward( var_0 ); var_4 = vectornormalize( var_3 ); var_5 = vectortoangles( var_4 ); var_6 = vectortoangles( var_2 - var_1 ); var_7 = var_5[1] - var_6[1]; var_7 = var_7 + 360; var_7 = int( var_7 ) % 360; if ( var_7 > 345 || var_7 < 15 ) var_8 = "12"; else if ( var_7 < 45 ) var_8 = "1"; else if ( var_7 < 75 ) var_8 = "2"; else if ( var_7 < 105 ) var_8 = "3"; else if ( var_7 < 135 ) var_8 = "4"; else if ( var_7 < 165 ) var_8 = "5"; else if ( var_7 < 195 ) var_8 = "6"; else if ( var_7 < 225 ) var_8 = "7"; else if ( var_7 < 255 ) var_8 = "8"; else if ( var_7 < 285 ) var_8 = "9"; else if ( var_7 < 315 ) var_8 = "10"; else var_8 = "11"; return var_8; } getdegreeselevation( var_0, var_1 ) { var_2 = var_1[2] - var_0[2]; var_3 = distance2d( var_0, var_1 ); var_4 = atan( var_2 / var_3 ); if ( var_4 < 15 || var_4 > 55 ) return var_4; else if ( var_4 < 25 ) return 20; else if ( var_4 < 35 ) return 30; else if ( var_4 < 45 ) return 40; else if ( var_4 < 55 ) return 50; } getvectorrightangle( var_0 ) { return ( var_0[1], 0 - var_0[0], var_0[2] ); } getvectorarrayaverage( var_0 ) { var_1 = ( 0, 0, 0 ); for ( var_2 = 0; var_2 < var_0.size; var_2++ ) var_1 = var_1 + var_0[var_2]; return ( var_1[0] / var_0.size, var_1[1] / var_0.size, var_1[2] / var_0.size ); } addconcattargetalias( var_0 ) { var_1 = ""; if ( var_0 animscripts\utility::usingrocketlauncher() ) var_1 = "_rpg"; else if ( var_0 bcissniper() ) var_1 = "_sniper"; var_2 = self.owner.countryid + "_" + self.owner.npcid + "_concat_target" + var_1; self.soundaliases[self.soundaliases.size] = var_2; } addconcatdirectionalias( var_0, var_1 ) { var_2 = common_scripts\utility::random( [ "relative", "absolute" ] ); switch ( var_2 ) { case "absolute": var_3 = getdirectioncompass( level.player.origin, var_1.origin ); var_4 = normalizecompassdirection( var_3 ); if ( var_4 != "impossible" && var_4.size != 2 ) { var_5 = self.owner.countryid + "_" + self.owner.npcid + "_concat_dir_cmpss_" + var_4; self.soundaliases[self.soundaliases.size] = var_5; break; } case "relative": var_6 = getrelativeangles( var_0 ); var_7 = getdirectionfacingclock( var_6, var_0.origin, var_1.origin ); var_8 = int( var_7 ); if ( 1 < var_8 && var_8 < 5 && common_scripts\utility::cointoss() ) { var_5 = self.owner.countryid + "_" + self.owner.npcid + "_concat_dir_right"; self.soundaliases[self.soundaliases.size] = var_5; break; } else if ( 7 < var_8 && var_8 < 11 && common_scripts\utility::cointoss() ) { var_5 = self.owner.countryid + "_" + self.owner.npcid + "_concat_dir_left"; self.soundaliases[self.soundaliases.size] = var_5; break; } else { var_5 = self.owner.countryid + "_" + self.owner.npcid + "_concat_dir_clock_" + var_7; self.soundaliases[self.soundaliases.size] = var_5; } break; } } addnamealias( var_0 ) { self.soundaliases[self.soundaliases.size] = self.owner.countryid + "_" + self.owner.npcid + "_name_" + var_0; anim.lastnamesaid[self.owner.team] = var_0; anim.lastnamesaidtime[self.owner.team] = gettime(); } addplayernamealias() { if ( !self.owner cansayplayername() ) return; anim.lastplayernamecalltime = gettime(); var_0 = self.owner.countryid + "_" + self.owner.npcid + "_name_player_" + level.player.bccountryid + "_" + level.player.bcnameid; self.soundaliases[self.soundaliases.size] = var_0; self.looktarget = level.player; } addrankalias( var_0 ) { self.soundaliases[self.soundaliases.size] = self.owner.countryid + "_" + self.owner.npcid + "_rank_" + var_0; } cansayname( var_0 ) { if ( enemy_team_name() ) return 0; if ( !isdefined( var_0.bcname ) ) return 0; if ( var_0.battlechatter == 0 ) return 0; if ( !isdefined( var_0.countryid ) ) return 0; if ( self.countryid != var_0.countryid ) return 0; if ( namesaidrecently( var_0 ) ) return 0; var_1 = self.countryid + "_" + self.npcid + "_name_" + var_0.bcname; if ( soundexists( var_1 ) ) return 1; return 0; } namesaidrecently( var_0 ) { if ( anim.lastnamesaid[self.team] == var_0.bcname || gettime() - anim.lastnamesaidtime[self.team] < anim.lastnamesaidtimeout ) return 1; return 0; } cansayplayername() { if ( enemy_team_name() ) return 0; if ( !isdefined( level.player.bcnameid ) || !isdefined( level.player.bccountryid ) ) return 0; if ( player_name_called_recently() ) return 0; var_0 = self.countryid + "_" + self.npcid + "_name_player_" + level.player.bccountryid + "_" + level.player.bcnameid; if ( soundexists( var_0 ) ) return 1; return 0; } player_name_called_recently() { if ( !isdefined( anim.lastplayernamecalltime ) ) return 0; if ( gettime() - anim.lastplayernamecalltime >= anim.eventtypeminwait["playername"] ) return 0; return 1; } isusingsamevoice( var_0 ) { if ( isstring( self.npcid ) && isstring( var_0.npcid ) && self.npcid == var_0.npcid ) return 1; else if ( !isstring( self.npcid ) && !isstring( var_0.npcid ) && self.npcid == var_0.npcid ) return 1; else return 0; } addthreatalias( var_0, var_1 ) { var_2 = self.owner.countryid + "_" + self.owner.npcid + "_threat_" + var_0; if ( isdefined( var_1 ) ) var_2 = var_2 + ( "_" + var_1 ); self.soundaliases = common_scripts\utility::array_add( self.soundaliases, var_2 ); return 1; } addthreatexposedalias( var_0 ) { var_1 = self.owner.countryid + "_" + self.owner.npcid + "_exposed_" + var_0; self.soundaliases[self.soundaliases.size] = var_1; return 1; } addthreatobviousalias() { var_0 = self.owner.countryid + "_" + self.owner.npcid + "_order_action_suppress"; self.soundaliases[self.soundaliases.size] = var_0; return 1; } addthreatdistancealias( var_0 ) { var_1 = self.owner.countryid + "_" + self.owner.npcid + "_co_dist_" + var_0; self.soundaliases[self.soundaliases.size] = var_1; return 1; } addthreatelevationalias( var_0 ) { var_1 = self.owner.countryid + "_" + self.owner.npcid + "_co_elev_" + var_0; self.soundaliases[self.soundaliases.size] = var_1; return 1; } addthreatcalloutecho( var_0, var_1 ) { var_2 = createechoalias( var_0, var_1 ); if ( !soundexists( var_2 ) ) return 0; self.soundaliases[self.soundaliases.size] = var_2; return 1; } addthreatcalloutresponsealias( var_0 ) { var_1 = self.owner.countryid + "_" + self.owner.npcid + "_resp_ack_co_gnrc_" + var_0; if ( !soundexists( var_1 ) ) return 0; self.soundaliases[self.soundaliases.size] = var_1; return 1; } addthreatcalloutqa_nextline( var_0, var_1, var_2 ) { var_3 = undefined; foreach ( var_5 in var_2.locationaliases ) { if ( issubstr( var_1, var_5 ) ) { var_3 = var_5; break; } } var_7 = self.owner.countryid + "_" + self.owner.npcid + "_"; var_8 = getsubstr( var_1, var_1.size - 1, var_1.size ); var_9 = int( var_8 ) + 1; var_10 = var_7 + "co_loc_" + var_3 + "_qa" + var_9; if ( !soundexists( var_10 ) ) { if ( randomint( 100 ) < anim.eventchance["response"]["callout_negative"] ) var_0 animscripts\battlechatter_ai::addresponseevent( "callout", "neg", self.owner, 0.9 ); else var_0 animscripts\battlechatter_ai::addresponseevent( "exposed", "acquired", self.owner, 0.9 ); var_2.qafinished = 1; return 0; } var_0 animscripts\battlechatter_ai::addresponseevent( "callout", "QA", self.owner, 0.9, var_10, var_2 ); self.soundaliases[self.soundaliases.size] = var_10; return 1; } createechoalias( var_0, var_1 ) { var_2 = "_report"; var_3 = "_echo"; var_4 = self.owner.countryid + "_" + self.owner.npcid + "_"; var_5 = var_0.size - var_2.size; var_6 = self.owner.countryid + "_" + var_1.npcid + "_"; var_7 = var_6.size; var_8 = getsubstr( var_0, var_7, var_5 ); var_9 = var_4 + var_8 + var_3; return var_9; } addthreatcalloutalias( var_0, var_1 ) { var_2 = self.owner.countryid + "_" + self.owner.npcid + "_callout_" + var_0 + "_" + var_1; self.soundaliases[self.soundaliases.size] = var_2; return 1; } addthreatcalloutlandmarkalias( var_0, var_1, var_2 ) { var_3 = var_0.script_landmark; if ( !isdefined( var_2 ) ) var_2 = 0; var_4 = self.owner.countryid + "_" + self.owner.npcid + "_callout_obj_" + var_3; if ( var_2 ) var_4 = var_4 + "_y"; var_4 = var_4 + ( "_" + var_1 ); if ( !soundexists( var_4 ) ) return 0; self.soundaliases[self.soundaliases.size] = var_4; return 1; } addthreatcalloutlocationalias( var_0, var_1 ) { var_2 = undefined; var_3 = var_0.locationaliases; var_4 = var_3[0]; if ( var_3.size > 1 ) { var_5 = undefined; var_5 = var_0 getcannedresponse( self.owner ); if ( isdefined( var_5 ) ) var_4 = var_5; else var_4 = common_scripts\utility::random( var_3 ); } var_6 = undefined; if ( isdefined( var_1 ) && var_1 ) var_6 = self.owner getloccalloutalias( "concat_loc_" + var_4 ); else if ( !isdefined( var_0.qafinished ) && iscallouttypeqa( var_4, self.owner ) ) var_6 = self.owner getqacalloutalias( var_4, 0 ); else var_6 = self.owner getloccalloutalias( "co_loc_" + var_4 ); if ( soundexists( var_6 ) ) var_2 = var_6; if ( !isdefined( var_2 ) ) return 0; location_add_last_callout_time( var_0 ); self.soundaliases[self.soundaliases.size] = var_2; return 1; } addinformalias( var_0, var_1 ) { var_2 = self.owner.countryid + "_" + self.owner.npcid + "_inform_" + var_0 + "_" + var_1; self.soundaliases[self.soundaliases.size] = var_2; } addresponsealias( var_0, var_1 ) { var_2 = self.owner.countryid + "_" + self.owner.npcid + "_response_" + var_0 + "_" + var_1; self.soundaliases[self.soundaliases.size] = var_2; return 1; } addreactionalias( var_0, var_1 ) { var_2 = self.owner.countryid + "_" + self.owner.npcid + "_reaction_" + var_0 + "_" + var_1; self.soundaliases[self.soundaliases.size] = var_2; return 1; } addcheckfirealias() { var_0 = self.owner.countryid + "_" + self.owner.npcid + "_check_fire"; self.soundaliases[self.soundaliases.size] = var_0; return 1; } addtakingfirealias() { var_0 = self.owner.countryid + "_" + self.owner.npcid + "_inform_taking_fire"; self.soundaliases[self.soundaliases.size] = var_0; return 1; } addtauntalias( var_0, var_1 ) { var_2 = self.owner.countryid + "_" + self.owner.npcid + "_taunt"; self.soundaliases[self.soundaliases.size] = var_2; return 1; } addhostileburstalias() { var_0 = self.owner.countryid + "_" + self.owner.npcid + "_hostile_burst"; self.soundaliases[self.soundaliases.size] = var_0; return 1; } addorderalias( var_0, var_1 ) { var_2 = self.owner.countryid + "_" + self.owner.npcid + "_order_" + var_0 + "_" + var_1; self.soundaliases[self.soundaliases.size] = var_2; return 1; } initcontact( var_0 ) { if ( !isdefined( self.squadlist[var_0].calledout ) ) self.squadlist[var_0].calledout = 0; if ( !isdefined( self.squadlist[var_0].firstcontact ) ) self.squadlist[var_0].firstcontact = 2000000000; if ( !isdefined( self.squadlist[var_0].lastcontact ) ) self.squadlist[var_0].lastcontact = 0; } shutdowncontact( var_0 ) { self.squadlist[var_0].calledout = undefined; self.squadlist[var_0].firstcontact = undefined; self.squadlist[var_0].lastcontact = undefined; } createchatevent( var_0, var_1, var_2 ) { var_3 = spawnstruct(); var_3.owner = self; var_3.eventtype = var_1; var_3.eventaction = var_0; if ( isdefined( var_2 ) ) var_3.priority = var_2; else var_3.priority = anim.eventpriority[var_0][var_1]; var_3.expiretime = gettime() + anim.eventduration[var_0][var_1]; return var_3; } createchatphrase() { var_0 = spawnstruct(); var_0.owner = self; var_0.soundaliases = []; var_0.master = 0; return var_0; } pointinfov( var_0 ) { return common_scripts\utility::within_fov( self.origin, self.angles, var_0, 0.766 ); } entinfrontarc( var_0 ) { return common_scripts\utility::within_fov( self.origin, self.angles, var_0.origin, 0 ); } squadflavorbursttransmissions() { anim endon( "battlechatter disabled" ); self endon( "squad_deleting" ); if ( self.team != "allies" ) return; while ( self.membercount <= 0 ) wait 0.5; wait 0.5; var_0 = 0; while ( isdefined( self ) ) { if ( !squadcanburst( self ) ) { var_0 = 1; wait 1; continue; } else if ( self.fbt_firstburst ) { if ( !var_0 ) wait( randomfloat( anim.fbt_waitmin ) ); if ( var_0 ) var_0 = 0; self.fbt_firstburst = 0; } else { if ( !var_0 ) wait( randomfloatrange( anim.fbt_waitmin, anim.fbt_waitmax ) ); if ( var_0 ) var_0 = 0; } var_1 = getburster( self ); if ( !isdefined( var_1 ) ) continue; var_2 = var_1.voice; var_3 = getflavorburstid( self, var_2 ); var_4 = getflavorburstaliases( var_2, var_3 ); foreach ( var_8, var_6 in var_4 ) { if ( !var_1 candoflavorburst() || distance( level.player.origin, var_1.origin ) > anim.fbt_desireddistmax ) { for ( var_7 = 0; var_7 < self.members.size; var_7++ ) { var_1 = getburster( self ); if ( !isdefined( var_1 ) ) continue; if ( var_1.voice == var_2 ) break; } if ( !isdefined( var_1 ) || var_1.voice != var_2 ) break; } thread playflavorburstline( var_1, var_6 ); self waittill( "burst_line_done" ); if ( var_8 != var_4.size - 1 ) wait( randomfloatrange( anim.fbt_linebreakmin, anim.fbt_linebreakmax ) ); } } } squadcanburst( var_0 ) { var_1 = 0; foreach ( var_3 in var_0.members ) { if ( var_3 candoflavorburst() ) { var_1 = 1; break; } } return var_1; } candoflavorburst() { var_0 = 0; if ( !isplayer( self ) && isalive( self ) && self.classname != "actor_enemy_dog" && level.flavorbursts[self.team] && voicecanburst() && self.flavorbursts ) var_0 = 1; return var_0; } voicecanburst() { if ( isdefined( anim.flavorburstvoices[self.voice] ) && anim.flavorburstvoices[self.voice] ) return 1; return 0; } getburster( var_0 ) { var_1 = undefined; var_2 = common_scripts\utility::get_array_of_farthest( level.player.origin, var_0.members ); foreach ( var_4 in var_2 ) { if ( var_4 candoflavorburst() ) { var_1 = var_4; if ( !isdefined( var_0.fbt_lastbursterid ) ) break; if ( isdefined( var_0.fbt_lastbursterid ) && var_0.fbt_lastbursterid == var_1.unique_id ) continue; } } if ( isdefined( var_1 ) ) var_0.fbt_lastbursterid = var_1.unique_id; return var_1; } getflavorburstid( var_0, var_1 ) { var_2 = common_scripts\utility::array_randomize( anim.flavorbursts[var_1] ); if ( anim.flavorburstsused.size >= var_2.size ) anim.flavorburstsused = []; var_3 = undefined; foreach ( var_5 in var_2 ) { var_3 = var_5; if ( !flavorburstwouldrepeat( var_3 ) ) break; } anim.flavorburstsused[anim.flavorburstsused.size] = var_3; return var_3; } flavorburstwouldrepeat( var_0 ) { if ( !anim.flavorburstsused.size ) return 0; var_1 = 0; foreach ( var_3 in anim.flavorburstsused ) { if ( var_3 == var_0 ) { var_1 = 1; break; } } return var_1; } getflavorburstaliases( var_0, var_1, var_2 ) { if ( !isdefined( var_2 ) ) var_2 = 1; var_3 = var_2; var_4 = []; for (;;) { var_5 = "FB_" + anim.countryids[var_0] + "_" + var_1 + "_" + var_3; var_3++; if ( soundexists( var_5 ) ) { var_4[var_4.size] = var_5; continue; } break; } return var_4; } playflavorburstline( var_0, var_1 ) { anim endon( "battlechatter disabled" ); var_2 = spawn( "script_origin", var_0 gettagorigin( "j_head" ) ); var_2 linkto( var_0 ); var_2 playsound( var_1, var_1, 1 ); var_2 waittill( var_1 ); var_2 delete(); if ( isdefined( self ) ) self notify( "burst_line_done" ); } flavorburstlinedebug( var_0, var_1 ) { self endon( "burst_line_done" ); for (;;) wait 0.05; } battlechatter_canprint() { return 0; } battlechatter_canprintdump() { return 0; } battlechatter_print( var_0 ) { if ( var_0.size <= 0 ) return; if ( !battlechatter_canprint() ) return; var_1 = "^5 "; if ( enemy_team_name() ) var_1 = "^6 "; foreach ( var_3 in var_0 ) { } } battlechatter_printdump( var_0, var_1 ) { } getaliastypefromsoundalias( var_0 ) { var_1 = self.countryid + "_" + self.npcid + "_"; var_2 = getsubstr( var_0, var_1.size, var_0.size ); return var_2; } battlechatter_printdumpline( var_0, var_1, var_2 ) { if ( common_scripts\utility::flag( var_2 ) ) common_scripts\utility::flag_wait( var_2 ); common_scripts\utility::flag_set( var_2 ); common_scripts\utility::flag_clear( var_2 ); } bcdrawobjects() { for ( var_0 = 0; var_0 < anim.bcs_locations.size; var_0++ ) { var_1 = anim.bcs_locations[var_0].locationaliases; if ( !isdefined( var_1 ) ) continue; var_2 = ""; foreach ( var_4 in var_1 ) var_2 = var_2 + var_4; thread drawbcobject( "Location: " + var_2, anim.bcs_locations[var_0] getorigin(), ( 0, 0, 8 ), ( 1, 1, 1 ) ); } } drawbcobject( var_0, var_1, var_2, var_3 ) { for (;;) { if ( distancesquared( level.player.origin, var_1 ) > 4194304 ) { wait 0.1; continue; } wait 0.05; } } drawbcdirections( var_0, var_1, var_2 ) { var_3 = var_0 getorigin(); for (;;) { if ( distancesquared( level.player.origin, var_3 ) > 4194304 ) { wait 0.1; continue; } var_4 = getdirectioncompass( level.player.origin, var_3 ); var_4 = normalizecompassdirection( var_4 ); var_5 = getdirectionfacingclock( level.player.angles, level.player.origin, var_3 ); var_6 = var_4 + ", " + var_5 + ":00"; wait 0.05; } } resetnextsaytimes( var_0, var_1 ) { var_2 = getaiarray( var_0 ); for ( var_3 = 0; var_3 < var_2.size; var_3++ ) { var_4 = var_2[var_3]; if ( !isalive( var_4 ) ) continue; if ( !isdefined( var_4.battlechatter ) ) continue; var_4.nextsaytimes[var_1] = gettime() + 350; var_4.squad.nextsaytimes[var_1] = gettime() + 350; } } voice_is_british_based() { self endon( "death" ); if ( self.voice == "british" ) return 1; else return 0; } friendlyfire_warning() { if ( !can_say_friendlyfire() ) return 0; dotypelimit( "reaction", "friendlyfire" ); thread playreactionevent(); return 1; } can_say_friendlyfire( var_0 ) { if ( isdefined( self.friendlyfire_warnings_disable ) ) return 0; if ( !isdefined( self.chatqueue ) ) return 0; if ( !isdefined( self.chatqueue["reaction"] ) || !isdefined( self.chatqueue["reaction"].eventtype ) ) return 0; if ( self.chatqueue["reaction"].eventtype != "friendlyfire" ) return 0; if ( gettime() > self.chatqueue["reaction"].expiretime ) return 0; if ( !isdefined( var_0 ) ) var_0 = 1; if ( var_0 ) { if ( isdefined( self.squad.nexttypesaytimes["reaction"]["friendlyfire"] ) ) { if ( gettime() < self.squad.nexttypesaytimes["reaction"]["friendlyfire"] ) return 0; } } return 1; }