diff --git a/project/main-scenes/island.tscn b/project/main-scenes/island.tscn index 2903cba..5f976ff 100644 --- a/project/main-scenes/island.tscn +++ b/project/main-scenes/island.tscn @@ -111,6 +111,23 @@ texture = ExtResource("4_o8ona") expand_mode = 2 stretch_mode = 5 +[node name="MarginContainer" type="MarginContainer" parent="Camera2D/CanvasLayer"] +anchors_preset = 12 +anchor_top = 1.0 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_top = -5.0 +grow_horizontal = 2 +grow_vertical = 0 +theme_override_constants/margin_left = 5 +theme_override_constants/margin_bottom = 5 + +[node name="RecentEventsLog" type="VBoxContainer" parent="Camera2D/CanvasLayer/MarginContainer"] +unique_name_in_owner = true +layout_mode = 2 +size_flags_horizontal = 0 +size_flags_vertical = 8 + [node name="Tileset" type="Node2D" parent="."] script = ExtResource("1_k0rw8") @@ -139,7 +156,6 @@ 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") diff --git a/project/scripts/global/EventsTracker.gd b/project/scripts/global/EventsTracker.gd index e2fac6b..238fbca 100644 --- a/project/scripts/global/EventsTracker.gd +++ b/project/scripts/global/EventsTracker.gd @@ -11,11 +11,13 @@ enum Event { SLEEP, PLAYER_PICKED_UP_ITEM, PLAYER_DROPPED_ITEM, + PLAYER_USED_ITEM, }; # static var events: Array[TrackedEvent] = [] -static var max_events: int = 20 -static var callbacks: Array[Callable] = [] +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() @@ -27,3 +29,55 @@ static func track(event: Event, params: Dictionary = {}) -> void: events.remove_at(0) for cb in callbacks: cb.call(event, params) + + +static func populate_visual_log(visual_events_log: VBoxContainer, game_manager: GameManager) -> void: + for child in visual_events_log.get_children(): + child.queue_free() + for event in events: + event = event as TrackedEvent + populate_visual_log_create_label(event, visual_events_log, game_manager) + + +static func populate_visual_log_create_label(event: TrackedEvent, container: Container, game_manager: GameManager) -> void: + var event_id: int = event.event + var params: Dictionary = event.params + + var text: String = "" + + if event_id == Event.CAMPFIRE_LIT: + text = "Campfire lit" + elif event_id == Event.CAMPFIRE_LIT_FAILED: + text = "Campfire lighting failed" + elif event_id == Event.CAMPFIRE_EXTINGUISHED: + text = "Campfire extinguished" + elif event_id == Event.CAMP_ADDED_ITEM: + text = "Camp added item" + elif event_id == Event.CAMP_TAKEN_ITEM: + text = "Camp taken item" + elif event_id == Event.CAMP_TAKE_ITEM_FAILED: + text = "Could not take item from camp" + elif event_id == Event.SLEEP: + text = "Player slept" + elif event_id == Event.PLAYER_PICKED_UP_ITEM: + text = "took" + elif event_id == Event.PLAYER_DROPPED_ITEM: + text = "dropped" + elif event_id == Event.PLAYER_USED_ITEM: + text = "used" + + var event_label: Label = Label.new() + event_label.text = text + event_label.add_theme_color_override("font_color", Color(0, 0, 0)) + + var event_container: HBoxContainer = HBoxContainer.new() + event_container.add_child(event_label) + + if params.has("item"): + var item_texture: Texture = game_manager.world.tilemap_interactive.get_cell_texture(params["item"]) + if item_texture: + var item_texture_rect: TextureRect = TextureRect.new() + item_texture_rect.texture = item_texture + event_container.add_child(item_texture_rect) + + container.add_child(event_container) diff --git a/project/scripts/global/GameManager.gd b/project/scripts/global/GameManager.gd index 39fc9b2..f5f2264 100644 --- a/project/scripts/global/GameManager.gd +++ b/project/scripts/global/GameManager.gd @@ -62,6 +62,7 @@ func _on_game_tick_timeout() -> void: tilemap_navigation.game_tick_end() world.game_tick_end() + EventsTracker.populate_visual_log(%RecentEventsLog, self) update_bars() diff --git a/project/scripts/player/tree/impl/game/critical_survival/TaskFindClosestFood.gd b/project/scripts/player/tree/impl/game/critical_survival/TaskFindClosestFood.gd index e74ed34..bd75f49 100644 --- a/project/scripts/player/tree/impl/game/critical_survival/TaskFindClosestFood.gd +++ b/project/scripts/player/tree/impl/game/critical_survival/TaskFindClosestFood.gd @@ -14,6 +14,7 @@ func run(blackboard: Dictionary) -> void: return var closest_berry: Vector2i = navigation.manhattan_distance_closest(active_foods, player.board_position) + StepVisualization.add_line_tileset(player.board_position, closest_berry, StepVisualization.LineType.SEARCH_SELECTED) if closest_berry == tilemap_types.NO_TILE_FOUND: status = FAILURE status_reason = "No closest berry found" diff --git a/project/scripts/player/tree/impl/game/critical_survival/TaskFindClosestStick.gd b/project/scripts/player/tree/impl/game/critical_survival/TaskFindClosestStick.gd index b80f09c..2d8f147 100644 --- a/project/scripts/player/tree/impl/game/critical_survival/TaskFindClosestStick.gd +++ b/project/scripts/player/tree/impl/game/critical_survival/TaskFindClosestStick.gd @@ -14,6 +14,7 @@ func run(blackboard: Dictionary) -> void: return var closest_stick: Vector2i = navigation.manhattan_distance_closest(sticks, player.board_position) + StepVisualization.add_line_tileset(player.board_position, closest_stick, StepVisualization.LineType.SEARCH_SELECTED) if closest_stick == tilemap_types.NO_TILE_FOUND: status = FAILURE status_reason = "No closest stick found" diff --git a/project/scripts/player/tree/impl/game/critical_survival/TaskFindClosestWarmTile.gd b/project/scripts/player/tree/impl/game/critical_survival/TaskFindClosestWarmTile.gd index d497e78..f8667db 100644 --- a/project/scripts/player/tree/impl/game/critical_survival/TaskFindClosestWarmTile.gd +++ b/project/scripts/player/tree/impl/game/critical_survival/TaskFindClosestWarmTile.gd @@ -14,6 +14,7 @@ func run(blackboard: Dictionary) -> void: return var closest_warm_tile: Vector2i = navigation.manhattan_distance_closest(warm_tiles, player.board_position) + StepVisualization.add_line_tileset(player.board_position, closest_warm_tile, StepVisualization.LineType.SEARCH_SELECTED) if closest_warm_tile == tilemap_types.NO_TILE_FOUND: status = FAILURE status_reason = "No closest warm tile found" diff --git a/project/scripts/player/tree/impl/game/inventory/TaskEatFoodFromInventory.gd b/project/scripts/player/tree/impl/game/inventory/TaskEatFoodFromInventory.gd index c452c5e..1e5045a 100644 --- a/project/scripts/player/tree/impl/game/inventory/TaskEatFoodFromInventory.gd +++ b/project/scripts/player/tree/impl/game/inventory/TaskEatFoodFromInventory.gd @@ -2,15 +2,16 @@ class_name TaskEatFoodFromInventory extends Task func run(blackboard: Dictionary) -> void: - var player: PlayerManager = blackboard["player"] + var player: PlayerManager = blackboard["player"] - if player.inventory_slot != tilemap_types.OBJECT_I_BERRY: - status = FAILURE - status_reason = "Inventory does not contain berry" - return + 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.max_food + EventsTracker.track(EventsTracker.Event.PLAYER_USED_ITEM, {"item": player.inventory_slot}) + player.inventory_slot = tilemap_types.EMPTY + player.food = player.max_food - status = SUCCESS - status_reason = "Ate berry, player now has " + str(player.food) + " food" + status = SUCCESS + status_reason = "Ate berry, player now has " + str(player.food) + " food" diff --git a/project/scripts/player/tree/impl/game/inventory/TaskUseStickFromInventory.gd b/project/scripts/player/tree/impl/game/inventory/TaskUseStickFromInventory.gd index bd93af2..3959229 100644 --- a/project/scripts/player/tree/impl/game/inventory/TaskUseStickFromInventory.gd +++ b/project/scripts/player/tree/impl/game/inventory/TaskUseStickFromInventory.gd @@ -9,6 +9,7 @@ func run(blackboard: Dictionary) -> void: status_reason = "Player does not have a stick in inventory" return + EventsTracker.track(EventsTracker.Event.PLAYER_USED_ITEM, {"item": player.inventory_slot}) player.inventory_slot = tilemap_types.EMPTY player.temperature_buff_timer = player.temperature_set_buff_value status = SUCCESS diff --git a/project/scripts/tilemap/StepVisualization.gd b/project/scripts/tilemap/StepVisualization.gd index 3e4041d..b3dae7e 100644 --- a/project/scripts/tilemap/StepVisualization.gd +++ b/project/scripts/tilemap/StepVisualization.gd @@ -4,18 +4,20 @@ extends Node2D static var game_manager: GameManager static var world: World # -# Dictionary[Array[Vector2i], bool] ([from, to], string) +enum LineType { SEARCH_BASE, SEARCH_SELECTED } +# +# Dictionary[Array[Vector2i], LineType] ([from, to], line_type) 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(from: Vector2i, to: Vector2i, line_type: LineType) -> void: + draw_lines[[from, to]] = line_type -static func add_line_tileset(from: Vector2i, to: Vector2i, label: String) -> void: +static func add_line_tileset(from: Vector2i, to: Vector2i, line_type: LineType) -> void: var from_tileset: Vector2i = world.tilemap_ground.cell_to_local(from) var to_tileset: Vector2i = world.tilemap_ground.cell_to_local(to) - draw_lines[[from_tileset, to_tileset]] = label + draw_lines[[from_tileset, to_tileset]] = line_type func game_tick_start(): @@ -27,8 +29,7 @@ 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") +@export var default_line_color: Color = Color("red") func _ready() -> void: @@ -38,9 +39,14 @@ func _ready() -> void: 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, line_color, 2) - var center: Vector2 = (from + to) / 2 - draw_string(label_font, center, label, 0, -1, 12, text_color) + var from: Vector2i = key[0] + var to: Vector2i = key[1] + var line_type: LineType = draw_lines[key] + + if line_type == LineType.SEARCH_BASE: + draw_line(from, to, Color("blue"), 1) + elif line_type == LineType.SEARCH_SELECTED: + draw_line(from, to, Color("green"), 2) + + # var center: Vector2 = (from + to) / 2 + # draw_string(label_font, center, label, 0, -1, 12, text_color) diff --git a/project/scripts/tilemap/TilemapNavigation.gd b/project/scripts/tilemap/TilemapNavigation.gd index e6e5eec..6c8c371 100644 --- a/project/scripts/tilemap/TilemapNavigation.gd +++ b/project/scripts/tilemap/TilemapNavigation.gd @@ -39,7 +39,7 @@ func is_within_radius(position: Vector2i, center: Vector2i, radius: int, record: 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) if record: - StepVisualization.add_line_tileset(a, b, str(dist)) + StepVisualization.add_line_tileset(a, b, StepVisualization.LineType.SEARCH_BASE) return dist