five-on-it / apps/api/src/standing
apps/api/src/standing
The rules of an account's standing (GAME_DESIGN §14, TECHNICAL_SPECS §9.6): Respect (public, earned in runs, never lost), conduct (hidden but from the player and the moderators: what the server measures and what moderators decide moves it) and the tiers, gates, seasons and pools built on them. Pure functions and the constants they read, in one place: respect.ts keeps the standings and applies them, skill.ts is the hidden skill.
Who has standing: accounts, never guests (they play and see the others' tiers, and earn and hold nothing). A playtest, an abandoned run, a lost one and one where a debug command was honoured (its result's debug: an account of FOI_DEBUG_ACCOUNTS testing live) change nothing: no Respect, endorsement, conduct or skill, no count in its mission's tally.
Respect of a seat in a settled run, in this order (each step's number kept in the RespectBreakdown the results show):
- the base: RESPECT
.perMinutea minute of the run as it was played (itsseconds), capped by the mission's attempt clock when it has one and by 20 minutes, with no floor (a 10-second run pays about 2), times its difficulty,1 + (1 − its completion rate)once it has RESPECT.difficultyAfterRunscounted runs of its version (1 before), up to 2 for a curated mission and 1.5 for a creator's; pro rata by the seat's span (spanOf: from when it joined to when it was given up, the whole run for a seat there from start to end), so a seat filled under way earns its own time; - the outcome: complete or won ×1 (the winning team of a versus run ×1.2), a draw ×0.9, a versus match lost ×0.8, a co-op run failed ×0.5: failing or losing never costs anything;
- presence: connected half its span at least and idle under a quarter of it, and there at the run's end, its span at least
MIN_SPAN(minimumSpan: 30 s or a fifth of the run, never more than the run itself); else nothing at all, and it counts for nothing (no clean run for conduct, no skill rated, no qualifying player, no day's repeat used): a seat that left early and did not come back included, its place taken or not, and a seat filled under way for a few seconds; - a bonus of up to +30 % by the seat's share of its team's credit; a seat with no credit at all gets half on a completed or won run (a draw too), nothing on a failed co-op run or a lost match: presence alone is not enough;
- endorsements come later, a line of their own (endorsementValue);
- the day's repeat: the account's 1st paid run this UTC day ×1, the 2nd ×0.5, the 3rd ×0.25, then ×0.1; of a curated mission counted per mission (any version), of a creator's per creator, across all of their games and missions (a new mission resets nothing);
- a creator's mission pays only once qualified (qualifies): its version played by enough distinct qualifying players and rated well enough by them (a qualifying player was there, is not the mission's creator and held tier Local, 500 Respect earned elsewhere, before the run: qualifyingPlayer); a curated one is;
- conduct: Good ×1, Warning ×0.5, Low ×0; rounded to whole points.
Conduct is 0–10,000, a new account 7,500: Good from 7,000, Warning from 4,000, Low under it. A clean run (present, nothing below) is +100, up to 10,000; a run's misconduct costs at most CONDUCT.worstRun together: abandoning (left early, not back, not voted out; never a seat filled under way whose player never came in) −300, each teammate killed −400, more than half a teammate's health done to them −150 (one crash costs nothing: they only count where a mission turns friendly fire on), each attempt failed by the seat's hit on one of the mission's people (sabotage) −500, idle for most of its span −200, voted out a second time in 7 days by players outside one's party (each vote at least CONDUCT.kickVoters such players and more than half of those in the room, the two votes' voters none the same: kickCounts) −300; and a report a moderator upholds −1,000. It recovers by clean runs alone.
Tiers (TIERS): five, at 0, 500, 2,000, 6,000 and 15,000. A mission's gate (play.respect.min) is a tier; a creator's mission is held to tier 2 until it qualifies. Seasons are the UTC quarters (2026Q4): the leaderboard counts the Respect earned in one; Respect itself never resets. The low-conduct pool: Quick play puts the Low band together only while POOL.queue players or more are in Quick play.
Interfaces
- ConductChange
- EndorsementInput
- MissionRatingTally
- MissionTally
- RespectBreakdown
- SeatAwardInput
- SeatConductInput
- SeatPresence
- Tier