Deathmatch loop + groundwork for announcer

remotes/1705725415861086127/tmp_refs/heads/main
unfa 2021-09-25 00:15:44 +02:00
parent a4d81eab8e
commit a0468884ed
21 changed files with 288 additions and 10 deletions

View File

@ -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

BIN
Game/Assets/Announcer/Defeat.wav (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -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

BIN
Game/Assets/Announcer/EmbarrassingDefeat.wav (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -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

BIN
Game/Assets/Announcer/GetReady.wav (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -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

BIN
Game/Assets/Announcer/Glory.wav (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -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

BIN
Game/Assets/Announcer/Go.wav (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -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

BIN
Game/Assets/Announcer/MercilessVictory.wav (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -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

BIN
Game/Assets/Announcer/Shame.wav (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -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

BIN
Game/Assets/Announcer/Victory.wav (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -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

View File

@ -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

View File

@ -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()

View File

@ -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"),
# ]

View File

@ -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"]