class_name Hud extends CanvasLayer ## Text over the game: the stone count, short messages, a status line for ## playing together and a help line. const MESSAGE_SECONDS := 2.5 var _stone := Label.new() var _message := Label.new() var _status := Label.new() var _help := Label.new() var _message_left := 0.0 var _paused := false func _ready() -> void: _stone.position = Vector2(16, 12) _stone.add_theme_font_size_override("font_size", 22) _message.position = Vector2(16, 48) _message.add_theme_font_size_override("font_size", 18) _status.add_theme_font_size_override("font_size", 14) _status.set_anchors_and_offsets_preset(Control.PRESET_TOP_RIGHT, Control.PRESET_MODE_MINSIZE, 16) _status.grow_horizontal = Control.GROW_DIRECTION_BEGIN _help.text = tr("HELP") _help.add_theme_font_size_override("font_size", 14) for label: Label in [_stone, _message, _status, _help]: label.add_theme_color_override("font_outline_color", Color.BLACK) label.add_theme_constant_override("outline_size", 4) add_child(label) _help.set_anchors_and_offsets_preset(Control.PRESET_BOTTOM_LEFT, Control.PRESET_MODE_MINSIZE, 16) func _process(delta: float) -> void: if _message_left <= 0.0: return _message_left -= delta if _message_left <= 0.0: _message.text = tr("PAUSED") if _paused else "" func show_stone(count: int) -> void: _stone.text = tr("STONE_COUNT") % count ## Shows the text for `key` for a few seconds, with `values` filled into ## its placeholders. func flash(key: String, values: Array = []) -> void: _message.text = tr(key) % values if not values.is_empty() else tr(key) _message_left = MESSAGE_SECONDS ## Shows or hides the pause notice. It stays until the game continues and ## returns when a message shown in between ends. func show_paused(paused: bool) -> void: _paused = paused _message.text = tr("PAUSED") if paused else "" _message_left = 0.0 ## Shows `text` in the top right corner until it is replaced. func show_status(text: String) -> void: _status.text = text ## The text currently shown in the status line. Tests read it. func status_text() -> String: return _status.text ## The text currently shown as a message. Tests read it. func message() -> String: return _message.text ## The text currently shown as the stone count. Tests read it. func stone_text() -> String: return _stone.text