fuzzyworld

godot-shooter / commit

Weapon pick-ups are now 10 rockets, which start to fire automatically, then revert back to laser (default weapon) when the rockets run out.

c2827327ef737819340b88798957f7b7f3b5d5cf · Pavel Safronov · 2023-11-10 11:40:57 -0800 · parents 5b0483c17074

Weapon pick-ups are now 10 rockets, which start to fire automatically, then revert back to laser (default weapon) when the rockets run out.
Picking up another rocket packet gives the player 10 more rockets.
 HUD.gd     | 11 +++++++----
 HUD.tscn   | 35 ++++++++++++++++++++++++++---------
 Player.gd  |  5 +++++
 Weapon.gd  |  2 ++
 Weapons.gd |  3 +++
 World.gd   | 13 +++++++++----
 6 files changed, 52 insertions(+), 17 deletions(-)

diff --git a/HUD.gd b/HUD.gd
index 8cb26eb..c259042 100644
--- a/HUD.gd
+++ b/HUD.gd
@@ -8,8 +8,10 @@ signal debug_signal
 
 onready var label = $CanvasLayer/MessageLabel
 onready var animation_player = $AnimationPlayer
-onready var score_label = $HBoxContainer/Score
+onready var score_label = $MarginContainer2/HBoxContainer/Score
 onready var objective_label = $MarginContainer/HBoxContainer2/Objective
+onready var weapon_label = $MarginContainer2/HBoxContainer/Weapon
+onready var ammo_label = $MarginContainer2/HBoxContainer/Ammo
 
 func _process(_delta: float) -> void:
 	score_label.text = "%s" % score
@@ -48,9 +50,10 @@ func show_message(message: String, duration_seconds: int = 2) -> void:
 	else:
 		animation_player.play(new_fade_in)
 	animation_player.queue(new_fade_out)
-	
-func set_label_text(new_text: String) -> void:
-	label.text = new_text
 
 func _on_PauseButton_pressed() -> void:
 	emit_signal("paused")
+
+func set_current_weapon(weapon: Weapon) -> void:
+	weapon_label.text = "%s:" % weapon.name
+	ammo_label.text = "%s" % weapon.ammo
diff --git a/HUD.tscn b/HUD.tscn
index 5131a60..e06310b 100644
--- a/HUD.tscn
+++ b/HUD.tscn
@@ -56,24 +56,41 @@ margin_bottom = -10.0
 theme = ExtResource( 1 )
 script = ExtResource( 2 )
 
-[node name="HBoxContainer" type="HBoxContainer" parent="."]
-margin_right = 282.0
-margin_bottom = 74.0
+[node name="MarginContainer2" type="MarginContainer" parent="."]
+anchor_right = 1.0
+
+[node name="HBoxContainer" type="HBoxContainer" parent="MarginContainer2"]
+margin_right = 480.0
+margin_bottom = 37.0
 
-[node name="ScoreText" type="Label" parent="HBoxContainer"]
-margin_top = 18.0
+[node name="ScoreText" type="Label" parent="MarginContainer2/HBoxContainer"]
 margin_right = 128.0
-margin_bottom = 55.0
+margin_bottom = 37.0
 text = "Score: "
 
-[node name="Score" type="Label" parent="HBoxContainer"]
+[node name="Score" type="Label" parent="MarginContainer2/HBoxContainer"]
 margin_left = 136.0
-margin_top = 18.0
 margin_right = 198.0
-margin_bottom = 55.0
+margin_bottom = 37.0
 text = "100"
 uppercase = true
 
+[node name="Weapon" type="Label" parent="MarginContainer2/HBoxContainer"]
+margin_left = 312.0
+margin_right = 427.0
+margin_bottom = 37.0
+size_flags_horizontal = 10
+size_flags_vertical = 1
+text = "Laser:"
+align = 2
+valign = 2
+
+[node name="Ammo" type="Label" parent="MarginContainer2/HBoxContainer"]
+margin_left = 435.0
+margin_right = 480.0
+margin_bottom = 37.0
+text = "inf"
+
 [node name="MarginContainer" type="MarginContainer" parent="."]
 anchor_top = 1.0
 anchor_right = 1.0
