From 37a634643eea20e19119a14298165a5f54d8d275 Mon Sep 17 00:00:00 2001 From: Horoli Date: Thu, 4 Dec 2025 16:50:57 +0900 Subject: [PATCH] update --- assets/data/enemies.json | 24 +- assets/data/items.json | 17 + assets/data/players.json | 11 + img_ref/02_err_battle_screen.jpg | Bin 0 -> 72250 bytes img_ref/03_err_inventory_screen.jpg | Bin 0 -> 99858 bytes lib/game/data/enemy_table.dart | 21 +- lib/game/data/item_table.dart | 14 + lib/game/data/player_table.dart | 66 ++ lib/game/model/item.dart | 2 + lib/main.dart | 2 + lib/providers/battle_provider.dart | 30 +- lib/screens/battle_screen.dart | 730 ++++-------------- lib/screens/character_selection_screen.dart | 42 +- lib/screens/inventory_screen.dart | 139 +++- lib/widgets/battle/battle_log_overlay.dart | 31 + lib/widgets/battle/character_status_card.dart | 160 ++++ lib/widgets/battle/floating_battle_texts.dart | 274 +++++++ lib/widgets/battle/stage_ui.dart | 59 ++ prompt/00_project_context_restore.md | 12 +- prompt/34_battle_screen_refactor.md | 28 + prompt/35_enemy_equipment_system.md | 27 + prompt/36_centralize_player_data.md | 35 + test/character_test.dart | 3 + 23 files changed, 1063 insertions(+), 664 deletions(-) create mode 100644 assets/data/players.json create mode 100644 img_ref/02_err_battle_screen.jpg create mode 100644 img_ref/03_err_inventory_screen.jpg create mode 100644 lib/game/data/player_table.dart create mode 100644 lib/widgets/battle/battle_log_overlay.dart create mode 100644 lib/widgets/battle/character_status_card.dart create mode 100644 lib/widgets/battle/floating_battle_texts.dart create mode 100644 lib/widgets/battle/stage_ui.dart create mode 100644 prompt/34_battle_screen_refactor.md create mode 100644 prompt/35_enemy_equipment_system.md create mode 100644 prompt/36_centralize_player_data.md diff --git a/assets/data/enemies.json b/assets/data/enemies.json index 994f557..5fa3236 100644 --- a/assets/data/enemies.json +++ b/assets/data/enemies.json @@ -5,35 +5,40 @@ "baseHp": 20, "baseAtk": 5, "baseDefense": 5, - "image": "assets/images/enemies/goblin.png" + "image": "assets/images/enemies/goblin.png", + "equipment": ["rusty_dagger"] }, { "name": "Slime", "baseHp": 30, "baseAtk": 3, "baseDefense": 5, - "image": "assets/images/enemies/slime.png" + "image": "assets/images/enemies/slime.png", + "equipment": ["rusty_dagger"] }, { "name": "Wolf", "baseHp": 25, "baseAtk": 7, "baseDefense": 5, - "image": "assets/images/enemies/wolf.png" + "image": "assets/images/enemies/wolf.png", + "equipment": ["rusty_dagger"] }, { "name": "Bandit", "baseHp": 35, "baseAtk": 6, "baseDefense": 5, - "image": "assets/images/enemies/bandit.png" + "image": "assets/images/enemies/bandit.png", + "equipment": ["rusty_dagger"] }, { "name": "Skeleton", "baseHp": 15, "baseAtk": 8, "baseDefense": 5, - "image": "assets/images/enemies/skeleton.png" + "image": "assets/images/enemies/skeleton.png", + "equipment": ["rusty_dagger"] } ], "elite": [ @@ -42,21 +47,24 @@ "baseHp": 60, "baseAtk": 12, "baseDefense": 3, - "image": "assets/images/enemies/orc_warrior.png" + "image": "assets/images/enemies/orc_warrior.png", + "equipment": ["battle_axe", "leather_vest"] }, { "name": "Giant Spider", "baseHp": 50, "baseAtk": 15, "baseDefense": 2, - "image": "assets/images/enemies/giant_spider.png" + "image": "assets/images/enemies/giant_spider.png", + "equipment": ["jagged_dagger"] }, { "name": "Dark Knight", "baseHp": 80, "baseAtk": 10, "baseDefense": 5, - "image": "assets/images/enemies/dark_knight.png" + "image": "assets/images/enemies/dark_knight.png", + "equipment": ["stunning_hammer", "kite_shield"] } ] } diff --git a/assets/data/items.json b/assets/data/items.json index 5e917d1..0951a5e 100644 --- a/assets/data/items.json +++ b/assets/data/items.json @@ -1,6 +1,7 @@ { "weapons": [ { + "id": "rusty_dagger", "name": "Rusty Dagger", "description": "Old and rusty, but better than nothing.", "baseAtk": 3, @@ -9,6 +10,7 @@ "image": "assets/images/items/rusty_dagger.png" }, { + "id": "iron_sword", "name": "Iron Sword", "description": "A standard soldier's sword.", "baseAtk": 8, @@ -17,6 +19,7 @@ "image": "assets/images/items/iron_sword.png" }, { + "id": "battle_axe", "name": "Battle Axe", "description": "Heavy but powerful.", "baseAtk": 12, @@ -25,6 +28,7 @@ "image": "assets/images/items/battle_axe.png" }, { + "id": "stunning_hammer", "name": "Stunning Hammer", "description": "A heavy hammer that can stun foes.", "baseAtk": 10, @@ -40,6 +44,7 @@ ] }, { + "id": "jagged_dagger", "name": "Jagged Dagger", "description": "A cruel dagger that causes bleeding.", "baseAtk": 7, @@ -56,6 +61,7 @@ ] }, { + "id": "sunderer_axe", "name": "Sunderer Axe", "description": "An axe that exposes enemy weaknesses.", "baseAtk": 11, @@ -73,6 +79,7 @@ ], "armors": [ { + "id": "torn_tunic", "name": "Torn Tunic", "description": "Offers minimal protection.", "baseHp": 10, @@ -81,6 +88,7 @@ "image": "assets/images/items/torn_tunic.png" }, { + "id": "leather_vest", "name": "Leather Vest", "description": "Light and flexible.", "baseHp": 30, @@ -89,6 +97,7 @@ "image": "assets/images/items/leather_vest.png" }, { + "id": "chainmail", "name": "Chainmail", "description": "Reliable protection against cuts.", "baseHp": 60, @@ -99,6 +108,7 @@ ], "shields": [ { + "id": "pot_lid", "name": "Pot Lid", "description": "It was used for cooking.", "baseArmor": 1, @@ -107,6 +117,7 @@ "image": "assets/images/items/pot_lid.png" }, { + "id": "wooden_shield", "name": "Wooden Shield", "description": "Sturdy oak wood.", "baseArmor": 3, @@ -115,6 +126,7 @@ "image": "assets/images/items/wooden_shield.png" }, { + "id": "kite_shield", "name": "Kite Shield", "description": "Used by knights.", "baseArmor": 6, @@ -123,6 +135,7 @@ "image": "assets/images/items/kite_shield.png" }, { + "id": "cursed_shield", "name": "Cursed Shield", "description": "A shield that prevents the wielder from defending themselves.", "baseArmor": 5, @@ -140,6 +153,7 @@ ], "accessories": [ { + "id": "old_ring", "name": "Old Ring", "description": "A tarnished ring.", "baseAtk": 1, @@ -149,6 +163,7 @@ "image": "assets/images/items/old_ring.png" }, { + "id": "copper_ring", "name": "Copper Ring", "description": "A simple ring", "baseAtk": 1, @@ -158,6 +173,7 @@ "image": "assets/images/items/copper_ring.png" }, { + "id": "ruby_amulet", "name": "Ruby Amulet", "description": "Glows with a faint red light.", "baseAtk": 3, @@ -167,6 +183,7 @@ "image": "assets/images/items/ruby_amulet.png" }, { + "id": "heros_badge", "name": "Hero's Badge", "description": "A badge of honor.", "baseAtk": 5, diff --git a/assets/data/players.json b/assets/data/players.json new file mode 100644 index 0000000..17f8e4d --- /dev/null +++ b/assets/data/players.json @@ -0,0 +1,11 @@ +[ + { + "id": "warrior", + "name": "Warrior", + "description": "A balanced fighter with a sword and shield. Great for beginners.", + "baseHp": 50, + "baseAtk": 5, + "baseDefense": 5, + "image": "assets/images/players/warrior.png" + } +] diff --git a/img_ref/02_err_battle_screen.jpg b/img_ref/02_err_battle_screen.jpg new file mode 100644 index 0000000000000000000000000000000000000000..eb3c791e2f2fa592312a7d78969dda34d052c215 GIT binary patch literal 72250 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 G{9gd$a8}{~ literal 0 HcmV?d00001 diff --git a/img_ref/03_err_inventory_screen.jpg b/img_ref/03_err_inventory_screen.jpg new file mode 100644 index 0000000000000000000000000000000000000000..eee5ac4686903e8af062e87b32afb60b1880eca9 GIT binary patch literal 99858 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%0ACXAEtru0djaS}O-zJ`Wpd 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 X4zU8MXWm|?y#5DZ|GL|Fzl{GMj7+ZK literal 0 HcmV?d00001 diff --git a/lib/game/data/enemy_table.dart b/lib/game/data/enemy_table.dart index 5448b77..2189338 100644 --- a/lib/game/data/enemy_table.dart +++ b/lib/game/data/enemy_table.dart @@ -2,12 +2,15 @@ import 'dart:convert'; import 'package:flutter/services.dart'; import '../model/entity.dart'; +import 'item_table.dart'; + class EnemyTemplate { final String name; final int baseHp; final int baseAtk; final int baseDefense; final String? image; + final List equipmentIds; const EnemyTemplate({ required this.name, @@ -15,6 +18,7 @@ class EnemyTemplate { required this.baseAtk, required this.baseDefense, this.image, + this.equipmentIds = const [], }); factory EnemyTemplate.fromJson(Map json) { @@ -24,6 +28,7 @@ class EnemyTemplate { baseAtk: json['baseAtk'] ?? 1, baseDefense: json['baseDefense'] ?? 0, image: json['image'], + equipmentIds: (json['equipment'] as List?)?.cast() ?? [], ); } @@ -33,7 +38,7 @@ class EnemyTemplate { int scaledAtk = baseAtk + (stage - 1); int scaledDefense = baseDefense + (stage ~/ 5); // +1 defense every 5 stages - return Character( + final character = Character( name: name, maxHp: scaledHp, atk: scaledAtk, @@ -41,6 +46,20 @@ class EnemyTemplate { armor: 0, image: image, ); + + // Equip items + for (final itemId in equipmentIds) { + final itemTemplate = ItemTable.get(itemId); + if (itemTemplate != null) { + // Create item scaled to stage (optional, currently stage 1) + // Enemies might get stronger items at higher stages + final item = itemTemplate.createItem(stage: stage); + character.addToInventory(item); + character.equip(item); + } + } + + return character; } } diff --git a/lib/game/data/item_table.dart b/lib/game/data/item_table.dart index 49e8f28..6fd5456 100644 --- a/lib/game/data/item_table.dart +++ b/lib/game/data/item_table.dart @@ -4,6 +4,7 @@ import '../model/item.dart'; import '../enums.dart'; class ItemTemplate { + final String id; final String name; final String description; final int baseAtk; @@ -15,6 +16,7 @@ class ItemTemplate { final String? image; const ItemTemplate({ + required this.id, required this.name, required this.description, this.baseAtk = 0, @@ -28,6 +30,9 @@ class ItemTemplate { factory ItemTemplate.fromJson(Map json) { return ItemTemplate( + id: + json['id'] ?? + json['name'], // Fallback to name if id is missing (for backward compatibility during dev) name: json['name'], description: json['description'], baseAtk: json['baseAtk'] ?? 0, @@ -60,6 +65,7 @@ class ItemTemplate { } return Item( + id: id, name: "$name${stage > 1 ? ' +${stage - 1}' : ''}", // Append +1, +2 etc. description: description, atkBonus: scaledAtk, @@ -105,4 +111,12 @@ class ItemTable { ...shields, ...accessories, ]; + + static ItemTemplate? get(String id) { + try { + return allItems.firstWhere((item) => item.id == id); + } catch (e) { + return null; + } + } } diff --git a/lib/game/data/player_table.dart b/lib/game/data/player_table.dart new file mode 100644 index 0000000..50bd24d --- /dev/null +++ b/lib/game/data/player_table.dart @@ -0,0 +1,66 @@ +import 'dart:convert'; +import 'package:flutter/services.dart'; +import '../model/entity.dart'; + +class PlayerTemplate { + final String id; + final String name; + final String description; + final int baseHp; + final int baseAtk; + final int baseDefense; + final String? image; + + const PlayerTemplate({ + required this.id, + required this.name, + required this.description, + required this.baseHp, + required this.baseAtk, + required this.baseDefense, + this.image, + }); + + factory PlayerTemplate.fromJson(Map json) { + return PlayerTemplate( + id: json['id'], + name: json['name'], + description: json['description'], + baseHp: json['baseHp'], + baseAtk: json['baseAtk'], + baseDefense: json['baseDefense'], + image: json['image'], + ); + } + + Character createCharacter() { + return Character( + name: name, + maxHp: baseHp, + atk: baseAtk, + baseDefense: baseDefense, + armor: 0, + ); + } +} + +class PlayerTable { + static List players = []; + + static Future load() async { + final String jsonString = await rootBundle.loadString( + 'assets/data/players.json', + ); + final List data = jsonDecode(jsonString); + + players = data.map((e) => PlayerTemplate.fromJson(e)).toList(); + } + + static PlayerTemplate? get(String id) { + try { + return players.firstWhere((player) => player.id == id); + } catch (e) { + return null; + } + } +} diff --git a/lib/game/model/item.dart b/lib/game/model/item.dart index 4719589..bb139c2 100644 --- a/lib/game/model/item.dart +++ b/lib/game/model/item.dart @@ -36,6 +36,7 @@ class ItemEffect { } class Item { + final String id; // Unique identifier final String name; final String description; final int atkBonus; @@ -47,6 +48,7 @@ class Item { final String? image; // New: Image path Item({ + required this.id, required this.name, required this.description, required this.atkBonus, diff --git a/lib/main.dart b/lib/main.dart index e59ab58..022134d 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'game/data/item_table.dart'; import 'game/data/enemy_table.dart'; +import 'game/data/player_table.dart'; import 'providers/battle_provider.dart'; import 'screens/main_menu_screen.dart'; @@ -9,6 +10,7 @@ void main() async { WidgetsFlutterBinding.ensureInitialized(); await ItemTable.load(); await EnemyTable.load(); + await PlayerTable.load(); runApp(const MyApp()); } diff --git a/lib/providers/battle_provider.dart b/lib/providers/battle_provider.dart index fc0a57c..dedf429 100644 --- a/lib/providers/battle_provider.dart +++ b/lib/providers/battle_provider.dart @@ -7,7 +7,9 @@ import '../game/model/item.dart'; import '../game/model/status_effect.dart'; import '../game/model/stage.dart'; import '../game/data/item_table.dart'; + import '../game/data/enemy_table.dart'; +import '../game/data/player_table.dart'; import '../utils/game_math.dart'; import '../game/enums.dart'; import '../game/model/damage_event.dart'; // DamageEvent import @@ -70,16 +72,24 @@ class BattleProvider with ChangeNotifier { void initializeBattle() { stage = 1; turnCount = 1; - player = Character( - name: "Player", - maxHp: 80, - armor: 0, - atk: 5, - baseDefense: 5, - ); + // Load player from PlayerTable + final playerTemplate = PlayerTable.get("warrior"); + if (playerTemplate != null) { + player = playerTemplate.createCharacter(); + } else { + // Fallback if data is missing + player = Character( + name: "Player", + maxHp: 50, + armor: 0, + atk: 5, + baseDefense: 5, + ); + } // Provide starter equipment final starterSword = Item( + id: "starter_sword", name: "Wooden Sword", description: "A basic sword", atkBonus: 5, @@ -87,6 +97,7 @@ class BattleProvider with ChangeNotifier { slot: EquipmentSlot.weapon, ); final starterArmor = Item( + id: "starter_armor", name: "Leather Armor", description: "Basic protection", atkBonus: 0, @@ -94,6 +105,7 @@ class BattleProvider with ChangeNotifier { slot: EquipmentSlot.armor, ); final starterShield = Item( + id: "starter_shield", name: "Wooden Shield", description: "A small shield", atkBonus: 0, @@ -102,6 +114,7 @@ class BattleProvider with ChangeNotifier { slot: EquipmentSlot.shield, ); final starterRing = Item( + id: "starter_ring", name: "Copper Ring", description: "A simple ring", atkBonus: 1, @@ -436,6 +449,9 @@ class BattleProvider with ChangeNotifier { _applyDamage(player, damageToHp, targetType: DamageTarget.player); _addLog("Enemy dealt $damageToHp damage to Player HP."); } + + // Try applying status effects from enemy equipment + _tryApplyStatusEffects(enemy, player); } else { _addLog("Enemy's ${intent.risk.name} attack missed!"); _effectEventController.sink.add( diff --git a/lib/screens/battle_screen.dart b/lib/screens/battle_screen.dart index d26ff68..5f1f6d8 100644 --- a/lib/screens/battle_screen.dart +++ b/lib/screens/battle_screen.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import '../providers/battle_provider.dart'; -import '../game/model/entity.dart'; + import '../game/enums.dart'; import '../game/model/item.dart'; import '../game/model/damage_event.dart'; @@ -9,6 +9,10 @@ import '../game/model/effect_event.dart'; import 'dart:async'; import '../widgets/responsive_container.dart'; import '../utils/item_utils.dart'; +import '../widgets/battle/character_status_card.dart'; +import '../widgets/battle/battle_log_overlay.dart'; +import '../widgets/battle/floating_battle_texts.dart'; +import '../widgets/battle/stage_ui.dart'; class BattleScreen extends StatefulWidget { const BattleScreen({super.key}); @@ -18,25 +22,19 @@ class BattleScreen extends StatefulWidget { } class _BattleScreenState extends State { - final ScrollController _scrollController = ScrollController(); - final List<_DamageTextData> _floatingDamageTexts = []; - final List<_FloatingEffectData> _floatingEffects = []; - final List<_FeedbackTextData> _floatingFeedbackTexts = []; + final List _floatingDamageTexts = []; + final List _floatingEffects = []; + final List _floatingFeedbackTexts = []; StreamSubscription? _damageSubscription; StreamSubscription? _effectSubscription; final GlobalKey _playerKey = GlobalKey(); final GlobalKey _enemyKey = GlobalKey(); final GlobalKey _stackKey = GlobalKey(); + bool _showLogs = true; @override void initState() { super.initState(); - WidgetsBinding.instance.addPostFrameCallback((_) { - if (_scrollController.hasClients) { - _scrollController.jumpTo(_scrollController.position.maxScrollExtent); - } - }); - final battleProvider = context.read(); _damageSubscription = battleProvider.damageStream.listen( _addFloatingDamageText, @@ -48,7 +46,6 @@ class _BattleScreenState extends State { @override void dispose() { - _scrollController.dispose(); _damageSubscription?.cancel(); _effectSubscription?.cancel(); super.dispose(); @@ -82,12 +79,12 @@ class _BattleScreenState extends State { setState(() { _floatingDamageTexts.add( - _DamageTextData( + DamageTextData( id: id, widget: Positioned( left: position.dx, top: position.dy, - child: _FloatingDamageText( + child: FloatingDamageText( key: ValueKey(id), damage: event.damage.toString(), color: event.color, @@ -153,12 +150,12 @@ class _BattleScreenState extends State { final String id = UniqueKey().toString(); setState(() { _floatingFeedbackTexts.add( - _FeedbackTextData( + FeedbackTextData( id: id, widget: Positioned( left: position.dx, top: position.dy, - child: _FloatingFeedbackText( + child: FloatingFeedbackText( key: ValueKey(id), feedback: feedbackText, color: feedbackColor, @@ -213,12 +210,12 @@ class _BattleScreenState extends State { setState(() { _floatingEffects.add( - _FloatingEffectData( + FloatingEffectData( id: id, widget: Positioned( left: position.dx, top: position.dy, - child: _FloatingEffect( + child: FloatingEffect( key: ValueKey(id), icon: icon, color: color, @@ -295,13 +292,6 @@ class _BattleScreenState extends State { onPressed: () { context.read().playerAction(actionType, risk); Navigator.pop(context); - WidgetsBinding.instance.addPostFrameCallback((_) { - _scrollController.animateTo( - _scrollController.position.maxScrollExtent, - duration: const Duration(milliseconds: 300), - curve: Curves.easeOut, - ); - }); }, child: Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -329,15 +319,18 @@ class _BattleScreenState extends State { child: Consumer( builder: (context, battleProvider, child) { if (battleProvider.currentStage.type == StageType.shop) { - return _buildShopUI(context, battleProvider); + return ShopUI(battleProvider: battleProvider); } else if (battleProvider.currentStage.type == StageType.rest) { - return _buildRestUI(context, battleProvider); + return RestUI(battleProvider: battleProvider); } return Stack( key: _stackKey, children: [ + // 1. Background (Black) Container(color: Colors.black87), + + // 2. Battle Content (Top Bar + Characters) Column( children: [ // Top Bar @@ -346,125 +339,135 @@ class _BattleScreenState extends State { child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Text( - "Stage ${battleProvider.stage}", - style: const TextStyle( - color: Colors.white, - fontSize: 18, - fontWeight: FontWeight.bold, + Flexible( + child: FittedBox( + fit: BoxFit.scaleDown, + child: Text( + "Stage ${battleProvider.stage}", + style: const TextStyle( + color: Colors.white, + fontSize: 18, + fontWeight: FontWeight.bold, + ), + ), ), ), - Text( - "Turn ${battleProvider.turnCount}", - style: const TextStyle( - color: Colors.white, - fontSize: 18, + Flexible( + child: FittedBox( + fit: BoxFit.scaleDown, + child: Text( + "Turn ${battleProvider.turnCount}", + style: const TextStyle( + color: Colors.white, + fontSize: 18, + ), + ), ), ), ], ), ), - // Battle Area + // Battle Area (Characters) - Expanded to fill available space Expanded( child: Padding( - // padding: const EdgeInsets.symmetric(horizontal: 40.0), - padding: const EdgeInsets.all(70.0), - child: Column( + padding: const EdgeInsets.all(16.0), + child: Stack( children: [ - // 적 영역 (우측 상단) - Expanded( - child: Align( - alignment: Alignment.topRight, - child: _buildCharacterStatus( - battleProvider.enemy, - isPlayer: false, - isTurn: !battleProvider.isPlayerTurn, - key: _enemyKey, - ), + // Enemy (Top Right) + Positioned( + top: 0, + right: 0, + child: CharacterStatusCard( + character: battleProvider.enemy, + isPlayer: false, + isTurn: !battleProvider.isPlayerTurn, + key: _enemyKey, ), ), - // 플레이어 영역 (좌측 하단) - Expanded( - child: Align( - alignment: Alignment.bottomLeft, - child: _buildCharacterStatus( - battleProvider.player, - isPlayer: true, - isTurn: battleProvider.isPlayerTurn, - key: _playerKey, - ), + // Player (Bottom Left) + Positioned( + bottom: 80, // Space for FABs + left: 0, + child: CharacterStatusCard( + character: battleProvider.player, + isPlayer: true, + isTurn: battleProvider.isPlayerTurn, + key: _playerKey, ), ), ], ), ), ), - - // Action Buttons - Padding( - padding: const EdgeInsets.all(16.0), - child: Column( - children: [ - if (battleProvider.logs.isNotEmpty) - Container( - height: 60, - padding: const EdgeInsets.all(8.0), - decoration: BoxDecoration( - color: Colors.black54, - borderRadius: BorderRadius.circular(8), - ), - child: ListView.builder( - reverse: true, - itemCount: battleProvider.logs.length, - itemBuilder: (context, index) { - final logIndex = - battleProvider.logs.length - 1 - index; - return Text( - battleProvider.logs[logIndex], - style: const TextStyle( - color: Colors.white70, - fontSize: 12, - ), - ); - }, - ), - ), - const SizedBox(height: 16), - Card( - color: Colors.grey[900], - child: Padding( - padding: const EdgeInsets.all(8.0), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - _buildActionButton( - context, - "ATTACK", - ActionType.attack, - battleProvider.isPlayerTurn && - !battleProvider.player.isDead && - !battleProvider.enemy.isDead && - !battleProvider.showRewardPopup, - ), - _buildActionButton( - context, - "DEFEND", - ActionType.defend, - battleProvider.isPlayerTurn && - !battleProvider.player.isDead && - !battleProvider.enemy.isDead && - !battleProvider.showRewardPopup, - ), - ], - ), - ), - ), - ], - ), - ), ], ), + + // 3. Logs Overlay + if (_showLogs && battleProvider.logs.isNotEmpty) + Positioned( + top: 60, + left: 16, + right: 16, + height: 150, + child: BattleLogOverlay(logs: battleProvider.logs), + ), + + // 4. Floating Action Buttons (Bottom Right) + Positioned( + bottom: 20, + right: 20, + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + _buildFloatingActionButton( + context, + "ATK", + Icons.whatshot, + Colors.redAccent, + ActionType.attack, + battleProvider.isPlayerTurn && + !battleProvider.player.isDead && + !battleProvider.enemy.isDead && + !battleProvider.showRewardPopup, + ), + const SizedBox(height: 16), + _buildFloatingActionButton( + context, + "DEF", + Icons.shield, + Colors.blueAccent, + ActionType.defend, + battleProvider.isPlayerTurn && + !battleProvider.player.isDead && + !battleProvider.enemy.isDead && + !battleProvider.showRewardPopup, + ), + ], + ), + ), + + // 5. Log Toggle Button (Bottom Left) + Positioned( + bottom: 20, + left: 20, + child: FloatingActionButton( + heroTag: "logToggle", + mini: true, + backgroundColor: Colors.grey[800], + onPressed: () { + setState(() { + _showLogs = !_showLogs; + }); + }, + child: Icon( + _showLogs ? Icons.visibility_off : Icons.visibility, + color: Colors.white, + ), + ), + ), + + // Reward Popup if (battleProvider.showRewardPopup) Container( color: Colors.black54, @@ -519,9 +522,11 @@ class _BattleScreenState extends State { ), ), ), + + // Floating Effects ..._floatingDamageTexts.map((e) => e.widget), ..._floatingEffects.map((e) => e.widget), - ..._floatingFeedbackTexts.map((e) => e.widget), // 새로운 피드백 텍스트 추가 + ..._floatingFeedbackTexts.map((e) => e.widget), ], ); }, @@ -529,49 +534,6 @@ class _BattleScreenState extends State { ); } - Widget _buildShopUI(BuildContext context, BattleProvider battleProvider) { - return Center( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - const Icon(Icons.store, size: 64, color: Colors.amber), - const SizedBox(height: 16), - const Text("Merchant Shop", style: TextStyle(fontSize: 24)), - const SizedBox(height: 8), - const Text("Buying/Selling feature coming soon!"), - const SizedBox(height: 32), - ElevatedButton( - onPressed: () => battleProvider.proceedToNextStage(), - child: const Text("Leave Shop"), - ), - ], - ), - ); - } - - Widget _buildRestUI(BuildContext context, BattleProvider battleProvider) { - return Center( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - const Icon(Icons.local_hotel, size: 64, color: Colors.blue), - const SizedBox(height: 16), - const Text("Rest Area", style: TextStyle(fontSize: 24)), - const SizedBox(height: 8), - const Text("Take a breath and heal."), - const SizedBox(height: 32), - ElevatedButton( - onPressed: () { - battleProvider.player.heal(20); - battleProvider.proceedToNextStage(); - }, - child: const Text("Rest & Leave (+20 HP)"), - ), - ], - ), - ); - } - Widget _buildItemStatText(Item item) { List stats = []; if (item.atkBonus > 0) stats.add("+${item.atkBonus} ATK"); @@ -605,435 +567,21 @@ class _BattleScreenState extends State { ); } - Widget _buildCharacterStatus( - Character character, { - bool isPlayer = false, - bool isTurn = false, - Key? key, - }) { - return Column( - key: key, - children: [ - Text("Armor: ${character.armor}"), - Text( - "${character.name}: HP ${character.hp}/${character.totalMaxHp}", - style: TextStyle( - color: character.isDead ? Colors.red : Colors.white, - fontWeight: FontWeight.bold, - ), - ), - SizedBox( - width: 100, - child: LinearProgressIndicator( - value: character.totalMaxHp > 0 - ? character.hp / character.totalMaxHp - : 0, - color: !isPlayer ? Colors.red : Colors.green, - backgroundColor: Colors.grey, - ), - ), - if (character.statusEffects.isNotEmpty) - Padding( - padding: const EdgeInsets.only(top: 4.0), - child: Wrap( - spacing: 4.0, - children: character.statusEffects.map((effect) { - return Container( - padding: const EdgeInsets.symmetric( - horizontal: 6, - vertical: 2, - ), - decoration: BoxDecoration( - color: Colors.deepOrange, - borderRadius: BorderRadius.circular(4), - ), - child: Text( - "${effect.type.name.toUpperCase()} (${effect.duration})", - style: const TextStyle( - color: Colors.white, - fontSize: 10, - fontWeight: FontWeight.bold, - ), - ), - ); - }).toList(), - ), - ), - Text("ATK: ${character.totalAtk}"), - Text("DEF: ${character.totalDefense}"), - // 캐릭터 아이콘/이미지 영역 추가 - Container( - width: 100, // 임시 크기 - height: 100, // 임시 크기 - decoration: BoxDecoration( - color: isPlayer - ? Colors.lightBlue - : Colors.deepOrange, // 플레이어/적 구분 색상 - borderRadius: BorderRadius.circular(8), - ), - child: Center( - child: isPlayer - ? const Icon( - Icons.person, - size: 60, - color: Colors.white, - ) // 플레이어 아이콘 - : const Icon( - Icons.psychology, - size: 60, - color: Colors.white, - ), // 적 아이콘 (몬스터 대신) - ), - ), - const SizedBox(height: 8), // 아이콘과 정보 사이 간격 - - if (!isPlayer) - Consumer( - builder: (context, provider, child) { - if (provider.currentEnemyIntent != null && !character.isDead) { - final intent = provider.currentEnemyIntent!; - return Padding( - padding: const EdgeInsets.only(top: 8.0), - child: Container( - padding: const EdgeInsets.all(8.0), - decoration: BoxDecoration( - color: Colors.black54, - borderRadius: BorderRadius.circular(8), - border: Border.all(color: Colors.redAccent), - ), - child: Column( - children: [ - Text( - "INTENT", - style: TextStyle( - color: Colors.redAccent, - fontSize: 10, - fontWeight: FontWeight.bold, - ), - ), - Row( - mainAxisSize: MainAxisSize.min, - children: [ - Icon( - intent.type == EnemyActionType.attack - ? Icons.flash_on - : Icons.shield, - color: Colors.yellow, - size: 16, - ), - const SizedBox(width: 4), - Text( - intent.description, - style: const TextStyle( - color: Colors.white, - fontSize: 12, - ), - ), - ], - ), - ], - ), - ), - ); - } - return const SizedBox.shrink(); - }, - ), - ], - ); - } - - Widget _buildActionButton( + Widget _buildFloatingActionButton( BuildContext context, - String text, + String label, + IconData icon, + Color color, ActionType actionType, bool isEnabled, ) { - return ElevatedButton( + return FloatingActionButton( + heroTag: label, onPressed: isEnabled ? () => _showRiskLevelSelection(context, actionType) : null, - style: ElevatedButton.styleFrom( - padding: const EdgeInsets.symmetric(horizontal: 30, vertical: 15), - backgroundColor: Colors.blueGrey, - foregroundColor: Colors.white, - textStyle: const TextStyle(fontSize: 18, fontWeight: FontWeight.bold), - ), - child: Text(text), + backgroundColor: isEnabled ? color : Colors.grey, + child: Icon(icon), ); } } - -class _FloatingDamageText extends StatefulWidget { - final String damage; - final Color color; - final VoidCallback onRemove; - - const _FloatingDamageText({ - Key? key, - required this.damage, - required this.color, - required this.onRemove, - }) : super(key: key); - - @override - __FloatingDamageTextState createState() => __FloatingDamageTextState(); -} - -class __FloatingDamageTextState extends State<_FloatingDamageText> - with SingleTickerProviderStateMixin { - late AnimationController _controller; - late Animation _offsetAnimation; - late Animation _opacityAnimation; - - @override - void initState() { - super.initState(); - _controller = AnimationController( - duration: const Duration(milliseconds: 1000), - vsync: this, - ); - - _offsetAnimation = Tween( - begin: const Offset(0.0, 0.0), - end: const Offset(0.0, -1.5), - ).animate(CurvedAnimation(parent: _controller, curve: Curves.easeOut)); - - _opacityAnimation = Tween(begin: 1.0, end: 0.0).animate( - CurvedAnimation( - parent: _controller, - curve: const Interval(0.5, 1.0, curve: Curves.easeOut), - ), - ); - - _controller.forward().then((_) { - if (mounted) { - widget.onRemove(); - } - }); - } - - @override - void dispose() { - _controller.dispose(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - return AnimatedBuilder( - animation: _controller, - builder: (context, child) { - return FractionalTranslation( - translation: _offsetAnimation.value, - child: Opacity( - opacity: _opacityAnimation.value, - child: Material( - color: Colors.transparent, - child: Text( - widget.damage, - style: TextStyle( - color: widget.color, - fontSize: 20, - fontWeight: FontWeight.bold, - shadows: const [ - Shadow( - blurRadius: 2.0, - color: Colors.black, - offset: Offset(1.0, 1.0), - ), - ], - ), - ), - ), - ), - ); - }, - ); - } -} - -class _DamageTextData { - final String id; - final Widget widget; - - _DamageTextData({required this.id, required this.widget}); -} - -class _FloatingEffect extends StatefulWidget { - final IconData icon; - final Color color; - final double size; - final VoidCallback onRemove; - - const _FloatingEffect({ - Key? key, - required this.icon, - required this.color, - required this.size, - required this.onRemove, - }) : super(key: key); - - @override - __FloatingEffectState createState() => __FloatingEffectState(); -} - -class __FloatingEffectState extends State<_FloatingEffect> - with SingleTickerProviderStateMixin { - late AnimationController _controller; - late Animation _scaleAnimation; - late Animation _opacityAnimation; - - @override - void initState() { - super.initState(); - _controller = AnimationController( - duration: const Duration(milliseconds: 800), - vsync: this, - ); - - _scaleAnimation = Tween( - begin: 0.5, - end: 1.5, - ).animate(CurvedAnimation(parent: _controller, curve: Curves.elasticOut)); - - _opacityAnimation = Tween(begin: 1.0, end: 0.0).animate( - CurvedAnimation( - parent: _controller, - curve: const Interval(0.5, 1.0, curve: Curves.easeOut), - ), - ); - - _controller.forward().then((_) { - if (mounted) { - widget.onRemove(); - } - }); - } - - @override - void dispose() { - _controller.dispose(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - return AnimatedBuilder( - animation: _controller, - builder: (context, child) { - return Transform.scale( - scale: _scaleAnimation.value, - child: Opacity( - opacity: _opacityAnimation.value, - child: Icon(widget.icon, color: widget.color, size: widget.size), - ), - ); - }, - ); - } -} - -class _FloatingEffectData { - final String id; - final Widget widget; - - _FloatingEffectData({required this.id, required this.widget}); -} - -// 새로운 _FloatingFeedbackText 위젯 -class _FloatingFeedbackText extends StatefulWidget { - final String feedback; - final Color color; - final VoidCallback onRemove; - - const _FloatingFeedbackText({ - Key? key, - required this.feedback, - required this.color, - required this.onRemove, - }) : super(key: key); - - @override - __FloatingFeedbackTextState createState() => __FloatingFeedbackTextState(); -} - -class __FloatingFeedbackTextState extends State<_FloatingFeedbackText> - with SingleTickerProviderStateMixin { - late AnimationController _controller; - late Animation _offsetAnimation; - late Animation _opacityAnimation; - - @override - void initState() { - super.initState(); - _controller = AnimationController( - duration: const Duration(milliseconds: 1000), - vsync: this, - ); - - _offsetAnimation = Tween( - begin: const Offset(0.0, 0.0), - end: const Offset(0.0, -1.5), - ).animate(CurvedAnimation(parent: _controller, curve: Curves.easeOut)); - - _opacityAnimation = Tween(begin: 1.0, end: 0.0).animate( - CurvedAnimation( - parent: _controller, - curve: const Interval(0.5, 1.0, curve: Curves.easeOut), - ), - ); - - _controller.forward().then((_) { - if (mounted) { - widget.onRemove(); - } - }); - } - - @override - void dispose() { - _controller.dispose(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - return AnimatedBuilder( - animation: _controller, - builder: (context, child) { - return FractionalTranslation( - translation: _offsetAnimation.value, - child: Opacity( - opacity: _opacityAnimation.value, - child: Material( - color: Colors.transparent, - child: Text( - widget.feedback, - style: TextStyle( - color: widget.color, - fontSize: 20, - fontWeight: FontWeight.bold, - shadows: const [ - Shadow( - blurRadius: 2.0, - color: Colors.black, - offset: Offset(1.0, 1.0), - ), - ], - ), - ), - ), - ), - ); - }, - ); - } -} - -class _FeedbackTextData { - final String id; - final Widget widget; - - _FeedbackTextData({required this.id, required this.widget}); -} diff --git a/lib/screens/character_selection_screen.dart b/lib/screens/character_selection_screen.dart index c3e9ba6..fabb849 100644 --- a/lib/screens/character_selection_screen.dart +++ b/lib/screens/character_selection_screen.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import '../providers/battle_provider.dart'; +import '../game/data/player_table.dart'; import 'main_wrapper.dart'; import '../widgets/responsive_container.dart'; @@ -9,6 +10,15 @@ class CharacterSelectionScreen extends StatelessWidget { @override Widget build(BuildContext context) { + // Fetch Warrior data + final warrior = PlayerTable.get("warrior"); + + if (warrior == null) { + return const Scaffold( + body: Center(child: Text("Error: Player data not found")), + ); + } + return Scaffold( backgroundColor: Colors.black, // Outer background body: Center( @@ -51,37 +61,43 @@ class CharacterSelectionScreen extends StatelessWidget { color: Colors.blue, ), const SizedBox(height: 16), - const Text( - "Warrior", - style: TextStyle( + Text( + warrior.name, + style: const TextStyle( fontSize: 24, fontWeight: FontWeight.bold, color: Colors.white, ), ), const SizedBox(height: 8), - const Text( - "A balanced fighter with a sword and shield. Great for beginners.", + Text( + warrior.description, textAlign: TextAlign.center, - style: TextStyle(color: Colors.grey), + style: const TextStyle(color: Colors.grey), ), const SizedBox(height: 16), const Divider(), const SizedBox(height: 8), - const Row( + Row( mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ Text( - "HP: 80", - style: TextStyle(fontWeight: FontWeight.bold), + "HP: ${warrior.baseHp}", + style: const TextStyle( + fontWeight: FontWeight.bold, + ), ), Text( - "ATK: 5", - style: TextStyle(fontWeight: FontWeight.bold), + "ATK: ${warrior.baseAtk}", + style: const TextStyle( + fontWeight: FontWeight.bold, + ), ), Text( - "DEF: 5", - style: TextStyle(fontWeight: FontWeight.bold), + "DEF: ${warrior.baseDefense}", + style: const TextStyle( + fontWeight: FontWeight.bold, + ), ), ], ), diff --git a/lib/screens/inventory_screen.dart b/lib/screens/inventory_screen.dart index ef89065..0294167 100644 --- a/lib/screens/inventory_screen.dart +++ b/lib/screens/inventory_screen.dart @@ -88,41 +88,73 @@ class InventoryScreen extends StatelessWidget { color: item != null ? Colors.blueGrey[600] : Colors.grey[800], - child: Padding( - padding: const EdgeInsets.all(8.0), - child: Column( - children: [ - Text( + child: Stack( + children: [ + // Slot Name (Top Right) + Positioned( + right: 4, + top: 4, + child: Text( slot.name.toUpperCase(), style: const TextStyle( - fontSize: 10, + fontSize: 8, fontWeight: FontWeight.bold, - color: Colors.grey, + color: Colors.white30, ), ), - const SizedBox(height: 4), - Icon( - ItemUtils.getIcon(slot), - size: 24, - color: item != null - ? ItemUtils.getColor(slot) - : Colors.grey, - ), - const SizedBox(height: 4), - Text( - item?.name ?? "Empty", - textAlign: TextAlign.center, - style: TextStyle( - fontSize: 12, + ), + // Faded Icon (Top Left) + Positioned( + left: 4, + top: 4, + child: Opacity( + opacity: item != null ? 0.2 : 0.1, + child: Icon( + ItemUtils.getIcon(slot), + size: 40, color: item != null - ? Colors.white + ? ItemUtils.getColor(slot) : Colors.grey, ), - overflow: TextOverflow.ellipsis, ), - if (item != null) _buildItemStatText(item), - ], - ), + ), + // Content + Center( + child: Padding( + padding: const EdgeInsets.all(4.0), + child: Column( + mainAxisAlignment: + MainAxisAlignment.center, + children: [ + const SizedBox( + height: 12, + ), // Spacing for top elements + FittedBox( + fit: BoxFit.scaleDown, + child: Text( + item?.name ?? "Empty", + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 11, + fontWeight: FontWeight.bold, + color: item != null + ? Colors.white + : Colors.grey, + ), + maxLines: 2, + overflow: TextOverflow.ellipsis, + ), + ), + if (item != null) + FittedBox( + fit: BoxFit.scaleDown, + child: _buildItemStatText(item), + ), + ], + ), + ), + ), + ], ), ), ), @@ -169,24 +201,49 @@ class InventoryScreen extends StatelessWidget { }, child: Card( color: Colors.blueGrey[700], - child: Column( - mainAxisAlignment: MainAxisAlignment.center, + child: Stack( children: [ - Icon( - ItemUtils.getIcon(item.slot), - size: 32, - color: ItemUtils.getColor(item.slot), - ), - Padding( - padding: const EdgeInsets.all(4.0), - child: Text( - item.name, - textAlign: TextAlign.center, - style: const TextStyle(fontSize: 10), - overflow: TextOverflow.ellipsis, + // Faded Icon in Top-Left + Positioned( + left: 4, + top: 4, + child: Opacity( + opacity: 0.2, + child: Icon( + ItemUtils.getIcon(item.slot), + size: 40, + color: ItemUtils.getColor(item.slot), + ), + ), + ), + // Centered Content + Center( + child: Padding( + padding: const EdgeInsets.all(4.0), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + FittedBox( + fit: BoxFit.scaleDown, + child: Text( + item.name, + textAlign: TextAlign.center, + style: const TextStyle( + fontSize: 11, + fontWeight: FontWeight.bold, + ), + maxLines: 2, + overflow: TextOverflow.ellipsis, + ), + ), + FittedBox( + fit: BoxFit.scaleDown, + child: _buildItemStatText(item), + ), + ], + ), ), ), - _buildItemStatText(item), ], ), ), diff --git a/lib/widgets/battle/battle_log_overlay.dart b/lib/widgets/battle/battle_log_overlay.dart new file mode 100644 index 0000000..87458f3 --- /dev/null +++ b/lib/widgets/battle/battle_log_overlay.dart @@ -0,0 +1,31 @@ +import 'package:flutter/material.dart'; + +class BattleLogOverlay extends StatelessWidget { + final List logs; + + const BattleLogOverlay({super.key, required this.logs}); + + @override + Widget build(BuildContext context) { + if (logs.isEmpty) return const SizedBox.shrink(); + + return Container( + padding: const EdgeInsets.all(8.0), + decoration: BoxDecoration( + color: Colors.black54, + borderRadius: BorderRadius.circular(8), + ), + child: ListView.builder( + reverse: true, + itemCount: logs.length, + itemBuilder: (context, index) { + final logIndex = logs.length - 1 - index; + return Text( + logs[logIndex], + style: const TextStyle(color: Colors.white70, fontSize: 12), + ); + }, + ), + ); + } +} diff --git a/lib/widgets/battle/character_status_card.dart b/lib/widgets/battle/character_status_card.dart new file mode 100644 index 0000000..ba5bc5d --- /dev/null +++ b/lib/widgets/battle/character_status_card.dart @@ -0,0 +1,160 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import '../../game/model/entity.dart'; +import '../../game/enums.dart'; +import '../../providers/battle_provider.dart'; + +class CharacterStatusCard extends StatelessWidget { + final Character character; + final bool isPlayer; + final bool isTurn; + + const CharacterStatusCard({ + super.key, + required this.character, + this.isPlayer = false, + this.isTurn = false, + }); + + @override + Widget build(BuildContext context) { + return Column( + children: [ + FittedBox( + fit: BoxFit.scaleDown, + child: Text( + "Armor: ${character.armor}", + style: const TextStyle(color: Colors.white), + ), + ), + FittedBox( + fit: BoxFit.scaleDown, + child: Text( + "${character.name}: HP ${character.hp}/${character.totalMaxHp}", + style: TextStyle( + color: character.isDead ? Colors.red : Colors.white, + fontWeight: FontWeight.bold, + ), + ), + ), + SizedBox( + width: 100, + child: LinearProgressIndicator( + value: character.totalMaxHp > 0 + ? character.hp / character.totalMaxHp + : 0, + color: !isPlayer ? Colors.red : Colors.green, + backgroundColor: Colors.grey, + ), + ), + if (character.statusEffects.isNotEmpty) + Padding( + padding: const EdgeInsets.only(top: 4.0), + child: Wrap( + spacing: 4.0, + children: character.statusEffects.map((effect) { + return Container( + padding: const EdgeInsets.symmetric( + horizontal: 6, + vertical: 2, + ), + decoration: BoxDecoration( + color: Colors.deepOrange, + borderRadius: BorderRadius.circular(4), + ), + child: Text( + "${effect.type.name.toUpperCase()} (${effect.duration})", + style: const TextStyle( + color: Colors.white, + fontSize: 10, + fontWeight: FontWeight.bold, + ), + ), + ); + }).toList(), + ), + ), + Text("ATK: ${character.totalAtk}"), + Text("DEF: ${character.totalDefense}"), + // 캐릭터 아이콘/이미지 영역 추가 + Container( + width: 100, // 임시 크기 + height: 100, // 임시 크기 + decoration: BoxDecoration( + color: isPlayer + ? Colors.lightBlue + : Colors.deepOrange, // 플레이어/적 구분 색상 + borderRadius: BorderRadius.circular(8), + ), + child: Center( + child: isPlayer + ? const Icon( + Icons.person, + size: 60, + color: Colors.white, + ) // 플레이어 아이콘 + : const Icon( + Icons.psychology, + size: 60, + color: Colors.white, + ), // 적 아이콘 (몬스터 대신) + ), + ), + const SizedBox(height: 8), // 아이콘과 정보 사이 간격 + + if (!isPlayer) + Consumer( + builder: (context, provider, child) { + if (provider.currentEnemyIntent != null && !character.isDead) { + final intent = provider.currentEnemyIntent!; + return Padding( + padding: const EdgeInsets.only(top: 8.0), + child: Container( + padding: const EdgeInsets.all(8.0), + decoration: BoxDecoration( + color: Colors.black54, + borderRadius: BorderRadius.circular(8), + border: Border.all(color: Colors.redAccent), + ), + child: Column( + children: [ + Text( + "INTENT", + style: TextStyle( + color: Colors.redAccent, + fontSize: 10, + fontWeight: FontWeight.bold, + ), + ), + Row( + mainAxisSize: MainAxisSize.min, + children: [ + Icon( + intent.type == EnemyActionType.attack + ? Icons.flash_on + : Icons.shield, + color: Colors.yellow, + size: 16, + ), + const SizedBox(width: 4), + Text( + intent.description, + style: const TextStyle( + color: Colors.white, + fontSize: 12, + ), + ), + ], + ), + ], + ), + ), + ); + } + return const SizedBox.shrink(); + }, + ), + ], + ); + } +} diff --git a/lib/widgets/battle/floating_battle_texts.dart b/lib/widgets/battle/floating_battle_texts.dart new file mode 100644 index 0000000..22fc329 --- /dev/null +++ b/lib/widgets/battle/floating_battle_texts.dart @@ -0,0 +1,274 @@ +import 'package:flutter/material.dart'; + +class FloatingDamageText extends StatefulWidget { + final String damage; + final Color color; + final VoidCallback onRemove; + + const FloatingDamageText({ + Key? key, + required this.damage, + required this.color, + required this.onRemove, + }) : super(key: key); + + @override + FloatingDamageTextState createState() => FloatingDamageTextState(); +} + +class FloatingDamageTextState extends State + with SingleTickerProviderStateMixin { + late AnimationController _controller; + late Animation _offsetAnimation; + late Animation _opacityAnimation; + + @override + void initState() { + super.initState(); + _controller = AnimationController( + duration: const Duration(milliseconds: 1000), + vsync: this, + ); + + _offsetAnimation = Tween( + begin: const Offset(0.0, 0.0), + end: const Offset(0.0, -1.5), + ).animate(CurvedAnimation(parent: _controller, curve: Curves.easeOut)); + + _opacityAnimation = Tween(begin: 1.0, end: 0.0).animate( + CurvedAnimation( + parent: _controller, + curve: const Interval(0.5, 1.0, curve: Curves.easeOut), + ), + ); + + _controller.forward().then((_) { + if (mounted) { + widget.onRemove(); + } + }); + } + + @override + void dispose() { + _controller.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return AnimatedBuilder( + animation: _controller, + builder: (context, child) { + return FractionalTranslation( + translation: _offsetAnimation.value, + child: Opacity( + opacity: _opacityAnimation.value, + child: Material( + color: Colors.transparent, + child: Text( + widget.damage, + style: TextStyle( + color: widget.color, + fontSize: 20, + fontWeight: FontWeight.bold, + shadows: const [ + Shadow( + blurRadius: 2.0, + color: Colors.black, + offset: Offset(1.0, 1.0), + ), + ], + ), + ), + ), + ), + ); + }, + ); + } +} + +class DamageTextData { + final String id; + final Widget widget; + + DamageTextData({required this.id, required this.widget}); +} + +class FloatingEffect extends StatefulWidget { + final IconData icon; + final Color color; + final double size; + final VoidCallback onRemove; + + const FloatingEffect({ + Key? key, + required this.icon, + required this.color, + required this.size, + required this.onRemove, + }) : super(key: key); + + @override + FloatingEffectState createState() => FloatingEffectState(); +} + +class FloatingEffectState extends State + with SingleTickerProviderStateMixin { + late AnimationController _controller; + late Animation _scaleAnimation; + late Animation _opacityAnimation; + + @override + void initState() { + super.initState(); + _controller = AnimationController( + duration: const Duration(milliseconds: 800), + vsync: this, + ); + + _scaleAnimation = Tween( + begin: 0.5, + end: 1.5, + ).animate(CurvedAnimation(parent: _controller, curve: Curves.elasticOut)); + + _opacityAnimation = Tween(begin: 1.0, end: 0.0).animate( + CurvedAnimation( + parent: _controller, + curve: const Interval(0.5, 1.0, curve: Curves.easeOut), + ), + ); + + _controller.forward().then((_) { + if (mounted) { + widget.onRemove(); + } + }); + } + + @override + void dispose() { + _controller.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return AnimatedBuilder( + animation: _controller, + builder: (context, child) { + return Transform.scale( + scale: _scaleAnimation.value, + child: Opacity( + opacity: _opacityAnimation.value, + child: Icon(widget.icon, color: widget.color, size: widget.size), + ), + ); + }, + ); + } +} + +class FloatingEffectData { + final String id; + final Widget widget; + + FloatingEffectData({required this.id, required this.widget}); +} + +class FloatingFeedbackText extends StatefulWidget { + final String feedback; + final Color color; + final VoidCallback onRemove; + + const FloatingFeedbackText({ + Key? key, + required this.feedback, + required this.color, + required this.onRemove, + }) : super(key: key); + + @override + FloatingFeedbackTextState createState() => FloatingFeedbackTextState(); +} + +class FloatingFeedbackTextState extends State + with SingleTickerProviderStateMixin { + late AnimationController _controller; + late Animation _offsetAnimation; + late Animation _opacityAnimation; + + @override + void initState() { + super.initState(); + _controller = AnimationController( + duration: const Duration(milliseconds: 1000), + vsync: this, + ); + + _offsetAnimation = Tween( + begin: const Offset(0.0, 0.0), + end: const Offset(0.0, -1.5), + ).animate(CurvedAnimation(parent: _controller, curve: Curves.easeOut)); + + _opacityAnimation = Tween(begin: 1.0, end: 0.0).animate( + CurvedAnimation( + parent: _controller, + curve: const Interval(0.5, 1.0, curve: Curves.easeOut), + ), + ); + + _controller.forward().then((_) { + if (mounted) { + widget.onRemove(); + } + }); + } + + @override + void dispose() { + _controller.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return AnimatedBuilder( + animation: _controller, + builder: (context, child) { + return FractionalTranslation( + translation: _offsetAnimation.value, + child: Opacity( + opacity: _opacityAnimation.value, + child: Material( + color: Colors.transparent, + child: Text( + widget.feedback, + style: TextStyle( + color: widget.color, + fontSize: 20, + fontWeight: FontWeight.bold, + shadows: const [ + Shadow( + blurRadius: 2.0, + color: Colors.black, + offset: Offset(1.0, 1.0), + ), + ], + ), + ), + ), + ), + ); + }, + ); + } +} + +class FeedbackTextData { + final String id; + final Widget widget; + + FeedbackTextData({required this.id, required this.widget}); +} diff --git a/lib/widgets/battle/stage_ui.dart b/lib/widgets/battle/stage_ui.dart new file mode 100644 index 0000000..a2c823f --- /dev/null +++ b/lib/widgets/battle/stage_ui.dart @@ -0,0 +1,59 @@ +import 'package:flutter/material.dart'; +import '../../providers/battle_provider.dart'; + +class ShopUI extends StatelessWidget { + final BattleProvider battleProvider; + + const ShopUI({super.key, required this.battleProvider}); + + @override + Widget build(BuildContext context) { + return Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const Icon(Icons.store, size: 64, color: Colors.amber), + const SizedBox(height: 16), + const Text("Merchant Shop", style: TextStyle(fontSize: 24)), + const SizedBox(height: 8), + const Text("Buying/Selling feature coming soon!"), + const SizedBox(height: 32), + ElevatedButton( + onPressed: () => battleProvider.proceedToNextStage(), + child: const Text("Leave Shop"), + ), + ], + ), + ); + } +} + +class RestUI extends StatelessWidget { + final BattleProvider battleProvider; + + const RestUI({super.key, required this.battleProvider}); + + @override + Widget build(BuildContext context) { + return Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const Icon(Icons.local_hotel, size: 64, color: Colors.blue), + const SizedBox(height: 16), + const Text("Rest Area", style: TextStyle(fontSize: 24)), + const SizedBox(height: 8), + const Text("Take a breath and heal."), + const SizedBox(height: 32), + ElevatedButton( + onPressed: () { + battleProvider.player.heal(20); + battleProvider.proceedToNextStage(); + }, + child: const Text("Rest & Leave (+20 HP)"), + ), + ], + ), + ); + } +} diff --git a/prompt/00_project_context_restore.md b/prompt/00_project_context_restore.md index 5bd5d46..a2d0041 100644 --- a/prompt/00_project_context_restore.md +++ b/prompt/00_project_context_restore.md @@ -20,6 +20,7 @@ - `ResponsiveContainer` 위젯을 통해 최대 너비(600px) 및 높이(1000px) 제한. - 웹/태블릿 환경에서도 모바일 앱처럼 중앙 정렬된 화면 제공. - **Battle UI Layout:** 플레이어(좌측 하단) vs 적(우측 상단) 대각선 구도 배치 및 캐릭터 임시 아이콘 적용. + - **Widget Refactoring:** `BattleScreen`의 주요 UI 컴포넌트(`CharacterStatusCard`, `BattleLogOverlay` 등)를 `lib/widgets/battle/`로 분리하여 모듈화. ### B. 전투 시스템 (`BattleProvider`) @@ -31,6 +32,9 @@ - **선제 방어 (Pre-emptive Defense):** 적이 방어를 선택하면 턴 시작 전에 즉시 방어도가 적용됨. - **Defense Restriction:** `DefenseForbidden` 상태 시 방어 행동 선택 불가. - **Variance Removed:** 적의 공격/방어 수치 계산 시 랜덤 분산(Variance) 제거 (고정 수치). +- **적 장비 시스템 (Enemy Equipment):** + - 적에게 아이템 장착 가능 (`enemies.json`의 `equipment` 필드). + - 장착된 아이템의 스탯 및 특수 효과(상태이상 등)가 전투 시 적용됨. - **시각 효과 (Visual Effects):** - **Floating Text:** 데미지 발생 시 캐릭터 위에 데미지 수치가 떠오름 (일반: 빨강, 출혈: 보라, 취약: 주황). - **Action Feedback:** 공격 빗나감(MISS - 적 위치/회색) 및 방어 실패(FAILED - 내 위치/빨강) 텍스트 오버레이. @@ -39,8 +43,8 @@ ### C. 데이터 주도 설계 (Data-Driven Design) -- **JSON 데이터:** `assets/data/items.json`, `assets/data/enemies.json`. -- **데이터 로더:** `ItemTable`, `EnemyTable`. +- **JSON 데이터:** `assets/data/items.json` (ID 포함), `assets/data/enemies.json` (장비 포함). +- **데이터 로더:** `ItemTable` (ID 조회 지원), `EnemyTable` (장비 장착 지원). ### D. 아이템 및 경제 (`Item`, `Inventory`) @@ -65,13 +69,15 @@ - **Streams:** `damageStream`, `effectStream`을 통해 UI(`BattleScreen`)에 비동기 이벤트 전달. - **`lib/game/enums.dart`:** 프로젝트 전반의 Enum 통합 관리 (`ActionType`, `RiskLevel`, `StageType` 등). - **`lib/utils/item_utils.dart`:** 아이템 타입별 아이콘 및 색상 로직 중앙화. +- **`lib/widgets/battle/`:** `BattleScreen`에서 분리된 재사용 가능한 위젯들 (`CharacterStatusCard`, `BattleLogOverlay`, `FloatingBattleTexts`, `StageUI`). - **`lib/widgets/responsive_container.dart`:** 반응형 레이아웃 컨테이너. - **`lib/game/model/`:** - `damage_event.dart`, `effect_event.dart`: 이벤트 모델. - `entity.dart`: `Character` (Player/Enemy). - - `item.dart`: `Item`. + - `item.dart`: `Item` (ID 필드 포함). - **`lib/screens/battle_screen.dart`:** - `StreamSubscription`을 통해 이펙트 이벤트 수신 및 `Overlay` 애니메이션 렌더링. + - `Stack` 및 `Positioned` 기반의 정교한 레이아웃. ## 4. 작업 컨벤션 (Working Conventions) diff --git a/prompt/34_battle_screen_refactor.md b/prompt/34_battle_screen_refactor.md new file mode 100644 index 0000000..df5cb3f --- /dev/null +++ b/prompt/34_battle_screen_refactor.md @@ -0,0 +1,28 @@ +# 배틀 화면 위젯 리팩토링 + +## 목표 + +UI 컴포넌트를 별도의 위젯으로 추출하여 `BattleScreen`의 코드 유지보수성, 가독성 및 구조를 개선합니다. + +## 변경 사항 + +1. **디렉토리 구조:** + + - `lib/widgets/battle/` 디렉토리를 생성했습니다. + +2. **추출된 위젯:** + + - `CharacterStatusCard` (`lib/widgets/battle/character_status_card.dart`): 캐릭터 스탯(HP, 방어도, 공격력, 방어력), 체력 바, 상태 효과 및 의도를 표시합니다. + - `BattleLogOverlay` (`lib/widgets/battle/battle_log_overlay.dart`): 스크롤 가능한 배틀 로그 목록을 표시합니다. + - `FloatingBattleTexts` (`lib/widgets/battle/floating_battle_texts.dart`): 애니메이션 시각 효과를 위한 `FloatingDamageText`, `FloatingEffect`, `FloatingFeedbackText`를 포함합니다. + - `StageUI` (`lib/widgets/battle/stage_ui.dart`): 비전투 스테이지를 위한 `ShopUI`와 `RestUI`를 포함합니다. + +3. **BattleScreen 업데이트:** + - 추출된 위젯을 임포트하고 사용하도록 `lib/screens/battle_screen.dart`를 리팩토링했습니다. + - 인라인 위젯 빌드 메서드(`_buildCharacterStatus`, `_buildShopUI`, `_buildRestUI` 등)와 내부 클래스(`_FloatingDamageText` 등)를 제거했습니다. + +## 이점 + +- **복잡도 감소:** `BattleScreen`은 이제 레이아웃과 상태 관리에 집중합니다. +- **재사용성:** 위젯은 필요에 따라 앱의 다른 부분에서 재사용할 수 있습니다. +- **유지보수성:** 특정 UI 요소를 찾고 수정하기가 더 쉬워졌습니다. diff --git a/prompt/35_enemy_equipment_system.md b/prompt/35_enemy_equipment_system.md new file mode 100644 index 0000000..f757b70 --- /dev/null +++ b/prompt/35_enemy_equipment_system.md @@ -0,0 +1,27 @@ +# 적 장비 시스템 구현 (Enemy Equipment System) + +## 목표 + +적에게 아이템을 장착시켜 전투의 다양성을 높이고, 아이템 데이터 구조를 개선합니다. + +## 주요 변경 사항 + +### 1. 데이터 구조 개선 + +- **`assets/data/items.json`**: 모든 아이템에 고유 `id` 필드를 추가했습니다. (예: `"id": "rusty_dagger"`) +- **`assets/data/enemies.json`**: 적 정보에 `equipment` 필드(아이템 ID 리스트)를 추가했습니다. (예: `Goblin`은 `rusty_dagger` 장착) + +### 2. 게임 로직 업데이트 + +- **`lib/game/model/item.dart`**: `Item` 클래스에 `id` 필드를 추가했습니다. +- **`lib/game/data/item_table.dart`**: ID로 아이템을 조회하는 `get(String id)` 메서드를 구현했습니다. +- **`lib/game/data/enemy_table.dart`**: 적 생성(`createCharacter`) 시 `equipment` 필드에 명시된 아이템을 자동으로 인벤토리에 추가하고 장착하도록 수정했습니다. +- **`lib/providers/battle_provider.dart`**: 초기 플레이어 지급 아이템 생성 시 `id`를 포함하도록 수정했습니다. + +### 3. 버그 수정 + +- **`lib/screens/battle_screen.dart`**: `ScrollController`가 연결되지 않아 발생하던 에러를 수정했습니다. (불필요한 컨트롤러 제거) + +## 결과 + +이제 `enemies.json` 설정만으로 적에게 다양한 장비를 입혀 스탯과 특수 효과(출혈, 스턴 등)를 부여할 수 있습니다. diff --git a/prompt/36_centralize_player_data.md b/prompt/36_centralize_player_data.md new file mode 100644 index 0000000..f45e6d6 --- /dev/null +++ b/prompt/36_centralize_player_data.md @@ -0,0 +1,35 @@ +# 플레이어 데이터 중앙화 (Centralize Player Data) + +## 목표 + +캐릭터 선택 화면과 전투 시스템(`BattleProvider`)에서 사용하는 플레이어 스탯이 하드코딩되어 불일치하는 문제를 해결하기 위해, 플레이어 데이터를 JSON 파일로 중앙화하여 관리합니다. + +## 주요 변경 사항 + +### 1. 데이터 구조 추가 + +- **`assets/data/players.json`**: 플레이어 템플릿 데이터를 정의했습니다. + ```json + [ + { + "id": "warrior", + "name": "Warrior", + "description": "A balanced fighter...", + "baseHp": 50, + "baseAtk": 5, + "baseDefense": 5, + ... + } + ] + ``` +- **`lib/game/data/player_table.dart`**: `players.json`을 로드하고 파싱하는 `PlayerTable` 클래스를 구현했습니다. + +### 2. 게임 로직 업데이트 + +- **`lib/main.dart`**: 앱 시작 시 `PlayerTable.load()`를 호출하여 데이터를 메모리에 적재합니다. +- **`lib/screens/character_selection_screen.dart`**: 하드코딩된 텍스트 대신 `PlayerTable.get("warrior")`를 사용하여 UI를 렌더링합니다. +- **`lib/providers/battle_provider.dart`**: 전투 초기화(`initializeBattle`) 시 `PlayerTable`에서 캐릭터 정보를 가져와 생성합니다. + +## 결과 + +이제 `players.json` 파일만 수정하면 게임 내 모든 곳(선택 화면, 전투 시작 스탯 등)에 일관되게 반영됩니다. diff --git a/test/character_test.dart b/test/character_test.dart index 65e128a..0333414 100644 --- a/test/character_test.dart +++ b/test/character_test.dart @@ -13,6 +13,7 @@ void main() { setUp(() { player = Character(name: "TestPlayer", maxHp: 100, armor: 0, atk: 10); armorHp50 = Item( + id: "armor_hp_50", name: "Armor +50", description: "HP +50", atkBonus: 0, @@ -21,6 +22,7 @@ void main() { price: 100, ); armorHp100 = Item( + id: "armor_hp_100", name: "Armor +100", description: "HP +100", atkBonus: 0, @@ -29,6 +31,7 @@ void main() { price: 200, ); armorHp20 = Item( + id: "armor_hp_20", name: "Armor +20", description: "HP +20", atkBonus: 0,