using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using System.Text;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using HarmonyLib;
using UnityEngine;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyTitle("CookedInfo")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("CookedInfo")]
[assembly: AssemblyCopyright("Copyright © 2024")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("dd8fbe8a-de2b-4d9a-917e-e86b43c6cf06")]
[assembly: AssemblyFileVersion("1.2.3.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
[assembly: AssemblyVersion("1.2.3.0")]
namespace CookedInfo;
internal static class DescriptionBuilder
{
private const string red = "#4D0000";
private const string green = "#003300";
private const string yellow = "#CC7F00";
private const string light_blue = "#2861FC";
private const string med_blue = "#1C3270";
private const string dark_blue = "#071336";
public static void BurnableDescription(ref string description, float amount)
{
if (amount > 0f && amount < 1f)
{
description = BuildDescription("#CC7F00", description, amount) ?? "";
}
if (amount >= 1f && amount < 1.25f)
{
description = BuildDescription("#003300", description, amount) ?? "";
}
if (amount >= 1.25f)
{
description = BuildDescription("#4D0000", "overcooked " + description.Replace("cooked ", ""), amount) ?? "";
}
}
public static void NonBurnableDescription(ref string description, float amount)
{
if (amount > 0f && amount < 1f)
{
description = BuildDescription("#CC7F00", description, amount, canOvercook: false) ?? "";
}
if (amount >= 1f)
{
description = BuildDescription("#003300", description, amount, canOvercook: false) ?? "";
}
}
private static string BuildDescription(string color, string desc, float amount, bool canOvercook = true)
{
if (!Plugin.configColoredText.Value)
{
return desc + CookedPercent(amount, canOvercook) + CookingBar(amount);
}
return desc + "<color=" + color + ">" + CookedPercent(amount, canOvercook) + CookingBar(amount) + "</color>";
}
private static string CookedPercent(float amount, bool canOvercook)
{
if (!Plugin.configCookingPercent.Value)
{
return "";
}
amount = Mathf.RoundToInt(amount * 100f);
amount = ((!canOvercook && amount > 100f) ? 100f : amount);
return $"\n<b>{amount}%</b>";
}
private static string CookingBar(float amount)
{
if (!Plugin.configCookingBar.Value)
{
return "";
}
return ProgressBar(amount) ?? "";
}
public static void Freshness(ref string description, float spoiled)
{
if (Plugin.configFreshnessBar.Value)
{
if (spoiled < 0.33f)
{
description = FreshnessBar("#2861FC", description, spoiled) ?? "";
}
if (spoiled >= 0.33f && spoiled < 0.66f)
{
description = FreshnessBar("#1C3270", description, spoiled) ?? "";
}
if (spoiled >= 0.66f)
{
description = FreshnessBar("#071336", description, spoiled) ?? "";
}
}
}
private static string FreshnessBar(string color, string foodDescr, float amount)
{
if (!Plugin.configColoredText.Value)
{
return foodDescr + ProgressBar(1f - amount);
}
return foodDescr + "<color=" + color + ">" + ProgressBar(1f - amount) + "</color>";
}
private static string ProgressBar(float amount)
{
int num = 300;
int num2 = (int)(amount * (float)num);
if (num2 <= 0 || num2 >= num)
{
return "";
}
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < num; i++)
{
if (i < num2)
{
stringBuilder.Append("█");
}
else
{
stringBuilder.Append("░");
}
}
return $"\n<size=3%>{stringBuilder}</size>";
}
}
[BepInPlugin("pr0skynesis.cookedinfo", "Cooked Info", "1.2.3")]
public class Plugin : BaseUnityPlugin
{
public const string PLUGIN_GUID = "pr0skynesis.cookedinfo";
public const string PLUGIN_NAME = "Cooked Info";
public const string PLUGIN_VERSION = "1.2.3";
internal static Plugin instance;
internal static ManualLogSource logger;
internal static ConfigEntry<bool> configColoredText;
internal static ConfigEntry<bool> configCookingPercent;
internal static ConfigEntry<bool> configCookingBar;
internal static ConfigEntry<bool> configFreshnessBar;
private void Awake()
{
instance = this;
logger = ((BaseUnityPlugin)this).Logger;
Harmony.CreateAndPatchAll(Assembly.GetExecutingAssembly(), "pr0skynesis.cookedinfo");
configColoredText = ((BaseUnityPlugin)this).Config.Bind<bool>("Colored Text", "showColoredText", true, "Enables the colored text for raw, cooked, and overcooked food, change to false to disable it.");
configCookingPercent = ((BaseUnityPlugin)this).Config.Bind<bool>("Cooking Percentage", "showCookingPercent", true, "Enables the cooking percentage when cooking or drying food, change to false to disable it.");
configCookingBar = ((BaseUnityPlugin)this).Config.Bind<bool>("Loading Bar", "showCookingBar", true, "Enables the cooking loading bar when cooking or drying food, change to false to disable it.");
configFreshnessBar = ((BaseUnityPlugin)this).Config.Bind<bool>("Freshness Bar", "showFreshnessBar", true, "Enables the freshness loading bar, change to false to disable it.");
}
}
internal class Patches
{
[HarmonyPatch(typeof(FoodState))]
public class FoodStatePatches
{
[HarmonyPostfix]
[HarmonyPatch("UpdateLookText")]
public static void UpdateLookText_Patch(ShipItemFood ___food, CookableFood ___cookable, float ___dried, DryingRackCol ___dryingCol, float ___spoiled)
{
if (Object.op_Implicit((Object)(object)___cookable.GetCurrentCookTrigger()))
{
DescriptionBuilder.BurnableDescription(ref ((GoPointerButton)___food).description, ((ShipItem)___food).amount);
}
if (Object.op_Implicit((Object)(object)___dryingCol))
{
float amount = ___dried / 0.99f;
DescriptionBuilder.NonBurnableDescription(ref ((GoPointerButton)___food).description, amount);
}
float spoiled = ___spoiled / 0.9f;
DescriptionBuilder.Freshness(ref ((GoPointerButton)___food).description, spoiled);
}
}
[HarmonyPatch(typeof(ShipItemSoup))]
public class ShipItemSoupPatches
{
[HarmonyPostfix]
[HarmonyPatch("UpdateLookText")]
public static void UpdateLookText_Patch(ShipItemSoup __instance, CookableFoodSoup ___cookable, float ___currentWater, float ___currentEnergy, float ___currentUncookedEnergy, float ___currentSpoiled)
{
float num = ___currentEnergy / (___currentEnergy + ___currentUncookedEnergy);
float num2 = ___currentSpoiled / (___currentEnergy + ___currentUncookedEnergy) / 0.9f;
if (num > 0f && num < 1f)
{
((GoPointerButton)__instance).description = "uncooked soup";
}
if (num >= 1f)
{
((GoPointerButton)__instance).description = "cooked soup";
}
if (num2 >= 1f)
{
((GoPointerButton)__instance).description = "rotten soup";
}
if (___currentEnergy + ___currentUncookedEnergy == 0f)
{
((GoPointerButton)__instance).description = ((___currentWater > 0f) ? (((ShipItem)__instance).name + " of water") : ((ShipItem)__instance).name);
}
if (Object.op_Implicit((Object)(object)((CookableFood)___cookable).GetCurrentCookTrigger()))
{
DescriptionBuilder.NonBurnableDescription(ref ((GoPointerButton)__instance).description, num);
}
DescriptionBuilder.Freshness(ref ((GoPointerButton)__instance).description, num2);
}
}
}