diff --git a/Player.gd b/Player.gd
index b0b79b9..1dc5b4e 100644
--- a/Player.gd
+++ b/Player.gd
@@ -18,6 +18,7 @@ const Utils = preload("res://Utils.gd")
 const PopupControl = preload("res://Popup.tscn")
 
 var weapon: Weapon
+var default_weapon: Weapon = Weapons.create_basic_gun()
 var dead = false
 var velocity: Vector2
 var can_fire = true
@@ -131,6 +132,10 @@ func shoot_at(pos: Vector2):
 	if !can_fire:
 		return
 	can_fire = false
+	if weapon.ammo != INF:
+		weapon.ammo -= 1
+		if weapon.ammo == 0:
+			weapon = default_weapon
 	$ShotTimer.wait_time = weapon.particle_lifetime_secs
 	$ShotTimer.start()
 	var particle = weapon.particle.instance()
diff --git a/Weapon.gd b/Weapon.gd
index 2f92276..78680a0 100644
--- a/Weapon.gd
+++ b/Weapon.gd
@@ -5,3 +5,5 @@ var shooting_range = 400
 var particle: PackedScene
 var particle_speed = 100
 var particle_lifetime_secs = 5
+var ammo = INF
+var name = "Laser"
diff --git a/Weapons.gd b/Weapons.gd
index 3aa94da..f56be74 100644
--- a/Weapons.gd
+++ b/Weapons.gd
@@ -8,6 +8,7 @@ static func create_basic_gun(period_secs: float = 1) -> Weapon:
 	weapon.particle_lifetime_secs = period_secs
 	weapon.particle_speed = 300
 	weapon.cooldown_seconds = 1
+	weapon.ammo = INF
 	return weapon
 
 static func create_rocket_gun(period_secs: float = 1) -> Weapon:
@@ -17,4 +18,6 @@ static func create_rocket_gun(period_secs: float = 1) -> Weapon:
 	weapon.particle_lifetime_secs = period_secs
 	weapon.particle_speed = 100
 	weapon.cooldown_seconds = 1
+	weapon.ammo = 10
+	weapon.name = "Rocket"
 	return weapon
diff --git a/World.gd b/World.gd
index 6a3cc3b..96a0561 100644
--- a/World.gd
+++ b/World.gd
@@ -13,10 +13,10 @@ var destination: Vector2
 var is_destination_set = false
 var generators = [
 	ConstantItemGenerator.new("create_enemy", self, "enemies", 4),
-	LevelItemGenerator.new(10, "create_health", self, "health", 10),
-#	LevelItemGenerator.new(3, "create_shield", self, "shields", 3),
+	ConstantItemGenerator.new("create_health", self, "health", 10),
+	ConstantItemGenerator.new("create_weapon", self, "weapon", 10),
 	LevelItemGenerator.new(5, "create_gold", self, "gold", 5),
-	LevelItemGenerator.new(5, "create_weapon", self, "weapon", 5),
+#	LevelItemGenerator.new(3, "create_shield", self, "shields", 3),
 ]
 var completed_objectives = 0
 var max_objectives = 5
@@ -34,7 +34,11 @@ func gold_consumed():
 	completed_objectives += 1
 	$UI/HUD.score += 5
 func weapon_consumed():
-	$Player.weapon = Weapons.create_rocket_gun()
+	var is_current_weapon_base = $Player.weapon.ammo	== INF
+	if is_current_weapon_base:
+		$Player.weapon = Weapons.create_rocket_gun()
+	else:
+		$Player.weapon.ammo += 10
 	
 func create_enemy() -> Enemy:
 	var enemy = Enemy.instance()
@@ -120,6 +124,7 @@ func _process(_delta: float) -> void:
 		return
 
 	$UI/HUD.objective = "%s / %s" % [completed_objectives, max_objectives]
+	$UI/HUD.set_current_weapon(player.weapon)
 	var all_done = completed_objectives == max_objectives
 	if all_done:
 		get_tree().paused = true