Compare commits

...

14 Commits

Author SHA1 Message Date
Chomp
792c40c699 Updated bot difficulty values 2025-02-03 19:33:39 +00:00
Chomp
92c624b246 Update 2025-01-22 09:54:23 +00:00
Chomp
2777b18bdd Updated bot difficulty values 2025-01-06 20:29:43 +00:00
Chomp
0e49c2bfc3 Updated bot difficulty values 2024-12-27 15:16:00 +00:00
Chomp
6ff0aa5120 Reduce accuracy of large loot weights 2024-12-13 13:18:06 +00:00
Chomp
e7813b48dd Added code to reduce the accuracy of values deemed too accurate 2024-12-12 22:24:15 +00:00
Dev
5eebd817b4 Fixed badly named keys 2024-11-21 17:57:36 +00:00
Dev
b826e97b30 Added infected bot weights 2024-11-18 17:38:31 +00:00
294881dcca Minor Changes to Resolve Warnings (#5)
Resolves a number of CS0109, HAA060, and HAA0401 warnings. See commits for details.

Reviewed-on: chomp/BotGenerator#5
Co-authored-by: Refringe <me@refringe.com>
Co-committed-by: Refringe <me@refringe.com>
2024-11-14 20:03:41 +00:00
Dev
5083c7c5c3 Updated to store experience/aggressor bonus/exp reward in dictionaries keyed by bot difficulty 2024-11-14 11:52:11 +00:00
Dev
8c0db8e0c2 Updated to store standing for kill in a dictionary keyed by difficulty 2024-11-14 11:20:01 +00:00
Dev
1dbf46179d Updated to use .net 9 2024-11-14 10:02:21 +00:00
f927a64a13 Merge pull request 'Drastically reduce memory footprint at the cost of removing threading' (#4) from DrakiaXYZ/BotGenerator:feat-memory-improvements into master
Reviewed-on: chomp/BotGenerator#4
2024-11-04 15:44:47 +00:00
32c0239c3a Merge pull request 'Fix exceptions when run against latest bot dumps' (#3) from DrakiaXYZ/BotGenerator:fix-310-newbots into master
Reviewed-on: chomp/BotGenerator#3
2024-11-04 15:37:35 +00:00
43 changed files with 60240 additions and 867 deletions

View File

@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<TargetFramework>net9.0</TargetFramework>
</PropertyGroup>
<ItemGroup>

View File

@ -69,7 +69,7 @@ namespace Common.Models.Output
public Dictionary<string, int> TacticalVest { get; set; }
public Dictionary<string, int> Pockets { get; set; }
public Dictionary<string, int> Backpack { get; set; }
public new Dictionary<string, int> SecuredContainer { get; set; }
public new Dictionary<string, int> SpecialLoot { get; set; }
public Dictionary<string, int> SecuredContainer { get; set; }
public Dictionary<string, int> SpecialLoot { get; set; }
}
}

View File

@ -70,16 +70,16 @@ public class Experience
public Experience()
{
level = new MinMax(0, 1);
reward = new MinMax(-1, -1);
standingForKill = -0.02;
aggressorBonus = 0.01;
reward = new Dictionary<string, MinMax>();
standingForKill = new Dictionary<string, object>();
aggressorBonus = new Dictionary<string, object>(); ;
useSimpleAnimator = false;
}
public MinMax level { get; set; }
public MinMax reward { get; set; }
public object standingForKill { get; set; }
public object aggressorBonus { get; set; }
public Dictionary<string, MinMax> reward { get; set; }
public Dictionary<string, object> standingForKill { get; set; }
public new Dictionary<string, object> aggressorBonus { get; set; }
public bool useSimpleAnimator { get; set; }
}

File diff suppressed because it is too large Load Diff

View File

@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<TargetFramework>net9.0</TargetFramework>
</PropertyGroup>
<ItemGroup>

View File

@ -338,7 +338,6 @@
"MAX_AGGRO_BOT_DIST": 100.0,
"HIT_POINT_DETECTION": 4.0,
"DANGER_POINT_CHOOSE_COEF": 1.0,
"FOLLOWER_AND_BOSS_WARN_EQUAL_PRIORITY": true,
"SIMPLE_POINT_CHOOSE_COEF": 0.4,
"LASTSEEN_POINT_CHOOSE_COEF": 0.2,
"COVER_DIST_COEF": 1.5,

View File

