diff options
-rw-r--r-- | scenes/Main.tscn | 4 | ||||
-rw-r--r-- | scripts/player.gd | 55 | ||||
-rw-r--r-- | scripts/player.gd.uid | 1 | ||||
-rw-r--r-- | scripts/tower_manager.gd | 30 | ||||
-rw-r--r-- | scripts/tower_manager.gd.uid | 1 |
5 files changed, 90 insertions, 1 deletions
diff --git a/scenes/Main.tscn b/scenes/Main.tscn index 804177d..cf7c8c7 100644 --- a/scenes/Main.tscn +++ b/scenes/Main.tscn @@ -1,8 +1,9 @@ -[gd_scene load_steps=6 format=3 uid="uid://chwnewu8l45kj"] +[gd_scene load_steps=7 format=3 uid="uid://chwnewu8l45kj"] [ext_resource type="Script" uid="uid://i5bjnah05h14" path="res://scripts/wave_spawner.gd" id="2_0bbpv"] [ext_resource type="PackedScene" uid="uid://cdgeamr56c0mx" path="res://scenes/map.tscn" id="2_vcsgt"] [ext_resource type="PackedScene" uid="uid://cq6d7gmjbwl14" path="res://scenes/player.tscn" id="4_rarhs"] +[ext_resource type="Script" uid="uid://bxnjjp3at6ht3" path="res://scripts/tower_manager.gd" id="4_vcsgt"] [ext_resource type="PackedScene" uid="uid://dycgp3yept14k" path="res://scenes/ui.tscn" id="5_vcsgt"] [sub_resource type="GDScript" id="GDScript_rarhs"] @@ -38,6 +39,7 @@ script = ExtResource("2_0bbpv") autostart = true [node name="Defenders" type="Node" parent="."] +script = ExtResource("4_vcsgt") [node name="GridManager" type="Node" parent="."] script = SubResource("GDScript_rarhs") diff --git a/scripts/player.gd b/scripts/player.gd new file mode 100644 index 0000000..c890542 --- /dev/null +++ b/scripts/player.gd @@ -0,0 +1,55 @@ +extends Node2D + +var game_stats_config = preload("res://resources/game_stats_config.tres") +@onready var map_config = preload("res://resources/map_generator_resource.tres") +@onready var _tm = get_node("../Defenders") + +var _max_x : int +var _max_y : int + +var dirs = {"move_right": Vector2.RIGHT, + "move_left": Vector2.LEFT, + "move_up": Vector2.UP, + "move_down": Vector2.DOWN} + +var towers : Dictionary[String, Dictionary] = { + "place_warlock": { + "scene": preload("res://scenes/warlock.tscn"), + "cost": game_stats_config.defenders["warlock"]["cost"], + }, + "place_wyvern": { + "scene": preload("res://scenes/wyvern.tscn"), + "cost": game_stats_config.defenders["wyvern"]["cost"], + }, + #"place_werewolf": { + #"scene": preload("res://scenes/werewolf.tscn"), + #"cost": game_stats_config.defenders["werewolf"]["cost"], + #}, + #"place_wellspring": { + #"scene": preload("res://scenes/wellspring.tscn"), + #"cost": game_stats_config.defenders["werewolf"]["cost"], + #}, +} + +func _ready(): + _max_x = map_config.grid_width * map_config.tile_size + _max_y = map_config.grid_height * map_config.tile_size + position = position.snapped(Vector2.ONE * map_config.tile_size) + position += Vector2.ONE * map_config.tile_size / 2 + +func _unhandled_input(event): + for dir in dirs.keys(): + if event.is_action_pressed(dir): + handle_move(dirs[dir]) + return + for tower in towers.keys(): + if event.is_action_pressed(tower): + _tm.place_tower(towers[tower], position) + return + +func handle_move(dir): + position += dir * map_config.tile_size + position.x = max(position.x, map_config.tile_size / 2) + position.y = max(position.y, map_config.tile_size / 2) + position.x = min(position.x, _max_x - (map_config.tile_size / 2)) + position.y = min(position.y, _max_y - (map_config.tile_size / 2)) diff --git a/scripts/player.gd.uid b/scripts/player.gd.uid new file mode 100644 index 0000000..015cefa --- /dev/null +++ b/scripts/player.gd.uid @@ -0,0 +1 @@ +uid://bwiimenoyb5og diff --git a/scripts/tower_manager.gd b/scripts/tower_manager.gd new file mode 100644 index 0000000..250b66b --- /dev/null +++ b/scripts/tower_manager.gd @@ -0,0 +1,30 @@ +extends Node + +@onready var _tiles : TileMapLayer = get_node("../Map/TileMapLayer") +var _towers : Dictionary + +func _ready(): + _towers = {} + +func place_tower(tower : Dictionary, tile_position : Vector2i): + var tower_cost = tower["cost"] + if is_valid_placement_tile(tile_position) && GameData.get_life() >= tower_cost: + var tmp = tower["scene"].instantiate() + var path = get_tree().get_root().get_node("Main/Defenders") + path.add_child(tmp) + tmp.global_position = tile_position + occupy_tile(tile_position) + GameData.subtract_life(tower_cost) + +func is_valid_placement_tile(tile_position : Vector2i): + var tile_coords = _tiles.get_cell_atlas_coords(tile_position) + return (tile_coords == (Vector2i(-1, -1))) && (!is_tile_occupied(tile_position)) + +func is_tile_occupied(tile_position : Vector2i): + return _towers.has(tile_position) + +func occupy_tile(tile_position): + _towers[tile_position] = true + +func free_tile(tile_position): + _towers.erase(tile_position) diff --git a/scripts/tower_manager.gd.uid b/scripts/tower_manager.gd.uid new file mode 100644 index 0000000..7daf23f --- /dev/null +++ b/scripts/tower_manager.gd.uid @@ -0,0 +1 @@ +uid://bxnjjp3at6ht3 |