ported from perforce
This commit is contained in:
213
DonkeysAndDroids.Godot/CoreLoopScreen.cs
Normal file
213
DonkeysAndDroids.Godot/CoreLoopScreen.cs
Normal 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;
|
||||
}
|
||||
Reference in New Issue
Block a user