SeptemberGameAB/scripts/game_controller.gd

112 lines
3.6 KiB
GDScript3
Raw Normal View History

extends Node2D
var coins_collected : int = 0
var total_coins : int = 0
var levels = ["res://scenes/game.tscn", "res://scenes/level_2.tscn", "res://scenes/level_3.tscn"]
var timers = [10, 15, 20]
var time_available : int = 0
var current_level = 0
var timer = Timer.new()
## Signals
signal level_changed(level)
signal destroyed(body)
signal player_damaged(health, max_health)
signal player_death
var enemy_stats : CharacterStats
var player_stats : CharacterStats
var enemies_dict : Dictionary = {}
var player_current_health : int = 0
func _ready() -> void:
# load in characters
enemy_stats = load("res://resources/slime_stats.tres")
player_stats = load("res://resources/player_stats.tres")
player_current_health = player_stats.starting_health
add_child(timer)
timer.wait_time = 1.0
timer.one_shot = false
timer.connect("timeout", second_counter)
timer.start()
func second_counter() -> void:
time_available -= 1
if time_available <= 0:
print_debug("You ran out of time! Emitting level_changed signal")
#get_tree().call_deferred("change_scene_to_file", levels[current_level])
#await get_tree().create_timer(1.0).timeout
level_changed.emit(levels[current_level])
func reset() -> void:
print_debug("Resetting the level")
enemies_dict.clear()
player_current_health = player_stats["starting_health"]
time_available = timers[current_level]
print_debug("You have %s seconds to find all the coins" % str(time_available))
func _on_trigger_fired(intent: Variant, body: PhysicsBody2D) -> void:
print("Game controller knows %s trigger fired " % intent)
match intent:
"destroy":
print("Destroy this thing!")
if body is RigidBody2D:
destroyed.emit(body)
"powerup":
print("Power this thing up!")
func on_coin_collected(_body, coin) -> void:
print_debug("GC knows coin collected")
coins_collected += 1
print_debug("Coins collected: %s" % str(coins_collected))
print_debug("There are %s coins remaining" % str(total_coins - coins_collected))
destroyed.emit(coin)
func set_total_coins(value) -> void:
print_debug("Setting coin total to %s" % str(value))
if value == 0:
# You won!
current_level += 1
if current_level >= levels.size():
current_level = 0
#await get_tree().create_timer(1.0).timeout
level_changed.emit(levels[current_level])
#total_coins = value
print_debug("There are %s coins in the level" % str(value))
func on_player_slimed(_body, slime) -> void:
print_debug("GC knows player slimed")
print_debug("Damage: " + str(enemies_dict[slime]["damage"]))
player_current_health -= enemies_dict[slime]["damage"]
if player_current_health <= 0:
print_debug("Player dead!")
player_death.emit()
else:
print_debug("Taking damage")
player_damaged.emit(player_current_health, player_stats.starting_health)
print_debug("Player Health: " + str(player_current_health) + " of " + str(player_stats.starting_health))
func add_enemy_to_level(enemy) -> void:
print_debug("GC adding %s to level" % enemy.name)
var rand_damage : int = randi() % 10
var this_enemy_stats : Dictionary = {
"health": enemy_stats.health,
"damage": enemy_stats.melee_damage + rand_damage
}
enemies_dict[enemy] = this_enemy_stats
func bullet_damage(thing_damaged, _bullet) -> void:
print_debug("Bullet has hit %s" % thing_damaged.name)
if thing_damaged is Slimer:
print_debug("Hitting a slime!")
enemies_dict[thing_damaged]["health"] -= player_stats.ranged_damage
if enemies_dict[thing_damaged]["health"] <= 0:
print("Enemy killed")
remove_enemy_from_level(thing_damaged)
destroyed.emit(thing_damaged)
else:
print_debug("Slime health is %s" % enemies_dict[thing_damaged]["health"])
func remove_enemy_from_level(enemy) -> void:
enemies_dict.erase(enemy)