From 4c4a41cd2e3dbd71fcb3c8b0b934cb69c51e194d Mon Sep 17 00:00:00 2001 From: ktyl Date: Mon, 12 Dec 2022 23:32:49 +0000 Subject: [PATCH] add overlay cycling ui #6 --- half-earth/nodes/game.tscn | 11 ++++- half-earth/nodes/ui/mode_selection_ui.tscn | 2 +- half-earth/nodes/ui/overlays UI.tscn | 18 ++++++++ half-earth/resources/overlays/overlays.tres | 9 ++++ .../resources/tiles/tile_types/developed.tres | 1 - .../buildable_tiles.tres | 2 +- .../resources/tiles/tile_types/wild.tres | 1 - half-earth/scripts/ReadOnlyResourceList.cs | 33 ++++++++++++++ half-earth/scripts/overlays/Overlay.cs | 1 + .../scripts/overlays/OverlayCollection.cs | 3 ++ half-earth/scripts/overlays/Overlays.cs | 21 +++++---- half-earth/scripts/tile/TileType.cs | 8 +--- half-earth/scripts/tile/TileTypeCollection.cs | 45 +------------------ half-earth/scripts/ui/OverlaysUI.cs | 36 +++++++++++++++ 14 files changed, 124 insertions(+), 67 deletions(-) create mode 100644 half-earth/nodes/ui/overlays UI.tscn create mode 100644 half-earth/resources/overlays/overlays.tres create mode 100644 half-earth/scripts/ReadOnlyResourceList.cs create mode 100644 half-earth/scripts/overlays/OverlayCollection.cs create mode 100644 half-earth/scripts/ui/OverlaysUI.cs diff --git a/half-earth/nodes/game.tscn b/half-earth/nodes/game.tscn index 15ee3c2..023b6a7 100644 --- a/half-earth/nodes/game.tscn +++ b/half-earth/nodes/game.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=11 format=2] +[gd_scene load_steps=13 format=2] [ext_resource path="res://nodes/grid.tscn" type="PackedScene" id=1] [ext_resource path="res://nodes/grid_cursor.tscn" type="PackedScene" id=2] @@ -7,8 +7,10 @@ [ext_resource path="res://nodes/interaction_modes/interaction_mode.tscn" type="PackedScene" id=5] [ext_resource path="res://nodes/ui/build_mode_ui.tscn" type="PackedScene" id=6] [ext_resource path="res://nodes/interaction_modes/build_mode.tscn" type="PackedScene" id=7] +[ext_resource path="res://nodes/ui/overlays UI.tscn" type="PackedScene" id=8] [ext_resource path="res://nodes/ui/mode_selection_ui.tscn" type="PackedScene" id=9] [ext_resource path="res://nodes/overlays.tscn" type="PackedScene" id=10] +[ext_resource path="res://resources/overlays/overlays.tres" type="Resource" id=11] [sub_resource type="Curve" id=1] _data = [ Vector2( 0, 0 ), 0.0, 5.0, 0, 0, Vector2( 0.5, 1 ), 0.0, 0.0, 0, 0, Vector2( 1, 0 ), -4.0, 0.0, 0, 0 ] @@ -33,6 +35,7 @@ _gridPath = NodePath("../../World Grid") _cursorPath = NodePath("../../Cursor") [node name="Overlays" parent="." instance=ExtResource( 10 )] +_overlaysResource = ExtResource( 11 ) _worldGridPath = NodePath("../World Grid") [node name="UI" type="Control" parent="."] @@ -47,6 +50,9 @@ _buildModePath = NodePath("../../Interaction Modes/Build Mode") [node name="Mode Selection" parent="UI" instance=ExtResource( 9 )] +[node name="Overlays UI" parent="UI" instance=ExtResource( 8 )] +_overlaysPath = NodePath("../../Overlays") + [connection signal="OnPauseChanged" from="Clock" to="UI/Debug" method="_on_Clock_OnPauseChanged"] [connection signal="OnTick" from="Clock" to="World Grid" method="_on_Clock_OnTick"] [connection signal="OnTick" from="Clock" to="UI/Debug" method="_on_Clock_OnTick"] @@ -55,7 +61,8 @@ _buildModePath = NodePath("../../Interaction Modes/Build Mode") [connection signal="OnModeEntered" from="Interaction Modes/Build Mode" to="Interaction Modes" method="_on_Build_Mode_OnModeEntered"] [connection signal="OnModeEntered" from="Interaction Modes/Build Mode" to="UI/Mode Selection" method="EnableBuildMode"] [connection signal="OnModeExited" from="Interaction Modes/Build Mode" to="Interaction Modes" method="_on_Build_Mode_OnModeExited"] +[connection signal="OnModeExited" from="Interaction Modes/Build Mode" to="UI/Mode Selection" method="Enable"] [connection signal="SelectedTileTypeChanged" from="Interaction Modes/Build Mode" to="UI/Build Mode" method="UpdateButtonToggleState"] +[connection signal="OverlayCycled" from="Overlays" to="UI/Overlays UI" method="UpdateOverlayText"] [connection signal="OnExit" from="UI/Build Mode" to="Interaction Modes" method="Reset"] -[connection signal="OnExit" from="UI/Build Mode" to="UI/Mode Selection" method="Enable"] [connection signal="BuildModeEnabled" from="UI/Mode Selection" to="Interaction Modes/Build Mode" method="Enable"] diff --git a/half-earth/nodes/ui/mode_selection_ui.tscn b/half-earth/nodes/ui/mode_selection_ui.tscn index 1916be8..e80162e 100644 --- a/half-earth/nodes/ui/mode_selection_ui.tscn +++ b/half-earth/nodes/ui/mode_selection_ui.tscn @@ -14,6 +14,6 @@ margin_left = 2.0 margin_top = 562.0 margin_right = 38.0 margin_bottom = 598.0 -text = "Build Mode" +text = "[B] Build Mode" [connection signal="pressed" from="Build Mode" to="." method="EnableBuildMode"] diff --git a/half-earth/nodes/ui/overlays UI.tscn b/half-earth/nodes/ui/overlays UI.tscn new file mode 100644 index 0000000..6489675 --- /dev/null +++ b/half-earth/nodes/ui/overlays UI.tscn @@ -0,0 +1,18 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://scripts/ui/OverlaysUI.cs" type="Script" id=1] + +[node name="Overlays UI" type="Node"] +script = ExtResource( 1 ) +_cycleOverlayButtonPath = NodePath("Button") + +[node name="Button" type="Button" parent="."] +anchor_top = 1.0 +anchor_bottom = 1.0 +margin_top = -90.0 +margin_right = 42.0 +margin_bottom = -52.0 +grow_vertical = 0 +text = "[Tab] Cycle Overlay" + +[connection signal="pressed" from="Button" to="." method="CycleOverlay"] diff --git a/half-earth/resources/overlays/overlays.tres b/half-earth/resources/overlays/overlays.tres new file mode 100644 index 0000000..6eb6676 --- /dev/null +++ b/half-earth/resources/overlays/overlays.tres @@ -0,0 +1,9 @@ +[gd_resource type="Resource" load_steps=4 format=2] + +[ext_resource path="res://scripts/overlays/OverlayCollection.cs" type="Script" id=1] +[ext_resource path="res://resources/overlays/no_overlay.tres" type="Resource" id=2] +[ext_resource path="res://resources/overlays/heat_overlay.tres" type="Resource" id=3] + +[resource] +script = ExtResource( 1 ) +_resources = [ ExtResource( 2 ), ExtResource( 3 ) ] diff --git a/half-earth/resources/tiles/tile_types/developed.tres b/half-earth/resources/tiles/tile_types/developed.tres index 9847d30..8f5f1d1 100644 --- a/half-earth/resources/tiles/tile_types/developed.tres +++ b/half-earth/resources/tiles/tile_types/developed.tres @@ -5,7 +5,6 @@ [resource] script = ExtResource( 1 ) Name = "Developed" -BuildLabel = "[D]eveloped" Key = 68 Color = Color( 0.372549, 0.372549, 0.372549, 1 ) HeatGeneration = 0.4 diff --git a/half-earth/resources/tiles/tile_types/tile_type_collections/buildable_tiles.tres b/half-earth/resources/tiles/tile_types/tile_type_collections/buildable_tiles.tres index b8d9f13..af140a6 100644 --- a/half-earth/resources/tiles/tile_types/tile_type_collections/buildable_tiles.tres +++ b/half-earth/resources/tiles/tile_types/tile_type_collections/buildable_tiles.tres @@ -5,4 +5,4 @@ [resource] script = ExtResource( 1 ) -_tileTypeResources = [ ExtResource( 2 ) ] +_resources = [ ExtResource( 2 ) ] diff --git a/half-earth/resources/tiles/tile_types/wild.tres b/half-earth/resources/tiles/tile_types/wild.tres index 4e5b1d7..370bb83 100644 --- a/half-earth/resources/tiles/tile_types/wild.tres +++ b/half-earth/resources/tiles/tile_types/wild.tres @@ -5,7 +5,6 @@ [resource] script = ExtResource( 1 ) Name = "Wild" -BuildLabel = "[W]ild" Key = 87 Color = Color( 0, 0.545098, 0.0196078, 1 ) HeatGeneration = -0.2 diff --git a/half-earth/scripts/ReadOnlyResourceList.cs b/half-earth/scripts/ReadOnlyResourceList.cs new file mode 100644 index 0000000..4b9f2fb --- /dev/null +++ b/half-earth/scripts/ReadOnlyResourceList.cs @@ -0,0 +1,33 @@ +using Godot; +using System.Collections; +using System.Collections.Generic; + +public abstract class ReadOnlyResourceList : Resource, IReadOnlyList where T : Resource +{ + [Export] + private List _resources = new List(); + private List Collection + { + get + { + if (_collection != null) + return _collection; + + _collection = new List(); + foreach (var resource in _resources) + { + _collection.Add((T)resource); + } + return _collection; + } + } + private List _collection = null; + + public T this[int index] => Collection[index]; + + public int Count => Collection.Count; + + public IEnumerator GetEnumerator() => Collection.GetEnumerator(); + + IEnumerator IEnumerable.GetEnumerator() => Collection.GetEnumerator(); +} \ No newline at end of file diff --git a/half-earth/scripts/overlays/Overlay.cs b/half-earth/scripts/overlays/Overlay.cs index ef65c38..10167b8 100644 --- a/half-earth/scripts/overlays/Overlay.cs +++ b/half-earth/scripts/overlays/Overlay.cs @@ -2,5 +2,6 @@ using Godot; public abstract class Overlay : Resource { + public string Name => GetType().ToString(); public abstract void Apply(Tile tile, ShaderMaterial material); } \ No newline at end of file diff --git a/half-earth/scripts/overlays/OverlayCollection.cs b/half-earth/scripts/overlays/OverlayCollection.cs new file mode 100644 index 0000000..a357676 --- /dev/null +++ b/half-earth/scripts/overlays/OverlayCollection.cs @@ -0,0 +1,3 @@ +public class OverlayCollection : ReadOnlyResourceList +{ +} \ No newline at end of file diff --git a/half-earth/scripts/overlays/Overlays.cs b/half-earth/scripts/overlays/Overlays.cs index b9706a8..7901b75 100644 --- a/half-earth/scripts/overlays/Overlays.cs +++ b/half-earth/scripts/overlays/Overlays.cs @@ -3,14 +3,16 @@ using System; public class Overlays : Node { + [Signal] + delegate void OverlayCycled(Overlay overlay); + [Export] private KeyList _cycleOverlayKey; - [Export] - private Resource[] _overlayResources; - private Overlay[] _overlays; + [Export] private Resource _overlaysResource; + public Overlay Current => _overlays[_overlayIdx]; + private OverlayCollection _overlays; private int _overlayIdx = 0; - private Overlay Current => _overlays[_overlayIdx]; [Export] private Resource _tileGridResource; @@ -22,12 +24,8 @@ public class Overlays : Node public override void _Ready() { + _overlays = (OverlayCollection)_overlaysResource; _tileGrid = (TileGrid)_tileGridResource; - _overlays = new Overlay[_overlayResources.Length]; - for (int i = 0; i < _overlayResources.Length; i++) - { - _overlays[i] = (Overlay)_overlayResources[i]; - } _worldGrid = GetNode(_worldGridPath); } @@ -60,9 +58,10 @@ public class Overlays : Node } } - private void CycleOverlay() + public void CycleOverlay() { _overlayIdx++; - _overlayIdx %= _overlays.Length; + _overlayIdx %= _overlays.Count; + EmitSignal(nameof(OverlayCycled), Current); } } diff --git a/half-earth/scripts/tile/TileType.cs b/half-earth/scripts/tile/TileType.cs index 8d8e777..c2824a1 100644 --- a/half-earth/scripts/tile/TileType.cs +++ b/half-earth/scripts/tile/TileType.cs @@ -5,8 +5,7 @@ public class TileType : Resource [Export] public string Name { get; private set; } - [Export] - public string BuildLabel { get; private set; } + public string BuildLabel => $"[{Key}] {Name}"; [Export] public KeyList Key { get; private set; } @@ -17,8 +16,5 @@ public class TileType : Resource [Export] public float HeatGeneration { get; private set; } - public override string ToString() - { - return Name; - } + public override string ToString() => Name; } \ No newline at end of file diff --git a/half-earth/scripts/tile/TileTypeCollection.cs b/half-earth/scripts/tile/TileTypeCollection.cs index d30c6e8..ffb7066 100644 --- a/half-earth/scripts/tile/TileTypeCollection.cs +++ b/half-earth/scripts/tile/TileTypeCollection.cs @@ -1,46 +1,3 @@ -using Godot; -using System; -using System.Collections; -using System.Collections.Generic; - -public class TileTypeCollection : Resource, IReadOnlyList +public class TileTypeCollection : ReadOnlyResourceList { - [Export] - private List _tileTypeResources = new List(); - - private List TileTypes - { - get - { - if (_tileTypes != null) - return _tileTypes; - - _tileTypes = new List(); - - foreach (var resource in _tileTypeResources) - { - if (!(resource is TileType)) - throw new InvalidCastException($"{resource} must be a {typeof(TileType)}"); - - _tileTypes.Add((TileType)resource); - } - - return _tileTypes; - } - } - private List _tileTypes = null; - - public TileType this[int index] => TileTypes[index]; - - public int Count => TileTypes.Count; - - public IEnumerator GetEnumerator() - { - return TileTypes.GetEnumerator(); - } - - IEnumerator IEnumerable.GetEnumerator() - { - return TileTypes.GetEnumerator(); - } } diff --git a/half-earth/scripts/ui/OverlaysUI.cs b/half-earth/scripts/ui/OverlaysUI.cs new file mode 100644 index 0000000..af97c7c --- /dev/null +++ b/half-earth/scripts/ui/OverlaysUI.cs @@ -0,0 +1,36 @@ +using Godot; +using System; +using System.Collections.Generic; + +public class OverlaysUI : Node +{ + [Export] + private NodePath _cycleOverlayButtonPath; + private Button _cycleOverlayButton; + + [Export] + private NodePath _overlaysPath; + private Overlays _overlays; + + private string _mainText; + + public override void _Ready() + { + base._Ready(); + + _cycleOverlayButton = GetNode