diff --git a/Assets/Audio/SFX/Test/BadHitSound_coin.ogg b/Assets/Audio/SFX/Test/BadHitSound_coin.ogg new file mode 100644 index 0000000..07bcf81 Binary files /dev/null and b/Assets/Audio/SFX/Test/BadHitSound_coin.ogg differ diff --git a/Assets/Audio/SFX/Test/BadHitSound_coin.ogg.import b/Assets/Audio/SFX/Test/BadHitSound_coin.ogg.import new file mode 100644 index 0000000..3ea73c2 --- /dev/null +++ b/Assets/Audio/SFX/Test/BadHitSound_coin.ogg.import @@ -0,0 +1,19 @@ +[remap] + +importer="oggvorbisstr" +type="AudioStreamOggVorbis" +uid="uid://c0qfynrgoynwr" +path="res://.godot/imported/BadHitSound_coin.ogg-e5c14b8c943c5f7bcce7bd971f08b7d5.oggvorbisstr" + +[deps] + +source_file="res://Assets/Audio/SFX/Test/BadHitSound_coin.ogg" +dest_files=["res://.godot/imported/BadHitSound_coin.ogg-e5c14b8c943c5f7bcce7bd971f08b7d5.oggvorbisstr"] + +[params] + +loop=false +loop_offset=0 +bpm=0 +beat_count=0 +bar_beats=4 diff --git a/Assets/Audio/SFX/Test/BadHitSound_ktoung.ogg b/Assets/Audio/SFX/Test/BadHitSound_ktoung.ogg new file mode 100644 index 0000000..7953ae0 Binary files /dev/null and b/Assets/Audio/SFX/Test/BadHitSound_ktoung.ogg differ diff --git a/Assets/Audio/SFX/Test/BadHitSound_ktoung.ogg.import b/Assets/Audio/SFX/Test/BadHitSound_ktoung.ogg.import new file mode 100644 index 0000000..5ad0873 --- /dev/null +++ b/Assets/Audio/SFX/Test/BadHitSound_ktoung.ogg.import @@ -0,0 +1,19 @@ +[remap] + +importer="oggvorbisstr" +type="AudioStreamOggVorbis" +uid="uid://bf50ah0ktnriu" +path="res://.godot/imported/BadHitSound_ktoung.ogg-d80938d9e44d3d634fa88c3cc16891ef.oggvorbisstr" + +[deps] + +source_file="res://Assets/Audio/SFX/Test/BadHitSound_ktoung.ogg" +dest_files=["res://.godot/imported/BadHitSound_ktoung.ogg-d80938d9e44d3d634fa88c3cc16891ef.oggvorbisstr"] + +[params] + +loop=false +loop_offset=0 +bpm=0 +beat_count=0 +bar_beats=4 diff --git a/Enemies/enemy.gd b/Enemies/enemy.gd index d5d0073..0859d94 100644 --- a/Enemies/enemy.gd +++ b/Enemies/enemy.gd @@ -5,8 +5,9 @@ class_name Enemy signal died -@onready var death_vfx_packed : PackedScene = preload("res://VFX/death_particles.tscn") -@onready var sad_vfx_packed : PackedScene = preload("res://VFX/sad_particles.tscn") +const DEATH_PARTICLE : PackedScene = preload("uid://ddm57pv5ox171") +const SAD_PARTICLE : PackedScene = preload("uid://m0vj2ac5oesx") + @export var speed : float = 1 @export var base_attack_damage : int = 1 @@ -62,7 +63,7 @@ func death() -> void: died.emit() Game.money += money $Sprite3D.visible = false - var death_vfx : CPUParticles3D = death_vfx_packed.instantiate() + var death_vfx : CPUParticles3D = DEATH_PARTICLE.instantiate() get_tree().current_scene.add_child(death_vfx) death_vfx.global_position = global_position path.queue_free() diff --git a/Globals/AudioManager.gd b/Globals/AudioManager.gd index 61510e1..1c8678b 100644 --- a/Globals/AudioManager.gd +++ b/Globals/AudioManager.gd @@ -1 +1,12 @@ extends Node + + +func playSFX3D(stream: AudioStream, position: Vector3) -> void: + var sfx : AudioStreamPlayer3D = AudioStreamPlayer3D.new() + sfx.stream = stream + sfx.bus = "SFX" + add_child(sfx) + sfx.global_position = position + sfx.play() + await sfx.finished + sfx.queue_free() diff --git a/Globals/EventBus.gd b/Globals/EventBus.gd index 9b81764..b03b7b8 100644 --- a/Globals/EventBus.gd +++ b/Globals/EventBus.gd @@ -29,7 +29,7 @@ signal team_in_rest_changed(count : int) ## [b]Emitter[/b] : [Projectile][br] ## [b]Subscriber[/b] : [code]null[/code] -signal projectile_shooted(projectile: Projectile, startPosition: Vector3) +signal projectile_shooted(projectile: Projectile, transform: Transform3D) ## [b]Emitter[/b] : [WorldManager][br] diff --git a/Globals/Game.gd b/Globals/Game.gd index d82f1a2..b0051d1 100644 --- a/Globals/Game.gd +++ b/Globals/Game.gd @@ -9,7 +9,7 @@ signal lose signal allowed_tower_has_change -var upgrades : Array[CubeUpgrade] = load("res://Upgrades/cube_upgrades.tres").upgrades +var upgrades : Array[CubeUpgrade] = load("uid://py454tq2ghgx").upgrades var towerPackedScenes : Dictionary var enmies : Dictionary var towers : Dictionary diff --git a/Globals/Helper.gd b/Globals/Helper.gd index d9f48ef..73d684d 100644 --- a/Globals/Helper.gd +++ b/Globals/Helper.gd @@ -2,7 +2,7 @@ class_name Helper -const confirmPopupScene : PackedScene = preload("res://UI/confirm_popup.tscn") +const CONFIRM_POPUP : PackedScene = preload("uid://cxn3x8dq8vawa") const SCENE_DIR_PATTERN : String = "res://\\w+/(Scenes|Map \\d+)/$" @@ -73,13 +73,14 @@ static func showConfirmPopup( text : String, nodeToAppend : Node, confirmCallback : Callable, - cancelCallback : Callable = func(): null + cancelCallback : Callable = func(): pass ) -> void: - var confirmPopup : ConfirmPopup = confirmPopupScene.instantiate() + var confirmPopup : ConfirmPopup = CONFIRM_POPUP.instantiate() nodeToAppend.add_child(confirmPopup) + nodeToAppend.get_tree().paused = true confirmPopup.label.text = text - confirmPopup.confirmed.connect(confirmCallback) - confirmPopup.canceled.connect(cancelCallback) + confirmPopup.confirmed.connect(func(): confirmCallback.call(); nodeToAppend.get_tree().paused = false) + confirmPopup.canceled.connect(func(): cancelCallback.call(); nodeToAppend.get_tree().paused = false) enum POSITION { TOP, CENTER, DOWN } static func getHitBoxLocation(body : CollisionObject3D, position : POSITION) -> float: diff --git a/Globals/transition.gd b/Globals/transition.gd index 408535d..df59fa5 100644 --- a/Globals/transition.gd +++ b/Globals/transition.gd @@ -2,7 +2,7 @@ extends ColorRect enum LOAD_STATE { NO_LOAD, BASIC_LOAD, MAP_LOAD, MAP_LOADED } -const worldManager = preload("res://Levels/world_manager.tscn") +const WORLD_MANAGER = preload("uid://bph5gpic1arod") @export var opaque := 0.0 @export var transparent := 11.0 @@ -78,7 +78,7 @@ func _process(_delta: float) -> void: var scene = ResourceLoader.load_threaded_get(target_scene_path) if loadState == LOAD_STATE.MAP_LOAD: mapScene = scene - get_tree().change_scene_to_packed(worldManager) + get_tree().change_scene_to_packed(WORLD_MANAGER) loadState = LOAD_STATE.MAP_LOADED if loadState == LOAD_STATE.BASIC_LOAD: get_tree().change_scene_to_packed(scene) diff --git a/Levels/Map 1/level_1.tres b/Levels/Map 1/level_1.tres index fb2a2f5..f2eed94 100644 --- a/Levels/Map 1/level_1.tres +++ b/Levels/Map 1/level_1.tres @@ -7,10 +7,7 @@ [sub_resource type="Resource" id="Resource_87wss"] script = ExtResource("3_ub8wd") enemy = "res://Enemies/Scenes/enemy-a.tscn" -number_to_spawn = 1 -lane_to_spawn = 0 spawn_delay = 2.0 -pack_delay = 0.15 metadata/_custom_type_script = "uid://blxx3vs2wnfet" [sub_resource type="Resource" id="Resource_457yt"] @@ -22,23 +19,17 @@ metadata/_custom_type_script = "uid://chu8s12rtdeqx" script = ExtResource("3_ub8wd") enemy = "uid://1kwye5yjf40d" number_to_spawn = 2 -lane_to_spawn = 0 -spawn_delay = 1.0 -pack_delay = 0.15 [sub_resource type="Resource" id="Resource_ftl6b"] script = ExtResource("3_ub8wd") enemy = "uid://1kwye5yjf40d" number_to_spawn = 2 -lane_to_spawn = 0 spawn_delay = 2.0 -pack_delay = 0.15 [sub_resource type="Resource" id="Resource_e6yyc"] script = ExtResource("3_ub8wd") enemy = "uid://1kwye5yjf40d" number_to_spawn = 5 -lane_to_spawn = 0 spawn_delay = 10.0 pack_delay = 0.5 @@ -49,10 +40,6 @@ troops = Array[ExtResource("3_ub8wd")]([SubResource("Resource_qfjse"), SubResour [sub_resource type="Resource" id="Resource_fhv1k"] script = ExtResource("3_ub8wd") enemy = "uid://r6tj7jprdqib" -number_to_spawn = 1 -lane_to_spawn = 0 -spawn_delay = 1.0 -pack_delay = 0.15 [sub_resource type="Resource" id="Resource_46oi2"] script = ExtResource("2_457yt") @@ -61,16 +48,11 @@ troops = Array[ExtResource("3_ub8wd")]([SubResource("Resource_fhv1k"), SubResour [sub_resource type="Resource" id="Resource_7vcps"] script = ExtResource("3_ub8wd") enemy = "uid://koikfh03qv7" -number_to_spawn = 1 -lane_to_spawn = 0 -spawn_delay = 1.0 -pack_delay = 0.15 [sub_resource type="Resource" id="Resource_3kmde"] script = ExtResource("3_ub8wd") enemy = "uid://koikfh03qv7" number_to_spawn = 3 -lane_to_spawn = 0 spawn_delay = 5.0 pack_delay = 0.3 @@ -78,7 +60,6 @@ pack_delay = 0.3 script = ExtResource("3_ub8wd") enemy = "uid://1kwye5yjf40d" number_to_spawn = 5 -lane_to_spawn = 0 spawn_delay = 10.0 pack_delay = 0.4 @@ -86,15 +67,11 @@ pack_delay = 0.4 script = ExtResource("3_ub8wd") enemy = "uid://r6tj7jprdqib" number_to_spawn = 3 -lane_to_spawn = 0 -spawn_delay = 1.0 -pack_delay = 0.15 [sub_resource type="Resource" id="Resource_q3d8d"] script = ExtResource("3_ub8wd") enemy = "uid://1kwye5yjf40d" number_to_spawn = 10 -lane_to_spawn = 0 spawn_delay = 2.0 pack_delay = 0.3 @@ -102,8 +79,6 @@ pack_delay = 0.3 script = ExtResource("3_ub8wd") enemy = "uid://koikfh03qv7" number_to_spawn = 4 -lane_to_spawn = 0 -spawn_delay = 1.0 pack_delay = 0.5 [sub_resource type="Resource" id="Resource_p2jl5"] @@ -113,10 +88,6 @@ troops = Array[ExtResource("3_ub8wd")]([SubResource("Resource_7vcps"), SubResour [sub_resource type="Resource" id="Resource_1nx3f"] script = ExtResource("3_ub8wd") enemy = "uid://dyl4wiga2goi" -number_to_spawn = 1 -lane_to_spawn = 0 -spawn_delay = 1.0 -pack_delay = 0.15 [sub_resource type="Resource" id="Resource_0nx55"] script = ExtResource("2_457yt") @@ -124,11 +95,7 @@ troops = Array[ExtResource("3_ub8wd")]([SubResource("Resource_1nx3f")]) [resource] script = ExtResource("1_ftl6b") -auto_start = false -auto_launch_wave = false -tier_max = 1 allowedTowers = Array[int]([1, 2, 3]) -laneCount = 1 startingMoney = 110 waves = Array[ExtResource("2_457yt")]([SubResource("Resource_457yt"), SubResource("Resource_qeljc"), SubResource("Resource_46oi2"), SubResource("Resource_p2jl5"), SubResource("Resource_0nx55")]) metadata/_custom_type_script = "uid://cuhq6u67cbbqm" diff --git a/Levels/Scripts/Camera.gd b/Levels/Scripts/Camera.gd index e2ad8af..2a32ad1 100644 --- a/Levels/Scripts/Camera.gd +++ b/Levels/Scripts/Camera.gd @@ -22,12 +22,12 @@ func _process(_delta: float) -> void: var mousePosition : Vector2 = get_viewport().get_mouse_position() if mousePosition.x < SCREEN_MARGIN: - position.x += -SCREEN_MOVEMENT_SPEED - if mousePosition.y < SCREEN_MARGIN: - position.z += -SCREEN_MOVEMENT_SPEED - if mousePosition.x > windowSize.x - SCREEN_MARGIN: + position.x -= SCREEN_MOVEMENT_SPEED + elif mousePosition.x > windowSize.x - SCREEN_MARGIN: position.x += SCREEN_MOVEMENT_SPEED - if mousePosition.y > windowSize.y - SCREEN_MARGIN: + if mousePosition.y < SCREEN_MARGIN: + position.z -= SCREEN_MOVEMENT_SPEED + elif mousePosition.y > windowSize.y - SCREEN_MARGIN: position.z += SCREEN_MOVEMENT_SPEED @@ -38,9 +38,13 @@ func _notification(what: int) -> void: func _input(event: InputEvent) -> void: - if not event is InputEventMouseButton: - return + if event is InputEventMouseButton: + onEventMouseButton(event) + elif event is InputEventKey: + onEventKey(event) + +func onEventMouseButton(event: InputEventMouseButton) -> void: var newPosition : float = position.y match event.button_index: MOUSE_BUTTON_WHEEL_UP: newPosition -= .2 @@ -50,3 +54,11 @@ func _input(event: InputEvent) -> void: rotation.x = deg_to_rad(curve.sample(newPosition)) position.y = newPosition + + +func onEventKey(event: InputEventKey) -> void: + match event.keycode: + KEY_LEFT: position.x -= SCREEN_MOVEMENT_SPEED * 4 + KEY_RIGHT: position.x += SCREEN_MOVEMENT_SPEED * 4 + KEY_UP: position.z -= SCREEN_MOVEMENT_SPEED * 4 + KEY_DOWN: position.z += SCREEN_MOVEMENT_SPEED * 4 diff --git a/Levels/Scripts/WorldManager.gd b/Levels/Scripts/WorldManager.gd index 2167566..34cf397 100644 --- a/Levels/Scripts/WorldManager.gd +++ b/Levels/Scripts/WorldManager.gd @@ -118,6 +118,6 @@ func addMap(mapScene : PackedScene) -> void: state = STATE.SPAWN if level.auto_start else STATE.IDLE -func onProjectileShooted(projectile: Projectile, startPosition: Vector3) -> void: +func onProjectileShooted(projectile: Projectile, _transform: Transform3D) -> void: add_child(projectile) - projectile.global_position = startPosition + projectile.transform = _transform diff --git a/Projectiles/Draft/ImpactPierre.tscn b/Projectiles/Draft/ImpactPierre.tscn index 75a9404..03d710f 100644 --- a/Projectiles/Draft/ImpactPierre.tscn +++ b/Projectiles/Draft/ImpactPierre.tscn @@ -1,7 +1,6 @@ -[gd_scene load_steps=10 format=3 uid="uid://c5rx5scnkh3fb"] +[gd_scene load_steps=9 format=3 uid="uid://c5rx5scnkh3fb"] [ext_resource type="Texture2D" uid="uid://dqyhhvxpwtpsy" path="res://Assets/Emotes/emote_star.png" id="1_3pqxv"] -[ext_resource type="Script" uid="uid://6xiqssgmiurt" path="res://Projectiles/Draft/impact_pierre.gd" id="2_ymm3v"] [sub_resource type="Curve" id="Curve_ymm3v"] _data = [Vector2(0, 1), 0.0, 0.0, 0, 0, Vector2(0.499044, 1), 0.0, 0.0, 0, 0, Vector2(0.745698, 0.50142), -0.0206361, -0.0206361, 0, 0, Vector2(1, 0), 0.0, 0.0, 0, 0] @@ -43,9 +42,3 @@ one_shot = true explosiveness = 1.0 process_material = SubResource("ParticleProcessMaterial_jk26u") draw_pass_1 = SubResource("QuadMesh_qw7ty") -script = ExtResource("2_ymm3v") - -[node name="SFXImpact" type="AudioStreamPlayer3D" parent="."] -bus = &"SFX" - -[connection signal="finished" from="." to="." method="_on_finished"] diff --git a/Projectiles/Draft/ProjectilePierre.tscn b/Projectiles/Draft/ProjectilePierre.tscn deleted file mode 100644 index 2233c95..0000000 --- a/Projectiles/Draft/ProjectilePierre.tscn +++ /dev/null @@ -1,58 +0,0 @@ -[gd_scene load_steps=8 format=3 uid="uid://dsv2untvmg8q"] - -[ext_resource type="Texture2D" uid="uid://dqyhhvxpwtpsy" path="res://Assets/Emotes/emote_star.png" id="1_lcll5"] -[ext_resource type="Script" uid="uid://bpy86kcsjgx0e" path="res://Projectiles/Draft/projectile_pierre.gd" id="2_i2vf7"] - -[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_qaid5"] -transparency = 1 -shading_mode = 0 -vertex_color_use_as_albedo = true -albedo_texture = ExtResource("1_lcll5") -billboard_mode = 3 -particles_anim_h_frames = 1 -particles_anim_v_frames = 1 -particles_anim_loop = false - -[sub_resource type="QuadMesh" id="QuadMesh_nkvug"] -material = SubResource("StandardMaterial3D_qaid5") -size = Vector2(0.2, 0.2) - -[sub_resource type="Curve" id="Curve_lcll5"] -_data = [Vector2(0, 0), 0.0, 0.0, 0, 0, Vector2(0.509769, 1), 0.0, 0.0, 0, 0, Vector2(1, 0), 0.0, 0.0, 0, 0] -point_count = 3 - -[sub_resource type="Gradient" id="Gradient_i2vf7"] -offsets = PackedFloat32Array(0, 0.379888, 1) -colors = PackedColorArray(0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0) - -[sub_resource type="Gradient" id="Gradient_nlum7"] -colors = PackedColorArray(1, 1, 1, 1, 1, 1, 1, 1) - -[node name="ProjectilePierre" type="Sprite3D"] -billboard = 2 -texture = ExtResource("1_lcll5") -script = ExtResource("2_i2vf7") - -[node name="CPUParticles3D" type="CPUParticles3D" parent="."] -amount = 16 -lifetime = 0.5 -explosiveness = 0.2 -mesh = SubResource("QuadMesh_nkvug") -emission_shape = 6 -emission_ring_axis = Vector3(0, 0, 1) -emission_ring_height = 0.0 -emission_ring_radius = 0.3 -emission_ring_inner_radius = 0.0 -emission_ring_cone_angle = 90.0 -direction = Vector3(0, 0, 0) -spread = 0.0 -gravity = Vector3(0, 0, 0) -angular_velocity_min = 180.0 -angular_velocity_max = 360.0 -scale_amount_min = 0.0 -scale_amount_curve = SubResource("Curve_lcll5") -color_ramp = SubResource("Gradient_i2vf7") -color_initial_ramp = SubResource("Gradient_nlum7") - -[node name="SFXCreate" type="AudioStreamPlayer3D" parent="."] -bus = &"SFX" diff --git a/Projectiles/Draft/impact_pierre.gd b/Projectiles/Draft/impact_pierre.gd deleted file mode 100644 index 66a9747..0000000 --- a/Projectiles/Draft/impact_pierre.gd +++ /dev/null @@ -1,7 +0,0 @@ -extends GPUParticles3D - -func _ready() -> void: - $SFXImpact.play() - -func _on_finished() -> void: - queue_free() diff --git a/Projectiles/Draft/impact_pierre.gd.uid b/Projectiles/Draft/impact_pierre.gd.uid deleted file mode 100644 index 9bcb9e0..0000000 --- a/Projectiles/Draft/impact_pierre.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://6xiqssgmiurt diff --git a/Projectiles/Draft/projectile_pierre.gd b/Projectiles/Draft/projectile_pierre.gd deleted file mode 100644 index 986cb4b..0000000 --- a/Projectiles/Draft/projectile_pierre.gd +++ /dev/null @@ -1,10 +0,0 @@ -extends Sprite3D - -var impact : GPUParticles3D = preload("res://Projectiles/Draft/ImpactPierre.tscn").instantiate() - -func _ready() -> void: - $SFXCreate.play() - -func on_impact() -> void: - get_tree().root.add_child(impact) - queue_free() diff --git a/Projectiles/Draft/projectile_pierre.gd.uid b/Projectiles/Draft/projectile_pierre.gd.uid deleted file mode 100644 index 3533719..0000000 --- a/Projectiles/Draft/projectile_pierre.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://bpy86kcsjgx0e diff --git a/Projectiles/Projectile.gd b/Projectiles/Projectile.gd index 3d88299..5cb4278 100644 --- a/Projectiles/Projectile.gd +++ b/Projectiles/Projectile.gd @@ -2,27 +2,50 @@ extends CharacterBody3D class_name Projectile -enum MODE { - FOLLOW, ## Follow Entity - LOCATION, ## Go to entity location - HITSCAN, ## DANGER NOT implemented yet +enum State { INIT, TRAVEL, IMPACT, EFFECT, DESPAWN } + +enum Mode { + FOLLOW, ## Follow target + LOCATION, ## Go to target location + SPAWN_ON_TARGET, ## Spawn on target location + HITSCAN, ## Spawn on target location } -enum TYPE { ## Types of projectiles - BASIC, ## One target - AOE, ## Multiple targets[br]work with [member damageArea] - PIERCING, ## Piercing through enemies[br]work with [member maxTarets] and [member damageArea] - BOUNCING, ## Bouncing over enemies[br]work with [member maxTarets] and [member damageArea] - DISABLING, ## Disable ally tower for [member damage] duration [br]Usable on [Boss] projectiles +enum Effect { + ONE_HIT, ## Make damage on hit + ## Make damage every tick for specified duration[br] + ## work with [member dotTicks] for number of tick + DAMAGE_OVER_TIME, + ## Make damage over time on hitted target for the specified duration[br] + ## work with [member dotTicks] for number of tick + POISON, +} + +enum Type { ## Types of projectiles + BASIC, ## One defined target + AOE, ## Multiple targets + BOUNCING, ## Bouncing over enemies[br]work with [member maxTargets] + DISABLING, ## Disable ally tower for [member amount] duration [br]Usable on [Boss] projectiles } -@export var type : TYPE = TYPE.BASIC -@export var mode : MODE = MODE.FOLLOW +@export var mode : Mode = Mode.FOLLOW +@export var effect : Effect = Effect.ONE_HIT +@export var type : Type = Type.BASIC @export var speed : int +## Usefull when [enum Type] is not [constant BASIC][br][code]-1[/code] for no maximum @export var maxTargets : int = 1 +## The amount of ticks +## Used as time when [enum Effect] is [constant DAMAGE_OVER_TIME] or [constant POISON] +@export var dotTicks : int +@export var tickInterval : float ## +@export_group("Sounds - Animations") +@export var impactScene : PackedScene +@export var shootSFX : AudioStream +@export var impactSFX : AudioStream +var state : State = State.INIT var amount : float var target : PhysicsBody3D var vectorTarget : Vector3 @@ -31,118 +54,149 @@ var collidingBodies : Array[Node3D] var affectedTarget : Array[Node3D] +func _ready() -> void: + $HitBox.body_entered.connect(collidingBodies.append) + $HitBox.body_exited.connect(collidingBodies.erase) + $EffectArea.body_entered.connect(bodiesInRange.append) + $EffectArea.body_exited.connect(bodiesInRange.erase) + + func _physics_process(_delta: float) -> void: - if mode == MODE.LOCATION && vectorTarget.distance_squared_to(global_position) < .4: - resolveContact() - maxTargets = 0 # Ensure queue free in next if + if state == State.INIT: + if shootSFX: + AudioManager.playSFX3D(shootSFX, global_position) + state = State.TRAVEL + return + + match state: + State.TRAVEL when isOnTarget(): + state = State.IMPACT + return + State.TRAVEL: + if mode == Mode.FOLLOW: + var globalPos : Vector3 = target.global_position + globalPos.y += Helper.getHitBoxLocation(target, Helper.POSITION.CENTER) + look_at(globalPos) + velocity = global_position.direction_to(globalPos) * speed + move_and_slide() + State.IMPACT: + state = State.EFFECT + impactAnimations() + applyEffects() + State.EFFECT: return + State.DESPAWN: + queue_free.call_deferred() if shouldQueueFree(): - return queue_free() - - if not collidingBodies.is_empty() && collidingBodies.has(target): - return onBodyCollideWithProjectile(target) - - var globalPos : Vector3 = vectorTarget if vectorTarget else target.global_position - if target: - globalPos.y += Helper.getHitBoxLocation(target, Helper.POSITION.CENTER) - look_at(globalPos) - velocity = global_position.direction_to(globalPos) * speed - move_and_slide() + state = State.DESPAWN func shouldQueueFree() -> bool: - if maxTargets < 1: - return true - if !is_instance_valid(target): - return mode == MODE.FOLLOW + return mode == Mode.FOLLOW || maxTargets == 0 elif target is Tower: return not target.visible - return false + return maxTargets == 0 -func onBodyEnteredDamageArea(body: Node3D) -> void: - if type != TYPE.BASIC && targetable(body): - addBodyInRange(body) - if type == TYPE.PIERCING: - resolveContact() +func impactAnimations() -> void: + if impactSFX: + AudioManager.playSFX3D(impactSFX, global_position) + if impactScene: + var impact : GPUParticles3D = impactScene.instantiate() + impact.finished.connect(impact.queue_free) + get_tree().root.add_child(impact) + impact.emitting = false + impact.one_shot = true + impact.emitting = true -func onBodyCollideWithProjectile(body: Node3D) -> void: - if not collidingBodies.has(body): - collidingBodies.push_back(body) - - if mode != MODE.LOCATION && (body == target || type == TYPE.PIERCING) && targetable(body): - addBodyInRange(body, true) - resolveContact() +func isOnTarget() -> bool: + match mode: + Mode.LOCATION: return vectorTarget.distance_squared_to(global_position) < .4 + Mode.FOLLOW: return collidingBodies.has(target) + Mode.HITSCAN, Mode.SPAWN_ON_TARGET: return true + _: return false -func addBodyInRange(body: Node3D, pushFront: bool = false) -> void: - var idx : int = bodiesInRange.find(body) +func applyEffects() -> void: + if not collidingBodies.is_empty() && isOnTarget(): + resolveContacts() - if idx == -1: - if pushFront: - bodiesInRange.push_front(body) - else: - bodiesInRange.push_back(body) - elif pushFront && idx != 0: - bodiesInRange.remove_at(idx) - bodiesInRange.push_front(body) + if state != State.TRAVEL: + state = State.DESPAWN + if effect == Effect.DAMAGE_OVER_TIME: + dotTicks -= 1 + if dotTicks > 0: + state = State.EFFECT + await get_tree().create_timer(tickInterval).timeout + applyEffects.call_deferred() -func targetable(body: Node3D) -> bool: - return not affectedTarget.has(body) - - -func resolveContact() -> void: - if bodiesInRange.is_empty(): - return - - resolveEffect(bodiesInRange[0]) - +func resolveContacts() -> void: match type: - TYPE.AOE: - for bodyInRange in bodiesInRange: - if is_instance_valid(bodyInRange): - resolveEffect(bodyInRange, false) - - TYPE.BOUNCING: - target = null if bodiesInRange.is_empty() else bodiesInRange[0] + Type.AOE: + if maxTargets > 0: # No need to sort if we want to hit all targets + collidingBodies.sort_custom(sortTargets) + collidingBodies.map(resolveEffect) + _ when collidingBodies.has(target): + resolveEffect(target) + if type == Type.BOUNCING: + target = chooseNextTarget() + state = State.TRAVEL + return -func resolveEffect(body : Node3D, erase : bool = true) -> void: - if erase: - bodiesInRange.erase(body) - if affectedTarget.has(body) || body is GameTile: +func sortTargets(body1: Node3D, body2: Node3D) -> bool: + return vectorTarget.distance_to(body1.global_position) < vectorTarget.distance_to(body2.global_position) + + +func chooseNextTarget() -> Node3D: + var bodies = bodiesInRange.filter(func(body): return not affectedTarget.has(body)) + if bodies.is_empty(): + return null + bodies.sort_custom(sortTargets) + return bodies[0] + + +func resolveEffect(body: Node3D) -> void: + if body is GameTile || maxTargets == 0: return - if type == TYPE.DISABLING && body.has_method("disable"): + if type == Type.DISABLING && body.has_method("disable"): body.disable(amount) elif body.has_method("take_damage"): body.take_damage(amount) + if effect == Effect.POISON: + var poisonTicks : int = dotTicks - 1 + while poisonTicks > 0 && is_instance_valid(body): + poisonTicks -= 1 + await get_tree().create_timer(tickInterval).timeout + body.take_damage(amount) + affectedTarget.append(body) maxTargets -= 1 -func removeTarget(body: Node3D) -> void: - bodiesInRange.erase(body) - - -func removeCollidingBody(body: Node3D) -> void: - collidingBodies.erase(body) - - func shoot(_target: Node3D, globalPos: Vector3) -> void: target = _target + vectorTarget = globalPos + var transform3D : Transform3D = Transform3D() + transform3D.origin = globalPos + + var targetPosition : Vector3 = target.global_position + targetPosition.y += Helper.getHitBoxLocation(target, Helper.POSITION.CENTER) + transform3D = transform3D.looking_at(targetPosition) match mode: - Projectile.MODE.HITSCAN: - globalPos = target.global_position - globalPos.y += Helper.getHitBoxLocation(target, Helper.POSITION.CENTER) - Projectile.MODE.LOCATION: - vectorTarget = target.global_position - vectorTarget.y += Helper.getHitBoxLocation(target, Helper.POSITION.CENTER) + Mode.SPAWN_ON_TARGET: + vectorTarget = targetPosition + transform3D.origin = targetPosition + transform3D = transform3D.looking_at(globalPos) + Mode.LOCATION: + vectorTarget = targetPosition + velocity = transform3D.origin.direction_to(vectorTarget) * speed - EventBus.projectile_shooted.emit(self, globalPos) + EventBus.projectile_shooted.emit(self, transform3D) diff --git a/Projectiles/Scenes/projectile-Aline.tscn b/Projectiles/Scenes/projectile-Aline.tscn index d68c3ab..8fbd3c5 100644 --- a/Projectiles/Scenes/projectile-Aline.tscn +++ b/Projectiles/Scenes/projectile-Aline.tscn @@ -1,21 +1,24 @@ -[gd_scene load_steps=3 format=3 uid="uid://dcnm6rjht0rew"] +[gd_scene load_steps=4 format=3 uid="uid://dcnm6rjht0rew"] [ext_resource type="PackedScene" uid="uid://oykrff3g74eo" path="res://Projectiles/projectile.tscn" id="1_4tmpc"] +[ext_resource type="Texture2D" uid="uid://dqyhhvxpwtpsy" path="res://Assets/Emotes/emote_star.png" id="2_dl8a6"] -[sub_resource type="SphereShape3D" id="SphereShape3D_k24mn"] +[sub_resource type="SphereShape3D" id="SphereShape3D_2ioqj"] radius = 0.3 [node name="Projectile" instance=ExtResource("1_4tmpc")] -type = 1 mode = 1 +type = 1 speed = 3 -damage = 6 +maxTargets = -1 -[node name="HitBox" parent="." index="2"] +[node name="HitBox" parent="." index="1"] collision_mask = 2 -[node name="DamageArea" parent="." index="3"] -collision_mask = 2 +[node name="ProjectileSize" parent="HitBox" index="0"] +shape = SubResource("SphereShape3D_2ioqj") -[node name="Node" type="CollisionShape3D" parent="DamageArea" index="0"] -shape = SubResource("SphereShape3D_k24mn") +[node name="Sprite3D" type="Sprite3D" parent="." index="3"] +transform = Transform3D(2.5, 0, 0, 0, 2.5, 0, 0, 0, 2.5, 0, 0, 0) +billboard = 2 +texture = ExtResource("2_dl8a6") diff --git a/Projectiles/Scenes/projectile-Evan.tscn b/Projectiles/Scenes/projectile-Evan.tscn new file mode 100644 index 0000000..d9d659a --- /dev/null +++ b/Projectiles/Scenes/projectile-Evan.tscn @@ -0,0 +1,41 @@ +[gd_scene load_steps=7 format=3 uid="uid://dp8tg6cpu3ftd"] + +[ext_resource type="PackedScene" uid="uid://oykrff3g74eo" path="res://Projectiles/projectile.tscn" id="1_yw5ty"] + +[sub_resource type="SphereShape3D" id="SphereShape3D_xshf4"] + +[sub_resource type="Gradient" id="Gradient_yw5ty"] +offsets = PackedFloat32Array(0, 0.5, 1) +colors = PackedColorArray(1, 0.007843138, 0, 1, 1, 0.54901963, 0, 1, 1, 0, 0, 1) +metadata/_snap_enabled = true + +[sub_resource type="GradientTexture1D" id="GradientTexture1D_xshf4"] +gradient = SubResource("Gradient_yw5ty") + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_yw5ty"] +transparency = 4 +albedo_color = Color(1, 1, 1, 0.43137255) +albedo_texture = SubResource("GradientTexture1D_xshf4") + +[sub_resource type="SphereMesh" id="SphereMesh_q317a"] +material = SubResource("StandardMaterial3D_yw5ty") + +[node name="Projectile" instance=ExtResource("1_yw5ty")] +mode = 2 +effect = 1 +type = 1 +maxTargets = -1 +dotTicks = 6 +tickInterval = 0.5 + +[node name="Sprite3D" parent="." index="1"] +visible = false + +[node name="HitBox" parent="." index="2"] +collision_mask = 2 + +[node name="ProjectileSize" parent="HitBox" index="0"] +shape = SubResource("SphereShape3D_xshf4") + +[node name="MeshInstance3D" type="MeshInstance3D" parent="." index="4"] +mesh = SubResource("SphereMesh_q317a") diff --git a/Projectiles/Scenes/projectile-James.tscn b/Projectiles/Scenes/projectile-James.tscn index 06e8c6e..f1262c5 100644 --- a/Projectiles/Scenes/projectile-James.tscn +++ b/Projectiles/Scenes/projectile-James.tscn @@ -4,16 +4,16 @@ [ext_resource type="Texture2D" uid="uid://b7jiyk3w5tl02" path="res://Assets/Icones/Spritesheet_Cakes_WITH_OUTLINE.png" id="2_ckawd"] [node name="Projectile" instance=ExtResource("1_do0ca")] -type = 4 +type = 3 speed = 2 -damage = 3 -[node name="Sprite3D" parent="." index="1"] +[node name="HitBox" parent="." index="1"] +collision_mask = 4 + +[node name="Sprite3D" type="Sprite3D" parent="." index="3"] transform = Transform3D(1.3, 0, 0, 0, 1.3, 0, 0, 0, 1.3, 0, 0, 0) +billboard = 2 texture = ExtResource("2_ckawd") hframes = 6 vframes = 2 frame = 11 - -[node name="HitBox" parent="." index="2"] -collision_mask = 4 diff --git a/Projectiles/Scenes/projectile-Pierre.tscn b/Projectiles/Scenes/projectile-Pierre.tscn index d9c0126..38865ea 100644 --- a/Projectiles/Scenes/projectile-Pierre.tscn +++ b/Projectiles/Scenes/projectile-Pierre.tscn @@ -1,10 +1,66 @@ -[gd_scene load_steps=2 format=3 uid="uid://dy755v20lqu7q"] +[gd_scene load_steps=11 format=3 uid="uid://dy755v20lqu7q"] [ext_resource type="PackedScene" uid="uid://oykrff3g74eo" path="res://Projectiles/projectile.tscn" id="1_d01p1"] +[ext_resource type="Texture2D" uid="uid://dqyhhvxpwtpsy" path="res://Assets/Emotes/emote_star.png" id="2_5lxlg"] +[ext_resource type="PackedScene" uid="uid://c5rx5scnkh3fb" path="res://Projectiles/Draft/ImpactPierre.tscn" id="2_s3rfh"] +[ext_resource type="AudioStream" uid="uid://c0qfynrgoynwr" path="res://Assets/Audio/SFX/Test/BadHitSound_coin.ogg" id="4_r8d72"] +[ext_resource type="AudioStream" uid="uid://bf50ah0ktnriu" path="res://Assets/Audio/SFX/Test/BadHitSound_ktoung.ogg" id="4_s3rfh"] + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_qaid5"] +transparency = 1 +shading_mode = 0 +vertex_color_use_as_albedo = true +albedo_texture = ExtResource("2_5lxlg") +billboard_mode = 3 +particles_anim_h_frames = 1 +particles_anim_v_frames = 1 +particles_anim_loop = false + +[sub_resource type="QuadMesh" id="QuadMesh_nkvug"] +material = SubResource("StandardMaterial3D_qaid5") +size = Vector2(0.2, 0.2) + +[sub_resource type="Curve" id="Curve_lcll5"] +_data = [Vector2(0, 0), 0.0, 0.0, 0, 0, Vector2(0.509769, 1), 0.0, 0.0, 0, 0, Vector2(1, 0), 0.0, 0.0, 0, 0] +point_count = 3 + +[sub_resource type="Gradient" id="Gradient_i2vf7"] +offsets = PackedFloat32Array(0, 0.379888, 1) +colors = PackedColorArray(0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0) + +[sub_resource type="Gradient" id="Gradient_nlum7"] +colors = PackedColorArray(1, 1, 1, 1, 1, 1, 1, 1) [node name="Projectile" instance=ExtResource("1_d01p1")] speed = 15 -damage = 2 +impactScene = ExtResource("2_s3rfh") +shootSFX = ExtResource("4_r8d72") +impactSFX = ExtResource("4_s3rfh") -[node name="HitBox" parent="." index="2"] +[node name="HitBox" parent="." index="1"] collision_mask = 2 + +[node name="ProjectilePierre" type="Sprite3D" parent="." index="3"] +billboard = 2 +texture = ExtResource("2_5lxlg") + +[node name="CPUParticles3D" type="CPUParticles3D" parent="ProjectilePierre" index="0"] +amount = 16 +lifetime = 0.5 +explosiveness = 0.2 +mesh = SubResource("QuadMesh_nkvug") +emission_shape = 6 +emission_ring_axis = Vector3(0, 0, 1) +emission_ring_height = 0.0 +emission_ring_radius = 0.3 +emission_ring_inner_radius = 0.0 +emission_ring_cone_angle = 90.0 +direction = Vector3(0, 0, 0) +spread = 0.0 +gravity = Vector3(0, 0, 0) +angular_velocity_min = 180.0 +angular_velocity_max = 360.0 +scale_amount_min = 0.0 +scale_amount_curve = SubResource("Curve_lcll5") +color_ramp = SubResource("Gradient_i2vf7") +color_initial_ramp = SubResource("Gradient_nlum7") diff --git a/Projectiles/Scenes/projectile-Victoria.tscn b/Projectiles/Scenes/projectile-Victoria.tscn index 78bf3d2..640511e 100644 --- a/Projectiles/Scenes/projectile-Victoria.tscn +++ b/Projectiles/Scenes/projectile-Victoria.tscn @@ -1,20 +1,25 @@ -[gd_scene load_steps=3 format=3 uid="uid://df8u7dogl4wi0"] +[gd_scene load_steps=4 format=3 uid="uid://df8u7dogl4wi0"] [ext_resource type="PackedScene" uid="uid://oykrff3g74eo" path="res://Projectiles/projectile.tscn" id="1_suva6"] +[ext_resource type="Texture2D" uid="uid://dqyhhvxpwtpsy" path="res://Assets/Emotes/emote_star.png" id="2_4juxc"] -[sub_resource type="SphereShape3D" id="SphereShape3D_k24mn"] -radius = 1.5 +[sub_resource type="SphereShape3D" id="SphereShape3D_878kj"] [node name="Projectile" instance=ExtResource("1_suva6")] -type = 3 +type = 2 speed = 5 maxTargets = 3 -[node name="HitBox" parent="." index="2"] +[node name="HitBox" parent="." index="1"] collision_mask = 2 -[node name="DamageArea" parent="." index="3"] +[node name="EffectArea" parent="." index="2"] collision_mask = 2 -[node name="BoucingRange" type="CollisionShape3D" parent="DamageArea" index="0"] -shape = SubResource("SphereShape3D_k24mn") +[node name="CollisionShape3D" type="CollisionShape3D" parent="EffectArea" index="0"] +shape = SubResource("SphereShape3D_878kj") + +[node name="Sprite3D" type="Sprite3D" parent="." index="3"] +transform = Transform3D(2.5, 0, 0, 0, 2.5, 0, 0, 0, 2.5, 0, 0, 0) +billboard = 2 +texture = ExtResource("2_4juxc") diff --git a/Projectiles/Scenes/projectile-maxence.tscn b/Projectiles/Scenes/projectile-maxence.tscn new file mode 100644 index 0000000..7ffc9b5 --- /dev/null +++ b/Projectiles/Scenes/projectile-maxence.tscn @@ -0,0 +1,25 @@ +[gd_scene load_steps=4 format=3 uid="uid://baixm8pfsdo3t"] + +[ext_resource type="PackedScene" uid="uid://oykrff3g74eo" path="res://Projectiles/projectile.tscn" id="1_a1h27"] +[ext_resource type="Texture2D" uid="uid://dqyhhvxpwtpsy" path="res://Assets/Emotes/emote_star.png" id="2_lwnvl"] + +[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_a1h27"] +radius = 0.1 +height = 10.0 + +[node name="Projectile" instance=ExtResource("1_a1h27")] +mode = 3 +type = 1 +maxTargets = 5 + +[node name="HitBox" parent="." index="1"] +collision_mask = 2 + +[node name="ProjectileSize" parent="HitBox" index="0"] +transform = Transform3D(1, 0, 0, 0, -4.371139e-08, -1, 0, 1, -4.371139e-08, 0, 0, -5) +shape = SubResource("CapsuleShape3D_a1h27") + +[node name="Sprite3D" type="Sprite3D" parent="." index="3"] +transform = Transform3D(2.5, 0, 0, 0, 2.5, 0, 0, 0, 2.5, 0, 0, 0) +billboard = 2 +texture = ExtResource("2_lwnvl") diff --git a/Projectiles/projectile.tscn b/Projectiles/projectile.tscn index 3d0bee3..9cb5090 100644 --- a/Projectiles/projectile.tscn +++ b/Projectiles/projectile.tscn @@ -1,7 +1,6 @@ -[gd_scene load_steps=5 format=3 uid="uid://oykrff3g74eo"] +[gd_scene load_steps=4 format=3 uid="uid://oykrff3g74eo"] [ext_resource type="Script" uid="uid://b788twwo1o6l2" path="res://Projectiles/Projectile.gd" id="1_ggq0q"] -[ext_resource type="Texture2D" uid="uid://dqyhhvxpwtpsy" path="res://Assets/Emotes/emote_star.png" id="2_08w86"] [sub_resource type="SphereShape3D" id="SphereShape3D_r5o86"] radius = 0.1 @@ -17,11 +16,6 @@ script = ExtResource("1_ggq0q") [node name="CollisionShape3D" type="CollisionShape3D" parent="."] shape = SubResource("SphereShape3D_r5o86") -[node name="Sprite3D" type="Sprite3D" parent="."] -transform = Transform3D(2.5, 0, 0, 0, 2.5, 0, 0, 0, 2.5, 0, 0, 0) -billboard = 2 -texture = ExtResource("2_08w86") - [node name="HitBox" type="Area3D" parent="."] collision_layer = 0 collision_mask = 0 @@ -30,11 +24,6 @@ collision_mask = 0 shape = SubResource("SphereShape3D_dsts2") debug_color = Color(0.926858, 0.237749, 0.335021, 0.42) -[node name="DamageArea" type="Area3D" parent="."] +[node name="EffectArea" type="Area3D" parent="."] collision_layer = 0 collision_mask = 0 - -[connection signal="body_entered" from="HitBox" to="." method="onBodyCollideWithProjectile" flags=3] -[connection signal="body_exited" from="HitBox" to="." method="removeCollidingBody"] -[connection signal="body_entered" from="DamageArea" to="." method="onBodyEnteredDamageArea"] -[connection signal="body_exited" from="DamageArea" to="." method="removeTarget"] diff --git a/Towers/Scenes/evan.tscn b/Towers/Scenes/evan.tscn index 23c8b88..b15309e 100644 --- a/Towers/Scenes/evan.tscn +++ b/Towers/Scenes/evan.tscn @@ -1,7 +1,8 @@ -[gd_scene load_steps=5 format=3 uid="uid://c4ta0aynybpis"] +[gd_scene load_steps=6 format=3 uid="uid://c4ta0aynybpis"] [ext_resource type="PackedScene" uid="uid://trg7ag3dqr2l" path="res://Towers/tower.tscn" id="1_yctfx"] [ext_resource type="Texture2D" uid="uid://dwwgho6f8f4kj" path="res://Assets/Icones/penguin.svg" id="2_5uh04"] +[ext_resource type="PackedScene" uid="uid://dp8tg6cpu3ftd" path="res://Projectiles/Scenes/projectile-Evan.tscn" id="3_5uh04"] [sub_resource type="SphereShape3D" id="SphereShape3D_y05yr"] radius = 4.0 @@ -14,7 +15,14 @@ tower_name = "Evan" type = 5 icone = ExtResource("2_5uh04") bio = "" +price = 300 +damage = 1 +projectileScene = ExtResource("3_5uh04") towerRange = SubResource("SphereShape3D_y05yr") +action_cooldown = 3.0 +max_energy = 30.0 +energy_regen = 5.0 +energy_cost = 10.0 [node name="EnergyBar3D" parent="." index="6"] texture = SubResource("ViewportTexture_fegyx") diff --git a/Towers/Scenes/maxence.tscn b/Towers/Scenes/maxence.tscn index 2edd650..da57ed9 100644 --- a/Towers/Scenes/maxence.tscn +++ b/Towers/Scenes/maxence.tscn @@ -1,7 +1,8 @@ -[gd_scene load_steps=5 format=3 uid="uid://b1pg1hgysx3am"] +[gd_scene load_steps=6 format=3 uid="uid://b1pg1hgysx3am"] [ext_resource type="PackedScene" uid="uid://trg7ag3dqr2l" path="res://Towers/tower.tscn" id="1_laam8"] [ext_resource type="Texture2D" uid="uid://boxdrq4nrq7hv" path="res://Assets/Icones/flamingo.svg" id="2_sciv6"] +[ext_resource type="PackedScene" uid="uid://baixm8pfsdo3t" path="res://Projectiles/Scenes/projectile-maxence.tscn" id="3_7fox5"] [sub_resource type="SphereShape3D" id="SphereShape3D_pw4mj"] radius = 10.0 @@ -16,6 +17,7 @@ icone = ExtResource("2_sciv6") bio = "" price = 200 damage = 10 +projectileScene = ExtResource("3_7fox5") towerRange = SubResource("SphereShape3D_pw4mj") action_cooldown = 3.0 max_energy = 50.0 diff --git a/UI/InfoPanel.gd b/UI/InfoPanel.gd index 4305cfb..fccf979 100644 --- a/UI/InfoPanel.gd +++ b/UI/InfoPanel.gd @@ -1,7 +1,7 @@ extends HBoxContainer -const upgradeBtnScene : PackedScene = preload("res://UI/upgrade_button.tscn") +const UPGRADE_BTN : PackedScene = preload("uid://dfp5q5gek4ve7") var tower : Tower @@ -59,7 +59,7 @@ func createTowerUpgradeButtons(upgrades : Array) -> void: %UpgradeContainer.visible = true %UpgradeContainer.get_children().map(func(btn): btn.queue_free()) for upgrade in upgrades: - var btn : UpgradeButton = upgradeBtnScene.instantiate() + var btn : UpgradeButton = UPGRADE_BTN.instantiate() %UpgradeContainer.add_child(btn) btn.setUpgrade(upgrade) if tower: diff --git a/UI/confirm_popup.tscn b/UI/confirm_popup.tscn index 9d66c21..8c956e7 100644 --- a/UI/confirm_popup.tscn +++ b/UI/confirm_popup.tscn @@ -4,6 +4,7 @@ [ext_resource type="Theme" uid="uid://bbp4qcbwkeg7x" path="res://default_theme.tres" id="1_x7bkm"] [node name="Panel" type="PanelContainer"] +process_mode = 3 anchors_preset = 8 anchor_left = 0.5 anchor_top = 0.5 diff --git a/UI/gui.gd b/UI/gui.gd index 533cc9d..962cc8a 100644 --- a/UI/gui.gd +++ b/UI/gui.gd @@ -3,7 +3,7 @@ extends Control const BUTTON_QTY = 4 -const guiButton : PackedScene = preload("res://UI/gui_button.tscn") +const GUI_BUTTON : PackedScene = preload("uid://dqb5o8w7u50hc") @onready var buttonContainer : GridContainer = %ButtonContainer @onready var cubeIntegrity : ProgressBar = %CubeIntegrity @@ -77,7 +77,7 @@ func addTowerButtonNodes() -> void: func createTowerButton(towerType : Tower.TYPE) -> void: - var btn : GuiButton = guiButton.instantiate() + var btn : GuiButton = GUI_BUTTON.instantiate() btn.set_meta("dynamicButton", true) if towerType: diff --git a/Upgrades/Upgrade.gd b/Upgrades/Upgrade.gd index a3270e1..eabbf34 100644 --- a/Upgrades/Upgrade.gd +++ b/Upgrades/Upgrade.gd @@ -1,12 +1,12 @@ -extends Resource -class_name Upgrade +@abstract +class_name Upgrade extends Resource enum SCALE_TYPE { LINEAR, EXP, LOG } enum UPGRADE_DIRECTION { INCREASE = 1, DECREASE = -1 } -@export var icon : Texture2D = preload("res://Assets/Icones/medal2.png") +@export var icon : Texture2D = preload("uid://dqvou7t7o1t5d") @export var text : String @export var baseCost : int : set(value): @@ -32,9 +32,8 @@ var level : int = 0 func isLevelMax() -> bool : return not tierLock.is_empty() && level == tierLock[Game.tier] - -func upgrade(_subject = null) -> bool: - return false +@abstract +func upgrade(_subject = null) -> bool func upgradeProperty(subject: Variant, property: String) -> void: diff --git a/VFX/paint_brush_particles.gd b/VFX/paint_brush_particles.gd index fe7d229..e2fada2 100644 --- a/VFX/paint_brush_particles.gd +++ b/VFX/paint_brush_particles.gd @@ -1,6 +1,6 @@ extends Path3D -var particle_np := preload("res://VFX/paint_brush_particle.tscn") +var particle_np := preload("uid://drnc0eus8n2oy") @export var duration : float = 6.0 @export var spawn_timer : float = 0.1 diff --git a/VFX/pixel_rain.gd b/VFX/pixel_rain.gd index 498c2ea..b65cc3b 100644 --- a/VFX/pixel_rain.gd +++ b/VFX/pixel_rain.gd @@ -10,7 +10,7 @@ extends Node2D var time := 0.0 -var rain_drop_packed := preload("res://VFX/pixel_drop.tscn") +const RAIN_DROP : PackedScene = preload("uid://cqn4xrehqnuso") func _physics_process(delta: float) -> void: @@ -21,7 +21,7 @@ func _physics_process(delta: float) -> void: func make_it_rain() -> void: - var rain_drop : RainDrop = rain_drop_packed.instantiate() + var rain_drop : RainDrop = RAIN_DROP.instantiate() var screen_width = get_viewport().get_camera_2d().position.x + get_viewport().size.x/2 var screen_height = get_viewport().get_camera_2d().position.y - get_viewport().size.y/2 - 100 #Offset rain_drop.speed = speed diff --git a/addons/LevelEditor/LevelEditor.gd b/addons/LevelEditor/LevelEditor.gd index e5e1911..89f920f 100644 --- a/addons/LevelEditor/LevelEditor.gd +++ b/addons/LevelEditor/LevelEditor.gd @@ -3,7 +3,7 @@ extends EditorPlugin # Replace this value with a PascalCase autoload name, as per the GDScript style guide. #const AUTOLOAD_NAME = "LevelEditorAutoload" -const ui = preload("res://addons/LevelEditor/wave_maker.tscn") +const ui = preload("uid://dh24t8804isms") var main_panel_instance diff --git a/addons/LevelEditor/WaveMaker.gd b/addons/LevelEditor/WaveMaker.gd index 84f2d4f..8791e6f 100644 --- a/addons/LevelEditor/WaveMaker.gd +++ b/addons/LevelEditor/WaveMaker.gd @@ -6,7 +6,7 @@ class_name WaveMaker signal spawnQtyChanged(newQty : int) -const TROOP_SCENE = preload("res://addons/LevelEditor/UI/Troop/Troop.tscn") +const TROOP_SCENE = preload("uid://djrbvm8gmhly3") var level : Level diff --git a/project.godot b/project.godot index 26ef7df..ac7f125 100644 --- a/project.godot +++ b/project.godot @@ -25,7 +25,7 @@ resources_spreadsheet_view/freeze_first_column=true config/name="Pole Pixel Defense Force" run/main_scene="uid://2xw1yn1tmlcy" -config/features=PackedStringArray("4.4") +config/features=PackedStringArray("4.5") config/icon="res://icon.svg" [audio]