Mob DB file structure overhaul

Haru

Development Administrator
Messages
382
Points
63
Discord
@Haru#1055
IRC Nickname
Haru
Github
MishimaHaruna
Emulator
Mob DB file structure overhaul
 
Hello~!
 
Just like the Item DB, the Mob DB has a less than optimal (read: terrible) format, that doesn't play well with Git or any other Version Control System.
 
For example, this is a snippet from the current file:

1012,RODA_FROG,Roda Frog,Roda Frog,5,133,0,6,5,1,11,14,0,5,1,5,5,5,10,5,10,12,1,5,21,0x81,200,2016,816,288,0,0,0,0,0,0,0,918,9000,908,500,511,300,721,7,713,2000,0,0,0,0,0,0,0,0,4014,11013,WOLF,Wolf,Wolf,25,919,0,329,199,1,37,46,0,0,1,20,28,15,32,20,10,12,1,2,22,0x1089,200,1054,504,432,0,0,0,0,0,0,0,1011,20,920,9000,2308,10,517,650,528,1050,919,5500,578,600,0,0,0,0,4029,1
1014,SPORE,Spore,Spore,16,510,0,66,108,1,24,48,0,5,1,12,12,5,19,8,10,12,1,3,21,0x81,200,1872,672,288,0,0,0,0,0,0,0,921,9000,507,800,510,50,743,10,2220,40,7033,5,578,600,0,0,0,0,4022,11015,ZOMBIE,Zombie,Zombie,15,534,0,50,33,1,67,79,0,10,1,8,7,0,15,0,10,12,1,1,29,0x3885,400,2612,912,288,0,0,0,0,0,0,0,957,9000,724,5,938,1000,958,50,727,70,0,0,0,0,0,0,0,0,4038,1
Can you tell, at a glance, if any of these mobs drops a Strawberry? You certainly can't (unless you already know).
 
Now, after locating the Strawberry drop, what happens if we want to remove it?

1012,RODA_FROG,Roda Frog,Roda Frog,5,133,0,6,5,1,11,14,0,5,1,5,5,5,10,5,10,12,1,5,21,0x81,200,2016,816,288,0,0,0,0,0,0,0,918,9000,908,500,511,300,721,7,713,2000,0,0,0,0,0,0,0,0,4014,11013,WOLF,Wolf,Wolf,25,919,0,329,199,1,37,46,0,0,1,20,28,15,32,20,10,12,1,2,22,0x1089,200,1054,504,432,0,0,0,0,0,0,0,1011,20,920,9000,2308,10,517,650,528,1050,919,5500,0,0,0,0,0,0,4029,1
1014,SPORE,Spore,Spore,16,510,0,66,108,1,24,48,0,5,1,12,12,5,19,8,10,12,1,3,21,0x81,200,1872,672,288,0,0,0,0,0,0,0,921,9000,507,800,510,50,743,10,2220,40,7033,5,0,0,0,0,0,4022,11015,ZOMBIE,Zombie,Zombie,15,534,0,50,33,1,67,79,0,10,1,8,7,0,15,0,10,12,1,1,29,0x3885,400,2612,912,288,0,0,0,0,0,0,0,957,9000,724,5,938,1000,958,50,727,70,0,0,0,0,0,0,0,0,4038,1
How many Strawberry entries did I remove and from which lines? Can you tell at a glance? Certainly not.
 
What happens if we try to diff it? (this is the output of 'git diff' with the modified file)

