public static void ChooseBestWeaponForTarget(AbstractActor unit, ICombatant target, bool isStationary) { Stopwatch stopWatch = new Stopwatch(); Dictionary <string, Weapon> weapons = new Dictionary <string, Weapon>(); Dictionary <string, List <DamagePredictRecord> > damagePredict = new Dictionary <string, List <DamagePredictRecord> >(); foreach (Weapon weapon in unit.Weapons) { weapons.Add(weapon.uid, weapon); damagePredict.Add(weapon.uid, CustomAmmoCategories.getWeaponDamagePredict(unit, target, weapon)); } foreach (var weapon in weapons) { CustomAmmoCategoriesLog.Log.LogWrite("Weapon " + weapon.Key + " " + weapon.Value.defId + "\n"); foreach (var fireType in damagePredict[weapon.Key]) { CustomAmmoCategoriesLog.Log.LogWrite(" mode:" + fireType.Id.modeId + " ammo:" + fireType.Id.ammoId + " heat:" + fireType.HeatDamageCoeff + " dmg:" + fireType.NormDamageCoeff + "\n"); } } Mech targetMech = target as Mech; if (targetMech != null) { CustomAmmoCategoriesLog.Log.LogWrite("Try overheat\n"); float overallPredictHeatDamage = 0f; Dictionary <string, int> weaponsWithHeatFireMode = new Dictionary <string, int>(); foreach (var weapon in weapons) { if (damagePredict.ContainsKey(weapon.Key) == false) { CustomAmmoCategoriesLog.Log.LogWrite("WARNING! " + weapon.Value.defId + " has no predict damage record something is very very wrong\n", true); continue; } if (damagePredict[weapon.Key].Count <= 0) { CustomAmmoCategoriesLog.Log.LogWrite("WARNING! " + weapon.Value.defId + " has empty predict damage record something is very very wrong\n", true); continue; } float HeatDamageCoeff = damagePredict[weapon.Key][0].HeatDamageCoeff; int heatDamageIndex = 0; bool haveDiffHeatMode = false; for (int index = 1; index < damagePredict[weapon.Key].Count; ++index) { DamagePredictRecord fireMode = damagePredict[weapon.Key][index]; if (HeatDamageCoeff < fireMode.HeatDamageCoeff) { HeatDamageCoeff = fireMode.HeatDamageCoeff; heatDamageIndex = index; haveDiffHeatMode = true; } ; } overallPredictHeatDamage += damagePredict[weapon.Key][heatDamageIndex].PredictHeatDamage; if (haveDiffHeatMode) { weaponsWithHeatFireMode.Add(weapon.Key, heatDamageIndex); } } CustomAmmoCategoriesLog.Log.LogWrite(" Current target heat:" + targetMech.CurrentHeat + " predicted:" + overallPredictHeatDamage + "\n"); if ((targetMech.CurrentHeat + overallPredictHeatDamage) > targetMech.OverheatLevel) { CustomAmmoCategoriesLog.Log.LogWrite(" worth it\n"); foreach (var weapon in weaponsWithHeatFireMode) { CustomAmmoCategories.applyWeaponAmmoMode(weapons[weapon.Key], damagePredict[weapon.Key][weapon.Value].Id.modeId, damagePredict[weapon.Key][weapon.Value].Id.ammoId); weapons.Remove(weapon.Key); damagePredict.Remove(weapon.Key); } } else { CustomAmmoCategoriesLog.Log.LogWrite(" not worth it\n"); } } CustomAmmoCategoriesLog.Log.LogWrite("Normal damage\n"); foreach (var weapon in weapons) { CustomAmmoCategoriesLog.Log.LogWrite("Weapon " + weapon.Key + " " + weapon.Value.defId + "\n"); foreach (var fireType in damagePredict[weapon.Key]) { CustomAmmoCategoriesLog.Log.LogWrite(" mode:" + fireType.Id.modeId + " ammo:" + fireType.Id.ammoId + " heat:" + fireType.HeatDamageCoeff + " dmg:" + fireType.NormDamageCoeff + "\n"); } } foreach (var weapon in weapons) { if (damagePredict.ContainsKey(weapon.Key) == false) { CustomAmmoCategoriesLog.Log.LogWrite("WARNING! " + weapon.Value.defId + " has no predict damage record something is very very wrong\n", true); continue; } if (damagePredict[weapon.Key].Count <= 0) { CustomAmmoCategoriesLog.Log.LogWrite("WARNING! " + weapon.Value.defId + " has empty predict damage record something is very very wrong\n", true); continue; } float DamageCoeff = damagePredict[weapon.Key][0].HeatDamageCoeff; int DamageIndex = 0; for (int index = 1; index < damagePredict[weapon.Key].Count; ++index) { DamagePredictRecord fireMode = damagePredict[weapon.Key][index]; if (DamageCoeff < fireMode.NormDamageCoeff) { DamageCoeff = fireMode.NormDamageCoeff; DamageIndex = index; } ; } CustomAmmoCategories.applyWeaponAmmoMode(weapons[weapon.Key], damagePredict[weapon.Key][DamageIndex].Id.modeId, damagePredict[weapon.Key][DamageIndex].Id.ammoId); } }