From b3e33b7cfa04c2a88164809b7807950f79bac16f Mon Sep 17 00:00:00 2001 From: Yan Wittmann Date: Thu, 9 Jan 2025 12:43:07 +0100 Subject: [PATCH] Added camp functionality and started event tracking system --- project/assets/tilemap/tileset.tres | 13 ++- project/main-scenes/island.tscn | 23 ++-- .../global/{Camera.gd => CameraController.gd} | 12 +- project/scripts/global/EventsTracker.gd | 27 +++++ project/scripts/global/GameManager.gd | 11 +- project/scripts/global/TrackedEvent.gd | 5 + project/scripts/player/PlayerManager.gd | 11 +- .../TaskCheckFoodCritical.gd | 6 + project/scripts/tilemap/TileMapLayerAccess.gd | 77 +++++++------ project/scripts/tilemap/TileMapTileTypes.gd | 54 +++++---- project/scripts/tilemap/World.gd | 14 ++- .../scripts/tilemap/objects/CampManager.gd | 103 ++++++++++++++++++ 12 files changed, 278 insertions(+), 78 deletions(-) rename project/scripts/global/{Camera.gd => CameraController.gd} (93%) create mode 100644 project/scripts/global/EventsTracker.gd create mode 100644 project/scripts/global/TrackedEvent.gd create mode 100644 project/scripts/player/tree/impl/game/critical_survival/TaskCheckFoodCritical.gd create mode 100644 project/scripts/tilemap/objects/CampManager.gd diff --git a/project/assets/tilemap/tileset.tres b/project/assets/tilemap/tileset.tres index 81adf5d..47ad8de 100644 --- a/project/assets/tilemap/tileset.tres +++ b/project/assets/tilemap/tileset.tres @@ -29,19 +29,27 @@ texture = ExtResource("2_15xge") 1:0/0 = 0 2:0/0 = 0 0:1/0 = 0 +0:1/0/custom_data_0 = true 0:2/0 = 0 +0:2/0/custom_data_0 = true 0:4/size_in_atlas = Vector2i(2, 1) 0:4/0 = 0 0:5/0 = 0 0:7/0 = 0 3:0/0 = 0 1:1/0 = 0 +1:1/0/custom_data_0 = true 2:1/0 = 0 +2:1/0/custom_data_0 = true 3:1/0 = 0 1:2/0 = 0 +1:2/0/custom_data_0 = true 2:2/0 = 0 +2:2/0/custom_data_0 = true 3:2/0 = 0 +3:2/0/custom_data_0 = true 4:2/0 = 0 +4:2/0/custom_data_0 = true 2:4/size_in_atlas = Vector2i(2, 1) 2:4/0 = 0 4:4/size_in_atlas = Vector2i(2, 1) @@ -52,11 +60,14 @@ texture = ExtResource("2_15xge") 1:5/0 = 0 0:6/size_in_atlas = Vector2i(2, 1) 0:6/0 = 0 -5:1/0 = 0 6:1/0 = 0 +6:1/0/custom_data_0 = true 7:1/0 = 0 +7:1/0/custom_data_0 = true 4:0/size_in_atlas = Vector2i(1, 2) 4:0/0 = 0 +5:0/size_in_atlas = Vector2i(1, 2) +5:0/0 = 0 [sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_1og8x"] texture = ExtResource("3_xap0v") diff --git a/project/main-scenes/island.tscn b/project/main-scenes/island.tscn index 896e8eb..db4bcfa 100644 --- a/project/main-scenes/island.tscn +++ b/project/main-scenes/island.tscn @@ -1,9 +1,10 @@ -[gd_scene load_steps=9 format=4 uid="uid://b88asko1ugyd2"] +[gd_scene load_steps=10 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"] [ext_resource type="TileSet" uid="uid://bi836ygcmyvhb" path="res://assets/tilemap/tileset.tres" id="1_vlccq"] -[ext_resource type="Script" path="res://scripts/global/Camera.gd" id="2_1vbjl"] +[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/player/tree/BehaviorTree.gd" id="6_efs30"] [ext_resource type="Script" path="res://scripts/player/tree/impl/base/TaskSelector.gd" id="7_1jajd"] @@ -13,10 +14,19 @@ script = ExtResource("1_eeg2d") [node name="Camera2D" type="Camera2D" parent="."] -script = ExtResource("2_1vbjl") +script = ExtResource("2_k51iv") [node name="CanvasLayer" type="CanvasLayer" parent="Camera2D"] +[node name="Vignette" type="ColorRect" parent="Camera2D/CanvasLayer"] +material = ExtResource("2_spils") +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +size_flags_horizontal = 4 + [node name="VBoxContainer" type="VBoxContainer" parent="Camera2D/CanvasLayer"] offset_right = 40.0 offset_bottom = 40.0 @@ -38,10 +48,11 @@ tile_map_data = PackedByteArray("AAAOAAkAAQACAAAAAAANAAkAAQACAAAAAAANAAoAAQACAAA tile_set = ExtResource("1_vlccq") [node name="InteractiveObjectsLayer" type="TileMapLayer" parent="Tileset"] -tile_map_data = PackedByteArray("AAAKABkAAQAAAAQAAAAUAAYAAQADAAEAAAAXAAYAAQADAAAAAAAJAAkAAQADAAEAAAAFAAgAAQADAAEAAAAFAAwAAQADAAEAAAAJAAwAAQADAAEAAAAYABAAAQACAAQAAAARAAYAAQAEAAAAAAA=") +tile_map_data = PackedByteArray("AAAKABkAAQAAAAQAAAAUAAYAAQADAAEAAAAXAAYAAQADAAAAAAAJAAkAAQADAAEAAAAFAAgAAQADAAEAAAAFAAwAAQADAAEAAAAJAAwAAQADAAEAAAAYABAAAQACAAQAAAARAAYAAQAEAAAAAAARABEAAQAGAAIAAAAQABEAAQAGAAEAAAAcABUAAQABAAEAAABCACMAAQACAAEAAABdAAkAAQACAAIAAABXADMAAQABAAIAAAA7ADUAAQADAAIAAAA8AAQAAQAEAAIAAAA=") tile_set = ExtResource("1_vlccq") [node name="PlayerLayer" type="TileMapLayer" parent="Tileset"] +tile_map_data = PackedByteArray("AAAQAA4AAwAAAAAAAAA=") tile_set = ExtResource("1_vlccq") [node name="TemperatureLayer" type="TileMapLayer" parent="Tileset"] @@ -53,10 +64,6 @@ tile_set = ExtResource("1_vlccq") [node name="PlayerManager" type="Node" parent="."] script = ExtResource("4_1xqo1") -food_damage = null -temperature_damage = null -temperature_endure = null -view_distance = null [node name="BehaviorTree" type="Node" parent="PlayerManager"] script = ExtResource("6_efs30") diff --git a/project/scripts/global/Camera.gd b/project/scripts/global/CameraController.gd similarity index 93% rename from project/scripts/global/Camera.gd rename to project/scripts/global/CameraController.gd index 1526898..2c23a3e 100644 --- a/project/scripts/global/Camera.gd +++ b/project/scripts/global/CameraController.gd @@ -1,7 +1,9 @@ -class_name Camera +class_name CameraController extends Camera2D -@export var border_acceleration: float = 0#2000.0 +@onready var shader_vignette: ColorRect = $CanvasLayer/Vignette + +@export var border_acceleration: float = 0 # 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 @@ -125,3 +127,9 @@ func _process(delta): var offset: Vector2 = target_position - position position += offset + +# SECTION: shader access + +func set_vignette_intensity(value: float) -> void: + var material: ShaderMaterial = shader_vignette.material + material.set_shader_parameter("vignette_strength", value) diff --git a/project/scripts/global/EventsTracker.gd b/project/scripts/global/EventsTracker.gd new file mode 100644 index 0000000..43e3e3f --- /dev/null +++ b/project/scripts/global/EventsTracker.gd @@ -0,0 +1,27 @@ +class_name EventsTracker +extends Node + +enum Event { + CAMPFIRE_LIT, + CAMPFIRE_LIT_FAILED, + CAMPFIRE_EXTINGUISHED, + CAMP_ADDED_ITEM, + CAMP_TAKEN_ITEM, + CAMP_TAKE_ITEM_FAILED, + SLEEP, +}; +# +static var events: Array[TrackedEvent] = [] +static var max_events: int = 20 +static var callbacks: Array[Callable] = [] + +static func track(event: Event, params: Dictionary = {}) -> void: + var tracked_event: TrackedEvent = TrackedEvent.new() + tracked_event.event = event + tracked_event.params = params + events.append(tracked_event) + print("Event tracked: ", event, " params: ", params) + if events.size() > max_events: + events.remove_at(0) + for cb in callbacks: + cb.call(event, params) diff --git a/project/scripts/global/GameManager.gd b/project/scripts/global/GameManager.gd index 290c65b..edd90fc 100644 --- a/project/scripts/global/GameManager.gd +++ b/project/scripts/global/GameManager.gd @@ -3,15 +3,18 @@ extends Node @onready var world: World = $Tileset @onready var player: PlayerManager = $PlayerManager -@onready var camera: Camera2D = $Camera2D -@onready var game_ticker: Timer = $GameTick +@onready var camera: CameraController = $Camera2D as CameraController +@onready var game_ticker: Timer = $GameTick + var tilemap_navigation: TilemapNavigation = TilemapNavigation.new() + func _ready() -> void: tilemap_navigation.world = world tilemap_navigation.player = player player.game_manager = self - game_ticker.start() + world.camp_manager.game_manager = self + # game_ticker.start() func _process(delta: float) -> void: @@ -20,7 +23,7 @@ func _process(delta: float) -> void: if Input.is_action_just_pressed("key_2"): camera.go_to_zooming(Vector2(789.883972167969, 450.102813720703), 0.56015348434448) if Input.is_action_just_pressed("key_9"): - camera.print_config() + world.camp_manager.sleep_effect() if Input.is_action_just_pressed("force_game_tick"): player.game_tick() diff --git a/project/scripts/global/TrackedEvent.gd b/project/scripts/global/TrackedEvent.gd new file mode 100644 index 0000000..8ef0b89 --- /dev/null +++ b/project/scripts/global/TrackedEvent.gd @@ -0,0 +1,5 @@ +class_name TrackedEvent +extends Node + +var event: EventsTracker.Event = -1 +var params: Dictionary = {} diff --git a/project/scripts/player/PlayerManager.gd b/project/scripts/player/PlayerManager.gd index c487bc2..c83517a 100644 --- a/project/scripts/player/PlayerManager.gd +++ b/project/scripts/player/PlayerManager.gd @@ -12,7 +12,7 @@ var tilemap_types: TileMapTileTypes = TileMapTileTypes.new() # var game_manager: GameManager = null var last_board_position: Vector2i = Vector2i(0, 0) -var board_position: Vector2i = Vector2i(8, 10): +var board_position: Vector2i = Vector2i(0, 0): set(value): last_board_position = board_position board_position = value @@ -37,7 +37,12 @@ func _ready() -> void: func defer_ready() -> void: behavior_tree.game_manager = game_manager - update_board() + 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: @@ -47,7 +52,7 @@ func _process(delta: float) -> void: 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_1]) + var nearest: Vector2i = find_nearest_object([game_manager.world.tilemap_types.OBJECT_I_TREE_FULL]) # nearest.x = nearest.x - 1 walk_towards(nearest) diff --git a/project/scripts/player/tree/impl/game/critical_survival/TaskCheckFoodCritical.gd b/project/scripts/player/tree/impl/game/critical_survival/TaskCheckFoodCritical.gd new file mode 100644 index 0000000..3c657d5 --- /dev/null +++ b/project/scripts/player/tree/impl/game/critical_survival/TaskCheckFoodCritical.gd @@ -0,0 +1,6 @@ +class_name TaskCheckFoodCritical +extends Task + +func run(p_blackboard: Dictionary) -> void: + var world: World = p_blackboard["world"] + var player: PlayerManager = p_blackboard["player"] diff --git a/project/scripts/tilemap/TileMapLayerAccess.gd b/project/scripts/tilemap/TileMapLayerAccess.gd index e54c5c7..ca1dab2 100644 --- a/project/scripts/tilemap/TileMapLayerAccess.gd +++ b/project/scripts/tilemap/TileMapLayerAccess.gd @@ -6,80 +6,87 @@ var sid: int = 0 func setup() -> void: - pass + pass func get_cells_by_type(atlas_coords: Vector2i) -> Array[Vector2i]: - return tilemap.get_used_cells_by_id(sid, atlas_coords) + return tilemap.get_used_cells_by_id(sid, atlas_coords) + + +func get_cells_by_type_collection(atlas_coords: Array[Vector2i]) -> Array[Vector2i]: + var tiles_with_type: Array[Vector2i] = [] + for coords in atlas_coords: + tiles_with_type.append_array(get_cells_by_type(coords)) + return tiles_with_type func get_cells_by_custom_data(field_name: String, custom_data: Variant) -> Array[Vector2i]: - var tiles_with_custom_data: Array = [] - for coords in tilemap.get_used_cells(): - var tile_data: TileData = tilemap.get_cell_tile_data(coords) - if tile_data.get_custom_data(field_name) == custom_data: - tiles_with_custom_data.append(coords) - return tiles_with_custom_data + var tiles_with_custom_data: Array = [] + for coords in tilemap.get_used_cells(): + var tile_data: TileData = tilemap.get_cell_tile_data(coords) + if tile_data.get_custom_data(field_name) == custom_data: + tiles_with_custom_data.append(coords) + return tiles_with_custom_data func get_custom_data(coords: Vector2i, field_name: String, default_value: Variant) -> Variant: - var tile_data: TileData = tilemap.get_cell_tile_data(coords) - if not tile_data: - return default_value - return tile_data.get_custom_data(field_name) + var tile_data: TileData = tilemap.get_cell_tile_data(coords) + if not tile_data: + return default_value + return tile_data.get_custom_data(field_name) func get_cells(positions: Array[Vector2i]) -> Array[TileData]: - var tiles: Array = [] - for coords in positions: - tiles.append(tilemap.get_cell_tile_data(coords)) - return tiles + var tiles: Array = [] + for coords in positions: + tiles.append(tilemap.get_cell_tile_data(coords)) + return tiles func get_cell(position: Vector2i) -> TileData: - return tilemap.get_cell_tile_data(position) + return tilemap.get_cell_tile_data(position) func get_cell_atlas_coords(position: Vector2i) -> Vector2i: - return tilemap.get_cell_atlas_coords(position) + return tilemap.get_cell_atlas_coords(position) func set_cell(position: Vector2i, atlas_coords: Vector2i) -> void: - tilemap.set_cell(position, sid, atlas_coords) + tilemap.set_cell(position, sid, atlas_coords) func clear_cell(position: Vector2i) -> void: - tilemap.set_cell(position, -1) + tilemap.set_cell(position, -1) func clear_cells() -> void: - for coords in tilemap.get_used_cells(): - tilemap.set_cell(coords, -1) + for coords in tilemap.get_used_cells(): + tilemap.set_cell(coords, -1) func local_to_cell(global_position: Vector2) -> Vector2i: - return tilemap.local_to_map(global_position) + return tilemap.local_to_map(global_position) func cell_to_local(cell_position: Vector2i) -> Vector2: - return tilemap.map_to_local(cell_position) + return tilemap.map_to_local(cell_position) func fill_area(start: Vector2i, end: Vector2i, atlas_coords: Vector2i) -> void: - for x in range(start.x, end.x + 1): - for y in range(start.y, end.y + 1): - tilemap.set_cell(Vector2i(x, y), sid, atlas_coords) + for x in range(start.x, end.x + 1): + for y in range(start.y, end.y + 1): + tilemap.set_cell(Vector2i(x, y), sid, atlas_coords) func fill_circle(center: Vector2i, radius: int, atlas_coords: Vector2i) -> void: - for x in range(center.x - radius, center.x + radius + 1): - for y in range(center.y - radius, center.y + radius + 1): - if center.distance_to(Vector2i(x, y)) <= radius: - tilemap.set_cell(Vector2i(x, y), sid, atlas_coords) + for x in range(center.x - radius, center.x + radius + 1): + for y in range(center.y - radius, center.y + radius + 1): + if center.distance_to(Vector2i(x, y)) <= radius: + tilemap.set_cell(Vector2i(x, y), sid, atlas_coords) func fill_ellipse(center: Vector2i, radius_x: int, radius_y: int, atlas_coords: Vector2i) -> void: - for x in range(center.x - radius_x, center.x + radius_x + 1): - for y in range(center.y - radius_y, center.y + radius_y + 1): - if (pow(x - center.x, 2) / pow(radius_x, 2) + pow(y - center.y, 2) / pow(radius_y, 2)) <= 1: - tilemap.set_cell(Vector2i(x, y), sid, atlas_coords) + for x in range(center.x - radius_x, center.x + radius_x + 1): + for y in range(center.y - radius_y, center.y + radius_y + 1): + if (pow(x - center.x, 2) / pow(radius_x, 2) + pow(y - center.y, 2) / pow(radius_y, 2)) <= 1: + tilemap.set_cell(Vector2i(x, y), sid, atlas_coords) diff --git a/project/scripts/tilemap/TileMapTileTypes.gd b/project/scripts/tilemap/TileMapTileTypes.gd index 61b3285..43902fc 100644 --- a/project/scripts/tilemap/TileMapTileTypes.gd +++ b/project/scripts/tilemap/TileMapTileTypes.gd @@ -13,32 +13,44 @@ const GROUND_DOCK: Vector2i = Vector2i(3, 0) # # objects, sid = 1 # NI = not interactive -const OBJECT_NI_RANDOM_1: Vector2i = Vector2i(0, 0) # testing only, to be removed -const OBJECT_NI_RANDOM_2: Vector2i = Vector2i(1, 0) # testing only, to be removed -const OBJECT_NI_ROCK_1: Vector2i = Vector2i(2, 0) -const OBJECT_NI_FIREPIT_ON: Vector2i = Vector2i(7, 1) -const OBJECT_NI_TREE_CUT: Vector2i = Vector2i(2, 0) -const OBJECT_NI_BOAT_NO_ENIGNE: Vector2i = Vector2i(4, 4) +const OBJECT_NI_RANDOM_1: Vector2i = Vector2i(0, 0) # testing only, to be removed +const OBJECT_NI_RANDOM_2: Vector2i = Vector2i(1, 0) # testing only, to be removed +const OBJECT_NI_ROCK_1: Vector2i = Vector2i(2, 0) # # I = interactive -const OBJECT_I_BOAT_ENGINE: Vector2i = Vector2i(0, 1) -const OBJECT_I_FUEL: Vector2i = Vector2i(1, 1) -const OBJECT_I_ANCHOR: Vector2i = Vector2i(2, 1) -const OBJECT_I_EMPTY_BUSH: Vector2i = Vector2i(3, 0) -const OBJECT_I_FILLED_BUSH: Vector2i = Vector2i(3, 1) -const OBJECT_I_BERRY: Vector2i = Vector2i(0, 5) -const OBJECT_I_STICK: Vector2i = Vector2i(1, 5) -const OBJECT_I_TREE_1: Vector2i = Vector2i(4, 0) -const OBJECT_I_CHEST: Vector2i = Vector2i(0, 2) -const OBJECT_I_GEARS: Vector2i = Vector2i(1, 2) -const OBJECT_I_MEDIKIT: Vector2i = Vector2i(2, 2) -const OBJECT_I_PADDLE: Vector2i = Vector2i(3, 2) -const OBJECT_I_GAS_STOVE: Vector2i = Vector2i(4, 2) -const OBJECT_I_TENT: Vector2i = Vector2i(6, 2) +# boat +const OBJECT_I_BOAT_NO_ENIGNE: Vector2i = Vector2i(4, 4) const OBJECT_I_BOAT_WITH_ENGINE: Vector2i = Vector2i(6, 4) -const OBJECT_I_FIREPIT_OFF: Vector2i = Vector2i(6, 1) +# boat parts +const OBJECT_I_BOAT_PART_GENERIC: Vector2i = Vector2i(4584, 5234) +const OBJECT_I_BOAT_PART_ENGINE: Vector2i = Vector2i(0, 1) +const OBJECT_I_BOAT_PART_FUEL: Vector2i = Vector2i(1, 1) +const OBJECT_I_BOAT_PART_ANCHOR: Vector2i = Vector2i(2, 1) +const OBJECT_I_BOAT_PART_CHEST: Vector2i = Vector2i(0, 2) +const OBJECT_I_BOAT_PART_GEARS: Vector2i = Vector2i(1, 2) +const OBJECT_I_BOAT_PART_MEDIKIT: Vector2i = Vector2i(2, 2) +const OBJECT_I_BOAT_PART_PADDLE: Vector2i = Vector2i(3, 2) +const OBJECT_I_BOAT_PART_GAS_STOVE: Vector2i = Vector2i(4, 2) +# camp +const OBJECT_I_TENT: Vector2i = Vector2i(6, 2) +const OBJECT_I_FIREPIT_OFF: Vector2i = Vector2i(6, 1) +const OBJECT_I_FIREPIT_ON: Vector2i = Vector2i(7, 1) +# other +const OBJECT_I_EMPTY_BUSH: Vector2i = Vector2i(3, 0) +const OBJECT_I_FILLED_BUSH: Vector2i = Vector2i(3, 1) +const OBJECT_I_BERRY: Vector2i = Vector2i(0, 5) +const OBJECT_I_STICK: Vector2i = Vector2i(1, 5) +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_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, + OBJECT_I_BOAT_PART_ENGINE, OBJECT_I_BOAT_PART_FUEL, OBJECT_I_BOAT_PART_ANCHOR, + OBJECT_I_BOAT_PART_CHEST, OBJECT_I_BOAT_PART_GEARS, OBJECT_I_BOAT_PART_MEDIKIT, + OBJECT_I_BOAT_PART_PADDLE, OBJECT_I_BOAT_PART_GAS_STOVE +] # @formatter:on # # temperature, sid = 2 const TEMPERATURE_NORMAL: Vector2i = EMPTY diff --git a/project/scripts/tilemap/World.gd b/project/scripts/tilemap/World.gd index 2fd1fe2..06e7405 100644 --- a/project/scripts/tilemap/World.gd +++ b/project/scripts/tilemap/World.gd @@ -1,14 +1,16 @@ class_name World extends Node2D +var tilemap_types: TileMapTileTypes = TileMapTileTypes.new() +# tilemap layers var tilemap_ground: TileMapLayerAccess = TileMapLayerAccess.new() var tilemap_non_interactive: TileMapLayerAccess = TileMapLayerAccess.new() 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() -# -var tilemap_types: TileMapTileTypes = TileMapTileTypes.new() +var tilemap_nav_vis: TileMapLayerAccess = TileMapLayerAccess.new() +# other nodes +var camp_manager: CampManager = CampManager.new() func _ready() -> void: @@ -31,7 +33,11 @@ func _ready() -> void: tilemap_player.setup() tilemap_temperature.setup() - print(tilemap_interactive.get_cell_atlas_coords(Vector2i(17, 6))) + call_deferred("defer_ready") + + +func defer_ready() -> void: + camp_manager.setup() # example usage diff --git a/project/scripts/tilemap/objects/CampManager.gd b/project/scripts/tilemap/objects/CampManager.gd new file mode 100644 index 0000000..68e9ac5 --- /dev/null +++ b/project/scripts/tilemap/objects/CampManager.gd @@ -0,0 +1,103 @@ +class_name CampManager +extends Node + +var tilemap_types: TileMapTileTypes = TileMapTileTypes.new() +# +var game_manager: GameManager = null +var tilemap_interactive: TileMapLayerAccess = null +# +var items: Array[Vector2i] = [] +var camp: Vector2i = Vector2i(0, 0) +var campfire: Vector2i = Vector2i(0, 0) + + +func setup() -> void: + tilemap_interactive = game_manager.world.tilemap_interactive + var camp_locations: Array[Vector2i] = tilemap_interactive.get_cells_by_type(tilemap_types.OBJECT_I_TENT) + if len(camp_locations) > 0: + camp = camp_locations[0] + else: + push_error("No camp location found on tilemap") + var firepit_locations: Array[Vector2i] = tilemap_interactive.get_cells_by_type_collection(tilemap_types.OBJECT_COLLECTION_FIREPIT) + if len(firepit_locations) > 0: + campfire = firepit_locations[0] + else: + push_error("No firepit location found on tilemap") + print("CampManager: camp=", camp, " campfire=", campfire) + + tilemap_interactive.set_cell(campfire, tilemap_types.OBJECT_I_FIREPIT_OFF) + + +func camp_contains_item(item: Vector2i) -> bool: + return items.find(item) != -1 + + +func camp_contains_item_collection(item: Array[Vector2i]) -> bool: + for i in item: + if items.find(i) == -1: + return false + return true + + +func camp_item_count(item: Vector2i) -> int: + var count: int = 0 + for i in items: + if i == item: + count += 1 + return count + + +func camp_item_collection_count(item: Array[Vector2i]) -> int: + var count: int = 0 + for i in items: + if item.find(i) != -1: + count += 1 + return count + + +func camp_take_item(item: Vector2i, count: int = 1) -> bool: + if camp_item_count(item) < count: + push_error("CampManager: not enough items to take: " + str(item)) + EventsTracker.track(EventsTracker.Event.CAMP_TAKE_ITEM_FAILED, {"item": item, "count": count}) + return false + + var taken: int = 0 + for i in range(items.size()): + if items[i] == item: + items.remove_at(i) + taken += 1 + if taken == count: + break + + EventsTracker.track(EventsTracker.Event.CAMP_TAKEN_ITEM, {"item": item, "count": count}) + return true + + +func camp_add_item(item: Vector2i) -> void: + items.append(item) + EventsTracker.track(EventsTracker.Event.CAMP_ADDED_ITEM, {"item": item, "count": 1, "new_count": camp_item_count(item)}) + + +func campfire_light() -> bool: + # requires two sticks in the camp + if camp_take_item(tilemap_types.OBJECT_I_STICK, 2): + tilemap_interactive.set_cell(campfire, tilemap_types.OBJECT_I_FIREPIT_ON) + EventsTracker.track(EventsTracker.Event.CAMPFIRE_LIT) + return true + else: + EventsTracker.track(EventsTracker.Event.CAMPFIRE_LIT_FAILED) + return false + + +func campfire_extinguish() -> void: + tilemap_interactive.set_cell(campfire, tilemap_types.OBJECT_I_FIREPIT_OFF) + EventsTracker.track(EventsTracker.Event.CAMPFIRE_EXTINGUISHED) + + +func sleep_effect() -> void: + EventsTracker.track(EventsTracker.Event.SLEEP) + game_manager.camera.go_to_zooming(game_manager.world.tilemap_player.cell_to_local(camp), 3) + var tween_in: Tween = game_manager.world.get_tree().create_tween() + tween_in.tween_method(game_manager.camera.set_vignette_intensity, 0.0, 1.0, 2.0).set_delay(0.5) + var tween_out: Tween = game_manager.world.get_tree().create_tween() + tween_out.tween_method(game_manager.camera.set_vignette_intensity, 1.0, 0.0, 2.0).set_delay(4.0)