@@ -16,8 +16,8 @@
1010,WILOW,Willow,Willow,4,95,0,5,4,1,9,12,5,15,1,4,8,30,9,10,10,12,1,3,22,0x81,200,1672,672,432,0,0,0,0,0,0,0,902,9000,1019,100,907,1500,516,700,1068,3500,1067,2000,1066,1000,0,0,0,0,4010,1
1011,CHONCHON,Chonchon,Chonchon,4,67,0,5,4,1,10,13,10,0,1,10,4,5,12,2,10,12,0,4,24,0x181,200,1076,576,480,0,0,0,0,0,0,0,998,50,935,6500,909,1500,1205,55,601,100,742,5,1002,150,0,0,0,0,4009,1
1012,RODA_FROG,Roda Frog,Roda Frog,5,133,0,6,5,1,11,14,0,5,1,5,5,5,10,5,10,12,1,5,21,0x81,200,2016,816,288,0,0,0,0,0,0,0,918,9000,908,500,511,300,721,7,713,2000,0,0,0,0,0,0,0,0,4014,1
-1013,WOLF,Wolf,Wolf,25,919,0,329,199,1,37,46,0,0,1,20,28,15,32,20,10,12,1,2,22,0x1089,200,1054,504,432,0,0,0,0,0,0,0,1011,20,920,9000,2308,10,517,650,528,1050,919,5500,578,600,0,0,0,0,4029,1
-1014,SPORE,Spore,Spore,16,510,0,66,108,1,24,48,0,5,1,12,12,5,19,8,10,12,1,3,21,0x81,200,1872,672,288,0,0,0,0,0,0,0,921,9000,507,800,510,50,743,10,2220,40,7033,5,578,600,0,0,0,0,4022,1
+1013,WOLF,Wolf,Wolf,25,919,0,329,199,1,37,46,0,0,1,20,28,15,32,20,10,12,1,2,22,0x1089,200,1054,504,432,0,0,0,0,0,0,0,1011,20,920,9000,2308,10,517,650,528,1050,919,5500,0,0,0,0,0,0,4029,1
+1014,SPORE,Spore,Spore,16,510,0,66,108,1,24,48,0,5,1,12,12,5,19,8,10,12,1,3,21,0x81,200,1872,672,288,0,0,0,0,0,0,0,921,9000,507,800,510,50,743,10,2220,40,7033,5,0,0,0,0,0,4022,1
1015,ZOMBIE,Zombie,Zombie,15,534,0,50,33,1,67,79,0,10,1,8,7,0,15,0,10,12,1,1,29,0x3885,400,2612,912,288,0,0,0,0,0,0,0,957,9000,724,5,938,1000,958,50,727,70,0,0,0,0,0,0,0,0,4038,1
1016,ARCHER_SKELETON,Archer Skeleton,Archer Skeleton,31,3040,0,483,283,9,128,153,0,0,1,8,14,5,90,5,10,12,1,1,29,0x2085,300,2864,864,576,0,0,0,0,0,0,0,932,4500,756,70,2285,3,1708,35,1752,1000,507,1800,1701,150,0,0,0,0,4094,1
//1017,THIEF_BUG_FEMALE,Thief Bug Female,Thief Bug Female,10,170,0,35,18,1,33,40,5,5,1,15,10,5,23,5,10,12,1,4,27,0x651,200,988,288,768,0,0,0,0,0,0,0,955,3500,910,250,1108,15,928,200,507,400,716,50,1002,400,0,0,0,0,4026,1
Oh, so two lines were modified. Now, to locate the entry that was changed. By the way, you didn't notice that I purposely introduced a syntax error, did you? (hint: count the commas in the SPORE line: there's one less entry!)
 
Now what happens if someone else changes the file (on a nearby, but unrelated line), and you pull the change?

