QuestFolder = get_locale_base_path().."/quest/"
--**
--** Funzioni pet system base
--** by BlackYuko
--** Skype: manu___88
--**
-- Classe
PetSystem = {['Folder'] = QuestFolder.."io/pet/", ['Flag'] = "active_pet"}
-- Pet 1
PetSystem[1] = {['Name'] = "Fenice Rossa", ['Level'] = 22, ['Item'] = 50512, ['StartingLevel'] = 50, ['FinalLevel'] = 210}
PetSystem[1].Skill = {
{['type']=apply.MAX_HP,['name']="Sangue Vitale",['max_points']=30,['min_level']=PetSystem[1].StartingLevel,['desc']="+100HP",['mult']=100,['tag']=" HP"},
{['type']=apply.INT,['name']="Luce Divina",['max_points']=15,['min_level']=PetSystem[1].StartingLevel,['desc']="+1 INT",['mult']=1,['tag']=" intelligenza"},
{['type']=apply.STR,['name']="Forza Celeste",['max_points']=15,['min_level']=PetSystem[1].StartingLevel,['desc']="+1 STR",['mult']=1,['tag']=" forza"},
{['type']=apply.DEX,['name']="Astuzia",['max_points']=15,['min_level']=PetSystem[1].StartingLevel,['desc']="+1 DEX",['mult']=1,['tag']=" destrezza"},
{['type']=apply.STEAL_HP,['name']="Assorbimento",['max_points']=15,['min_level']=PetSystem[1].StartingLevel+25,['desc']="+1% ass. HP",['mult']=1,['tag']="% assorbimento HP"},
{['type']=apply.ATT_GRADE_BONUS,['name']="Furia",['max_points']=20,['min_level']=PetSystem[1].StartingLevel+50,['desc']="+10 valore attacco",['mult']=20,['tag']=" valore di attacco"},
{['type']=apply.CRITICAL_PCT,['name']="Precisione Mortale",['max_points']=20,['min_level']=PetSystem[1].StartingLevel+75,['desc']="+1% possibilita' sui colpi critici",['mult']=1,['tag']="% critici"},
{['type']=apply.ATTBONUS_MONSTER,['name']="Frenesia",['max_points']=20,['min_level']=PetSystem[1].StartingLevel+100,['desc']="+1% forte contro mob",['mult']=1,['tag']="% forte contro mob"},
{['type']=apply.BLOCK,['name']="Tattica",['max_points']=10,['min_level']=PetSystem[1].StartingLevel+125,['desc']="+1% blocco corporale",['mult']=1,['tag']="% blocco corporale"}
}
-- Pet 2
PetSystem[2] = {['Name'] = "Fenice Blu", ['Level'] = 23, ['Item'] = 50513, ['StartingLevel'] = 50, ['FinalLevel'] = 205}
PetSystem[2].Skill = {
{['type']=apply.MAX_HP,['name']="Sangue Vitale",['max_points']=30,['min_level']=PetSystem[2].StartingLevel,['desc']="+100HP",['mult']=100,['tag']=" HP"},
{['type']=apply.INT,['name']="Luce Divina",['max_points']=20,['min_level']=PetSystem[2].StartingLevel,['desc']="+1 INT",['mult']=1,['tag']=" intelligenza"},
{['type']=apply.STR,['name']="Forza Celeste",['max_points']=20,['min_level']=PetSystem[2].StartingLevel,['desc']="+1 STR",['mult']=1,['tag']=" forza"},
{['type']=apply.DEX,['name']="Astuzia",['max_points']=20,['min_level']=PetSystem[2].StartingLevel,['desc']="+1 DEX",['mult']=1,['tag']=" destrezza"},
{['type']=apply.RESIST_SWORD,['name']="Protezione Spada",['max_points']=10,['min_level']=PetSystem[2].StartingLevel+25,['desc']="+1% difesa spada",['mult']=1,['tag']="% dif. spada"},
{['type']=apply.RESIST_TWOHAND,['name']="Protezione Spadone",['max_points']=10,['min_level']=PetSystem[2].StartingLevel+50,['desc']="+1% difesa spadone",['mult']=1,['tag']="% d. spadone"},
{['type']=apply.RESIST_DAGGER,['name']="Protezione Pugnale",['max_points']=10,['min_level']=PetSystem[2].StartingLevel+75,['desc']="+1% difesa pugnale",['mult']=1,['tag']="% dif. pugnale"},
{['type']=apply.RESIST_BOW,['name']="Protezione Arco",['max_points']=10,['min_level']=PetSystem[2].StartingLevel+100,['desc']="+1% difesa freccia",['mult']=1,['tag']="% dif. freccia"},
{['type']=apply.RESIST_MAGIC,['name']="Protezione Magia",['max_points']=10,['min_level']=PetSystem[2].StartingLevel+125,['desc']="+1% difesa magia",['mult']=1,['tag']="% dif. magia"},
{['type']=apply.ATTBONUS_HUMAN,['name']="Frenesia Mortale",['max_points']=15,['min_level']=PetSystem[2].StartingLevel+150,['desc']="+1% mezziuomini",['mult']=1,['tag']="% mezziuomini"}
}
--**
--** Menu Pet
--**
function PetSystem.ShowMenu(PetIndex)
if horse.is_mine() then
say_title("Pet "..PetSystem[PetIndex].Name)
local skill_points = PetSystem.GetSkillPoints(PetIndex)
say_light_yellow("Punti abilita': "..skill_points)
say("Seleziona l'operazione:[ENTER]")
local s = select("Informazioni","Gestisci Abilita'","Stato Abilita'","Manda Via","Chiudi")
----------********** Informazioni ***********----------
if s == 1 then
say_title("Informazioni")
say("Il Pet e' un piccolo animale che accompagnera' il")
say("personaggio durante le sue avventure. Il suo")
say("comportamento e' simile a quello del cavallo,")
say("ma una volta evocato, il Pet dara' al personaggio")
say("dei bonus a seconda dei punti abilita' che gli")
say("sono assegnati. Puoi assegnare i punti abilita'")
say("dal menu '' Gestici Abilita' ''. A seconda del Pet,")
say("in una certa fascia di livelli ti verrà dato 1 punto")
say("abilita' per livello da assegnare al Pet.[ENTER]")
wait()
say_title("Informazioni")
say("Ogni abilita' ti dara' un certo bonus, che")
say("aumentera' ad ogni punto che le assegnerai.")
say("Il massimo numero di punti assegnabile varia")
say("da un'abilita' all'altra. Puoi assegnare e togliere")
say("punti alle abilita' come preferisci.[ENTER]")
----------********** Gestisci Abilita' ***********----------
elseif s == 2 then
say_title("Gestici Abilita' - Pet "..PetSystem[PetIndex].Name.."")
local skill_value = {}
local skill_menu = {}
local skill_indexes = {}
skill_value = PetSystem.LoadSkill(PetIndex)
if table.getn(skill_value) == 0 then
say("Il tuo pet non possiede abilita'.[ENTER]")
return
end
for i = 1, table.getn(PetSystem[PetIndex].Skill) do
if pc.get_level() >= PetSystem[PetIndex].Skill[i].min_level then
table.insert(skill_menu, PetSystem[PetIndex].Skill[i].name..": "..skill_value[i].." punti")
table.insert(skill_indexes, i)
end
end
table.insert(skill_menu, "Annulla")
if table.getn(skill_menu) > 7 then
window_height = (table.getn(skill_menu)-7)*30+300
else
window_height = 300
end
say("Seleziona l'abilita':")
say_size(350, window_height)
local s = select_table(skill_menu)
if s == table.getn(skill_menu) then
return
end
local skill_idx = skill_indexes[s]
say_title(PetSystem[PetIndex].Skill[skill_idx].name)
say_orange("Punti attuali abilita': "..skill_value[skill_idx].." [ENTER]")
say_light_blue("A ogni punto: "..PetSystem[PetIndex].Skill[skill_idx].desc.."")
say_light_blue("Massimo numero di punti: "..PetSystem[PetIndex].Skill[skill_idx].max_points.."[ENTER]")
say("Seleziona l'operazione:[ENTER]")
local s = select("Aumenta Abilita'","Diminuisci Abilita'","Annulla")
if s == 3 then
return
----------********** Aumenta Abilita' ***********----------
elseif s == 1 then
say_title(PetSystem[PetIndex].Skill[skill_idx].name)
if skill_points == 0 then
say("Non possiedi punti abilita', non puoi aumentarla.[ENTER]")
return
elseif skill_value[skill_idx] == PetSystem[PetIndex].Skill[skill_idx].max_points then
say("L'abilita' ha raggiunto il livello massimo.[ENTER]")
return
end
say_orange("Punti abilita' disponibili: "..skill_points)
say("Di quanti punti vuoi aumentare l'abilita'?[ENTER]")
local points = tonumber(input())
say_title(PetSystem[PetIndex].Skill[skill_idx].name)
if points == nil or points < 1 then
say("Hai inserito un valore non valido.[ENTER]")
return
elseif points > skill_points then
say("Non possiedi abbastanza punti abilita'.[ENTER]")
return
elseif (skill_value[skill_idx]+points) > PetSystem[PetIndex].Skill[skill_idx].max_points then
say("Se aumentassi l'abilita' di "..points.." punti,")
say("supererebbe il valore massimo. Inserisci un")
say("valore minore.[ENTER]")
return
end
skill_value[skill_idx] = skill_value[skill_idx]+points
PetSystem.ChangeSkillPoints(PetIndex, -points)
PetSystem.SaveSkill(PetIndex, skill_value)
PetSystem.AddBonus(PetIndex)
say("L'abilita' e' stata aumentata di "..points.." punto/i.[ENTER]")
----------********** Diminuisci Abilita' ***********----------
elseif s == 2 then
say_title(PetSystem[PetIndex].Skill[skill_idx].name)
if skill_value[skill_idx] == 0 then
say("L'abilita' ha zero punti, non puoi diminuirla.[ENTER]")
return
end
say("Di quanti punti vuoi diminuire l'abilita'?[ENTER]")
local points = tonumber(input())
say_title(PetSystem[PetIndex].Skill[skill_idx].name)
if points == nil or points < 1 then
say("Hai inserito un valore non valido.[ENTER]")
return
elseif points > skill_value[skill_idx] then
say("L'abilita' non possiede cosi' tanti punti.[ENTER]")
return
end
skill_value[skill_idx] = skill_value[skill_idx]-points
PetSystem.ChangeSkillPoints(PetIndex, points)
PetSystem.SaveSkill(PetIndex, skill_value)
PetSystem.AddBonus(PetIndex)
say("L'abilita' e' stata diminuita di "..points.." punto/i.[ENTER]")
end
----------********** Stato Pet ***********----------
elseif s == 3 then
local skill_value = {}
skill_value = PetSystem.LoadSkill(PetIndex)
say_title("Stato Abilita' - Pet "..PetSystem[PetIndex].Name.."")
say_light_blue("Salute: "..horse.get_health_pct().."%")
say("")
for i = 1, table.getn(PetSystem[PetIndex].Skill) do
if pc.get_level() >= PetSystem[PetIndex].Skill[i].min_level then
local total = skill_value[i]*PetSystem[PetIndex].Skill[i].mult
say_light_yellow(PetSystem[PetIndex].Skill[i].name..": livello "..skill_value[i]..". Bonus: "..total..PetSystem[PetIndex].Skill[i].tag)
end
end
say("")
----------********** Manda via Pet ***********----------
elseif s == 4 then
PetSystem.PetBack()
elseif s == 5 then
return
end
end
end
--**
--** Manda via il pet
--**
function PetSystem.PetBack()
local err, liv, name = PetSystem.LoadHorseData()
PetSystem.RemoveBonus()
PetSystem.SetInactive()
if err then
say_title("Richiamo Pet")
say("Impossibile caricare i dati del cavallo.")
say("Se sei un GM, impostati il livello del")
say("cavallo diverso da quello dei pet, e usa")
say("di nuovo il richiamo del pet o il libro")
say("del cavallo.[ENTER]")
return
end
PetSystem.SetHorseData(liv, name)
horse.unsummon()
chat("Hai mandato via il Pet")
end
--**
--** Imposta nome e livello al cavallo
--**
function PetSystem.SetHorseData(level, name)
horse.set_level(level)
horse.set_name(name)
end
--**
--** Carica le abilita' del pet specificato
--**
function PetSystem.LoadSkill(PetIndex)
local FileName = PetSystem.Folder..pc.get_name().."_"..PetSystem[PetIndex].Name.."_skills"
local PetSkill = {}
if io.open(FileName, "r") == nil then
io.output(FileName)
for i = 1,table.getn(PetSystem[PetIndex].Skill) do
io.write("0\n")
table.insert(PetSkill, 0)
end
io.flush()
io.close()
return PetSkill
end
for line in io.lines(FileName) do
table.insert(PetSkill, tonumber(line))
end
return PetSkill
end
--**
--** Salva le abilita' del pet specificato
--**
function PetSystem.SaveSkill(PetIndex, SkillList)
local FileName = PetSystem.Folder..pc.get_name().."_"..PetSystem[PetIndex].Name.."_skills"
io.output(FileName)
for i,v in ipairs(SkillList) do
io.write(tostring(v).."\n")
end
io.flush()
io.close()
end
--**
--** Legge i punti abilità di un pet
--**
function PetSystem.GetSkillPoints(PetIndex)
local FileName = PetSystem.Folder..pc.get_name().."_"..PetSystem[PetIndex].Name.."_stats"
local n
if io.open(FileName, "r") != nil then
io.input(FileName)
n = tonumber(io.read())
io.input():close()
else
io.output(FileName)
io.write("0")
io.flush()
io.close()
n = 0
end
return n
end
--**
--** Modifica i punti abilità di un pet
--**
function PetSystem.ChangeSkillPoints(PetIndex, amount)
local FileName = PetSystem.Folder..pc.get_name().."_"..PetSystem[PetIndex].Name.."_stats"
local n
if io.open(FileName, "r") != nil then
io.input(FileName)
n = tonumber(io.read())
n = n+amount
io.input():close()
else
n = amount
end
io.output(FileName)
io.write(tostring(n).."\n")
io.flush()
io.close()
end
--**
--** Aggiunge i bonus del Pet specificato in base ai punti abilita' assegnati
--**
function PetSystem.AddBonus(PetIndex)
PetSystem.RemoveBonus()
local SkillList = {}
SkillList = PetSystem.LoadSkill(PetIndex)
for i = 1,table.getn(SkillList) do
affect.add_hair(PetSystem[PetIndex].Skill[i].type, SkillList[i]*PetSystem[PetIndex].Skill[i].mult, 60*60*24*365)
end
end
--**
--** Rimuove i bonus del Pet
--**
function PetSystem.RemoveBonus()
affect.remove(520)
end
--**
--** Carica le informazioni sul cavallo (nome, livello)
--**
function PetSystem.LoadHorseData()
local FileName = PetSystem.Folder..pc.get_name().."_horse"
if io.open(FileName, "r") != nil then
io.input(FileName)
local liv_cav = tonumber(io.read())
local horse_name = io.read()
if liv_cav == nil or horse_name == "" then
io.input():close()
return true
end
io.input():close()
return false, liv_cav, horse_name
end
return true
end
--**
--** Salva le informazioni sul cavallo (nome, livello)
--**
function PetSystem.SaveHorseData()
local FileName = PetSystem.Folder..pc.get_name().."_horse"
if io.open(FileName, "w") != nil then
local horseLev = horse.get_level()
if PetSystem.IsPetLevel(horseLev) then
return 2
end
io.output(FileName)
io.write(tostring(horseLev).."\n")
local horse_name = horse.get_name()
if horse_name != "" then
io.write(horse_name)
else
io.write("Cavallo")
end
io.flush()
io.close()
return 0
end
return 1
end
--**
--** Controlla se il livello del cavallo e' associato a un pet
--**
function PetSystem.IsPetLevel(level)
for i=1,PetSystem.GetPetNumber() do
if level == PetSystem[i].Level then
return true
end
end
return false
end
--**
--** Controlla se il pet ha imparato una nuova abilità
--**
function PetSystem.NewSkillLearnt(PCLevel)
if PCLevel == PetSystem.StartingLevel then
return
end
for i,v in ipairs(PetSystem) do
for j = 1,table.getn(v.Skill) do
if PCLevel == v.Skill[j].min_level then
return true
end
end
end
return false
end
--**
--** Ritorna il numero totale di pet definiti
--**
function PetSystem.GetPetNumber()
return table.getn(PetSystem)
end
--**
--** Ritorna il numero totale di pet definiti
--**
function PetSystem.GetPetNumber()
return table.getn(PetSystem)
end
--** Imposta il pet attivo
function PetSystem.SetActivePet(petIndex)
pc.setqf(PetSystem.Flag, petIndex)
end
--** Ritorna se il pet system è attivo
function PetSystem.IsActive()
return (pc.getqf(PetSystem.Flag) > 0)
end
--** Disattiva il pet system
function PetSystem.SetInactive()
pc.setqf(PetSystem.Flag, 0)
end
--** Ritorna il numero del pet attivo
function PetSystem.GetActivePet()
return pc.getqf(PetSystem.Flag)
end