Browse Source

Add JRPGish demo (#267)

* Add JRPGish game

* Fix typo and signals connection

* Add missing last lines

* Remove unused files
Henrique Campos 7 years ago
parent
commit
2709ddeb28
75 changed files with 2426 additions and 0 deletions
  1. 127 0
      2d/role_playing_game/Game.tscn
  2. 101 0
      2d/role_playing_game/default_env.tres
  3. 11 0
      2d/role_playing_game/dialog_system/dialog_player/DialogPlayer.tscn
  4. 38 0
      2d/role_playing_game/dialog_system/dialog_player/dialog_player.gd
  5. 5 0
      2d/role_playing_game/dialog_system/dialogs/npc_01.json
  6. 3 0
      2d/role_playing_game/dialog_system/dialogs/object.json
  7. 4 0
      2d/role_playing_game/dialog_system/dialogs/player_lose.json
  8. 4 0
      2d/role_playing_game/dialog_system/dialogs/player_won.json
  9. 144 0
      2d/role_playing_game/dialog_system/interface/DialogUI.tscn
  10. 36 0
      2d/role_playing_game/grid_movement/grid/grid.gd
  11. 111 0
      2d/role_playing_game/grid_movement/pawns/Actor.tscn
  12. 44 0
      2d/role_playing_game/grid_movement/pawns/actor.gd
  13. BIN
      2d/role_playing_game/grid_movement/pawns/character.png
  14. 29 0
      2d/role_playing_game/grid_movement/pawns/character.png.import
  15. 7 0
      2d/role_playing_game/grid_movement/pawns/idle_actor.gd
  16. 12 0
      2d/role_playing_game/grid_movement/pawns/pawn.gd
  17. 16 0
      2d/role_playing_game/grid_movement/pawns/random_actor.gd
  18. 28 0
      2d/role_playing_game/grid_movement/tilesets/grid/GridTiles.tscn
  19. BIN
      2d/role_playing_game/grid_movement/tilesets/grid/actor.png
  20. 29 0
      2d/role_playing_game/grid_movement/tilesets/grid/actor.png.import
  21. 38 0
      2d/role_playing_game/grid_movement/tilesets/grid/grid_tileset.tres
  22. BIN
      2d/role_playing_game/grid_movement/tilesets/grid/object.png
  23. 29 0
      2d/role_playing_game/grid_movement/tilesets/grid/object.png.import
  24. BIN
      2d/role_playing_game/grid_movement/tilesets/grid/obstacle.png
  25. 29 0
      2d/role_playing_game/grid_movement/tilesets/grid/obstacle.png.import
  26. 13 0
      2d/role_playing_game/grid_movement/tilesets/grid_lines/GridLinesTiles.tscn
  27. BIN
      2d/role_playing_game/grid_movement/tilesets/grid_lines/grid_lines.png
  28. 29 0
      2d/role_playing_game/grid_movement/tilesets/grid_lines/grid_lines.png.import
  29. 17 0
      2d/role_playing_game/grid_movement/tilesets/grid_lines/grid_lines_tileset.tres
  30. BIN
      2d/role_playing_game/icon.png
  31. 29 0
      2d/role_playing_game/icon.png.import
  32. 24 0
      2d/role_playing_game/project.godot
  33. 245 0
      2d/role_playing_game/screens/combat/Combat.tscn
  34. 20 0
      2d/role_playing_game/screens/combat/actors/Actor.tscn
  35. 49 0
      2d/role_playing_game/screens/combat/actors/Opponent.tscn
  36. 14 0
      2d/role_playing_game/screens/combat/actors/Player.tscn
  37. 61 0
      2d/role_playing_game/screens/combat/actors/sprites/Sprite.tscn
  38. BIN
      2d/role_playing_game/screens/combat/actors/sprites/blue.png
  39. 29 0
      2d/role_playing_game/screens/combat/actors/sprites/blue.png.import
  40. BIN
      2d/role_playing_game/screens/combat/actors/sprites/green.png
  41. 29 0
      2d/role_playing_game/screens/combat/actors/sprites/green.png.import
  42. BIN
      2d/role_playing_game/screens/combat/actors/sprites/shadow.png
  43. 29 0
      2d/role_playing_game/screens/combat/actors/sprites/shadow.png.import
  44. 72 0
      2d/role_playing_game/screens/combat/interface/ActorInfo.tscn
  45. 34 0
      2d/role_playing_game/screens/combat/interface/UI.gd
  46. 36 0
      2d/role_playing_game/screens/exploration/Exploration.tscn
  47. 234 0
      2d/role_playing_game/theme/Theme.tscn
  48. BIN
      2d/role_playing_game/theme/button/button_rect.png
  49. 29 0
      2d/role_playing_game/theme/button/button_rect.png.import
  50. BIN
      2d/role_playing_game/theme/button/button_rect_pressed.png
  51. 29 0
      2d/role_playing_game/theme/button/button_rect_pressed.png.import
  52. BIN
      2d/role_playing_game/theme/fonts/Montserrat-ExtraBold.otf
  53. 13 0
      2d/role_playing_game/theme/fonts/montserrat_extra_bold_16.tres
  54. 13 0
      2d/role_playing_game/theme/fonts/montserrat_extra_bold_24.tres
  55. 13 0
      2d/role_playing_game/theme/fonts/montserrat_extra_bold_32.tres
  56. 13 0
      2d/role_playing_game/theme/fonts/montserrat_extra_bold_48.tres
  57. 13 0
      2d/role_playing_game/theme/fonts/montserrat_extra_bold_62.tres
  58. 32 0
      2d/role_playing_game/theme/labels/Title.tscn
  59. BIN
      2d/role_playing_game/theme/panel/panel_rect.png
  60. 29 0
      2d/role_playing_game/theme/panel/panel_rect.png.import
  61. BIN
      2d/role_playing_game/theme/progressbar/background.png
  62. 29 0
      2d/role_playing_game/theme/progressbar/background.png.import
  63. BIN
      2d/role_playing_game/theme/progressbar/foreground_blue.png
  64. 29 0
      2d/role_playing_game/theme/progressbar/foreground_blue.png.import
  65. BIN
      2d/role_playing_game/theme/progressbar/foreground_red.png
  66. 29 0
      2d/role_playing_game/theme/progressbar/foreground_red.png.import
  67. 25 0
      2d/role_playing_game/theme/progressbar/foreground_stylebox_blue.tres
  68. 25 0
      2d/role_playing_game/theme/progressbar/foreground_stylebox_red.tres
  69. 152 0
      2d/role_playing_game/theme/theme.tres
  70. 31 0
      2d/role_playing_game/turn_combat_system/actors/Actor.gd
  71. 14 0
      2d/role_playing_game/turn_combat_system/actors/Actor.tscn
  72. 24 0
      2d/role_playing_game/turn_combat_system/actors/health/Health.gd
  73. 12 0
      2d/role_playing_game/turn_combat_system/actors/health/Health.tscn
  74. 52 0
      2d/role_playing_game/turn_combat_system/turn_queue/TurnQueue.gd
  75. 11 0
      2d/role_playing_game/turn_combat_system/turn_queue/TurnQueue.tscn

+ 127 - 0
2d/role_playing_game/Game.tscn

@@ -0,0 +1,127 @@
+[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]
+
+[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]
+
+length = 0.5
+loop = false
+step = 0.1
+tracks/0/type = "value"
+tracks/0/path = NodePath("Transition/ColorRect:color")
+tracks/0/interp = 1
+tracks/0/loop_wrap = true
+tracks/0/imported = false
+tracks/0/enabled = true
+tracks/0/keys = {
+"times": PoolRealArray( 0, 0.5 ),
+"transitions": PoolRealArray( 1, 1 ),
+"update": 0,
+"values": [ Color( 0.0703125, 0.0703125, 0.0703125, 0 ), Color( 0.0703125, 0.0703125, 0.0703125, 1 ) ]
+}
+
+[node name="Game" type="Node"]
+
+script = SubResource( 1 )
+combat_screen = NodePath("Combat")
+exploration_screen = NodePath("Exploration")
+
+[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/fade = SubResource( 2 )
+blend_times = [  ]
+
+[node name="Transition" type="CanvasLayer" parent="." index="1"]
+
+layer = 1
+offset = Vector2( 0, 0 )
+rotation = 0.0
+scale = Vector2( 1, 1 )
+transform = Transform2D( 1, 0, 0, 1, 0, 0 )
+
+[node name="ColorRect" type="ColorRect" parent="Transition" index="0"]
+
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_right = 1280.0
+margin_bottom = 720.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
+color = Color( 0.0703125, 0.0703125, 0.0703125, 0 )
+_sections_unfolded = [ "Focus", "Mouse", "Visibility" ]
+
+[node name="Combat" parent="." index="2" instance=ExtResource( 1 )]
+
+visible = false
+
+[node name="Exploration" parent="." index="3" instance=ExtResource( 2 )]
+
+

+ 101 - 0
2d/role_playing_game/default_env.tres

@@ -0,0 +1,101 @@
+[gd_resource type="Environment" load_steps=2 format=2]
+
+[sub_resource type="ProceduralSky" id=1]
+
+radiance_size = 4
+sky_top_color = Color( 0.0470588, 0.454902, 0.976471, 1 )
+sky_horizon_color = Color( 0.556863, 0.823529, 0.909804, 1 )
+sky_curve = 0.25
+sky_energy = 1.0
+ground_bottom_color = Color( 0.101961, 0.145098, 0.188235, 1 )
+ground_horizon_color = Color( 0.482353, 0.788235, 0.952941, 1 )
+ground_curve = 0.01
+ground_energy = 1.0
+sun_color = Color( 1, 1, 1, 1 )
+sun_latitude = 35.0
+sun_longitude = 0.0
+sun_angle_min = 1.0
+sun_angle_max = 100.0
+sun_curve = 0.05
+sun_energy = 16.0
+texture_size = 2
+
+[resource]
+
+background_mode = 2
+background_sky = SubResource( 1 )
+background_sky_custom_fov = 0.0
+background_color = Color( 0, 0, 0, 1 )
+background_energy = 1.0
+background_canvas_max_layer = 0
+ambient_light_color = Color( 0, 0, 0, 1 )
+ambient_light_energy = 1.0
+ambient_light_sky_contribution = 1.0
+fog_enabled = false
+fog_color = Color( 0.5, 0.6, 0.7, 1 )
+fog_sun_color = Color( 1, 0.9, 0.7, 1 )
+fog_sun_amount = 0.0
+fog_depth_enabled = true
+fog_depth_begin = 10.0
+fog_depth_curve = 1.0
+fog_transmit_enabled = false
+fog_transmit_curve = 1.0
+fog_height_enabled = false
+fog_height_min = 0.0
+fog_height_max = 100.0
+fog_height_curve = 1.0
+tonemap_mode = 0
+tonemap_exposure = 1.0
+tonemap_white = 1.0
+auto_exposure_enabled = false
+auto_exposure_scale = 0.4
+auto_exposure_min_luma = 0.05
+auto_exposure_max_luma = 8.0
+auto_exposure_speed = 0.5
+ss_reflections_enabled = false
+ss_reflections_max_steps = 64
+ss_reflections_fade_in = 0.15
+ss_reflections_fade_out = 2.0
+ss_reflections_depth_tolerance = 0.2
+ss_reflections_roughness = true
+ssao_enabled = false
+ssao_radius = 1.0
+ssao_intensity = 1.0
+ssao_radius2 = 0.0
+ssao_intensity2 = 1.0
+ssao_bias = 0.01
+ssao_light_affect = 0.0
+ssao_color = Color( 0, 0, 0, 1 )
+ssao_quality = 0
+ssao_blur = 3
+ssao_edge_sharpness = 4.0
+dof_blur_far_enabled = false
+dof_blur_far_distance = 10.0
+dof_blur_far_transition = 5.0
+dof_blur_far_amount = 0.1
+dof_blur_far_quality = 1
+dof_blur_near_enabled = false
+dof_blur_near_distance = 2.0
+dof_blur_near_transition = 1.0
+dof_blur_near_amount = 0.1
+dof_blur_near_quality = 1
+glow_enabled = false
+glow_levels/1 = false
+glow_levels/2 = false
+glow_levels/3 = true
+glow_levels/4 = false
+glow_levels/5 = true
+glow_levels/6 = false
+glow_levels/7 = false
+glow_intensity = 0.8
+glow_strength = 1.0
+glow_bloom = 0.0
+glow_blend_mode = 2
+glow_hdr_threshold = 1.0
+glow_hdr_scale = 2.0
+glow_bicubic_upscale = false
+adjustment_enabled = false
+adjustment_brightness = 1.0
+adjustment_contrast = 1.0
+adjustment_saturation = 1.0
+

+ 11 - 0
2d/role_playing_game/dialog_system/dialog_player/DialogPlayer.tscn

@@ -0,0 +1,11 @@
+[gd_scene load_steps=2 format=2]
+
+[ext_resource path="res://dialog_system/dialog_player/dialog_player.gd" type="Script" id=1]
+
+
+[node name="DialogPlayer" type="Node"]
+
+script = ExtResource( 1 )
+dialog_file = null
+
+

+ 38 - 0
2d/role_playing_game/dialog_system/dialog_player/dialog_player.gd

@@ -0,0 +1,38 @@
+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

+ 5 - 0
2d/role_playing_game/dialog_system/dialogs/npc_01.json

@@ -0,0 +1,5 @@
+{
+  "dialog_1" : {"name": "Unknown", "text": "Hey, it's a good time to have a JRPG fight, right?"},
+  "dialog_2" : {"name": "Unknown", "text": "Let me present myself, I'm Opponent"},
+  "dialog_3" : {"name": "Opponent", "text": "Enough talk, let's fight!"},
+}

+ 3 - 0
2d/role_playing_game/dialog_system/dialogs/object.json

@@ -0,0 +1,3 @@
+{
+  "dialog_1" : {"name":"Player", "text":"Just some object..." }
+}

+ 4 - 0
2d/role_playing_game/dialog_system/dialogs/player_lose.json

@@ -0,0 +1,4 @@
+{
+  "dialog_1" : {"name": "Opponent", "text": "Aha! I won, maybe you can try again next time"},
+  "dialog_2" : {"name": "Opponent", "text": "Now let me wonder around again..."},
+}

+ 4 - 0
2d/role_playing_game/dialog_system/dialogs/player_won.json

@@ -0,0 +1,4 @@
+{
+  "dialog_1" : {"name": "Opponent", "text": "Congratulations, you won!"},
+  "dialog_2" : {"name": "Opponent", "text": "Now let me wonder around again..."},
+}

+ 144 - 0
2d/role_playing_game/dialog_system/interface/DialogUI.tscn

@@ -0,0 +1,144 @@
+[gd_scene load_steps=3 format=2]
+
+[ext_resource path="res://theme/theme.tres" type="Theme" id=1]
+
+[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"]
+
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_top = 544.0
+margin_right = 1280.0
+margin_bottom = 720.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 = 1
+theme = ExtResource( 1 )
+script = SubResource( 1 )
+
+[node name="Name" type="RichTextLabel" parent="." index="0"]
+
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_left = 40.0
+margin_top = 16.0
+margin_right = 1072.0
+margin_bottom = 56.0
+rect_pivot_offset = Vector2( 0, 0 )
+rect_clip_content = true
+mouse_filter = 0
+mouse_default_cursor_shape = 0
+size_flags_horizontal = 1
+size_flags_vertical = 1
+bbcode_enabled = false
+bbcode_text = ""
+visible_characters = -1
+percent_visible = 1.0
+meta_underlined = true
+tab_size = 4
+text = "Name"
+scroll_active = false
+scroll_following = false
+selection_enabled = false
+override_selected_font_color = false
+
+[node name="Text" type="RichTextLabel" parent="." index="1"]
+
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_left = 40.0
+margin_top = 64.0
+margin_right = 1064.0
+margin_bottom = 152.0
+rect_pivot_offset = Vector2( 0, 0 )
+rect_clip_content = true
+mouse_filter = 0
+mouse_default_cursor_shape = 0
+size_flags_horizontal = 1
+size_flags_vertical = 1
+bbcode_enabled = false
+bbcode_text = ""
+visible_characters = -1
+percent_visible = 1.0
+meta_underlined = true
+tab_size = 4
+text = "Dialog Text"
+scroll_active = true
+scroll_following = false
+selection_enabled = false
+override_selected_font_color = false
+
+[node name="Button" type="Button" parent="." index="2"]
+
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_left = 1104.0
+margin_top = 32.0
+margin_right = 1264.0
+margin_bottom = 151.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 = 1
+size_flags_vertical = 1
+toggle_mode = false
+enabled_focus_mode = 2
+shortcut = null
+group = null
+text = "Next"
+flat = false
+align = 1
+
+[connection signal="button_up" from="Button" to="." method="_on_Button_button_up"]
+
+

+ 36 - 0
2d/role_playing_game/grid_movement/grid/grid.gd

@@ -0,0 +1,36 @@
+extends TileMap
+
+enum CELL_TYPES { ACTOR, OBSTACLE, OBJECT }
+export(NodePath) var dialog_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("DialogPlayer"):
+				return
+			get_node(dialog_ui).show_dialog(pawn, target_pawn.get_node("DialogPlayer"))
+			

+ 111 - 0
2d/role_playing_game/grid_movement/pawns/Actor.tscn

@@ -0,0 +1,111 @@
+[gd_scene load_steps=5 format=2]
+
+[ext_resource path="res://grid_movement/pawns/actor.gd" type="Script" id=1]
+[ext_resource path="res://grid_movement/pawns/character.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" index="0"]
+
+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" ]
+
+

+ 44 - 0
2d/role_playing_game/grid_movement/pawns/actor.gd

@@ -0,0 +1,44 @@
+extends 'pawn.gd'
+
+onready var Grid = get_parent()
+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")

BIN
2d/role_playing_game/grid_movement/pawns/character.png


+ 29 - 0
2d/role_playing_game/grid_movement/pawns/character.png.import

@@ -0,0 +1,29 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/character.png-5e19af0401d52b4620fb84d898126e01.stex"
+
+[deps]
+
+source_file="res://grid_movement/pawns/character.png"
+dest_files=[ "res://.import/character.png-5e19af0401d52b4620fb84d898126e01.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

+ 7 - 0
2d/role_playing_game/grid_movement/pawns/idle_actor.gd

@@ -0,0 +1,7 @@
+extends 'actor.gd'
+
+func _ready():
+	set_process(false)
+	
+func get_input_direction():
+	return Vector2(0, 0)

+ 12 - 0
2d/role_playing_game/grid_movement/pawns/pawn.gd

@@ -0,0 +1,12 @@
+extends Node2D
+
+enum CELL_TYPES { ACTOR, OBSTACLE, OBJECT }
+export(CELL_TYPES) var type = ACTOR
+
+export (PackedScene) var combat_actor
+var active = true setget set_active
+
+func set_active(value):
+	active = value
+	set_process(value)
+	set_process_input(value)

+ 16 - 0
2d/role_playing_game/grid_movement/pawns/random_actor.gd

@@ -0,0 +1,16 @@
+extends "actor.gd"
+
+const DIRECTIONS = [-1, 1]
+
+func get_input_direction():
+	if not active:
+		return Vector2()
+	var random_x = DIRECTIONS[randi() % DIRECTIONS.size()]
+	var random_y = DIRECTIONS[randi() % DIRECTIONS.size()]
+	
+	var random_axis = randi()%2
+	if random_axis > 0:
+		random_x = 0
+	else:
+		random_y = 0
+	return Vector2(random_x, random_y)

+ 28 - 0
2d/role_playing_game/grid_movement/tilesets/grid/GridTiles.tscn

@@ -0,0 +1,28 @@
+[gd_scene load_steps=4 format=2]
+
+[ext_resource path="res://grid_movement/tilesets/grid/actor.png" type="Texture" id=1]
+[ext_resource path="res://grid_movement/tilesets/grid/obstacle.png" type="Texture" id=2]
+[ext_resource path="res://grid_movement/tilesets/grid/object.png" type="Texture" id=3]
+
+
+[node name="Node2D" type="Node2D"]
+
+[node name="Actor" type="Sprite" parent="." index="0"]
+
+position = Vector2( 32, 32 )
+texture = ExtResource( 1 )
+_sections_unfolded = [ "Visibility" ]
+
+[node name="Obstacle" type="Sprite" parent="." index="1"]
+
+position = Vector2( 96, 32 )
+texture = ExtResource( 2 )
+_sections_unfolded = [ "Visibility" ]
+
+[node name="Object" type="Sprite" parent="." index="2"]
+
+position = Vector2( 160, 32 )
+texture = ExtResource( 3 )
+_sections_unfolded = [ "Visibility" ]
+
+

BIN
2d/role_playing_game/grid_movement/tilesets/grid/actor.png


+ 29 - 0
2d/role_playing_game/grid_movement/tilesets/grid/actor.png.import

@@ -0,0 +1,29 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/actor.png-147dff690f83be8a2c66a5bfa83da49f.stex"
+
+[deps]
+
+source_file="res://grid_movement/tilesets/grid/actor.png"
+dest_files=[ "res://.import/actor.png-147dff690f83be8a2c66a5bfa83da49f.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

+ 38 - 0
2d/role_playing_game/grid_movement/tilesets/grid/grid_tileset.tres

@@ -0,0 +1,38 @@
+[gd_resource type="TileSet" load_steps=4 format=2]
+
+[ext_resource path="res://grid_movement/tilesets/grid/actor.png" type="Texture" id=1]
+[ext_resource path="res://grid_movement/tilesets/grid/obstacle.png" type="Texture" id=2]
+[ext_resource path="res://grid_movement/tilesets/grid/object.png" type="Texture" id=3]
+
+
+[resource]
+
+0/name = "Actor"
+0/texture = ExtResource( 1 )
+0/tex_offset = Vector2( 0, 0 )
+0/modulate = Color( 1, 1, 1, 1 )
+0/region = Rect2( 0, 0, 64, 64 )
+0/is_autotile = false
+0/occluder_offset = Vector2( 32, 32 )
+0/navigation_offset = Vector2( 32, 32 )
+0/shapes = [  ]
+1/name = "Obstacle"
+1/texture = ExtResource( 2 )
+1/tex_offset = Vector2( 0, 0 )
+1/modulate = Color( 1, 1, 1, 1 )
+1/region = Rect2( 0, 0, 64, 64 )
+1/is_autotile = false
+1/occluder_offset = Vector2( 32, 32 )
+1/navigation_offset = Vector2( 32, 32 )
+1/shapes = [  ]
+2/name = "Object"
+2/texture = ExtResource( 3 )
+2/tex_offset = Vector2( 0, 0 )
+2/modulate = Color( 1, 1, 1, 1 )
+2/region = Rect2( 0, 0, 64, 64 )
+2/is_autotile = false
+2/occluder_offset = Vector2( 32, 32 )
+2/navigation_offset = Vector2( 32, 32 )
+2/shapes = [  ]
+_sections_unfolded = [ "0", "1" ]
+

BIN
2d/role_playing_game/grid_movement/tilesets/grid/object.png


+ 29 - 0
2d/role_playing_game/grid_movement/tilesets/grid/object.png.import

@@ -0,0 +1,29 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/object.png-f9ec4c5540ae154e2e73d50438312f26.stex"
+
+[deps]
+
+source_file="res://grid_movement/tilesets/grid/object.png"
+dest_files=[ "res://.import/object.png-f9ec4c5540ae154e2e73d50438312f26.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

BIN
2d/role_playing_game/grid_movement/tilesets/grid/obstacle.png


+ 29 - 0
2d/role_playing_game/grid_movement/tilesets/grid/obstacle.png.import

@@ -0,0 +1,29 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/obstacle.png-303025fbfb0bdc414a247e8ee1624a90.stex"
+
+[deps]
+
+source_file="res://grid_movement/tilesets/grid/obstacle.png"
+dest_files=[ "res://.import/obstacle.png-303025fbfb0bdc414a247e8ee1624a90.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

+ 13 - 0
2d/role_playing_game/grid_movement/tilesets/grid_lines/GridLinesTiles.tscn

@@ -0,0 +1,13 @@
+[gd_scene load_steps=2 format=2]
+
+[ext_resource path="res://grid_movement/tilesets/grid_lines/grid_lines.png" type="Texture" id=1]
+
+
+[node name="TileSet" type="Node2D" index="0"]
+
+[node name="Grass" type="Sprite" parent="." index="0"]
+
+position = Vector2( 32, 32 )
+texture = ExtResource( 1 )
+
+

BIN
2d/role_playing_game/grid_movement/tilesets/grid_lines/grid_lines.png


+ 29 - 0
2d/role_playing_game/grid_movement/tilesets/grid_lines/grid_lines.png.import

@@ -0,0 +1,29 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/grid_lines.png-151c8a0e38dd3f92e569d4b4f869a28e.stex"
+
+[deps]
+
+source_file="res://grid_movement/tilesets/grid_lines/grid_lines.png"
+dest_files=[ "res://.import/grid_lines.png-151c8a0e38dd3f92e569d4b4f869a28e.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

+ 17 - 0
2d/role_playing_game/grid_movement/tilesets/grid_lines/grid_lines_tileset.tres

@@ -0,0 +1,17 @@
+[gd_resource type="TileSet" load_steps=2 format=2]
+
+[ext_resource path="res://grid_movement/tilesets/grid_lines/grid_lines.png" type="Texture" id=1]
+
+
+[resource]
+
+0/name = "Grass"
+0/texture = ExtResource( 1 )
+0/tex_offset = Vector2( 0, 0 )
+0/modulate = Color( 1, 1, 1, 1 )
+0/region = Rect2( 0, 0, 64, 64 )
+0/is_autotile = false
+0/occluder_offset = Vector2( 32, 32 )
+0/navigation_offset = Vector2( 32, 32 )
+0/shapes = [  ]
+

BIN
2d/role_playing_game/icon.png


+ 29 - 0
2d/role_playing_game/icon.png.import

@@ -0,0 +1,29 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/icon.png-487276ed1e3a0c39cad0279d744ee560.stex"
+
+[deps]
+
+source_file="res://icon.png"
+dest_files=[ "res://.import/icon.png-487276ed1e3a0c39cad0279d744ee560.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

+ 24 - 0
2d/role_playing_game/project.godot

@@ -0,0 +1,24 @@
+; Engine configuration file.
+; It's best edited using the editor UI and not directly,
+; since the parameters that go here are not all obvious.
+;
+; Format:
+;   [section] ; section goes between []
+;   param=value ; assign values to parameters
+
+config_version=3
+
+[application]
+
+config/name="JRPG Demo"
+run/main_scene="res://Game.tscn"
+config/icon="res://icon.png"
+
+[display]
+
+window/size/width=1280
+window/size/height=720
+
+[rendering]
+
+environment/default_environment="res://default_env.tres"

+ 245 - 0
2d/role_playing_game/screens/combat/Combat.tscn

@@ -0,0 +1,245 @@
+[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]
+
+[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)"
+
+[node name="Combat" type="Node2D"]
+
+script = SubResource( 1 )
+
+[node name="TurnQueue" parent="." index="0" instance=ExtResource( 1 )]
+
+actors_node = NodePath("../Actors")
+
+[node name="Actors" type="Node2D" parent="." index="1"]
+
+position = Vector2( 539, 275 )
+script = SubResource( 2 )
+_sections_unfolded = [ "Transform" ]
+
+[node name="UI" type="Control" parent="." index="2"]
+
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_right = 1280.0
+margin_bottom = 720.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 = 1
+theme = ExtResource( 2 )
+script = ExtResource( 3 )
+_sections_unfolded = [ "Theme" ]
+actors_node = NodePath("../Actors")
+actor_info = ExtResource( 4 )
+
+[node name="Actors" type="HBoxContainer" parent="UI" index="0"]
+
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_top = 77.0
+margin_right = 1280.0
+margin_bottom = 328.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
+custom_constants/separation = 360
+alignment = 0
+_sections_unfolded = [ "custom_constants" ]
+
+[node name="Buttons" type="PanelContainer" parent="UI" index="1"]
+
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_left = 80.0
+margin_top = 376.0
+margin_right = 1200.0
+margin_bottom = 698.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 = 1
+_sections_unfolded = [ "Theme" ]
+
+[node name="GridContainer" type="GridContainer" parent="UI/Buttons" index="0"]
+
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_left = 90.0
+margin_top = 35.0
+margin_right = 1030.0
+margin_bottom = 277.0
+rect_pivot_offset = Vector2( 0, 0 )
+rect_clip_content = false
+mouse_filter = 1
+mouse_default_cursor_shape = 0
+size_flags_horizontal = 3
+size_flags_vertical = 3
+columns = 2
+_sections_unfolded = [ "Size Flags" ]
+
+[node name="Attack" type="Button" parent="UI/Buttons/GridContainer" index="0"]
+
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_right = 468.0
+margin_bottom = 119.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 = "Attack"
+flat = false
+align = 1
+
+[node name="Defend" type="Button" parent="UI/Buttons/GridContainer" index="1"]
+
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_left = 472.0
+margin_right = 940.0
+margin_bottom = 119.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 = "Defend"
+flat = false
+align = 1
+
+[node name="Inventory" 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_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
+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 = "Flee"
+flat = false
+align = 1
+
+[connection signal="button_up" from="UI/Buttons/GridContainer/Attack" to="UI" method="_on_Attack_button_up"]
+
+[connection signal="button_up" from="UI/Buttons/GridContainer/Defend" to="UI" method="_on_Defend_button_up"]
+
+[connection signal="button_up" from="UI/Buttons/GridContainer/Flee" to="UI" method="_on_Flee_button_up"]
+
+

+ 20 - 0
2d/role_playing_game/screens/combat/actors/Actor.tscn

@@ -0,0 +1,20 @@
+[gd_scene load_steps=4 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]
+[ext_resource path="res://screens/combat/actors/sprites/Sprite.tscn" type="PackedScene" id=3]
+
+[node name="Actor" type="Node2D" index="0"]
+
+script = ExtResource( 1 )
+damage = 2
+defense = 1
+
+[node name="Health" parent="." index="0" instance=ExtResource( 2 )]
+
+life = 10
+armor = 2
+
+[node name="Sprite" type="Node2D" parent="." index="1" instance=ExtResource( 3 )]
+
+

+ 49 - 0
2d/role_playing_game/screens/combat/actors/Opponent.tscn

@@ -0,0 +1,49 @@
+[gd_scene load_steps=4 format=2]
+
+[ext_resource path="res://screens/combat/actors/Actor.tscn" type="PackedScene" id=1]
+[ext_resource path="res://screens/combat/actors/sprites/green.png" type="Texture" id=2]
+
+[sub_resource type="GDScript" id=1]
+
+script/source = "extends \"res://turn_combat_system/actors/Actor.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)"
+
+[node name="Opponent" instance=ExtResource( 1 )]
+
+script = SubResource( 1 )
+_sections_unfolded = [ "Transform" ]
+damage = 3
+defense = 0
+
+[node name="Health" parent="." index="0"]
+
+life = 7
+max_life = 7
+armor = 1
+
+[node name="Body" parent="Sprite/Pivot" index="1"]
+
+texture = ExtResource( 2 )
+
+[node name="Timer" type="Timer" parent="." index="2"]
+
+process_mode = 1
+wait_time = 0.25
+one_shot = true
+autostart = false
+
+
+[editable path="Sprite"]

+ 14 - 0
2d/role_playing_game/screens/combat/actors/Player.tscn

@@ -0,0 +1,14 @@
+[gd_scene load_steps=2 format=2]
+
+[ext_resource path="res://screens/combat/actors/Actor.tscn" type="PackedScene" id=1]
+
+[node name="Player" instance=ExtResource( 1 )]
+
+_sections_unfolded = [ "Transform" ]
+defense = 2
+
+[node name="Health" parent="." index="0"]
+
+armor = 0
+
+

+ 61 - 0
2d/role_playing_game/screens/combat/actors/sprites/Sprite.tscn

@@ -0,0 +1,61 @@
+[gd_scene load_steps=4 format=2]
+
+[ext_resource path="res://screens/combat/actors/sprites/shadow.png" type="Texture" id=1]
+[ext_resource path="res://screens/combat/actors/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" ]
+
+

BIN
2d/role_playing_game/screens/combat/actors/sprites/blue.png


+ 29 - 0
2d/role_playing_game/screens/combat/actors/sprites/blue.png.import

@@ -0,0 +1,29 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/blue.png-127e2b8d7aa8f4a7572c4923c2b20228.stex"
+
+[deps]
+
+source_file="res://screens/combat/actors/sprites/blue.png"
+dest_files=[ "res://.import/blue.png-127e2b8d7aa8f4a7572c4923c2b20228.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

BIN
2d/role_playing_game/screens/combat/actors/sprites/green.png


+ 29 - 0
2d/role_playing_game/screens/combat/actors/sprites/green.png.import

@@ -0,0 +1,29 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/green.png-7937ec3931675b5dd0f218cbb8ae006a.stex"
+
+[deps]
+
+source_file="res://screens/combat/actors/sprites/green.png"
+dest_files=[ "res://.import/green.png-7937ec3931675b5dd0f218cbb8ae006a.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

BIN
2d/role_playing_game/screens/combat/actors/sprites/shadow.png


+ 29 - 0
2d/role_playing_game/screens/combat/actors/sprites/shadow.png.import

@@ -0,0 +1,29 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/shadow.png-3c36ca984d4b9e8eba8c422537f5ca42.stex"
+
+[deps]
+
+source_file="res://screens/combat/actors/sprites/shadow.png"
+dest_files=[ "res://.import/shadow.png-3c36ca984d4b9e8eba8c422537f5ca42.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

+ 72 - 0
2d/role_playing_game/screens/combat/interface/ActorInfo.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="ActorInfo" 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" ]
+
+

+ 34 - 0
2d/role_playing_game/screens/combat/interface/UI.gd

@@ -0,0 +1,34 @@
+extends Control
+
+export (NodePath) var actors_node
+export (PackedScene) var actor_info
+
+func _ready():
+	actors_node = get_node(actors_node)
+	
+func initialize():
+	for actor in actors_node.get_children():
+		var health = actor.get_node("Health")
+		var info = actor_info.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
+		health.connect("health_changed", health_info, "set_value")
+		$Actors.add_child(info)
+
+func _on_Attack_button_up():
+	if not actors_node.get_node("Player").active:
+		return
+	actors_node.get_node("Player").attack(actors_node.get_node("Opponent"))
+
+func _on_Defend_button_up():
+	if not actors_node.get_node("Player").active:
+		return
+	actors_node.get_node("Player").defend()
+
+func _on_Flee_button_up():
+	if not actors_node.get_node("Player").active:
+		return
+	actors_node.get_node("Player").flee()
+	get_parent().emit_signal("combat_finished", $"../Actors/Opponent", $"../Actors/Player")

File diff suppressed because it is too large
+ 36 - 0
2d/role_playing_game/screens/exploration/Exploration.tscn


+ 234 - 0
2d/role_playing_game/theme/Theme.tscn

@@ -0,0 +1,234 @@
+[gd_scene load_steps=7 format=2]
+
+[ext_resource path="res://theme/theme.tres" type="Theme" id=1]
+[ext_resource path="res://theme/labels/Title.tscn" type="PackedScene" id=2]
+[ext_resource path="res://theme/fonts/montserrat_extra_bold_24.tres" type="DynamicFont" id=3]
+[ext_resource path="res://theme/progressbar/foreground_stylebox_red.tres" type="StyleBox" id=4]
+[ext_resource path="res://theme/progressbar/foreground_stylebox_blue.tres" type="StyleBox" id=5]
+
+[sub_resource type="GDScript" id=1]
+
+script/source = "extends VBoxContainer
+
+func _ready():
+	set_process(false)
+
+func _process(delta):
+	for p in get_children():
+		$ProgressBarBlue.value += 10 * delta
+		$ProgressBarRed.value += 10 * delta
+
+
+func _on_Button_button_down():
+	set_process(true)
+
+
+func _on_Button_button_up():
+	set_process(false)
+"
+
+[node name="Control" type="Control" index="0"]
+
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_right = 1024.0
+margin_bottom = 600.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 = 1
+theme = ExtResource( 1 )
+_sections_unfolded = [ "Size Flags", "Theme" ]
+
+[node name="Panel" type="Panel" parent="." index="0"]
+
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_left = 128.0
+margin_top = 64.0
+margin_right = 896.0
+margin_bottom = 536.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 = 1
+_sections_unfolded = [ "Rect" ]
+
+[node name="Title" parent="Panel" index="0" instance=ExtResource( 2 )]
+
+margin_right = 767.0
+
+[node name="VBoxContainer" type="VBoxContainer" parent="Panel" index="1"]
+
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_left = 128.0
+margin_top = 180.0
+margin_right = 524.0
+margin_bottom = 424.0
+rect_pivot_offset = Vector2( 0, 0 )
+rect_clip_content = false
+mouse_filter = 1
+mouse_default_cursor_shape = 0
+size_flags_horizontal = 3
+size_flags_vertical = 3
+custom_constants/separation = 5
+alignment = 0
+script = SubResource( 1 )
+_sections_unfolded = [ "custom_constants" ]
+
+[node name="Speed" type="Label" parent="Panel/VBoxContainer" index="0"]
+
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_right = 396.0
+margin_bottom = 40.0
+rect_pivot_offset = Vector2( 0, 0 )
+rect_clip_content = false
+mouse_filter = 2
+mouse_default_cursor_shape = 0
+size_flags_horizontal = 1
+size_flags_vertical = 4
+custom_fonts/font = ExtResource( 3 )
+text = "Speed"
+percent_visible = 1.0
+lines_skipped = 0
+max_lines_visible = -1
+_sections_unfolded = [ "custom_colors", "custom_fonts" ]
+
+[node name="ProgressBarRed" type="ProgressBar" parent="Panel/VBoxContainer" index="1"]
+
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_top = 45.0
+margin_right = 396.0
+margin_bottom = 109.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 = 0
+custom_styles/fg = ExtResource( 4 )
+min_value = 0.0
+max_value = 100.0
+step = 1.0
+page = 0.0
+value = 0.0
+exp_edit = false
+rounded = false
+percent_visible = false
+_sections_unfolded = [ "Percent", "custom_styles" ]
+
+[node name="BlankSpace" type="ReferenceRect" parent="Panel/VBoxContainer" index="2"]
+
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_top = 114.0
+margin_right = 396.0
+margin_bottom = 130.0
+rect_min_size = Vector2( 0, 16 )
+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
+_sections_unfolded = [ "Rect", "Size Flags" ]
+
+[node name="Acceleration" type="Label" parent="Panel/VBoxContainer" index="3"]
+
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_top = 135.0
+margin_right = 396.0
+margin_bottom = 175.0
+rect_pivot_offset = Vector2( 0, 0 )
+rect_clip_content = false
+mouse_filter = 2
+mouse_default_cursor_shape = 0
+size_flags_horizontal = 1
+size_flags_vertical = 4
+custom_fonts/font = ExtResource( 3 )
+text = "Acceleration"
+percent_visible = 1.0
+lines_skipped = 0
+max_lines_visible = -1
+_sections_unfolded = [ "custom_colors" ]
+
+[node name="ProgressBarBlue" type="ProgressBar" parent="Panel/VBoxContainer" index="4"]
+
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_top = 180.0
+margin_right = 396.0
+margin_bottom = 244.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 = 0
+custom_styles/fg = ExtResource( 5 )
+min_value = 0.0
+max_value = 100.0
+step = 1.0
+page = 0.0
+value = 0.0
+exp_edit = false
+rounded = false
+percent_visible = false
+_sections_unfolded = [ "Percent", "custom_styles" ]
+
+[node name="Button" type="Button" parent="Panel" index="2"]
+
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_left = 531.0
+margin_top = 258.0
+margin_right = 664.0
+margin_bottom = 377.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 = 2
+size_flags_vertical = 4
+size_flags_stretch_ratio = 0.0
+toggle_mode = false
+enabled_focus_mode = 2
+shortcut = null
+group = null
+text = "Add"
+flat = false
+align = 1
+_sections_unfolded = [ "Size Flags" ]
+
+[connection signal="button_down" from="Panel/Button" to="Panel/VBoxContainer" method="_on_Button_button_down"]
+
+[connection signal="button_up" from="Panel/Button" to="Panel/VBoxContainer" method="_on_Button_button_up"]
+
+

BIN
2d/role_playing_game/theme/button/button_rect.png


+ 29 - 0
2d/role_playing_game/theme/button/button_rect.png.import

@@ -0,0 +1,29 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/button_rect.png-50631b7139a07837e9f4856772433e8e.stex"
+
+[deps]
+
+source_file="res://theme/button/button_rect.png"
+dest_files=[ "res://.import/button_rect.png-50631b7139a07837e9f4856772433e8e.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

BIN
2d/role_playing_game/theme/button/button_rect_pressed.png


+ 29 - 0
2d/role_playing_game/theme/button/button_rect_pressed.png.import

@@ -0,0 +1,29 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/button_rect_pressed.png-e5e25d3b6005d4ba5edf4354beb6dc06.stex"
+
+[deps]
+
+source_file="res://theme/button/button_rect_pressed.png"
+dest_files=[ "res://.import/button_rect_pressed.png-e5e25d3b6005d4ba5edf4354beb6dc06.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

BIN
2d/role_playing_game/theme/fonts/Montserrat-ExtraBold.otf


+ 13 - 0
2d/role_playing_game/theme/fonts/montserrat_extra_bold_16.tres

@@ -0,0 +1,13 @@
+[gd_resource type="DynamicFont" load_steps=2 format=2]
+
+[ext_resource path="res://theme/fonts/Montserrat-ExtraBold.otf" type="DynamicFontData" id=1]
+
+
+[resource]
+
+size = 16
+use_mipmaps = true
+use_filter = true
+font_data = ExtResource( 1 )
+_sections_unfolded = [ "Settings" ]
+

+ 13 - 0
2d/role_playing_game/theme/fonts/montserrat_extra_bold_24.tres

@@ -0,0 +1,13 @@
+[gd_resource type="DynamicFont" load_steps=2 format=2]
+
+[ext_resource path="res://theme/fonts/Montserrat-ExtraBold.otf" type="DynamicFontData" id=1]
+
+
+[resource]
+
+size = 32
+use_mipmaps = true
+use_filter = true
+font_data = ExtResource( 1 )
+_sections_unfolded = [ "Settings" ]
+

+ 13 - 0
2d/role_playing_game/theme/fonts/montserrat_extra_bold_32.tres

@@ -0,0 +1,13 @@
+[gd_resource type="DynamicFont" load_steps=2 format=2]
+
+[ext_resource path="res://theme/fonts/Montserrat-ExtraBold.otf" type="DynamicFontData" id=1]
+
+
+[resource]
+
+size = 32
+use_mipmaps = true
+use_filter = true
+font_data = ExtResource( 1 )
+_sections_unfolded = [ "Settings" ]
+

+ 13 - 0
2d/role_playing_game/theme/fonts/montserrat_extra_bold_48.tres

@@ -0,0 +1,13 @@
+[gd_resource type="DynamicFont" load_steps=2 format=2]
+
+[ext_resource path="res://theme/fonts/Montserrat-ExtraBold.otf" type="DynamicFontData" id=1]
+
+
+[resource]
+
+size = 48
+use_mipmaps = true
+use_filter = true
+font_data = ExtResource( 1 )
+_sections_unfolded = [ "Settings" ]
+

+ 13 - 0
2d/role_playing_game/theme/fonts/montserrat_extra_bold_62.tres

@@ -0,0 +1,13 @@
+[gd_resource type="DynamicFont" load_steps=2 format=2]
+
+[ext_resource path="res://theme/fonts/Montserrat-ExtraBold.otf" type="DynamicFontData" id=1]
+
+
+[resource]
+
+size = 62
+use_mipmaps = true
+use_filter = true
+font_data = ExtResource( 1 )
+_sections_unfolded = [ "Settings" ]
+

+ 32 - 0
2d/role_playing_game/theme/labels/Title.tscn

@@ -0,0 +1,32 @@
+[gd_scene load_steps=2 format=2]
+
+[ext_resource path="res://theme/fonts/montserrat_extra_bold_48.tres" type="DynamicFont" id=1]
+
+[node name="Title" type="Label"]
+
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_right = 113.0
+margin_bottom = 60.0
+rect_pivot_offset = Vector2( 0, 0 )
+rect_clip_content = false
+mouse_filter = 2
+mouse_default_cursor_shape = 0
+size_flags_horizontal = 1
+size_flags_vertical = 4
+custom_fonts/font = ExtResource( 1 )
+custom_colors/font_color = Color( 1, 1, 1, 1 )
+custom_colors/font_color_shadow = Color( 1, 0.596078, 0, 1 )
+custom_constants/shadow_offset_y = 5
+text = "Title"
+align = 1
+autowrap = true
+clip_text = true
+percent_visible = 1.0
+lines_skipped = 0
+max_lines_visible = -1
+_sections_unfolded = [ "Rect", "custom_colors", "custom_constants", "custom_fonts" ]
+
+

BIN
2d/role_playing_game/theme/panel/panel_rect.png


+ 29 - 0
2d/role_playing_game/theme/panel/panel_rect.png.import

@@ -0,0 +1,29 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/panel_rect.png-52b8de43da3f3ba3a0682eb789a33286.stex"
+
+[deps]
+
+source_file="res://theme/panel/panel_rect.png"
+dest_files=[ "res://.import/panel_rect.png-52b8de43da3f3ba3a0682eb789a33286.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

BIN
2d/role_playing_game/theme/progressbar/background.png


+ 29 - 0
2d/role_playing_game/theme/progressbar/background.png.import

@@ -0,0 +1,29 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/background.png-db91f961480760b8bfa082076dc72dbd.stex"
+
+[deps]
+
+source_file="res://theme/progressbar/background.png"
+dest_files=[ "res://.import/background.png-db91f961480760b8bfa082076dc72dbd.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

BIN
2d/role_playing_game/theme/progressbar/foreground_blue.png


+ 29 - 0
2d/role_playing_game/theme/progressbar/foreground_blue.png.import

@@ -0,0 +1,29 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/foreground_blue.png-1208ba20a94923d82a7b0eacc6914552.stex"
+
+[deps]
+
+source_file="res://theme/progressbar/foreground_blue.png"
+dest_files=[ "res://.import/foreground_blue.png-1208ba20a94923d82a7b0eacc6914552.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

BIN
2d/role_playing_game/theme/progressbar/foreground_red.png


+ 29 - 0
2d/role_playing_game/theme/progressbar/foreground_red.png.import

@@ -0,0 +1,29 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/foreground_red.png-60d00de182b78bd324a56c9f03008a15.stex"
+
+[deps]
+
+source_file="res://theme/progressbar/foreground_red.png"
+dest_files=[ "res://.import/foreground_red.png-60d00de182b78bd324a56c9f03008a15.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

+ 25 - 0
2d/role_playing_game/theme/progressbar/foreground_stylebox_blue.tres

@@ -0,0 +1,25 @@
+[gd_resource type="StyleBoxTexture" load_steps=2 format=2]
+
+[ext_resource path="res://theme/progressbar/foreground_blue.png" type="Texture" id=1]
+
+
+[resource]
+
+content_margin_left = -1.0
+content_margin_right = -1.0
+content_margin_top = -1.0
+content_margin_bottom = -1.0
+texture = ExtResource( 1 )
+region_rect = Rect2( 0, 0, 64, 64 )
+margin_left = 18.0
+margin_right = 18.0
+margin_top = 18.0
+margin_bottom = 18.0
+expand_margin_left = 0.0
+expand_margin_right = 0.0
+expand_margin_top = 0.0
+expand_margin_bottom = 0.0
+modulate_color = Color( 1, 1, 1, 1 )
+draw_center = true
+_sections_unfolded = [ "Margin" ]
+

+ 25 - 0
2d/role_playing_game/theme/progressbar/foreground_stylebox_red.tres

@@ -0,0 +1,25 @@
+[gd_resource type="StyleBoxTexture" load_steps=2 format=2]
+
+[ext_resource path="res://theme/progressbar/foreground_red.png" type="Texture" id=1]
+
+
+[resource]
+
+content_margin_left = -1.0
+content_margin_right = -1.0
+content_margin_top = -1.0
+content_margin_bottom = -1.0
+texture = ExtResource( 1 )
+region_rect = Rect2( 0, 0, 64, 64 )
+margin_left = 18.0
+margin_right = 18.0
+margin_top = 20.0
+margin_bottom = 20.0
+expand_margin_left = 0.0
+expand_margin_right = 0.0
+expand_margin_top = 0.0
+expand_margin_bottom = 0.0
+modulate_color = Color( 1, 1, 1, 1 )
+draw_center = true
+_sections_unfolded = [ "Margin" ]
+

+ 152 - 0
2d/role_playing_game/theme/theme.tres

@@ -0,0 +1,152 @@
+[gd_resource type="Theme" load_steps=14 format=2]
+
+[ext_resource path="res://theme/fonts/montserrat_extra_bold_32.tres" type="DynamicFont" id=1]
+[ext_resource path="res://theme/button/button_rect.png" type="Texture" id=2]
+[ext_resource path="res://theme/button/button_rect_pressed.png" type="Texture" id=3]
+[ext_resource path="res://theme/fonts/montserrat_extra_bold_24.tres" type="DynamicFont" id=4]
+[ext_resource path="res://theme/panel/panel_rect.png" type="Texture" id=5]
+[ext_resource path="res://theme/progressbar/background.png" type="Texture" id=6]
+[ext_resource path="res://theme/progressbar/foreground_stylebox_red.tres" type="StyleBox" id=7]
+
+[sub_resource type="StyleBoxEmpty" id=1]
+
+resource_name = "button_focus_style"
+content_margin_left = -1.0
+content_margin_right = -1.0
+content_margin_top = -1.0
+content_margin_bottom = -1.0
+_sections_unfolded = [ "Resource" ]
+
+[sub_resource type="StyleBoxTexture" id=2]
+
+content_margin_left = -1.0
+content_margin_right = -1.0
+content_margin_top = -1.0
+content_margin_bottom = -1.0
+texture = ExtResource( 2 )
+region_rect = Rect2( 0, 0, 128, 142 )
+margin_left = 32.0
+margin_right = 32.0
+margin_top = 36.0
+margin_bottom = 43.0
+expand_margin_left = 0.0
+expand_margin_right = 0.0
+expand_margin_top = 0.0
+expand_margin_bottom = 0.0
+modulate_color = Color( 1, 1, 1, 1 )
+draw_center = true
+_sections_unfolded = [ "Axis Stretch", "Margin", "Modulate", "Resource" ]
+
+[sub_resource type="StyleBoxTexture" id=3]
+
+content_margin_left = -1.0
+content_margin_right = -1.0
+content_margin_top = -1.0
+content_margin_bottom = -1.0
+texture = ExtResource( 2 )
+region_rect = Rect2( 0, 0, 128, 142 )
+margin_left = 32.0
+margin_right = 32.0
+margin_top = 36.0
+margin_bottom = 43.0
+expand_margin_left = 0.0
+expand_margin_right = 0.0
+expand_margin_top = 0.0
+expand_margin_bottom = 0.0
+modulate_color = Color( 1, 1, 1, 1 )
+draw_center = true
+_sections_unfolded = [ "Axis Stretch", "Margin", "Modulate", "Resource" ]
+
+[sub_resource type="StyleBoxTexture" id=4]
+
+content_margin_left = -1.0
+content_margin_right = -1.0
+content_margin_top = -1.0
+content_margin_bottom = -1.0
+texture = ExtResource( 3 )
+region_rect = Rect2( 0, 0, 128, 142 )
+margin_left = 32.0
+margin_right = 32.0
+margin_top = 40.0
+margin_bottom = 32.0
+expand_margin_left = 0.0
+expand_margin_right = 0.0
+expand_margin_top = 0.0
+expand_margin_bottom = 0.0
+modulate_color = Color( 1, 1, 1, 1 )
+draw_center = true
+_sections_unfolded = [ "Axis Stretch", "Margin", "Resource" ]
+
+[sub_resource type="StyleBoxTexture" id=5]
+
+content_margin_left = -1.0
+content_margin_right = -1.0
+content_margin_top = -1.0
+content_margin_bottom = -1.0
+texture = ExtResource( 5 )
+region_rect = Rect2( 0, 0, 128, 141 )
+margin_left = 90.0
+margin_right = 90.0
+margin_top = 35.0
+margin_bottom = 45.0
+expand_margin_left = 0.0
+expand_margin_right = 0.0
+expand_margin_top = 0.0
+expand_margin_bottom = 0.0
+modulate_color = Color( 1, 1, 1, 1 )
+draw_center = true
+_sections_unfolded = [ "Axis Stretch", "Resource" ]
+
+[sub_resource type="StyleBoxTexture" id=6]
+
+content_margin_left = -1.0
+content_margin_right = -1.0
+content_margin_top = -1.0
+content_margin_bottom = -1.0
+texture = ExtResource( 6 )
+region_rect = Rect2( 0, 0, 64, 64 )
+margin_left = 20.0
+margin_right = 20.0
+margin_top = 20.0
+margin_bottom = 20.0
+expand_margin_left = 0.0
+expand_margin_right = 0.0
+expand_margin_top = 0.0
+expand_margin_bottom = 0.0
+modulate_color = Color( 1, 1, 1, 1 )
+draw_center = true
+_sections_unfolded = [ "Margin", "Resource" ]
+
+[resource]
+
+default_font = ExtResource( 4 )
+Button/colors/font_color = Color( 0.686275, 0.741176, 0.768627, 1 )
+Button/colors/font_color_disabled = Color( 0.686275, 0.741176, 0.768627, 1 )
+Button/colors/font_color_hover = Color( 1, 1, 1, 1 )
+Button/colors/font_color_pressed = Color( 1, 1, 1, 1 )
+Button/constants/hseparation = 2
+Button/fonts/font = ExtResource( 1 )
+Button/styles/disabled = null
+Button/styles/focus = SubResource( 1 )
+Button/styles/hover = SubResource( 2 )
+Button/styles/normal = SubResource( 3 )
+Button/styles/pressed = SubResource( 4 )
+Label/colors/font_color = Color( 0.690196, 0.745098, 0.772549, 1 )
+Label/colors/font_color_shadow = Color( 1, 0.596078, 0, 0 )
+Label/constants/line_spacing = 3
+Label/constants/shadow_as_outline = 0
+Label/constants/shadow_offset_x = 0
+Label/constants/shadow_offset_y = 4
+Label/fonts/font = ExtResource( 4 )
+Label/styles/normal = null
+Panel/styles/panel = SubResource( 5 )
+Panel/styles/panelf = null
+Panel/styles/panelnc = null
+PanelContainer/styles/panel = SubResource( 5 )
+ProgressBar/colors/font_color = Color( 0.941176, 0.941176, 0.941176, 1 )
+ProgressBar/colors/font_color_shadow = Color( 0, 0, 0, 1 )
+ProgressBar/fonts/font = ExtResource( 4 )
+ProgressBar/styles/bg = SubResource( 6 )
+ProgressBar/styles/fg = ExtResource( 7 )
+_sections_unfolded = [ "Button", "Button/colors", "Label", "Panel/styles", "PanelContainer/styles", "ProgressBar", "ProgressBar/styles" ]
+

+ 31 - 0
2d/role_playing_game/turn_combat_system/actors/Actor.gd

@@ -0,0 +1,31 @@
+extends Node
+
+export (int) var damage = 1
+export (int) var defense = 1
+var active = false setget set_active
+
+signal turn_finished
+
+func set_active(value):
+	active = value
+	set_process(value)
+	set_process_input(value)
+	
+func attack(target):
+	target.take_damage(damage)
+	emit_signal("turn_finished")
+
+func defend():
+	$Health.armor += defense
+	emit_signal("turn_finished")
+
+func consume(item):
+	item.use(self)
+	emit_signal("turn_finished")
+	
+func flee():
+	emit_signal("turn_finished")
+	
+func take_damage(damage):
+	$Health.take_damage(damage)
+	$Sprite/AnimationPlayer.play("take_damage")

+ 14 - 0
2d/role_playing_game/turn_combat_system/actors/Actor.tscn

@@ -0,0 +1,14 @@
+[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 )]
+
+

+ 24 - 0
2d/role_playing_game/turn_combat_system/actors/health/Health.gd

@@ -0,0 +1,24 @@
+extends Node
+
+signal dead
+signal health_changed(life)
+
+export var life = 0
+export var max_life = 10
+export var armor = 0
+
+
+func take_damage(damage):
+	life = life - damage + armor
+	if life <= 0:
+		emit_signal('dead')
+	else:
+		emit_signal("health_changed", life)
+
+func heal(amount):
+	life += amount
+	clamp(life, life, max_life)
+	emit_signal("health_changed", life)
+
+func get_health_ratio():
+	return life / max_life

+ 12 - 0
2d/role_playing_game/turn_combat_system/actors/health/Health.tscn

@@ -0,0 +1,12 @@
+[gd_scene load_steps=2 format=2]
+
+[ext_resource path="res://turn_combat_system/actors/health/Health.gd" type="Script" id=1]
+
+[node name="Health" type="Node"]
+
+script = ExtResource( 1 )
+life = 0
+max_life = 10
+armor = 0
+
+

+ 52 - 0
2d/role_playing_game/turn_combat_system/turn_queue/TurnQueue.gd

@@ -0,0 +1,52 @@
+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)

+ 11 - 0
2d/role_playing_game/turn_combat_system/turn_queue/TurnQueue.tscn

@@ -0,0 +1,11 @@
+[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
+
+

Some files were not shown because too many files changed in this diff