<<<<<<< HEAD
1012,RODA_FROG,Roda Frog,Roda Frog,5,133,0,6,5,1,11,14,0,5,1,5,5,5,10,5,10,12,1,5,21,0x81,200,2016,816,288,0,0,0,0,0,0,0,918,9000,908,500,511,300,721,7,713,2000,0,0,0,0,0,0,0,0,4014,1
1013,WOLF,Wolf,Wolf,25,919,0,329,199,1,37,46,0,0,1,20,28,15,32,20,10,12,1,2,22,0x1089,200,1054,504,432,0,0,0,0,0,0,0,1011,20,920,9000,2308,10,517,650,528,1050,919,5500,0,0,0,0,0,0,4029,1
1014,SPORE,Spore,Spore,16,510,0,66,108,1,24,48,0,5,1,12,12,5,19,8,10,12,1,3,21,0x81,200,1872,672,288,0,0,0,0,0,0,0,921,9000,507,800,510,50,743,10,2220,40,7033,5,0,0,0,0,0,4022,1
=======1012,RODA_FROG,Roda Frog,Roda Frog,5,133,0,6,5,1,11,14,0,5,1,5,5,5,10,5,10,12,1,5,21,0x81,200,2016,816,288,0,0,0,0,0,0,0,918,9000,908,500,511,300,721,7,713,2000,578,600,0,0,0,0,0,0,4014,1
1013,WOLF,Wolf,Wolf,25,919,0,329,199,1,37,46,0,0,1,20,28,15,32,20,10,12,1,2,22,0x1089,200,1054,504,432,0,0,0,0,0,0,0,1011,20,920,9000,2308,10,517,650,528,1050,919,5500,578,600,0,0,0,0,4029,1
1014,SPORE,Spore,Spore,16,510,0,66,106,1,24,48,0,5,1,12,12,5,19,8,10,12,1,3,21,0x81,200,1872,672,288,0,0,0,0,0,0,0,0,921,9000,507,800,510,50,743,10,2220,40,7033,5,578,600,0,0,0,0,4022,1
>>>>>>> upstream change
Well, have fun figuring out how to merge it! (hint: a Strawberry drop was added to RODA_FROG -- could you tell? And now, are you sure nothing else was changed? Doublecheck? Would you believe it if I said that SPORE's Job EXP was also decreased by two? Anything else? I'll leave that as homework.)
 
 
How do we fix it?
 
Once again, we're switching to a different file format. Just like last time, it'll be libconfig. We're aware there are plenty of other suitable file formats out there (who said yaml?), but unfortunately this is not the time and place to change what was already started, and we'll have to stick with libconfig for the time being. (we'll see about writing some tools that leverage the Hercules libconfig parser to lessen everyone's pain).
 
Some highlights:

  • There is no need for those annoying sequences of zeros. If a mob drops less than 10 items, only the needed entries will be there.
  • The mob_db2 entries can be left incomplete and set to inherit the original mob_db entry. If you want your SPORE to have higher Attack, , you can just write that in your mob_db2, and let it read the other values from the mob_db, so that if we update them, you get the update automatically
  • We can finally add more fields (to support new features) to the file at any time, easily and without having to edit all the lines (or force you to edit all the lines of your custom mob_db2)!
What does it look like?
 
Each entry follows this structure:

{
    // =================== Mandatory fields ===============================
    Id: ID                                (int)
    SpriteName: "SPRITE_NAME"             (string)
    Name: "Mob name"                      (string)
    // =================== Optional fields ================================
    Lv: level                             (int, defaults to 1)
    Hp: health                            (int, defaults to 1)
    Sp: mana                              (int, defaults to 0)
    Exp: basic experience                 (int, defaults to 0)
    JExp: job experience                  (int, defaults to 0)
    AttackRange: attack range             (int, defaults to 1)
    Attack: [attack1, attack2]            (int, defaults to 0)
    Def: defence                          (int, defaults to 0)
    Mdef: magic defence                   (int, defaults to 0)
    Stats: {
        Str: strength                 (int, defaults to 0)
        Agi: agility                  (int, defaults to 0)
        Vit: vitality                 (int, defaults to 0)
        Int: intelligence             (int, defaults to 0)
        Dex: dexterity                (int, defaults to 0)
        Luk: luck                     (int, defaults to 0)
    }
    ViewRange: view range                 (int, defaults to 1)
    ChaseRange: chase range               (int, defaults to 1)
    Size: size                            (int, defaults to 1)
    Race: race                            (int, defaults to 0)
    Element: (type, level)
    Mode: {
        CanMove: true/false           (bool)
        Looter: true/false            (bool)
        Aggressive: true/false        (bool)
        Assist: true/false            (bool)
        CastSensorIdle:true/false     (bool)
        Boss: true/false              (bool)
        Plant: true/false             (bool)
        CanAttack: true/false         (bool)
        Detector: true/false          (bool)
        CastSensorChase: true/false   (bool)
        ChangeChase: true/false       (bool)
        Angry: true/false             (bool)
        ChangeTargetMelee: true/false (bool)
        ChangeTargetChase: true/false (bool)
        TargetWeak: true/false        (bool)
    }
    MoveSpeed: move speed                 (int, defaults to 0)
    AttackDelay: attack delay             (int, defaults to 4000)
    AttackMotion: attack motion           (int, defaults to 2000)
    DamageMotion: damage motion           (int, defaults to 0)
    MvpExp: mvp experience                (int, defaults to 0)
    MvpDrops: {
        AegisName: chance             (string: int)
        ...
    }
    Drops: {
        AegisName: chance         (string: int)
        ...
    }
}
Here's a PORING in the old format:

