From 3c61ce4e7fd0134bfb4b7c0b767779b836c70795 Mon Sep 17 00:00:00 2001 From: Yan Wittmann Date: Thu, 9 Jan 2025 16:45:32 +0100 Subject: [PATCH] Started writing visualization and added new state machine mode --- project/main-scenes/island.tscn | 13 +++-- project/scripts/global/CameraController.gd | 2 +- project/scripts/global/GameManager.gd | 12 +++-- project/scripts/player/tree/Task.gd | 4 +- .../player/tree/impl/base/GoToRunning.gd | 3 +- .../player/tree/impl/base/GoToSuccess.gd | 3 +- .../impl/base/GoToWhileRunningSuccessStop.gd | 27 ++++++++++ .../player/tree/impl/base/TaskSelector.gd | 7 +++ .../player/tree/impl/base/TaskSequence.gd | 7 +++ project/scripts/tilemap/StepVisualization.gd | 53 +++++++++++++++++++ project/scripts/tilemap/TilemapNavigation.gd | 6 ++- project/scripts/tilemap/World.gd | 4 +- 12 files changed, 126 insertions(+), 15 deletions(-) create mode 100644 project/scripts/player/tree/impl/base/GoToWhileRunningSuccessStop.gd create mode 100644 project/scripts/tilemap/StepVisualization.gd diff --git a/project/main-scenes/island.tscn b/project/main-scenes/island.tscn index 6dd6483..88ecba4 100644 --- a/project/main-scenes/island.tscn +++ b/project/main-scenes/island.tscn @@ -4,14 +4,14 @@ [ext_resource type="Script" path="res://scripts/tilemap/World.gd" id="1_k0rw8"] [ext_resource type="TileSet" uid="uid://bi836ygcmyvhb" path="res://assets/tilemap/tileset.tres" id="1_vlccq"] [ext_resource type="Script" path="res://scripts/global/CameraController.gd" id="2_k51iv"] -[ext_resource type="Material" uid="uid://ckg3be082ny3h" path="res://assets/shader/shader_vignette.tres" id="2_spils"] [ext_resource type="Script" path="res://scripts/player/PlayerManager.gd" id="4_1xqo1"] +[ext_resource type="Script" path="res://scripts/tilemap/StepVisualization.gd" id="5_sr2su"] [ext_resource type="Script" path="res://scripts/player/tree/BehaviorTree.gd" id="6_efs30"] [ext_resource type="Script" path="res://scripts/player/tree/impl/base/TaskSelector.gd" id="7_1jajd"] [ext_resource type="Script" path="res://scripts/player/tree/impl/testing/WalkUpToMouse.gd" id="8_s6mqc"] [ext_resource type="Script" path="res://scripts/player/tree/impl/base/TaskSequence.gd" id="9_i67mw"] +[ext_resource type="Script" path="res://scripts/player/tree/impl/base/GoToWhileRunningSuccessStop.gd" id="10_4v1m1"] [ext_resource type="Script" path="res://scripts/player/tree/impl/game/critical_survival/TaskCheckFoodCritical.gd" id="10_sf2pi"] -[ext_resource type="Script" path="res://scripts/player/tree/impl/base/GoToSuccess.gd" id="11_84a4v"] [node name="Island-scene" type="Node2D"] script = ExtResource("1_eeg2d") @@ -22,7 +22,7 @@ script = ExtResource("2_k51iv") [node name="CanvasLayer" type="CanvasLayer" parent="Camera2D"] [node name="Vignette" type="ColorRect" parent="Camera2D/CanvasLayer"] -material = ExtResource("2_spils") +visible = false anchors_preset = 15 anchor_right = 1.0 anchor_bottom = 1.0 @@ -65,6 +65,9 @@ tile_set = ExtResource("1_vlccq") [node name="NavigationVisualization" type="TileMapLayer" parent="Tileset"] tile_set = ExtResource("1_vlccq") +[node name="StepVisualization" type="Node2D" parent="Tileset"] +script = ExtResource("5_sr2su") + [node name="PlayerManager" type="Node" parent="."] script = ExtResource("4_1xqo1") @@ -83,8 +86,8 @@ script = ExtResource("9_i67mw") [node name="TaskCheckFoodCritical" type="Node" parent="PlayerManager/BehaviorTree/sl_Root/sl_CriticalSurvival/sq_Food"] script = ExtResource("10_sf2pi") -[node name="GoToSuccess" type="Node" parent="PlayerManager/BehaviorTree/sl_Root/sl_CriticalSurvival/sq_Food"] -script = ExtResource("11_84a4v") +[node name="GoToWhileRunningSuccessStop" type="Node" parent="PlayerManager/BehaviorTree/sl_Root/sl_CriticalSurvival/sq_Food"] +script = ExtResource("10_4v1m1") [node name="WalkUpToMouse" type="Node" parent="PlayerManager/BehaviorTree/sl_Root"] script = ExtResource("8_s6mqc") diff --git a/project/scripts/global/CameraController.gd b/project/scripts/global/CameraController.gd index 2c23a3e..65161ee 100644 --- a/project/scripts/global/CameraController.gd +++ b/project/scripts/global/CameraController.gd @@ -3,7 +3,7 @@ extends Camera2D @onready var shader_vignette: ColorRect = $CanvasLayer/Vignette -@export var border_acceleration: float = 0 # 2000.0 +@export var border_acceleration: float = 2000.0 @export var max_speed: float = 500.0 @export var inner_border_threshold: float = 60.0 @export var outer_border_threshold: float = 40.0 diff --git a/project/scripts/global/GameManager.gd b/project/scripts/global/GameManager.gd index 08014b7..ac8759b 100644 --- a/project/scripts/global/GameManager.gd +++ b/project/scripts/global/GameManager.gd @@ -4,7 +4,7 @@ extends Node @onready var world: World = $Tileset @onready var player: PlayerManager = $PlayerManager @onready var camera: CameraController = $Camera2D as CameraController -@onready var game_ticker: Timer = $GameTick +@onready var game_ticker: Timer = $GameTick var tilemap_navigation: TilemapNavigation = TilemapNavigation.new() @@ -14,7 +14,11 @@ func _ready() -> void: tilemap_navigation.player = player player.game_manager = self world.camp_manager.game_manager = self - # game_ticker.start() + world.step_visualizer.game_manager = self + world.step_visualizer.world = world + + +# game_ticker.start() func _process(delta: float) -> void: @@ -27,7 +31,7 @@ func _process(delta: float) -> void: world.camp_manager.sleep_effect() world.camp_manager.campfire_extinguish() if Input.is_action_just_pressed("force_game_tick"): - player.game_tick() + _on_game_tick_timeout() func player_health_depleted(): @@ -39,6 +43,8 @@ func _on_game_tick_timeout() -> void: var timer_on_game_tick_timeout: PerformanceTimer = PerformanceTimer.new() timer_on_game_tick_timeout.display_name = "game tick duration" tilemap_navigation.game_tick_start() + world.step_visualizer.game_tick_start() player.game_tick() tilemap_navigation.game_tick_end() + world.step_visualizer.game_tick_end() timer_on_game_tick_timeout.stop() diff --git a/project/scripts/player/tree/Task.gd b/project/scripts/player/tree/Task.gd index 7ed7455..a2c7944 100644 --- a/project/scripts/player/tree/Task.gd +++ b/project/scripts/player/tree/Task.gd @@ -1,7 +1,7 @@ class_name Task extends Node -enum {FAILURE = -1, SUCCESS = 1, RUNNING = 0} +enum {FAILURE = -1, SUCCESS = 1, RUNNING = 0, SUCCESS_STOP = 2} var status: int = FAILURE var status_reason: String = "" var tilemap_types: TileMapTileTypes = TileMapTileTypes.new() @@ -71,6 +71,8 @@ func human_readable(addon: String = "") -> String: clear_status = "SUCCESS" elif status == RUNNING: clear_status = "RUNNING" + elif status == SUCCESS_STOP: + clear_status = "SUCCESS_STOP" var ret: String = name; if addon != "": diff --git a/project/scripts/player/tree/impl/base/GoToRunning.gd b/project/scripts/player/tree/impl/base/GoToRunning.gd index 29c2e85..5552f77 100644 --- a/project/scripts/player/tree/impl/base/GoToRunning.gd +++ b/project/scripts/player/tree/impl/base/GoToRunning.gd @@ -16,11 +16,12 @@ func run(blackboard: Dictionary) -> void: status_reason = "path was empty" return + player.walk_along(path) + if navigation.has_arrived(player.board_position, path): status = SUCCESS status_reason = "already arrived at destination" return - player.walk_along(path) status = RUNNING status_reason = "walked along path, now at " + str(player.board_position) diff --git a/project/scripts/player/tree/impl/base/GoToSuccess.gd b/project/scripts/player/tree/impl/base/GoToSuccess.gd index 221d821..cd261d6 100644 --- a/project/scripts/player/tree/impl/base/GoToSuccess.gd +++ b/project/scripts/player/tree/impl/base/GoToSuccess.gd @@ -16,11 +16,12 @@ func run(blackboard: Dictionary) -> void: status_reason = "path was empty" return + player.walk_along(path) + if navigation.has_arrived(player.board_position, path): status = SUCCESS status_reason = "already arrived at destination" return - player.walk_along(path) status = SUCCESS status_reason = "walked along path, now at " + str(player.board_position) diff --git a/project/scripts/player/tree/impl/base/GoToWhileRunningSuccessStop.gd b/project/scripts/player/tree/impl/base/GoToWhileRunningSuccessStop.gd new file mode 100644 index 0000000..64c35e6 --- /dev/null +++ b/project/scripts/player/tree/impl/base/GoToWhileRunningSuccessStop.gd @@ -0,0 +1,27 @@ +class_name GoToWhileRunningSuccessStop +extends Task + +func run(blackboard: Dictionary) -> void: + var player: PlayerManager = blackboard["player"] + var navigation: TilemapNavigation = blackboard["navigation"] + + if not blackboard.has("path"): + status = FAILURE + status_reason = "blackboard did not have path" + return + + var path: Array[Vector2i] = blackboard["path"] + if path.size() == 0: + status = FAILURE + status_reason = "path was empty" + return + + player.walk_along(path) + + if navigation.has_arrived(player.board_position, path): + status = SUCCESS + status_reason = "already arrived at destination" + return + + status = SUCCESS_STOP + status_reason = "walked along path, now at " + str(player.board_position) diff --git a/project/scripts/player/tree/impl/base/TaskSelector.gd b/project/scripts/player/tree/impl/base/TaskSelector.gd index 2cdd883..5db9acc 100644 --- a/project/scripts/player/tree/impl/base/TaskSelector.gd +++ b/project/scripts/player/tree/impl/base/TaskSelector.gd @@ -4,7 +4,14 @@ extends Task func run(blackboard: Dictionary) -> void: for c in self.get_children(): run_child(blackboard, c) + if c.status == SUCCESS_STOP: + c.status = SUCCESS + status = SUCCESS + status_reason = "stopping at child " + c.name + ", as it returned SUCCESS_STOP" + return if c.status != FAILURE: status = c.status + status_reason = "stopped at child " + c.name return status = FAILURE + status_reason = "all children failed" diff --git a/project/scripts/player/tree/impl/base/TaskSequence.gd b/project/scripts/player/tree/impl/base/TaskSequence.gd index f7a7b80..789f216 100644 --- a/project/scripts/player/tree/impl/base/TaskSequence.gd +++ b/project/scripts/player/tree/impl/base/TaskSequence.gd @@ -4,7 +4,14 @@ extends Task func run(blackboard: Dictionary) -> void: for c in self.get_children(): run_child(blackboard, c) + if c.status == SUCCESS_STOP: + c.status = SUCCESS + status = SUCCESS + status_reason = "stopping at child " + c.name + ", as it returned SUCCESS_STOP" + return if c.status != SUCCESS: status = c.status + status_reason = "stopped at child " + c.name return status = SUCCESS + status_reason = "all children succeeded" diff --git a/project/scripts/tilemap/StepVisualization.gd b/project/scripts/tilemap/StepVisualization.gd new file mode 100644 index 0000000..7d9c880 --- /dev/null +++ b/project/scripts/tilemap/StepVisualization.gd @@ -0,0 +1,53 @@ +class_name StepVisualization +extends Node2D + +static var game_manager: GameManager +static var world: World +# +# Dictionary[Array[Vector2i], bool] ([from, to], string) +static var draw_lines: Dictionary = {} + + +static func add_line(from: Vector2i, to: Vector2i, label: String) -> void: + draw_lines[[from, to]] = label + + +static func add_line_tileset(from: Vector2i, to: Vector2i, label: String) -> void: + var add_factor: Vector2i = world.tilemap_ground.tilemap.tile_set.tile_size + add_factor.x /= 2 + add_factor.y /= 2 + + var from_tileset: Vector2i = world.tilemap_ground.cell_to_local(from) + from_tileset.x += add_factor.x + from_tileset.y += add_factor.y + + var to_tileset: Vector2i = world.tilemap_ground.cell_to_local(to) + to_tileset.x += add_factor.x + to_tileset.y += add_factor.y + + draw_lines[[from_tileset, to_tileset]] = label + + +func game_tick_start(): + draw_lines.clear() + + +func game_tick_end(): + queue_redraw() + +var label_font = Control.new().get_theme_default_font() + + +func _ready() -> void: + pass + + +func _draw() -> void: + # draw all draw_lines with their labels + for key in draw_lines.keys(): + var from: Vector2i = key[0] + var to: Vector2i = key[1] + var label: String = draw_lines[key] + draw_line(from, to, Color("red"), 2) + var center: Vector2 = (from + to) / 2 + draw_string(label_font, center, label) diff --git a/project/scripts/tilemap/TilemapNavigation.gd b/project/scripts/tilemap/TilemapNavigation.gd index 5f90687..c5bbd5c 100644 --- a/project/scripts/tilemap/TilemapNavigation.gd +++ b/project/scripts/tilemap/TilemapNavigation.gd @@ -13,7 +13,7 @@ var chosen_path: Array[Vector2i] = [] func game_tick_start() -> void: - found_paths = {} + found_paths.clear() failed_positions = [] chosen_path = [] @@ -37,7 +37,9 @@ func is_within_radius(position: Vector2i, center: Vector2i, radius: int) -> bool static func manhattan_distance(a: Vector2i, b: Vector2i) -> int: - return abs(a.x - b.x) + abs(a.y - b.y) + var dist: int = abs(a.x - b.x) + abs(a.y - b.y) + # StepVisualization.add_line_tileset(a, b, str(dist)) + return dist func manhattan_distance_closest(options: Array[Vector2i], target: Vector2i) -> Vector2i: diff --git a/project/scripts/tilemap/World.gd b/project/scripts/tilemap/World.gd index 06e7405..1052956 100644 --- a/project/scripts/tilemap/World.gd +++ b/project/scripts/tilemap/World.gd @@ -9,8 +9,10 @@ var tilemap_interactive: TileMapLayerAccess = TileMapLayerAccess.new() var tilemap_player: TileMapLayerAccess = TileMapLayerAccess.new() var tilemap_temperature: TileMapLayerAccess = TileMapLayerAccess.new() var tilemap_nav_vis: TileMapLayerAccess = TileMapLayerAccess.new() -# other nodes +# managers var camp_manager: CampManager = CampManager.new() +# visualization +@onready var step_visualizer: StepVisualization = $StepVisualization func _ready() -> void: