Questíró tutorial by DeathBat

Indította Okézzátokmárlearegemvaze, 2011-11-27, 04:03:08

2011-11-27, 04:03:08 Utolsó szerkesztés: 2011-11-27, 04:06:41 Szerző: DeathBat666
Sziasztok!

Régebben írtam egy questíró tutorialt (az a régebben másfél éve volt), hát akkor még más időket éltünk, mostmár elég cink lenne úgy megírni egy questet, de nem is húznám tovább a szót.

Mindenekelőtt szeretnék köszönetet mondani abencének, mert amit tudok, annak nagyrészét neki köszönhetem :D
Hát akkor vágjunk is bele.


A questben mindig vannak nyitótagek és zárótagek.
Nyitótag lehet:

[*]quest
[*]when
[*]state
[*]if

Zárótag:

[*]end

A nyitótageket mindig le kell zárni a megfelelő helyen, különben nem fog működni rendesen a questünk.
Célszerű úgy tekinteni a questre, mintha tömbök lennének. Ezeket tabokkal tudjuk vizualizálni is, így tudhatjuk mindig, hogy mikor kell lezárni.

Na de merüljünk bele kicsit jobban.
Egy questet mindig így kezdünk:

quest questneve begin
state start begin


questneve helyére a quested nevét írd értelemszerűen, lehetőleg ékezet nélkül. Az adatbázis is így fogja eltárolni.
Ez az első 2 nyitótag, így a quest legvégére máris írhatsz 2 end-et, mert ezeket ott le is kell zárnunk. Minden egyéb a nyitás és a záró 2db end közé kerül.

A questbe szöveges részek is kerülnek. A szövegeket mindig idézőjelek közé tesszük. Fontos, hogy " előtt ne legyen ékezet, ha mégis így jönne ki, tegyél közé egy szóközt.

Ezután el is kezdhetjük a kis küldetésünk, van funkciónk, vagy amit akarunk.
Nyitnunk kell egy újabb tömböt, amiben elkezdjük magát a cselekményt. Ezt rengetegféleképpen megtehetjük.

Mielőtt bárki félreértené, ahol olyanokat írok mondjuk hogy npcid, mobid, stb, ott értelemszerűen az npc-nek, mob-nak, tárgynak a számát kell írni.

Néhány példa:

NPC-ben menüpont elkezdése:
when npcid.chat."menü1" begin

NPC-ben kattintásra előugró ablak:
when npcid.click begin

Tárgyra való kattintáskor előugró ablak:
when tárgyid.use begin

Ha elfogyna a hely, rakhatunk egy tovább gombot is, majd zavartalanul folytathatjuk a szöveget:
wait()

Ne felejtsük el, hogy most is újabb tageket nyitottunk, amiket az adott tömb végén egy end-del le kell majd zárni.

Ezek után írhatunk pl. szöveget:

Címsor írása:
say_title("cím")

Sima szöveg írása:
say("szöveg")

Szöveg pirosas kiemeléssel:
say_reward("szöveg")

Tárgy mutatása a szövegben:
say_item("tárgy neve",tárgyid,"")

Vagy adhatunk és kérhetünk bizonyos dolgokat...

Tárgy adása:
pc.give_item2("tárgyid",darabszám)

Tárgy elvétele:
pc.removeitem("tárgyid",darabszám)

Adhatunk yangot:
pc.changegold("szám")

Vagy vehetünk el yangot:
pc.changegold("-szám")

Adhatunk expt:
pc.give_exp2("szám")

És még sorolhatnám.
De mondjuk tegyük fel, hogy vissza akarunk kérni egy tárgyat, de az nincs az illetőnek... Na olyankor mi van?
Éppen ezért ilyenkor be kell még a parancs előtt kérni az információkat mindenről, amire szükségünk van.

Például tegyük fel, hogy valamit szinthatárossá akarunk tenni. Ezt így tehetjük meg:
if pc.get_level() >= szint then

Mivel egy ifet nyitottunk, ezt majd le is kell zárni.
Ezután a nyitás után írhatunk szöveget, vagy amit csak akarunk. Na de valamit akkor is kéne csinálnia, ha nincs meg a kritérium.
Ezt kétféleképpen adhatjuk meg:
else
Majd ezután írjuk a folytatást, vagy:
if pc.get_level() < szint then
és itt folytatjuk.

Ezt mondjuk megcsinálhatjuk yangkérésnél is az előző példákra alapozva, csak pc.get_level-t kell kicserélni valami másra.

Ha mondjuk a játékos yangjáról akarunk infot gyűjteni:
pc.get_gold

Ha arról, hogy céhben van-e:
pc.get_guild

Vagy a lószintjét akarjuk tudni:
pc.get_horse_level

Esetleg a birodalmát:
pc.get_empire

Vagy, hogy hol tartózkodik:
pc.get_map_index

Akár a nevét:
pc.get_name

Vagy épp a nemét:
pc.get_sex

Valamelyik skilljének a szintjét:
pc.get_skill_level


De ha már itt tartunk, mért nem csinálunk több menüt is?
Oké, azt már tudjuk, hogy ha rákattintunk egy NPC-re, hogy jöjjön ki menü... Na de a párbeszédpanelen belül is lehet ám csinálni, csak kicsit másképp.

Előszöris, csinálunk neki egy választópanelt, amit elnevezünk ahogy akarunk. A lényeg, hogy ékezet ne legyen benne. Meg szerintem az se célszerű, ha 1db számból áll. Én általában az abc betűivel szoktam elnevezni. Az is fontos, hogy egy questen belül ne legyen 2 menünek ugyanaz a neve.
local menünév=select("menüpont1","menüpont2","menüpont3")

Ebbe 3 menüpontot raktam amint látjátok, de ennek a példájára rakhattok bármennyit.
Utána a menüpontokhoz funkciókat kell rendelni:
if menünév==menüpontszáma then

Ezután folytathatjuk is, amit akarunk, hogy megjelenjen, ha az adott pontra kattintunk. Figyeljetek oda, hogy itt már 2db = jelnek kell lennie egymás mellett!

Célszerű az utolsó pontot egy "kilépés" vagy "mégse"-re írni, hiszen bármikor meggondolhatja magát a játékos.
Tehát mondjuk:
local a=select("menüpont1","menüpont2","Mégse")

Ennél a menünél egyszerűen bezárhatjuk a questet a mégsére kattolásnál:
if a==3 then
return
end


A return maga a kilépés volt, az end-del pedig lezártam az iffel kezdődő tömböt.

De írhatunk akár búcsúszöveget is neki:
if a==3 then
say("ejnyebejnye")
end


Így ki fogja írni, amit akarsz, ott lesz az OK gomb, és amikor rányomsz, akkor fog kiléptetni.


Hmm, kezd bonyolodni a questünk. Tudunk már csinálni NPC-ket, questitemeket, be tudunk kérni infokat és az alapján rangsorolni, tudunk menüt csinálni...
Mit tudunk még csinálni egy questen belül?

Ha már az NPC-knél tartunk, megadhatjuk, hogy ha valamire kattintasz, vagy akár egy párbeszélpanel után megnyisson egy shop ablakot:
npc.open_shop(boltszáma)

A bolt száma helyére a shoptáblában lévő számát kell írni értelemszerűen.

Vagy akár teleportálhatunk is:
pc.warp(koordinátaX,koordinátaY)

Lerakhatunk mobokat:
d.spawn_mob(mobid)

Na de mi lesz a GM questekkel?
Írjuk bele a csak GM-ekre vonatkozó rész nyitótagjébe még a begin előtt:
with pc.is_gm ( )

Ha a zárójelbe írunk egy nevet, akkor csak annak a GM-nek fog megnyílni.

Ezekbe akár GM-parancsokat is beleirathatunk, így ha nem akarunk mondjuk mindenkinek implementor jogot adni, egy egyszerű questtel elérhetővé tehetünk számukra kevésbé veszélyes parancsokat:
command("priv_empire 0 1: 100 24")

Esetleg kiírást is gyárthatunk:
notice_all("szöveg")

Na de ha már ennyire belebonyolodtunk a témába, nehezítsünk még rajta.
Arra gondoltatok már, hogy lehet valamit időzíteni?
timer("timerneve",perc*60)

