From b89131bbaa393a9fd1f2f9b9ab79efed466aefec Mon Sep 17 00:00:00 2001 From: Yan Wittmann Date: Thu, 9 Jan 2025 17:54:24 +0100 Subject: [PATCH] Added first real behavior --- project/main-scenes/island.tscn | 24 +++++++++++++++---- project/scripts/global/EventsTracker.gd | 2 ++ project/scripts/player/PlayerManager.gd | 15 +++++++++++- .../TaskCheckFoodCritical.gd | 7 ++++++ .../inventory/TaskEatFoodFromInventory.gd | 16 +++++++++++++ .../impl/game/inventory/TaskPickupBerry.gd | 11 +++++++++ project/scripts/tilemap/StepVisualization.gd | 19 +++++---------- project/scripts/tilemap/TileMapLayerAccess.gd | 2 +- project/scripts/tilemap/TilemapNavigation.gd | 9 +++---- 9 files changed, 82 insertions(+), 23 deletions(-) create mode 100644 project/scripts/player/tree/impl/game/inventory/TaskEatFoodFromInventory.gd create mode 100644 project/scripts/player/tree/impl/game/inventory/TaskPickupBerry.gd diff --git a/project/main-scenes/island.tscn b/project/main-scenes/island.tscn index 88ecba4..be39ec9 100644 --- a/project/main-scenes/island.tscn +++ b/project/main-scenes/island.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=13 format=4 uid="uid://b88asko1ugyd2"] +[gd_scene load_steps=15 format=4 uid="uid://b88asko1ugyd2"] [ext_resource type="Script" path="res://scripts/global/GameManager.gd" id="1_eeg2d"] [ext_resource type="Script" path="res://scripts/tilemap/World.gd" id="1_k0rw8"] @@ -11,12 +11,15 @@ [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/inventory/TaskEatFoodFromInventory.gd" id="10_70s0w"] [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/game/inventory/TaskPickupBerry.gd" id="13_mljce"] [node name="Island-scene" type="Node2D"] script = ExtResource("1_eeg2d") [node name="Camera2D" type="Camera2D" parent="."] +position = Vector2(352, 235) script = ExtResource("2_k51iv") [node name="CanvasLayer" type="CanvasLayer" parent="Camera2D"] @@ -67,6 +70,7 @@ tile_set = ExtResource("1_vlccq") [node name="StepVisualization" type="Node2D" parent="Tileset"] script = ExtResource("5_sr2su") +text_color = Color(0.16133, 0.00745911, 0.0516868, 1) [node name="PlayerManager" type="Node" parent="."] script = ExtResource("4_1xqo1") @@ -80,15 +84,27 @@ script = ExtResource("7_1jajd") [node name="sl_CriticalSurvival" type="Node" parent="PlayerManager/BehaviorTree/sl_Root"] script = ExtResource("7_1jajd") -[node name="sq_Food" type="Node" parent="PlayerManager/BehaviorTree/sl_Root/sl_CriticalSurvival"] +[node name="sl_Food" type="Node" parent="PlayerManager/BehaviorTree/sl_Root/sl_CriticalSurvival"] +script = ExtResource("7_1jajd") + +[node name="sq_FoodInInventory" type="Node" parent="PlayerManager/BehaviorTree/sl_Root/sl_CriticalSurvival/sl_Food"] script = ExtResource("9_i67mw") -[node name="TaskCheckFoodCritical" type="Node" parent="PlayerManager/BehaviorTree/sl_Root/sl_CriticalSurvival/sq_Food"] +[node name="TaskEatFoodFromInventory" type="Node" parent="PlayerManager/BehaviorTree/sl_Root/sl_CriticalSurvival/sl_Food/sq_FoodInInventory"] +script = ExtResource("10_70s0w") + +[node name="sq_NextFood" type="Node" parent="PlayerManager/BehaviorTree/sl_Root/sl_CriticalSurvival/sl_Food"] +script = ExtResource("9_i67mw") + +[node name="TaskCheckFoodCritical" type="Node" parent="PlayerManager/BehaviorTree/sl_Root/sl_CriticalSurvival/sl_Food/sq_NextFood"] script = ExtResource("10_sf2pi") -[node name="GoToWhileRunningSuccessStop" type="Node" parent="PlayerManager/BehaviorTree/sl_Root/sl_CriticalSurvival/sq_Food"] +[node name="GoToWhileRunningSuccessStop" type="Node" parent="PlayerManager/BehaviorTree/sl_Root/sl_CriticalSurvival/sl_Food/sq_NextFood"] script = ExtResource("10_4v1m1") +[node name="TaskPickupBerry" type="Node" parent="PlayerManager/BehaviorTree/sl_Root/sl_CriticalSurvival/sl_Food/sq_NextFood"] +script = ExtResource("13_mljce") + [node name="WalkUpToMouse" type="Node" parent="PlayerManager/BehaviorTree/sl_Root"] script = ExtResource("8_s6mqc") diff --git a/project/scripts/global/EventsTracker.gd b/project/scripts/global/EventsTracker.gd index 43e3e3f..e2fac6b 100644 --- a/project/scripts/global/EventsTracker.gd +++ b/project/scripts/global/EventsTracker.gd @@ -9,6 +9,8 @@ enum Event { CAMP_TAKEN_ITEM, CAMP_TAKE_ITEM_FAILED, SLEEP, + PLAYER_PICKED_UP_ITEM, + PLAYER_DROPPED_ITEM, }; # static var events: Array[TrackedEvent] = [] diff --git a/project/scripts/player/PlayerManager.gd b/project/scripts/player/PlayerManager.gd index c83517a..ceca2fc 100644 --- a/project/scripts/player/PlayerManager.gd +++ b/project/scripts/player/PlayerManager.gd @@ -3,16 +3,22 @@ extends Node @onready var inventory_label: Label = %InventoryLabel +# food system @export var food_damage: int = 1 +@export var food_addon_per_berry: int = 100 +@export var food_critical_threshold: int = 50 +# temperature @export var temperature_damage: int = 1 @export var temperature_endure: int = 50 +# viewing @export var view_distance: int = 50 var tilemap_types: TileMapTileTypes = TileMapTileTypes.new() # var game_manager: GameManager = null var last_board_position: Vector2i = Vector2i(0, 0) -var board_position: Vector2i = Vector2i(0, 0): + +var board_position: Vector2i = Vector2i(0, 0): set(value): last_board_position = board_position board_position = value @@ -24,6 +30,7 @@ var food: int = 0 # var water: int = 0 var temperature_timer: int = 0 var health: int = 0 + # var inventory_slot: Vector2i = tilemap_types.EMPTY: set(value): @@ -96,9 +103,13 @@ func pick_up_item(tilemap_pos: Vector2i) -> void: else: game_manager.world.tilemap_interactive.clear_cell(tilemap_pos) print("Picked up item: ", pick_up_item_type) + EventsTracker.track(EventsTracker.Event.PLAYER_PICKED_UP_ITEM, {"item": pick_up_item_type}) + else: # inventory is full, swap the item print("Inventory is full. Swapping item: ", inventory_slot, " with item: ", pick_up_item_type) + EventsTracker.track(EventsTracker.Event.PLAYER_DROPPED_ITEM, {"item": inventory_slot}) + EventsTracker.track(EventsTracker.Event.PLAYER_PICKED_UP_ITEM, {"item": pick_up_item_type}) if tile_after_pickup_transform: game_manager.world.tilemap_interactive.set_cell(tilemap_pos, tile_after_pickup_transform) var drop_location: Vector2i = game_manager.world.find_item_drop_location(tilemap_pos) @@ -185,6 +196,8 @@ func tick_handle_temperature(cell_temperature: int): func tick_handle_food(): + if food > 0: + food -= 1 if food <= 0: health -= food_damage diff --git a/project/scripts/player/tree/impl/game/critical_survival/TaskCheckFoodCritical.gd b/project/scripts/player/tree/impl/game/critical_survival/TaskCheckFoodCritical.gd index 9d16af7..1b68517 100644 --- a/project/scripts/player/tree/impl/game/critical_survival/TaskCheckFoodCritical.gd +++ b/project/scripts/player/tree/impl/game/critical_survival/TaskCheckFoodCritical.gd @@ -6,6 +6,11 @@ func run(blackboard: Dictionary) -> void: var player: PlayerManager = blackboard["player"] var navigation: TilemapNavigation = blackboard["navigation"] + if player.food > player.food_critical_threshold: + status = FAILURE + status_reason = "Player food is not critical (" + str(player.food) + " > " + str(player.food_critical_threshold) + ")" + return + var active_foods: Array[Vector2i] = world.tilemap_interactive.get_cells_by_type_collection( tilemap_types.OBJECT_COLLECTION_BERRY_SOURCE, player.board_position, player.view_distance) if len(active_foods) == 0: @@ -19,6 +24,8 @@ func run(blackboard: Dictionary) -> void: status_reason = "No closest berry found" return + blackboard["closest_berry"] = closest_berry + var path: Array[Vector2i] = navigation.find_path_allow_neighbors(player.board_position, closest_berry, player.view_distance) if path.size() > 0: blackboard["path"] = path diff --git a/project/scripts/player/tree/impl/game/inventory/TaskEatFoodFromInventory.gd b/project/scripts/player/tree/impl/game/inventory/TaskEatFoodFromInventory.gd new file mode 100644 index 0000000..9b6f62e --- /dev/null +++ b/project/scripts/player/tree/impl/game/inventory/TaskEatFoodFromInventory.gd @@ -0,0 +1,16 @@ +class_name TaskEatFoodFromInventory +extends Task + +func run(blackboard: Dictionary) -> void: + var player: PlayerManager = blackboard["player"] + + if player.inventory_slot != tilemap_types.OBJECT_I_BERRY: + status = FAILURE + status_reason = "Inventory does not contain berry" + return + + player.inventory_slot = tilemap_types.EMPTY + player.food += player.food_addon_per_berry + + status = SUCCESS + status_reason = "Ate berry, player now has " + str(player.food) + " food" diff --git a/project/scripts/player/tree/impl/game/inventory/TaskPickupBerry.gd b/project/scripts/player/tree/impl/game/inventory/TaskPickupBerry.gd new file mode 100644 index 0000000..e52f57b --- /dev/null +++ b/project/scripts/player/tree/impl/game/inventory/TaskPickupBerry.gd @@ -0,0 +1,11 @@ +class_name TaskPickupBerry +extends Task + +func run(blackboard: Dictionary) -> void: + var player: PlayerManager = blackboard["player"] + var closest_berry: Vector2i = blackboard["closest_berry"] + + player.pick_up_item(closest_berry) + + status = SUCCESS + status_reason = "Picked up berry" diff --git a/project/scripts/tilemap/StepVisualization.gd b/project/scripts/tilemap/StepVisualization.gd index 7d9c880..3e4041d 100644 --- a/project/scripts/tilemap/StepVisualization.gd +++ b/project/scripts/tilemap/StepVisualization.gd @@ -13,18 +13,8 @@ static func add_line(from: Vector2i, to: Vector2i, label: String) -> void: 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 - + var to_tileset: Vector2i = world.tilemap_ground.cell_to_local(to) draw_lines[[from_tileset, to_tileset]] = label @@ -37,6 +27,9 @@ func game_tick_end(): var label_font = Control.new().get_theme_default_font() +@export var line_color: Color = Color("red") +@export var text_color: Color = Color("white") + func _ready() -> void: pass @@ -48,6 +41,6 @@ func _draw() -> void: var from: Vector2i = key[0] var to: Vector2i = key[1] var label: String = draw_lines[key] - draw_line(from, to, Color("red"), 2) + draw_line(from, to, line_color, 2) var center: Vector2 = (from + to) / 2 - draw_string(label_font, center, label) + draw_string(label_font, center, label, 0, -1, 12, text_color) diff --git a/project/scripts/tilemap/TileMapLayerAccess.gd b/project/scripts/tilemap/TileMapLayerAccess.gd index 42f42fa..0a6f2af 100644 --- a/project/scripts/tilemap/TileMapLayerAccess.gd +++ b/project/scripts/tilemap/TileMapLayerAccess.gd @@ -23,7 +23,7 @@ func get_cells_by_type_collection( if max_distance < 99999999: var filtered_tiles: Array[Vector2i] = [] for tile in tiles_with_type: - if TilemapNavigation.manhattan_distance(center, tile) <= max_distance: + if TilemapNavigation.manhattan_distance(center, tile, true) <= max_distance: filtered_tiles.append(tile) return filtered_tiles return tiles_with_type diff --git a/project/scripts/tilemap/TilemapNavigation.gd b/project/scripts/tilemap/TilemapNavigation.gd index c5bbd5c..37b5332 100644 --- a/project/scripts/tilemap/TilemapNavigation.gd +++ b/project/scripts/tilemap/TilemapNavigation.gd @@ -32,13 +32,14 @@ func game_tick_end() -> void: world.tilemap_nav_vis.set_cell(chosen_path[chosen_path.size() - 1], tilemap_types.NAVIGATION_TARGET) -func is_within_radius(position: Vector2i, center: Vector2i, radius: int) -> bool: - return TilemapNavigation.manhattan_distance(position, center) <= radius +func is_within_radius(position: Vector2i, center: Vector2i, radius: int, record: bool = false) -> bool: + return TilemapNavigation.manhattan_distance(position, center, record) <= radius -static func manhattan_distance(a: Vector2i, b: Vector2i) -> int: +static func manhattan_distance(a: Vector2i, b: Vector2i, record: bool = false) -> int: var dist: int = abs(a.x - b.x) + abs(a.y - b.y) - # StepVisualization.add_line_tileset(a, b, str(dist)) + if record: + StepVisualization.add_line_tileset(a, b, str(dist)) return dist