added corpses and a wall building dissolve animation
This commit is contained in:
@ -21,11 +21,6 @@ var enemy_names = []
|
||||
@export var pickup_notif_scene : PackedScene
|
||||
@export var wave_start_label : Label
|
||||
|
||||
var wave_start_label_shrinking := false
|
||||
var wave_start_label_growing := false
|
||||
var wave_start_label_ease_time := 1.0
|
||||
var wave_start_label_ease_progress := 0.0
|
||||
|
||||
|
||||
func set_energy_visible(value):
|
||||
weapon_energy_bar.set_visible(value)
|
||||
@ -35,40 +30,29 @@ func set_offhand_energy_visible(value):
|
||||
offhand_energy_bar.set_visible(value)
|
||||
|
||||
|
||||
func ease_in_out_quart(x : float) -> float:
|
||||
return 8.0 * x * x * x * x if x < 0.5 else 1 - pow(-2.0 * x + 2.0, 4) / 2.0
|
||||
|
||||
|
||||
func _process(delta: float) -> void:
|
||||
fps_label.text = "FPS: " + str(Engine.get_frames_per_second())
|
||||
|
||||
wave_start_label.text = "Press [" + Data.player_keymap.ready.as_text_key_label() + "] to start wave"
|
||||
if wave_start_label_growing or wave_start_label_shrinking:
|
||||
wave_start_label_ease_progress += delta
|
||||
if wave_start_label_growing:
|
||||
wave_start_label.set_visible(true)
|
||||
wave_start_label.offset_left = lerp(0.0, -300.0, ease_in_out_quart(wave_start_label_ease_progress / wave_start_label_ease_time))
|
||||
wave_start_label.offset_right = lerp(0.0, 300.0, ease_in_out_quart(wave_start_label_ease_progress / wave_start_label_ease_time))
|
||||
if wave_start_label_ease_progress >= wave_start_label_ease_time:
|
||||
wave_start_label_growing = false
|
||||
wave_start_label_ease_progress = 0.0
|
||||
elif wave_start_label_shrinking:
|
||||
wave_start_label.offset_left = lerp(-300.0, 0.0, ease_in_out_quart(wave_start_label_ease_progress / wave_start_label_ease_time))
|
||||
wave_start_label.offset_right = lerp(300.0, 0.0, ease_in_out_quart(wave_start_label_ease_progress / wave_start_label_ease_time))
|
||||
if wave_start_label_ease_progress >= wave_start_label_ease_time:
|
||||
wave_start_label.set_visible(false)
|
||||
wave_start_label_shrinking = false
|
||||
wave_start_label_ease_progress = 0.0
|
||||
|
||||
|
||||
func grow_wave_start_label():
|
||||
wave_start_label_growing = true
|
||||
wave_start_label_shrinking = false
|
||||
tween_label(300.0)
|
||||
|
||||
|
||||
func shrink_wave_start_label():
|
||||
wave_start_label_shrinking = true
|
||||
wave_start_label_growing = false
|
||||
tween_label(0.0)
|
||||
|
||||
|
||||
func tween_label(x: float) -> void:
|
||||
var tween = create_tween()
|
||||
tween.set_ease(Tween.EASE_IN_OUT)
|
||||
tween.set_trans(Tween.TRANS_QUAD)
|
||||
if x > 0.0:
|
||||
tween.tween_callback(wave_start_label.set_visible.bind(true))
|
||||
tween.parallel().tween_property(wave_start_label, "offset_left", -x, 0.6)
|
||||
tween.parallel().tween_property(wave_start_label, "offset_right", x, 0.6)
|
||||
if x <= 0.0:
|
||||
tween.tween_callback(wave_start_label.set_visible.bind(false))
|
||||
|
||||
|
||||
func set_hover_text(text):
|
||||
|
@ -1,12 +1,13 @@
|
||||
extends Resource
|
||||
class_name Enemy
|
||||
|
||||
@export var title = "dog"
|
||||
@export var target_type : Data.EnemyType
|
||||
@export var icon : Texture
|
||||
@export var sprite : AtlasTexture
|
||||
@export var spawn_power := 10
|
||||
@export var health = 100
|
||||
@export var penalty = 10
|
||||
@export var movement_speed = 0.5
|
||||
@export var spawn_cooldown = 1.0
|
||||
@export var title := "dog"
|
||||
@export var target_type: Data.EnemyType
|
||||
@export var icon: Texture
|
||||
@export var death_sprite: Texture
|
||||
@export var sprite: AtlasTexture
|
||||
@export var spawn_power:= 10
|
||||
@export var health := 100
|
||||
@export var penalty := 10
|
||||
@export var movement_speed := 0.5
|
||||
@export var spawn_cooldown := 1.0
|
||||
|
@ -5,7 +5,6 @@ class_name EditTool
|
||||
@export var inventory : Inventory
|
||||
@export var ray : RayCast3D
|
||||
@export var wall_preview : TowerBase
|
||||
@export var build_preview_material : StandardMaterial3D
|
||||
@export var progress_bar : TextureProgressBar
|
||||
|
||||
var enabled := true
|
||||
@ -27,9 +26,10 @@ var interact_hold_time := 0.4
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
wall_preview.set_material(build_preview_material)
|
||||
build_preview_material.albedo_color = Color.GREEN
|
||||
build_preview_material.albedo_color.a = 0.8
|
||||
var c = Color.GREEN
|
||||
c.a = 0.8
|
||||
wall_preview.set_color(c)
|
||||
wall_preview.set_float(0.0)
|
||||
wall_preview.toggle_collision()
|
||||
|
||||
|
||||
@ -39,13 +39,14 @@ func _process(delta: float) -> void:
|
||||
ray_point = null
|
||||
wall_preview.set_visible(false)
|
||||
if is_instance_valid(last_collider):
|
||||
Game.level.a_star_graph_3d.tower_base_ids[last_collider.point_id].set_material(null)
|
||||
Game.level.a_star_graph_3d.tower_base_ids[last_collider.point_id].set_float(1.0)
|
||||
last_collider = null
|
||||
return
|
||||
|
||||
if interact_key_held and !interacted_once and valid_point and hero.currency >= Data.wall_cost and ray.is_colliding() and Game.level.a_star_graph_3d.point_is_build_location(point_id):
|
||||
interact_held_time += delta
|
||||
set_progress_percent(interact_held_time / interact_hold_time)
|
||||
wall_preview.set_float(interact_held_time / interact_hold_time)
|
||||
if interact_held_time >= interact_hold_time:
|
||||
set_progress_percent(0)
|
||||
interacted_once = true
|
||||
@ -61,6 +62,7 @@ func _process(delta: float) -> void:
|
||||
interact_held_time = 0.0
|
||||
interacted_once = false
|
||||
set_progress_percent(0)
|
||||
wall_preview.set_float(0.0)
|
||||
|
||||
point_id = -1
|
||||
if !interacted_once and ray.is_colliding():
|
||||
@ -76,21 +78,20 @@ func _process(delta: float) -> void:
|
||||
if obstacle_last_point != point_id:
|
||||
obstacle_last_point = point_id
|
||||
if is_instance_valid(last_collider):
|
||||
Game.level.a_star_graph_3d.tower_base_ids[last_collider.point_id].set_material(null)
|
||||
Game.level.a_star_graph_3d.tower_base_ids[last_collider.point_id].set_float(1.0)
|
||||
last_collider = null
|
||||
if tower_preview:
|
||||
delete_tower_preview()
|
||||
wall_preview.set_visible(false)
|
||||
last_collider = ray_collider
|
||||
ray_collider.set_material(build_preview_material)
|
||||
build_preview_material.albedo_color = Color.RED
|
||||
build_preview_material.albedo_color.a = 1.0
|
||||
ray_collider.set_color(Color.RED)
|
||||
ray_collider.set_float(0.0)
|
||||
if inventory.contents.size() > 0 and !ray_collider.has_card:
|
||||
if ray_collider != last_tower_base or inventory.selected_item != last_card:
|
||||
spawn_tower_preview()
|
||||
elif Game.level:
|
||||
if is_instance_valid(last_collider):
|
||||
Game.level.a_star_graph_3d.tower_base_ids[last_collider.point_id].set_material(null)
|
||||
Game.level.a_star_graph_3d.tower_base_ids[last_collider.point_id].set_float(1.0)
|
||||
last_collider = null
|
||||
if tower_preview:
|
||||
delete_tower_preview()
|
||||
@ -104,8 +105,10 @@ func _process(delta: float) -> void:
|
||||
if obstacle_last_point != point_id:
|
||||
obstacle_last_point = point_id
|
||||
if Game.level.a_star_graph_3d.test_path_if_point_toggled(point_id):
|
||||
build_preview_material.albedo_color = Color.GREEN
|
||||
build_preview_material.albedo_color.a = 0.8
|
||||
var c = Color.GREEN
|
||||
c.a = 0.8
|
||||
wall_preview.set_color(c)
|
||||
wall_preview.set_float(0.0)
|
||||
valid_point = true
|
||||
else:
|
||||
#build_preview_material.albedo_color = Color.RED
|
||||
|
27
Scripts/health_bar.gd
Normal file
27
Scripts/health_bar.gd
Normal file
@ -0,0 +1,27 @@
|
||||
extends TextureProgressBar
|
||||
|
||||
@export var health_bar_gradient: Gradient
|
||||
|
||||
@onready var prev_bar = $PreviousHealthBar
|
||||
|
||||
|
||||
func setup(health: float):
|
||||
max_value = health
|
||||
value = health
|
||||
prev_bar.max_value = health
|
||||
prev_bar.value = health
|
||||
|
||||
|
||||
func on_health_changed(health: float):
|
||||
set_visible(true)
|
||||
var health_went_down = true if health < value else false
|
||||
value = health
|
||||
tint_progress = health_bar_gradient.sample(value / max_value)
|
||||
if health_went_down:
|
||||
var tween = create_tween()
|
||||
tween.set_ease(Tween.EASE_OUT)
|
||||
tween.set_trans(Tween.TRANS_QUINT)
|
||||
tween.tween_interval(0.3)
|
||||
tween.tween_property(prev_bar, "value", value, 0.7)
|
||||
else:
|
||||
prev_bar.value = value
|
@ -5,6 +5,7 @@ class_name Level
|
||||
@export var player_spawns : Array[Node3D] = []
|
||||
@export var enemy_spawns : Array[Node3D] = []
|
||||
@export var enemy_goals : Array[Node3D] = []
|
||||
@export var corpses: Node3D
|
||||
@export var a_star_graph_3d : AStarGraph3D
|
||||
@export var cinematic_cam : CinematicCamManager
|
||||
@export var printer : CardPrinter
|
||||
|
@ -14,6 +14,7 @@ func _ready() -> void:
|
||||
bg_level.a_star_graph_3d.build_random_maze(50)
|
||||
bg_level.a_star_graph_3d.place_random_towers(20)
|
||||
bg_level.a_star_graph_3d.disable_all_tower_frames()
|
||||
Game.level = bg_level
|
||||
var new_wave = WaveManager.generate_wave(400, bg_level.enemy_pool)
|
||||
for spawn in bg_level.enemy_spawns:
|
||||
spawn.signal_for_after_enemy_died = enemy_died
|
||||
|
@ -28,6 +28,14 @@ var has_card : bool :
|
||||
return inventory.contents.size() != 0
|
||||
|
||||
|
||||
func set_color(color: Color):
|
||||
$MeshInstance3D.set_instance_shader_parameter("Color", color)
|
||||
|
||||
|
||||
func set_float(value: float):
|
||||
$MeshInstance3D.set_instance_shader_parameter("Float", value)
|
||||
|
||||
|
||||
func add_card(card: Card, caller_id: int) -> bool:
|
||||
var result = inventory.add(card)
|
||||
if result:
|
||||
@ -40,10 +48,6 @@ func remove_card():
|
||||
networked_remove_tower.rpc()
|
||||
|
||||
|
||||
func set_material(value: StandardMaterial3D):
|
||||
block.material_override = value
|
||||
|
||||
|
||||
func toggle_collision():
|
||||
collider.disabled = !collider.disabled
|
||||
|
||||
|
Reference in New Issue
Block a user