Permet de fixer manuellement certains Citoyens à un palier précis
Build and deploy / deploy (push) Successful in 35s
Build and deploy / deploy (push) Successful in 35s
TIER_OVERRIDES (id de profil → index de palier) + applyTierOverrides() placent d'abord les Citoyens fixés à la main, puis remplissent le reste dans l'ordre alphabétique existant. Épicure est placé en position 7. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
import { redirect } from "next/navigation";
|
||||
import { createClient } from "@/lib/supabase/server";
|
||||
import { applyTierOverrides, TIER_OVERRIDES } from "@/lib/melon/constants";
|
||||
import { CorneView } from "./corne-view";
|
||||
|
||||
export type MelonScoreEntry = {
|
||||
@@ -45,9 +46,12 @@ export default async function CornePage() {
|
||||
|
||||
// Un palier de taille par Citoyen (pas les Archontes) : chacun est
|
||||
// associé à une taille fixe pour toute la partie, voir corne-view.tsx.
|
||||
const citizens: MemberRow[] = (members ?? [])
|
||||
// applyTierOverrides place d'abord les Citoyens fixés à la main
|
||||
// (TIER_OVERRIDES), puis remplit le reste dans l'ordre alphabétique.
|
||||
const orderedCitizens: MemberRow[] = (members ?? [])
|
||||
.filter((member) => member.role === "public")
|
||||
.map(({ id, pseudo, avatar_url }) => ({ id, pseudo, avatar_url }));
|
||||
const citizens = applyTierOverrides(orderedCitizens, TIER_OVERRIDES);
|
||||
|
||||
const isFrozen = Boolean(settings?.tribunal_date && new Date() >= new Date(settings.tribunal_date));
|
||||
const ownBestScore = leaderboard.find((entry) => entry.id === user.id)?.best_score ?? null;
|
||||
|
||||
@@ -43,3 +43,40 @@ export const MAX_FRAME_DT_MS = 250;
|
||||
|
||||
export const MIN_SCORE = 0;
|
||||
export const MAX_SCORE = 1000000;
|
||||
|
||||
// Positions figées à la main pour certains Citoyens (id de profil → index
|
||||
// de palier, 0 = le plus petit) — les Citoyens restants remplissent les
|
||||
// paliers non réservés, dans leur ordre existant (alphabétique par
|
||||
// pseudo, voir corne/page.tsx). "Position N" telle que demandée par un
|
||||
// humain (compte à partir de 1) correspond à l'index N-1 ici.
|
||||
export const TIER_OVERRIDES: Record<number, string> = {
|
||||
6: "7f0f24dc-ede0-4190-a64d-976393073c28", // Épicure, position 7
|
||||
};
|
||||
|
||||
export function applyTierOverrides<T extends { id: string }>(
|
||||
citizens: T[],
|
||||
overrides: Record<number, string>,
|
||||
): T[] {
|
||||
const byId = new Map(citizens.map((c) => [c.id, c]));
|
||||
const usedIds = new Set<string>();
|
||||
const result: (T | undefined)[] = new Array(citizens.length);
|
||||
|
||||
for (const [tierKey, id] of Object.entries(overrides)) {
|
||||
const tier = Number(tierKey);
|
||||
const citizen = byId.get(id);
|
||||
if (citizen && tier >= 0 && tier < citizens.length) {
|
||||
result[tier] = citizen;
|
||||
usedIds.add(id);
|
||||
}
|
||||
}
|
||||
|
||||
const remaining = citizens.filter((c) => !usedIds.has(c.id));
|
||||
let remainingIndex = 0;
|
||||
for (let tier = 0; tier < result.length; tier++) {
|
||||
if (!result[tier]) {
|
||||
result[tier] = remaining[remainingIndex++];
|
||||
}
|
||||
}
|
||||
|
||||
return result as T[];
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user