using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using BepInEx;
using HarmonyLib;
using SOD.Common;
using SOD.Common.BepInEx;
using SOD.Common.Extensions;
using SOD.Common.Helpers;
using SOD.LethalActionReborn.Patches;
using UnityEngine;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETCoreApp,Version=v6.0", FrameworkDisplayName = ".NET 6.0")]
[assembly: AssemblyCompany("SOD.LethalActionReborn")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+38ea4d9c1fc13999aced192e8db869f15ae499b1")]
[assembly: AssemblyProduct("SOD.LethalActionReborn")]
[assembly: AssemblyTitle("SOD.LethalActionReborn")]
[assembly: AssemblyVersion("1.0.0.0")]
namespace SOD.LethalActionReborn
{
[BepInPlugin("Venomaus.SOD.LethalActionReborn", "LethalActionReborn", "1.0.3")]
[BepInDependency(/*Could not decode attribute arguments.*/)]
public class Plugin : PluginController<Plugin>
{
public const string PLUGIN_GUID = "Venomaus.SOD.LethalActionReborn";
public const string PLUGIN_NAME = "LethalActionReborn";
public const string PLUGIN_VERSION = "1.0.3";
public override void Load()
{
Lib.SaveGame.OnAfterLoad += SaveGame_OnAfterLoad;
Lib.SaveGame.OnAfterSave += SaveGame_OnAfterSave;
Lib.SaveGame.OnAfterDelete += SaveGame_OnAfterDelete;
((PluginController<Plugin, IEmptyBindings>)(object)this).Harmony.PatchAll(Assembly.GetExecutingAssembly());
PluginController<Plugin, IEmptyBindings>.Log.LogInfo((object)"Plugin is patched.");
}
private void SaveGame_OnAfterDelete(object sender, SaveGameArgs e)
{
string uniqueString = Lib.SaveGame.GetUniqueString(e.FilePath);
string savestoreDirectoryPath = Lib.SaveGame.GetSavestoreDirectoryPath(Assembly.GetExecutingAssembly(), "lethalActioned_" + uniqueString + ".txt");
if (File.Exists(savestoreDirectoryPath))
{
File.Delete(savestoreDirectoryPath);
}
}
private void SaveGame_OnAfterSave(object sender, SaveGameArgs e)
{
string uniqueString = Lib.SaveGame.GetUniqueString(e.FilePath);
File.WriteAllText(Lib.SaveGame.GetSavestoreDirectoryPath(Assembly.GetExecutingAssembly(), "lethalActioned_" + uniqueString + ".txt"), string.Join(",", CitizenPatches.Citizen_RecieveDamage.KilledCitizens));
}
private void SaveGame_OnAfterLoad(object sender, SaveGameArgs e)
{
string uniqueString = Lib.SaveGame.GetUniqueString(e.FilePath);
string savestoreDirectoryPath = Lib.SaveGame.GetSavestoreDirectoryPath(Assembly.GetExecutingAssembly(), "lethalActioned_" + uniqueString + ".txt");
if (!File.Exists(savestoreDirectoryPath))
{
return;
}
HashSet<int> hashSet = (from a in File.ReadAllText(savestoreDirectoryPath).Split(new char[1] { ',' }, StringSplitOptions.RemoveEmptyEntries)
select int.Parse(a)).ToHashSet();
HashSet<int> hashSet2 = (from a in EnumerableExtensions.ToList<Human>(CityData.Instance.deadCitizensDirectory)
select a.humanID).ToHashSet();
Human val = default(Human);
foreach (int item in hashSet)
{
CitizenPatches.Citizen_RecieveDamage.KilledCitizens.Add(item);
if (CityData.Instance.citizenDictionary.TryGetValue(item, ref val))
{
((Actor)val).SetHealth(0f);
((Actor)val).animationController.cit.Murder((Human)(object)Player.Instance, false, (Murder)null, (Interactable)null, 1f);
if (!hashSet2.Contains(item))
{
CityData.Instance.deadCitizensDirectory.Add(val);
hashSet2.Add(item);
}
if ((Object)(object)MurderController.Instance.currentMurderer != (Object)null && MurderController.Instance.currentMurderer.humanID == item)
{
MurderController.Instance.PickNewMurderer();
MurderController.Instance.PickNewVictim();
}
if ((Object)(object)MurderController.Instance.currentVictim != (Object)null && MurderController.Instance.currentVictim.humanID == item)
{
MurderController.Instance.PickNewVictim();
}
}
}
}
}
}
namespace SOD.LethalActionReborn.Patches
{
internal class CitizenPatches
{
[HarmonyPatch(typeof(Citizen), "RecieveDamage")]
internal static class Citizen_RecieveDamage
{
internal static readonly HashSet<int> KilledCitizens = new HashSet<int>();
private static bool _hasKilled = false;
[HarmonyPrefix]
internal static void Prefix(Citizen __instance, float amount, Actor fromWho)
{
if ((Object)(object)fromWho == (Object)(object)Player.Instance && ((Actor)__instance).ai.ko)
{
_hasKilled = true;
}
}
[HarmonyPostfix]
internal static void Postfix(Citizen __instance, Actor fromWho)
{
if (!((Actor)__instance).isDead && _hasKilled && (Object)(object)fromWho == (Object)(object)Player.Instance)
{
_hasKilled = false;
((Actor)__instance).SetHealth(0f);
((Actor)__instance).animationController.cit.Murder((Human)(object)Player.Instance, false, (Murder)null, (Interactable)null, 1f);
CityData.Instance.deadCitizensDirectory.Add((Human)(object)__instance);
KilledCitizens.Add(((Human)__instance).humanID);
if ((Object)(object)MurderController.Instance.currentMurderer != (Object)null && MurderController.Instance.currentMurderer.humanID == ((Human)__instance).humanID)
{
MurderController.Instance.PickNewMurderer();
MurderController.Instance.PickNewVictim();
}
if ((Object)(object)MurderController.Instance.currentVictim != (Object)null && MurderController.Instance.currentVictim.humanID == ((Human)__instance).humanID)
{
MurderController.Instance.PickNewVictim();
}
}
}
}
}
}