1002,PORING,Poring,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,0x83,400,1872,672,480,0,0,0,0,0,0,0,909,7000,1202,100,938,400,512,1000,713,1500,512,150,619,20,0,0,0,0,4001,1
And here's the same PORING in the new format:

{
    Id: 1002
    SpriteName: "PORING"
    Name: "Poring"
    Lv: 1
    Hp: 50
    Sp: 0
    Exp: 2
    JExp: 1
    AttackRange: 1
    Attack: [7, 10]
    Def: 0
    Mdef: 5
    Stats: {
        Str: 1
        Agi: 1
        Vit: 1
        Int: 0
        Dex: 6
        Luk: 30
    }
    ViewRange: 10
    ChaseRange: 12
    Size: 1
    Race: 3
    Element: (1, 1)
    Mode: {
        CanMove: true
        Looter: true
        CanAttack: true
    }
    MoveSpeed: 400
    AttackDelay: 1872
    AttackMotion: 672
    DamageMotion: 480
    MvpExp: 0
    Drops: {
        Jellopy: 7000
        Knife_: 100
        Sticky_Mucus: 400
        Apple: 1000
        Empty_Bottle: 1500
        Apple: 150
        Unripe_Apple: 20
        Poring_Card: 1
    }
},
Not convinced yet it's better?
 
Do you like Strawberries? Irrelevant? Not really:

{
    Id: 1012
    SpriteName: "RODA_FROG"
    Name: "Roda Frog"
    Lv: 5
    Hp: 133
    Sp: 0
    Exp: 6
    JExp: 5
    AttackRange: 1
    Attack: [11, 14]
    Def: 0
    Mdef: 5
    Stats: {
        Str: 1
        Agi: 5
        Vit: 5
        Int: 5
        Dex: 10
        Luk: 5
    }
    ViewRange: 10
    ChaseRange: 12
    Size: 1
    Race: 5
    Element: (1, 1)
    Mode: {
        CanMove: true
        CanAttack: true
    }
    MoveSpeed: 200
    AttackDelay: 2016
    AttackMotion: 816
    DamageMotion: 288
    MvpExp: 0
    Drops: {
        Sticky_Webfoot: 9000
        Spawn: 500
        Green_Herb: 300
        Azure_Jewel: 7
        Empty_Bottle: 2000
        Roda_Frog_Card: 1
    }
},
{
    Id: 1013
    SpriteName: "WOLF"
    Name: "Wolf"
    Lv: 25
    Hp: 919
    Sp: 0
    Exp: 329
    JExp: 199
    AttackRange: 1
    Attack: [37, 46]
    Def: 0
    Mdef: 0
    Stats: {
        Str: 1
        Agi: 20
        Vit: 28
        Int: 15
        Dex: 32
        Luk: 20
    }
    ViewRange: 10
    ChaseRange: 12
    Size: 1
    Race: 2
    Element: (2, 1)
    Mode: {
        CanMove: true
        Assist: true
        CanAttack: true
        ChangeTargetMelee: true
    }
    MoveSpeed: 200
    AttackDelay: 1054
    AttackMotion: 504
    DamageMotion: 432
    MvpExp: 0
    Drops: {
        Emveretarcon: 20
        Claw_Of_Wolves: 9000
        Mantle_: 10
        Meat: 650
        Monster's_Feed: 1050
        Animal's_Skin: 5500
        Strawberry: 600
        Wolf_Card: 1
    }
},
{
    Id: 1014
    SpriteName: "SPORE"
    Name: "Spore"
    Lv: 16
    Hp: 510
    Sp: 0
    Exp: 66
    JExp: 108
    AttackRange: 1
    Attack: [24, 48]
    Def: 0
    Mdef: 5
    Stats: {
        Str: 1
        Agi: 12
        Vit: 12
        Int: 5
        Dex: 19
        Luk: 8
    }
    ViewRange: 10
    ChaseRange: 12
    Size: 1
    Race: 3
    Element: (1, 1)
    Mode: {
        CanMove: true
        CanAttack: true
    }
    MoveSpeed: 200
    AttackDelay: 1872
    AttackMotion: 672
    DamageMotion: 288
    MvpExp: 0
    Drops: {
        Mushroom_Spore: 9000
        Red_Herb: 800
        Blue_Herb: 50
        Spore_Doll: 10
        Hat: 40
        Poison_Spore: 5
        Strawberry: 600
        Spore_Card: 1
    }
},
{
    Id: 1015
    SpriteName: "ZOMBIE"
    Name: "Zombie"
    Lv: 15
    Hp: 534
    Sp: 0
    Exp: 50
    JExp: 33
    AttackRange: 1
    Attack: [67, 79]
    Def: 0
    Mdef: 10
    Stats: {
        Str: 1
        Agi: 8
        Vit: 7
        Int: 0
        Dex: 15
        Luk: 0
    }
    ViewRange: 10
    ChaseRange: 12
    Size: 1
    Race: 1
    Element: (9, 1)
    Mode: {
        CanMove: true
        Aggressive: true
        CanAttack: true
        Angry: true
        ChangeTargetMelee: true
        ChangeTargetChase: true
    }
    MoveSpeed: 400
    AttackDelay: 2612
    AttackMotion: 912
    DamageMotion: 288
    MvpExp: 0
    Drops: {
        Decayed_Nail: 9000
        Cardinal_Jewel_: 5
        Sticky_Mucus: 1000
        Horrendous_Mouth: 50
        White_Jewel: 70
        Zombie_Card: 1
    }
},
Is it easier to spot all the Strawberry there? I bet.

