Deathmatch loop + groundwork for announcer
parent
a4d81eab8e
commit
a0468884ed
|
@ -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
|
Binary file not shown.
|
@ -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
|
Binary file not shown.
|
@ -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
|
Binary file not shown.
|
@ -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
|
Binary file not shown.
|
@ -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
|
Binary file not shown.
|
@ -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
|
Binary file not shown.
|
@ -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
|
Binary file not shown.
|
@ -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
|
Binary file not shown.
|
@ -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
|
|
@ -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
|
||||
|
|
|
@ -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()
|
||||
|
|
49
Game/Main.gd
49
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"),
|
||||
# ]
|
||||
|
|
|
@ -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"]
|
||||
|
|
Reference in New Issue