From a5595dbd6b4a4f8aa0cd92b41701f73d10b6391c Mon Sep 17 00:00:00 2001 From: adtpdn Date: Mon, 29 Jun 2026 20:53:28 +0800 Subject: [PATCH] fix: empty 3x3 tiles below candy cannon and add outline shaders to cannon, projectiles, bubbles and vfx --- .../controllers/candy_cannon_controller.gd | 37 ++++++++++++++++++- scripts/managers/gauntlet_manager.gd | 21 ++++++++--- 2 files changed, 51 insertions(+), 7 deletions(-) diff --git a/scripts/controllers/candy_cannon_controller.gd b/scripts/controllers/candy_cannon_controller.gd index 0b26068..6fa0f6c 100644 --- a/scripts/controllers/candy_cannon_controller.gd +++ b/scripts/controllers/candy_cannon_controller.gd @@ -9,7 +9,38 @@ class_name CandyCannonController @onready var tank = $Tank if has_node("Tank") else null func _ready() -> void: - pass + _apply_outline_recursive(self) + +func _apply_outline_recursive(node: Node) -> void: + if node is MeshInstance3D and node.mesh: + # Some procedural meshes might not have get_surface_count or it might be 1. + # If the mesh has material_override, apply outline to that + if node.material_override and node.material_override is StandardMaterial3D: + var mat = node.material_override + if not mat.next_pass: + var outline_mat = ShaderMaterial.new() + outline_mat.shader = load("res://assets/shaders/outline3d.gdshader") + mat.next_pass = outline_mat + else: + for i in range(node.mesh.get_surface_count()): + var mat = node.get_active_material(i) + if mat: + if not mat.next_pass: + var unique_mat = mat.duplicate() + var outline_mat = ShaderMaterial.new() + outline_mat.shader = load("res://assets/shaders/outline3d.gdshader") + unique_mat.next_pass = outline_mat + node.set_surface_override_material(i, unique_mat) + + if node is GPUParticles3D and node.draw_pass_1 and node.draw_pass_1.material: + var mat = node.draw_pass_1.material + if not mat.next_pass: + var outline_mat = ShaderMaterial.new() + outline_mat.shader = load("res://assets/shaders/outline3d.gdshader") + mat.next_pass = outline_mat + + for child in node.get_children(): + _apply_outline_recursive(child) func _process(delta: float) -> void: if ring1: ring1.rotate_y(delta * 1.5) @@ -42,7 +73,8 @@ func spawn_projectile(target_world_pos: Vector3, duration: float) -> void: mat.emission_energy_multiplier = 3.0 projectile.material_override = mat - get_tree().get_root().add_child(projectile) + projectile.top_level = true + add_child(projectile) # Start projectile slightly above the cannon center projectile.global_position = global_position + Vector3(0, 3.0, 0) @@ -75,6 +107,7 @@ func spawn_projectile(target_world_pos: Vector3, duration: float) -> void: particles.amount = 16 particles.lifetime = 0.4 projectile.add_child(particles) + _apply_outline_recursive(projectile) tween.set_parallel(true) tween.tween_property(projectile, "global_position:x", target_world_pos.x, duration).set_trans(Tween.TRANS_LINEAR) diff --git a/scripts/managers/gauntlet_manager.gd b/scripts/managers/gauntlet_manager.gd index a7b5901..7506a60 100644 --- a/scripts/managers/gauntlet_manager.gd +++ b/scripts/managers/gauntlet_manager.gd @@ -412,11 +412,11 @@ func _apply_arena_setup() -> void: var pos = Vector2i(x, z) # Center 3x3 block: NPC obstacle (Candy Pump) - if _is_npc_zone(pos): - # Make the floor walkable visually instead of obstacle red - gridmap.set_cell_item(Vector3i(x, 0, z), TILE_WALKABLE) - gridmap.set_cell_item(Vector3i(x, 1, z), -1) - continue + if _is_npc_zone(pos): + # Make the floor empty (-1) beneath the Candy Pump + gridmap.set_cell_item(Vector3i(x, 0, z), -1) + gridmap.set_cell_item(Vector3i(x, 1, z), -1) + continue # Boundary walls: perimeter (row 0, row 19, col 0, col 19) if x == 0 or x == ARENA_COLUMNS - 1 or z == 0 or z == ARENA_ROWS - 1: @@ -982,6 +982,12 @@ func _spawn_impact_particles(targets: Array) -> void: spatial_mat.emission_enabled = true spatial_mat.emission = Color(1.0, 0.6, 0.8) spatial_mat.emission_energy_multiplier = 2.0 + + # Outline shader for splash VFX + var outline_mat = ShaderMaterial.new() + outline_mat.shader = load("res://assets/shaders/outline3d.gdshader") + spatial_mat.next_pass = outline_mat + mesh.material = spatial_mat particles.draw_pass_1 = mesh @@ -1558,6 +1564,11 @@ func _spawn_bubble_visual(center: Vector2i) -> void: mat.emission_enabled = true mat.emission = Color(1.0, 0.2, 0.6) mat.emission_energy_multiplier = 1.5 + + var outline_mat = ShaderMaterial.new() + outline_mat.shader = load("res://assets/shaders/outline3d.gdshader") + mat.next_pass = outline_mat + mesh_inst.material_override = mat var main = get_node_or_null("/root/Main")