Skip to content

Commit e38a0c4

Browse files
committed
짐승 넷에게 각자의 꿈 배경을 주고 마지막 잠긴 길을 닫음
합동 수호전은 넷이 수치 구조를 공유한다 — 장벽도 라운드도 결정적 순간의 시점도 같고, 다른 것은 겹별 상성과 연출뿐이다. 그래서 배경까지 공용 수호전 무대를 쓰면 `깊은 꿈`이 그냥 한 판 더가 된다. 넷을 갈라 주는 것이 상성표 두 줄밖에 남지 않는다. 배경은 짐승이 **무엇을 끌어안고 있는지**를 말 없이 보여 주는 자리다. 페이지가 눈처럼 내리는 서고, 소리가 물결로 보이는 우물, 별빛이 모래처럼 쌓이는 보관고, 나이테가 물결치는 관측실 — 콘텐츠에 적어 둔 `dream_scene` 네 줄을 그대로 그렸다. 구도는 기존 수호전 무대를 그대로 따랐다. 이 위에 전투 스프라이트가 얹히기 때문에 아래 가운데는 완전히 빈 둥근 바닥이어야 하고, 짐승 자신도 배경에 그리지 않는다(스프라이트로 따로 선다). 글자·사람·생물 없음. 지역 보정색은 넘기지 않는다. 전용으로 그린 원화라 지역 색을 한 번 더 얹으면 두 번 물든다 — `expeditionRegionGrade`가 전용 원화에 보정을 안 거는 것과 같은 이유다. 강조색은 그 배경에서 실제로 빛나는 색을 하나씩 골랐다. 원화가 없는 짐승은 공용 무대로 **조용히** 물러난다. 조용한 폴백은 눈으로 잡기 어려워서, 네 짐승이 모두 자기 파일을 갖는지·서로 다른지·모바일 파생본과 강조색이 함께 있는지를 검사로 못 박았다. 매핑 한 줄을 지워 빨간불이 되는 것까지 확인했다. 편성 화면에서 그 짐승의 배경 한 장을 미리 읽어 둔다. 이미 짐승을 정하고 들어온 화면이라, 판이 열릴 때 무대가 검은 채로 한 박자 기다리지 않는다. 스택을 띄워 실제로 확인했다. 같은 장부지기 판이 공용 무대가 아니라 자기 서고의 꿈에서 벌어지고, 스프라이트는 비워 둔 바닥에 그대로 선다. 허브에서 `아직 만들고 있어요`로 남은 길은 이제 `장거리 개척` 하나다.
1 parent 86abe52 commit e38a0c4

16 files changed

Lines changed: 188 additions & 2 deletions
99.3 KB
Loading
234 KB
Loading
79 KB
Loading
184 KB
Loading
65 KB
Loading
159 KB
Loading
81.8 KB
Loading
204 KB
Loading

‎app/lib/features/expedition/presentation/joint_guard_battle_view.dart‎

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,33 @@
11
part of 'joint_guard_screen.dart';
22

3+
/// 짐승마다 다른 꿈의 배경.
4+
///
5+
/// 넷이 같은 수호전 무대를 쓰면 `깊은 꿈`이 그냥 한 판 더가 된다. 짐승이
6+
/// 무엇을 끌어안고 있는지가 배경에 그대로 보여야 한다 — 눈처럼 내리는 페이지,
7+
/// 물결로 보이는 소리, 모래처럼 쌓이는 별빛, 물결치는 나이테.
8+
const _dreamSceneAssets = <String, String>{
9+
'ledger_keeper': 'assets/adventure/joint-guard-dream-ledger-keeper-v1.webp',
10+
'echo_keeper': 'assets/adventure/joint-guard-dream-echo-keeper-v1.webp',
11+
'seed_keeper': 'assets/adventure/joint-guard-dream-seed-keeper-v1.webp',
12+
'record_keeper': 'assets/adventure/joint-guard-dream-record-keeper-v1.webp',
13+
};
14+
15+
/// 각 꿈의 강조색. 그 배경에서 실제로 빛나는 색을 골랐다.
16+
const _dreamAccents = <String, Color>{
17+
'ledger_keeper': Color(0xFFE8C77A),
18+
'echo_keeper': Color(0xFF72D6DD),
19+
'seed_keeper': Color(0xFFCBB6F2),
20+
'record_keeper': Color(0xFFE0A76A),
21+
};
22+
23+
/// 짐승의 꿈 무대. 아직 원화가 없는 짐승은 공용 수호전 무대로 물러난다.
24+
ExpeditionSceneTheme dreamSceneFor(String beastCode) => ExpeditionSceneTheme(
25+
assetPath: _dreamSceneAssets[beastCode] ??
26+
expeditionGuardianBattleScene.assetPath,
27+
icon: Icons.bedtime_rounded,
28+
accent: _dreamAccents[beastCode] ?? expeditionGuardianBattleScene.accent,
29+
);
30+
331
/// 판 — 무대, 여섯 슬롯, 그리고 뒤에서 기다리는 셋.
432
///
533
/// 무대와 명령 슬롯은 스테이지 수호전과 **같은 위젯**을 쓴다. 사본을 만들면
@@ -43,9 +71,10 @@ class _JointGuardBattleView extends ConsumerWidget {
4371
radius: 18,
4472
// 무대는 자기 자리를 `Positioned`로 잡는다. 배경이 Stack을
4573
// 열어 주지 않으면 부모 종류가 안 맞아 화면 전체가 무너진다.
74+
// 지역 보정색은 넘기지 않는다. 이 배경은 그 꿈 전용으로
75+
// 그린 원화라, 지역 색을 한 번 더 얹으면 두 번 물든다.
4676
child: ExpeditionSceneBackdrop(
47-
scene: expeditionGuardianBattleScene,
48-
regionCode: state.beast.regionCode,
77+
scene: dreamSceneFor(state.beast.code),
4978
borderRadius: BorderRadius.circular(18),
5079
semanticLabel: '${state.beast.name}의 꿈. '
5180
'${state.layer.name}. '

‎app/lib/features/expedition/presentation/joint_guard_formation_view.dart‎

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,17 @@ class _JointGuardFormationViewState
3232

3333
static const _frontCount = 3;
3434

35+
@override
36+
void didChangeDependencies() {
37+
super.didChangeDependencies();
38+
// 이미 이 짐승으로 정하고 들어온 화면이라, 그 꿈 배경 한 장만 미리 읽어
39+
// 둔다. 판이 열릴 때 무대가 검은 채로 한 박자 기다리지 않는다.
40+
precacheImage(
41+
AssetImage(dreamSceneFor(widget.beastCode).assetPath),
42+
context,
43+
).ignore();
44+
}
45+
3546
bool _isPicked(int plantId) => _slots.contains(plantId);
3647

3748
void _toggle(int plantId) {

0 commit comments

Comments
 (0)