using Godot; using System.Linq; using VirtualChemistry.Chemistry.Compounds.Implements; using VirtualChemistry.Chemistry.Containers; using VirtualChemistry.Chemistry.Mixtures.Implements; public partial class Bottle : MenuButton, IChemicalContainer { private double ContainerVolume { get; set; } private HeterogeneousMixture HeterogeneousMixture { get; set; } public double Volume() => ContainerVolume; public HeterogeneousMixture Content { get; set; } public double EnvironmentPressure { get; set; } public double EnvironmentTemperature { get; set; } public HeterogeneousMixture ChemicalContent { get; set; } = HeterogeneousMixture.Null; public HomogeneousMixture MainComponent => ChemicalContent.Layers .DefaultIfEmpty(HomogeneousMixture.Null) .MaxBy(x => x.Amount); public Compound MainCompound => MainComponent.Compounds .DefaultIfEmpty(Compound.Null) .MaxBy(x => x.Amount); private const string Empty = "Empty"; private string PotionName => $"Main: {(MainCompound == Compound.Null ? Empty : MainCompound.Expression)}"; private string PotionAmount => $"Amount: {(MainCompound == Compound.Null ? 0d : ChemicalContent.Amount)}"; public Sprite2D ContentTexture { get; set; } private void BuildMenu() { PopupMenu menu = GetPopup(); menu.Clear(); foreach (var w in menu.GetSignalConnectionList(PopupMenu.SignalName.IdPressed)) menu.Disconnect(PopupMenu.SignalName.IdPressed, w["callable"].AsCallable()); menu.AddItem(PotionName, 0); menu.AddItem(PotionAmount, 1); menu.SetItemDisabled(0, true); menu.SetItemDisabled(1, true); menu.AddItem("Construct", 2); menu.AddItem("Fill From Flask", 3); menu.AddItem("Load From String", 4); menu.AddItem("Add to Flask", 5); menu.AddItem("Save to String", 6); menu.AddItem("Discard", 7); menu.Connect(PopupMenu.SignalName.IdPressed, Callable.From((int idx) => MenuHandle(idx))); } private void MenuHandle(int idx) { switch (idx) { case 2: GlobalScene.Demo.SelectedBottle = this; GlobalScene.MainScene.SwitchToConstructor(); return; case 3: ChemicalContent = GlobalScene.Flask.Content; ChemicalContent.Container = this; GlobalScene.Flask.Content = HeterogeneousMixture.Null; GlobalScene.Flask.Update(); return; case 4: return; default: return; } } // Called when the node enters the scene tree for the first time. public override void _Ready() { ContentTexture = GetNode("Content"); if (ChemicalContent == HeterogeneousMixture.Null) ContentTexture.Modulate = new Color(0, 0, 0, 0); else { ContentTexture.Modulate = new Color( MainComponent.ColorRed, MainComponent.ColorGreen, MainComponent.ColorBlue, MainComponent.ColorTransparent ); } BuildMenu(); } // Called every frame. 'delta' is the elapsed time since the previous frame. public override void _Process(double delta) { } }