{
    Id: 1012
    SpriteName: "RODA_FROG"
    Name: "Roda Frog"
    Lv: 5
    Hp: 133
    Sp: 0
    Exp: 6
    JExp: 5
    AttackRange: 1
    Attack: [11, 14]
    Def: 0
    Mdef: 5
    Stats: {
        Str: 1
        Agi: 5
        Vit: 5
        Int: 5
        Dex: 10
        Luk: 5
    }
    ViewRange: 10
    ChaseRange: 12
    Size: 1
    Race: 5
    Element: (1, 1)
    Mode: {
        CanMove: true
        CanAttack: true
    }
    MoveSpeed: 200
    AttackDelay: 2016
    AttackMotion: 816
    DamageMotion: 288
    MvpExp: 0
    Drops: {
        Sticky_Webfoot: 9000
        Spawn: 500
        Green_Herb: 300
        Azure_Jewel: 7
        Empty_Bottle: 2000
        Roda_Frog_Card: 1
    }
},
{
    Id: 1013
    SpriteName: "WOLF"
    Name: "Wolf"
    Lv: 25
    Hp: 919
    Sp: 0
    Exp: 329
    JExp: 199
    AttackRange: 1
    Attack: [37, 46]
    Def: 0
    Mdef: 0
    Stats: {
        Str: 1
        Agi: 20
        Vit: 28
        Int: 15
        Dex: 32
        Luk: 20
    }
    ViewRange: 10
    ChaseRange: 12
    Size: 1
    Race: 2
    Element: (2, 1)
    Mode: {
        CanMove: true
        Assist: true
        CanAttack: true
        ChangeTargetMelee: true
    }
    MoveSpeed: 200
    AttackDelay: 1054
    AttackMotion: 504
    DamageMotion: 432
    MvpExp: 0
    Drops: {
        Emveretarcon: 20
        Claw_Of_Wolves: 9000
        Mantle_: 10
        Meat: 650
        Monster's_Feed: 1050
        Animal's_Skin: 5500
        Wolf_Card: 1
    }
},
{
    Id: 1014
    SpriteName: "SPORE"
    Name: "Spore"
    Lv: 16
    Hp: 510
    Sp: 0
    Exp: 66
    JExp: 108
    AttackRange: 1
    Attack: [24, 48]
    Def: 0
    Mdef: 5
    Stats: {
        Str: 1
        Agi: 12
        Vit: 12
        Int: 5
        Dex: 19
        Luk: 8
    }
    ViewRange: 10
    ChaseRange: 12
    Size: 1
    Race: 3
    Element: (1, 1)
    Mode: {
        CanMove: true
        CanAttack: true
    }
    MoveSpeed: 200
    AttackDelay: 1872
    AttackMotion: 672
    DamageMotion: 288
    MvpExp: 0
    Drops: {
        Mushroom_Spore: 9000
        Red_Herb: 800
        Blue_Herb: 50
        Spore_Doll: 10
        Hat: 40
        Poison_Spore: 5
        Spore_Card: 1
    }
},
{
    Id: 1015
    SpriteName: "ZOMBIE"
    Name: "Zombie"
    Lv: 15
    Hp: 534
    Sp: 0
    Exp: 50
    JExp: 33
    AttackRange: 1
    Attack: [67, 79]
    Def: 0
    Mdef: 10
    Stats: {
        Str: 1
        Agi: 8
        Vit: 7
        Int: 0
        Dex: 15
        Luk: 0
    }
    ViewRange: 10
    ChaseRange: 12
    Size: 1
    Race: 1
    Element: (9, 1)
    Mode: {
        CanMove: true
        Aggressive: true
        CanAttack: true
        Angry: true
        ChangeTargetMelee: true
        ChangeTargetChase: true
    }
    MoveSpeed: 400
    AttackDelay: 2612
    AttackMotion: 912
    DamageMotion: 288
    MvpExp: 0
    Drops: {
        Decayed_Nail: 9000
        Cardinal_Jewel_: 5
        Sticky_Mucus: 1000
        Horrendous_Mouth: 50
        White_Jewel: 70
        Zombie_Card: 1
    }
},
Removed them all? Yup.
 
