multi levels; closed loop; custom resources; character stats; enemy attacks; player attacks; enemy movement started
This commit is contained in:
1 parent
0d6ffa22df
commit
1e24e0a59a
39 files changed
+1475
-61
No files matched your search
+6
-3
@@ -1,11 +1,10 @@
|
||||
class_name Bullet
|
||||
extends Area2D
|
||||
## Bang bang!
|
||||
|
||||
@export var speed : float = 700
|
||||
# Called when the node enters the scene tree for the first time.
|
||||
func _ready() -> void:
|
||||
pass # Replace with function body.
|
||||
|
||||
signal bullet_damaged(thing_damaged, bullet)
|
||||
|
||||
# Called every frame. 'delta' is the elapsed time since the previous frame.
|
||||
func _process(delta: float) -> void:
|
||||
@@ -13,3 +12,7 @@ func _process(delta: float) -> void:
|
||||
|
||||
func set_speed(value) -> void:
|
||||
speed = value
|
||||
|
||||
|
||||
func _on_area_entered(area: Area2D) -> void:
|
||||
bullet_damaged.emit(area, self) # Replace with function body.
|
||||
@@ -7,3 +7,8 @@ func _on_body_entered(body: Node2D) -> void:
|
||||
print_debug("body connected with coin")
|
||||
if body is Player:
|
||||
coin_collected.emit(body, self)
|
||||
if body is Grenade:
|
||||
self.visible = false
|
||||
body.explode()
|
||||
await body.animated_sprite_2d.animation_finished
|
||||
self.queue_free()
|
||||
+90
-11
@@ -2,6 +2,48 @@ 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)
|
||||
@@ -9,7 +51,7 @@ func _on_trigger_fired(intent: Variant, body: PhysicsBody2D) -> void:
|
||||
"destroy":
|
||||
print("Destroy this thing!")
|
||||
if body is RigidBody2D:
|
||||
body.queue_free()
|
||||
destroyed.emit(body)
|
||||
"powerup":
|
||||
print("Power this thing up!")
|
||||
|
||||
@@ -18,15 +60,52 @@ func on_coin_collected(_body, coin) -> void:
|
||||
coins_collected += 1
|
||||
print_debug("Coins collected: %s" % str(coins_collected))
|
||||
print_debug("There are %s coins remaining" % str(total_coins - coins_collected))
|
||||
coin.queue_free()
|
||||
if coins_collected >= total_coins:
|
||||
print_debug("You win!")
|
||||
await get_tree().create_timer(1.0).timeout
|
||||
get_tree().call_deferred("reload_current_scene")
|
||||
|
||||
func on_player_slimed(body, slime) -> void:
|
||||
print_debug("GC knows player slimed")
|
||||
destroyed.emit(coin)
|
||||
|
||||
func set_total_coins(value) -> void:
|
||||
total_coins = value
|
||||
print_debug("There are %s coins in the level" % str(total_coins))
|
||||
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)
|
||||
+40
-14
@@ -6,27 +6,45 @@ var grenade = preload("res://scenes/grenade.tscn")
|
||||
var bullet_array = []
|
||||
var total_allowed_bullets : int = 7
|
||||
|
||||
@onready var game: Node2D = $".."
|
||||
@onready var coins: Node = $"../Coins"
|
||||
@onready var enemies: Node = $"../Enemies"
|
||||
|
||||
func _ready() -> void:
|
||||
GameController.reset()
|
||||
build_level()
|
||||
|
||||
func build_level() -> void:
|
||||
var total_coins : int = 0
|
||||
if coins:
|
||||
for coin in coins.get_children():
|
||||
if coin is Coin:
|
||||
total_coins += 1
|
||||
coin.coin_collected.connect(game.on_coin_collected)
|
||||
game.set_total_coins(total_coins)
|
||||
var total_enemies : int = 0
|
||||
update_coins()
|
||||
|
||||
var _total_enemies : int = 0
|
||||
if enemies:
|
||||
for enemy in enemies.get_children():
|
||||
if enemy is Slimer:
|
||||
total_enemies += 1
|
||||
enemy.player_slimed.connect(game.on_player_slimed)
|
||||
update_enemies()
|
||||
# Wire up signals from GameController
|
||||
GameController.level_changed.connect(change_scene)
|
||||
GameController.destroyed.connect(destroy)
|
||||
|
||||
func update_enemies() -> void:
|
||||
var total_enemies : int = 0
|
||||
for enemy in enemies.get_children():
|
||||
if enemy is Slimer:
|
||||
total_enemies += 1
|
||||
if not enemy.player_slimed.is_connected(GameController.on_player_slimed):
|
||||
enemy.player_slimed.connect(GameController.on_player_slimed)
|
||||
GameController.add_enemy_to_level(enemy)
|
||||
|
||||
func update_coins() -> void:
|
||||
var total_coins : int = 0
|
||||
for coin in coins.get_children():
|
||||
if coin is Coin:
|
||||
print_debug("Adding %s to the total" % str(coin))
|
||||
if not coin.coin_collected.is_connected(GameController.on_coin_collected):
|
||||
coin.coin_collected.connect(GameController.on_coin_collected)
|
||||
print_debug("There are %s coins in the total" % str(total_coins))
|
||||
if not coin.tree_exited.is_connected(update_coins):
|
||||
coin.tree_exited.connect(update_coins)
|
||||
total_coins += 1
|
||||
GameController.set_total_coins(total_coins)
|
||||
|
||||
func make_bullet(_bullet_position, _bullet_speed) -> void:
|
||||
print("make a bullet; put it in the world")
|
||||
@@ -37,7 +55,7 @@ func make_bullet(_bullet_position, _bullet_speed) -> void:
|
||||
func make_grenade(_grenade_position, _grenade_direction) -> void:
|
||||
print("SM make a grenade")
|
||||
var my_grenade : Grenade = grenade.instantiate()
|
||||
game.add_child(my_grenade)
|
||||
GameController.add_child(my_grenade)
|
||||
my_grenade.transform = _grenade_position
|
||||
my_grenade.apply_central_impulse(Vector2(_grenade_direction, -1) * 200)
|
||||
|
||||
@@ -46,7 +64,8 @@ func bullet_factory() -> Bullet:
|
||||
if bullet_array.size() < total_allowed_bullets:
|
||||
# make a new bullet
|
||||
my_bullet = bullet.instantiate()
|
||||
game.add_child(my_bullet)
|
||||
my_bullet.bullet_damaged.connect(GameController.bullet_damage)
|
||||
owner.add_child(my_bullet)
|
||||
else:
|
||||
my_bullet = bullet_array.pop_back()
|
||||
bullet_array.push_front(my_bullet)
|
||||
@@ -56,3 +75,10 @@ func _on_world_boundary_body_entered(body: Node2D) -> void:
|
||||
if body is Player:
|
||||
var current_scene = get_tree()
|
||||
current_scene.call_deferred("reload_current_scene")
|
||||
|
||||
func change_scene(level) -> void:
|
||||
print_debug("Changing scene to level %s" % level)
|
||||
get_tree().call_deferred("change_scene_to_file", level)
|
||||
|
||||
func destroy(body) -> void:
|
||||
body.queue_free()
|
||||
@@ -1,8 +1,19 @@
|
||||
class_name Slimer
|
||||
extends Area2D
|
||||
|
||||
@onready var right_cast: RayCast2D = $RightCast
|
||||
@onready var left_cast: RayCast2D = $LeftCast
|
||||
@onready var right_down_cast: RayCast2D = $RightDownCast
|
||||
@onready var left_down_cast: RayCast2D = $LeftDownCast
|
||||
|
||||
var speed : int = 100
|
||||
var direction : int = 1
|
||||
|
||||
signal player_slimed(body, slime)
|
||||
|
||||
func _process(delta: float) -> void:
|
||||
position.x += direction * speed * delta
|
||||
|
||||
func _on_body_entered(body: Node2D) -> void:
|
||||
if body is Player:
|
||||
print_debug("Player hit Slimer")
|
||||
|
||||
Reference in new issue
Block a user