refactor(core): 코어 엔진 및 모델 개선
- 애니메이션 시스템 개선 - 오디오 서비스 개선 - 전투/스킬/포션 서비스 개선 - 스토리지 및 저장 시스템 개선 - 모델 클래스 타입 안정성 강화
This commit is contained in:
@@ -1,4 +1,4 @@
|
|||||||
import 'package:askiineverdie/src/app.dart';
|
import 'package:asciineverdie/src/app.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
|
|||||||
@@ -1,25 +1,25 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
import 'package:askiineverdie/data/game_text_l10n.dart' as game_l10n;
|
import 'package:asciineverdie/data/game_text_l10n.dart' as game_l10n;
|
||||||
import 'package:askiineverdie/l10n/app_localizations.dart';
|
import 'package:asciineverdie/l10n/app_localizations.dart';
|
||||||
import 'package:askiineverdie/src/core/audio/audio_service.dart';
|
import 'package:asciineverdie/src/core/audio/audio_service.dart';
|
||||||
import 'package:askiineverdie/src/shared/retro_colors.dart';
|
import 'package:asciineverdie/src/shared/retro_colors.dart';
|
||||||
import 'package:askiineverdie/src/core/engine/game_mutations.dart';
|
import 'package:asciineverdie/src/core/engine/game_mutations.dart';
|
||||||
import 'package:askiineverdie/src/core/engine/progress_service.dart';
|
import 'package:asciineverdie/src/core/engine/progress_service.dart';
|
||||||
import 'package:askiineverdie/src/core/engine/reward_service.dart';
|
import 'package:asciineverdie/src/core/engine/reward_service.dart';
|
||||||
import 'package:askiineverdie/src/core/model/game_state.dart';
|
import 'package:asciineverdie/src/core/model/game_state.dart';
|
||||||
import 'package:askiineverdie/src/core/model/pq_config.dart';
|
import 'package:asciineverdie/src/core/model/pq_config.dart';
|
||||||
import 'package:askiineverdie/src/core/notification/notification_service.dart';
|
import 'package:asciineverdie/src/core/notification/notification_service.dart';
|
||||||
import 'package:askiineverdie/src/core/storage/save_manager.dart';
|
import 'package:asciineverdie/src/core/storage/save_manager.dart';
|
||||||
import 'package:askiineverdie/src/core/storage/save_repository.dart';
|
import 'package:asciineverdie/src/core/storage/save_repository.dart';
|
||||||
import 'package:askiineverdie/src/core/storage/settings_repository.dart';
|
import 'package:asciineverdie/src/core/storage/settings_repository.dart';
|
||||||
import 'package:askiineverdie/src/features/front/front_screen.dart';
|
import 'package:asciineverdie/src/features/front/front_screen.dart';
|
||||||
import 'package:askiineverdie/src/features/front/save_picker_dialog.dart';
|
import 'package:asciineverdie/src/features/front/save_picker_dialog.dart';
|
||||||
import 'package:askiineverdie/src/features/game/game_play_screen.dart';
|
import 'package:asciineverdie/src/features/game/game_play_screen.dart';
|
||||||
import 'package:askiineverdie/src/features/game/game_session_controller.dart';
|
import 'package:asciineverdie/src/features/game/game_session_controller.dart';
|
||||||
import 'package:askiineverdie/src/features/game/widgets/notification_overlay.dart';
|
import 'package:asciineverdie/src/features/game/widgets/notification_overlay.dart';
|
||||||
import 'package:askiineverdie/src/features/hall_of_fame/hall_of_fame_screen.dart';
|
import 'package:asciineverdie/src/features/hall_of_fame/hall_of_fame_screen.dart';
|
||||||
import 'package:askiineverdie/src/features/new_character/new_character_screen.dart';
|
import 'package:asciineverdie/src/features/new_character/new_character_screen.dart';
|
||||||
|
|
||||||
class AskiiNeverDieApp extends StatefulWidget {
|
class AskiiNeverDieApp extends StatefulWidget {
|
||||||
const AskiiNeverDieApp({super.key});
|
const AskiiNeverDieApp({super.key});
|
||||||
@@ -475,7 +475,7 @@ class _AskiiNeverDieAppState extends State<AskiiNeverDieApp> {
|
|||||||
GameState initialState, {
|
GameState initialState, {
|
||||||
bool testMode = false,
|
bool testMode = false,
|
||||||
}) async {
|
}) async {
|
||||||
await _controller.startNew(initialState, cheatsEnabled: false);
|
await _controller.startNew(initialState, cheatsEnabled: testMode);
|
||||||
|
|
||||||
if (context.mounted) {
|
if (context.mounted) {
|
||||||
// NewCharacterScreen을 pop하고 GamePlayScreen으로 이동
|
// NewCharacterScreen을 pop하고 GamePlayScreen으로 이동
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
import 'package:askiineverdie/src/core/animation/ascii_animation_type.dart';
|
import 'package:asciineverdie/src/core/animation/ascii_animation_type.dart';
|
||||||
|
|
||||||
/// ASCII 애니메이션 프레임 데이터
|
/// ASCII 애니메이션 프레임 데이터
|
||||||
class AsciiAnimationData {
|
class AsciiAnimationData {
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import 'package:askiineverdie/src/core/model/game_state.dart';
|
import 'package:asciineverdie/src/core/model/game_state.dart';
|
||||||
|
|
||||||
/// ASCII 애니메이션 타입 (TaskType과 매핑)
|
/// ASCII 애니메이션 타입 (TaskType과 매핑)
|
||||||
enum AsciiAnimationType {
|
enum AsciiAnimationType {
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
// 환경별 배경 패턴 데이터
|
// 환경별 배경 패턴 데이터
|
||||||
// ASCII Patrol 스타일 - 패럴렉스 스크롤링 배경
|
// ASCII Patrol 스타일 - 패럴렉스 스크롤링 배경
|
||||||
|
|
||||||
import 'package:askiineverdie/src/core/animation/background_layer.dart';
|
import 'package:asciineverdie/src/core/animation/background_layer.dart';
|
||||||
|
|
||||||
/// 환경별 배경 레이어 반환
|
/// 환경별 배경 레이어 반환
|
||||||
List<BackgroundLayer> getBackgroundLayers(EnvironmentType environment) {
|
List<BackgroundLayer> getBackgroundLayers(EnvironmentType environment) {
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
import 'dart:ui' as ui;
|
import 'dart:ui' as ui;
|
||||||
|
|
||||||
import 'package:askiineverdie/src/core/animation/canvas/ascii_cell.dart';
|
import 'package:asciineverdie/src/core/animation/canvas/ascii_cell.dart';
|
||||||
import 'package:askiineverdie/src/core/animation/canvas/ascii_layer.dart';
|
import 'package:asciineverdie/src/core/animation/canvas/ascii_layer.dart';
|
||||||
import 'package:askiineverdie/src/core/constants/ascii_colors.dart';
|
import 'package:asciineverdie/src/core/constants/ascii_colors.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
/// Paragraph 캐시 키
|
/// Paragraph 캐시 키
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import 'package:askiineverdie/src/core/animation/canvas/ascii_canvas_painter.dart';
|
import 'package:asciineverdie/src/core/animation/canvas/ascii_canvas_painter.dart';
|
||||||
import 'package:askiineverdie/src/core/animation/canvas/ascii_layer.dart';
|
import 'package:asciineverdie/src/core/animation/canvas/ascii_layer.dart';
|
||||||
import 'package:askiineverdie/src/core/constants/ascii_colors.dart';
|
import 'package:asciineverdie/src/core/constants/ascii_colors.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
/// ASCII Canvas 위젯 (RepaintBoundary 포함)
|
/// ASCII Canvas 위젯 (RepaintBoundary 포함)
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import 'package:askiineverdie/src/core/animation/canvas/ascii_cell.dart';
|
import 'package:asciineverdie/src/core/animation/canvas/ascii_cell.dart';
|
||||||
|
|
||||||
/// ASCII 레이어 데이터 구조 (Canvas 렌더러용)
|
/// ASCII 레이어 데이터 구조 (Canvas 렌더러용)
|
||||||
///
|
///
|
||||||
|
|||||||
@@ -1,13 +1,13 @@
|
|||||||
import 'package:askiineverdie/src/core/animation/ascii_animation_data.dart';
|
import 'package:asciineverdie/src/core/animation/ascii_animation_data.dart';
|
||||||
import 'package:askiineverdie/src/core/animation/background_data.dart';
|
import 'package:asciineverdie/src/core/animation/background_data.dart';
|
||||||
import 'package:askiineverdie/src/core/animation/background_layer.dart';
|
import 'package:asciineverdie/src/core/animation/background_layer.dart';
|
||||||
import 'package:askiineverdie/src/core/animation/canvas/ascii_cell.dart';
|
import 'package:asciineverdie/src/core/animation/canvas/ascii_cell.dart';
|
||||||
import 'package:askiineverdie/src/core/animation/canvas/ascii_layer.dart';
|
import 'package:asciineverdie/src/core/animation/canvas/ascii_layer.dart';
|
||||||
import 'package:askiineverdie/src/core/animation/character_frames.dart';
|
import 'package:asciineverdie/src/core/animation/character_frames.dart';
|
||||||
import 'package:askiineverdie/src/core/animation/monster_size.dart';
|
import 'package:asciineverdie/src/core/animation/monster_size.dart';
|
||||||
import 'package:askiineverdie/src/core/animation/race_character_frames.dart';
|
import 'package:asciineverdie/src/core/animation/race_character_frames.dart';
|
||||||
import 'package:askiineverdie/src/core/animation/weapon_category.dart';
|
import 'package:asciineverdie/src/core/animation/weapon_category.dart';
|
||||||
import 'package:askiineverdie/src/core/animation/weapon_effects.dart';
|
import 'package:asciineverdie/src/core/animation/weapon_effects.dart';
|
||||||
|
|
||||||
/// Canvas용 전투 프레임 합성기
|
/// Canvas용 전투 프레임 합성기
|
||||||
///
|
///
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import 'package:askiineverdie/src/core/animation/ascii_animation_type.dart';
|
import 'package:asciineverdie/src/core/animation/ascii_animation_type.dart';
|
||||||
import 'package:askiineverdie/src/core/animation/canvas/ascii_cell.dart';
|
import 'package:asciineverdie/src/core/animation/canvas/ascii_cell.dart';
|
||||||
import 'package:askiineverdie/src/core/animation/canvas/ascii_layer.dart';
|
import 'package:asciineverdie/src/core/animation/canvas/ascii_layer.dart';
|
||||||
|
|
||||||
/// Canvas용 특수 이벤트 애니메이션 합성기
|
/// Canvas용 특수 이벤트 애니메이션 합성기
|
||||||
///
|
///
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import 'package:askiineverdie/src/core/animation/canvas/ascii_cell.dart';
|
import 'package:asciineverdie/src/core/animation/canvas/ascii_cell.dart';
|
||||||
import 'package:askiineverdie/src/core/animation/canvas/ascii_layer.dart';
|
import 'package:asciineverdie/src/core/animation/canvas/ascii_layer.dart';
|
||||||
import 'package:askiineverdie/src/core/animation/race_character_frames.dart';
|
import 'package:asciineverdie/src/core/animation/race_character_frames.dart';
|
||||||
|
|
||||||
/// Canvas용 마을/상점 애니메이션 합성기
|
/// Canvas용 마을/상점 애니메이션 합성기
|
||||||
///
|
///
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
import 'package:askiineverdie/src/core/animation/background_data.dart';
|
import 'package:asciineverdie/src/core/animation/background_data.dart';
|
||||||
import 'package:askiineverdie/src/core/animation/background_layer.dart';
|
import 'package:asciineverdie/src/core/animation/background_layer.dart';
|
||||||
import 'package:askiineverdie/src/core/animation/canvas/ascii_cell.dart';
|
import 'package:asciineverdie/src/core/animation/canvas/ascii_cell.dart';
|
||||||
import 'package:askiineverdie/src/core/animation/canvas/ascii_layer.dart';
|
import 'package:asciineverdie/src/core/animation/canvas/ascii_layer.dart';
|
||||||
import 'package:askiineverdie/src/core/animation/race_character_frames.dart';
|
import 'package:asciineverdie/src/core/animation/race_character_frames.dart';
|
||||||
|
|
||||||
/// Canvas용 걷기 애니메이션 합성기
|
/// Canvas용 걷기 애니메이션 합성기
|
||||||
///
|
///
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
// 종족별 ASCII 캐릭터 프레임 데이터
|
// 종족별 ASCII 캐릭터 프레임 데이터
|
||||||
// 모든 캐릭터는 3줄 × 6자 폭으로 통일 (보스 10줄과 대비)
|
// 모든 캐릭터는 3줄 × 6자 폭으로 통일 (보스 10줄과 대비)
|
||||||
|
|
||||||
import 'package:askiineverdie/src/core/animation/character_frames.dart';
|
import 'package:asciineverdie/src/core/animation/character_frames.dart';
|
||||||
|
|
||||||
/// 종족별 캐릭터 프레임 저장소
|
/// 종족별 캐릭터 프레임 저장소
|
||||||
class RaceCharacterFrames {
|
class RaceCharacterFrames {
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import 'package:askiineverdie/src/core/animation/weapon_category.dart';
|
import 'package:asciineverdie/src/core/animation/weapon_category.dart';
|
||||||
|
|
||||||
/// 무기 카테고리별 공격 이펙트 ASCII 프레임
|
/// 무기 카테고리별 공격 이펙트 ASCII 프레임
|
||||||
///
|
///
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
import 'package:flutter/foundation.dart' show debugPrint, kIsWeb;
|
import 'package:flutter/foundation.dart' show debugPrint, kIsWeb;
|
||||||
import 'package:just_audio/just_audio.dart';
|
import 'package:just_audio/just_audio.dart';
|
||||||
|
|
||||||
import 'package:askiineverdie/src/core/audio/sfx_channel_pool.dart';
|
import 'package:asciineverdie/src/core/audio/sfx_channel_pool.dart';
|
||||||
import 'package:askiineverdie/src/core/storage/settings_repository.dart';
|
import 'package:asciineverdie/src/core/storage/settings_repository.dart';
|
||||||
|
|
||||||
/// 게임 오디오 서비스
|
/// 게임 오디오 서비스
|
||||||
///
|
///
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
import 'package:askiineverdie/src/shared/retro_colors.dart';
|
import 'package:asciineverdie/src/shared/retro_colors.dart';
|
||||||
|
|
||||||
/// ASCII 애니메이션 4색 팔레트 (Phase 7)
|
/// ASCII 애니메이션 4색 팔레트 (Phase 7)
|
||||||
///
|
///
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
import 'dart:math' as math;
|
import 'dart:math' as math;
|
||||||
|
|
||||||
import 'package:askiineverdie/src/core/model/combat_result.dart';
|
import 'package:asciineverdie/src/core/model/combat_result.dart';
|
||||||
import 'package:askiineverdie/src/core/model/combat_stats.dart';
|
import 'package:asciineverdie/src/core/model/combat_stats.dart';
|
||||||
import 'package:askiineverdie/src/core/model/monster_combat_stats.dart';
|
import 'package:asciineverdie/src/core/model/monster_combat_stats.dart';
|
||||||
import 'package:askiineverdie/src/core/util/deterministic_random.dart';
|
import 'package:asciineverdie/src/core/util/deterministic_random.dart';
|
||||||
|
|
||||||
/// 전투 계산 서비스
|
/// 전투 계산 서비스
|
||||||
///
|
///
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
import 'package:askiineverdie/src/core/engine/item_service.dart';
|
import 'package:asciineverdie/src/core/engine/item_service.dart';
|
||||||
import 'package:askiineverdie/src/core/model/equipment_slot.dart';
|
import 'package:asciineverdie/src/core/model/equipment_slot.dart';
|
||||||
import 'package:askiineverdie/src/core/model/game_state.dart';
|
import 'package:asciineverdie/src/core/model/game_state.dart';
|
||||||
import 'package:askiineverdie/src/core/model/pq_config.dart';
|
import 'package:asciineverdie/src/core/model/pq_config.dart';
|
||||||
import 'package:askiineverdie/src/core/util/pq_logic.dart' as pq_logic;
|
import 'package:asciineverdie/src/core/util/pq_logic.dart' as pq_logic;
|
||||||
|
|
||||||
/// Game state mutations that mirror the original PQ win/reward logic.
|
/// Game state mutations that mirror the original PQ win/reward logic.
|
||||||
class GameMutations {
|
class GameMutations {
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import 'package:askiineverdie/src/core/model/equipment_item.dart';
|
import 'package:asciineverdie/src/core/model/equipment_item.dart';
|
||||||
import 'package:askiineverdie/src/core/model/equipment_slot.dart';
|
import 'package:asciineverdie/src/core/model/equipment_slot.dart';
|
||||||
import 'package:askiineverdie/src/core/model/item_stats.dart';
|
import 'package:asciineverdie/src/core/model/item_stats.dart';
|
||||||
import 'package:askiineverdie/src/core/util/deterministic_random.dart';
|
import 'package:asciineverdie/src/core/util/deterministic_random.dart';
|
||||||
|
|
||||||
/// 아이템 관리 서비스
|
/// 아이템 관리 서비스
|
||||||
///
|
///
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import 'package:askiineverdie/data/potion_data.dart';
|
import 'package:asciineverdie/data/potion_data.dart';
|
||||||
import 'package:askiineverdie/src/core/model/potion.dart';
|
import 'package:asciineverdie/src/core/model/potion.dart';
|
||||||
|
|
||||||
/// 물약 서비스
|
/// 물약 서비스
|
||||||
///
|
///
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
|
|
||||||
import 'package:askiineverdie/src/core/model/game_state.dart';
|
import 'package:asciineverdie/src/core/model/game_state.dart';
|
||||||
import 'package:askiineverdie/src/core/storage/save_manager.dart';
|
import 'package:asciineverdie/src/core/storage/save_manager.dart';
|
||||||
import 'package:askiineverdie/src/core/engine/progress_service.dart';
|
import 'package:asciineverdie/src/core/engine/progress_service.dart';
|
||||||
|
|
||||||
class AutoSaveConfig {
|
class AutoSaveConfig {
|
||||||
const AutoSaveConfig({
|
const AutoSaveConfig({
|
||||||
@@ -40,11 +40,13 @@ class ProgressLoop {
|
|||||||
DateTime Function()? now,
|
DateTime Function()? now,
|
||||||
this.cheatsEnabled = false,
|
this.cheatsEnabled = false,
|
||||||
this.onPlayerDied,
|
this.onPlayerDied,
|
||||||
|
List<int> availableSpeeds = const [1, 5],
|
||||||
}) : _state = initialState,
|
}) : _state = initialState,
|
||||||
_tickInterval = tickInterval,
|
_tickInterval = tickInterval,
|
||||||
_autoSaveConfig = autoSaveConfig,
|
_autoSaveConfig = autoSaveConfig,
|
||||||
_now = now ?? DateTime.now,
|
_now = now ?? DateTime.now,
|
||||||
_stateController = StreamController<GameState>.broadcast();
|
_stateController = StreamController<GameState>.broadcast(),
|
||||||
|
_availableSpeeds = availableSpeeds.isNotEmpty ? availableSpeeds : [1];
|
||||||
|
|
||||||
final ProgressService progressService;
|
final ProgressService progressService;
|
||||||
final SaveManager? saveManager;
|
final SaveManager? saveManager;
|
||||||
@@ -60,21 +62,35 @@ class ProgressLoop {
|
|||||||
Timer? _timer;
|
Timer? _timer;
|
||||||
int? _lastTickMs;
|
int? _lastTickMs;
|
||||||
int _speedMultiplier = 1;
|
int _speedMultiplier = 1;
|
||||||
|
List<int> _availableSpeeds;
|
||||||
|
|
||||||
GameState get current => _state;
|
GameState get current => _state;
|
||||||
Stream<GameState> get stream => _stateController.stream;
|
Stream<GameState> get stream => _stateController.stream;
|
||||||
GameState _state;
|
GameState _state;
|
||||||
|
|
||||||
/// 현재 배속 (1x, 3x, 10x)
|
/// 가용 배속 목록
|
||||||
|
List<int> get availableSpeeds => List.unmodifiable(_availableSpeeds);
|
||||||
|
|
||||||
|
/// 현재 배속 (1x, 2x, 5x)
|
||||||
int get speedMultiplier => _speedMultiplier;
|
int get speedMultiplier => _speedMultiplier;
|
||||||
|
|
||||||
/// 배속 순환: 1 -> 3 -> 10 -> 1
|
/// 배속 순환: 가용 배속 목록 순환
|
||||||
|
/// 명예의 전당에 캐릭터 없으면: 1 -> 5 -> 1
|
||||||
|
/// 명예의 전당에 캐릭터 있으면: 1 -> 2 -> 5 -> 1
|
||||||
void cycleSpeed() {
|
void cycleSpeed() {
|
||||||
_speedMultiplier = switch (_speedMultiplier) {
|
final currentIndex = _availableSpeeds.indexOf(_speedMultiplier);
|
||||||
1 => 3,
|
final nextIndex = (currentIndex + 1) % _availableSpeeds.length;
|
||||||
3 => 10,
|
_speedMultiplier = _availableSpeeds[nextIndex];
|
||||||
_ => 1,
|
}
|
||||||
};
|
|
||||||
|
/// 가용 배속 목록 업데이트 (명예의 전당 상태 변경 시)
|
||||||
|
void updateAvailableSpeeds(List<int> speeds) {
|
||||||
|
if (speeds.isEmpty) return;
|
||||||
|
_availableSpeeds = speeds;
|
||||||
|
// 현재 배속이 새 목록에 없으면 첫 번째로 리셋
|
||||||
|
if (!_availableSpeeds.contains(_speedMultiplier)) {
|
||||||
|
_speedMultiplier = _availableSpeeds.first;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void start() {
|
void start() {
|
||||||
|
|||||||
@@ -1,23 +1,23 @@
|
|||||||
import 'dart:math' as math;
|
import 'dart:math' as math;
|
||||||
|
|
||||||
import 'package:askiineverdie/data/game_text_l10n.dart' as l10n;
|
import 'package:asciineverdie/data/game_text_l10n.dart' as l10n;
|
||||||
import 'package:askiineverdie/data/skill_data.dart';
|
import 'package:asciineverdie/data/skill_data.dart';
|
||||||
import 'package:askiineverdie/src/core/engine/combat_calculator.dart';
|
import 'package:asciineverdie/src/core/engine/combat_calculator.dart';
|
||||||
import 'package:askiineverdie/src/core/engine/game_mutations.dart';
|
import 'package:asciineverdie/src/core/engine/game_mutations.dart';
|
||||||
import 'package:askiineverdie/src/core/engine/potion_service.dart';
|
import 'package:asciineverdie/src/core/engine/potion_service.dart';
|
||||||
import 'package:askiineverdie/src/core/engine/reward_service.dart';
|
import 'package:asciineverdie/src/core/engine/reward_service.dart';
|
||||||
import 'package:askiineverdie/src/core/engine/skill_service.dart';
|
import 'package:asciineverdie/src/core/engine/skill_service.dart';
|
||||||
import 'package:askiineverdie/src/core/model/combat_event.dart';
|
import 'package:asciineverdie/src/core/model/combat_event.dart';
|
||||||
import 'package:askiineverdie/src/core/model/combat_state.dart';
|
import 'package:asciineverdie/src/core/model/combat_state.dart';
|
||||||
import 'package:askiineverdie/src/core/model/combat_stats.dart';
|
import 'package:asciineverdie/src/core/model/combat_stats.dart';
|
||||||
import 'package:askiineverdie/src/core/model/equipment_item.dart';
|
import 'package:asciineverdie/src/core/model/equipment_item.dart';
|
||||||
import 'package:askiineverdie/src/core/model/equipment_slot.dart';
|
import 'package:asciineverdie/src/core/model/equipment_slot.dart';
|
||||||
import 'package:askiineverdie/src/core/model/game_state.dart';
|
import 'package:asciineverdie/src/core/model/game_state.dart';
|
||||||
import 'package:askiineverdie/src/core/model/monster_combat_stats.dart';
|
import 'package:asciineverdie/src/core/model/monster_combat_stats.dart';
|
||||||
import 'package:askiineverdie/src/core/model/potion.dart';
|
import 'package:asciineverdie/src/core/model/potion.dart';
|
||||||
import 'package:askiineverdie/src/core/model/pq_config.dart';
|
import 'package:asciineverdie/src/core/model/pq_config.dart';
|
||||||
import 'package:askiineverdie/src/core/model/skill.dart';
|
import 'package:asciineverdie/src/core/model/skill.dart';
|
||||||
import 'package:askiineverdie/src/core/util/pq_logic.dart' as pq_logic;
|
import 'package:asciineverdie/src/core/util/pq_logic.dart' as pq_logic;
|
||||||
|
|
||||||
class ProgressTickResult {
|
class ProgressTickResult {
|
||||||
const ProgressTickResult({
|
const ProgressTickResult({
|
||||||
@@ -146,9 +146,9 @@ class ProgressService {
|
|||||||
|
|
||||||
/// Tick the timer loop (equivalent to Timer1Timer in the original code).
|
/// Tick the timer loop (equivalent to Timer1Timer in the original code).
|
||||||
ProgressTickResult tick(GameState state, int elapsedMillis) {
|
ProgressTickResult tick(GameState state, int elapsedMillis) {
|
||||||
// 500ms 제한: 5x 배속 (50ms * 5 = 250ms) + 여유 공간
|
// 10000ms 제한: 100x 배속 (50ms * 100 = 5000ms) + 여유 공간
|
||||||
// 원본은 100ms 제한이었으나 배속 기능 지원을 위해 확장
|
// 디버그 터보 모드(100x) 지원을 위해 확장
|
||||||
final int clamped = elapsedMillis.clamp(0, 500).toInt();
|
final int clamped = elapsedMillis.clamp(0, 10000).toInt();
|
||||||
var progress = state.progress;
|
var progress = state.progress;
|
||||||
var queue = state.queue;
|
var queue = state.queue;
|
||||||
var nextState = state;
|
var nextState = state;
|
||||||
|
|||||||
@@ -1,14 +1,14 @@
|
|||||||
import 'dart:math';
|
import 'dart:math';
|
||||||
|
|
||||||
import 'package:askiineverdie/data/class_data.dart';
|
import 'package:asciineverdie/data/class_data.dart';
|
||||||
import 'package:askiineverdie/data/game_text_l10n.dart' as l10n;
|
import 'package:asciineverdie/data/game_text_l10n.dart' as l10n;
|
||||||
import 'package:askiineverdie/data/race_data.dart';
|
import 'package:asciineverdie/data/race_data.dart';
|
||||||
import 'package:askiineverdie/src/core/engine/shop_service.dart';
|
import 'package:asciineverdie/src/core/engine/shop_service.dart';
|
||||||
import 'package:askiineverdie/src/core/model/class_traits.dart';
|
import 'package:asciineverdie/src/core/model/class_traits.dart';
|
||||||
import 'package:askiineverdie/src/core/model/equipment_item.dart';
|
import 'package:asciineverdie/src/core/model/equipment_item.dart';
|
||||||
import 'package:askiineverdie/src/core/model/equipment_slot.dart';
|
import 'package:asciineverdie/src/core/model/equipment_slot.dart';
|
||||||
import 'package:askiineverdie/src/core/model/game_state.dart';
|
import 'package:asciineverdie/src/core/model/game_state.dart';
|
||||||
import 'package:askiineverdie/src/core/model/race_traits.dart';
|
import 'package:asciineverdie/src/core/model/race_traits.dart';
|
||||||
|
|
||||||
/// 부활 시스템 서비스 (Phase 4)
|
/// 부활 시스템 서비스 (Phase 4)
|
||||||
///
|
///
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import 'package:askiineverdie/src/core/engine/game_mutations.dart';
|
import 'package:asciineverdie/src/core/engine/game_mutations.dart';
|
||||||
import 'package:askiineverdie/src/core/model/game_state.dart';
|
import 'package:asciineverdie/src/core/model/game_state.dart';
|
||||||
import 'package:askiineverdie/src/core/util/pq_logic.dart';
|
import 'package:asciineverdie/src/core/util/pq_logic.dart';
|
||||||
|
|
||||||
/// Applies quest/act rewards to the GameState using shared RNG.
|
/// Applies quest/act rewards to the GameState using shared RNG.
|
||||||
class RewardService {
|
class RewardService {
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
import 'package:askiineverdie/src/core/model/equipment_item.dart';
|
import 'package:asciineverdie/src/core/model/equipment_item.dart';
|
||||||
import 'package:askiineverdie/src/core/model/equipment_slot.dart';
|
import 'package:asciineverdie/src/core/model/equipment_slot.dart';
|
||||||
import 'package:askiineverdie/src/core/model/game_state.dart';
|
import 'package:asciineverdie/src/core/model/game_state.dart';
|
||||||
import 'package:askiineverdie/src/core/model/item_stats.dart';
|
import 'package:asciineverdie/src/core/model/item_stats.dart';
|
||||||
import 'package:askiineverdie/src/core/util/deterministic_random.dart';
|
import 'package:asciineverdie/src/core/util/deterministic_random.dart';
|
||||||
|
|
||||||
/// 샵 시스템 서비스 (Phase 4)
|
/// 샵 시스템 서비스 (Phase 4)
|
||||||
///
|
///
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
import 'package:askiineverdie/data/skill_data.dart';
|
import 'package:asciineverdie/data/skill_data.dart';
|
||||||
import 'package:askiineverdie/src/core/model/combat_stats.dart';
|
import 'package:asciineverdie/src/core/model/combat_stats.dart';
|
||||||
import 'package:askiineverdie/src/core/model/game_state.dart';
|
import 'package:asciineverdie/src/core/model/game_state.dart';
|
||||||
import 'package:askiineverdie/src/core/model/monster_combat_stats.dart';
|
import 'package:asciineverdie/src/core/model/monster_combat_stats.dart';
|
||||||
import 'package:askiineverdie/src/core/model/skill.dart';
|
import 'package:asciineverdie/src/core/model/skill.dart';
|
||||||
import 'package:askiineverdie/src/core/util/deterministic_random.dart';
|
import 'package:asciineverdie/src/core/util/deterministic_random.dart';
|
||||||
import 'package:askiineverdie/src/core/util/roman.dart';
|
import 'package:asciineverdie/src/core/util/roman.dart';
|
||||||
|
|
||||||
/// 스킬 시스템 서비스
|
/// 스킬 시스템 서비스
|
||||||
///
|
///
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import 'package:askiineverdie/src/core/model/class_traits.dart';
|
import 'package:asciineverdie/src/core/model/class_traits.dart';
|
||||||
import 'package:askiineverdie/src/core/model/combat_stats.dart';
|
import 'package:asciineverdie/src/core/model/combat_stats.dart';
|
||||||
import 'package:askiineverdie/src/core/model/game_state.dart';
|
import 'package:asciineverdie/src/core/model/game_state.dart';
|
||||||
import 'package:askiineverdie/src/core/model/race_traits.dart';
|
import 'package:asciineverdie/src/core/model/race_traits.dart';
|
||||||
|
|
||||||
/// 스탯 계산기 (stat calculator)
|
/// 스탯 계산기 (stat calculator)
|
||||||
///
|
///
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
|
|
||||||
import 'package:askiineverdie/data/story_data.dart';
|
import 'package:asciineverdie/data/story_data.dart';
|
||||||
|
|
||||||
/// 스토리 이벤트 타입 (Story Event Type)
|
/// 스토리 이벤트 타입 (Story Event Type)
|
||||||
enum StoryEventType {
|
enum StoryEventType {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import 'package:askiineverdie/data/game_text_l10n.dart' as l10n;
|
import 'package:asciineverdie/data/game_text_l10n.dart' as l10n;
|
||||||
import 'package:askiineverdie/data/game_translations_ko.dart';
|
import 'package:asciineverdie/data/game_translations_ko.dart';
|
||||||
import 'package:askiineverdie/src/core/util/pq_logic.dart';
|
import 'package:asciineverdie/src/core/util/pq_logic.dart';
|
||||||
import 'package:flutter/widgets.dart';
|
import 'package:flutter/widgets.dart';
|
||||||
|
|
||||||
/// 게임 데이터 번역을 위한 헬퍼 클래스
|
/// 게임 데이터 번역을 위한 헬퍼 클래스
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import 'package:askiineverdie/src/core/model/equipment_slot.dart';
|
import 'package:asciineverdie/src/core/model/equipment_slot.dart';
|
||||||
import 'package:askiineverdie/src/core/model/race_traits.dart';
|
import 'package:asciineverdie/src/core/model/race_traits.dart';
|
||||||
|
|
||||||
/// 방어구 무게 등급 (armor weight class)
|
/// 방어구 무게 등급 (armor weight class)
|
||||||
enum ArmorWeight {
|
enum ArmorWeight {
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import 'package:askiineverdie/src/core/model/combat_stats.dart';
|
import 'package:asciineverdie/src/core/model/combat_stats.dart';
|
||||||
import 'package:askiineverdie/src/core/model/monster_combat_stats.dart';
|
import 'package:asciineverdie/src/core/model/monster_combat_stats.dart';
|
||||||
|
|
||||||
/// 단일 공격 결과
|
/// 단일 공격 결과
|
||||||
class AttackResult {
|
class AttackResult {
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
import 'package:askiineverdie/src/core/model/combat_event.dart';
|
import 'package:asciineverdie/src/core/model/combat_event.dart';
|
||||||
import 'package:askiineverdie/src/core/model/combat_stats.dart';
|
import 'package:asciineverdie/src/core/model/combat_stats.dart';
|
||||||
import 'package:askiineverdie/src/core/model/monster_combat_stats.dart';
|
import 'package:asciineverdie/src/core/model/monster_combat_stats.dart';
|
||||||
import 'package:askiineverdie/src/core/model/potion.dart';
|
import 'package:asciineverdie/src/core/model/potion.dart';
|
||||||
import 'package:askiineverdie/src/core/model/skill.dart';
|
import 'package:asciineverdie/src/core/model/skill.dart';
|
||||||
|
|
||||||
/// 현재 전투 상태
|
/// 현재 전투 상태
|
||||||
///
|
///
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import 'package:askiineverdie/src/core/model/class_traits.dart';
|
import 'package:asciineverdie/src/core/model/class_traits.dart';
|
||||||
import 'package:askiineverdie/src/core/model/game_state.dart';
|
import 'package:asciineverdie/src/core/model/game_state.dart';
|
||||||
import 'package:askiineverdie/src/core/model/race_traits.dart';
|
import 'package:asciineverdie/src/core/model/race_traits.dart';
|
||||||
|
|
||||||
/// 전투용 파생 스탯
|
/// 전투용 파생 스탯
|
||||||
///
|
///
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import 'package:askiineverdie/src/core/model/equipment_slot.dart';
|
import 'package:asciineverdie/src/core/model/equipment_slot.dart';
|
||||||
import 'package:askiineverdie/src/core/model/item_stats.dart';
|
import 'package:asciineverdie/src/core/model/item_stats.dart';
|
||||||
|
|
||||||
/// 장비 아이템
|
/// 장비 아이템
|
||||||
///
|
///
|
||||||
|
|||||||
@@ -1,13 +1,13 @@
|
|||||||
import 'dart:collection';
|
import 'dart:collection';
|
||||||
|
|
||||||
import 'package:askiineverdie/src/core/model/combat_event.dart';
|
import 'package:asciineverdie/src/core/model/combat_event.dart';
|
||||||
import 'package:askiineverdie/src/core/model/combat_state.dart';
|
import 'package:asciineverdie/src/core/model/combat_state.dart';
|
||||||
import 'package:askiineverdie/src/core/model/equipment_item.dart';
|
import 'package:asciineverdie/src/core/model/equipment_item.dart';
|
||||||
import 'package:askiineverdie/src/core/model/equipment_slot.dart';
|
import 'package:asciineverdie/src/core/model/equipment_slot.dart';
|
||||||
import 'package:askiineverdie/src/core/model/item_stats.dart';
|
import 'package:asciineverdie/src/core/model/item_stats.dart';
|
||||||
import 'package:askiineverdie/src/core/model/potion.dart';
|
import 'package:asciineverdie/src/core/model/potion.dart';
|
||||||
import 'package:askiineverdie/src/core/model/skill.dart';
|
import 'package:asciineverdie/src/core/model/skill.dart';
|
||||||
import 'package:askiineverdie/src/core/util/deterministic_random.dart';
|
import 'package:asciineverdie/src/core/util/deterministic_random.dart';
|
||||||
|
|
||||||
/// Minimal skeletal state to mirror Progress Quest structures.
|
/// Minimal skeletal state to mirror Progress Quest structures.
|
||||||
///
|
///
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import 'package:askiineverdie/src/core/model/combat_stats.dart';
|
import 'package:asciineverdie/src/core/model/combat_stats.dart';
|
||||||
import 'package:askiineverdie/src/core/model/equipment_item.dart';
|
import 'package:asciineverdie/src/core/model/equipment_item.dart';
|
||||||
import 'package:askiineverdie/src/core/model/game_state.dart';
|
import 'package:asciineverdie/src/core/model/game_state.dart';
|
||||||
|
|
||||||
/// 명예의 전당 엔트리 (Phase 10: Hall of Fame Entry)
|
/// 명예의 전당 엔트리 (Phase 10: Hall of Fame Entry)
|
||||||
///
|
///
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import 'package:askiineverdie/src/core/util/balance_constants.dart';
|
import 'package:asciineverdie/src/core/util/balance_constants.dart';
|
||||||
|
|
||||||
/// 몬스터 공격 속도 타입
|
/// 몬스터 공격 속도 타입
|
||||||
enum MonsterSpeedType {
|
enum MonsterSpeedType {
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import 'package:askiineverdie/data/pq_config_data.dart';
|
import 'package:asciineverdie/data/pq_config_data.dart';
|
||||||
|
|
||||||
/// Typed accessors for Progress Quest static data extracted from Config.dfm.
|
/// Typed accessors for Progress Quest static data extracted from Config.dfm.
|
||||||
class PqConfig {
|
class PqConfig {
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import 'dart:collection';
|
import 'dart:collection';
|
||||||
|
|
||||||
import 'package:askiineverdie/src/core/util/deterministic_random.dart';
|
import 'package:asciineverdie/src/core/util/deterministic_random.dart';
|
||||||
import 'package:askiineverdie/src/core/model/game_state.dart';
|
import 'package:asciineverdie/src/core/model/game_state.dart';
|
||||||
|
|
||||||
const int kSaveVersion = 2;
|
const int kSaveVersion = 2;
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import 'dart:convert';
|
import 'dart:convert';
|
||||||
import 'dart:io';
|
import 'dart:io';
|
||||||
|
|
||||||
import 'package:askiineverdie/src/core/model/hall_of_fame.dart';
|
import 'package:asciineverdie/src/core/model/hall_of_fame.dart';
|
||||||
import 'package:path_provider/path_provider.dart';
|
import 'package:path_provider/path_provider.dart';
|
||||||
|
|
||||||
/// 명예의 전당 저장소 (Phase 10: Hall of Fame Storage)
|
/// 명예의 전당 저장소 (Phase 10: Hall of Fame Storage)
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import 'package:askiineverdie/src/core/model/game_state.dart';
|
import 'package:asciineverdie/src/core/model/game_state.dart';
|
||||||
import 'package:askiineverdie/src/core/model/save_data.dart';
|
import 'package:asciineverdie/src/core/model/save_data.dart';
|
||||||
import 'package:askiineverdie/src/core/storage/save_repository.dart';
|
import 'package:asciineverdie/src/core/storage/save_repository.dart';
|
||||||
import 'package:askiineverdie/src/core/storage/save_service.dart'
|
import 'package:asciineverdie/src/core/storage/save_service.dart'
|
||||||
show SaveFileInfo;
|
show SaveFileInfo;
|
||||||
|
|
||||||
/// Coordinates saving/loading GameState using SaveRepository.
|
/// Coordinates saving/loading GameState using SaveRepository.
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import 'dart:io';
|
import 'dart:io';
|
||||||
|
|
||||||
import 'package:askiineverdie/src/core/model/save_data.dart';
|
import 'package:asciineverdie/src/core/model/save_data.dart';
|
||||||
import 'package:askiineverdie/src/core/storage/save_service.dart';
|
import 'package:asciineverdie/src/core/storage/save_service.dart';
|
||||||
import 'package:path_provider/path_provider.dart';
|
import 'package:path_provider/path_provider.dart';
|
||||||
|
|
||||||
class SaveOutcome {
|
class SaveOutcome {
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import 'dart:convert';
|
import 'dart:convert';
|
||||||
import 'dart:io';
|
import 'dart:io';
|
||||||
|
|
||||||
import 'package:askiineverdie/src/core/model/save_data.dart';
|
import 'package:asciineverdie/src/core/model/save_data.dart';
|
||||||
|
|
||||||
/// Persists GameSave as JSON compressed with GZipCodec.
|
/// Persists GameSave as JSON compressed with GZipCodec.
|
||||||
class SaveService {
|
class SaveService {
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import 'dart:convert';
|
import 'dart:convert';
|
||||||
import 'dart:io';
|
import 'dart:io';
|
||||||
|
|
||||||
import 'package:askiineverdie/src/core/model/game_statistics.dart';
|
import 'package:asciineverdie/src/core/model/game_statistics.dart';
|
||||||
import 'package:path_provider/path_provider.dart';
|
import 'package:path_provider/path_provider.dart';
|
||||||
|
|
||||||
/// 게임 통계 저장소 (Statistics Storage)
|
/// 게임 통계 저장소 (Statistics Storage)
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
import 'dart:collection';
|
import 'dart:collection';
|
||||||
import 'dart:math' as math;
|
import 'dart:math' as math;
|
||||||
|
|
||||||
import 'package:askiineverdie/data/game_text_l10n.dart' as l10n;
|
import 'package:asciineverdie/data/game_text_l10n.dart' as l10n;
|
||||||
import 'package:askiineverdie/src/core/model/equipment_slot.dart';
|
import 'package:asciineverdie/src/core/model/equipment_slot.dart';
|
||||||
import 'package:askiineverdie/src/core/model/game_state.dart';
|
import 'package:asciineverdie/src/core/model/game_state.dart';
|
||||||
import 'package:askiineverdie/src/core/model/pq_config.dart';
|
import 'package:asciineverdie/src/core/model/pq_config.dart';
|
||||||
import 'package:askiineverdie/src/core/util/deterministic_random.dart';
|
import 'package:asciineverdie/src/core/util/deterministic_random.dart';
|
||||||
import 'package:askiineverdie/src/core/util/roman.dart';
|
import 'package:asciineverdie/src/core/util/roman.dart';
|
||||||
|
|
||||||
// Mirrors core utility functions from the original Delphi sources (Main.pas / NewGuy.pas).
|
// Mirrors core utility functions from the original Delphi sources (Main.pas / NewGuy.pas).
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user