using Nonemm.Contests.Multipliers; using Nonemm.Core; namespace Nonemm.Contests.Rules; /// ARRL November Sweepstakes. A station counts once for the whole contest /// whatever the band, and the multiplier is the ARRL or RAC section. public sealed class Sweepstakes : Contest { private readonly ModeCategory mode; public Sweepstakes(ModeCategory mode) => this.mode = mode; public string Name => mode == ModeCategory.Cw ? "SSCW" : "SSSSB"; public string DisplayName => $"ARRL Sweepstakes {ModeLabel()}"; public string CabrilloName => mode == ModeCategory.Cw ? "ARRL-SS-CW" : "ARRL-SS-SSB"; public IReadOnlyList ExchangeFieldsFor(StationInfo me) => [ new ExchangeField("Nr", ExchangeSlot.SerialNumber, ExchangeFieldKind.Number), new ExchangeField("Prec", ExchangeSlot.Precedence, ExchangeFieldKind.Precedence), new ExchangeField("Ck", ExchangeSlot.Check, ExchangeFieldKind.Check), new ExchangeField("Sec", ExchangeSlot.Section, ExchangeFieldKind.ArrlSection), ]; public IReadOnlyList MultiplierNames => ["Sections"]; public DupeScope DupeScope => DupeScope.Once; public bool HasSerialNumbers => true; public IReadOnlyList Modes => [mode]; public string SentExchangeFor(StationInfo me) => $"{me.Precedence} {me.Callsign} {me.Check:00} {me.ArrlSection}"; public int PointsFor(QsoContext qso) => 2; public IReadOnlyList MultipliersFor(QsoContext qso) { string section = qso.Qso.Section.Trim().ToUpperInvariant(); return ArrlSections.IsSection(section) ? [new Multiplier(1, section, "")] : []; } public int TotalScore(ScoreTally tally, ContestEntry entry) => tally.Points * tally.TotalMultipliers; /// Sweepstakes puts the callsign after the serial number and precedence /// rather than first, which is why the writer takes the whole column list. public CabrilloExchange CabrilloExchange(Qso qso, StationInfo me, ContestEntry entry) => new( [ new CabrilloField($"{qso.SentNumber}", 4), new CabrilloField(me.Precedence, 1), new CabrilloField(me.Callsign, 13), new CabrilloField($"{me.Check:00}", 2), new CabrilloField(me.ArrlSection, 3), ], [ new CabrilloField($"{qso.ReceivedNumber}", 4), new CabrilloField(qso.Precedence, 1), new CabrilloField(qso.Call.Text, 13), new CabrilloField($"{qso.Check:00}", 2), new CabrilloField(qso.Section, 3), ]); private string ModeLabel() => mode == ModeCategory.Cw ? "CW" : "SSB"; }