2026-05-26 01:03:17 +00:00
|
|
|
extends Node2D
|
2026-04-28 01:06:17 +00:00
|
|
|
|
|
|
|
|
signal destroy(body)
|
2026-05-26 01:03:17 +00:00
|
|
|
signal level_change_signal(level)
|
2026-06-02 00:13:28 +00:00
|
|
|
signal damage_player_signal(damage, player_health)
|
2026-06-02 01:08:48 +00:00
|
|
|
signal time_change(remaining_time)
|
2026-05-26 01:03:17 +00:00
|
|
|
|
|
|
|
|
var levels = ["res://scenes/level1.tscn","res://scenes/level2.tscn","res://scenes/level3.tscn"]
|
|
|
|
|
var current_level_index = 0
|
|
|
|
|
var level_times = [15,20,25]
|
|
|
|
|
var time_available = 0
|
|
|
|
|
|
|
|
|
|
var timer = Timer.new()
|
|
|
|
|
var player:Player;
|
|
|
|
|
var enemies = {}
|
2026-04-21 01:09:00 +00:00
|
|
|
|
2026-06-02 00:13:28 +00:00
|
|
|
var enemy_stats:CharacterStats
|
|
|
|
|
var player_stats:CharacterStats
|
|
|
|
|
|
2026-04-21 01:09:00 +00:00
|
|
|
func _ready():
|
2026-06-02 00:13:28 +00:00
|
|
|
get_window().grab_focus()
|
|
|
|
|
enemy_stats = load("res://scripts/resources/slime_stats.tres")
|
|
|
|
|
player_stats = load("res://scripts/resources/player_stats.tres")
|
2026-05-26 01:03:17 +00:00
|
|
|
reset()
|
|
|
|
|
add_child(timer)
|
|
|
|
|
timer.wait_time = 1
|
|
|
|
|
timer.one_shot = false
|
|
|
|
|
timer.connect("timeout", timer_tick)
|
|
|
|
|
timer.start()
|
|
|
|
|
|
|
|
|
|
func timer_tick():
|
|
|
|
|
time_available -= 1
|
2026-06-02 01:08:48 +00:00
|
|
|
time_change.emit(time_available)
|
2026-05-26 01:03:17 +00:00
|
|
|
if time_available <= 0:
|
|
|
|
|
print("you lose")
|
|
|
|
|
level_change_signal.emit(levels[current_level_index])
|
|
|
|
|
reset()
|
2026-04-21 01:09:00 +00:00
|
|
|
|
2026-05-26 01:03:17 +00:00
|
|
|
func reset():
|
2026-06-02 01:08:48 +00:00
|
|
|
print("reset")
|
2026-05-26 01:03:17 +00:00
|
|
|
time_available = level_times[current_level_index]
|
|
|
|
|
if player:
|
2026-06-02 01:08:48 +00:00
|
|
|
player.set_health(player_stats.starting_health)
|
2026-05-26 01:03:17 +00:00
|
|
|
|
|
|
|
|
func stop():
|
|
|
|
|
timer.stop()
|
|
|
|
|
|
2026-04-21 01:09:00 +00:00
|
|
|
func _process(delta):
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
func _on_area_2d_trigger_active_signal(body, intentMessage):
|
|
|
|
|
print("game controller received trigger")
|
2026-04-28 01:06:17 +00:00
|
|
|
if intentMessage == "destroy" and body.is_in_group("destructable"):
|
|
|
|
|
destroy.emit(body)
|
|
|
|
|
|
|
|
|
|
var crate_num : int = 0
|
|
|
|
|
func set_crate_num(count: int):
|
|
|
|
|
crate_num = count
|
|
|
|
|
if crate_num <= 0:
|
2026-05-26 01:03:17 +00:00
|
|
|
current_level_index += 1
|
|
|
|
|
if current_level_index == levels.size():
|
|
|
|
|
print("You Win!")
|
|
|
|
|
stop()
|
|
|
|
|
else:
|
|
|
|
|
level_change_signal.emit(levels[current_level_index])
|
|
|
|
|
reset()
|
|
|
|
|
|
|
|
|
|
func _on_slime_damage(body, slime):
|
2026-06-02 01:08:48 +00:00
|
|
|
damage_player_signal.emit(enemies[slime]["damage"], player.health)
|
2026-05-26 01:03:17 +00:00
|
|
|
|
|
|
|
|
func add_enemy(slime):
|
|
|
|
|
var enemy_stat = {
|
2026-06-02 00:13:28 +00:00
|
|
|
"health": enemy_stats.starting_health,
|
|
|
|
|
"damage": enemy_stats.melee_damage
|
2026-05-26 01:03:17 +00:00
|
|
|
}
|
|
|
|
|
enemies[slime] = enemy_stat
|
|
|
|
|
|
|
|
|
|
func _on_slime_struck(body, slime):
|
|
|
|
|
print("game controller sees slime struck")
|
2026-06-02 00:13:28 +00:00
|
|
|
|
|
|
|
|
func _on_player_dead(player):
|
|
|
|
|
print("game controller sees dead player")
|
|
|
|
|
level_change_signal.emit(levels[current_level_index])
|