diff options
-rw-r--r-- | db/pet_db2.conf | 64 | ||||
-rw-r--r-- | db/pet_db2.txt | 52 | ||||
-rw-r--r-- | db/pre-re/item_db.conf | 16 | ||||
-rw-r--r-- | db/pre-re/pet_db.conf | 1544 | ||||
-rw-r--r-- | db/pre-re/pet_db.txt | 124 | ||||
-rw-r--r-- | db/re/pet_db.conf | 1649 | ||||
-rw-r--r-- | db/re/pet_db.txt | 133 | ||||
-rw-r--r-- | sql-files/item_db.sql | 1 | ||||
-rw-r--r-- | src/map/pet.c | 312 | ||||
-rw-r--r-- | src/map/pet.h | 7 | ||||
-rw-r--r-- | src/plugins/HPMHooking/HPMHooking.Defs.inc | 12 | ||||
-rw-r--r-- | src/plugins/HPMHooking/HPMHooking_map.HPMHooksCore.inc | 16 | ||||
-rw-r--r-- | src/plugins/HPMHooking/HPMHooking_map.HookingPoints.inc | 4 | ||||
-rw-r--r-- | src/plugins/HPMHooking/HPMHooking_map.Hooks.inc | 122 | ||||
-rw-r--r-- | tools/petdbconverter.py | 214 |
15 files changed, 3830 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/sql-files/item_db.sql b/sql-files/item_db.sql index 3a045faf0..08b1be3cd 100644 --- a/sql-files/item_db.sql +++ b/sql-files/item_db.sql @@ -4202,6 +4202,7 @@ REPLACE INTO `item_db` VALUES ('9053','Golem_Egg','Golem Egg','7','0','20','10', REPLACE INTO `item_db` VALUES ('9054','Nightmare_Terror_Egg','Nightmare Terror Egg','7','0','20','10','0','0','0','0','0','0','18446744073709551615','63','2','0','0','0',NULL,'0','1','0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','','',''); REPLACE INTO `item_db` VALUES ('9055','Succubus_Egg','Succubus Egg','7','0','20','10','0','0','0','0','0','0','18446744073709551615','63','2','0','0','0',NULL,'0','1','0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','','',''); REPLACE INTO `item_db` VALUES ('9056','Imp_Egg','Imp Egg','7','0','20','10','0','0','0','0','0','0','18446744073709551615','63','2','0','0','0',NULL,'0','1','0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','','',''); +REPLACE INTO `item_db` VALUES ('9058','Snow_Rabbit_Egg','Christmas Snow Rabbit Egg','7','0','20','10','0','0','0','0','0','0','18446744073709551615','63','2','0','0','0',NULL,'0','1','0','0','0','0','0','467',NULL,'0',NULL,'0',NULL,'0','','',''); REPLACE INTO `item_db` VALUES ('10001','Skull_Helm','Skull Helm','8','0','20','10','0','0','0','0','0','0','18446744073709551615','63','2','0','0','0',NULL,'0','1','0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','','',''); REPLACE INTO `item_db` VALUES ('10002','Monster_Oxygen_Mask','Monster Oxygen Mask','8','0','20','10','0','0','0','0','0','0','18446744073709551615','63','2','0','0','0',NULL,'0','1','0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','','',''); REPLACE INTO `item_db` VALUES ('10003','Transparent_Headgear','Transparent Head Protector','8','0','20','10','0','0','0','0','0','0','18446744073709551615','63','2','0','0','0',NULL,'0','1','0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','','',''); 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 |