fix: empty 3x3 tiles below candy cannon and add outline shaders to cannon, projectiles, bubbles and vfx
This commit is contained in:
@@ -9,7 +9,38 @@ class_name CandyCannonController
|
|||||||
@onready var tank = $Tank if has_node("Tank") else null
|
@onready var tank = $Tank if has_node("Tank") else null
|
||||||
|
|
||||||
func _ready() -> void:
|
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:
|
func _process(delta: float) -> void:
|
||||||
if ring1: ring1.rotate_y(delta * 1.5)
|
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
|
mat.emission_energy_multiplier = 3.0
|
||||||
projectile.material_override = mat
|
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
|
# Start projectile slightly above the cannon center
|
||||||
projectile.global_position = global_position + Vector3(0, 3.0, 0)
|
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.amount = 16
|
||||||
particles.lifetime = 0.4
|
particles.lifetime = 0.4
|
||||||
projectile.add_child(particles)
|
projectile.add_child(particles)
|
||||||
|
_apply_outline_recursive(projectile)
|
||||||
|
|
||||||
tween.set_parallel(true)
|
tween.set_parallel(true)
|
||||||
tween.tween_property(projectile, "global_position:x", target_world_pos.x, duration).set_trans(Tween.TRANS_LINEAR)
|
tween.tween_property(projectile, "global_position:x", target_world_pos.x, duration).set_trans(Tween.TRANS_LINEAR)
|
||||||
|
|||||||
@@ -412,11 +412,11 @@ func _apply_arena_setup() -> void:
|
|||||||
var pos = Vector2i(x, z)
|
var pos = Vector2i(x, z)
|
||||||
|
|
||||||
# Center 3x3 block: NPC obstacle (Candy Pump)
|
# Center 3x3 block: NPC obstacle (Candy Pump)
|
||||||
if _is_npc_zone(pos):
|
if _is_npc_zone(pos):
|
||||||
# Make the floor walkable visually instead of obstacle red
|
# Make the floor empty (-1) beneath the Candy Pump
|
||||||
gridmap.set_cell_item(Vector3i(x, 0, z), TILE_WALKABLE)
|
gridmap.set_cell_item(Vector3i(x, 0, z), -1)
|
||||||
gridmap.set_cell_item(Vector3i(x, 1, z), -1)
|
gridmap.set_cell_item(Vector3i(x, 1, z), -1)
|
||||||
continue
|
continue
|
||||||
|
|
||||||
# Boundary walls: perimeter (row 0, row 19, col 0, col 19)
|
# 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:
|
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_enabled = true
|
||||||
spatial_mat.emission = Color(1.0, 0.6, 0.8)
|
spatial_mat.emission = Color(1.0, 0.6, 0.8)
|
||||||
spatial_mat.emission_energy_multiplier = 2.0
|
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
|
mesh.material = spatial_mat
|
||||||
particles.draw_pass_1 = mesh
|
particles.draw_pass_1 = mesh
|
||||||
|
|
||||||
@@ -1558,6 +1564,11 @@ func _spawn_bubble_visual(center: Vector2i) -> void:
|
|||||||
mat.emission_enabled = true
|
mat.emission_enabled = true
|
||||||
mat.emission = Color(1.0, 0.2, 0.6)
|
mat.emission = Color(1.0, 0.2, 0.6)
|
||||||
mat.emission_energy_multiplier = 1.5
|
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
|
mesh_inst.material_override = mat
|
||||||
|
|
||||||
var main = get_node_or_null("/root/Main")
|
var main = get_node_or_null("/root/Main")
|
||||||
|
|||||||
Reference in New Issue
Block a user