diff --git a/data/drops.json b/data/drops.json index 9275c8a..88ad252 100644 --- a/data/drops.json +++ b/data/drops.json @@ -1,109 +1,4 @@ [ - { - "id": 31, - "name": "Memory Drop", - "level": 5, - "type": 1, - "att": "expbonus,10" - }, - { - "id": 25, - "name": "Ruby", - "level": 50, - "type": 1, - "att": "maxhp,150" - }, - { - "id": 23, - "name": "Seraph's Truth", - "level": 35, - "type": 1, - "att": "maxmp,75,dexterity,75" - }, - { - "id": 24, - "name": "Seraph's Love", - "level": 40, - "type": 1, - "att": "maxmp,100,dexterity,100" - }, - { - "id": 11, - "name": "Dragon's Tear", - "level": 35, - "type": 1, - "att": "strength,50" - }, - { - "id": 20, - "name": "Angel's Love", - "level": 40, - "type": 1, - "att": "maxhp,100,strength,100" - }, - { - "id": 18, - "name": "Angel's Rise", - "level": 30, - "type": 1, - "att": "maxhp,50,strength,50" - }, - { - "id": 8, - "name": "Dragon's Plate", - "level": 30, - "type": 1, - "att": "defensepower,50" - }, - { - "id": 5, - "name": "Magic Stone", - "level": 10, - "type": 1, - "att": "maxmp,25" - }, - { - "id": 27, - "name": "Emerald", - "level": 50, - "type": 1, - "att": "strength,150" - }, - { - "id": 26, - "name": "Pearl", - "level": 50, - "type": 1, - "att": "maxmp,150" - }, - { - "id": 14, - "name": "Demon's Fall", - "level": 35, - "type": 1, - "att": "maxmp,-50,strength,50" - }, - { - "id": 17, - "name": "Angel's Joy", - "level": 25, - "type": 1, - "att": "maxhp,25,strength,25" - }, - { - "id": 7, - "name": "Dragon's Scale", - "level": 10, - "type": 1, - "att": "defensepower,25" - }, - { - "id": 12, - "name": "Dragon's Wing", - "level": 35, - "type": 1, - "att": "dexterity,50" - }, { "id": 1, "name": "Life Pebble", @@ -111,27 +6,6 @@ "type": 1, "att": "maxhp,10" }, - { - "id": 4, - "name": "Magic Pebble", - "level": 1, - "type": 1, - "att": "maxmp,10" - }, - { - "id": 22, - "name": "Seraph's Rise", - "level": 30, - "type": 1, - "att": "maxmp,50,dexterity,50" - }, - { - "id": 29, - "name": "Obsidian", - "level": 50, - "type": 1, - "att": "attackpower,150" - }, { "id": 32, "name": "Fortune Drop", @@ -139,27 +13,6 @@ "type": 1, "att": "goldbonus,10" }, - { - "id": 30, - "name": "Diamond", - "level": 50, - "type": 1, - "att": "defensepower,150" - }, - { - "id": 15, - "name": "Demon's Lie", - "level": 45, - "type": 1, - "att": "maxhp,-100,strength,100" - }, - { - "id": 9, - "name": "Dragon's Claw", - "level": 10, - "type": 1, - "att": "attackpower,25" - }, { "id": 28, "name": "Topaz", @@ -168,46 +21,18 @@ "att": "dexterity,150" }, { - "id": 6, - "name": "Magic Rock", - "level": 25, + "id": 26, + "name": "Pearl", + "level": 50, "type": 1, - "att": "maxmp,50" + "att": "maxmp,150" }, { - "id": 21, - "name": "Seraph's Joy", - "level": 25, - "type": 1, - "att": "maxmp,25,dexterity,25" - }, - { - "id": 3, - "name": "Life Rock", - "level": 25, - "type": 1, - "att": "maxhp,50" - }, - { - "id": 19, - "name": "Angel's Truth", - "level": 35, - "type": 1, - "att": "maxhp,75,strength,75" - }, - { - "id": 13, - "name": "Demon's Sin", - "level": 35, - "type": 1, - "att": "maxhp,-50,strength,50" - }, - { - "id": 2, - "name": "Life Stone", + "id": 7, + "name": "Dragon's Scale", "level": 10, "type": 1, - "att": "maxhp,25" + "att": "defensepower,25" }, { "id": 10, @@ -216,11 +41,186 @@ "type": 1, "att": "attackpower,50" }, + { + "id": 6, + "name": "Magic Rock", + "level": 25, + "type": 1, + "att": "maxmp,50" + }, + { + "id": 19, + "name": "Angel's Truth", + "level": 35, + "type": 1, + "att": "maxhp,75,strength,75" + }, + { + "id": 20, + "name": "Angel's Love", + "level": 40, + "type": 1, + "att": "maxhp,100,strength,100" + }, + { + "id": 8, + "name": "Dragon's Plate", + "level": 30, + "type": 1, + "att": "defensepower,50" + }, + { + "id": 21, + "name": "Seraph's Joy", + "level": 25, + "type": 1, + "att": "maxmp,25,dexterity,25" + }, + { + "id": 24, + "name": "Seraph's Love", + "level": 40, + "type": 1, + "att": "maxmp,100,dexterity,100" + }, + { + "id": 18, + "name": "Angel's Rise", + "level": 30, + "type": 1, + "att": "maxhp,50,strength,50" + }, + { + "id": 12, + "name": "Dragon's Wing", + "level": 35, + "type": 1, + "att": "dexterity,50" + }, + { + "id": 15, + "name": "Demon's Lie", + "level": 45, + "type": 1, + "att": "maxhp,-100,strength,100" + }, + { + "id": 11, + "name": "Dragon's Tear", + "level": 35, + "type": 1, + "att": "strength,50" + }, + { + "id": 5, + "name": "Magic Stone", + "level": 10, + "type": 1, + "att": "maxmp,25" + }, + { + "id": 14, + "name": "Demon's Fall", + "level": 35, + "type": 1, + "att": "maxmp,-50,strength,50" + }, + { + "id": 29, + "name": "Obsidian", + "level": 50, + "type": 1, + "att": "attackpower,150" + }, + { + "id": 17, + "name": "Angel's Joy", + "level": 25, + "type": 1, + "att": "maxhp,25,strength,25" + }, + { + "id": 27, + "name": "Emerald", + "level": 50, + "type": 1, + "att": "strength,150" + }, + { + "id": 13, + "name": "Demon's Sin", + "level": 35, + "type": 1, + "att": "maxhp,-50,strength,50" + }, + { + "id": 9, + "name": "Dragon's Claw", + "level": 10, + "type": 1, + "att": "attackpower,25" + }, + { + "id": 31, + "name": "Memory Drop", + "level": 5, + "type": 1, + "att": "expbonus,10" + }, + { + "id": 4, + "name": "Magic Pebble", + "level": 1, + "type": 1, + "att": "maxmp,10" + }, + { + "id": 2, + "name": "Life Stone", + "level": 10, + "type": 1, + "att": "maxhp,25" + }, + { + "id": 25, + "name": "Ruby", + "level": 50, + "type": 1, + "att": "maxhp,150" + }, + { + "id": 30, + "name": "Diamond", + "level": 50, + "type": 1, + "att": "defensepower,150" + }, + { + "id": 3, + "name": "Life Rock", + "level": 25, + "type": 1, + "att": "maxhp,50" + }, + { + "id": 23, + "name": "Seraph's Truth", + "level": 35, + "type": 1, + "att": "maxmp,75,dexterity,75" + }, { "id": 16, "name": "Demon's Hate", "level": 45, "type": 1, "att": "maxmp,-100,strength,100" + }, + { + "id": 22, + "name": "Seraph's Rise", + "level": 30, + "type": 1, + "att": "maxmp,50,dexterity,50" } ] \ No newline at end of file diff --git a/data/items.json b/data/items.json index 26a29a4..cdbd919 100644 --- a/data/items.json +++ b/data/items.json @@ -1,28 +1,4 @@ [ - { - "id": 3, - "type": 1, - "name": "Club", - "value": 40, - "att": 5, - "special": "" - }, - { - "id": 5, - "type": 1, - "name": "Hatchet", - "value": 150, - "att": 12, - "special": "" - }, - { - "id": 33, - "type": 3, - "name": "Destiny Aegis", - "value": 25000, - "att": 100, - "special": "maxhp,50" - }, { "id": 10, "type": 1, @@ -32,66 +8,26 @@ "special": "" }, { - "id": 11, + "id": 16, "type": 1, - "name": "Claymore", - "value": 2000, - "att": 60, - "special": "" + "name": "Destiny Blade", + "value": 50000, + "att": 250, + "special": "strength,50" }, { - "id": 21, + "id": 26, "type": 2, - "name": "Chain Mail", - "value": 300, - "att": 30, - "special": "" - }, - { - "id": 14, - "type": 1, - "name": "Bright Sword", - "value": 6000, - "att": 100, + "name": "Bright Armor", + "value": 10000, + "att": 175, "special": "expbonus,10" }, { - "id": 13, + "id": 7, "type": 1, - "name": "Dark Sword", - "value": 4500, - "att": 125, - "special": "expbonus,-10" - }, - { - "id": 9, - "type": 1, - "name": "Broadsword", - "value": 800, - "att": 45, - "special": "" - }, - { - "id": 30, - "type": 3, - "name": "Small Shield", - "value": 500, - "att": 10, - "special": "" - }, - { - "id": 15, - "type": 1, - "name": "Magic Sword", - "value": 10000, - "att": 150, - "special": "maxmp,50" - }, - { - "id": 20, - "type": 2, - "name": "Hard Leather Armor", - "value": 150, + "name": "Brand", + "value": 300, "att": 25, "special": "" }, @@ -104,19 +40,19 @@ "special": "" }, { - "id": 26, - "type": 2, - "name": "Bright Armor", - "value": 10000, - "att": 175, - "special": "expbonus,10" + "id": 13, + "type": 1, + "name": "Dark Sword", + "value": 4500, + "att": 125, + "special": "expbonus,-10" }, { - "id": 29, - "type": 3, - "name": "Buckler", - "value": 100, - "att": 4, + "id": 3, + "type": 1, + "name": "Club", + "value": 40, + "att": 5, "special": "" }, { @@ -128,51 +64,11 @@ "special": "maxmp,50" }, { - "id": 28, - "type": 3, - "name": "Reed Shield", - "value": 50, - "att": 2, - "special": "" - }, - { - "id": 8, - "type": 1, - "name": "Poleaxe", - "value": 500, - "att": 35, - "special": "" - }, - { - "id": 12, - "type": 1, - "name": "Dark Axe", - "value": 3000, - "att": 100, - "special": "expbonus,-5" - }, - { - "id": 2, - "type": 1, - "name": "Branch", - "value": 30, - "att": 4, - "special": "" - }, - { - "id": 17, + "id": 21, "type": 2, - "name": "Skivvies", - "value": 25, - "att": 2, - "special": "goldbonus,10" - }, - { - "id": 32, - "type": 3, - "name": "Silver Shield", - "value": 10000, - "att": 60, + "name": "Chain Mail", + "value": 300, + "att": 30, "special": "" }, { @@ -183,6 +79,14 @@ "att": 2, "special": "" }, + { + "id": 30, + "type": 3, + "name": "Small Shield", + "value": 500, + "att": 10, + "special": "" + }, { "id": 31, "type": 3, @@ -192,11 +96,123 @@ "special": "" }, { - "id": 23, + "id": 4, + "type": 1, + "name": "Dagger", + "value": 90, + "att": 8, + "special": "" + }, + { + "id": 8, + "type": 1, + "name": "Poleaxe", + "value": 500, + "att": 35, + "special": "" + }, + { + "id": 5, + "type": 1, + "name": "Hatchet", + "value": 150, + "att": 12, + "special": "" + }, + { + "id": 22, "type": 2, - "name": "Iron Plate", - "value": 2000, + "name": "Bronze Plate", + "value": 900, + "att": 50, + "special": "" + }, + { + "id": 17, + "type": 2, + "name": "Skivvies", + "value": 25, + "att": 2, + "special": "goldbonus,10" + }, + { + "id": 27, + "type": 2, + "name": "Destiny Raiment", + "value": 50000, + "att": 200, + "special": "dexterity,50" + }, + { + "id": 15, + "type": 1, + "name": "Magic Sword", + "value": 10000, + "att": 150, + "special": "maxmp,50" + }, + { + "id": 9, + "type": 1, + "name": "Broadsword", + "value": 800, + "att": 45, + "special": "" + }, + { + "id": 29, + "type": 3, + "name": "Buckler", + "value": 100, + "att": 4, + "special": "" + }, + { + "id": 12, + "type": 1, + "name": "Dark Axe", + "value": 3000, "att": 100, + "special": "expbonus,-5" + }, + { + "id": 33, + "type": 3, + "name": "Destiny Aegis", + "value": 25000, + "att": 100, + "special": "maxhp,50" + }, + { + "id": 6, + "type": 1, + "name": "Axe", + "value": 200, + "att": 16, + "special": "" + }, + { + "id": 20, + "type": 2, + "name": "Hard Leather Armor", + "value": 150, + "att": 25, + "special": "" + }, + { + "id": 11, + "type": 1, + "name": "Claymore", + "value": 2000, + "att": 60, + "special": "" + }, + { + "id": 2, + "type": 1, + "name": "Branch", + "value": 30, + "att": 4, "special": "" }, { @@ -207,6 +223,38 @@ "att": 150, "special": "expbonus,-10" }, + { + "id": 14, + "type": 1, + "name": "Bright Sword", + "value": 6000, + "att": 100, + "special": "expbonus,10" + }, + { + "id": 23, + "type": 2, + "name": "Iron Plate", + "value": 2000, + "att": 100, + "special": "" + }, + { + "id": 32, + "type": 3, + "name": "Silver Shield", + "value": 10000, + "att": 60, + "special": "" + }, + { + "id": 28, + "type": 3, + "name": "Reed Shield", + "value": 50, + "att": 2, + "special": "" + }, { "id": 18, "type": 2, @@ -214,53 +262,5 @@ "value": 50, "att": 5, "special": "" - }, - { - "id": 16, - "type": 1, - "name": "Destiny Blade", - "value": 50000, - "att": 250, - "special": "strength,50" - }, - { - "id": 6, - "type": 1, - "name": "Axe", - "value": 200, - "att": 16, - "special": "" - }, - { - "id": 27, - "type": 2, - "name": "Destiny Raiment", - "value": 50000, - "att": 200, - "special": "dexterity,50" - }, - { - "id": 4, - "type": 1, - "name": "Dagger", - "value": 90, - "att": 8, - "special": "" - }, - { - "id": 7, - "type": 1, - "name": "Brand", - "value": 300, - "att": 25, - "special": "" - }, - { - "id": 22, - "type": 2, - "name": "Bronze Plate", - "value": 900, - "att": 50, - "special": "" } ] \ No newline at end of file diff --git a/data/monsters.json b/data/monsters.json index 5b35140..77a7203 100644 --- a/data/monsters.json +++ b/data/monsters.json @@ -1,629 +1,13 @@ [ { - "id": 103, - "name": "Advocate", - "max_hp": 148, - "max_dmg": 132, - "armor": 108, - "level": 35, - "max_exp": 350, - "max_gold": 117, - "immune": 0 - }, - { - "id": 39, - "name": "Phantom", - "max_hp": 46, - "max_dmg": 38, - "armor": 24, - "level": 14, - "max_exp": 85, - "max_gold": 28, - "immune": 1 - }, - { - "id": 17, - "name": "Ghost", - "max_hp": 24, - "max_dmg": 20, - "armor": 8, - "level": 6, - "max_exp": 28, - "max_gold": 9, - "immune": 0 - }, - { - "id": 95, - "name": "Lesser Wyvern", - "max_hp": 122, - "max_dmg": 110, - "armor": 92, - "level": 32, - "max_exp": 270, - "max_gold": 90, - "immune": 0 - }, - { - "id": 85, - "name": "Aero Elemental", - "max_hp": 104, - "max_dmg": 94, - "armor": 74, - "level": 29, - "max_exp": 220, - "max_gold": 73, - "immune": 1 - }, - { - "id": 51, - "name": "Werewolf", - "max_hp": 56, - "max_dmg": 48, - "armor": 38, - "level": 17, - "max_exp": 124, - "max_gold": 41, - "immune": 0 - }, - { - "id": 34, - "name": "Imp", - "max_hp": 42, - "max_dmg": 34, - "armor": 22, - "level": 12, - "max_exp": 70, - "max_gold": 23, - "immune": 0 - }, - { - "id": 54, - "name": "Nisse", - "max_hp": 60, - "max_dmg": 52, - "armor": 40, - "level": 19, - "max_exp": 132, - "max_gold": 44, - "immune": 0 - }, - { - "id": 8, - "name": "Drakelor", - "max_hp": 14, - "max_dmg": 12, - "armor": 4, - "level": 3, - "max_exp": 10, - "max_gold": 3, - "immune": 0 - }, - { - "id": 133, - "name": "Demon", - "max_hp": 240, - "max_dmg": 210, - "armor": 180, - "level": 45, - "max_exp": 1200, - "max_gold": 400, - "immune": 0 - }, - { - "id": 139, - "name": "Demon Prince", - "max_hp": 270, - "max_dmg": 240, - "armor": 200, - "level": 47, - "max_exp": 1520, - "max_gold": 507, - "immune": 0 - }, - { - "id": 140, - "name": "Black Dragon", - "max_hp": 275, - "max_dmg": 250, - "armor": 205, - "level": 47, - "max_exp": 1580, - "max_gold": 527, - "immune": 1 - }, - { - "id": 84, - "name": "Wyrm", - "max_hp": 100, - "max_dmg": 92, - "armor": 72, - "level": 28, - "max_exp": 220, - "max_gold": 73, - "immune": 0 - }, - { - "id": 43, - "name": "Orc", - "max_hp": 49, - "max_dmg": 42, - "armor": 28, - "level": 15, - "max_exp": 104, - "max_gold": 35, - "immune": 0 - }, - { - "id": 73, - "name": "Lycan", - "max_hp": 88, - "max_dmg": 78, - "armor": 60, - "level": 25, - "max_exp": 185, - "max_gold": 62, - "immune": 0 - }, - { - "id": 36, - "name": "Scoundrel", - "max_hp": 43, - "max_dmg": 35, - "armor": 22, - "level": 12, - "max_exp": 75, - "max_gold": 25, - "immune": 0 - }, - { - "id": 123, - "name": "Renegade", - "max_hp": 205, - "max_dmg": 185, - "armor": 150, - "level": 42, - "max_exp": 780, - "max_gold": 260, - "immune": 0 - }, - { - "id": 45, - "name": "Wraith", - "max_hp": 50, - "max_dmg": 45, - "armor": 30, - "level": 16, - "max_exp": 108, - "max_gold": 36, - "immune": 0 - }, - { - "id": 52, - "name": "Hellcat", - "max_hp": 58, - "max_dmg": 50, - "armor": 38, - "level": 18, - "max_exp": 128, - "max_gold": 43, - "immune": 0 - }, - { - "id": 78, - "name": "Werebear", - "max_hp": 92, - "max_dmg": 84, - "armor": 65, - "level": 26, - "max_exp": 195, - "max_gold": 65, - "immune": 0 - }, - { - "id": 9, - "name": "Silver Slime", - "max_hp": 15, - "max_dmg": 100, - "armor": 200, - "level": 30, - "max_exp": 15, - "max_gold": 1000, - "immune": 2 - }, - { - "id": 114, - "name": "Serafiend", - "max_hp": 170, + "id": 113, + "name": "Zealot", + "max_hp": 168, "max_dmg": 155, "armor": 125, "level": 38, - "max_exp": 555, - "max_gold": 185, - "immune": 0 - }, - { - "id": 136, - "name": "Leviathan", - "max_hp": 255, - "max_dmg": 225, - "armor": 190, - "level": 46, - "max_exp": 1350, - "max_gold": 450, - "immune": 0 - }, - { - "id": 11, - "name": "Raven", - "max_hp": 16, - "max_dmg": 13, - "armor": 5, - "level": 4, - "max_exp": 18, - "max_gold": 6, - "immune": 0 - }, - { - "id": 61, - "name": "Megawraith", - "max_hp": 70, - "max_dmg": 60, - "armor": 46, - "level": 21, - "max_exp": 155, - "max_gold": 52, - "immune": 0 - }, - { - "id": 121, - "name": "Red Dragon", - "max_hp": 200, - "max_dmg": 180, - "armor": 145, - "level": 41, - "max_exp": 720, - "max_gold": 240, - "immune": 0 - }, - { - "id": 145, - "name": "Red Daemon", - "max_hp": 310, - "max_dmg": 280, - "armor": 230, - "level": 48, - "max_exp": 1880, - "max_gold": 627, - "immune": 0 - }, - { - "id": 88, - "name": "Frost Wyrm", - "max_hp": 110, - "max_dmg": 100, - "armor": 80, - "level": 30, - "max_exp": 230, - "max_gold": 77, - "immune": 0 - }, - { - "id": 120, - "name": "Cherufiend", - "max_hp": 195, - "max_dmg": 170, - "armor": 140, - "level": 41, - "max_exp": 690, - "max_gold": 230, - "immune": 0 - }, - { - "id": 23, - "name": "Drakefin", - "max_hp": 32, - "max_dmg": 26, - "armor": 12, - "level": 8, - "max_exp": 40, - "max_gold": 13, - "immune": 0 - }, - { - "id": 135, - "name": "Insurgent", - "max_hp": 250, - "max_dmg": 220, - "armor": 190, - "level": 46, - "max_exp": 1300, - "max_gold": 433, - "immune": 0 - }, - { - "id": 111, - "name": "Lesser Devil", - "max_hp": 164, - "max_dmg": 150, - "armor": 120, - "level": 37, - "max_exp": 485, - "max_gold": 162, - "immune": 0 - }, - { - "id": 67, - "name": "Beast", - "max_hp": 76, - "max_dmg": 66, - "armor": 52, - "level": 23, - "max_exp": 170, - "max_gold": 57, - "immune": 0 - }, - { - "id": 64, - "name": "Haunt", - "max_hp": 72, - "max_dmg": 62, - "armor": 48, - "level": 22, - "max_exp": 160, - "max_gold": 53, - "immune": 0 - }, - { - "id": 129, - "name": "Shadow Dragon", - "max_hp": 225, - "max_dmg": 200, - "armor": 170, - "level": 44, - "max_exp": 1010, - "max_gold": 337, - "immune": 0 - }, - { - "id": 58, - "name": "Wizard", - "max_hp": 66, - "max_dmg": 56, - "armor": 44, - "level": 20, - "max_exp": 144, - "max_gold": 48, - "immune": 0 - }, - { - "id": 15, - "name": "Drakemal", - "max_hp": 22, - "max_dmg": 18, - "armor": 7, - "level": 6, - "max_exp": 24, - "max_gold": 8, - "immune": 0 - }, - { - "id": 29, - "name": "Skeleton", - "max_hp": 38, - "max_dmg": 30, - "armor": 18, - "level": 10, - "max_exp": 58, - "max_gold": 19, - "immune": 0 - }, - { - "id": 50, - "name": "Troll", - "max_hp": 56, - "max_dmg": 48, - "armor": 36, - "level": 17, - "max_exp": 120, - "max_gold": 40, - "immune": 0 - }, - { - "id": 53, - "name": "Spirit", - "max_hp": 58, - "max_dmg": 50, - "armor": 38, - "level": 18, - "max_exp": 132, - "max_gold": 44, - "immune": 0 - }, - { - "id": 35, - "name": "Nymph", - "max_hp": 43, - "max_dmg": 35, - "armor": 22, - "level": 12, - "max_exp": 70, - "max_gold": 23, - "immune": 0 - }, - { - "id": 106, - "name": "Ultradoomer", - "max_hp": 155, - "max_dmg": 140, - "armor": 115, - "level": 36, - "max_exp": 395, - "max_gold": 132, - "immune": 0 - }, - { - "id": 101, - "name": "Megadoomer", - "max_hp": 140, - "max_dmg": 128, - "armor": 105, - "level": 34, - "max_exp": 320, - "max_gold": 107, - "immune": 0 - }, - { - "id": 131, - "name": "Incubus", - "max_hp": 230, - "max_dmg": 205, - "armor": 175, - "level": 44, - "max_exp": 1100, - "max_gold": 367, - "immune": 1 - }, - { - "id": 119, - "name": "Liche Prince", - "max_hp": 190, - "max_dmg": 168, - "armor": 138, - "level": 40, - "max_exp": 660, - "max_gold": 220, - "immune": 0 - }, - { - "id": 77, - "name": "Dawkor", - "max_hp": 92, - "max_dmg": 82, - "armor": 64, - "level": 26, - "max_exp": 195, - "max_gold": 65, - "immune": 0 - }, - { - "id": 28, - "name": "Goblin", - "max_hp": 36, - "max_dmg": 30, - "armor": 15, - "level": 10, - "max_exp": 54, - "max_gold": 18, - "immune": 0 - }, - { - "id": 31, - "name": "Silver Scorpion", - "max_hp": 30, - "max_dmg": 160, - "armor": 350, - "level": 40, - "max_exp": 63, - "max_gold": 2000, - "immune": 2 - }, - { - "id": 25, - "name": "Fire Raven", - "max_hp": 34, - "max_dmg": 28, - "armor": 14, - "level": 9, - "max_exp": 45, - "max_gold": 15, - "immune": 0 - }, - { - "id": 90, - "name": "Lycanthra", - "max_hp": 112, - "max_dmg": 104, - "armor": 82, - "level": 30, - "max_exp": 240, - "max_gold": 80, - "immune": 0 - }, - { - "id": 69, - "name": "Dark Bear", - "max_hp": 80, - "max_dmg": 70, - "armor": 56, - "level": 24, - "max_exp": 175, - "max_gold": 58, - "immune": 1 - }, - { - "id": 65, - "name": "Hellbeast", - "max_hp": 74, - "max_dmg": 64, - "armor": 50, - "level": 22, - "max_exp": 165, - "max_gold": 55, - "immune": 0 - }, - { - "id": 38, - "name": "Grey Wolf", - "max_hp": 44, - "max_dmg": 36, - "armor": 24, - "level": 13, - "max_exp": 82, - "max_gold": 27, - "immune": 0 - }, - { - "id": 148, - "name": "Dark Daemon", - "max_hp": 340, - "max_dmg": 320, - "armor": 260, - "level": 49, - "max_exp": 2200, - "max_gold": 733, - "immune": 1 - }, - { - "id": 70, - "name": "Fire", - "max_hp": 80, - "max_dmg": 72, - "armor": 56, - "level": 24, - "max_exp": 175, - "max_gold": 58, - "immune": 0 - }, - { - "id": 141, - "name": "Nihilist", - "max_hp": 280, - "max_dmg": 250, - "armor": 205, - "level": 47, - "max_exp": 1640, - "max_gold": 547, - "immune": 0 - }, - { - "id": 71, - "name": "Polgergeist", - "max_hp": 84, - "max_dmg": 74, - "armor": 58, - "level": 25, - "max_exp": 180, - "max_gold": 60, + "max_exp": 530, + "max_gold": 177, "immune": 0 }, { @@ -637,72 +21,6 @@ "max_gold": 77, "immune": 0 }, - { - "id": 66, - "name": "Fear", - "max_hp": 76, - "max_dmg": 66, - "armor": 52, - "level": 23, - "max_exp": 165, - "max_gold": 55, - "immune": 0 - }, - { - "id": 108, - "name": "Green Dragon", - "max_hp": 160, - "max_dmg": 140, - "armor": 115, - "level": 36, - "max_exp": 425, - "max_gold": 142, - "immune": 0 - }, - { - "id": 116, - "name": "Blue Dragon", - "max_hp": 180, - "max_dmg": 160, - "armor": 130, - "level": 39, - "max_exp": 605, - "max_gold": 202, - "immune": 0 - }, - { - "id": 96, - "name": "Doomer", - "max_hp": 124, - "max_dmg": 112, - "armor": 92, - "level": 32, - "max_exp": 270, - "max_gold": 90, - "immune": 0 - }, - { - "id": 134, - "name": "Dark Dragon", - "max_hp": 245, - "max_dmg": 215, - "armor": 180, - "level": 45, - "max_exp": 1250, - "max_gold": 417, - "immune": 1 - }, - { - "id": 12, - "name": "Scorpion", - "max_hp": 18, - "max_dmg": 14, - "armor": 6, - "level": 5, - "max_exp": 20, - "max_gold": 7, - "immune": 0 - }, { "id": 125, "name": "Liche Lord", @@ -715,674 +33,36 @@ "immune": 0 }, { - "id": 26, - "name": "Dybbuk", - "max_hp": 34, - "max_dmg": 28, - "armor": 14, - "level": 9, - "max_exp": 50, - "max_gold": 17, + "id": 120, + "name": "Cherufiend", + "max_hp": 195, + "max_dmg": 170, + "armor": 140, + "level": 41, + "max_exp": 690, + "max_gold": 230, "immune": 0 }, { - "id": 40, - "name": "Specter", - "max_hp": 46, - "max_dmg": 38, - "armor": 24, - "level": 14, - "max_exp": 90, - "max_gold": 30, - "immune": 0 - }, - { - "id": 83, - "name": "Lycanthor", - "max_hp": 100, - "max_dmg": 90, - "armor": 70, - "level": 28, - "max_exp": 210, - "max_gold": 70, - "immune": 0 - }, - { - "id": 126, - "name": "Greatest Devil", - "max_hp": 215, - "max_dmg": 195, - "armor": 160, - "level": 43, - "max_exp": 890, - "max_gold": 297, - "immune": 0 - }, - { - "id": 33, - "name": "Sorceror", - "max_hp": 41, - "max_dmg": 33, - "armor": 22, - "level": 11, - "max_exp": 68, - "max_gold": 23, - "immune": 0 - }, - { - "id": 59, - "name": "Uruk", - "max_hp": 68, - "max_dmg": 58, - "armor": 44, - "level": 20, - "max_exp": 146, - "max_gold": 49, - "immune": 0 - }, - { - "id": 127, - "name": "Dark Knight", - "max_hp": 220, - "max_dmg": 200, - "armor": 160, - "level": 43, - "max_exp": 930, - "max_gold": 310, - "immune": 0 - }, - { - "id": 27, - "name": "Knave", - "max_hp": 36, - "max_dmg": 30, - "armor": 15, - "level": 9, - "max_exp": 52, - "max_gold": 17, - "immune": 0 - }, - { - "id": 32, - "name": "Mirage", - "max_hp": 40, - "max_dmg": 32, - "armor": 20, - "level": 11, - "max_exp": 64, - "max_gold": 21, - "immune": 1 - }, - { - "id": 92, - "name": "Blaze", - "max_hp": 118, - "max_dmg": 108, - "armor": 84, - "level": 31, - "max_exp": 250, - "max_gold": 83, - "immune": 0 - }, - { - "id": 144, - "name": "Demon Lord", - "max_hp": 300, - "max_dmg": 270, - "armor": 220, - "level": 48, - "max_exp": 1820, - "max_gold": 607, - "immune": 0 - }, - { - "id": 1, - "name": "Blue Slime", - "max_hp": 4, - "max_dmg": 3, - "armor": 1, - "level": 1, - "max_exp": 1, - "max_gold": 1, - "immune": 0 - }, - { - "id": 4, - "name": "Creature", - "max_hp": 10, - "max_dmg": 8, - "armor": 2, - "level": 2, - "max_exp": 4, - "max_gold": 2, - "immune": 0 - }, - { - "id": 147, - "name": "Demon King", - "max_hp": 330, - "max_dmg": 300, - "armor": 250, - "level": 49, - "max_exp": 2000, - "max_gold": 667, - "immune": 0 - }, - { - "id": 41, - "name": "Dark Scorpion", - "max_hp": 48, - "max_dmg": 40, - "armor": 26, - "level": 15, - "max_exp": 95, - "max_gold": 32, - "immune": 1 - }, - { - "id": 56, - "name": "Figment", - "max_hp": 64, - "max_dmg": 55, - "armor": 42, - "level": 19, - "max_exp": 140, - "max_gold": 47, - "immune": 1 - }, - { - "id": 76, - "name": "Ultrawraith", - "max_hp": 90, - "max_dmg": 82, - "armor": 64, - "level": 26, - "max_exp": 190, - "max_gold": 63, - "immune": 0 - }, - { - "id": 143, - "name": "Demagogue", - "max_hp": 290, - "max_dmg": 260, - "armor": 210, - "level": 48, - "max_exp": 1760, - "max_gold": 587, - "immune": 0 - }, - { - "id": 86, - "name": "Dawkare", - "max_hp": 106, - "max_dmg": 96, - "armor": 76, - "level": 29, - "max_exp": 220, - "max_gold": 73, - "immune": 0 - }, - { - "id": 151, - "name": "Lucifuge", - "max_hp": 600, - "max_dmg": 600, - "armor": 400, - "level": 50, - "max_exp": 10000, - "max_gold": 10000, - "immune": 2 - }, - { - "id": 16, - "name": "Shadow Raven", - "max_hp": 24, - "max_dmg": 18, - "armor": 7, - "level": 6, - "max_exp": 26, - "max_gold": 9, - "immune": 1 - }, - { - "id": 63, - "name": "Grey Bear", - "max_hp": 70, - "max_dmg": 62, - "armor": 48, - "level": 21, - "max_exp": 160, - "max_gold": 53, - "immune": 0 - }, - { - "id": 80, - "name": "Large Beast", - "max_hp": 96, - "max_dmg": 88, - "armor": 66, - "level": 27, - "max_exp": 200, - "max_gold": 67, - "immune": 0 - }, - { - "id": 146, - "name": "Colossus", - "max_hp": 320, - "max_dmg": 300, - "armor": 240, - "level": 49, - "max_exp": 1940, - "max_gold": 647, - "immune": 0 - }, - { - "id": 18, - "name": "Frost Raven", - "max_hp": 26, - "max_dmg": 20, - "armor": 8, - "level": 7, - "max_exp": 30, - "max_gold": 10, - "immune": 0 - }, - { - "id": 104, - "name": "Strong Knight", - "max_hp": 150, - "max_dmg": 135, - "armor": 110, - "level": 35, - "max_exp": 365, - "max_gold": 122, - "immune": 0 - }, - { - "id": 115, - "name": "Pale Knight", - "max_hp": 175, - "max_dmg": 160, - "armor": 130, - "level": 39, - "max_exp": 580, - "max_gold": 193, - "immune": 0 - }, - { - "id": 14, - "name": "Nightshade", - "max_hp": 22, - "max_dmg": 16, - "armor": 6, - "level": 6, - "max_exp": 24, - "max_gold": 8, - "immune": 0 - }, - { - "id": 62, - "name": "Dawkin", - "max_hp": 70, - "max_dmg": 60, - "armor": 46, - "level": 21, - "max_exp": 155, - "max_gold": 52, - "immune": 0 - }, - { - "id": 118, - "name": "Devil", - "max_hp": 184, - "max_dmg": 164, - "armor": 135, - "level": 40, - "max_exp": 666, - "max_gold": 222, - "immune": 0 - }, - { - "id": 113, - "name": "Zealot", - "max_hp": 168, - "max_dmg": 155, - "armor": 125, - "level": 38, - "max_exp": 530, - "max_gold": 177, - "immune": 0 - }, - { - "id": 5, - "name": "Shadow", - "max_hp": 10, - "max_dmg": 9, - "armor": 3, - "level": 2, - "max_exp": 6, - "max_gold": 2, - "immune": 1 - }, - { - "id": 47, - "name": "Bandit", - "max_hp": 52, - "max_dmg": 45, - "armor": 30, - "level": 16, - "max_exp": 114, - "max_gold": 38, - "immune": 0 - }, - { - "id": 30, - "name": "Dark Slime", - "max_hp": 38, - "max_dmg": 32, - "armor": 18, - "level": 10, - "max_exp": 62, - "max_gold": 21, - "immune": 0 - }, - { - "id": 21, - "name": "Magician", - "max_hp": 30, - "max_dmg": 24, - "armor": 10, - "level": 8, - "max_exp": 36, - "max_gold": 12, - "immune": 0 - }, - { - "id": 7, - "name": "Shade", - "max_hp": 12, - "max_dmg": 10, - "armor": 3, - "level": 3, - "max_exp": 10, - "max_gold": 3, - "immune": 1 - }, - { - "id": 74, - "name": "Terra Elemental", - "max_hp": 88, - "max_dmg": 80, - "armor": 62, - "level": 25, - "max_exp": 185, - "max_gold": 62, - "immune": 1 - }, - { - "id": 75, - "name": "Necromancer", - "max_hp": 90, - "max_dmg": 80, - "armor": 62, - "level": 26, - "max_exp": 190, - "max_gold": 63, - "immune": 0 - }, - { - "id": 57, - "name": "Hellhound", - "max_hp": 66, - "max_dmg": 56, - "armor": 44, - "level": 20, - "max_exp": 140, - "max_gold": 47, - "immune": 0 - }, - { - "id": 49, - "name": "Dark Wolf", - "max_hp": 54, - "max_dmg": 47, - "armor": 36, - "level": 17, - "max_exp": 120, - "max_gold": 40, - "immune": 1 - }, - { - "id": 55, - "name": "Dawk", - "max_hp": 60, - "max_dmg": 54, - "armor": 40, - "level": 19, - "max_exp": 136, - "max_gold": 45, - "immune": 0 - }, - { - "id": 19, - "name": "Rogue Scorpion", - "max_hp": 28, - "max_dmg": 22, - "armor": 9, - "level": 7, - "max_exp": 32, - "max_gold": 11, - "immune": 0 - }, - { - "id": 110, - "name": "Greatest Wyvern", - "max_hp": 162, - "max_dmg": 150, - "armor": 120, - "level": 37, - "max_exp": 465, - "max_gold": 155, - "immune": 0 - }, - { - "id": 128, - "name": "Giant", - "max_hp": 220, - "max_dmg": 200, - "armor": 165, - "level": 43, - "max_exp": 970, - "max_gold": 323, - "immune": 0 - }, - { - "id": 109, - "name": "Fiend", - "max_hp": 160, - "max_dmg": 145, - "armor": 120, - "level": 37, - "max_exp": 445, - "max_gold": 148, - "immune": 0 - }, - { - "id": 91, - "name": "Terror", - "max_hp": 115, - "max_dmg": 108, - "armor": 84, - "level": 31, - "max_exp": 250, - "max_gold": 83, - "immune": 0 - }, - { - "id": 3, - "name": "Critter", - "max_hp": 6, - "max_dmg": 5, - "armor": 2, - "level": 1, - "max_exp": 4, - "max_gold": 2, - "immune": 0 - }, - { - "id": 132, - "name": "Traitor", - "max_hp": 230, - "max_dmg": 205, - "armor": 175, - "level": 45, - "max_exp": 1150, - "max_gold": 383, - "immune": 0 - }, - { - "id": 124, - "name": "Archfiend", - "max_hp": 210, - "max_dmg": 190, + "id": 123, + "name": "Renegade", + "max_hp": 205, + "max_dmg": 185, "armor": 150, "level": 42, - "max_exp": 810, - "max_gold": 270, + "max_exp": 780, + "max_gold": 260, "immune": 0 }, { - "id": 105, - "name": "Liche", - "max_hp": 150, - "max_dmg": 135, - "armor": 110, - "level": 35, - "max_exp": 380, - "max_gold": 127, - "immune": 0 - }, - { - "id": 150, - "name": "Black Daemon", - "max_hp": 400, - "max_dmg": 400, - "armor": 280, - "level": 50, - "max_exp": 3000, - "max_gold": 1000, - "immune": 1 - }, - { - "id": 81, - "name": "Horror", - "max_hp": 96, - "max_dmg": 88, - "armor": 68, - "level": 27, - "max_exp": 210, - "max_gold": 70, - "immune": 0 - }, - { - "id": 117, - "name": "Obsessive", - "max_hp": 180, - "max_dmg": 160, - "armor": 135, - "level": 40, - "max_exp": 630, - "max_gold": 210, - "immune": 0 - }, - { - "id": 79, - "name": "Brute", - "max_hp": 94, - "max_dmg": 84, - "armor": 65, - "level": 27, - "max_exp": 200, - "max_gold": 67, - "immune": 0 - }, - { - "id": 48, - "name": "Ultraskeleton", - "max_hp": 52, - "max_dmg": 46, - "armor": 32, - "level": 16, - "max_exp": 116, - "max_gold": 39, - "immune": 0 - }, - { - "id": 138, - "name": "Succubus", - "max_hp": 265, - "max_dmg": 240, - "armor": 200, - "level": 47, - "max_exp": 1460, - "max_gold": 487, - "immune": 1 - }, - { - "id": 149, - "name": "Titan", - "max_hp": 360, - "max_dmg": 340, - "armor": 270, - "level": 50, - "max_exp": 2400, - "max_gold": 800, - "immune": 0 - }, - { - "id": 13, - "name": "Illusion", - "max_hp": 20, - "max_dmg": 15, - "armor": 6, - "level": 5, - "max_exp": 20, - "max_gold": 7, - "immune": 1 - }, - { - "id": 137, - "name": "Grey Daemon", - "max_hp": 260, - "max_dmg": 230, - "armor": 190, - "level": 46, - "max_exp": 1400, - "max_gold": 467, - "immune": 0 - }, - { - "id": 42, - "name": "Warlock", - "max_hp": 48, - "max_dmg": 40, - "armor": 26, - "level": 15, - "max_exp": 100, - "max_gold": 33, - "immune": 1 - }, - { - "id": 2, - "name": "Red Slime", - "max_hp": 6, - "max_dmg": 5, - "armor": 1, - "level": 1, - "max_exp": 2, - "max_gold": 1, + "id": 38, + "name": "Grey Wolf", + "max_hp": 44, + "max_dmg": 36, + "armor": 24, + "level": 13, + "max_exp": 82, + "max_gold": 27, "immune": 0 }, { @@ -1397,124 +77,25 @@ "immune": 0 }, { - "id": 82, - "name": "Flame", - "max_hp": 100, - "max_dmg": 90, - "armor": 70, - "level": 28, - "max_exp": 210, - "max_gold": 70, - "immune": 0 - }, - { - "id": 99, - "name": "Nightmare", - "max_hp": 138, - "max_dmg": 125, - "armor": 100, - "level": 33, - "max_exp": 300, - "max_gold": 100, - "immune": 0 - }, - { - "id": 24, - "name": "Shimmer", - "max_hp": 32, - "max_dmg": 26, - "armor": 14, - "level": 8, - "max_exp": 45, - "max_gold": 15, + "id": 138, + "name": "Succubus", + "max_hp": 265, + "max_dmg": 240, + "armor": 200, + "level": 47, + "max_exp": 1460, + "max_gold": 487, "immune": 1 }, { - "id": 122, - "name": "Greater Devil", - "max_hp": 200, - "max_dmg": 180, - "armor": 145, - "level": 41, - "max_exp": 750, - "max_gold": 250, - "immune": 0 - }, - { - "id": 37, - "name": "Megaskeleton", - "max_hp": 44, - "max_dmg": 36, - "armor": 24, - "level": 13, - "max_exp": 78, - "max_gold": 26, - "immune": 0 - }, - { - "id": 107, - "name": "Fanatic", - "max_hp": 160, - "max_dmg": 140, - "armor": 115, - "level": 36, - "max_exp": 410, - "max_gold": 137, - "immune": 0 - }, - { - "id": 44, - "name": "Sylph", - "max_hp": 49, - "max_dmg": 42, - "armor": 28, - "level": 15, - "max_exp": 106, - "max_gold": 35, - "immune": 0 - }, - { - "id": 22, - "name": "Rogue", - "max_hp": 30, - "max_dmg": 25, - "armor": 12, - "level": 8, - "max_exp": 40, - "max_gold": 13, - "immune": 0 - }, - { - "id": 72, - "name": "Fright", - "max_hp": 86, - "max_dmg": 76, - "armor": 58, - "level": 25, - "max_exp": 180, - "max_gold": 60, - "immune": 0 - }, - { - "id": 142, - "name": "Behemoth", - "max_hp": 285, - "max_dmg": 260, - "armor": 210, - "level": 48, - "max_exp": 1700, - "max_gold": 567, - "immune": 0 - }, - { - "id": 20, - "name": "Ghoul", - "max_hp": 29, - "max_dmg": 24, - "armor": 9, - "level": 7, - "max_exp": 34, - "max_gold": 11, + "id": 127, + "name": "Dark Knight", + "max_hp": 220, + "max_dmg": 200, + "armor": 160, + "level": 43, + "max_exp": 930, + "max_gold": 310, "immune": 0 }, { @@ -1529,47 +110,179 @@ "immune": 0 }, { - "id": 97, - "name": "Armor Knight", - "max_hp": 130, - "max_dmg": 115, - "armor": 95, - "level": 33, - "max_exp": 280, - "max_gold": 93, + "id": 108, + "name": "Green Dragon", + "max_hp": 160, + "max_dmg": 140, + "armor": 115, + "level": 36, + "max_exp": 425, + "max_gold": 142, "immune": 0 }, { - "id": 93, - "name": "Aqua Elemental", - "max_hp": 120, - "max_dmg": 110, - "armor": 90, - "level": 31, - "max_exp": 260, - "max_gold": 87, + "id": 59, + "name": "Uruk", + "max_hp": 68, + "max_dmg": 58, + "armor": 44, + "level": 20, + "max_exp": 146, + "max_gold": 49, + "immune": 0 + }, + { + "id": 109, + "name": "Fiend", + "max_hp": 160, + "max_dmg": 145, + "armor": 120, + "level": 37, + "max_exp": 445, + "max_gold": 148, + "immune": 0 + }, + { + "id": 124, + "name": "Archfiend", + "max_hp": 210, + "max_dmg": 190, + "armor": 150, + "level": 42, + "max_exp": 810, + "max_gold": 270, + "immune": 0 + }, + { + "id": 5, + "name": "Shadow", + "max_hp": 10, + "max_dmg": 9, + "armor": 3, + "level": 2, + "max_exp": 6, + "max_gold": 2, "immune": 1 }, { - "id": 68, - "name": "Ogre", - "max_hp": 78, - "max_dmg": 68, - "armor": 54, - "level": 23, - "max_exp": 170, - "max_gold": 57, + "id": 144, + "name": "Demon Lord", + "max_hp": 300, + "max_dmg": 270, + "armor": 220, + "level": 48, + "max_exp": 1820, + "max_gold": 607, "immune": 0 }, { - "id": 6, - "name": "Drake", - "max_hp": 11, - "max_dmg": 10, - "armor": 3, - "level": 2, - "max_exp": 8, - "max_gold": 3, + "id": 2, + "name": "Red Slime", + "max_hp": 6, + "max_dmg": 5, + "armor": 1, + "level": 1, + "max_exp": 2, + "max_gold": 1, + "immune": 0 + }, + { + "id": 44, + "name": "Sylph", + "max_hp": 49, + "max_dmg": 42, + "armor": 28, + "level": 15, + "max_exp": 106, + "max_gold": 35, + "immune": 0 + }, + { + "id": 140, + "name": "Black Dragon", + "max_hp": 275, + "max_dmg": 250, + "armor": 205, + "level": 47, + "max_exp": 1580, + "max_gold": 527, + "immune": 1 + }, + { + "id": 35, + "name": "Nymph", + "max_hp": 43, + "max_dmg": 35, + "armor": 22, + "level": 12, + "max_exp": 70, + "max_gold": 23, + "immune": 0 + }, + { + "id": 118, + "name": "Devil", + "max_hp": 184, + "max_dmg": 164, + "armor": 135, + "level": 40, + "max_exp": 666, + "max_gold": 222, + "immune": 0 + }, + { + "id": 65, + "name": "Hellbeast", + "max_hp": 74, + "max_dmg": 64, + "armor": 50, + "level": 22, + "max_exp": 165, + "max_gold": 55, + "immune": 0 + }, + { + "id": 3, + "name": "Critter", + "max_hp": 6, + "max_dmg": 5, + "armor": 2, + "level": 1, + "max_exp": 4, + "max_gold": 2, + "immune": 0 + }, + { + "id": 116, + "name": "Blue Dragon", + "max_hp": 180, + "max_dmg": 160, + "armor": 130, + "level": 39, + "max_exp": 605, + "max_gold": 202, + "immune": 0 + }, + { + "id": 13, + "name": "Illusion", + "max_hp": 20, + "max_dmg": 15, + "armor": 6, + "level": 5, + "max_exp": 20, + "max_gold": 7, + "immune": 1 + }, + { + "id": 36, + "name": "Scoundrel", + "max_hp": 43, + "max_dmg": 35, + "armor": 22, + "level": 12, + "max_exp": 75, + "max_gold": 25, "immune": 0 }, { @@ -1584,47 +297,388 @@ "immune": 0 }, { - "id": 100, - "name": "Fira Elemental", - "max_hp": 140, - "max_dmg": 125, - "armor": 100, - "level": 34, - "max_exp": 310, - "max_gold": 103, + "id": 27, + "name": "Knave", + "max_hp": 36, + "max_dmg": 30, + "armor": 15, + "level": 9, + "max_exp": 52, + "max_gold": 17, + "immune": 0 + }, + { + "id": 50, + "name": "Troll", + "max_hp": 56, + "max_dmg": 48, + "armor": 36, + "level": 17, + "max_exp": 120, + "max_gold": 40, + "immune": 0 + }, + { + "id": 83, + "name": "Lycanthor", + "max_hp": 100, + "max_dmg": 90, + "armor": 70, + "level": 28, + "max_exp": 210, + "max_gold": 70, + "immune": 0 + }, + { + "id": 16, + "name": "Shadow Raven", + "max_hp": 24, + "max_dmg": 18, + "armor": 7, + "level": 6, + "max_exp": 26, + "max_gold": 9, "immune": 1 }, { - "id": 10, - "name": "Scamp", + "id": 95, + "name": "Lesser Wyvern", + "max_hp": 122, + "max_dmg": 110, + "armor": 92, + "level": 32, + "max_exp": 270, + "max_gold": 90, + "immune": 0 + }, + { + "id": 32, + "name": "Mirage", + "max_hp": 40, + "max_dmg": 32, + "armor": 20, + "level": 11, + "max_exp": 64, + "max_gold": 21, + "immune": 1 + }, + { + "id": 51, + "name": "Werewolf", + "max_hp": 56, + "max_dmg": 48, + "armor": 38, + "level": 17, + "max_exp": 124, + "max_gold": 41, + "immune": 0 + }, + { + "id": 104, + "name": "Strong Knight", + "max_hp": 150, + "max_dmg": 135, + "armor": 110, + "level": 35, + "max_exp": 365, + "max_gold": 122, + "immune": 0 + }, + { + "id": 121, + "name": "Red Dragon", + "max_hp": 200, + "max_dmg": 180, + "armor": 145, + "level": 41, + "max_exp": 720, + "max_gold": 240, + "immune": 0 + }, + { + "id": 49, + "name": "Dark Wolf", + "max_hp": 54, + "max_dmg": 47, + "armor": 36, + "level": 17, + "max_exp": 120, + "max_gold": 40, + "immune": 1 + }, + { + "id": 143, + "name": "Demagogue", + "max_hp": 290, + "max_dmg": 260, + "armor": 210, + "level": 48, + "max_exp": 1760, + "max_gold": 587, + "immune": 0 + }, + { + "id": 56, + "name": "Figment", + "max_hp": 64, + "max_dmg": 55, + "armor": 42, + "level": 19, + "max_exp": 140, + "max_gold": 47, + "immune": 1 + }, + { + "id": 69, + "name": "Dark Bear", + "max_hp": 80, + "max_dmg": 70, + "armor": 56, + "level": 24, + "max_exp": 175, + "max_gold": 58, + "immune": 1 + }, + { + "id": 88, + "name": "Frost Wyrm", + "max_hp": 110, + "max_dmg": 100, + "armor": 80, + "level": 30, + "max_exp": 230, + "max_gold": 77, + "immune": 0 + }, + { + "id": 63, + "name": "Grey Bear", + "max_hp": 70, + "max_dmg": 62, + "armor": 48, + "level": 21, + "max_exp": 160, + "max_gold": 53, + "immune": 0 + }, + { + "id": 11, + "name": "Raven", "max_hp": 16, "max_dmg": 13, "armor": 5, "level": 4, - "max_exp": 15, - "max_gold": 5, + "max_exp": 18, + "max_gold": 6, "immune": 0 }, { - "id": 94, - "name": "Fire Wyrm", - "max_hp": 120, - "max_dmg": 110, - "armor": 90, - "level": 32, - "max_exp": 260, - "max_gold": 87, + "id": 54, + "name": "Nisse", + "max_hp": 60, + "max_dmg": 52, + "armor": 40, + "level": 19, + "max_exp": 132, + "max_gold": 44, "immune": 0 }, { - "id": 98, - "name": "Wyvern", - "max_hp": 134, - "max_dmg": 120, + "id": 107, + "name": "Fanatic", + "max_hp": 160, + "max_dmg": 140, + "armor": 115, + "level": 36, + "max_exp": 410, + "max_gold": 137, + "immune": 0 + }, + { + "id": 70, + "name": "Fire", + "max_hp": 80, + "max_dmg": 72, + "armor": 56, + "level": 24, + "max_exp": 175, + "max_gold": 58, + "immune": 0 + }, + { + "id": 79, + "name": "Brute", + "max_hp": 94, + "max_dmg": 84, + "armor": 65, + "level": 27, + "max_exp": 200, + "max_gold": 67, + "immune": 0 + }, + { + "id": 52, + "name": "Hellcat", + "max_hp": 58, + "max_dmg": 50, + "armor": 38, + "level": 18, + "max_exp": 128, + "max_gold": 43, + "immune": 0 + }, + { + "id": 53, + "name": "Spirit", + "max_hp": 58, + "max_dmg": 50, + "armor": 38, + "level": 18, + "max_exp": 132, + "max_gold": 44, + "immune": 0 + }, + { + "id": 97, + "name": "Armor Knight", + "max_hp": 130, + "max_dmg": 115, "armor": 95, "level": 33, - "max_exp": 290, - "max_gold": 97, + "max_exp": 280, + "max_gold": 93, + "immune": 0 + }, + { + "id": 1, + "name": "Blue Slime", + "max_hp": 4, + "max_dmg": 3, + "armor": 1, + "level": 1, + "max_exp": 1, + "max_gold": 1, + "immune": 0 + }, + { + "id": 37, + "name": "Megaskeleton", + "max_hp": 44, + "max_dmg": 36, + "armor": 24, + "level": 13, + "max_exp": 78, + "max_gold": 26, + "immune": 0 + }, + { + "id": 21, + "name": "Magician", + "max_hp": 30, + "max_dmg": 24, + "armor": 10, + "level": 8, + "max_exp": 36, + "max_gold": 12, + "immune": 0 + }, + { + "id": 15, + "name": "Drakemal", + "max_hp": 22, + "max_dmg": 18, + "armor": 7, + "level": 6, + "max_exp": 24, + "max_gold": 8, + "immune": 0 + }, + { + "id": 4, + "name": "Creature", + "max_hp": 10, + "max_dmg": 8, + "armor": 2, + "level": 2, + "max_exp": 4, + "max_gold": 2, + "immune": 0 + }, + { + "id": 91, + "name": "Terror", + "max_hp": 115, + "max_dmg": 108, + "armor": 84, + "level": 31, + "max_exp": 250, + "max_gold": 83, + "immune": 0 + }, + { + "id": 75, + "name": "Necromancer", + "max_hp": 90, + "max_dmg": 80, + "armor": 62, + "level": 26, + "max_exp": 190, + "max_gold": 63, + "immune": 0 + }, + { + "id": 101, + "name": "Megadoomer", + "max_hp": 140, + "max_dmg": 128, + "armor": 105, + "level": 34, + "max_exp": 320, + "max_gold": 107, + "immune": 0 + }, + { + "id": 142, + "name": "Behemoth", + "max_hp": 285, + "max_dmg": 260, + "armor": 210, + "level": 48, + "max_exp": 1700, + "max_gold": 567, + "immune": 0 + }, + { + "id": 128, + "name": "Giant", + "max_hp": 220, + "max_dmg": 200, + "armor": 165, + "level": 43, + "max_exp": 970, + "max_gold": 323, + "immune": 0 + }, + { + "id": 58, + "name": "Wizard", + "max_hp": 66, + "max_dmg": 56, + "armor": 44, + "level": 20, + "max_exp": 144, + "max_gold": 48, + "immune": 0 + }, + { + "id": 122, + "name": "Greater Devil", + "max_hp": 200, + "max_dmg": 180, + "armor": 145, + "level": 41, + "max_exp": 750, + "max_gold": 250, "immune": 0 }, { @@ -1639,16 +693,181 @@ "immune": 0 }, { - "id": 60, - "name": "Siren", - "max_hp": 68, - "max_dmg": 400, - "armor": 800, - "level": 50, - "max_exp": 10000, - "max_gold": 50, + "id": 23, + "name": "Drakefin", + "max_hp": 32, + "max_dmg": 26, + "armor": 12, + "level": 8, + "max_exp": 40, + "max_gold": 13, + "immune": 0 + }, + { + "id": 25, + "name": "Fire Raven", + "max_hp": 34, + "max_dmg": 28, + "armor": 14, + "level": 9, + "max_exp": 45, + "max_gold": 15, + "immune": 0 + }, + { + "id": 96, + "name": "Doomer", + "max_hp": 124, + "max_dmg": 112, + "armor": 92, + "level": 32, + "max_exp": 270, + "max_gold": 90, + "immune": 0 + }, + { + "id": 146, + "name": "Colossus", + "max_hp": 320, + "max_dmg": 300, + "armor": 240, + "level": 49, + "max_exp": 1940, + "max_gold": 647, + "immune": 0 + }, + { + "id": 82, + "name": "Flame", + "max_hp": 100, + "max_dmg": 90, + "armor": 70, + "level": 28, + "max_exp": 210, + "max_gold": 70, + "immune": 0 + }, + { + "id": 31, + "name": "Silver Scorpion", + "max_hp": 30, + "max_dmg": 160, + "armor": 350, + "level": 40, + "max_exp": 63, + "max_gold": 2000, "immune": 2 }, + { + "id": 119, + "name": "Liche Prince", + "max_hp": 190, + "max_dmg": 168, + "armor": 138, + "level": 40, + "max_exp": 660, + "max_gold": 220, + "immune": 0 + }, + { + "id": 57, + "name": "Hellhound", + "max_hp": 66, + "max_dmg": 56, + "armor": 44, + "level": 20, + "max_exp": 140, + "max_gold": 47, + "immune": 0 + }, + { + "id": 71, + "name": "Polgergeist", + "max_hp": 84, + "max_dmg": 74, + "armor": 58, + "level": 25, + "max_exp": 180, + "max_gold": 60, + "immune": 0 + }, + { + "id": 84, + "name": "Wyrm", + "max_hp": 100, + "max_dmg": 92, + "armor": 72, + "level": 28, + "max_exp": 220, + "max_gold": 73, + "immune": 0 + }, + { + "id": 149, + "name": "Titan", + "max_hp": 360, + "max_dmg": 340, + "armor": 270, + "level": 50, + "max_exp": 2400, + "max_gold": 800, + "immune": 0 + }, + { + "id": 61, + "name": "Megawraith", + "max_hp": 70, + "max_dmg": 60, + "armor": 46, + "level": 21, + "max_exp": 155, + "max_gold": 52, + "immune": 0 + }, + { + "id": 81, + "name": "Horror", + "max_hp": 96, + "max_dmg": 88, + "armor": 68, + "level": 27, + "max_exp": 210, + "max_gold": 70, + "immune": 0 + }, + { + "id": 106, + "name": "Ultradoomer", + "max_hp": 155, + "max_dmg": 140, + "armor": 115, + "level": 36, + "max_exp": 395, + "max_gold": 132, + "immune": 0 + }, + { + "id": 39, + "name": "Phantom", + "max_hp": 46, + "max_dmg": 38, + "armor": 24, + "level": 14, + "max_exp": 85, + "max_gold": 28, + "immune": 1 + }, + { + "id": 93, + "name": "Aqua Elemental", + "max_hp": 120, + "max_dmg": 110, + "armor": 90, + "level": 31, + "max_exp": 260, + "max_gold": 87, + "immune": 1 + }, { "id": 89, "name": "Knight", @@ -1659,5 +878,786 @@ "max_exp": 240, "max_gold": 80, "immune": 0 + }, + { + "id": 29, + "name": "Skeleton", + "max_hp": 38, + "max_dmg": 30, + "armor": 18, + "level": 10, + "max_exp": 58, + "max_gold": 19, + "immune": 0 + }, + { + "id": 6, + "name": "Drake", + "max_hp": 11, + "max_dmg": 10, + "armor": 3, + "level": 2, + "max_exp": 8, + "max_gold": 3, + "immune": 0 + }, + { + "id": 34, + "name": "Imp", + "max_hp": 42, + "max_dmg": 34, + "armor": 22, + "level": 12, + "max_exp": 70, + "max_gold": 23, + "immune": 0 + }, + { + "id": 145, + "name": "Red Daemon", + "max_hp": 310, + "max_dmg": 280, + "armor": 230, + "level": 48, + "max_exp": 1880, + "max_gold": 627, + "immune": 0 + }, + { + "id": 30, + "name": "Dark Slime", + "max_hp": 38, + "max_dmg": 32, + "armor": 18, + "level": 10, + "max_exp": 62, + "max_gold": 21, + "immune": 0 + }, + { + "id": 90, + "name": "Lycanthra", + "max_hp": 112, + "max_dmg": 104, + "armor": 82, + "level": 30, + "max_exp": 240, + "max_gold": 80, + "immune": 0 + }, + { + "id": 45, + "name": "Wraith", + "max_hp": 50, + "max_dmg": 45, + "armor": 30, + "level": 16, + "max_exp": 108, + "max_gold": 36, + "immune": 0 + }, + { + "id": 114, + "name": "Serafiend", + "max_hp": 170, + "max_dmg": 155, + "armor": 125, + "level": 38, + "max_exp": 555, + "max_gold": 185, + "immune": 0 + }, + { + "id": 76, + "name": "Ultrawraith", + "max_hp": 90, + "max_dmg": 82, + "armor": 64, + "level": 26, + "max_exp": 190, + "max_gold": 63, + "immune": 0 + }, + { + "id": 14, + "name": "Nightshade", + "max_hp": 22, + "max_dmg": 16, + "armor": 6, + "level": 6, + "max_exp": 24, + "max_gold": 8, + "immune": 0 + }, + { + "id": 64, + "name": "Haunt", + "max_hp": 72, + "max_dmg": 62, + "armor": 48, + "level": 22, + "max_exp": 160, + "max_gold": 53, + "immune": 0 + }, + { + "id": 42, + "name": "Warlock", + "max_hp": 48, + "max_dmg": 40, + "armor": 26, + "level": 15, + "max_exp": 100, + "max_gold": 33, + "immune": 1 + }, + { + "id": 18, + "name": "Frost Raven", + "max_hp": 26, + "max_dmg": 20, + "armor": 8, + "level": 7, + "max_exp": 30, + "max_gold": 10, + "immune": 0 + }, + { + "id": 43, + "name": "Orc", + "max_hp": 49, + "max_dmg": 42, + "armor": 28, + "level": 15, + "max_exp": 104, + "max_gold": 35, + "immune": 0 + }, + { + "id": 9, + "name": "Silver Slime", + "max_hp": 15, + "max_dmg": 100, + "armor": 200, + "level": 30, + "max_exp": 15, + "max_gold": 1000, + "immune": 2 + }, + { + "id": 67, + "name": "Beast", + "max_hp": 76, + "max_dmg": 66, + "armor": 52, + "level": 23, + "max_exp": 170, + "max_gold": 57, + "immune": 0 + }, + { + "id": 40, + "name": "Specter", + "max_hp": 46, + "max_dmg": 38, + "armor": 24, + "level": 14, + "max_exp": 90, + "max_gold": 30, + "immune": 0 + }, + { + "id": 33, + "name": "Sorceror", + "max_hp": 41, + "max_dmg": 33, + "armor": 22, + "level": 11, + "max_exp": 68, + "max_gold": 23, + "immune": 0 + }, + { + "id": 110, + "name": "Greatest Wyvern", + "max_hp": 162, + "max_dmg": 150, + "armor": 120, + "level": 37, + "max_exp": 465, + "max_gold": 155, + "immune": 0 + }, + { + "id": 151, + "name": "Lucifuge", + "max_hp": 600, + "max_dmg": 600, + "armor": 400, + "level": 50, + "max_exp": 10000, + "max_gold": 10000, + "immune": 2 + }, + { + "id": 115, + "name": "Pale Knight", + "max_hp": 175, + "max_dmg": 160, + "armor": 130, + "level": 39, + "max_exp": 580, + "max_gold": 193, + "immune": 0 + }, + { + "id": 20, + "name": "Ghoul", + "max_hp": 29, + "max_dmg": 24, + "armor": 9, + "level": 7, + "max_exp": 34, + "max_gold": 11, + "immune": 0 + }, + { + "id": 62, + "name": "Dawkin", + "max_hp": 70, + "max_dmg": 60, + "armor": 46, + "level": 21, + "max_exp": 155, + "max_gold": 52, + "immune": 0 + }, + { + "id": 94, + "name": "Fire Wyrm", + "max_hp": 120, + "max_dmg": 110, + "armor": 90, + "level": 32, + "max_exp": 260, + "max_gold": 87, + "immune": 0 + }, + { + "id": 137, + "name": "Grey Daemon", + "max_hp": 260, + "max_dmg": 230, + "armor": 190, + "level": 46, + "max_exp": 1400, + "max_gold": 467, + "immune": 0 + }, + { + "id": 99, + "name": "Nightmare", + "max_hp": 138, + "max_dmg": 125, + "armor": 100, + "level": 33, + "max_exp": 300, + "max_gold": 100, + "immune": 0 + }, + { + "id": 17, + "name": "Ghost", + "max_hp": 24, + "max_dmg": 20, + "armor": 8, + "level": 6, + "max_exp": 28, + "max_gold": 9, + "immune": 0 + }, + { + "id": 12, + "name": "Scorpion", + "max_hp": 18, + "max_dmg": 14, + "armor": 6, + "level": 5, + "max_exp": 20, + "max_gold": 7, + "immune": 0 + }, + { + "id": 80, + "name": "Large Beast", + "max_hp": 96, + "max_dmg": 88, + "armor": 66, + "level": 27, + "max_exp": 200, + "max_gold": 67, + "immune": 0 + }, + { + "id": 60, + "name": "Siren", + "max_hp": 68, + "max_dmg": 400, + "armor": 800, + "level": 50, + "max_exp": 10000, + "max_gold": 50, + "immune": 2 + }, + { + "id": 47, + "name": "Bandit", + "max_hp": 52, + "max_dmg": 45, + "armor": 30, + "level": 16, + "max_exp": 114, + "max_gold": 38, + "immune": 0 + }, + { + "id": 86, + "name": "Dawkare", + "max_hp": 106, + "max_dmg": 96, + "armor": 76, + "level": 29, + "max_exp": 220, + "max_gold": 73, + "immune": 0 + }, + { + "id": 135, + "name": "Insurgent", + "max_hp": 250, + "max_dmg": 220, + "armor": 190, + "level": 46, + "max_exp": 1300, + "max_gold": 433, + "immune": 0 + }, + { + "id": 8, + "name": "Drakelor", + "max_hp": 14, + "max_dmg": 12, + "armor": 4, + "level": 3, + "max_exp": 10, + "max_gold": 3, + "immune": 0 + }, + { + "id": 66, + "name": "Fear", + "max_hp": 76, + "max_dmg": 66, + "armor": 52, + "level": 23, + "max_exp": 165, + "max_gold": 55, + "immune": 0 + }, + { + "id": 41, + "name": "Dark Scorpion", + "max_hp": 48, + "max_dmg": 40, + "armor": 26, + "level": 15, + "max_exp": 95, + "max_gold": 32, + "immune": 1 + }, + { + "id": 78, + "name": "Werebear", + "max_hp": 92, + "max_dmg": 84, + "armor": 65, + "level": 26, + "max_exp": 195, + "max_gold": 65, + "immune": 0 + }, + { + "id": 72, + "name": "Fright", + "max_hp": 86, + "max_dmg": 76, + "armor": 58, + "level": 25, + "max_exp": 180, + "max_gold": 60, + "immune": 0 + }, + { + "id": 48, + "name": "Ultraskeleton", + "max_hp": 52, + "max_dmg": 46, + "armor": 32, + "level": 16, + "max_exp": 116, + "max_gold": 39, + "immune": 0 + }, + { + "id": 148, + "name": "Dark Daemon", + "max_hp": 340, + "max_dmg": 320, + "armor": 260, + "level": 49, + "max_exp": 2200, + "max_gold": 733, + "immune": 1 + }, + { + "id": 129, + "name": "Shadow Dragon", + "max_hp": 225, + "max_dmg": 200, + "armor": 170, + "level": 44, + "max_exp": 1010, + "max_gold": 337, + "immune": 0 + }, + { + "id": 85, + "name": "Aero Elemental", + "max_hp": 104, + "max_dmg": 94, + "armor": 74, + "level": 29, + "max_exp": 220, + "max_gold": 73, + "immune": 1 + }, + { + "id": 126, + "name": "Greatest Devil", + "max_hp": 215, + "max_dmg": 195, + "armor": 160, + "level": 43, + "max_exp": 890, + "max_gold": 297, + "immune": 0 + }, + { + "id": 139, + "name": "Demon Prince", + "max_hp": 270, + "max_dmg": 240, + "armor": 200, + "level": 47, + "max_exp": 1520, + "max_gold": 507, + "immune": 0 + }, + { + "id": 24, + "name": "Shimmer", + "max_hp": 32, + "max_dmg": 26, + "armor": 14, + "level": 8, + "max_exp": 45, + "max_gold": 15, + "immune": 1 + }, + { + "id": 103, + "name": "Advocate", + "max_hp": 148, + "max_dmg": 132, + "armor": 108, + "level": 35, + "max_exp": 350, + "max_gold": 117, + "immune": 0 + }, + { + "id": 73, + "name": "Lycan", + "max_hp": 88, + "max_dmg": 78, + "armor": 60, + "level": 25, + "max_exp": 185, + "max_gold": 62, + "immune": 0 + }, + { + "id": 141, + "name": "Nihilist", + "max_hp": 280, + "max_dmg": 250, + "armor": 205, + "level": 47, + "max_exp": 1640, + "max_gold": 547, + "immune": 0 + }, + { + "id": 10, + "name": "Scamp", + "max_hp": 16, + "max_dmg": 13, + "armor": 5, + "level": 4, + "max_exp": 15, + "max_gold": 5, + "immune": 0 + }, + { + "id": 131, + "name": "Incubus", + "max_hp": 230, + "max_dmg": 205, + "armor": 175, + "level": 44, + "max_exp": 1100, + "max_gold": 367, + "immune": 1 + }, + { + "id": 74, + "name": "Terra Elemental", + "max_hp": 88, + "max_dmg": 80, + "armor": 62, + "level": 25, + "max_exp": 185, + "max_gold": 62, + "immune": 1 + }, + { + "id": 100, + "name": "Fira Elemental", + "max_hp": 140, + "max_dmg": 125, + "armor": 100, + "level": 34, + "max_exp": 310, + "max_gold": 103, + "immune": 1 + }, + { + "id": 19, + "name": "Rogue Scorpion", + "max_hp": 28, + "max_dmg": 22, + "armor": 9, + "level": 7, + "max_exp": 32, + "max_gold": 11, + "immune": 0 + }, + { + "id": 22, + "name": "Rogue", + "max_hp": 30, + "max_dmg": 25, + "armor": 12, + "level": 8, + "max_exp": 40, + "max_gold": 13, + "immune": 0 + }, + { + "id": 26, + "name": "Dybbuk", + "max_hp": 34, + "max_dmg": 28, + "armor": 14, + "level": 9, + "max_exp": 50, + "max_gold": 17, + "immune": 0 + }, + { + "id": 111, + "name": "Lesser Devil", + "max_hp": 164, + "max_dmg": 150, + "armor": 120, + "level": 37, + "max_exp": 485, + "max_gold": 162, + "immune": 0 + }, + { + "id": 7, + "name": "Shade", + "max_hp": 12, + "max_dmg": 10, + "armor": 3, + "level": 3, + "max_exp": 10, + "max_gold": 3, + "immune": 1 + }, + { + "id": 134, + "name": "Dark Dragon", + "max_hp": 245, + "max_dmg": 215, + "armor": 180, + "level": 45, + "max_exp": 1250, + "max_gold": 417, + "immune": 1 + }, + { + "id": 77, + "name": "Dawkor", + "max_hp": 92, + "max_dmg": 82, + "armor": 64, + "level": 26, + "max_exp": 195, + "max_gold": 65, + "immune": 0 + }, + { + "id": 68, + "name": "Ogre", + "max_hp": 78, + "max_dmg": 68, + "armor": 54, + "level": 23, + "max_exp": 170, + "max_gold": 57, + "immune": 0 + }, + { + "id": 133, + "name": "Demon", + "max_hp": 240, + "max_dmg": 210, + "armor": 180, + "level": 45, + "max_exp": 1200, + "max_gold": 400, + "immune": 0 + }, + { + "id": 28, + "name": "Goblin", + "max_hp": 36, + "max_dmg": 30, + "armor": 15, + "level": 10, + "max_exp": 54, + "max_gold": 18, + "immune": 0 + }, + { + "id": 150, + "name": "Black Daemon", + "max_hp": 400, + "max_dmg": 400, + "armor": 280, + "level": 50, + "max_exp": 3000, + "max_gold": 1000, + "immune": 1 + }, + { + "id": 98, + "name": "Wyvern", + "max_hp": 134, + "max_dmg": 120, + "armor": 95, + "level": 33, + "max_exp": 290, + "max_gold": 97, + "immune": 0 + }, + { + "id": 147, + "name": "Demon King", + "max_hp": 330, + "max_dmg": 300, + "armor": 250, + "level": 49, + "max_exp": 2000, + "max_gold": 667, + "immune": 0 + }, + { + "id": 132, + "name": "Traitor", + "max_hp": 230, + "max_dmg": 205, + "armor": 175, + "level": 45, + "max_exp": 1150, + "max_gold": 383, + "immune": 0 + }, + { + "id": 105, + "name": "Liche", + "max_hp": 150, + "max_dmg": 135, + "armor": 110, + "level": 35, + "max_exp": 380, + "max_gold": 127, + "immune": 0 + }, + { + "id": 136, + "name": "Leviathan", + "max_hp": 255, + "max_dmg": 225, + "armor": 190, + "level": 46, + "max_exp": 1350, + "max_gold": 450, + "immune": 0 + }, + { + "id": 55, + "name": "Dawk", + "max_hp": 60, + "max_dmg": 54, + "armor": 40, + "level": 19, + "max_exp": 136, + "max_gold": 45, + "immune": 0 + }, + { + "id": 117, + "name": "Obsessive", + "max_hp": 180, + "max_dmg": 160, + "armor": 135, + "level": 40, + "max_exp": 630, + "max_gold": 210, + "immune": 0 + }, + { + "id": 92, + "name": "Blaze", + "max_hp": 118, + "max_dmg": 108, + "armor": 84, + "level": 31, + "max_exp": 250, + "max_gold": 83, + "immune": 0 } ] \ No newline at end of file diff --git a/data/spells.json b/data/spells.json index b0e751a..814aeab 100644 --- a/data/spells.json +++ b/data/spells.json @@ -1,25 +1,4 @@ [ - { - "id": 13, - "name": "Nightmare", - "mp": 60, - "attribute": 13, - "type": 3 - }, - { - "id": 16, - "name": "Fury", - "mp": 30, - "attribute": 50, - "type": 4 - }, - { - "id": 7, - "name": "Pain", - "mp": 12, - "attribute": 35, - "type": 2 - }, { "id": 4, "name": "Breath", @@ -27,97 +6,6 @@ "attribute": 100, "type": 1 }, - { - "id": 2, - "name": "Revive", - "mp": 10, - "attribute": 25, - "type": 1 - }, - { - "id": 15, - "name": "Rage", - "mp": 20, - "attribute": 25, - "type": 4 - }, - { - "id": 11, - "name": "Sleep", - "mp": 10, - "attribute": 5, - "type": 3 - }, - { - "id": 10, - "name": "Chaos", - "mp": 50, - "attribute": 130, - "type": 2 - }, - { - "id": 8, - "name": "Maim", - "mp": 25, - "attribute": 70, - "type": 2 - }, - { - "id": 6, - "name": "Hurt", - "mp": 5, - "attribute": 15, - "type": 2 - }, - { - "id": 17, - "name": "Ward", - "mp": 10, - "attribute": 10, - "type": 5 - }, - { - "id": 12, - "name": "Dream", - "mp": 30, - "attribute": 9, - "type": 3 - }, - { - "id": 19, - "name": "Barrier", - "mp": 30, - "attribute": 50, - "type": 5 - }, - { - "id": 5, - "name": "Gaia", - "mp": 75, - "attribute": 150, - "type": 1 - }, - { - "id": 3, - "name": "Life", - "mp": 25, - "attribute": 50, - "type": 1 - }, - { - "id": 1, - "name": "Heal", - "mp": 5, - "attribute": 10, - "type": 1 - }, - { - "id": 9, - "name": "Rend", - "mp": 40, - "attribute": 100, - "type": 2 - }, { "id": 14, "name": "Craze", @@ -131,5 +19,117 @@ "mp": 20, "attribute": 25, "type": 5 + }, + { + "id": 5, + "name": "Gaia", + "mp": 75, + "attribute": 150, + "type": 1 + }, + { + "id": 10, + "name": "Chaos", + "mp": 50, + "attribute": 130, + "type": 2 + }, + { + "id": 6, + "name": "Hurt", + "mp": 5, + "attribute": 15, + "type": 2 + }, + { + "id": 3, + "name": "Life", + "mp": 25, + "attribute": 50, + "type": 1 + }, + { + "id": 8, + "name": "Maim", + "mp": 25, + "attribute": 70, + "type": 2 + }, + { + "id": 15, + "name": "Rage", + "mp": 20, + "attribute": 25, + "type": 4 + }, + { + "id": 19, + "name": "Barrier", + "mp": 30, + "attribute": 50, + "type": 5 + }, + { + "id": 1, + "name": "Heal", + "mp": 5, + "attribute": 10, + "type": 1 + }, + { + "id": 12, + "name": "Dream", + "mp": 30, + "attribute": 9, + "type": 3 + }, + { + "id": 7, + "name": "Pain", + "mp": 12, + "attribute": 35, + "type": 2 + }, + { + "id": 17, + "name": "Ward", + "mp": 10, + "attribute": 10, + "type": 5 + }, + { + "id": 9, + "name": "Rend", + "mp": 40, + "attribute": 100, + "type": 2 + }, + { + "id": 13, + "name": "Nightmare", + "mp": 60, + "attribute": 13, + "type": 3 + }, + { + "id": 2, + "name": "Revive", + "mp": 10, + "attribute": 25, + "type": 1 + }, + { + "id": 11, + "name": "Sleep", + "mp": 10, + "attribute": 5, + "type": 3 + }, + { + "id": 16, + "name": "Fury", + "mp": 30, + "attribute": 50, + "type": 4 } ] \ No newline at end of file diff --git a/data/towns.json b/data/towns.json index f031865..4ef5c7b 100644 --- a/data/towns.json +++ b/data/towns.json @@ -1,4 +1,34 @@ [ + { + "id": 1, + "name": "Midworld", + "x": 0, + "y": 0, + "inn_cost": 5, + "map_cost": 0, + "tp_cost": 0, + "shop_list": "1,2,3,17,18,19,28,29" + }, + { + "id": 2, + "name": "Roma", + "x": 30, + "y": 30, + "inn_cost": 10, + "map_cost": 25, + "tp_cost": 5, + "shop_list": "2,3,4,18,19,29" + }, + { + "id": 3, + "name": "Bris", + "x": 70, + "y": -70, + "inn_cost": 25, + "map_cost": 50, + "tp_cost": 15, + "shop_list": "2,3,4,5,18,19,20,29.30" + }, { "id": 4, "name": "Kalle", @@ -48,35 +78,5 @@ "map_cost": 9000, "tp_cost": 160, "shop_list": "16,27,33" - }, - { - "id": 1, - "name": "Midworld", - "x": 0, - "y": 0, - "inn_cost": 5, - "map_cost": 0, - "tp_cost": 0, - "shop_list": "1,2,3,17,18,19,28,29" - }, - { - "id": 2, - "name": "Roma", - "x": 30, - "y": 30, - "inn_cost": 10, - "map_cost": 25, - "tp_cost": 5, - "shop_list": "2,3,4,18,19,29" - }, - { - "id": 3, - "name": "Bris", - "x": 70, - "y": -70, - "inn_cost": 25, - "map_cost": 50, - "tp_cost": 15, - "shop_list": "2,3,4,5,18,19,20,29.30" } ] \ No newline at end of file diff --git a/internal/auth/auth.go b/internal/auth/auth.go index 78996e2..a53c151 100644 --- a/internal/auth/auth.go +++ b/internal/auth/auth.go @@ -1,27 +1,13 @@ -// Package auth provides authentication and session management functionality. -// It includes secure session storage with in-memory caching and JSON persistence, -// user authentication against the database, and secure cookie handling. +// Package auth provides authentication functionality. +// It handles user authentication against the database and password verification. package auth import ( "dk/internal/models/users" "dk/internal/password" - "dk/internal/session" ) -var Manager *AuthManager - -type AuthManager struct { - store *session.Store -} - -func Init(sessionsFilePath string) { - Manager = &AuthManager{ - store: session.NewStore(sessionsFilePath), - } -} - -func (am *AuthManager) Authenticate(usernameOrEmail, plainPassword string) (*users.User, error) { +func Authenticate(usernameOrEmail, plainPassword string) (*users.User, error) { var user *users.User var err error @@ -44,43 +30,8 @@ func (am *AuthManager) Authenticate(usernameOrEmail, plainPassword string) (*use return user, nil } -func (am *AuthManager) CreateSession(user *users.User) *session.Session { - sess := session.New(user.ID, user.Username, user.Email) - am.store.Save(sess) - return sess -} - -func (am *AuthManager) GetSession(sessionID string) (*session.Session, bool) { - return am.store.Get(sessionID) -} - -func (am *AuthManager) UpdateSession(sessionID string) bool { - sess, exists := am.store.Get(sessionID) - if !exists { - return false - } - - sess.Touch() - am.store.Save(sess) - return true -} - -func (am *AuthManager) DeleteSession(sessionID string) { - am.store.Delete(sessionID) -} - -func (am *AuthManager) SessionStats() (total, active int) { - return am.store.Stats() -} - -func (am *AuthManager) Close() error { - return am.store.Close() -} - var ( ErrInvalidCredentials = &AuthError{"invalid username/email or password"} - ErrSessionNotFound = &AuthError{"session not found"} - ErrSessionExpired = &AuthError{"session expired"} ) type AuthError struct { diff --git a/internal/auth/cookies.go b/internal/auth/cookies.go deleted file mode 100644 index 115104a..0000000 --- a/internal/auth/cookies.go +++ /dev/null @@ -1,32 +0,0 @@ -package auth - -import ( - "dk/internal/cookies" - "dk/internal/helpers" - "dk/internal/session" - "time" - - "github.com/valyala/fasthttp" -) - -const SessionCookieName = "dk_session" - -func SetSessionCookie(ctx *fasthttp.RequestCtx, sessionID string) { - cookies.SetSecureCookie(ctx, cookies.CookieOptions{ - Name: SessionCookieName, - Value: sessionID, - Path: "/", - Expires: time.Now().Add(session.DefaultExpiration), - HTTPOnly: true, - Secure: helpers.IsHTTPS(ctx), - SameSite: "lax", - }) -} - -func GetSessionCookie(ctx *fasthttp.RequestCtx) string { - return cookies.GetCookie(ctx, SessionCookieName) -} - -func DeleteSessionCookie(ctx *fasthttp.RequestCtx) { - cookies.DeleteCookie(ctx, SessionCookieName) -} diff --git a/internal/auth/flash.go b/internal/auth/flash.go deleted file mode 100644 index d62bd4b..0000000 --- a/internal/auth/flash.go +++ /dev/null @@ -1,113 +0,0 @@ -package auth - -import ( - "dk/internal/router" - "dk/internal/session" -) - -func SetFlashMessage(ctx router.Ctx, msgType, message string) bool { - sessionID := GetSessionCookie(ctx) - if sessionID == "" { - return false - } - - sess, exists := Manager.GetSession(sessionID) - if !exists { - return false - } - - sess.SetFlash("message", session.FlashMessage{ - Type: msgType, - Message: message, - }) - Manager.store.Save(sess) - return true -} - -func GetFlashMessage(ctx router.Ctx) *session.FlashMessage { - sessionID := GetSessionCookie(ctx) - if sessionID == "" { - return nil - } - - sess, exists := Manager.GetSession(sessionID) - if !exists { - return nil - } - - value, exists := sess.GetFlash("message") - if !exists { - return nil - } - - Manager.store.Save(sess) - - if msg, ok := value.(session.FlashMessage); ok { - return &msg - } - - if msgMap, ok := value.(map[string]interface{}); ok { - msg := &session.FlashMessage{} - if t, ok := msgMap["type"].(string); ok { - msg.Type = t - } - if m, ok := msgMap["message"].(string); ok { - msg.Message = m - } - return msg - } - - return nil -} - -func SetFormData(ctx router.Ctx, data map[string]string) bool { - sessionID := GetSessionCookie(ctx) - if sessionID == "" { - return false - } - - sess, exists := Manager.GetSession(sessionID) - if !exists { - return false - } - - sess.Set("form_data", data) - Manager.store.Save(sess) - return true -} - -func GetFormData(ctx router.Ctx) map[string]string { - sessionID := GetSessionCookie(ctx) - if sessionID == "" { - return nil - } - - sess, exists := Manager.GetSession(sessionID) - if !exists { - return nil - } - - value, exists := sess.Get("form_data") - if !exists { - return nil - } - - sess.Delete("form_data") - Manager.store.Save(sess) - - if formData, ok := value.(map[string]string); ok { - return formData - } - - if formMap, ok := value.(map[string]interface{}); ok { - result := make(map[string]string) - for k, v := range formMap { - if str, ok := v.(string); ok { - result[k] = str - } - } - return result - } - - return nil -} \ No newline at end of file diff --git a/internal/cookies/cookies.go b/internal/cookies/cookies.go index d3866b4..a19e907 100644 --- a/internal/cookies/cookies.go +++ b/internal/cookies/cookies.go @@ -1,6 +1,7 @@ package cookies import ( + "bytes" "time" "github.com/valyala/fasthttp" @@ -75,3 +76,16 @@ func DeleteCookie(ctx *fasthttp.RequestCtx, name string) { SameSite: "lax", }) } + +func IsHTTPS(ctx *fasthttp.RequestCtx) bool { + proto := string(ctx.Request.Header.Peek("X-Forwarded-Proto")) + if proto == "https" { + return true + } + + if bytes.EqualFold(ctx.Request.URI().Scheme(), []byte("https")) { + return true + } + + return ctx.IsTLS() +} diff --git a/internal/csrf/csrf.go b/internal/csrf/csrf.go index 79ac51b..dfe61f0 100644 --- a/internal/csrf/csrf.go +++ b/internal/csrf/csrf.go @@ -4,13 +4,13 @@ // # Basic Usage // // // Generate token and store in session -// token := csrf.GenerateToken(ctx, authManager) +// token := csrf.GenerateToken(ctx, sessionManager) // // // In templates - generate hidden input field -// hiddenField := csrf.HiddenField(ctx, authManager) +// hiddenField := csrf.HiddenField(ctx, sessionManager) // // // Verify form submission -// if !csrf.ValidateToken(ctx, authManager, formToken) { +// if !csrf.ValidateToken(ctx, sessionManager, formToken) { // // Handle CSRF validation failure // } // @@ -27,7 +27,6 @@ import ( "fmt" "time" - "dk/internal/auth" "dk/internal/router" "dk/internal/session" @@ -51,7 +50,7 @@ func GetCurrentSession(ctx router.Ctx) *session.Session { } // GenerateToken creates a new CSRF token and stores it in the session or cookie -func GenerateToken(ctx router.Ctx, authManager *auth.AuthManager) string { +func GenerateToken(ctx router.Ctx) string { // Generate cryptographically secure random bytes tokenBytes := make([]byte, TokenLength) if _, err := rand.Read(tokenBytes); err != nil { @@ -73,7 +72,7 @@ func GenerateToken(ctx router.Ctx, authManager *auth.AuthManager) string { } // GetToken retrieves the current CSRF token from session or cookie, generating one if needed -func GetToken(ctx router.Ctx, authManager *auth.AuthManager) string { +func GetToken(ctx router.Ctx) string { session := GetCurrentSession(ctx) if session != nil { @@ -89,11 +88,11 @@ func GetToken(ctx router.Ctx, authManager *auth.AuthManager) string { } // Generate new token if none exists - return GenerateToken(ctx, authManager) + return GenerateToken(ctx) } // ValidateToken verifies a CSRF token against the stored session or cookie token -func ValidateToken(ctx router.Ctx, authManager *auth.AuthManager, submittedToken string) bool { +func ValidateToken(ctx router.Ctx, submittedToken string) bool { if submittedToken == "" { return false } @@ -133,21 +132,21 @@ func GetStoredToken(sess *session.Session) string { } // RotateToken generates a new token and replaces the old one in the session -func RotateToken(ctx router.Ctx, authManager *auth.AuthManager) string { +func RotateToken(ctx router.Ctx) string { session := GetCurrentSession(ctx) if session == nil { return "" } // Generate new token - newToken := GenerateToken(ctx, authManager) + newToken := GenerateToken(ctx) return newToken } // HiddenField generates an HTML hidden input field with the CSRF token -func HiddenField(ctx router.Ctx, authManager *auth.AuthManager) string { - token := GetToken(ctx, authManager) +func HiddenField(ctx router.Ctx) string { + token := GetToken(ctx) if token == "" { return "" // No token available } @@ -157,8 +156,8 @@ func HiddenField(ctx router.Ctx, authManager *auth.AuthManager) string { } // TokenMeta generates HTML meta tag for JavaScript access to CSRF token -func TokenMeta(ctx router.Ctx, authManager *auth.AuthManager) string { - token := GetToken(ctx, authManager) +func TokenMeta(ctx router.Ctx) string { + token := GetToken(ctx) if token == "" { return "" } @@ -167,7 +166,7 @@ func TokenMeta(ctx router.Ctx, authManager *auth.AuthManager) string { } // ValidateFormToken is a convenience function to validate CSRF token from form data -func ValidateFormToken(ctx router.Ctx, authManager *auth.AuthManager) bool { +func ValidateFormToken(ctx router.Ctx) bool { // Try to get token from form data tokenBytes := ctx.PostArgs().Peek(TokenFieldName) if len(tokenBytes) == 0 { @@ -179,7 +178,7 @@ func ValidateFormToken(ctx router.Ctx, authManager *auth.AuthManager) bool { return false } - return ValidateToken(ctx, authManager, string(tokenBytes)) + return ValidateToken(ctx, string(tokenBytes)) } // StoreTokenInCookie stores a CSRF token in a cookie for guest users diff --git a/internal/csrf/csrf_test.go b/internal/csrf/csrf_test.go index c4d04e8..d2d8f0c 100644 --- a/internal/csrf/csrf_test.go +++ b/internal/csrf/csrf_test.go @@ -24,7 +24,7 @@ func TestGenerateToken(t *testing.T) { ctx := &fasthttp.RequestCtx{} ctx.SetUserValue(SessionCtxKey, sess) - token := GenerateToken(ctx, nil) + token := GenerateToken(ctx) if token == "" { t.Error("Expected non-empty token") @@ -48,15 +48,15 @@ func TestValidateToken(t *testing.T) { ctx := &fasthttp.RequestCtx{} ctx.SetUserValue(SessionCtxKey, sess) - if !ValidateToken(ctx, nil, "test-token") { + if !ValidateToken(ctx, "test-token") { t.Error("Expected valid token to pass validation") } - if ValidateToken(ctx, nil, "wrong-token") { + if ValidateToken(ctx, "wrong-token") { t.Error("Expected invalid token to fail validation") } - if ValidateToken(ctx, nil, "") { + if ValidateToken(ctx, "") { t.Error("Expected empty token to fail validation") } } @@ -64,7 +64,7 @@ func TestValidateToken(t *testing.T) { func TestValidateTokenNoSession(t *testing.T) { ctx := &fasthttp.RequestCtx{} - if ValidateToken(ctx, nil, "any-token") { + if ValidateToken(ctx, "any-token") { t.Error("Expected validation to fail with no session") } } @@ -81,7 +81,7 @@ func TestHiddenField(t *testing.T) { ctx := &fasthttp.RequestCtx{} ctx.SetUserValue(SessionCtxKey, sess) - field := HiddenField(ctx, nil) + field := HiddenField(ctx) expected := `` if field != expected { @@ -92,7 +92,7 @@ func TestHiddenField(t *testing.T) { func TestHiddenFieldNoSession(t *testing.T) { ctx := &fasthttp.RequestCtx{} - field := HiddenField(ctx, nil) + field := HiddenField(ctx) if field == "" { t.Error("Expected non-empty field for guest user with cookie-based token") } @@ -110,7 +110,7 @@ func TestTokenMeta(t *testing.T) { ctx := &fasthttp.RequestCtx{} ctx.SetUserValue(SessionCtxKey, sess) - meta := TokenMeta(ctx, nil) + meta := TokenMeta(ctx) expected := `` if meta != expected { @@ -155,13 +155,13 @@ func TestValidateFormToken(t *testing.T) { ctx.PostArgs().Set(TokenFieldName, "test-token") - if !ValidateFormToken(ctx, nil) { + if !ValidateFormToken(ctx) { t.Error("Expected form token validation to pass") } ctx.PostArgs().Set(TokenFieldName, "wrong-token") - if ValidateFormToken(ctx, nil) { + if ValidateFormToken(ctx) { t.Error("Expected form token validation to fail with wrong token") } } \ No newline at end of file diff --git a/internal/middleware/auth.go b/internal/middleware/auth.go index dc3b525..13b4b2f 100644 --- a/internal/middleware/auth.go +++ b/internal/middleware/auth.go @@ -1,7 +1,7 @@ package middleware import ( - "dk/internal/auth" + "dk/internal/cookies" "dk/internal/models/users" "dk/internal/router" "dk/internal/session" @@ -9,21 +9,21 @@ import ( "github.com/valyala/fasthttp" ) -func Auth(authManager *auth.AuthManager) router.Middleware { +func Auth() router.Middleware { return func(next router.Handler) router.Handler { return func(ctx router.Ctx, params []string) { - sessionID := auth.GetSessionCookie(ctx) + sessionID := cookies.GetCookie(ctx, session.SessionCookieName) if sessionID != "" { - if sess, exists := authManager.GetSession(sessionID); exists { - authManager.UpdateSession(sessionID) + if sess, exists := session.Get(sessionID); exists { + session.Update(sessionID) user, err := users.Find(sess.UserID) if err == nil && user != nil { ctx.SetUserValue("session", sess) ctx.SetUserValue("user", user) - auth.SetSessionCookie(ctx, sessionID) + session.SetSessionCookie(ctx, sessionID) } } } @@ -91,21 +91,21 @@ func GetCurrentSession(ctx router.Ctx) *session.Session { return nil } -func Login(ctx router.Ctx, authManager *auth.AuthManager, user *users.User) { - sess := authManager.CreateSession(user) - auth.SetSessionCookie(ctx, sess.ID) +func Login(ctx router.Ctx, user *users.User) { + sess := session.Create(user.ID, user.Username, user.Email) + session.SetSessionCookie(ctx, sess.ID) ctx.SetUserValue("session", sess) ctx.SetUserValue("user", user) } -func Logout(ctx router.Ctx, authManager *auth.AuthManager) { - sessionID := auth.GetSessionCookie(ctx) +func Logout(ctx router.Ctx) { + sessionID := cookies.GetCookie(ctx, session.SessionCookieName) if sessionID != "" { - authManager.DeleteSession(sessionID) + session.Delete(sessionID) } - auth.DeleteSessionCookie(ctx) + session.DeleteSessionCookie(ctx) ctx.SetUserValue("session", nil) ctx.SetUserValue("user", nil) diff --git a/internal/middleware/csrf.go b/internal/middleware/csrf.go index f80c1ef..aff7f32 100644 --- a/internal/middleware/csrf.go +++ b/internal/middleware/csrf.go @@ -1,7 +1,6 @@ package middleware import ( - "dk/internal/auth" "dk/internal/csrf" "dk/internal/router" "slices" @@ -20,7 +19,7 @@ type CSRFConfig struct { } // CSRF creates a CSRF protection middleware -func CSRF(authManager *auth.AuthManager, config ...CSRFConfig) router.Middleware { +func CSRF(config ...CSRFConfig) router.Middleware { cfg := CSRFConfig{ SkipMethods: []string{"GET", "HEAD", "OPTIONS"}, FailureHandler: func(ctx router.Ctx) { @@ -68,7 +67,7 @@ func CSRF(authManager *auth.AuthManager, config ...CSRFConfig) router.Middleware } // Validate CSRF token for protected methods - if !csrf.ValidateFormToken(ctx, authManager) { + if !csrf.ValidateFormToken(ctx) { cfg.FailureHandler(ctx) return } @@ -79,7 +78,7 @@ func CSRF(authManager *auth.AuthManager, config ...CSRFConfig) router.Middleware } // RequireCSRF is a stricter CSRF middleware that always validates tokens -func RequireCSRF(authManager *auth.AuthManager, failureHandler ...func(router.Ctx)) router.Middleware { +func RequireCSRF(failureHandler ...func(router.Ctx)) router.Middleware { handler := func(ctx router.Ctx) { ctx.SetStatusCode(fasthttp.StatusForbidden) ctx.SetContentType("text/plain") @@ -92,7 +91,7 @@ func RequireCSRF(authManager *auth.AuthManager, failureHandler ...func(router.Ct return func(next router.Handler) router.Handler { return func(ctx router.Ctx, params []string) { - if !csrf.ValidateFormToken(ctx, authManager) { + if !csrf.ValidateFormToken(ctx) { handler(ctx) return } @@ -103,16 +102,16 @@ func RequireCSRF(authManager *auth.AuthManager, failureHandler ...func(router.Ct } // CSRFToken returns the current CSRF token for the request -func CSRFToken(ctx router.Ctx, authManager *auth.AuthManager) string { - return csrf.GetToken(ctx, authManager) +func CSRFToken(ctx router.Ctx) string { + return csrf.GetToken(ctx) } // CSRFHiddenField generates a hidden input field for forms -func CSRFHiddenField(ctx router.Ctx, authManager *auth.AuthManager) string { - return csrf.HiddenField(ctx, authManager) +func CSRFHiddenField(ctx router.Ctx) string { + return csrf.HiddenField(ctx) } // CSRFMeta generates a meta tag for JavaScript access -func CSRFMeta(ctx router.Ctx, authManager *auth.AuthManager) string { - return csrf.TokenMeta(ctx, authManager) +func CSRFMeta(ctx router.Ctx) string { + return csrf.TokenMeta(ctx) } diff --git a/internal/routes/auth.go b/internal/routes/auth.go index bed83af..5442ffe 100644 --- a/internal/routes/auth.go +++ b/internal/routes/auth.go @@ -10,6 +10,7 @@ import ( "dk/internal/models/users" "dk/internal/password" "dk/internal/router" + "dk/internal/session" "dk/internal/template/components" "github.com/valyala/fasthttp" @@ -37,12 +38,12 @@ func RegisterAuthRoutes(r *router.Router) { func showLogin(ctx router.Ctx, _ []string) { // Get flash message if any var errorHTML string - if flash := auth.GetFlashMessage(ctx); flash != nil { + if flash := session.GetFlashMessage(ctx); flash != nil { errorHTML = fmt.Sprintf(`