fixed the parity between air and land enemies. +added a lot of new cards
This commit is contained in:
@ -1,8 +1,9 @@
|
||||
extends Resource
|
||||
class_name StatusStats
|
||||
|
||||
@export var unique := false
|
||||
@export var proc_frequency := 0.0
|
||||
@export var name : String
|
||||
@export var max_stacks := 0
|
||||
@export var proc_cd := 0.0
|
||||
@export var duration := 1.0
|
||||
@export var potency := 1.0
|
||||
@export var icon : Texture
|
||||
|
@ -2,35 +2,59 @@ extends Node3D
|
||||
class_name StatusEffector
|
||||
|
||||
@export var hbox : HBoxContainer
|
||||
@export var enemy : EnemyController
|
||||
|
||||
var icon_scene = preload("res://Scenes/status_icon.tscn")
|
||||
var effects : Array[StatusEffect]
|
||||
var icons : Array[TextureRect]
|
||||
var immune : Array[StatusEffect] = []
|
||||
var effects = {}
|
||||
var icons = {}
|
||||
|
||||
|
||||
func _process(delta: float) -> void:
|
||||
for effect in effects:
|
||||
if effects[effect] == 0:
|
||||
continue
|
||||
effect.time_since_proc += delta
|
||||
effect.time_existed += delta
|
||||
if effect.stats.duration > 0.0 and effect.time_existed >= effect.stats.duration:
|
||||
effect.time_existed -= effect.stats.duration
|
||||
effects[effect] -= 1
|
||||
effect.on_removed(enemy, effects)
|
||||
if effects[effect] == 0:
|
||||
icons[effect].set_visible(false)
|
||||
if effect.time_since_proc >= effect.stats.proc_cd:
|
||||
effect.proc(enemy, effects[effect], effects)
|
||||
effect.time_since_proc -= effect.stats.proc_cd
|
||||
|
||||
|
||||
func force_proc(effect_to_proc : StatusEffect):
|
||||
for effect in effects:
|
||||
if effect.stats == effect_to_proc.stats:
|
||||
effect.proc(enemy, effects[effect], effects)
|
||||
|
||||
|
||||
func add_effect(new_effect : StatusEffect):
|
||||
var icon_present = false
|
||||
for effect in immune:
|
||||
if effect.stats == new_effect.stats:
|
||||
return
|
||||
|
||||
var existing_effect
|
||||
for effect in effects:
|
||||
if effect.stats == new_effect.stats:
|
||||
icon_present = true
|
||||
new_effect.expired.connect(remove_effect)
|
||||
effects.append(new_effect)
|
||||
if !icon_present:
|
||||
existing_effect = effect
|
||||
if !existing_effect:
|
||||
existing_effect = new_effect
|
||||
effects[new_effect] = 0
|
||||
var icon = icon_scene.instantiate()
|
||||
icon.texture = new_effect.stats.icon
|
||||
icons.append(icon)
|
||||
icon.set_visible(false)
|
||||
icons[new_effect] = icon
|
||||
hbox.add_child(icon)
|
||||
|
||||
|
||||
func remove_effect(expiring_effect : StatusEffect):
|
||||
effects.erase(expiring_effect)
|
||||
var has_remaining_stack = false
|
||||
for effect in effects:
|
||||
if effect.stats == expiring_effect.stats:
|
||||
has_remaining_stack = true
|
||||
if !has_remaining_stack:
|
||||
for icon in icons:
|
||||
if icon.texture == expiring_effect.stats.icon:
|
||||
icons.erase(icon)
|
||||
icon.queue_free()
|
||||
break
|
||||
|
||||
if existing_effect.stats.max_stacks == 0 or effects[existing_effect] < existing_effect.stats.max_stacks:
|
||||
existing_effect.on_attached(enemy, effects)
|
||||
icons[existing_effect].set_visible(true)
|
||||
effects[existing_effect] += 1
|
||||
existing_effect.time_existed = 0.0
|
||||
if existing_effect.stats.max_stacks != 0 and effects[existing_effect] > existing_effect.stats.max_stacks:
|
||||
effects[existing_effect] = existing_effect.stats.max_stacks
|
||||
|
@ -2,5 +2,5 @@ extends StatusEffect
|
||||
class_name StatusOnFire
|
||||
|
||||
|
||||
func proc():
|
||||
affected.damage(stats.potency)
|
||||
func proc(affected, stacks, existing_effects):
|
||||
affected.damage(stats.potency * stacks)
|
||||
|
9
Scripts/StatusEffects/status_cold.gd
Normal file
9
Scripts/StatusEffects/status_cold.gd
Normal file
@ -0,0 +1,9 @@
|
||||
extends StatusEffect
|
||||
class_name StatusCold
|
||||
|
||||
func on_attached(affected, existing_effects):
|
||||
affected.movement_speed_penalty -= stats.potency
|
||||
|
||||
|
||||
func on_removed(affected, existing_effects):
|
||||
affected.movement_speed_penalty += stats.potency
|
@ -1,44 +1,19 @@
|
||||
extends Node
|
||||
extends RefCounted
|
||||
class_name StatusEffect
|
||||
|
||||
signal expired(effect : StatusEffect)
|
||||
|
||||
var stats : StatusStats
|
||||
|
||||
var affected :
|
||||
set(value):
|
||||
affected = value
|
||||
on_attached()
|
||||
var cooldown := 0.0
|
||||
var other_cooldown := 0.0
|
||||
var time_since_proc := 0.0
|
||||
var time_existed := 0.0
|
||||
|
||||
|
||||
func on_attached():
|
||||
func on_attached(affected, existing_effects):
|
||||
pass
|
||||
|
||||
|
||||
func on_removed():
|
||||
expired.emit(self)
|
||||
|
||||
|
||||
func proc():
|
||||
func on_removed(affected, existing_effects):
|
||||
pass
|
||||
|
||||
|
||||
func _ready():
|
||||
other_cooldown = 1.0 / stats.proc_frequency
|
||||
|
||||
|
||||
func _process(delta: float) -> void:
|
||||
time_existed += delta
|
||||
if time_existed >= stats.duration:
|
||||
on_removed()
|
||||
queue_free()
|
||||
return
|
||||
if stats.proc_frequency > 0.0:
|
||||
cooldown += delta
|
||||
if cooldown >= other_cooldown:
|
||||
cooldown -= other_cooldown
|
||||
proc()
|
||||
|
||||
func proc(affected, stacks, existing_effects):
|
||||
pass
|
||||
|
6
Scripts/StatusEffects/status_poison.gd
Normal file
6
Scripts/StatusEffects/status_poison.gd
Normal file
@ -0,0 +1,6 @@
|
||||
extends StatusEffect
|
||||
class_name StatusPoison
|
||||
|
||||
|
||||
func proc(affected, stacks, existing_effects):
|
||||
affected.damage(stats.potency * stacks)
|
5
Scripts/StatusEffects/status_radioactive.gd
Normal file
5
Scripts/StatusEffects/status_radioactive.gd
Normal file
@ -0,0 +1,5 @@
|
||||
extends StatusEffect
|
||||
class_name StatusRadioactive
|
||||
|
||||
func proc(affected, stacks, existing_effects):
|
||||
affected.damage(stats.potency * stacks)
|
@ -2,17 +2,9 @@ extends StatusEffect
|
||||
class_name StatusSticky
|
||||
|
||||
|
||||
func on_attached():
|
||||
super.on_attached()
|
||||
affected.movement_speed = affected.stats.movement_speed * (1.0 - stats.potency)
|
||||
func on_attached(affected, existing_effects):
|
||||
affected.movement_speed_penalty -= stats.potency
|
||||
|
||||
|
||||
func on_removed():
|
||||
super.on_removed()
|
||||
var siblings = get_parent().get_children()
|
||||
var stickies = 0
|
||||
for node in siblings:
|
||||
if node is StatusSticky:
|
||||
stickies += 1
|
||||
if stickies == 1:
|
||||
affected.movement_speed = affected.stats.movement_speed
|
||||
func on_removed(affected, existing_effects):
|
||||
affected.movement_speed_penalty += stats.potency
|
||||
|
16
Scripts/beelining_controller.gd
Normal file
16
Scripts/beelining_controller.gd
Normal file
@ -0,0 +1,16 @@
|
||||
extends EnemyMovement
|
||||
class_name BeeliningController
|
||||
|
||||
var goal : Node3D
|
||||
var direction : Vector3
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
distance_remaining = character.global_position.distance_squared_to(goal.global_position)
|
||||
direction = character.global_position.direction_to(goal.global_position)
|
||||
|
||||
|
||||
func _physics_process(delta: float) -> void:
|
||||
var distance_travelled = (character.stats.movement_speed * clampf(character.movement_speed_penalty, 0.0, 1.0)) * delta
|
||||
distance_remaining -= distance_travelled
|
||||
character.global_position = character.global_position + (direction * distance_travelled)
|
@ -14,10 +14,10 @@ enum TargetType {LAND = 1, AIR = 2, BOTH = 3}
|
||||
enum EnemyType {LAND = 1, AIR = 2}
|
||||
enum Rarity {COMMON, UNCOMMON, RARE, EPIC, LEGENDARY}
|
||||
var rarity_weights = {
|
||||
"COMMON" = 100,
|
||||
"UNCOMMON" = 60,
|
||||
"RARE" = 20,
|
||||
"EPIC" = 8,
|
||||
"COMMON" = 50,
|
||||
"UNCOMMON" = 30,
|
||||
"RARE" = 10,
|
||||
"EPIC" = 4,
|
||||
"LEGENDARY" = 1
|
||||
}
|
||||
|
||||
@ -38,6 +38,12 @@ func _ready() -> void:
|
||||
cards.append(preload("res://PCs/Universal/ClassCards/Gatling/card_gatling.tres"))
|
||||
cards.append(preload("res://PCs/Universal/ClassCards/GlueLauncher/card_glue_launcher.tres"))
|
||||
cards.append(preload("res://PCs/Universal/ClassCards/RocketLauncher/card_rocket_launcher.tres"))
|
||||
cards.append(preload("res://PCs/Universal/ClassCards/Flamethrower/card_flamethrower.tres"))
|
||||
cards.append(preload("res://PCs/Universal/ClassCards/Blowdart/card_blowdart.tres"))
|
||||
cards.append(preload("res://PCs/Universal/ClassCards/Fireball/card_fireball.tres"))
|
||||
cards.append(preload("res://PCs/Universal/ClassCards/Icicle/card_icicle.tres"))
|
||||
cards.append(preload("res://PCs/Universal/ClassCards/Reactor/card_reactor.tres"))
|
||||
cards.append(preload("res://PCs/Universal/ClassCards/Refridgerator/card_refridgerator.tres"))
|
||||
|
||||
enemies.append(preload("res://Worlds/GreenPlanet/Enemies/dog.tres"))
|
||||
enemies.append(preload("res://Worlds/GreenPlanet/Enemies/dog_fast.tres"))
|
||||
|
6
Scripts/enemy_goal.gd
Normal file
6
Scripts/enemy_goal.gd
Normal file
@ -0,0 +1,6 @@
|
||||
extends Node3D
|
||||
|
||||
|
||||
func _on_area_3d_body_entered(body: Node3D) -> void:
|
||||
if body is EnemyController:
|
||||
body.goal_entered()
|
6
Scripts/enemy_movement.gd
Normal file
6
Scripts/enemy_movement.gd
Normal file
@ -0,0 +1,6 @@
|
||||
extends Node
|
||||
class_name EnemyMovement
|
||||
|
||||
@export var character : CharacterBody3D
|
||||
|
||||
var distance_remaining := 0.0
|
@ -35,19 +35,20 @@ func _process(delta: float) -> void:
|
||||
enemy.stats = enemy_stats
|
||||
enemy.died.connect(signal_for_after_enemy_died)
|
||||
enemy.reached_goal.connect(signal_for_after_enemy_reached_goal)
|
||||
path.add_child(enemy)
|
||||
enemy.movement_controller.path = path.curve
|
||||
add_child(enemy)
|
||||
enemy_spawn_timers[x] -= enemy_stats.spawn_cooldown
|
||||
signal_for_when_enemy_spawns.emit()
|
||||
if type == Data.EnemyType.AIR:
|
||||
var enemy = air_enemy_scene.instantiate() as AirEnemyController
|
||||
var enemy = air_enemy_scene.instantiate() as EnemyController
|
||||
var radius = 10.0
|
||||
var random_dir = Vector3(randf_range(-1, 1), randf_range(-1, 1), randf_range(-1, 1))
|
||||
var random_pos = randf_range(0, radius) * random_dir.normalized()
|
||||
enemy.position = random_pos
|
||||
enemy.stats = enemy_stats
|
||||
enemy.destination = dest
|
||||
enemy.died.connect(signal_for_after_enemy_died)
|
||||
enemy.reached_goal.connect(signal_for_after_enemy_reached_goal)
|
||||
enemy.movement_controller.goal = dest
|
||||
add_child(enemy)
|
||||
enemy_spawn_timers[x] -= enemy_stats.spawn_cooldown
|
||||
signal_for_when_enemy_spawns.emit()
|
||||
|
@ -24,6 +24,13 @@ var objective_health := 120
|
||||
var wave := 0
|
||||
var upcoming_wave
|
||||
var pot : int
|
||||
var UILayer : CanvasLayer
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
UILayer = CanvasLayer.new()
|
||||
UILayer.layer = 2
|
||||
get_tree().root.add_child.call_deferred(UILayer)
|
||||
|
||||
|
||||
func parse_command(text : String, peer_id : int):
|
||||
@ -174,7 +181,7 @@ func lose_game():
|
||||
return
|
||||
game_active = false
|
||||
var menu = lose_game_scene.instantiate()
|
||||
add_child(menu)
|
||||
UILayer.add_child(menu)
|
||||
lost_game.emit()
|
||||
Input.mouse_mode = Input.MOUSE_MODE_VISIBLE
|
||||
for peer_id in connected_players_nodes:
|
||||
@ -186,7 +193,7 @@ func win_game():
|
||||
return
|
||||
game_active = false
|
||||
var menu = won_game_scene.instantiate()
|
||||
add_child(menu)
|
||||
UILayer.add_child(menu)
|
||||
won_game.emit()
|
||||
Input.mouse_mode = Input.MOUSE_MODE_VISIBLE
|
||||
for peer_id in connected_players_nodes:
|
||||
|
18
Scripts/pathing_controller.gd
Normal file
18
Scripts/pathing_controller.gd
Normal file
@ -0,0 +1,18 @@
|
||||
extends EnemyMovement
|
||||
class_name PathingController
|
||||
|
||||
var path : Curve3D
|
||||
var path_progress = 0.0
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
distance_remaining = path.get_baked_length()
|
||||
|
||||
|
||||
func _physics_process(delta: float) -> void:
|
||||
var distance_travelled = (character.stats.movement_speed * clampf(character.movement_speed_penalty, 0.0, 1.0)) * delta
|
||||
distance_remaining -= distance_travelled
|
||||
path_progress += distance_travelled
|
||||
var sample = path.sample_baked_with_rotation(path_progress, true)
|
||||
character.global_position = sample.origin
|
||||
character.look_at(character.global_position + -sample.basis.z)
|
Reference in New Issue
Block a user