성운명 오류 문구 줄바꿈 · 옛 행성 그림 통일 · 광고 안내 모달 줄바꿈

This commit is contained in:
Sn-Kinos
2026-10-06 04:12:13 +09:00
parent 65f73280aa
commit 99b9bb8665
14 changed files with 114 additions and 34 deletions
@@ -4,7 +4,7 @@ import '../../core/data/planet_visual_state.dart';
import '../../core/theme/tokens.dart';
import '../../core/ui/app_dialog.dart';
import '../../core/ui/app_icons.dart';
import '../../core/ui/planet_25d.dart' show PlanetArt;
import '../../core/ui/planet_25d.dart' show PlanetArt, planetFallbackImage;
import '../notification/notification_screen.dart';
import '../eclipse/eclipse_data.dart';
import '../eclipse/widgets/eclipse_banner.dart';
@@ -31,13 +31,10 @@ class GalaxyHomeScreen extends StatefulWidget {
/// 카드 그림 — HOME · 맵과 같이 팬덤 `stage` 로 고른다. Stage0 성운만 성운 그림이고
/// 정식 행성은 시안 행성 그림(`image 8` · 파란 행성 벡터)을 칸마다 번갈아 쓴다.
/// 예전엔 칸 순서로 골라 둘째 칸이 행성이어도 성운 그림이 됐다.
// ponytail: 형태가 없는 행성(옛 데이터)만 고정된 두 그림 중 하나(id 기준). 형태가 있으면
// 형태가 없는 행성(옛 데이터)만 [planetFallbackImage]. 형태가 있으면
// 카드가 [PlanetArt] 로 생성 때 고른 형태 · 색을 그린다.
static String cardImageOf(PlanetNode p, [int _ = 0]) => p.stage == 0
? 'assets/figma/nebula-card.png'
: (p.id.codeUnits.fold<int>(0, (a, c) => a + c).isEven
? 'assets/figma/planet-detail-hero.png'
: 'assets/figma/planet-earth.png');
static String cardImageOf(PlanetNode p, [int _ = 0]) =>
planetFallbackImage(p.id, nebula: p.stage == 0);
const GalaxyHomeScreen({
super.key,
@@ -5,7 +5,7 @@ import 'package:shared_preferences/shared_preferences.dart';
import '../../core/theme/tokens.dart';
import '../../core/data/backend.dart' show BackendException;
import '../../core/ui/planet_25d.dart' show PlanetArt;
import '../../core/ui/planet_25d.dart' show PlanetArt, planetFallbackImage;
import '../../core/ui/play_banner.dart';
import '../planet/widgets/fandom_size_badge.dart';
import 'galaxy_data.dart';
@@ -546,9 +546,7 @@ class _Hit extends StatelessWidget {
SizedBox.square(
dimension: 70,
child: PlanetArt(
fallback: nebula
? 'assets/figma/nebula-card.png'
: 'assets/figma/planet-detail-hero.png',
fallback: planetFallbackImage(planet.id, nebula: nebula),
planetType: nebula ? null : planet.planetType,
colorKey: planet.colorKey,
semanticLabel: planet.name,
@@ -4,7 +4,7 @@ import 'package:flutter/material.dart';
import '../../../core/theme/tokens.dart';
import '../../../core/ui/live_planet.dart';
import '../../../core/ui/planet_25d.dart' show planetShapeImage;
import '../../../core/ui/planet_25d.dart' show planetFallbackImage, planetShapeImage;
import '../../../core/data/planet_visual_state.dart';
import '../galaxy_data.dart';
import '../galaxy_motion.dart';
@@ -134,15 +134,10 @@ class GalaxyField extends StatelessWidget {
return radiusOf(p) * depthScaleOf(at);
}
/// 행성 일러스트 — 생성 때 고른 형태([planetShapeImage]). 형태가 없는 행성(성운 · 옛 데이터)만
/// 내 행성은 홈과 같은 그림, 나머지는 시안 행성 2종을 돌려 쓴다. 색은 [LivePlanet25D] 가 입힌다.
/// 행성 일러스트 — 생성 때 고른 형태([planetShapeImage]). 형태가 없는 행성(성운 · 옛 데이터)은
/// 다른 화면과 같은 [planetFallbackImage](10/6 C-5). 색은 [LivePlanet25D] 가 입힌다.
static String imageOf(PlanetNode p, int index) =>
planetShapeImage(p.planetType) ??
(p.isMine
? 'assets/figma/planet-home.png'
: (index.isEven
? 'assets/figma/planet-1.png'
: 'assets/figma/planet-2.png'));
planetShapeImage(p.planetType) ?? planetFallbackImage(p.id);
@override
Widget build(BuildContext context) {
@@ -137,8 +137,10 @@ class _NebulaCreateScreenState extends State<NebulaCreateScreen> {
const SizedBox(height: AppSpace.s5),
_NameInput(controller: _name, error: _taken || _invalid),
const SizedBox(height: 6),
SizedBox(
height: 17,
// 한 줄 자리(17)는 비어 있어도 잡아 두되, 두 줄 문구는 잘리지 않게 늘어난다
// (10/6 실기기 「…연속/앞뒤 공」 잘림).
ConstrainedBox(
constraints: const BoxConstraints(minHeight: 17),
child: _taken || _invalid
? Text(
_taken
+3 -2
View File
@@ -16,6 +16,7 @@ import 'package:flutter/material.dart';
import '../../../core/theme/tokens.dart';
import '../../../core/ui/app_icons.dart';
import '../../../core/ui/live_planet.dart';
import '../../../core/ui/planet_25d.dart' show planetFallbackImage;
import '../../../core/data/planet_visual_state.dart';
import '../home_data.dart';
import '../home_screen.dart' show formatPop;
@@ -220,8 +221,8 @@ class _HomeHeroState extends State<HomeHero> {
fandomId: fandomId,
watch: watchPlanet,
stage: growth.stage,
image:
'assets/figma/planet-home.png',
// 형태 없는 옛 행성은 다른 화면과 같은 그림(10/6 C-5).
image: planetFallbackImage(fandomId),
size: math.min(
planet,
box.maxHeight,
+2 -2
View File
@@ -1,7 +1,7 @@
import 'package:flutter/material.dart';
import '../../core/theme/tokens.dart';
import '../../core/ui/planet_25d.dart' show PlanetArt;
import '../../core/ui/planet_25d.dart' show PlanetArt, planetFallbackImage;
import '../home/home_screen.dart' show formatPop;
import '../planet/planet_data.dart' show PlanetRepositoryFactory;
import '../planet/planet_history_screen.dart';
@@ -214,7 +214,7 @@ class _PlanetCard extends StatelessWidget {
child: Column(
children: [
PlanetArt(
fallback: 'assets/figma/my-planet-1.png',
fallback: planetFallbackImage(planet.fandomId),
planetType: planet.planetType,
colorKey: planet.colorKey,
width: 60,
@@ -1,7 +1,7 @@
import 'package:flutter/material.dart';
import '../../core/theme/tokens.dart';
import '../../core/ui/planet_25d.dart' show PlanetArt;
import '../../core/ui/planet_25d.dart' show PlanetArt, planetFallbackImage;
import 'planet_data.dart';
import 'widgets/action_sheet.dart';
import '../../core/i18n/app_locale.dart';
@@ -412,7 +412,7 @@ Widget _avatar(int index, double size, {bool planet = false, FpiRankRow? row}) =
? SizedBox.square(
dimension: size,
child: PlanetArt(
fallback: 'assets/figma/planet-detail-hero.png',
fallback: planetFallbackImage(row?.id ?? ''),
planetType: row?.planetType,
colorKey: row?.colorKey,
),
@@ -7,6 +7,7 @@ import '../campaign/widgets/campaign_rank.dart' show RankPodium;
import '../../core/data/backend.dart' show BackendException;
import '../../core/data/planet_visual_state.dart';
import '../../core/ui/live_planet.dart' show LivePlanetArt;
import '../../core/theme/tokens.dart';
import '../../core/ui/app_dialog.dart';
@@ -158,6 +159,7 @@ class _PlanetDetailScreenState extends State<PlanetDetailScreen> {
],
flexibleSpace: _CollapsingHero(
detail: d,
watchPlanet: widget.watchPlanet,
min: top + kToolbarHeight + _tabHeight,
hero: PlanetDetailHero(
fandomId: d.fandomId,
@@ -322,9 +324,11 @@ class _CollapsingHero extends StatelessWidget {
required this.detail,
required this.min,
required this.hero,
required this.watchPlanet,
});
final PlanetDetail detail;
final PlanetWatch watchPlanet;
final double min;
final Widget hero;
@@ -356,10 +360,11 @@ class _CollapsingHero extends StatelessWidget {
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Image.asset(
'assets/figma/planet-detail-hero.png',
width: 28,
height: 28,
LivePlanetArt(
fandomId: detail.fandomId,
watch: watchPlanet,
size: 28,
nebula: detail.isNebula,
),
const SizedBox(width: AppSpace.s2),
Flexible(
@@ -4,6 +4,7 @@ import 'package:flutter/material.dart';
import '../../../core/theme/tokens.dart';
import '../../../core/ui/live_planet.dart';
import '../../../core/ui/planet_25d.dart' show planetFallbackImage;
import '../../../core/data/planet_visual_state.dart';
import '../../home/home_screen.dart' show formatPop;
import '../../../core/i18n/app_locale.dart';
@@ -155,7 +156,9 @@ class PlanetDetailHero extends StatelessWidget {
onOpenHistory: onOpenHistory,
fandomId: fandomId,
watch: watchPlanet,
image: 'assets/figma/planet-detail-hero.png',
image: nebula
? 'assets/figma/planet-detail-hero.png'
: planetFallbackImage(fandomId),
size: 200,
glow: AppColors.neonViolet,
stage: stage,
+3 -1
View File
@@ -8,6 +8,7 @@ import '../../core/monetization/store.dart';
import '../home/home_screen.dart' show formatPop;
import '../../core/theme/tokens.dart';
import '../../core/ui/app_dialog.dart' show keepWords;
import '../../core/ui/app_icons.dart';
import '../../core/i18n/app_locale.dart';
@@ -62,7 +63,8 @@ class _AdBonusDialog extends StatelessWidget {
),
const SizedBox(height: 24),
Text(
context.l10n.adMoreChance,
// 25pt 두 줄 제목 — 낱말 중간(「얻으세 / 요.」)이 아니라 어절에서 바꾼다.
keepWords(context.l10n.adMoreChance),
textAlign: TextAlign.center,
style: TextStyle(
fontSize: 25,