Ver Fonte

:construction: working more on phases

Felix Bytow há 10 meses atrás
pai
commit
b5a0a2cda4

BIN
assets/audio/Begin_V2.wav


+ 24 - 0
assets/audio/Begin_V2.wav.import

@@ -0,0 +1,24 @@
+[remap]
+
+importer="wav"
+type="AudioStreamWAV"
+uid="uid://evkshq2p1b3t"
+path="res://.godot/imported/Begin_V2.wav-416e2b5b74939611846bed7989ec144a.sample"
+
+[deps]
+
+source_file="res://assets/audio/Begin_V2.wav"
+dest_files=["res://.godot/imported/Begin_V2.wav-416e2b5b74939611846bed7989ec144a.sample"]
+
+[params]
+
+force/8_bit=false
+force/mono=false
+force/max_rate=false
+force/max_rate_hz=44100
+edit/trim=true
+edit/normalize=false
+edit/loop_mode=1
+edit/loop_begin=0
+edit/loop_end=-1
+compress/mode=0

BIN
assets/audio/Success_V2.wav


+ 24 - 0
assets/audio/Success_V2.wav.import

@@ -0,0 +1,24 @@
+[remap]
+
+importer="wav"
+type="AudioStreamWAV"
+uid="uid://b74te21vx8th"
+path="res://.godot/imported/Success_V2.wav-916248dab2f46bb040d425a6535536a3.sample"
+
+[deps]
+
+source_file="res://assets/audio/Success_V2.wav"
+dest_files=["res://.godot/imported/Success_V2.wav-916248dab2f46bb040d425a6535536a3.sample"]
+
+[params]
+
+force/8_bit=false
+force/mono=false
+force/max_rate=false
+force/max_rate_hz=44100
+edit/trim=true
+edit/normalize=false
+edit/loop_mode=1
+edit/loop_begin=0
+edit/loop_end=-1
+compress/mode=0

+ 3 - 0
assets/scenes/bot.gd

@@ -20,6 +20,9 @@ func get_base_center() -> Vector2:
 	return base.get_child(0).global_position
 
 func _physics_process(delta: float) -> void:
+	if not visible:
+		return
+	
 	if base != null:
 		global_position = global_position.move_toward(get_base_center(), speed * delta)
 

+ 1 - 4
assets/scenes/player_spawn_zone.gd

@@ -1,14 +1,11 @@
 extends Area2D
+class_name PlayerSpawnZone
 
 @onready var shape: CollisionShape2D = $CollisionShape2D
 @onready var markers: Node2D = $Markers
 
 const DEMON_SCENE: PackedScene = preload("res://assets/scenes/demon.tscn")
 
-func _ready():
-	add_survivor()
-	add_survivor()
-
 func add_survivor() -> void:
 	var spot = find_first_free_spot()
 	if spot == null:

+ 2 - 1
assets/scenes/transition.gd

@@ -23,8 +23,9 @@ func slide_out():
 	await animation_player.animation_finished
 	game_fully_visible.emit()
 
-func transition(display_text: String = ""):
+func transition(display_text: String = "", callback: Callable = Callable()):
 	text = display_text
 	slide_in()
+	callback.call()
 	await get_tree().create_timer(2).timeout
 	slide_out()

+ 89 - 8
screens/game.gd

@@ -3,9 +3,15 @@ extends Node2D
 @onready var health_bar: HealthBar = $HealthBar
 @onready var overlay: CanvasLayer = $Overlay
 @onready var transition: Transition = $Overlay/Transition
+@onready var player_spawn: PlayerSpawnZone = $PlayerSpawnZone
 @onready var spawn_timer: Timer = $Timer
 @onready var ui_root: Control = $UI/Root
 @onready var wave_label: Label = $UI/Root/WaveLabel
+@onready var phase_label: Label = $UI/Root/PhaseLabel
+@onready var next_phase_button: Button = $UI/Root/NextPhaseButton
+
+@onready var combat_start_sound: AudioStreamPlayer = $Sounds/CombatStartSound
+@onready var combat_end_sound: AudioStreamPlayer = $Sounds/CombatEndSound
 
 @onready var main_menu: PackedScene = load("res://screens/main_menu.tscn")
 @onready var bot_scene: PackedScene = load("res://assets/scenes/bot.tscn")
@@ -23,7 +29,17 @@ enum Phase {
 	PHASE_LOOT,
 }
 
-var phase: Phase = Phase.PHASE_SETUP
+var phase: Phase = Phase.PHASE_SETUP:
+	set(new_value):
+		phase = new_value
+		match new_value:
+			Phase.PHASE_SETUP:
+				phase_label.text = "PHASE: SETUP"
+			Phase.PHASE_COMBAT:
+				phase_label.text = "PHASE: COMBAT"
+			Phase.PHASE_LOOT:
+				phase_label.text = "PHASE: LOOT"
+
 var waves_completed: int = 0:
 	set(new_value):
 		waves_completed = new_value
