diff --git a/assets/data/enemies.json b/assets/data/enemies.json index 5f0aac7..6260c39 100644 --- a/assets/data/enemies.json +++ b/assets/data/enemies.json @@ -1,106 +1,311 @@ { "normal": [ { - "name": "Park", - "baseHp": 20, - "baseAtk": 5, - "baseDefense": 5, - "image": "assets/images/enemies/park.png", - "equipment": ["rusty_dagger"], - "tier": 1 - }, - { - "name": "Goblin", - "baseHp": 20, - "baseAtk": 5, - "baseDefense": 5, - "image": "assets/images/enemies/goblin.png", - "equipment": ["rusty_dagger"], - "tier": 1 - }, - { - "name": "Slime", + "name": "Scrawny Piso", "baseHp": 30, - "baseAtk": 3, - "baseDefense": 5, - "image": "assets/images/enemies/slime.png", - "equipment": ["rusty_dagger"], - "tier": 1 - }, - { - "name": "Wolf", - "baseHp": 25, - "baseAtk": 7, - "baseDefense": 5, - "image": "assets/images/enemies/wolf.png", - "equipment": ["rusty_dagger"], - "tier": 1 - }, - { - "name": "Bandit", - "baseHp": 35, "baseAtk": 6, - "baseDefense": 5, - "image": "assets/images/enemies/bandit.png", - "equipment": ["rusty_dagger"], - "tier": 2 + "baseDefense": 3, + "image": "assets/images/enemies/scrawny_gladiator.png", + "equipment": ["pot_lid"], + "tier": 1 }, { - "name": "Skeleton", - "baseHp": 15, - "baseAtk": 8, - "baseDefense": 5, - "image": "assets/images/enemies/skeleton.png", - "equipment": ["rusty_dagger"], - "tier": 2 - }, - { - "name": "Shadow Assassin", - "baseHp": 40, - "baseAtk": 10, + "name": "Nervous Darius", + "baseHp": 25, + "baseAtk": 5, "baseDefense": 2, - "baseDodge": 25, - "image": "assets/images/enemies/shadow_assassin.png", - "equipment": ["jagged_dagger"], + "baseDodge": 10, + "image": "assets/images/enemies/nervous_gladiator.png", + "equipment": [], + "tier": 1 + }, + { + "name": "Clumsy Linus", + "baseHp": 35, + "baseAtk": 4, + "baseDefense": 4, + "image": "assets/images/enemies/clumsy_gladiator.png", + "equipment": ["simple_rags"], + "tier": 1 + }, + { + "name": "Desperate Felix", + "baseHp": 28, + "baseAtk": 7, + "baseDefense": 2, + "image": "assets/images/enemies/desperate_gladiator.png", + "equipment": ["gladius"], + "tier": 1 + }, + { + "name": "Untrained Milo", + "baseHp": 32, + "baseAtk": 6, + "baseDefense": 3, + "image": "assets/images/enemies/untrained_gladiator.png", + "equipment": ["wooden_buckler"], + "tier": 1 + }, + { + "name": "Wild Leo", + "baseHp": 30, + "baseAtk": 8, + "baseDefense": 1, + "image": "assets/images/enemies/wild_gladiator.png", + "equipment": [], + "tier": 1 + }, + { + "name": "Chain-gang Cassius", + "baseHp": 40, + "baseAtk": 5, + "baseDefense": 5, + "image": "assets/images/enemies/chained_gladiator.png", + "equipment": ["flail"], + "tier": 1 + }, + { + "name": "Retiarius Drusus", + "baseHp": 35, + "baseAtk": 8, + "baseDefense": 3, + "image": "assets/images/enemies/retiarius.png", + "equipment": ["trident"], + "tier": 1 + }, + { + "name": "One-eyed Marcus", + "baseHp": 65, + "baseAtk": 14, + "baseDefense": 8, + "image": "assets/images/enemies/one_eyed_gladiator.png", + "equipment": ["scimitar"], + "tier": 2 + }, + { + "name": "Brutal Varro", + "baseHp": 75, + "baseAtk": 16, + "baseDefense": 6, + "image": "assets/images/enemies/brutal_gladiator.png", + "equipment": ["war_axe"], + "tier": 2 + }, + { + "name": "Veteran Hector", + "baseHp": 60, + "baseAtk": 15, + "baseDefense": 10, + "image": "assets/images/enemies/veteran_gladiator.png", + "equipment": ["gladius", "leather_vest"], + "tier": 2 + }, + { + "name": "Swift Castus", + "baseHp": 55, + "baseAtk": 13, + "baseDefense": 7, + "baseDodge": 15, + "image": "assets/images/enemies/swift_gladiator.png", + "equipment": ["scimitar"], + "tier": 2 + }, + { + "name": "Cunning Flaccus", + "baseHp": 60, + "baseAtk": 12, + "baseDefense": 8, + "luck": 10, + "image": "assets/images/enemies/cunning_gladiator.png", + "equipment": ["flail", "tarnished_ring"], + "tier": 2 + }, + { + "name": "Hoplomachus Severus", + "baseHp": 70, + "baseAtk": 15, + "baseDefense": 12, + "image": "assets/images/enemies/hoplomachus.png", + "equipment": ["trident", "kite_shield", "chainmail"], + "tier": 2 + }, + { + "name": "Drunken Titus", + "baseHp": 80, + "baseAtk": 18, + "baseDefense": 5, + "baseDodge": -5, + "image": "assets/images/enemies/drunken_gladiator.png", + "equipment": ["war_axe"], + "tier": 2 + }, + { + "name": "The Wall Aethel", + "baseHp": 100, + "baseAtk": 10, + "baseDefense": 15, + "image": "assets/images/enemies/the_wall.png", + "equipment": ["tower_shield", "chainmail"], + "tier": 2 + }, + { + "name": "Champion Gannicus", + "baseHp": 120, + "baseAtk": 22, + "baseDefense": 18, + "image": "assets/images/enemies/champion_gannicus.png", + "equipment": ["steel_greatsword", "steel_plate"], "tier": 3 }, { - "name": "Armored Bear", - "baseHp": 60, - "baseAtk": 8, - "baseDefense": 8, - "image": "assets/images/enemies/armored_bear.png", - "equipment": ["iron_sword"], + "name": "The Giant Ursus", + "baseHp": 180, + "baseAtk": 28, + "baseDefense": 15, + "image": "assets/images/enemies/the_giant.png", + "equipment": ["war_hammer"], + "tier": 3 + }, + { + "name": "Bloody Flamma", + "baseHp": 100, + "baseAtk": 25, + "baseDefense": 14, + "image": "assets/images/enemies/bloody_flamma.png", + "equipment": ["barbed_net"], + "tier": 3 + }, + { + "name": "Legendary Oenomaus", + "baseHp": 130, + "baseAtk": 24, + "baseDefense": 20, + "image": "assets/images/enemies/legendary_oenomaus.png", + "equipment": ["scimitar", "steel_shield"], + "tier": 3 + }, + { + "name": "The Unseen Lyra", + "baseHp": 90, + "baseAtk": 22, + "baseDefense": 12, + "baseDodge": 30, + "image": "assets/images/enemies/the_unseen.png", + "equipment": ["hooked_spear"], + "tier": 3 + }, + { + "name": "Executioner Balbus", + "baseHp": 140, + "baseAtk": 35, + "baseDefense": 15, + "image": "assets/images/enemies/executioner.png", + "equipment": ["executioners_axe"], + "tier": 3 + }, + { + "name": "Vengeful Spartacus", + "baseHp": 120, + "baseAtk": 35, + "baseDefense": 16, + "image": "assets/images/enemies/vengeful_spartacus.png", + "equipment": ["gladius"], + "tier": 3 + }, + { + "name": "Praetorian Guard", + "baseHp": 150, + "baseAtk": 28, + "baseDefense": 25, + "image": "assets/images/enemies/praetorian_guard.png", + "equipment": ["steel_greatsword", "steel_plate", "tower_shield"], "tier": 3 } ], "elite": [ { - "name": "Orc Warrior", - "baseHp": 60, - "baseAtk": 12, - "baseDefense": 3, - "image": "assets/images/enemies/orc_warrior.png", - "equipment": ["battle_axe", "leather_vest"], + "name": "Crixus 'The Gaul'", + "baseHp": 120, + "baseAtk": 18, + "baseDefense": 12, + "image": "assets/images/enemies/crixus_the_gaul.png", + "equipment": ["long_sword", "kite_shield"], "tier": 1 }, { - "name": "Giant Spider", - "baseHp": 50, - "baseAtk": 15, - "baseDefense": 2, - "image": "assets/images/enemies/giant_spider.png", - "equipment": ["jagged_dagger"], + "name": "Theokoles 'Shadow of Death'", + "baseHp": 160, + "baseAtk": 28, + "baseDefense": 8, + "image": "assets/images/enemies/theokoles.png", + "equipment": ["war_axe"], + "tier": 1 + }, + { + "name": "Isidorus 'The Butcher'", + "baseHp": 140, + "baseAtk": 22, + "baseDefense": 10, + "image": "assets/images/enemies/isidorus_the_butcher.png", + "equipment": ["trident"], + "tier": 1 + }, + { + "name": "Vitallion 'The Lion'", + "baseHp": 200, + "baseAtk": 25, + "baseDefense": 18, + "luck": 15, + "image": "assets/images/enemies/vitallion_the_lion.png", + "equipment": ["war_hammer", "chainmail", "engraved_amulet"], "tier": 2 }, { - "name": "Dark Knight", - "baseHp": 80, - "baseAtk": 10, - "baseDefense": 5, - "image": "assets/images/enemies/dark_knight.png", - "equipment": ["stunning_hammer", "kite_shield"], + "name": "Arcas 'The Serpent'", + "baseHp": 180, + "baseAtk": 28, + "baseDefense": 15, + "baseDodge": 15, + "image": "assets/images/enemies/arcas_the_serpent.png", + "equipment": ["hooked_spear"], + "tier": 2 + }, + { + "name": "Verus 'The Undefeated'", + "baseHp": 280, + "baseAtk": 30, + "baseDefense": 20, + "image": "assets/images/enemies/verus_the_undefeated.png", + "equipment": ["steel_greatsword", "steel_shield"], + "tier": 2 + }, + { + "name": "Magistratus Maxentius", + "baseHp": 350, + "baseAtk": 38, + "baseDefense": 30, + "image": "assets/images/enemies/magistratus_maxentius.png", + "equipment": ["executioners_axe", "steel_plate", "champions_badge"], + "tier": 3 + }, + { + "name": "Aurelia 'The Crimson Blade'", + "baseHp": 300, + "baseAtk": 50, + "baseDefense": 20, + "baseDodge": 20, + "image": "assets/images/enemies/aurelia_crimson_blade.png", + "equipment": ["scimitar"], + "tier": 3 + }, + { + "name": "Gaius 'The Chimera'", + "baseHp": 400, + "baseAtk": 40, + "baseDefense": 18, + "image": "assets/images/enemies/chimera.png", + "equipment": ["sunderer_axe"], "tier": 3 } ] -} +} \ No newline at end of file diff --git a/assets/data/items.json b/assets/data/items.json index 2287c8b..51820d7 100644 --- a/assets/data/items.json +++ b/assets/data/items.json @@ -1,82 +1,71 @@ { "weapons": [ { - "id": "short_bow", - "name": "Short Bow", - "description": "A basic bow for beginners.", - "baseAtk": 2, - "slot": "weapon", - "price": 15, - "image": "assets/images/items/short_bow.png", - "rarity": "normal", - "tier": "tier1" - }, - { - "id": "long_sword", - "name": "Long Sword", - "description": "A versatile blade.", - "baseAtk": 6, - "slot": "weapon", - "price": 50, - "image": "assets/images/items/long_sword.png", - "rarity": "normal", - "tier": "tier2" - }, - { - "id": "rusty_dagger", - "name": "Rusty Dagger", - "description": "Old and rusty, but can disarm foes.", - "baseAtk": 3, + "id": "gladius", + "name": "Gladius", + "description": "A standard short sword used by gladiators.", + "baseAtk": 7, "slot": "weapon", "price": 30, - "image": "assets/images/items/rusty_dagger.png", - "effects": [ - { - "type": "disarmed", - "probability": 100, - "duration": 1 - } - ], + "image": "assets/images/items/gladius.png", + "rarity": "normal", + "tier": "tier1" + }, + { + "id": "flail", + "name": "Flail", + "description": "A spiked ball attached to a chain. Hard to predict.", + "baseAtk": 5, + "luck": 5, + "slot": "weapon", + "price": 45, + "image": "assets/images/items/flail.png", "rarity": "magic", "tier": "tier1" }, { - "id": "iron_sword", - "name": "Iron Sword", - "description": "A standard soldier's sword.", - "baseAtk": 8, + "id": "trident", + "name": "Trident", + "description": "A three-pronged spear. Offers good reach.", + "baseAtk": 9, + "baseHp": 5, "slot": "weapon", - "price": 80, - "image": "assets/images/items/iron_sword.png", - "rarity": "magic", - "tier": "tier2", - "effects": [ - { - "type": "disarmed", - "probability": 100, - "duration": 1 - } - ] + "price": 70, + "image": "assets/images/items/trident.png", + "rarity": "normal", + "tier": "tier2" }, { - "id": "battle_axe", - "name": "Battle Axe", - "description": "Heavy but powerful.", - "baseAtk": 12, + "id": "scimitar", + "name": "Scimitar", + "description": "A curved blade, known for swift cuts.", + "baseAtk": 11, + "dodge": 3, "slot": "weapon", - "price": 120, - "image": "assets/images/items/battle_axe.png", + "price": 90, + "image": "assets/images/items/scimitar.png", "rarity": "magic", "tier": "tier2" }, { - "id": "stunning_hammer", - "name": "Stunning Hammer", - "description": "A heavy hammer that can stun foes.", - "baseAtk": 10, + "id": "war_axe", + "name": "War Axe", + "description": "Heavy and powerful, designed to break shields.", + "baseAtk": 14, + "slot": "weapon", + "price": 120, + "image": "assets/images/items/war_axe.png", + "rarity": "magic", + "tier": "tier2" + }, + { + "id": "war_hammer", + "name": "War Hammer", + "description": "A heavy hammer that can daze foes.", + "baseAtk": 12, "slot": "weapon", "price": 150, - "image": "assets/images/items/stunning_hammer.png", + "image": "assets/images/items/war_hammer.png", "effects": [ { "type": "stun", @@ -88,13 +77,13 @@ "tier": "tier2" }, { - "id": "jagged_dagger", - "name": "Jagged Dagger", - "description": "A cruel dagger that causes bleeding.", - "baseAtk": 7, + "id": "barbed_net", + "name": "Barbed Net", + "description": "A weighted net to ensnare and wound opponents.", + "baseAtk": 4, "slot": "weapon", "price": 130, - "image": "assets/images/items/jagged_dagger.png", + "image": "assets/images/items/barbed_net.png", "effects": [ { "type": "bleed", @@ -107,13 +96,42 @@ "tier": "tier1" }, { - "id": "sunderer_axe", - "name": "Sunderer Axe", - "description": "An axe that exposes enemy weaknesses.", - "baseAtk": 11, + "id": "steel_greatsword", + "name": "Steel Greatsword", + "description": "A massive, well-crafted steel sword.", + "baseAtk": 18, "slot": "weapon", - "price": 160, - "image": "assets/images/items/sunderer_axe.png", + "price": 180, + "image": "assets/images/items/steel_greatsword.png", + "rarity": "magic", + "tier": "tier3" + }, + { + "id": "hooked_spear", + "name": "Hooked Spear", + "description": "A spear with a hook to pull enemies off balance.", + "baseAtk": 15, + "slot": "weapon", + "price": 250, + "image": "assets/images/items/hooked_spear.png", + "effects": [ + { + "type": "disarmed", + "probability": 30, + "duration": 1 + } + ], + "rarity": "rare", + "tier": "tier3" + }, + { + "id": "executioners_axe", + "name": "Executioner's Axe", + "description": "A terrifying axe that exposes enemy weaknesses.", + "baseAtk": 20, + "slot": "weapon", + "price": 300, + "image": "assets/images/items/executioners_axe.png", "effects": [ { "type": "vulnerable", @@ -127,14 +145,14 @@ ], "armors": [ { - "id": "torn_tunic", - "name": "Torn Tunic", - "description": "Offers minimal protection.", - "baseHp": 10, + "id": "simple_rags", + "name": "Simple Rags", + "description": "Better than nothing.", + "baseHp": 15, "slot": "armor", - "price": 20, - "image": "assets/images/items/torn_tunic.png", - "rarity": "magic", + "price": 15, + "image": "assets/images/items/simple_rags.png", + "rarity": "normal", "tier": "tier1" }, { @@ -146,7 +164,7 @@ "price": 60, "image": "assets/images/items/leather_vest.png", "rarity": "magic", - "tier": "tier2" + "tier": "tier1" }, { "id": "chainmail", @@ -157,6 +175,29 @@ "price": 120, "image": "assets/images/items/chainmail.png", "rarity": "magic", + "tier": "tier2" + }, + { + "id": "steel_plate", + "name": "Steel Plate", + "description": "Solid, heavy protection.", + "baseHp": 90, + "slot": "armor", + "price": 200, + "image": "assets/images/items/steel_plate.png", + "rarity": "magic", + "tier": "tier3" + }, + { + "id": "reinforced_leather", + "name": "Reinforced Leather", + "description": "Remarkably light and durable.", + "baseHp": 70, + "dodge": 5, + "slot": "armor", + "price": 280, + "image": "assets/images/items/reinforced_leather.png", + "rarity": "rare", "tier": "tier3" } ], @@ -169,24 +210,24 @@ "slot": "shield", "price": 10, "image": "assets/images/items/pot_lid.png", - "rarity": "magic", + "rarity": "normal", "tier": "tier1" }, { - "id": "wooden_shield", - "name": "Wooden Shield", - "description": "Sturdy oak wood.", + "id": "wooden_buckler", + "name": "Wooden Buckler", + "description": "A small, agile shield.", "baseArmor": 3, "slot": "shield", "price": 40, - "image": "assets/images/items/wooden_shield.png", + "image": "assets/images/items/wooden_buckler.png", "rarity": "magic", "tier": "tier1" }, { "id": "kite_shield", "name": "Kite Shield", - "description": "Used by knights.", + "description": "Used by professional soldiers.", "baseArmor": 6, "slot": "shield", "price": 100, @@ -194,6 +235,28 @@ "rarity": "magic", "tier": "tier2" }, + { + "id": "steel_shield", + "name": "Steel Shield", + "description": "A heavy, durable shield.", + "baseArmor": 9, + "slot": "shield", + "price": 180, + "image": "assets/images/items/steel_shield.png", + "rarity": "magic", + "tier": "tier3" + }, + { + "id": "tower_shield", + "name": "Tower Shield", + "description": "Almost like a small wall.", + "baseArmor": 13, + "slot": "shield", + "price": 260, + "image": "assets/images/items/tower_shield.png", + "rarity": "rare", + "tier": "tier3" + }, { "id": "cursed_shield", "name": "Cursed Shield", @@ -215,70 +278,99 @@ ], "accessories": [ { - "id": "old_ring", - "name": "Old Ring", - "description": "A tarnished ring. Might bring a little luck.", + "id": "tarnished_ring", + "name": "Tarnished Ring", + "description": "A simple ring. Might bring a little luck.", "baseAtk": 1, "baseHp": 5, "slot": "accessory", "price": 25, - "image": "assets/images/items/old_ring.png", + "image": "assets/images/items/tarnished_ring.png", "luck": 5, "rarity": "magic", "tier": "tier1" }, { - "id": "copper_ring", - "name": "Copper Ring", - "description": "A simple ring.", - "baseAtk": 1, - "baseHp": 5, - "slot": "accessory", - "price": 25, - "image": "assets/images/items/copper_ring.png", - "luck": 3, - "rarity": "magic", - "tier": "tier1" - }, - { - "id": "ruby_amulet", - "name": "Ruby Amulet", - "description": "Glows with a faint red light.", + "id": "engraved_amulet", + "name": "Engraved Amulet", + "description": "Glows with a faint inner light.", "baseAtk": 3, "baseHp": 15, "slot": "accessory", "price": 80, - "image": "assets/images/items/ruby_amulet.png", + "image": "assets/images/items/engraved_amulet.png", "luck": 7, "rarity": "rare", "tier": "tier2" }, { - "id": "heros_badge", - "name": "Hero's Badge", - "description": "A badge of honor.", + "id": "champions_badge", + "name": "Champion's Badge", + "description": "A badge of honor, earned with blood.", "baseAtk": 5, "baseHp": 25, "baseArmor": 1, "slot": "accessory", "price": 150, - "image": "assets/images/items/heros_badge.png", + "image": "assets/images/items/champions_badge.png", "luck": 10, "rarity": "legendary", "tier": "tier3" }, { - "id": "lucky_charm", - "name": "Lucky Charm", - "description": "A four-leaf clover encased in amber.", + "id": "worn_talisman", + "name": "Worn Talisman", + "description": "A strange charm that seems to bend fate.", "baseAtk": 0, "baseHp": 10, "slot": "accessory", "price": 200, - "image": "assets/images/items/lucky_charm.png", + "image": "assets/images/items/worn_talisman.png", "luck": 25, "rarity": "unique", "tier": "tier3" } + ], + "consumables": [ + { + "id": "potion_heal_small", + "name": "Healing Potion", + "description": "Restores 20 HP instantly.", + "slot": "consumable", + "hpBonus": 20, + "price": 15, + "rarity": "normal", + "tier": "tier1", + "image": "assets/images/items/potion.png" + }, + { + "id": "potion_armor_small", + "name": "Iron Skin Potion", + "description": "Grants +10 Armor instantly.", + "slot": "consumable", + "armorBonus": 10, + "price": 20, + "rarity": "normal", + "tier": "tier1", + "image": "assets/images/items/potion.png" + }, + { + "id": "potion_strength_small", + "name": "Strength Potion", + "description": "Increases Attack Power for 1 turn.", + "slot": "consumable", + "effects": [ + { + "type": "attackUp", + "probability": 100, + "duration": 1, + "value": 5 + } + ], + "price": 25, + "rarity": "magic", + "tier": "tier1", + "image": "assets/images/items/potion.png" + } ] } diff --git a/assets/images/background/tier_1.jpg b/assets/images/background/tier_1.jpg new file mode 100644 index 0000000..7cdadf9 Binary files /dev/null and b/assets/images/background/tier_1.jpg differ diff --git a/assets/images/background/tier_2.jpg b/assets/images/background/tier_2.jpg new file mode 100644 index 0000000..16ef2a5 Binary files /dev/null and b/assets/images/background/tier_2.jpg differ diff --git a/assets/images/background/tier_3.jpg b/assets/images/background/tier_3.jpg new file mode 100644 index 0000000..4946eea Binary files /dev/null and b/assets/images/background/tier_3.jpg differ diff --git a/lib/game/data/item_table.dart b/lib/game/data/item_table.dart index 0b4b820..ef2dabe 100644 --- a/lib/game/data/item_table.dart +++ b/lib/game/data/item_table.dart @@ -83,110 +83,47 @@ class ItemTable { static List armors = []; static List shields = []; static List accessories = []; - static List consumables = []; // New: Potions + static List consumables = []; static final Map _items = {}; static void initialize() { - // 0. Consumables (Potions) - // Manually added for now, later move to JSON if preferred. - List potionTemplates = [ - ItemTemplate( - id: "potion_heal_small", - name: "Healing Potion", - description: "Restores 20 HP instantly.", - slot: EquipmentSlot.consumable, - atkBonus: 0, - hpBonus: 20, // Used as heal amount - armorBonus: 0, - effects: [], - price: 15, - rarity: ItemRarity.normal, - tier: ItemTier.tier1, - image: "assets/images/items/potion.png", // Valid placeholder - ), - ItemTemplate( - id: "potion_armor_small", - name: "Iron Skin Potion", - description: "Grants +10 Armor instantly.", - slot: EquipmentSlot.consumable, - atkBonus: 0, - hpBonus: 0, - armorBonus: 10, // Used as armor amount - effects: [], - price: 20, - rarity: ItemRarity.normal, - tier: ItemTier.tier1, - image: "assets/images/items/potion.png", - ), - ItemTemplate( - id: "potion_strength_small", - name: "Strength Potion", - description: "Increases Attack Power for 1 turn.", - slot: EquipmentSlot.consumable, - atkBonus: 0, - hpBonus: 0, - armorBonus: 0, - effects: [ - ItemEffect( - type: StatusEffectType.attackUp, - probability: 100, - duration: 1, - value: 5, // Flat +5 Attack (simple implementation) - ), - ], - price: 25, - rarity: ItemRarity.magic, - tier: ItemTier.tier1, - image: "assets/images/items/potion.png", - ), - ]; - - consumables = potionTemplates; - for (var p in potionTemplates) { - _items[p.id] = p; // Register to map - } + // This function is now a placeholder. All loading is handled in load(). } static Future load() async { - // Initialize Manual Items first - initialize(); + // Clear previous data + _items.clear(); - final String jsonString = await rootBundle.loadString( - 'assets/data/items.json', - ); + final String jsonString = + await rootBundle.loadString('assets/data/items.json'); final Map data = jsonDecode(jsonString); - weapons = (data['weapons'] as List) - .map((e) => ItemTemplate.fromJson(e)) - .toList(); - armors = (data['armors'] as List) - .map((e) => ItemTemplate.fromJson(e)) - .toList(); - shields = (data['shields'] as List) - .map((e) => ItemTemplate.fromJson(e)) - .toList(); - accessories = (data['accessories'] as List) - .map((e) => ItemTemplate.fromJson(e)) - .toList(); + // Helper function to load and register items + void _loadAndRegister(String key, List list) { + if (data[key] != null) { + list.clear(); + var loadedItems = + (data[key] as List).map((e) => ItemTemplate.fromJson(e)).toList(); + list.addAll(loadedItems); + for (var item in loadedItems) { + _items[item.id] = item; + } + } + } + + _loadAndRegister('weapons', weapons); + _loadAndRegister('armors', armors); + _loadAndRegister('shields', shields); + _loadAndRegister('accessories', accessories); + _loadAndRegister('consumables', consumables); } - static List get allItems => [ - ...weapons, - ...armors, - ...shields, - ...accessories, - ...consumables, - ]; + static List get allItems => _items.values.toList(); static ItemTemplate? get(String id) { - try { - return allItems.firstWhere((item) => item.id == id); - } catch (e) { - return null; - } + return _items[id]; } - static final Random _random = Random(); /// Returns all items matching the given tier. diff --git a/lib/game/logic/loot_generator.dart b/lib/game/logic/loot_generator.dart index 2da65bb..4a9e3a1 100644 --- a/lib/game/logic/loot_generator.dart +++ b/lib/game/logic/loot_generator.dart @@ -11,6 +11,26 @@ class LootGenerator { /// Generates an Item instance from a template, applying prefixes/suffixes based on rarity. static Item generate(ItemTemplate template) { + // Consumables have fixed stats and no prefixes. + if (template.slot == EquipmentSlot.consumable) { + return Item( + id: template.id, + name: template.name, + description: template.description, + atkBonus: template.atkBonus, + hpBonus: template.hpBonus, + armorBonus: template.armorBonus, + dodge: template.dodge, + slot: template.slot, + effects: template.effects, + price: template.price, + image: template.image, + luck: template.luck, + rarity: template.rarity, + tier: template.tier, + ); + } + String finalName = template.name; int finalAtk = template.atkBonus; int finalHp = template.hpBonus; diff --git a/lib/screens/battle_screen.dart b/lib/screens/battle_screen.dart index e0df2b7..8e298c1 100644 --- a/lib/screens/battle_screen.dart +++ b/lib/screens/battle_screen.dart @@ -650,8 +650,17 @@ class _BattleScreenState extends State { child: Stack( key: _stackKey, children: [ - // 1. Background (Black) - Container(color: ThemeConfig.battleBg), + // 1. Background Image + Container( + decoration: const BoxDecoration( + image: DecorationImage( + image: AssetImage('assets/images/background/tier_1.jpg'), + fit: BoxFit.cover, + ), + ), + ), + // 1.1 Opacity Layer + Container(color: Colors.black.withValues(alpha: 0.7)), // 2. Battle Content (Top Bar + Characters) Column( diff --git a/lib/widgets/battle/character_status_card.dart b/lib/widgets/battle/character_status_card.dart index 66c679a..91bded4 100644 --- a/lib/widgets/battle/character_status_card.dart +++ b/lib/widgets/battle/character_status_card.dart @@ -131,6 +131,8 @@ class CharacterStatusCard extends StatelessWidget { width: 200, height: 200, fit: BoxFit.contain, + // color: Colors.white, + // colorBlendMode: BlendMode.screen, errorBuilder: (context, error, stackTrace) { return const Icon( Icons.psychology, diff --git a/prompt/00_project_context_restore.md b/prompt/00_project_context_restore.md index d3be3d5..2277311 100644 --- a/prompt/00_project_context_restore.md +++ b/prompt/00_project_context_restore.md @@ -6,7 +6,7 @@ - **프로젝트명:** Colosseum's Choice - **플랫폼:** Flutter (Android/iOS/Web/Desktop) -- **장르:** 텍스트 기반의 턴제 RPG + GUI (로그라이크 요소 포함) +- **장르:** 글래디에이터 테마의 턴제 로그라이크 RPG - **상태:** 핵심 시스템 구현 완료 및 안정화 (i18n 구조 적용, 애니메이션 동기화 완료) ## 2. 현재 구현된 핵심 기능 (Feature Status) @@ -37,6 +37,7 @@ - `CombatCalculator`에서 회피 성공 여부를 계산. - 공격이 회피되면 `dodge` 피드백과 함께 데미지가 0으로 처리됨. - **적 인공지능 (Enemy AI & Intent):** + - **적 테마:** 모든 적은 몬스터가 아닌, '[별명] + [이름]' 형식의 고유한 이름을 가진 인간형 검투사입니다. - **Intent UI:** 적의 다음 행동(공격/방어, 데미지/방어도) 미리 표시. - **동기화된 애니메이션:** 적 행동 결정(`_generateEnemyIntent`)은 이전 애니메이션이 완전히 끝난 후 이루어짐. - **선제 방어:** 적이 방어 행동을 선택하면 턴 시작 시 **데이터상으로 즉시 방어도가 적용되나, 시각적 애니메이션은 플레이어가 행동을 선택하는 시점에 발동됨.** @@ -44,6 +45,7 @@ - **UI 주도 Impact 처리:** 애니메이션 타격 시점(`onImpact`)에 정확히 데미지가 적용되고 텍스트가 뜸 (완벽한 동기화). - **적 돌진:** 적도 공격 시 플레이어 위치로 돌진함 (설정에서 끄기 가능). - **이펙트:** 타격 아이콘, 데미지 텍스트(Floating Text, Risky 공격 시 크기 확대), 화면 흔들림(`ShakeWidget`), 폭발(`ExplosionWidget`). **적 방어 시 성공/실패 이펙트 추가.** + - **배경:** 전투 화면에 경기장 테마의 배경 이미지가 적용되어 있으며, 투명도 레이어를 통해 깊이감을 더함. - **상태이상:** `Stun`, `Bleed`, `Vulnerable`, `DefenseForbidden`, `Disarmed`. - **UI 알림 (Toast):** 하단 네비게이션을 가리지 않는 상단 `Overlay` 기반 알림 시스템. @@ -58,7 +60,7 @@ - **주는 피해 계산:** 공격자가 `Disarmed` 상태일 경우, 최종 데미지 값에 대한 감폭 적용 (`Character.totalAtk` 게터에서 처리). - **기타 계산:** 회피 확률(`calculateDodge`), 턴 시작 효과(`processStartTurnEffects`), 아이템에 의한 상태이상 적용 확률(`getAppliedEffects`) 등을 담당. - `BattleLogManager`: 전투 로그 관리. - - `LootGenerator`: 아이템 생성, 접두사(Prefix) 부여, 랜덤 스탯 로직. + - `LootGenerator`: 아이템 생성, 접두사(Prefix) 부여, 랜덤 스탯 로직. 소비용품은 접두사 로직에서 제외. - `SettingsProvider`: 전역 설정(애니메이션 on/off 등) 관리 및 영구 저장. - **PermanentStatModifier:** 슬레이 더 스파이어의 승천(Ascension)과 유사한 전역 난이도 조절 또는 영구적 버프/디버프를 위한 데이터 모델(`lib/game/model/stat_modifier.dart`) 및 캐릭터 필드(`Character.permanentModifiers`)가 구현되어 있음. (현재 로직 미적용, 추후 확장 예정) - **Soft i18n:** UI 텍스트는 `lib/game/config/app_strings.dart`에서 통합 관리. @@ -66,11 +68,12 @@ ### D. 아이템 및 경제 +- **테마:** 모든 아이템은 '콜로세움/검투사' 컨셉에 맞춰져 있으며, 활과 같은 판타지 무기 대신 트라이던트, 플레일 등의 무기가 등장합니다. - **장비:** 무기, 방어구, 방패, 장신구. - **시스템:** - **Rarity:** Common ~ Unique. - **Tier:** 라운드 진행도에 따라 상위 티어 아이템 등장. - - **Prefix:** Rarity에 따라 접두사가 붙으며 스탯이 변형됨 (예: "Sharp Wooden Sword"). + - **Prefix:** Rarity에 따라 접두사가 붙으며 스탯이 변형됨 (예: "날카로운 글라디우스"). - **상점 (`ShopProvider`):** 아이템 구매/판매, 리롤(Reroll), 인벤토리 관리. ### E. 저장 및 진행 (Persistence) @@ -88,8 +91,8 @@ - Tier 2: Stage 13 ~ 24 (콜로세움) - Tier 3: Stage 25+ (왕의 투기장) - **Stage Types:** - - **Battle:** 일반 몬스터 전투. - - **Elite:** 강화된 몬스터 전투 (보상 증가, 12 스테이지마다 등장). + - **Battle:** 일반 검투사 전투. + - **Elite:** 정예 검투사 전투 (보상 증가, 12 스테이지마다 등장). - **Shop:** 아이템 구매/판매/리롤 (5 스테이지마다 등장). - **Rest:** 휴식 (8 스테이지마다 등장). @@ -111,26 +114,18 @@ ## 4. 최근 주요 변경 사항 (Change Log) +- **[Overhaul] Gladiator Theme & Balance Pass:** 게임의 테마를 '글래디에이터'로 전면 개편. 몬스터를 전부 '[별명] 이름' 형식의 인간형 검투사로 교체하고, 활과 같은 무기를 트라이던트, 플레일 등으로 교체. 이에 맞춰 아이템과 적 데이터 밸런스를 전체적으로 재조정. +- **[Refactor] Item Data System:** 소비용품 데이터를 JSON으로 이전하고, 모든 아이템을 Map 기반으로 조회하도록 리팩토링하여 성능 개선. 소비용품에는 접두사가 붙지 않도록 수정. +- **[Fix] Dual-Wielding Data:** 시스템에서 지원하지 않는 '무기 2개 장착' 적 데이터를 수정하고, 능력치 재조정을 통해 밸런스 보정. +- **[UI] Battle Screen Visuals:** 전투 화면에 배경 이미지를 추가하고, 적 캐릭터에게 시각적 효과를 적용하여 테마 강화. - **[Feature] Dynamic Intent UI:** 적의 상태(예: Disarmed) 변화 시, UI에 표시되는 인텐트(공격/방어 값)가 실시간으로 갱신되도록 로직을 개선하여 전투 정보의 정확성과 직관성 향상. - **[Feature] Dodge Mechanic:** 캐릭터의 `dodge` 스탯에 기반한 공격 회피 시스템 구현. 회피 시 전용 피드백과 함께 데미지 무효화. - **[Refactor] BattleProvider:** `CombatCalculator`, `BattleLogManager`, `LootGenerator` 분리로 코드 다이어트. - **[Refactor] Animation Sync:** `Future.delayed` 예측 방식을 버리고, UI 애니메이션 콜백(`onImpact`)을 통해 로직을 트리거하는 방식으로 변경하여 타격감 동기화 해결. - **[Refactor] Settings:** `SettingsProvider` 도입 및 적 애니메이션 토글 기능 추가. -- **[Fix] Bugs:** 아이템 이름 생성 오류 수정, 리워드 팝업 깜빡임 및 중복 생성 수정, 앱 크래시(Null Safety) 수정. -- **[Feature] Interactive Enemy Defense Animation:** 플레이어 행동(버튼 클릭) 시점에 적 방어 애니메이션 및 이펙트(`Icon`/`FAILED` 텍스트)가 발동되도록 구현. (데이터는 턴 시작 시 선적용) -- **[Improvement] Turn Responsiveness:** 적 턴 종료 후 플레이어 턴 활성화까지의 불필요한 딜레이 제거 (`_processMiddleTurn`). -- **[Improvement] Visual Impact:** Risky 공격 및 높은 데미지 시 Floating Damage Text의 크기 확대. Floating Effect/Feedback Text의 위치 조정. -- **[Refactor] Balancing System:** `BattleConfig`에서 공격/방어 효율 상수를 분리하고 `CombatCalculator` 및 관련 로직에 적용하여 밸런싱의 유연성 확보. -- **[Fix] UI Stability:** `CharacterStatusCard`의 Intent UI 텍스트 길이에 따른 레이아웃 흔들림 방지 (`FittedBox`). `BattleScreen` 내 `Stack` 위젯 구성 문법 오류 수정. -- **[Refactor] Barrel Pattern Adoption:** 프로젝트 전체(`lib/` 하위)에 Barrel File 패턴을 적용하여 Import 구문을 통합하고 디렉토리 의존성을 명확하게 정리. -- **[UI] Top-Aligned Toast:** SnackBar를 상단 토스트 알림으로 교체하여 하단 네비게이션 가림 현상 해결 및 애니메이션 버그 수정. -- **[Fix] Asset 404 Error:** 적 이미지 누락 문제 해결(Placeholder 적용) 및 `pubspec.yaml` 경로 업데이트. -- **[Refactor] ShopUI:** 상점 UI의 문법 및 로직 오류 수정. -- **[Feature] Consumable Items:** 체력/방어/공격버프 물약 구현. 전투 중 사용 가능하며, 사용 시 턴을 소모하지 않음(Free Action). 상점에서 판매. -- **[Feature] Enhanced Enemy Display:** 적 이미지 동적 로딩 및 크기 확대, 스테이지 헤더에 Boss/Tier 정보 상세 표시. ## 5. 다음 단계 (Next Steps) -1. **밸런싱:** 현재 몬스터 및 아이템 스탯 미세 조정. -2. **콘텐츠 확장:** 더 많은 아이템, 적, 스킬 패턴 추가. -3. **튜토리얼:** 신규 유저를 위한 가이드 추가. +1. **콘텐츠 확장:** 더 많은 아이템, 적, 스킬 패턴 추가. +2. **밸런싱:** 현재 스탯 미세 조정. +3. **튜토리얼:** 신규 유저를 위한 가이드 추가. \ No newline at end of file diff --git a/prompt/67_gladiator_theme_and_balance_overhaul.md b/prompt/67_gladiator_theme_and_balance_overhaul.md new file mode 100644 index 0000000..594d1c7 --- /dev/null +++ b/prompt/67_gladiator_theme_and_balance_overhaul.md @@ -0,0 +1,35 @@ +# 67. 글래디에이터 테마 적용 및 밸런스 전면 개편 + +## 목적 +게임의 전체적인 테마를 기존의 판타지에서 '콜로세움의 검투사' 컨셉으로 변경하고, 이에 맞춰 아이템, 적, 밸런스 등 게임의 핵심 데이터를 전면적으로 재설계 및 수정합니다. + +## 1. 주요 테마 변경 + +### A. 글래디에이터 테마 아이템으로 교체 (`items.json`) +- **무기 컨셉 변경:** 검투사 컨셉에 맞지 않는 '활' 계열 무기를 모두 제거했습니다. +- **신규 무기 추가:** '글라디우스', '트라이던트', '플레일', '그물' 등 검투사를 상징하는 새로운 무기들을 추가했습니다. +- **이름 변경:** 판타지 느낌의 아이템 이름들을 '강화 가죽 갑옷', '새겨진 부적'과 같이 컨셉에 맞는 현실적인 이름으로 변경했습니다. + +### B. 인간형 검투사 적으로 교체 (`enemies.json`) +- **몬스터 제거:** 고블린, 슬라임, 드래곤 등 모든 몬스터형 적을 제거했습니다. +- **'[별명] + [이름]' 형식 도입:** 모든 적을 "외눈박이 마커스"와 같이 개성 있는 별명을 가진 인간형 검투사로 교체하여, 각 적에게 고유한 캐릭터성을 부여했습니다. +- **장비 재분배:** 새로 추가된 검투사 컨셉의 아이템들을 적들의 장비에 맞게 재분배했습니다. + +## 2. 밸런스 및 데이터 구조 개선 + +### A. 아이템 및 적 밸런스 전면 재조정 +- **아이템 조정:** 약했던 1티어 아이템들을 상향하고, 부족했던 3티어 구간에 새로운 아이템들을 대거 추가하여 플레이어의 성장 곡선을 완만하고 만족스럽게 개선했습니다. +- **적 능력치 조정:** 변경된 아이템 밸런스에 맞춰 모든 적들의 능력치와 장비를 재조정하여, 각 티어별 난이도가 일관성 있고 도전적으로 느껴지도록 수정했습니다. + +### B. 소비용품(Consumable) 데이터 리팩토링 +- **JSON으로 데이터 이전:** `item_table.dart`에 하드코딩되어 있던 물약 아이템 정보를 `items.json`으로 이전하여 데이터 관리의 일관성을 확보했습니다. +- **성능 최적화:** 아이템 로딩 시 `Map` 자료구조를 사용하도록 `ItemTable`의 로직을 개선하여, ID 기반 아이템 조회 시 비효율적인 배열 검색 대신 O(1) 시간 복잡도의 빠른 조회가 가능하도록 최적화했습니다. +- **접두사(Prefix) 제외 로직:** `LootGenerator`를 수정하여 소비용품에는 장비와 달리 접두사가 붙거나 능력치가 변하지 않고, 항상 고정된 값을 가지도록 보장했습니다. + +### C. 듀얼-윌딩(Dual-Wielding) 문제 수정 +- **문제 분석:** 현재 시스템이 무기 2개를 동시에 장착하는 것을 지원하지 않으며, 두 번째 무기가 첫 번째 무기를 덮어쓰는 현상을 코드 분석을 통해 확인했습니다. +- **데이터 수정:** 이 문제를 해결하기 위해, 무기를 2개 들고 있던 모든 적들의 장비를 무기 1개로 수정하고, 줄어든 위력만큼 기본 공격력(`baseAtk`)을 상향하여 의도했던 위협 수준을 유지하도록 밸런스를 맞췄습니다. + +## 3. 시각적 요소 추가 +- **전투 화면 배경:** `battle_screen`에 경기장 느낌의 배경 이미지를 추가하고, 그 위에 50% 투명도의 검은색 오버레이를 추가하여 깊이감을 더했습니다. +- **적 캐릭터 시각 효과:** 적 캐릭터의 이미지에 `screen` 블렌드 모드를 적용하여, 전체적으로 밝고 하얗게 빛나는 듯한 시각적 효과를 부여했습니다. diff --git a/pubspec.yaml b/pubspec.yaml index 1dae993..8a924e0 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -28,3 +28,4 @@ flutter: - assets/data/ - assets/data/icon/ - assets/images/enemies/ + - assets/images/background/