Added visualizer for events tracker

mapsaving
Yan Wittmann 2025-01-11 14:34:30 +01:00
parent 75af4679c0
commit ed665886d3
10 changed files with 108 additions and 26 deletions

View File

@ -111,6 +111,23 @@ texture = ExtResource("4_o8ona")
expand_mode = 2 expand_mode = 2
stretch_mode = 5 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="."] [node name="Tileset" type="Node2D" parent="."]
script = ExtResource("1_k0rw8") script = ExtResource("1_k0rw8")
@ -139,7 +156,6 @@ tile_set = ExtResource("1_vlccq")
[node name="StepVisualization" type="Node2D" parent="Tileset"] [node name="StepVisualization" type="Node2D" parent="Tileset"]
script = ExtResource("5_sr2su") script = ExtResource("5_sr2su")
text_color = Color(0.16133, 0.00745911, 0.0516868, 1)
[node name="PlayerManager" type="Node" parent="."] [node name="PlayerManager" type="Node" parent="."]
script = ExtResource("4_1xqo1") script = ExtResource("4_1xqo1")

View File

@ -11,11 +11,13 @@ enum Event {
SLEEP, SLEEP,
PLAYER_PICKED_UP_ITEM, PLAYER_PICKED_UP_ITEM,
PLAYER_DROPPED_ITEM, PLAYER_DROPPED_ITEM,
PLAYER_USED_ITEM,
}; };
# #
static var events: Array[TrackedEvent] = [] static var events: Array[TrackedEvent] = []
static var max_events: int = 20 static var max_events: int = 20
static var callbacks: Array[Callable] = [] static var callbacks: Array[Callable] = []
static func track(event: Event, params: Dictionary = {}) -> void: static func track(event: Event, params: Dictionary = {}) -> void:
var tracked_event: TrackedEvent = TrackedEvent.new() var tracked_event: TrackedEvent = TrackedEvent.new()
@ -27,3 +29,55 @@ static func track(event: Event, params: Dictionary = {}) -> void:
events.remove_at(0) events.remove_at(0)
for cb in callbacks: for cb in callbacks:
cb.call(event, params) 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)

View File

@ -62,6 +62,7 @@ func _on_game_tick_timeout() -> void:
tilemap_navigation.game_tick_end() tilemap_navigation.game_tick_end()
world.game_tick_end() world.game_tick_end()
EventsTracker.populate_visual_log(%RecentEventsLog, self)
update_bars() update_bars()

View File

@ -14,6 +14,7 @@ func run(blackboard: Dictionary) -> void:
return return
var closest_berry: Vector2i = navigation.manhattan_distance_closest(active_foods, player.board_position) 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: if closest_berry == tilemap_types.NO_TILE_FOUND:
status = FAILURE status = FAILURE
status_reason = "No closest berry found" status_reason = "No closest berry found"

View File

@ -14,6 +14,7 @@ func run(blackboard: Dictionary) -> void:
return return
var closest_stick: Vector2i = navigation.manhattan_distance_closest(sticks, player.board_position) 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: if closest_stick == tilemap_types.NO_TILE_FOUND:
status = FAILURE status = FAILURE
status_reason = "No closest stick found" status_reason = "No closest stick found"

View File

@ -14,6 +14,7 @@ func run(blackboard: Dictionary) -> void:
return return
var closest_warm_tile: Vector2i = navigation.manhattan_distance_closest(warm_tiles, player.board_position) 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: if closest_warm_tile == tilemap_types.NO_TILE_FOUND:
status = FAILURE status = FAILURE
status_reason = "No closest warm tile found" status_reason = "No closest warm tile found"

View File

@ -2,15 +2,16 @@ class_name TaskEatFoodFromInventory
extends Task extends Task
func run(blackboard: Dictionary) -> void: func run(blackboard: Dictionary) -> void:
var player: PlayerManager = blackboard["player"] var player: PlayerManager = blackboard["player"]
if player.inventory_slot != tilemap_types.OBJECT_I_BERRY: if player.inventory_slot != tilemap_types.OBJECT_I_BERRY:
status = FAILURE status = FAILURE
status_reason = "Inventory does not contain berry" status_reason = "Inventory does not contain berry"
return return
player.inventory_slot = tilemap_types.EMPTY EventsTracker.track(EventsTracker.Event.PLAYER_USED_ITEM, {"item": player.inventory_slot})
player.food = player.max_food player.inventory_slot = tilemap_types.EMPTY
player.food = player.max_food
status = SUCCESS status = SUCCESS
status_reason = "Ate berry, player now has " + str(player.food) + " food" status_reason = "Ate berry, player now has " + str(player.food) + " food"

View File

@ -9,6 +9,7 @@ func run(blackboard: Dictionary) -> void:
status_reason = "Player does not have a stick in inventory" status_reason = "Player does not have a stick in inventory"
return return
EventsTracker.track(EventsTracker.Event.PLAYER_USED_ITEM, {"item": player.inventory_slot})
player.inventory_slot = tilemap_types.EMPTY player.inventory_slot = tilemap_types.EMPTY
player.temperature_buff_timer = player.temperature_set_buff_value player.temperature_buff_timer = player.temperature_set_buff_value
status = SUCCESS status = SUCCESS

View File

@ -4,18 +4,20 @@ extends Node2D
static var game_manager: GameManager static var game_manager: GameManager
static var world: World 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 var draw_lines: Dictionary = {}
static func add_line(from: Vector2i, to: Vector2i, label: String) -> void: static func add_line(from: Vector2i, to: Vector2i, line_type: LineType) -> void:
draw_lines[[from, to]] = label 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 from_tileset: Vector2i = world.tilemap_ground.cell_to_local(from)
var to_tileset: Vector2i = world.tilemap_ground.cell_to_local(to) 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(): func game_tick_start():
@ -27,8 +29,7 @@ func game_tick_end():
var label_font = Control.new().get_theme_default_font() var label_font = Control.new().get_theme_default_font()
@export var line_color: Color = Color("red") @export var default_line_color: Color = Color("red")
@export var text_color: Color = Color("white")
func _ready() -> void: func _ready() -> void:
@ -38,9 +39,14 @@ func _ready() -> void:
func _draw() -> void: func _draw() -> void:
# draw all draw_lines with their labels # draw all draw_lines with their labels
for key in draw_lines.keys(): for key in draw_lines.keys():
var from: Vector2i = key[0] var from: Vector2i = key[0]
var to: Vector2i = key[1] var to: Vector2i = key[1]
var label: String = draw_lines[key] var line_type: LineType = draw_lines[key]
draw_line(from, to, line_color, 2)
var center: Vector2 = (from + to) / 2 if line_type == LineType.SEARCH_BASE:
draw_string(label_font, center, label, 0, -1, 12, text_color) 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)

View File

@ -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: 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) var dist: int = abs(a.x - b.x) + abs(a.y - b.y)
if record: if record:
StepVisualization.add_line_tileset(a, b, str(dist)) StepVisualization.add_line_tileset(a, b, StepVisualization.LineType.SEARCH_BASE)
return dist return dist