using Nonemm.Core; using Nonemm.Core.Country; namespace Nonemm.Contests.Rules; /// The Russian DX RTTY contest. A Russian station sends its oblast, everyone /// else their CQ zone. A contact on your own continent is 5 points and one /// from another 10, and the countries and the oblasts are multipliers, each /// once per band. public sealed class RussianDxRtty : Contest { public string Name => "RUSDXRTTY"; public string DisplayName => "Russian DX RTTY"; public string CabrilloName => "RADIO-WW-RTTY"; public IReadOnlyList ExchangeFieldsFor(StationInfo me) => IsRussian(me.CountryPrefix) ? [ 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("SentNr", ExchangeSlot.SentNumber, ExchangeFieldKind.Number, IsRequired: false), new ExchangeField("Rcv", ExchangeSlot.ReceivedReport, ExchangeFieldKind.Report), new ExchangeField("Exch", ExchangeSlot.Exchange1, ExchangeFieldKind.Text) { Width = 3 }, ]; /// A Russian station sends an oblast, which goes in the section column /// where the multiplier is read from; everyone else sends a CQ zone. public Qso FromExchange1(Qso qso, string typed) => qso with { Section = typed.Trim().ToUpperInvariant(), }; public IReadOnlyList MultiplierNames => ["Countries", "Oblasts"]; public DupeScope DupeScope => DupeScope.PerBand; public bool HasSerialNumbers => false; public IReadOnlyList Modes => [ModeCategory.Digital]; public string SentExchangeFor(StationInfo me) => IsRussian(me.CountryPrefix) ? me.County : me.CqZone.ToString(); public int PointsFor(QsoContext qso) => qso.IsSameContinent ? 5 : 10; 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 oblast = qso.Qso.Section.Trim().ToUpperInvariant(); if (IsRussian(qso.CountryPrefix) && oblast.Length > 0) { found.Add(new Multiplier(2, oblast, 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(SentExchangeFor(me), 6), ], [ new CabrilloField(qso.Call.Text, 13), new CabrilloField(qso.ReceivedReport, 3), new CabrilloField(qso.Section, 6), ]); private static bool IsRussian(string countryPrefix) => countryPrefix is "UA" or "UA2" or "UA9"; }