Introduce architettura multi-sport con catalogo, engine scoring e overlay.
Catalogo sport in YAML, board implicito, engine per volley/basket/timed/racket/timer/generic, regia e app Android allineate. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -3,13 +3,31 @@ module Scoring
|
||||
Side = Struct.new(:home, :away, keyword_init: true)
|
||||
|
||||
def self.from_match(match)
|
||||
overrides = match.scoring_rules.is_a?(Hash) ? match.scoring_rules : {}
|
||||
new(
|
||||
sets_to_win: match.sets_to_win,
|
||||
points_per_set: overrides["points_per_set"] || overrides[:points_per_set] || 25,
|
||||
points_deciding_set: overrides["points_deciding_set"] || overrides[:points_deciding_set] || 15,
|
||||
min_point_lead: overrides["min_point_lead"] || overrides[:min_point_lead] || 2
|
||||
)
|
||||
rules = match.effective_scoring_rules
|
||||
board = match.effective_board_type
|
||||
|
||||
case board
|
||||
when "volley", "racket"
|
||||
new(
|
||||
sets_to_win: rules["sets_to_win"].to_i,
|
||||
points_per_set: rules["points_per_set"].to_i,
|
||||
points_deciding_set: rules["points_deciding_set"].to_i,
|
||||
min_point_lead: rules["min_point_lead"].to_i
|
||||
)
|
||||
when "basket", "timed"
|
||||
PeriodRules.new(
|
||||
periods: rules["periods"].to_i,
|
||||
period_duration_secs: rules["period_duration_secs"].to_i,
|
||||
overtime_duration_secs: rules["overtime_duration_secs"].to_i
|
||||
)
|
||||
else
|
||||
new(
|
||||
sets_to_win: rules["sets_to_win"].to_i.positive? ? rules["sets_to_win"].to_i : 3,
|
||||
points_per_set: rules["points_per_set"].to_i.positive? ? rules["points_per_set"].to_i : 25,
|
||||
points_deciding_set: rules["points_deciding_set"].to_i.positive? ? rules["points_deciding_set"].to_i : 15,
|
||||
min_point_lead: rules["min_point_lead"].to_i.positive? ? rules["min_point_lead"].to_i : 2
|
||||
)
|
||||
end
|
||||
end
|
||||
|
||||
def initialize(sets_to_win:, points_per_set: 25, points_deciding_set: 15, min_point_lead: 2)
|
||||
@@ -42,5 +60,15 @@ module Scoring
|
||||
|
||||
nil
|
||||
end
|
||||
|
||||
class PeriodRules
|
||||
attr_reader :periods, :period_duration_secs, :overtime_duration_secs
|
||||
|
||||
def initialize(periods:, period_duration_secs:, overtime_duration_secs: 300)
|
||||
@periods = periods
|
||||
@period_duration_secs = period_duration_secs
|
||||
@overtime_duration_secs = overtime_duration_secs
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user