[[j_vlastni_script]]
Jak psat script
Aneb stabni kultura neni jen buzerace…
- Zvolte si jakoukoli primerenou konvenci odsazovani a oddelovaci znak (tabulator, nebo 4 mezery apod.), a to dodrzujte jednotne v ramci celeho scriptu
- Piste kod prehledne. Kdyz pisete if, ktery ma nejakou cast dlouhou, prvne osetrete kratke vyjimky. Neni nic neprijemnejsiho, nez za 10 stranek dlouhym blokem dohledavat else a ktere je to prave.
- Misto retezce if (x==1) .. else (x==2) … pouzivejte radsi switch (x) { case y: … }.
- Zakladni funkcni bloky nebo slozitejsi podminky primerene komentujte, pokud neni smysl zrejmy napr. z dialogu.
- Na zacatku popiste, ktere promenne a quest_id vyuzivate, co vlastne obsahuji.
- Uklizejte po sobe, promenne ktere nebudete pouzivat vynulujte, aby nezabiraly zbytecne misto.
- U kazdeho dialogu myslete na neobvykle situace:
- Co kdyz soucasne bude klikat nekdo jiny?
- Co kdyz v polovine dialogu hrac odlogne nebo odportne deckem apod.?
- Co kdyz udela hrac chybu, je cesta zpet?
- Zejmena: VZDY, VZDY a jeste jednou VZDY nastaveni promenne na dalsi krok questu, smazani sezranych itemu a vytvoreni novych delejte v jednom kroku presne v tomto poradi! Uvedomte si, ze pokud vznikne nejaka chyba, script nepokracuje, takze vznikne snadno generator itemu zadarmo.
- Osetrujte i chyby, ktere „nemohou nastat“.
- Pokud nekde mazete nebo vytvarite itemy, VZDY dejte do komentare o jaky item se jedna (napr. 3xOBB)
Mozna konvence odsazovani, kterou pouzivam ja (z realneho NPC, jen je pridana zbytecna sekce OnInit), vypada nasledne:
amatsu,143,148,3 script Kseftar#jirkan 118,{ // povinny format, zde neni co resit mes "[Kseftar]"; // standardni odsazeni jeden tabelator, v levem sloupci je jen definice NPC, jeji ukonceni a pripadne eventy if (!countitem(677)) { // slozena zavorka ktera otevira vnoreny blok na konci radku mes "Vypadni socko, kazis mi ksefty!"; // samotny blok je odsazeny o dalsi tabelator mes "Az budes mit bony prijd"; close; } // uzaviraci zavorka je presne pod prikazem ktery blok otevrel mes "psssst!"; // dalsi kod bez bloku pokracuje dal. mes "hele, ty vypadas bohate, udelame obchod?"; next; mes "[Kseftar]"; mes "Tak ja ti jako pujcim nejakej klip a ty mi zaplatis, co ty na to?"; if (2 != prompt("Tahni drbane!:A co nabizis?")) close; // na jeden radek pouze ty nejjednodussi konstrukce za if, cokoli slozitejsiho do samostatnych bloku next; mes "[Kseftar]"; mes "Mam tu tyhle ctyri klipy, pujcim ti je na 2 hodiny a ty mi za to das jeden bon, plati?"; switch (select("Healing Clip:Hiding Clip:Clip Under a Cast:Clairvoyant Clip:Nic nechci")) { // switch podobne jako if, zacatek bloku na konci radky case 1: // varianty case odsazene o jeden tab delitem 677,1; // ale samotny kod je od case opet odsazeny, aby bylo poznak kde ktera sekce konci rentitem 10600,7200; break; case 2: // vynechavat radek nebo nevynechavat? tot otazka, na jednu delitem 677,1; // kdyz vynechame, je to prehlednejsi, ale zase se min vejde rentitem 10601,7200; // na obrazovku takze se hur orientuje break; case 3: delitem 677,1; rentitem 10602,7200; break; case 4: delitem 677,1; rentitem 10603,7200; break; // takze jsem vynechal radku az u podstatne zmeny default: // vzdy nejak osetrujeme i volby ktere nemusi nastat mes "Tak priste"; break; // tenhle break je nadbytecny, ale na druhou stranu clovek pri dalsim copypastovani nezavlece chybu } close; OnInit: // event jako jediny krome konce od prvniho sloupce npctalk "Tak me tu mate!"; // a kod zase klasicky odsazeny end; }
Poznamka: V tomto scriptu nedodrzuji to, ze delitem a getitem by mely mit popsane co zerou/davaji. Cinim tak protoze je to zrejme z kontextu par radku kolem (zarucene na jedne obrazovce) o jake predmety se jedna.