Name the All Asian multiplier after what it counts

The score window and the stored Contest.Multiplier1Name row both said
"Prefixes" for an Asian entrant, which counts DXCC entities.

Contest.MultiplierNames is now MultiplierNamesFor(StationInfo me), the
same shape as ExchangeFieldsFor. Every other contest returns the same
list it did before; All Asian returns "Countries" from Asia and
"Prefixes" from everywhere else. ContestDefinitions.For takes the
station as well, because that name is written to the log for N1MM.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0157i7PiZyqBkquxS9A6FTdQ
This commit is contained in:
2026-09-10 20:47:51 +00:00
co-authored by Claude Opus 5
parent f5e3d9ed8a
commit b5d9f1e21c
36 changed files with 62 additions and 40 deletions
+2 -1
View File
@@ -26,7 +26,8 @@ public sealed class AllAsian : Contest
new ExchangeField("Age", ExchangeSlot.Exchange1, ExchangeFieldKind.Number) { Width = 3 },
];
public IReadOnlyList<string> MultiplierNames => ["Prefixes"];
public IReadOnlyList<string> MultiplierNamesFor(StationInfo me) =>
me.Continent == "AS" ? ["Countries"] : ["Prefixes"];
public DupeScope DupeScope => DupeScope.PerBand;
+1 -1
View File
@@ -41,7 +41,7 @@ public sealed class Arrl10Metre : Contest
? qso with { ReceivedNumber = number, Section = "" }
: qso with { ReceivedNumber = 0, Section = typed.Trim().ToUpperInvariant() };
public IReadOnlyList<string> MultiplierNames => ["States", "Countries"];
public IReadOnlyList<string> MultiplierNamesFor(StationInfo me) => ["States", "Countries"];
public DupeScope DupeScope => DupeScope.PerMode;
+1 -1
View File
@@ -33,7 +33,7 @@ public sealed class ArrlDx : Contest
: new ExchangeField("State", ExchangeSlot.Section, ExchangeFieldKind.UsStateOrCanadianProvince),
];
public IReadOnlyList<string> MultiplierNames => ["Mults"];
public IReadOnlyList<string> MultiplierNamesFor(StationInfo me) => ["Mults"];
public DupeScope DupeScope => DupeScope.PerBand;
+1 -1
View File
@@ -36,7 +36,7 @@ public sealed class BartgSprint : Contest
/// N1MM.
public bool StampsSentTime => true;
public IReadOnlyList<string> MultiplierNames => ["Countries", "Areas", "Continents"];
public IReadOnlyList<string> MultiplierNamesFor(StationInfo me) => ["Countries", "Areas", "Continents"];
public DupeScope DupeScope => DupeScope.PerBand;
+1 -1
View File
@@ -40,7 +40,7 @@ public sealed class CqOneSixty : Contest
? qso with { Section = "" }
: qso with { Section = typed.Trim().ToUpperInvariant() };
public IReadOnlyList<string> MultiplierNames => ["States", "Countries"];
public IReadOnlyList<string> MultiplierNamesFor(StationInfo me) => ["States", "Countries"];
public DupeScope DupeScope => DupeScope.Once;
+1 -1
View File
@@ -60,7 +60,7 @@ public sealed class CqWorldWide : Contest
&& their is not null
&& their.Entity.PrimaryPrefix is not ("K" or "VE");
public IReadOnlyList<string> MultiplierNames =>
public IReadOnlyList<string> MultiplierNamesFor(StationInfo me) =>
IsRtty ? ["Zones", "Countries", "States"] : ["Zones", "Countries"];
public DupeScope DupeScope => DupeScope.PerBand;
+1 -1
View File
@@ -39,7 +39,7 @@ public sealed class CqWpx : Contest
new ExchangeField("RcvNR", ExchangeSlot.SerialNumber, ExchangeFieldKind.Number),
];
public IReadOnlyList<string> MultiplierNames => ["Prefixes"];
public IReadOnlyList<string> MultiplierNamesFor(StationInfo me) => ["Prefixes"];
public DupeScope DupeScope => DupeScope.PerBand;
+1 -1
View File
@@ -43,7 +43,7 @@ public sealed class EuDxContest : Contest
? qso with { Section = typed.Trim().ToUpperInvariant() }
: qso with { Zone = int.TryParse(typed, out int zone) ? zone : 0 };
public IReadOnlyList<string> MultiplierNames => ["Codes", "Countries"];
public IReadOnlyList<string> MultiplierNamesFor(StationInfo me) => ["Codes", "Countries"];
public DupeScope DupeScope => DupeScope.PerBandAndMode;
@@ -21,7 +21,7 @@ public sealed class FieldDayRegionOne : Contest
new ExchangeField("Nr", ExchangeSlot.SerialNumber, ExchangeFieldKind.Number),
];
public IReadOnlyList<string> MultiplierNames => ["Countries"];
public IReadOnlyList<string> MultiplierNamesFor(StationInfo me) => ["Countries"];
public DupeScope DupeScope => DupeScope.PerBandAndMode;
+1 -1
View File
@@ -58,7 +58,7 @@ public sealed class FrenchRef : Contest
new ExchangeField("Sect", ExchangeSlot.Section, ExchangeFieldKind.Text) { Width = 5 },
];
public IReadOnlyList<string> MultiplierNames => ["Mults"];
public IReadOnlyList<string> MultiplierNamesFor(StationInfo me) => ["Mults"];
public DupeScope DupeScope => DupeScope.PerBand;
+1 -1
View File
@@ -20,7 +20,7 @@ public sealed class GeneralLogging : Contest
new ExchangeField("Comment", ExchangeSlot.Comment, ExchangeFieldKind.Text, IsRequired: false) { Width = 20 },
];
public IReadOnlyList<string> MultiplierNames => [];
public IReadOnlyList<string> MultiplierNamesFor(StationInfo me) => [];
public DupeScope DupeScope => DupeScope.PerBandAndMode;
+1 -1
View File
@@ -22,7 +22,7 @@ public sealed class IaruHf : Contest
new ExchangeField("ITU-Zone", ExchangeSlot.Section, ExchangeFieldKind.Text) { Width = 6 },
];
public IReadOnlyList<string> MultiplierNames => ["Zones", "HQ"];
public IReadOnlyList<string> MultiplierNamesFor(StationInfo me) => ["Zones", "HQ"];
public bool UsesItuZones => true;
+1 -1
View File
@@ -29,7 +29,7 @@ public sealed class Iota : Contest
},
];
public IReadOnlyList<string> MultiplierNames => ["Islands"];
public IReadOnlyList<string> MultiplierNamesFor(StationInfo me) => ["Islands"];
public DupeScope DupeScope => DupeScope.PerBandAndMode;
+1 -1
View File
@@ -37,7 +37,7 @@ public sealed class MexicoRtty : Contest
Section = IsMexican(qso.CountryPrefix) ? typed.Trim().ToUpperInvariant() : "",
};
public IReadOnlyList<string> MultiplierNames => ["Countries", "States"];
public IReadOnlyList<string> MultiplierNamesFor(StationInfo me) => ["Countries", "States"];
public DupeScope DupeScope => DupeScope.PerBand;
@@ -28,7 +28,7 @@ public sealed class NorthAmericanQsoParty : Contest
new ExchangeField("State", ExchangeSlot.Section, ExchangeFieldKind.Text) { Width = 6 },
];
public IReadOnlyList<string> MultiplierNames => ["Mults"];
public IReadOnlyList<string> MultiplierNamesFor(StationInfo me) => ["Mults"];
public DupeScope DupeScope => DupeScope.PerBand;
+1 -1
View File
@@ -26,7 +26,7 @@ public sealed class OceaniaDx : Contest
new ExchangeField("RcvNR", ExchangeSlot.SerialNumber, ExchangeFieldKind.Number),
];
public IReadOnlyList<string> MultiplierNames => ["Prefixes"];
public IReadOnlyList<string> MultiplierNamesFor(StationInfo me) => ["Prefixes"];
public DupeScope DupeScope => DupeScope.PerBand;
+1 -1
View File
@@ -47,7 +47,7 @@ public sealed class OkOmDx : Contest
Section = IsOkOm(qso.CountryPrefix) ? typed.Trim().ToUpperInvariant() : "",
};
public IReadOnlyList<string> MultiplierNames => ["Mults"];
public IReadOnlyList<string> MultiplierNamesFor(StationInfo me) => ["Mults"];
public DupeScope DupeScope => DupeScope.PerBand;
+1 -1
View File
@@ -38,7 +38,7 @@ public sealed class RttyRoundup : Contest
? qso with { ReceivedNumber = number, Section = "" }
: qso with { ReceivedNumber = 0, Section = typed.Trim().ToUpperInvariant() };
public IReadOnlyList<string> MultiplierNames => ["Mults"];
public IReadOnlyList<string> MultiplierNamesFor(StationInfo me) => ["Mults"];
public DupeScope DupeScope => DupeScope.PerBand;
@@ -38,7 +38,7 @@ public sealed class RussianDistrictAward : Contest
/// N1MM names a country multiplier for this contest and never counts one,
/// and the score summary shows both, so the districts stay in the second
/// column here too.
public IReadOnlyList<string> MultiplierNames => ["Countries", "Districts"];
public IReadOnlyList<string> MultiplierNamesFor(StationInfo me) => ["Countries", "Districts"];
public DupeScope DupeScope => DupeScope.PerBandAndMode;
+1 -1
View File
@@ -37,7 +37,7 @@ public sealed class RussianDxRtty : Contest
Section = typed.Trim().ToUpperInvariant(),
};
public IReadOnlyList<string> MultiplierNames => ["Countries", "Oblasts"];
public IReadOnlyList<string> MultiplierNamesFor(StationInfo me) => ["Countries", "Oblasts"];
public DupeScope DupeScope => DupeScope.PerBand;
+1 -1
View File
@@ -21,7 +21,7 @@ public sealed class SartgRtty : Contest
new ExchangeField("RcvNr", ExchangeSlot.SerialNumber, ExchangeFieldKind.Number),
];
public IReadOnlyList<string> MultiplierNames => ["Countries", "Areas"];
public IReadOnlyList<string> MultiplierNamesFor(StationInfo me) => ["Countries", "Areas"];
public DupeScope DupeScope => DupeScope.PerBand;
+1 -1
View File
@@ -49,7 +49,7 @@ public sealed class Sweepstakes : Contest
new ExchangeField("Sect", ExchangeSlot.Section, ExchangeFieldKind.ArrlSection),
];
public IReadOnlyList<string> MultiplierNames => ["Sections"];
public IReadOnlyList<string> MultiplierNamesFor(StationInfo me) => ["Sections"];
public DupeScope DupeScope => DupeScope.Once;
+1 -1
View File
@@ -45,7 +45,7 @@ public sealed class UkrainianDx : Contest
new ExchangeField("Sect", ExchangeSlot.Section, ExchangeFieldKind.Text) { Width = 5 },
];
public IReadOnlyList<string> MultiplierNames => ["Countries", "Oblasts"];
public IReadOnlyList<string> MultiplierNamesFor(StationInfo me) => ["Countries", "Oblasts"];
public DupeScope DupeScope => DupeScope.PerBandAndMode;
+1 -1
View File
@@ -55,7 +55,7 @@ public sealed class Wae : Contest
new ExchangeField("Nr", ExchangeSlot.SerialNumber, ExchangeFieldKind.Number),
];
public IReadOnlyList<string> MultiplierNames => ["Mults"];
public IReadOnlyList<string> MultiplierNamesFor(StationInfo me) => ["Mults"];
public DupeScope DupeScope => DupeScope.PerBand;
+1 -1
View File
@@ -45,7 +45,7 @@ public sealed class YoDxHf : Contest
new ExchangeField("Sect", ExchangeSlot.Section, ExchangeFieldKind.Text) { Width = 5 },
];
public IReadOnlyList<string> MultiplierNames => ["Countries", "Counties"];
public IReadOnlyList<string> MultiplierNamesFor(StationInfo me) => ["Countries", "Counties"];
public DupeScope DupeScope => DupeScope.PerBandAndMode;
+1 -1
View File
@@ -23,7 +23,7 @@ public sealed class Yota : Contest
new ExchangeField("Age", ExchangeSlot.Exchange1, ExchangeFieldKind.Number) { Width = 3 },
];
public IReadOnlyList<string> MultiplierNames => ["Ages"];
public IReadOnlyList<string> MultiplierNamesFor(StationInfo me) => ["Ages"];
public DupeScope DupeScope => DupeScope.PerBandAndMode;