Want to see a diff? sure:

diff --git a/db/pre-re/mob_db.conf b/db/pre-re/mob_db.confindex 0ac34d7..ff4f0bd 100644--- a/db/pre-re/mob_db.conf+++ b/db/pre-re/mob_db.conf
@@ -588,7 +588,6 @@ mob_db: ( 
        Meat: 650 
        Monster's_Feed: 1050 
        Animal's_Skin: 5500-
        Strawberry: 600 
        Wolf_Card: 1 
    }
},
@@ -634,7 +633,6 @@ mob_db: ( 
        Spore_Doll: 10 
        Hat: 40 
        Poison_Spore: 5-
        Strawberry: 600 
        Spore_Card: 1 
    }
},
Looks pretty? Very much so.
 
What happens if we pull a commit like the one before?

{
    Id: 1012
    SpriteName: "RODA_FROG"
    Name: "Roda Frog"
    Lv: 5
    Hp: 133
    Sp: 0
    Exp: 6
    JExp: 5
    AttackRange: 1
    Attack: [11, 14]
    Def: 0
    Mdef: 5
    Stats: {
        Str: 1
        Agi: 5
        Vit: 5
        Int: 5
        Dex: 10
        Luk: 5
    }
    ViewRange: 10
    ChaseRange: 12
    Size: 1
    Race: 5
    Element: (1, 1)
    Mode: {
        CanMove: true
        CanAttack: true
    }
    MoveSpeed: 200
    AttackDelay: 2016
    AttackMotion: 816
    DamageMotion: 288
    MvpExp: 0
    Drops: {
        Sticky_Webfoot: 9000
        Spawn: 500
        Green_Herb: 300
        Azure_Jewel: 7
        Empty_Bottle: 2000
        Strawberry: 600
        Roda_Frog_Card: 1
    }
},
{
    Id: 1013
    SpriteName: "WOLF"
    Name: "Wolf"
    Lv: 25
    Hp: 919
    Sp: 0
    Exp: 329
    JExp: 199
    AttackRange: 1
    Attack: [37, 46]
    Def: 0
    Mdef: 0
    Stats: {
        Str: 1
        Agi: 20
        Vit: 28
        Int: 15
        Dex: 32
        Luk: 20
    }
    ViewRange: 10
    ChaseRange: 12
    Size: 1
    Race: 2
    Element: (2, 1)
    Mode: {
        CanMove: true
        Assist: true
        CanAttack: true
        ChangeTargetMelee: true
    }
    MoveSpeed: 200
    AttackDelay: 1054
    AttackMotion: 504
    DamageMotion: 432
    MvpExp: 0
    Drops: {
        Emveretarcon: 20
        Claw_Of_Wolves: 9000
        Mantle_: 10
        Meat: 650
        Monster's_Feed: 1050
        Animal's_Skin: 5500
        Wolf_Card: 1
    }
},
{
    Id: 1014
    SpriteName: "SPORE"
    Name: "Spore"
    Lv: 16
    Hp: 510
    Sp: 0
    Exp: 66
    JExp: 106
    AttackRange: 1
    Attack: [24, 48]
    Def: 0
    Mdef: 5
    Stats: {
        Str: 1
        Agi: 12
        Vit: 12
        Int: 5
        Dex: 19
        Luk: 8
    }
    ViewRange: 10
    ChaseRange: 12
    Size: 1
    Race: 3
    Element: (1, 1)
    Mode: {
        CanMove: true
        CanAttack: true
    }
    MoveSpeed: 200
    AttackDelay: 1872
    AttackMotion: 672
    DamageMotion: 288
    MvpExp: 0
    Drops: {
        Mushroom_Spore: 9000
        Red_Herb: 800
        Blue_Herb: 50
        Spore_Doll: 10
        Hat: 40
        Poison_Spore: 5
        Spore_Card: 1
    }
},
{
    Id: 1015
    SpriteName: "ZOMBIE"
    Name: "Zombie"
    Lv: 15
    Hp: 534
    Sp: 0
    Exp: 50
    JExp: 33
    AttackRange: 1
    Attack: [67, 79]
    Def: 0
    Mdef: 10
    Stats: {
        Str: 1
        Agi: 8
        Vit: 7
        Int: 0
        Dex: 15
        Luk: 0
    }
    ViewRange: 10
    ChaseRange: 12
    Size: 1
    Race: 1
    Element: (9, 1)
    Mode: {
        CanMove: true
        Aggressive: true
        CanAttack: true
        Angry: true
        ChangeTargetMelee: true
        ChangeTargetChase: true
    }
    MoveSpeed: 400
    AttackDelay: 2612
    AttackMotion: 912
    DamageMotion: 288
    MvpExp: 0
    Drops: {
        Decayed_Nail: 9000
        Cardinal_Jewel_: 5
        Sticky_Mucus: 1000
        Horrendous_Mouth: 50
        White_Jewel: 70
        Zombie_Card: 1
    }
},
What do you expect? No conflicts.
 
