#!/usr/bin/python
# -*- coding: utf8 -*-
#
# This file is part of Hercules.
# http://herc.ws - http://github.com/HerculesWS/Hercules
#
# Copyright (C) 2018-2020 Hercules Dev Team
# Copyright (C) 2018 Dastgir
#
# 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 .
#
# Usage:
# python petevolutionconverter.py PetEvolutionCln.lub re ../ > pet_evolve_db.conf
import re
import sys
import utils.common as Tools
def printHeader():
print('''//================= Hercules Database =====================================
//= _ _ _
//= | | | | | |
//= | |_| | ___ _ __ ___ _ _| | ___ ___
//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
//= | | | | __/ | | (__| |_| | | __/\__ \
//= \_| |_/\___|_| \___|\__,_|_|\___||___/
//================= License ===============================================
//= This file is part of Hercules.
//= http://herc.ws - http://github.com/HerculesWS/Hercules
//=
//= Copyright (C) 2018-2020 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 .
//=========================================================================
//= 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)
Evolve: {
EggID: { (string, Evolved Pet EggID)
Name: Amount (items required to perform evolution)
...
}
}
AutoFeed: true/false (boolean, defaults to false)
PetScript: <" Pet Script (can also be multi-line) ">
EquipScript: <" Equip Script (can also be multi-line) ">
},
**************************************************************************/''')
def printID(db, name, tabSize = 1):
if (name not in db or int(db[name]) == 0):
return
print('{}{}: {}'.format('\t'*tabSize, name, db[name]))
def printString(db, name, tabSize = 1):
if (name not in db or db[name].strip() == ""):
return
print('{}{}: "{}"'.format('\t'*tabSize, name, db[name]))
def printBool(db, name):
if (name not in db or db[name] == '0'):
return
print('\t{}: true'.format(name))
def printScript(db, name):
if (name not in db or db[name].strip() == ""):
return
print('\t{}: <{}>'.format(name, db[name]))
def printEntry(ItemDB, EvolveDB, autoFeedDB, entry, mode, serverpath):
PetDB = Tools.LoadDB('pet_db', mode, serverpath)
for i, db in enumerate(PetDB):
print('{')
printID(db, 'Id')
printString(db, 'SpriteName')
printString(db, 'Name')
printString(db, 'TamingItem')
printString(db, 'EggItem')
printString(db, 'AccessoryItem')
printString(db, 'FoodItem')
printID(db, 'FoodEffectiveness')
printID(db, 'HungerDelay')
if ('Intimacy' in db and (db['Intimacy']['Initial'] != 0 or db['Intimacy']['FeedIncrement'] != 0 or
db['Intimacy']['OverFeedDecrement'] != 0 or db['Intimacy']['OwnerDeathDecrement'] != 0)):
print('\tIntimacy: {')
printID(db['Intimacy'], 'Initial', 2)
printID(db['Intimacy'], 'FeedIncrement', 2)
printID(db['Intimacy'], 'OverFeedDecrement', 2)
printID(db['Intimacy'], 'OwnerDeathDecrement', 2)
print('\t}')
#
printID(db, 'CaptureRate')
printID(db, 'Speed')
printBool(db, 'SpecialPerformance')
printBool(db, 'TalkWithEmotes')
printID(db, 'AttackRate')
printID(db, 'DefendRate')
printID(db, 'ChangeTargetRate')
if (str(db['Id']) in autoFeedDB):
print('\tAutoFeed: true')
else:
print('\tAutoFeed: false')
printScript(db, 'PetScript')
printScript(db, 'EquipScript')
if (db['EggItem'] in EvolveDB):
entry = EvolveDB[db['EggItem']]
print('\tEvolve: {')
for evolve in entry:
if ('comment' in evolve):
print('/*')
print('\t\t{}: {'.format(evolve['Id']))
for items in evolve['items']:
print('\t\t\t{}: {}'.format(items[0], items[1]))
print('\t\t}')
if ('comment' in evolve):
print('*/')
print('\t}')
print('},')
def saveEntry(EvolveDB, entry):
if (entry['from'] not in EvolveDB):
EvolveDB[entry['from']] = list()
EvolveDB[entry['from']].append(entry)
return EvolveDB
def getItemConstant(entry, ItemDB, itemID):
if (itemID in ItemDB):
return ItemDB[itemID]
print(itemID, "not found", entry)
entry['comment'] = 1
return itemID
def ConvertDB(luaName, mode, serverpath):
ItemDB = Tools.LoadDBConsts('item_db', mode, serverpath)
f = open(luaName)
content = f.read()
f.close()
recipeDB = re.findall(r'InsertEvolutionRecipeLGU\((\d+),\s*(\d+),\s*(\d+),\s*(\d+)\)', content)
autoFeedDB = re.findall(r'InsertPetAutoFeeding\((\d+)\)', content)
current = 0
entry = dict()
EvolveDB = dict()
printHeader()
for recipe in recipeDB:
fromEgg = getItemConstant(entry, ItemDB, int(recipe[0]))
petEgg = getItemConstant(entry, ItemDB, int(recipe[1]))
if (current == 0):
entry = {
'Id': petEgg,
'from': fromEgg,
'items': list()
}
current = petEgg
if (current != petEgg):
EvolveDB = saveEntry(EvolveDB, entry)
entry = {
'Id': petEgg,
'from': fromEgg,
'items': list()
}
entry['id'] = petEgg
entry['items'] = list()
current = petEgg
itemConst = getItemConstant(entry, ItemDB, int(recipe[2]))
quantity = int(recipe[3])
entry['items'].append((itemConst, quantity))
saveEntry(EvolveDB, entry)
printEntry(ItemDB, EvolveDB, autoFeedDB, entry, mode, serverpath)
print(')')
if len(sys.argv) != 4:
print('Pet Evolution Lua to DB')
print('Usage:')
print(' petevolutionconverter.py lua mode serverpath')
print("example:")
print(' petevolutionconverter.py PetEvolutionCln.lua pre-re ../')
exit(1)
ConvertDB(sys.argv[1], sys.argv[2], sys.argv[3])