Added Elite enemies before wave switch
parent
89f0faea9a
commit
7d17c1312e
|
|
@ -1,26 +1,28 @@
|
||||||
[
|
[
|
||||||
{
|
{
|
||||||
"time_start": 0,
|
"time_start": 0,
|
||||||
"time_end": 60,
|
"time_end": 60,
|
||||||
"entries": [
|
"elite_enemy": "res://scenes/slime.tscn",
|
||||||
{ "enemy": "res://scenes/slime.tscn", "count_at_start": 0, "count_at_end": 15, "min_interval": 0.5 }
|
"entries": [
|
||||||
]
|
{ "enemy": "res://scenes/slime.tscn", "count_at_start": 0, "count_at_end": 15, "min_interval": 0.5 }
|
||||||
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"time_start": 60,
|
"time_start": 60,
|
||||||
"time_end": 180,
|
"time_end": 180,
|
||||||
"entries": [
|
"elite_enemy": "res://scenes/blue_slime.tscn",
|
||||||
{ "enemy": "res://scenes/slime.tscn", "count_at_start": 15, "count_at_end": 40, "min_interval": 0.3 },
|
"entries": [
|
||||||
{ "enemy": "res://scenes/blue_slime.tscn", "count_at_start": 0, "count_at_end": 10, "min_interval": 0.8 }
|
{ "enemy": "res://scenes/slime.tscn", "count_at_start": 15, "count_at_end": 40, "min_interval": 0.3 },
|
||||||
]
|
{ "enemy": "res://scenes/blue_slime.tscn", "count_at_start": 0, "count_at_end": 10, "min_interval": 0.8 }
|
||||||
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"time_start": 180,
|
"time_start": 180,
|
||||||
"time_end": -1,
|
"time_end": -1,
|
||||||
"entries": [
|
"entries": [
|
||||||
{ "enemy": "res://scenes/slime.tscn", "count_at_start": 40, "count_at_end": 100, "min_interval": 0.2 },
|
{ "enemy": "res://scenes/slime.tscn", "count_at_start": 40, "count_at_end": 100, "min_interval": 0.2 },
|
||||||
{ "enemy": "res://scenes/blue_slime.tscn", "count_at_start": 10, "count_at_end": 60, "min_interval": 0.5 },
|
{ "enemy": "res://scenes/blue_slime.tscn", "count_at_start": 10, "count_at_end": 60, "min_interval": 0.5 },
|
||||||
{ "enemy": "res://scenes/fire_slime.tscn", "count_at_start": 0, "count_at_end": 40, "min_interval": 0.6 }
|
{ "enemy": "res://scenes/fire_slime.tscn", "count_at_start": 0, "count_at_end": 40, "min_interval": 0.6 }
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
|
||||||
|
|
@ -2,5 +2,6 @@ extends Resource
|
||||||
class_name SpawnStage
|
class_name SpawnStage
|
||||||
|
|
||||||
@export var time_start: float = 0.0
|
@export var time_start: float = 0.0
|
||||||
@export var time_end: float = -1.0 # -1 = forever
|
@export var time_end: float = -1.0
|
||||||
|
@export var elite_enemy: PackedScene = null
|
||||||
@export var entries: Array[StageEntry]
|
@export var entries: Array[StageEntry]
|
||||||
|
|
|
||||||
|
|
@ -8,11 +8,13 @@ var elapsed_time: float = 0.0
|
||||||
|
|
||||||
const STAGES_JSON = "res://data/spawn_stages.json"
|
const STAGES_JSON = "res://data/spawn_stages.json"
|
||||||
|
|
||||||
var stages: Array[SpawnStage] = []
|
const ELITE_HP_MULT := 10
|
||||||
|
const ELITE_SPD_MULT := 0.25
|
||||||
|
const ELITE_SCALE := 3.0
|
||||||
|
|
||||||
# _state keys: Vector2i(stage_idx, entry_idx)
|
var stages: Array[SpawnStage] = []
|
||||||
# values: { "timer": float, "alive": int }
|
|
||||||
var _state: Dictionary = {}
|
var _state: Dictionary = {}
|
||||||
|
var current_stage_idx: int = -1
|
||||||
|
|
||||||
func _ready() -> void:
|
func _ready() -> void:
|
||||||
var camera: Camera2D = get_parent().get_node("Camera2D")
|
var camera: Camera2D = get_parent().get_node("Camera2D")
|
||||||
|
|
@ -44,6 +46,8 @@ func _load_stages(path: String) -> void:
|
||||||
var stage = SpawnStage.new()
|
var stage = SpawnStage.new()
|
||||||
stage.time_start = float(sd["time_start"])
|
stage.time_start = float(sd["time_start"])
|
||||||
stage.time_end = float(sd["time_end"])
|
stage.time_end = float(sd["time_end"])
|
||||||
|
if sd.has("elite_enemy"):
|
||||||
|
stage.elite_enemy = load(sd["elite_enemy"])
|
||||||
for ed in sd["entries"]:
|
for ed in sd["entries"]:
|
||||||
var entry = StageEntry.new()
|
var entry = StageEntry.new()
|
||||||
entry.enemy = load(ed["enemy"])
|
entry.enemy = load(ed["enemy"])
|
||||||
|
|
@ -72,9 +76,31 @@ func get_spawn_position() -> Vector2:
|
||||||
spawn_y = randf_range(up_right.y, down_right.y)
|
spawn_y = randf_range(up_right.y, down_right.y)
|
||||||
return Vector2(spawn_x, spawn_y)
|
return Vector2(spawn_x, spawn_y)
|
||||||
|
|
||||||
|
func _active_stage_idx() -> int:
|
||||||
|
for si in stages.size():
|
||||||
|
var s: SpawnStage = stages[si]
|
||||||
|
if elapsed_time >= s.time_start and (s.time_end == -1.0 or elapsed_time < s.time_end):
|
||||||
|
return si
|
||||||
|
return stages.size() - 1
|
||||||
|
|
||||||
|
func _spawn_elite(scene: PackedScene) -> void:
|
||||||
|
var enemy = scene.instantiate()
|
||||||
|
enemy.global_position = get_spawn_position()
|
||||||
|
add_child(enemy)
|
||||||
|
enemy.scale = Vector2(ELITE_SCALE, ELITE_SCALE)
|
||||||
|
enemy.max_hp = enemy.max_hp * ELITE_HP_MULT
|
||||||
|
enemy.hp = enemy.max_hp
|
||||||
|
enemy.speed *= ELITE_SPD_MULT
|
||||||
|
|
||||||
func _process(delta: float) -> void:
|
func _process(delta: float) -> void:
|
||||||
elapsed_time += delta
|
elapsed_time += delta
|
||||||
|
|
||||||
|
var new_idx := _active_stage_idx()
|
||||||
|
if new_idx != current_stage_idx:
|
||||||
|
if current_stage_idx >= 0 and stages[current_stage_idx].elite_enemy != null:
|
||||||
|
_spawn_elite(stages[current_stage_idx].elite_enemy)
|
||||||
|
current_stage_idx = new_idx
|
||||||
|
|
||||||
for si in stages.size():
|
for si in stages.size():
|
||||||
var stage: SpawnStage = stages[si]
|
var stage: SpawnStage = stages[si]
|
||||||
if elapsed_time < stage.time_start:
|
if elapsed_time < stage.time_start:
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue