update
This commit is contained in:
parent
2de58a6525
commit
c029cd1e10
|
|
@ -1,105 +1,310 @@
|
|||
{
|
||||
"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
|
||||
}
|
||||
]
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
|
|||
Binary file not shown.
|
After Width: | Height: | Size: 168 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 110 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 214 KiB |
|
|
@ -83,110 +83,47 @@ class ItemTable {
|
|||
static List<ItemTemplate> armors = [];
|
||||
static List<ItemTemplate> shields = [];
|
||||
static List<ItemTemplate> accessories = [];
|
||||
static List<ItemTemplate> consumables = []; // New: Potions
|
||||
static List<ItemTemplate> consumables = [];
|
||||
|
||||
static final Map<String, ItemTemplate> _items = {};
|
||||
|
||||
static void initialize() {
|
||||
// 0. Consumables (Potions)
|
||||
// Manually added for now, later move to JSON if preferred.
|
||||
List<ItemTemplate> 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<void> 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<String, dynamic> 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<ItemTemplate> 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<ItemTemplate> get allItems => [
|
||||
...weapons,
|
||||
...armors,
|
||||
...shields,
|
||||
...accessories,
|
||||
...consumables,
|
||||
];
|
||||
static List<ItemTemplate> 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.
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -650,8 +650,17 @@ class _BattleScreenState extends State<BattleScreen> {
|
|||
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(
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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. **콘텐츠 확장:** 더 많은 아이템, 적, 스킬 패턴 추가.
|
||||
1. **콘텐츠 확장:** 더 많은 아이템, 적, 스킬 패턴 추가.
|
||||
2. **밸런싱:** 현재 스탯 미세 조정.
|
||||
3. **튜토리얼:** 신규 유저를 위한 가이드 추가.
|
||||
|
|
@ -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` 블렌드 모드를 적용하여, 전체적으로 밝고 하얗게 빛나는 듯한 시각적 효과를 부여했습니다.
|
||||
|
|
@ -28,3 +28,4 @@ flutter:
|
|||
- assets/data/
|
||||
- assets/data/icon/
|
||||
- assets/images/enemies/
|
||||
- assets/images/background/
|
||||
|
|
|
|||
Loading…
Reference in New Issue