@@ -31,15 +47,18 @@ var waves_completed: int = 0:
 
 func _ready() -> void:
 	waves_completed = 0
+	phase = Phase.PHASE_SETUP
 	overlay.visible = true
 	transition.slide_out()
 	await transition.game_fully_visible
-	spawn_bot()
 
 func _process(_delta: float) -> void:
 	if Input.is_action_pressed("ui_cancel"):
 		go_to_main_menu()
-		
+	if phase == Phase.PHASE_COMBAT:
+		if get_foes().is_empty():
+			end_combat()
+
 func go_to_main_menu() -> void:
 	var tree = get_tree()
 	transition.text = ""
@@ -48,15 +67,44 @@ func go_to_main_menu() -> void:
 	await transition.game_fully_hidden
 	tree.change_scene_to_packed(main_menu)
 	tree.paused = false
-		
-func spawn_bot() -> void:
-	var spawn = spawn_points.pick_random()
-	var bot = bot_scene.instantiate()
+
+func spawn_bot(spawn: Marker2D) -> void:
+	var bot: Bot = bot_scene.instantiate()
 	bot.global_position = spawn.global_position
+	bot.visible = false
 	add_child(bot)
 
+func get_foes() -> Array[Area2D]:
+	var foes: Array[Area2D] = []
+	foes.assign(get_tree().get_nodes_in_group("foe"))
+	return foes
+
+func get_survivors() -> Array[Area2D]:
+	var survivors: Array[Area2D] = []
+	survivors.assign(get_tree().get_nodes_in_group("survivor"))
+	return survivors
+
+func get_waiting_foes() -> Array[Area2D]:
+	return get_foes().filter(func (foe): return not foe.visible)
+
+func get_active_foes() -> Array[Area2D]:
+	return get_foes().filter(func (foe): return foe.visible)
+	
+func activate_foe() -> void:
+	var foes = get_waiting_foes()
+	if not foes.is_empty():
+		foes.pick_random().visible = true
+
+func reset_survivors() -> void:
+	var survivors = get_survivors()
+	for survivor in survivors:
+		survivor.reparent(self)
+	for survivor in survivors:
+		player_spawn.drop(survivor)
+		survivor.position = Vector2.ZERO
+
 func _on_timer_timeout() -> void:
-	spawn_bot()
+	activate_foe()
 
 func base_hit() -> void:
 	health_bar.health -= 1
@@ -79,3 +127,36 @@ func game_over() -> void:
 func _on_base_area_entered(area: Area2D) -> void:
 	if area.is_in_group("foe") || area.is_in_group("foe_weapons"):
 		base_hit()
+
+func start_combat() -> void:
+	for n in (waves_completed + 1):
+		var spawner = spawn_points.pick_random()
+		spawn_bot(spawner)
+	spawn_timer.wait_time = 3.5
+	spawn_timer.start()
+	combat_start_sound.play()
+	activate_foe()
+
+func end_combat() -> void:
+	phase = Phase.PHASE_LOOT
+	next_phase_button.disabled = false
+	next_phase_button.text = "ACCEPT"
+	spawn_timer.stop()
+	combat_end_sound.play()
+
+func _on_next_phase_button_pressed() -> void:
+	match phase:
+		Phase.PHASE_SETUP:
+			phase = Phase.PHASE_COMBAT
+			next_phase_button.disabled = true
+			start_combat()
+		Phase.PHASE_COMBAT:
+			pass # this should not happen
+		Phase.PHASE_LOOT:
+			var next_wave = waves_completed + 2
+			transition.transition("WAVE %d" % next_wave, func ():
+				self.waves_completed += 1
+				self.phase = Phase.PHASE_SETUP
+				self.next_phase_button.text = "NEXT PHASE"
+				self.reset_survivors()
+			)

+ 48 - 16
screens/game.tscn

@@ -1,24 +1,20 @@
-[gd_scene load_steps=12 format=3 uid="uid://c483fkssc36s"]
+[gd_scene load_steps=13 format=3 uid="uid://c483fkssc36s"]
 
 [ext_resource type="Script" path="res://screens/game.gd" id="1_4dd0q"]
 [ext_resource type="Texture2D" uid="uid://ceelbowk0q0rl" path="res://assets/textures/room/Light_Overlay.png" id="2_px5xi"]
 [ext_resource type="PackedScene" uid="uid://odwutyui6q5g" path="res://assets/scenes/health_bar.tscn" id="2_x77og"]
 [ext_resource type="PackedScene" uid="uid://c27ceu18q8eyr" path="res://assets/scenes/room.tscn" id="3_hm7l7"]
 [ext_resource type="PackedScene" uid="uid://ce8cu4romympf" path="res://assets/scenes/transition.tscn" id="4_yc6k4"]
