2021-09-01 19:19:44 +03:00
using System ;
using Generator.Models.Input ;
2021-08-13 16:24:05 +01:00
using Generator.Models.Output ;
2021-08-13 19:49:32 +01:00
using System.Collections.Generic ;
using System.Linq ;
2021-08-13 16:24:05 +01:00
namespace Generator.Helpers.Gear
{
public static class GearChanceHelpers
{
2021-08-13 19:49:32 +01:00
public static void CalculateModChances ( Bot bot , List < Datum > baseBots )
2021-08-13 16:24:05 +01:00
{
2021-09-01 17:39:50 +03:00
// TODO: Further split these counts by equipment slot? (ex. "FirstPrimaryWeapon", "Holster", etc.)
var validSlots = new List < string > { "FirstPrimaryWeapon" , "SecondPrimaryWeapon" , "Holster" , "Headwear" } ;
var modCounts = new Dictionary < string , int > ( ) ;
var slotCounts = new Dictionary < string , int > ( ) ;
2021-08-13 19:49:32 +01:00
foreach ( var baseBot in baseBots )
2021-08-13 16:24:05 +01:00
{
2021-09-01 17:39:50 +03:00
var validParents = new List < string > ( ) ;
foreach ( var inventoryItem in baseBot . Inventory . items )
{
if ( validSlots . Contains ( inventoryItem . slotId ) )
{
validParents . Add ( inventoryItem . _id ) ;
}
else if ( validParents . Contains ( inventoryItem . parentId ) )
{
validParents . Add ( inventoryItem . _id ) ;
}
else
{
continue ;
}
var template = ItemTemplateHelper . GetTemplateById ( inventoryItem . _tpl ) ;
var parentTemplate = ItemTemplateHelper . GetTemplateById ( baseBot . Inventory . items . Single ( i = > i . _id = = inventoryItem . parentId ) . _tpl ) ;
2021-09-01 18:39:09 +03:00
if ( ( inventoryItem . slotId ? . StartsWith ( "mod_" ) ? ? false ) & & ! ( parentTemplate ? . _props ? . Slots ? . FirstOrDefault ( s = > s . _name = = inventoryItem . slotId ) ? . _required ? ? false ) )
2021-09-01 17:39:50 +03:00
{
if ( modCounts . ContainsKey ( inventoryItem . slotId ) )
{
modCounts [ inventoryItem . slotId ] + + ;
}
else
{
modCounts . Add ( inventoryItem . slotId , 1 ) ;
}
}
if ( ( template ? . _props ? . Slots ? . Count ? ? 0 ) < 1 )
{
// Item has no slots, nothing to count here
continue ;
}
foreach ( var slot in template . _props . Slots . Where ( s = > s . _name . StartsWith ( "mod_" ) ) )
{
if ( slot . _required )
{
continue ;
}
if ( slotCounts . ContainsKey ( slot . _name ) )
{
slotCounts [ slot . _name ] + + ;
}
else
{
slotCounts . Add ( slot . _name , 1 ) ;
}
}
}
2021-08-13 16:24:05 +01:00
}
2021-08-13 19:49:32 +01:00
2021-09-01 17:39:50 +03:00
bot . chances . mods = slotCounts . ToDictionary (
kvp = > kvp . Key ,
kvp = > GetPercent ( kvp . Value , modCounts . GetValueOrDefault ( kvp . Key ) ) ) ;
2021-08-13 19:49:32 +01:00
}
2021-08-13 16:24:05 +01:00
public static void AddGenerationChances ( Bot bot )
{
2021-08-31 18:52:00 +01:00
bot . generation = new GenerationChances ( bot . inventory . items . SpecialLoot . Count , bot . inventory . items . SpecialLoot . Count , 1 , 2 , 0 , 3 , 2 , 4 , 0 , 5 ) ; //TODO get dynamically
2021-08-13 16:24:05 +01:00
}
2021-08-13 19:49:32 +01:00
public static void CalculateEquipmentChances ( Bot bot , List < Datum > baseBots )
2021-08-13 16:24:05 +01:00
{
2021-09-01 17:39:50 +03:00
// TODO: Convert to dynamic?
2021-08-13 19:49:32 +01:00
var totalBotsCount = baseBots . Count ;
2021-08-14 09:53:00 +01:00
int headwearCount = 0 , earCount = 0 , faceCoverCount = 0 , armorVestCount = 0 , eyeWearCount = 0 , armBandCount = 0 ,
2021-08-13 19:49:32 +01:00
tacticalVestCount = 0 , backpackCount = 0 , firstPrimaryCount = 0 , secondPrimaryCount = 0 , holsterCount = 0 ,
scabbardCount = 0 , pocketsCount = 0 , securedContainerCount = 0 ;
foreach ( var baseBot in baseBots )
2021-08-13 16:24:05 +01:00
{
2021-08-14 09:53:00 +01:00
headwearCount + = baseBot . Inventory . items . Count ( x = > x . slotId = = "Headwear" ) ;
2021-08-13 19:49:32 +01:00
earCount + = baseBot . Inventory . items . Count ( x = > x . slotId = = "Earpiece" ) ;
faceCoverCount + = baseBot . Inventory . items . Count ( x = > x . slotId = = "FaceCover" ) ;
armorVestCount + = baseBot . Inventory . items . Count ( x = > x . slotId = = "ArmorVest" ) ;
eyeWearCount + = baseBot . Inventory . items . Count ( x = > x . slotId = = "Eyewear" ) ;
armBandCount + = baseBot . Inventory . items . Count ( x = > x . slotId = = "ArmBand" ) ;
tacticalVestCount + = baseBot . Inventory . items . Count ( x = > x . slotId = = "TacticalVest" ) ;
backpackCount + = baseBot . Inventory . items . Count ( x = > x . slotId = = "Backpack" ) ;
firstPrimaryCount + = baseBot . Inventory . items . Count ( x = > x . slotId = = "FirstPrimaryWeapon" ) ;
secondPrimaryCount + = baseBot . Inventory . items . Count ( x = > x . slotId = = "SecondPrimaryWeapon" ) ;
holsterCount + = baseBot . Inventory . items . Count ( x = > x . slotId = = "Holster" ) ;
scabbardCount + = baseBot . Inventory . items . Count ( x = > x . slotId = = "Scabbard" ) ;
pocketsCount + = baseBot . Inventory . items . Count ( x = > x . slotId = = "Pockets" ) ;
securedContainerCount + = baseBot . Inventory . items . Count ( x = > x . slotId = = "SecuredContainer" ) ;
2021-08-13 16:24:05 +01:00
}
2021-08-13 19:49:32 +01:00
bot . chances . equipment = new EquipmentChances (
2021-08-14 09:53:00 +01:00
GetPercent ( totalBotsCount , headwearCount ) ,
GetPercent ( totalBotsCount , earCount ) ,
GetPercent ( totalBotsCount , faceCoverCount ) ,
GetPercent ( totalBotsCount , armorVestCount ) ,
GetPercent ( totalBotsCount , eyeWearCount ) ,
GetPercent ( totalBotsCount , armBandCount ) ,
GetPercent ( totalBotsCount , tacticalVestCount ) ,
GetPercent ( totalBotsCount , backpackCount ) ,
GetPercent ( totalBotsCount , firstPrimaryCount ) ,
GetPercent ( totalBotsCount , secondPrimaryCount ) ,
GetPercent ( totalBotsCount , holsterCount ) ,
GetPercent ( totalBotsCount , scabbardCount ) ,
GetPercent ( totalBotsCount , pocketsCount ) ,
GetPercent ( totalBotsCount , securedContainerCount ) ) ;
2021-08-13 16:24:05 +01:00
}
2021-08-13 19:49:32 +01:00
private static int GetPercent ( int total , int count )
{
2021-09-01 19:19:44 +03:00
return ( int ) Math . Ceiling ( ( double ) ( ( ( 200 * count ) + 1 ) / ( total * 2 ) ) ) ;
2021-08-13 19:49:32 +01:00
}
2021-08-13 16:24:05 +01:00
}
}