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:
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!
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
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)!
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!
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)
Last edited by a moderator: