Read the rest of what a .udc file says, and score what N1MM scores
Two pieces of work on the scoring engine. The .udc reader now takes N1MM's published scoring vocabulary: the full PointsPerContact condition set, the PointsMultBy family, PowerMult, BonusPoints, the multiplier sources and the settings that say which stations bring a multiplier in. MultMult is a weight rather than a switch, as in N1MM's ComputeScore. The entry categories and the sent exchange reach the rules in a new ContestEntry, so a contest can score by the power category it is entered in or by what this station sends. Then every contest in a real N1MM log was scored again from these rules and compared with the points and multiplier flags N1MM wrote. That found five bugs: ARRL DX and IARU read the exchange from the wrong column, a stored " " was read as a value rather than as empty, CQ WW RTTY's own Canadian area names were not counted, a maritime mobile scored nothing, and a contact in a mode the contest does not run scored as if it were in the contest. docs/n1mm-interop.md has the check and what still differs. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RoGtneMQaz4M9w7Kk49AVD
This commit is contained in:
34
src/Nonemm.Core/ContestEntry.cs
Normal file
34
src/Nonemm.Core/ContestEntry.cs
Normal file
@@ -0,0 +1,34 @@
|
||||
namespace Nonemm.Core;
|
||||
|
||||
/// The entry the operator declared: the categories the sponsor's header asks
|
||||
/// for, and the exchange this station sends. Contests score by these — a QRP
|
||||
/// entry can be worth a multiple of what the same contacts score at high
|
||||
/// power, and a contest can pay by what the station itself sends.
|
||||
///
|
||||
/// The values are the Cabrillo category names, which is what the log file
|
||||
/// stores and what N1MM compares against.
|
||||
public sealed record ContestEntry
|
||||
{
|
||||
public string OperatorCategory { get; init; } = "SINGLE-OP";
|
||||
|
||||
public string BandCategory { get; init; } = "ALL";
|
||||
|
||||
public string PowerCategory { get; init; } = "HIGH";
|
||||
|
||||
public string ModeCategory { get; init; } = "";
|
||||
|
||||
public string OverlayCategory { get; init; } = "";
|
||||
|
||||
public string StationCategory { get; init; } = "";
|
||||
|
||||
public string AssistedCategory { get; init; } = "NON-ASSISTED";
|
||||
|
||||
public string TransmitterCategory { get; init; } = "ONE";
|
||||
|
||||
public string TimeCategory { get; init; } = "";
|
||||
|
||||
/// What this station sends, as the operator typed it into the contest
|
||||
/// setup. Empty until a contest is open, and then whatever N1MM would put
|
||||
/// in the sent exchange box.
|
||||
public string SentExchange { get; init; } = "";
|
||||
}
|
||||
Reference in New Issue
Block a user