refactor(l10n): 동정 유발 표현을 위협적 표현으로 변경

- 몬스터 수식어 수정 (영어/한국어 모두)
  - dead→fallen, crippled→twisted, sick→tainted
  - undernourished→ravenous, baby→fledgling 등
- 고아/기아 관련 표현 개선
  - orphan→이탈, starvation→고갈, hungry→탐욕스러운
  - parentless→떠도는, Exploited→침해당한
- 일시정지 시 ASCII 애니메이션도 함께 정지하도록 수정
This commit is contained in:
JiWoong Sul
2025-12-15 19:24:32 +09:00
parent 8047abece4
commit 3fdca904a2
4 changed files with 217 additions and 146 deletions

View File

@@ -28,10 +28,14 @@ class AsciiAnimationCard extends StatefulWidget {
this.shieldName,
this.characterLevel,
this.monsterLevel,
this.isPaused = false,
});
final TaskType taskType;
/// 일시정지 상태 (true면 애니메이션 정지)
final bool isPaused;
/// 전투 중인 몬스터 기본 이름 (kill 타입일 때만 사용)
final String? monsterBaseName;
final AsciiColorTheme colorTheme;
@@ -95,6 +99,18 @@ class _AsciiAnimationCardState extends State<AsciiAnimationCard> {
void didUpdateWidget(AsciiAnimationCard oldWidget) {
super.didUpdateWidget(oldWidget);
// 일시정지 상태 변경 처리
if (oldWidget.isPaused != widget.isPaused) {
if (widget.isPaused) {
_timer?.cancel();
_timer = null;
} else {
// 재개: 애니메이션 재시작 (현재 프레임 유지)
_restartTimer();
}
return;
}
// 특수 애니메이션이 변경되었으면 업데이트
if (oldWidget.specialAnimation != widget.specialAnimation) {
_currentSpecialAnimation = widget.specialAnimation;
@@ -116,6 +132,51 @@ class _AsciiAnimationCardState extends State<AsciiAnimationCard> {
}
}
/// 현재 상태를 유지하면서 타이머만 재시작
void _restartTimer() {
_timer?.cancel();
// 특수 애니메이션 타이머 재시작
if (_currentSpecialAnimation != null) {
_timer = Timer.periodic(
Duration(milliseconds: _animationData.frameIntervalMs),
(_) {
if (mounted) {
setState(() {
_currentFrame++;
if (_currentFrame >= _animationData.frames.length) {
_currentSpecialAnimation = null;
_updateAnimation();
}
});
}
},
);
return;
}
// 전투 모드 타이머 재시작
if (_isBattleMode) {
_timer = Timer.periodic(
const Duration(milliseconds: 200),
(_) => _advanceBattleFrame(),
);
} else {
// 일반 애니메이션 타이머 재시작
_timer = Timer.periodic(
Duration(milliseconds: _animationData.frameIntervalMs),
(_) {
if (mounted) {
setState(() {
_currentFrame =
(_currentFrame + 1) % _animationData.frames.length;
});
}
},
);
}
}
void _updateAnimation() {
_timer?.cancel();
@@ -125,6 +186,9 @@ class _AsciiAnimationCardState extends State<AsciiAnimationCard> {
_animationData = getAnimationData(_currentSpecialAnimation!);
_currentFrame = 0;
// 일시정지 상태면 타이머 시작하지 않음
if (widget.isPaused) return;
// 특수 애니메이션은 한 번 재생 후 종료
_timer = Timer.periodic(
Duration(milliseconds: _animationData.frameIntervalMs),
@@ -156,6 +220,9 @@ class _AsciiAnimationCardState extends State<AsciiAnimationCard> {
_phaseIndex = 0;
_phaseFrameCount = 0;
// 일시정지 상태면 타이머 시작하지 않음
if (widget.isPaused) return;
_timer = Timer.periodic(
const Duration(milliseconds: 200),
(_) => _advanceBattleFrame(),
@@ -165,6 +232,9 @@ class _AsciiAnimationCardState extends State<AsciiAnimationCard> {
_animationData = getAnimationData(animationType);
_currentFrame = 0;
// 일시정지 상태면 타이머 시작하지 않음
if (widget.isPaused) return;
_timer = Timer.periodic(
Duration(milliseconds: _animationData.frameIntervalMs),
(_) {

View File

@@ -68,6 +68,7 @@ class TaskProgressPanel extends StatelessWidget {
shieldName: shieldName,
characterLevel: characterLevel,
monsterLevel: monsterLevel,
isPaused: isPaused,
),
),
const SizedBox(height: 8),