VampireSurvivor/scripts/game.gd

83 lines
2.5 KiB
GDScript

extends Node2D
signal game_over
signal level_up()
signal boss
signal update_ui(game_data: Dictionary)
const MOB = preload("res://scenes/mob.tscn")
const TREE = preload("res://scenes/tree.tscn")
const BOSS = preload("res://scenes/boss.tscn")
@onready var path_follow_2d: PathFollow2D = %PathFollow2D
@onready var game_over_layer: CanvasLayer = %GameOver
@onready var game_over_sound: AudioStreamPlayer2D = %GameOverSound
@onready var background_color: ColorRect = %BackgroundColor
@onready var spawn_mob_timer: Timer = %SpawnMobTimer
@export var map_size := Vector2(8000, 8000)
@export var tree_density := 100000
var game_data := {
"xp": 0,
"xp_next_level": 3,
"level": 1,
"boss_level": 3,
"kill_count": 0
}
func _ready() -> void:
background_color.size = map_size
background_color.position = Vector2(-map_size.x / 2, -map_size.y / 2)
randomly_spawn_trees(int(map_size.x * map_size.y / tree_density))
update_ui.emit(game_data)
func spawn_mob() -> void:
var new_mob = MOB.instantiate()
path_follow_2d.progress_ratio = randf()
new_mob.global_position = path_follow_2d.global_position
new_mob.connect("mob_died", Callable(self, "_on_mob_died"))
add_child(new_mob)
func _on_player_health_depleted() -> void:
game_over_layer.visible = true
game_over.emit()
func _on_death_sound_finished() -> void:
get_tree().paused = true
func randomly_spawn_trees(tree_count: int) -> void:
for i in range(tree_count):
var new_tree = TREE.instantiate()
new_tree.position = Vector2(randi_range(-map_size.x / 2, map_size.x / 2), randi_range(-map_size.y / 2, map_size.y / 2))
new_tree.modulate = Color(randf(), randf(), randf())
add_child(new_tree)
func _on_mob_died(mob_xp: int) -> void:
game_data.kill_count += 1
game_data.xp += mob_xp
print("XP: " + str(game_data.xp) + "/" + str(game_data.xp_next_level))
if game_data.xp >= game_data.xp_next_level:
game_data.xp = game_data.xp - game_data.xp_next_level
game_data.xp_next_level *= 1.5
game_data.level +=1
level_up.emit()
print("Level up to " + str(game_data.level))
if game_data.level >= game_data.boss_level:
boss.emit()
game_data.level = game_data.level - game_data.boss_level
game_data.boss_level *= 2
update_ui.emit(game_data)
func spawn_boss() -> void:
print("Spawn Boss")
var new_boss = BOSS.instantiate()
path_follow_2d.progress_ratio = randf()
new_boss.global_position = path_follow_2d.global_position
new_boss.connect("mob_died", Callable(self, "_on_mob_died"))
add_child(new_boss)
func _on_level_up() -> void:
spawn_mob_timer.wait_time = 1 - (game_data.level * 0.1)
level_up.emit(game_data.level)