Majd nyitsz neki egy újabb taget:
when timerneve.timer begin

És leírod alá a funkciót, amit szeretnél, ha történjen, ha lejárt a megadott idő.

Esetleg kioszthatunk státuszokat is a játékosoknak.
Tegyük fel, hogy azt akarjuk lekódolni, hogy ha elmész az egyik NPC-hez, és elfogadsz egy küldetést, utána megjelenjen oldalt egy tekercs, benne az üzenet. Ilyenkor valójában adunk neki egy státuszt, ami elinduláskor megadja, hogy legyen ott egy tekercs.
Maga az NPC párbeszédpanelébe még a zárótag előtt bele kell írnunk:
set_state(státuszneve)

Fontos, hogy a státuszok neve egy questen belül ne egyezzenek meg.
Oké, megkaptuk a státuszt. Indítsuk el:
state státuszneve begin

Alá jöhetnek a funkciók.
Indítsuk el a tekercset:
when letter begin
send_letter("Tekercs címe ami oldalt megjelenik")
end


És adjuk meg a tartalmát:
when button or info begin
say("valami")
end


Bonyolult volt? Na ugye hogy nem :D Vagy mégis? Akkor lássuk egészben az előbb felvázolt szituációt, hátha úgy összeáll a kép.
Tehát tegyük fel, annyiból áll az egész küldetést, hogy elmész a vegyeskereskedőhöz, ő mondd neked valamit, majd megjelenik oldalt egy tekercs emlékeztetőül. Ezt cifrázhatjuk is az eddig megszerzett tudásunkkal:

quest shopreklam begin
state start begin

when 9003.chat."Birodalmak oldata"
say_title(""..mob_name(9003)..":")
say("Szeretnéd megváltoztatni a birodalmad?")
say(" ")
say("Ehhez a Birodalmak oldatára lesz szükséged.")
say_item("Birodalmak oldata",71054,"")
wait()
say_title(""..mob_name(9003)..":")
say("A rossz hírem az, hogy ehhez csak tárgypiacon")
say("juthatsz hozzá. A jó viszont az, hogy ezen")
say("a héten teljesen ingyen adjuk!")
say_reward("Ne hagyd ki az alkalmat")
set_state(emlekezteto)
end

state emlekezteto begin
when letter begin
send_letter("Emlékeztető ")
end

when button or info begin
say_title("Emlékeztető ")
say("Ne feledd, ezen a héten teljesen ingyen van")
say("a Birodalmak oldata a Tárgypiacon!")
say_item("Birodalmak oldata",71054,"")
end
end
end


Ezzel kész is lenne a questünk.
Igen, láthattatok benne egy új funkciót is:
"..mob_name(mobid).."

Ezzel ami id-t megadsz neki, a mob_proto-ra teszel hivatkozást.
Tehát, ha beleírnád, hogy "Vegyeskereskedő", de úgy döntesz, hogy átnevezed mondjuk "Potiárus nyanya"-ra, akkor a questben is át kéne írnod. Ha ezt a kódot használod, akkor viszont a mob_proto-ból olvassa az npc vagy mob nevét, tehát automatikusan átíródik itt is.

Egyébként a quest mappánkban van egy olyan fájl, hogy quest_functions. Ebben megtalálható rengeteg használt parancs, amiket értelemszerűen ti is felhasználhattok. Persze hiányzik belőle jópár, ezért make vagy qc lefuttatásakor ha ilyet láttok:
quest undercleared function parancs
Akkor ami a parancs helyett van, nem ártana beleírni.

Apropó, make...
Ha kész a questünk, mit kéne vele csinálni?
Előszöris, adjunk neki .quest kiterjesztést, majd töltsük fel a quest mappánkba.
Ezután vagy írjuk bele a locale_list/hongkong_list/quest_list (kinek mi van..) fájlunkba, és futtassuk le a make.sh-t vagy make.py-t
(cd-vel mappa betallózása, aztán python make.py vagy sh make.sh)
vagy simán betallózzuk a mappát, és ./qc questneve.quest

A tutorialt lehet még később folytatom. Most valahogy hajnali 4-kor többre nincs erőm :D