Overhaul game state logic to support gameplay loop

This commit is contained in:
2025-04-30 00:43:55 -07:00
parent 78cdda97b9
commit 68c91d8f13
60 changed files with 2503 additions and 1116 deletions

View File

@@ -28,21 +28,14 @@ public partial class App : CanvasLayer, IApp
public IAppLogic AppLogic { get; set; } = default!;
public AppLogic.IBinding AppBinding { get; set; } = default!;
[Node] public Menu Menu { get; set; } = default!;
[Node] public ISubViewport GameWindow { get; set; } = default!;
[Node] public ISplash Splash { get; set; } = default!;
[Node] public IColorRect BlankScreen { get; set; } = default!;
[Node] public IAnimationPlayer AnimationPlayer { get; set; } = default!;
public void Initialize()
{
var container = new SimpleInjector.Container();
container.Options.DefaultScopedLifestyle = new AsyncScopedLifestyle();
container.RegisterSingleton<IAppRepo, AppRepo>();
container.RegisterSingleton<IAppLogic, AppLogic>();
//container.Verify();
Instantiator = new Instantiator(GetTree());
@@ -52,12 +45,6 @@ public partial class App : CanvasLayer, IApp
AppLogic.Set(AppRepo);
AppLogic.Set(new AppLogic.Data());
Menu.NewGame += OnNewGame;
Menu.LoadGame += OnLoadGame;
Menu.Quit += OnQuit;
AnimationPlayer.AnimationFinished += OnAnimationFinished;
Input.MouseMode = Input.MouseModeEnum.Visible;
this.Provide();
}
@@ -69,14 +56,9 @@ public partial class App : CanvasLayer, IApp
AppBinding
.Handle((in AppLogic.Output.ShowSplashScreen _) =>
{
HideMenus();
BlankScreen.Hide();
Splash.Show();
})
.Handle((in AppLogic.Output.HideSplashScreen _) =>
{
BlankScreen.Show();
FadeToBlack();
})
.Handle((in AppLogic.Output.SetupGameScene _) =>
{
@@ -86,19 +68,9 @@ public partial class App : CanvasLayer, IApp
})
.Handle((in AppLogic.Output.ShowMainMenu _) =>
{
// Load everything while we're showing a black screen, then fade in.
HideMenus();
Menu.Show();
FadeInFromBlack();
Menu.NewGameButton.GrabFocus();
})
.Handle((in AppLogic.Output.FadeToBlack _) => FadeToBlack())
.Handle((in AppLogic.Output.HideGame _) => FadeToBlack())
.Handle((in AppLogic.Output.ShowGame _) =>
{
HideMenus();
FadeInFromBlack();
})
.Handle((in AppLogic.Output.StartLoadingSaveFile _) =>
{
@@ -126,36 +98,6 @@ public partial class App : CanvasLayer, IApp
AppLogic.Input(new AppLogic.Input.SaveFileLoaded());
}
public void FadeInFromBlack()
{
BlankScreen.Show();
AnimationPlayer.Play("fade_in");
}
public void FadeToBlack()
{
BlankScreen.Show();
AnimationPlayer.Play("fade_out");
}
public void HideMenus()
{
Splash.Hide();
Menu.Hide();
}
public void OnAnimationFinished(StringName animation)
{
if (animation == "fade_in")
{
AppLogic.Input(new AppLogic.Input.FadeInFinished());
BlankScreen.Hide();
return;
}
AppLogic.Input(new AppLogic.Input.FadeOutFinished());
}
public void OnExitTree()
{
AppLogic.Stop();

View File

@@ -1,62 +1,6 @@
[gd_scene load_steps=8 format=3 uid="uid://cagfc5ridmteu"]
[gd_scene load_steps=2 format=3 uid="uid://cagfc5ridmteu"]
[ext_resource type="Script" uid="uid://d1f8blk5ucqvq" path="res://src/app/App.cs" id="1_rt73h"]
[ext_resource type="PackedScene" uid="uid://rfvnddfqufho" path="res://src/menu/Menu.tscn" id="2_kvwo1"]
[ext_resource type="PackedScene" uid="uid://bd0p761qakisw" path="res://src/menu/splash/Splash.tscn" id="3_3st5l"]
[sub_resource type="Animation" id="Animation_3st5l"]
length = 0.001
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("BlankScreenControl/BlankScreen:color")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [Color(0, 0, 0, 1)]
}
[sub_resource type="Animation" id="Animation_1uiag"]
resource_name = "fade_in"
length = 0.1
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("BlankScreenControl/BlankScreen:color")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0, 0.1),
"transitions": PackedFloat32Array(1, 1),
"update": 0,
"values": [Color(0, 0, 0, 1), Color(0, 0, 0, 0)]
}
[sub_resource type="Animation" id="Animation_v0mgf"]
resource_name = "fade_out"
length = 0.1
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("BlankScreenControl/BlankScreen:color")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0, 0.1),
"transitions": PackedFloat32Array(1, 1),
"update": 0,
"values": [Color(0, 0, 0, 0), Color(0, 0, 0, 1)]
}
[sub_resource type="AnimationLibrary" id="AnimationLibrary_3st5l"]
_data = {
&"RESET": SubResource("Animation_3st5l"),
&"fade_in": SubResource("Animation_1uiag"),
&"fade_out": SubResource("Animation_v0mgf")
}
[node name="App" type="CanvasLayer"]
process_mode = 3
@@ -76,36 +20,5 @@ transparent_bg = true
handle_input_locally = false
audio_listener_enable_2d = true
audio_listener_enable_3d = true
size = Vector2i(1280, 960)
size = Vector2i(1920, 1080)
render_target_update_mode = 4
[node name="Menu" parent="." instance=ExtResource("2_kvwo1")]
unique_name_in_owner = true
visible = false
[node name="Splash" parent="." instance=ExtResource("3_3st5l")]
unique_name_in_owner = true
[node name="BlankScreenControl" type="Control" parent="."]
layout_mode = 3
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
[node name="BlankScreen" type="ColorRect" parent="BlankScreenControl"]
unique_name_in_owner = true
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
color = Color(0, 0, 0, 1)
[node name="AnimationPlayer" type="AnimationPlayer" parent="."]
unique_name_in_owner = true
libraries = {
&"": SubResource("AnimationLibrary_3st5l")
}