diff --git a/Game/Assets/Announcer/Announcer.gd b/Game/Assets/Announcer/Announcer.gd new file mode 100644 index 0000000..2dd5910 --- /dev/null +++ b/Game/Assets/Announcer/Announcer.gd @@ -0,0 +1,25 @@ +extends AudioStreamPlayer + +@onready var go = preload("res://Assets/Announcer/Go.wav") +@onready var defeat = preload("res://Assets/Announcer/Defeat.wav") +@onready var shame = preload("res://Assets/Announcer/Shame.wav") +@onready var victory = preload("res://Assets/Announcer/Victory.wav") +@onready var getready = preload("res://Assets/Announcer/GetReady.wav") +@onready var victory2 = preload("res://Assets/Announcer/MercilessVictory.wav") +@onready var defeat2 = preload("res://Assets/Announcer/EmbarrassingDefeat.wav") + +# Declare member variables here. Examples: +# var a = 2 +# var b = "text" + +func speak(sound): + stream = sound + play() +# Called when the node enters the scene tree for the first time. +#func _ready(): +# pass # Replace with function body. +# + +# Called every frame. 'delta' is the elapsed time since the previous frame. +#func _process(delta): +# pass diff --git a/Game/Assets/Announcer/Defeat.wav b/Game/Assets/Announcer/Defeat.wav new file mode 100644 index 0000000..280a38a --- /dev/null +++ b/Game/Assets/Announcer/Defeat.wav @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c5ef712e2a0fce35129b935bf4f8c8ce469fc8134e5a697fce7ee5f9c4ae6fce +size 131148 diff --git a/Game/Assets/Announcer/Defeat.wav.import b/Game/Assets/Announcer/Defeat.wav.import new file mode 100644 index 0000000..8f21b08 --- /dev/null +++ b/Game/Assets/Announcer/Defeat.wav.import @@ -0,0 +1,22 @@ +[remap] + +importer="wav" +type="AudioStreamSample" +uid="uid://g8ujakh2o4yk" +path="res://.godot/imported/Defeat.wav-940ff20117eaf3a536cd63a745c97675.sample" + +[deps] + +source_file="res://Assets/Announcer/Defeat.wav" +dest_files=["res://.godot/imported/Defeat.wav-940ff20117eaf3a536cd63a745c97675.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop=false +compress/mode=0 diff --git a/Game/Assets/Announcer/EmbarrassingDefeat.wav b/Game/Assets/Announcer/EmbarrassingDefeat.wav new file mode 100644 index 0000000..99142e0 --- /dev/null +++ b/Game/Assets/Announcer/EmbarrassingDefeat.wav @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4b9ba542e0475f17f4be4f37015151fff81818aba529eba67140420882314b77 +size 228140 diff --git a/Game/Assets/Announcer/EmbarrassingDefeat.wav.import b/Game/Assets/Announcer/EmbarrassingDefeat.wav.import new file mode 100644 index 0000000..6b06ec2 --- /dev/null +++ b/Game/Assets/Announcer/EmbarrassingDefeat.wav.import @@ -0,0 +1,22 @@ +[remap] + +importer="wav" +type="AudioStreamSample" +uid="uid://bykf60gm2ohda" +path="res://.godot/imported/EmbarrassingDefeat.wav-adc71dfc4dd5744407c7de4e7bd3fc72.sample" + +[deps] + +source_file="res://Assets/Announcer/EmbarrassingDefeat.wav" +dest_files=["res://.godot/imported/EmbarrassingDefeat.wav-adc71dfc4dd5744407c7de4e7bd3fc72.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop=false +compress/mode=0 diff --git a/Game/Assets/Announcer/GetReady.wav b/Game/Assets/Announcer/GetReady.wav new file mode 100644 index 0000000..c249161 --- /dev/null +++ b/Game/Assets/Announcer/GetReady.wav @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:78681a4991a0f1077e9f789601b63b81e7362cee5a5e17c5f3f09ed243e25a44 +size 148136 diff --git a/Game/Assets/Announcer/GetReady.wav.import b/Game/Assets/Announcer/GetReady.wav.import new file mode 100644 index 0000000..b688428 --- /dev/null +++ b/Game/Assets/Announcer/GetReady.wav.import @@ -0,0 +1,22 @@ +[remap] + +importer="wav" +type="AudioStreamSample" +uid="uid://dvasit8hgfgv7" +path="res://.godot/imported/GetReady.wav-92e4960efea123e7062765a73f3e99eb.sample" + +[deps] + +source_file="res://Assets/Announcer/GetReady.wav" +dest_files=["res://.godot/imported/GetReady.wav-92e4960efea123e7062765a73f3e99eb.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop=false +compress/mode=0 diff --git a/Game/Assets/Announcer/Glory.wav b/Game/Assets/Announcer/Glory.wav new file mode 100644 index 0000000..30f5a9c --- /dev/null +++ b/Game/Assets/Announcer/Glory.wav @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4462d1831527165dc680384c48d4d083f43614d2a3ffedf5cf02238fba1372ea +size 126582 diff --git a/Game/Assets/Announcer/Glory.wav.import b/Game/Assets/Announcer/Glory.wav.import new file mode 100644 index 0000000..392eb7a --- /dev/null +++ b/Game/Assets/Announcer/Glory.wav.import @@ -0,0 +1,22 @@ +[remap] + +importer="wav" +type="AudioStreamSample" +uid="uid://cdwa5gk5iur7o" +path="res://.godot/imported/Glory.wav-5c143d687722b4a29e8f1f2f4c4c0b9e.sample" + +[deps] + +source_file="res://Assets/Announcer/Glory.wav" +dest_files=["res://.godot/imported/Glory.wav-5c143d687722b4a29e8f1f2f4c4c0b9e.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop=false +compress/mode=0 diff --git a/Game/Assets/Announcer/Go.wav b/Game/Assets/Announcer/Go.wav new file mode 100644 index 0000000..4e38521 --- /dev/null +++ b/Game/Assets/Announcer/Go.wav @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8853a877ddd5e8338deb9e985443d75f17e72e36dc5565179eab50aac94248e4 +size 82452 diff --git a/Game/Assets/Announcer/Go.wav.import b/Game/Assets/Announcer/Go.wav.import new file mode 100644 index 0000000..fcdfad7 --- /dev/null +++ b/Game/Assets/Announcer/Go.wav.import @@ -0,0 +1,22 @@ +[remap] + +importer="wav" +type="AudioStreamSample" +uid="uid://j42e203vte7h" +path="res://.godot/imported/Go.wav-e46aab702b2a0ae76aa2451889d5a683.sample" + +[deps] + +source_file="res://Assets/Announcer/Go.wav" +dest_files=["res://.godot/imported/Go.wav-e46aab702b2a0ae76aa2451889d5a683.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop=false +compress/mode=0 diff --git a/Game/Assets/Announcer/MercilessVictory.wav b/Game/Assets/Announcer/MercilessVictory.wav new file mode 100644 index 0000000..66e4def --- /dev/null +++ b/Game/Assets/Announcer/MercilessVictory.wav @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:07d2f36d91c74628e113d4c01abd9a0446e953192a0026f10697a6b658f73246 +size 233202 diff --git a/Game/Assets/Announcer/MercilessVictory.wav.import b/Game/Assets/Announcer/MercilessVictory.wav.import new file mode 100644 index 0000000..aa84d7b --- /dev/null +++ b/Game/Assets/Announcer/MercilessVictory.wav.import @@ -0,0 +1,22 @@ +[remap] + +importer="wav" +type="AudioStreamSample" +uid="uid://o01umcbsq076" +path="res://.godot/imported/MercilessVictory.wav-f2ea939eb3be6aa6b368e51f4e9401b8.sample" + +[deps] + +source_file="res://Assets/Announcer/MercilessVictory.wav" +dest_files=["res://.godot/imported/MercilessVictory.wav-f2ea939eb3be6aa6b368e51f4e9401b8.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop=false +compress/mode=0 diff --git a/Game/Assets/Announcer/Shame.wav b/Game/Assets/Announcer/Shame.wav new file mode 100644 index 0000000..fb47281 --- /dev/null +++ b/Game/Assets/Announcer/Shame.wav @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c9074d67e0578b7ddd3d4526d8870bbf91d4f920f795fbab45626cbf4718d017 +size 161500 diff --git a/Game/Assets/Announcer/Shame.wav.import b/Game/Assets/Announcer/Shame.wav.import new file mode 100644 index 0000000..291dc7d --- /dev/null +++ b/Game/Assets/Announcer/Shame.wav.import @@ -0,0 +1,22 @@ +[remap] + +importer="wav" +type="AudioStreamSample" +uid="uid://hhgebul4fpne" +path="res://.godot/imported/Shame.wav-b1b467df7aa71b7836d38795a61cb394.sample" + +[deps] + +source_file="res://Assets/Announcer/Shame.wav" +dest_files=["res://.godot/imported/Shame.wav-b1b467df7aa71b7836d38795a61cb394.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop=false +compress/mode=0 diff --git a/Game/Assets/Announcer/Victory.wav b/Game/Assets/Announcer/Victory.wav new file mode 100644 index 0000000..5681f3c --- /dev/null +++ b/Game/Assets/Announcer/Victory.wav @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3b326d4677952812314f31f94809c266e5af8dfb16f357e0e1835dc3f2b4e1e9 +size 138374 diff --git a/Game/Assets/Announcer/Victory.wav.import b/Game/Assets/Announcer/Victory.wav.import new file mode 100644 index 0000000..519c4b4 --- /dev/null +++ b/Game/Assets/Announcer/Victory.wav.import @@ -0,0 +1,22 @@ +[remap] + +importer="wav" +type="AudioStreamSample" +uid="uid://by41bhyiaw37" +path="res://.godot/imported/Victory.wav-06a91392bcecddb538e4b68d157b59a0.sample" + +[deps] + +source_file="res://Assets/Announcer/Victory.wav" +dest_files=["res://.godot/imported/Victory.wav-06a91392bcecddb538e4b68d157b59a0.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop=false +compress/mode=0 diff --git a/Game/Assets/HUD/HUD.gd b/Game/Assets/HUD/HUD.gd index 21a0885..d252008 100644 --- a/Game/Assets/HUD/HUD.gd +++ b/Game/Assets/HUD/HUD.gd @@ -9,6 +9,9 @@ extends Control # Called when the node enters the scene tree for the first time. func _ready(): pass # Replace with function body. + +func game_over(winner): + scoretab(true, winner) func update_scoretab(): $ScoreTable/VBoxContainer/ScoreTab.text = '' @@ -26,12 +29,17 @@ func update_scoretab(): if main.player_list.get(j).score == i: $ScoreTable/VBoxContainer/ScoreTab.text += str(i) + " - " + main.player_list.get(j).name + "\n" -func scoretab(show := true): +func scoretab(show: bool, winner = null): if show: update_scoretab() $ScoreTable.show() else: $ScoreTable.hide() + + if winner: + $ScoreTable/VBoxContainer/Header.text = "Match over! Player " + main.player_list.get(winner).name + " won!" + else: + $ScoreTable/VBoxContainer/Header.text = "Playing dethmatch until " + str(main.game_score_limit) + " kills" # Called every frame. 'delta' is the elapsed time since the previous frame. func _process(delta): # if main.local_player == null: # player is dead ATM diff --git a/Game/Assets/Weapons/Weapon.gd b/Game/Assets/Weapons/Weapon.gd index 88a82ca..1b113a4 100644 --- a/Game/Assets/Weapons/Weapon.gd +++ b/Game/Assets/Weapons/Weapon.gd @@ -44,6 +44,7 @@ var impact_player = preload("res://Assets/Effects/ImpactBlood.tscn") main.player_list.players[player.get_multiplayer_authority()].score += 1 # give the killer a point main.rpc(&'player_list_update', main.player_list.get(player.get_multiplayer_authority()).serialize(), player.get_multiplayer_authority()) hud.get_node("Crosshair").kill() + main.check_game_win_condition() # update local HUD else: hud.get_node("Crosshair").hit() diff --git a/Game/Main.gd b/Game/Main.gd index 07afad7..9701139 100644 --- a/Game/Main.gd +++ b/Game/Main.gd @@ -68,10 +68,12 @@ class PlayerInfo: #func generate(): var uptime = 0 # seconds -const respawn_delay = 5 # seconds +const respawn_delay = 3 # seconds +const reset_delay = 10 # seconds var spawn_queue = {} +var reset_at = -1 -var game_score_limit = 15 +var game_score_limit = 10 #15 const destroy_free_player_crash_workaround = true @@ -93,12 +95,28 @@ func _process(delta): if local_player: $Label.text += "\n\nLOCAL PLAYER DEAD: " + str(local_player.dead) + $Label.text += "\n\nGAME RESET AT: " + str(reset_at) + # respawn queue for i in spawn_queue.keys(): if spawn_queue[i] <= uptime: var is_local = true if i == get_tree().multiplayer.get_unique_id() else false create_player(i, is_local, true) spawn_queue.erase(i) + + # 3 seconds left to new round + if 0 < reset_at and (uptime + 3.0) >= reset_at: + $Announcer.speak($Announcer.getready) + + # starting new round + if 0 < reset_at and uptime >= reset_at: + for i in player_list.players.keys(): + player_list.players[i].score = 0 + + hud.scoretab(false) + local_player.dead = false + reset_at = -1 + $Announcer.speak($Announcer.go) class PlayerList: var players = {} @@ -153,26 +171,29 @@ func _input(_event) -> void: elif Input.is_action_just_released("show_scoretab"): hud.scoretab(false) -func game_over(): - pass +@rpc(any, sync, reliable) func game_over(winner): + local_player.rpc(&'set_dead', true) + hud.game_over(winner) + for j in player_list.players.keys(): + spawn_queue.clear() + spawn_queue[j] = uptime + reset_delay + reset_at = uptime + reset_delay func check_game_win_condition(): for i in player_list.players.keys(): if player_list.players[i].score >= game_score_limit: - chat.rpc(&'chat_notification', "Player " + player_list.players[i].name + " has won this round!") - game_over() + chat.rpc(&'chat_notification', "Player [color=" + player_list.players[i].color.to_html() + "]" + player_list.players[i].name + "[/color] has won this round!") + rpc(&'game_over', i) func update_hud(): ### Health - hud.get_node("Stats").get_node("HealthBar").value = player_list.get( get_tree().multiplayer.get_unique_id() ).health if player_list.players.size() <= 1: return # if we're the sole player in the server, stop here ### SCORE, RANK, GAP/LEAD - hud.get_node("ScoreRank").text = "SCORE: " + str(player_list.get( get_tree().multiplayer.get_unique_id() ).score) var score = player_list.get( get_tree().multiplayer.get_unique_id() ).score @@ -215,6 +236,7 @@ func update_hud(): # update local HUD update_hud() + #check_game_win_condition() func push_local_player_info(): # var pid = get_tree().multiplayer.get_unique_id() @@ -403,3 +425,14 @@ func _on_CheckButton_toggled(button_pressed): func _on_Button_pressed(): destroy_player(get_tree().multiplayer.get_unique_id()) + + +### sound preloads to force Godot to pakcage theh in game exports (this is a bug workaround) + +#var required_sounds = [ null, +# preload("res://Assets/SFX/Player_Death_01.wav"), +# preload("res://Assets/SFX/Player_Death_02.wav"), +# preload("res://Assets/SFX/Player_Pain_01.wav"), +# preload("res://Assets/SFX/Player_Pain_02.wav"), +# preload("res://Assets/SFX/Player_Pain_03.wav"), +# ] diff --git a/Game/Main.tscn b/Game/Main.tscn index 42199ff..7d2a0ab 100644 --- a/Game/Main.tscn +++ b/Game/Main.tscn @@ -1,9 +1,11 @@ -[gd_scene load_steps=5 format=3 uid="uid://o68cawatyat2"] +[gd_scene load_steps=7 format=3 uid="uid://o68cawatyat2"] [ext_resource type="PackedScene" uid="uid://b1078bn8gy2qf" path="res://Map.tscn" id="1"] [ext_resource type="PackedScene" uid="uid://b856vwmg8a6o4" path="res://Assets/UI/GUI.tscn" id="2"] [ext_resource type="Script" path="res://Main.gd" id="3"] [ext_resource type="PackedScene" uid="uid://bff5uslrxesjx" path="res://Assets/HUD/HUD.tscn" id="4"] +[ext_resource type="AudioStream" uid="uid://j42e203vte7h" path="res://Assets/Announcer/Go.wav" id="5_ilayd"] +[ext_resource type="Script" path="res://Assets/Announcer/Announcer.gd" id="6_gcsgr"] [node name="Main" type="Node"] script = ExtResource( "3" ) @@ -30,9 +32,12 @@ structured_text_bidi_override_options = [] structured_text_bidi_override_options = [] [node name="Header" parent="HUD/ScoreTable/VBoxContainer" index="0"] +offset_bottom = 45.0 +theme_override_font_sizes/font_size = 30 structured_text_bidi_override_options = [] [node name="ScoreTab" parent="HUD/ScoreTable/VBoxContainer" index="1"] +offset_top = 49.0 custom_effects = [] structured_text_bidi_override_options = [] @@ -111,6 +116,7 @@ text = "KILL YOURSELF" script = null [node name="Label" type="Label" parent="."] +visible = false offset_right = 505.0 offset_bottom = 238.0 structured_text_bidi_override_options = [] @@ -124,6 +130,11 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 17, 0) visible = false script = null +[node name="Announcer" type="AudioStreamPlayer" parent="."] +stream = ExtResource( "5_ilayd" ) +bus = &"Announcer" +script = ExtResource( "6_gcsgr" ) + [connection signal="toggled" from="NetworkTesting/CheckButton" to="." method="_on_CheckButton_toggled"] [connection signal="pressed" from="NetworkTesting/Host" to="." method="_on_Host_pressed"] [connection signal="pressed" from="NetworkTesting/Connect" to="." method="_on_Connect_pressed"]