{"TotalCount":38,"Files":[{"Ident":"rakunsoftware.milaine","Path":"Scripts/Managers/GameManager.cs","FileName":"GameManager.cs","PackageType":"game","CodeKind":"Game","AssetVersionId":394495,"IsPrivate":false,"Code":"using System;\r\nusing Milaine.TreeSkills;\r\n\r\nnamespace Milaine.Managers;\r\n\r\npublic sealed class GameManager : Component {\r\n  [Property, Title(\u0022IdleManager\u0022)]\r\n  [Feature(\u0022General\u0022)]\r\n  public IdleManager IdleManagerInstance { get; set; }\r\n\r\n  [Property, Title(\u0022InvestmentManager\u0022)]\r\n  [Feature(\u0022General\u0022)]\r\n  public InvestmentManager InvestmentManagerInstance { get; set; }\r\n\r\n  [Property, Title(\u0022SkillTreeBootstrap\u0022)]\r\n  [Feature(\u0022General\u0022)]\r\n  public SkillTreeBootstrap SkillTreeBootstrapInstance { get; set; }\r\n\r\n  [Property, Title(\u0022DayNightManager\u0022)]\r\n  [Feature(\u0022General\u0022)]\r\n  public DayNightManager DayNightManagerInstance { get; set; }\r\n\r\n  public Action OnLooseGame { get; set; }\r\n  public Action OnWinGame { get; set; }\r\n\r\n  private List\u003CSkillNodeData\u003E skillsUsed = [];\r\n  private int maxSkillPoints = 0;\r\n  private int skillPoints = 0;\r\n  private bool isPlaying = true;\r\n  private bool isGameWin = false;\r\n\r\n  public bool IsGameWin {\r\n    get =\u003E isGameWin;\r\n  }\r\n\r\n  protected override void OnAwake() {\r\n    TreeSkillState.Instance.OnUnlocked \u002B= OnUnlocked;\r\n    TreeSkillState.Instance.SpendPoint \u002B= OnSpendPoint;\r\n    TreeSkillState.Instance.GetSkillPoints = GetSkillPoints;\r\n    DayNightManagerInstance.OnEndDay \u002B= OnEndDay;\r\n    InvestmentManagerInstance.OnChange \u002B= OnInvestmentManagerChange;\r\n  }\r\n\r\n  protected override void OnDestroy() {\r\n    TreeSkillState.Instance.OnUnlocked -= OnUnlocked;\r\n    TreeSkillState.Instance.SpendPoint -= OnSpendPoint;\r\n    DayNightManagerInstance.OnEndDay -= OnEndDay;\r\n    InvestmentManagerInstance.OnChange -= OnInvestmentManagerChange;\r\n  }\r\n\r\n  private void OnEndDay() {\r\n    if (DayNightManagerInstance.Day \u003C 5) {\r\n      return;\r\n    }\r\n\r\n    isPlaying = false;\r\n    isGameWin = false;\r\n    OnLooseGame?.Invoke();\r\n  }\r\n\r\n  private void OnInvestmentManagerChange(Portfolio portfolio) {\r\n    if (!isPlaying) {\r\n      return;\r\n    }\r\n\r\n    int total = (int)portfolio.investment;\r\n    int goal = IdleManagerInstance.Goal;\r\n\r\n    if (total \u003E= goal) {\r\n      isPlaying = false;\r\n      isGameWin = true;\r\n      DayNightManagerInstance.ResetManager();\r\n      OnWinGame?.Invoke();\r\n    }\r\n  }\r\n\r\n  private void OnUnlocked(SkillNodeData node) {\r\n    if (skillsUsed.Contains(node)) {\r\n      return;\r\n    }\r\n\r\n    skillsUsed.Add(node);\r\n\r\n    switch (node.Category) {\r\n      case SkillCategory.Dollars:\r\n        IdleManagerInstance.ImprovePoint(node.Point);\r\n        break;\r\n      case SkillCategory.DollarAutomatic:\r\n        IdleManagerInstance.ImprovePasiveDollar(node.Point);\r\n        break;\r\n      case SkillCategory.Wallet:\r\n        InvestmentManagerInstance.ImproveWallet(node.Point);\r\n        break;\r\n      case SkillCategory.Investment:\r\n        InvestmentManagerInstance.ImprovePerformance(node.Point);\r\n        break;\r\n      case SkillCategory.Dividends:\r\n        InvestmentManagerInstance.ImproveDividends(node.Point);\r\n        break;\r\n      case SkillCategory.WalletPlus:\r\n        InvestmentManagerInstance.ImproveDeposit(node.Point);\r\n        break;\r\n    }\r\n  }\r\n\r\n  private int GetSkillPoints() =\u003E skillPoints;\r\n\r\n  private void OnSpendPoint() {\r\n    skillPoints--;\r\n  }\r\n\r\n  public void Restart() {\r\n    DayNightManagerInstance.Restart();\r\n    TreeSkillState.Instance.Restart();\r\n    skillsUsed = [];\r\n    maxSkillPoints \u002B= 1;\r\n    skillPoints \u002B= maxSkillPoints;\r\n\r\n    IdleManagerInstance.Restart();\r\n    InvestmentManagerInstance.Restart();\r\n  }\r\n}\r\n"},{"Ident":"rakunsoftware.milaine","Path":"Scripts/Managers/MouseManager.cs","FileName":"MouseManager.cs","PackageType":"game","CodeKind":"Game","AssetVersionId":394495,"IsPrivate":false,"Code":"namespace Milaine.Managers;\r\n\r\npublic enum StateMouse {\r\n  Relased,\r\n  Busy\r\n}\r\n\r\npublic static class MouseManager {\r\n  public static StateMouse State { get; set; } = StateMouse.Relased;\r\n\r\n  public static void ShowMouse() {\r\n    Mouse.Visibility = MouseVisibility.Visible;\r\n  }\r\n\r\n  public static void HideMouse() {\r\n    Mouse.Visibility = MouseVisibility.Hidden;\r\n  }\r\n}\r\n"},{"Ident":"rakunsoftware.milaine","Path":"Scripts/Managers/DayNightManager.cs","FileName":"DayNightManager.cs","PackageType":"game","CodeKind":"Game","AssetVersionId":394495,"IsPrivate":false,"Code":"using System;\r\nusing Milaine.Interfaces;\r\n\r\nnamespace Milaine.Managers;\r\n\r\npublic sealed class DayNightManager : Component, IManager {\r\n  // 60 -\u003E seconds\r\n  private const int MINUTE = 60;\r\n  // 5 mins\r\n  private const int MAX_TIME = 5 * MINUTE;\r\n  public const int MAX_DAYS = 5;\r\n\r\n  [Property]\r\n  public float DayDuration { get; set; } = MAX_TIME;\r\n\r\n  [Property]\r\n  public int Day { get; set; } = 1;\r\n\r\n  // hour in 24h\r\n  private readonly float startHour = 8f;\r\n  private readonly float endHour = 18f;\r\n\r\n  private bool isDayActive = false;\r\n  private TimeUntil timeUntilNight;\r\n\r\n  public string CurrentTimeString { get; private set; } = \u00228:00 AM\u0022;\r\n\r\n  public Action OnStartDay;\r\n  public Action OnEndDay;\r\n\r\n  protected override void OnStart() {\r\n    StartDay();\r\n  }\r\n\r\n  protected override void OnUpdate() {\r\n    if (!isDayActive) {\r\n      return;\r\n    }\r\n\r\n    float elapsedSeconds = DayDuration - timeUntilNight;\r\n    float progress = MathX.Clamp(elapsedSeconds / DayDuration, 0f, 1f);\r\n    float totalVirtualHours = endHour - startHour;\r\n    float currentVirtualHour = startHour \u002B (progress * totalVirtualHours);\r\n\r\n    int hours = (int)MathF.Floor(currentVirtualHour);\r\n    int minutes = (int)MathF.Floor((currentVirtualHour - hours) * 60f);\r\n\r\n    string amPm = hours \u003E= 12 ? \u0022PM\u0022 : \u0022AM\u0022;\r\n    int displayHour = hours % 12;\r\n\r\n    if (displayHour == 0) {\r\n      displayHour = 12;\r\n    }\r\n\r\n    CurrentTimeString = $\u0022{displayHour:D2}:{minutes:D2} {amPm}\u0022;\r\n\r\n    if (timeUntilNight) {\r\n      EndDay();\r\n    }\r\n  }\r\n\r\n  private void StartDay() {\r\n    if (isDayActive) {\r\n      return;\r\n    }\r\n\r\n    timeUntilNight = DayDuration;\r\n    isDayActive = true;\r\n\r\n    OnStartDay?.Invoke();\r\n  }\r\n\r\n  private void EndDay() {\r\n    ResetManager(deep: false);\r\n    OnEndDay?.Invoke();\r\n  }\r\n\r\n  public void ResetManager(bool deep = false) {\r\n    if (deep) {\r\n      CurrentTimeString = \u00228:00 AM\u0022;\r\n    }\r\n\r\n    isDayActive = false;\r\n  }\r\n\r\n  public void NextDay() {\r\n    if (Day \u003E= MAX_DAYS) {\r\n      return;\r\n    }\r\n\r\n    Day \u002B= 1;\r\n    StartDay();\r\n  }\r\n\r\n  public void Restart() {\r\n    Day = 1;\r\n    StartDay();\r\n  }\r\n}\r\n"},{"Ident":"rakunsoftware.milaine","Path":"Scripts/Room/ClickableButton.cs","FileName":"ClickableButton.cs","PackageType":"game","CodeKind":"Game","AssetVersionId":394495,"IsPrivate":false,"Code":"using System;\r\nusing Milaine.Managers;\r\n\r\nnamespace Milaine.Room;\r\n\r\npublic sealed class ClickableButton : Component {\r\n  [Property, Group(\u0022References\u0022)]\r\n  public SkinnedModelRenderer Model { get; set; }\r\n\r\n  [Property, Group(\u0022Animation\u0022), Title(\u0022Sequence Name\u0022)]\r\n  public string PressSequence { get; set; } = \u0022press\u0022;\r\n\r\n  [Property, Group(\u0022Animation\u0022)]\r\n  public bool UsesAnimGraph { get; set; } = false;\r\n\r\n  [Property, Group(\u0022Interaction\u0022)]\r\n  public float MaxClickDistance { get; set; } = 1000f;\r\n\r\n  [Property, Group(\u0022Squish (Scale Z)\u0022), Range(0.1f, 1f)]\r\n  public float PressedScale { get; set; } = 0.8f;\r\n\r\n  [Property, Group(\u0022Squish (Scale Z)\u0022), Range(1f, 30f)]\r\n  public float ScaleSpeed { get; set; } = 14f;\r\n\r\n  public Action OnPressed { get; set; }\r\n\r\n  private bool isHeld;\r\n  private Vector3 originalScale;\r\n  private float currentScaleFactor = 1f;\r\n\r\n  protected override void OnStart() {\r\n    if (!Model.IsValid()) {\r\n      Model = Components.Get\u003CSkinnedModelRenderer\u003E();\r\n    }\r\n\r\n    originalScale = LocalScale;\r\n  }\r\n\r\n  protected override void OnUpdate() {\r\n    if (MouseManager.State == StateMouse.Busy) {\r\n      return;\r\n    }\r\n\r\n    var camera = Scene.Camera;\r\n\r\n    if (!camera.IsValid()) {\r\n      return;\r\n    }\r\n\r\n    var ray = camera.ScreenPixelToRay(Mouse.Position);\r\n    var trace = Scene.Trace.Ray(ray, MaxClickDistance).Run();\r\n    bool isHoveredNow = trace.Hit \u0026\u0026 trace.GameObject == GameObject;\r\n\r\n    if ((Input.Pressed(\u0022attack1\u0022) || Input.Pressed(\u0022attack2\u0022)) \u0026\u0026 isHoveredNow) {\r\n      Press();\r\n      isHeld = true;\r\n    }\r\n\r\n    if (Input.Released(\u0022attack1\u0022) || Input.Released(\u0022attack2\u0022)) {\r\n      isHeld = false;\r\n    }\r\n\r\n    float targetFactor = isHeld ? PressedScale : 1f;\r\n    currentScaleFactor = MathX.Lerp(currentScaleFactor, targetFactor, Time.Delta * ScaleSpeed);\r\n\r\n    LocalScale = new Vector3(originalScale.x, originalScale.y, originalScale.z * currentScaleFactor);\r\n  }\r\n\r\n  public void Press() {\r\n    PlayPressAnimation();\r\n    Sound.Play(\u0022sounds/sound_key_down.sound\u0022);\r\n    OnPressed?.Invoke();\r\n  }\r\n\r\n  private void PlayPressAnimation() {\r\n    if (!Model.IsValid()) {\r\n      return;\r\n    }\r\n\r\n    if (UsesAnimGraph) {\r\n      Model.Set(PressSequence, true);\r\n    } else {\r\n      Model.SceneModel.UseAnimGraph = false;\r\n      Model.SceneModel.CurrentSequence.Name = PressSequence;\r\n    }\r\n  }\r\n}\r\n"},{"Ident":"rakunsoftware.milaine","Path":"Scripts/Room/RoomManager.cs","FileName":"RoomManager.cs","PackageType":"game","CodeKind":"Game","AssetVersionId":394495,"IsPrivate":false,"Code":"namespace Milaine.Room;\r\n\r\npublic sealed class RoomManager : Component {\r\n  [Property]\r\n  public List\u003CGameObject\u003E Models { get; set; } = [];\r\n\r\n  private List\u003CGameObject\u003E ChairChildren = [];\r\n\r\n  protected override void OnAwake() {\r\n    if (Models.Count == 0) {\r\n      Log.Warning(\u0022Models list is empty\u0022);\r\n      return;\r\n    }\r\n\r\n    foreach (GameObject gameObject in Models) {\r\n      if (!gameObject.IsValid()) {\r\n        continue;\r\n      }\r\n\r\n      Prop prop = gameObject.GetComponent\u003CProp\u003E();\r\n\r\n      if (!prop.IsValid()) {\r\n        continue;\r\n      }\r\n\r\n      prop.IsStatic = true;\r\n\r\n      if (gameObject.Name == \u0022office_chair\u0022) {\r\n        gameObject.GetComponent\u003CModelRenderer\u003E().Destroy();\r\n        gameObject.GetComponent\u003CModelPhysics\u003E().Destroy();\r\n\r\n        foreach (GameObject obj in gameObject.Children) {\r\n          ChairChildren.Add(obj);\r\n        }\r\n      }\r\n    }\r\n\r\n  }\r\n\r\n  protected override void OnUpdate() {\r\n    if (ChairChildren.Count == 0) {\r\n      return;\r\n    }\r\n\r\n    foreach (GameObject gameObject in ChairChildren) {\r\n      gameObject.Destroy();\r\n    }\r\n\r\n    ChairChildren = [];\r\n  }\r\n}\r\n"},{"Ident":"rakunsoftware.milaine","Path":"Scripts/Settings/Configuration.cs","FileName":"Configuration.cs","PackageType":"game","CodeKind":"Game","AssetVersionId":394495,"IsPrivate":false,"Code":"using System;\r\n\r\nnamespace Milaine.Settings;\r\n\r\npublic class ConfigurationData {\r\n  public string Language { get; set; } = \u0022en\u0022;\r\n}\r\n\r\npublic sealed class Configuration : Component {\r\n  private readonly string filename = \u0022settings.cfg\u0022;\r\n\r\n  [Property]\r\n  public string Language { get; set; } = \u0022en\u0022;\r\n\r\n  protected override void OnAwake() {\r\n    if (!FileSystem.Data.FileExists(filename)) {\r\n      SaveConfig();\r\n\r\n      return;\r\n    }\r\n\r\n    LoadConfig();\r\n  }\r\n\r\n  public void LoadConfig() {\r\n    var config = FileSystem.Data.ReadJson\u003CConfigurationData\u003E(filename);\r\n    Language = config.Language;\r\n  }\r\n\r\n  public void SaveConfig() {\r\n    try {\r\n      var config = new ConfigurationData { Language = Language };\r\n      FileSystem.Data.WriteJson(filename, config);\r\n    }\r\n    catch (Exception ex) {\r\n      Log.Warning($\u0022Error to try create configuration file: {ex.Message}\u0022);\r\n    }\r\n  }\r\n}\r\n"},{"Ident":"rakunsoftware.milaine","Path":"UI/FloatingTextManager/FloatingTextManager.razor","FileName":"FloatingTextManager.razor","PackageType":"game","CodeKind":"Game","AssetVersionId":394495,"IsPrivate":false,"Code":"@using Sandbox;\r\n@using Sandbox.UI;\r\n@namespace Milaine.UI\r\n@inherits Panel\r\n\r\n\u003Croot\u003E\u003C/root\u003E\r\n\r\n@code {\r\n  public static FloatingTextManager Instance { get; set; }\r\n\r\n  public FloatingTextManager()\r\n  {\r\n    Instance = this;\r\n  }\r\n\r\n  public override void OnDeleted()\r\n  {\r\n    base.OnDeleted();\r\n\r\n    if (Instance == this)\r\n    {\r\n      Instance = null;\r\n    }\r\n  }\r\n\r\n  public void Spawn(string text, float screenX, float screenY)\r\n  {\r\n    var floatingText = AddChild\u003CFloatingText\u003E();\r\n    floatingText.Text = text;\r\n    floatingText.SpawnX = screenX;\r\n    floatingText.SpawnY = screenY;\r\n  }\r\n}\r\n\r\n\u003Cstyle\u003E\r\n  FloatingTextManager {\r\n    position: absolute;\r\n    top: 0;\r\n    left: 0;\r\n    width: 100%;\r\n    height: 100%;\r\n    pointer-events: none;\r\n  }\r\n\u003C/style\u003E\r\n"},{"Ident":"rakunsoftware.milaine","Path":"Scripts/Utils/Outliner.cs","FileName":"Outliner.cs","PackageType":"game","CodeKind":"Game","AssetVersionId":394495,"IsPrivate":false,"Code":"namespace Milaine.Utils;\r\n\r\npublic sealed class Outliner : Component {\r\n  [Property, Group(\u0022Interaction\u0022)]\r\n  public float MaxClickDistance { get; set; } = 1000f;\r\n\r\n  [Property, Group(\u0022Outline\u0022), Title(\u0022Color Hover\u0022)]\r\n  public Color HoverOutlineColor { get; set; } = Color.White;\r\n\r\n  [Property, Group(\u0022Outline\u0022), Range(0.1f, 10f)]\r\n  public float OutlineWidth { get; set; } = 0.5f;\r\n\r\n  private HighlightOutline outline;\r\n\r\n  protected override void OnAwake() {\r\n  }\r\n\r\n  protected override void OnStart() {\r\n    outline = GameObject.GetOrAddComponent\u003CHighlightOutline\u003E();\r\n    outline.Color = Color.Transparent;\r\n    outline.Width = OutlineWidth;\r\n  }\r\n\r\n  protected override void OnUpdate() {\r\n    var camera = Scene.Camera;\r\n\r\n    if (!camera.IsValid()) {\r\n      return;\r\n    }\r\n\r\n    var ray = camera.ScreenPixelToRay(Mouse.Position);\r\n    var trace = Scene.Trace.Ray(ray, MaxClickDistance).Run();\r\n\r\n    bool isHoveredNow = trace.Hit \u0026\u0026 trace.GameObject == GameObject;\r\n\r\n    if (outline.IsValid()) {\r\n      outline.Color = isHoveredNow ? HoverOutlineColor : Color.Transparent;\r\n    }\r\n  }\r\n}\r\n"},{"Ident":"rakunsoftware.milaine","Path":"UI/Hud/Hud.razor","FileName":"Hud.razor","PackageType":"game","CodeKind":"Game","AssetVersionId":394495,"IsPrivate":false,"Code":"@using System.Threading.Tasks;\r\n@using Milaine.Managers;\r\n@using Milaine.Settings;\r\n@using Milaine.UI;\r\n@using Milaine.Utils;\r\n@using Sandbox;\r\n@using Sandbox.UI;\r\n@inherits PanelComponent\r\n@namespace Sandbox\r\n\r\n\u003Croot\u003E\r\n  \u003Cheader class=\u0022header\u0022\u003E\r\n    \u003Csection class=\u0022day-manager\u0022\u003E\r\n      \u003Ch2\u003E\r\n        @TranslationsInstance.T(\u0022milaine.days\u0022, data)\r\n        @* @Language.GetPhrase(\u0022milaine.days\u0022, data) *@\r\n      \u003C/h2\u003E\r\n    \u003C/section\u003E\r\n    \u003Csection class=\u0022clock\u0022\u003E\r\n      \u003Cp\u003E@DayNightManagerInstance.CurrentTimeString\u003C/p\u003E\r\n    \u003C/section\u003E\r\n  \u003C/header\u003E\r\n  \u003Csection class=\u0022progress-end-game\u0022\u003E\r\n    \u003Cdiv class=\u0022progress-bar\u0022\u003E\r\n      \u003Cdiv class=\u0022bar\u0022 style=\u0022width: @(GetPercentage())%;\u0022 /\u003E\r\n      \u003Cp\u003E@Formatter.ToDisplay(InvestmentManagerInstance.Total) / @Formatter.ToDisplay(IdleManagerInstance.Goal)\u003C/p\u003E\r\n    \u003C/div\u003E\r\n  \u003C/section\u003E\r\n  \u003Cbutton class=\u0022slot\u0022 style=\u0022pointer-events: @(!isPanelOpened ? \u0022all\u0022 : \u0022none\u0022);\u0022 onclick=@TogglePanel\u003E\r\n    \u003Cp class=\u0022kbd\u0022\u003EE\u003C/p\u003E\r\n    \u003Cp class=\u0022title\u0022\u003E\r\n      @TranslationsInstance.T(\u0022milaine.tree-skills\u0022)\r\n      @* #milaine.tree-skills *@\r\n    \u003C/p\u003E\r\n  \u003C/button\u003E\r\n  \u003Cdiv class=\u0022container\u0022\u003E\r\n    \u003Csection class=\u0022content\u0022\u003E\r\n      \u003CImage src=\u0022resources/wallet-minimal.png\u0022 class=\u0022image\u0022 style=\u0022width: 40px; height: 40px;\u0022 /\u003E\r\n      \u003Cp class=\u0022headline\u0022\u003E$@Formatter.ToDisplayShort(Dollars)\u003C/p\u003E\r\n      \u003CFloatingTextManager /\u003E\r\n    \u003C/section\u003E\r\n  \u003C/div\u003E\r\n  @if (isInitializedDay) {\r\n    \u003Cdiv class=\u0022day-container\u0022\u003E\r\n      \u003Ch2 class=\u0022heading-current-day\u0022\u003E\r\n        @* @Language.GetPhrase(\u0022milaine.days\u0022, data) *@\r\n        @TranslationsInstance.T(\u0022milaine.days\u0022, data)\r\n      \u003C/h2\u003E\r\n    \u003C/div\u003E\r\n  }\r\n  @if (isGameWin) {\r\n    \u003Cdiv\r\n      style=\u0022background-color: black; position: absolute; top: 0; left: 0; right: 0; bottom: 0; justify-content: center; align-items: center;\u0022\u003E\r\n      \u003Cdiv style=\u0022width: 30%;justify-content:center;align-items:center;\u0022\u003E\r\n        \u003Cp style=\u0022font-size: 40px; font-family: \u0027JetBrains Mono\u0027;\u0022\u003E\r\n          @* #milaine.wingame *@\r\n          @TranslationsInstance.T(\u0022milaine.wingame\u0022)\r\n        \u003C/p\u003E\r\n      \u003C/div\u003E\r\n    \u003C/div\u003E\r\n  }\r\n\r\n  @if (isDayEnd \u0026\u0026 !isGameWin) {\r\n    \u003Cdiv class=\u0022day-container night\u0022\u003E\r\n      \u003Cdiv class=\u0022summary-container\u0022\u003E\r\n        \u003Cheader class=\u0022summary-header\u0022\u003E\r\n          \u003Cdiv class=\u0022summary-title\u0022\u003E\r\n            \u003Cspan class=\u0022circle\u0022 /\u003E\r\n            \u003Ch2 class=\u0022normal-font\u0022\u003E\r\n              @* #milaine.summary.title *@\r\n              @TranslationsInstance.T(\u0022milaine.summary.title\u0022)\r\n            \u003C/h2\u003E\r\n          \u003C/div\u003E\r\n          \u003Cdiv class=\u0022separator\u0022 /\u003E\r\n        \u003C/header\u003E\r\n        \u003Cdiv class=\u0022row\u0022\u003E\r\n          \u003Cdiv class=\u0022form-control nth mblue\u0022\u003E\r\n            \u003Cdiv class=\u0022form-control-header\u0022\u003E\r\n              \u003Ch3 class=\u0022normal-font\u0022\u003E\r\n                @* #milaine.summary.investment *@\r\n                @TranslationsInstance.T(\u0022milaine.summary.investment\u0022)\r\n              \u003C/h3\u003E\r\n              \u003Cspan class=\u0022circle-base circle-blue\u0022 /\u003E\r\n            \u003C/div\u003E\r\n            \u003Cp class=\u0022number\u0022\u003E\r\n              $@Formatter.ToDisplayShort(InvestmentManagerInstance.Profit)\r\n            \u003C/p\u003E\r\n          \u003C/div\u003E\r\n          \u003Cdiv class=\u0022form-control nth mgreen\u0022\u003E\r\n            \u003Cdiv class=\u0022form-control-header\u0022\u003E\r\n              \u003Ch3 class=\u0022normal-font\u0022\u003E\r\n                @* #milaine.summary.wallet *@\r\n                @TranslationsInstance.T(\u0022milaine.summary.wallet\u0022)\r\n              \u003C/h3\u003E\r\n              \u003Cspan class=\u0022circle-base circle-green\u0022 /\u003E\r\n            \u003C/div\u003E\r\n            \u003Cp class=\u0022number\u0022\u003E\r\n              $@Formatter.ToDisplayShort(InvestmentManagerInstance.WalletPasive)\r\n            \u003C/p\u003E\r\n          \u003C/div\u003E\r\n          \u003Cdiv class=\u0022form-control nth mred\u0022\u003E\r\n            \u003Cdiv class=\u0022form-control-header\u0022\u003E\r\n              \u003Ch3 class=\u0022normal-font\u0022\u003E\r\n                @* #milaine.summary.dollar-spent *@\r\n                @TranslationsInstance.T(\u0022milaine.summary.dollar-spent\u0022)\r\n              \u003C/h3\u003E\r\n              \u003Cspan class=\u0022circle-base circle-red\u0022 /\u003E\r\n            \u003C/div\u003E\r\n            \u003Cp class=\u0022number\u0022\u003E\r\n              $@Formatter.ToDisplayShort(IdleManagerInstance.DollarsSpent)\r\n            \u003C/p\u003E\r\n          \u003C/div\u003E\r\n        \u003C/div\u003E\r\n        \u003Cdiv class=\u0022separator\u0022 /\u003E\r\n\r\n        @if (DayNightManagerInstance.Day == DayNightManager.MAX_DAYS) {\r\n          \u003Cbutton class=\u0022btn-next-action normal-font\u0022 onclick=@HandleAgain\u003E\r\n            @* #milaine.back-to-past *@\r\n            @TranslationsInstance.T(\u0022milaine.back-to-past\u0022)\r\n          \u003C/button\u003E\r\n        } else {\r\n          \u003Cbutton class=\u0022btn-next-action normal-font\u0022 onclick=@HandleNextDay\u003E\r\n            @* #milaine.next-day *@\r\n            @TranslationsInstance.T(\u0022milaine.next-day\u0022)\r\n          \u003C/button\u003E\r\n        }\r\n      \u003C/div\u003E\r\n    \u003C/div\u003E\r\n  }\r\n  \u003Cdiv class=\u0022version-manager\u0022\u003E\r\n    \u003Cp\u003E@(\u0022v\u0022 \u002B VersionManagerInstance.Version.ToString())\u003C/p\u003E\r\n  \u003C/div\u003E\r\n\u003C/root\u003E\r\n\r\n@code\r\n{\r\n  private const float ANIMATION_DURATION = 5f;\r\n\r\n  [Property, Title(\u0022Translations\u0022)]\r\n  [Feature(\u0022Managers\u0022)]\r\n  public Translations TranslationsInstance { get; set; }\r\n\r\n  [Property, Title(\u0022VersionManager\u0022)]\r\n  [Feature(\u0022Managers\u0022)]\r\n  public VersionManager VersionManagerInstance { get; set; }\r\n\r\n  [Property, Title(\u0022IdleManager\u0022)]\r\n  [Feature(\u0022Managers\u0022)]\r\n  public IdleManager IdleManagerInstance { get; set; }\r\n\r\n  [Property, Title(\u0022InvestmentManager\u0022)]\r\n  [Feature(\u0022Managers\u0022)]\r\n  public InvestmentManager InvestmentManagerInstance { get; set; }\r\n\r\n  [Property, Title(\u0022DayNightManager\u0022)]\r\n  [Feature(\u0022Managers\u0022)]\r\n  public DayNightManager DayNightManagerInstance { get; set; }\r\n\r\n  [Property, Title(\u0022GameManager\u0022)]\r\n  [Feature(\u0022Managers\u0022)]\r\n  public GameManager GameManagerInstance { get; set; }\r\n\r\n  [Property, Title(\u0022TreeSkillPanel\u0022)]\r\n  [Feature(\u0022General\u0022)]\r\n  public TreeSkillPanel TreeSkillPanelInstance { get; set; }\r\n\r\n  [Property]\r\n  [Feature(\u0022General\u0022)]\r\n  public int Dollars { get; set; } = 0;\r\n\r\n  private bool isPanelOpened = false;\r\n\r\n  private Dictionary\u003Cstring, object\u003E data = [];\r\n\r\n  private bool isInitializedDay = false;\r\n  private bool isDayEnd = false;\r\n\r\n  private bool isGameWin = false;\r\n\r\n  protected override int BuildHash() =\u003E System.HashCode.Combine(Dollars,\r\nDayNightManagerInstance.CurrentTimeString, DayNightManagerInstance.Day, InvestmentManagerInstance.Total\r\n, IdleManagerInstance.DollarsSpent, InvestmentManagerInstance.WalletPasive, InvestmentManagerInstance.Profit);\r\n\r\n  protected override void OnAwake() {\r\n    base.OnStart();\r\n\r\n    data[\u0022Day\u0022] = DayNightManagerInstance.Day;\r\n    IdleManagerInstance.OnDeposit \u002B= RefreshDeposit;\r\n    IdleManagerInstance.OnChange \u002B= Refresh;\r\n    DayNightManagerInstance.OnStartDay \u002B= StartDay;\r\n    DayNightManagerInstance.OnEndDay \u002B= EndDay;\r\n    GameManagerInstance.OnWinGame \u002B= OnWinGame;\r\n  }\r\n\r\n  protected override void OnUpdate() {\r\n    if (Input.Pressed(\u0022use\u0022)) {\r\n      TogglePanel();\r\n      return;\r\n    }\r\n\r\n    if (Input.EscapePressed) {\r\n      isPanelOpened = false;\r\n      StateHasChanged();\r\n      TreeSkillPanelInstance.Close();\r\n    }\r\n  }\r\n\r\n  protected override void OnDestroy() {\r\n    base.OnDestroy();\r\n\r\n    IdleManagerInstance.OnDeposit -= RefreshDeposit;\r\n    IdleManagerInstance.OnChange -= Refresh;\r\n    DayNightManagerInstance.OnStartDay -= StartDay;\r\n    DayNightManagerInstance.OnEndDay -= EndDay;\r\n    GameManagerInstance.OnWinGame -= OnWinGame;\r\n\r\n  }\r\n\r\n  private void OnWinGame() {\r\n    isGameWin = GameManagerInstance.IsGameWin;\r\n  }\r\n\r\n  private void TogglePanel() {\r\n    isPanelOpened = !isPanelOpened;\r\n    StateHasChanged();\r\n\r\n    Panel.Blur();\r\n\r\n    if (isPanelOpened) {\r\n      TreeSkillPanelInstance.Open();\r\n      return;\r\n    }\r\n\r\n    TreeSkillPanelInstance.Close();\r\n  }\r\n\r\n  private string GetPercentage() {\r\n    float Total = InvestmentManagerInstance.Total;\r\n    float percentage = (Total / IdleManagerInstance.Goal) * 100;\r\n\r\n    return Pixel.Inv(percentage);\r\n  }\r\n\r\n  private void StartDay() {\r\n    isInitializedDay = true;\r\n    StateHasChanged();\r\n\r\n    _ = HideAafterDelay();\r\n  }\r\n\r\n  private void EndDay() {\r\n    isDayEnd = true;\r\n    StateHasChanged();\r\n  }\r\n\r\n  private void HandleNextDay() {\r\n    isDayEnd = false;\r\n    DayNightManagerInstance.NextDay();\r\n    data[\u0022Day\u0022] = DayNightManagerInstance.Day;\r\n    StateHasChanged();\r\n    StartDay();\r\n  }\r\n\r\n  private async Task HideAafterDelay() {\r\n    await Task.DelaySeconds(ANIMATION_DURATION);\r\n    isInitializedDay = false;\r\n    StateHasChanged();\r\n  }\r\n\r\n  private void Refresh(int dollars, int amount) {\r\n    Dollars = dollars;\r\n    FloatingTextManager.Instance.Spawn($\u0022\u002B{amount}\u0022, 25f, 10f);\r\n  }\r\n\r\n  private void RefreshDeposit() {\r\n    Dollars = 0;\r\n  }\r\n\r\n  private void HandleAgain() {\r\n    GameManagerInstance.Restart();\r\n  }\r\n}\r\n"},{"Ident":"rakunsoftware.milaine","Path":"UI/PauseGamePanel/PauseGamePanel.razor","FileName":"PauseGamePanel.razor","PackageType":"game","CodeKind":"Game","AssetVersionId":394495,"IsPrivate":false,"Code":"@using Milaine.Managers;\r\n@using Milaine.Settings;\r\n@using Sandbox;\r\n@using Sandbox.UI;\r\n@inherits PanelComponent\r\n@namespace Sandbox\r\n\r\n\u003Croot\u003E\r\n  @if (PauseGameInstance.IsOpened) {\r\n    \u003Cdiv class=\u0022pause-container\u0022\u003E\r\n      \u003Cheader class=\u0022header\u0022\u003E\r\n        \u003CDropDown Options=@ModeOptions Value=@SelectedMode ValueChanged=@OnOptionChanged /\u003E\r\n      \u003C/header\u003E\r\n      \u003Cmain\u003E\r\n        \u003Cdiv class=\u0022container\u0022\u003E\r\n          \u003Cbutton onclick=@PauseGameInstance.OnBack\u003E\r\n            @TranslationsInstance.T(\u0022milaine.back\u0022)\r\n          \u003C/button\u003E\r\n          \u003Cbutton onclick=@ExitGame\u003E\r\n            @TranslationsInstance.T(\u0022milaine.quit\u0022)\r\n          \u003C/button\u003E\r\n        \u003C/div\u003E\r\n\r\n        \u003Cdiv class=\u0022credits\u0022\u003E\r\n          \u003Cp\u003ECredits\u003C/p\u003E\r\n          \u003Cp\u003E\r\n            Computer Keyboard by Luke (https://sbox.game/luke/office_keyboard)\r\n          \u003C/p\u003E\r\n          \u003Cp\u003E\r\n            Computer Monitor by Luke (https://sbox.game/luke/monitor_basic)\r\n          \u003C/p\u003E\r\n          \u003Cp\u003E\r\n            Computer Mouse by Luke (https://sbox.game/luke/computer_mouse)\r\n          \u003C/p\u003E\r\n          \u003Cp\u003E\r\n            Coffee_cup_01 by Small Box Studio (https://sbox.game/smallboxstudio/coffeecup01)\r\n          \u003C/p\u003E\r\n          \u003Cp\u003E\r\n            French_fries_02 by Small Box Studio (https://sbox.game/smallboxstudio/frenchfries02)\r\n          \u003C/p\u003E\r\n          \u003Cp\u003E\r\n            French_fries_02_empty by Small Box Studio (https://sbox.game/smallboxstudio/frenchfries02empty)\r\n          \u003C/p\u003E\r\n          \u003Cp\u003E\r\n            Stir_fried_noodles_01 by Small Box Studio (https://sbox.game/smallboxstudio/stirfriednoodles01)\r\n          \u003C/p\u003E\r\n          \u003Cp\u003E\r\n            Stir_fried_noodles_01_close by Small Box Studio (https://sbox.game/smallboxstudio/stirfriednoodles01close)\r\n          \u003C/p\u003E\r\n        \u003C/div\u003E\u003E\r\n      \u003C/main\u003E\r\n    \u003C/div\u003E\r\n    \u003Cdiv class=\u0022version-manager\u0022\u003E\r\n      \u003Cp\u003E@(\u0022v\u0022 \u002B VersionManagerInstance.Version.ToString())\u003C/p\u003E\r\n    \u003C/div\u003E\r\n  }\r\n\r\n\u003C/root\u003E\r\n\r\n@code\r\n{\r\n  [Property, Title(\u0022Translations\u0022)]\r\n  [Feature(\u0022Managers\u0022)]\r\n  public Translations TranslationsInstance { get; set; }\r\n\r\n  [Property, Title(\u0022VersionManager\u0022)]\r\n  [Feature(\u0022Managers\u0022)]\r\n  public VersionManager VersionManagerInstance { get; set; }\r\n\r\n  [Property]\r\n  [Feature(\u0022Settings\u0022)]\r\n  public PauseGame PauseGameInstance { get; set; }\r\n\r\n  public string SelectedMode { get; set; } = \u0022en\u0022;\r\n\r\n  public List\u003CUI.Option\u003E ModeOptions { get; set; } = [\r\n    new Option{Title = \u0022English\u0022, Value = \u0022en\u0022},\r\n    new Option{Title = \u0022Espa\u00F1ol\u0022, Value = \u0022es\u0022},\r\n  ];\r\n\r\n  protected override int BuildHash() =\u003E System.HashCode.Combine(PauseGameInstance.IsOpened, SelectedMode);\r\n\r\n  protected override void OnStart() {\r\n    base.OnStart();\r\n    SelectedMode = TranslationsInstance.language;\r\n  }\r\n\r\n  private void ExitGame() {\r\n    if (Application.IsStandalone) {\r\n      Game.Close();\r\n      return;\r\n    }\r\n\r\n    Game.Disconnect();\r\n  }\r\n\r\n  private void OnOptionChanged(object code) {\r\n    SelectedMode = (string)code;\r\n    TranslationsInstance.SetLanguage((string)code);\r\n    StateHasChanged();\r\n  }\r\n}\r\n"},{"Ident":"rakunsoftware.milaine","Path":"Scripts/Managers/DialoguesManager.cs","FileName":"DialoguesManager.cs","PackageType":"game","CodeKind":"Game","AssetVersionId":394495,"IsPrivate":false,"Code":"namespace Milaine.Managers;\r\n\r\n\r\npublic sealed class DialoguesManager : Component {\r\n  [Property, Title(\u0022Dialogues View\u0022)]\r\n  public PanelComponent DialoguesView { get; set; }\r\n\r\n  private List\u003CStep\u003E steps = [];\r\n\r\n  private class Step { }\r\n\r\n  protected override void OnStart() {\r\n    if (!DialoguesView.IsValid()) {\r\n      Log.Warning(\u0022Need Instances of [DialoguesView]\u0022);\r\n    }\r\n  }\r\n}\r\n"},{"Ident":"rakunsoftware.milaine","Path":"Scripts/TreeSkills/SkillNodeData.cs","FileName":"SkillNodeData.cs","PackageType":"game","CodeKind":"Game","AssetVersionId":394495,"IsPrivate":false,"Code":"namespace Milaine.TreeSkills;\r\n\r\npublic enum SkillCategory {\r\n  Dollars,\r\n  Wallet,\r\n  Investment,\r\n  Dividends,\r\n  WalletPlus,\r\n  DollarAutomatic\r\n}\r\n\r\npublic class SkillNodeData {\r\n  public string Id { get; set; }\r\n  public string Name { get; set; }\r\n  public string Description { get; set; }\r\n  public string KeyDescription { get; set; }\r\n  public int Cost { get; set; }\r\n  public SkillCategory Category { get; set; }\r\n  public float Point { get; set; }\r\n\r\n  public int Row { get; set; }\r\n  public int Column { get; set; }\r\n\r\n  public string Icon { get; set; } = \u0022\uD83C\uDF15\u0022;\r\n\r\n  public bool IsRoot { get; set; }\r\n}\r\n"},{"Ident":"rakunsoftware.milaine","Path":"Scripts/Constants/VersionConstants.cs","FileName":"VersionConstants.cs","PackageType":"game","CodeKind":"Game","AssetVersionId":394495,"IsPrivate":false,"Code":"namespace Milaine.Constants;\r\n\r\npublic class VersionConstants {\r\n  public const int MAYOR = 0;\r\n  public const int MINOR = 9;\r\n  public const int PATCH = 1;\r\n}\r\n"},{"Ident":"rakunsoftware.milaine","Path":"Scripts/Managers/InvestmentManager.cs","FileName":"InvestmentManager.cs","PackageType":"game","CodeKind":"Game","AssetVersionId":394495,"IsPrivate":false,"Code":"using System;\r\nusing Milaine.Interfaces;\r\n\r\nnamespace Milaine.Managers;\r\n\r\npublic struct Portfolio(int wallet = 0, float investment = 0, float profit = 0, int shares = 0) {\r\n  public int wallet = wallet;\r\n  public float investment = investment;\r\n  public float profit = profit;\r\n  public int shares = shares;\r\n}\r\n\r\npublic sealed class InvestmentManager : Component, IManager {\r\n  public const float DEFAULT_PERFORMANCE = 1.0f;\r\n\r\n  [Property, Title(\u0022DayNightManager\u0022)]\r\n  [Feature(\u0022Managers\u0022)]\r\n  public DayNightManager DayNightManagerInstance { get; set; }\r\n\r\n  [Property]\r\n  [Feature(\u0022General\u0022)]\r\n  public bool IsDayEnded { get; set; } = false;\r\n\r\n  [Property]\r\n  [Feature(\u0022General\u0022), Group(\u0022Digital\u0022)]\r\n  public int Wallet { get; set; } = 0;\r\n\r\n  [Property]\r\n  [Feature(\u0022General\u0022), Group(\u0022Digital\u0022)]\r\n  public float Investment { get; set; } = 0;\r\n\r\n  [Property]\r\n  [Feature(\u0022General\u0022), Group(\u0022Digital\u0022)]\r\n  public float Profit { get; set; } = 0;\r\n\r\n  [Property]\r\n  [Feature(\u0022General\u0022), Group(\u0022Digital\u0022)]\r\n  public int Shares { get; set; } = 0;\r\n\r\n  public Action\u003CPortfolio\u003E OnChange { get; set; }\r\n\r\n  private float performance = DEFAULT_PERFORMANCE;\r\n  private float acc = 0f;\r\n  private float multiplierDeposit = 1.0f;\r\n  private bool isAvailablePerformanceWallet = false;\r\n  private int performanceWallet = (int)DEFAULT_PERFORMANCE;\r\n\r\n  private float accDividends = 0f;\r\n  private bool isActivatedDividends = false;\r\n  private float multiplierDividends = 0.0f;\r\n\r\n  private int walletPasive = 0;\r\n\r\n  public float Total {\r\n    get =\u003E Wallet \u002B Investment;\r\n  }\r\n\r\n\r\n  public int WalletPasive {\r\n    get =\u003E walletPasive;\r\n  }\r\n\r\n  protected override void OnStart() {\r\n    DayNightManagerInstance.OnStartDay \u002B= DayStartSubscription;\r\n    DayNightManagerInstance.OnEndDay \u002B= DayNightSubscription;\r\n  }\r\n\r\n  protected override void OnDestroy() {\r\n    DayNightManagerInstance.OnStartDay -= DayStartSubscription;\r\n    DayNightManagerInstance.OnEndDay -= DayNightSubscription;\r\n  }\r\n\r\n  protected override void OnUpdate() {\r\n    if (IsDayEnded) {\r\n      return;\r\n    }\r\n\r\n    acc \u002B= Time.Delta;\r\n\r\n    if (acc \u003E= 1.0f) {\r\n      if (Investment != 0f) {\r\n        Profit \u002B= performance;\r\n        Investment \u002B= performance;\r\n      }\r\n\r\n      if (isAvailablePerformanceWallet) {\r\n        Wallet \u002B= performanceWallet;\r\n        walletPasive \u002B= performanceWallet;\r\n      }\r\n\r\n\r\n      acc = 0;\r\n    }\r\n\r\n    accDividends \u002B= Time.Delta;\r\n\r\n    if (accDividends \u003E= 5.0f \u0026\u0026 isActivatedDividends) {\r\n      Wallet \u002B= (Investment * multiplierDividends).CeilToInt();\r\n      accDividends = 0;\r\n    }\r\n  }\r\n\r\n  public void Deposit(int dollars) {\r\n    Wallet \u002B= (multiplierDeposit * dollars).CeilToInt();\r\n    OnChange?.Invoke(new Portfolio { wallet = Wallet, investment = Investment, profit = Profit, shares = Shares });\r\n  }\r\n\r\n  public void Invest() {\r\n    Investment \u002B= Wallet;\r\n    Wallet = 0;\r\n    OnChange?.Invoke(new Portfolio { wallet = Wallet, investment = Investment, profit = Profit, shares = Shares });\r\n  }\r\n\r\n  private void DayNightSubscription() {\r\n    IsDayEnded = true;\r\n  }\r\n\r\n  private void DayStartSubscription() {\r\n    IsDayEnded = false;\r\n    Profit = 0;\r\n    walletPasive = 0;\r\n  }\r\n\r\n  public void ImprovePerformance(float amount) {\r\n    performance \u002B= amount;\r\n  }\r\n\r\n  public void ImproveWallet(float amount) {\r\n    ImproveWallet((int)amount);\r\n  }\r\n\r\n  private void ImproveWallet(int amount) {\r\n    if (!isAvailablePerformanceWallet) {\r\n      isAvailablePerformanceWallet = true;\r\n    }\r\n\r\n    performanceWallet = amount;\r\n  }\r\n\r\n  public void ImproveDeposit(float amount) {\r\n    multiplierDeposit = amount;\r\n  }\r\n\r\n  public void ImproveDividends(float amount) {\r\n    if (!isActivatedDividends) {\r\n      isActivatedDividends = true;\r\n    }\r\n\r\n    multiplierDividends = amount;\r\n  }\r\n\r\n  public void Restart() {\r\n    // reset all stats (wallet, profit, investment, days)\r\n    performance = DEFAULT_PERFORMANCE;\r\n    multiplierDeposit = 1.0f;\r\n    isActivatedDividends = false;\r\n    multiplierDividends = 0.0f;\r\n    isAvailablePerformanceWallet = false;\r\n    performanceWallet = (int)DEFAULT_PERFORMANCE;\r\n    walletPasive = 0;\r\n    Wallet = 0;\r\n    Investment = 0f;\r\n    Profit = 0;\r\n    Shares = 0;\r\n  }\r\n}\r\n"},{"Ident":"rakunsoftware.milaine","Path":"Scripts/Settings/Translation.cs","FileName":"Translation.cs","PackageType":"game","CodeKind":"Game","AssetVersionId":394495,"IsPrivate":false,"Code":"using Milaine.Utils;\r\n\r\nnamespace Milaine.Settings;\r\n\r\npublic sealed class Translations : Component {\r\n  [Property, Title(\u0022Configuration\u0022)]\r\n  public Configuration ConfigurationInstance { get; set; }\r\n\r\n  private Localization localization;\r\n\r\n  public string language = \u0022en\u0022;\r\n\r\n  protected override void OnAwake() {\r\n    localization = new();\r\n    language = ConfigurationInstance.Language;\r\n    localization.SetLanguage(ConfigurationInstance.Language);\r\n  }\r\n\r\n  public void SetLanguage(string language) {\r\n    localization.SetLanguage(language);\r\n\r\n    this.language = language;\r\n\r\n    ConfigurationInstance.Language = language;\r\n    ConfigurationInstance.SaveConfig();\r\n  }\r\n\r\n  public string T(string token, Dictionary\u003Cstring, object\u003E data = null) =\u003E localization.T(token, data);\r\n}\r\n"},{"Ident":"rakunsoftware.milaine","Path":"UI/InvestmentPanel/InvestmentPanel.razor","FileName":"InvestmentPanel.razor","PackageType":"game","CodeKind":"Game","AssetVersionId":394495,"IsPrivate":false,"Code":"@using System.Text;\r\n@using Milaine.Managers;\r\n@using Milaine.Settings;\r\n@using Milaine.Utils;\r\n@using Sandbox;\r\n@using Sandbox.UI;\r\n@inherits PanelComponent\r\n@namespace Sandbox\r\n\r\n\u003Croot\u003E\r\n  \u003Cheader\u003E\r\n    \u003Cdiv class=\u0022container-title\u0022\u003E\r\n      \u003CImage src=\u0022resources/hexagon.png\u0022 class=\u0022image\u0022 style=\u0022width: 20px; height: 20px;\u0022 /\u003E\r\n      \u003Ch1 class=\u0022title\u0022\u003ESHARES // WORKS\u003C/h1\u003E\r\n    \u003C/div\u003E\r\n    \u003Cdiv class=\u0022content\u0022 style=\u0022pointer-events: @(MouseManager.State == StateMouse.Busy ? \u0022none\u0022 : \u0022all\u0022);\u0022\u003E\r\n      \u003CImage src=\u0022resources/wallet-minimal.png\u0022 class=\u0022image\u0022 style=\u0022width: 20px; height: 20px;\u0022 /\u003E\r\n      \u003Cp class=\u0022text\u0022\u003E$@Formatter.ToDisplayShort(InvestmentManagerInstance.Wallet)\u003C/p\u003E\r\n    \u003C/div\u003E\r\n  \u003C/header\u003E\r\n  \u003Cdiv class=\u0022container\u0022\u003E\r\n    \u003Csection class=\u0022card\u0022 style=\u0022pointer-events: @(MouseManager.State == StateMouse.Busy ? \u0022none\u0022 : \u0022all\u0022);\u0022\u003E\r\n      \u003Cdiv class=\u0022card-header\u0022\u003E\r\n        \u003Cdiv class=\u0022card-header-wrapper\u0022\u003E\r\n          @if (InvestmentManagerInstance.Profit == 0) {\r\n            \u003CImage src=\u0022resources/dot.png\u0022 /\u003E\r\n          }\r\n          @if (InvestmentManagerInstance.Profit \u003E 0) {\r\n            \u003CImage src=\u0022resources/trending-up.png\u0022 /\u003E\r\n          }\r\n          @if (InvestmentManagerInstance.Profit \u003C 0) {\r\n            \u003CImage src=\u0022resources/trending-down.png\u0022 /\u003E\r\n          }\r\n          \u003Cp class=\u0022card-title\u0022\u003E\r\n            @* #milaine.profit.total *@\r\n            @TranslationsInstance.T(\u0022milaine.profit.total\u0022)\r\n          \u003C/p\u003E\r\n        \u003C/div\u003E\r\n        \u003Cdiv class=@ClassName()\u003E\r\n          @if (InvestmentManagerInstance.Profit == 0) {\r\n            \u003Cp\u003E\r\n              @* #milaine.critical.standard-profit *@\r\n              @TranslationsInstance.T(\u0022milaine.critical.standard-profit\u0022)\r\n            \u003C/p\u003E\r\n          }\r\n          @if (InvestmentManagerInstance.Profit \u003C 0) {\r\n            \u003Cp\u003E\r\n              @* #milaine.critical.bad-profit *@\r\n              @TranslationsInstance.T(\u0022milaine.critical.bad-profit\u0022)\r\n            \u003C/p\u003E\r\n          }\r\n          @if (InvestmentManagerInstance.Profit \u003E 0) {\r\n            \u003Cp\u003E\r\n              @* #milaine.critical.profit *@\r\n              @TranslationsInstance.T(\u0022milaine.critical.profit\u0022)\r\n            \u003C/p\u003E\r\n          }\r\n        \u003C/div\u003E\r\n      \u003C/div\u003E\r\n      \u003Cdiv class=\u0022card-body\u0022\u003E\r\n        \u003Cdiv class=\u0022investment-container\u0022\u003E\r\n          \u003Cdiv class=\u0022investment-content\u0022\u003E\r\n            \u003Cp\r\n              class=\u0022investment-text @(InvestmentManagerInstance.Profit == 0 ? \u0022normal\u0022 : InvestmentManagerInstance.Profit \u003C 0 ? \u0022bad\u0022 : \u0022good\u0022)\u0022\u003E\r\n              @BuildInvestment(InvestmentManagerInstance.Investment)\r\n            \u003C/p\u003E\r\n\r\n            @if (InvestmentManagerInstance.Profit \u003E 0) {\r\n              \u003Cp class=\u0022shares\u0022\u003E\u002B@InvestmentManagerInstance.Profit\u003C/p\u003E\r\n            }\r\n          \u003C/div\u003E\r\n          \u003Cdiv class=\u0022action\u0022\u003E\r\n            \u003Cbutton class=\u0022btn btn-primary\u0022 onclick=@HandleClickInvestment\u003E\r\n              @* #milaine.invest *@\r\n              @TranslationsInstance.T(\u0022milaine.invest\u0022)\r\n            \u003C/button\u003E\r\n            \u003Cbutton class=\u0022btn btn-secondary\u0022 onclick=@HandleClickDeposit\u003E\r\n              @* #milaine.deposit *@\r\n              @TranslationsInstance.T(\u0022milaine.deposit\u0022)\r\n            \u003C/button\u003E\r\n          \u003C/div\u003E\r\n        \u003C/div\u003E\r\n      \u003C/div\u003E\r\n    \u003C/section\u003E\r\n  \u003C/div\u003E\r\n\u003C/root\u003E\r\n\r\n@code\r\n{\r\n  [Property, Title(\u0022InvestmentManager\u0022)]\r\n  [Feature(\u0022Managers\u0022)]\r\n  public InvestmentManager InvestmentManagerInstance { get; set; }\r\n\r\n  [Property, Title(\u0022IdleManager\u0022)]\r\n  [Feature(\u0022Managers\u0022)]\r\n  public IdleManager IdleManagerInstance { get; set; }\r\n\r\n  [Property, Title(\u0022Translations\u0022)]\r\n  [Feature(\u0022Managers\u0022)]\r\n  public Translations TranslationsInstance { get; set; }\r\n\r\n  public Dictionary\u003Cstring, object\u003E Data = [];\r\n\r\n  protected override int BuildHash() =\u003E System.HashCode.Combine(Data, InvestmentManagerInstance.Wallet,\r\nInvestmentManagerInstance.Profit, TranslationsInstance.language, MouseManager.State);\r\n\r\n  protected override void OnStart() {\r\n    if (!InvestmentManagerInstance.IsValid()) {\r\n      Log.Warning(\u0022Need Instance the InvestmentManager into [InvestmentView]\u0022);\r\n      return;\r\n    }\r\n\r\n    Refresh();\r\n  }\r\n\r\n  protected override void OnUpdate() {\r\n    base.OnUpdate();\r\n\r\n    if (Input.EscapePressed) {\r\n      StateHasChanged();\r\n    }\r\n  }\r\n\r\n  public string ClassName() =\u003E InvestmentManagerInstance.Profit == 0 ? \u0022tag standard\u0022 : InvestmentManagerInstance.Profit\r\n\u003C 0 ? \u0022tag low\u0022 : \u0022tag\u0022;\r\n\r\n  private void HandleClickInvestment() {\r\n    InvestmentManagerInstance.Invest();\r\n    Refresh();\r\n  }\r\n\r\n  private void HandleClickDeposit() {\r\n    InvestmentManagerInstance.Deposit(IdleManagerInstance.Dollars);\r\n    IdleManagerInstance.Deposit();\r\n    Refresh();\r\n  }\r\n\r\n  private string BuildInvestment(float investment) {\r\n    StringBuilder sb = new();\r\n    float profit = InvestmentManagerInstance.Profit;\r\n\r\n    if (profit \u003C 0) {\r\n      sb.Append(\u0022- $\u0022);\r\n    }\r\n\r\n    if (profit \u003E 0) {\r\n      sb.Append(\u0022\u002B $\u0022);\r\n    }\r\n\r\n    sb.Append(Formatter.ToDisplay(investment));\r\n\r\n    return sb.ToString();\r\n  }\r\n\r\n  private void Refresh() {\r\n    Data[\u0022WalletValue\u0022] = Formatter.ToDisplayShort(InvestmentManagerInstance.Wallet);\r\n    Data[\u0022InvestmentValue\u0022] = Formatter.ToDisplay(InvestmentManagerInstance.Investment);\r\n    Data[\u0022ProfitValue\u0022] = Formatter.ToDisplay(InvestmentManagerInstance.Profit);\r\n    Data[\u0022SharesValue\u0022] = InvestmentManagerInstance.Shares;\r\n  }\r\n}\r\n"},{"Ident":"rakunsoftware.milaine","Path":"ui/hud/hud.razor.scss","FileName":"hud.razor.scss","PackageType":"game","CodeKind":"Game","AssetVersionId":394495,"IsPrivate":false,"Code":"Hud {\r\n  position: absolute;\r\n  top: 0;\r\n  left: 0;\r\n  right: 0;\r\n  bottom: 0;\r\n  flex-direction: column;\r\n  font-weight: bold;\r\n  border-radius: 20px;\r\n  color: #fff;\r\n  font-size: 25px;\r\n\r\n  .header {\r\n    display: flex;\r\n    justify-content: flex-end;\r\n    align-items: center;\r\n    gap: 50px;\r\n    padding: 20px;\r\n\r\n    .day-manager h2 {\r\n      text-align: center;\r\n      font-size: 30px;\r\n      font-family: \u0022Space Grotesk\u0022;\r\n    }\r\n\r\n    .clock {\r\n      background-color: rgba(0, 0, 0, 0.5);\r\n      color: #fff;\r\n      display: flex;\r\n      justify-content: center;\r\n      align-items: center;\r\n\r\n      p {\r\n        text-align: center;\r\n        font-size: 28px;\r\n        font-family: \u0022JetBrains Mono\u0022;\r\n      }\r\n    }\r\n  }\r\n\r\n  .container {\r\n    position: absolute;\r\n    bottom: 50px;\r\n    right: 50px;\r\n    font-family: \u0022JetBrains Mono\u0022;\r\n\r\n    .content {\r\n      padding: 10px 20px;\r\n      display: flex;\r\n      background-color: rgba(0, 0, 0, 0.5);\r\n      border: 1px solid rgba(39, 42, 46, 0.8);\r\n      border-radius: 5px;\r\n      justify-content: center;\r\n      align-items: center;\r\n      gap: 10px;\r\n\r\n      .image {\r\n        object-fit: cover;\r\n      }\r\n\r\n      .headline {\r\n        color: #00ff66;\r\n      }\r\n    }\r\n  }\r\n\r\n  .slot {\r\n    position: absolute;\r\n    bottom: 50px;\r\n    right: 300px;\r\n    display: flex;\r\n    justify-content: center;\r\n    align-items: center;\r\n    flex-direction: column;\r\n    gap: 10px;\r\n    border-radius: 5px;\r\n    padding: 10px 15px;\r\n    background-color: rgba(0, 0, 0, 0.5);\r\n    transition: all 300ms ease;\r\n\r\n    \u0026:hover {\r\n      background-color: rgba(0, 0, 0, 0.8);\r\n      transition: all 300ms ease;\r\n      sound-in: ui.button.over;\r\n    }\r\n\r\n    .kbd {\r\n      font-family: \u0022JetBrains Mono\u0022;\r\n      font-size: 30px;\r\n    }\r\n\r\n    .title {\r\n      font-family: \u0022Space Grotesk\u0022;\r\n      font-size: 21px;\r\n    }\r\n  }\r\n\r\n  .progress-end-game {\r\n    position: absolute;\r\n    width: 70%;\r\n    bottom: 50px;\r\n    left: 50px;\r\n\r\n    .progress-bar {\r\n      width: 100%;\r\n      height: 40px;\r\n      padding: 4px;\r\n      border-radius: 6px;\r\n      overflow: hidden;\r\n      background-color: rgba(0, 0, 0, 0.7);\r\n\r\n      .bar {\r\n        height: 100%;\r\n        background-image: linear-gradient(to right, #00e55b, #00ff66, #00e3fd);\r\n        border-radius: 2px;\r\n      }\r\n\r\n      p {\r\n        position: absolute;\r\n        font-family: \u0022JetBrains Mono\u0022;\r\n        top: 50%;\r\n        left: 50%;\r\n        transform: translate(-50%, -50%);\r\n      }\r\n    }\r\n  }\r\n\r\n  .day-container {\r\n    position: fixed;\r\n    top: 0;\r\n    left: 0;\r\n    right: 0;\r\n    bottom: 0;\r\n    width: 100%;\r\n    height: 100%;\r\n    justify-content: center;\r\n    align-items: center;\r\n    background-color: rgb(7, 9, 11);\r\n    opacity: 0;\r\n    pointer-events: none;\r\n\r\n    z-index: 999;\r\n\r\n    animation-name: morning;\r\n    animation-duration: 5s;\r\n    animation-timing-function: ease;\r\n    animation-fill-mode: forwards;\r\n\r\n    .heading-current-day {\r\n      font-size: 40px;\r\n      text-align: center;\r\n      font-weight: 700;\r\n      font-family: \u0022Space Grotesk\u0022;\r\n      letter-spacing: 2px;\r\n    }\r\n\r\n    \u0026.night {\r\n      flex-direction: column;\r\n\r\n      animation-name: night;\r\n      animation-duration: 2s;\r\n\r\n      button {\r\n        pointer-events: all;\r\n      }\r\n    }\r\n\r\n    .summary-container {\r\n      width: 35%;\r\n      padding: 24px;\r\n      border: 1px solid #1e2936;\r\n      flex-direction: column;\r\n      background-color: rgb(18 23 30 / 0.95);\r\n      border-radius: 12px;\r\n      overflow: hidden;\r\n      box-shadow:\r\n        0 0 25px -5px rgba(0, 255, 102, 0.25),\r\n        inset 0 0 15px -3px rgba(0, 255, 102, 0.08);\r\n\r\n      .summary-header {\r\n        margin-bottom: 20px;\r\n        flex-direction: column;\r\n\r\n        .summary-title {\r\n          display: flex;\r\n          align-items: center;\r\n          justify-content: flex-start;\r\n          gap: 10px;\r\n          padding-bottom: 16px;\r\n\r\n          .circle {\r\n            width: 16px;\r\n            height: 16px;\r\n            border-radius: 50%;\r\n            background-color: #00ff66;\r\n          }\r\n\r\n          h2 {\r\n            font-family: \u0022Space Grotesk\u0022;\r\n            font-size: 40px;\r\n          }\r\n        }\r\n      }\r\n\r\n      .row {\r\n        display: flex;\r\n        justify-content: space-between;\r\n        align-items: center;\r\n        margin-bottom: 20px;\r\n        gap: 20px;\r\n      }\r\n\r\n      .form-control {\r\n        padding: 16px;\r\n        background-color: rgb(13 17 22 / 0.9);\r\n        border: 1px solid rgb(30 41 54 / 0.7);\r\n        border-radius: 8px;\r\n        flex-direction: column;\r\n        margin-bottom: 20px;\r\n        gap: 16px;\r\n        pointer-events: all;\r\n\r\n        transition: all 500ms ease;\r\n\r\n        \u0026.nth {\r\n          flex: 1;\r\n\r\n          h3 {\r\n            font-size: 23px;\r\n          }\r\n        }\r\n\r\n        h3 {\r\n          font-size: 30px;\r\n          color: #94a3b8;\r\n        }\r\n\r\n        .form-control-header {\r\n          justify-content: space-between;\r\n          align-items: center;\r\n        }\r\n\r\n        \u0026:hover {\r\n          transition: all 500ms ease;\r\n\r\n          \u0026.mgreen {\r\n            border-color: #00ff66;\r\n          }\r\n\r\n          \u0026.mblue {\r\n            border-color: #00e3fd;\r\n          }\r\n\r\n          \u0026.mred {\r\n            border-color: #ff3366;\r\n          }\r\n        }\r\n      }\r\n    }\r\n\r\n    .separator {\r\n      width: 100%;\r\n      height: 1px;\r\n      background-color: rgb(30 41 54 / 0.8);\r\n    }\r\n\r\n    .normal-font {\r\n      font-family: \u0022Space Grotesk\u0022;\r\n    }\r\n\r\n    .number {\r\n      font-family: \u0022JetBrains Mono\u0022;\r\n    }\r\n\r\n    .btn-next-action {\r\n      flex: 1;\r\n      display: flex;\r\n      flex-direction: row;\r\n      justify-content: center;\r\n      align-items: center;\r\n      padding: 30px;\r\n      background-color: rgb(13 17 22 / 0.9);\r\n      border: 1px solid #1e2936;\r\n      border-radius: 16px;\r\n      margin: 20px 0;\r\n\r\n      pointer-events: all;\r\n    }\r\n\r\n    .circle-base {\r\n      width: 8px;\r\n      height: 8px;\r\n      border-radius: 50%;\r\n    }\r\n\r\n    .circle-green {\r\n      background-color: #00ff66;\r\n    }\r\n\r\n    .circle-blue {\r\n      background-color: #00e3fd;\r\n    }\r\n\r\n    .circle-red {\r\n      background-color: #ff3366;\r\n    }\r\n  }\r\n\r\n  .version-manager {\r\n    position: absolute;\r\n    top: 20px;\r\n    left: 20px;\r\n    background-color: rgba(0, 0, 0, 0.5);\r\n\r\n    p {\r\n      color: white;\r\n      font-family: \u0022JetBrains Mono\u0022;\r\n      font-size: 26px;\r\n    }\r\n  }\r\n}\r\n\r\n@keyframes morning {\r\n  0% {\r\n    opacity: 0;\r\n  }\r\n\r\n  2% {\r\n    opacity: 1;\r\n  }\r\n\r\n  60% {\r\n    opacity: 1;\r\n  }\r\n\r\n  100% {\r\n    opacity: 0;\r\n  }\r\n}\r\n\r\n@keyframes night {\r\n  0% {\r\n    opacity: 0;\r\n  }\r\n\r\n  100% {\r\n    opacity: 1;\r\n  }\r\n}\r\n"},{"Ident":"rakunsoftware.milaine","Path":"Assembly.cs","FileName":"Assembly.cs","PackageType":"game","CodeKind":"Game","AssetVersionId":394495,"IsPrivate":false,"Code":"global using Sandbox;\r\nglobal using System.Collections.Generic;\r\nglobal using System.Linq;\r\n"},{"Ident":"rakunsoftware.milaine","Path":"Scripts/Utils/Pixel.cs","FileName":"Pixel.cs","PackageType":"game","CodeKind":"Game","AssetVersionId":394495,"IsPrivate":false,"Code":"using System.Globalization;\r\n\r\nnamespace Milaine.Utils;\r\n\r\npublic static class Pixel {\r\n  public static string Inv(float numb) =\u003E numb.ToString(CultureInfo.InvariantCulture);\r\n}\r\n"},{"Ident":"rakunsoftware.milaine","Path":"Scripts/Utils/Formatter.cs","FileName":"Formatter.cs","PackageType":"game","CodeKind":"Game","AssetVersionId":394495,"IsPrivate":false,"Code":"using System;\r\nusing System.Globalization;\r\n\r\nnamespace Milaine.Utils;\r\n\r\npublic static class Formatter {\r\n  private static readonly string[] Suffixes = [\u0022\u0022, \u0022k\u0022, \u0022M\u0022, \u0022B\u0022, \u0022T\u0022, \u0022Qa\u0022, \u0022Qi\u0022];\r\n\r\n  /// \u003Csummary\u003E\r\n  /// format float numbers from 1000 to 1.000\r\n  /// \u003C/summary\u003E\r\n  /// \u003Cparam name=\u0022val\u0022\u003E\u003C/param\u003E\r\n  /// \u003Creturns\u003E\u003C/returns\u003E\r\n  public static string ToDisplay(float val) {\r\n    string native = val.ToString(\u0022#,##0\u0022, CultureInfo.InvariantCulture);\r\n    string display = native.Replace(\u0027,\u0027, \u0027.\u0027);\r\n\r\n    return display;\r\n  }\r\n\r\n  /// \u003Csummary\u003E\r\n  /// format from 1000 to 1.0K\r\n  /// \u003C/summary\u003E\r\n  /// \u003Cparam name=\u0022val\u0022\u003E\u003C/param\u003E\r\n  /// \u003Creturns\u003E\u003C/returns\u003E\r\n  public static string ToDisplayShort(float val) {\r\n    double absVal = Math.Abs((double)val);\r\n\r\n    if (absVal \u003C 1000d) {\r\n      return Math.Round(val).ToString(CultureInfo.InvariantCulture);\r\n    }\r\n\r\n    int magnitude = (int)Math.Log(absVal, 1000d);\r\n    magnitude = Math.Min(magnitude, Suffixes.Length - 1);\r\n\r\n    double scaled = val / Math.Pow(1000d, magnitude);\r\n\r\n    if (Math.Round(scaled, 1) \u003E= 1000d \u0026\u0026 magnitude \u003C Suffixes.Length - 1) {\r\n      magnitude\u002B\u002B;\r\n      scaled = val / Math.Pow(1000d, magnitude);\r\n    }\r\n\r\n    string number = scaled.ToString(\u00220.0\u0022, CultureInfo.InvariantCulture);\r\n\r\n    return $\u0022{number}{Suffixes[magnitude]}\u0022;\r\n  }\r\n}\r\n"}]}