コード例 #1
0
            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);
                }
            }
コード例 #2
0
        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;
            }
        }
コード例 #3
0
            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);
                }
            }
コード例 #4
0
 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);
     }
 }
コード例 #5
0
 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);
             }
         }
     }
 }
コード例 #6
0
            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);
                }
            }
コード例 #7
0
            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");
                }
            }
コード例 #8
0
            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");
                    }
                }
            }
コード例 #9
0
            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);
            }
コード例 #10
0
            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");
                }
            }