Winning turned statistics off and nothing turned them back on, while the Settings checkbox still showed them as on. Resetting points now turns them back on if the win turned them off, and the checkbox shows the current state when Settings is opened. A winning score of 1 could never be won and with 2 the first point was not announced as match point, because the first-point check ran first. The winning score also could not be kept from going below 1.
64 lines
1.8 KiB
GDScript
64 lines
1.8 KiB
GDScript
extends RefCounted
|
|
class_name PlayerObject
|
|
|
|
signal first_point_triggerd
|
|
signal match_point_triggerd
|
|
signal winner_triggerd
|
|
signal point_given_sound
|
|
signal player_point_given
|
|
signal player_point_taken
|
|
|
|
## Unique id that never changes, unlike the player's position in Settings.player_array.
|
|
var id: String = _generate_uuid()
|
|
|
|
@export
|
|
var player_name: String
|
|
|
|
@export
|
|
var player_score: int
|
|
|
|
var is_first_point: bool = true
|
|
|
|
var character: Texture = load("res://noCharacter.png")
|
|
|
|
func _init(new_name: String) -> void:
|
|
player_name = new_name
|
|
player_score = 0
|
|
|
|
## Returns a random version 4 UUID, e.g. "3f2b8c1e-9a4d-4e7f-b2c6-5d8e1f0a7b93".
|
|
static func _generate_uuid() -> String:
|
|
var bytes: PackedByteArray = Crypto.new().generate_random_bytes(16)
|
|
bytes[6] = (bytes[6] & 0x0f) | 0x40
|
|
bytes[8] = (bytes[8] & 0x3f) | 0x80
|
|
var hex: String = bytes.hex_encode()
|
|
return "%s-%s-%s-%s-%s" % [hex.substr(0, 8), hex.substr(8, 4), hex.substr(12, 4), hex.substr(16, 4), hex.substr(20, 12)]
|
|
|
|
func add_point() -> void:
|
|
if player_score < Settings.winning_score:
|
|
player_score += 1
|
|
player_point_given.emit()
|
|
var first_point: bool = player_score == 1 && is_first_point
|
|
if player_score == 1:
|
|
is_first_point = false
|
|
# With a low winning score the first point can also be match point or the win,
|
|
# so the more important event is checked first
|
|
if player_score == Settings.winning_score:
|
|
winner_triggerd.emit()
|
|
elif player_score == Settings.winning_score - 1:
|
|
match_point_triggerd.emit()
|
|
elif first_point:
|
|
first_point_triggerd.emit()
|
|
else:
|
|
point_given_sound.emit()
|
|
|
|
func minus_point() -> void:
|
|
if player_score > 0:
|
|
player_score -= 1
|
|
player_point_taken.emit()
|
|
if player_score == 0:
|
|
is_first_point = true
|
|
|
|
func reset_points() -> void:
|
|
player_score = 0
|
|
is_first_point = true
|