- {reachableLevel > level ? (
+ {isMax ? (
+
+ 성장치 MAX
+
+ ) : effectivelyMax ? (
+
+
+ 성장치 {growth} (MAX) / {requireGrowth}
+
+
+ ) : reachableLevel > level ? (
성장치 {growth} / {requireGrowth}
@@ -219,14 +238,10 @@ function SymbolCard({ symbol, equipped, charId }) {
) : (
- 성장치 {isMax ? (
- MAX
- ) : (
- <>{growth} / {requireGrowth}>
- )}
+ 성장치 {growth} / {requireGrowth}
)}
- {!isMax && (
+ {!isMax && !effectivelyMax && (
{requireGrowth ? Math.min(Math.floor((growth / requireGrowth) * 100), 100) : 0}%
@@ -234,8 +249,8 @@ function SymbolCard({ symbol, equipped, charId }) {
@@ -288,7 +303,7 @@ function SymbolCard({ symbol, equipped, charId }) {
@@ -318,13 +333,13 @@ function SymbolCard({ symbol, equipped, charId }) {
남은 일수
- {equipped && !isMax && daysLeft != null ? `${daysLeft.toLocaleString()}일` : '-'}
+ {equipped && !isMax && !effectivelyMax && daysLeft != null ? `${daysLeft.toLocaleString()}일` : '-'}
예상 완료일
-
- {equipped && !isMax && completeDate ? formatKoreanDate(completeDate) : '-'}
+
+ {equipped && !isMax && !effectivelyMax && completeDate ? formatKoreanDate(completeDate) : '-'}
@@ -441,18 +456,33 @@ export default function Symbol() {
const p = progress?.[s.id]
if (!p?.equipped) continue
if (p.level >= s.max_level) continue
+ // 체납 성장치로 만렙 도달 가능한지 확인
+ let lv = p.level, g = p.growth || 0
+ while (lv < s.max_level) {
+ const r = s.levels?.find((l) => l.level === lv)?.required_count
+ if (!r || g < r) break
+ g -= r; lv += 1
+ }
+ const effMax = lv >= s.max_level
+
+ // 체납 누적 (성장치 cascade)
+ let arrLv = p.level, arrG = p.growth || 0
+ while (arrLv < s.max_level) {
+ const lv = s.levels?.find((x) => x.level === arrLv)
+ if (!lv || arrG < lv.required_count) break
+ arr += lv.meso_cost
+ arrG -= lv.required_count
+ arrLv += 1
+ }
let remaining = 0
+ let gg = p.growth || 0
for (const l of s.levels || []) {
if (l.level < p.level) continue
- if (l.level === p.level) {
- req += l.meso_cost
- if ((p.growth || 0) >= l.required_count) arr += l.meso_cost
- remaining += Math.max(l.required_count - (p.growth || 0), 0)
- } else {
- req += l.meso_cost
- remaining += l.required_count
- }
+ remaining += Math.max(l.required_count - gg, 0)
+ gg = Math.max(gg - l.required_count, 0)
+ req += l.meso_cost
}
+ if (effMax) continue // 완료 예상일 계산에서 제외
const { date } = computeCompletion({
remainingSymbols: remaining,
daily: p.daily ?? s.daily_default ?? 0,