summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHaru <haru@dotalux.com>2018-04-07 23:27:45 +0200
committerGitHub <noreply@github.com>2018-04-07 23:27:45 +0200
commit766b03ca762221370067682e041251e019d07652 (patch)
tree168c2cbb8aafe4584b6fa0c5eb357efb3e4e1232
parent6e0a40288326495b97e6e5a1435a624defb8ed92 (diff)
parent33b9216117495a237158db6a2998e105ce90533b (diff)
downloadhercules-766b03ca762221370067682e041251e019d07652.tar.gz
hercules-766b03ca762221370067682e041251e019d07652.tar.bz2
hercules-766b03ca762221370067682e041251e019d07652.tar.xz
hercules-766b03ca762221370067682e041251e019d07652.zip
Merge pull request #2000 from Asheraf/petdb
Convert Pet db to Libconfig
-rw-r--r--db/pet_db2.conf64
-rw-r--r--db/pet_db2.txt52
-rw-r--r--db/pre-re/item_db.conf16
-rw-r--r--db/pre-re/pet_db.conf1544
-rw-r--r--db/pre-re/pet_db.txt124
-rw-r--r--db/re/pet_db.conf1649
-rw-r--r--db/re/pet_db.txt133
-rw-r--r--src/map/pet.c312
-rw-r--r--src/map/pet.h7
-rw-r--r--src/plugins/HPMHooking/HPMHooking.Defs.inc12
-rw-r--r--src/plugins/HPMHooking/HPMHooking_map.HPMHooksCore.inc16
-rw-r--r--src/plugins/HPMHooking/HPMHooking_map.HookingPoints.inc4
-rw-r--r--src/plugins/HPMHooking/HPMHooking_map.Hooks.inc122
-rw-r--r--tools/petdbconverter.py214
14 files changed, 3829 insertions, 440 deletions
diff --git a/db/pet_db2.conf b/db/pet_db2.conf
new file mode 100644
index 000000000..34a6130e4
--- /dev/null
+++ b/db/pet_db2.conf
@@ -0,0 +1,64 @@
+//================= Hercules Database =====================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//================= License ===============================================
+//= This file is part of Hercules.
+//= http://herc.ws - http://github.com/HerculesWS/Hercules
+//=
+//= Copyright (C) 2018 Hercules Dev Team
+//=
+//= Hercules is free software: you can redistribute it and/or modify
+//= it under the terms of the GNU General Public License as published by
+//= the Free Software Foundation, either version 3 of the License, or
+//= (at your option) any later version.
+//=
+//= This program is distributed in the hope that it will be useful,
+//= but WITHOUT ANY WARRANTY; without even the implied warranty of
+//= MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//= GNU General Public License for more details.
+//=
+//= You should have received a copy of the GNU General Public License
+//= along with this program. If not, see <http://www.gnu.org/licenses/>.
+//=========================================================================
+//= Pets Database
+//=========================================================================
+
+pet_db:(
+/**************************************************************************
+ ************* Entry structure ********************************************
+ **************************************************************************
+{
+ // ================ Mandatory fields ==============================
+ Id: ID (int)
+ SpriteName: "Sprite_Name" (string)
+ Name: "Pet Name" (string)
+ // ================ Optional fields ===============================
+ TamingItem: Taming Item (string, defaults to 0)
+ EggItem: Egg Id (string, defaults to 0)
+ AccessoryItem: Equipment Id (string, defaults to 0)
+ FoodItem: Food Id (string, defaults to 0)
+ FoodEffectiveness: hunger points (int, defaults to 0)
+ HungerDelay: hunger time (int, defaults to 0)
+ Intimacy: {
+ Initial: start intimacy (int, defaults to 0)
+ FeedIncrement: feeding intimacy (int, defaults to 0)
+ OverFeedDecrement: overfeeding intimacy (int, defaults to 0)
+ OwnerDeathDecrement: owner die intimacy (int, defaults to 0)
+ }
+ CaptureRate: capture rate (int, defaults to 0)
+ Speed: speed (int, defaults to 0)
+ SpecialPerformance: true/false (boolean, defaults to false)
+ TalkWithEmotes: convert talk (boolean, defaults to false)
+ AttackRate: attack rate (int, defaults to 0)
+ DefendRate: Defence attack (int, defaults to 0)
+ ChangeTargetRate: change target (int, defaults to 0)
+ PetScript: <" Pet Script (can also be multi-line) ">
+ EquipScript: <" Equip Script (can also be multi-line) ">
+},
+**************************************************************************/
+ // entries in this file will override the ones in /(pre-)re/pet_db.conf
+)
diff --git a/db/pet_db2.txt b/db/pet_db2.txt
deleted file mode 100644
index 4e9b26fd9..000000000
--- a/db/pet_db2.txt
+++ /dev/null
@@ -1,52 +0,0 @@
-// Pet Additional Database
-//
-// Structure of Database:
-// MobID,Name,JName,LureID,EggID,EquipID,FoodID,Fullness,HungryDelay,R_Hungry,R_Full,Intimate,Die,Capture,Speed,S_Performance,talk_convert_class,attack_rate,defence_attack_rate,change_target_rate,pet_script,loyal_script
-//
-// 01. MobID Monster ID of the pet.
-// 02. Name Name of the monster as defined in the database.
-// 03. JName The display name of the monster when hatched.
-// 04. LureID Pet Tame Item ID.
-// 05. EggID Pet Egg ID.
-// 06. EquipID Pet Accessory ID.
-// 07. FoodID Pet Food ID.
-// 08. Fullness The amount of hunger points increasing with each feeding.
-// 09. HungryDelay The amount of time it takes for hunger to decrease after feeding. (Default: 60 seconds)
-// 10. R_Hungry Amount of Intimacy that is increased when fed.
-// 11. R_Full Amount of Intimacy that is decreased when over-fed.
-// 12. Intimate Amount of Intimacy the pet starts with.
-// 13. Die Amount of Intimacy that is decreased when the pet owner dies.
-// 14. Capture Capture succes rate (10000 = 100%)
-// 15. Speed Pet's walk speed. (Defaul: 150)
-// 16. S_Performance Special Performance. (Yes = 1, No = 0)
-// 17. talk_convert_class Disables pet talk (instead of talking they emote with /!.)
-// 18. attack_rate Rate of which the pet will attack (requires at least pet_support_min_friendly intimacy).
-// 19. defence_attack_rate Rate of which the pet will retaliate when master is being attacked (requires at least pet_support_min_friendly intimacy).
-// 20. change_target_rate Rate of which the pet will change its attack target.
-// 21. pet_script Script to execute when the pet is hatched.
-// 22. loyal_script Script to execute when the pet is hatched (requires at least pet_equip_min_friendly intimacy, independent of pet_script).
-//NOTE: The max value (100%) of attack_rate, defense_rate & change_target_rate is 10000.
-
-//In theory you can use any valid script, but it is run only once upon pet
-//loading, so it is recommended you use the specific pet scripts:
-
-//petskillattack skillid, skilllv, hits, rate, bonusrate
-//Skill attack that triggers while the pet is attacking. Rate is the base
-//chance of execution per attack. Bonusrate is an additional success rate when
-//intimacy reaches max. If hits is specified and different than 0, it will make
-//the pet cast the skill with a fixed amount of damage inflicted and the
-//specified number of hits. A value of zero uses the skill's defaults.
-
-//petskillsupport skillid, skilllv, delay, hp%, sp%
-//Casts a support skill when the health levels are below the specified hp% and
-//sp%. Delay is the minimum time in seconds before the skill can be cast again
-
-//petrecovery type, delay: Cures the "type" status effect after "delay" seconds
-
-//petskillbonus type, value, duration, delay
-//Gives bonus stats. Type is the stat to increase (bStr, bLuk), value is the
-//amount by which it is increased, duration signals how long the bonus lasts
-//delay is the time elapsed after the bonus ends and before it starts again.
-
-//A single pet can have petloot, petskillbonus, petskillattack and
-//petskillsupport at the same time, but only one of each.
diff --git a/db/pre-re/item_db.conf b/db/pre-re/item_db.conf
index a98495eee..d62bbf19c 100644
--- a/db/pre-re/item_db.conf
+++ b/db/pre-re/item_db.conf
@@ -64561,7 +64561,21 @@ item_db: (
Type: "IT_PETEGG"
Buy: 20
},
-
+{
+ Id: 9058
+ AegisName: "Snow_Rabbit_Egg"
+ Name: "Christmas Snow Rabbit Egg"
+ Type: "IT_PETEGG"
+ Buy: 20
+ Trade: {
+ nodrop: true
+ notrade: true
+ nocart: true
+ nogstorage: true
+ nomail: true
+ noauction: true
+ }
+},
//== Pet Accessories =======================================
{
Id: 10001
diff --git a/db/pre-re/pet_db.conf b/db/pre-re/pet_db.conf
new file mode 100644
index 000000000..3ce78e546
--- /dev/null
+++ b/db/pre-re/pet_db.conf
@@ -0,0 +1,1544 @@
+//================= Hercules Database =====================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//================= License ===============================================
+//= This file is part of Hercules.
+//= http://herc.ws - http://github.com/HerculesWS/Hercules
+//=
+//= Copyright (C) 2018 Hercules Dev Team
+//=
+//= Hercules is free software: you can redistribute it and/or modify
+//= it under the terms of the GNU General Public License as published by
+//= the Free Software Foundation, either version 3 of the License, or
+//= (at your option) any later version.
+//=
+//= This program is distributed in the hope that it will be useful,
+//= but WITHOUT ANY WARRANTY; without even the implied warranty of
+//= MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//= GNU General Public License for more details.
+//=
+//= You should have received a copy of the GNU General Public License
+//= along with this program. If not, see <http://www.gnu.org/licenses/>.
+//=========================================================================
+//= Pets Database
+//=========================================================================
+
+pet_db:(
+/**************************************************************************
+ ************* Entry structure ********************************************
+ **************************************************************************
+{
+ // ================ Mandatory fields ==============================
+ Id: ID (int)
+ SpriteName: "Sprite_Name" (string)
+ Name: "Pet Name" (string)
+ // ================ Optional fields ===============================
+ TamingItem: Taming Item (string, defaults to 0)
+ EggItem: Egg Id (string, defaults to 0)
+ AccessoryItem: Equipment Id (string, defaults to 0)
+ FoodItem: Food Id (string, defaults to 0)
+ FoodEffectiveness: hunger points (int, defaults to 0)
+ HungerDelay: hunger time (int, defaults to 0)
+ Intimacy: {
+ Initial: start intimacy (int, defaults to 0)
+ FeedIncrement: feeding intimacy (int, defaults to 0)
+ OverFeedDecrement: overfeeding intimacy (int, defaults to 0)
+ OwnerDeathDecrement: owner die intimacy (int, defaults to 0)
+ }
+ CaptureRate: capture rate (int, defaults to 0)
+ Speed: speed (int, defaults to 0)
+ SpecialPerformance: true/false (boolean, defaults to false)
+ TalkWithEmotes: convert talk (boolean, defaults to false)
+ AttackRate: attack rate (int, defaults to 0)
+ DefendRate: Defence attack (int, defaults to 0)
+ ChangeTargetRate: change target (int, defaults to 0)
+ PetScript: <" Pet Script (can also be multi-line) ">
+ EquipScript: <" Equip Script (can also be multi-line) ">
+},
+**************************************************************************/
+{
+ Id: 1002
+ SpriteName: "PORING"
+ Name: "Poring"
+ TamingItem: "Unripe_Apple"
+ EggItem: "Poring_Egg"
+ AccessoryItem: "Backpack"
+ FoodItem: "Apple_Juice"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 50
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 2000
+ Speed: 150
+ SpecialPerformance: true
+ AttackRate: 350
+ DefendRate: 400
+ ChangeTargetRate: 800
+ PetScript: <" petloot(10); ">
+ EquipScript: <"
+ bonus(bLuk, 2);
+ bonus(bCritical, 1);
+ ">
+},
+{
+ Id: 1011
+ SpriteName: "CHONCHON"
+ Name: "ChonChon"
+ TamingItem: "Rotten_Fish"
+ EggItem: "Chonchon_Egg"
+ AccessoryItem: "Monster_Oxygen_Mask"
+ FoodItem: "Pet_Food"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 30
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 1500
+ Speed: 150
+ SpecialPerformance: true
+ AttackRate: 500
+ DefendRate: 500
+ ChangeTargetRate: 250
+ PetScript: <" petskillbonus(bAgi, 4, 10, 50); ">
+ EquipScript: <"
+ bonus(bAgi, 1);
+ bonus(bFlee, 2);
+ ">
+},
+{
+ Id: 1014
+ SpriteName: "SPORE"
+ Name: "Spore"
+ TamingItem: "Dew_Laden_Moss"
+ EggItem: "Spore_Egg"
+ AccessoryItem: "Bark_Shorts"
+ FoodItem: "Pet_Food"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 30
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 1500
+ Speed: 150
+ AttackRate: 350
+ DefendRate: 500
+ ChangeTargetRate: 500
+ PetScript: <" petrecovery(SC_POISON, 60); ">
+ EquipScript: <"
+ bonus(bHit, 5);
+ bonus(bAtk, -2);
+ ">
+},
+{
+ Id: 1019
+ SpriteName: "PECOPECO"
+ Name: "PecoPeco"
+ TamingItem: "Fatty_Chubby_Earthworm"
+ EggItem: "PecoPeco_Egg"
+ AccessoryItem: "Battered_Pot"
+ FoodItem: "Pet_Food"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 30
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 1000
+ Speed: 150
+ SpecialPerformance: true
+ AttackRate: 400
+ DefendRate: 500
+ ChangeTargetRate: 800
+ PetScript: <" petskillbonus(bSpeedRate, 25, 20, 20); ">
+ EquipScript: <"
+ bonus(bMaxHP, 150);
+ bonus(bMaxSP, -10);
+ ">
+},
+{
+ Id: 1023
+ SpriteName: "ORK_WARRIOR"
+ Name: "Orc Warrior"
+ TamingItem: "Horror_Of_Tribe"
+ EggItem: "Orc_Warrior_Egg"
+ AccessoryItem: "Wild_Flower"
+ FoodItem: "Pet_Food"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 20
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 500
+ Speed: 150
+ SpecialPerformance: true
+ AttackRate: 600
+ DefendRate: 200
+ ChangeTargetRate: 300
+ PetScript: <" petskillattack("NPC_PIERCINGATT", 100, 1, 0, 10); ">
+ EquipScript: <"
+ bonus(bAtk, 10);
+ bonus(bDef, -3);
+ ">
+},
+{
+ Id: 1026
+ SpriteName: "MUNAK"
+ Name: "Munak"
+ TamingItem: "No_Recipient"
+ EggItem: "Munak_Egg"
+ AccessoryItem: "Punisher"
+ FoodItem: "Pet_Food"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 20
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 500
+ Speed: 150
+ AttackRate: 300
+ DefendRate: 750
+ ChangeTargetRate: 300
+ PetScript: <" petskillattack("NPC_DARKNESSATTACK", 444, 1, 0, 10); ">
+ EquipScript: <"
+ bonus(bInt, 1);
+ bonus(bDef, 1);
+ ">
+},
+{
+ Id: 1029
+ SpriteName: "ISIS"
+ Name: "Isis"
+ TamingItem: "Armlet_Of_Obedience"
+ EggItem: "Isis_Egg"
+ AccessoryItem: "Queens_Hair_Ornament"
+ FoodItem: "Pet_Food"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 10
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 500
+ Speed: 150
+ AttackRate: 650
+ DefendRate: 450
+ ChangeTargetRate: 150
+ PetScript: <" petskillsupport("PR_MAGNIFICAT", 2, 60, 50, 50); ">
+ EquipScript: <"
+ bonus(bMatkRate, -1);
+ bonus(bAtkRate, 1);
+ ">
+},
+{
+ Id: 1031
+ SpriteName: "POPORING"
+ Name: "Poporing"
+ TamingItem: "Bitter_Herb"
+ EggItem: "Poporing_Egg"
+ AccessoryItem: "Backpack"
+ FoodItem: "Green_Herb"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 30
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 1000
+ Speed: 150
+ SpecialPerformance: true
+ AttackRate: 300
+ DefendRate: 500
+ ChangeTargetRate: 400
+ PetScript: <" petloot(15); ">
+ EquipScript: <"
+ bonus(bLuk, 2);
+ bonus2(bSubEle, Ele_Poison, 10);
+ ">
+},
+{
+ Id: 1035
+ SpriteName: "HUNTER_FLY"
+ Name: "Hunter Fly"
+ TamingItem: "Monster_Juice"
+ EggItem: "Hunter_Fly_Egg"
+ AccessoryItem: "Monster_Oxygen_Mask"
+ FoodItem: "Red_Gemstone"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 10
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 500
+ Speed: 150
+ SpecialPerformance: true
+ AttackRate: 500
+ DefendRate: 500
+ ChangeTargetRate: 200
+ PetScript: <" petskillattack("NPC_WINDATTACK", 888, 2, 0, 10); ">
+ EquipScript: <"
+ bonus(bFlee, -5);
+ bonus(bFlee2, 2);
+ ">
+},
+{
+ Id: 1042
+ SpriteName: "STEEL_CHONCHON"
+ Name: "Steel ChonChon"
+ TamingItem: "Lusty_Iron"
+ EggItem: "Steel_Chonchon_Egg"
+ AccessoryItem: "Monster_Oxygen_Mask"
+ FoodItem: "Iron_Ore"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 20
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 1000
+ Speed: 150
+ SpecialPerformance: true
+ AttackRate: 500
+ DefendRate: 500
+ ChangeTargetRate: 200
+ PetScript: <" petskillbonus(bAgiVit, 4, 20, 40); ">
+ EquipScript: <"
+ bonus(bFlee, 6);
+ bonus(bAgi, -1);
+ ">
+},
+{
+ Id: 1049
+ SpriteName: "PICKY"
+ Name: "Picky"
+ TamingItem: "Earthworm_The_Dude"
+ EggItem: "Picky_Egg"
+ AccessoryItem: "Tiny_Egg_Shell"
+ FoodItem: "Red_Herb"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 40
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 2000
+ Speed: 150
+ SpecialPerformance: true
+ AttackRate: 500
+ DefendRate: 600
+ ChangeTargetRate: 50
+ PetScript: <" petskillbonus(bStr, 3, 10, 50); ">
+ EquipScript: <"
+ bonus(bStr, 1);
+ bonus(bAtk, 5);
+ ">
+},
+{
+ Id: 1052
+ SpriteName: "ROCKER"
+ Name: "Rocker"
+ TamingItem: "Singing_Flower"
+ EggItem: "Rocker_Egg"
+ AccessoryItem: "Rocker_Glasses"
+ FoodItem: "Pet_Food"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 30
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 1500
+ Speed: 150
+ AttackRate: 350
+ DefendRate: 350
+ ChangeTargetRate: 600
+ PetScript: <" petskillbonus(bAllStats, 1, 10, 50); ">
+ EquipScript: <"
+ bonus(bHPrecovRate, 5);
+ bonus(bMaxHP, 25);
+ ">
+},
+{
+ Id: 1056
+ SpriteName: "SMOKIE"
+ Name: "Smokie"
+ TamingItem: "Baked_Yam"
+ EggItem: "Smokie_Egg"
+ AccessoryItem: "Red_Muffler"
+ FoodItem: "Pet_Food"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 30
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 1000
+ Speed: 150
+ SpecialPerformance: true
+ AttackRate: 600
+ DefendRate: 600
+ ChangeTargetRate: 100
+ PetScript: <" petskillbonus(bPerfectHide, 1, 3600, 0); ">
+ EquipScript: <"
+ bonus(bAgi, 1);
+ bonus(bFlee2, 1);
+ ">
+},
+{
+ Id: 1057
+ SpriteName: "YOYO"
+ Name: "Yoyo"
+ TamingItem: "Tropical_Banana"
+ EggItem: "Yoyo_Egg"
+ AccessoryItem: "Monkey_Circlet"
+ FoodItem: "Banana_Juice"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 20
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 1000
+ Speed: 150
+ SpecialPerformance: true
+ AttackRate: 300
+ DefendRate: 800
+ ChangeTargetRate: 400
+ PetScript: <" petloot(20); ">
+ EquipScript: <"
+ bonus(bCritical, 3);
+ bonus(bLuk, -1);
+ ">
+},
+{
+ Id: 1063
+ SpriteName: "LUNATIC"
+ Name: "Lunatic"
+ TamingItem: "Rainbow_Carrot"
+ EggItem: "Lunatic_Egg"
+ AccessoryItem: "Silk_Ribbon"
+ FoodItem: "Carrot_Juice"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 40
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 1500
+ Speed: 150
+ AttackRate: 300
+ DefendRate: 300
+ ChangeTargetRate: 1000
+ PetScript: <" petskillbonus(bLuk, 3, 10, 50); ">
+ EquipScript: <"
+ bonus(bCritical, 2);
+ bonus(bAtk, 2);
+ ">
+},
+{
+ Id: 1077
+ SpriteName: "POISON_SPORE"
+ Name: "Poison Spore"
+ TamingItem: "Deadly_Noxious_Herb"
+ EggItem: "Poison_Spore_Egg"
+ AccessoryItem: "Bark_Shorts"
+ FoodItem: "Pet_Food"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 20
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 1000
+ Speed: 150
+ AttackRate: 600
+ DefendRate: 200
+ ChangeTargetRate: 400
+ PetScript: <" petskillattack("NPC_POISON", 20, 0, 0, 10); ">
+ EquipScript: <"
+ bonus(bStr, 1);
+ bonus(bInt, 1);
+ ">
+},
+{
+ Id: 1101
+ SpriteName: "BAPHOMET_"
+ Name: "Baphomet Jr."
+ TamingItem: "Book_Of_Devil"
+ EggItem: "Bapho_Jr_Egg"
+ AccessoryItem: "Skull_Helm"
+ FoodItem: "Honey"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 10
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 200
+ Speed: 150
+ AttackRate: 1000
+ DefendRate: 100
+ ChangeTargetRate: 200
+ PetScript: <" petskillattack("NPC_DARKNESSATTACK", 1776, 4, 0, 5); ">
+ EquipScript: <"
+ bonus(bDef, 1);
+ bonus(bMdef, 1);
+ bonus2(bResEff, Eff_Stun, -100);
+ ">
+},
+{
+ Id: 1107
+ SpriteName: "DESERT_WOLF_B"
+ Name: "Baby Desert Wolf"
+ TamingItem: "Well_Dried_Bone"
+ EggItem: "Baby_Desert_Wolf_Egg"
+ AccessoryItem: "Transparent_Headgear"
+ FoodItem: "Pet_Food"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 40
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 1000
+ Speed: 150
+ AttackRate: 400
+ DefendRate: 400
+ ChangeTargetRate: 400
+ PetScript: <" petskillattack("SM_PROVOKE", 1, 0, 0, 5);">
+ EquipScript: <"
+ bonus(bInt, 1);
+ bonus(bMaxSP, 50);
+ ">
+},
+{
+ Id: 1109
+ SpriteName: "DEVIRUCHI"
+ Name: "Deviruchi"
+ TamingItem: "Contracts_In_Shadow"
+ EggItem: "Deviruchi_Egg"
+ AccessoryItem: "Pacifier"
+ FoodItem: "Shoot"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 10
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 500
+ Speed: 150
+ AttackRate: 800
+ DefendRate: 200
+ ChangeTargetRate: 100
+ PetScript: <" petskillbonus(bAgiDexStr, 6, 20, 40); ">
+ EquipScript: <"
+ bonus(bMatkRate, 1);
+ bonus(bAtkRate, 1);
+ bonus(bMaxHPrate, -3);
+ bonus(bMaxSPrate, -3);
+ ">
+},
+{
+ Id: 1110
+ SpriteName: "DOKEBI"
+ Name: "Dokebi"
+ TamingItem: "Old_Broom"
+ EggItem: "Dokkaebi_Egg"
+ AccessoryItem: "Wig"
+ FoodItem: "Pet_Food"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 20
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 500
+ Speed: 150
+ AttackRate: 300
+ DefendRate: 300
+ ChangeTargetRate: 800
+ PetScript: <" petskillattack("BS_HAMMERFALL", 1, 0, 0, 10); ">
+ EquipScript: <"
+ bonus(bMatkRate, 1);
+ bonus(bAtkRate, -1);
+ ">
+},
+{
+ Id: 1113
+ SpriteName: "DROPS"
+ Name: "Drops"
+ TamingItem: "Orange_Juice"
+ EggItem: "Drops_Egg"
+ AccessoryItem: "Backpack"
+ FoodItem: "Yellow_Herb"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 40
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 1500
+ Speed: 150
+ SpecialPerformance: true
+ AttackRate: 300
+ DefendRate: 400
+ ChangeTargetRate: 500
+ PetScript: <" petloot(10); ">
+ EquipScript: <"
+ bonus(bHit, 3);
+ bonus(bAtk, 3);
+ ">
+},
+{
+ Id: 1155
+ SpriteName: "PETIT"
+ Name: "Petite"
+ TamingItem: "Shining_Stone"
+ EggItem: "Green_Petite_Egg"
+ AccessoryItem: "Stellar_Hairpin"
+ FoodItem: "Pet_Food"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 20
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 500
+ Speed: 150
+ AttackRate: 800
+ DefendRate: 400
+ ChangeTargetRate: 100
+ PetScript: <" petskillattack("WZ_HEAVENDRIVE", 500, 1, 0, 10); ">
+ EquipScript: <"
+ bonus(bDef, -2);
+ bonus(bMdef, -2);
+ bonus(bAspdRate, 1);
+ ">
+},
+{
+ Id: 1167
+ SpriteName: "SAVAGE_BABE"
+ Name: "Savage Babe"
+ TamingItem: "Sweet_Milk"
+ EggItem: "Savage_Bebe_Egg"
+ AccessoryItem: "Green_Lace"
+ FoodItem: "Pet_Food"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 40
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 1500
+ Speed: 150
+ AttackRate: 500
+ DefendRate: 500
+ ChangeTargetRate: 200
+ PetScript: <" petskillbonus(bVit, 4, 10, 50); ">
+ EquipScript: <"
+ bonus(bVit, 1);
+ bonus(bMaxHP, 50);
+ ">
+},
+{
+ Id: 1170
+ SpriteName: "SOHEE"
+ Name: "Sohee"
+ TamingItem: "Silver_Knife_Of_Chaste"
+ EggItem: "Sohee_Egg"
+ AccessoryItem: "Golden_Bell"
+ FoodItem: "Pet_Food"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 10
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 500
+ Speed: 150
+ AttackRate: 100
+ DefendRate: 1000
+ ChangeTargetRate: 200
+ PetScript: <" petskillsupport(AL_HEAL, 10, 60, 33, 100); ">
+ EquipScript: <"
+ bonus(bStr, 1);
+ bonus(bDex, 1);
+ ">
+},
+{
+ Id: 1188
+ SpriteName: "BON_GUN"
+ Name: "Bon Gun"
+ TamingItem: "Heart_Of_Her"
+ EggItem: "Bongun_Egg"
+ AccessoryItem: "Sword_Of_Grave_Keeper"
+ FoodItem: "Pet_Food"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 30
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 500
+ Speed: 150
+ SpecialPerformance: true
+ AttackRate: 600
+ DefendRate: 200
+ ChangeTargetRate: 400
+ PetScript: <" petskillattack("NPC_DARKNESSATTACK", 555, 1, 1, 1); ">
+ EquipScript: <"
+ bonus(bVit, 1);
+ bonus2(bResEff, Eff_Stun, 100);
+ ">
+},
+{
+ Id: 1200
+ SpriteName: "ZHERLTHSH"
+ Name: "Zealotus"
+ TamingItem: "Prohibition_Red_Candle"
+ EggItem: "Zherlthsh_Egg"
+ FoodItem: "Immortal_Heart"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 10
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 300
+ Speed: 150
+ AttackRate: 1000
+ DefendRate: 100
+ ChangeTargetRate: 500
+ PetScript: <" petskillattack("AS_SONICBLOW", 1, 0, 0, 3); ">
+ EquipScript: <"
+ bonus2(bAddRace, RC_DemiPlayer, 2);
+ bonus2(bMagicAddRace, RC_DemiPlayer, 2);
+ ">
+},
+{
+ Id: 1245
+ SpriteName: "GOBLINE_XMAS"
+ Name: "Christmas Goblin"
+ TamingItem: "Sweet_Candy_Striper"
+ EggItem: "Santa_Goblin_Egg"
+ FoodItem: "Scell"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 50
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 2000
+ Speed: 150
+ AttackRate: 300
+ DefendRate: 300
+ ChangeTargetRate: 800
+ PetScript: <" petskillattack("MG_SIGHT", 5, 0, 5, 5); ">
+ EquipScript: <"
+ bonus(bMaxHP, 30);
+ bonus2(bSubEle, Ele_Water, 1);
+ ">
+},
+{
+ Id: 1275
+ SpriteName: "ALICE"
+ Name: "Alice"
+ TamingItem: "Sway_Apron"
+ EggItem: "Alice_Egg"
+ FoodItem: "White_Potion"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 20
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 800
+ Speed: 150
+ AttackRate: 100
+ DefendRate: 1000
+ ChangeTargetRate: 200
+ PetScript: <" petskillsupport("AL_HEAL", 5, 60, 25, 100); ">
+ EquipScript: <"
+ bonus(bMdef, 1);
+ bonus2(bSubRace, RC_DemiPlayer, 1);
+ ">
+},
+// New Pets
+{
+ Id: 1122
+ SpriteName: "GOBLIN_1"
+ Name: "Goblin"
+ TamingItem: "Knife_Goblin_Ring"
+ EggItem: "Knife_Goblin_Egg"
+ FoodItem: "Green_Apple"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 50
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 800
+ Speed: 150
+ AttackRate: 300
+ DefendRate: 300
+ ChangeTargetRate: 800
+ PetScript: <" petskillattack("NPC_WINDATTACK", 5, 0, 5, 5); ">
+
+},
+{
+ Id: 1123
+ SpriteName: "GOBLIN_2"
+ Name: "Goblin"
+ TamingItem: "Flail_Goblin_Ring"
+ EggItem: "Flail_Goblin_Egg"
+ FoodItem: "Green_Apple"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 50
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 800
+ Speed: 150
+ AttackRate: 300
+ DefendRate: 300
+ ChangeTargetRate: 800
+ PetScript: <" petskillattack("NPC_FIREATTACK", 5, 0, 5, 5); ">
+
+},
+{
+ Id: 1125
+ SpriteName: "GOBLIN_4"
+ Name: "Goblin"
+ TamingItem: "Hammer_Goblin_Ring"
+ EggItem: "Hammer_Goblin_Egg"
+ FoodItem: "Green_Apple"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 50
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 800
+ Speed: 150
+ AttackRate: 300
+ DefendRate: 300
+ ChangeTargetRate: 800
+ PetScript: <" petskillattack("NPC_GROUNDATTACK", 5, 0, 5, 5); ">
+},
+{
+ Id: 1208
+ SpriteName: "WANDER_MAN"
+ Name: "Wanderer"
+ TamingItem: "Skull_Of_Vagabond"
+ EggItem: "Wanderer_Egg"
+ FoodItem: "Spirit_Liquor"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 20
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 800
+ Speed: 150
+ AttackRate: 300
+ DefendRate: 300
+ ChangeTargetRate: 800
+ PetScript: <" petskillattack("NPC_UNDEADATTACK", 5, 0, 5, 5); ">
+},
+{
+ Id: 1382
+ SpriteName: "DIABOLIC"
+ Name: "Diabolic"
+ TamingItem: "Red_Burning_Stone"
+ EggItem: "Diabolic_Egg"
+ FoodItem: "Meat_Veg_Skewer"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 10
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 800
+ Speed: 150
+ AttackRate: 300
+ DefendRate: 300
+ ChangeTargetRate: 800
+ PetScript: <" petskillattack("WZ_METEOR", 2, 0, 5, 5); ">
+},
+{
+ Id: 1385
+ SpriteName: "DELETER_"
+ Name: "Deleter"
+ TamingItem: "Holy_Marble"
+ EggItem: "Red_Deleter_Egg"
+ FoodItem: "Whole_Barbecue"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 20
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 800
+ Speed: 150
+ AttackRate: 300
+ DefendRate: 300
+ ChangeTargetRate: 800
+ PetScript: <" petskillattack("SM_MAGNUM", 5, 0, 5, 5); ">
+},
+{
+ Id: 1879
+ SpriteName: "ECLIPSE_P"
+ Name: "Spring Rabbit"
+ EggItem: "Spring_Rabbit_Egg"
+ FoodItem: "Bok_Choy"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 50
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 2000
+ Speed: 150
+ AttackRate: 300
+ DefendRate: 300
+ ChangeTargetRate: 800
+ PetScript: <" petskillattack("TF_THROWSTONE", 1, 0, 5, 5); ">
+},
+// Episode 12
+{
+ Id: 1963
+ SpriteName: "P_CHUNG_E"
+ Name: "New Year Doll"
+ EggItem: "New_Year_Doll_Egg"
+ FoodItem: "Mojji"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 30
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 800
+ Speed: 150
+ AttackRate: 300
+ DefendRate: 300
+ ChangeTargetRate: 800
+ PetScript: <" petskillattack("CR_SHIELDCHARGE", 5, 0, 5, 5); ">
+},
+// Episode 13
+{
+ Id: 1815
+ SpriteName: "EVENT_RICECAKE"
+ Name: "Rice Cake"
+ EggItem: "Rice_Cake_Egg"
+ FoodItem: "Green_Herb"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 50
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 2000
+ Speed: 150
+ SpecialPerformance: true
+ AttackRate: 500
+ DefendRate: 500
+ ChangeTargetRate: 200
+ PetScript: <" petskillsupport("CR_DEFENDER", 3, 240, 50, 100); ">
+ EquipScript: <"
+ bonus2(bSubEle, Ele_Neutral, 1);
+ bonus(bMaxHPrate, -1);
+ ">
+},
+{
+ Id: 2210
+ SpriteName: "XMAS_LUNATIC"
+ Name: "Christmas Snow Rabbit"
+ EggItem: "Snow_Rabbit_Egg"
+ FoodItem: "Candy"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 10
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ Speed: 150
+ SpecialPerformance: true
+ AttackRate: 300
+ DefendRate: 300
+ ChangeTargetRate: 800
+ EquipScript: <" bonus2(bExpAddRace, RC_All, 5); ">
+},
+// Episode 13.2
+{
+ Id: 1040
+ SpriteName: "GOLEM"
+ Name: "Golem"
+ TamingItem: "Magical_Lithography"
+ EggItem: "Golem_Egg"
+ AccessoryItem: "Windup_Spring"
+ FoodItem: "Mystic_Stone"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 20
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 500
+ Speed: 150
+ AttackRate: 300
+ DefendRate: 300
+ ChangeTargetRate: 800
+ EquipScript: <"
+ bonus(bMaxHP, 100);
+ bonus(bFlee, -5);
+ ">
+},
+{
+ Id: 1143
+ SpriteName: "MARIONETTE"
+ Name: "Marionette"
+ TamingItem: "Delicious_Shaved_Ice"
+ EggItem: "Marionette_Egg"
+ AccessoryItem: "Star_Hairband"
+ FoodItem: "Small_Snow_Flower"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 10
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 500
+ Speed: 150
+ AttackRate: 300
+ DefendRate: 300
+ ChangeTargetRate: 800
+ EquipScript: <" bonus(bSPrecovRate, 3); ">
+},
+{
+ Id: 1148
+ SpriteName: "MEDUSA"
+ Name: "Medusa"
+ TamingItem: "Splendid_Mirror"
+ EggItem: "Medusa_Egg"
+ AccessoryItem: "Queens_Coronet"
+ FoodItem: "Apple_Pudding"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 10
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 200
+ Speed: 150
+ AttackRate: 300
+ DefendRate: 300
+ ChangeTargetRate: 800
+ EquipScript: <"
+ bonus(bVit, 1);
+ bonus2(bResEff, Eff_Stone, 500);
+ ">
+},
+{
+ Id: 1179
+ SpriteName: "WHISPER"
+ Name: "Whisper"
+ TamingItem: "Fit_Pipe"
+ EggItem: "Whisper_Egg"
+ AccessoryItem: "Spirit_Chain_"
+ FoodItem: "Damp_Darkness"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 20
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 500
+ Speed: 150
+ AttackRate: 300
+ DefendRate: 300
+ ChangeTargetRate: 800
+ EquipScript: <"
+ bonus(bFlee, 7);
+ bonus(bDef, -3);
+ ">
+},
+{
+ Id: 1299
+ SpriteName: "GOBLIN_LEADER"
+ Name: "Goblin Leader"
+ TamingItem: "Staff_Of_Leader"
+ EggItem: "Goblin_Leader_Egg"
+ AccessoryItem: "Nice_Badge"
+ FoodItem: "Big_Cell"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 10
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 50
+ Speed: 150
+ AttackRate: 300
+ DefendRate: 300
+ ChangeTargetRate: 800
+ EquipScript: <" bonus2(bAddRace, RC_DemiPlayer, 3); ">
+},
+{
+ Id: 1370
+ SpriteName: "SUCCUBUS"
+ Name: "Succubus"
+ TamingItem: "Boys_Naivety"
+ EggItem: "Succubus_Egg"
+ AccessoryItem: "Black_Butterfly_Mask"
+ FoodItem: "Vital_Flower_"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 10
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 200
+ Speed: 150
+ AttackRate: 300
+ DefendRate: 300
+ ChangeTargetRate: 800
+ EquipScript: <" bonus2(bHPDrainRate, 50, 5); ">
+},
+{
+ Id: 1374
+ SpriteName: "INCUBUS"
+ Name: "Incubus"
+ TamingItem: "Grils_Naivety"
+ EggItem: "Incubus_Egg"
+ AccessoryItem: "Ball_Mask"
+ FoodItem: "Vital_Flower"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 10
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 50
+ Speed: 150
+ AttackRate: 300
+ DefendRate: 300
+ ChangeTargetRate: 800
+ EquipScript: <" bonus(bMaxSPrate, 3); ">
+},
+{
+ Id: 1379
+ SpriteName: "NIGHTMARE_TERROR"
+ Name: "Nightmare Terror"
+ TamingItem: "Hell_Contract"
+ EggItem: "Nightmare_Terror_Egg"
+ AccessoryItem: "Hell_Horn"
+ FoodItem: "Fresh_Plant"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 10
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 200
+ Speed: 150
+ AttackRate: 300
+ DefendRate: 300
+ ChangeTargetRate: 800
+ EquipScript: <" bonus2(bResEff, Eff_Sleep, 10000); ">
+},
+{
+ Id: 1401
+ SpriteName: "SHINOBI"
+ Name: "Shinobi"
+ TamingItem: "Kuloren"
+ EggItem: "Shinobi_Egg"
+ AccessoryItem: "Wine_On_Sleeve"
+ FoodItem: "Grilled_Rice_Cake"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 20
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 500
+ Speed: 150
+ AttackRate: 300
+ DefendRate: 300
+ ChangeTargetRate: 800
+ EquipScript: <" bonus(bAgi, 2); ">
+},
+{
+ Id: 1404
+ SpriteName: "MIYABI_NINGYO"
+ Name: "Miyabi Doll"
+ TamingItem: "Gril_Doll"
+ EggItem: "Miyabi_Ningyo_Egg"
+ AccessoryItem: "Summer_Fan"
+ FoodItem: "Well_Ripened_Berry"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 15
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 200
+ Speed: 150
+ AttackRate: 300
+ DefendRate: 300
+ ChangeTargetRate: 800
+ EquipScript: <"
+ bonus(bInt, 1);
+ bonus(bCastrate, -3);
+ ">
+},
+{
+ Id: 1416
+ SpriteName: "WICKED_NYMPH"
+ Name: "Evil Nymph"
+ TamingItem: "Charming_Lotus"
+ EggItem: "Wicked_Nymph_Egg"
+ AccessoryItem: "Jade_Trinket"
+ FoodItem: "Morning_Dew"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 15
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 500
+ Speed: 150
+ AttackRate: 300
+ DefendRate: 300
+ ChangeTargetRate: 800
+ EquipScript: <"
+ bonus(bMaxSP, 30);
+ bonus(bSPrecovRate, 5);
+ ">
+},
+{
+ Id: 1495
+ SpriteName: "STONE_SHOOTER"
+ Name: "Stone Shooter"
+ TamingItem: "Oilpalm_Coconut"
+ EggItem: "Stone_Shooter_Egg"
+ AccessoryItem: "Apro_Hair"
+ FoodItem: "Plant_Neutrient"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 20
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 500
+ Speed: 150
+ AttackRate: 300
+ DefendRate: 300
+ ChangeTargetRate: 800
+ EquipScript: <" bonus2(bSubEle, Ele_Fire, 3); ">
+},
+{
+ Id: 1504
+ SpriteName: "DULLAHAN"
+ Name: "Dullahan"
+ TamingItem: "Luxury_Whisky_Bottle"
+ EggItem: "Dullahan_Egg"
+ AccessoryItem: "Death_Coil"
+ FoodItem: "Sunset_On_The_Rock"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 10
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 200
+ Speed: 150
+ AttackRate: 300
+ DefendRate: 300
+ ChangeTargetRate: 800
+ EquipScript: <" bonus(bCritAtkRate, 5); ">
+},
+{
+ Id: 1505
+ SpriteName: "LOLI_RURI"
+ Name: "Loli Ruri"
+ TamingItem: "Very_Red_Juice"
+ EggItem: "Loli_Ruri_Egg"
+ AccessoryItem: "Fashionable_Glasses"
+ FoodItem: "Pumpkin_Pie_"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 15
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 200
+ Speed: 150
+ AttackRate: 300
+ DefendRate: 300
+ ChangeTargetRate: 800
+ EquipScript: <"
+ bonus(bMaxHPrate, 3);
+ bonus3(bAutoSpellWhenHit, "AL_HEAL", 1, 50);
+ ">
+},
+{
+ Id: 1513
+ SpriteName: "CIVIL_SERVANT"
+ Name: "Mao Guai"
+ TamingItem: "Fan_Of_Wind"
+ EggItem: "Civil_Servant_Egg"
+ AccessoryItem: "Golden_Earing"
+ FoodItem: "Flavored_Alcohol"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 10
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 500
+ Speed: 150
+ AttackRate: 300
+ DefendRate: 300
+ ChangeTargetRate: 800
+ EquipScript: <" bonus(bMaxSP, 10); ">
+},
+{
+ Id: 1519
+ SpriteName: "CHUNG_E"
+ Name: "Green Maiden"
+ TamingItem: "Tantanmen"
+ EggItem: "Chung_E_Egg"
+ FoodItem: "Bun_"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 50
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 2000
+ Speed: 150
+ AttackRate: 300
+ DefendRate: 300
+ ChangeTargetRate: 800
+ PetScript: <" petskillattack("CR_SHIELDCHARGE", 5, 0, 5, 5); ">
+ EquipScript: <"
+ bonus(bDef, 1);
+ bonus2(bSubRace, RC_DemiPlayer, 1);
+ ">
+},
+{
+ Id: 1586
+ SpriteName: "LEAF_CAT"
+ Name: "Leaf Cat"
+ TamingItem: "Very_Soft_Plant"
+ EggItem: "Leaf_Cat_Egg"
+ AccessoryItem: "Green_Lucky_Bag"
+ FoodItem: "Fish_With_Blue_Back"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 20
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 200
+ Speed: 150
+ AttackRate: 300
+ DefendRate: 300
+ ChangeTargetRate: 800
+ EquipScript: <"
+ bonus2(bSubRace, RC_Brute, 3);
+ ">
+},
+{
+ Id: 1630
+ SpriteName: "BACSOJIN_"
+ Name: "White Lady"
+ TamingItem: "Shiny_Wing_Gown"
+ EggItem: "Bacsojin_Egg"
+ AccessoryItem: "Round_Hair_Ornament"
+ FoodItem: "Traditional_Cookie"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 10
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 2000
+ Speed: 150
+ AttackRate: 300
+ DefendRate: 300
+ ChangeTargetRate: 800
+},
+{
+ Id: 1837
+ SpriteName: "IMP"
+ Name: "Fire Imp"
+ TamingItem: "Flaming_Ice"
+ EggItem: "Imp_Egg"
+ AccessoryItem: "Horn_Protector"
+ FoodItem: "Flame_Gemstone"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 10
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 200
+ Speed: 150
+ AttackRate: 300
+ DefendRate: 300
+ ChangeTargetRate: 800
+ EquipScript: <"
+ bonus2(bSubEle, Ele_Fire, 2);
+ bonus2(bAddEle, Ele_Fire, 2);
+ ">
+},
+// Episode 13.2 Brasilis
+{
+ Id: 2057
+ SpriteName: "E_CRAMP"
+ Name: "Strange Cramp"
+ TamingItem: "Leaf_Cat_Ball"
+ EggItem: "Mystic_Leaf_Cat_Ball"
+ CaptureRate: 50
+ AttackRate: 350
+ DefendRate: 400
+ ChangeTargetRate: 800
+},
+{
+ Id: 2081
+ SpriteName: "E_HYDRA"
+ Name: "Strange Hydra"
+ TamingItem: "Leaf_Cat_Ball"
+ EggItem: "Mystic_Leaf_Cat_Ball"
+ CaptureRate: 50
+ AttackRate: 350
+ DefendRate: 400
+ ChangeTargetRate: 800
+},
+)
diff --git a/db/pre-re/pet_db.txt b/db/pre-re/pet_db.txt
deleted file mode 100644
index c0f3a3e91..000000000
--- a/db/pre-re/pet_db.txt
+++ /dev/null
@@ -1,124 +0,0 @@
-// Pet Database
-//
-// Structure of Database:
-// MobID,Name,JName,LureID,EggID,EquipID,FoodID,Fullness,HungryDelay,R_Hungry,R_Full,Intimate,Die,Capture,Speed,S_Performance,talk_convert_class,attack_rate,defence_attack_rate,change_target_rate,pet_script,loyal_script
-//
-// 01. MobID Monster ID of the pet.
-// 02. Name Name of the monster as defined in the database.
-// 03. JName The display name of the monster when hatched.
-// 04. LureID Pet Tame Item ID.
-// 05. EggID Pet Egg ID.
-// 06. EquipID Pet Accessory ID.
-// 07. FoodID Pet Food ID.
-// 08. Fullness The amount of hunger points increasing with each feeding.
-// 09. HungryDelay The amount of time it takes for hunger to decrease after feeding. (Default: 60 seconds)
-// 10. R_Hungry Amount of Intimacy that is increased when fed.
-// 11. R_Full Amount of Intimacy that is decreased when over-fed.
-// 12. Intimate Amount of Intimacy the pet starts with.
-// 13. Die Amount of Intimacy that is decreased when the pet owner dies.
-// 14. Capture Capture succes rate (10000 = 100%)
-// 15. Speed Pet's walk speed. (Defaul: 150)
-// 16. S_Performance Special Performance. (Yes = 1, No = 0)
-// 17. talk_convert_class Disables pet talk (instead of talking they emote with /!.)
-// 18. attack_rate Rate of which the pet will attack (requires at least pet_support_min_friendly intimacy).
-// 19. defence_attack_rate Rate of which the pet will retaliate when master is being attacked (requires at least pet_support_min_friendly intimacy).
-// 20. change_target_rate Rate of which the pet will change its attack target.
-// 21. pet_script Script to execute when the pet is hatched.
-// 22. loyal_script Script to execute when the pet is hatched (requires at least pet_equip_min_friendly intimacy, independent of pet_script).
-// NOTE: The max value (100%) of attack_rate, defense_rate & change_target_rate is 10000.
-
-// In theory you can use any valid script, but it is run only once upon pet
-// loading, so it is recommended you use the specific pet scripts:
-
-// petskillattack skillid, skilllv, hits, rate, bonusrate Skill attack that
-// triggers while the pet is attacking. Rate is the base chance of execution
-// per attack. Bonusrate is an additional success rate when intimacy reaches
-// max. If hits is specified and different than 0, it will make the pet cast
-// the skill with a fixed amount of damage inflicted and the specified number
-// of hits. A value of zero uses the skill's defaults.
-
-// petskillsupport skillid, skilllv, delay, hp%, sp% Casts a support skill when
-// the health levels are below the specified hp% and sp%. Delay is the minimum
-// time in seconds before the skill can be cast again
-
-// petrecovery type, delay: Cures the "type" status effect after "delay"
-// seconds
-
-// petskillbonus type, value, duration, delay Gives bonus stats. Type is the
-// stat to increase (bStr, bLuk), value is the amount by which it is increased,
-// duration signals how long the bonus lasts delay is the time elapsed after
-// the bonus ends and before it starts again.
-
-// A single pet can have petloot, petskillbonus, petskillattack and
-// petskillsupport at the same time, but only one of each.
-
-// Core
-1002,PORING,Poring,619,9001,10013,531,80,60,50,100,250,20,2000,150,1,0,350,400,800,{ petloot 10; },{ bonus bLuk,2; bonus bCritical,1; }
-1011,CHONCHON,ChonChon,624,9006,10002,537,80,60,30,100,250,20,1500,150,1,0,500,500,250,{ petskillbonus bAgi,4,10,50; },{ bonus bAgi,1; bonus bFlee,2; }
-1014,SPORE,Spore,630,9012,10017,537,80,60,30,100,250,20,1500,150,0,0,350,500,500,{ petrecovery SC_POISON,60; },{ bonus bHit,5; bonus bAtk,-2; }
-1019,PECOPECO,PecoPeco,632,9014,10010,537,80,60,30,100,250,20,1000,150,1,0,400,500,800,{ petskillbonus bSpeedRate,25,20,20; },{ bonus bMaxHP,150; bonus bMaxSP,-10; }
-1023,ORK_WARRIOR,Orc Warrior,635,9017,10009,537,80,60,20,100,250,20,500,150,1,0,600,200,300,{ petskillattack "NPC_PIERCINGATT",100,1,0,10; },{ bonus bAtk,10; bonus bDef,-3; }
-1026,MUNAK,Munak,636,9018,10008,537,80,60,20,100,250,20,500,150,0,0,300,750,300,{ petskillattack "NPC_DARKNESSATTACK",444,1,0,10; },{ bonus bInt,1; bonus bDef,1; }
-1029,ISIS,Isis,639,9021,10006,537,80,60,10,100,250,20,500,150,0,0,650,450,150,{ petskillsupport "PR_MAGNIFICAT",2,60,50,50; },{ bonus bMatkRate,-1; bonus bAtkRate,1; }
-1031,POPORING,Poporing,621,9003,10013,511,80,60,30,100,250,20,1000,150,1,0,300,500,400,{ petloot 15; },{ bonus bLuk,2; bonus2 bSubEle,Ele_Poison,10; }
-1035,HUNTER_FLY,Hunter Fly,626,9008,10002,716,80,60,10,100,250,20,500,150,1,0,500,500,200,{ petskillattack "NPC_WINDATTACK",888,2,0,10; },{ bonus bFlee,-5; bonus bFlee2,2; }
-1042,STEEL_CHONCHON,Steel ChonChon,625,9007,10002,1002,80,60,20,100,250,20,1000,150,1,0,500,500,200,{ petskillbonus bAgiVit,4,20,40; },{ bonus bFlee,6; bonus bAgi,-1; }
-1049,PICKY,Picky,623,9005,10012,507,80,60,40,100,250,20,2000,150,1,0,500,600,50,{ petskillbonus bStr,3,10,50;},{ bonus bStr,1; bonus bAtk,5; }
-1052,ROCKER,Rocker,629,9011,10014,537,80,60,30,100,250,20,1500,150,0,0,350,350,600,{ petskillbonus bAllStats,1,10,50; },{ bonus bHPrecovRate,5; bonus bMaxHP,25; }
-1056,SMOKIE,Smokie,633,9015,10019,537,80,60,30,100,250,20,1000,150,1,0,600,600,100,{ petskillbonus bPerfectHide,1,3600,0; },{ bonus bAgi,1; bonus bFlee2,1; }
-1057,YOYO,Yoyo,634,9016,10018,532,80,60,20,100,250,20,1000,150,1,0,300,800,400,{ petloot 20; },{ bonus bCritical,3; bonus bLuk,-1; }
-1063,LUNATIC,Lunatic,622,9004,10007,534,80,60,40,100,250,20,1500,150,0,0,300,300,1000,{ petskillbonus bLuk,3,10,50; },{ bonus bCritical,2; bonus bAtk,2; }
-1077,POISON_SPORE,Poison Spore,631,9013,10017,537,80,60,20,100,250,20,1000,150,0,0,600,200,400,{ petskillattack "NPC_POISON",20,0,0,10; },{ bonus bStr,1; bonus bInt,1; }
-1101,BAPHOMET_,Baphomet Jr.,642,9024,10001,518,80,60,10,100,250,20,200,150,0,0,1000,100,200,{ petskillattack "NPC_DARKNESSATTACK",1776,4,0,5; },{ bonus bDef,1; bonus bMdef,1; bonus2 bResEff,Eff_Stun,-100; }
-1107,DESERT_WOLF_B,Baby Desert Wolf,628,9010,10003,537,80,60,40,100,250,20,1000,150,0,0,400,400,400,{ petskillattack "SM_PROVOKE",1,0,0,5;},{ bonus bInt,1; bonus bMaxSP,50; }
-1109,DEVIRUCHI,Deviruchi,641,9023,10004,711,80,60,10,100,250,20,500,150,0,0,800,200,100,{ petskillbonus bAgiDexStr,6,20,40; },{ bonus bMatkRate,1; bonus bAtkRate,1; bonus bMaxHPrate,-3; bonus bMaxSPrate,-3; }
-1110,DOKEBI,Dokebi,637,9019,10005,537,80,60,20,100,250,20,500,150,0,0,300,300,800,{ petskillattack "BS_HAMMERFALL",1,0,0,10; },{ bonus bMatkRate,1; bonus bAtkRate,-1; }
-1113,DROPS,Drops,620,9002,10013,508,80,60,40,100,250,20,1500,150,1,0,300,400,500,{ petloot 10; },{ bonus bHit,3; bonus bAtk,3; }
-1155,PETIT,Petite,640,9022,10011,537,80,60,20,100,250,20,500,150,0,0,800,400,100,{ petskillattack "WZ_HEAVENDRIVE",500,1,0,10; },{ bonus bDef,-2; bonus bMdef,-2; bonus bAspdRate,1; }
-1167,SAVAGE_BABE,Savage Babe,627,9009,10015,537,80,60,40,100,250,20,1500,150,0,0,500,500,200,{ petskillbonus bVit,4,10,50; },{ bonus bVit,1; bonus bMaxHP,50; }
-1170,SOHEE,Sohee,638,9020,10016,537,80,60,10,100,250,20,500,150,0,0,100,1000,200,{ petskillsupport AL_HEAL,10,60,33,100; },{ bonus bStr,1; bonus bDex,1; }
-1188,BON_GUN,Bon Gun,659,9025,10020,537,80,60,30,100,250,20,500,150,1,0,600,200,400,{ petskillattack "NPC_DARKNESSATTACK",555,1,1,1; },{ bonus bVit,1; bonus2 bResEff,Eff_Stun,100; }
-1200,ZHERLTHSH,Zealotus,660,9026,0,929,80,60,10,100,250,20,300,150,0,0,1000,100,500,{ petskillattack "AS_SONICBLOW",1,0,0,3; },{ bonus2 bAddRace,RC_DemiPlayer,2; bonus2 bMagicAddRace,RC_DemiPlayer,2; }
-1245,GOBLINE_XMAS,Christmas Goblin,12225,9029,0,911,80,60,50,100,250,20,2000,150,0,0,300,300,800,{ petskillattack "MG_SIGHT",5,0,5,5; },{ bonus bMaxHP,30; bonus2 bSubEle,Ele_Water,1; }
-1275,ALICE,Alice,661,9027,0,504,80,60,20,100,250,20,800,150,0,0,100,1000,200,{ petskillsupport "AL_HEAL",5,60,25,100; },{ bonus bMdef,1; bonus2 bSubRace,RC_DemiPlayer,1; }
-
-// New Pets
-1122,GOBLIN_1,Goblin,14569,9032,0,7821,80,60,50,100,250,20,800,150,0,0,300,300,800,{ petskillattack "NPC_WINDATTACK",5,0,5,5; },{}
-1123,GOBLIN_2,Goblin,14570,9033,0,7821,80,60,50,100,250,20,800,150,0,0,300,300,800,{ petskillattack "NPC_FIREATTACK",5,0,5,5; },{}
-1125,GOBLIN_4,Goblin,14571,9034,0,7821,80,60,50,100,250,20,800,150,0,0,300,300,800,{ petskillattack "NPC_GROUNDATTACK",5,0,5,5; },{}
-1208,WANDER_MAN,Wanderer,14574,9037,0,7824,80,60,20,100,250,20,800,150,0,0,300,300,800,{ petskillattack "NPC_UNDEADATTACK",5,0,5,5; },{}
-1382,DIABOLIC,Diabolic,14573,9036,0,7823,80,60,10,100,250,20,800,150,0,0,300,300,800,{ petskillattack "WZ_METEOR",2,0,5,5; },{}
-1385,DELETER_,Deleter,14572,9035,0,7822,80,60,20,100,250,20,800,150,0,0,300,300,800,{ petskillattack "SM_MAGNUM",5,0,5,5; },{}
-1879,ECLIPSE_P,Spring Rabbit,0,9031,0,7766,80,60,50,100,250,20,2000,150,0,0,300,300,800,{ petskillattack "TF_THROWSTONE",1,0,5,5; },{}
-
-// Episode 12
-1963,P_CHUNG_E,New Year Doll,0,9038,0,554,80,60,30,100,250,20,800,150,0,0,300,300,800,{ petskillattack "CR_SHIELDCHARGE",5,0,5,5; },{}
-
-// Episode 13
-1815,EVENT_RICECAKE,Rice Cake,0,9028,0,511,80,60,50,100,250,20,2000,150,1,0,500,500,200,{ petskillsupport "CR_DEFENDER",3,240,50,100; },{ bonus2 bSubEle,Ele_Neutral,1; bonus bMaxHPrate,-1; }
-2210,XMAS_LUNATIC,Christmas Snow Rabbit,0,9058,0,529,80,60,10,100,250,20,0,150,1,0,300,300,800,{},{ bonus2 bExpAddRace,RC_All,5; }
-
-// Episode 13.2
-1040,GOLEM,Golem,12371,9053,10035,6111,80,60,20,100,250,20,500,150,0,0,300,300,800,{},{ bonus bMaxHP,100; bonus bFlee,-5; }
-1143,MARIONETTE,Marionette,12361,9043,10025,6098,80,60,10,100,250,20,500,150,0,0,300,300,800,{},{ bonus bSPrecovRate,3; }
-1148,MEDUSA,Medusa,12368,9050,10032,6108,80,60,10,100,250,20,200,150,0,0,300,300,800,{},{ bonus bVit,1; bonus2 bResEff,Eff_Stone,500; }
-1179,WHISPER,Whisper,12363,9045,10027,6100,80,60,20,100,250,20,500,150,0,0,300,300,800,{},{ bonus bFlee,7; bonus bDef,-3; }
-1299,GOBLIN_LEADER,Goblin Leader,12364,9046,10028,6104,80,60,10,100,250,20,50,150,0,0,300,300,800,{},{ bonus2 bAddRace,RC_DemiPlayer,3; }
-1370,SUCCUBUS,Succubus,12373,9055,10037,6113,80,60,10,100,250,20,200,150,0,0,300,300,800,{},{ bonus2 bHPDrainRate,50,5; }
-1374,INCUBUS,Incubus,12370,9052,10034,6110,80,60,10,100,250,20,50,150,0,0,300,300,800,{},{ bonus bMaxSPrate,3; }
-1379,NIGHTMARE_TERROR,Nightmare Terror,12372,9054,10036,6112,80,60,10,100,250,20,200,150,0,0,300,300,800,{},{ bonus2 bResEff,Eff_Sleep,10000; }
-1401,SHINOBI,Shinobi,12362,9044,10026,6099,80,60,20,100,250,20,500,150,0,0,300,300,800,{},{ bonus bAgi,2; }
-1404,MIYABI_NINGYO,Miyabi Doll,12366,9048,10030,6106,80,60,15,100,250,20,200,150,0,0,300,300,800,{},{ bonus bInt,1; bonus bCastrate,-3; }
-1416,WICKED_NYMPH,Evil Nymph,12365,9047,10029,6105,80,60,15,100,250,20,500,150,0,0,300,300,800,{},{ bonus bMaxSP,30; bonus bSPrecovRate,5; }
-1495,STONE_SHOOTER,Stone Shooter,12369,9051,10033,6109,80,60,20,100,250,20,500,150,0,0,300,300,800,{},{ bonus2 bSubEle,Ele_Fire,3; }
-1504,DULLAHAN,Dullahan,12367,9049,10031,6107,80,60,10,100,250,20,200,150,0,0,300,300,800,{},{ bonus bCritAtkRate,5; }
-1505,LOLI_RURI,Loli Ruri,12360,9042,10024,6097,80,60,15,100,250,20,200,150,0,0,300,300,800,{},{ bonus bMaxHPrate,3; bonus3 bAutoSpellWhenHit,"AL_HEAL",1,50; }
-1513,CIVIL_SERVANT,Mao Guai,12358,9040,10022,6095,80,60,10,100,250,20,500,150,0,0,300,300,800,{},{ bonus bMaxSP,10; }
-1519,CHUNG_E,Green Maiden,12395,9030,0,6115,80,60,50,100,250,20,2000,150,0,0,300,300,800,{ petskillattack "CR_SHIELDCHARGE",5,0,5,5; },{ bonus bDef,1; bonus2 bSubRace,RC_DemiPlayer,1; }
-1586,LEAF_CAT,Leaf Cat,12359,9041,10023,6096,80,60,20,100,250,20,200,150,0,0,300,300,800,{},{ bonus2 bSubRace,RC_Brute,3; }
-1630,BACSOJIN_,White Lady,12357,9039,10021,6094,80,60,10,100,250,20,2000,150,0,0,300,300,800,{},{}
-1837,IMP,Fire Imp,12374,9056,10038,6114,80,60,10,100,250,20,200,150,0,0,300,300,800,{},{ bonus2 bSubEle,Ele_Fire,2; bonus2 bAddEle,Ele_Fire,2; }
-
-// Episode 13.2 Brasilis
-2057,E_CRAMP,Strange Cramp,12408,6221,0,0,0,0,0,0,0,0,50,0,0,0,350,400,800,{},{} // kRO version
-2081,E_HYDRA,Strange Hydra,12408,6221,0,0,0,0,0,0,0,0,50,0,0,0,350,400,800,{},{} // iRO/cRO version
diff --git a/db/re/pet_db.conf b/db/re/pet_db.conf
new file mode 100644
index 000000000..6d6083e59
--- /dev/null
+++ b/db/re/pet_db.conf
@@ -0,0 +1,1649 @@
+//================= Hercules Database =====================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//================= License ===============================================
+//= This file is part of Hercules.
+//= http://herc.ws - http://github.com/HerculesWS/Hercules
+//=
+//= Copyright (C) 2018 Hercules Dev Team
+//=
+//= Hercules is free software: you can redistribute it and/or modify
+//= it under the terms of the GNU General Public License as published by
+//= the Free Software Foundation, either version 3 of the License, or
+//= (at your option) any later version.
+//=
+//= This program is distributed in the hope that it will be useful,
+//= but WITHOUT ANY WARRANTY; without even the implied warranty of
+//= MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//= GNU General Public License for more details.
+//=
+//= You should have received a copy of the GNU General Public License
+//= along with this program. If not, see <http://www.gnu.org/licenses/>.
+//=========================================================================
+//= Pets Database
+//=========================================================================
+
+pet_db:(
+/**************************************************************************
+ ************* Entry structure ********************************************
+ **************************************************************************
+{
+ // ================ Mandatory fields ==============================
+ Id: ID (int)
+ SpriteName: "Sprite_Name" (string)
+ Name: "Pet Name" (string)
+ // ================ Optional fields ===============================
+ TamingItem: Taming Item (string, defaults to 0)
+ EggItem: Egg Id (string, defaults to 0)
+ AccessoryItem: Equipment Id (string, defaults to 0)
+ FoodItem: Food Id (string, defaults to 0)
+ FoodEffectiveness: hunger points (int, defaults to 0)
+ HungerDelay: hunger time (int, defaults to 0)
+ Intimacy: {
+ Initial: start intimacy (int, defaults to 0)
+ FeedIncrement: feeding intimacy (int, defaults to 0)
+ OverFeedDecrement: overfeeding intimacy (int, defaults to 0)
+ OwnerDeathDecrement: owner die intimacy (int, defaults to 0)
+ }
+ CaptureRate: capture rate (int, defaults to 0)
+ Speed: speed (int, defaults to 0)
+ SpecialPerformance: true/false (boolean, defaults to false)
+ TalkWithEmotes: convert talk (boolean, defaults to false)
+ AttackRate: attack rate (int, defaults to 0)
+ DefendRate: Defence attack (int, defaults to 0)
+ ChangeTargetRate: change target (int, defaults to 0)
+ PetScript: <" Pet Script (can also be multi-line) ">
+ EquipScript: <" Equip Script (can also be multi-line) ">
+},
+**************************************************************************/
+{
+ Id: 1002
+ SpriteName: "PORING"
+ Name: "Poring"
+ TamingItem: "Unripe_Apple"
+ EggItem: "Poring_Egg"
+ AccessoryItem: "Backpack"
+ FoodItem: "Apple_Juice"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 50
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 2000
+ Speed: 150
+ SpecialPerformance: true
+ AttackRate: 350
+ DefendRate: 400
+ ChangeTargetRate: 800
+ PetScript: <" petloot(10); ">
+ EquipScript: <"
+ bonus(bLuk, 2);
+ bonus(bCritical, 1);
+ ">
+},
+{
+ Id: 1011
+ SpriteName: "CHONCHON"
+ Name: "ChonChon"
+ TamingItem: "Rotten_Fish"
+ EggItem: "Chonchon_Egg"
+ AccessoryItem: "Monster_Oxygen_Mask"
+ FoodItem: "Pet_Food"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 30
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 1500
+ Speed: 150
+ SpecialPerformance: true
+ AttackRate: 500
+ DefendRate: 500
+ ChangeTargetRate: 250
+ PetScript: <" petskillbonus(bAgi, 4, 10, 50); ">
+ EquipScript: <"
+ bonus(bAgi, 1);
+ bonus(bFlee, 2);
+ ">
+},
+{
+ Id: 1014
+ SpriteName: "SPORE"
+ Name: "Spore"
+ TamingItem: "Dew_Laden_Moss"
+ EggItem: "Spore_Egg"
+ AccessoryItem: "Bark_Shorts"
+ FoodItem: "Pet_Food"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 30
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 1500
+ Speed: 150
+ AttackRate: 350
+ DefendRate: 500
+ ChangeTargetRate: 500
+ PetScript: <" petrecovery(SC_POISON, 60); ">
+ EquipScript: <"
+ bonus(bHit, 5);
+ bonus(bAtk, -2);
+ ">
+},
+{
+ Id: 1019
+ SpriteName: "PECOPECO"
+ Name: "PecoPeco"
+ TamingItem: "Fatty_Chubby_Earthworm"
+ EggItem: "PecoPeco_Egg"
+ AccessoryItem: "Battered_Pot"
+ FoodItem: "Pet_Food"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 30
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 1000
+ Speed: 150
+ SpecialPerformance: true
+ AttackRate: 400
+ DefendRate: 500
+ ChangeTargetRate: 800
+ PetScript: <" petskillbonus(bSpeedRate, 25, 20, 20); ">
+ EquipScript: <"
+ bonus(bMaxHP, 150);
+ bonus(bMaxSP, -10);
+ ">
+},
+{
+ Id: 1023
+ SpriteName: "ORK_WARRIOR"
+ Name: "Orc Warrior"
+ TamingItem: "Horror_Of_Tribe"
+ EggItem: "Orc_Warrior_Egg"
+ AccessoryItem: "Wild_Flower"
+ FoodItem: "Pet_Food"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 20
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 500
+ Speed: 150
+ SpecialPerformance: true
+ AttackRate: 600
+ DefendRate: 200
+ ChangeTargetRate: 300
+ PetScript: <" petskillattack("NPC_PIERCINGATT", 100, 1, 0, 10); ">
+ EquipScript: <"
+ bonus(bAtk, 10);
+ bonus(bDef, -3);
+ ">
+},
+{
+ Id: 1026
+ SpriteName: "MUNAK"
+ Name: "Munak"
+ TamingItem: "No_Recipient"
+ EggItem: "Munak_Egg"
+ AccessoryItem: "Punisher"
+ FoodItem: "Pet_Food"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 20
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 500
+ Speed: 150
+ AttackRate: 300
+ DefendRate: 750
+ ChangeTargetRate: 300
+ PetScript: <" petskillattack("NPC_DARKNESSATTACK", 444, 1, 0, 10); ">
+ EquipScript: <"
+ bonus(bInt, 1);
+ bonus(bDef, 1);
+ ">
+},
+{
+ Id: 1029
+ SpriteName: "ISIS"
+ Name: "Isis"
+ TamingItem: "Armlet_Of_Obedience"
+ EggItem: "Isis_Egg"
+ AccessoryItem: "Queens_Hair_Ornament"
+ FoodItem: "Pet_Food"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 10
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 500
+ Speed: 150
+ AttackRate: 650
+ DefendRate: 450
+ ChangeTargetRate: 150
+ PetScript: <" petskillsupport("PR_MAGNIFICAT", 2, 60, 50, 50); ">
+ EquipScript: <"
+ bonus(bMatkRate, -1);
+ bonus(bAtkRate, 1);
+ ">
+},
+{
+ Id: 1031
+ SpriteName: "POPORING"
+ Name: "Poporing"
+ TamingItem: "Bitter_Herb"
+ EggItem: "Poporing_Egg"
+ AccessoryItem: "Backpack"
+ FoodItem: "Green_Herb"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 30
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 1000
+ Speed: 150
+ SpecialPerformance: true
+ AttackRate: 300
+ DefendRate: 500
+ ChangeTargetRate: 400
+ PetScript: <" petloot(15); ">
+ EquipScript: <"
+ bonus(bLuk, 2);
+ bonus2(bSubEle, Ele_Poison, 10);
+ ">
+},
+{
+ Id: 1035
+ SpriteName: "HUNTER_FLY"
+ Name: "Hunter Fly"
+ TamingItem: "Monster_Juice"
+ EggItem: "Hunter_Fly_Egg"
+ AccessoryItem: "Monster_Oxygen_Mask"
+ FoodItem: "Red_Gemstone"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 10
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 500
+ Speed: 150
+ SpecialPerformance: true
+ AttackRate: 500
+ DefendRate: 500
+ ChangeTargetRate: 200
+ PetScript: <" petskillattack("NPC_WINDATTACK", 888, 2, 0, 10); ">
+ EquipScript: <"
+ bonus(bFlee, -5);
+ bonus(bFlee2, 2);
+ ">
+},
+{
+ Id: 1042
+ SpriteName: "STEEL_CHONCHON"
+ Name: "Steel ChonChon"
+ TamingItem: "Lusty_Iron"
+ EggItem: "Steel_Chonchon_Egg"
+ AccessoryItem: "Monster_Oxygen_Mask"
+ FoodItem: "Iron_Ore"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 20
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 1000
+ Speed: 150
+ SpecialPerformance: true
+ AttackRate: 500
+ DefendRate: 500
+ ChangeTargetRate: 200
+ PetScript: <" petskillbonus(bAgiVit, 4, 20, 40); ">
+ EquipScript: <"
+ bonus(bFlee, 6);
+ bonus(bAgi, -1);
+ ">
+},
+{
+ Id: 1049
+ SpriteName: "PICKY"
+ Name: "Picky"
+ TamingItem: "Earthworm_The_Dude"
+ EggItem: "Picky_Egg"
+ AccessoryItem: "Tiny_Egg_Shell"
+ FoodItem: "Red_Herb"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 40
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 2000
+ Speed: 150
+ SpecialPerformance: true
+ AttackRate: 500
+ DefendRate: 600
+ ChangeTargetRate: 50
+ PetScript: <" petskillbonus(bStr, 3, 10, 50); ">
+ EquipScript: <"
+ bonus(bStr, 1);
+ bonus(bAtk, 5);
+ ">
+},
+{
+ Id: 1052
+ SpriteName: "ROCKER"
+ Name: "Rocker"
+ TamingItem: "Singing_Flower"
+ EggItem: "Rocker_Egg"
+ AccessoryItem: "Rocker_Glasses"
+ FoodItem: "Pet_Food"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 30
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 1500
+ Speed: 150
+ AttackRate: 350
+ DefendRate: 350
+ ChangeTargetRate: 600
+ PetScript: <" petskillbonus(bAllStats, 1, 10, 50); ">
+ EquipScript: <"
+ bonus(bHPrecovRate, 5);
+ bonus(bMaxHP, 25);
+ ">
+},
+{
+ Id: 1056
+ SpriteName: "SMOKIE"
+ Name: "Smokie"
+ TamingItem: "Baked_Yam"
+ EggItem: "Smokie_Egg"
+ AccessoryItem: "Red_Muffler"
+ FoodItem: "Pet_Food"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 30
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 1000
+ Speed: 150
+ SpecialPerformance: true
+ AttackRate: 600
+ DefendRate: 600
+ ChangeTargetRate: 100
+ PetScript: <" petskillbonus(bPerfectHide, 1, 3600, 0); ">
+ EquipScript: <"
+ bonus(bAgi, 1);
+ bonus(bFlee2, 1);
+ ">
+},
+{
+ Id: 1057
+ SpriteName: "YOYO"
+ Name: "Yoyo"
+ TamingItem: "Tropical_Banana"
+ EggItem: "Yoyo_Egg"
+ AccessoryItem: "Monkey_Circlet"
+ FoodItem: "Banana_Juice"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 20
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 1000
+ Speed: 150
+ SpecialPerformance: true
+ AttackRate: 300
+ DefendRate: 800
+ ChangeTargetRate: 400
+ PetScript: <" petloot(20); ">
+ EquipScript: <"
+ bonus(bCritical, 3);
+ bonus(bLuk, -1);
+ ">
+},
+{
+ Id: 1063
+ SpriteName: "LUNATIC"
+ Name: "Lunatic"
+ TamingItem: "Rainbow_Carrot"
+ EggItem: "Lunatic_Egg"
+ AccessoryItem: "Silk_Ribbon"
+ FoodItem: "Carrot_Juice"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 40
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 1500
+ Speed: 150
+ AttackRate: 300
+ DefendRate: 300
+ ChangeTargetRate: 1000
+ PetScript: <" petskillbonus(bLuk, 3, 10, 50); ">
+ EquipScript: <"
+ bonus(bCritical, 2);
+ bonus(bAtk, 2);
+ ">
+},
+{
+ Id: 1077
+ SpriteName: "POISON_SPORE"
+ Name: "Poison Spore"
+ TamingItem: "Deadly_Noxious_Herb"
+ EggItem: "Poison_Spore_Egg"
+ AccessoryItem: "Bark_Shorts"
+ FoodItem: "Pet_Food"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 20
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 1000
+ Speed: 150
+ AttackRate: 600
+ DefendRate: 200
+ ChangeTargetRate: 400
+ PetScript: <" petskillattack("NPC_POISON", 20, 0, 0, 10); ">
+ EquipScript: <"
+ bonus(bStr, 1);
+ bonus(bInt, 1);
+ ">
+},
+{
+ Id: 1101
+ SpriteName: "BAPHOMET_"
+ Name: "Baphomet Jr."
+ TamingItem: "Book_Of_Devil"
+ EggItem: "Bapho_Jr_Egg"
+ AccessoryItem: "Skull_Helm"
+ FoodItem: "Honey"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 10
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 200
+ Speed: 150
+ AttackRate: 1000
+ DefendRate: 100
+ ChangeTargetRate: 200
+ PetScript: <" petskillattack("NPC_DARKNESSATTACK", 1776, 4, 0, 5); ">
+ EquipScript: <"
+ bonus(bDef, 1);
+ bonus(bMdef, 1);
+ bonus2(bResEff, Eff_Stun, -100);
+ ">
+},
+{
+ Id: 1107
+ SpriteName: "DESERT_WOLF_B"
+ Name: "Baby Desert Wolf"
+ TamingItem: "Well_Dried_Bone"
+ EggItem: "Baby_Desert_Wolf_Egg"
+ AccessoryItem: "Transparent_Headgear"
+ FoodItem: "Pet_Food"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 40
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 1000
+ Speed: 150
+ AttackRate: 400
+ DefendRate: 400
+ ChangeTargetRate: 400
+ PetScript: <" petskillattack("SM_PROVOKE", 1, 0, 0, 5);">
+ EquipScript: <"
+ bonus(bInt, 1);
+ bonus(bMaxSP, 50);
+ ">
+},
+{
+ Id: 1109
+ SpriteName: "DEVIRUCHI"
+ Name: "Deviruchi"
+ TamingItem: "Contracts_In_Shadow"
+ EggItem: "Deviruchi_Egg"
+ AccessoryItem: "Pacifier"
+ FoodItem: "Shoot"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 10
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 500
+ Speed: 150
+ AttackRate: 800
+ DefendRate: 200
+ ChangeTargetRate: 100
+ PetScript: <" petskillbonus(bAgiDexStr, 6, 20, 40); ">
+ EquipScript: <"
+ bonus(bMatkRate, 1);
+ bonus(bAtkRate, 1);
+ bonus(bMaxHPrate, -3);
+ bonus(bMaxSPrate, -3);
+ ">
+},
+{
+ Id: 1110
+ SpriteName: "DOKEBI"
+ Name: "Dokebi"
+ TamingItem: "Old_Broom"
+ EggItem: "Dokkaebi_Egg"
+ AccessoryItem: "Wig"
+ FoodItem: "Pet_Food"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 20
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 500
+ Speed: 150
+ AttackRate: 300
+ DefendRate: 300
+ ChangeTargetRate: 800
+ PetScript: <" petskillattack("BS_HAMMERFALL", 1, 0, 0, 10); ">
+ EquipScript: <"
+ bonus(bMatkRate, 1);
+ bonus(bAtkRate, -1);
+ ">
+},
+{
+ Id: 1113
+ SpriteName: "DROPS"
+ Name: "Drops"
+ TamingItem: "Orange_Juice"
+ EggItem: "Drops_Egg"
+ AccessoryItem: "Backpack"
+ FoodItem: "Yellow_Herb"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 40
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 1500
+ Speed: 150
+ SpecialPerformance: true
+ AttackRate: 300
+ DefendRate: 400
+ ChangeTargetRate: 500
+ PetScript: <" petloot(10); ">
+ EquipScript: <"
+ bonus(bHit, 3);
+ bonus(bAtk, 3);
+ ">
+},
+{
+ Id: 1155
+ SpriteName: "PETIT"
+ Name: "Petite"
+ TamingItem: "Shining_Stone"
+ EggItem: "Green_Petite_Egg"
+ AccessoryItem: "Stellar_Hairpin"
+ FoodItem: "Pet_Food"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 20
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 500
+ Speed: 150
+ AttackRate: 800
+ DefendRate: 400
+ ChangeTargetRate: 100
+ PetScript: <" petskillattack("WZ_HEAVENDRIVE", 500, 1, 0, 10); ">
+ EquipScript: <"
+ bonus(bDef, -2);
+ bonus(bMdef, -2);
+ bonus(bAspdRate, 1);
+ ">
+},
+{
+ Id: 1167
+ SpriteName: "SAVAGE_BABE"
+ Name: "Savage Babe"
+ TamingItem: "Sweet_Milk"
+ EggItem: "Savage_Bebe_Egg"
+ AccessoryItem: "Green_Lace"
+ FoodItem: "Pet_Food"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 40
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 1500
+ Speed: 150
+ AttackRate: 500
+ DefendRate: 500
+ ChangeTargetRate: 200
+ PetScript: <" petskillbonus(bVit, 4, 10, 50); ">
+ EquipScript: <"
+ bonus(bVit, 1);
+ bonus(bMaxHP, 50);
+ ">
+},
+{
+ Id: 1170
+ SpriteName: "SOHEE"
+ Name: "Sohee"
+ TamingItem: "Silver_Knife_Of_Chaste"
+ EggItem: "Sohee_Egg"
+ AccessoryItem: "Golden_Bell"
+ FoodItem: "Pet_Food"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 10
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 500
+ Speed: 150
+ AttackRate: 100
+ DefendRate: 1000
+ ChangeTargetRate: 200
+ PetScript: <" petskillsupport(AL_HEAL, 10, 60, 33, 100); ">
+ EquipScript: <"
+ bonus(bStr, 1);
+ bonus(bDex, 1);
+ ">
+},
+{
+ Id: 1188
+ SpriteName: "BON_GUN"
+ Name: "Bon Gun"
+ TamingItem: "Heart_Of_Her"
+ EggItem: "Bongun_Egg"
+ AccessoryItem: "Sword_Of_Grave_Keeper"
+ FoodItem: "Pet_Food"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 30
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 500
+ Speed: 150
+ SpecialPerformance: true
+ AttackRate: 600
+ DefendRate: 200
+ ChangeTargetRate: 400
+ PetScript: <" petskillattack("NPC_DARKNESSATTACK", 555, 1, 1, 1); ">
+ EquipScript: <"
+ bonus(bVit, 1);
+ bonus2(bResEff, Eff_Stun, 100);
+ ">
+},
+{
+ Id: 1200
+ SpriteName: "ZHERLTHSH"
+ Name: "Zealotus"
+ TamingItem: "Prohibition_Red_Candle"
+ EggItem: "Zherlthsh_Egg"
+ FoodItem: "Immortal_Heart"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 10
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 300
+ Speed: 150
+ AttackRate: 1000
+ DefendRate: 100
+ ChangeTargetRate: 500
+ PetScript: <" petskillattack("AS_SONICBLOW", 1, 0, 0, 3); ">
+ EquipScript: <"
+ bonus2(bAddRace, RC_DemiPlayer, 2);
+ bonus2(bMagicAddRace, RC_DemiPlayer, 2);
+ ">
+},
+{
+ Id: 1245
+ SpriteName: "GOBLINE_XMAS"
+ Name: "Christmas Goblin"
+ TamingItem: "Sweet_Candy_Striper"
+ EggItem: "Santa_Goblin_Egg"
+ FoodItem: "Scell"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 50
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 2000
+ Speed: 150
+ AttackRate: 300
+ DefendRate: 300
+ ChangeTargetRate: 800
+ PetScript: <" petskillattack("MG_SIGHT", 5, 0, 5, 5); ">
+ EquipScript: <"
+ bonus(bMaxHP, 30);
+ bonus2(bSubEle, Ele_Water, 1);
+ ">
+},
+{
+ Id: 1275
+ SpriteName: "ALICE"
+ Name: "Alice"
+ TamingItem: "Sway_Apron"
+ EggItem: "Alice_Egg"
+ FoodItem: "White_Potion"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 20
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 800
+ Speed: 150
+ AttackRate: 100
+ DefendRate: 1000
+ ChangeTargetRate: 200
+ PetScript: <" petskillsupport("AL_HEAL", 5, 60, 25, 100); ">
+ EquipScript: <"
+ bonus(bMdef, 1);
+ bonus2(bAddRaceTolerance, RC_DemiPlayer, 1);
+ ">
+},
+// New Pets
+{
+ Id: 1122
+ SpriteName: "GOBLIN_1"
+ Name: "Goblin"
+ TamingItem: "Knife_Goblin_Ring"
+ EggItem: "Knife_Goblin_Egg"
+ FoodItem: "Green_Apple"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 50
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 800
+ Speed: 150
+ AttackRate: 300
+ DefendRate: 300
+ ChangeTargetRate: 800
+ PetScript: <" petskillattack("NPC_WINDATTACK", 5, 0, 5, 5); ">
+},
+{
+ Id: 1123
+ SpriteName: "GOBLIN_2"
+ Name: "Goblin"
+ TamingItem: "Flail_Goblin_Ring"
+ EggItem: "Flail_Goblin_Egg"
+ FoodItem: "Green_Apple"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 50
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 800
+ Speed: 150
+ AttackRate: 300
+ DefendRate: 300
+ ChangeTargetRate: 800
+ PetScript: <" petskillattack("NPC_FIREATTACK", 5, 0, 5, 5); ">
+},
+{
+ Id: 1125
+ SpriteName: "GOBLIN_4"
+ Name: "Goblin"
+ TamingItem: "Hammer_Goblin_Ring"
+ EggItem: "Hammer_Goblin_Egg"
+ FoodItem: "Green_Apple"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 50
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 800
+ Speed: 150
+ AttackRate: 300
+ DefendRate: 300
+ ChangeTargetRate: 800
+ PetScript: <" petskillattack("NPC_GROUNDATTACK", 5, 0, 5, 5); ">
+},
+{
+ Id: 1208
+ SpriteName: "WANDER_MAN"
+ Name: "Wanderer"
+ TamingItem: "Skull_Of_Vagabond"
+ EggItem: "Wanderer_Egg"
+ FoodItem: "Spirit_Liquor"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 20
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 800
+ Speed: 150
+ AttackRate: 300
+ DefendRate: 300
+ ChangeTargetRate: 800
+ PetScript: <" petskillattack("NPC_UNDEADATTACK", 5, 0, 5, 5); ">
+},
+{
+ Id: 1382
+ SpriteName: "DIABOLIC"
+ Name: "Diabolic"
+ TamingItem: "Red_Burning_Stone"
+ EggItem: "Diabolic_Egg"
+ FoodItem: "Meat_Veg_Skewer"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 10
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 800
+ Speed: 150
+ AttackRate: 300
+ DefendRate: 300
+ ChangeTargetRate: 800
+ PetScript: <" petskillattack("WZ_METEOR", 2, 0, 5, 5); ">
+},
+{
+ Id: 1385
+ SpriteName: "DELETER_"
+ Name: "Deleter"
+ TamingItem: "Holy_Marble"
+ EggItem: "Red_Deleter_Egg"
+ FoodItem: "Whole_Barbecue"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 20
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 800
+ Speed: 150
+ AttackRate: 300
+ DefendRate: 300
+ ChangeTargetRate: 800
+ PetScript: <" petskillattack("SM_MAGNUM", 5, 0, 5, 5); ">
+},
+{
+ Id: 1879
+ SpriteName: "ECLIPSE_P"
+ Name: "Spring Rabbit"
+ EggItem: "Spring_Rabbit_Egg"
+ FoodItem: "Bok_Choy"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 50
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 2000
+ Speed: 150
+ AttackRate: 300
+ DefendRate: 300
+ ChangeTargetRate: 800
+ PetScript: <" petskillattack("TF_THROWSTONE", 1, 0, 5, 5); ">
+},
+// Episode 12
+{
+ Id: 1963
+ SpriteName: "P_CHUNG_E"
+ Name: "New Year Doll"
+ EggItem: "New_Year_Doll_Egg"
+ FoodItem: "Mojji"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 30
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 800
+ Speed: 150
+ AttackRate: 300
+ DefendRate: 300
+ ChangeTargetRate: 800
+ PetScript: <" petskillattack("CR_SHIELDCHARGE", 5, 0, 5, 5); ">
+},
+// Episode 13
+{
+ Id: 1815
+ SpriteName: "EVENT_RICECAKE"
+ Name: "Rice Cake"
+ EggItem: "Rice_Cake_Egg"
+ FoodItem: "Green_Herb"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 50
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 2000
+ Speed: 150
+ SpecialPerformance: true
+ AttackRate: 500
+ DefendRate: 500
+ ChangeTargetRate: 200
+ PetScript: <" petskillsupport("CR_DEFENDER", 3, 240, 50, 100); ">
+ EquipScript: <"
+ bonus2(bSubEle, Ele_Neutral, 1);
+ bonus(bMaxHPrate, -1);
+ ">
+},
+{
+ Id: 2210
+ SpriteName: "XMAS_LUNATIC"
+ Name: "Christmas Snow Rabbit"
+ EggItem: "Snow_Rabbit_Egg"
+ FoodItem: "Candy"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 10
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ Speed: 150
+ SpecialPerformance: true
+ AttackRate: 300
+ DefendRate: 300
+ ChangeTargetRate: 800
+ EquipScript: <" bonus2(bExpAddRace, RC_All, 5); ">
+},
+// Episode 13.2
+{
+ Id: 1040
+ SpriteName: "GOLEM"
+ Name: "Golem"
+ TamingItem: "Magical_Lithography"
+ EggItem: "Golem_Egg"
+ AccessoryItem: "Windup_Spring"
+ FoodItem: "Mystic_Stone"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 20
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 500
+ Speed: 150
+ AttackRate: 300
+ DefendRate: 300
+ ChangeTargetRate: 800
+ EquipScript: <"
+ bonus(bMaxHP, 100);
+ bonus(bFlee, -5);
+ ">
+},
+{
+ Id: 1143
+ SpriteName: "MARIONETTE"
+ Name: "Marionette"
+ TamingItem: "Delicious_Shaved_Ice"
+ EggItem: "Marionette_Egg"
+ AccessoryItem: "Star_Hairband"
+ FoodItem: "Small_Snow_Flower"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 10
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 500
+ Speed: 150
+ AttackRate: 300
+ DefendRate: 300
+ ChangeTargetRate: 800
+ EquipScript: <" bonus(bSPrecovRate, 3); ">
+},
+{
+ Id: 1148
+ SpriteName: "MEDUSA"
+ Name: "Medusa"
+ TamingItem: "Splendid_Mirror"
+ EggItem: "Medusa_Egg"
+ AccessoryItem: "Queens_Coronet"
+ FoodItem: "Apple_Pudding"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 10
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 200
+ Speed: 150
+ AttackRate: 300
+ DefendRate: 300
+ ChangeTargetRate: 800
+ EquipScript: <"
+ bonus(bVit, 1);
+ bonus2(bResEff, Eff_Stone, 500);
+ ">
+},
+{
+ Id: 1179
+ SpriteName: "WHISPER"
+ Name: "Whisper"
+ TamingItem: "Fit_Pipe"
+ EggItem: "Whisper_Egg"
+ AccessoryItem: "Spirit_Chain_"
+ FoodItem: "Damp_Darkness"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 20
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 500
+ Speed: 150
+ AttackRate: 300
+ DefendRate: 300
+ ChangeTargetRate: 800
+ EquipScript: <"
+ bonus(bFlee, 7);
+ bonus(bDef, -3);
+ ">
+},
+{
+ Id: 1299
+ SpriteName: "GOBLIN_LEADER"
+ Name: "Goblin Leader"
+ TamingItem: "Staff_Of_Leader"
+ EggItem: "Goblin_Leader_Egg"
+ AccessoryItem: "Nice_Badge"
+ FoodItem: "Big_Cell"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 10
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 50
+ Speed: 150
+ AttackRate: 300
+ DefendRate: 300
+ ChangeTargetRate: 800
+ EquipScript: <" bonus2(bAddRace, RC_DemiPlayer, 3); ">
+},
+{
+ Id: 1370
+ SpriteName: "SUCCUBUS"
+ Name: "Succubus"
+ TamingItem: "Boys_Naivety"
+ EggItem: "Succubus_Egg"
+ AccessoryItem: "Black_Butterfly_Mask"
+ FoodItem: "Vital_Flower_"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 10
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 200
+ Speed: 150
+ AttackRate: 300
+ DefendRate: 300
+ ChangeTargetRate: 800
+ EquipScript: <" bonus2(bHPDrainRate, 50, 5); ">
+},
+{
+ Id: 1374
+ SpriteName: "INCUBUS"
+ Name: "Incubus"
+ TamingItem: "Grils_Naivety"
+ EggItem: "Incubus_Egg"
+ AccessoryItem: "Ball_Mask"
+ FoodItem: "Vital_Flower"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 10
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 50
+ Speed: 150
+ AttackRate: 300
+ DefendRate: 300
+ ChangeTargetRate: 800
+ EquipScript: <" bonus(bMaxSPrate, 3); ">
+},
+{
+ Id: 1379
+ SpriteName: "NIGHTMARE_TERROR"
+ Name: "Nightmare Terror"
+ TamingItem: "Hell_Contract"
+ EggItem: "Nightmare_Terror_Egg"
+ AccessoryItem: "Hell_Horn"
+ FoodItem: "Fresh_Plant"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 10
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 200
+ Speed: 150
+ AttackRate: 300
+ DefendRate: 300
+ ChangeTargetRate: 800
+ EquipScript: <" bonus2(bResEff, Eff_Sleep, 10000); ">
+},
+{
+ Id: 1401
+ SpriteName: "SHINOBI"
+ Name: "Shinobi"
+ TamingItem: "Kuloren"
+ EggItem: "Shinobi_Egg"
+ AccessoryItem: "Wine_On_Sleeve"
+ FoodItem: "Grilled_Rice_Cake"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 20
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 500
+ Speed: 150
+ AttackRate: 300
+ DefendRate: 300
+ ChangeTargetRate: 800
+ EquipScript: <" bonus(bAgi, 2); ">
+},
+{
+ Id: 1404
+ SpriteName: "MIYABI_NINGYO"
+ Name: "Miyabi Doll"
+ TamingItem: "Gril_Doll"
+ EggItem: "Miyabi_Ningyo_Egg"
+ AccessoryItem: "Summer_Fan"
+ FoodItem: "Well_Ripened_Berry"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 15
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 200
+ Speed: 150
+ AttackRate: 300
+ DefendRate: 300
+ ChangeTargetRate: 800
+ EquipScript: <"
+ bonus(bInt, 1);
+ bonus(bCastrate, -3);
+ ">
+},
+{
+ Id: 1416
+ SpriteName: "WICKED_NYMPH"
+ Name: "Evil Nymph"
+ TamingItem: "Charming_Lotus"
+ EggItem: "Wicked_Nymph_Egg"
+ AccessoryItem: "Jade_Trinket"
+ FoodItem: "Morning_Dew"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 15
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 500
+ Speed: 150
+ AttackRate: 300
+ DefendRate: 300
+ ChangeTargetRate: 800
+ EquipScript: <"
+ bonus(bMaxSP, 30);
+ bonus(bSPrecovRate, 5);
+ ">
+},
+{
+ Id: 1495
+ SpriteName: "STONE_SHOOTER"
+ Name: "Stone Shooter"
+ TamingItem: "Oilpalm_Coconut"
+ EggItem: "Stone_Shooter_Egg"
+ AccessoryItem: "Apro_Hair"
+ FoodItem: "Plant_Neutrient"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 20
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 500
+ Speed: 150
+ AttackRate: 300
+ DefendRate: 300
+ ChangeTargetRate: 800
+ EquipScript: <" bonus2(bSubEle, Ele_Fire, 3); ">
+},
+{
+ Id: 1504
+ SpriteName: "DULLAHAN"
+ Name: "Dullahan"
+ TamingItem: "Luxury_Whisky_Bottle"
+ EggItem: "Dullahan_Egg"
+ AccessoryItem: "Death_Coil"
+ FoodItem: "Sunset_On_The_Rock"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 10
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 200
+ Speed: 150
+ AttackRate: 300
+ DefendRate: 300
+ ChangeTargetRate: 800
+ EquipScript: <" bonus(bCritAtkRate, 5); ">
+},
+{
+ Id: 1505
+ SpriteName: "LOLI_RURI"
+ Name: "Loli Ruri"
+ TamingItem: "Very_Red_Juice"
+ EggItem: "Loli_Ruri_Egg"
+ AccessoryItem: "Fashionable_Glasses"
+ FoodItem: "Pumpkin_Pie_"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 15
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 200
+ Speed: 150
+ AttackRate: 300
+ DefendRate: 300
+ ChangeTargetRate: 800
+ EquipScript: <"
+ bonus(bMaxHPrate, 3);
+ bonus3(bAutoSpellWhenHit, "AL_HEAL", 1, 50);
+ ">
+},
+{
+ Id: 1513
+ SpriteName: "CIVIL_SERVANT"
+ Name: "Mao Guai"
+ TamingItem: "Fan_Of_Wind"
+ EggItem: "Civil_Servant_Egg"
+ AccessoryItem: "Golden_Earing"
+ FoodItem: "Flavored_Alcohol"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 10
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 500
+ Speed: 150
+ AttackRate: 300
+ DefendRate: 300
+ ChangeTargetRate: 800
+ EquipScript: <" bonus(bMaxSP, 10); ">
+},
+{
+ Id: 1519
+ SpriteName: "CHUNG_E"
+ Name: "Green Maiden"
+ TamingItem: "Tantanmen"
+ EggItem: "Chung_E_Egg"
+ FoodItem: "Bun_"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 50
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 2000
+ Speed: 150
+ AttackRate: 300
+ DefendRate: 300
+ ChangeTargetRate: 800
+ PetScript: <" petskillattack("CR_SHIELDCHARGE", 5, 0, 5, 5); ">
+ EquipScript: <"
+ bonus(bDef, 1);
+ bonus2(bAddRaceTolerance, RC_DemiPlayer, 1);
+ ">
+},
+{
+ Id: 1586
+ SpriteName: "LEAF_CAT"
+ Name: "Leaf Cat"
+ TamingItem: "Very_Soft_Plant"
+ EggItem: "Leaf_Cat_Egg"
+ AccessoryItem: "Green_Lucky_Bag"
+ FoodItem: "Fish_With_Blue_Back"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 20
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 200
+ Speed: 150
+ AttackRate: 300
+ DefendRate: 300
+ ChangeTargetRate: 800
+ EquipScript: <"
+ bonus2(bAddRaceTolerance, RC_Brute, 3);
+ ">
+},
+{
+ Id: 1630
+ SpriteName: "BACSOJIN_"
+ Name: "White Lady"
+ TamingItem: "Shiny_Wing_Gown"
+ EggItem: "Bacsojin_Egg"
+ AccessoryItem: "Round_Hair_Ornament"
+ FoodItem: "Traditional_Cookie"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 10
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 2000
+ Speed: 150
+ AttackRate: 300
+ DefendRate: 300
+ ChangeTargetRate: 800
+},
+{
+ Id: 1837
+ SpriteName: "IMP"
+ Name: "Fire Imp"
+ TamingItem: "Flaming_Ice"
+ EggItem: "Imp_Egg"
+ AccessoryItem: "Horn_Protector"
+ FoodItem: "Flame_Gemstone"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 10
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 200
+ Speed: 150
+ AttackRate: 300
+ DefendRate: 300
+ ChangeTargetRate: 800
+ EquipScript: <"
+ bonus2(bSubEle, Ele_Fire, 2);
+ bonus2(bAddEle, Ele_Fire, 2);
+ ">
+},
+// Episode 13.2 Brasilis
+{
+ Id: 2057
+ SpriteName: "E_CRAMP"
+ Name: "Strange Cramp"
+ TamingItem: "Leaf_Cat_Ball"
+ EggItem: "Mystic_Leaf_Cat_Ball"
+ CaptureRate: 50
+ AttackRate: 350
+ DefendRate: 400
+ ChangeTargetRate: 800
+},
+{
+ Id: 2081
+ SpriteName: "E_HYDRA"
+ Name: "Strange Hydra"
+ TamingItem: "Leaf_Cat_Ball"
+ EggItem: "Mystic_Leaf_Cat_Ball"
+ CaptureRate: 50
+ AttackRate: 350
+ DefendRate: 400
+ ChangeTargetRate: 800
+},
+// Episode 14.1
+{
+ Id: 2313
+ SpriteName: "TIKBALANG"
+ Name: "Tikbalang"
+ TamingItem: "Tikbalang_Belt"
+ EggItem: "Tikbalang_Pet"
+ FoodItem: "Monsters_Feed"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 10
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 1000
+ Speed: 150
+ SpecialPerformance: true
+ AttackRate: 300
+ DefendRate: 300
+ ChangeTargetRate: 800
+ EquipScript: <"
+ bonus2(bAddDamageClass, 2320, 10);
+ bonus2(bAddDamageClass, 2321, 10);
+ bonus2(bAddDamageClass, 2322, 10);
+ bonus2(bAddDamageClass, 2317, 10);
+ bonus2(bAddDamageClass, 2318, 10);
+ bonus2(bAddDamageClass, 2327, 10);
+ bonus2(bAddDamageClass, 2319, 10);
+ bonus2(bAddDamageClass, 2333, 10);
+ bonus2(bAddDamageClass, 2332, 10);
+ ">
+},
+// New Pets
+{
+ Id: 1242
+ SpriteName: "MARIN"
+ Name: "Marin"
+ TamingItem: "Juicy_Fruit"
+ EggItem: "Marin_Egg"
+ AccessoryItem: "Tw_Backpack"
+ FoodItem: "Fruit_Sundae"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 50
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 2000
+ Speed: 150
+ SpecialPerformance: true
+ AttackRate: 300
+ DefendRate: 300
+ ChangeTargetRate: 800
+},
+{
+ Id: 2200
+ SpriteName: "J_TAINI"
+ Name: "Tiny"
+ EggItem: "Egg_Of_Tiny"
+ FoodItem: "Apple"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 10
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ Speed: 150
+ SpecialPerformance: true
+ AttackRate: 300
+ DefendRate: 300
+ ChangeTargetRate: 800
+},
+// Episode 14.2
+{
+ Id: 2398
+ SpriteName: "LITTLE_PORING"
+ Name: "Little Poring"
+ TamingItem: "Unripe_Apple2"
+ EggItem: "Novice_Poring_Egg"
+ AccessoryItem: "Backpack"
+ FoodItem: "Apple_Juice"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 50
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 2000
+ Speed: 150
+ SpecialPerformance: true
+ AttackRate: 350
+ DefendRate: 400
+ ChangeTargetRate: 800
+ PetScript: <" petloot(10); ">
+ EquipScript: <"
+ bonus(bLuk, 2);
+ bonus(bCritical, 1);
+ ">
+},
+)
diff --git a/db/re/pet_db.txt b/db/re/pet_db.txt
deleted file mode 100644
index 42d758cb9..000000000
--- a/db/re/pet_db.txt
+++ /dev/null
@@ -1,133 +0,0 @@
-// Pet Database
-//
-// Structure of Database:
-// MobID,Name,JName,LureID,EggID,EquipID,FoodID,Fullness,HungryDelay,R_Hungry,R_Full,Intimate,Die,Capture,Speed,S_Performance,talk_convert_class,attack_rate,defence_attack_rate,change_target_rate,pet_script,loyal_script
-//
-// 01. MobID Monster ID of the pet.
-// 02. Name Name of the monster as defined in the database.
-// 03. JName The display name of the monster when hatched.
-// 04. LureID Pet Tame Item ID.
-// 05. EggID Pet Egg ID.
-// 06. EquipID Pet Accessory ID.
-// 07. FoodID Pet Food ID.
-// 08. Fullness The amount of hunger points increasing with each feeding.
-// 09. HungryDelay The amount of time it takes for hunger to decrease after feeding. (Default: 60 seconds)
-// 10. R_Hungry Amount of Intimacy that is increased when fed.
-// 11. R_Full Amount of Intimacy that is decreased when over-fed.
-// 12. Intimate Amount of Intimacy the pet starts with.
-// 13. Die Amount of Intimacy that is decreased when the pet owner dies.
-// 14. Capture Capture succes rate (10000 = 100%)
-// 15. Speed Pet's walk speed. (Defaul: 150)
-// 16. S_Performance Special Performance. (Yes = 1, No = 0)
-// 17. talk_convert_class Disables pet talk (instead of talking they emote with /!.)
-// 18. attack_rate Rate of which the pet will attack (requires at least pet_support_min_friendly intimacy).
-// 19. defence_attack_rate Rate of which the pet will retaliate when master is being attacked (requires at least pet_support_min_friendly intimacy).
-// 20. change_target_rate Rate of which the pet will change its attack target.
-// 21. pet_script Script to execute when the pet is hatched.
-// 22. loyal_script Script to execute when the pet is hatched (requires at least pet_equip_min_friendly intimacy, independent of pet_script).
-//NOTE: The max value (100%) of attack_rate, defense_rate & change_target_rate is 10000.
-
-//In theory you can use any valid script, but it is run only once upon pet
-//loading, so it is recommended you use the specific pet scripts:
-
-//petskillattack skillid, skilllv, hits, rate, bonusrate
-//Skill attack that triggers while the pet is attacking. Rate is the base
-//chance of execution per attack. Bonusrate is an additional success rate when
-//intimacy reaches max. If hits is specified and different than 0, it will make
-//the pet cast the skill with a fixed amount of damage inflicted and the
-//specified number of hits. A value of zero uses the skill's defaults.
-
-//petskillsupport skillid, skilllv, delay, hp%, sp%
-//Casts a support skill when the health levels are below the specified hp% and
-//sp%. Delay is the minimum time in seconds before the skill can be cast again
-
-//petrecovery type, delay: Cures the "type" status effect after "delay" seconds
-
-//petskillbonus type, value, duration, delay
-//Gives bonus stats. Type is the stat to increase (bStr, bLuk), value is the
-//amount by which it is increased, duration signals how long the bonus lasts
-//delay is the time elapsed after the bonus ends and before it starts again.
-
-//A single pet can have petloot, petskillbonus, petskillattack and
-//petskillsupport at the same time, but only one of each.
-
-// Core
-1002,PORING,Poring,619,9001,10013,531,80,60,50,100,250,20,2000,150,1,0,350,400,800,{ petloot 10; },{ bonus bLuk,2; bonus bCritical,1; }
-1011,CHONCHON,ChonChon,624,9006,10002,537,80,60,30,100,250,20,1500,150,1,0,500,500,250,{ petskillbonus bAgi,4,10,50; },{ bonus bAgi,1; bonus bFlee,2; }
-1014,SPORE,Spore,630,9012,10017,537,80,60,30,100,250,20,1500,150,0,0,350,500,500,{ petrecovery SC_POISON,60; },{ bonus bHit,5; bonus bAtk,-2; }
-1019,PECOPECO,PecoPeco,632,9014,10010,537,80,60,30,100,250,20,1000,150,1,0,400,500,800,{ petskillbonus bSpeedRate,25,20,20; },{ bonus bMaxHP,150; bonus bMaxSP,-10; }
-1023,ORK_WARRIOR,Orc Warrior,635,9017,10009,537,80,60,20,100,250,20,500,150,1,0,600,200,300,{ petskillattack "NPC_PIERCINGATT",100,1,0,10; },{ bonus bAtk,10; bonus bDef,-3; }
-1026,MUNAK,Munak,636,9018,10008,537,80,60,20,100,250,20,500,150,0,0,300,750,300,{ petskillattack "NPC_DARKNESSATTACK",444,1,0,10; },{ bonus bInt,1; bonus bDef,1; }
-1029,ISIS,Isis,639,9021,10006,537,80,60,10,100,250,20,500,150,0,0,650,450,150,{ petskillsupport "PR_MAGNIFICAT",2,60,50,50; },{ bonus bMatkRate,-1; bonus bAtkRate,1; }
-1031,POPORING,Poporing,621,9003,10013,511,80,60,30,100,250,20,1000,150,1,0,300,500,400,{ petloot 15; },{ bonus bLuk,2; bonus2 bSubEle,Ele_Poison,10; }
-1035,HUNTER_FLY,Hunter Fly,626,9008,10002,716,80,60,10,100,250,20,500,150,1,0,500,500,200,{ petskillattack "NPC_WINDATTACK",888,2,0,10; },{ bonus bFlee,-5; bonus bFlee2,2; }
-1042,STEEL_CHONCHON,Steel ChonChon,625,9007,10002,1002,80,60,20,100,250,20,1000,150,1,0,500,500,200,{ petskillbonus bAgiVit,4,20,40; },{ bonus bFlee,6; bonus bAgi,-1; }
-1049,PICKY,Picky,623,9005,10012,507,80,60,40,100,250,20,2000,150,1,0,500,600,50,{ petskillbonus bStr,3,10,50;},{ bonus bStr,1; bonus bAtk,5; }
-1052,ROCKER,Rocker,629,9011,10014,537,80,60,30,100,250,20,1500,150,0,0,350,350,600,{ petskillbonus bAllStats,1,10,50; },{ bonus bHPrecovRate,5; bonus bMaxHP,25; }
-1056,SMOKIE,Smokie,633,9015,10019,537,80,60,30,100,250,20,1000,150,1,0,600,600,100,{ petskillbonus bPerfectHide,1,3600,0; },{ bonus bAgi,1; bonus bFlee2,1; }
-1057,YOYO,Yoyo,634,9016,10018,532,80,60,20,100,250,20,1000,150,1,0,300,800,400,{ petloot 20; },{ bonus bCritical,3; bonus bLuk,-1; }
-1063,LUNATIC,Lunatic,622,9004,10007,534,80,60,40,100,250,20,1500,150,0,0,300,300,1000,{ petskillbonus bLuk,3,10,50; },{ bonus bCritical,2; bonus bAtk,2; }
-1077,POISON_SPORE,Poison Spore,631,9013,10017,537,80,60,20,100,250,20,1000,150,0,0,600,200,400,{ petskillattack "NPC_POISON",20,0,0,10; },{ bonus bStr,1; bonus bInt,1; }
-1101,BAPHOMET_,Baphomet Jr.,642,9024,10001,518,80,60,10,100,250,20,200,150,0,0,1000,100,200,{ petskillattack "NPC_DARKNESSATTACK",1776,4,0,5; },{ bonus bDef,1; bonus bMdef,1; bonus2 bResEff,Eff_Stun,-100; }
-1107,DESERT_WOLF_B,Baby Desert Wolf,628,9010,10003,537,80,60,40,100,250,20,1000,150,0,0,400,400,400,{ petskillattack "SM_PROVOKE",1,0,0,5;},{ bonus bInt,1; bonus bMaxSP,50; }
-1109,DEVIRUCHI,Deviruchi,641,9023,10004,711,80,60,10,100,250,20,500,150,0,0,800,200,100,{ petskillbonus bAgiDexStr,6,20,40; },{ bonus bMatkRate,1; bonus bAtkRate,1; bonus bMaxHPrate,-3; bonus bMaxSPrate,-3; }
-1110,DOKEBI,Dokebi,637,9019,10005,537,80,60,20,100,250,20,500,150,0,0,300,300,800,{ petskillattack "BS_HAMMERFALL",1,0,0,10; },{ bonus bMatkRate,1; bonus bAtkRate,-1; }
-1113,DROPS,Drops,620,9002,10013,508,80,60,40,100,250,20,1500,150,1,0,300,400,500,{ petloot 10; },{ bonus bHit,3; bonus bAtk,3; }
-1155,PETIT,Petite,640,9022,10011,537,80,60,20,100,250,20,500,150,0,0,800,400,100,{ petskillattack "WZ_HEAVENDRIVE",500,1,0,10; },{ bonus bDef,-2; bonus bMdef,-2; bonus bAspdRate,1; }
-1167,SAVAGE_BABE,Savage Babe,627,9009,10015,537,80,60,40,100,250,20,1500,150,0,0,500,500,200,{ petskillbonus bVit,4,10,50; },{ bonus bVit,1; bonus bMaxHP,50; }
-1170,SOHEE,Sohee,638,9020,10016,537,80,60,10,100,250,20,500,150,0,0,100,1000,200,{ petskillsupport AL_HEAL,10,60,33,100; },{ bonus bStr,1; bonus bDex,1; }
-1188,BON_GUN,Bon Gun,659,9025,10020,537,80,60,30,100,250,20,500,150,1,0,600,200,400,{ petskillattack "NPC_DARKNESSATTACK",555,1,1,1; },{ bonus bVit,1; bonus2 bResEff,Eff_Stun,100; }
-1200,ZHERLTHSH,Zealotus,660,9026,0,929,80,60,10,100,250,20,300,150,0,0,1000,100,500,{ petskillattack "AS_SONICBLOW",1,0,0,3; },{ bonus2 bAddRace,RC_DemiPlayer,2; bonus2 bMagicAddRace,RC_DemiPlayer,2; }
-1245,GOBLINE_XMAS,Christmas Goblin,12225,9029,0,911,80,60,50,100,250,20,2000,150,0,0,300,300,800,{ petskillattack "MG_SIGHT",5,0,5,5; },{ bonus bMaxHP,30; bonus2 bSubEle,Ele_Water,1; }
-1275,ALICE,Alice,661,9027,0,504,80,60,20,100,250,20,800,150,0,0,100,1000,200,{ petskillsupport "AL_HEAL",5,60,25,100; },{ bonus bMdef,1; bonus2 bAddRaceTolerance,RC_DemiPlayer,1; }
-
-// New Pets
-1122,GOBLIN_1,Goblin,14569,9032,0,7821,80,60,50,100,250,20,800,150,0,0,300,300,800,{ petskillattack "NPC_WINDATTACK",5,0,5,5; },{}
-1123,GOBLIN_2,Goblin,14570,9033,0,7821,80,60,50,100,250,20,800,150,0,0,300,300,800,{ petskillattack "NPC_FIREATTACK",5,0,5,5; },{}
-1125,GOBLIN_4,Goblin,14571,9034,0,7821,80,60,50,100,250,20,800,150,0,0,300,300,800,{ petskillattack "NPC_GROUNDATTACK",5,0,5,5; },{}
-1208,WANDER_MAN,Wanderer,14574,9037,0,7824,80,60,20,100,250,20,800,150,0,0,300,300,800,{ petskillattack "NPC_UNDEADATTACK",5,0,5,5; },{}
-1382,DIABOLIC,Diabolic,14573,9036,0,7823,80,60,10,100,250,20,800,150,0,0,300,300,800,{ petskillattack "WZ_METEOR",2,0,5,5; },{}
-1385,DELETER_,Deleter,14572,9035,0,7822,80,60,20,100,250,20,800,150,0,0,300,300,800,{ petskillattack "SM_MAGNUM",5,0,5,5; },{}
-1879,ECLIPSE_P,Spring Rabbit,0,9031,0,7766,80,60,50,100,250,20,2000,150,0,0,300,300,800,{ petskillattack "TF_THROWSTONE",1,0,5,5; },{}
-
-// Episode 12
-1963,P_CHUNG_E,New Year Doll,0,9038,0,554,80,60,30,100,250,20,800,150,0,0,300,300,800,{ petskillattack "CR_SHIELDCHARGE",5,0,5,5; },{}
-
-// Episode 13
-1815,EVENT_RICECAKE,Rice Cake,0,9028,0,511,80,60,50,100,250,20,2000,150,1,0,500,500,200,{ petskillsupport "CR_DEFENDER",3,240,50,100; },{ bonus2 bSubEle,Ele_Neutral,1; bonus bMaxHPrate,-1; }
-2210,XMAS_LUNATIC,Christmas Snow Rabbit,0,9058,0,529,80,60,10,100,250,20,0,150,1,0,300,300,800,{},{ bonus2 bExpAddRace,RC_All,5; }
-
-// Episode 13.2
-1040,GOLEM,Golem,12371,9053,10035,6111,80,60,20,100,250,20,500,150,0,0,300,300,800,{},{ bonus bMaxHP,100; bonus bFlee,-5; }
-1143,MARIONETTE,Marionette,12361,9043,10025,6098,80,60,10,100,250,20,500,150,0,0,300,300,800,{},{ bonus bSPrecovRate,3; }
-1148,MEDUSA,Medusa,12368,9050,10032,6108,80,60,10,100,250,20,200,150,0,0,300,300,800,{},{ bonus bVit,1; bonus2 bResEff,Eff_Stone,500; }
-1179,WHISPER,Whisper,12363,9045,10027,6100,80,60,20,100,250,20,500,150,0,0,300,300,800,{},{ bonus bFlee,7; bonus bDef,-3; }
-1299,GOBLIN_LEADER,Goblin Leader,12364,9046,10028,6104,80,60,10,100,250,20,50,150,0,0,300,300,800,{},{ bonus2 bAddRace,RC_DemiPlayer,3; }
-1370,SUCCUBUS,Succubus,12373,9055,10037,6113,80,60,10,100,250,20,200,150,0,0,300,300,800,{},{ bonus2 bHPDrainRate,50,5; }
-1374,INCUBUS,Incubus,12370,9052,10034,6110,80,60,10,100,250,20,50,150,0,0,300,300,800,{},{ bonus bMaxSPrate,3; }
-1379,NIGHTMARE_TERROR,Nightmare Terror,12372,9054,10036,6112,80,60,10,100,250,20,200,150,0,0,300,300,800,{},{ bonus2 bResEff,Eff_Sleep,10000; }
-1401,SHINOBI,Shinobi,12362,9044,10026,6099,80,60,20,100,250,20,500,150,0,0,300,300,800,{},{ bonus bAgi,2; }
-1404,MIYABI_NINGYO,Miyabi Doll,12366,9048,10030,6106,80,60,15,100,250,20,200,150,0,0,300,300,800,{},{ bonus bInt,1; bonus bCastrate,-3; }
-1416,WICKED_NYMPH,Evil Nymph,12365,9047,10029,6105,80,60,15,100,250,20,500,150,0,0,300,300,800,{},{ bonus bMaxSP,30; bonus bSPrecovRate,5; }
-1495,STONE_SHOOTER,Stone Shooter,12369,9051,10033,6109,80,60,20,100,250,20,500,150,0,0,300,300,800,{},{ bonus2 bSubEle,Ele_Fire,3; }
-1504,DULLAHAN,Dullahan,12367,9049,10031,6107,80,60,10,100,250,20,200,150,0,0,300,300,800,{},{ bonus bCritAtkRate,5; }
-1505,LOLI_RURI,Loli Ruri,12360,9042,10024,6097,80,60,15,100,250,20,200,150,0,0,300,300,800,{},{ bonus bMaxHPrate,3; bonus3 bAutoSpellWhenHit,"AL_HEAL",1,50; }
-1513,CIVIL_SERVANT,Mao Guai,12358,9040,10022,6095,80,60,10,100,250,20,500,150,0,0,300,300,800,{},{ bonus bMaxSP,10; }
-1519,CHUNG_E,Green Maiden,12395,9030,0,6115,80,60,50,100,250,20,2000,150,0,0,300,300,800,{ petskillattack "CR_SHIELDCHARGE",5,0,5,5; },{ bonus bDef,1; bonus2 bAddRaceTolerance,RC_DemiPlayer,1; }
-1586,LEAF_CAT,Leaf Cat,12359,9041,10023,6096,80,60,20,100,250,20,200,150,0,0,300,300,800,{},{ bonus2 bAddRaceTolerance,RC_Brute,2; }
-1630,BACSOJIN_,White Lady,12357,9039,10021,6094,80,60,10,100,250,20,2000,150,0,0,300,300,800,{},{}
-1837,IMP,Fire Imp,12374,9056,10038,6114,80,60,10,100,250,20,200,150,0,0,300,300,800,{},{ bonus2 bSubEle,Ele_Fire,2; bonus2 bAddEle,Ele_Fire,2; }
-
-// Episode 13.2 Brasilis
-2057,E_CRAMP,Strange Cramp,12408,6221,0,0,0,0,0,0,0,0,50,0,0,0,350,400,800,{},{} // kRO version
-2081,E_HYDRA,Strange Hydra,12408,6221,0,0,0,0,0,0,0,0,50,0,0,0,350,400,800,{},{} // iRO/cRO version
-
-// Episode 14.1
-2313,TIKBALANG,Tikbalang,12699,9059,0,528,80,60,10,100,250,20,1000,150,1,0,300,300,800,{},{ bonus2 bAddDamageClass,2320,10; bonus2 bAddDamageClass,2321,10; bonus2 bAddDamageClass,2322,10; bonus2 bAddDamageClass,2317,10; bonus2 bAddDamageClass,2318,10; bonus2 bAddDamageClass,2327,10; bonus2 bAddDamageClass,2319,10; bonus2 bAddDamageClass,2333,10; bonus2 bAddDamageClass,2332,10; }
-
-// New Pets
-1242,MARIN,Marin,12789,9061,10039,6534,80,60,50,100,250,20,2000,150,1,0,300,300,800,{},{}
-2200,J_TAINI,Tiny,0,9057,0,512,80,60,10,100,250,20,0,150,1,0,300,300,800,{},{}
-
-// Episode 14.2
-2398,LITTLE_PORING,Little Poring,12846,9062,10013,531,80,60,50,100,250,20,2000,150,1,0,350,400,800,{ petloot 10; },{ bonus bLuk,2; bonus bCritical,1; }
diff --git a/src/map/pet.c b/src/map/pet.c
index 2997a4b5a..57800dc0a 100644
--- a/src/map/pet.c
+++ b/src/map/pet.c
@@ -39,6 +39,7 @@
#include "map/skill.h"
#include "map/status.h"
#include "map/unit.h"
+#include "common/conf.h"
#include "common/db.h"
#include "common/ers.h"
#include "common/memmgr.h"
@@ -1199,145 +1200,213 @@ int pet_skill_support_timer(int tid, int64 tick, int id, intptr_t data) {
return 0;
}
-/**
- * Loads (or reloads) the pet database.
- */
-int read_petdb(void)
+void pet_read_db(void)
{
const char *filename[] = {
- DBPATH"pet_db.txt",
- "pet_db2.txt",
+ DBPATH"pet_db.conf",
+ "pet_db2.conf"
};
- int i,j;
+ int i;
- // Remove any previous scripts in case reloaddb was invoked.
- for (j = 0; j < MAX_PET_DB; j++) {
- if (pet->db[j].pet_script) {
- script->free_code(pet->db[j].pet_script);
- pet->db[j].pet_script = NULL;
- }
- if (pet->db[j].equip_script) {
- script->free_code(pet->db[j].equip_script);
- pet->db[j].equip_script = NULL;
+ pet->read_db_clear();
+
+ for (i = 0; i < ARRAYLENGTH(filename); ++i) {
+ pet->read_db_libconfig(filename[i], i > 0 ? true : false);
+ }
+}
+
+int pet_read_db_libconfig(const char *filename, bool ignore_missing)
+{
+ struct config_t pet_db_conf;
+ struct config_setting_t *pdb;
+ struct config_setting_t *t;
+ char filepath[256];
+ bool duplicate[MAX_MOB_DB] = { 0 };
+ int i = 0, count = 0;
+
+ nullpo_ret(filename);
+
+ safesnprintf(filepath, sizeof(filepath), "%s/%s", map->db_path, filename);
+
+ if (!exists(filepath)) {
+ if (!ignore_missing) {
+ ShowError("pet_read_db_libconfig: can't find file %s\n", filepath);
}
+ return 0;
}
- // clear database
- memset(pet->db,0,sizeof(pet->db));
+ if (!libconfig->load_file(&pet_db_conf, filepath))
+ return 0;
- j = 0; // entry counter
- for (i = 0; i < ARRAYLENGTH(filename); i++) {
- char line[1024];
- int lines, entries;
- FILE *fp;
-
- sprintf(line, "%s/%s", map->db_path, filename[i]);
- fp=fopen(line,"r");
- if (fp == NULL) {
- if (i == 0)
- ShowError("can't read %s\n",line);
+ if ((pdb = libconfig->setting_get_member(pet_db_conf.root, "pet_db")) == NULL) {
+ ShowError("can't read %s\n", filepath);
+ return 0;
+ }
+
+ while ((t = libconfig->setting_get_elem(pdb, i++))) {
+ int pet_id = pet->read_db_sub(t, i - 1, filename);
+
+ if (pet_id <= 0 || pet_id >= MAX_MOB_DB)
continue;
+
+ if (duplicate[pet_id]) {
+ ShowWarning("pet_read_db_libconfig:%s: duplicate entry of ID #%d\n", filename, pet_id);
+ } else {
+ duplicate[pet_id] = true;
}
- lines = entries = 0;
- while (fgets(line, sizeof(line), fp) && j < MAX_PET_DB) {
- char *str[22], *p;
- int nameid, k;
- lines++;
-
- if (line[0] == '/' && line[1] == '/')
- continue;
- memset(str, 0, sizeof(str));
- p = line;
- while (ISSPACE(*p))
- ++p;
- if (*p == '\0')
- continue; // empty line
- for (k = 0; k < 20; ++k) {
- str[k] = p;
- p = strchr(p,',');
- if (p == NULL)
- break; // comma not found
- *p = '\0';
- ++p;
- }
+ count++;
+ }
+ libconfig->destroy(&pet_db_conf);
+ ShowStatus("Done reading '"CL_WHITE"%d"CL_RESET"' entries in '"CL_WHITE"%s"CL_RESET"'.\n", count, filename);
- if (p == NULL) {
- ShowError("read_petdb: Insufficient columns in line %d, skipping.\n", lines);
- continue;
- }
+ return count;
+}
- // Pet Script
- if (*p != '{') {
- ShowError("read_petdb: Invalid format (Pet Script column) in line %d, skipping.\n", lines);
- continue;
- }
+int pet_read_db_sub(struct config_setting_t *it, int n, const char *source)
+{
+ struct config_setting_t *t = NULL;
+ struct item_data *data = NULL;
+ const char *str = NULL;
+ int i32 = 0;
- str[20] = p;
- p = strstr(p+1,"},");
- if (p == NULL) {
- ShowError("read_petdb: Invalid format (Pet Script column) in line %d, skipping.\n", lines);
- continue;
- }
- p[1] = '\0';
- p += 2;
+ nullpo_ret(it);
+ nullpo_ret(source);
+ Assert_ret(n >= 0 && n < MAX_PET_DB);
- // Equip Script
- if (*p != '{') {
- ShowError("read_petdb: Invalid format (Equip Script column) in line %d, skipping.\n", lines);
- continue;
- }
- str[21] = p;
+ if (!libconfig->setting_lookup_int(it, "Id", &i32)) {
+ ShowWarning("pet_read_db_sub: Missing Id in \"%s\", entry #%d, skipping.\n", source, n);
+ return 0;
+ }
+ pet->db[n].class_ = i32;
- nameid = atoi(str[0]);
- if (nameid <= 0)
- continue;
+ if (!libconfig->setting_lookup_string(it, "SpriteName", &str) || !*str ) {
+ ShowWarning("pet_read_db_sub: Missing SpriteName in pet %d of \"%s\", skipping.\n", pet->db[n].class_, source);
+ return 0;
+ }
+ safestrncpy(pet->db[n].name, str, sizeof(pet->db[n].name));
- if (!mob->db_checkid(nameid)) {
- ShowWarning("pet_db reading: Invalid mob-class %d, pet not read.\n", nameid);
- continue;
- }
+ if (!libconfig->setting_lookup_string(it, "Name", &str) || !*str) {
+ ShowWarning("pet_read_db_sub: Missing Name in pet %d of \"%s\", skipping.\n", pet->db[n].class_, source);
+ return 0;
+ }
+ safestrncpy(pet->db[n].jname, str, sizeof(pet->db[n].jname));
- pet->db[j].class_ = nameid;
- safestrncpy(pet->db[j].name,str[1],NAME_LENGTH);
- safestrncpy(pet->db[j].jname,str[2],NAME_LENGTH);
- pet->db[j].itemID=atoi(str[3]);
- pet->db[j].EggID=atoi(str[4]);
- pet->db[j].AcceID=atoi(str[5]);
- pet->db[j].FoodID=atoi(str[6]);
- pet->db[j].fullness=atoi(str[7]);
- pet->db[j].hungry_delay=atoi(str[8])*1000;
- pet->db[j].r_hungry=atoi(str[9]);
- if (pet->db[j].r_hungry <= 0)
- pet->db[j].r_hungry=1;
- pet->db[j].r_full=atoi(str[10]);
- pet->db[j].intimate=atoi(str[11]);
- pet->db[j].die=atoi(str[12]);
- pet->db[j].capture=atoi(str[13]);
- pet->db[j].speed=atoi(str[14]);
- pet->db[j].s_perfor=(char)atoi(str[15]);
- pet->db[j].talk_convert_class=atoi(str[16]);
- pet->db[j].attack_rate=atoi(str[17]);
- pet->db[j].defence_attack_rate=atoi(str[18]);
- pet->db[j].change_target_rate=atoi(str[19]);
- pet->db[j].pet_script = NULL;
- pet->db[j].equip_script = NULL;
-
- if (*str[20])
- pet->db[j].pet_script = script->parse(str[20], filename[i], lines, 0, NULL);
- if (*str[21])
- pet->db[j].equip_script = script->parse(str[21], filename[i], lines, 0, NULL);
-
- j++;
- entries++;
+ if (libconfig->setting_lookup_string(it, "TamingItem", &str)) {
+ if (!(data = itemdb->name2id(str))) {
+ ShowWarning("pet_read_db_sub: Invalid item '%s' in pet %d of \"%s\", defaulting to 0.\n", str, pet->db[n].class_, source);
+ } else {
+ pet->db[n].itemID = (uint16)data->nameid;
}
+ }
- if (j >= MAX_PET_DB)
- ShowWarning("read_petdb: Reached max number of pets [%d]. Remaining pets were not read.\n ", MAX_PET_DB);
- fclose(fp);
- ShowStatus("Done reading '"CL_WHITE"%d"CL_RESET"' pets in '"CL_WHITE"%s"CL_RESET"'.\n", entries, filename[i]);
+ if (libconfig->setting_lookup_string(it, "EggItem", &str)) {
+ if (!(data = itemdb->name2id(str))) {
+ ShowWarning("pet_read_db_sub: Invalid item '%s' in pet %d of \"%s\", defaulting to 0.\n", str, pet->db[n].class_, source);
+ } else {
+ pet->db[n].EggID = (uint16)data->nameid;
+ }
}
- return 0;
+
+ if (libconfig->setting_lookup_string(it, "AccessoryItem", &str)) {
+ if (!(data = itemdb->name2id(str))) {
+ ShowWarning("pet_read_db_sub: Invalid item '%s' in pet %d of \"%s\", defaulting to 0.\n", str, pet->db[n].class_, source);
+ } else {
+ pet->db[n].AcceID = (uint16)data->nameid;
+ }
+ }
+
+ if (libconfig->setting_lookup_string(it, "FoodItem", &str)) {
+ if (!(data = itemdb->name2id(str))) {
+ ShowWarning("pet_read_db_sub: Invalid item '%s' in pet %d of \"%s\", defaulting to 0.\n", str, pet->db[n].class_, source);
+ } else {
+ pet->db[n].FoodID = (uint16)data->nameid;
+ }
+ }
+
+ if (libconfig->setting_lookup_int(it, "FoodEffectiveness", &i32))
+ pet->db[n].fullness = i32;
+
+ if (libconfig->setting_lookup_int(it, "HungerDelay", &i32))
+ pet->db[n].hungry_delay = i32 * 1000;
+
+ if ((t = libconfig->setting_get_member(it, "Intimacy"))) {
+ if (config_setting_is_group(t)) {
+ pet->read_db_sub_intimacy(n, t);
+ }
+ }
+ if (pet->db[n].r_hungry <= 0)
+ pet->db[n].r_hungry = 1;
+
+ if (libconfig->setting_lookup_int(it, "CaptureRate", &i32))
+ pet->db[n].capture = i32;
+
+ if (libconfig->setting_lookup_int(it, "Speed", &i32))
+ pet->db[n].speed = i32;
+
+ if ((t = libconfig->setting_get_member(it, "SpecialPerformance")) && (i32 = libconfig->setting_get_bool(t)))
+ pet->db[n].s_perfor = (char)i32;
+
+ if ((t = libconfig->setting_get_member(it, "TalkWithEmotes")) && (i32 = libconfig->setting_get_bool(t)))
+ pet->db[n].talk_convert_class = i32;
+
+ if (libconfig->setting_lookup_int(it, "AttackRate", &i32))
+ pet->db[n].attack_rate = i32;
+
+ if (libconfig->setting_lookup_int(it, "DefendRate", &i32))
+ pet->db[n].defence_attack_rate = i32;
+
+ if (libconfig->setting_lookup_int(it, "ChangeTargetRate", &i32))
+ pet->db[n].change_target_rate = i32;
+
+ if (libconfig->setting_lookup_string(it, "PetScript", &str))
+ pet->db[n].pet_script = *str ? script->parse(str, source, -pet->db[n].class_, SCRIPT_IGNORE_EXTERNAL_BRACKETS, NULL) : NULL;
+
+ if (libconfig->setting_lookup_string(it, "EquipScript", &str))
+ pet->db[n].equip_script = *str ? script->parse(str, source, -pet->db[n].class_, SCRIPT_IGNORE_EXTERNAL_BRACKETS, NULL) : NULL;
+
+ return pet->db[n].class_;
+}
+
+bool pet_read_db_sub_intimacy(int idx, struct config_setting_t *t)
+{
+ int i32 = 0;
+
+ nullpo_retr(false, t);
+ Assert_ret(idx >= 0 && idx < MAX_PET_DB);
+
+ if (libconfig->setting_lookup_int(t, "Initial", &i32))
+ pet->db[idx].intimate = i32;
+
+ if (libconfig->setting_lookup_int(t, "FeedIncrement", &i32))
+ pet->db[idx].r_hungry = i32;
+
+ if (libconfig->setting_lookup_int(t, "OverFeedDecrement", &i32))
+ pet->db[idx].r_full = i32;
+
+ if (libconfig->setting_lookup_int(t, "OwnerDeathDecrement", &i32))
+ pet->db[idx].die = i32;
+
+ return true;
+}
+
+void pet_read_db_clear(void)
+{
+ int i;
+
+ // Remove any previous scripts in case reloaddb was invoked.
+ for (i = 0; i < MAX_PET_DB; i++) {
+ if (pet->db[i].pet_script) {
+ script->free_code(pet->db[i].pet_script);
+ pet->db[i].pet_script = NULL;
+ }
+ if (pet->db[i].equip_script) {
+ script->free_code(pet->db[i].equip_script);
+ pet->db[i].equip_script = NULL;
+ }
+ }
+ memset(pet->db, 0, sizeof(pet->db));
+ return;
}
/*==========================================
@@ -1428,5 +1497,10 @@ void pet_defaults(void) {
pet->skill_bonus_timer = pet_skill_bonus_timer;
pet->recovery_timer = pet_recovery_timer;
pet->skill_support_timer = pet_skill_support_timer;
- pet->read_db = read_petdb;
+
+ pet->read_db = pet_read_db;
+ pet->read_db_libconfig = pet_read_db_libconfig;
+ pet->read_db_sub = pet_read_db_sub;
+ pet->read_db_sub_intimacy = pet_read_db_sub_intimacy;
+ pet->read_db_clear = pet_read_db_clear;
}
diff --git a/src/map/pet.h b/src/map/pet.h
index 9a0287b42..19e524c16 100644
--- a/src/map/pet.h
+++ b/src/map/pet.h
@@ -166,7 +166,12 @@ struct pet_interface {
int (*skill_bonus_timer) (int tid, int64 tick, int id, intptr_t data);
int (*recovery_timer) (int tid, int64 tick, int id, intptr_t data);
int (*skill_support_timer) (int tid, int64 tick, int id, intptr_t data);
- int (*read_db) (void);
+
+ void (*read_db) (void);
+ int (*read_db_libconfig) (const char *filename, bool ignore_missing);
+ int (*read_db_sub) (struct config_setting_t *it, int n, const char *source);
+ bool (*read_db_sub_intimacy) (int idx, struct config_setting_t *t);
+ void (*read_db_clear) (void);
};
#ifdef HERCULES_CORE
diff --git a/src/plugins/HPMHooking/HPMHooking.Defs.inc b/src/plugins/HPMHooking/HPMHooking.Defs.inc
index ae503fa38..88e57455a 100644
--- a/src/plugins/HPMHooking/HPMHooking.Defs.inc
+++ b/src/plugins/HPMHooking/HPMHooking.Defs.inc
@@ -6028,8 +6028,16 @@ typedef int (*HPMHOOK_pre_pet_recovery_timer) (int *tid, int64 *tick, int *id, i
typedef int (*HPMHOOK_post_pet_recovery_timer) (int retVal___, int tid, int64 tick, int id, intptr_t data);
typedef int (*HPMHOOK_pre_pet_skill_support_timer) (int *tid, int64 *tick, int *id, intptr_t *data);
typedef int (*HPMHOOK_post_pet_skill_support_timer) (int retVal___, int tid, int64 tick, int id, intptr_t data);
-typedef int (*HPMHOOK_pre_pet_read_db) (void);
-typedef int (*HPMHOOK_post_pet_read_db) (int retVal___);
+typedef void (*HPMHOOK_pre_pet_read_db) (void);
+typedef void (*HPMHOOK_post_pet_read_db) (void);
+typedef int (*HPMHOOK_pre_pet_read_db_libconfig) (const char **filename, bool *ignore_missing);
+typedef int (*HPMHOOK_post_pet_read_db_libconfig) (int retVal___, const char *filename, bool ignore_missing);
+typedef int (*HPMHOOK_pre_pet_read_db_sub) (struct config_setting_t **it, int *n, const char **source);
+typedef int (*HPMHOOK_post_pet_read_db_sub) (int retVal___, struct config_setting_t *it, int n, const char *source);
+typedef bool (*HPMHOOK_pre_pet_read_db_sub_intimacy) (int *idx, struct config_setting_t **t);
+typedef bool (*HPMHOOK_post_pet_read_db_sub_intimacy) (bool retVal___, int idx, struct config_setting_t *t);
+typedef void (*HPMHOOK_pre_pet_read_db_clear) (void);
+typedef void (*HPMHOOK_post_pet_read_db_clear) (void);
#endif // MAP_PET_H
#ifdef CHAR_PINCODE_H /* pincode */
typedef void (*HPMHOOK_pre_pincode_handle) (int *fd, struct char_session_data **sd);
diff --git a/src/plugins/HPMHooking/HPMHooking_map.HPMHooksCore.inc b/src/plugins/HPMHooking/HPMHooking_map.HPMHooksCore.inc
index 4d15e4784..00bfb650c 100644
--- a/src/plugins/HPMHooking/HPMHooking_map.HPMHooksCore.inc
+++ b/src/plugins/HPMHooking/HPMHooking_map.HPMHooksCore.inc
@@ -4680,6 +4680,14 @@ struct {
struct HPMHookPoint *HP_pet_skill_support_timer_post;
struct HPMHookPoint *HP_pet_read_db_pre;
struct HPMHookPoint *HP_pet_read_db_post;
+ struct HPMHookPoint *HP_pet_read_db_libconfig_pre;
+ struct HPMHookPoint *HP_pet_read_db_libconfig_post;
+ struct HPMHookPoint *HP_pet_read_db_sub_pre;
+ struct HPMHookPoint *HP_pet_read_db_sub_post;
+ struct HPMHookPoint *HP_pet_read_db_sub_intimacy_pre;
+ struct HPMHookPoint *HP_pet_read_db_sub_intimacy_post;
+ struct HPMHookPoint *HP_pet_read_db_clear_pre;
+ struct HPMHookPoint *HP_pet_read_db_clear_post;
struct HPMHookPoint *HP_quest_init_pre;
struct HPMHookPoint *HP_quest_init_post;
struct HPMHookPoint *HP_quest_final_pre;
@@ -10971,6 +10979,14 @@ struct {
int HP_pet_skill_support_timer_post;
int HP_pet_read_db_pre;
int HP_pet_read_db_post;
+ int HP_pet_read_db_libconfig_pre;
+ int HP_pet_read_db_libconfig_post;
+ int HP_pet_read_db_sub_pre;
+ int HP_pet_read_db_sub_post;
+ int HP_pet_read_db_sub_intimacy_pre;
+ int HP_pet_read_db_sub_intimacy_post;
+ int HP_pet_read_db_clear_pre;
+ int HP_pet_read_db_clear_post;
int HP_quest_init_pre;
int HP_quest_init_post;
int HP_quest_final_pre;
diff --git a/src/plugins/HPMHooking/HPMHooking_map.HookingPoints.inc b/src/plugins/HPMHooking/HPMHooking_map.HookingPoints.inc
index 6191bea21..fa6de9ff0 100644
--- a/src/plugins/HPMHooking/HPMHooking_map.HookingPoints.inc
+++ b/src/plugins/HPMHooking/HPMHooking_map.HookingPoints.inc
@@ -2398,6 +2398,10 @@ struct HookingPointData HookingPoints[] = {
{ HP_POP(pet->recovery_timer, HP_pet_recovery_timer) },
{ HP_POP(pet->skill_support_timer, HP_pet_skill_support_timer) },
{ HP_POP(pet->read_db, HP_pet_read_db) },
+ { HP_POP(pet->read_db_libconfig, HP_pet_read_db_libconfig) },
+ { HP_POP(pet->read_db_sub, HP_pet_read_db_sub) },
+ { HP_POP(pet->read_db_sub_intimacy, HP_pet_read_db_sub_intimacy) },
+ { HP_POP(pet->read_db_clear, HP_pet_read_db_clear) },
/* quest_interface */
{ HP_POP(quest->init, HP_quest_init) },
{ HP_POP(quest->final, HP_quest_final) },
diff --git a/src/plugins/HPMHooking/HPMHooking_map.Hooks.inc b/src/plugins/HPMHooking/HPMHooking_map.Hooks.inc
index 51206c6f5..743e03300 100644
--- a/src/plugins/HPMHooking/HPMHooking_map.Hooks.inc
+++ b/src/plugins/HPMHooking/HPMHooking_map.Hooks.inc
@@ -62332,33 +62332,139 @@ int HP_pet_skill_support_timer(int tid, int64 tick, int id, intptr_t data) {
}
return retVal___;
}
-int HP_pet_read_db(void) {
+void HP_pet_read_db(void) {
int hIndex = 0;
- int retVal___ = 0;
if (HPMHooks.count.HP_pet_read_db_pre > 0) {
- int (*preHookFunc) (void);
+ void (*preHookFunc) (void);
*HPMforce_return = false;
for (hIndex = 0; hIndex < HPMHooks.count.HP_pet_read_db_pre; hIndex++) {
preHookFunc = HPMHooks.list.HP_pet_read_db_pre[hIndex].func;
- retVal___ = preHookFunc();
+ preHookFunc();
}
if (*HPMforce_return) {
*HPMforce_return = false;
- return retVal___;
+ return;
}
}
{
- retVal___ = HPMHooks.source.pet.read_db();
+ HPMHooks.source.pet.read_db();
}
if (HPMHooks.count.HP_pet_read_db_post > 0) {
- int (*postHookFunc) (int retVal___);
+ void (*postHookFunc) (void);
for (hIndex = 0; hIndex < HPMHooks.count.HP_pet_read_db_post; hIndex++) {
postHookFunc = HPMHooks.list.HP_pet_read_db_post[hIndex].func;
- retVal___ = postHookFunc(retVal___);
+ postHookFunc();
+ }
+ }
+ return;
+}
+int HP_pet_read_db_libconfig(const char *filename, bool ignore_missing) {
+ int hIndex = 0;
+ int retVal___ = 0;
+ if (HPMHooks.count.HP_pet_read_db_libconfig_pre > 0) {
+ int (*preHookFunc) (const char **filename, bool *ignore_missing);
+ *HPMforce_return = false;
+ for (hIndex = 0; hIndex < HPMHooks.count.HP_pet_read_db_libconfig_pre; hIndex++) {
+ preHookFunc = HPMHooks.list.HP_pet_read_db_libconfig_pre[hIndex].func;
+ retVal___ = preHookFunc(&filename, &ignore_missing);
+ }
+ if (*HPMforce_return) {
+ *HPMforce_return = false;
+ return retVal___;
+ }
+ }
+ {
+ retVal___ = HPMHooks.source.pet.read_db_libconfig(filename, ignore_missing);
+ }
+ if (HPMHooks.count.HP_pet_read_db_libconfig_post > 0) {
+ int (*postHookFunc) (int retVal___, const char *filename, bool ignore_missing);
+ for (hIndex = 0; hIndex < HPMHooks.count.HP_pet_read_db_libconfig_post; hIndex++) {
+ postHookFunc = HPMHooks.list.HP_pet_read_db_libconfig_post[hIndex].func;
+ retVal___ = postHookFunc(retVal___, filename, ignore_missing);
+ }
+ }
+ return retVal___;
+}
+int HP_pet_read_db_sub(struct config_setting_t *it, int n, const char *source) {
+ int hIndex = 0;
+ int retVal___ = 0;
+ if (HPMHooks.count.HP_pet_read_db_sub_pre > 0) {
+ int (*preHookFunc) (struct config_setting_t **it, int *n, const char **source);
+ *HPMforce_return = false;
+ for (hIndex = 0; hIndex < HPMHooks.count.HP_pet_read_db_sub_pre; hIndex++) {
+ preHookFunc = HPMHooks.list.HP_pet_read_db_sub_pre[hIndex].func;
+ retVal___ = preHookFunc(&it, &n, &source);
+ }
+ if (*HPMforce_return) {
+ *HPMforce_return = false;
+ return retVal___;
+ }
+ }
+ {
+ retVal___ = HPMHooks.source.pet.read_db_sub(it, n, source);
+ }
+ if (HPMHooks.count.HP_pet_read_db_sub_post > 0) {
+ int (*postHookFunc) (int retVal___, struct config_setting_t *it, int n, const char *source);
+ for (hIndex = 0; hIndex < HPMHooks.count.HP_pet_read_db_sub_post; hIndex++) {
+ postHookFunc = HPMHooks.list.HP_pet_read_db_sub_post[hIndex].func;
+ retVal___ = postHookFunc(retVal___, it, n, source);
}
}
return retVal___;
}
+bool HP_pet_read_db_sub_intimacy(int idx, struct config_setting_t *t) {
+ int hIndex = 0;
+ bool retVal___ = false;
+ if (HPMHooks.count.HP_pet_read_db_sub_intimacy_pre > 0) {
+ bool (*preHookFunc) (int *idx, struct config_setting_t **t);
+ *HPMforce_return = false;
+ for (hIndex = 0; hIndex < HPMHooks.count.HP_pet_read_db_sub_intimacy_pre; hIndex++) {
+ preHookFunc = HPMHooks.list.HP_pet_read_db_sub_intimacy_pre[hIndex].func;
+ retVal___ = preHookFunc(&idx, &t);
+ }
+ if (*HPMforce_return) {
+ *HPMforce_return = false;
+ return retVal___;
+ }
+ }
+ {
+ retVal___ = HPMHooks.source.pet.read_db_sub_intimacy(idx, t);
+ }
+ if (HPMHooks.count.HP_pet_read_db_sub_intimacy_post > 0) {
+ bool (*postHookFunc) (bool retVal___, int idx, struct config_setting_t *t);
+ for (hIndex = 0; hIndex < HPMHooks.count.HP_pet_read_db_sub_intimacy_post; hIndex++) {
+ postHookFunc = HPMHooks.list.HP_pet_read_db_sub_intimacy_post[hIndex].func;
+ retVal___ = postHookFunc(retVal___, idx, t);
+ }
+ }
+ return retVal___;
+}
+void HP_pet_read_db_clear(void) {
+ int hIndex = 0;
+ if (HPMHooks.count.HP_pet_read_db_clear_pre > 0) {
+ void (*preHookFunc) (void);
+ *HPMforce_return = false;
+ for (hIndex = 0; hIndex < HPMHooks.count.HP_pet_read_db_clear_pre; hIndex++) {
+ preHookFunc = HPMHooks.list.HP_pet_read_db_clear_pre[hIndex].func;
+ preHookFunc();
+ }
+ if (*HPMforce_return) {
+ *HPMforce_return = false;
+ return;
+ }
+ }
+ {
+ HPMHooks.source.pet.read_db_clear();
+ }
+ if (HPMHooks.count.HP_pet_read_db_clear_post > 0) {
+ void (*postHookFunc) (void);
+ for (hIndex = 0; hIndex < HPMHooks.count.HP_pet_read_db_clear_post; hIndex++) {
+ postHookFunc = HPMHooks.list.HP_pet_read_db_clear_post[hIndex].func;
+ postHookFunc();
+ }
+ }
+ return;
+}
/* quest_interface */
void HP_quest_init(bool minimal) {
int hIndex = 0;
diff --git a/tools/petdbconverter.py b/tools/petdbconverter.py
new file mode 100644
index 000000000..261c1e6ad
--- /dev/null
+++ b/tools/petdbconverter.py
@@ -0,0 +1,214 @@
+#! /usr/bin/env python
+# -*- coding: utf8 -*-
+#
+# This file is part of Hercules.
+# http://herc.ws - http://github.com/HerculesWS/Hercules
+#
+# Copyright (C) 2018 Hercules Dev Team
+# Copyright (C) 2018 Asheraf
+# Copyright (C) 2015 Andrei Karas (4144)
+#
+# Hercules is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+import os
+import re
+import sys
+
+def isValidEntry(line):
+ if re.match('^[0-9]+,.*', line):
+ return True
+ return False
+
+def curlSplit(line):
+ return re.split('[{}]|},', line)
+
+def commaSplit(line):
+ return line.split(',')
+
+def printIntField(name, value):
+ if int(value) != 0:
+ print('\t{0}: {1}'.format(name, value))
+
+def printIntField2(name, value):
+ if int(value) != 0:
+ print('\t\t{0}: {1}'.format(name, value))
+
+def printStrField(name, value):
+ if value != '':
+ print('\t{0}: \"{1}\"'.format(name, value))
+
+def printBool(name, value):
+ if int(value) != 0:
+ print('\t{0}: true'.format(name))
+
+def printIntimacy(arr):
+ if int(arr[9]) == 0 or int(arr[10]) == 0 or int(arr[11]) == 0 or int(arr[12]) == 0:
+ return
+ print('\tIntimacy: {')
+ printIntField2('Initial', arr[11])
+ printIntField2('FeedIncrement', arr[9])
+ printIntField2('OverFeedDecrement', arr[10])
+ printIntField2('OwnerDeathDecrement', arr[12])
+ print('\t}')
+
+def printScript(name, value):
+ if re.match('.*[a-zA-Z0-9,]+.*', value):
+ print('\t{0}: <\"{1}\">'.format(name, value))
+
+def printItemName(fieldname, itemid, itemDb):
+ value = int(itemid)
+ if value != 0:
+ if value not in itemDb:
+ print("// Error: pet item with id {0} not found in item_db.conf".format(value))
+ else:
+ printStrField(fieldname, itemDb[value])
+
+
+def printHeader():
+ print("""
+pet_db:(
+/**************************************************************************
+ ************* Entry structure ********************************************
+ **************************************************************************
+{
+ // ================ Mandatory fields ==============================
+ Id: ID (int)
+ SpriteName: "Sprite_Name" (string)
+ Name: "Pet Name" (string)
+ // ================ Optional fields ===============================
+ TamingItem: Taming Item (string, defaults to 0)
+ EggItem: Egg Id (string, defaults to 0)
+ AccessoryItem: Equipment Id (string, defaults to 0)
+ FoodItem: Food Id (string, defaults to 0)
+ FoodEffectiveness: hunger points (int, defaults to 0)
+ HungerDelay: hunger time (int, defaults to 0)
+ Intimacy: {
+ Initial: start intimacy (int, defaults to 0)
+ FeedIncrement: feeding intimacy (int, defaults to 0)
+ OverFeedDecrement: overfeeding intimacy (int, defaults to 0)
+ OwnerDeathDecrement: owner die intimacy (int, defaults to 0)
+ }
+ CaptureRate: capture rate (int, defaults to 0)
+ Speed: speed (int, defaults to 0)
+ SpecialPerformance: true/false (boolean, defaults to false)
+ TalkWithEmotes: convert talk (boolean, defaults to false)
+ AttackRate: attack rate (int, defaults to 0)
+ DefendRate: Defence attack (int, defaults to 0)
+ ChangeTargetRate: change target (int, defaults to 0)
+ PetScript: <" Pet Script (can also be multi-line) ">
+ EquipScript: <" Equip Script (can also be multi-line) ">
+},
+**************************************************************************/
+ """)
+
+def printFooter():
+ print(')\n')
+
+def convertFile(inFile, itemDb):
+ if inFile != "" and not os.path.exists(inFile):
+ return
+
+ if inFile == "":
+ r = sys.stdin
+ else:
+ r = open(inFile, "r")
+
+ printHeader()
+ for line in r:
+ if isValidEntry(line) == True:
+ print('{')
+ firstsplit = curlSplit(line)
+ secondsplit = commaSplit(firstsplit[0])
+ printIntField('Id', secondsplit[0])
+ printStrField('SpriteName', secondsplit[1])
+ printStrField('Name', secondsplit[2])
+ printItemName('TamingItem', secondsplit[3], itemDb)
+ printItemName('EggItem', secondsplit[4], itemDb)
+ printItemName('AccessoryItem', secondsplit[5], itemDb)
+ printItemName('FoodItem', secondsplit[6], itemDb)
+ printIntField('FoodEffectiveness', secondsplit[7])
+ printIntField('HungerDelay', secondsplit[8])
+ printIntimacy(secondsplit)
+ printIntField('CaptureRate', secondsplit[13])
+ printIntField('Speed', secondsplit[14])
+ printBool('SpecialPerformance', secondsplit[15])
+ printBool('TalkWithEmotes', secondsplit[16])
+ printIntField('AttackRate', secondsplit[17])
+ printIntField('DefendRate', secondsplit[18])
+ printIntField('ChangeTargetRate', secondsplit[19])
+ printScript('PetScript', firstsplit[1])
+ printScript('EquipScript', firstsplit[3])
+ print('},')
+ printFooter()
+
+def printHelp():
+ print("PetDB converter from txt to conf format")
+ print("Usage:")
+ print(" petdbconverter.py re serverpath dbfilepath")
+ print(" petdbconverter.py pre-re serverpath dbfilepath")
+ print("Usage for read from stdin:")
+ print(" petdbconverter.py re dbfilepath")
+
+def readItemDB(inFile, itemDb):
+ itemId = 0
+ itemName = ""
+ started = False
+ with open(inFile, "r") as r:
+ for line in r:
+ line = line.strip()
+ if started == True:
+ if line == "},":
+ started = False
+ elif line[:10] == "AegisName:":
+ itemName = line[12:-1]
+ elif line[:3] == "Id:":
+ try:
+ itemId = int(line[4:])
+ except:
+ started = False
+ if itemId != 0 and itemName != "":
+# was need for remove wrong characters
+# itemName = itemName.replace(".", "")
+# if itemName[0] >= "0" and itemName[0] <= "9":
+# itemName = "Num" + itemName
+ itemDb[itemId] = itemName
+ started = False
+ else:
+ if line == "{":
+ started = True
+ itemId = 0
+ itemName = ""
+ return itemDb
+
+if len(sys.argv) != 4 and len(sys.argv) != 3:
+ printHelp();
+ exit(1)
+startPath = sys.argv[2]
+if len(sys.argv) == 4:
+ sourceFile = sys.argv[3]
+else:
+ sourceFile = "";
+
+itemDb = dict()
+if sys.argv[1] == "re":
+ itemDb = readItemDB(startPath + "/db/re/item_db.conf", itemDb)
+ itemDb = readItemDB(startPath + "/db/item_db2.conf", itemDb)
+elif sys.argv[1] == "pre-re":
+ itemDb = readItemDB(startPath + "/db/pre-re/item_db.conf", itemDb)
+ itemDb = readItemDB(startPath + "/db/item_db2.conf", itemDb)
+else:
+ printHelp();
+ exit(1)
+
+convertFile(sourceFile, itemDb) \ No newline at end of file