1430 lines
46 KiB
Plaintext
1430 lines
46 KiB
Plaintext
// IW6 GSC SOURCE
|
|
// Generated by https://github.com/xensik/gsc-tool
|
|
|
|
init()
|
|
{
|
|
init_template_table();
|
|
init_class_table();
|
|
init_perktable();
|
|
init_bot_weap_statstable();
|
|
init_bot_attachmenttable();
|
|
init_bot_camotable();
|
|
level.bot_loadouts_initialized = 1;
|
|
}
|
|
|
|
init_class_table()
|
|
{
|
|
var_0 = "mp/botClassTable.csv";
|
|
level.botloadoutsets = [];
|
|
var_1 = bot_loadout_fields();
|
|
var_2 = 0;
|
|
|
|
for (;;)
|
|
{
|
|
var_2++;
|
|
var_3 = tablelookup( var_0, 0, "botPersonalities", var_2 );
|
|
var_4 = tablelookup( var_0, 0, "botDifficulties", var_2 );
|
|
|
|
if ( !isdefined( var_3 ) || var_3 == "" )
|
|
break;
|
|
|
|
if ( !isdefined( var_4 ) || var_4 == "" )
|
|
break;
|
|
|
|
var_5 = [];
|
|
|
|
foreach ( var_7 in var_1 )
|
|
var_5[var_7] = tablelookup( var_0, 0, var_7, var_2 );
|
|
|
|
var_9 = strtok( var_3, "| " );
|
|
var_10 = strtok( var_4, "| " );
|
|
|
|
foreach ( var_12 in var_9 )
|
|
{
|
|
foreach ( var_14 in var_10 )
|
|
{
|
|
var_15 = bot_loadout_set( var_12, var_14, 1 );
|
|
var_16 = spawnstruct();
|
|
var_16.loadoutvalues = var_5;
|
|
var_15.loadouts[var_15.loadouts.size] = var_16;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
init_template_table()
|
|
{
|
|
var_0 = "mp/botTemplateTable.csv";
|
|
level.botloadouttemplates = [];
|
|
var_1 = bot_loadout_fields();
|
|
var_2 = 0;
|
|
|
|
for (;;)
|
|
{
|
|
var_2++;
|
|
var_3 = tablelookup( var_0, 0, "template_", var_2 );
|
|
|
|
if ( !isdefined( var_3 ) || var_3 == "" )
|
|
break;
|
|
|
|
var_4 = "template_" + var_3;
|
|
level.botloadouttemplates[var_4] = [];
|
|
|
|
foreach ( var_6 in var_1 )
|
|
{
|
|
var_7 = tablelookup( var_0, 0, var_6, var_2 );
|
|
|
|
if ( isdefined( var_7 ) && var_7 != "" )
|
|
level.botloadouttemplates[var_4][var_6] = var_7;
|
|
}
|
|
}
|
|
}
|
|
|
|
bot_loadout_item_allowed( var_0, var_1, var_2 )
|
|
{
|
|
if ( !isusingmatchrulesdata() )
|
|
return 1;
|
|
|
|
if ( !getmatchrulesdata( "commonOption", "allowCustomClasses" ) )
|
|
return 1;
|
|
|
|
if ( var_1 == "specialty_null" )
|
|
return 1;
|
|
|
|
if ( var_1 == "none" )
|
|
return 1;
|
|
|
|
if ( var_0 == "equipment" )
|
|
{
|
|
if ( getmatchrulesdata( "commonOption", "perkRestricted", var_1 ) )
|
|
return 0;
|
|
|
|
var_0 = "weapon";
|
|
}
|
|
|
|
var_3 = var_0 + "Restricted";
|
|
var_4 = var_0 + "ClassRestricted";
|
|
var_5 = "";
|
|
|
|
switch ( var_0 )
|
|
{
|
|
case "weapon":
|
|
var_5 = maps\mp\_utility::getweaponclass( var_1 );
|
|
break;
|
|
case "attachment":
|
|
var_5 = maps\mp\_utility::getattachmenttype( var_1 );
|
|
break;
|
|
case "killstreak":
|
|
var_5 = var_2;
|
|
break;
|
|
case "perk":
|
|
var_5 = "ability_" + level.bot_perktypes[var_1];
|
|
break;
|
|
default:
|
|
return 0;
|
|
}
|
|
|
|
if ( getmatchrulesdata( "commonOption", var_3, var_1 ) )
|
|
return 0;
|
|
|
|
if ( getmatchrulesdata( "commonOption", var_4, var_5 ) )
|
|
return 0;
|
|
|
|
return 1;
|
|
}
|
|
|
|
bot_loadout_choose_fallback_primary( var_0 )
|
|
{
|
|
var_1 = "none";
|
|
var_2 = [ "veteran", "hardened", "regular", "recruit" ];
|
|
var_2 = common_scripts\utility::array_randomize( var_2 );
|
|
|
|
foreach ( var_4 in var_2 )
|
|
{
|
|
var_1 = bot_loadout_choose_from_statstable( "weap_statstable", var_0, "loadoutPrimary", self.personality, var_4 );
|
|
|
|
if ( var_1 != "none" )
|
|
return var_1;
|
|
}
|
|
|
|
if ( isdefined( level.bot_personality_list ) )
|
|
{
|
|
var_6 = common_scripts\utility::array_randomize( level.bot_personality_list );
|
|
|
|
foreach ( var_8 in var_6 )
|
|
{
|
|
foreach ( var_4 in var_2 )
|
|
{
|
|
var_1 = bot_loadout_choose_from_statstable( "weap_statstable", var_0, "loadoutPrimary", var_8, var_4 );
|
|
|
|
if ( var_1 != "none" )
|
|
{
|
|
self.bot_fallback_personality = var_8;
|
|
return var_1;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if ( isusingmatchrulesdata() )
|
|
{
|
|
for ( var_12 = 0; var_12 < 6 && ( !isdefined( var_1 ) || var_1 == "none" || var_1 == "" ); var_12++ )
|
|
{
|
|
if ( getmatchrulesdata( "defaultClasses", self.team, var_12, "class", "inUse" ) )
|
|
{
|
|
var_1 = getmatchrulesdata( "defaultClasses", self.team, var_12, "class", "weaponSetups", 0, "weapon" );
|
|
|
|
if ( var_1 != "none" )
|
|
{
|
|
self.bot_fallback_personality = "weapon";
|
|
return var_1;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
self.bot_fallback_personality = "weapon";
|
|
return level.bot_fallback_weapon;
|
|
}
|
|
|
|
bot_pick_personality_from_weapon( var_0 )
|
|
{
|
|
if ( isdefined( var_0 ) )
|
|
{
|
|
var_1 = level.bot_weap_personality[var_0];
|
|
|
|
if ( isdefined( var_1 ) )
|
|
{
|
|
var_2 = strtok( var_1, "| " );
|
|
|
|
if ( var_2.size > 0 )
|
|
maps\mp\bots\_bots_util::bot_set_personality( common_scripts\utility::random( var_2 ) );
|
|
}
|
|
}
|
|
}
|
|
|
|
bot_loadout_fields()
|
|
{
|
|
var_0 = [];
|
|
var_0[var_0.size] = "loadoutPrimary";
|
|
var_0[var_0.size] = "loadoutPrimaryBuff";
|
|
var_0[var_0.size] = "loadoutPrimaryAttachment";
|
|
var_0[var_0.size] = "loadoutPrimaryAttachment2";
|
|
var_0[var_0.size] = "loadoutPrimaryCamo";
|
|
var_0[var_0.size] = "loadoutPrimaryReticle";
|
|
var_0[var_0.size] = "loadoutSecondary";
|
|
var_0[var_0.size] = "loadoutSecondaryBuff";
|
|
var_0[var_0.size] = "loadoutSecondaryAttachment";
|
|
var_0[var_0.size] = "loadoutSecondaryAttachment2";
|
|
var_0[var_0.size] = "loadoutSecondaryCamo";
|
|
var_0[var_0.size] = "loadoutSecondaryReticle";
|
|
var_0[var_0.size] = "loadoutEquipment";
|
|
var_0[var_0.size] = "loadoutOffhand";
|
|
var_0[var_0.size] = "loadoutStreakType";
|
|
var_0[var_0.size] = "loadoutStreak1";
|
|
var_0[var_0.size] = "loadoutStreak2";
|
|
var_0[var_0.size] = "loadoutStreak3";
|
|
var_0[var_0.size] = "loadoutPerk1";
|
|
var_0[var_0.size] = "loadoutPerk2";
|
|
var_0[var_0.size] = "loadoutPerk3";
|
|
var_0[var_0.size] = "loadoutPerk4";
|
|
var_0[var_0.size] = "loadoutPerk5";
|
|
var_0[var_0.size] = "loadoutPerk6";
|
|
var_0[var_0.size] = "loadoutPerk7";
|
|
var_0[var_0.size] = "loadoutPerk8";
|
|
var_0[var_0.size] = "loadoutPerk9";
|
|
var_0[var_0.size] = "loadoutPerk10";
|
|
var_0[var_0.size] = "loadoutPerk11";
|
|
var_0[var_0.size] = "loadoutPerk12";
|
|
var_0[var_0.size] = "loadoutPerk13";
|
|
var_0[var_0.size] = "loadoutPerk14";
|
|
var_0[var_0.size] = "loadoutPerk15";
|
|
var_0[var_0.size] = "loadoutPerk16";
|
|
var_0[var_0.size] = "loadoutPerk17";
|
|
var_0[var_0.size] = "loadoutPerk18";
|
|
var_0[var_0.size] = "loadoutPerk19";
|
|
var_0[var_0.size] = "loadoutPerk20";
|
|
var_0[var_0.size] = "loadoutPerk21";
|
|
var_0[var_0.size] = "loadoutPerk22";
|
|
var_0[var_0.size] = "loadoutPerk23";
|
|
return var_0;
|
|
}
|
|
|
|
bot_loadout_set( var_0, var_1, var_2 )
|
|
{
|
|
var_3 = var_1 + "_" + var_0;
|
|
|
|
if ( !isdefined( level.botloadoutsets ) )
|
|
level.botloadoutsets = [];
|
|
|
|
if ( !isdefined( level.botloadoutsets[var_3] ) && var_2 )
|
|
{
|
|
level.botloadoutsets[var_3] = spawnstruct();
|
|
level.botloadoutsets[var_3].loadouts = [];
|
|
}
|
|
|
|
if ( isdefined( level.botloadoutsets[var_3] ) )
|
|
return level.botloadoutsets[var_3];
|
|
}
|
|
|
|
bot_loadout_pick( var_0, var_1 )
|
|
{
|
|
var_2 = bot_loadout_set( var_0, var_1, 0 );
|
|
|
|
if ( isdefined( var_2 ) && isdefined( var_2.loadouts ) && var_2.loadouts.size > 0 )
|
|
{
|
|
var_3 = randomint( var_2.loadouts.size );
|
|
return var_2.loadouts[var_3].loadoutvalues;
|
|
}
|
|
}
|
|
|
|
bot_validate_weapon( var_0, var_1, var_2, var_3 )
|
|
{
|
|
var_4 = maps\mp\_utility::getweaponattachmentarrayfromstats( var_0 );
|
|
|
|
if ( isdefined( var_1 ) && var_1 != "none" && !bot_loadout_item_allowed( "attachment", var_1 ) )
|
|
return 0;
|
|
|
|
if ( isdefined( var_2 ) && var_2 != "none" && !bot_loadout_item_allowed( "attachment", var_2 ) )
|
|
return 0;
|
|
|
|
if ( isdefined( var_3 ) && var_3 != "none" && !bot_loadout_item_allowed( "attachment", var_3 ) )
|
|
return 0;
|
|
|
|
if ( var_1 != "none" && !common_scripts\utility::array_contains( var_4, var_1 ) )
|
|
return 0;
|
|
|
|
if ( var_2 != "none" && !common_scripts\utility::array_contains( var_4, var_2 ) )
|
|
return 0;
|
|
|
|
if ( isdefined( var_3 ) && var_3 != "none" && !common_scripts\utility::array_contains( var_4, var_3 ) )
|
|
return 0;
|
|
|
|
if ( ( var_1 == "none" || var_2 == "none" ) && ( !isdefined( var_3 ) || var_3 == "none" ) )
|
|
return 1;
|
|
|
|
if ( !isdefined( level.bot_invalid_attachment_combos ) )
|
|
{
|
|
level.bot_invalid_attachment_combos = [];
|
|
level.allowable_double_attachments = [];
|
|
var_5 = "mp/attachmentcombos.csv";
|
|
var_6 = 0;
|
|
|
|
for (;;)
|
|
{
|
|
var_6++;
|
|
var_7 = tablelookupbyrow( var_5, 0, var_6 );
|
|
|
|
if ( var_7 == "" )
|
|
break;
|
|
|
|
var_8 = 0;
|
|
|
|
for (;;)
|
|
{
|
|
var_8++;
|
|
var_9 = tablelookupbyrow( var_5, var_8, 0 );
|
|
|
|
if ( var_9 == "" )
|
|
break;
|
|
|
|
if ( var_9 == var_7 )
|
|
{
|
|
if ( tablelookupbyrow( var_5, var_8, var_6 ) != "no" )
|
|
level.allowable_double_attachments[var_9] = 1;
|
|
|
|
continue;
|
|
}
|
|
|
|
if ( tablelookupbyrow( var_5, var_8, var_6 ) == "no" )
|
|
level.bot_invalid_attachment_combos[var_7][var_9] = 1;
|
|
}
|
|
}
|
|
}
|
|
|
|
if ( var_1 == var_2 && !isdefined( level.allowable_double_attachments[var_1] ) )
|
|
return 0;
|
|
|
|
if ( isdefined( var_3 ) )
|
|
{
|
|
if ( var_2 == var_3 && !isdefined( level.allowable_double_attachments[var_2] ) )
|
|
return 0;
|
|
|
|
if ( var_1 == var_3 && !isdefined( level.allowable_double_attachments[var_1] ) )
|
|
return 0;
|
|
|
|
if ( var_3 != "none" && var_1 == var_3 && var_2 == var_3 )
|
|
return 0;
|
|
|
|
if ( isdefined( level.bot_invalid_attachment_combos[var_2] ) && isdefined( level.bot_invalid_attachment_combos[var_2][var_3] ) )
|
|
return 0;
|
|
|
|
if ( isdefined( level.bot_invalid_attachment_combos[var_1] ) && isdefined( level.bot_invalid_attachment_combos[var_1][var_3] ) )
|
|
return 0;
|
|
}
|
|
|
|
return !( isdefined( level.bot_invalid_attachment_combos[var_1] ) && isdefined( level.bot_invalid_attachment_combos[var_1][var_2] ) );
|
|
}
|
|
|
|
bot_validate_reticle( var_0, var_1, var_2 )
|
|
{
|
|
if ( isdefined( var_1[var_0 + "Attachment"] ) && isdefined( level.bot_attachment_reticle[var_1[var_0 + "Attachment"]] ) )
|
|
return 1;
|
|
|
|
if ( isdefined( var_1[var_0 + "Attachment2"] ) && isdefined( level.bot_attachment_reticle[var_1[var_0 + "Attachment2"]] ) )
|
|
return 1;
|
|
|
|
if ( isdefined( var_1[var_0 + "Attachment3"] ) && isdefined( level.bot_attachment_reticle[var_1[var_0 + "Attachment3"]] ) )
|
|
return 1;
|
|
|
|
return 0;
|
|
}
|
|
|
|
bot_perk_cost( var_0 )
|
|
{
|
|
return level.perktable_costs[var_0];
|
|
}
|
|
|
|
perktable_add( var_0, var_1 )
|
|
{
|
|
if ( bot_perk_cost( var_0 ) > 0 )
|
|
{
|
|
var_2 = [];
|
|
var_2["type"] = var_1;
|
|
var_2["name"] = var_0;
|
|
level.bot_perktable[level.bot_perktable.size] = var_2;
|
|
level.bot_perktypes[var_0] = var_1;
|
|
}
|
|
}
|
|
|
|
init_perktable()
|
|
{
|
|
level.perktable_costs = [];
|
|
var_0 = 1;
|
|
|
|
for (;;)
|
|
{
|
|
var_1 = tablelookupbyrow( "mp/perktable.csv", var_0, 1 );
|
|
|
|
if ( var_1 == "" )
|
|
break;
|
|
|
|
level.perktable_costs[var_1] = int( tablelookupbyrow( "mp/perktable.csv", var_0, 10 ) );
|
|
var_0++;
|
|
}
|
|
|
|
level.perktable_costs["none"] = 0;
|
|
level.perktable_costs["specialty_null"] = 0;
|
|
level.bot_perktable = [];
|
|
level.bot_perktypes = [];
|
|
var_0 = 1;
|
|
|
|
for ( var_2 = "ability_null"; isdefined( var_2 ) && var_2 != ""; var_2 = tablelookupbyrow( "mp/cacabilitytable.csv", var_0, 1 ) )
|
|
{
|
|
var_2 = getsubstr( var_2, 8 );
|
|
|
|
for ( var_3 = 4; var_3 <= 13; var_3++ )
|
|
{
|
|
var_1 = tablelookupbyrow( "mp/cacabilitytable.csv", var_0, var_3 );
|
|
|
|
if ( var_1 != "" )
|
|
perktable_add( var_1, var_2 );
|
|
}
|
|
|
|
var_0++;
|
|
}
|
|
}
|
|
|
|
init_bot_weap_statstable()
|
|
{
|
|
var_0 = "mp/statstable.csv";
|
|
var_1 = 4;
|
|
var_2 = 37;
|
|
var_3 = 38;
|
|
level.bot_weap_statstable = [];
|
|
level.bot_weap_personality = [];
|
|
var_4 = 1;
|
|
|
|
for (;;)
|
|
{
|
|
var_5 = tablelookupbyrow( var_0, var_4, var_1 );
|
|
|
|
if ( var_5 == "specialty_null" )
|
|
break;
|
|
|
|
var_6 = tablelookupbyrow( var_0, var_4, var_3 );
|
|
var_7 = tablelookupbyrow( var_0, var_4, var_2 );
|
|
|
|
if ( var_5 != "" && var_7 != "" )
|
|
level.bot_weap_personality[var_5] = var_7;
|
|
|
|
if ( var_6 != "" && var_5 != "" && var_7 != "" )
|
|
{
|
|
var_8 = "loadoutPrimary";
|
|
|
|
if ( maps\mp\gametypes\_class::isvalidsecondary( var_5, 0 ) )
|
|
var_8 = "loadoutSecondary";
|
|
else if ( !maps\mp\gametypes\_class::isvalidprimary( var_5, 0 ) )
|
|
{
|
|
var_4++;
|
|
continue;
|
|
}
|
|
|
|
if ( !isdefined( level.bot_weap_statstable[var_8] ) )
|
|
level.bot_weap_statstable[var_8] = [];
|
|
|
|
var_9 = strtok( var_7, "| " );
|
|
var_10 = strtok( var_6, "| " );
|
|
|
|
foreach ( var_12 in var_9 )
|
|
{
|
|
if ( !isdefined( level.bot_weap_statstable[var_8][var_12] ) )
|
|
level.bot_weap_statstable[var_8][var_12] = [];
|
|
|
|
foreach ( var_14 in var_10 )
|
|
{
|
|
if ( !isdefined( level.bot_weap_statstable[var_8][var_12][var_14] ) )
|
|
level.bot_weap_statstable[var_8][var_12][var_14] = [];
|
|
|
|
var_15 = level.bot_weap_statstable[var_8][var_12][var_14].size;
|
|
level.bot_weap_statstable[var_8][var_12][var_14][var_15] = var_5;
|
|
}
|
|
}
|
|
}
|
|
|
|
var_4++;
|
|
}
|
|
}
|
|
|
|
bot_loadout_choose_from_statstable( var_0, var_1, var_2, var_3, var_4 )
|
|
{
|
|
var_5 = "specialty_null";
|
|
|
|
if ( var_2 == "loadoutPrimary" )
|
|
var_5 = "iw6_honeybadger";
|
|
else if ( var_2 == "loadoutSecondary" )
|
|
var_5 = "iw6_p226";
|
|
|
|
if ( var_3 == "default" )
|
|
var_3 = "run_and_gun";
|
|
|
|
if ( var_2 == "loadoutSecondary" && common_scripts\utility::array_contains( var_1, "specialty_twoprimaries" ) )
|
|
var_2 = "loadoutPrimary";
|
|
|
|
if ( !isdefined( level.bot_weap_statstable ) )
|
|
return var_5;
|
|
|
|
if ( !isdefined( level.bot_weap_statstable[var_2] ) )
|
|
return var_5;
|
|
|
|
if ( !isdefined( level.bot_weap_statstable[var_2][var_3] ) )
|
|
return var_5;
|
|
|
|
if ( !isdefined( level.bot_weap_statstable[var_2][var_3][var_4] ) )
|
|
return var_5;
|
|
|
|
var_5 = bot_loadout_choose_from_set( level.bot_weap_statstable[var_2][var_3][var_4], var_0, var_1, var_2 );
|
|
return var_5;
|
|
}
|
|
|
|
bot_loadout_choose_from_perktable( var_0, var_1, var_2, var_3, var_4, var_5 )
|
|
{
|
|
var_6 = "specialty_null";
|
|
|
|
if ( !isdefined( level.bot_perktable ) )
|
|
return var_6;
|
|
|
|
if ( !isdefined( level.bot_perktable_groups ) )
|
|
level.bot_perktable_groups = [];
|
|
|
|
if ( !isdefined( level.bot_perktable_groups[var_0] ) )
|
|
{
|
|
var_7 = strtok( var_0, "_" );
|
|
var_7[0] = "";
|
|
var_8 = 0;
|
|
|
|
if ( common_scripts\utility::array_contains( var_7, "any" ) )
|
|
var_8 = 1;
|
|
|
|
var_9 = [];
|
|
|
|
foreach ( var_11 in level.bot_perktable )
|
|
{
|
|
if ( var_8 || common_scripts\utility::array_contains( var_7, var_11["type"] ) )
|
|
var_9[var_9.size] = var_11["name"];
|
|
}
|
|
|
|
level.bot_perktable_groups[var_0] = var_9;
|
|
}
|
|
|
|
if ( level.bot_perktable_groups[var_0].size > 0 )
|
|
var_6 = bot_loadout_choose_from_set( level.bot_perktable_groups[var_0], var_1, var_2, var_3 );
|
|
|
|
return var_6;
|
|
}
|
|
|
|
bot_validate_perk( var_0, var_1, var_2, var_3, var_4, var_5 )
|
|
{
|
|
var_6 = var_4 - var_3 + 1;
|
|
|
|
if ( isdefined( var_5 ) )
|
|
var_6 = var_5;
|
|
|
|
var_7 = 0;
|
|
var_8 = int( getsubstr( var_1, 11 ) );
|
|
|
|
if ( var_0 == "specialty_twoprimaries" )
|
|
return 0;
|
|
|
|
if ( var_0 == "specialty_extra_attachment" )
|
|
return 0;
|
|
|
|
if ( !bot_loadout_item_allowed( "perk", var_0 ) )
|
|
return 0;
|
|
|
|
for ( var_9 = var_8 - 1; var_9 > 0; var_9-- )
|
|
{
|
|
var_10 = "loadoutPerk" + var_9;
|
|
|
|
if ( var_2[var_10] == "none" || var_2[var_10] == "specialty_null" )
|
|
continue;
|
|
|
|
if ( var_0 == var_2[var_10] )
|
|
return 0;
|
|
|
|
if ( var_9 >= var_3 && var_9 <= var_4 )
|
|
var_7 = var_7 + bot_perk_cost( var_2[var_10] );
|
|
}
|
|
|
|
if ( var_7 + bot_perk_cost( var_0 ) > var_6 )
|
|
return 0;
|
|
|
|
return 1;
|
|
}
|
|
|
|
bot_loadout_choose_from_default_class( var_0, var_1, var_2, var_3, var_4, var_5 )
|
|
{
|
|
var_6 = int( getsubstr( var_0, 5, 6 ) ) - 1;
|
|
|
|
switch ( var_3 )
|
|
{
|
|
case "loadoutPrimary":
|
|
return maps\mp\gametypes\_class::table_getweapon( level.classtablename, var_6, 0 );
|
|
case "loadoutPrimaryAttachment":
|
|
return maps\mp\gametypes\_class::table_getweaponattachment( level.classtablename, var_6, 0, 0 );
|
|
case "loadoutPrimaryAttachment2":
|
|
return maps\mp\gametypes\_class::table_getweaponattachment( level.classtablename, var_6, 0, 1 );
|
|
case "loadoutPrimaryBuff":
|
|
return maps\mp\gametypes\_class::table_getweaponbuff( level.classtablename, var_6, 0 );
|
|
case "loadoutPrimaryCamo":
|
|
return maps\mp\gametypes\_class::table_getweaponcamo( level.classtablename, var_6, 0 );
|
|
case "loadoutPrimaryReticle":
|
|
return maps\mp\gametypes\_class::table_getweaponreticle( level.classtablename, var_6, 0 );
|
|
case "loadoutSecondary":
|
|
return maps\mp\gametypes\_class::table_getweapon( level.classtablename, var_6, 1 );
|
|
case "loadoutSecondaryAttachment":
|
|
return maps\mp\gametypes\_class::table_getweaponattachment( level.classtablename, var_6, 1, 0 );
|
|
case "loadoutSecondaryAttachment2":
|
|
return maps\mp\gametypes\_class::table_getweaponattachment( level.classtablename, var_6, 1, 1 );
|
|
case "loadoutSecondaryBuff":
|
|
return maps\mp\gametypes\_class::table_getweaponbuff( level.classtablename, var_6, 1 );
|
|
case "loadoutSecondaryCamo":
|
|
return maps\mp\gametypes\_class::table_getweaponcamo( level.classtablename, var_6, 1 );
|
|
case "loadoutSecondaryReticle":
|
|
return maps\mp\gametypes\_class::table_getweaponreticle( level.classtablename, var_6, 1 );
|
|
case "loadoutEquipment":
|
|
return maps\mp\gametypes\_class::table_getequipment( level.classtablename, var_6, 0 );
|
|
case "loadoutOffhand":
|
|
return maps\mp\gametypes\_class::table_getoffhand( level.classtablename, var_6, 0 );
|
|
case "loadoutStreak1":
|
|
return maps\mp\gametypes\_class::table_getkillstreak( level.classtablename, var_6, 0 );
|
|
case "loadoutStreak2":
|
|
return maps\mp\gametypes\_class::table_getkillstreak( level.classtablename, var_6, 1 );
|
|
case "loadoutStreak3":
|
|
return maps\mp\gametypes\_class::table_getkillstreak( level.classtablename, var_6, 2 );
|
|
case "loadoutPerk6":
|
|
case "loadoutPerk5":
|
|
case "loadoutPerk4":
|
|
case "loadoutPerk3":
|
|
case "loadoutPerk2":
|
|
case "loadoutPerk1":
|
|
var_7 = int( getsubstr( var_3, 11 ) );
|
|
var_8 = maps\mp\gametypes\_class::table_getperk( level.classtablename, var_6, var_7 );
|
|
|
|
if ( var_8 == "" )
|
|
return "specialty_null";
|
|
|
|
var_9 = int( getsubstr( var_8, 0, 1 ) );
|
|
var_10 = int( getsubstr( var_8, 1, 2 ) );
|
|
var_11 = tablelookupbyrow( "mp/cacabilitytable.csv", var_9 + 1, var_10 + 3 );
|
|
return var_11;
|
|
}
|
|
|
|
return var_0;
|
|
}
|
|
|
|
init_bot_attachmenttable()
|
|
{
|
|
var_0 = "mp/attachmenttable.csv";
|
|
var_1 = 5;
|
|
var_2 = 19;
|
|
var_3 = 11;
|
|
level.bot_attachmenttable = [];
|
|
level.bot_attachment_reticle = [];
|
|
var_4 = 1;
|
|
|
|
for (;;)
|
|
{
|
|
var_5 = tablelookupbyrow( var_0, var_4, var_1 );
|
|
|
|
if ( var_5 == "done" )
|
|
break;
|
|
|
|
var_6 = tablelookupbyrow( var_0, var_4, var_2 );
|
|
|
|
if ( var_5 != "" && var_6 != "" )
|
|
{
|
|
var_7 = tablelookupbyrow( var_0, var_4, var_3 );
|
|
|
|
if ( var_7 == "TRUE" )
|
|
level.bot_attachment_reticle[var_5] = 1;
|
|
|
|
var_8 = strtok( var_6, "| " );
|
|
|
|
foreach ( var_10 in var_8 )
|
|
{
|
|
if ( !isdefined( level.bot_attachmenttable[var_10] ) )
|
|
level.bot_attachmenttable[var_10] = [];
|
|
|
|
if ( !common_scripts\utility::array_contains( level.bot_attachmenttable[var_10], var_5 ) )
|
|
{
|
|
var_11 = level.bot_attachmenttable[var_10].size;
|
|
level.bot_attachmenttable[var_10][var_11] = var_5;
|
|
}
|
|
}
|
|
}
|
|
|
|
var_4++;
|
|
}
|
|
}
|
|
|
|
bot_loadout_choose_from_attachmenttable( var_0, var_1, var_2, var_3, var_4 )
|
|
{
|
|
var_5 = "none";
|
|
|
|
if ( !isdefined( level.bot_attachmenttable ) )
|
|
return var_5;
|
|
|
|
if ( !isdefined( level.bot_attachmenttable[var_4] ) )
|
|
return var_5;
|
|
|
|
var_5 = bot_loadout_choose_from_set( level.bot_attachmenttable[var_4], var_0, var_1, var_2 );
|
|
return var_5;
|
|
}
|
|
|
|
init_bot_camotable()
|
|
{
|
|
var_0 = "mp/camotable.csv";
|
|
var_1 = 1;
|
|
var_2 = 5;
|
|
level.bot_camotable = [];
|
|
var_3 = 0;
|
|
|
|
for (;;)
|
|
{
|
|
var_4 = tablelookupbyrow( var_0, var_3, var_1 );
|
|
|
|
if ( !isdefined( var_4 ) || var_4 == "" )
|
|
break;
|
|
|
|
var_5 = tablelookupbyrow( var_0, var_3, var_2 );
|
|
|
|
if ( isdefined( var_5 ) && int( var_5 ) )
|
|
level.bot_camotable[level.bot_camotable.size] = var_4;
|
|
|
|
var_3++;
|
|
}
|
|
}
|
|
|
|
bot_loadout_choose_from_camotable( var_0, var_1, var_2, var_3, var_4 )
|
|
{
|
|
var_5 = "none";
|
|
|
|
if ( !isdefined( level.bot_camotable ) )
|
|
return var_5;
|
|
|
|
var_5 = bot_loadout_choose_from_set( level.bot_camotable, var_0, var_1, var_2 );
|
|
return var_5;
|
|
}
|
|
|
|
bot_loadout_perk_slots( var_0 )
|
|
{
|
|
var_1 = 8;
|
|
|
|
if ( isdefined( var_0["loadoutPrimary"] ) && var_0["loadoutPrimary"] == "none" )
|
|
var_1 = var_1 + 1;
|
|
|
|
if ( isdefined( var_0["loadoutSecondary"] ) && var_0["loadoutSecondary"] == "none" )
|
|
var_1 = var_1 + 1;
|
|
|
|
if ( isdefined( var_0["loadoutEquipment"] ) && var_0["loadoutEquipment"] == "none" )
|
|
var_1 = var_1 + 1;
|
|
|
|
if ( isdefined( var_0["loadoutOffhand"] ) && var_0["loadoutOffhand"] == "none" )
|
|
var_1 = var_1 + 1;
|
|
|
|
return var_1;
|
|
}
|
|
|
|
bot_loadout_valid_choice( var_0, var_1, var_2, var_3 )
|
|
{
|
|
var_4 = 1;
|
|
|
|
switch ( var_2 )
|
|
{
|
|
case "loadoutPrimary":
|
|
var_4 = bot_loadout_item_allowed( "weapon", var_3 );
|
|
break;
|
|
case "loadoutOffhand":
|
|
case "loadoutEquipment":
|
|
var_4 = bot_loadout_item_allowed( "equipment", var_3 );
|
|
break;
|
|
case "loadoutPrimaryBuff":
|
|
var_4 = maps\mp\gametypes\_class::isvalidweaponbuff( var_3, var_1["loadoutPrimary"] );
|
|
break;
|
|
case "loadoutPrimaryAttachment":
|
|
var_4 = bot_validate_weapon( var_1["loadoutPrimary"], var_3, "none" );
|
|
break;
|
|
case "loadoutPrimaryAttachment2":
|
|
var_4 = bot_validate_weapon( var_1["loadoutPrimary"], var_1["loadoutPrimaryAttachment"], var_3 );
|
|
break;
|
|
case "loadoutPrimaryAttachment3":
|
|
var_4 = bot_validate_weapon( var_1["loadoutPrimary"], var_1["loadoutPrimaryAttachment"], var_1["loadoutPrimaryAttachment2"], var_3 );
|
|
break;
|
|
case "loadoutPrimaryReticle":
|
|
var_4 = bot_validate_reticle( "loadoutPrimary", var_1, var_3 );
|
|
break;
|
|
case "loadoutPrimaryCamo":
|
|
var_4 = !isdefined( self.botloadoutfavoritecamo ) || var_3 == self.botloadoutfavoritecamo;
|
|
break;
|
|
case "loadoutSecondary":
|
|
var_4 = var_3 != var_1["loadoutPrimary"];
|
|
var_4 = var_4 && bot_loadout_item_allowed( "weapon", var_3 );
|
|
break;
|
|
case "loadoutSecondaryBuff":
|
|
var_4 = maps\mp\gametypes\_class::isvalidweaponbuff( var_3, var_1["loadoutSecondary"] );
|
|
break;
|
|
case "loadoutSecondaryAttachment":
|
|
var_4 = bot_validate_weapon( var_1["loadoutSecondary"], var_3, "none" );
|
|
break;
|
|
case "loadoutSecondaryAttachment2":
|
|
var_4 = bot_validate_weapon( var_1["loadoutSecondary"], var_1["loadoutSecondaryAttachment"], var_3 );
|
|
break;
|
|
case "loadoutSecondaryAttachment3":
|
|
var_4 = bot_validate_weapon( var_1["loadoutSecondary"], var_1["loadoutSecondaryAttachment"], var_1["loadoutSecondaryAttachment2"], var_3 );
|
|
break;
|
|
case "loadoutSecondaryReticle":
|
|
var_4 = bot_validate_reticle( "loadoutSecondary", var_1, var_3 );
|
|
break;
|
|
case "loadoutSecondaryCamo":
|
|
var_4 = !isdefined( self.botloadoutfavoritecamo ) || var_3 == self.botloadoutfavoritecamo;
|
|
break;
|
|
case "loadoutStreak3":
|
|
case "loadoutStreak2":
|
|
case "loadoutStreak1":
|
|
var_4 = maps\mp\bots\_bots_ks::bot_killstreak_is_valid_internal( var_3, "bots", undefined, var_1["loadoutStreakType"] );
|
|
var_4 = var_4 && bot_loadout_item_allowed( "killstreak", var_3, var_1["loadoutStreakType"] );
|
|
break;
|
|
case "loadoutPerk12":
|
|
case "loadoutPerk11":
|
|
case "loadoutPerk10":
|
|
case "loadoutPerk9":
|
|
case "loadoutPerk8":
|
|
case "loadoutPerk7":
|
|
case "loadoutPerk6":
|
|
case "loadoutPerk5":
|
|
case "loadoutPerk4":
|
|
case "loadoutPerk3":
|
|
case "loadoutPerk2":
|
|
case "loadoutPerk1":
|
|
var_4 = bot_validate_perk( var_3, var_2, var_1, 1, 12, bot_loadout_perk_slots( var_1 ) );
|
|
break;
|
|
case "loadoutPerk15":
|
|
case "loadoutPerk14":
|
|
case "loadoutPerk13":
|
|
if ( var_1["loadoutStreakType"] != "streaktype_specialist" )
|
|
var_4 = 0;
|
|
else
|
|
var_4 = bot_validate_perk( var_3, var_2, var_1, -1, -1 );
|
|
|
|
break;
|
|
case "loadoutPerk23":
|
|
case "loadoutPerk22":
|
|
case "loadoutPerk21":
|
|
case "loadoutPerk20":
|
|
case "loadoutPerk19":
|
|
case "loadoutPerk18":
|
|
case "loadoutPerk17":
|
|
case "loadoutPerk16":
|
|
if ( var_1["loadoutStreakType"] != "streaktype_specialist" )
|
|
var_4 = 0;
|
|
else
|
|
var_4 = bot_validate_perk( var_3, var_2, var_1, 16, 23, 8 );
|
|
|
|
break;
|
|
}
|
|
|
|
return var_4;
|
|
}
|
|
|
|
bot_loadout_choose_from_set( var_0, var_1, var_2, var_3, var_4 )
|
|
{
|
|
var_5 = "none";
|
|
var_6 = undefined;
|
|
var_7 = 0.0;
|
|
|
|
if ( common_scripts\utility::array_contains( var_0, "specialty_null" ) )
|
|
var_5 = "specialty_null";
|
|
|
|
foreach ( var_9 in var_0 )
|
|
{
|
|
var_10 = undefined;
|
|
|
|
if ( getsubstr( var_9, 0, 9 ) == "template_" )
|
|
{
|
|
var_10 = var_9;
|
|
var_11 = level.botloadouttemplates[var_9][var_3];
|
|
var_9 = bot_loadout_choose_from_set( strtok( var_11, "| " ), var_1, var_2, var_3, 1 );
|
|
|
|
if ( isdefined( var_10 ) && isdefined( self.chosentemplates[var_10] ) )
|
|
return var_9;
|
|
}
|
|
|
|
if ( var_9 == "attachmenttable" )
|
|
return bot_loadout_choose_from_attachmenttable( var_1, var_2, var_3, self.personality, self.difficulty );
|
|
|
|
if ( var_9 == "weap_statstable" )
|
|
return bot_loadout_choose_from_statstable( var_1, var_2, var_3, self.personality, self.difficulty );
|
|
|
|
if ( var_9 == "camotable" )
|
|
return bot_loadout_choose_from_camotable( var_1, var_2, var_3, self.personality, self.difficulty );
|
|
|
|
if ( getsubstr( var_9, 0, 5 ) == "class" && int( getsubstr( var_9, 5, 6 ) ) > 0 )
|
|
var_9 = bot_loadout_choose_from_default_class( var_9, var_1, var_2, var_3, self.personality, self.difficulty );
|
|
|
|
if ( isdefined( level.bot_perktable ) && getsubstr( var_9, 0, 10 ) == "perktable_" )
|
|
return bot_loadout_choose_from_perktable( var_9, var_1, var_2, var_3, self.personality, self.difficulty );
|
|
|
|
if ( bot_loadout_valid_choice( var_1, var_2, var_3, var_9 ) )
|
|
{
|
|
var_7 = var_7 + 1.0;
|
|
|
|
if ( randomfloat( 1.0 ) <= 1.0 / var_7 )
|
|
{
|
|
var_5 = var_9;
|
|
var_6 = var_10;
|
|
}
|
|
}
|
|
}
|
|
|
|
if ( isdefined( var_6 ) )
|
|
self.chosentemplates[var_6] = 1;
|
|
|
|
return var_5;
|
|
}
|
|
|
|
bot_loadout_choose_values( var_0 )
|
|
{
|
|
self.chosentemplates = [];
|
|
|
|
foreach ( var_6, var_2 in var_0 )
|
|
{
|
|
var_3 = strtok( var_2, "| " );
|
|
var_4 = bot_loadout_choose_from_set( var_3, var_2, var_0, var_6 );
|
|
var_0[var_6] = var_4;
|
|
}
|
|
|
|
return var_0;
|
|
}
|
|
|
|
bot_load_setup_difficulty_squad_match( var_0 )
|
|
{
|
|
var_1 = "recruit";
|
|
|
|
for ( var_2 = 18; var_2 >= 0; var_2-- )
|
|
{
|
|
var_3 = int( tablelookupbyrow( "mp/squadEloTable.csv", var_2, 0 ) );
|
|
|
|
if ( var_0 >= var_3 || var_2 == 0 )
|
|
return tablelookupbyrow( "mp/squadEloTable.csv", var_2, self.pers["squadSlot"] + 1 );
|
|
}
|
|
|
|
return var_1;
|
|
}
|
|
|
|
bot_loadout_get_difficulty()
|
|
{
|
|
var_0 = "regular";
|
|
|
|
if ( getdvar( "squad_match" ) == "1" )
|
|
var_0 = bot_load_setup_difficulty_squad_match( getsquadassaultelo() );
|
|
else
|
|
{
|
|
var_0 = self botgetdifficulty();
|
|
|
|
if ( var_0 == "default" )
|
|
{
|
|
maps\mp\bots\_bots_util::bot_set_difficulty( "default" );
|
|
var_0 = self botgetdifficulty();
|
|
}
|
|
}
|
|
|
|
return var_0;
|
|
}
|
|
|
|
bot_loadout_class_callback()
|
|
{
|
|
while ( !isdefined( level.bot_loadouts_initialized ) )
|
|
wait 0.05;
|
|
|
|
while ( !isdefined( self.personality ) )
|
|
wait 0.05;
|
|
|
|
var_0 = [];
|
|
var_1 = bot_loadout_get_difficulty();
|
|
self.difficulty = var_1;
|
|
var_2 = self botgetpersonality();
|
|
|
|
if ( getdvar( "squad_match" ) == "1" )
|
|
{
|
|
var_0 = bot_loadout_setup_squad_match( var_0 );
|
|
var_2 = self botgetpersonality();
|
|
}
|
|
else if ( getdvar( "squad_vs_squad" ) == "1" )
|
|
{
|
|
var_0 = bot_loadout_setup_squad_vs_squad_match( var_0 );
|
|
var_2 = self botgetpersonality();
|
|
}
|
|
else if ( getdvar( "squad_use_hosts_squad" ) == "1" && level.wargame_client.team == self.team )
|
|
{
|
|
var_0 = bot_loadout_setup_wargame_match( var_0 );
|
|
var_2 = self botgetpersonality();
|
|
}
|
|
else
|
|
{
|
|
if ( isdefined( self.botlastloadout ) )
|
|
{
|
|
var_3 = self.botlastloadoutdifficulty == var_1;
|
|
var_4 = self.botlastloadoutpersonality == var_2;
|
|
|
|
if ( var_3 && var_4 && ( !isdefined( self.hasdied ) || self.hasdied ) && !isdefined( self.respawn_with_launcher ) )
|
|
return self.botlastloadout;
|
|
}
|
|
|
|
var_0 = bot_loadout_pick( var_2, var_1 );
|
|
var_0 = bot_loadout_choose_values( var_0 );
|
|
|
|
if ( isdefined( level.bot_funcs["gametype_loadout_modify"] ) )
|
|
var_0 = self [[ level.bot_funcs["gametype_loadout_modify"] ]]( var_0 );
|
|
|
|
if ( var_0["loadoutPrimary"] == "none" )
|
|
{
|
|
self.bot_fallback_personality = undefined;
|
|
var_0["loadoutPrimary"] = bot_loadout_choose_fallback_primary( var_0 );
|
|
var_0["loadoutPrimaryCamo"] = "none";
|
|
var_0["loadoutPrimaryAttachment"] = "none";
|
|
var_0["loadoutPrimaryAttachment2"] = "none";
|
|
var_0["loadoutPrimaryAttachment3"] = "none";
|
|
var_0["loadoutPrimaryReticle"] = "none";
|
|
|
|
if ( isdefined( self.bot_fallback_personality ) )
|
|
{
|
|
if ( self.bot_fallback_personality == "weapon" )
|
|
bot_pick_personality_from_weapon( var_0["loadoutPrimary"] );
|
|
else
|
|
maps\mp\bots\_bots_util::bot_set_personality( self.bot_fallback_personality );
|
|
|
|
var_2 = self.personality;
|
|
self.bot_fallback_personality = undefined;
|
|
}
|
|
}
|
|
|
|
self.botlastloadout = var_0;
|
|
self.botlastloadoutdifficulty = var_1;
|
|
self.botlastloadoutpersonality = var_2;
|
|
|
|
if ( isdefined( var_0["loadoutPrimaryCamo"] ) && var_0["loadoutPrimaryCamo"] != "none" )
|
|
self.botloadoutfavoritecamo = var_0["loadoutPrimaryCamo"];
|
|
|
|
if ( isdefined( self.respawn_with_launcher ) )
|
|
{
|
|
if ( isdefined( level.bot_respawn_launcher_name ) && bot_loadout_item_allowed( "weapon", level.bot_respawn_launcher_name ) )
|
|
{
|
|
var_0["loadoutSecondary"] = level.bot_respawn_launcher_name;
|
|
var_0["loadoutSecondaryAttachment"] = "none";
|
|
var_0["loadoutSecondaryAttachment2"] = "none";
|
|
self.botlastloadout = undefined;
|
|
}
|
|
|
|
self.respawn_with_launcher = undefined;
|
|
}
|
|
}
|
|
|
|
var_0 = bot_loadout_setup_perks( var_0 );
|
|
maps\mp\gametypes\_class::isvalidkillstreak( var_0["loadoutStreak1"] );
|
|
maps\mp\gametypes\_class::isvalidkillstreak( var_0["loadoutStreak2"] );
|
|
maps\mp\gametypes\_class::isvalidkillstreak( var_0["loadoutStreak3"] );
|
|
|
|
if ( maps\mp\_utility::bot_israndom() )
|
|
{
|
|
if ( common_scripts\utility::array_contains( self.pers["loadoutPerks"], "specialty_twoprimaries" ) )
|
|
{
|
|
var_5 = bot_loadout_pick( "cqb", var_1 );
|
|
var_0["loadoutSecondary"] = var_5["loadoutPrimary"];
|
|
var_0["loadoutSecondaryAttachment"] = var_5["loadoutPrimaryAttachment"];
|
|
var_0["loadoutSecondaryAttachment2"] = var_5["loadoutPrimaryAttachment2"];
|
|
var_0 = bot_loadout_choose_values( var_0 );
|
|
var_0 = bot_loadout_setup_perks( var_0 );
|
|
}
|
|
|
|
if ( common_scripts\utility::array_contains( self.pers["loadoutPerks"], "specialty_extra_attachment" ) )
|
|
{
|
|
var_6 = bot_loadout_pick( var_2, var_1 );
|
|
var_0["loadoutPrimaryAttachment3"] = var_6["loadoutPrimaryAttachment2"];
|
|
|
|
if ( common_scripts\utility::array_contains( self.pers["loadoutPerks"], "specialty_twoprimaries" ) )
|
|
var_0["loadoutSecondaryAttachment2"] = var_6["loadoutPrimaryAttachment2"];
|
|
else
|
|
var_0["loadoutSecondaryAttachment2"] = var_6["loadoutSecondaryAttachment2"];
|
|
|
|
var_0 = bot_loadout_choose_values( var_0 );
|
|
var_0 = bot_loadout_setup_perks( var_0 );
|
|
}
|
|
else
|
|
{
|
|
var_0["loadoutSecondaryAttachment2"] = "none";
|
|
|
|
if ( !bot_validate_reticle( "loadoutSecondary", var_0, var_0["loadoutSecondaryReticle"] ) )
|
|
var_0["loadoutSecondaryReticle"] = "none";
|
|
}
|
|
}
|
|
|
|
return var_0;
|
|
}
|
|
|
|
bot_loadout_setup_perks( var_0 )
|
|
{
|
|
self.pers["loadoutPerks"] = [];
|
|
self.pers["specialistBonusStreaks"] = [];
|
|
self.pers["specialistStreaks"] = [];
|
|
self.pers["specialistStreakKills"] = [];
|
|
var_1 = 0;
|
|
var_2 = isdefined( var_0["loadoutStreakType"] ) && var_0["loadoutStreakType"] == "streaktype_specialist";
|
|
|
|
if ( var_2 )
|
|
{
|
|
var_0["loadoutStreak1"] = "none";
|
|
var_0["loadoutStreak2"] = "none";
|
|
var_0["loadoutStreak3"] = "none";
|
|
}
|
|
|
|
foreach ( var_8, var_4 in var_0 )
|
|
{
|
|
if ( var_4 == "specialty_null" || var_4 == "none" )
|
|
continue;
|
|
|
|
if ( getsubstr( var_8, 0, 11 ) == "loadoutPerk" )
|
|
{
|
|
var_5 = int( getsubstr( var_8, 11 ) );
|
|
|
|
if ( !var_2 && var_5 > 12 )
|
|
continue;
|
|
|
|
var_6 = maps\mp\_utility::getbaseperkname( var_4 );
|
|
|
|
if ( var_5 <= 12 )
|
|
self.pers["loadoutPerks"][self.pers["loadoutPerks"].size] = var_6;
|
|
else if ( var_5 <= 15 )
|
|
{
|
|
var_0["loadoutStreak" + ( var_1 + 1 )] = var_6 + "_ks";
|
|
self.pers["specialistStreaks"][self.pers["specialistStreaks"].size] = var_6 + "_ks";
|
|
var_7 = 0;
|
|
|
|
if ( var_1 > 0 )
|
|
var_7 = self.pers["specialistStreakKills"][self.pers["specialistStreakKills"].size - 1];
|
|
|
|
self.pers["specialistStreakKills"][self.pers["specialistStreakKills"].size] = var_7 + bot_perk_cost( var_6 ) + 2;
|
|
var_1++;
|
|
}
|
|
else
|
|
self.pers["specialistBonusStreaks"][self.pers["specialistBonusStreaks"].size] = var_6;
|
|
}
|
|
}
|
|
|
|
if ( var_2 && !isdefined( self.pers["specialistStreakKills"][0] ) )
|
|
{
|
|
self.pers["specialistStreakKills"][0] = 0;
|
|
self.pers["specialistStreaks"][0] = "specialty_null";
|
|
}
|
|
|
|
if ( var_2 && !isdefined( self.pers["specialistStreakKills"][1] ) )
|
|
{
|
|
self.pers["specialistStreakKills"][1] = self.pers["specialistStreakKills"][0];
|
|
self.pers["specialistStreaks"][1] = "specialty_null";
|
|
}
|
|
|
|
if ( var_2 && !isdefined( self.pers["specialistStreakKills"][2] ) )
|
|
{
|
|
self.pers["specialistStreakKills"][2] = self.pers["specialistStreakKills"][1];
|
|
self.pers["specialistStreaks"][2] = "specialty_null";
|
|
}
|
|
|
|
return var_0;
|
|
}
|
|
|
|
bot_setup_loadout_callback()
|
|
{
|
|
var_0 = self botgetpersonality();
|
|
var_1 = bot_loadout_get_difficulty();
|
|
var_2 = bot_loadout_set( var_0, var_1, 0 );
|
|
|
|
if ( isdefined( var_2 ) && isdefined( var_2.loadouts ) && var_2.loadouts.size > 0 )
|
|
{
|
|
self.classcallback = ::bot_loadout_class_callback;
|
|
return 1;
|
|
}
|
|
|
|
var_3 = getsubstr( self.name, 0, self.name.size - 10 );
|
|
self.classcallback = undefined;
|
|
return 0;
|
|
}
|
|
|
|
bot_squad_lookup_private( var_0, var_1, var_2, var_3, var_4, var_5, var_6 )
|
|
{
|
|
if ( isdefined( var_6 ) )
|
|
return var_0 getprivateplayerdata( "privateMatchSquadMembers", var_1, "loadouts", var_2, var_3, var_4, var_5, var_6 );
|
|
else if ( isdefined( var_5 ) )
|
|
return var_0 getprivateplayerdata( "privateMatchSquadMembers", var_1, "loadouts", var_2, var_3, var_4, var_5 );
|
|
else if ( isdefined( var_4 ) )
|
|
return var_0 getprivateplayerdata( "privateMatchSquadMembers", var_1, "loadouts", var_2, var_3, var_4 );
|
|
else
|
|
return var_0 getprivateplayerdata( "privateMatchSquadMembers", var_1, "loadouts", var_2, var_3 );
|
|
}
|
|
|
|
bot_squad_lookup_ranked( var_0, var_1, var_2, var_3, var_4, var_5, var_6 )
|
|
{
|
|
if ( isdefined( var_6 ) )
|
|
return var_0 getrankedplayerdata( "squadMembers", var_1, "loadouts", var_2, var_3, var_4, var_5, var_6 );
|
|
else if ( isdefined( var_5 ) )
|
|
return var_0 getrankedplayerdata( "squadMembers", var_1, "loadouts", var_2, var_3, var_4, var_5 );
|
|
else if ( isdefined( var_4 ) )
|
|
return var_0 getrankedplayerdata( "squadMembers", var_1, "loadouts", var_2, var_3, var_4 );
|
|
else
|
|
return var_0 getrankedplayerdata( "squadMembers", var_1, "loadouts", var_2, var_3 );
|
|
}
|
|
|
|
bot_squad_lookup_enemy( var_0, var_1, var_2, var_3, var_4, var_5, var_6 )
|
|
{
|
|
if ( isdefined( var_6 ) )
|
|
return getenemysquaddata( "squadMembers", var_1, "loadouts", var_2, var_3, var_4, var_5, var_6 );
|
|
else if ( isdefined( var_5 ) )
|
|
return getenemysquaddata( "squadMembers", var_1, "loadouts", var_2, var_3, var_4, var_5 );
|
|
else if ( isdefined( var_4 ) )
|
|
return getenemysquaddata( "squadMembers", var_1, "loadouts", var_2, var_3, var_4 );
|
|
else
|
|
return getenemysquaddata( "squadMembers", var_1, "loadouts", var_2, var_3 );
|
|
}
|
|
|
|
bot_squad_lookup( var_0, var_1, var_2, var_3, var_4, var_5, var_6 )
|
|
{
|
|
var_7 = ::bot_squad_lookup_ranked;
|
|
|
|
if ( getdvar( "squad_match" ) == "1" && self.team == "axis" )
|
|
var_7 = ::bot_squad_lookup_enemy;
|
|
else if ( !maps\mp\_utility::matchmakinggame() )
|
|
var_7 = ::bot_squad_lookup_private;
|
|
|
|
return self [[ var_7 ]]( var_0, var_1, var_2, var_3, var_4, var_5, var_6 );
|
|
}
|
|
|
|
bot_squadmember_lookup( var_0, var_1, var_2 )
|
|
{
|
|
if ( getdvar( "squad_match" ) == "1" && self.team == "axis" )
|
|
return getenemysquaddata( "squadMembers", var_1, var_2 );
|
|
else if ( !maps\mp\_utility::matchmakinggame() )
|
|
return var_0 getprivateplayerdata( "privateMatchSquadMembers", var_1, var_2 );
|
|
else
|
|
return var_0 getrankedplayerdata( "squadMembers", var_1, var_2 );
|
|
}
|
|
|
|
bot_loadout_copy_from_client( var_0, var_1, var_2, var_3 )
|
|
{
|
|
var_0["loadoutPrimary"] = bot_squad_lookup( var_1, var_2, var_3, "weaponSetups", 0, "weapon" );
|
|
var_0["loadoutPrimaryAttachment"] = bot_squad_lookup( var_1, var_2, var_3, "weaponSetups", 0, "attachment", 0 );
|
|
var_0["loadoutPrimaryAttachment2"] = bot_squad_lookup( var_1, var_2, var_3, "weaponSetups", 0, "attachment", 1 );
|
|
var_0["loadoutPrimaryAttachment3"] = bot_squad_lookup( var_1, var_2, var_3, "weaponSetups", 0, "attachment", 2 );
|
|
var_0["loadoutPrimaryBuff"] = bot_squad_lookup( var_1, var_2, var_3, "weaponSetups", 0, "buff" );
|
|
var_0["loadoutPrimaryCamo"] = bot_squad_lookup( var_1, var_2, var_3, "weaponSetups", 0, "camo" );
|
|
var_0["loadoutPrimaryReticle"] = bot_squad_lookup( var_1, var_2, var_3, "weaponSetups", 0, "reticle" );
|
|
var_0["loadoutSecondary"] = bot_squad_lookup( var_1, var_2, var_3, "weaponSetups", 1, "weapon" );
|
|
var_0["loadoutSecondaryAttachment"] = bot_squad_lookup( var_1, var_2, var_3, "weaponSetups", 1, "attachment", 0 );
|
|
var_0["loadoutSecondaryAttachment2"] = bot_squad_lookup( var_1, var_2, var_3, "weaponSetups", 1, "attachment", 1 );
|
|
var_0["loadoutSecondaryBuff"] = bot_squad_lookup( var_1, var_2, var_3, "weaponSetups", 1, "buff" );
|
|
var_0["loadoutSecondaryCamo"] = bot_squad_lookup( var_1, var_2, var_3, "weaponSetups", 1, "camo" );
|
|
var_0["loadoutSecondaryReticle"] = bot_squad_lookup( var_1, var_2, var_3, "weaponSetups", 1, "reticle" );
|
|
var_0["loadoutEquipment"] = bot_squad_lookup( var_1, var_2, var_3, "perks", 0 );
|
|
var_0["loadoutOffhand"] = bot_squad_lookup( var_1, var_2, var_3, "perks", 1 );
|
|
var_0["loadoutStreak1"] = "none";
|
|
var_0["loadoutStreak2"] = "none";
|
|
var_0["loadoutStreak3"] = "none";
|
|
var_4 = bot_squad_lookup( var_1, var_2, var_3, "perks", 5 );
|
|
|
|
if ( isdefined( var_4 ) )
|
|
{
|
|
var_0["loadoutStreakType"] = var_4;
|
|
|
|
if ( var_4 == "streaktype_assault" )
|
|
{
|
|
var_0["loadoutStreak1"] = bot_squad_lookup( var_1, var_2, var_3, "assaultStreaks", 0 );
|
|
var_0["loadoutStreak2"] = bot_squad_lookup( var_1, var_2, var_3, "assaultStreaks", 1 );
|
|
var_0["loadoutStreak3"] = bot_squad_lookup( var_1, var_2, var_3, "assaultStreaks", 2 );
|
|
}
|
|
else if ( var_4 == "streaktype_support" )
|
|
{
|
|
var_0["loadoutStreak1"] = bot_squad_lookup( var_1, var_2, var_3, "supportStreaks", 0 );
|
|
var_0["loadoutStreak2"] = bot_squad_lookup( var_1, var_2, var_3, "supportStreaks", 1 );
|
|
var_0["loadoutStreak3"] = bot_squad_lookup( var_1, var_2, var_3, "supportStreaks", 2 );
|
|
}
|
|
else if ( var_4 == "streaktype_specialist" )
|
|
{
|
|
var_0["loadoutPerk13"] = bot_squad_lookup( var_1, var_2, var_3, "specialistStreaks", 0 );
|
|
var_0["loadoutPerk14"] = bot_squad_lookup( var_1, var_2, var_3, "specialistStreaks", 1 );
|
|
var_0["loadoutPerk15"] = bot_squad_lookup( var_1, var_2, var_3, "specialistStreaks", 2 );
|
|
}
|
|
}
|
|
|
|
var_5 = 1;
|
|
var_6 = maps\mp\gametypes\_class::getnumabilitycategories();
|
|
var_7 = maps\mp\gametypes\_class::getnumsubability();
|
|
|
|
for ( var_8 = 0; var_8 < var_6; var_8++ )
|
|
{
|
|
for ( var_9 = 0; var_9 < var_7; var_9++ )
|
|
{
|
|
var_10 = bot_squad_lookup( var_1, var_2, var_3, "abilitiesPicked", var_8, var_9 );
|
|
|
|
if ( isdefined( var_10 ) && var_10 )
|
|
{
|
|
var_11 = tablelookup( "mp/cacAbilityTable.csv", 0, var_8 + 1, 4 + var_9 );
|
|
var_0["loadoutPerk" + var_5] = var_11;
|
|
var_5++;
|
|
continue;
|
|
}
|
|
|
|
var_0["loadoutPerk" + var_5] = "specialty_null";
|
|
}
|
|
}
|
|
|
|
var_5 = 16;
|
|
|
|
for ( var_8 = 0; var_8 < var_6; var_8++ )
|
|
{
|
|
for ( var_9 = 0; var_9 < var_7; var_9++ )
|
|
{
|
|
var_10 = bot_squad_lookup( var_1, var_2, var_3, "specialistBonusStreaks", var_8, var_9 );
|
|
|
|
if ( isdefined( var_10 ) && var_10 )
|
|
{
|
|
var_11 = tablelookup( "mp/cacAbilityTable.csv", 0, var_8 + 1, 4 + var_9 );
|
|
var_0["loadoutPerk" + var_5] = var_11;
|
|
var_5++;
|
|
continue;
|
|
}
|
|
|
|
var_0["loadoutPerk" + var_5] = "specialty_null";
|
|
}
|
|
}
|
|
|
|
var_0["loadoutCharacterType"] = bot_squad_lookup( var_1, var_2, var_3, "type" );
|
|
bot_pick_personality_from_weapon( var_0["loadoutPrimary"] );
|
|
self.playercardpatch = bot_squadmember_lookup( var_1, var_2, "patch" );
|
|
self.playercardbackground = bot_squadmember_lookup( var_1, var_2, "background" );
|
|
|
|
if ( getdvar( "squad_match" ) == "1" && self.team == "axis" )
|
|
self.squad_bot_dog_type = getenemysquaddogtype();
|
|
else
|
|
self.squad_bot_dog_type = var_1 getcommonplayerdatareservedint( "mp_dog_type" );
|
|
|
|
return var_0;
|
|
}
|
|
|
|
bot_loadout_setup_squad_match( var_0 )
|
|
{
|
|
var_1 = level.players[0];
|
|
|
|
foreach ( var_3 in level.players )
|
|
{
|
|
if ( !isai( var_3 ) && isplayer( var_3 ) )
|
|
{
|
|
var_1 = var_3;
|
|
break;
|
|
}
|
|
}
|
|
|
|
var_5 = self.pers["squadSlot"];
|
|
var_6 = bot_squadmember_lookup( var_1, var_5, "ai_loadout" );
|
|
self.pers["rankxp"] = bot_squadmember_lookup( var_1, var_5, "squadMemXP" );
|
|
|
|
if ( self.team == "allies" )
|
|
{
|
|
if ( isdefined( var_1 ) )
|
|
{
|
|
var_7 = var_1 getrankedplayerdatareservedint( "prestigeLevel" );
|
|
self.pers["prestige_fake"] = var_7;
|
|
}
|
|
}
|
|
else if ( self.team == "axis" )
|
|
self.pers["prestige_fake"] = getsquadassaultenemyprestige();
|
|
|
|
var_0 = bot_loadout_copy_from_client( var_0, var_1, var_5, var_6 );
|
|
return var_0;
|
|
}
|
|
|
|
bot_loadout_setup_squad_vs_squad_match( var_0 )
|
|
{
|
|
var_1 = level.squad_vs_squad_allies_client;
|
|
|
|
if ( self.team == "axis" )
|
|
var_1 = level.squad_vs_squad_axis_client;
|
|
|
|
var_2 = self.pers["squadSlot"];
|
|
var_3 = bot_squadmember_lookup( var_1, var_2, "ai_loadout" );
|
|
self.pers["rankxp"] = bot_squadmember_lookup( var_1, var_2, "squadMemXP" );
|
|
|
|
if ( isdefined( var_1 ) )
|
|
{
|
|
var_4 = var_1 getrankedplayerdatareservedint( "prestigeLevel" );
|
|
self.pers["prestige_fake"] = var_4;
|
|
}
|
|
|
|
var_0 = bot_loadout_copy_from_client( var_0, var_1, var_2, var_3 );
|
|
return var_0;
|
|
}
|
|
|
|
bot_loadout_setup_wargame_match( var_0 )
|
|
{
|
|
var_1 = level.wargame_client;
|
|
var_2 = self.pers["squadSlot"];
|
|
var_3 = bot_squadmember_lookup( var_1, var_2, "ai_loadout" );
|
|
self.pers["rankxp"] = bot_squadmember_lookup( var_1, var_2, "squadMemXP" );
|
|
|
|
if ( isdefined( var_1 ) )
|
|
{
|
|
var_4 = var_1 getrankedplayerdatareservedint( "prestigeLevel" );
|
|
self.pers["prestige_fake"] = var_4;
|
|
}
|
|
|
|
var_0 = bot_loadout_copy_from_client( var_0, var_1, var_2, var_3 );
|
|
return var_0;
|
|
}
|