@ -360,6 +360,7 @@
"FRIEND_DEAD_AGR_LOW": -0.2,
"FRIEND_AGR_KILL": 0.2,
"LAST_ENEMY_LOOK_TO": 40.0,
"REACT_ADD_DRUNK_ENEMY": true,
"SURGE_KIT_ONLY_SAFE_CONTAINER": false,
"CHECK_MARK_OF_UNKNOWS": false,
"CAN_RECEIVE_PLAYER_REQUESTS_SAVAGE": false,

View File

@ -329,6 +329,7 @@
},
"Mind": {
"HOW_WORK_OVER_DEAD_BODY": 2,
"REACT_ADD_DRUNK_ENEMY": true,
"MIN_SHOOTS_TIME": 2,
"MAX_SHOOTS_TIME": 4,
"TIME_LEAVE_MAP": 23,

View File

@ -329,6 +329,7 @@
},
"Mind": {
"HOW_WORK_OVER_DEAD_BODY": 2,
"REACT_ADD_DRUNK_ENEMY": true,
"MIN_SHOOTS_TIME": 2,
"MAX_SHOOTS_TIME": 4,
"TIME_LEAVE_MAP": 23,

View File

@ -321,6 +321,7 @@
},
"Mind": {
"HOW_WORK_OVER_DEAD_BODY": 2,
"REACT_ADD_DRUNK_ENEMY": true,
"MIN_SHOOTS_TIME": 2,
"MAX_SHOOTS_TIME": 4,
"TIME_TO_RUN_TO_COVER_CAUSE_SHOOT_SEC": 15.0,

View File

@ -46,7 +46,7 @@
},
"grenades": {
"weights": {
"0": 8,
"0": 13,
"1": 6,
"2": 2,
"3": 1,
@ -1339,5 +1339,375 @@
},
"whitelist": []
}
},
"infectedpmc": {
"backpackLoot": {
"weights": {
"0": 1
},
"whitelist": []
},
"currency": {
"weights": {
"0": 1
},
"whitelist": []
},
"drinks": {
"weights": {
"0": 1
},
"whitelist": []
},
"drugs": {
"weights": {
"0": 1
},
"whitelist": []
},
"food": {
"weights": {
"0": 1
},
"whitelist": []
},
"grenades": {
"weights": {
"0": 1
},
"whitelist": []
},
"healing": {
"weights": {
"0": 1
},
"whitelist": []
},
"magazines": {
"weights": {
"0": 1
},
"whitelist": []
},
"pocketLoot": {
"weights": {
"0": 1
},
"whitelist": []
},
"specialItems": {
"weights": {
"0": 1
},
"whitelist": []
},
"stims": {
"weights": {
"0": 1
},
"whitelist": []
},
"vestLoot": {
"weights": {
"0": 1
},
"whitelist": []
}
},
"infectedassault": {
"backpackLoot": {
"weights": {
"0": 1
},
"whitelist": []
},
"currency": {
"weights": {
"0": 1
},
"whitelist": []
},
"drinks": {
"weights": {
"0": 1
},
"whitelist": []
},
"drugs": {
"weights": {
"0": 1
},
"whitelist": []
},
"food": {
"weights": {
"0": 1
},
"whitelist": []
},
"grenades": {
"weights": {
"0": 1
},
"whitelist": []
},
"healing": {
"weights": {
"0": 1
},
"whitelist": []
},
"magazines": {
"weights": {
"0": 1
},
"whitelist": []
},
"pocketLoot": {
"weights": {
"0": 1
},
"whitelist": []
},
"specialItems": {
"weights": {
"0": 1
},
"whitelist": []
},
"stims": {
"weights": {
"0": 1
},
"whitelist": []
},
"vestLoot": {
"weights": {
"0": 1
},
"whitelist": []
}
},
"infectedcivil": {
"backpackLoot": {
"weights": {
"0": 1
},
"whitelist": []
},
"currency": {
"weights": {
"0": 1
},
"whitelist": []
},
"drinks": {
"weights": {
"0": 1
},
"whitelist": []
},
"drugs": {
"weights": {
"0": 1
},
"whitelist": []
},
"food": {
"weights": {
"0": 1
},
"whitelist": []
},
"grenades": {
"weights": {
"0": 1
},
"whitelist": []
},
"healing": {
"weights": {
"0": 1
},
"whitelist": []
},
"magazines": {
"weights": {
"0": 1
},
"whitelist": []
},
"pocketLoot": {
"weights": {
"0": 1
},
"whitelist": []
},
"specialItems": {
"weights": {
"0": 1
},
"whitelist": []
},
"stims": {
"weights": {
"0": 1
},
"whitelist": []
},
"vestLoot": {
"weights": {
"0": 1
},
"whitelist": []
}
},
"infectedlaborant": {
"backpackLoot": {
"weights": {
"0": 1
},
"whitelist": []
},
"currency": {
"weights": {
"0": 1
},
"whitelist": []
},
"drinks": {
"weights": {
"0": 1
},
"whitelist": []
},
"drugs": {
"weights": {
"0": 1
},
"whitelist": []
},
"food": {
"weights": {
"0": 1
},
"whitelist": []
},
"grenades": {
"weights": {
"0": 1
},
"whitelist": []
},
"healing": {
"weights": {
"0": 1
},
"whitelist": []
},
"magazines": {
"weights": {
"0": 1
},
"whitelist": []
},
"pocketLoot": {
"weights": {
"0": 1
},
"whitelist": []
},
"specialItems": {
"weights": {
"0": 1
},
"whitelist": []
},
"stims": {
"weights": {
"0": 1
},
"whitelist": []
},
"vestLoot": {
"weights": {
"0": 1
},
"whitelist": []
}
},
"infectedtagilla": {
"backpackLoot": {
"weights": {
"0": 1
},
"whitelist": []
},
"currency": {
"weights": {
"0": 1
},
"whitelist": []
},
"drinks": {
"weights": {
"0": 1
},
"whitelist": []
},
"drugs": {
"weights": {
"0": 1
},
"whitelist": []
},
"food": {
"weights": {
"0": 1
},
"whitelist": []
},
"grenades": {
"weights": {
"0": 1
},
"whitelist": []
},
"healing": {
"weights": {
"0": 1
},
"whitelist": []
},
"magazines": {
"weights": {
"0": 1
},
"whitelist": []
},
"pocketLoot": {
"weights": {
"0": 1
},
"whitelist": []
},
"specialItems": {
"weights": {
"0": 1
},
"whitelist": []
},
"stims": {
"weights": {
"0": 1
},
"whitelist": []
},
"vestLoot": {
"weights": {
"0": 1
},
"whitelist": []
}
}
}

