행성 Level 1~100 수치표 적용 · 행성 컬러 마스터

This commit is contained in:
Sn-Kinos
2026-10-05 22:20:51 +09:00
parent cc0f2fb292
commit 000c058097
12 changed files with 424 additions and 64 deletions
@@ -3,6 +3,8 @@ import 'package:cloud_firestore/cloud_firestore.dart' show Timestamp;
import '../../core/data/backend.dart';
import '../../core/data/invite_code.dart';
import '../../core/data/server_clock.dart';
import '../../core/ui/planet_25d.dart' show planetColors, planetColorsFrom, setPlanetColorMaster;
import 'package:flutter/painting.dart' show Color;
import 'home_data.dart';
import '../inside/inside_repository_firestore.dart' show insideQuestionFrom;
import '../quest/quest_data.dart' show QuestType;
@@ -66,6 +68,19 @@ class FirestoreHomeRepository implements HomeRepository {
'colorKey': colorKey,
});
@override
Future<List<(String, Color)>> planetColorOptions() async {
try {
final master = planetColorsFrom(
(await _backend.db.doc('config/planetColors').get()).data(),
);
setPlanetColorMaster(master.all);
return master.visible;
} catch (_) {
return planetColors;
}
}
@override
Future<NebulaTargets> nebulaTargets() async {
try {
@@ -82,6 +97,8 @@ class FirestoreHomeRepository implements HomeRepository {
final uid = _backend.requireUid;
// 공유 링크 `?ref=` 용 — 기다리지 않는다.
InviteCode.ensure(_backend);
// 컬러 마스터 — HOME · GALAXY 행성이 발주사가 더한 색도 그리도록 먼저 읽어 둔다. 기다리지 않는다.
planetColorOptions();
final db = _backend.db;
final userSnap = await db.doc('users/$uid').get();
@@ -291,8 +308,15 @@ class FirestoreHomeRepository implements HomeRepository {
int? validInt(dynamic value) => value is int && value >= 0 ? value : null;
num? validNumber(dynamic value) =>
value is num && value.isFinite && value >= 0 ? value : null;
final current = validNumber(fandom['growthPop']);
final required = validInt(next?['requiredPop']);
// 정식 행성은 서버가 수치표 v1.4 대로 적은 레벨업 POP 진행도(생성 기준점 이후 · ZAP 가중치 반영)와
// 다음 Stage 진입 누계를 쓴다. 아직 판정 전인 행성만 구 마스터(`planetStages`)로 그린다.
final leveled = stage != null && stage > 0 && fandom['levelPop'] is num;
final current = leveled
? validNumber(fandom['levelPop'])
: validNumber(fandom['growthPop']);
final required = leveled
? validInt(fandom['nextStagePop'])
: validInt(next?['requiredPop']);
// 성운(Stage0)의 전환 목표는 서버와 같은 `config/policy` 키로 읽는다.
final policy = stage == 0
? (await _backend.db.doc('config/policy').get()).data()
@@ -325,7 +349,9 @@ class FirestoreHomeRepository implements HomeRepository {
// Q-PN-01 A안 — 탄생은 창립자만.
isFounder:
fandom['founderUid'] != null && fandom['founderUid'] == _backend.uid,
requiredSfpi: validNumber(next?['requiredSfpi']),
requiredSfpi: leveled
? validNumber(fandom['nextStageSfpi'])
: validNumber(next?['requiredSfpi']),
nebulaGoalPassed: goalPassed,
);
}