Scoring

Five areas, one number, a published chart

Every report gives five area grades from 0 to 100 and one score. This page is generated from the same data file the engine reads, so the chart cannot drift from the code.

The formula

Each area starts at 100. Its findings are sorted from the heaviest penalty down. The heaviest counts in full, and each next one counts 0.7 times the one before it, so a pile of small warnings cannot zero a grade while one serious error still dominates. A rule counts once however many places it fires.

grade = 100 − (p1 + p2×0.7 + p3×0.7² + …)
score = min over areas of ( 100 − weight × (100 − grade) ), then caps

The weights decide how much a bad grade in each area pulls the score down. A weight of 1.0 means the area's grade becomes the score directly. A weight of 0.8 means a performance grade of 50 pulls the score to 60, not 50.

Areas and weights

AreaWeightFed by finding categories
Stability1.0crash, load, trigger, desync, breakage-by-patch, logic
Performance0.8perf, performance, leak
Security1.0cheat, malware, security
Cleanliness0.4garbage
Text0.3share of the map's text that is not English

Penalty per finding

SeverityPenaltyCleanliness
Errors4040
Severe2020
Warnings88
Info23

Severity names follow the map-maker convention: Errors, Severe, Warnings, Info. The Text grade loses 50 points times the share of the map's text that is not English.

Letters

LetterScore
A≥ 90
B≥ 80
C≥ 65
D≥ 50
Fbelow 50

Score caps

WhenScore at most
Malware verdict: malicious20
Malware verdict: suspicious60
Fails on the build being played40

The security grade itself is capped too:

Malware verdictSecurity at most
malicious10
suspicious50

Leak deadline

A game limit is hit withinStability
≤ 60 min−50
≤ 120 min−35
≤ 240 min−25
≤ 1440 min−10

From a static estimate of how fast handles leak in code that runs all game.

Ring colours

The score ring is red below 50 (F), amber from 50 to 79 (D and C) and radiant from 80 up (B and A). Colour never carries the meaning alone: the number and the letter are always printed inside the ring.

Worked example

The example map, before and after its fix. Each area's term is 100 − weight × (100 − grade).

RunArea termsCapsScore
BeforeStability 2 → 2.0 · Performance 46 → 56.8 · Security 100 → 100.0 · Cleanliness 100 → 100.0 · Text 100 → 100.0compat fails cap 402 F
AfterStability 80 → 80.0 · Performance 69 → 75.2 · Security 100 → 100.0 · Cleanliness 100 → 100.0 · Text 100 → 100.0no cap75 C

Source of every number on this page: tools/ops/data/report-card.json (weights, penalties, caps, letters) and tools/ops/scan/score.py (the decay of 0.7).