View File

@ -341,7 +341,6 @@
"DANGER_POINT_CHOOSE_COEF": 1.0,
"SIMPLE_POINT_CHOOSE_COEF": 0.4,
"LASTSEEN_POINT_CHOOSE_COEF": 0.2,
"FOLLOWER_AND_BOSS_WARN_EQUAL_PRIORITY": true,
"COVER_DIST_COEF": 1.5,
"DIST_TO_FOUND_SQRT": 400.0,
"MAX_AGGRO_BOT_DIST_SQR": 10000.0,

View File

@ -331,6 +331,7 @@
},
"Mind": {
"HOW_WORK_OVER_DEAD_BODY": 2,
"REACT_ADD_DRUNK_ENEMY": true,
"MIN_SHOOTS_TIME": 2,
"MAX_SHOOTS_TIME": 4,
"TIME_LEAVE_MAP": 23,

View File

@ -330,6 +330,7 @@
},
"Mind": {
"HOW_WORK_OVER_DEAD_BODY": 2,
"REACT_ADD_DRUNK_ENEMY": true,
"MIN_SHOOTS_TIME": 2,
"MAX_SHOOTS_TIME": 4,
"TIME_LEAVE_MAP": 23,

View File

@ -330,6 +330,7 @@
},
"Mind": {
"HOW_WORK_OVER_DEAD_BODY": 2,
"REACT_ADD_DRUNK_ENEMY": true,
"MIN_SHOOTS_TIME": 2,
"MAX_SHOOTS_TIME": 4,
"TIME_LEAVE_MAP": 23,

View File

@ -340,6 +340,7 @@
"DIST_TO_STOP_RUN_ENEMY": 15.0,
"ENEMY_LOOK_AT_ME_ANG": 15.0,
"FOLLOWER_AND_BOSS_WARN_EQUAL_PRIORITY": true,
"REACT_ADD_DRUNK_ENEMY": true,
"MIN_START_AGGRESION_COEF": 1.0,
"MAX_START_AGGRESION_COEF": 3.0,
"BULLET_FEEL_DIST": 360.0,
@ -414,7 +415,6 @@
"PERSONS_SEND": 2,
"DELTA_SEARCH_TIME": 18.0,
"COVER_TO_SEND": true,
"NOT_ADD_TO_ENEMY_ON_KILLS": true,
"WAIT_NO_ATTACK_SAVAGE": 10.0,
"CHANCE_USE_RESERVE_PATROL_100": 30.0,
"KILLA_Y_DELTA_TO_BE_ENEMY_BOSS": 5.0,

View File

@ -333,7 +333,6 @@
"DANGER_POINT_CHOOSE_COEF": 1.0,
"SIMPLE_POINT_CHOOSE_COEF": 0.4,
"LASTSEEN_POINT_CHOOSE_COEF": 0.2,
"FOLLOWER_AND_BOSS_WARN_EQUAL_PRIORITY": true,
"COVER_DIST_COEF": 1.5,
"DIST_TO_FOUND_SQRT": 400.0,
"MAX_AGGRO_BOT_DIST_SQR": 10000.0,

View File

@ -344,7 +344,6 @@
"COVER_DIST_COEF": 1.5,
"DIST_TO_FOUND_SQRT": 400.0,
"MAX_AGGRO_BOT_DIST_SQR": 10000.0,
"FOLLOWER_AND_BOSS_WARN_EQUAL_PRIORITY": true,
"CHECK_MARK_OF_UNKNOWS": true,
"DIST_TO_STOP_RUN_ENEMY": 15.0,
"ENEMY_LOOK_AT_ME_ANG": 15.0,

View File

@ -496,7 +496,8 @@
"GLUHAR_FOLLOWERS_SCOUT": 2,
"GLUHAR_FOLLOWERS_SNIPE": 0,
"GLUHAR_BOSS_DIST_TO_ENEMY_WANT_KILL": 25.0,
"EFFECT_PAINKILLER": true
"EFFECT_PAINKILLER": true,
"ALLOW_REQUEST_SELF": false
},
"Core": {
"VisibleAngle": 160.0,

View File

@ -426,7 +426,8 @@
"KILLA_ENEMIES_TO_ATTACK": 3,
"KILLA_ONE_IS_CLOSE": 30.0,
"KILLA_TRIGGER_DOWN_DELAY": 1.0,
"KILLA_WAIT_IN_COVER_COEF": 1.0
"KILLA_WAIT_IN_COVER_COEF": 1.0,
"ALLOW_REQUEST_SELF": false
},
"Core": {
"VisibleAngle": 160.0,

View File

@ -496,7 +496,8 @@
"GLUHAR_FOLLOWERS_SCOUT": 2,
"GLUHAR_FOLLOWERS_SNIPE": 0,
"GLUHAR_BOSS_DIST_TO_ENEMY_WANT_KILL": 25.0,
"EFFECT_PAINKILLER": true
"EFFECT_PAINKILLER": true,
"ALLOW_REQUEST_SELF": false
},
"Core": {
"VisibleAngle": 160.0,

View File

@ -343,7 +343,6 @@
"TIME_TO_FORGOR_ABOUT_ENEMY_SEC": 104.0,
"TIME_TO_FIND_ENEMY": 22.0,
"MAX_AGGRO_BOT_DIST": 200.0,
"FOLLOWER_AND_BOSS_WARN_EQUAL_PRIORITY": true,
"HIT_POINT_DETECTION": 4.0,
"DANGER_POINT_CHOOSE_COEF": 1.0,
"SIMPLE_POINT_CHOOSE_COEF": 0.4,

View File

@ -436,7 +436,8 @@
"KOJANIY_MANY_ENEMIES_COEF": 1.5,
"KOJANIY_FIGHT_CENTER_POS_ME": false,
"SET_CHEAT_VISIBLE_WHEN_ADD_TO_ENEMY": true,
"EFFECT_PAINKILLER": true
"EFFECT_PAINKILLER": true,
"ALLOW_REQUEST_SELF": false
},
"Core": {
"VisibleAngle": 160.0,

View File

@ -504,7 +504,8 @@
"GLUHAR_FOLLOWERS_SCOUT": 2,
"GLUHAR_FOLLOWERS_SNIPE": 0,
"GLUHAR_BOSS_DIST_TO_ENEMY_WANT_KILL": 25.0,
"EFFECT_PAINKILLER": true
"EFFECT_PAINKILLER": true,
"ALLOW_REQUEST_SELF": false
},
"Core": {
"VisibleAngle": 160.0,

View File

@ -170,7 +170,8 @@
"DIST_TO_STOP_SPRINT_MELEE": 2.5,
"TRY_HIT_PERIOD_MELEE": 0.1,
"MELEE_RESET_HIT_TIME": 0,
"MELEE_STOP_MOVE_DISTANCE": 0.85
"MELEE_STOP_MOVE_DISTANCE": 0.85,
"SHOOT_PROBABILITY_GRENADE_LAUNCHER": 100
},
"Move":
{

View File

@ -451,7 +451,8 @@
"KILLA_TRIGGER_DOWN_DELAY": 1.0,
"KILLA_WAIT_IN_COVER_COEF": 1.0,
"EFFECT_REGENERATION_PER_MIN": 60,
"EFFECT_PAINKILLER": true
"EFFECT_PAINKILLER": true,
"ALLOW_REQUEST_SELF": false
},
"Core": {
"VisibleAngle": 160.0,

View File

@ -419,7 +419,8 @@
"KILLA_ENEMIES_TO_ATTACK": 3,
"KILLA_ONE_IS_CLOSE": 30.0,
"KILLA_TRIGGER_DOWN_DELAY": 1.0,
"KILLA_WAIT_IN_COVER_COEF": 1.0
"KILLA_WAIT_IN_COVER_COEF": 1.0,
"ALLOW_REQUEST_SELF": false
},
"Core": {
"VisibleAngle": 140.0,

View File

@ -384,7 +384,8 @@
"HIT_DELAY_WHEN_HAVE_SMT": -1.0,
"HIT_DELAY_WHEN_PEACE": -1.0,
"TALK_WITH_QUERY": true,
"ENEMY_BOT_TYPES": ["pmcBEAR","pmcUSEC"]
"ENEMY_BOT_TYPES": ["pmcBEAR","pmcUSEC"],
"FRIENDLY_BOT_TYPES": ["bossZryachiy","followerZryachiy"],
},
"Boss": {
"BOSS_DIST_TO_WARNING": 8.0,

View File

@ -334,7 +334,6 @@
"MIN_START_AGGRESION_COEF": 1.0,
"MAX_START_AGGRESION_COEF": 3.0,
"BULLET_FEEL_DIST": 360.0,
"FOLLOWER_AND_BOSS_WARN_EQUAL_PRIORITY": true,
"BULLET_FEEL_CLOSE_SDIST": 1.0,
"ATTACK_IMMEDIATLY_CHANCE_0_100": 40.0,
"CHANCE_FUCK_YOU_ON_CONTACT_100": 0.01,

View File

@ -382,7 +382,8 @@
"HIT_DELAY_WHEN_HAVE_SMT": -1.0,
"HIT_DELAY_WHEN_PEACE": -1.0,
"TALK_WITH_QUERY": true,
"ENEMY_BOT_TYPES": ["pmcBEAR","pmcUSEC"]
"ENEMY_BOT_TYPES": ["pmcBEAR","pmcUSEC"],
"FRIENDLY_BOT_TYPES": ["bossZryachiy","followerZryachiy"],
},
"Boss": {
"BOSS_ZRYACHIY_MIN_DIST_TO_TELEPORT": 500.0,

View File

@ -332,6 +332,7 @@
"Mind": {
"HOW_WORK_OVER_DEAD_BODY": 2,
"MIN_SHOOTS_TIME": 2,
"REACT_ADD_DRUNK_ENEMY": true,
"MAX_SHOOTS_TIME": 4,
"TIME_LEAVE_MAP": 23,
"TIME_TO_RUN_TO_COVER_CAUSE_SHOOT_SEC": 15.0,

View File

@ -331,6 +331,7 @@
"Mind": {
"HOW_WORK_OVER_DEAD_BODY": 2,
"MIN_SHOOTS_TIME": 2,
"REACT_ADD_DRUNK_ENEMY": true,
"MAX_SHOOTS_TIME": 4,
"TIME_LEAVE_MAP": 23,
"TIME_TO_RUN_TO_COVER_CAUSE_SHOOT_SEC": 15.0,

View File

@ -330,6 +330,7 @@
},
"Mind": {
"HOW_WORK_OVER_DEAD_BODY": 2,
"REACT_ADD_DRUNK_ENEMY": true,
"MIN_SHOOTS_TIME": 2,
"MAX_SHOOTS_TIME": 4,
"TIME_LEAVE_MAP": 23,

View File

@ -322,6 +322,7 @@
},
"Mind": {
"HOW_WORK_OVER_DEAD_BODY": 2,
"REACT_ADD_DRUNK_ENEMY": true,
"MIN_SHOOTS_TIME": 2,
"MAX_SHOOTS_TIME": 4,
"TIME_TO_RUN_TO_COVER_CAUSE_SHOOT_SEC": 15.0,

View File

@ -318,6 +318,7 @@
},
"Mind": {
"MIN_SHOOTS_TIME": 2,
"REACT_ADD_DRUNK_ENEMY": true,
"MAX_SHOOTS_TIME": 4,
"TIME_TO_RUN_TO_COVER_CAUSE_SHOOT_SEC": 15.0,
"DAMAGE_REDUCTION_TIME_SEC": 30.0,

View File

@ -333,7 +333,6 @@
"MAX_AGGRO_BOT_DIST_SQR": 10000.0,
"DIST_TO_STOP_RUN_ENEMY": 15.0,
"ENEMY_LOOK_AT_ME_ANG": 15.0,
"FOLLOWER_AND_BOSS_WARN_EQUAL_PRIORITY": true,
"MIN_START_AGGRESION_COEF": 1.0,
"MAX_START_AGGRESION_COEF": 3.0,
"BULLET_FEEL_DIST": 360.0,

View File

@ -331,7 +331,6 @@
"MAX_AGGRO_BOT_DIST_SQR": 10000.0,
"DIST_TO_STOP_RUN_ENEMY": 15.0,
"ENEMY_LOOK_AT_ME_ANG": 15.0,
"FOLLOWER_AND_BOSS_WARN_EQUAL_PRIORITY": true,
"MIN_START_AGGRESION_COEF": 1.0,
"MAX_START_AGGRESION_COEF": 3.0,
"BULLET_FEEL_DIST": 360.0,

View File

@ -4,7 +4,6 @@ using Common.Models.Input;
using Common.Models.Output;
using Generator.Helpers;
using Generator.Helpers.Gear;
using System.Diagnostics;
namespace Generator
{
@ -15,6 +14,7 @@ namespace Generator
UpdateBodyPartHealth(botData, rawBotData);
AddExperience(botData, rawBotData);
AddStandingForKill(botData, rawBotData);
AddAggressorBonus(botData, rawBotData);
AddSkills(botData, rawBotData);
botData.experience.useSimpleAnimator = rawBotData.Info.Settings.UseSimpleAnimator;
@ -42,14 +42,39 @@ namespace Generator
private static void AddStandingForKill(Bot botToUpdate, Datum rawBotData)
{
botToUpdate.experience.standingForKill = rawBotData.Info.Settings.StandingForKill;
botToUpdate.experience.aggressorBonus = rawBotData.Info.Settings.AggressorBonus;
botToUpdate.experience.standingForKill ??= new Dictionary<string, object>();
if (!botToUpdate.experience.standingForKill.ContainsKey(rawBotData.Info.Settings.BotDifficulty))
{
botToUpdate.experience.standingForKill.Add(rawBotData.Info.Settings.BotDifficulty, rawBotData.Info.Settings.StandingForKill);
}
}
private static void AddAggressorBonus(Bot botToUpdate, Datum rawBotData)
{
botToUpdate.experience.aggressorBonus ??= new Dictionary<string, object>();
if (!botToUpdate.experience.aggressorBonus.ContainsKey(rawBotData.Info.Settings.BotDifficulty))
{
botToUpdate.experience.aggressorBonus.Add(rawBotData.Info.Settings.BotDifficulty, rawBotData.Info.Settings.AggressorBonus);
}
}
private static void AddExperience(Bot botToUpdate, Datum rawBotData)
{
botToUpdate.experience.reward.min = rawBotData.Info.Settings.Experience;
botToUpdate.experience.reward.max = rawBotData.Info.Settings.Experience;
botToUpdate.experience.reward ??= new();
botToUpdate.experience.reward.TryGetValue(rawBotData.Info.Settings.BotDifficulty, out var minMaxValues);
if (minMaxValues is null)
{
botToUpdate.experience.reward.Add(rawBotData.Info.Settings.BotDifficulty, new(rawBotData.Info.Settings.Experience, rawBotData.Info.Settings.Experience));
return;
}
minMaxValues.min = Math.Min(minMaxValues.min, rawBotData.Info.Settings.Experience);
minMaxValues.max = Math.Max(minMaxValues.max, rawBotData.Info.Settings.Experience);
}
private static void AddVoice(Bot bot, Datum rawBot)

View File

@ -58,6 +58,12 @@ namespace Generator
}
AddSpecialLoot(botToUpdate);
// Cleanup of weights
GearHelpers.ReduceWeightValues(botToUpdate.inventory.items.Backpack);
GearHelpers.ReduceWeightValues(botToUpdate.inventory.items.Pockets);
GearHelpers.ReduceWeightValues(botToUpdate.inventory.items.TacticalVest);
GearHelpers.ReduceWeightValues(botToUpdate.inventory.items.SecuredContainer);
}
/// <summary>

View File

@ -33,7 +33,7 @@ public static class BotParser
DiskHelpers.CreateDirIfDoesntExist(dumpPath);
var botFiles = Directory.GetFiles(dumpPath, "*.json", SearchOption.TopDirectoryOnly);
LoggingHelpers.LogToConsole($"{botFiles.Length} bot dump files found");
LoggingHelpers.LogToConsole($"{botFiles.Length.ToString()} bot dump files found");
// Store a list of parsed bots so we don't parse the same bot twice
int totalDupeCount = 0;
@ -42,7 +42,7 @@ public static class BotParser
foreach (var filePath in botFiles)
{
i++;
if (i % 100 == 0) Console.WriteLine($"Processing file {i}");
if (i % 500 == 0) Console.WriteLine($"Processing file {i.ToString()}");
ProcessBotFileSync(baseBots, filePath, parsedBotIds, totalDupeCount);
}
@ -69,7 +69,7 @@ public static class BotParser
}
stopwatch.Stop();
LoggingHelpers.LogToConsole($"{totalDupeCount} dupes were ignored. Took {LoggingHelpers.LogTimeTaken(stopwatch.Elapsed.TotalSeconds)} seconds");
LoggingHelpers.LogToConsole($"{totalDupeCount.ToString()} dupes were ignored. Took {LoggingHelpers.LogTimeTaken(stopwatch.Elapsed.TotalSeconds)} seconds");
return baseBots.ToList();
}
@ -84,15 +84,14 @@ public static class BotParser
int dupeCount = 0;
List<Datum> bots = [];
List<Datum> bots = new List<Datum>();
try
{
// Parse the bots inside the json file
using (var reader = new StreamReader(filePath))
{
var deSerialisedObject = JsonSerializer.Deserialize<Root>(reader.ReadToEnd(), serialiserOptions);
foreach (var botData in deSerialisedObject.data)
foreach (var botData in deSerialisedObject.data.ToList())
{
// Bot fucks up something, never allow it in
if (botData._id == "6483938c53cc9087c70eae86")
@ -101,10 +100,22 @@ public static class BotParser
continue;
}
var baseBot = baseBots.SingleOrDefault(bot => bot.botType.ToString().Equals(botData.Info.Settings.Role, StringComparison.OrdinalIgnoreCase));
var role = botData.Info.Settings.Role;
var botType = Enum.Parse<BotType>(role, true);
Bot baseBot = null;
foreach (var bot in baseBots)
{
if (bot.botType == botType)
{
baseBot = bot;
break;
}
}
if (baseBot == null)
{
//Console.WriteLine($"Skipping {botData._id} due to unknown role {botData.Info.Settings.Role}");
Console.WriteLine($"Skipping {botData._id} due to unknown role {botData.Info.Settings.Role}");
continue;
}
@ -121,7 +132,7 @@ public static class BotParser
}
}
}
catch (Exception ex)
catch (Exception)
{
Console.WriteLine($"File parse fucked up: {filePath}");
throw;
@ -137,7 +148,7 @@ public static class BotParser
DiskHelpers.CreateDirIfDoesntExist(dumpPath);
var botFiles = Directory.GetFiles(dumpPath, "*.json", SearchOption.TopDirectoryOnly);
LoggingHelpers.LogToConsole($"{botFiles.Length} bot dump files found");
LoggingHelpers.LogToConsole($"{botFiles.Length.ToString()} bot dump files found");
// key = bot type
// Store bots keyed against their ID so we never get duplicates
@ -153,9 +164,9 @@ public static class BotParser
await Task.WhenAll(tasks.ToArray());
stopwatch.Stop();
LoggingHelpers.LogToConsole($"Cleaned and Parsed: {parsedBotsDict.Count} bots. {totalDupeCount} dupes were ignored. Took {LoggingHelpers.LogTimeTaken(stopwatch.Elapsed.TotalSeconds)} seconds");
LoggingHelpers.LogToConsole($"Cleaned and Parsed: {parsedBotsDict.Count.ToString()} bots. {totalDupeCount.ToString()} dupes were ignored. Took {LoggingHelpers.LogTimeTaken(stopwatch.Elapsed.TotalSeconds)} seconds");
return [.. parsedBotsDict.Values];
return parsedBotsDict.Values.ToList();
}
private static async Task<int> ProcessBotFile(
@ -168,17 +179,27 @@ public static class BotParser
int dupeCount = 0;
List<Datum> bots = [];
List<Datum> bots = new List<Datum>();
try
{
// Parse the bots inside the json file
using (var reader = new StreamReader(filePath))
using var reader = new StreamReader(filePath);
var deSerialisedObject = await JsonSerializer.DeserializeAsync<Root>(reader.BaseStream, serialiserOptions);
var botTypesLower = new HashSet<string>(botTypes, StringComparer.OrdinalIgnoreCase);
var filteredBots = new List<Datum>();
foreach (var botData in deSerialisedObject.data.ToList())
{
var deSerialisedObject = JsonSerializer.Deserialize<Root>(reader.ReadToEnd(), serialiserOptions);
bots.AddRange(deSerialisedObject.data.Where(botData => botTypes.Contains(botData.Info.Settings.Role.ToLower())));
var roleLower = botData.Info.Settings.Role.ToLower();
if (botTypesLower.Contains(roleLower))
{
filteredBots.Add(botData);
}
}
catch (Exception ex)
bots.AddRange(filteredBots);
}
catch (Exception)
{
Console.WriteLine($"File parse fucked up: {filePath}");
throw;
@ -235,8 +256,9 @@ public static class BotParser
if (jItemsToReplace != null && jItemsToReplace.Any())
{
LoggingHelpers.LogToConsole($"file {fileName} has {jItemsToReplace.Count()} json issues, cleaning up.", ConsoleColor.Yellow);
foreach (var item in jItemsToReplace)
LoggingHelpers.LogToConsole($"file {fileName} has {jItemsToReplace.Count().ToString()} json issues, cleaning up.", ConsoleColor.Yellow);
var jItemsToReplaceList = jItemsToReplace.ToList();
foreach (var item in jItemsToReplaceList)
{
var obj = new { x = 1, y = 0, r = 0 };
item.Replace(JToken.FromObject(obj));

View File

@ -2,7 +2,7 @@
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
<TargetFramework>net9.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<ServerGarbageCollection>true</ServerGarbageCollection>
<ConcurrentGarbageCollection>true</ConcurrentGarbageCollection>

View File

@ -296,7 +296,13 @@ namespace Generator.Helpers.Gear
foreach (var cartridge in botToUpdate.inventory.Ammo.Keys)
{
var cartridgeWithWeights = botToUpdate.inventory.Ammo[cartridge];
foreach (var cartridgeKvP in cartridgeWithWeights)
{
cartridgeWithWeights[cartridgeKvP.Key] = ReduceValueAccuracy(cartridgeKvP.Value);
}
var weights = cartridgeWithWeights.Values.Select(x => x).ToList();
var commonAmmoDivisor = CommonDivisor(weights);
foreach (var cartridgeWeightKvP in cartridgeWithWeights)
@ -341,6 +347,11 @@ namespace Generator.Helpers.Gear
return;
}
foreach (var itemWeightKvp in equipmentDict)
{
equipmentDict[itemWeightKvp.Key] = ReduceValueAccuracy(itemWeightKvp.Value, 4);
}
var weights = equipmentDict.Values.Select(x => x).ToList();
var commonAmmoDivisor = CommonDivisor(weights);
@ -355,5 +366,13 @@ namespace Generator.Helpers.Gear
equipmentDict[itemTplWithWeight.Key] /= commonAmmoDivisor;
}
}
private static int ReduceValueAccuracy(long x, int digits = 3)
{
int i = (int)Math.Log10(x);
i = Math.Max(0, i - (digits - 1));
i = (int)Math.Pow(10, i);
return (int)(x / i * i);
}
}
}

View File

@ -2,11 +2,11 @@
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net6.0</TargetFramework>
<TargetFramework>net9.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
</ItemGroup>
<ItemGroup>