From 5d9b0ce738bf89d972778a4e40a291932c79bb0d Mon Sep 17 00:00:00 2001 From: Nikolai Fedorov Date: Thu, 23 Apr 2026 14:44:21 +0300 Subject: [PATCH] add kickable tooltips --- scripts/Boulder.gd | 18 ++++++++++++++++++ scripts/Essence.gd | 18 ++++++++++++++++++ scripts/Iron.gd | 18 ++++++++++++++++++ scripts/Leather.gd | 18 ++++++++++++++++++ scripts/Rock.gd | 18 ++++++++++++++++++ scripts/Stick.gd | 18 ++++++++++++++++++ 6 files changed, 108 insertions(+) diff --git a/scripts/Boulder.gd b/scripts/Boulder.gd index 2fc3b01..2c18b49 100644 --- a/scripts/Boulder.gd +++ b/scripts/Boulder.gd @@ -20,6 +20,7 @@ var damage_modifier: float = 1.8 @onready var mesh_node: MeshInstance3D = $BoulderMesh var boulder_mat: StandardMaterial3D +var _tooltip: Label3D const COLOR_IDLE := Color(0.32, 0.28, 0.22) const COLOR_IMPACT := Color(1.0, 1.0, 1.0) @@ -28,6 +29,23 @@ func _ready() -> void: add_to_group("kickable") boulder_mat = mesh_node.material_override.duplicate() as StandardMaterial3D mesh_node.material_override = boulder_mat + _tooltip = Label3D.new() + _tooltip.text = "Boulder\nRock+Rock\nVery heavy. High damage" + _tooltip.billboard = BaseMaterial3D.BILLBOARD_ENABLED + _tooltip.font_size = 28 + _tooltip.outline_size = 6 + _tooltip.position = Vector3(0, 1.4, 0) + _tooltip.modulate = Color(1.0, 0.95, 0.8) + _tooltip.visible = false + add_child(_tooltip) + +func _process(_delta: float) -> void: + if dead or state != State.IDLE: + _tooltip.visible = false + return + var players := get_tree().get_nodes_in_group("player") + _tooltip.visible = not players.is_empty() and \ + (players[0] as Node3D).global_position.distance_to(global_position) < 2.5 func apply_collision_damage(dmg: float) -> void: _take_damage(dmg) diff --git a/scripts/Essence.gd b/scripts/Essence.gd index 9aad95f..5b6cbb6 100644 --- a/scripts/Essence.gd +++ b/scripts/Essence.gd @@ -22,6 +22,7 @@ var damage_modifier: float = 0.0 @onready var mesh_node: MeshInstance3D = $EssenceMesh var essence_mat: StandardMaterial3D +var _tooltip: Label3D func _ready() -> void: add_to_group("kickable") @@ -30,6 +31,23 @@ func _ready() -> void: var tw := create_tween().set_loops() tw.tween_property(self, "position:y", 0.35, 0.6) tw.tween_property(self, "position:y", 0.15, 0.6) + _tooltip = Label3D.new() + _tooltip.text = "Magic Essence\nKick into\nEnchanting Table → Sphere" + _tooltip.billboard = BaseMaterial3D.BILLBOARD_ENABLED + _tooltip.font_size = 28 + _tooltip.outline_size = 6 + _tooltip.position = Vector3(0, 1.2, 0) + _tooltip.modulate = Color(0.85, 0.7, 1.0) + _tooltip.visible = false + add_child(_tooltip) + +func _process(_delta: float) -> void: + if dead or state != State.IDLE: + _tooltip.visible = false + return + var players := get_tree().get_nodes_in_group("player") + _tooltip.visible = not players.is_empty() and \ + (players[0] as Node3D).global_position.distance_to(global_position) < 2.5 func apply_collision_damage(_dmg: float) -> void: pass diff --git a/scripts/Iron.gd b/scripts/Iron.gd index b0dba2a..b0d7328 100644 --- a/scripts/Iron.gd +++ b/scripts/Iron.gd @@ -22,6 +22,7 @@ var damage_modifier: float = 0.9 @onready var mesh_node: MeshInstance3D = $IronMesh var iron_mat: StandardMaterial3D +var _tooltip: Label3D const COLOR_IDLE := Color(0.55, 0.58, 0.62) const COLOR_IMPACT := Color(1.0, 1.0, 1.0) @@ -30,6 +31,23 @@ func _ready() -> void: add_to_group("kickable") iron_mat = mesh_node.material_override.duplicate() as StandardMaterial3D mesh_node.material_override = iron_mat + _tooltip = Label3D.new() + _tooltip.text = "Iron\nHeavy weapon\n+Leather → Iron Shield\nForge → Metal Plate" + _tooltip.billboard = BaseMaterial3D.BILLBOARD_ENABLED + _tooltip.font_size = 28 + _tooltip.outline_size = 6 + _tooltip.position = Vector3(0, 1.1, 0) + _tooltip.modulate = Color(1.0, 0.95, 0.8) + _tooltip.visible = false + add_child(_tooltip) + +func _process(_delta: float) -> void: + if dead or state != State.IDLE: + _tooltip.visible = false + return + var players := get_tree().get_nodes_in_group("player") + _tooltip.visible = not players.is_empty() and \ + (players[0] as Node3D).global_position.distance_to(global_position) < 2.5 func apply_collision_damage(dmg: float) -> void: _take_damage(dmg) diff --git a/scripts/Leather.gd b/scripts/Leather.gd index 4bd32d1..fd3ac2e 100644 --- a/scripts/Leather.gd +++ b/scripts/Leather.gd @@ -14,9 +14,27 @@ var fly_vel: Vector3 = Vector3.ZERO var damage_modifier: float = 0.0 @onready var mesh_node: MeshInstance3D = $LeatherMesh +var _tooltip: Label3D func _ready() -> void: add_to_group("kickable") + _tooltip = Label3D.new() + _tooltip.text = "Leather\n+Stick → Boots\n+Rock → Leather Armor\n+Iron → Iron Shield" + _tooltip.billboard = BaseMaterial3D.BILLBOARD_ENABLED + _tooltip.font_size = 28 + _tooltip.outline_size = 6 + _tooltip.position = Vector3(0, 1.0, 0) + _tooltip.modulate = Color(1.0, 0.95, 0.8) + _tooltip.visible = false + add_child(_tooltip) + +func _process(_delta: float) -> void: + if state != State.IDLE: + _tooltip.visible = false + return + var players := get_tree().get_nodes_in_group("player") + _tooltip.visible = not players.is_empty() and \ + (players[0] as Node3D).global_position.distance_to(global_position) < 2.5 func apply_collision_damage(_dmg: float) -> void: pass diff --git a/scripts/Rock.gd b/scripts/Rock.gd index b41ae02..4d7d01c 100644 --- a/scripts/Rock.gd +++ b/scripts/Rock.gd @@ -20,6 +20,7 @@ var damage_modifier: float = 1.25 @onready var mesh_node: MeshInstance3D = $RockMesh var rock_mat: StandardMaterial3D +var _tooltip: Label3D const COLOR_IDLE := Color(0.45, 0.38, 0.30) const COLOR_IMPACT := Color(1.0, 1.0, 1.0) @@ -28,6 +29,23 @@ func _ready() -> void: add_to_group("kickable") rock_mat = mesh_node.material_override.duplicate() as StandardMaterial3D mesh_node.material_override = rock_mat + _tooltip = Label3D.new() + _tooltip.text = "Rock\n+Rock → Boulder\n+Stick → Wood Shield" + _tooltip.billboard = BaseMaterial3D.BILLBOARD_ENABLED + _tooltip.font_size = 28 + _tooltip.outline_size = 6 + _tooltip.position = Vector3(0, 1.1, 0) + _tooltip.modulate = Color(1.0, 0.95, 0.8) + _tooltip.visible = false + add_child(_tooltip) + +func _process(_delta: float) -> void: + if dead or state != State.IDLE: + _tooltip.visible = false + return + var players := get_tree().get_nodes_in_group("player") + _tooltip.visible = not players.is_empty() and \ + (players[0] as Node3D).global_position.distance_to(global_position) < 2.5 func can_merge_with(_other: Node3D, _speed: float) -> bool: return false diff --git a/scripts/Stick.gd b/scripts/Stick.gd index 0189e50..6f7dcef 100644 --- a/scripts/Stick.gd +++ b/scripts/Stick.gd @@ -20,6 +20,7 @@ var damage_modifier: float = 0.6 @onready var mesh_node: MeshInstance3D = $StickMesh var stick_mat: StandardMaterial3D +var _tooltip: Label3D const COLOR_IDLE := Color(0.55, 0.38, 0.18) const COLOR_IMPACT := Color(1.0, 1.0, 1.0) @@ -28,6 +29,23 @@ func _ready() -> void: add_to_group("kickable") stick_mat = mesh_node.material_override.duplicate() as StandardMaterial3D mesh_node.material_override = stick_mat + _tooltip = Label3D.new() + _tooltip.text = "Stick\n+Leather → Boots\n+Stick → Stick Armor\n+Rock → Wood Shield" + _tooltip.billboard = BaseMaterial3D.BILLBOARD_ENABLED + _tooltip.font_size = 28 + _tooltip.outline_size = 6 + _tooltip.position = Vector3(0, 1.2, 0) + _tooltip.modulate = Color(1.0, 0.95, 0.8) + _tooltip.visible = false + add_child(_tooltip) + +func _process(_delta: float) -> void: + if dead or state != State.IDLE: + _tooltip.visible = false + return + var players := get_tree().get_nodes_in_group("player") + _tooltip.visible = not players.is_empty() and \ + (players[0] as Node3D).global_position.distance_to(global_position) < 2.5 func apply_collision_damage(dmg: float) -> void: _take_damage(dmg)