class_name PlayerManager extends Node @onready var inventory_label = $CanvasLayer/VBoxContainer/InventoryLabel @export var food_damage: int = 1 @export var temperature_damage: int = 1 @export var temperature_endure: int = 50 var tilemap_types: TileMapTileTypes = TileMapTileTypes.new() # var game_manager: GameManager = null var board_position: Vector2i = Vector2i(8, 10) @onready var behavior_tree: BehaviorTree = $BehaviorTree var food: int = 0 # var water: int = 0 var temperature_timer: int = 0 var health: int = 0 # var inventory_slot: Vector2i = tilemap_types.EMPTY func _ready() -> void: call_deferred("defer_ready") func defer_ready() -> void: behavior_tree.game_manager = game_manager 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_4"): move_to_nearest_tree() move_to_nearest_bush() move_to_chest() move_to_campfire() move_to_boatpart() # if Input.is_action_just_pressed("key_5"): # move_to_nearest_bush() # # if Input.is_action_just_pressed("key_6"): # # move_to_boatpart() # if Input.is_action_just_pressed("key_7"): # move_to_chest() # # if Input.is_action_just_pressed("key_8"): # # move_to_boat_building_place() # if Input.is_action_just_pressed("key_6"): # move_to_campfire() # SECTION: board access/mangement func update_board() -> void: game_manager.world.tilemap_player.clear_cells() game_manager.world.tilemap_player.set_cell(board_position, tilemap_types.PLAYER) # 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_item_type: Vector2i = game_manager.world.tilemap_interactive.tilemap.get_cell_atlas_coords(tilemap_pos) # Check if the inventory slot is empty if inventory_slot == tilemap_types.EMPTY: inventory_slot = pick_up_item_type game_manager.world.tilemap_interactive.clear_cell(tilemap_pos) # Clear the tilemap print("Picked up 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) game_manager.world.tilemap_interactive.set_cell(tilemap_pos, inventory_slot) inventory_slot = pick_up_item_type # SECTION: player movement func walk_towards(position: Vector2i) -> void: walk_along(game_manager.world.find_path(board_position, position)) print(game_manager.world.find_path(board_position, position)) 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) 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 print("Moved to:", board_position) update_board() else: push_warning("Player trying to move to non-walkable position, prevented ", new_position) func move_to_nearest_tree(): move_to_nearest_object(game_manager.world.tilemap_types.OBJECT_I_TREE_1, "tree") func move_to_nearest_bush(): move_to_nearest_object(game_manager.world.tilemap_types.OBJECT_I_BERRY_1, "bush") func move_to_chest(): move_to_nearest_object(game_manager.world.tilemap_types.OBJECT_I_CHEST_1, "chest") func move_to_boatpart(): move_to_nearest_object(game_manager.world.tilemap_types.OBJECT_I_BOATPART_1, "boat part") # func move_to_boat_building_place(): # move_to_nearest_object(game_manager.world.tilemap_types.OBJECT_I_BOATPART_BUILDING_PLACE, "boatbuildingplace") func move_to_campfire(): move_to_nearest_object(game_manager.world.tilemap_types.OBJECT_I_CAMPFIRE_1, "campfire") func move_to_nearest_object(object_type: Vector2i, object_name: String) -> void: # Aktuelle Spielerposition var player_position: Vector2i = board_position # Koordinaten aller Objekte des angegebenen Typs suchen var object_positions: Array[Vector2i] = game_manager.world.tilemap_interactive.get_cells_by_type(object_type) if object_positions.size() == 0: push_warning("No " + object_name + " found!") return # Nächstes Objekt finden var closest_object: Vector2i = object_positions[0] var shortest_distance: float = player_position.distance_to(closest_object) for position in object_positions: var distance: float = player_position.distance_to(position) if distance < shortest_distance: closest_object = position shortest_distance = distance # Spieler bewegen print("Moving to nearest " + object_name + " at:", closest_object) walk_towards(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 if pos_a.y < pos_b.y: direction.y = 1 elif pos_a.y > pos_b.y: direction.y = -1 return direction # SECTION: game tick 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 func tick_handle_food(): if food <= 0: health -= food_damage func game_tick() -> void: behavior_tree.game_tick() var player_positon_array: Array[Vector2i] = game_manager.world.tilemap_player.get_cells_by_type(tilemap_types.PLAYER) 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_food() if health < 0: game_manager.player_health_depleted() update_board()