Pagana koodimine 2

Postitusaeg: september 2016

Kuna juba mure lahti rääkisin, siis võin sama hästi ka lõpuks leitud lahenduset jagada.

Nagu kipub sedalaadi murede korral olema, on lahendus tegelikult imelihtne, lihtsalt sellises kohas, kust seda otsida ei oska. Tuleb välja, et probleem polnud otseselt üldse koodis, vaid selles, mille peale kood jooksma läks.

Nimelt toimivad Neverwinter Nights mootoris koodid selliselt, et kui oled selle valmis kirjutanud, pead leidma koha, kuhu see kinnitada ehk määrama, mille peale kood käivitub. Neid saab kinnitada alade külge, esemete külge või kasvõi mooduli enda külge. Kui kinnitada kood tegelase külge, on valikus 13 päästikut. Iga päästik käivitub mingi sündmuse peale mängumootoris. Näiteks kood, mis on kinnitatud tegelase lahtrile 'OnDeath' käivitub hetkel, kui NPC ära sureb.

Kui Vangide esimeses osas oli lihtsalt punane hoiatus, et vestlusi ei tohiks katkestada, siis praeguseks olen kogenum ja oskan vestlusi kodeerida selliselt, et neid lihtsalt pole võimalik katkestada (lülitan kasutajaliidese, so hiire ja klaviatuuri käsklused, vestluse ajaks välja (välja arvatud need, mis on vaja valikute tegemiseks)).

Eeldasin, et lahter OnConversation käivitub, kui NPCga (Non-Player Character) vestlust alustada. See eeldus oli vale. Nimelt vahetavad NPCd Neverwinter Nightsi mootoris omavahel nähtamatuid sõnumeid. Näiteks kui üks NPC sattub lahingusse, siis saadab ta teatud raadiuses laiali nähtamatu hädakutse ja kui mõni sama fraktsiooni NPC juhtub läheduses olema, siis vastavalt OnConversation päästikusse kodeeritud iseloomule tuleb ta esimesele appi või põgeneb kusagile kaugemale. Nende nähtamatute sõnumite eesmärk on imiteerida lahingumüra kuulmist. OnConversation kood vallandub alati kui NPC sõnumeid kuuleb, mitte ainult juhul kui peategelane teda otse kõnetab.

Minu eesmärk oli luua vestlus, kus NPC Evgenija peab peategelasega maha dialoogi, mida ei saa katkestada. Vastavalt valikutele dialoogis vastab Evgenija pärast vestlemist uuesti kõnetamisel ühe kahest lühidast repliigist, ilma tegelikku vestlust alustamata ja kasutajaliidest eemaldamata. Millegi pärast kadus kasutajaliides aga teistkordsel kõnetamisel ikkagi ära.

Sain nüüd aru, et kuna lähedal koridoris viibis teisi NPCsid, kellega vesteldes samuti kasutajaliides eemaldatakse, vallandus nende vestluskood lihtsalt selle peale, et nad kuulsid, kuidas tegelane Evgenijaga vestleb. Sest, nagu mainisin, vallandub OnConversation päästikule kinnitatud kood mitte ainult konkreetse NPCga dialoogi alustamise, vaid igasuguse NPC poolt kuuldud sõnumi peale. See on hea, sest võimaldab üsna keerulist käitumist läbi NPCde omavahel vahetatud nähtamatute käskluste, aga oli praegu halb, sest põhjustas kasutajaliidese eemaldamise millal iganes katkematu vestlustega NPC kuuldeulatuses viibis.

Õnneks on olemas parameeter (listenpatternnumber), mis eristab kuuldud sõnumeid otse alustatud dialoogist. Seades koodile tingimuse, et kasutajaliides eemaldatakse ainult juhul, kui NPCga otse dialoogi alustatakse (listenpatternnumber = -1), sai sama koodi edukalt OnConversation päästiku pealt tööle.