diff --git a/project/main-scenes/island.tscn b/project/main-scenes/island.tscn index b74d9ad..5ce2c93 100644 --- a/project/main-scenes/island.tscn +++ b/project/main-scenes/island.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=16 format=4 uid="uid://b88asko1ugyd2"] +[gd_scene load_steps=25 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"] @@ -14,7 +14,16 @@ [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"] +[ext_resource type="Script" path="res://scripts/player/tree/impl/game/critical_survival/TaskFindClosestFood.gd" id="13_60fwc"] +[ext_resource type="Script" path="res://scripts/player/tree/impl/game/inventory/TaskPickupTheBerry.gd" id="15_ccdxl"] +[ext_resource type="Script" path="res://scripts/player/tree/impl/game/critical_survival/TaskCheckTemperatureCold.gd" id="16_e38ya"] +[ext_resource type="Script" path="res://scripts/player/tree/impl/game/critical_survival/TaskCheckTemperatureNoBuff.gd" id="17_4plsj"] +[ext_resource type="Script" path="res://scripts/player/tree/impl/game/inventory/TaskUseStickFromInventory.gd" id="18_22dkn"] +[ext_resource type="Script" path="res://scripts/player/tree/impl/game/critical_survival/TaskFindClosestStick.gd" id="19_1orqu"] +[ext_resource type="Script" path="res://scripts/player/tree/impl/base/GoToRunning.gd" id="20_6aw6j"] +[ext_resource type="Script" path="res://scripts/player/tree/impl/game/inventory/TaskPickupStick.gd" id="20_uw2ce"] +[ext_resource type="Script" path="res://scripts/player/tree/impl/game/camp/TaskFindCamp.gd" id="21_cseat"] +[ext_resource type="Script" path="res://scripts/player/tree/impl/game/critical_survival/TaskFindClosestWarmTile.gd" id="21_np756"] [node name="Island-scene" type="Node2D"] script = ExtResource("1_eeg2d") @@ -81,7 +90,7 @@ tile_map_data = PackedByteArray("AAAOAAkAAQACAAAAAAANAAkAAQACAAAAAAANAAoAAQACAAA tile_set = ExtResource("1_vlccq") [node name="InteractiveObjectsLayer" type="TileMapLayer" parent="Tileset"] -tile_map_data = PackedByteArray("AAAKABkAAQAAAAQAAAAUAAYAAQADAAEAAAAXAAYAAQADAAAAAAAJAAkAAQADAAEAAAAFAAgAAQADAAEAAAAFAAwAAQADAAEAAAAJAAwAAQADAAEAAAAYABAAAQACAAQAAAARAAYAAQAEAAAAAAARABEAAQAGAAIAAAAQABEAAQAGAAEAAAAcABUAAQABAAEAAABCACMAAQACAAEAAABdAAkAAQACAAIAAABXADMAAQABAAIAAAA7ADUAAQADAAIAAAA8AAQAAQAEAAIAAAA=") +tile_map_data = PackedByteArray("AAAKABkAAQAAAAQAAAAUAAYAAQADAAEAAAAXAAYAAQADAAAAAAAJAAkAAQADAAEAAAAFAAgAAQADAAEAAAAFAAwAAQADAAEAAAAJAAwAAQADAAEAAAAYABAAAQACAAQAAAARABEAAQAGAAIAAAAQABEAAQAGAAEAAAAcABUAAQABAAEAAABCACMAAQACAAEAAABdAAkAAQACAAIAAABXADMAAQABAAIAAAA7ADUAAQADAAIAAAA8AAQAAQAEAAIAAAAPAAkAAQAEAAAAAAA=") tile_set = ExtResource("1_vlccq") [node name="PlayerLayer" type="TileMapLayer" parent="Tileset"] @@ -89,7 +98,7 @@ tile_map_data = PackedByteArray("AAAQAA4AAwAAAAAAAAA=") tile_set = ExtResource("1_vlccq") [node name="TemperatureLayer" type="TileMapLayer" parent="Tileset"] -tile_map_data = PackedByteArray("AAAAAAAAAgABAAAAAAAsAAYAAgABAAAAAAApAAYAAgABAAAAAAAqAAYAAgABAAAAAAArAAYAAgABAAAAAAAtAAYAAgABAAAAAAAuAAYAAgABAAAAAAAvAAYAAgABAAAAAAAwAAYAAgABAAAAAAAwAAcAAgABAAAAAAAvAAcAAgABAAAAAAAuAAcAAgABAAAAAAAtAAcAAgABAAAAAAAsAAcAAgABAAAAAAArAAcAAgABAAAAAAAqAAcAAgABAAAAAAAqAAgAAgABAAAAAAAqAAkAAgABAAAAAAArAAkAAgABAAAAAAAsAAkAAgABAAAAAAAtAAkAAgABAAAAAAAuAAkAAgABAAAAAAAuAAgAAgABAAAAAAAvAAgAAgABAAAAAAAwAAgAAgABAAAAAAAtAAgAAgABAAAAAAAsAAgAAgABAAAAAAArAAgAAgABAAAAAAA=") +tile_map_data = PackedByteArray("AAAAAAAAAgABAAAAAAAsAAYAAgABAAAAAAApAAYAAgABAAAAAAAqAAYAAgABAAAAAAArAAYAAgABAAAAAAAtAAYAAgABAAAAAAAuAAYAAgABAAAAAAAvAAYAAgABAAAAAAAwAAYAAgABAAAAAAAwAAcAAgABAAAAAAAvAAcAAgABAAAAAAAuAAcAAgABAAAAAAAtAAcAAgABAAAAAAAsAAcAAgABAAAAAAArAAcAAgABAAAAAAAqAAcAAgABAAAAAAAqAAgAAgABAAAAAAAqAAkAAgABAAAAAAArAAkAAgABAAAAAAAsAAkAAgABAAAAAAAtAAkAAgABAAAAAAAuAAkAAgABAAAAAAAuAAgAAgABAAAAAAAvAAgAAgABAAAAAAAwAAgAAgABAAAAAAAtAAgAAgABAAAAAAAsAAgAAgABAAAAAAArAAgAAgABAAAAAAALAAsAAgAAAAAAAAALAAwAAgAAAAAAAAALAA0AAgAAAAAAAAALAA4AAgAAAAAAAAALAA8AAgAAAAAAAAALABAAAgAAAAAAAAALABEAAgAAAAAAAAAMAAsAAgAAAAAAAAAMAAwAAgAAAAAAAAAMAA0AAgAAAAAAAAAMAA4AAgAAAAAAAAAMAA8AAgAAAAAAAAAMABAAAgAAAAAAAAAMABEAAgAAAAAAAAANAAsAAgAAAAAAAAANAAwAAgAAAAAAAAANAA0AAgAAAAAAAAANAA4AAgAAAAAAAAANAA8AAgAAAAAAAAANABAAAgAAAAAAAAANABEAAgAAAAAAAAAOAAsAAgAAAAAAAAAOAAwAAgAAAAAAAAAOAA0AAgABAAAAAAAOAA4AAgABAAAAAAAOAA8AAgABAAAAAAAOABAAAgABAAAAAAAOABEAAgAAAAAAAAAPAAsAAgAAAAAAAAAPAAwAAgAAAAAAAAAPAA0AAgABAAAAAAAPAA4AAgABAAAAAAAPAA8AAgABAAAAAAAPABAAAgABAAAAAAAPABEAAgAAAAAAAAAQAAsAAgAAAAAAAAAQAAwAAgAAAAAAAAAQAA0AAgABAAAAAAAQAA4AAgABAAAAAAAQAA8AAgABAAAAAAAQABAAAgABAAAAAAAQABEAAgAAAAAAAAARAAsAAgAAAAAAAAARAAwAAgAAAAAAAAARAA0AAgABAAAAAAARAA4AAgABAAAAAAARAA8AAgABAAAAAAARABAAAgABAAAAAAARABEAAgAAAAAAAAASAAsAAgAAAAAAAAASAAwAAgAAAAAAAAASAA0AAgABAAAAAAASAA4AAgABAAAAAAASAA8AAgABAAAAAAASABAAAgABAAAAAAASABEAAgAAAAAAAAATAAsAAgAAAAAAAAATAAwAAgAAAAAAAAATAA0AAgAAAAAAAAATAA4AAgAAAAAAAAATAA8AAgAAAAAAAAATABAAAgAAAAAAAAATABEAAgAAAAAAAAAUAAsAAgAAAAAAAAAUAAwAAgAAAAAAAAAUAA0AAgAAAAAAAAAUAA4AAgAAAAAAAAAUAA8AAgAAAAAAAAAUABAAAgAAAAAAAAAUABEAAgAAAAAAAAAVAAsAAgAAAAAAAAAVAAwAAgAAAAAAAAAVAA0AAgAAAAAAAAAVAA4AAgAAAAAAAAAVAA8AAgAAAAAAAAAVABAAAgAAAAAAAAAVABEAAgAAAAAAAAA=") tile_set = ExtResource("1_vlccq") [node name="NavigationVisualization" type="TileMapLayer" parent="Tileset"] @@ -111,26 +120,80 @@ script = ExtResource("7_1jajd") [node name="sl_CriticalSurvival" type="Node" parent="PlayerManager/BehaviorTree/sl_Root"] script = ExtResource("7_1jajd") -[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"] +[node name="sq_Food" type="Node" parent="PlayerManager/BehaviorTree/sl_Root/sl_CriticalSurvival"] script = ExtResource("9_i67mw") -[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"] +[node name="TaskCheckFoodCritical" type="Node" parent="PlayerManager/BehaviorTree/sl_Root/sl_CriticalSurvival/sq_Food"] script = ExtResource("10_sf2pi") -[node name="GoToWhileRunningSuccessStop" type="Node" parent="PlayerManager/BehaviorTree/sl_Root/sl_CriticalSurvival/sl_Food/sq_NextFood"] +[node name="sl_PickMostRelevantFoodSource" type="Node" parent="PlayerManager/BehaviorTree/sl_Root/sl_CriticalSurvival/sq_Food"] +script = ExtResource("7_1jajd") + +[node name="sq_FoodInInventory" type="Node" parent="PlayerManager/BehaviorTree/sl_Root/sl_CriticalSurvival/sq_Food/sl_PickMostRelevantFoodSource"] +script = ExtResource("9_i67mw") + +[node name="TaskEatFoodFromInventory" type="Node" parent="PlayerManager/BehaviorTree/sl_Root/sl_CriticalSurvival/sq_Food/sl_PickMostRelevantFoodSource/sq_FoodInInventory"] +script = ExtResource("10_70s0w") + +[node name="sq_NextFood" type="Node" parent="PlayerManager/BehaviorTree/sl_Root/sl_CriticalSurvival/sq_Food/sl_PickMostRelevantFoodSource"] +script = ExtResource("9_i67mw") + +[node name="TaskFindClosestFood" type="Node" parent="PlayerManager/BehaviorTree/sl_Root/sl_CriticalSurvival/sq_Food/sl_PickMostRelevantFoodSource/sq_NextFood"] +script = ExtResource("13_60fwc") + +[node name="GoToWhileRunningSuccessStop" type="Node" parent="PlayerManager/BehaviorTree/sl_Root/sl_CriticalSurvival/sq_Food/sl_PickMostRelevantFoodSource/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="TaskPickupTheBerry" type="Node" parent="PlayerManager/BehaviorTree/sl_Root/sl_CriticalSurvival/sq_Food/sl_PickMostRelevantFoodSource/sq_NextFood"] +script = ExtResource("15_ccdxl") + +[node name="sq_Temperature" type="Node" parent="PlayerManager/BehaviorTree/sl_Root/sl_CriticalSurvival"] +script = ExtResource("9_i67mw") + +[node name="TaskCheckTemperatureCold" type="Node" parent="PlayerManager/BehaviorTree/sl_Root/sl_CriticalSurvival/sq_Temperature"] +script = ExtResource("16_e38ya") + +[node name="TaskCheckTemperatureNoBuff" type="Node" parent="PlayerManager/BehaviorTree/sl_Root/sl_CriticalSurvival/sq_Temperature"] +script = ExtResource("17_4plsj") + +[node name="sl_PickMostRelevantTemperatureRemediation" type="Node" parent="PlayerManager/BehaviorTree/sl_Root/sl_CriticalSurvival/sq_Temperature"] +script = ExtResource("7_1jajd") + +[node name="sq_HasStick" type="Node" parent="PlayerManager/BehaviorTree/sl_Root/sl_CriticalSurvival/sq_Temperature/sl_PickMostRelevantTemperatureRemediation"] +script = ExtResource("9_i67mw") + +[node name="TaskUseStickFromInventory" type="Node" parent="PlayerManager/BehaviorTree/sl_Root/sl_CriticalSurvival/sq_Temperature/sl_PickMostRelevantTemperatureRemediation/sq_HasStick"] +script = ExtResource("18_22dkn") + +[node name="sq_DoesNotHaveStick" type="Node" parent="PlayerManager/BehaviorTree/sl_Root/sl_CriticalSurvival/sq_Temperature/sl_PickMostRelevantTemperatureRemediation"] +script = ExtResource("9_i67mw") + +[node name="TaskFindClosestStick" type="Node" parent="PlayerManager/BehaviorTree/sl_Root/sl_CriticalSurvival/sq_Temperature/sl_PickMostRelevantTemperatureRemediation/sq_DoesNotHaveStick"] +script = ExtResource("19_1orqu") + +[node name="GoToRunning" type="Node" parent="PlayerManager/BehaviorTree/sl_Root/sl_CriticalSurvival/sq_Temperature/sl_PickMostRelevantTemperatureRemediation/sq_DoesNotHaveStick"] +script = ExtResource("20_6aw6j") + +[node name="TaskPickupStick" type="Node" parent="PlayerManager/BehaviorTree/sl_Root/sl_CriticalSurvival/sq_Temperature/sl_PickMostRelevantTemperatureRemediation/sq_DoesNotHaveStick"] +script = ExtResource("20_uw2ce") + +[node name="sq_LeaveColdArea" type="Node" parent="PlayerManager/BehaviorTree/sl_Root/sl_CriticalSurvival/sq_Temperature/sl_PickMostRelevantTemperatureRemediation"] +script = ExtResource("9_i67mw") + +[node name="TaskFindClosestWarmTile" type="Node" parent="PlayerManager/BehaviorTree/sl_Root/sl_CriticalSurvival/sq_Temperature/sl_PickMostRelevantTemperatureRemediation/sq_LeaveColdArea"] +script = ExtResource("21_np756") + +[node name="GoToWhileRunningSuccessStop" type="Node" parent="PlayerManager/BehaviorTree/sl_Root/sl_CriticalSurvival/sq_Temperature/sl_PickMostRelevantTemperatureRemediation/sq_LeaveColdArea"] +script = ExtResource("10_4v1m1") + +[node name="sq_GoBackToCamp" type="Node" parent="PlayerManager/BehaviorTree/sl_Root/sl_CriticalSurvival/sq_Temperature/sl_PickMostRelevantTemperatureRemediation"] +script = ExtResource("9_i67mw") + +[node name="TaskFindCamp" type="Node" parent="PlayerManager/BehaviorTree/sl_Root/sl_CriticalSurvival/sq_Temperature/sl_PickMostRelevantTemperatureRemediation/sq_GoBackToCamp"] +script = ExtResource("21_cseat") + +[node name="GoToWhileRunningSuccessStop" type="Node" parent="PlayerManager/BehaviorTree/sl_Root/sl_CriticalSurvival/sq_Temperature/sl_PickMostRelevantTemperatureRemediation/sq_GoBackToCamp"] +script = ExtResource("10_4v1m1") [node name="WalkUpToMouse" type="Node" parent="PlayerManager/BehaviorTree/sl_Root"] script = ExtResource("8_s6mqc") diff --git a/project/project.godot b/project/project.godot index fd33f3e..9da00e4 100644 --- a/project/project.godot +++ b/project/project.godot @@ -107,4 +107,3 @@ key_6={ textures/canvas_textures/default_texture_filter=0 renderer/rendering_method="gl_compatibility" renderer/rendering_method.mobile="gl_compatibility" -environment/defaults/default_clear_color=Color(0.356863, 0.431373, 0.882353, 1) diff --git a/project/scripts/global/CameraController.gd b/project/scripts/global/CameraController.gd index 56be15a..88b0064 100644 --- a/project/scripts/global/CameraController.gd +++ b/project/scripts/global/CameraController.gd @@ -5,8 +5,8 @@ extends Camera2D @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 +@export var inner_border_threshold: float = 0.0 # 60.0 +@export var outer_border_threshold: float = 0.0 # 40.0 @export var min_position: Vector2 = Vector2(0, 0) @export var max_position: Vector2 = Vector2(1375, 660) diff --git a/project/scripts/global/GameManager.gd b/project/scripts/global/GameManager.gd index f1f6d26..ee54ead 100644 --- a/project/scripts/global/GameManager.gd +++ b/project/scripts/global/GameManager.gd @@ -7,6 +7,7 @@ var tilemap_types: TileMapTileTypes = TileMapTileTypes.new() @onready var player: PlayerManager = $PlayerManager @onready var camera: CameraController = $Camera2D as CameraController @onready var game_ticker: Timer = $GameTick +# @onready var health_bar: ProgressBar = $Camera2D/CanvasLayer/VBoxContainer/HealthBar @onready var food_bar: ProgressBar = $Camera2D/CanvasLayer/VBoxContainer/FoodBar @onready var temperature_bar: ProgressBar = $Camera2D/CanvasLayer/VBoxContainer/TemperatureBar @@ -60,8 +61,8 @@ func _on_game_tick_timeout() -> void: player.game_tick() tilemap_navigation.game_tick_end() world.step_visualizer.game_tick_end() - timer_on_game_tick_timeout.stop() update_bars() + timer_on_game_tick_timeout.stop() func update_bars() -> void: @@ -74,7 +75,7 @@ func update_bars() -> void: food_bar.value = clamp(player.food, 0, player.max_food) if temperature_bar != null: - var temperature_value = player.temperature_endure - player.temperature_timer + var temperature_value: int = player.temperature_endure - player.temperature_timer temperature_bar.max_value = player.temperature_endure temperature_bar.value = clamp(temperature_value, 0, player.temperature_endure) diff --git a/project/scripts/player/PlayerManager.gd b/project/scripts/player/PlayerManager.gd index 012bf2f..03f5d99 100644 --- a/project/scripts/player/PlayerManager.gd +++ b/project/scripts/player/PlayerManager.gd @@ -10,6 +10,7 @@ extends Node @export var food_addon_per_berry: int = 100 @export var food_critical_threshold: int = 50 # temperature +@export var temperature_set_buff_value: int = 50 @export var temperature_damage: int = 1 @export var temperature_endure: int = 50 # viewing @@ -21,203 +22,215 @@ var game_manager: GameManager = null var last_board_position: Vector2i = Vector2i(0, 0) var board_position: Vector2i = Vector2i(0, 0): - set(value): - last_board_position = board_position - board_position = value - update_board() + set(value): + last_board_position = board_position + board_position = value + update_board() @onready var behavior_tree: BehaviorTree = $BehaviorTree -var food: int = max_food +var food: int = max_food # var water: int = 0 -var temperature_timer: int = 0 -var health: int = max_health +var temperature_buff_timer: int = 0 +var temperature_timer: int = 0 +var health: int = max_health # var inventory_slot: Vector2i = tilemap_types.EMPTY: - set(value): - inventory_slot = value - update_board() + set(value): + inventory_slot = value + update_board() func _ready() -> void: - call_deferred("defer_ready") + call_deferred("defer_ready") func defer_ready() -> void: - behavior_tree.game_manager = game_manager - var player_start_position: Array[Vector2i] = game_manager.world.tilemap_player.get_cells_by_type(tilemap_types.PLAYER_DOWN) - if len(player_start_position) > 0: - board_position = player_start_position[0] - else: - push_error("No player start position found on tilemap") - update_board() + behavior_tree.game_manager = game_manager + var player_start_position: Array[Vector2i] = game_manager.world.tilemap_player.get_cells_by_type(tilemap_types.PLAYER_DOWN) + if len(player_start_position) > 0: + board_position = player_start_position[0] + else: + push_error("No player start position found on tilemap") + update_board() func _process(delta: float) -> void: - if Input.is_action_just_pressed("key_3"): - game_manager.camera.go_to_zooming(game_manager.world.tilemap_player.cell_to_local(board_position), 2) - if Input.is_action_just_pressed("key_5"): - pick_up_item(Vector2i(5, 8)) - pick_up_item(Vector2i(9, 9)) - if Input.is_action_just_pressed("key_4"): - var nearest: Vector2i = find_nearest_object([game_manager.world.tilemap_types.OBJECT_I_TREE_FULL]) - # nearest.x = nearest.x - 1 - walk_towards(nearest) + if Input.is_action_just_pressed("key_3"): + game_manager.camera.go_to_zooming(game_manager.world.tilemap_player.cell_to_local(board_position), 2) + if Input.is_action_just_pressed("key_5"): + pick_up_item(Vector2i(5, 8)) + pick_up_item(Vector2i(9, 9)) + if Input.is_action_just_pressed("key_4"): + var nearest: Vector2i = find_nearest_object([game_manager.world.tilemap_types.OBJECT_I_TREE_FULL]) + # nearest.x = nearest.x - 1 + walk_towards(nearest) # SECTION: board access/mangement func update_board() -> void: - game_manager.world.tilemap_player.clear_cells() - # decide what direction the player is facing tilemap_types.PLAYER_DOWN, ... - var direction: Vector2i = find_direction(last_board_position, board_position) - game_manager.world.tilemap_player.set_cell(board_position, tilemap_types.player_sprite_from_direction(direction)) - if inventory_slot and inventory_slot != tilemap_types.EMPTY: - inventory_label.text = str(inventory_slot) - else: - inventory_label.text = "empty" + game_manager.world.tilemap_player.clear_cells() + # decide what direction the player is facing tilemap_types.PLAYER_DOWN, ... + var direction: Vector2i = find_direction(last_board_position, board_position) + game_manager.world.tilemap_player.set_cell(board_position, tilemap_types.player_sprite_from_direction(direction)) + if inventory_slot and inventory_slot != tilemap_types.EMPTY: + inventory_label.text = str(inventory_slot) + else: + inventory_label.text = "empty" # SECTION: inventory system func pick_up_item(tilemap_pos: Vector2i) -> void: - var pick_up_cell: TileData = game_manager.world.tilemap_interactive.get_cell(tilemap_pos) - if not pick_up_cell: - push_warning("Player trying to pick up item that does not exist at ", tilemap_pos) - return + var pick_up_cell: TileData = game_manager.world.tilemap_interactive.get_cell(tilemap_pos) + if not pick_up_cell: + push_warning("Player trying to pick up item that does not exist at ", tilemap_pos) + return - var pick_up_item_type: Vector2i = game_manager.world.tilemap_interactive.tilemap.get_cell_atlas_coords(tilemap_pos) + var pick_up_item_type: Vector2i = game_manager.world.tilemap_interactive.tilemap.get_cell_atlas_coords(tilemap_pos) - # check if tile will transform into another tile upon pickup - var tile_after_pickup_transform = null - var tile_drop_item: Vector2i = inventory_slot - if tilemap_types.OBJECT_I_FILLED_BUSH == pick_up_item_type: - tile_after_pickup_transform = tilemap_types.OBJECT_I_EMPTY_BUSH - pick_up_item_type = tilemap_types.OBJECT_I_BERRY - tile_drop_item = tilemap_types.OBJECT_I_BERRY + # check if tile will transform into another tile upon pickup + var tile_after_pickup_transform = null + var tile_drop_item: Vector2i = inventory_slot + if pick_up_item_type == tilemap_types.OBJECT_I_FILLED_BUSH: + tile_after_pickup_transform = tilemap_types.OBJECT_I_EMPTY_BUSH + pick_up_item_type = tilemap_types.OBJECT_I_BERRY + tile_drop_item = tilemap_types.OBJECT_I_BERRY + if pick_up_item_type == tilemap_types.OBJECT_I_TREE_FULL: + tile_after_pickup_transform = tilemap_types.OBJECT_I_TREE_CUT + pick_up_item_type = tilemap_types.OBJECT_I_STICK + tile_drop_item = tilemap_types.OBJECT_I_STICK - # check if the inventory slot is empty - if inventory_slot == tilemap_types.EMPTY: - inventory_slot = pick_up_item_type - if tile_after_pickup_transform: - game_manager.world.tilemap_interactive.set_cell(tilemap_pos, tile_after_pickup_transform) - 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}) + # check if the inventory slot is empty + if inventory_slot == tilemap_types.EMPTY: + inventory_slot = pick_up_item_type + if tile_after_pickup_transform: + game_manager.world.tilemap_interactive.set_cell(tilemap_pos, tile_after_pickup_transform) + 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) - if drop_location != tilemap_types.EMPTY: - game_manager.world.tilemap_interactive.set_cell(drop_location, tile_drop_item) - else: - push_warning("Could not find valid drop position for ", inventory_slot) - else: - game_manager.world.tilemap_interactive.set_cell(tilemap_pos, tile_drop_item) - inventory_slot = 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) + if drop_location != tilemap_types.EMPTY: + game_manager.world.tilemap_interactive.set_cell(drop_location, tile_drop_item) + else: + push_warning("Could not find valid drop position for ", inventory_slot) + else: + game_manager.world.tilemap_interactive.set_cell(tilemap_pos, tile_drop_item) + inventory_slot = pick_up_item_type # SECTION: player movement func walk_towards(position: Vector2i) -> void: - var path: Array[Vector2i] = game_manager.tilemap_navigation.find_path(board_position, position) - walk_along(path) + var path: Array[Vector2i] = game_manager.tilemap_navigation.find_path(board_position, position) + walk_along(path) func walk_along(path: Array[Vector2i]) -> void: - if len(path) > 1: - var next_position: Vector2i = path[1] - var direction: Vector2i = find_direction(board_position, next_position) - move_player(direction) - game_manager.tilemap_navigation.chosen_path = path - else: - push_warning("walk_along path is empty") + if len(path) > 1: + + var next_position: Vector2i + if path.has(board_position): + var current_index: int = path.find(board_position) + if current_index < path.size() - 1: + next_position = path[current_index + 1] + else: + next_position = path[1] + else: + next_position = path[1] + + var direction: Vector2i = find_direction(board_position, next_position) + move_player(direction) + game_manager.tilemap_navigation.chosen_path = path + else: + push_warning("walk_along path is empty") func move_player(direction: Vector2i) -> void: - var new_position: Vector2 = board_position + direction - if game_manager.world.is_walkable(new_position): - board_position = new_position - else: - push_warning("Player trying to move to non-walkable position, prevented ", new_position) + var new_position: Vector2 = board_position + direction + if game_manager.world.is_walkable(new_position): + board_position = new_position + else: + push_warning("Player trying to move to non-walkable position, prevented ", new_position) func find_nearest_object(object_collection: Array[Vector2i]) -> Vector2i: - var object_positions: Array[Vector2i] = [] + var object_positions: Array[Vector2i] = [] - for obj in object_collection: - object_positions.append_array(game_manager.world.tilemap_interactive.get_cells_by_type(obj)) + for obj in object_collection: + object_positions.append_array(game_manager.world.tilemap_interactive.get_cells_by_type(obj)) - if object_positions.size() == 0: - push_warning("No " + str(object_collection) + " found!") - return tilemap_types.NO_TILE_FOUND + if object_positions.size() == 0: + push_warning("No " + str(object_collection) + " found!") + return tilemap_types.NO_TILE_FOUND - var closest_object: Vector2i = tilemap_types.NO_TILE_FOUND - var shortest_distance: float = 99999999 + var closest_object: Vector2i = tilemap_types.NO_TILE_FOUND + var shortest_distance: float = 99999999 - for position in object_positions: - var distance: float = game_manager.tilemap_navigation.manhattan_distance(board_position, position) - if closest_object == tilemap_types.NO_TILE_FOUND or distance < shortest_distance: - closest_object = position - shortest_distance = distance + for position in object_positions: + var distance: float = game_manager.tilemap_navigation.manhattan_distance(board_position, position) + if closest_object == tilemap_types.NO_TILE_FOUND or distance < shortest_distance: + closest_object = position + shortest_distance = distance - print("Find nearest " + str(object_collection) + " at:", closest_object) - return closest_object + print("Find nearest " + str(object_collection) + " at:", closest_object) + return closest_object func find_direction(pos_a: Vector2i, pos_b: Vector2i) -> Vector2i: - var direction: Vector2i = Vector2i(0, 0) - if pos_a.x < pos_b.x: - direction.x = 1 - elif pos_a.x > pos_b.x: - direction.x = -1 + var direction: Vector2i = Vector2i(0, 0) + if pos_a.x < pos_b.x: + direction.x = 1 + elif pos_a.x > pos_b.x: + direction.x = -1 - if pos_a.y < pos_b.y: - direction.y = 1 - elif pos_a.y > pos_b.y: - direction.y = -1 + if pos_a.y < pos_b.y: + direction.y = 1 + elif pos_a.y > pos_b.y: + direction.y = -1 - return direction + return direction # SECTION: game tick +func get_current_temperature() -> int: + return game_manager.world.tilemap_temperature.get_custom_data(board_position, "temperature", 0) as int + + func tick_handle_temperature(cell_temperature: int): - if cell_temperature == 0: - temperature_timer = 0 - elif temperature_timer > temperature_endure: - temperature_timer += cell_temperature - health -= temperature_damage + if cell_temperature == 0: + temperature_timer = 0 + elif temperature_timer > temperature_endure: + temperature_timer += cell_temperature + health -= temperature_damage func tick_handle_food(): - if food > 0: - food -= 1 - if food <= 0: - health -= food_damage + if food > 0: + food -= 1 + if food <= 0: + health -= food_damage func game_tick() -> void: - behavior_tree.game_tick() + behavior_tree.game_tick() - var player_positon_array: Array[Vector2i] = game_manager.world.tilemap_player.get_cells_by_type(tilemap_types.PLAYER_DOWN) - if len(player_positon_array) > 0: - var player_positon: Vector2i = player_positon_array[0] - var cell_temperature: int = game_manager.world.tilemap_temperature.get_custom_data(player_positon, "temperature", 0) as int - tick_handle_temperature(cell_temperature) - else: - push_error("No player found on tilemap") + tick_handle_temperature(get_current_temperature()) + tick_handle_food() - tick_handle_food() + if health < 0: + game_manager.player_health_depleted() - if health < 0: - game_manager.player_health_depleted() - - update_board() + update_board() diff --git a/project/scripts/player/tree/impl/game/camp/TaskFindCamp.gd b/project/scripts/player/tree/impl/game/camp/TaskFindCamp.gd new file mode 100644 index 0000000..6c63dd7 --- /dev/null +++ b/project/scripts/player/tree/impl/game/camp/TaskFindCamp.gd @@ -0,0 +1,19 @@ +class_name TaskFindCamp +extends Task + +func run(blackboard: Dictionary) -> void: + var world: World = blackboard["world"] + var player: PlayerManager = blackboard["player"] + var navigation: TilemapNavigation = blackboard["navigation"] + + blackboard["location_camp"] = world.camp_manager.camp + + var path: Array[Vector2i] = navigation.find_path_allow_neighbors(player.board_position, world.camp_manager.camp, 99999999) + if path.size() > 0: + blackboard["path"] = path + status = SUCCESS + status_reason = "Found camp at " + str(blackboard["location_camp"]) + return + + status = FAILURE + status_reason = "No path found to camp " + str(blackboard["location_camp"]) 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 1b68517..469e411 100644 --- a/project/scripts/player/tree/impl/game/critical_survival/TaskCheckFoodCritical.gd +++ b/project/scripts/player/tree/impl/game/critical_survival/TaskCheckFoodCritical.gd @@ -11,27 +11,5 @@ func run(blackboard: Dictionary) -> void: 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: - status = FAILURE - status_reason = "No active foods found" - return - - var closest_berry: Vector2i = navigation.manhattan_distance_closest(active_foods, player.board_position) - if closest_berry == tilemap_types.NO_TILE_FOUND: - status = FAILURE - 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 - status_reason = "Found path to closest berry" - status = SUCCESS - return - - status = FAILURE - status_reason = "No path found to closest berry " + str(closest_berry) + status = SUCCESS + status_reason = "Player food is critical (" + str(player.food) + " <= " + str(player.food_critical_threshold) + ")" diff --git a/project/scripts/player/tree/impl/game/critical_survival/TaskCheckTemperatureCold.gd b/project/scripts/player/tree/impl/game/critical_survival/TaskCheckTemperatureCold.gd new file mode 100644 index 0000000..5ab5f85 --- /dev/null +++ b/project/scripts/player/tree/impl/game/critical_survival/TaskCheckTemperatureCold.gd @@ -0,0 +1,13 @@ +class_name TaskCheckTemperatureCold +extends Task + +func run(blackboard: Dictionary) -> void: + var player: PlayerManager = blackboard["player"] + + if player.get_current_temperature() > 0: + status = SUCCESS + status_reason = "cold: " + str(player.get_current_temperature()) + return + + status = FAILURE + status_reason = "not cold: " + str(player.get_current_temperature()) diff --git a/project/scripts/player/tree/impl/game/critical_survival/TaskCheckTemperatureNoBuff.gd b/project/scripts/player/tree/impl/game/critical_survival/TaskCheckTemperatureNoBuff.gd new file mode 100644 index 0000000..4666594 --- /dev/null +++ b/project/scripts/player/tree/impl/game/critical_survival/TaskCheckTemperatureNoBuff.gd @@ -0,0 +1,13 @@ +class_name TaskCheckTemperatureNoBuff +extends Task + +func run(blackboard: Dictionary) -> void: + var player: PlayerManager = blackboard["player"] + + if player.temperature_buff_timer > 0: + status = FAILURE + status_reason = "Player already has a temperature buff: " + str(player.temperature_buff_timer) + return + + status = SUCCESS + status_reason = "Player does not have a temperature buff" diff --git a/project/scripts/player/tree/impl/game/critical_survival/TaskFindClosestFood.gd b/project/scripts/player/tree/impl/game/critical_survival/TaskFindClosestFood.gd new file mode 100644 index 0000000..e74ed34 --- /dev/null +++ b/project/scripts/player/tree/impl/game/critical_survival/TaskFindClosestFood.gd @@ -0,0 +1,32 @@ +class_name TaskFindClosestFood +extends Task + +func run(blackboard: Dictionary) -> void: + var world: World = blackboard["world"] + var player: PlayerManager = blackboard["player"] + var navigation: TilemapNavigation = blackboard["navigation"] + + 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: + status = FAILURE + status_reason = "No active foods found" + return + + var closest_berry: Vector2i = navigation.manhattan_distance_closest(active_foods, player.board_position) + if closest_berry == tilemap_types.NO_TILE_FOUND: + status = FAILURE + 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 + status_reason = "Found path to closest berry" + status = SUCCESS + return + + status = FAILURE + status_reason = "No path found to closest berry " + str(closest_berry) diff --git a/project/scripts/player/tree/impl/game/critical_survival/TaskFindClosestStick.gd b/project/scripts/player/tree/impl/game/critical_survival/TaskFindClosestStick.gd new file mode 100644 index 0000000..b80f09c --- /dev/null +++ b/project/scripts/player/tree/impl/game/critical_survival/TaskFindClosestStick.gd @@ -0,0 +1,32 @@ +class_name TaskFindClosestStick +extends Task + +func run(blackboard: Dictionary) -> void: + var world: World = blackboard["world"] + var player: PlayerManager = blackboard["player"] + var navigation: TilemapNavigation = blackboard["navigation"] + + var sticks: Array[Vector2i] = world.tilemap_interactive.get_cells_by_type_collection( + tilemap_types.OBJECT_COLLECTION_STICK_SOURCE, player.board_position, player.view_distance) + if len(sticks) == 0: + status = FAILURE + status_reason = "No active sticks found" + return + + var closest_stick: Vector2i = navigation.manhattan_distance_closest(sticks, player.board_position) + if closest_stick == tilemap_types.NO_TILE_FOUND: + status = FAILURE + status_reason = "No closest stick found" + return + + blackboard["closest_stick"] = closest_stick + + var path: Array[Vector2i] = navigation.find_path_allow_neighbors(player.board_position, closest_stick, player.view_distance) + if path.size() > 0: + blackboard["path"] = path + status_reason = "Found path to closest stick" + status = SUCCESS + return + + status = FAILURE + status_reason = "No path found to closest stick " + str(closest_stick) diff --git a/project/scripts/player/tree/impl/game/critical_survival/TaskFindClosestWarmTile.gd b/project/scripts/player/tree/impl/game/critical_survival/TaskFindClosestWarmTile.gd new file mode 100644 index 0000000..d497e78 --- /dev/null +++ b/project/scripts/player/tree/impl/game/critical_survival/TaskFindClosestWarmTile.gd @@ -0,0 +1,32 @@ +class_name TaskFindClosestWarmTile +extends Task + +func run(blackboard: Dictionary) -> void: + var world: World = blackboard["world"] + var player: PlayerManager = blackboard["player"] + var navigation: TilemapNavigation = blackboard["navigation"] + + var warm_tiles: Array[Vector2i] = world.tilemap_temperature.get_cells_by_type( + tilemap_types.TEMPERATURE_NORMAL, player.board_position, player.view_distance) + if len(warm_tiles) == 0: + status = FAILURE + status_reason = "No warm tiles found" + return + + var closest_warm_tile: Vector2i = navigation.manhattan_distance_closest(warm_tiles, player.board_position) + if closest_warm_tile == tilemap_types.NO_TILE_FOUND: + status = FAILURE + status_reason = "No closest warm tile found" + return + + blackboard["closest_warm_tile"] = closest_warm_tile + + var path: Array[Vector2i] = navigation.find_path_allow_neighbors(player.board_position, closest_warm_tile, player.view_distance) + if path.size() > 0: + blackboard["path"] = path + status_reason = "Found path to closest warm tile" + status = SUCCESS + return + + status = FAILURE + status_reason = "No path found to closest warm tile " + str(closest_warm_tile) diff --git a/project/scripts/player/tree/impl/game/inventory/TaskPickupStick.gd b/project/scripts/player/tree/impl/game/inventory/TaskPickupStick.gd new file mode 100644 index 0000000..a9382b7 --- /dev/null +++ b/project/scripts/player/tree/impl/game/inventory/TaskPickupStick.gd @@ -0,0 +1,11 @@ +class_name TaskPickupStick +extends Task + +func run(blackboard: Dictionary) -> void: + var player: PlayerManager = blackboard["player"] + var closest_stick: Vector2i = blackboard["closest_stick"] + + player.pick_up_item(closest_stick) + + status = SUCCESS + status_reason = "Picked up stick" diff --git a/project/scripts/player/tree/impl/game/inventory/TaskPickupBerry.gd b/project/scripts/player/tree/impl/game/inventory/TaskPickupTheBerry.gd similarity index 90% rename from project/scripts/player/tree/impl/game/inventory/TaskPickupBerry.gd rename to project/scripts/player/tree/impl/game/inventory/TaskPickupTheBerry.gd index e52f57b..b4982cd 100644 --- a/project/scripts/player/tree/impl/game/inventory/TaskPickupBerry.gd +++ b/project/scripts/player/tree/impl/game/inventory/TaskPickupTheBerry.gd @@ -1,4 +1,4 @@ -class_name TaskPickupBerry +class_name TaskPickupTheBerry extends Task func run(blackboard: Dictionary) -> void: diff --git a/project/scripts/player/tree/impl/game/inventory/TaskUseStickFromInventory.gd b/project/scripts/player/tree/impl/game/inventory/TaskUseStickFromInventory.gd new file mode 100644 index 0000000..bd93af2 --- /dev/null +++ b/project/scripts/player/tree/impl/game/inventory/TaskUseStickFromInventory.gd @@ -0,0 +1,15 @@ +class_name TaskUseStickFromInventory +extends Task + +func run(blackboard: Dictionary) -> void: + var player: PlayerManager = blackboard["player"] + + if player.inventory_slot != tilemap_types.OBJECT_I_STICK: + status = FAILURE + status_reason = "Player does not have a stick in inventory" + return + + player.inventory_slot = tilemap_types.EMPTY + player.temperature_buff_timer = player.temperature_set_buff_value + status = SUCCESS + status_reason = "Player used a stick from inventory, now has temperature buff: " + str(player.temperature_buff_timer) diff --git a/project/scripts/tilemap/TileMapLayerAccess.gd b/project/scripts/tilemap/TileMapLayerAccess.gd index 3db750a..2aa9fac 100644 --- a/project/scripts/tilemap/TileMapLayerAccess.gd +++ b/project/scripts/tilemap/TileMapLayerAccess.gd @@ -9,8 +9,18 @@ func setup() -> void: pass -func get_cells_by_type(atlas_coords: Vector2i) -> Array[Vector2i]: - return tilemap.get_used_cells_by_id(sid, atlas_coords) +func get_cells_by_type( + atlas_coords: Vector2i, + center: Vector2i = Vector2i(-1, -1), max_distance: int = 99999999 +) -> Array[Vector2i]: + var tiles_with_type: Array[Vector2i] = tilemap.get_used_cells_by_id(sid, atlas_coords) + if max_distance < 99999999: + var filtered_tiles: Array[Vector2i] = [] + for tile in tiles_with_type: + if TilemapNavigation.manhattan_distance(center, tile, true) <= max_distance: + filtered_tiles.append(tile) + return filtered_tiles + return tiles_with_type func get_cells_by_type_collection( diff --git a/project/scripts/tilemap/TileMapTileTypes.gd b/project/scripts/tilemap/TileMapTileTypes.gd index 9c6e20d..b08ea8f 100644 --- a/project/scripts/tilemap/TileMapTileTypes.gd +++ b/project/scripts/tilemap/TileMapTileTypes.gd @@ -44,6 +44,7 @@ const OBJECT_I_TREE_FULL: Vector2i = Vector2i(4, 0) const OBJECT_I_TREE_CUT: Vector2i = Vector2i(5, 0) # collections const OBJECT_COLLECTION_BERRY_SOURCE: Array[Vector2i] = [OBJECT_I_FILLED_BUSH, OBJECT_I_BERRY] +const OBJECT_COLLECTION_STICK_SOURCE: Array[Vector2i] = [OBJECT_I_TREE_FULL, OBJECT_I_STICK] const OBJECT_COLLECTION_FIREPIT: Array[Vector2i] = [OBJECT_I_FIREPIT_OFF, OBJECT_I_FIREPIT_ON] const OBJECT_COLLECTION_BOAT_PARTS: Array[Vector2i] = [ # @formatter:off OBJECT_I_BOAT_PART_GENERIC, @@ -53,7 +54,7 @@ const OBJECT_COLLECTION_BOAT_PARTS: Array[Vector2i] = [ # @formatter:off ] # @formatter:on # # temperature, sid = 2 -const TEMPERATURE_NORMAL: Vector2i = EMPTY +const TEMPERATURE_NORMAL: Vector2i = Vector2i(2, 0) const TEMPERATURE_COLD_1: Vector2i = Vector2i(0, 0) const TEMPERATURE_COLD_2: Vector2i = Vector2i(1, 0) #