public static void Postfix(AAR_UnitStatusWidget __instance, SimGameState ___simState) { if (!Core.Settings.RepairRearm) { return; } var sim = UnityGameInstance.BattleTechGame.Simulation; UnitResult unitResult = Traverse.Create(__instance).Field("UnitData").GetValue <UnitResult>(); float currentArmor = unitResult.mech.MechDefCurrentArmor; float assignedArmor = unitResult.mech.MechDefAssignedArmor; float armorDamage = currentArmor / assignedArmor; string armorDamageTag = "XLRPArmor_" + armorDamage.ToString(); if (!unitResult.mech.MechTags.Contains("XLRP_R&R") && currentArmor < assignedArmor) { unitResult.mech.MechTags.Add("XLRP_R&R"); unitResult.mech.MechTags.Add(armorDamageTag); Core.CombatMechs.Add(unitResult.mech); } else if (currentArmor < assignedArmor) { unitResult.mech.MechTags.Where(tag => tag.StartsWith("XLRPArmor")).Do(x => unitResult.mech.MechTags.Remove(x)); unitResult.mech.MechTags.Add(armorDamageTag); Core.CombatMechs.Add(unitResult.mech); } }
private static void Prefix(AAR_UnitStatusWidget __instance, ref int xpEarned, SimGameState ___simState, UnitResult ___UnitData) { if (___simState.Constants.Story.MaximumDebt == 42 || Core.Settings.AlwaysOn) { var totalXP = ___UnitData.pilot.TotalXP; float NewXP = (float)xpEarned; var mechsKilled = 0; var vehiclesKilled = 0; try { mechsKilled = ___UnitData.pilot.MechsKilled; vehiclesKilled = ___UnitData.pilot.OthersKilled; } catch (Exception e) { } // get the total ejections - Dependent on Panic System. Thanks gnivler! int mechEjections = 0; int vehicleEjections = 0; try { if (Core.Settings.PanicEjections) { mechEjections = ___UnitData.pilot.StatCollection.GetStatistic("MechsEjected").Value <int>(); vehicleEjections = ___UnitData.pilot.StatCollection.GetStatistic("VehiclesEjected").Value <int>(); } } catch (Exception e) { } NewXP += (float)(mechsKilled * Core.Settings.XP_MechKill + vehiclesKilled * Core.Settings.XP_VehicleKill + mechEjections * Core.Settings.XP_MechEjection + vehicleEjections * Core.Settings.XP_VehicleEjection); int totalXPChunks = totalXP / Core.Settings.intPerXP; float XPMulti = Core.Settings.floatXPMulti; float CorrectedXPFactor = Mathf.Pow(XPMulti, (float)totalXPChunks); NewXP = (float)((int)(NewXP * CorrectedXPFactor)); if ((float)totalXP + NewXP >= (float)Core.Settings.XPMax && Core.Settings.XPCap) { NewXP = (float)(Core.Settings.XPMax - totalXP); } else { NewXP = (float)((int)NewXP); } int unspentXP = ___UnitData.pilot.UnspentXP; int XPCorrection = xpEarned - (int)NewXP; ___UnitData.pilot.StatCollection.Set <int>("ExperienceUnspent", unspentXP - XPCorrection); xpEarned = (int)NewXP; } }
public static void Prefix(AAR_UnitStatusWidget __instance, int xpEarned) { UnitResult unit = Traverse.Create(__instance).Field("UnitData").GetValue <UnitResult>(); if (unit.pilot.pilotDef.PilotTags.Contains("pilot_naive")) { float XPModifier = 1 - settings.pilot_naive_LessExperience; xpEarned = (int)(XPModifier * (float)xpEarned); } }
public static void Postfix(AAR_UnitStatusWidget __instance, MechBayMechUnitElement ___MechStatusIconWidget) { try { Logger.Debug("[AAR_UnitStatusWidget_FillInData_POSTFIX] Disabling IconOverlay."); ___MechStatusIconWidget.ShowStockIcon(false); } catch (Exception e) { Logger.Error(e); } }
public static void Postfix(AAR_UnitStatusWidget __instance, Contract ___contract, UnitResult ___UnitData) { if (ModInit.Settings.SwapUnitsWithAIContractIDs.ContainsKey(contractID)) { if (ModInit.Settings.SwapUnitsWithAIContractIDs[contractID] == "RECOVER") { if (!___UnitData.mech.MechTags.Any(x => ModInit.Settings.DisallowedRecoveryTags.Contains(x))) { ModState.recoveredMechDefs.Add(___UnitData.mech); } } } }
public static void Prefix(AAR_UnitStatusWidget __instance, SimGameState ___simState) { UnitResult unitResult = Traverse.Create(__instance).Field("UnitData").GetValue <UnitResult>(); if (unitResult.pilot.pilotDef.TimeoutRemaining > 0 && unitResult.pilot.Injuries == 0) { } else if (unitResult.pilot.pilotDef.TimeoutRemaining > 0 && unitResult.pilot.Injuries > 0) { unitResult.pilot.pilotDef.SetTimeoutTime(0); WorkOrderEntry_MedBayHeal workOrderEntry_MedBayHeal; workOrderEntry_MedBayHeal = (WorkOrderEntry_MedBayHeal)___simState.MedBayQueue.GetSubEntry(unitResult.pilot.Description.Id); ___simState.MedBayQueue.RemoveSubEntry(unitResult.pilot.Description.Id); } }
public static void Prefix(AAR_UnitStatusWidget __instance, SimGameState ___simState) { if (!Pre_Control.settings.MechBonding) { return; } UnitResult unitResult = Traverse.Create(__instance).Field("UnitData").GetValue <UnitResult>(); if (!unitResult.pilot.pilotDef.PilotTags.Contains("PQ_Mech_Mastery")) { unitResult.pilot.pilotDef.PilotTags.Add("PQ_Mech_Mastery"); } bool HasTattoo = unitResult.pilot.pilotDef.PilotTags.Any(x => x.StartsWith("PQ_Pilot_GUID")); if (!HasTattoo) { string PilotTattoo = "PQ_Pilot_GUID_" + PQ_GUID; unitResult.pilot.pilotDef.PilotTags.Add(PilotTattoo); PQ_GUID++; } if (unitResult.pilot.pilotDef.PilotTags.Contains("PQ_pilot_regular")) { unitResult.pilot.pilotDef.PilotTags.Remove("PQ_pilot_regular"); } if (unitResult.pilot.pilotDef.PilotTags.Contains("PQ_pilot_veteran")) { unitResult.pilot.pilotDef.PilotTags.Remove("PQ_pilot_veteran"); } if (unitResult.pilot.pilotDef.PilotTags.Contains("PQ_pilot_elite")) { unitResult.pilot.pilotDef.PilotTags.Remove("PQ_pilot_elite"); } if (unitResult.pilot.pilotDef.PilotTags.Contains("PQ_Pilot_MissionTattoo")) { unitResult.pilot.pilotDef.PilotTags.Remove("PQ_Pilot_MissionTattoo"); } }
public static void Postfix(AAR_UnitStatusWidget __instance, SimGameState ___simState) { UnitResult unitResult = Traverse.Create(__instance).Field("UnitData").GetValue <UnitResult>(); int FatigueTimeStart = settings.FatigueTimeStart; int GutsValue = unitResult.pilot.Guts; int TacticsValue = unitResult.pilot.Tactics; SimGameState simstate = Traverse.Create(__instance).Field("simState").GetValue <SimGameState>(); int CurrentMorale = simstate.Morale; int MoraleDiff = CurrentMorale - simstate.Morale; int MoraleModifier = 0; if (MoraleDiff <= settings.MoraleNegativeTierTwo) { MoraleModifier = -2; } if (MoraleDiff <= settings.MoraleNegativeTierOne && MoraleDiff > settings.MoraleNegativeTierTwo) { MoraleModifier = -1; } if (MoraleDiff < settings.MoralePositiveTierTwo && MoraleDiff >= settings.MoralePositiveTierOne) { MoraleModifier = 1; } if (MoraleDiff >= settings.MoralePositiveTierTwo) { MoraleModifier = 2; } int FatigueTime = 1 + FatigueTimeStart - GutsValue / 2 - MoraleModifier; if (unitResult.pilot.pilotDef.PilotTags.Contains("pilot_athletic") && settings.QuirksEnabled) { FatigueTime = FatigueTime - settings.pilot_athletic_FatigueDaysReduction; } if (FatigueTime <= (settings.FatigueMinimum + 1)) { FatigueTime = settings.FatigueMinimum + 1; } if (unitResult.pilot.Injuries == 0 && unitResult.pilot.pilotDef.TimeoutRemaining == 0) { unitResult.pilot.pilotDef.SetTimeoutTime(FatigueTime); unitResult.pilot.pilotDef.PilotTags.Add("pilot_fatigued"); } else if (unitResult.pilot.Injuries == 0 && unitResult.pilot.pilotDef.TimeoutRemaining > 0) { float roll = UnityEngine.Random.Range(1, 100); float GutCheck = 10 * GutsValue; int currenttime = unitResult.pilot.pilotDef.TimeoutRemaining; unitResult.pilot.pilotDef.SetTimeoutTime(0); WorkOrderEntry_MedBayHeal workOrderEntry_MedBayHeal; workOrderEntry_MedBayHeal = (WorkOrderEntry_MedBayHeal)___simState.MedBayQueue.GetSubEntry(unitResult.pilot.Description.Id); ___simState.MedBayQueue.RemoveSubEntry(unitResult.pilot.Description.Id); unitResult.pilot.pilotDef.SetTimeoutTime(currenttime + FatigueTime); unitResult.pilot.pilotDef.PilotTags.Add("pilot_fatigued"); if (roll > GutCheck) { unitResult.pilot.pilotDef.PilotTags.Add("pilot_lightinjury"); unitResult.pilot.pilotDef.PilotTags.Remove("pilot_fatigued"); } } }
public static bool Prefix(AAR_UnitStatusWidget __instance, ref int xpEarned, UnitResult ___UnitData) { var missionXP = xpEarned; var mechsKilled = ___UnitData.pilot.MechsKilled; var othersKilled = ___UnitData.pilot.OthersKilled; var newXP = 0; if (ModInit.modSettings.useMissionXPforBonus) { for (var i = 0; i < mechsKilled; i++) { newXP += Mathf.RoundToInt(missionXP * ModInit.modSettings.bonusXP_MissionMechKills); ModInit.modLog.LogMessage($"adding {Mathf.RoundToInt(missionXP * ModInit.modSettings.bonusXP_MissionMechKills)}XP to {___UnitData.pilot.Description.Callsign} for mech kill, contract multiplier"); } for (var j = 0; j < othersKilled; j++) { newXP += Mathf.RoundToInt(missionXP * ModInit.modSettings.bonusXP_MissionOtherKills); ModInit.modLog.LogMessage($"adding {Mathf.RoundToInt(missionXP * ModInit.modSettings.bonusXP_MissionOtherKills)}XP to {___UnitData.pilot.Description.Callsign} for other kill, contract multiplier"); } } for (var i = 0; i < mechsKilled; i++) { newXP += ModInit.modSettings.bonusXP_MechKills; ModInit.modLog.LogMessage($"adding {ModInit.modSettings.bonusXP_MechKills}XP to {___UnitData.pilot.Description.Callsign} for mech kill, flat bonus"); } for (var j = 0; j < othersKilled; j++) { newXP += ModInit.modSettings.bonusXP_OtherKills; ModInit.modLog.LogMessage($"adding {ModInit.modSettings.bonusXP_OtherKills}XP to {___UnitData.pilot.Description.Callsign} for other kill, flat bonus"); } newXP += Mathf.RoundToInt((___UnitData.pilot.StructureDamageInflicted * ModInit.modSettings.bonusXP_StrDamageMult) + (___UnitData.pilot.ArmorDamageInflicted * ModInit.modSettings.bonusXP_ArmDamageMult)); ModInit.modLog.LogMessage($"adding {Mathf.RoundToInt(___UnitData.pilot.StructureDamageInflicted * ModInit.modSettings.bonusXP_StrDamageMult)}XP from Structure Damage and {Mathf.RoundToInt(___UnitData.pilot.ArmorDamageInflicted * ModInit.modSettings.bonusXP_ArmDamageMult)}XP from Armor Damage to {___UnitData.pilot.Description.Callsign}"); //new XP from effects and abilities added here newXP += ___UnitData.pilot.StatCollection.GetValue <int>("effectXP"); ModInit.modLog.LogMessage($"adding stat effectXP: {___UnitData.pilot.StatCollection.GetValue<int>("effectXP")}XP to {___UnitData.pilot.Description.Callsign} from per-use effects/ability bonuses"); //check this math shit if (ModInit.modSettings.missionXPEffects > 0f && ModInit.modSettings.missionXPeffectBonusDivisor > 0f) { var contractFX_XP = Mathf.RoundToInt((missionXP * ModInit.modSettings.missionXPEffects) * (___UnitData.pilot.StatCollection.GetValue <int>( "effectXP") / ModInit.modSettings.missionXPeffectBonusDivisor)); newXP += contractFX_XP; ModInit.modLog.LogMessage($"adding {contractFX_XP}XP to {___UnitData.pilot.Description.Callsign} following formula ContractXP * ModInit.modSettings.missionXPEffects * (effectXP/ModInit.modSettings.missionXPeffectBonusDivisor)"); } if (newXP > ModInit.modSettings.bonusXP_CAP && ModInit.modSettings.bonusXP_CAP > 0) { newXP = ModInit.modSettings.bonusXP_CAP; ModInit.modLog.LogMessage($"total XP bonus exceeded ModInit.modSettings.bonusXP_CAP of {ModInit.modSettings.bonusXP_CAP}. {ModInit.modSettings.bonusXP_CAP}XP to {___UnitData.pilot.Description.Callsign} instead"); } ___UnitData.pilot.AddExperience(0, "FromKillsOrDmg", newXP); ModInit.modLog.LogMessage($"Total bonus XP awarded to {___UnitData.pilot.Description.Callsign}: {newXP}"); xpEarned += newXP; return(true); }
public static void Postfix(AAR_UnitStatusWidget __instance, SimGameState ___simState) { UnitResult unitResult = Traverse.Create(__instance).Field("UnitData").GetValue <UnitResult>(); int FatigueTimeStart = settings.FatigueTimeStart; int GutsValue = unitResult.pilot.Guts; int TacticsValue = unitResult.pilot.Tactics; SimGameState simstate = Traverse.Create(__instance).Field("simState").GetValue <SimGameState>(); int MoraleDiff = simstate.Morale - simstate.Constants.Story.StartingMorale; int MoraleModifier = 0; if (MoraleDiff <= settings.MoraleNegativeTierTwo) { MoraleModifier = -2; } if (MoraleDiff <= settings.MoraleNegativeTierOne && MoraleDiff > settings.MoraleNegativeTierTwo) { MoraleModifier = -1; } if (MoraleDiff < settings.MoralePositiveTierTwo && MoraleDiff >= settings.MoralePositiveTierOne) { MoraleModifier = 1; } if (MoraleDiff >= settings.MoralePositiveTierTwo) { MoraleModifier = 2; } //Reduction in Fatigue Time for Guts tiers. int GutsReduction = 0; if (GutsValue >= 4) { GutsReduction = 1; } if (GutsValue >= 7) { GutsReduction = 2; } else if (GutsValue == 10) { GutsReduction = 3; } //Additional Fatigue Time for 'Mech damage. double MechDamage = (unitResult.mech.MechDefCurrentStructure + unitResult.mech.MechDefCurrentArmor) / (unitResult.mech.MechDefAssignedArmor + unitResult.mech.MechDefMaxStructure); int MechDamageTime = (int)Math.Ceiling((1 - MechDamage) * settings.MechDamageMaxDays); int argoReduction = 1; var simState = Traverse.Create(__instance).Field("simState").GetValue <SimGameState>(); if (simState != null && settings.ArgoUpgradeReduction) { var shipUpgrades = Traverse.Create(simState).Field("shipUpgrades").GetValue <List <ShipModuleUpgrade> >(); if (shipUpgrades.Any(u => u.Tags.Any(t => t.Contains("argoUpgrade_rec_hydroponics")))) { argoReduction++; } if (shipUpgrades.Any(u => u.Tags.Any(t => t.Contains("argoUpgrade_rec_pool")))) { argoReduction++; } if (shipUpgrades.Any(u => u.Tags.Any(t => t.Contains("argoUpgrade_rec_arcade")))) { argoReduction++; } } var rand = new System.Random(); argoReduction = rand.Next(0, argoReduction); //Calculate actual Fatigue Time for pilot. int FatigueTime = FatigueTimeStart + MechDamageTime - GutsReduction - MoraleModifier - argoReduction; if (unitResult.pilot.pilotDef.PilotTags.Contains("pilot_athletic") && settings.QuirksEnabled) { FatigueTime = (int)Math.Ceiling(FatigueTime / settings.pilot_athletic_FatigueDaysReductionFactor) - settings.pilot_athletic_FatigueDaysReduction; } if (unitResult.pilot.pilotDef.PilotTags.Contains("PQ_pilot_green")) { FatigueTime -= settings.pilot_athletic_FatigueDaysReduction; } if (FatigueTime < settings.FatigueMinimum) { FatigueTime = settings.FatigueMinimum; } if (settings.QuirksEnabled && unitResult.pilot.pilotDef.PilotTags.Contains("pilot_wealthy")) { FatigueTime += settings.pilot_wealthy_extra_fatigue; } if (unitResult.pilot.Injuries == 0 && unitResult.pilot.pilotDef.TimeoutRemaining == 0) { unitResult.pilot.pilotDef.SetTimeoutTime(FatigueTime); unitResult.pilot.pilotDef.PilotTags.Add("pilot_fatigued"); } else if (unitResult.pilot.Injuries == 0 && unitResult.pilot.pilotDef.TimeoutRemaining > 0) { float roll = UnityEngine.Random.Range(1, 100); float GutCheck = 5 * GutsValue; if (settings.QuirksEnabled && unitResult.pilot.pilotDef.PilotTags.Contains("pilot_gladiator")) { GutCheck = GutCheck + 25; } if (unitResult.pilot.pilotDef.PilotTags.Contains("PQ_pilot_green")) { GutCheck = GutCheck + 25; } int currenttime = unitResult.pilot.pilotDef.TimeoutRemaining; unitResult.pilot.pilotDef.SetTimeoutTime(0); WorkOrderEntry_MedBayHeal workOrderEntry_MedBayHeal; workOrderEntry_MedBayHeal = (WorkOrderEntry_MedBayHeal)___simState.MedBayQueue.GetSubEntry(unitResult.pilot.Description.Id); ___simState.MedBayQueue.RemoveSubEntry(unitResult.pilot.Description.Id); int TotalFatigueTime = currenttime + FatigueTime; if (TotalFatigueTime > settings.MaximumFatigueTime && !(settings.QuirksEnabled && unitResult.pilot.pilotDef.PilotTags.Contains("pilot_wealthy"))) { TotalFatigueTime = settings.MaximumFatigueTime; } unitResult.pilot.pilotDef.SetTimeoutTime(TotalFatigueTime); unitResult.pilot.pilotDef.PilotTags.Add("pilot_fatigued"); if (roll > GutCheck && (settings.LightInjuriesOn)) { if (settings.BEXCE && simstate.Constants.Story.MaximumDebt != 42) { return; } unitResult.pilot.pilotDef.PilotTags.Add("pilot_lightinjury"); unitResult.pilot.pilotDef.PilotTags.Remove("pilot_fatigued"); } } if (unitResult.pilot.pilotDef.PilotTags.Contains("PQ_pilot_green")) { unitResult.pilot.pilotDef.PilotTags.Remove("PQ_pilot_green"); } }