fixed the parity between air and land enemies. +added a lot of new cards

This commit is contained in:
2023-11-11 19:03:01 +11:00
parent afc0a19b36
commit b0f8a37f60
99 changed files with 1795 additions and 188 deletions

View File

@ -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

View File

@ -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

View File

@ -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)

View 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

View File

@ -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

View File

@ -0,0 +1,6 @@
extends StatusEffect
class_name StatusPoison
func proc(affected, stacks, existing_effects):
affected.damage(stats.potency * stacks)

View File

@ -0,0 +1,5 @@
extends StatusEffect
class_name StatusRadioactive
func proc(affected, stacks, existing_effects):
affected.damage(stats.potency * stacks)

View File

@ -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

View 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)

View File

@ -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
View File

@ -0,0 +1,6 @@
extends Node3D
func _on_area_3d_body_entered(body: Node3D) -> void:
if body is EnemyController:
body.goal_entered()

View File

@ -0,0 +1,6 @@
extends Node
class_name EnemyMovement
@export var character : CharacterBody3D
var distance_remaining := 0.0

View File

@ -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()

View File

@ -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:

View 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)