This commit is contained in:
h z
2024-06-21 20:57:19 +08:00
commit 7eed16cd02
48 changed files with 1599 additions and 0 deletions

92
Scenes/Bottle.cs Executable file
View File

@@ -0,0 +1,92 @@
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<Sprite2D>("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)
{
}
}