From 7cd96e20d295297409ac620cfe085e13b9427cb0 Mon Sep 17 00:00:00 2001 From: Dominic Masters Date: Mon, 19 May 2025 22:53:17 -0500 Subject: [PATCH] Add event flags --- scenes/Maps/TestMap/TestMap.tscn | 4 +- scenes/Singletons/UI.tscn | 6 ++- scenes/UI/EventFlagMenu.tscn | 73 ++++++++++++++++++++++++++++ scripts/Event/EventFlagModify.gd | 50 +++++++++++++++++-- scripts/Singleton/Event.gd | 11 +++++ scripts/Singleton/UI.gd | 2 + scripts/UI/DebugMenu.gd | 6 ++- scripts/UI/EventFlagMenu.gd | 83 ++++++++++++++++++++++++++++++++ scripts/UI/EventFlagMenu.gd.uid | 1 + 9 files changed, 229 insertions(+), 7 deletions(-) create mode 100644 scenes/UI/EventFlagMenu.tscn create mode 100644 scripts/UI/EventFlagMenu.gd create mode 100644 scripts/UI/EventFlagMenu.gd.uid diff --git a/scenes/Maps/TestMap/TestMap.tscn b/scenes/Maps/TestMap/TestMap.tscn index 4e49abd..25b8eec 100644 --- a/scenes/Maps/TestMap/TestMap.tscn +++ b/scenes/Maps/TestMap/TestMap.tscn @@ -80,9 +80,9 @@ script = ExtResource("5_cg1ph") [node name="EventFlagModify" type="Node" parent="Events/TestConversation"] script = ExtResource("12_ncdgy") -action = 2 +action = 4 event = 1 -eventFlag = 1 +eventFlag = 1539 metadata/_custom_type_script = "uid://0ygswaohp7kj" [node name="Text 0" type="Node" parent="Events/TestConversation"] diff --git a/scenes/Singletons/UI.tscn b/scenes/Singletons/UI.tscn index 427a56d..2c49d8a 100644 --- a/scenes/Singletons/UI.tscn +++ b/scenes/Singletons/UI.tscn @@ -1,10 +1,11 @@ -[gd_scene load_steps=6 format=3 uid="uid://b5bwpsh0gcicf"] +[gd_scene load_steps=7 format=3 uid="uid://b5bwpsh0gcicf"] [ext_resource type="Script" uid="uid://dahhuhiu8u88b" path="res://scripts/Singleton/UI.gd" id="1_g3au4"] [ext_resource type="PackedScene" uid="uid://verg13jtqwvh" path="res://scenes/UI/DebugMenu.tscn" id="2_is0g4"] [ext_resource type="PackedScene" uid="uid://bfioi52hjn2kf" path="res://scenes/UI/QuestMenu.tscn" id="2_mpokx"] [ext_resource type="PackedScene" uid="uid://bkx3l0kckf4a8" path="res://scenes/UI/VNTextbox.tscn" id="3_btpxp"] [ext_resource type="PackedScene" uid="uid://dl8iqhrpsplmk" path="res://scenes/UI/Inventory/FullInventoryMenu.tscn" id="5_6dyff"] +[ext_resource type="PackedScene" uid="uid://b6s1xdcfcp0xx" path="res://scenes/UI/EventFlagMenu.tscn" id="5_12prj"] [node name="UI" type="Control"] layout_mode = 3 @@ -30,6 +31,9 @@ anchors_preset = 0 visible = false layout_mode = 1 +[node name="EventFlagMenu" parent="." instance=ExtResource("5_12prj")] +layout_mode = 1 + [node name="DebugMenu" parent="." instance=ExtResource("2_is0g4")] visible = false layout_mode = 0 diff --git a/scenes/UI/EventFlagMenu.tscn b/scenes/UI/EventFlagMenu.tscn new file mode 100644 index 0000000..9d502ba --- /dev/null +++ b/scenes/UI/EventFlagMenu.tscn @@ -0,0 +1,73 @@ +[gd_scene load_steps=2 format=3 uid="uid://b6s1xdcfcp0xx"] + +[ext_resource type="Script" uid="uid://b4a3ne2vn36mt" path="res://scripts/UI/EventFlagMenu.gd" id="1_nnw5f"] + +[node name="EventFlagsMenu" type="Panel" node_paths=PackedStringArray("flagList", "grid")] +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_nnw5f") +flagList = NodePath("HBoxContainer/FlagList") +grid = NodePath("HBoxContainer/Control") +metadata/_custom_type_script = "uid://b4a3ne2vn36mt" + +[node name="HBoxContainer" type="HBoxContainer" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="FlagList" type="ItemList" parent="HBoxContainer"] +clip_contents = false +layout_mode = 2 +size_flags_horizontal = 0 +size_flags_vertical = 3 +auto_width = true +item_count = 2 +item_0/text = "Item 0" +item_1/text = "Item 1" + +[node name="Control" type="GridContainer" parent="HBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +columns = 6 + +[node name="Flag0" type="CheckBox" parent="HBoxContainer/Control"] +layout_mode = 2 +text = "Flag 0" + +[node name="Flag1" type="CheckBox" parent="HBoxContainer/Control"] +layout_mode = 2 +text = "Flag 0" + +[node name="Flag2" type="CheckBox" parent="HBoxContainer/Control"] +layout_mode = 2 +text = "Flag 0" + +[node name="Flag3" type="CheckBox" parent="HBoxContainer/Control"] +layout_mode = 2 +text = "Flag 0" + +[node name="Flag4" type="CheckBox" parent="HBoxContainer/Control"] +layout_mode = 2 +text = "Flag 0" + +[node name="Flag5" type="CheckBox" parent="HBoxContainer/Control"] +layout_mode = 2 +text = "Flag 0" + +[node name="Flag6" type="CheckBox" parent="HBoxContainer/Control"] +layout_mode = 2 +text = "Flag 0" + +[node name="Flag7" type="CheckBox" parent="HBoxContainer/Control"] +layout_mode = 2 +text = "Flag 0" + +[node name="Flag8" type="CheckBox" parent="HBoxContainer/Control"] +layout_mode = 2 +text = "Flag 0" diff --git a/scripts/Event/EventFlagModify.gd b/scripts/Event/EventFlagModify.gd index f689e55..c0b0cbc 100644 --- a/scripts/Event/EventFlagModify.gd +++ b/scripts/Event/EventFlagModify.gd @@ -10,10 +10,54 @@ enum Action { @export var action:Action = Action.TURN_ON; @export var event:EventSystem.SpecialEvent; -@export_flags("1:1", "2:2", "3:4", "4:8", "5:16", "6:32", "7:64", "8:128", "9:256", "10:512", "11:1024", "12:2048", "13:4096", "14:8192", "15:16384", "16:32768") +@export_flags( + "1:1", + "2:2", + "3:4", + "4:8", + "5:16", + "6:32", + "7:64", + "8:128", + "9:256", + "10:512", + "11:1024", + "12:2048", + "13:4096", + "14:8192", + "15:16384", + "16:32768", + "17:65536", + "18:131072", + "19:262144", + "20:524288", + "21:1048576", + "22:2097152", + "23:4194304", + "24:8388608", + "25:16777216", + "26:33554432", + "27:67108864", + "28:134217728", + "29:268435456", + "30:536870912", + "31:1073741824", + "32:2147483648" +) var eventFlag:int = 0; func start() -> void: super.start() - pass - # EVENT.eventFlagOn(event, eventFlag) \ No newline at end of file + match action: + Action.TURN_ON: + EVENT.eventFlagOn(event, eventFlag) + Action.TURN_OFF: + EVENT.eventFlagOff(event, eventFlag) + Action.SET_TO: + EVENT.eventFlagSetTo(event, eventFlag) + Action.ALL_ON: + EVENT.eventFlagSetTo(event, 0xffffffff) + Action.ALL_OFF: + EVENT.eventFlagSetTo(event, 0) + _: + print("Invalid action: %s" % str(action)) \ No newline at end of file diff --git a/scripts/Singleton/Event.gd b/scripts/Singleton/Event.gd index aa17b07..b4f15aa 100644 --- a/scripts/Singleton/Event.gd +++ b/scripts/Singleton/Event.gd @@ -1,22 +1,33 @@ class_name EventSystem extends Node +const EVENT_FLAG_COUNT = 32 + enum SpecialEvent { INVALID = 0, TEST_QUEST = 1, }; var eventFlags:Dictionary[int, int] = {} +signal eventFlagUpdated(event:SpecialEvent, flags:int) func eventFlagOn(event:SpecialEvent, flagsToTurnOn:int) -> void: if !eventFlags.has(event): eventFlags[event] = 0; eventFlags[event] |= flagsToTurnOn; + eventFlagUpdated.emit(event, eventFlags[event]); func eventFlagOff(event:SpecialEvent, flagsToTurnOff:int) -> void: if !eventFlags.has(event): eventFlags[event] = 0; eventFlags[event] &= ~flagsToTurnOff; + eventFlagUpdated.emit(event, eventFlags[event]); + +func eventFlagSetTo(event:SpecialEvent, flagsToSet:int) -> void: + if !eventFlags.has(event): + eventFlags[event] = 0; + eventFlags[event] = flagsToSet; + eventFlagUpdated.emit(event, eventFlags[event]); func eventAreFlagsOn(event:SpecialEvent, flagsToCheck:int) -> bool: if !eventFlags.has(event): diff --git a/scripts/Singleton/UI.gd b/scripts/Singleton/UI.gd index 2f047dc..e03da90 100644 --- a/scripts/Singleton/UI.gd +++ b/scripts/Singleton/UI.gd @@ -3,11 +3,13 @@ class_name UISystem extends Control var QUEST_MENU:QuestMenu var DEBUG_MENU:DebugMenu var INVENTORY_MENU:FullInventoryMenu +var EVENT_FLAG_MENU:EventFlagMenu func _ready() -> void: QUEST_MENU = $QuestMenu DEBUG_MENU = $DebugMenu INVENTORY_MENU = $FullInventory + EVENT_FLAG_MENU = $EventFlagMenu func _process(delta: float) -> void: # This needs to always be at the end of the parent node's tree diff --git a/scripts/UI/DebugMenu.gd b/scripts/UI/DebugMenu.gd index 05e7573..9845da3 100644 --- a/scripts/UI/DebugMenu.gd +++ b/scripts/UI/DebugMenu.gd @@ -61,7 +61,11 @@ func _on_Battle_pressed(): print("Battle pressed") func _on_Event_pressed(): - print("Event pressed") + close() + if UI.EVENT_FLAG_MENU.isOpen(): + UI.EVENT_FLAG_MENU.close() + else: + UI.EVENT_FLAG_MENU.open() func _on_Inventory_pressed(): close() diff --git a/scripts/UI/EventFlagMenu.gd b/scripts/UI/EventFlagMenu.gd new file mode 100644 index 0000000..a54e29b --- /dev/null +++ b/scripts/UI/EventFlagMenu.gd @@ -0,0 +1,83 @@ +class_name EventFlagMenu extends Panel + +@export var flagList:ItemList +@export var grid:GridContainer +var checkboxes:Array[CheckBox] = [] +var selectedEvent:int = -1 + +func _ready() -> void: + while grid.get_child_count() > 0: + var child = grid.get_child(0) + grid.remove_child(child) + child.queue_free() + + for i in range(0, EventSystem.EVENT_FLAG_COUNT): + var checkbox:CheckBox = CheckBox.new() + checkbox.text = "Flag %s" % str(i) + grid.add_child(checkbox) + checkboxes.append(checkbox) + checkbox.pressed.connect(_on_CheckboxPressed) + + hide() + _updateEventList() + _updateSelectedEvent() + + EVENT.eventFlagUpdated.connect(_on_EventFlagUpdated) + flagList.item_selected.connect(_on_EventSelected) + +func _exit_tree() -> void: + EVENT.eventFlagUpdated.disconnect(_on_EventFlagUpdated) + flagList.item_selected.disconnect(_on_EventSelected) + + for checkbox in checkboxes: + grid.remove_child(checkbox) + checkbox.queue_free() + checkboxes.clear() + +func _updateEventList() -> void: + flagList.clear() + flagList.deselect_all() + + for event in EventSystem.SpecialEvent: + flagList.add_item(event) + +func _updateSelectedEvent() -> void: + if selectedEvent == -1: + for i in range(0, EventSystem.EVENT_FLAG_COUNT): + checkboxes[i].visible = false + return + + for i in range(0, EventSystem.EVENT_FLAG_COUNT): + var cb = checkboxes[i] + cb.visible = true + cb.button_pressed = EVENT.eventIsAnyOfFlagsOn(selectedEvent, 1 << i) + +func open() -> void: + show() + +func close() -> void: + selectedEvent = -1 + _updateSelectedEvent() + hide() + +func isOpen() -> bool: + return self.visible + +func _on_EventFlagUpdated(event:EventSystem.SpecialEvent, flags:int) -> void: + _updateEventList() + _updateSelectedEvent() + +func _on_EventSelected(index:int) -> void: + selectedEvent = index + _updateSelectedEvent() + +func _on_CheckboxPressed() -> void: + if selectedEvent == -1: + return + + var value = 0 + for i in range(0, EventSystem.EVENT_FLAG_COUNT): + if checkboxes[i].button_pressed: + value |= (1 << i) + + EVENT.eventFlagSetTo(selectedEvent, value) diff --git a/scripts/UI/EventFlagMenu.gd.uid b/scripts/UI/EventFlagMenu.gd.uid new file mode 100644 index 0000000..c5b2d0a --- /dev/null +++ b/scripts/UI/EventFlagMenu.gd.uid @@ -0,0 +1 @@ +uid://b4a3ne2vn36mt