What's changed? Here:

diff --git a/db/pre-re/mob_db.conf b/db/pre-re/mob_db.confindex 0ac34d7..59a53b6 100644--- a/db/pre-re/mob_db.conf+++ b/db/pre-re/mob_db.conf
@@ -541,6 +541,7 @@ mob_db: (
                Green_Herb: 300
                Azure_Jewel: 7
                Empty_Bottle: 2000
+               Strawberry: 600
                Roda_Frog_Card: 1
        }
},
@@ -588,7 +589,6 @@ mob_db: (
                Meat: 650
                Monster's_Feed: 1050
                Animal's_Skin: 5500
-               Strawberry: 600
                Wolf_Card: 1
        }
},
@@ -600,7 +600,7 @@ mob_db: (
        Hp: 510
        Sp: 0
        Exp: 66
-       JExp: 108
+       JExp: 106
        AttackRange: 1
        Attack: [24, 48]
        Def: 0
@@ -634,7 +634,6 @@ mob_db: (
                Spore_Doll: 10
                Hat: 40
                Poison_Spore: 5
-               Strawberry: 600
                Spore_Card: 1
        }
},
But... I have several custom mobs, do I have to manually convert all of them...?
 
It's true that you need to convert your item database to the new format, but we can do it for you!

  • Go to http://haru.ws/hercules/mobdbconverter/ and paste (or upload) your mob_db2.txt (or even your mob_db.txt if you have custom entries there), pick between renewal or pre-renewal (or upload your item_db if it's customized), press the Convert button, wait a few seconds and you're done! It's already converted for you. Easy, isn't it?
  • Don't trust us? No, no, we don't need your custom mobs, you can sleep safe... But if you still don't want to paste anything on a website... well, we have provided the source code of the converter script! It's in the 'tools' folder of the Hercules repository. All you need is a Python interpreter, version 2.6 or newer (and if you're running Linux or Mac OS, on either your server or your own computer, it's almost certain that you already have that). All you have to do is run it (example: python tools/mobdbconverter.py pre-re . < db/mob_db2.txt > db/mob_db2.conf), and your item database will be converted in a split second!
