From 2c260e010399e045f11f7fa485ca850319226dce Mon Sep 17 00:00:00 2001 From: Henrique Campos Date: Sat, 22 Sep 2018 23:07:46 -0300 Subject: [PATCH] Refactor RPG Demo closes #263 - Rename dialog to dialogue - Give meaningful name to generic actors - Move combat screen content to turn_combat folder - Add new icon.png and .svg - Change combat UI to not emit a signal from its parent, instead pass parameters to a function and let the combat work on them there - Remove UI accessing deep layers on the hierarchy (get_parent().get_node("../etc/etc../etc...") - Fix defend() stacking, making the player invulnerable, now evey turn the Health.armor resets to a base_armor value - Remove useless Inventory button (maybe added again in the future when an inventory is added to the demo) --- 2d/role_playing_game/Game.gd | 52 +++ 2d/role_playing_game/Game.tscn | 74 +--- .../dialog_player/DialogPlayer.gd | 38 -- .../dialog_player/DialogPlayer.tscn | 12 - .../dialogue_data/npc.json} | 0 .../dialogue_data}/object.json | 0 .../dialogue_data}/player_lose.json | 2 +- .../dialogue_data}/player_won.json | 2 +- .../dialogue_player/DialoguePlayer.gd | 38 ++ .../dialogue_player/DialoguePlayer.tscn | 10 + .../dialogue/interface/Interface.gd | 34 ++ .../interface/Interface.tscn} | 44 +-- .../grid_movement/grid/Grid.gd | 36 ++ .../grid_movement/pawns/Character.gd | 7 + .../grid_movement/pawns/Character.tscn | 114 ++++++ .../grid_movement/pawns/Pawn.gd | 11 + .../grid_movement/pawns/Walker.gd | 45 +++ .../grid_movement/pawns/sprite.png | Bin 0 -> 1219 bytes .../grid_movement/pawns/sprite.png.import | 29 ++ 2d/role_playing_game/icon.png | Bin 3498 -> 3428 bytes 2d/role_playing_game/icon.png.import | 0 2d/role_playing_game/icon.svg | 341 ++++++++++++++++++ 2d/role_playing_game/icon.svg.import | 29 ++ 2d/role_playing_game/screens/combat/Combat.gd | 36 ++ .../screens/combat/Combat.tscn | 114 ++---- .../screens/combat/interface/Info.tscn | 72 ++++ .../screens/combat/interface/UI.gd | 33 +- .../screens/exploration/Exploration.tscn | 34 +- .../combatants/Combatant.gd} | 5 + .../turn_combat/combatants/Combatant.tscn | 21 ++ .../turn_combat/combatants/Opponent.gd | 15 + .../turn_combat/combatants/Opponent.tscn | 30 ++ .../turn_combat/combatants/Player.tscn | 13 + .../combatants}/health/Health.gd | 13 +- .../combatants}/health/Health.tscn | 7 +- .../combatants/sprites/Sprite.tscn | 63 ++++ .../turn_combat/combatants/sprites/blue.png | Bin 0 -> 1967 bytes .../combatants/sprites/blue.png.import | 29 ++ .../turn_combat/combatants/sprites/green.png | Bin 0 -> 1990 bytes .../combatants/sprites/green.png.import | 29 ++ .../turn_combat/combatants/sprites/shadow.png | Bin 0 -> 1147 bytes .../combatants/sprites/shadow.png.import | 29 ++ .../turn_combat/turn_queue/TurnQueue.gd | 52 +++ .../turn_combat/turn_queue/TurnQueue.tscn | 11 + .../turn_combat_system/actors/Actor.tscn | 14 - .../turn_queue/TurnQueue.gd | 52 --- .../turn_queue/TurnQueue.tscn | 11 - 47 files changed, 1240 insertions(+), 361 deletions(-) create mode 100644 2d/role_playing_game/Game.gd delete mode 100644 2d/role_playing_game/dialog_system/dialog_player/DialogPlayer.gd delete mode 100755 2d/role_playing_game/dialog_system/dialog_player/DialogPlayer.tscn rename 2d/role_playing_game/{dialog_system/dialogs/npc_01.json => dialogue/dialogue_data/npc.json} (100%) rename 2d/role_playing_game/{dialog_system/dialogs => dialogue/dialogue_data}/object.json (100%) rename 2d/role_playing_game/{dialog_system/dialogs => dialogue/dialogue_data}/player_lose.json (69%) rename 2d/role_playing_game/{dialog_system/dialogs => dialogue/dialogue_data}/player_won.json (87%) create mode 100644 2d/role_playing_game/dialogue/dialogue_player/DialoguePlayer.gd create mode 100644 2d/role_playing_game/dialogue/dialogue_player/DialoguePlayer.tscn create mode 100644 2d/role_playing_game/dialogue/interface/Interface.gd rename 2d/role_playing_game/{dialog_system/interface/DialogUI.tscn => dialogue/interface/Interface.tscn} (63%) create mode 100644 2d/role_playing_game/grid_movement/grid/Grid.gd create mode 100644 2d/role_playing_game/grid_movement/pawns/Character.gd create mode 100644 2d/role_playing_game/grid_movement/pawns/Character.tscn create mode 100644 2d/role_playing_game/grid_movement/pawns/Pawn.gd create mode 100644 2d/role_playing_game/grid_movement/pawns/Walker.gd create mode 100755 2d/role_playing_game/grid_movement/pawns/sprite.png create mode 100644 2d/role_playing_game/grid_movement/pawns/sprite.png.import mode change 100755 => 100644 2d/role_playing_game/icon.png.import create mode 100644 2d/role_playing_game/icon.svg create mode 100644 2d/role_playing_game/icon.svg.import create mode 100644 2d/role_playing_game/screens/combat/Combat.gd create mode 100644 2d/role_playing_game/screens/combat/interface/Info.tscn rename 2d/role_playing_game/{turn_combat_system/actors/Actor.gd => turn_combat/combatants/Combatant.gd} (83%) create mode 100644 2d/role_playing_game/turn_combat/combatants/Combatant.tscn create mode 100644 2d/role_playing_game/turn_combat/combatants/Opponent.gd create mode 100644 2d/role_playing_game/turn_combat/combatants/Opponent.tscn create mode 100644 2d/role_playing_game/turn_combat/combatants/Player.tscn rename 2d/role_playing_game/{turn_combat_system/actors => turn_combat/combatants}/health/Health.gd (69%) mode change 100755 => 100644 rename 2d/role_playing_game/{turn_combat_system/actors => turn_combat/combatants}/health/Health.tscn (58%) mode change 100755 => 100644 create mode 100644 2d/role_playing_game/turn_combat/combatants/sprites/Sprite.tscn create mode 100755 2d/role_playing_game/turn_combat/combatants/sprites/blue.png create mode 100644 2d/role_playing_game/turn_combat/combatants/sprites/blue.png.import create mode 100755 2d/role_playing_game/turn_combat/combatants/sprites/green.png create mode 100644 2d/role_playing_game/turn_combat/combatants/sprites/green.png.import create mode 100755 2d/role_playing_game/turn_combat/combatants/sprites/shadow.png create mode 100644 2d/role_playing_game/turn_combat/combatants/sprites/shadow.png.import create mode 100644 2d/role_playing_game/turn_combat/turn_queue/TurnQueue.gd create mode 100644 2d/role_playing_game/turn_combat/turn_queue/TurnQueue.tscn delete mode 100755 2d/role_playing_game/turn_combat_system/actors/Actor.tscn delete mode 100755 2d/role_playing_game/turn_combat_system/turn_queue/TurnQueue.gd delete mode 100755 2d/role_playing_game/turn_combat_system/turn_queue/TurnQueue.tscn diff --git a/2d/role_playing_game/Game.gd b/2d/role_playing_game/Game.gd new file mode 100644 index 00000000..3fbf5ee8 --- /dev/null +++ b/2d/role_playing_game/Game.gd @@ -0,0 +1,52 @@ +extends Node + +export (NodePath) var combat_screen +export (NodePath) var exploration_screen + +const PLAYER_WIN = "res://dialogue/dialogue_data/player_won.json" +const PLAYER_LOSE = "res://dialogue/dialogue_data/player_lose.json" + +func _ready(): + exploration_screen = get_node(exploration_screen) + combat_screen = get_node(combat_screen) + combat_screen.connect("combat_finished", self, "_on_combat_finished") + for n in $Exploration/Grid.get_children(): + if not n.type == n.ACTOR: + continue + if not n.has_node("DialoguePlayer"): + continue + n.get_node("DialoguePlayer").connect("dialogue_finished", self, + "_on_opponent_dialogue_finished", [n]) + remove_child(combat_screen) + +func _on_opponent_dialogue_finished(opponent): + if opponent.lost: + return + var player = $Exploration/Grid/Player + var combatents = [player.combat_actor, opponent.combat_actor] + start_combat(combatents) + +func start_combat(combat_actors): + remove_child($Exploration) + $AnimationPlayer.play("fade") + yield($AnimationPlayer, "animation_finished") + add_child(combat_screen) + combat_screen.show() + combat_screen.initialize(combat_actors) + $AnimationPlayer.play_backwards("fade") + +func _on_combat_finished(winner, loser): + remove_child(combat_screen) + $AnimationPlayer.play_backwards("fade") + add_child(exploration_screen) + var dialogue = load("res://dialogue/dialogue_player/DialoguePlayer.tscn").instance() + if winner.name == "Player": + dialogue.dialogue_file = PLAYER_WIN + else: + dialogue.dialogue_file = PLAYER_LOSE + yield($AnimationPlayer, "animation_finished") + var player = $Exploration/Grid/Player + exploration_screen.get_node("DialogueUI").show_dialogue(player, dialogue) + combat_screen.clear_combat() + yield(dialogue, "dialogue_finished") + dialogue.queue_free() diff --git a/2d/role_playing_game/Game.tscn b/2d/role_playing_game/Game.tscn index 920acdf5..844fab65 100644 --- a/2d/role_playing_game/Game.tscn +++ b/2d/role_playing_game/Game.tscn @@ -1,65 +1,10 @@ [gd_scene load_steps=5 format=2] -[ext_resource path="res://screens/combat/Combat.tscn" type="PackedScene" id=1] -[ext_resource path="res://screens/exploration/Exploration.tscn" type="PackedScene" id=2] +[ext_resource path="res://Game.gd" type="Script" id=1] +[ext_resource path="res://screens/combat/Combat.tscn" type="PackedScene" id=2] +[ext_resource path="res://screens/exploration/Exploration.tscn" type="PackedScene" id=3] -[sub_resource type="GDScript" id=1] - -script/source = "extends Node - -export (NodePath) var combat_screen -export (NodePath) var exploration_screen - -const PLAYER_WIN = \"res://dialog_system/dialogs/player_won.json\" -const PLAYER_LOSE = \"res://dialog_system/dialogs/player_lose.json\" - -func _ready(): - exploration_screen = get_node(exploration_screen) - combat_screen = get_node(combat_screen) - combat_screen.connect(\"combat_finished\", self, \"_on_combat_finished\") - for n in $Exploration/Grid.get_children(): - if not n.type == n.ACTOR: - continue - if not n.has_node(\"DialogPlayer\"): - continue - n.get_node(\"DialogPlayer\").connect(\"dialog_finished\", self, - \"_on_opponent_dialog_finished\", [n]) - remove_child(combat_screen) - -func _on_opponent_dialog_finished(opponent): - if opponent.lost: - return - var player = $Exploration/Grid/Player - var combatents = [player.combat_actor, opponent.combat_actor] - start_combat(combatents) - -func start_combat(combat_actors): - remove_child($Exploration) - $AnimationPlayer.play(\"fade\") - yield($AnimationPlayer, \"animation_finished\") - add_child(combat_screen) - combat_screen.show() - combat_screen.initialize(combat_actors) - $AnimationPlayer.play_backwards(\"fade\") - -func _on_combat_finished(winner, loser): - remove_child(combat_screen) - $AnimationPlayer.play_backwards(\"fade\") - add_child(exploration_screen) - var dialog = load(\"res://dialog_system/dialog_player/DialogPlayer.tscn\").instance() - if winner.name == \"Player\": - dialog.dialog_file = PLAYER_WIN - else: - dialog.dialog_file = PLAYER_LOSE - yield($AnimationPlayer, \"animation_finished\") - var player = $Exploration/Grid/Player - exploration_screen.get_node(\"DialogUI\").show_dialog(player, dialog) - combat_screen.clear_combat() - yield(dialog, \"dialog_finished\") - dialog.queue_free() -" - -[sub_resource type="Animation" id=2] +[sub_resource type="Animation" id=1] length = 0.5 loop = false @@ -77,9 +22,10 @@ tracks/0/keys = { "values": [ Color( 0.0703125, 0.0703125, 0.0703125, 0 ), Color( 0.0703125, 0.0703125, 0.0703125, 1 ) ] } -[node name="Game" type="Node"] +[node name="Game" type="Node" index="0"] -script = SubResource( 1 ) +script = ExtResource( 1 ) +_sections_unfolded = [ "Pause" ] combat_screen = NodePath("Combat") exploration_screen = NodePath("Exploration") @@ -90,7 +36,7 @@ autoplay = "" playback_process_mode = 1 playback_default_blend_time = 0.0 playback_speed = 1.0 -anims/fade = SubResource( 2 ) +anims/fade = SubResource( 1 ) blend_times = [ ] [node name="Transition" type="CanvasLayer" parent="." index="1"] @@ -118,10 +64,10 @@ size_flags_vertical = 1 color = Color( 0.0703125, 0.0703125, 0.0703125, 0 ) _sections_unfolded = [ "Focus", "Mouse", "Visibility" ] -[node name="Combat" parent="." index="2" instance=ExtResource( 1 )] +[node name="Combat" parent="." index="2" instance=ExtResource( 2 )] visible = false -[node name="Exploration" parent="." index="3" instance=ExtResource( 2 )] +[node name="Exploration" parent="." index="3" instance=ExtResource( 3 )] diff --git a/2d/role_playing_game/dialog_system/dialog_player/DialogPlayer.gd b/2d/role_playing_game/dialog_system/dialog_player/DialogPlayer.gd deleted file mode 100644 index 51f18e53..00000000 --- a/2d/role_playing_game/dialog_system/dialog_player/DialogPlayer.gd +++ /dev/null @@ -1,38 +0,0 @@ -extends Node - -export (String, FILE, "*.json") var dialog_file -var dialog_keys = [] -var dialog_name = "" -var current = 0 -var dialog_text = "" - -signal dialog_started -signal dialog_finished - -func start_dialog(): - emit_signal("dialog_started") - current = 0 - index_dialog() - dialog_text = dialog_keys[current].text - dialog_name = dialog_keys[current].name - -func next_dialog(): - current += 1 - if current == dialog_keys.size(): - emit_signal("dialog_finished") - return - dialog_text = dialog_keys[current].text - dialog_name = dialog_keys[current].name - -func index_dialog(): - var dialog = load_dialogue(dialog_file) - dialog_keys.clear() - for key in dialog: - dialog_keys.append(dialog[key]) - -func load_dialogue(file_path): - var file = File.new() - if file.file_exists(file_path): - file.open(file_path, file.READ) - var dialog = parse_json(file.get_as_text()) - return dialog diff --git a/2d/role_playing_game/dialog_system/dialog_player/DialogPlayer.tscn b/2d/role_playing_game/dialog_system/dialog_player/DialogPlayer.tscn deleted file mode 100755 index c13f92e2..00000000 --- a/2d/role_playing_game/dialog_system/dialog_player/DialogPlayer.tscn +++ /dev/null @@ -1,12 +0,0 @@ -[gd_scene load_steps=2 format=2] - -[ext_resource path="res://dialog_system/dialog_player/DialogPlayer.gd" type="Script" id=1] - - - -[node name="DialogPlayer" type="Node"] - -script = ExtResource( 1 ) -dialog_file = null - - diff --git a/2d/role_playing_game/dialog_system/dialogs/npc_01.json b/2d/role_playing_game/dialogue/dialogue_data/npc.json similarity index 100% rename from 2d/role_playing_game/dialog_system/dialogs/npc_01.json rename to 2d/role_playing_game/dialogue/dialogue_data/npc.json diff --git a/2d/role_playing_game/dialog_system/dialogs/object.json b/2d/role_playing_game/dialogue/dialogue_data/object.json similarity index 100% rename from 2d/role_playing_game/dialog_system/dialogs/object.json rename to 2d/role_playing_game/dialogue/dialogue_data/object.json diff --git a/2d/role_playing_game/dialog_system/dialogs/player_lose.json b/2d/role_playing_game/dialogue/dialogue_data/player_lose.json similarity index 69% rename from 2d/role_playing_game/dialog_system/dialogs/player_lose.json rename to 2d/role_playing_game/dialogue/dialogue_data/player_lose.json index 2bbe8817..2027cc2a 100755 --- a/2d/role_playing_game/dialog_system/dialogs/player_lose.json +++ b/2d/role_playing_game/dialogue/dialogue_data/player_lose.json @@ -1,3 +1,3 @@ { - "dialog_1" : {"name": "Opponent", "text": "Aha! I won, maybe you can try again next time"}, + "dialog_1" : {"name": "Opponent", "text": "Aha! I won, maybe you can try again next time"} } diff --git a/2d/role_playing_game/dialog_system/dialogs/player_won.json b/2d/role_playing_game/dialogue/dialogue_data/player_won.json similarity index 87% rename from 2d/role_playing_game/dialog_system/dialogs/player_won.json rename to 2d/role_playing_game/dialogue/dialogue_data/player_won.json index e9c95592..9eef0292 100755 --- a/2d/role_playing_game/dialog_system/dialogs/player_won.json +++ b/2d/role_playing_game/dialogue/dialogue_data/player_won.json @@ -1,3 +1,3 @@ { - "dialog_1" : {"name": "Opponent", "text": "Congratulations, you won!"}, + "dialog_1" : {"name": "Opponent", "text": "Congratulations, you won!"} } diff --git a/2d/role_playing_game/dialogue/dialogue_player/DialoguePlayer.gd b/2d/role_playing_game/dialogue/dialogue_player/DialoguePlayer.gd new file mode 100644 index 00000000..f9ee80b6 --- /dev/null +++ b/2d/role_playing_game/dialogue/dialogue_player/DialoguePlayer.gd @@ -0,0 +1,38 @@ +extends Node + +export (String, FILE, "*.json") var dialogue_file +var dialogue_keys = [] +var dialogue_name = "" +var current = 0 +var dialogue_text = "" + +signal dialogue_started +signal dialogue_finished + +func start_dialogue(): + emit_signal("dialogue_started") + current = 0 + index_dialogue() + dialogue_text = dialogue_keys[current].text + dialogue_name = dialogue_keys[current].name + +func next_dialogue(): + current += 1 + if current == dialogue_keys.size(): + emit_signal("dialogue_finished") + return + dialogue_text = dialogue_keys[current].text + dialogue_name = dialogue_keys[current].name + +func index_dialogue(): + var dialogue = load_dialogue(dialogue_file) + dialogue_keys.clear() + for key in dialogue: + dialogue_keys.append(dialogue[key]) + +func load_dialogue(file_path): + var file = File.new() + if file.file_exists(file_path): + file.open(file_path, file.READ) + var dialogue = parse_json(file.get_as_text()) + return dialogue diff --git a/2d/role_playing_game/dialogue/dialogue_player/DialoguePlayer.tscn b/2d/role_playing_game/dialogue/dialogue_player/DialoguePlayer.tscn new file mode 100644 index 00000000..8cf5eeca --- /dev/null +++ b/2d/role_playing_game/dialogue/dialogue_player/DialoguePlayer.tscn @@ -0,0 +1,10 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://dialogue/dialogue_player/DialoguePlayer.gd" type="Script" id=1] + +[node name="DialoguePlayer" type="Node"] + +script = ExtResource( 1 ) +dialogue_file = null + + diff --git a/2d/role_playing_game/dialogue/interface/Interface.gd b/2d/role_playing_game/dialogue/interface/Interface.gd new file mode 100644 index 00000000..f8909444 --- /dev/null +++ b/2d/role_playing_game/dialogue/interface/Interface.gd @@ -0,0 +1,34 @@ +extends Control + +var dialogue_node = null +func _ready(): + hide() + +func show_dialogue(player, dialogue): + show() + $Button.grab_focus() + dialogue_node = dialogue + for c in dialogue.get_signal_connection_list("dialogue_finished"): + if self == c.target: + dialogue_node.start_dialogue() + break + return + dialogue_node.connect("dialogue_started", player, "set_active", [false]) + dialogue_node.connect("dialogue_finished", player, "set_active", [true]) + dialogue_node.connect("dialogue_finished", self, "hide") + dialogue_node.connect("dialogue_finished", self, "_on_dialogue_finished", [player]) + dialogue_node.start_dialogue() + $Name.text = dialogue_node.dialogue_name + $Text.text = dialogue_node.dialogue_text + + +func _on_Button_button_up(): + dialogue_node.next_dialogue() + $Name.text = dialogue_node.dialogue_name + $Text.text = dialogue_node.dialogue_text + +func _on_dialogue_finished(player): + dialogue_node.disconnect("dialogue_started", player, "set_active") + dialogue_node.disconnect("dialogue_finished", player, "set_active") + dialogue_node.disconnect("dialogue_finished", self, "hide") + dialogue_node.disconnect("dialogue_finished", self, "_on_dialogue_finished") diff --git a/2d/role_playing_game/dialog_system/interface/DialogUI.tscn b/2d/role_playing_game/dialogue/interface/Interface.tscn similarity index 63% rename from 2d/role_playing_game/dialog_system/interface/DialogUI.tscn rename to 2d/role_playing_game/dialogue/interface/Interface.tscn index c9141627..aead33cf 100644 --- a/2d/role_playing_game/dialog_system/interface/DialogUI.tscn +++ b/2d/role_playing_game/dialogue/interface/Interface.tscn @@ -1,46 +1,10 @@ [gd_scene load_steps=3 format=2] [ext_resource path="res://theme/theme.tres" type="Theme" id=1] +[ext_resource path="res://dialogue/interface/Interface.gd" type="Script" id=2] -[sub_resource type="GDScript" id=1] -script/source = "extends Control - -var dialog_node = null -func _ready(): - hide() - -func show_dialog(player, dialog): - show() - $Button.grab_focus() - dialog_node = dialog - for c in dialog.get_signal_connection_list(\"dialog_finished\"): - if self == c.target: - dialog_node.start_dialog() - break - return - dialog_node.connect(\"dialog_started\", player, \"set_active\", [false]) - dialog_node.connect(\"dialog_finished\", player, \"set_active\", [true]) - dialog_node.connect(\"dialog_finished\", self, \"hide\") - dialog_node.connect(\"dialog_finished\", self, \"_on_dialog_finished\", [player]) - dialog_node.start_dialog() - $Name.text = dialog_node.dialog_name - $Text.text = dialog_node.dialog_text - - -func _on_Button_button_up(): - dialog_node.next_dialog() - $Name.text = dialog_node.dialog_name - $Text.text = dialog_node.dialog_text - -func _on_dialog_finished(player): - dialog_node.disconnect(\"dialog_started\", player, \"set_active\") - dialog_node.disconnect(\"dialog_finished\", player, \"set_active\") - dialog_node.disconnect(\"dialog_finished\", self, \"hide\") - dialog_node.disconnect(\"dialog_finished\", self, \"_on_dialog_finished\") -" - -[node name="DialogUI" type="Panel" index="0"] +[node name="Dialogue" type="Panel"] anchor_left = 0.0 anchor_top = 0.0 @@ -56,7 +20,7 @@ mouse_default_cursor_shape = 0 size_flags_horizontal = 1 size_flags_vertical = 1 theme = ExtResource( 1 ) -script = SubResource( 1 ) +script = ExtResource( 2 ) [node name="Name" type="RichTextLabel" parent="." index="0"] @@ -108,7 +72,7 @@ visible_characters = -1 percent_visible = 1.0 meta_underlined = true tab_size = 4 -text = "Dialog Text" +text = "Dialogue Text" scroll_active = true scroll_following = false selection_enabled = false diff --git a/2d/role_playing_game/grid_movement/grid/Grid.gd b/2d/role_playing_game/grid_movement/grid/Grid.gd new file mode 100644 index 00000000..4072c6ed --- /dev/null +++ b/2d/role_playing_game/grid_movement/grid/Grid.gd @@ -0,0 +1,36 @@ +extends TileMap + +enum CELL_TYPES { ACTOR, OBSTACLE, OBJECT } +export(NodePath) var dialogue_ui + +func _ready(): + for child in get_children(): + set_cellv(world_to_map(child.position), child.type) + + +func get_cell_pawn(cell, type = ACTOR): + for node in get_children(): + if node.type != type: + continue + if world_to_map(node.position) == cell: + return(node) + + +func request_move(pawn, direction): + var cell_start = world_to_map(pawn.position) + var cell_target = cell_start + direction + + var cell_tile_id = get_cellv(cell_target) + match cell_tile_id: + -1: + set_cellv(cell_target, ACTOR) + set_cellv(cell_start, -1) + return map_to_world(cell_target) + cell_size / 2 + OBJECT, ACTOR: + var target_pawn = get_cell_pawn(cell_target, cell_tile_id) + print("Cell %s contains %s" % [cell_target, target_pawn.name]) + + if not target_pawn.has_node("DialoguePlayer"): + return + get_node(dialogue_ui).show_dialogue(pawn, target_pawn.get_node("DialoguePlayer")) + diff --git a/2d/role_playing_game/grid_movement/pawns/Character.gd b/2d/role_playing_game/grid_movement/pawns/Character.gd new file mode 100644 index 00000000..d9115365 --- /dev/null +++ b/2d/role_playing_game/grid_movement/pawns/Character.gd @@ -0,0 +1,7 @@ +extends 'Pawn.gd' + +export (PackedScene) var combat_actor +var lost = false + +func _ready(): + set_process(false) diff --git a/2d/role_playing_game/grid_movement/pawns/Character.tscn b/2d/role_playing_game/grid_movement/pawns/Character.tscn new file mode 100644 index 00000000..ef33d44d --- /dev/null +++ b/2d/role_playing_game/grid_movement/pawns/Character.tscn @@ -0,0 +1,114 @@ +[gd_scene load_steps=5 format=2] + +[ext_resource path="res://grid_movement/pawns/Walker.gd" type="Script" id=1] +[ext_resource path="res://grid_movement/pawns/sprite.png" type="Texture" id=2] + + + + +[sub_resource type="Animation" id=1] + +resource_name = "bump" +length = 0.1 +loop = false +step = 0.01 +tracks/0/type = "value" +tracks/0/path = NodePath("Pivot/Sprite:position") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0, 0.02, 0.04, 0.06, 0.08, 0.1 ), +"transitions": PoolRealArray( 1, 1, 1, 1, 1, 1 ), +"update": 0, +"values": [ Vector2( 0, 0 ), Vector2( -1.5, -9 ), Vector2( 6.5, 2.5 ), Vector2( -11.5, 8.5 ), Vector2( 4, -5 ), Vector2( 0, 0 ) ] +} + +[sub_resource type="Animation" id=2] + +resource_name = "walk" +length = 0.25 +loop = false +step = 0.05 +tracks/0/type = "value" +tracks/0/path = NodePath("Pivot/Sprite:self_modulate") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = false +tracks/0/keys = { +"times": PoolRealArray( 0, 0.1, 0.25 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ Color( 1, 1, 1, 1 ), Color( 1, 0.9375, 0, 1 ), Color( 1, 1, 1, 1 ) ] +} +tracks/1/type = "value" +tracks/1/path = NodePath("Pivot/Sprite:position") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/keys = { +"times": PoolRealArray( 0, 0.1, 0.15, 0.25 ), +"transitions": PoolRealArray( 1, 0.303143, 2.61003, 1 ), +"update": 0, +"values": [ Vector2( 1.43051e-06, -1.90735e-06 ), Vector2( 1.43051e-06, -1.90735e-06 ), Vector2( 0, -20 ), Vector2( 1.43051e-06, -1.90735e-06 ) ] +} +tracks/2/type = "value" +tracks/2/path = NodePath("Pivot/Sprite:scale") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/keys = { +"times": PoolRealArray( 0, 0.05, 0.15, 0.25 ), +"transitions": PoolRealArray( 1, 0.354553, 1, 1 ), +"update": 0, +"values": [ Vector2( 1, 1 ), Vector2( 1.20007, 0.917384 ), Vector2( 0.916712, 1.13495 ), Vector2( 1, 1 ) ] +} + +[node name="Actor" type="Node2D"] + +position = Vector2( 32, 32 ) +z_index = 1 +script = ExtResource( 1 ) +_sections_unfolded = [ "Offset", "Transform", "Z Index" ] +__meta__ = { +"_edit_group_": true +} +type = 0 +combat_actor = null + +[node name="AnimationPlayer" type="AnimationPlayer" parent="." index="0"] + +root_node = NodePath("..") +autoplay = "" +playback_process_mode = 1 +playback_default_blend_time = 0.0 +playback_speed = 1.0 +anims/bump = SubResource( 1 ) +anims/walk = SubResource( 2 ) +blend_times = [ ] + +[node name="Tween" type="Tween" parent="." index="1"] + +repeat = false +playback_process_mode = 1 +playback_speed = 1.0 +playback/active = false +playback/repeat = false +playback/speed = 1.0 + +[node name="Pivot" type="Position2D" parent="." index="2"] + +_sections_unfolded = [ "Transform" ] + +[node name="Sprite" type="Sprite" parent="Pivot" index="0"] + +texture = ExtResource( 2 ) +centered = false +offset = Vector2( -32, -32 ) +_sections_unfolded = [ "Transform", "Visibility" ] + + diff --git a/2d/role_playing_game/grid_movement/pawns/Pawn.gd b/2d/role_playing_game/grid_movement/pawns/Pawn.gd new file mode 100644 index 00000000..02619e75 --- /dev/null +++ b/2d/role_playing_game/grid_movement/pawns/Pawn.gd @@ -0,0 +1,11 @@ +extends Node2D + +enum CELL_TYPES { ACTOR, OBSTACLE, OBJECT } +export(CELL_TYPES) var type = ACTOR + +var active = true setget set_active + +func set_active(value): + active = value + set_process(value) + set_process_input(value) diff --git a/2d/role_playing_game/grid_movement/pawns/Walker.gd b/2d/role_playing_game/grid_movement/pawns/Walker.gd new file mode 100644 index 00000000..ff40ea44 --- /dev/null +++ b/2d/role_playing_game/grid_movement/pawns/Walker.gd @@ -0,0 +1,45 @@ +extends 'Pawn.gd' + +onready var Grid = get_parent() +export (PackedScene) var combat_actor +var lost = false + +func _ready(): + update_look_direction(Vector2(1, 0)) + +func _process(delta): + var input_direction = get_input_direction() + if not input_direction: + return + update_look_direction(input_direction) + + var target_position = Grid.request_move(self, input_direction) + if target_position: + move_to(target_position) + $Tween.start() + else: + bump() + +func get_input_direction(): + return Vector2( + int(Input.is_action_pressed("ui_right")) - int(Input.is_action_pressed("ui_left")), + int(Input.is_action_pressed("ui_down")) - int(Input.is_action_pressed("ui_up")) + ) + +func update_look_direction(direction): + $Pivot/Sprite.rotation = direction.angle() + +func move_to(target_position): + set_process(false) + $AnimationPlayer.play("walk") + var move_direction = (position - target_position).normalized() + $Tween.interpolate_property($Pivot, "position", move_direction * 32, Vector2(), $AnimationPlayer.current_animation_length, Tween.TRANS_LINEAR, Tween.EASE_IN) + $Pivot/Sprite.position = position - target_position + position = target_position + + yield($AnimationPlayer, "animation_finished") + + set_process(true) + +func bump(): + $AnimationPlayer.play("bump") diff --git a/2d/role_playing_game/grid_movement/pawns/sprite.png b/2d/role_playing_game/grid_movement/pawns/sprite.png new file mode 100755 index 0000000000000000000000000000000000000000..7a24f309c47975fb744187f1cbd031282aa2baff GIT binary patch literal 1219 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 diff --git a/2d/role_playing_game/icon.png.import b/2d/role_playing_game/icon.png.import old mode 100755 new mode 100644 diff --git a/2d/role_playing_game/icon.svg b/2d/role_playing_game/icon.svg new file mode 100644 index 00000000..03d8eed1 --- /dev/null +++ b/2d/role_playing_game/icon.svg @@ -0,0 +1,341 @@ + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/2d/role_playing_game/icon.svg.import b/2d/role_playing_game/icon.svg.import new file mode 100644 index 00000000..94c18733 --- /dev/null +++ b/2d/role_playing_game/icon.svg.import @@ -0,0 +1,29 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/icon.svg-218a8f2b3041327d8a5756f3a245f83b.stex" + +[deps] + +source_file="res://icon.svg" +dest_files=[ "res://.import/icon.svg-218a8f2b3041327d8a5756f3a245f83b.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/2d/role_playing_game/screens/combat/Combat.gd b/2d/role_playing_game/screens/combat/Combat.gd new file mode 100644 index 00000000..f850ef09 --- /dev/null +++ b/2d/role_playing_game/screens/combat/Combat.gd @@ -0,0 +1,36 @@ +extends Node + +signal combat_finished(winner, loser) +const Combatant = preload("res://turn_combat/combatants/Combatant.gd") + +func initialize(combat_combatants): + for combatant in combat_combatants: + combatant = combatant.instance() + if combatant is Combatant: + $Combatants.add_combatant(combatant) + combatant.get_node("Health").connect("dead", self, "_on_combatant_death", [combatant]) + else: + combatant.queue_free() + $UI.initialize() + $TurnQueue.initialize() + +func _on_combatant_death(combatant): + var winner + if not combatant.name == "Player": + winner = $Combatants/Player + else: + for n in $Combatants.get_children(): + if not n.name == "Player": + winner = n + break + finish_combat(winner, combatant) + +func clear_combat(): + for n in $Combatants.get_children(): + n.queue_free() + for n in $UI/Combatants.get_children(): + n.queue_free() + +func finish_combat(winner, loser): + emit_signal("combat_finished", winner, loser) + diff --git a/2d/role_playing_game/screens/combat/Combat.tscn b/2d/role_playing_game/screens/combat/Combat.tscn index 95591e89..058edca9 100644 --- a/2d/role_playing_game/screens/combat/Combat.tscn +++ b/2d/role_playing_game/screens/combat/Combat.tscn @@ -1,69 +1,34 @@ [gd_scene load_steps=7 format=2] -[ext_resource path="res://turn_combat_system/turn_queue/TurnQueue.tscn" type="PackedScene" id=1] -[ext_resource path="res://theme/theme.tres" type="Theme" id=2] -[ext_resource path="res://screens/combat/interface/UI.gd" type="Script" id=3] -[ext_resource path="res://screens/combat/interface/ActorInfo.tscn" type="PackedScene" id=4] +[ext_resource path="res://screens/combat/Combat.gd" type="Script" id=1] +[ext_resource path="res://turn_combat/turn_queue/TurnQueue.tscn" type="PackedScene" id=2] +[ext_resource path="res://theme/theme.tres" type="Theme" id=3] +[ext_resource path="res://screens/combat/interface/UI.gd" type="Script" id=4] +[ext_resource path="res://screens/combat/interface/Info.tscn" type="PackedScene" id=5] [sub_resource type="GDScript" id=1] -script/source = "extends Node - -signal combat_finished(winner, loser) - -func initialize(combat_actors): - for actor in combat_actors: - actor = actor.instance() - if actor is load(\"res://turn_combat_system/actors/Actor.gd\"): - $Actors.add_actor(actor) - actor.get_node(\"Health\").connect(\"dead\", self, \"_on_actor_death\", [actor]) - else: - actor.queue_free() - $UI.initialize() - $TurnQueue.initialize() - $TurnQueue.play_turn() - $UI/Buttons/GridContainer/Attack.grab_focus() - -func _on_actor_death(actor): - var winner - if not actor.name == \"Player\": - winner = $Actors/Player - else: - for n in $Actors.get_children(): - if not n.name == \"Player\": - winner = n - break - emit_signal(\"combat_finished\", winner, actor) - -func clear_combat(): - for n in $Actors.get_children(): - n.queue_free() - for n in $UI/Actors.get_children(): - n.queue_free() -" - -[sub_resource type="GDScript" id=2] - script/source = "extends Node2D -func add_actor(actor): - actor.position.x += 200 * get_child_count() - add_child(actor)" +func add_combatant(new_combatant): + new_combatant.position.x += 200 * get_child_count() + add_child(new_combatant) +" -[node name="Combat" type="Node2D" index="0"] +[node name="Combat" type="Node2D"] -script = SubResource( 1 ) +script = ExtResource( 1 ) -[node name="TurnQueue" parent="." index="0" instance=ExtResource( 1 )] - -actors_node = NodePath("../Actors") - -[node name="Actors" type="Node2D" parent="." index="1"] +[node name="Combatants" type="Node2D" parent="." index="0"] position = Vector2( 539, 275 ) -script = SubResource( 2 ) +script = SubResource( 1 ) _sections_unfolded = [ "Transform" ] +[node name="TurnQueue" parent="." index="1" instance=ExtResource( 2 )] + +combatants_list = NodePath("../Combatants") + [node name="UI" type="Control" parent="." index="2"] anchor_left = 0.0 @@ -78,13 +43,13 @@ mouse_filter = 0 mouse_default_cursor_shape = 0 size_flags_horizontal = 1 size_flags_vertical = 1 -theme = ExtResource( 2 ) -script = ExtResource( 3 ) +theme = ExtResource( 3 ) +script = ExtResource( 4 ) _sections_unfolded = [ "Theme" ] -actors_node = NodePath("../Actors") -actor_info = ExtResource( 4 ) +combatants_node = NodePath("../Combatants") +info_scene = ExtResource( 5 ) -[node name="Actors" type="HBoxContainer" parent="UI" index="0"] +[node name="Combatants" type="HBoxContainer" parent="UI" index="0"] anchor_left = 0.0 anchor_top = 0.0 @@ -147,7 +112,7 @@ anchor_top = 0.0 anchor_right = 0.0 anchor_bottom = 0.0 margin_right = 468.0 -margin_bottom = 119.0 +margin_bottom = 121.0 rect_pivot_offset = Vector2( 0, 0 ) rect_clip_content = false focus_mode = 2 @@ -171,7 +136,7 @@ anchor_right = 0.0 anchor_bottom = 0.0 margin_left = 472.0 margin_right = 940.0 -margin_bottom = 119.0 +margin_bottom = 121.0 rect_pivot_offset = Vector2( 0, 0 ) rect_clip_content = false focus_mode = 2 @@ -187,40 +152,15 @@ text = "Defend" flat = false align = 1 -[node name="Inventory" type="Button" parent="UI/Buttons/GridContainer" index="2"] +[node name="Flee" type="Button" parent="UI/Buttons/GridContainer" index="2"] anchor_left = 0.0 anchor_top = 0.0 anchor_right = 0.0 anchor_bottom = 0.0 -margin_top = 123.0 +margin_top = 125.0 margin_right = 468.0 -margin_bottom = 242.0 -rect_pivot_offset = Vector2( 0, 0 ) -rect_clip_content = false -focus_mode = 2 -mouse_filter = 0 -mouse_default_cursor_shape = 0 -size_flags_horizontal = 3 -size_flags_vertical = 3 -toggle_mode = false -enabled_focus_mode = 2 -shortcut = null -group = null -text = "Inventory" -flat = false -align = 1 - -[node name="Flee" type="Button" parent="UI/Buttons/GridContainer" index="3"] - -anchor_left = 0.0 -anchor_top = 0.0 -anchor_right = 0.0 -anchor_bottom = 0.0 -margin_left = 472.0 -margin_top = 123.0 -margin_right = 940.0 -margin_bottom = 242.0 +margin_bottom = 246.0 rect_pivot_offset = Vector2( 0, 0 ) rect_clip_content = false focus_mode = 2 diff --git a/2d/role_playing_game/screens/combat/interface/Info.tscn b/2d/role_playing_game/screens/combat/interface/Info.tscn new file mode 100644 index 00000000..2325b521 --- /dev/null +++ b/2d/role_playing_game/screens/combat/interface/Info.tscn @@ -0,0 +1,72 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://theme/labels/Title.tscn" type="PackedScene" id=1] + +[node name="Info" type="PanelContainer"] + +anchor_left = 0.0 +anchor_top = 0.0 +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_right = 409.0 +margin_bottom = 239.0 +rect_pivot_offset = Vector2( 0, 0 ) +rect_clip_content = false +mouse_filter = 0 +mouse_default_cursor_shape = 0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="VBoxContainer" type="VBoxContainer" parent="." index="0"] + +anchor_left = 0.0 +anchor_top = 0.0 +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_left = 7.0 +margin_top = 7.0 +margin_right = 402.0 +margin_bottom = 232.0 +rect_pivot_offset = Vector2( 0, 0 ) +rect_clip_content = false +mouse_filter = 1 +mouse_default_cursor_shape = 0 +size_flags_horizontal = 1 +size_flags_vertical = 1 +alignment = 0 + +[node name="Name" parent="VBoxContainer" index="0" instance=ExtResource( 1 )] + +margin_right = 395.0 +margin_bottom = 110.0 +size_flags_horizontal = 3 +size_flags_vertical = 7 +text = "{name}" +_sections_unfolded = [ "Rect", "Size Flags", "custom_colors", "custom_constants", "custom_fonts" ] + +[node name="Health" type="ProgressBar" parent="VBoxContainer" index="1"] + +anchor_left = 0.0 +anchor_top = 0.0 +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 161.0 +margin_right = 395.0 +margin_bottom = 177.0 +rect_pivot_offset = Vector2( 0, 0 ) +rect_clip_content = false +mouse_filter = 0 +mouse_default_cursor_shape = 0 +size_flags_horizontal = 1 +size_flags_vertical = 6 +min_value = 0.0 +max_value = 10.0 +step = 1.0 +page = 0.0 +value = 5.0 +exp_edit = false +rounded = true +percent_visible = false +_sections_unfolded = [ "Percent", "Size Flags" ] + + diff --git a/2d/role_playing_game/screens/combat/interface/UI.gd b/2d/role_playing_game/screens/combat/interface/UI.gd index b138710a..14e2abe2 100644 --- a/2d/role_playing_game/screens/combat/interface/UI.gd +++ b/2d/role_playing_game/screens/combat/interface/UI.gd @@ -1,34 +1,37 @@ extends Control -export (NodePath) var actors_node -export (PackedScene) var actor_info +export (NodePath) var combatants_node +export (PackedScene) var info_scene func _ready(): - actors_node = get_node(actors_node) + combatants_node = get_node(combatants_node) func initialize(): - for actor in actors_node.get_children(): - var health = actor.get_node("Health") - var info = actor_info.instance() + for combatant in combatants_node.get_children(): + var health = combatant.get_node("Health") + var info = info_scene.instance() var health_info = info.get_node("VBoxContainer/Health") health_info.value = health.life health_info.max_value = health.max_life - info.get_node("VBoxContainer/Name").text = actor.name + info.get_node("VBoxContainer/Name").text = combatant.name health.connect("health_changed", health_info, "set_value") - $Actors.add_child(info) + $Combatants.add_child(info) + $Buttons/GridContainer/Attack.grab_focus() func _on_Attack_button_up(): - if not actors_node.get_node("Player").active: + if not combatants_node.get_node("Player").active: return - actors_node.get_node("Player").attack(actors_node.get_node("Opponent")) + combatants_node.get_node("Player").attack(combatants_node.get_node("Opponent")) func _on_Defend_button_up(): - if not actors_node.get_node("Player").active: + if not combatants_node.get_node("Player").active: return - actors_node.get_node("Player").defend() + combatants_node.get_node("Player").defend() func _on_Flee_button_up(): - if not actors_node.get_node("Player").active: + if not combatants_node.get_node("Player").active: return - actors_node.get_node("Player").flee() - get_parent().emit_signal("combat_finished", $"../Actors/Opponent", $"../Actors/Player") + combatants_node.get_node("Player").flee() + var loser = combatants_node.get_node("Player") + var winner = combatants_node.get_node("Opponent") + get_parent().finish_combat(winner, loser) diff --git a/2d/role_playing_game/screens/exploration/Exploration.tscn b/2d/role_playing_game/screens/exploration/Exploration.tscn index 400a6943..9c2c8fd3 100644 --- a/2d/role_playing_game/screens/exploration/Exploration.tscn +++ b/2d/role_playing_game/screens/exploration/Exploration.tscn @@ -3,15 +3,13 @@ [ext_resource path="res://grid_movement/tilesets/grid_lines/grid_lines_tileset.tres" type="TileSet" id=1] [ext_resource path="res://grid_movement/tilesets/grid/grid_tileset.tres" type="TileSet" id=2] [ext_resource path="res://grid_movement/grid/Grid.gd" type="Script" id=3] -[ext_resource path="res://grid_movement/pawns/Actor.tscn" type="PackedScene" id=4] -[ext_resource path="res://screens/combat/actors/Player.tscn" type="PackedScene" id=5] -[ext_resource path="res://grid_movement/pawns/IdleActor.gd" type="Script" id=6] -[ext_resource path="res://screens/combat/actors/Opponent.tscn" type="PackedScene" id=7] -[ext_resource path="res://dialog_system/dialog_player/DialogPlayer.tscn" type="PackedScene" id=8] -[ext_resource path="res://grid_movement/pawns/pawn.gd" type="Script" id=9] -[ext_resource path="res://dialog_system/interface/DialogUI.tscn" type="PackedScene" id=10] - - +[ext_resource path="res://grid_movement/pawns/Character.tscn" type="PackedScene" id=4] +[ext_resource path="res://turn_combat/combatants/Player.tscn" type="PackedScene" id=5] +[ext_resource path="res://grid_movement/pawns/Character.gd" type="Script" id=6] +[ext_resource path="res://turn_combat/combatants/Opponent.tscn" type="PackedScene" id=7] +[ext_resource path="res://dialogue/dialogue_player/DialoguePlayer.tscn" type="PackedScene" id=8] +[ext_resource path="res://grid_movement/pawns/Pawn.gd" type="Script" id=9] +[ext_resource path="res://dialogue/interface/Interface.tscn" type="PackedScene" id=10] [node name="Exploration" type="Node2D"] @@ -66,7 +64,7 @@ _sections_unfolded = [ "Visibility" ] __meta__ = { "_edit_lock_": true } -dialog_ui = NodePath("../DialogUI") +dialogue_ui = NodePath("../DialogueUI") [node name="Player" parent="Grid" index="0" instance=ExtResource( 4 )] @@ -81,9 +79,9 @@ rotation = -1.5708 script = ExtResource( 6 ) combat_actor = ExtResource( 7 ) -[node name="DialogPlayer" parent="Grid/Opponent" index="3" instance=ExtResource( 8 )] +[node name="DialoguePlayer" parent="Grid/Opponent" index="3" instance=ExtResource( 8 )] -dialog_file = "res://dialog_system/dialogs/npc_01.json" +dialogue_file = "res://dialogue/dialogue_data/npc.json" [node name="Timer" type="Timer" parent="Grid/Opponent" index="4"] @@ -94,20 +92,16 @@ autostart = true [node name="Object" type="Node2D" parent="Grid" index="2"] -editor/display_folded = true position = Vector2( 544, 288 ) script = ExtResource( 9 ) type = 2 -combat_actor = null -[node name="DialogPlayer" parent="Grid/Object" index="0" instance=ExtResource( 8 )] +[node name="DialoguePlayer" parent="Grid/Object" index="0" instance=ExtResource( 8 )] -dialog_file = "res://dialog_system/dialogs/object.json" +dialogue_file = "res://dialogue/dialogue_data/object.json" -[node name="DialogUI" parent="." index="2" instance=ExtResource( 10 )] +[node name="DialogueUI" parent="." index="2" instance=ExtResource( 10 )] -[connection signal="dialog_finished" from="Grid/Opponent/DialogPlayer" to="Grid/Opponent" method="set_active" binds= [ true ]] - -[connection signal="dialog_started" from="Grid/Opponent/DialogPlayer" to="Grid/Opponent" method="set_active" binds= [ false ]] +visible = false diff --git a/2d/role_playing_game/turn_combat_system/actors/Actor.gd b/2d/role_playing_game/turn_combat/combatants/Combatant.gd similarity index 83% rename from 2d/role_playing_game/turn_combat_system/actors/Actor.gd rename to 2d/role_playing_game/turn_combat/combatants/Combatant.gd index 21fbde3a..afe9dd9d 100644 --- a/2d/role_playing_game/turn_combat_system/actors/Actor.gd +++ b/2d/role_playing_game/turn_combat/combatants/Combatant.gd @@ -11,6 +11,11 @@ func set_active(value): set_process(value) set_process_input(value) + if not active: + return + if $Health.armor >= $Health.base_armor + defense: + $Health.armor = $Health.base_armor + func attack(target): target.take_damage(damage) emit_signal("turn_finished") diff --git a/2d/role_playing_game/turn_combat/combatants/Combatant.tscn b/2d/role_playing_game/turn_combat/combatants/Combatant.tscn new file mode 100644 index 00000000..0f52624a --- /dev/null +++ b/2d/role_playing_game/turn_combat/combatants/Combatant.tscn @@ -0,0 +1,21 @@ +[gd_scene load_steps=4 format=2] + +[ext_resource path="res://turn_combat/combatants/Combatant.gd" type="Script" id=1] +[ext_resource path="res://turn_combat/combatants/health/Health.tscn" type="PackedScene" id=2] +[ext_resource path="res://turn_combat/combatants/sprites/Sprite.tscn" type="PackedScene" id=3] + + +[node name="Combatant" type="Node2D"] + +script = ExtResource( 1 ) +damage = 2 +defense = 1 + +[node name="Health" parent="." index="0" instance=ExtResource( 2 )] + +life = 10 +base_armor = 0 + +[node name="Sprite" parent="." index="1" instance=ExtResource( 3 )] + + diff --git a/2d/role_playing_game/turn_combat/combatants/Opponent.gd b/2d/role_playing_game/turn_combat/combatants/Opponent.gd new file mode 100644 index 00000000..5512d456 --- /dev/null +++ b/2d/role_playing_game/turn_combat/combatants/Opponent.gd @@ -0,0 +1,15 @@ +extends "Combatant.gd" + +func set_active(value): + .set_active(value) + if not active: + return + + $Timer.start() + yield($Timer, "timeout") + var target + for actor in get_parent().get_children(): + if not actor == self: + target = actor + break + attack(target) diff --git a/2d/role_playing_game/turn_combat/combatants/Opponent.tscn b/2d/role_playing_game/turn_combat/combatants/Opponent.tscn new file mode 100644 index 00000000..6388cb65 --- /dev/null +++ b/2d/role_playing_game/turn_combat/combatants/Opponent.tscn @@ -0,0 +1,30 @@ +[gd_scene load_steps=4 format=2] + +[ext_resource path="res://turn_combat/combatants/Combatant.tscn" type="PackedScene" id=1] +[ext_resource path="res://turn_combat/combatants/Opponent.gd" type="Script" id=2] +[ext_resource path="res://turn_combat/combatants/sprites/green.png" type="Texture" id=3] + +[node name="Opponent" instance=ExtResource( 1 )] + +script = ExtResource( 2 ) +_sections_unfolded = [ "Transform" ] +damage = 3 + +[node name="Health" parent="." index="0"] + +life = 7 +max_life = 7 + +[node name="Body" parent="Sprite/Pivot" index="1"] + +texture = ExtResource( 3 ) + +[node name="Timer" type="Timer" parent="." index="2"] + +process_mode = 1 +wait_time = 0.25 +one_shot = true +autostart = false + + +[editable path="Sprite"] diff --git a/2d/role_playing_game/turn_combat/combatants/Player.tscn b/2d/role_playing_game/turn_combat/combatants/Player.tscn new file mode 100644 index 00000000..26f911de --- /dev/null +++ b/2d/role_playing_game/turn_combat/combatants/Player.tscn @@ -0,0 +1,13 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://turn_combat/combatants/Combatant.tscn" type="PackedScene" id=1] + +[node name="Player" instance=ExtResource( 1 )] + +_sections_unfolded = [ "Transform" ] + +[node name="Health" parent="." index="0"] + +base_armor = 1 + + diff --git a/2d/role_playing_game/turn_combat_system/actors/health/Health.gd b/2d/role_playing_game/turn_combat/combatants/health/Health.gd old mode 100755 new mode 100644 similarity index 69% rename from 2d/role_playing_game/turn_combat_system/actors/health/Health.gd rename to 2d/role_playing_game/turn_combat/combatants/health/Health.gd index 918f8c9e..b1404ab5 --- a/2d/role_playing_game/turn_combat_system/actors/health/Health.gd +++ b/2d/role_playing_game/turn_combat/combatants/health/Health.gd @@ -5,13 +5,16 @@ signal health_changed(life) export var life = 0 export var max_life = 10 -export var armor = 0 +export var base_armor = 0 +var armor = 0 + +func _ready(): + armor = base_armor func take_damage(damage): - var applied_damage = max(damage - armor, 0) - life = max(life - applied_damage, 0) - if life == 0: - emit_signal('dead') + life = life - damage + armor + if life <= 0: + emit_signal("dead") else: emit_signal("health_changed", life) diff --git a/2d/role_playing_game/turn_combat_system/actors/health/Health.tscn b/2d/role_playing_game/turn_combat/combatants/health/Health.tscn old mode 100755 new mode 100644 similarity index 58% rename from 2d/role_playing_game/turn_combat_system/actors/health/Health.tscn rename to 2d/role_playing_game/turn_combat/combatants/health/Health.tscn index 8814d2ec..49d34762 --- a/2d/role_playing_game/turn_combat_system/actors/health/Health.tscn +++ b/2d/role_playing_game/turn_combat/combatants/health/Health.tscn @@ -1,6 +1,11 @@ [gd_scene load_steps=2 format=2] -[ext_resource path="res://turn_combat_system/actors/health/Health.gd" type="Script" id=1] +[ext_resource path="res://turn_combat/combatants/health/Health.gd" type="Script" id=1] + + + + + [node name="Health" type="Node"] diff --git a/2d/role_playing_game/turn_combat/combatants/sprites/Sprite.tscn b/2d/role_playing_game/turn_combat/combatants/sprites/Sprite.tscn new file mode 100644 index 00000000..8091371f --- /dev/null +++ b/2d/role_playing_game/turn_combat/combatants/sprites/Sprite.tscn @@ -0,0 +1,63 @@ +[gd_scene load_steps=4 format=2] + +[ext_resource path="res://turn_combat/combatants/sprites/shadow.png" type="Texture" id=1] +[ext_resource path="res://turn_combat/combatants/sprites/blue.png" type="Texture" id=2] + + + + +[sub_resource type="Animation" id=1] + +resource_name = "take_damage" +length = 0.2 +loop = false +step = 0.05 +tracks/0/type = "value" +tracks/0/path = NodePath("Pivot/Body:modulate") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0, 0.05, 0.1, 0.15, 0.2 ), +"transitions": PoolRealArray( 1, 1, 1, 1, 1 ), +"update": 0, +"values": [ Color( 1, 1, 1, 1 ), Color( 3, 0.253906, 0.253906, 1 ), Color( 1, 1, 1, 1 ), Color( 3, 0.253906, 0.253906, 1 ), Color( 1, 1, 1, 1 ) ] +} + +[node name="Sprite" type="Node2D"] + +[node name="AnimationPlayer" type="AnimationPlayer" parent="." index="0"] + +root_node = NodePath("..") +autoplay = "" +playback_process_mode = 1 +playback_default_blend_time = 0.0 +playback_speed = 1.0 +anims/take_damage = SubResource( 1 ) +blend_times = [ ] + +[node name="Tween" type="Tween" parent="." index="1"] + +repeat = false +playback_process_mode = 1 +playback_speed = 1.0 +playback/active = false +playback/repeat = false +playback/speed = 1.0 + +[node name="Pivot" type="Position2D" parent="." index="2"] + +[node name="Shadow" type="Sprite" parent="Pivot" index="0"] + +position = Vector2( 0, -15 ) +texture = ExtResource( 1 ) +_sections_unfolded = [ "Transform" ] + +[node name="Body" type="Sprite" parent="Pivot" index="1"] + +position = Vector2( 0, -76 ) +texture = ExtResource( 2 ) +_sections_unfolded = [ "Visibility" ] + + diff --git a/2d/role_playing_game/turn_combat/combatants/sprites/blue.png b/2d/role_playing_game/turn_combat/combatants/sprites/blue.png new file mode 100755 index 0000000000000000000000000000000000000000..b6627765b02ac464260ec625eafd4be083ed4645 GIT binary patch literal 1967 zcmd6o`8(8&8pglYCTohZhOG748bVoz#+oLHtTEn^U1QBMgBgUeoDs5SDcK5>osbY^ zd9%FC7)y*Lyi8-sK5?AC;G7@Nb6ub3zV7FGe!73T@s@BCZVnL+006knOkq}M3Oyqq z#D2EN(h5}1gf+;}%o=ny7?4}ynLqDuY99muyc7R{sq(Larn94Pu#sKx1C)DksB7S3 zAT%^o+3Sf<5YpBEu`(*qBmbw42mqW@G=mvfhrOf~%%a3>g%gT`-1U7m;YecsWXS8u zYA-QarxA0|SRb6t$tIK2oai7Em-gsLkY8CU33dv=DleI{f|L`ji>>HMV=dQAi>2Ox zGskO?@-?)ZCr{hI6LP~_@dcFKDSJ`03lUw|7Cubb+BtF8mC$~7xkoOnVLvujimGN9 z)`x%tCb)CB19wt=>Jly-0ppTz3>$U}_t-Qf(*kV~1G(c{u?q5r3d9)9r4IK&SzbnO zH>K-i&FOd4c07{~>A3l!3!{j6j;-DAVii9Q;`DWSgOcAF%o;qn1vvHwPn)`El?dhGUwtf#x8S0yA z01bSne$DCutF#JF$LQ~4&ss@rQ+5reH=Zh6Eaz}fFKvD`o9FLwQrswI^072?b3%FR z7BS!L@74usiqHpQ=jblsMYp$hfl6ooz#*Q1&019u_x(OxTf?)^=9@gntG^!97@c;A ze-`tBudmKvBe?`sn8);9fu$9*@P%Lf)DoSP;iCUAPRouQ21^m*{W(8?JptUIf`%0@-}9s>PL4BFsge!Z%IRlJ4Y&oVzoeFn7-5) zMv-qZj4b%}V>qxVEUrC^%f1>WNY23=aA2w0(Z9sKd<%iRhsM+5`iARx@ZQA|iB!lo zeRSe6ZmmSgpq^&h_)=~R(=KOxXXOg_m&>KgVL@H5rlH<$Glg}oSBH(|HJZdfMNFKM zRQi(bMR+ByR@ftp8ifiI!J>p4*49<&Z;~Q7jSAlzuO@=`OZRN7-=_2LyBGH)x$Z`~ za>;my9#8xv;mLi;!)~IAmTh%zy2PP-ptqNhKlj22T6f+o@2ZsT@fhjmbu_ol$tVMU zOny$l6!TOI(7@IZz~ss4xyU>M9_eE%Rw_>AggQb+1+h(7jiO_q2}4%nzmm;){x(Qv z23}sbmD1~ADx>%`d7q{!0M%Mlt4~{mYu%F*lx$nN4MR%iZcd&;U&bG?hNv$$+mMDV zlo1&3+}2)omz$FUiBLJww0?GrZ*CRD8xM9UkLnu-T_FW4 z8P9d@p7ZvMta#FcYOE5)N`QKh$%6FuZ|W#LBrw!ZFIeH=mp)YIP06XXV}Jd^ z--~|I9@UbmWCuPNPug^C5E`1Ttgx2d^2p}Ms)k5RU0LH~c|dnb(E_095Cw`fewI8TZ9b0_GNcK;HQ zman}lES!j#c^eL%1SSd&-?8--Z~2uw+{vs}x~iHyR-^xeFzE7_i;W z)PPkN-W82H%}(_fuE3M-N*OQsa}X<|R^poZqP=m9)f;ttuJ;GyT=z!~)lQwRRoyy9 z(buB8KGDsqCrNUNm$k5D%LF{?@cuLHn5D=ViY%j_tvk4Bi67=Hq(%On;90x0JS?qC zkLF#!bH>@Yxc6NJD-O9YTuu@ za10)4S89r|IKNF>kDUEo%1)kr8XM_xA`T*m-sH7jG{X^c^v(y$lYPWB!p^~N9rX-; zLB2Y~gXWkoPM5W)Eph!A#vOPh4C_YjMrCO3@|ms-(#y7^wuKG8A#UPFcs5K_GR5M< r5kgcXXj39BxGL}iHc3K*$_7a4m zt%^D&29r_LzC_iQAa=34?jLZ^xgYO)&hLHB^Pcz9^X2*7+0jN2A_)Ni0D`t~OP4b> zJtLq0+}R#@LWZ6RPo%l6EC1Qx`F+#Qyg)b{83_Og5B&#VC4<~_c9g(cA+UGD{IM|) zF@AuUm>7+q$03oA9)|mAgkb{mIYyEI0H1}erI{=4)hgLDRN7slD{=8}&cX0#)CwZV zM^8811?H%EQ2PfnHZ&}I2CpsZEOK?323jYHZDR(o=|-b;xA3D$ zu)4t}Dfrv9^Hbh2KtWTiP8ZT*fuLVuc606Fj@&VRcV{}l_yvLm{AQUXb)Z`k>G}BzlK!p^Xo57L>|_^BfFWV_bUO9F`< z_5s@@e2q6%JyiKxud(0LRZ_puyVy2#datrQ2lNMd`M|K^3Sra-hOX?RmKxi;JtGZA zug=zh9*K@s+d%JFK`%Y}T@-nq`6+yJAmckx0oau=8YNwofMnmu^3+=S5SBjNr0C{$ zV$)4q@P*1+j4a2V+Fc(U94akCROu%aEe_bX`w$7mChUV;DBI!n41ZKqq|y3@6!u-0 z`}R}>FNfJ2Qxyuc?UbVqCg z5r8+qAW0^zQ$2eKFI->;_uFx+(~bjhDOpB=4f`!`Z7D5sX}vK$L{|RZ{MP=Lk}8u774bf%+_c_E)r*e!VU4bP)!!3Mn~aQI z-&K`=Q*iAoUVC9{y{ITXOx84{H$YBSK~k$7(-<~12$;THJHx{D_7QolgpKvvZ^Qh1 zq@#}0ECmseVKA=@gYRSE$n*@Y56IX84-FZ|8I~(zYE-#V4#~`q`5qj}(@gpSiMI;o z@f7!9zHR%9r9ujs(w&qCW#6LYj?1Yvr6{45JSNORxl^_3D?;M=c>{ieZjMdjJ7v)! zGn`YjMHHG=UDRWXb}+^(PgD@|_9AyuT>?(@ouc$tzXyhEznmyKXML3`4Z^4Jn=sj{(gZAS;M;LesB zxT%s??_c4t=CY=#2zpefxuKVhp;y-)Le*2UY;0^dEI8!PE7TG|h?vE{T3)^wrAGX- z3xU(6SWYVep1n8GXmDLe^JE5Oee2FS<57E+2(HgvU0rb{dQ471YX)hRb6te2YCxH5 zArz9r=LamFP2dTx^~6N41b!3L!Tl@e>(Yh!KK|t!Z2wE`FVL4BH9{+$xx3e$6IG6{GzG6x&CaprGphs|~SXLX`ed=fq@?-TmwNS>dF7 zF1GgKf6eTF4)_23v7bkdT(^Hp#lE+xA|@~1k$R-cG83tyV_LcZ4U+H0s`vI`aUS+R z&Gd=w=$4wb%2k(WmC9LBC2nvSLV?NgdWbyR`JStlpGsWDlF%VTEs`M*&Wk^-l%_wX zJ^OqW&Jd-6s+($A__$Np=Q(^oS8#BUwSFSjx4nIVhN?R^`HuVGq=9ogNqBdpJ-aeL zXfr?X*58YQdgbQILjx0WJSZ?u=|HU_S%P-!0!dM~v(!7w52t@A;jnklnw)$(EkMJv z3oVAnuOw*=ung$*9I<$mH?g1U+Rv_aHsKscGj;eUA^B;B;7lH6B@tvw4HJTbi4oVN zYEY!7aDVgb!HD^tv1H23SNDSDlal^j_1A_7lC?I25v8pynyaU_flKM`MlNh71X`9- zW@nNMXl)F4h^#1XgM0Z4*Q6eO5od(ZqvzPo!^`S#l%`qgc!X7>q&H(N6tW*;wL2*| zB|HO+a7ML;*RRF2`*dskQ800+!)pS3D}G3%zOYeS_#Tw(0)K z{k)U4bvwR|Usx^gs5_Ee*tFzMTn%~RmSbDI^5+BAhok7qb}JKM{lxlH&Fr*ep3y?! zepE(t!kqe%tJMyzGcQ#v0TjOdA>M0Ti`n>G6GYX?cyByMVBVM~8#5!Ri66SFKH{8S zu|j*SzZH8_T8QrgWlV2lTrjU^y-i%#3*2@cP|G86h3tF}7VrdoSHZb@@q!KCS?2<5 MtsE_D%)OKT4V^fxn*aa+ literal 0 HcmV?d00001 diff --git a/2d/role_playing_game/turn_combat/combatants/sprites/green.png.import b/2d/role_playing_game/turn_combat/combatants/sprites/green.png.import new file mode 100644 index 00000000..1ae9a485 --- /dev/null +++ b/2d/role_playing_game/turn_combat/combatants/sprites/green.png.import @@ -0,0 +1,29 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/green.png-0c539b10234a7340c6135a5edb21b0e1.stex" + +[deps] + +source_file="res://turn_combat/combatants/sprites/green.png" +dest_files=[ "res://.import/green.png-0c539b10234a7340c6135a5edb21b0e1.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/2d/role_playing_game/turn_combat/combatants/sprites/shadow.png b/2d/role_playing_game/turn_combat/combatants/sprites/shadow.png new file mode 100755 index 0000000000000000000000000000000000000000..3112816c3706b948eba590709a5cc9f9b354cbf5 GIT binary patch literal 1147 zcmV->1cdvEP)ArtgQxwpy`2cm7|em( zH*8vrpFQK|hb{HDM8tfwTR1(JMqhAcc1p||foF^TcnR669mtBPDz=b1C_ z{Igl`rsnm2J9^Nm%K(SBMP4|V@*MAdbUOZ9zM#D3^$ZNZZ6;TNJ=-cR9L$N5NG0Rf zHwxHr-s`vnVV&?enV&Ap*Hwsv{=PmTOF`(>;Ned4-K^juc^<%4FtTFH6 zVCD!;e`5Fcxb>Km9IvNZMT1Yst8U>yUT1GgrYNdoWYQlx=Q=%k5vBZ=j zchDk`XjS2Z$UGlJ=J_Bp&j*otK8VcoL1dl}BJ+F@ndbuqiay-8%P|EuJxUd^7J*p> zW`Y(HMhu%#{ySP4Q84mA1(^<7MmUja1&emhiotALopCd09ihZ?H}tQE6Tbp~2CXGz zJV-S)OlUftc9>lWT208fA|j>$Ik5r21uQ5m5yTH}*~bqAv<9GJ+LXHVDNS$tlRRe4nY=sa*|O|1wJ zCM&ZQUCWDBnD@!alXK2AL6j_5&79#9tM8+&$>(*n)J>R4f@uC*Bn#HC-fhTrlcDV` z_1|OCL}Xyrgb&)98-7^tW&VqMgClR5BLl?p#qCgL)wJPkOWltf1>{Y`r;_pOD6avx zwq06jGljZ0^BD(Q*u!W`#-}RgE8oEE3wHi6ehhqGF<<#=TQad}hbicU)WXH(Pk{vB z6)CV3$st@t_^d4%pW14rqK=pK_GO+o@scLih_SzzHcEs)FfLn}H`w0v?(cMec0IV8hFR;%~+uO|FV6%wa7h}qhamm?@)mK0Z 0: + self.active_combatant = queue[0] + +func _set_active_combatant(new_combatant): + active_combatant = new_combatant + active_combatant.active = true + emit_signal("active_combatant_changed", active_combatant) diff --git a/2d/role_playing_game/turn_combat/turn_queue/TurnQueue.tscn b/2d/role_playing_game/turn_combat/turn_queue/TurnQueue.tscn new file mode 100644 index 00000000..46bf00b8 --- /dev/null +++ b/2d/role_playing_game/turn_combat/turn_queue/TurnQueue.tscn @@ -0,0 +1,11 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://turn_combat/turn_queue/TurnQueue.gd" type="Script" id=1] + + +[node name="TurnQueue" type="Node"] + +script = ExtResource( 1 ) +combatants_list = null + + diff --git a/2d/role_playing_game/turn_combat_system/actors/Actor.tscn b/2d/role_playing_game/turn_combat_system/actors/Actor.tscn deleted file mode 100755 index b7ac0fbd..00000000 --- a/2d/role_playing_game/turn_combat_system/actors/Actor.tscn +++ /dev/null @@ -1,14 +0,0 @@ -[gd_scene load_steps=3 format=2] - -[ext_resource path="res://turn_combat_system/actors/Actor.gd" type="Script" id=1] -[ext_resource path="res://turn_combat_system/actors/health/Health.tscn" type="PackedScene" id=2] - -[node name="Actor" type="Node"] - -script = ExtResource( 1 ) -damage = 1 -defense = 1 - -[node name="Health" parent="." index="0" instance=ExtResource( 2 )] - - diff --git a/2d/role_playing_game/turn_combat_system/turn_queue/TurnQueue.gd b/2d/role_playing_game/turn_combat_system/turn_queue/TurnQueue.gd deleted file mode 100755 index dc5575ac..00000000 --- a/2d/role_playing_game/turn_combat_system/turn_queue/TurnQueue.gd +++ /dev/null @@ -1,52 +0,0 @@ -extends Node - -const Actor = preload("../actors/Actor.gd") - -export (NodePath) var actors_node -var queue = [] setget set_queue -var active_actor = null setget _set_active_actor - -signal active_actor_changed(active_actor) - -func _ready(): - actors_node = get_node(actors_node) - initialize() - -func initialize(): - set_queue(actors_node.get_children()) - -func play_turn(): - yield(active_actor, "turn_finished") - get_next_in_queue() - play_turn() - -func get_next_in_queue(): - var current_actor = queue.pop_front() - current_actor.active = false - queue.append(current_actor) - self.active_actor = queue[0] - return active_actor - -func remove(actor): - var new_queue = [] - for n in queue: - new_queue.append(n) - new_queue.remove(new_queue.find(actor)) - actor.queue_free() - self.queue = new_queue - -func set_queue(new_queue): - queue.clear() - var names = [] - for node in new_queue: - if not node is Actor: - continue - queue.append(node) - node.active = false - if queue.size() > 0: - self.active_actor = queue[0] - -func _set_active_actor(new_actor): - active_actor = new_actor - active_actor.active = true - emit_signal("active_actor_changed", active_actor) diff --git a/2d/role_playing_game/turn_combat_system/turn_queue/TurnQueue.tscn b/2d/role_playing_game/turn_combat_system/turn_queue/TurnQueue.tscn deleted file mode 100755 index 345499ee..00000000 --- a/2d/role_playing_game/turn_combat_system/turn_queue/TurnQueue.tscn +++ /dev/null @@ -1,11 +0,0 @@ -[gd_scene load_steps=2 format=2] - -[ext_resource path="res://turn_combat_system/turn_queue/TurnQueue.gd" type="Script" id=1] - - -[node name="TurnQueue" type="Node"] - -script = ExtResource( 1 ) -actors_node = null - -