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:
@@ -213,7 +213,8 @@ public sealed class AppSession : IDisposable
|
||||
/// N1MM reads the `Contest` table when it opens a log, so the definition is
|
||||
/// written again whenever a contest is opened, not only when it is created.
|
||||
private void SaveDefinition(Contest contest) =>
|
||||
Store.SaveContestDefinition(ContestDefinitions.For(contest));
|
||||
Store.SaveContestDefinition(
|
||||
ContestDefinitions.For(contest, Settings.Station.ToStationInfo()));
|
||||
|
||||
public void OpenContest(int contestNumber)
|
||||
{
|
||||
|
||||
@@ -875,7 +875,7 @@ public sealed partial class EntryWindow : Window
|
||||
BreakdownText.Text = string.Join(
|
||||
"/",
|
||||
new[] { Logging.Log.Tally.Qsos }.Concat(
|
||||
Logging.Contest.MultiplierNames.Select(
|
||||
Logging.Contest.MultiplierNamesFor(Logging.Me).Select(
|
||||
(_, at) => Logging.Log.Tally.MultiplierCount(at + 1))));
|
||||
ScoreText.Text = $"{Logging.Log.TotalScore:N0}";
|
||||
}
|
||||
|
||||
@@ -43,8 +43,10 @@ public interface Contest
|
||||
/// boxes where a contest does not say otherwise.
|
||||
IReadOnlyList<ExchangeField> LogFieldsFor(StationInfo me) => ExchangeFieldsFor(me);
|
||||
|
||||
/// Up to three names, in the order the score summary shows them.
|
||||
IReadOnlyList<string> MultiplierNames { get; }
|
||||
/// Up to three names, in the order the score summary shows them. All Asian
|
||||
/// counts entities for an Asian entrant and prefixes for everybody else,
|
||||
/// so the station is passed in as it is for the entry boxes.
|
||||
IReadOnlyList<string> MultiplierNamesFor(StationInfo me);
|
||||
|
||||
DupeScope DupeScope { get; }
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -52,7 +52,7 @@ public sealed class UserDefinedContest : Contest
|
||||
|
||||
public IReadOnlyList<ExchangeField> ExchangeFieldsFor(StationInfo me) => exchangeFields;
|
||||
|
||||
public IReadOnlyList<string> MultiplierNames =>
|
||||
public IReadOnlyList<string> MultiplierNamesFor(StationInfo me) =>
|
||||
new[] { "Multiplier1Name", "Multiplier2Name", "Multiplier3Name" }
|
||||
.Take(multipliers.Count)
|
||||
.Select(key => file.Text(key))
|
||||
|
||||
@@ -8,9 +8,9 @@ namespace Nonemm.Session;
|
||||
/// table, which it reads when it opens a log.
|
||||
public static class ContestDefinitions
|
||||
{
|
||||
public static ContestDefinition For(Contest contest)
|
||||
public static ContestDefinition For(Contest contest, StationInfo me)
|
||||
{
|
||||
IReadOnlyList<string> mults = contest.MultiplierNames;
|
||||
IReadOnlyList<string> mults = contest.MultiplierNamesFor(me);
|
||||
return new ContestDefinition
|
||||
{
|
||||
Name = contest.Name,
|
||||
|
||||
Reference in New Issue
Block a user