mirror of
https://github.com/jcreek/CosmicClash.git
synced 2026-09-13 13:02:08 +00:00
feat(*): Add sudden-death overtime with golden goal on a draw
This commit is contained in:
@@ -86,6 +86,9 @@ func _initialize_hud():
|
|||||||
if game_manager and game_manager.has_signal("kickoff_countdown"):
|
if game_manager and game_manager.has_signal("kickoff_countdown"):
|
||||||
game_manager.kickoff_countdown.connect(_on_kickoff_countdown)
|
game_manager.kickoff_countdown.connect(_on_kickoff_countdown)
|
||||||
|
|
||||||
|
if game_manager and game_manager.has_signal("overtime_started"):
|
||||||
|
game_manager.overtime_started.connect(_on_overtime_started)
|
||||||
|
|
||||||
func _connect_ship_signals():
|
func _connect_ship_signals():
|
||||||
# Route ship telemetry to the flight instruments
|
# Route ship telemetry to the flight instruments
|
||||||
if ship.has_signal("speed_changed"):
|
if ship.has_signal("speed_changed"):
|
||||||
@@ -154,6 +157,11 @@ func _flash_score_label(label: Label) -> void:
|
|||||||
tween.tween_property(label, "scale", Vector2(1.4, 1.4), 0.1)
|
tween.tween_property(label, "scale", Vector2(1.4, 1.4), 0.1)
|
||||||
tween.tween_property(label, "scale", Vector2(1.0, 1.0), 0.2)
|
tween.tween_property(label, "scale", Vector2(1.0, 1.0), 0.2)
|
||||||
|
|
||||||
|
func _on_overtime_started():
|
||||||
|
if timer_label and is_instance_valid(timer_label):
|
||||||
|
timer_label.text = "OT"
|
||||||
|
timer_label.add_theme_color_override("font_color", Color(1.0, 0.85, 0.2))
|
||||||
|
|
||||||
func _on_kickoff_countdown(count: int):
|
func _on_kickoff_countdown(count: int):
|
||||||
if not kickoff_label or not is_instance_valid(kickoff_label):
|
if not kickoff_label or not is_instance_valid(kickoff_label):
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -7,10 +7,12 @@ extends GameMode
|
|||||||
|
|
||||||
signal timer_updated(minutes: int, seconds: int)
|
signal timer_updated(minutes: int, seconds: int)
|
||||||
signal score_changed(score: Dictionary)
|
signal score_changed(score: Dictionary)
|
||||||
# winning_team is -1 for a draw.
|
# winning_team is -1 for a draw. Never -1 when reached via overtime.
|
||||||
signal match_ended(winning_team: int, score: Dictionary)
|
signal match_ended(winning_team: int, score: Dictionary)
|
||||||
# Counts 3, 2, 1, then 0 ("go", hide the label).
|
# Counts 3, 2, 1, then 0 ("go", hide the label).
|
||||||
signal kickoff_countdown(count: int)
|
signal kickoff_countdown(count: int)
|
||||||
|
# Full time ended level: sudden-death golden goal, no clock.
|
||||||
|
signal overtime_started
|
||||||
|
|
||||||
# How long the result overlay stays up before returning to the menu.
|
# How long the result overlay stays up before returning to the menu.
|
||||||
const RESULT_SCREEN_SECONDS := 5.0
|
const RESULT_SCREEN_SECONDS := 5.0
|
||||||
@@ -27,6 +29,7 @@ const KICKOFF_COUNTDOWN_SECONDS := 3
|
|||||||
|
|
||||||
var score := {0: 0, 1: 0}
|
var score := {0: 0, 1: 0}
|
||||||
var match_timer: Timer
|
var match_timer: Timer
|
||||||
|
var _in_overtime := false
|
||||||
|
|
||||||
|
|
||||||
func _start() -> void:
|
func _start() -> void:
|
||||||
@@ -71,6 +74,10 @@ func _on_goal_scored(conceding_team: int) -> void:
|
|||||||
score[scoring_team] += 1
|
score[scoring_team] += 1
|
||||||
score_changed.emit(score.duplicate())
|
score_changed.emit(score.duplicate())
|
||||||
print("Goal for team %d! Score: %d - %d" % [scoring_team, score[0], score[1]])
|
print("Goal for team %d! Score: %d - %d" % [scoring_team, score[0], score[1]])
|
||||||
|
if _in_overtime:
|
||||||
|
# Golden goal: the first score after a draw ends the match outright.
|
||||||
|
_end_match(scoring_team)
|
||||||
|
return
|
||||||
await _run_kickoff_countdown()
|
await _run_kickoff_countdown()
|
||||||
|
|
||||||
|
|
||||||
@@ -102,10 +109,23 @@ func _set_frozen(frozen: bool) -> void:
|
|||||||
|
|
||||||
|
|
||||||
func _on_match_timer_timeout() -> void:
|
func _on_match_timer_timeout() -> void:
|
||||||
print("Full time! Final score: %d - %d" % [score[0], score[1]])
|
print("Full time! Score: %d - %d" % [score[0], score[1]])
|
||||||
var winning_team := -1
|
if score[0] == score[1]:
|
||||||
if score[0] != score[1]:
|
await _start_overtime()
|
||||||
winning_team = 0 if score[0] > score[1] else 1
|
return
|
||||||
|
_end_match(0 if score[0] > score[1] else 1)
|
||||||
|
|
||||||
|
|
||||||
|
# Full time ended level: sudden-death golden goal, no clock running.
|
||||||
|
# _on_goal_scored checks _in_overtime and ends the match on the next goal.
|
||||||
|
func _start_overtime() -> void:
|
||||||
|
_in_overtime = true
|
||||||
|
overtime_started.emit()
|
||||||
|
await _run_kickoff_countdown()
|
||||||
|
|
||||||
|
|
||||||
|
func _end_match(winning_team: int) -> void:
|
||||||
|
print("Match over! Final score: %d - %d" % [score[0], score[1]])
|
||||||
match_ended.emit(winning_team, score.duplicate())
|
match_ended.emit(winning_team, score.duplicate())
|
||||||
# Freeze gameplay while the HUD (process_mode ALWAYS) shows the result.
|
# Freeze gameplay while the HUD (process_mode ALWAYS) shows the result.
|
||||||
get_tree().paused = true
|
get_tree().paused = true
|
||||||
|
|||||||
Reference in New Issue
Block a user