FPI 사용자·국가 랭킹 서버 집계 · YouTube 스밍 · Music Shake 참여

This commit is contained in:
Sn-Kinos
2026-10-05 17:49:47 +09:00
parent 5238fc4ef3
commit 96a95a12d1
31 changed files with 738 additions and 116 deletions
+14 -2
View File
@@ -20,7 +20,9 @@ class PlanetNode {
this.stage,
this.colorKey,
bool? isCenter,
}) : isCenter = isCenter ?? isMine;
bool? ranked,
}) : isCenter = isCenter ?? isMine,
ranked = ranked ?? stage != 0;
/// Firestore `fandoms/{id}` 문서 ID. HUD 에서 행성 상세로 넘어갈 때
/// **이 값으로 저장소를 만든다** — 없으면 어느 행성을 눌러도 같은 상세가 뜬다.
@@ -38,8 +40,16 @@ class PlanetNode {
///
/// Stage0 성운은 랭킹 모집단이 아니다(원장 B-08 · B-17). 성운에는 순위를 매기지 않고
/// 정식 행성 수 + 1 을 넣어 **가장 바깥 궤도 자리로만** 쓴다 — HUD 는 「-」로 그린다.
/// 최근 7 일 유효 활동이 없는 정식 행성도 같다([ranked]).
final int rank;
/// FPI 랭킹 모집단인가(B-17 — 정식 행성 중 최근 7 일 유효 활동 존재). false 면 [rank] 는
/// 궤도 자리일 뿐이라 화면은 순위 대신 「-」를 쓴다.
final bool ranked;
/// 화면에 쓰는 순위 문구 — 모집단 밖이면 「-」.
String get rankLabel => ranked ? '$rank' : '-';
/// FPI 총점. 산출식은 정책 설계서 §P-03 — 초기 MVP 는 단순 합산이다.
final int fpi;
@@ -104,7 +114,7 @@ class GalaxySnapshot {
GalaxySnapshot get rankingView {
PlanetNode? top;
for (final p in planets) {
if (p.stage != 0 && (top == null || p.rank < top.rank)) top = p;
if (p.ranked && (top == null || p.rank < top.rank)) top = p;
}
return GalaxySnapshot(
planets: [
@@ -118,6 +128,8 @@ class GalaxySnapshot {
online: p.online,
isMine: p.isMine,
stage: p.stage,
colorKey: p.colorKey,
ranked: p.ranked,
isCenter: identical(p, top),
),
],