I anticipate that the quest is not quite complete as it is a job that I left a few weeks and I do not think that will complete only for lack of desire.
What is missing: to complete the quest really miss a few functions including management and summon pet horse in the application of the bonus for the fighting style I think there is nothing more to add (if I remember correctly).
the quest is very flexible, you can add different fighting styles you find already made 2 as an example .. I had an idea that jumped to mind lately and that are managed differently from now you may get different bonuses fixed for every style and not like now that everyone can choose the bonus from a list .. but this is just an idea for those who will want to develop
questlib.lua:
Code:
PetExpTable = { [1] = 300, [2] = 600, [3] = 900, [4] = 1200, [5] = 1500, [6] = 1800, [7] = 2100, [8] = 2400, [9] = 2700, [10] = 3000, [11] = 3300, [12] = 3600, [13] = 3900, [14] = 4200, [15] = 4500, [16] = 4800, [17] = 5100, [18] = 5400, [19] = 5700, [20] = 6000, [21] = 6300, [22] = 6600, [23] = 6900, [24] = 7200, [25] = 7500, [26] = 7800, [27] = 8100, [28] = 8400, [29] = 8700, [30] = 9000, [31] = 9300, [32] = 9600, [33] = 9900, [34] = 10200, [35] = 10500, [36] = 10800, [37] = 11100, [38] = 11400, [39] = 11700, [40] = 12000, [41] = 12300, [42] = 12600, [43] = 12900, [44] = 13200, [45] = 13500, [46] = 13800, [47] = 14100, [48] = 14400, [49] = 14700, [50] = 15000, [51] = 15300, [52] = 15600, [53] = 15900, [54] = 16200, [55] = 16500, [56] = 16800, [57] = 17100, [58] = 17400, [59] = 17700, [60] = 18000, [61] = 18300, [62] = 18600, [63] = 18900, [64] = 19200, [65] = 19500, [66] = 19800, [67] = 20100, [68] = 20400, [69] = 20700, [70] = 21000, [71] = 21300, [72] = 21600, [73] = 21900, [74] = 22200, [75] = 22500, [76] = 22800, [77] = 23100, [78] = 23400, [79] = 23700, [80] = 24000, [81] = 24300, [82] = 24600, [83] = 24900, [84] = 25200, [85] = 25500, [86] = 25800, [87] = 26100, [88] = 26400, [89] = 26700, [90] = 27000, [91] = 27300, [92] = 27600, [93] = 27900, [94] = 28200, [95] = 28500, [96] = 28800, [97] = 29100, [98] = 29400, [99] = 29700, [100] = 30000, [101] = 30300, [102] = 30600, [103] = 30900, [104] = 31200, [105] = 31500, [106] = 31800, [107] = 32100, [108] = 32400, [109] = 32700, [110] = 33000, [111] = 33300, [112] = 33600, [113] = 33900, [114] = 34200, [115] = 34500, [116] = 34800, [117] = 35100, [118] = 35400, [119] = 35700, [120] = 36000, [121] = 36300, [122] = 36600, [123] = 36900, [124] = 37200, [125] = 37500, [126] = 37800, [127] = 38100, [128] = 38400, [129] = 38700, [130] = 39000, [131] = 39300, [132] = 39600, [133] = 39900, [134] = 40200, [135] = 40500, [136] = 40800, [137] = 41100, [138] = 41400, [139] = 41700, [140] = 42000, [141] = 42300, [142] = 42600, [143] = 42900, [144] = 43200, [145] = 43500, [146] = 43800, [147] = 44100, [148] = 44400, [149] = 44700, [150] = 45000, } PetBonus = { { "offensivo", { "Valore Attacco Fisico","Valore Attacco Magico", }, { "Forte Vs War","Forte Vs Ninja","Forte Vs Sura","Forte Vs Shamy","Forte Vs Mostri", }, { "Danni Critici","Danni Trafiggenti", }, { "Stordimento","Avvelenamento","Rallentamento", }, }, { "difensivo", { "Difesa Attacco Fisico","Difesa Attacco Magico", }, { "Res. Spada","Res. Spadone","Res. Pugnali","Res. Campana","Res. Ventaglio","Res. Freccia","Res. Magia", }, { "Max HP","Max MP", }, { "Rigenerazione HP","Rigenerazione MP", }, }, { 1, { 53,55, }, { 59,60,61,62,63, }, { 15,16, }, { 13,12,14, }, }, { 2, { 54,56, }, { 29,30,31,32,33,34,37, }, { 1,2, }, { 10,11, }, }, } PetArray = { {53001, "fenice_rossa", "Fenice Rossa", 30068, PetExpTable, { 3,1,3,1, }, }, {53002, "fenice_blu", "Fenice Blu", 30068, PetExpTable, { 3,3,1,1, }, }, {53003, "renna", "Renna", 30068, PetExpTable, { 3,1,1,3, }, }, {53005, "azarel", "Azarel", 30068, PetExpTable, { 2,1,3,2, }, }, {53006, "cane", "Cane", 30068, PetExpTable, { 1,3,1,3, }, }, {53007, "leone", "Leone", 30068, PetExpTable, { 1,1,3,3, }, }, {53008, "cinghiale", "Cinghiale", 30068, PetExpTable, { 1,3,3,1, }, }, {53009, "tigre", "Tigre", 30068, PetExpTable, { 2,3,2,1, }, }, } PET_NAME = 1 PET_LEVEL = 2 PET_EXP = 3 PET_TYPE = 1 PET_BON1 = 2 PET_BON2 = 3 PET_BON3 = 4 PET_BON4 = 5 PET_SUMMON = 0 PET_UNSUMMON = 1 PET_READ = 0 PET_WRITE = 1 PET_DATA = 0 PET_BONUS = 1 function inizializza(i) say_title("Pet System:") say("") say("Ciao, hai adottato un nuovo cucciolo") say("per poterlo evocare, come prima cosa") say("dovrai dargli un nome.") local scelta = select("Voglio dargli un nome","Non ora") if scelta == 2 then return -1 end say_title("Pet System:") say("") say("Assegna un nome al tuo cucciolo") say("") say_reward("Nome:") local PetName = tostring(input()) if PetName == "" then say_title("Pet System:") say("") say_reward("Non puoi lasciare l'input vuoto!") return -1 end local DATA_PATH = "locale/italy/quest/object/pet/" local LOCAL_PATH = pc.get_name().."/" local PET_FILE = PetArray[i][2]..".txt" local PET_BONUS_FILE = PetArray[i][2].."_bonus.txt" if pc.getqf("local_path") != 1 then os.execute("cd "..DATA_PATH.." && mkdir "..LOCAL_PATH.." && chmod 777 "..LOCAL_PATH) pc.setqf("local_path", 1) end local file = io.open(DATA_PATH..LOCAL_PATH..PET_FILE , "w") file:write(PetName.."\n1\n0\n") --nome livello exp io.close(file) local bonus = io.open(DATA_PATH..LOCAL_PATH..PET_BONUS_FILE , "w") bonus:write("0\n0\n0\n0\n0\n") io.close(bonus) os.execute("cd "..DATA_PATH..LOCAL_PATH.." && chmod 777 *.txt") return 0 end function GetGrade(i) local PetLevel = tonumber(data_tool(i, PET_LEVEL, PET_DATA, PET_READ)) local x = 0 local y = 0 local Grade = 1 while true do x = x + 1 y = y + 1 if y == 10 then Grade = Grade + 1 y = 0 end if x == PetLevel then return Grade end end end function evoca(i, stato) local bonus = { 3,4,5,6, } local status = PetArray[i][6] local PetGrade = tonumber(GetGrade(i)) local PetName = data_tool(i, PET_NAME, PET_DATA, PET_READ) local PetLevel = tonumber(data_tool(i, PET_LEVEL, PET_DATA, PET_READ)) local horse_level = horse.get_level() local apply = 0 local level = 21 + i if stato == PET_SUMMON then local z = 1 while true do if bonus[z] == nil then break end apply = PetGrade*status[z] affect.add_collect(bonus[z], apply, 60*60*8) z = z + 1 end horse.set_level(level) horse.set_name(PetName) horse.summon() chat("Il pet e' stato evocato") horse.set_level(horse_level) else local z = 1 while true do if bonus[z] == nil then break end apply = PetGrade*status[z] affect.remove_collect(bonus[z], apply, 60*60*8) z = z + 1 end horse.set_level(level) horse.unsummon() chat("Il tuo pet e' andato a riposare") horse.set_level(horse_level) end end function PetInfo(x) while true do say_title("Pet System:") say("Informazioni abilita':") say("") say("Lo stile "..PetBonus[x][1].." si divide in 4") say("categorie principali.") say("potrai sviluppare una sola tecnica per categoria") local y = 0 if x == 1 then y = select( "Valore Attacco","Attacco Vs. Razza","Aumento del danno","Tecniche Speciali","Indietro") else y = select( "Valore Difesa","Difesa Vs. Arma","Aumento dei valori vitali","Tecniche Rigenerative","Indietro") end if y == 5 then break end while true do say_title("Pet System:") say("Informazioni abilita':") say("") say("Con l'apprendimento di questa tecnica potrai") say("incrementare il valore "..PetBonus[x][1]) say("Tecniche disponibili:") say("") local z = 1 while true do if PetBonus[x][y+1][z] == nil then break end say_reward(PetBonus[x][y+1][z]) z = z + 1 end local b = select("Indietro") if b == 1 then break end end end end function PetSet(i, t) say_title("Pet System:") say("Gestione abilita':") say("") say("Hai scelto uno stile di combattimento") say("del tipo "..PetBonus[t][1].." per il tuo pet") say_reward("confermi?") local conferma = select("Si","No") if conferma == 2 then return end say_title("Pet System:") say("Gestione abilita':") say("") say("Una volta scelto lo stile di combattimento") say("hai la possibilita' di allenare nuove abilita'") say("scegli con cura le abilita' da sviluppare") say("") local k = select("Scelgo ora","Scelgo dopo") if k == 2 then return end local w = 2 local bonus = {} local bon = {} while true do if PetBonus[t][w] == nil then break end say_title("Pet System:") say("Gestione abilita': ") say("") say_reward("Puoi allenare solo una delle seguenti abilita'") say_reward("sceglila con cura...") say("") local x = select_table( PetBonus[t][w] ) bonus[w-1] = x bon[w-1] = PetBonus[t][w][x] w = w + 1 end say_title("Pet System:") say("Gestione abilita':") say("") say("Hai scelto:") say("") say("Bonus 1: "..bon[1]) say("Bonus 2: "..bon[2]) say("Bonus 3: "..bon[3]) say("Bonus 4: "..bon[4]) say("") say_reward("Confermi?") say("") local c = select("Si","No") if c == 2 then return end data_tool(i, t.."\n"..bonus[1].."\n"..bonus[2].."\n"..bonus[3].."\n"..bonus[4].."\n", PET_BONUS, PET_WRITE) end function PetMenuAbi(i) local check = tonumber(data_tool(i, PET_TYPE, PET_BONUS, PET_READ)) local status = PetArray[i][6] local PetGrade = tonumber(GetGrade(i)) local PetType = tonumber(data_tool(i, PET_TYPE, PET_BONUS, PET_READ)) local bon1 = tonumber(data_tool(i, PET_BON1, PET_BONUS, PET_READ)) local bon2 = tonumber(data_tool(i, PET_BON2, PET_BONUS, PET_READ)) local bon3 = tonumber(data_tool(i, PET_BON3, PET_BONUS, PET_READ)) local bon4 = tonumber(data_tool(i, PET_BON4, PET_BONUS, PET_READ)) if check == 0 then while true do say_title("Pet System:") say("Benvenuto nel sistema di gestione abilita'") say("come prima cosa devi decidere che tipo") say("di istruzione vuoi dare al tuo pet") local z = select( "Offensiva","Difensiva","Informazioni","Chiudi") if z == 1 then PetSet(i, z) return elseif z == 2 then PetSet(i, z) return elseif z == 3 then while true do say_title("Pet System:") say("Informazioni abilita':") say("") say("Ogni pet può sviluppare 4 abilita'") say("a seconda dello stile di combattimento") say("") local x = select( "Stile Offensivo","Stile Difensivo","Indietro") if x == 1 then PetInfo(x) elseif x == 2 then PetInfo(x) elseif x == 3 then break end end elseif z == 4 then break end end else say_title("Pet System:") say("Gestione abilita':") say("") say_reward("Cosa desideri fare?") say("") local y = select("Stato abilita'","Reset Abilita'","Chiudi") if y == 1 then local point = {} local p = 1 while true do if status[p] == nil then break end point[p] = status[p]*PetGrade p = p + 1 end say_title("Pet System:") say("Stato abilita':") say("") say_reward("Status:") say("VIT: +"..point[1]) say("INT: +"..point[2]) say("STR: +"..point[3]) say("DEX: +"..point[4]) say_reward("Bonus:") say(PetBonus[PetType][2][bon1]..": +"..PetGrade) say(PetBonus[PetType][3][bon2]..": +"..PetGrade) say(PetBonus[PetType][4][bon3]..": +"..PetGrade) say(PetBonus[PetType][5][bon4]..": +"..PetGrade) elseif y == 2 then say_title("Pet System:") say("Reset abilita'") say("che tipo di istruzione vuoi dare al tuo pet?") say_reward("Ricorda il reset può essere usato ogni 3 giorni") local j = select("Stile Offensivo","Stile Difensivo","Chiudi") if j == 1 then PetSet(i, j) elseif j == 2 then PetSet(i, j) else return end elseif y == 3 then return end end end function show_pet_menu(i) local PetName = data_tool(i, PET_NAME, PET_DATA, PET_READ) local PetRace = PetArray[i][3] local PetFood = PetArray[i][4] local PetGrade = tonumber(GetGrade(i)) local PetLevel = tonumber(data_tool(i, PET_LEVEL, PET_DATA, PET_READ)) local PetExp = tonumber(data_tool(i, PET_EXP, PET_DATA, PET_READ)) local PetNextExp = PetArray[i][5][PetLevel] while true do say_title("Pet System:") say("Benvenuto nel sistema di gestione del pet") say("") say_reward("cosa desideri fare?") local s = select("Stato Pet", "Ciba Pet", "Abilita' Pet", "Altro", "Chiudi" ) if s == 4 then say_title("Pet System:") say("Benvenuto nel sistema di gestione del pet") say("") say_reward("cosa desideri fare?") local z = select( "Cambia Nome", "Manda via", "Indietro", "Chiudi" ) if z == 1 then say_title("Pet System:") say("") say("Assegna un nuovo nome al tuo cucciolo") say("") say_reward("Nome:") local PetNewName = tostring(input()) if PetNewName == "" then say_title("Pet System:") say("") say_reward("Non puoi lasciare l'input vuoto!") return end if PetNewName == nome then say_title("Pet System:") say("") say_reward("Non puoi usare lo stesso nome!") return end data_tool(i, PetNewName.."\n"..PetLevel.."\n"..PetExp.."\n", PET_DATA, PET_WRITE) evoca(i, PET_UNSUMMON) evoca(i, PET_SUMMON) return elseif z == 2 then evoca(i, PET_UNSUMMON) return elseif z == 3 then elseif z == 4 then break end elseif s == 1 then say_title("Pet System:") say("") say("Nome: "..PetName) say("Razza: "..PetRace) say("Livello: "..PetLevel) say("Grado Istruzione: "..PetGrade) say("Exp: "..PetExp.." / "..PetNextExp) say("Salute: "..horse.get_health_pct().."%") say("Resistenza: "..horse.get_stamina_pct().."%") say("Cibo: "..item_name(PetFood)) return elseif s == 2 then if pc.countitem(PetFood) > 0 then say_title("Pet System:") say("") say("Il tuo cucciolo e' felice") say("per l'ottimo spuntino che ha fatto") pc.removeitem(PetFood, 1) horse.feed() return else say_title("Pet System:") say("") say("Per cibare il tuo cucciolo") say("hai bisogno di: "..item_name(PetFood)) say("") return end elseif s == 3 then if PetLevel >= 10 then PetMenuAbi(i) return else say_title("Pet System:") say("") say_reward("Il Pet deve essere almeno Lv 10") return end elseif s == 5 then break end end end function PetGiveExp(i, Point) local PetName = data_tool(i, PET_NAME, PET_DATA, PET_READ) local PetLevel = tonumber(data_tool(i, PET_LEVEL, PET_DATA, PET_READ)) local PetExp = tonumber(data_tool(i, PET_EXP, PET_DATA, PET_READ)) local PetNextExp = PetArray[i][5][PetLevel] if PetLevel == 150 then return end local PetNewExp = PetExp + Point while true do if PetNewExp < PetNextExp then break end PetNewExp = PetNewExp - PetNextExp PetLevel = PetLevel + 1 end data_tool(i, PetName.."\n"..PetLevel.."\n"..PetNewExp.."\n", PET_DATA, PET_WRITE) end function data_tool(i, linea, tipo, modo) local DATA_PATH = "locale/italy/quest/object/pet/" local LOCAL_PATH = pc.get_name().."/" local x = 1 local file = "" local PET_FILE = "" local PET_BACKUP = "" if tipo == PET_DATA then PET_FILE = PetArray[i][2]..".txt" PET_BACKUP = PetArray[i][2]..".bak" elseif tipo == PET_BONUS then PET_FILE = PetArray[i][2].."_bonus.txt" PET_BACKUP = PetArray[i][2].."_bonus.bak" end if modo == PET_READ then file = io.open(DATA_PATH..LOCAL_PATH..PET_FILE, "r") while true do local line = file:read("*l") if line == nil then break end text = string.gsub(line, "\n", "") if x == linea then io.close(file) return text end x = x + 1 end io.close(file) elseif modo == PET_WRITE then os.execute("cd "..DATA_PATH..LOCAL_PATH.." && mv "..PET_FILE.." "..PET_BACKUP) file = io.open(DATA_PATH..LOCAL_PATH..PET_FILE, "w") file:write(linea) io.close(file) os.execute("cd "..DATA_PATH..LOCAL_PATH.." && chmod 777 "..PET_FILE) end end
Code:
quest pet_system begin state start begin when 53001.use or 53002.use or 53003.use or 53005.use or 53006.use or 53007.use or 53008.use or 53009.use begin local ItemValue = item.vnum for i = 1, table.getn(PetArray), 1 do if PetArray[i][1] == ItemValue then local PetState = PetArray[i][2] if pc.getqf("pet_index") == 0 then if pc.getqf(PetState) == 0 then local check = inizializza(i) if check != 0 then return end pc.setqf(PetState, 1) end pc.setqf("pet_index", i) evoca(i, PET_SUMMON) else evoca(i, PET_UNSUMMON) pc.setqf("pet_index", 0) end end end end when 20120.click with pc.getqf("pet_index") == 1 begin show_pet_menu(1) end when 20121.click with pc.getqf("pet_index") == 1 begin show_pet_menu(1) end when 20122.click with pc.getqf("pet_index") == 1 begin show_pet_menu(1) end when 20123.click with pc.getqf("pet_index") == 2 begin show_pet_menu(2) end when 20124.click with pc.getqf("pet_index") == 2 begin show_pet_menu(2) end when 20125.click with pc.getqf("pet_index") == 2 begin show_pet_menu(2) end when 20126.click with pc.getqf("pet_index") == 3 begin show_pet_menu(3) end when 20127.click with pc.getqf("pet_index") == 3 begin show_pet_menu(3) end when 20128.click with pc.getqf("pet_index") == 3 begin show_pet_menu(3) end when 20129.click with pc.getqf("pet_index") == 4 begin show_pet_menu(4) end when 20130.click with pc.getqf("pet_index") == 4 begin show_pet_menu(4) end when 20131.click with pc.getqf("pet_index") == 4 begin show_pet_menu(4) end when 20132.click with pc.getqf("pet_index") == 5 begin show_pet_menu(5) end when 20133.click with pc.getqf("pet_index") == 5 begin show_pet_menu(5) end when 20134.click with pc.getqf("pet_index") == 5 begin show_pet_menu(5) end when 20135.click with pc.getqf("pet_index") == 6 begin show_pet_menu(6) end when 20136.click with pc.getqf("pet_index") == 6 begin show_pet_menu(6) end when 20137.click with pc.getqf("pet_index") == 6 begin show_pet_menu(6) end when 20138.click with pc.getqf("pet_index") == 7 begin show_pet_menu(7) end when 20139.click with pc.getqf("pet_index") == 7 begin show_pet_menu(7) end when 20140.click with pc.getqf("pet_index") == 7 begin show_pet_menu(7) end when 20141.click with pc.getqf("pet_index") == 8 begin show_pet_menu(8) end when 20142.click with pc.getqf("pet_index") == 8 begin show_pet_menu(8) end when 20143.click with pc.getqf("pet_index") == 8 begin show_pet_menu(8) end when kill with pc.getqf("pet_index") != 0 begin local i = pc.getqf("pet_index") if pc.get_level() > (npc.get_level() + 15) then return end if pc.get_level() <= npc.get_level() then PetGiveExp(i, 5) elseif pc.get_level() <= (npc.get_level() + 5) then PetGiveExp(i, 4) elseif pc.get_level() <= (npc.get_level() + 10) then PetGiveExp(i, 3) elseif pc.get_level() <= (npc.get_level() + 15) then PetGiveExp(i, 1) end end when logout with pc.getqf("pet_index") != 0 begin local i = pc.getqf("pet_index") evoca(i, PET_UNSUMMON) pc.setqf("pet_index", 0) end when login with pc.getqf("pet_index") != 0 begin local i = pc.getqf("pet_index") evoca(i, PET_UNSUMMON) pc.setqf("pet_index", 0) end end end
NOTE: for the proper functioning of the quest have to apply a dif for the function npc.get_level
Code:
This difference file is created by The Interactive Disassembler game2089 0014E762: 89 90 0014E763: C3 90 0014E764: 74 75 0014E765: 07 61 0014E766: 8B 90 0014E767: 50 90 0014E768: 24 90 0014E769: 85 90 0014E76A: D2 90 0014E76B: 74 90 0014E76C: 33 90 0014E7C7: 24 0F 0014E7C8: 04 B6 0014E7C9: E8 80 0014E7CA: 82 0A 0014E7CB: F5 05 0014E7CC: 17 00 00312349: 72 6C 0031234B: 6D 76 0031234C: 61 65 0031234D: 69 6C 0031234E: 6E 00
enjoy
d3m0n3