ported from perforce

This commit is contained in:
2026-04-19 00:43:27 +02:00
commit 6c0c33f5d4
700 changed files with 19735 additions and 0 deletions

View File

@@ -0,0 +1,213 @@
using System;
using DonkeysAndDroids;
using Godot;
using RobotAndDonkey.Game.Cards;
using RobotAndDonkey.Game.Execution.Results;
using System.Collections.Generic;
using RobotAndDonkey.Game;
using RobotAndDonkey.Game.Pois;
public partial class CoreLoopScreen : Control, IScreen
{
// Called when the node enters the scene tree for the first time.
public override void _Ready()
{
m_DrawGlitch = GetNode<DrawGlitch>("%Draw Glitch");
m_Improve = GetNode<Improve>("%Improve");
m_CosmicRays = GetNode<Gamble>("%Cosmic Rays");
m_BufferOverflow = GetNode<BufferOverflow>("%Buffer Overflow");
m_ProgramScreen = GetNode<ProgramScreen>("%Program");
m_BoardNode = GetNode<BoardNode>("%BoardNode");
m_CurrencyBar = GetNode<CurrencyBar>("%CurrencyBar");
m_OptionsButton = GetNode<Button>("%OptionsButton");
m_SeedButton = GetNode<Button>("%SeedButton");
m_SeedButton.Pressed += OnSeedButtonPressed;
m_OptionsButton.Pressed += OnOptionsButtonPressed;
}
private void OnSeedButtonPressed()
{
DisplayServer.ClipboardSet(Main.Instance.StringSeed);
//Main.Instance.StartCoreLoop(Random.Shared.Next(), EDifficulty.Easy, ERobotType.Vintage);
}
public bool TransitionScreen<T>(T newScreen, Tween tween) where T : Control, IScreen
{
newScreen.EnableInputs();
if (m_CurrentScreen == newScreen)
return false;
var parent = newScreen.GetParent();
parent.MoveChild(newScreen, 1);
var oldControl = (Control)m_CurrentScreen;
var oldScreen = m_CurrentScreen;
m_CurrentScreen = newScreen;
newScreen.Modulate = new(1, 1, 1);
newScreen.Visible = true;
newScreen.Activate();
if (oldScreen == null)
return true;
tween.TweenProperty(oldControl, "modulate", new Color(0, 0, 0, 0), 0.25);
tween.TweenCallback(Callable.From(() =>
{
oldScreen.Deactivate();
oldControl.Visible = false;
oldControl.Modulate = new(1, 1, 1);
}));
return true;
}
public void EnableInputs()
{
m_SeedButton.Text = Main.Instance.StringSeed;
m_CurrentScreen?.EnableInputs();
m_BoardNode.Configure(Main.Instance.CoreLoop.Board);
m_CurrencyBar.Configure(Main.Instance.CoreLoop, Main.Instance.CoreLoop.ProgramCount, Main.Instance.CoreLoop.Currency, null);
}
public void Activate()
{
}
public void Deactivate()
{
if (m_CurrentScreen is Control control)
{
control.Visible = false;
control.Modulate = new(1, 1, 1);
m_CurrentScreen.Deactivate();
m_CurrentScreen = null;
}
}
public void DisableInputs()
{
m_CurrentScreen?.DisableInputs();
}
// Called every frame. 'delta' is the elapsed time since the previous frame.
public override void _Process(double delta)
{
}
public override void _UnhandledInput(InputEvent @event)
{
if (@event is InputEventMouse mouseEvent)
{
var container = GetNode<Control>("%BoardViewPortContainer");
if (!container.GetGlobalRect().HasPoint(mouseEvent.Position))
return;
var viewPort = GetNode<SubViewport>("%BoardViewPort");
viewPort.PushInput(@event);
if (viewPort.IsInputHandled())
GetViewport().SetInputAsHandled();
}
}
private void OnOptionsButtonPressed()
{
Main.Instance.OptionsMenu.ShowMenu();
}
public override void _UnhandledKeyInput(InputEvent @event)
{
if (@event.IsActionPressed("options") && m_CurrentScreen != null)
{
Main.Instance.OptionsMenu.ShowMenu();
GetViewport().SetInputAsHandled();
}
}
public void DrawGlitch(Card card, Tween tween)
{
TransitionScreen(m_DrawGlitch, tween);
m_DrawGlitch.Configure(card, tween);
}
public void Improve(Tween tween)
{
TransitionScreen(m_Improve, tween);
m_Improve.Configure(Main.Instance.CoreLoop.Shop, Main.Instance.CoreLoop.PatchDeck, tween);
}
public bool HandleResult(Result result, Tween tween)
{
if (m_CurrentScreen.HandleResult(result, tween))
return true;
switch (result)
{
case CellTypeResult cellResult:
{
m_BoardNode.Configure(cellResult, tween);
return true;
}
case ModifyCellResult cellResult:
{
m_BoardNode.Configure(cellResult, tween);
return true;
}
case PoiResult cellResult:
{
m_BoardNode.Configure(cellResult, tween);
return true;
}
case CurrencyResult currencyResult:
{
m_CurrencyBar.Configure(Main.Instance.CoreLoop, Main.Instance.CoreLoop.ProgramCount, currencyResult.NewCurrency, tween);
return true;
}
case ProgramResult programResult:
{
m_CurrencyBar.Configure(Main.Instance.CoreLoop, programResult.NewProgram, Main.Instance.CoreLoop.Currency, tween);
return true;
}
case ModifyCardResult modifyCardResult:
{
m_Improve.Deck.ModifyCard(modifyCardResult.Card, modifyCardResult.Modifier, tween);
return true;
}
case DeckResult deckResult:
{
m_Improve.Deck.Configure(deckResult.Deck, tween, false, false);
return true;
}
}
GD.Print($"Unhandled result {result.GetType().Name} in screen {m_CurrentScreen.GetType().Name}");
return false;
}
public void CosmicRays(List<Card> gambleCards, Tween tween)
{
TransitionScreen(m_CosmicRays, tween);
m_CosmicRays.Configure(gambleCards, tween);
}
public void BufferOverflow(Tween tween)
{
TransitionScreen(m_BufferOverflow, tween);
m_BufferOverflow.Configure(tween);
}
public void ExecuteProgram(Tween tween)
{
var becomeActive = TransitionScreen(m_ProgramScreen, tween);
m_ProgramScreen.Configure(becomeActive ? tween : null);
}
private ProgramScreen m_ProgramScreen;
private DrawGlitch m_DrawGlitch;
private Improve m_Improve;
private IScreen m_CurrentScreen;
private Gamble m_CosmicRays;
private BufferOverflow m_BufferOverflow;
private BoardNode m_BoardNode;
private CurrencyBar m_CurrencyBar;
private Button m_SeedButton;
private Button m_OptionsButton;
}