using Nonemm.Core; using Nonemm.Core.Country; namespace Nonemm.Contests.Rules; /// The Romanian YO DX HF contest. A Romanian station sends its county and is /// worth 8 points; everyone else is 1 point inside your own country, 2 on your /// continent and 4 from another. The countries and the Romanian counties are /// multipliers, each once per band. public sealed class YoDxHf : Contest { public string Name => "YOHFDX"; public string DisplayName => "YO DX HF"; public string CabrilloName => "YO-DX-HF"; public IReadOnlyList ExchangeFieldsFor(StationInfo me) => me.CountryPrefix == "YO" ? [ new ExchangeField("Snt", ExchangeSlot.SentReport, ExchangeFieldKind.Report, IsRequired: false), new ExchangeField("Rcv", ExchangeSlot.ReceivedReport, ExchangeFieldKind.Report), new ExchangeField("Exch", ExchangeSlot.Exchange1, ExchangeFieldKind.Text) { Width = 3 }, ] : [ new ExchangeField("Snt", ExchangeSlot.SentReport, ExchangeFieldKind.Report, IsRequired: false), new ExchangeField("Nr", ExchangeSlot.SentNumber, ExchangeFieldKind.Number, IsRequired: false), new ExchangeField("Rcv", ExchangeSlot.ReceivedReport, ExchangeFieldKind.Report), new ExchangeField("Exch", ExchangeSlot.Exchange1, ExchangeFieldKind.Text) { Width = 3 }, ]; /// A YO station sends a county, which goes in the section column where the /// multiplier is read from; everyone else sends a serial number. public Qso FromExchange1(Qso qso, string typed) => qso with { Section = qso.CountryPrefix == "YO" ? typed.Trim().ToUpperInvariant() : "", }; /// N1MM's log for this contest keeps what the one box was sorted into in a /// column of its own beside the exchange. public IReadOnlyList LogFieldsFor(StationInfo me) => [ .. ExchangeFieldsFor(me), new ExchangeField("Sect", ExchangeSlot.Section, ExchangeFieldKind.Text) { Width = 5 }, ]; public IReadOnlyList MultiplierNames => ["Countries", "Counties"]; public DupeScope DupeScope => DupeScope.PerBandAndMode; public bool HasSerialNumbers => true; public IReadOnlyList Modes => [ModeCategory.Cw, ModeCategory.Phone]; public string SentExchangeFor(StationInfo me) => me.CountryPrefix == "YO" ? me.County : "001"; /// What went out on this contact. A YO station sends the same county /// every time; everyone else sends a serial, so the Cabrillo file reads the /// contact's own number and not the first one. N1MM pads it to three /// digits. private string SentExchangeOn(Qso qso, StationInfo me) => me.CountryPrefix == "YO" ? me.County : $"{qso.SentNumber:000}"; public int PointsFor(QsoContext qso) { if (qso.CountryPrefix == "YO") { return 8; } return qso.IsSameCountry ? 1 : qso.IsSameContinent ? 2 : 4; } public IReadOnlyList MultipliersFor(QsoContext qso) { string band = qso.Band?.Name ?? ""; List found = []; if (qso.CountryPrefix.Length > 0) { found.Add(new Multiplier(1, qso.CountryPrefix, band)); } string county = qso.Qso.Section.Trim().ToUpperInvariant(); if (qso.CountryPrefix == "YO" && county.Length > 0) { found.Add(new Multiplier(2, county, band)); } return found; } public int TotalScore(ScoreTally tally, ContestEntry entry) => tally.Points * tally.TotalMultipliers; public CabrilloExchange CabrilloExchange(Qso qso, StationInfo me, ContestEntry entry) => new( [ new CabrilloField(me.Callsign, 13), new CabrilloField(qso.SentReport, 3), new CabrilloField(SentExchangeOn(qso, me), 6), ], [ new CabrilloField(qso.Call.Text, 13), new CabrilloField(qso.ReceivedReport, 3), new CabrilloField(qso.Section.Length > 0 ? qso.Section : qso.Exchange1, 6), ]); }