What if I was using SQL mob databases?
 
Well, you're out of luck. It was deprecated long ago and it's being removed. It'll stay available for website/control panel purposes though. An automated converter (much like the db2sql plugin for the item db) will be available soon, and even executed automatically whenever we update the mob db, to keep the sql counterpart in sync!
 
I have this event mob entry that came with an old script I downloaded...
 
No worries, you can get it converted. Use the same script (or the provided web page) you'd use to convert an entire mob database, it'll work just fine even for a mob or two!
 
Special thanks

  • To Ind, for bringing up the idea, a long time ago.
  • To Andrei Karas for actually doing it, after picking up this project from the bottom of our forgotten items box.
  • To me, for putting this at the bottom of the forgotten items box, and burying it with several other things so that it'd stay there until now (sigh)
Links

 
Last edited by a moderator:
Thanks for the update, new toys to play with now
default_smile.png


 
How about the card drops? I didn't see it on the Drop List..
default_que.gif


Edit:

nvm
default_tongue.png


 
Last edited by a moderator:
Card drops are on Drops: list

We don't need custom Card field

 
Yehey! Thank you

 
Last edited by a moderator:
a sight for sore eyes
default_wub.png
, in the contrary it will need have more step in creating db for custom monster
default_laugh.png
, anyway its better than before, thx a loot

 
nice now we need an overhaul in the localization thing
default_tongue.png


 
Suggestion:

How about we merge the mob_skill_db? Example.

{
Id: 1012
SpriteName: "RODA_FROG"
Name: "Roda Frog"
Lv: 5
Hp: 133
Sp: 0
Exp: 6
JExp: 5
AttackRange: 1
Attack: [11, 14]
Def: 0
Mdef: 5
Stats: {
Str: 1
Agi: 5
Vit: 5
Int: 5
Dex: 10
Luk: 5
}
ViewRange: 10
ChaseRange: 12
Size: 1
Race: 5
Element: (1, 1)
Mode: {
CanMove: true
CanAttack: true
}
MoveSpeed: 200
AttackDelay: 2016
AttackMotion: 816
DamageMotion: 288
MvpExp: 0
Drops: {
Sticky_Webfoot: 9000
Spawn: 500
Green_Herb: 300
Azure_Jewel: 7
Empty_Bottle: 2000
Roda_Frog_Card: 1
}
    Skill: {
        NPC_WATERATTACK: {
              SkillLv: 1
              State: attack
              Rate: 2000
              CastTime: 0
              Delay: 5000
              Cancelable: yes
              Target: target
              Condition Type: always
              Condition Value: 0 (Other Example: Condition Value: [3,1522] // Osiris)
              Emotion: 0
              Chat: 0
        }
    }
},
 
^ +1

Then probably should also add in mob_avail inside

 
Yes, this is something we're looking into. I would also love to have it streamlined in a similar fashion.

We decided not to merge it right away because of some concerns about the file size, but it is not excluded that it'll be merged in the near future.

 
Last edited by a moderator:
Wow, so fast! (at least for me)
 
I was questioning this recently with a friend
default_tongue.png

 
Thank you
default_biggrin.png

 
@@Haru @@4144

How to remove Orc_Load_Card using mob_db2.conf?

{
Id: 1190
Inherit: true
SpriteName: "ORC_LORD"
Drops: {
Orc_Load_Card: false or 0 (is not working)
}
},
 
Its not supported?
(I hate touching mob_db.conf
default_sad.png
)
 
 
Last edited by a moderator:
Back
Top