-[ext_resource type="FontFile" uid="uid://cqtognhaksl7j" path="res://assets/fonts/Potra.ttf" id="5_6ktvk"]
+[ext_resource type="LabelSettings" uid="uid://dcy2uk6m62egc" path="res://screens/ui_label_settings.tres" id="5_wbjut"]
 [ext_resource type="PackedScene" uid="uid://cbmr1tbvbheda" path="res://assets/scenes/survivor_spot.tscn" id="6_c1csp"]
 [ext_resource type="PackedScene" uid="uid://bw0opjv1ewa8b" path="res://assets/scenes/player_spawn_zone.tscn" id="7_k4x0x"]
+[ext_resource type="AudioStream" uid="uid://evkshq2p1b3t" path="res://assets/audio/Begin_V2.wav" id="9_eq4qn"]
+[ext_resource type="AudioStream" uid="uid://b74te21vx8th" path="res://assets/audio/Success_V2.wav" id="10_w3850"]
 
 [sub_resource type="CanvasItemMaterial" id="CanvasItemMaterial_yhw6y"]
 blend_mode = 1
 light_mode = 1
 
-[sub_resource type="LabelSettings" id="LabelSettings_acclg"]
-font = ExtResource("5_6ktvk")
-font_size = 38
-outline_size = 3
-outline_color = Color(0, 0, 0, 1)
-
 [sub_resource type="RectangleShape2D" id="RectangleShape2D_p2163"]
 size = Vector2(472, 288)
 
@@ -38,8 +34,6 @@ texture = ExtResource("2_px5xi")
 position = Vector2(640, 73)
 
 [node name="Timer" type="Timer" parent="."]
-wait_time = 3.5
-autostart = true
 
 [node name="UI" type="CanvasLayer" parent="."]
 layer = 9
@@ -58,14 +52,43 @@ layout_mode = 1
 anchors_preset = 2
 anchor_top = 1.0
 anchor_bottom = 1.0
-offset_left = 10.0
-offset_top = -61.0
-offset_right = 255.0
-offset_bottom = -10.0
+offset_top = -46.0
+offset_right = 224.0
 grow_vertical = 0
 text = "WAVE: 9999"
-label_settings = SubResource("LabelSettings_acclg")
-vertical_alignment = 2
+label_settings = ExtResource("5_wbjut")
+vertical_alignment = 1
+
+[node name="PhaseLabel" type="Label" parent="UI/Root"]
+layout_mode = 1
+anchors_preset = 7
+anchor_left = 0.5
+anchor_top = 1.0
+anchor_right = 0.5
+anchor_bottom = 1.0
+offset_left = -123.5
+offset_top = -46.0
+offset_right = 123.5
+grow_horizontal = 2
+grow_vertical = 0
+text = "PHASE: SETUP"
+label_settings = ExtResource("5_wbjut")
+horizontal_alignment = 1
+vertical_alignment = 1
+
+[node name="NextPhaseButton" type="Button" parent="UI/Root"]
+layout_mode = 1
+anchors_preset = 3
+anchor_left = 1.0
+anchor_top = 1.0
+anchor_right = 1.0
+anchor_bottom = 1.0
+offset_left = -103.0
+offset_top = -31.0
+grow_horizontal = 0
+grow_vertical = 0
+theme_override_font_sizes/font_size = 34
+text = "NEXT PHASE"
 
 [node name="Overlay" type="CanvasLayer" parent="."]
 layer = 10
@@ -123,5 +146,14 @@ position = Vector2(778, 511)
 [node name="SurvivorSpot6" parent="SurvivorSpots" instance=ExtResource("6_c1csp")]
 position = Vector2(778, 570)
 
+[node name="Sounds" type="Node" parent="."]
+
+[node name="CombatStartSound" type="AudioStreamPlayer" parent="Sounds"]
+stream = ExtResource("9_eq4qn")
+
+[node name="CombatEndSound" type="AudioStreamPlayer" parent="Sounds"]
+stream = ExtResource("10_w3850")
+
 [connection signal="timeout" from="Timer" to="." method="_on_timer_timeout"]
+[connection signal="pressed" from="UI/Root/NextPhaseButton" to="." method="_on_next_phase_button_pressed"]
 [connection signal="area_entered" from="Base" to="." method="_on_base_area_entered"]

+ 9 - 0
screens/ui_label_settings.tres

@@ -0,0 +1,9 @@
+[gd_resource type="LabelSettings" load_steps=2 format=3 uid="uid://dcy2uk6m62egc"]
+
+[ext_resource type="FontFile" uid="uid://cqtognhaksl7j" path="res://assets/fonts/Potra.ttf" id="1_ycyx4"]
+
+[resource]
+font = ExtResource("1_ycyx4")
+font_size = 38
+outline_size = 3
+outline_color = Color(0, 0, 0, 1)