A "Szveges kalandjtkok ksztsnek gyakorlati problmi" cm szakdolgozat
szvege

Ksztette: Olessk Rbert, a Kand Klmn Mszaki Fiskola szmra, 1997-ben



1. TARTALOMJEGYZK



1. TARTALOMJEGYZK
2. SSZEFOGLAL
3. SUMMARY
4. KIDOLGOZS
4.1. Els rsz: A kalandjtk-kszts ltalnos tudnivali
4.1.1. A kalandjtk fogalmnak tisztzsa
4.1.2. Kalandjtk s mitolgia
4.1.3. A szmtgp beszlni tanul
4.1.4. A szavaktl a mondatok fel
4.1.5. Helyisgek sszefgg labirintusa
4.1.6. Barangols a trkpen
4.1.7. Lakberendezv vltozunk
4.1.8. Hogyan talljunk meg valamit?
4.1.9. "Sokasodjatok s nvekedjetek!"
4.1.10. Az id kerekhez ktve
4.1.11. Nhny jtancs s tovbbi lehetsgek
4.2. Msodik rsz: A babtbor a szmtgpbe megy
4.2.1. A program mkdsnek lersa
4.2.2. Hasznlati tmutat
5. IRODALOM




2. SSZEFOGLAL



	Jelen rs kt f rszbl fog llni. Az els rszben magt a
kalandjtk fogalmt trgyaljuk, illetve ltalnossgban beszlnk annak
megvalstsi formirl s lpseirl. Fkppen a hagyomnyos szveges
kalandjtkrl esik sz benne, kln koncentrlva a magyar nyelv szvegrts
nehzsgeire (fnevek s igk ragozsa, ktetlen szrend, kezetes betk
stb.). A msodik rsz azzal foglalkozik rviden, hogy az ismertetett alapelvek
milyen formban kerltek alkalmazsra a J. R. R. Tolkien: A bab cm regnye
nyomn rdott kalandjtk elksztse sorn. Az emltett program
dokumentcija s kezelsi tmutatja zrja le a tanulmnyt.
	Jtkokkal foglalkozni nem felttlenl tartozik a lenzend vagy
megvetend tevkenysgek kz: minden llny egszsges llapota, ha jtszik,
s klnsen pedig a legnagyobb matematikusok mindig is rendkvl jtkos
elmk voltak. Itt van pl. mindjrt Neumann Jnos; vagy a John Conway angol
matematikus ltal kiagyalt letjtk - sejtautomata, mely kilt a szmtgpes
megvalsts utn. lltom, hogy a kalandjtk is ugyanebbe a kategriba
tartozik!




3. SUMMARY



	Present writing will consist of two main parts. In the first part, we
treat the idea of adventure itself, respectively talk about its forms and
steps of realization. The question of  traditional text adventures comes up
mainly, especially concentrating the difficulties of Hungarian textual
analysis (inflection of nouns and verbs, absolutely free order of words,
accented letters etc.). The second part shortly deals with that how the
recited principles were applied while making the adventure The Hobbit adapted
from J. R. R. Tolkien's novel, the same entitled. The documentation and users'
manual of the mentioned program closes the study.
	Playing games is not necessarily one of those activities we can look
down and despise: every living creatures' healthy condition if playing, and
especially the greatest mathematicians were always extraordinarily playful
minds. For example, John Neumann at once; or the Life Game thought out by
English mathematician John Conway - a cell automaton crying for computer
realization. I state positively that adventure comes under the same category,
too!




4. KIDOLGOZS



4.1. A kalandjtk-kszts ltalnos tudnivali


4.1.1. A kalandjtk fogalmnak tisztzsa

	Az isteni szikra kt egyetemista (bizonyos Crowther s Woods nevezet
riemberek) fejbl pattant ki 1977-ben, amikor is ellltak PDP-10
szmtgpre ksztett - s akkoriban mg teljesen eredetinek szmt -
jtkprogramjukkal, melynek az "Adventure" (magyarul: "Kaland") cmet adtk.
Egy kgykkal, mankkal s ms mesebeli lnyekkel benpestett fldalatti
labirintusban elszrt kincseket kellett a jtkosnak megtallnia. Maga a
program a korabeli diksg kedvenc szrakozsv lpett el; a rakasztott
elnevezs pedig - az azta eltelt kt vtized sorn - olyan fogalomm
tereblyesedett, melyrl ma mr szinte mindenkinek ms-ms dolgok jutnak
eszbe. Szmtgpjtkok tzezrei viselik bszkn vagy kevsb bszkn ezt a
besorolst, de ha nmelyiket kzlk egyms mell raknnk, ht bizony meg sem
fordulna a fejnkben a gondolat, hogy ezeknek brmi kzk is lehet egymshoz.
Az egyik kpernyn egy kicsinytett sznes csatateret ltunk mintegy
madrtvlatbl, veznyszra ide-oda rohangl figurkkal tarktva; a msikat
egy trhats, penszes fal brtn hatalmas stt alagtja tlti be; a
harmadikon mondatokba s bekezdsekbe trdelt, srn szedett aprbets szveg
olvashat. Pedig valamennyi ugyanarrl a kzs trl fakad: amirl ebben az
rsban sz lesz, az mindezek stpusa, mely mindazonltal nem pusztult ki s
nem tnt el teljesen ma sem, csupncsak ersen httrbe szortotta t ezer
gon fejld leszrmazottainak hihetetlen burjnzsa - pontos meghatrozs
szerint ez az n. hagyomnyos szveges kalandjtk. A "kalandjtk" szt teht
mostantl kezdve ebben az rtelemben hasznlom. Mg ha msfajta programot
szndkozik kszteni valaki, akkor is errl az alaprl kell elindulnia; s
noha fkppen ezekrl lesz sz, termszetesen a tma alapelvei mindenfajta
grafikus jtkra is vonatkoznak - elvgre a rajzos kls is csak egy burok,
amit ha lehntunk rla, a program belsejben hasonlan kell nyilvntartanunk a
dolgokat. (S minekutna egy sznvonalas szveges jtkot megrni nmileg
nehezebb programozi feladat, mint egy grafikust, ez egyttal j iskolt is
jelent a ksbbiek szmra.)
	Mihelyt egy ilyen programot elindtunk, rendszerint valamilyen klns
helysznen, egy fantziavilg kzepn talljuk magunkat. Kapunk egy
bekezdsreval lerst vagy valamilyen kpet tartzkodsi helynk kzvetlen
krnyezetrl - esetleg nmi magyarzatot is arrl, mikppen kerltnk oda -,
s elindulunk flfedezni vilgunk ismeretlen titkait. A klasszikus modellben a
jtk egyfajta prbeszdes zemmdban mkdik: mi valamit mondunk a
szmtgpnek (krjk vagy utastjuk valaminek a megttelre),  pedig
zenetek tjn rtest bennnket lpseink eredmnyrl. De cselekvstl
fggetlenl is trtnhetnek esemnyek. Maga a jtk lnyegben egy kitallt
vilg letnek szimulcija: ez a vilg, hogy knnyebben brzolhat legyen,
hatrozott, klnll helyisgekre oszlik. Egy-egy ilyen helyszn lehet pl.
egy erdei tiszts, egy lpcsfordul, egy szoba egy hzban vagy egy t vizn
ringatz csnak - ltalnossgban a terep brmely jellegzetes pontja, mely a
folyamatos mozgs szmra megllhelyet, a ltvnynak kapaszkodt biztost;
egyedl a ksztk gondossgn mlik, milyen rszletessggel tagoljk az egsz
helysznt kisebb vagy nagyobb helyisgek sokasgra. A klnll helyeket
tjrk ktik ssze egymssal; megllapods szerint ezeket gtjakkal szoks
azonostani, gy rendszerint tz-tizenkt irnyban haladva kerlhetnk
egyikbl a msikba (a nyolc gtj, kiegsztve a FEL/LE/KI/BE lehetsgeivel).
Pl. egy folypartrl szak fel indulva egy erd peremhez rkeznk. Egy
helysznrl tbbnyire hrom-ngy kijrat vezet (a tbbi irnyban pl. fal van,
vagy ms gtl tnyezk), s a vilg trkpt megkaphatjuk gy, ha ezeket az
utakat, mint csompontokat sszekt hlzatot, lerajzoljuk egy paprra. Hogy
ne lehessen rgtn az egszet bejrni, ajtk, kapuk s ms nylszrk
feszlnek itt-ott kt-kt helyisg kztt (ezek nyitva, csukva s zrva
lehetnek), de gyakorlatilag brmilyen tpus akadly is elkpzelhet: komls,
amit el kell takartani, ellensges szerepl, aki elllja az utat, vagy akr
egy vizesrok, egy kerts vagy brmi. A helyisgeket helyhez kttt dszletek
s mozdthat trgyak tltik meg - utbbiakat fl lehet venni, le lehet rakni,
el lehet cipelni mshov s a legklnbzbb clokra alkalmazni ket. Tipikus
eszkzk pl. a lmpa, mellyel sttben vilgtani tudunk, vagy a lezrt ajtk
kulcsai - de itt is akrmi elkpzelhet. Ugyancsak jelen vannak itt a hozznk
hasonl (csak a gp ltal vezrelt) llnyek, szereplk. A legvltozatosabb
mdokon kommuniklhatunk velk: beszlgethetnk, megtmadhatjuk ket,
trgyakat csereberlhetnk; lehetnek helyhez ktttek s passzvak, de
mozoghatnak is egyik helyisgbl a msikba, st, hozznk hasonlan "sajt
akaratukbl" cselekedhetnek is ezt-azt; lehetnek ellensgesek vagy
bartsgosak. Legegyszerbb viselkedsnk egy ilyen vilgban az lehet, hogy
cltalanul csavargunk kusza labirintusnak terein, mikzben rdekldve
figyeljk elre beprogramozott vagy vletlenszeren vltoz lett. Ez minden
kalandjtk vza, s klnbsget mindssze az tesz egyik vagy msik kzt, hogy
a helyisgek, akadlyok, trgyak s szereplk egymshoz val viszonyt
mennyire sszetetten s sokoldalan kpes megjelenteni szmunkra.
	Mg nhny szt arrl, mirt is jelent egy ignyes (!!!) szveges
jtk elksztse kemnyebb megprbltatst, mint grafikus testvrei. Egy
igazn intelligens programnak igk s fnevek szzait, ezreit kell megrtenie
s helyesen alkalmaznia, kztk egy raks, semmilyen szablyba sem sorolhat
kivtellel: a jtkos ezeket tetszse szerint varilhatja egymssal, aminek
kvetkeztben a parancsoknak sok tzezer vagy akr tbb milli (vagy mg ennl
is tbb!) kombincija s varicija is elkpzelhet bennk, s ez radsknt
mg a helysznek s helyzetek szmval is igencsak flszorzdik (nem mindegy,
hogy hol adjuk ki ket, vagy hogy melyik lpsnk elzi meg a msikat) - olyan
rengeteg, hogy egyetlen jtk(os) sem kpes akrcsak tredkig kiaknzni
ket. Ha egy kalandjtk fenn kvnja tartani a valszersg ltszatt (s
ezen keresztl a jtkosok rdekldst...), gy ezek a lehetsgek kzl
minl tbbre kell valamilyen rtelmes vlasszal szolglnia, azt az illzit
keltve, mintha birtokban lenne valamennyinek - a programoznak lehetsg
szerint minden szmbajhet kombincit figyelembe kne vennie, elvarrnia
minden elkpzelhet szlat. Ksbb majd ltni fogjuk, hogy az utastsok
kielemzse, a szragozs s a szvegrts nehzsgei is micsoda egy bonyolult
problmval kesertik letnket. Ezzel szemben egy grafikus jtk irnytsa
ikonokon, menkn keresztl zajlik, s a mindssze maroknyi alapfunkci mr
nmagban tredkre zsugortja a kiprblhat lehetsgek szmt, melyeket
csupn listaszeren vgig kell venni. (A tnyleges megjelents problmja
pedig mr nem is a programozra, hanem a rajzolra tartozik...) A cselekvsi
trnek ppen ez a beszklse magyarzza egybknt azt is, hogy igazn
intelligens jtkokat mirt nem lehet grafikusan, hanem kizrlag szveges
alapknt elkszteni. (Esetleg olyan keresztezdsek  formjban, mint
amilyen pl. a Maniac Mansion volt, a Times of Lore vagy a Tir Na Nog.) A
szveges jtkok legnagyobb varzst pontosan az nyjtja, hogy sohasem
rezhetjk bennk gy, hogy kimertettk sszes rendelkezsre ll
lehetsgeiket; elvgre rkk tmegvel maradnak mg olyan prostsok,
amelyeket egyszeren nem jutott esznkbe lerni (klnsen, ha a programozk
gondoskodtak rla, hogy brentartsk bennnk a remnyt, mindenfle utalsok
kpben) - egy grafikus jtknl ez a tgassg rzse csak sokkal szernyebb
mrtkben van jelen. (Azonkvl manapsg mr egy szveges jtkkal szemben is
alapvet elvrs, hogy grafikus kpernyt kezeljen - legalbb a megtervezett
betkszlet s az llkpek erejig.)


4.1.2. Kalandjtk s mitolgia

	Ha valaki szereti a srt, annak nyilvn nagyobb rmet okoz
elfogyasztani egy korsnyi Soproni szokot, mint a szmtgpbe ptygni, hogy
IGYL SRT. Termszetesen a szmtgpes jtkok nem arra valk, hogy
helyettestsk az igazi dolgokat (helytelenl teszi, aki erre hasznlja ket),
hanem hogy valami olyasmit nyjtsanak, amelyet mshol nem tall meg az ember.
Mert mi is tulajdonkppen egy kalandjtk? Vilgmodell: olyan, mint a
Karcsonyfa a gyertyival, amely a csillagos gre emlkeztet (a bok a
Tejutat, az veggmbk a bolygkat jelkpezik rajta stb.). Az ltalunk
elkpzelt vilgnak egy - ugyancsak ltalunk - ltrehozott, kicsinytett msa.
s minl gazdagabb, rnyaltabb s rszletesebb ez a vilg, annl nagyobb
rmet jelent foglalkozni vele.
	Minden egyes embernek - hacsak nem kvn maga is elveszni, eltvedni
vagy sztforgcsoldni a nagyvilgban - alapveten srget ignye van r, hogy
az t krlvev vilgot egy egysges egszknt lssa t. Mivel pedig ezt a
valsgban kivitelezni - tekintettel r, hogy a Mindensg milyen
elkpzelhetetlenl roppant tmeg, szvevnyes s bsges valami -
nyilvnvalan remnytelen s lehetetlen vllalkozs volna, gy nem marad ms
htra, mint ennek mintjra egyszerstett, stilizlt fantziakpeket,
szimblumokat teremteni magunkban. Olyanokat, melyek - vgesek lvn -
befogadhatan s megemsztheten utalnak vissza a Vgtelensgre. (Maga a
Nyelv, amit beszlnk, a leggynyrbb pldja ennek!)
	A mitolgia a rgiek ltal elkpzelt htrteg vilgegyetem
brzolsa volt: a regk s mtoszok tbbsge az egyes csillagkpeket s az
gitestek mozgst (s azok rnk gyakorolt hatst, a napszakok s vszakok
vltozsait) rja le jelkpes, metaforikus megfogalmazsban. A magyar
npmesket elemz Jankovics Marcell rsaibl kiderl, hogy rszben ugyanez a
hagyomny folytatdik a npmesk vilgban is: amikor Borsszem Jank megli a
hatkrs szekeret, az eredetileg a Gncl ht csillagnak megjelentse volt.
(A hetedik, a leghalvnyabb, a szekr rdjnak a tvben, a Jank.) Az
ltalunk oly elszeretettel magunknak vallott Csodaszarvas mondja sem
kizrlag a mink, hanem fknt Szibriban, de gyakorlatilag az egsz szaki
flgmbn ltalnosan elterjedt motvumot alkot; s hogy az ghez ktdik, azt
mi sem bizonytja jobban, mint hogy e terlet legtvolabbi vidkein is -
egyms ltrl semmit sem tudva - megszlalsig hasonl trtneteket szttek
az emberek az szaki gbolt bizonyos csillagkpei kr. (A Cassiopeia, a
Perseus s az Auriga egytt egy szalad szarvashoz hasonlt, s az ezt
krlvev alakok a trtnet tovbbi hsei. A klnbz npek sajtos
vltozatai kzti klnbsgek pedig jrszt visszavezethetk arra, ahogy az
eltr fldrajzi krlmnyek miatt mskppen ltszanak a csillagok az gen.)
Termszetesen nem puszta szrakozsbl fektettek tekintlyes mennyisg
szellemi munkt egy teljes, sszefgg jelkprendszer kialaktsba, hanem
mert elemi szksgk volt r: rs-olvass, naptr, irnyt, trkp s ms,
tjkozdst segt tallmnyok hjn ezekkel rtk le a krlttk lev vilg
naponta, havonta s venknt ciklikusan visszatr vltozsait. (Egyes
szibriai smndobokon pldul olyan elrendezsben lyukakat frtak, hogy
azokon keresztl az gbolt megfelel csillagaira nzve, a dob valamelyik
dsztse mutatta az szaki irnyt - gy hasznltk ezeket, mint tengersz a
szextnst.) Nemcsak romantikus lmodozs hozta ket ltre, de a maguk
krnyezetben komoly gyakorlati jelentsggel brtak. A bvs szmok,
alkmiai, asztrolgiai jelkpek, a npi babonban csknysen meglapul
szmmisztika - mindezek taln egy trtnelem eltti, sszefgg csillagszat
s matematika darabokra hullott, trmelkes maradvnyai.
	A szveges kalandjtkoknak kezdetben mg megvolt az az egyedlll
varzsuk, hogy az archaikus vilgnak erre az elvesztett rendjre
emlkezhetett ltaluk az ember (br persze nem kzvetlenl, hanem csak
tttelesen: magt az elbbi alapelvet, a csillagkpek brzolst hiba
keresn bennk brki - de pldul a kelta mitolgia elemeit ezerszer is
flhasznltk bennk); a hmplyg szveg s a mellette illusztrciknt
alkalmazott kpek ltvnya rgi knyvek hangulatra emlkeztetett; a
szellemes tvesztk, a jl eltallt lersok - s egyltaln: a Nyelv, a
Beszd kzponti szerepe - pedig tagadhatatlanul nmi irodalmi zt adtak neki.
Azta lassanknt eluralta ket a rajzfilm meg az zlet, s kiadik ma mr Walt
Disney-szer giccsfigurkkal keresnek dollrmillikat. Amikor mg jformn
csak szvegek voltak bennk, a jtkosnak (a szerznek meg aztn plne!)
igencsak meg kellett tornztatnia a kpzelett, hogy maga eltt lssa a
mgttk rejl vilgot; s ezt a vilgot mindenki egy picit msmilyennek
ltta, attl fggen, hogy mennyire s mivel egsztette ki azt nmagban,
bell (amitl aztn rszben a magnak is rezhette ket). Ha egy 16-milli
szn, trhats mozgkp jelenik meg a kpernyn, az - a tkletes illzi
lehengerl erejvel brva - jval cseklyebb bels rszvtelt ignyel a
nztl, aki ennek megfelelen nem is csinl egyebet, mint lustn s
kznysen kattintgat az egrrel ide-oda. Ha egy hangzs tkletes, mr nincs
mit kiegszteni rajta, s a hallgatsgra szinte nincs is szksg hozz: az
els pr perc izgalma utn mla undorba s unalomba fullad az egsz.
	Mivel a kalandjtk, mint olyan, is csak egy jelkpes brzols, ezrt
egyrtelmen a dekadencia jelnek tekinthet, ha a jtkosok attl vannak
elragadtatva, hogy a kp- s hanghatsoknak ksznheten milyen lethen
jelennek meg benne a fhsk meg a helyszn - ahelyett, hogy a lnyegvel
trdnnek a jtknak! A ksztk pedig a divathullmot meglovagolva
szorgalmasan csomagoljk szmukra a ltvnyosan ragyog semmit...
	Jelenleg szinte alig akad olyan terlete a PC-s vilgnak, ahol az
eredeti szndk mg rvnyeslni kpes; de ez is inkbb csak a technikai
krlmnyeknek (pontosabban azok korltainak...) ksznheti ltt; az
Interneten keresztl jtszhat kalandjtkokrl van sz. A TELNET egy
viszonylag gyors s egyszer szveges prbeszdes kapcsolatot ltest egy
kzponti gp s a hozz bejelentkez terminlok kztt - ezt kihasznlva
rengeteg szveges jtkot rtak s rnak, amelyek egy (rendszerint Linux-os
alap) szolgltat gpen jjel-nappal futnak, s a vilg brmelyik pontjrl
brki beljk lphet. Legkellemesebb vonsa ezeknek a programoknak az, hogy
rajtunk kvl is mg akrhny illet rszt vehet bennk egyidejleg, a jtk
tbbi szerepljt is igazi hs-vr emberek irnytjk: nincs szksg tbb a
szmtgp ltal jl-rosszul szimullt rtelemre, hiszen valdi rtelem
(mgpedig egyszerre akr tbb szz!) jelenik meg helyette, a szereplkn,
mint szcsveken t. A klnbz jtkosok egyttmkdhetnek, segthetik
egymst, csapatokat alkothatnak, vagy akr versenghetnek is egymssal vagy
egyms ellen. Ezekben az let megszakts nlkl zajlik - hogyha mi kilpnk
belle, az addigi helyzet akkor is ltezik tovbb. Tallhat kztk nhny
sznvonalas alkots (pl. Holy Mission, Isengard). Htrnyuk viszont, hogy
ezeknek a parancsrtelmezjt - lustasgbl, vagy ki tudja, mirt - szinte
minden esetben rendkvl elhanyagoljk: sokszor csak a legprimitvebb, "egy
ige meg egy fnv" tpus utastsok kirtkelsre kpesek, nem lehet egyben
tbb parancsot berni s gy tovbb. A hinyz minsget itt a mennyisggel
ptoljk: a nagyszm szereplre mretezve rendszerint sokezer helysznt s
trgyat zsfolnak ssze beljk; jllehet tleteik tbbsge nem igazn
eredeti. Szintn elgg rossz tulajdonsguk mg az is, hogy sablonos mdon
valamennyi inkbb szerepjtk, mint kaland - ami azt jelenti, hogy klnfle
ellensgek leldsse rn begyjttt tapasztalati pontok segtsgvel lehet
flfel lpkedni a rangltrn, s ez a "fejlds" kpezi a jtk
tulajdonkppeni lnyegt s cljt. Lteznek bellk magyar nyelv alkotsok
is - egyszeren borzalmasak. Nem azrt, mert a TELNET-en nem lehet
keresztlzavarni az kezetes betket, ez mg rendben is volna; hanem a
szvegek hemzsegnek a fogalmazsi s helyesrsi hibktl - a parancsok
szintaktikjrl nem is szlva... (Egyik legszerencstlenebb hzs volt
pldul az angol HELP helyettestse a SG-val s hasonlk...)


4.1.3. A szmtgp beszlni tanul

	A kalandjtk "lelke" - azaz legfontosabb, legbonyolultabb s
legtbbet foglalkoztatott rsze - a beadott mondatokat rtkel programrsz
(parancsrtelmez, szvegrtelmez, rtelmez, fordt, vagy angolul "parser",
"interpreter" stb.). Hiba a legkprzatosabb szobor-kompozci, ha az egy
bevakolt szobban, a ltogatk ell elzrva hever, gyhogy kvlrl senki sem
frhet hozz. Szmunkra is egyik leglnyegesebb krds, hogy a programunkban
troland vilgba mikppen kapjon betekintst a jtkos. Egy kritikus
megjegyzs szerint a kalandjtkok a "nma gyereknek anyja sem rti a szavt"
kzmondson alapulnak, s ez eleinte valban gy is szokott lenni: ha valaki
csak gy lel egy ilyen jtk el, az leginkbb egy res beviteli mezvel
tallja magt szembe, s fogalma sincs rla, mit vrnak el tle. A ms
helyeken ltalnossgban kialakult szoksok ugyan segtenek kiss eligazodni
egy j programban is, de legjobb egy teljesen laikus felhasznlt
felttelezni. Sohasem tudhatjuk elre, hogy a - mienktl esetleg teljesen
elt szjrs - kalandoznak mifle tletei tmadnak, ezrt a jtkok
intelligencijnak fokmrje, hogy ugyanannak a szndknak a
megnyilvnulsait milyen sokfle klnbz formban kpesek azonostani.
Pldul, ha egy hz kijrata egy dlkeletre nyl ajt, akkor nem elg a
programot csak a DK, DLKELET, MENJ DLKELETRE... stb. tpus parancsok
fogadsra flkszteni, elvgre a szemfles jtkos teljes lelki bkvel
nyilatkozhat gy is, hogy MENJ KI A KERTBE, HAGYD EL A HZAT, TVOZZ, LPJ T
AZ AJTN... - s mg hosszan sorolhatnnk ugyanannak a mozgsnak a klnfle
megfogalmazsait. Minl tbb ilyen azonos rtk kifejezssel elboldogul,
annl sznvonalasabb lesz a programunk, s a jtkosok is annl jobban fogjk
lvezni! Rgebben, amikor mg a 16-, 48-, 64-kbyte-os mikroszmtgpek
jelentettk - a jtkpiacon - az ltalnosan elfogadott szintet, elegend volt
azok teljestkpessgre hivatkozni, ami a jtkok lehetsgeit is eleve
behatrolta. Ma viszont, amikor egy PC nemritkn akr 32-64 MB RAM-ot is
rejteget, s a processzorok sebessge is hihetetlen rtkeket produkl,
radsul mindez folytonosan egyre tovbb bvl (s ki tudja, hov vezet
mindez?!...), a fizikai korltok egyszeren megsznnek ltezni: egy
kalandjtk sznvonalt most mr egyedl a ksztje lustasga, vagy
fantzija, szkincsnek bsge (vagy przaibb okok kzl: a ksztsre
rsznt id...) hatrozza meg. De tny, hogyha egy SD LE A RABLT mellett azt
is magunknak akarjuk tudni, hogy LSD EL A BAJT A RABLNAK, az nemcsak
egyszeren a sztr bvtst jelenti, hanem effle szvirgok kezelsvel a
kd is egyre bonyolultabb vlik...
	Na de tlsgosan elre szaladtunk (ez lett volna a bevezet
ugyanis...): hogyan is szlunk egyltaln egy ilyen jtkhoz? Valamit ugyebr
cselekedni hajtunk benne, s ezt a kzvett programnak az rtsre prbljuk
adni: szndkunkat egy megllapods szerinti nyelv szablyain keresztl kell
megfogalmaznunk. Legjobb (volna), ha ez a nyelv mind kzelebb ll(na) a
termszetes beszlt nyelvhez - de ahhoz, hogy ezt maradktalanul
megvalstsuk, egy olyan "szmtgpet" kellene ptennk, melyben - mint rgi
szlhmos sakkautomatkban - benne l egy ember... Megkzelteni azonban lehet
- pontosabban azt a ltszatot kelteni, mintha megkzeltettk volna.
	ltalnos szably, hogy mindinkbb egyszernek, spontnnak s magtl
rtetdnek ltszik valami a felhasznl szemszgbl nzve, annl nagyobb
appartust knytelen a programoz megmozgatni hozz, hogy egyltaln mkdjn
a dolog. A kvlll szmra termszetes a nyelv, amelyen beszl, a
legcseklyebb szellemi erfeszts nlkl helyezi egyms mell a szavakat.
Fogalma sincs rla, milyen egy irdatlanul bonyolult rendszernek a birtokban
van, s hogy a szerencstlen programoz mennyit izzad vele, mg vgl valami,
ehhez gy-ahogy hasonlt nagynehezen kiprsel magbl. Klnskpp rvnyes ez
a magyar nyelvre. Vilgszerte a kalandjtkok tlnyom tbbsgt angol nyelven
rtk. Ez nemcsak a nyugati rgi egyik legltalnosabb nyelve, de
egyszersmind a legegyszerbb nyelvtani szerkezetek kz is tartozik - ezrt
is olyan knnyszerrel megtanulhat, mint kztudott rla. Az angol nyelv nem
(vagy csak elvtve) hasznl ragokat, jeleket, maguk a szavak tbbnyire
vltozatlanok maradnak, helyette a kztk fennll viszonyt az ersen kttt
szrend s az elljrk mutatjk meg. A fneveknek nincsenek nemeik, s mg
csak a magzdst sem ismeri. sszetett szavak kpzse is gy trtnik, hogy
egyszeren egyms mell raknak kt darab nvszt, s legtbbszr mg csak egybe
sem rjk ket (vagy ha mgis, akkor ktjellel). Semminem kezetet nem
hasznlnak, az sszetett hangzkkal sincs klnsebb gond. Egyszval, akrcsak
az akcfa vagy a kposztalepke, az angol nyelv is alapvet ignytelensgnek
ksznheti azt, hogy vilgszerte elterjedhetett... Nzzk meg, hogyan hangzik
angolul, ha valakit megkrnk r, hogy nyissa ki az ajtt: OPEN THE DOOR
(esetleg mg hozztehetjk, hogy PLEASE - de ennek most semmi jelentsge
nincsen). Az egsz felszlts kt egyszer szbl tevdik ssze (a nvelvel
most nem foglalkozunk, azokat szimpln t lehet lpni): OPEN s DOOR, melyek -
brmilyen sszefggsben is hasznljuk ket - minden esetben vltozatlanok
maradnak, nem szmtva az idnknt a vgkre kerl "-s" bett vagy "-ing"
vgzdst, gy egy sztrbl kikeresve szemvillans alatt azonostani lehet
ket. Radsul a mondat szrendje is szigoran kttt (nem mondhatjuk pl. azt,
hogy DOOR OPEN), teht bizonyosan tudjuk rluk azt is, hogy az els az ige s
a msodik a fnv. (Itt most csak a kalandjtkok irnytshoz felhasznlt
nyelvrl esik sz.) Bvtsk most egy hatrozval ezt a mondatot! Tegyk fel,
hogy kulccsal szeretnnk kinyitni az ajtt. Ez esetben gy hangzik: OPEN THE
DOOR WITH KEY. A szrend most is kttt, s mindssze annyi a klnbsg, hogy
a WITH elljrt kvet fnevet, mint eszkzhatrozt vesszk figyelembe, nem
pedig, mint trgyat.
	Ugyanez magyarul mr jval kemnyebb dit jelent. Hogyan is
fordtannk le az elbbi pldkat gy, hogy rtelmesen sszefgg mondatokat
kapjunk? Valahogy gy: NYISD KI AZ AJTT (ha netntn magzdunk a programmal,
akkor a NYISD helyett NYISSA ll...), vagy ha nem parancsolgatni akarunk,
akkor mondjuk KINYITOM AZ AJTT. De mi van akkor, ha NYISD KI AZ AJTT
KULCCSAL helyett mi inkbb gy fogalmaznnk, hogy NYISD KI KULCCSAL AZ AJTT?
Vagy: KULCCSAL NYISD AZ AJTT KI? Esetleg: AZ AJTT A KULCCSAL NYITOM KI?...
Folytathatnnk a sort: valamennyi rtelmes, s - a hangulati rnyalatoktl
eltekintve - ugyanazt jelentik. A szrend itt mr semmifle tmpontot nem
nyjt, hiszen gyakorlatilag korltlanul szabad - a szavak rtelmt egymstl
elszaktva, nmagukban kell megtallnunk. De mikppen dntsk el, hogy
egyltaln melyik szrl van sz? Hiba szerepel a sztrunkban a NYIT ige, ha
egyszer neknk olyanokat rnak, hogy NYISD, NYISSA, KINYITOM, NYITOM... - s
mg vagy szzfle klnbz ragozott alak. Mg ha attl eltekintnk is, hogy
az igektvel egybe- avagy klnrjuk-e az igt, akkor is mennyi lehetsg
marad! A fnevek ragozsa ugyancsak egy cifra eset. Mr maga a legalapvetbb
trgyrag sem pusztn csak egy "-t" betbl ll: magnhangzs vg szavaknl
kezetet kap az utols bet (pl. alma - almt), nha kimarad egy hangz (bokor
- bokrot, tkr - tkrt), hossz magnhangzk rvidlhetnek (g - eget, tz -
tzet), azutn meg ott vannak a klnfle kthangok is (-at, -et, -ot, -t),
minden szhoz ms-ms fajta. Minden egyes hatroznak sajt ragja van: -ba,
-be, -ra, -re, -n, -on, -en, -n, -bl, -bl, -rl, -rl, -tl, -tl, -nak,
-nek, -hoz, -hez, -hz, -val, -vel, -v, -v, -kor, -rt, -ig... stb. stb.
Ebbl is van vagy negyven-tven fle! (A KULCCSAL radsul mg egy klnleges
eset is, hiszen -val, -vel esetn a "-v-" helyett duplzdik az utols bet, s
miutn "cs"-rl van sz, mg csak nem is az "s", hanem a "c" bet...)
Amennyiben emell mg a tbbesszm s birtokos eset jeleit is engedlyezzk,
gy az elbbi mennyisg ezek szmval szorzdik (!!!), teht vgeredmnyben
minden egyes fnvnek tbbszz fle klnbz ragozott alakja lehet! Ha a
sztrunk mondjuk ezer szbl ll, akkor a keresskor ez tbb szzezer szval
val sszehasonltst jelent, ami mr nmagban vve is egy kptelensg; nem
beszlve arrl, hogy lehetetlen volna ennyi alakot mind-mind letrolni.
Megabyte-okat foglalna el, s percekig tartana megtallni benne valamit...
	A legegyszerbb, korai, ignytelen jtkokban mg kikerltk ezt a
problmt, ahelyett, hogy megbirkztak volna vele. Valamifle hallgatlagos
megllapodssal kialaktottak maguknak egy n. "csonka magyart" - ezalatt a
nyelvnek egy roppant alacsony szintre cskkentett vltozata rtend. Az angol
forrshoz igazodva, azonos sorrend szprokat vrt el bevitel gyannt a
program, s kizrlag a szavak ragozatlan sztri alakjt lehetett alkalmazni
benne. Az idzett parancsok gy hangzottak ezen a nyelven: NYIT AJT, ill.
NYIT AJT KULCS... Nmelyest fifiksabb, de ppilyen gpies s felsznes
megoldsnak bizonyult az is, amikor a szavak els nhny betje alapjn
kerestek a sztrban (tbbnyire az els hromtl az els tig terjedt ez a
hossz). Pldul egy program az els ngy bett vette figyelembe, s ezltal a
NYISS ABLAKOT utastsbl ennyit ltott csak: NYIS ABLA. A sztrban ennek
alapjn egysgesen ngybets jelsorozatok voltak trolva, az ennl rvidebb
szavaknak - vagy amelyek tve megvltozott, mint a NYIT ige esetben a "t" s
az "s" bet - termszetesen fl kellett vennik a ragozott alakjait is. (A
CSOM s a CSOMAG szavakat mr nem is tudta volna megklnbztetni egymstl.)
Amennyiben ignyesebb programokat szeretnnk rni, nem elgedhetnk meg
ezekkel a primitv mankkkal! Meg kell tantanunk beszlni azt a buta
cskavast...
	Szksg lesz teht egy algoritmusra, mely a sztrban kln-kln
meglv sztvek s ragok alapjn dolgozik, s mindkt irny mkdsre kpes:
egyrszt a begpelt szavakat sztbontja sztre s ragokra (ezeket a programon
bell majd sorszmmal fogjuk azonostani), vagyis rtelmezi azokat - msrszt
fordtva: a megadott sznak ellltja a megadott tpus ragozott alakjt.
(Erre azrt lesz szksg, hogy parancsunkra a szmtgp vlaszolni is tudjon,
azaz ki tudja rni helyesen a kpernyre a neveket.) Figyelembe kell vennie
bizonyos szavak klnleges tulajdonsgait is (pp az imnt emltettk ket:
kulccsal, tkrt, nyisd...), s klnbsget kell tennie az igk s fnevek
teljesen eltr ragozsa kzt. Fontos kvetelmny mg, hogy megfelelen gyors
legyen: elvgre a legegyszerbb mondatok is min. hrom-ngy szbl llanak,
de mint ksbb ltni fogjuk, ennek akr a sokszorost is kaphatjuk - a sztr
pedig nyugodtan llhat akr tbbezer szbl is.


4.1.4. A szavaktl a mondatok fel

	A kalandjtkok utastsaira ltalban jellemz, hogy az alany
hinyzik bellk ill. rejtett (els vagy msodik szemly), s csaknem kivtel
nlkl valamilyen igei lltmnyra plnek, amihez gyakran klnfle trgyak,
jelzk s hatrozk csatlakozhatnak. Utbbiak nmagukban egyszerek, egy-kt
szbl llanak, s ami mg nagyon jelents egyszersts, hogy al-,
flrendelt tagmondatok sosem fordulhatnak el. (Legalbbis ezidig nem volt
r mg plda...) Tipikusan egyszer parancs pl. az albbi: VEDD FEL A KULCSOT.
Ebben fllelhet mindkt alapvet szfaj: az ige s a fnv - tulajdonkppen
az sszes tbbi szfaj flfoghat gy is, mintha ezek specilis esetei
lennnek. Az ige fontos tartozka (vagy inkbb: rsze) mg az igekt is,
hiszen ha azt mondjuk, hogy VEDD FEL, VEDD LE vagy VEDD MEG, azok teljesen
eltr cselekvsre utalnak. E kett egyttesen dnti el, hogy mit akarunk
csinlni, a fnevek s trsaik pedig a cselekvsnk cljt hatrozzk meg,
azltal, hogy az elrhet trgyak s szereplk kzl konkrtan kijellnek
valamit. Ez nem mindig egyrtelm: egyrszt ltezhet a jtkban tbb hasonl
nev trgy is, msrszt hasznlhatunk klnfle gyjtneveket. Elbbi esetre
plda lehet az, ha tbbfle klnbz kulcs van: ilyenkor mindegyiknek van
valamilyen sajtos jelzje, mely megklnbzteti az sszes tbbitl (pl. "kis
kulcs" vagy "nagy kulcs" stb.); a fnevek el mellknevek jrulnak (VEDD FEL
A NAGY KULCSOT). Gyjtnv esetn pedig az illet sz ugyan pontosan megjelli
a trgyat, m egyszerre akr tbbet is - legjobb plda erre a MINDEN sznak az
alkalmazsa: egy VEGYL FEL MINDENT utasts egyszerre vonatkozik a
kzelnkben lthat valamennyi trgyra. Mellknevek szintjn is elkpzelhet
hasonl, pl. gy: VEDD FEL AZ SSZES KULCSOT. (Hogy mirt is clszer a
mellknevet is specilis fnvknt nyilvntartani, az kitnik abbl, hogy
alkalomadtn ezek is a fnevekhez hasonlan ragozdhatnak. Egy jlnevelt
kalandjtk ugyanis, ha nem egszen biztos a dolgban, tovbbi krdseket tesz
fel: megkrdezi tlnk, hogy melyik kulcsot szndkozunk flvenni. Erre mi
felelhetjk azt is, hogy a NAGY KULCSOT - vagy egyszeren ennyit: NAGYOT. A
mellknv ilyenkor kifejezetten gy viselkedik, mintha fnv lenne; fordtott
esetben pedig egyes fnevek is llhatnak a mellknvi jelzk helyn.) Mivel
igencsak ritka eset (gy rtem, egy kalandjtkban...) az, hogy teljesen
azonos trgyakbl legyen tbb pldny ugyanazon a helyen, s radsul ezek
kzl tbbre, de nem valamennyire akarunk hivatkozni egyidejleg, ezrt
szmnevek csak elvtve fordulnak el; ilyenkor, mint sejthet, a mellknvhez
hasonlak, csak funkcijuk ms. Ugyancsak fehr holl egy msikfajta jelzs
szerkezet, nevezetesen a birtokos jelz: egyfell erre is csak viszonylag
ritkn kerl szksg, msfell meg akkor is kivlthatjuk ms, egyszerbb
jelzkkel a szerept. Pl. ha az imnti nagy kulcs egy r kezben van: egy VEDD
EL AZ R KULCST helyett a FOGD A NAGY KULCSOT utasts sokkal egyszerbb.
Jllehet ezek kezelse elgg bonyolult eljrst ignyel, mindenesetre sokat
emel egy jtk sznvonaln, ha - mint rtkes egzotikumot - ilyesmit is
beleptnk. Annl nagyobb igny lehet ezzel szemben (mrminthogy a jtkosok
oldalrl) egy msik, teljes fnvi rtk szfajra, a nvmsra: ha lerjuk,
hogy BESZLGESS VELE vagy NZZ R, mikzben a legutbbi parancsunk egy KSZNJ
A MADRIJESZTNEK volt, ez ktsgkvl azt jelenti, hogy ezttal is a
madrijesztre gondolunk - az utolsknt elfordult fnevet helyettesthetjk
valamilyen nvmssal. rthetetlen, hogy ezt is csak alig nhny program
ismeri, amikor pedig a megvalstsa egyszer (hisz' mindssze egy
szcserrl, behelyettestsrl van sz), s igen nagy knnyebbsg, ha nem
kell a hosszadalmas MADRIJESZT szt mindig jra s jra beptygni, hanem
helyette ezt a "kzrell" pr bett...
	A hatrozk mr nem nll szfajok, hanem csak mondattani egysgek -
lnyegben a fnevek eltr ragozs alakjai. Miutn a szrend szabad, s ms
tmpontunk nincsen, egyedl a ragozsuk alapjn tudjuk csoportostani a
klnfle kifejezseket. Tlsgosan krlmnyes s flsleges is volna azonban
valamennyi raghoz kln hatrozt rendelni, gy legclravezetbb t csoportba
sorolni ket (az egy csoportba tartoz ragok nemigen szoktak elfordulni egy
parancsban egytt, s krlbell hasonl dolgot jelentenek, gy nyugodtan
tekinthetjk azonosnak ket): 1.) trgy: -t raggal vagy rag nlkl; 2.)
helyhatroz: -n, -ban, -nl, -rl, -bl, -tl; 3.) clhatroz: -ra, -ba,
-nak, -hoz; 4.) eszkzhatroz: -val; 5.) egyb: -rt, -ig... stb. Pl. az ADJ
PNZT A KOLDUSNAK utasts hrom mondatelemet tartalmaz: egy igt, egy trgyat
s egy clhatrozt (az, hogy ezt a nyelvtanban rszeshatroznak nevezik, ne
zavarjon tlzottan bennnket...). A ragokon tl hasznlhatunk nvutkat is a
fnv jelentsnek mdostsra, gy helyhatroz lehet az is, hogy ASZTAL
ALATT, vagy a KULCCSAL helyett eszkzhatroz, hogy KULCS RVN vagy KULCS
SEGTSGVEL stb. stb.
	sszefoglalva teht, minden egyes begpelt parancs lnyegben a
kvetkez rszekbl tevdik ssze: az ige (a belertett igektjvel egytt),
valamint a felsorolt tfle trgy ill. hatroz. A parancsot akr flfoghatjuk
gy is, mint egy rekordot, aminek ez a hatfle mezje van. A programon bell
persze a szavak nem szvegknt jelennek meg, hanem minden egyes dolgot
valamilyen sorszm azonost. Pl. ha a "kinyitni" ige a 13-as sorszmot kapta
az elzetes tervezs sorn, akkor ez azt jelenti, hogy az ige vltozjba egy
13-as szm kerl. Amelyik fajta eleme hinyzik a mondatnak, az termszetesen a
0-s rtket kapja. Ez gyansan egyszernek ltszik, holott valjban
egyltaln nem az: ugyanis ez a vgeredmnyl kapott egyszersg a valsgban
egy hossz s bonyolult rtelmezsi folyamatot takar, melynek folyamn a
klnfle szkapcsolatok s ms szerkezetek fokozatosan a lehet legtmrebb
viszonyokk bomlanak le. Ahhoz, hogy ez megvalsuljon, tucatnyi eltr
algoritmust kell egyms utn lefuttatni, amelyek mindegyiknek feladata a
megfelel szavak vagy szprok cserje, helyettestse valamilyen msik,
egyszerbb szval. Ezek a cserk tblzatokban val keressek tjn trtnnek.
Effle algoritmus lehet pldul az, amelyik az igk s igektk klnll
prost egyetlen sszetett igre cserli ki (a NYISD s a KI szavakat trli,
s helykre egy KINYITNI szt r - ha pedig nemltez prostst tall, pl.
azt rtuk, hogy NYISD SSZE, ami nincs benne a tblzatban, akkor hibt jelez,
s az ige rtelmezhetetlen). Vagy egy msik, mely a nvms helyre elegnsan
becsempszi az utolsknt alkalmazott fnevet. Egy olyan, mely a "mellknv +
fnv" szkapcsolatot egyetlen j fnvvel helyettesti be (a NAGY s a KULCS
szavak sorszmait kiiktatva, helyettk egy msik, a NAGY KULCS sz sorszmt
illeszti a mondatba). s gy tovbb; minl tbb ilyen funkcival elltjuk,
annl intelligensebb lesz a programunk. (s annl nehezebb lesz megrni...)
Termszetesen az sem mindegy, milyen sorrendben hajtjuk vgre ezeket az egyes
szablyokat a mondatban. Pl. ha azt talljuk lerni, hogy NAGYOT, akkor az
elszr is felbomlik a - kiss idegenszeren hangz - NAGY AZT szkapcsolatra,
majd az AZ helyre bekerl a KULCS fnv (mint nvms-helyettests!), s
csupn ezutn lehet belle NAGY KULCSOT. Egy szveges kalandjtk rtelmez
programjt elkszteni krlbell hasonl feladat, mintha mondjuk egy PROLOG
fordtprogramot hajtannk rni...
	A parancs s a mondat kifejezseket az eddigiekben egy kiss
sszekeverten hasznltuk, gyhogy lassanknt ideje lenne sztvlasztanunk ket
egymstl: mg egy parancs mindig egyetlen meghatrozott cselekvsre utal,
vagyis lnyegben tagmondat (a fentiekben hozott pldk mind parancsok
voltak), addig egy mondat nyugodtan akr tbb parancsbl is llhat. (Mr
amelyik program hajland ezt tudomsul venni...) Vagy az ellenkez irnybl
megkzeltve a dolgot: egy mondat az a szvegmennyisg, amit a jtkos egy
szuszra begpel a bevitel sorn, s a parancs ennek egy-egy nllan
vgrehajthat rsze. A mondaton belli parancsok elvlasztsra rsjeleket
(pont, vessz s trsaik), valamint az S szcskt vagy annak szinonimit
(MAJD, TOVBB, VALAMINT... stb.) hasznljuk. A jtk a mondatban lpsrl
lpsre halad elre; mihelyt egy parancsot vgrehajtott, utna kezdi el
rtelmezni a kvetkezt. Pl. egy tipikus sszetett mondat gy hangzik: VEDD
FEL A KULCSOT S NYISD KI VELE AZ AJTT. Ebben az esetben a kt tagmondatot
akr egy-egy kln mondatknt is le lehetne rni, de elfordul olyan is, hogy
szorosabb sszefggs kapcsolja ket ssze, miltal sztvlaszthatatlanok
lesznek - ez akkor llhat fenn, mikor a msodik parancsbl kihagyunk valamit,
amit mr tartalmaz az els. Pl.: GYJTSD MEG A GYERTYT S A MCSEST. Itt a
msodik parancsbl kimaradt az ige. Ahhoz, hogy ezt rtelmezni tudjuk, egy
aprcska trkkt kell alkalmazni a programban, nevezetesen amg a mondatnak
nincs vge, addig az aktulis parancs vltozit sohasem trljk, hanem csak
az jabbik parancs szavai mindig fellrjk a rgit - gy teht a teljes els
parancs vltozatlanul megmarad, mindssze a MCSES, mint trgy fogja fellrni
az elz trgyat, a GYERTY-t. Ezltal egyetlen lltmny mg tetszleges
szm trgyat flsorakoztathatunk. Sokkalta nehezebb volna - ppenhogy a
lpsenknti vgrehajts miatt! - ugyanezt az ellenkez irnybl is
megcsinlni, valahogy ilykppen: NYISD KI S CSUKD BE AZ AJTT. Ebben az
esetben ugyanis a programnak szinte "elre kne gondolkodnia": amikor odig
jut, hogy NYISD KI, mg fogalma sincsen rla, hogy mire is vonatkozik ez a
dolog - jllehet a keresett fnv benne van a mondatban, csak jval ksbb
volna eslye megtallni azt. Az eredmny: a szmtgp megkrdi, hogy "Mit
akarsz kinyitni?". Ennek feloldsra be lehetne vezetni egy n. rklsi
rendszert, ami abbl llna, hogy mg mieltt hozzltna a legels lps
vgrehajtshoz, a program vgigrtelmezn a teljes mondatot, s mindegyik
tagmondat llapott eltroln valahol, egy rekordokbl ll lncban gy, hogy
az aktulis rekord mindig rkln - az imntiekben lert mdon - az elznek
azt a rszt, ami nem vltozott. Azutn ugyanezt vgigcsinln fordtott
irnyban, az utolstl az els fel haladva is - s ami valahonnan hinyzik,
azt mindig a msikbl vett megfelel rszekkel ptoln s kiegszten benne
ekkor is. Ekzben az els parancsba, ahonnan hinyzik a trgy, berdna az
utna kvetkez tagmondat trgya (ami esetleg szintn a kvetkezbl rklte
azt, s gy tovbb). Csupn ezt kveten hajtdnnak vgre a parancsok.
	Amivel aztn el is rkeztnk az rtelmezs kvetkez llomshoz: mi
trtnjk, amikor valamilyen sz vgkpp hinyzik a mondatbl. Erre tbb
megolds is knlkozik. Lehet egyszeren a felhasznl kpbe vgni, hogy
mrpedig ez nem egy rtelmes mondat, s legkzelebb szveskedjk jobban
megvlogatni a szavait... Ennl valamivel udvariasabb (s intelligensebb)
megolds, amikor a homlyos rszekre vonatkoz krdseket tesznk fel, s
tovbbi kiegsztseket vrunk. Pl. ha csak annyit kaptunk parancsknt, hogy
NYISD, akkor feltesszk neki a kvetkez krdst: "Mit akarsz kinyitni?" - ami
utn kvetkez bevitelknt ktfle felelet vrhat. A jtkos vagy begpel egy
teljesen j mondatot, nagylelken elfelejtve az elzt - vagy pedig a
krdsnkre vlaszol, s mindssze a hinyz trgyat adja meg. Hogyan
ksztsk fel a jtkot a helyes reaglsra mindkt esetben, amikor e kettt
tulajdonkppen nem is igazn lehet megklnbztetni egymstl? Ht gy, hogy
nem is klnbztetjk ket meg. Az elbb lttuk, hogy az esetleg sszefgg
rszmondatok miatt a parancsok vltozit mindig a mondat vgn trljk,
amikor egy j mondatba kezdnk. Egyszeren annyit kell tennnk, hogy mikor
valamilyen krdst intznk a kalandorhoz, olyankor az jabb bevitel
megkezdse eltt nem trljk ezeket a vltozkat, azaz nyitva hagyjuk a
mondatot - akrmit begpel a tisztelt felhasznl, az a jelenleg meglv
parancsot fogja fellrni, ppgy, mintha az a kvetkez parancs volna.
Teljesen mindegy, hogy tredkeket kapunk-e tle, vagy egy j mondatba kezd.
gy akr tbb, eltr tartalm krds is kvetheti egymst, s mgis
valamennyi vlasz ugyanazt a parancsot fogja fokozatosan gazdagtani -
szablyos kis prbeszd alakulhat ki a program s a felhasznlja kztt.
Komolyabb problma akkor addik, ha mr bevezettk az elzkben vzolt
rklses rendszert - ilyenkor ugyanis a krds feltevse eltt meg kell
jegyeznk az egsz mondat llapott, majd a kiegszts megttele utn
ismtelten vgigfuttatni rajta oda-vissza a parancsokat sszefz eljrst.
	Harmadik, s egyben legintelligensebb megoldsa a hinyos mondatok
esetnek, ha a program maga automatikusan megksrel behelyettesteni a
kimaradt rszek helyre valamit, s ha csak ez vgkpp nem sikerl neki, akkor
teszi fel a krdst. Pl. a NYISD megadsa esetn sorjban vgignzi az sszes
elrhet trgyat, s csak ha nincs kzttk egyetlen olyan sem, ami nyithat,
akkor krdi meg a kezeljt, hogy voltakppen mire is gondolt. (Vagy ha tbbet
tallt, akkor azt, hogy melyiket.) Hasonlt ez nmikppen a gyjtnevek
kezelshez. Leggyakoribb gyjtnv a korbban mr megemltett MINDEN sz:
ilyenkor a parancs vgrehajtst egy kls ciklusba kell gyazni - sorban
egyms utn behelyettesteni a kvnt sz helyre az sszes elrhet
trgynevet, s mindegyikkel egyesvel vgrehajtani ugyanazt a parancsot.
(rdemes elgondolkodni rajta, hogy mi trtnik akkor, ha netn a huncut
jtkos egyazon parancson bell tbbszr is alkalmazott valamilyen
gyjtnevet. Pl. gy: MUTASS MEG MINDENT MINDENKINEK. Ez az, ami a programoz
idegeit vgkpp prbra teszi...)


4.1.5. Helyisgek sszefgg labirintusa

	Emltettk, hogy a kalandjtk letnek teljes szntere egyes,
klnll helyisgekre tagozdik. Ez valahogy gy nz ki, hogy tartzkodunk
valahol, pl. egy szobban, s rzkelsnk azokra a dolgokra korltozdik,
amelyek szintn ugyanazon a helyen vannak - egszen addig, mg t nem haladunk
valamelyik szomszdos terletre. Hogyha a jelenlegi szobban hever egy asztal,
akkor azzal, mint trggyal, elmletileg megtehetnk brmit (megvizsglhatjuk
s hasonlk), de ha valahol msutt lerjuk, hogy ASZTAL, akkor mr az
albbihoz hasonl vlasz rkezik: "Nincs itt semmifle asztal." Mikppen lehet
ezt a vilgot a szmtgpen keresztl lekpezni a jtkosok szmra? Minden
helyisg egyrtelmen azonosthat s a tbbitl megklnbztethet kell
legyen, s a jtkban szerepl valamennyi objektumot (trgyat, llnyt,
belertve minket is!) pontosan el kell helyezni valahol a trkpen, gy, hogy
annak helyzete vltoztathat is legyen. Le kell rni a csatlakoz helyisgek
viszonyt, a mozgst gtl akadlyokkal s ms tnyezkkel egytt.
	Termszetesen hek maradunk eddigi alapelvnkhz: mindenhol sorszmok
s tblzatok sarjadnak a lpteink nyomn. Egy jl szervezett
kalandjtk-vilg valjban igen sszetett rendszert alkot, annak megfelelen,
amit a filozfiban is elszeretettel hangoztatni szoktak: minden sszefgg
benne minden egybbel... Emiatt is olyan nehz eldnteni, hogy egyltaln hol
kezdjen neki az ember. A parancsok s cselekvsek vgrehajtsnak
kidolgozsba bele sem foghatunk addig, amg a jtk teljes leend vilgnak
ler adatai holmi adatbzis-szeren nincsenek letrolva a gpben. Egy nagyobb
llegzet mnl ez hossz hnapokig tart tervezst s elkszleteket
ignyel, mieltt mg egyetlen sort is lernnk brmilyen programozsi nyelven.
Igazbl ez a munka legkellemesebb rsze, hiszen - jtkrl lvn sz -
jrszt lmodozssal, tleteink lejegyzsvel s sszerendezsvel, az
epizdok s jelenetek kiagyalsval telik el. Azonban fabatkt sem rne az
egsz, ha nem mindjrt abban a formban kezdennk el az adatok gyjtst,
ahogyan azt majd a ksbbi programban felhasznlni fogjuk...
	Legels feladatunk, hogy flptsk a helyisgek rendszert. Ehhez
legjobb, ha fogunk egy darab res paprost, s trkpet rajzolunk a
kpzeletnkben flsejl vilgrl. Ez a trkp egy csppet elvont megjelenssel
br a szoksos atlaszokhoz kpest: a helyszneket vzlatos krk jelkpezik,
az egyikbl a msikba vezet utakat a kzjk hzott vonalak. Mindegyik
helynek valamilyen nevet adunk (pl.: "Erdei tiszts"), ezt a megfelel karika
belsejbe rjuk; s hogy kt-kt helyisg kztt melyik irnyban lehet
kzlekedni, azt a kztk feszl vonal vgre biggyesztett nyllal
brzolhatjuk. A nyl tvbe rjuk azt is, hogy mi mdon kell mozognunk a
jelzett helyvltoztatshoz: ennek jelzsre - megllapods szerint, de persze
nem ktelez jelleggel - az irnyt nyolc gtja valamint a kt fggleges
irny szolgl. Pl. ha a laksunk szobit szeretnnk brzolni, ami t
helyisgbl ll, akkor a paprra t darab krt hzunk, a szobk llsnak
megfelel elrendezsben, beljk rklva egy-kt szavas elnevezseiket; ha
mondjuk a hlszoba a nappalitl nyugatra fekszik, akkor a "Nappali" felirat
buborktl a "Hlszoba" feliratig rajzolunk egy nyilat, tvben egy NY
betvel, s miutn nyilvn visszafel is vezet t, a vonal ellenkez vgt is
nyllal ltjuk el, a msik tvbe egy K bett rva. Ha a kt szoba kzt ajt
is nylik, a vonal kzepe tjt kiegsztjk egy kisebb tglalappal,
belevezetve az "Ajt" szt... Azutn ezt a mdszert vgigvisszk a termek
egsz hljn. (Tg kiterjeds, szabadtri helyeknl lhetnk azzal a
trkkel, hogy nmagba visszamutat nyilakat rajzolunk - ameddig a jtkos a
jelzett irnyban gyalogol, folyton ugyanabban a trben marad.) Amerre egy
helyrl nem vezetnek nyilak, ott fal van, vagy ms hasonl thghatatlan
akadly. Nagyobb trkpeket clszer tbb rszre bontva elkszteni, hogy
ttekinthetek legyenek.
	Idig minden pofonegyszer, brkinek eszbe juthatott volna mindez -
csak kr, hogy a szmtgp egy sszefirklt paprlappal semmit sem tud
kezdeni. Le kell fordtanunk a szmok nyelvre az egszet. Kezdjk el ezt
azzal, hogy valamennyi helynknek egytl nvekv rendben sorszmokat osztunk:
a hlszoba lesz az 1-es, a nappali a 2-es stb. - rjuk be ezeket a megfelel
buborkokba, a nvszvegek mell. A vlaszthat irnyokhoz is rendeljnk
hasonlan sorszmot; a felsorolt tz gtj mell flvehetjk mg a KI s BE
irnyokat is, gyhogy sszesen tizenkt irnyunk lesz; 1-tl 12-ig szmozzuk
meg ket - mondjuk az 1-es jelentse az szakot, s gy tovbb. Ezt kveten a
trkpet mr tblzatt lehet alaktani: olyan elrendezsben, ahol baloldalt
fgglegesen a helyisgek sorszmait tntetjk fel sorban, vzszintesen pedig
az irnyok helyezkednek el. A tblzatban minden helyhez tartozik egy sor,
ezeket gy kell kitlteni, hogy a sor mindegyik rubrikjba annak a msik
helysznnek a szma kerl, ahov a hozz tartoz irnyban az adott szobbl
kimozdulva rkeznk. Ha a jelzett irny sehov sem vezet (lezrt irny - fal),
akkor ide nullt runk, ha nmagba kanyarodik vissza, akkor a sajt helyszn
szma kerl ide is. Ha arra vagyunk kvncsiak, hogy a nappalitl (ez most
ugye a 2. helyisg) szak fel (1. irny) mi tallhat, akkor egyszeren
kiolvassuk a tblzat 2. sornak 1. oszlopt, ahol tegyk fel, egy 4-es szmot
tallunk (legyen ez az elszoba szma): a nappalitl szakra az elszoba vr
rnk. Ezt szmtgppel kezelni igen egyszer lesz ksbb.


4.1.6. Barangols a trkpen

	Mihelyt ezzel megvolnnk, ne felejtsnk mg egy msodik tblzatot is
kszteni, az egyes utakat lezr akadlyok nyilvntartsra. Mondanom sem
kell, hogy ezek is tipikus sorszmokat kapnak, m itt mr nem rt nmi
rendszert is vinni a dologba: ha valamibl tbb hasonl van, gy clszer
azokat egy csoportba venni, mg ha tvol esnek is egymstl (pl. 1-tl
valameddig szmozzuk az ajtkat, utna jnnek sorjban az ablakok stb.);
ezltal a ksbbiekben megknnytjk ezek kezelst. Az egy-egy akadlyhoz
tartoz sorokban itt a kvetkez adatokat szksges feltntetnnk: kt-kt
rubrika az ltaluk elvlasztott kt-kt helyisg szmra (pl. a nappalibl a
hlba nyl ajt esetn egy 1-es s egy 2-es), valamint egy harmadik mez,
ami pedig az akadly jelenlegi llapott tkrzi. Ezttal is szmokkal kell
lnnk: legalbb hrom rtket hasznljunk (clszeren 0-tl 2-ig szmozva)
annak jelzsre, hogy az ajt nyitva, csukva vagy zrva van-e - de ennl jval
tbb lehetsg is elkpzelhet (lehet mondjuk flig behajtva vagy betrve az
ajt, vagy fggny esetben behzva vagy elhzva, akrmi az esznkbe juthat!).
Vgl hagyjunk mg egy negyedik oszlopot is sajt megjegyzseink rszre: ide
lehet berni az akadly nevt (ajt, kapu stb.), s esetleg mg azt is, hogyan
kezeldjk ksbb, azaz mikppen nyithat (milyen cselekvst kell vghezvinni
az llapota megvltoztatshoz - mondjuk milyen kulccsal nyithat egy zrt
ajt). Listnkba flvehetnk olyan "elvont" akadlyokat is, mint egy kerts,
vagy az utunkat ll eleven rszem - csak vigyzzunk ez utbbi esetn, mert 
az ajtkkal ellenttben nem kt, hanem egyszerre csak egy helyisgben ltezik,
s gy msknt kell majd kezelni ksbb. Egyltaln, az akadlylistba flvenni
azokat a tnyezket rdemes, amelyeknek llapota vltozik - ha egy falon
sohasem juthatunk t semmilyen mdon, azt egyszerbb inkbb a msik tblban a
megfelel irnyhoz, mint valami fiktv, valjban nemltez helysznszmot
berni.
	Most mr megtehetjk els - egyelre csupn kpzeletbeli - stnkat
kezdetleges szobink kis sznpadn. Azt is ltjuk, hogy - noha mg csak kt
tblzatunk van - mris mennyi mindent kne ellenriznie egy vezrl
programnak olyan, primitvnek ltsz mvelet elvgzshez, mint egy
meghatrozott irnyban val halads. Elszr is - jelenlegi pozcink
tudatban - a bejrsi tblzatbl ki kell olvasnia az elrend clhelyisg
szmt. Meg kell nznie, az akadlyok listjban szerepel-e olyan objektum,
melynek sszekapcsolt kt helyisge ppen az ltalunk ignybe vett kt
szobval egyezik-e meg (radsul dupln is kell vizsgldnia, mert htha az
ellenkez irnybl jvnk, a 2-esbl az 1-esbe, s nem pedig az 1-esbl a
2-esbe), majd ha tallt egy ilyet, akkor tjkozdni rla, nyitva van-e az
akadly. Ha nem jrhat az az t, figyelmeztet zenetet kapunk ("Az ajt
csukva van."), ha igen, akkor tovbbi ellenrzsek kvetkeznek: ltezik-e
egyltaln abban az irnyban brmi. Nulls clhelyisg esetn: "Nem mehetsz
abba az irnyba." - de lehetnek tovbbi fiktv sorszmok is, melyek pldul
kln jellik a falat, a svnykertst, a vizesrkot stb. St, akr mg
hallos irnyokat is kikpezhetnk - mondjuk, hogy egy veszlyes hegyi ton
az szaknyugati irny vgzetes lezuhanssal vgzdik... Csak ha minden
stimmel, akkor szabad elvgezni a tnyleges mozgatst. (Hogy hogyan, azt is
hamarosan megltjuk.)
	Egy kalandjtkban szerepl brmilyen llny alapveten ngyfle
mozgsi formt kvethet a helysznen trtn kalandozsa folyamn. Ezek: a
kzvetlen halads, a kzvetett halads, egy tvoli clpont megkzeltse s
az n. "mgikus" bejrs. Kzlk az els hrom mindegyike az t megelzre
pl, s egyre magasabb szint cselekvsi mdokat tesznek elrhetv.
	1.) Kzvetlen (vagy magyarul: "explicit") halads esetn olyan mozgsi
utastsrl van sz, mely pontosan meghatrozza az illet ltal kvetend
haladsi irnyt. Az ezt kivlt parancsok pldul a kvetkezkppen hangzanak:
DLKELET vagy MENJ BE A KUNYHBA stb. (Ez utbbit az teszi kzvetlenn, hogy
szerepel benne a BE szcska! Msklnben a kvetkez csoportba tartozna - s
akkor is, ha a BE irnyt nem vettk volna fel az irnyok kz az elz
fejezetben.) Hogy ezek megvalstsa mikppen trtnik, azt pp az imnt
magyarztam el, a tovbbiakrl pedig a kvetkez fejezetben esik nmi sz.
	2.) A kzvetett ("implicit") mozgs ezzel szemben a kalandoz rszrl
egy olyan kvnsgot jelent, amelyben nem fogalmazza meg konkrtan, hogy
melyik irnyban szeretn a kvetkez lpst megtenni - hanem csak bizonyos
utalsokat tesz, az elrend clpont megjellsvel. Ez mr nehezebb feladat a
programunk szmra, hiszen r hrul az irny kivlasztsnak felelssge: a
mondatban megadott clrl el kell dntenie, melyik irnyban fekszik tlnk. Ha
sikerlt eldntenie, akkor a lps mr egy egyszer kzvetlen mozgss
reduklhat. Ilyenek rendkvl sokflk lehetnek, s radsul valamennyik
egyni bnsmdot ignyel. HASZNLD AZ AJTT tpus felszlts, pl. MSSZ
KERESZTL A CSAPAJTN esetben az akadlyok tblzatbl ki kell keresni a
helysznrl kivezet csapajtt (ha van olyan), azutn ennek msik helyisgt
kell megkeresni a bejrsi tblzat megfelel sorban - ezzel megvan a
kvetend irny (ha esetleg tbb irny is vezet ugyanoda, a program dnthet,
melyiket hasznlja); LPD T A KSZBT: majdnem ugyanaz, mint az elz, azzal
a klnbsggel, hogy miutn kszbe tbbfle eszkznek is lehet, ha ugyanott
van mondjuk egy ajt s egy kapu, akkor megintcsak el kell dntennk azt is,
hogy melyiket koptassuk; MSSZ FRA: egyrtelmen a FEL irny helyettestse;
UGORJ: valsznleg a LE irnyt jelenti, de helyzettl fggen egszen ms is
lehet... Flsleges sorolni a pldkat tovbb, a dolog lnyege ennyibl is
lthat.
	3.) Az eddigi kt mozgsfajta egyszer volt abbl a szempontbl, hogy
mindkett egyetlen lps megttelre korltozdott - valamelyik szomszdos
terembe ruccanhatott t segtsgkkel a jtkos. Tvoli clpont megkzeltse
esetn ugyanakkor mr egy teljes tvonalat szksges vgigjrnia, mghozz
gy, hogy ennek kivlasztst is legnagyobb mrtkben a szmtgpre hagyja:
MENJ A KASTLYHOZ, KERESS EGY TISZTST, KVESD A VNDORT tpus parancsok
ilyenek. Mint valami taxiba szll utaz, egyszeren kzli velnk, hov hajt
elkeveredni, s attl fogva a jtk idegenvezetsre bzza magt. Ez a
legmagasabb szint, legelvontabb s legnehezebben kivitelezhet haladsi
forma, a kalandjtkok tlnyom tbbsge teljes mrtkben nlklzi. Van azrt
egy kicsike elnye is a kzvetett mozgssal szemben, az, hogy nem kell olyan
sokfle eltr kivtellel vacakolni, hanem egyetlen ltalnos eljrsba bele
lehet foglalni az egszet. Az viszont a maga nemben szp egy darab...
Ismerjk ugyebr a teljes vilg trkpt a rajta elszrt akadlyokkal
egyetemben, a sajt pozcinkat s azt, hogy hov kell majd eljutnunk: meg
kell tallnunk az egyiktl a msikhoz vezet legrvidebb (?!) utat. Ha egy
ember rpillant egy trkpre, a megolds szinte nmagtl addik - de egy
szmtgpnek ugyanezt a dit mr sokkal nehezebb lesz fltrnie. Bonyoltja
(vagy egyszersti?) a helyzetet az is, hogy esetleg mg magrl a
clhelyisgrl sincs pontos tudomsunk; utvgre, ha egy jtkban vagy harminc
ajt lzeng itt-ott elszrtan, s a tisztelt jtkos megsgja neknk, hogy
MENJNK AZ AJTHOZ - akkor mgis melyikre gondolt?! Nyilvn arra, amelyiket
leghamarbb elrjk - ha legrvidebb tvonalat keresnk, akkor ez egyszersmind
a legkzelebb lv. Nincs ms megolds: el kell indulni, lpsrl lpsre
tapogatzva elre a helyisgek vgtelen cenjban, s minden j helysznre
lpve ellenrizni, hogy talltunk-e a lersnak megfelel trgyat. Persze nem
sszevissza, hanem mdszeresen: sorban vgigprbljuk mind a tizenkt irnyt,
s amelyik jrhat, arra lpnk tovbb; ha vgkpp zskutcba futottunk, gy
mindig visszalpnk az ezt megelz helyre, s a kvetkez irnnyal
ksrleteznk. Ha visszartnk a kiindulsra, akkor kudarcot vallottunk: a
clpontot nem tudjuk elrni. Namost ehhez hrom dolog szksgeltetik: elszr
is maximalizlni kell a megtehet legnagyobb tvolsgot, mondjuk 30-40
lpsben (minden jabb lpssel hatvnyozdik a lehetsgek szma! - ennyi
pedig brmekkora trkphez bsgesen elg lesz); msodszor egy listban
nyilvn kell tartanunk az eddig megtett tvonalat (melyik helysznrl merre
haladtunk tovbb), hogy legyen hov visszalpnnk s tudjuk, merre kell majd
mennnk; harmadszor pedig - ugyancsak e lista alapjn - folyton ellenriznnk
kell, nehogy egy, mr rintett helysznre msodszor is rlpjnk (ilyenkor gy
tekintjk az arrafel nyl irnyt, mintha akadly zrn el - egyedl gy
kerlhetjk el, hogy nmagba visszatr hurkokat rjunk le). Ezzel a
mdszerrel szpen meg is talljuk a keresett clpontot, csak ppensggel
egyetlen bkken lesz vele: korntsem biztos, hogy a legrvidebb tvonalon
jutottunk el oda! Ahhoz, hogy amazt is flleljk, knytelenek vagyunk a
keresst elszr egyetlen lpsre szktve elvgezni, s ha nem talljuk, akkor
fokozatosan (mindig egy-egy lpssel) hosszabbra engedni a przt, minden
ilyen bvts utn jra s jra vgigkeresve - egszen addig, mg el nem
jutunk a clba, vagy el nem rjk a bvs hatrt. Lass gppel jobb nem
belekezdeni... A KVESD ige (egy kzelben mozg illetnek a nyomba szegdni)
a kznsges MENJ-tl annyiban eltr, hogy hatsugart mr eleve csak 2-3
lpsre kell zsugortani - azonkvl, ha sikeres volt, addig ismtelni, mg az
"ldztt" szemly meg nem llapodik valahol. Ha igazn nagyon intelligens
programmal akarjuk elkprztatni a kznsgnket, ezt az egszet esetleg mg
megpakolhatjuk olyan finomsgokkal, hogy gyalogls kzben az emberknk
reflex-szeren nyissa ki az tjba es ajtkat (majd ha thaladt rajtuk,
csukja is be maga utn ket...), st, ha zrva vannak, elszr prblja vgig
bennk a nla lev kulcsokat, majd kopogtasson rajtuk, s gy tovbb...
	4.) A negyedik mozgs, az n. "mgikus bejrs" (DaCosta), nem egy
nagy szm, semmi kze az elz hromhoz, s jl hangz nevvel ellenttben
mindssze azt jelenti, hogy a szoksos tvonalakat mellzve, egycsapsra egyik
helyrl a msikra kerlnk. Tulajdonkpp semmi hagyomnyos - irnyokhoz ktd
- mozgs nem trtnik ekkor. Mindez trtnhet valamilyen bbjos varzsige
kimondsval, esetleg hasonl mdon, mondjuk egy varzsl elteleportl
bennnket mshov. Ide sorolhat az az eset is, amikor valamilyen, a
valsgban hosszabb mveletsort ignyl tevkenysget a jtk - dramaturgiai
megfontolsbl - egy lpsbe srtve hajt vgre. Pldul megfizetnk egy
kocsist, hogy fuvarozzon el minket, s erre a program tnyleges utaztats
helyett mindssze pr mondatban ecseteli szmunkra hossz utunk
viszontagsgait - aztn a kvetkez lpsben mr ppen kiszllunk a kocsibl a
clnl. Jellegbl addan ezt a legknnyebb megvalstani.


4.1.7. Lakberendezv vltozunk

	A jtk alapkvt letettk, vilgunk sznternek hlzata megvan - de
rajtunk kvl senki msnak nem telne benne tl sok rme, hogy az res
helysznek kzt mszkl. A Teremts csak flksz llapotban van: mg fl kell
hznunk a falakat, bevakolnunk ket, s a szobkat berendezni dszletekkel,
trgyakkal s llnyekkel. E hrom dolog nem is klnbzik egymstl annyira:
ugyanabba a szmozsi rendbe bele lehet vonni az sszeset, s hogy aztn melyik
objektum viselkedik mozdthatknt vagy lknt, azt mr csak a konkrt
programmkds dnti el, a megfelel sorszmokra reagl eljrsaink. Azrt
mindenesetre alaposan megknnytjk vele a sajt dolgunkat, ha ezt sem
vgezzk teljesen logiktlanul. Tapasztalataim alapjn elmondhatom, hogy gy a
legclravezetbb a sorszmokat megvlasztani, hogy legelsknt vesszk a
legmagasabb rend, legtbb szereppel br "trgyakat": az llnyeket.
Amikppen az ajtk sorolsakor tettk, 1-tl valameddig legyenek sorszmozva,
s gy, hogy mi magunk (azaz a fhs, a jtkos!) is csupn egyek legynk
kzlk, semmilyen kitntetett szereppel elltva - ez majd ksbb fog jl
jnni, ha azt akarjuk megvalstani, hogy egyszerre tbb szerepl brbe is
bele tudjunk bjni. Kzvetlen utnuk kvetkezzenek az olyan, mozdthat
trgyak, eszkzk, amelyeket fl tudunk venni s magunkkal tudunk vinni
tjaink sorn - alighanem ezekbl lesz a legtbb. Folytassuk a leltrt a
mozdthatatlan, de azrt mg jelents szerepet jtsz dszletekkel (pl. egy
asztal, amelyet megvizsglva tallhatunk rajta valamit, vagy szekrny, amit ki
lehet nyitni stb.), utnuk azokkal, melyeknek mr nincsen kzponti szerepk,
tnylegesen csupn dszt s hangulatfest httrelemek gyannt vannak jelen
a jtkban (pkhlk a sarokban, fal, fld, erd, vz...) - s a legvgre
kerljenek a rendkvl nagy pldnyszmban tenysz, teljesen klnleges
nyilvntarts elemek (pl. ajtk). Az egyes csoportok kztt hagyhatunk kisebb
hzagokat, kihasznlatlan terleteket, mert ha ksbb netn kiderlne, hogy
kifelejtettnk egy trgyat, vagy mg okvetlenl be szeretnnk szrni valamit,
akkor ne kelljen utlag tsorszmozni az egszet... gyeljnk ezenkvl arra
is, hogy a gyjtnvknt sszevonhat, hasonl funkcij elemek (pl. a
klnfle kulcsok) lehetleg egyetlen, nagy tmbben hzagok nlkl legyenek -
nem mindegy ugyanis, ha a jtkos egy hatrozatlan rtk KULCS szt hasznl
valahol, akkor sszevissza kell-e szaladglni a klnfle fnevek kztt, vagy
csupn az x-diktl az y-dikig terjed terletet egy rendezett ciklussal
vgigfutni, kzelebbi meghatrozs vgett.
	Az egyes trgyak kezelse egy gondosan s krltekinten kialaktott
sorszmozssal rendkvli mdon leegyszersdik. Pl. ha ppen egy NYISD AJTT
utasts vgrehajtsa kzepette vagyunk, s mr eldntttk, melyik ajtrl van
sz, de az ajt feltrulkoztatshoz trtnetesen a 28-as szm bronzkulcsra
van szksg, akkor annak ellenrzse, hogy a kalandoz ezt prblja-e
hasznlni e nemes clra, mindssze annyibl fog llni, hogy megvizsgljuk a
jelenlegi parancs eszkzhatroz rekeszt: ha ez nulla, akkor kirjuk, hogy
"Az ajt zrva van."; ha egyenl 28-cal (ami ppen akkor fordulhat csak el,
ha a parancshoz hozzfzte a BRONZKULCCSAL szt is!), akkor sikeres lesz a
mvelet, kinylik az ajt; mg ha valami ms rtk van ott, gy egyszeren
annyit zennk neki, hogy ezt az ajtt nem nyitja az a valami, amelyet prbl.
(Termszetesen eltte azrt meg kell bizonyosodni arrl, hogy tnyleg zrva
van-e az az ajt, nem pedig csak - mondjuk - csukva.) Amennyiben nagyon sok
ajtnk s hozzjuk val kulcsunk van, s mindegyikk hasonl mdon mkdik,
akr ezeket is lehet egy jabb tblzatba rendezni, hogy ne kelljen
kln-kln foglalkozni valamennyivel...
	s pontosan errl van itt sz! A trgysorszmot indexknt (vagy
keresend adatknt) alkalmazva listk s tblzatok valsgos dridjt
hozhatjuk ltre, melyek a trgyak klnbz tulajdonsgainak, elre megadott
helyzetekben megfelelen trtn viselkedsnek lerst szolgljk. Jelen
esetben ezek kzl csak egyet emltnk: a legfontosabbat, mely az objektumok
trkpen val elhelyezkedsnek zloga. ltalban ez egy olyan tblzat,
amelyben a trgysorszmot kzvetlenl indexknt hasznljuk (akrcsak a
bejrsi tblzatnl a helysorszmot), s valamennyi trgyhoz tartozik benne
pontosan egy-egy adat - annak a helyisgnek a sorszma, ahol a trgy ppen
megtallhat. Egy-egy tetszleges trgyunk elhelyezkedse ebbl szempillants
alatt kiolvashat. Ha a korbbi pldinkban felbukkant bronzkulcs teszemazt a
hlszoba padljn hever, akkor ez azt jelenti, hogy eme tblzat 28. eleme a
2-es rtkre van belltva. Ha valahol a 0-s rtkkel tallkozunk, az szoks
szerint azt jelenti: a hozz tartoz trgy "eltnt" - semerre sem lthat.
Egyes dsztelemek (pl. fal vagy padl) olyan rengeteg helyen elfordulnak
egyszerre, hogy nem rdemes ezeket annyiszor kln flvenni trgyknt, hanem
csupncsak egyszer, s elrsk specilis mdon trtnik: mindegyiknek sajt
listja van a hozz tartoz helyekrl, vagy ppen a fal esetben erre
egyltaln nincs is szksg; elvgre a bejrsi tblzatban elzetesen mr
bevezettnk egy sajtos l-sorszmot arra az esetre, ha valamelyik irnyban
fal zrn le az utunkat, gy most is csak elegend megvizsglni, elfordul-e
vajon ez az rtk a pillanatnyi helyisgben valahol (s ha igen, akkor ltezik
itt a FAL nev trgy). Szintn sajtos kisebbsget alkotnak az ajtk, kapuk s
ms hasonl akadlyok: ezek mindegyike kt helyisgben tallhat egyidejleg,
s ezekrt a pozcikrt mindssze az akadlylistba kell visszanylni egyszer
(ha gyesek voltunk, itt is a trgysorszmmal indexelhetnk). Nem tartozik
rtk ebben a tblban a gyjtnevekhez - azokat gyis egy msik, konkrt
trgyra fogjuk bevltani, ha pedig nem sikerlne ez, akkor maga a
gyjtnv-trgy sem elrhet. Az llnyekhez ellenben tartozik mg egy msik,
szintgy roppantmd fontos tblzat, amelyben ugyancsak a trgysorszmmal
indexelhetnk (tbbek kztt ezrt is volt rdemes a lista elejre tenni
ket): az ajtkhoz hasonlan nekik is llapotuk van! Clzatosan a nulla rtk
mutassa azt, hogy valaki l, virul, egszsges s ber - az ennl magasabb
szmok pedig klnfle rendkvli llapotokat jellnek (pl. alszik, eljult,
rszeg, megrlt vagy meghalt).
	Mindebbl mr megvlaszolsra kerlt az az, elz fejezetben nyitva
hagyott krds: miknt mozdulunk el egyik helyisgbl a msikba.
rtelemszeren a kalandor jtszotta szereplnkhz is tartozik a tblzatnak
egy olyan eleme, amelyik megmondja, hogy hol van - pusztn csak ezt kell
megvltoztatni a megfelel j rtkre (amelyet a bejrsi tblzatbl
olvastunk ki, az irnynak megfelel oszlopban).


4.1.8. Hogyan talljunk meg valamit?

	De mieltt mg hozzszoknnk a gondolathoz, hogy milyen egyszer az
letnk, szembestsk magunkat egy megdbbent krdssel, mely az egsz
rendszernek hirtelen egy nagysgrenddel nagyobb mlysget s bonyolultsgot
ad! Mi trtnjk akkor, ha brmelyik trgyunk egyben helyisg is lehet? Taln
els hallsra nem egszen vilgos a dolog, ezrt megmagyarzom: egy relis
vilgban gyakorlatilag tetszleges trgy hozzkapcsoldhat egy msikhoz,
klnfle mdokon - pldul rajta ll egy asztalon, bent cscsl egy
szekrnyben, vagy ppensggel a mi keznkben van. Ilyenkor annak a trgynak a
gazdja tulajdonkppen egy helyisg, ahol a trgy tartzkodik. De ugyanakkor a
gazda-trgy is egy msik, tgabb helyisgben ltezik, ahonnan - mintegy
kvlrl - nzve mind a kt trgyunk lthat. Ha a hordozt, mint helyisget
tekintjk, onnan nzve kifel nemigen ltunk sokmindent, viszont befel,
"mlyebbre" korltlan bepillantst nyerhetnk. Eszerint fl kell ksztennk a
programot r, hogy mindegyik objektum hordozhassa a msikat - enlkl mg csak
azt sem tudnnk megoldani, hogy egyltaln kzbe vegynk egy kavicsot. Ezeket
a trgy-helyisgeket termszetesen meg kell klnbztetnnk a valdiaktl.
	Ha alaposabban megvizsgljuk a krdst, rjhetnk, hogy br ennek a
kapcsoldsnak a valsgban tmntelen mdozata elkpzelhet, mgis hrom
olyan alapvet kategrira tudjuk leszkteni ket, amelyek egy kalandjtk
szempontjbl is nlklzhetetlennek ltszanak: vagy nla van valakinl, vagy
rajta van valamin, vagy pedig benne van valamiben az illet holmi. Ha ezeket
1-tl 3-ig sorszmmal ltjuk el, azutn 0-s sorszmmal hozzvesszk az
alapesetet, amikor kzvetlenl egy helyisgben leledzik, az pontosan ngyfle
lehetsg. A helyisgek sorszmait leggazdasgosabb 2-byte-os egsz szmknt
nyilvntartani, ami gy legfeljebb 65536-fle rtket vehet fel; minthogy sem
trgybl, sem helyisgbl soha nincsen 16384 darab (rendszerint prszz
szokott lenni...), a 16 bit legfels 2 bitjt nyugodtan fenntarthatjuk ennek
az informcinak a trolsra. A dolog ekkor gy ll, hogy 0-tl 16383-ig
szmozdnak a valsgos helyisgek, efltt pedig a fiktv, trgy-jelleg
pozcik helyezkednek el. Ha egy trgysorszmhoz 16384-et hozzadunk,
megkapjuk azt a helyet, ahol a nla lv valamiket keresglni lehet (ennek
csak lnyeknl van rtelme); 32768-at adva hozz, a kls fellete bukkan el;
49152-vel nvelve meg, pedig a belsejbe mutatunk. Pl. ha egy zseblmpa
sorszma a 45-s, a belje csavart izz pedig 73, akkor az azt jelenti, hogy
a 73. trgy a 45 + 49152 = 49197. helyisgben tartzkodik. Ezek az elvont
helyisgek gy szervesen s zavartalanul simulhatnak bele a korbban
kialaktott rendszerbe, egyetlen dolgot kivve: ha valahol egy ilyen rtkre
bukkanunk, akkor nem elgedhetnk meg vele, mint normlis helysznnel, hanem
tovbb kell kutatnunk azt is, hogy az a trgy, amihez ktdik, merrefel
tallhat. Ennek a szervezsnek a rvn szmos trgyat eldughatunk a kvncsi
jtkosok orra ell, akik - mint holmi hsvti tojsra - gy csak hosszas
vizsglds utn lelnek vgre r. (Amikor megvizsglunk valamit, a program
kirja vele egytt a hozz kapcsold trgyakat.)
	Csakhogy ez gy mg mindig tlsgosan egyszer volna, gyhogy azrt
mg bonyoltunk rajta egy keveset... Utvgre is, egyetlen ember sem egy
Smson vagy egy Herkules, s mindennek van valahol hatra! Az olyannyira
htott valsghsg rdekben a trgyak befogadkpessgt korltozni kell -
egy szatyorba taln mgse lehessen belezsfolni tbbet, mint amennyi belefr
vagy amit a flei elbrnak. Ha valamit oda szeretnnk tenni, ahol mr nincs
szmra hely, vagy tbbet prblunk flemelni a karjaink erejnl,
figyelmeztetst kell kapnunk a jtktl, hogy nem tehetjk meg (pl.
"Nem brsz mr el annyi slyt."). De ennek a luxusnak komoly ra van: minden
egyes trgyunkhoz tovbbi hrom tulajdonsgrtket kell bevezetnnk hozz;
ezek: a sajt slya, a teherbrsa s a pillanatnyi terheltsge. Az els kett
ugyebr egy lland rtk (nem muszj, hogy valsgos mrtkegysg legyen,
tetszleges viszonyszmknt alkalmazhat); a harmadik meg folyton vltozik,
de nem nhet magasabbra a msodiknl. Egy trgy terheltsgt gy kaphatjuk
meg, hogy sajt slyhoz az sszes hozz csatlakoz trgy terheltsgt
hozzadjuk - azrt a terheltsgt, s nem pedig a slyt, mert gy az az rtk
mr sszegezve tartalmazza a kapcsold trgy tovbbi kapcsoldsait.
Kvetkezik ebbl, hogy mikor egy trgy "res", azaz terheletlen, akkor a
terheltsge nem nulla, hanem pontosan a tulajdon slyval egyezik meg (a
teherbrst is ennek figyelembevtelvel szksges megllaptani, s
lnyegben csak emiatt van szksg magra a slyra).
	Tbbnyire egy kalandjtk leggyakoribb eljrsainak egyike egy
bizonyos trgy elrhetsgnek a meghatrozsa: mi megadjuk neki a helyisget,
amelyen bell vizsglni hajtjuk, s a keresett trgy sorszmt -  visszaadja
azt, hogy a helyszn "felsgterletn" hny darabot tallt belle. (Egynl
tbb is lehet, hogyha gyjtnevet adtunk meg, vagy tbb ugyanolyan trgy is
szerepel a jtkban.) Ha ltezik ilyen trgy, akkor azt mondjuk, hogy azon a
helysznen jelen van, vagy arrl a helyrl elrhet stb. Rendesen egy
jelenlv trgyhoz kapcsold tovbbi trgyak is elrhetek szoktak lenni.
Termszetesen egy szerepl kizrlag jelenlv holmikkal cselekedhet brmit
is (nhny kivteltl eltekintve, pl. amikor krdeznk valakit egy tmrl),
ezrt mieltt mg brmilyen parancsot is kiadni merszelne, legels teendnk
az lesz, hogy a benne lv sszes fnv elrhetsgt ellenrizzk. Ha pl. azt
mondja neknk, hogy HAJTSD FEL A SZNYEGET egy sznyeg nlkli szobban, akkor
mi kemnyen visszavgunk neki azzal, hogy "Nincs itt semmifle sznyeg." - az
utasts vgrehajtsig (vagy egyltaln: az ige elvtelig - lehet, hogy
nincs is benne ige!) mg csak el sem jut a program, hanem mindenfajta
cselekvs nlkl, hatstalanul tovbbugrik a kvetkez parancsra.
(Kvetkezskppen nyugodt szvvel rhatja akr azt is, hogy EDD MEG A
SZNYEGET, vagy csak egyszeren SZNYEG - ugyanazt a feleletet kapja r
gyis.) Ezzel csrjban elfojtunk mindenfle illeglis trgyra val
hivatkozst, s mire a vgrehajtshoz rnk, addigra garantltan megvan az
sszes fnv - teht ezzel ksbb mr nem kell trdnnk a programban. Fontos
mg, hogy az is mindig jelen van, ami az ltalunk irnytott hshz, mint
"trgyhoz" kapcsoldik - vagyis a nlunk lv cuccok, rajtunk viselt
ruhadarabok. Ugyanide tartozik az is, hogy a tbbi szereplk mind-mind
fltkenyen rzik ellnk a nluk lv dolgokat, ergo ha egy rdgnl lv
brmilyen trggyal prblnnk meg babrlni valamit - kivve, ha csupncsak
megszemlljk azt -, akkor: "Az rdg nem engedi." (De ha az rdg elaludt
vagy meghalt, akkor zavartalanul elvehetnk tle brmit!)
	Ltjuk viszont, hogy a sznyeg most mr nemcsak a padln, hanem akr
egy asztal tetejn is heverhet - mi tbb, mg annak a tetejn is llhat egy
lda, s a ldban egy trpe, a kezben egy tskval, ami egy ersznyt
rejteget, s elkpzelhet, hogy mi ppen az ersznyben csndben meglapul
aranypnzt szeretnnk kiemelni onnan... Hogy a helyzet mg bonyolultabb
legyen, a trpe dhsen becsaphatja az orrunk eltt a tskt, s akkor a benne
lv erszny, a pnzdarabbal egytt, eltnik a szemnk ell; ha erre mi
bosszbl rcsukjuk a trpre a lda fedelt, akkor mr az egszbl semmit sem
ltunk, csupn egy asztali sznyeg tetejn fekv, lecsukott ldt... (De ha a
ldban benne lennnk mi is, akkor megintcsak ltnnk a trpt, eltekintve
attl, hogy odabent stt van.) Magyarul, a trgyak tetszleges mlysgig
egymsba gyazdhatnak, s hogyha benne van egy trgyban valami, akkor mg azt
is figyelnnk kell kzben, hogy nyitva van-e a hordoz vagy csukva. Ahhoz,
hogy a pnzrme elrhetsgt megtudjuk, elszr is az erszny elrhetsgt
kellene ismernnk, ami viszont a tsktl fgg, s gy tovbb - ezt a
keresst teht egyedl egy rekurzv eljrssal tudjuk megoldani, olyannal,
mely minden egymsba gyazds esetn jra s jra nmagt hvja meg. Ha
ekzben brmelyik szinten negatv vlasszal tr vissza, akkor az vgigvonul a
teljes lncon, s az eredmnynk elutast lesz; ha nagynehezen mgiscsak
elvergdnk a gykrelemig, azaz egy valsgos helyisgig (s az megegyezik a
keresett helyisggel!), akkor megvan a trgy, s elrhet.
	Az igazsghoz hozztartozik, hogy ennek az egsz trgy-kezelsnek van
egy elg komoly korltja. (Nem a rekurzv keressre gondolok, hanem az elz
fejezetben kifejtett tblzatos nyilvntartsra!) Csak akkor alkalmazhat
hatkonyan, ha mindegyik trgybl egy vagy tbb - de konkrtan elre
meghatrozott szm darab ltezik. Pl. egy frl leszednk egy almt - az egy
darab. Leszednk egy msikat - most mr kett van a keznkben. De ha leszednk
szzat, akkor szznak kne lennie - ami viszont ebben a rendszerben kizrlag
gy oldhat meg, ha mr eleve, a jtk indtsakor is ltezik valahol mind a
szz alma, pontos, kln sorszmokkal elltva. Ha azt szeretnnk, hogy
brmelyik trgybl lehessen hasonlan szz darab, akkor mr eleve mindegyikbl
legalbb ennyit kellene a jtkba beleterveznnk. Prszz trgy helyett gy
lenne tbb tzezer - iszonyatos pazarls a trral s az idvel! Egyszval, ez
a kezelsi rendszer, br egyszer, de tlsgosan merev. Az esetek tlnyom
tbbsgben ugyan tkletesen bevlik, de ha valamivel ignyesebbek vagyunk,
akkor meg kell prblnunk ugyanezt valahogy dinamikusabban megvalstani. Erre
megolds lehet, hogyha egyetlen, statikus tblzat helyett egy amolyan vltoz
hosszsg puffer-tblzatot ksztnk. Ennek minden elemhez jval tbb adat
tartozna, mint eddig: lenne egy, mely megadja, hogy milyen trgyrl van sz
(teht az eddig hasznlt trgysorszm), s egy msik, mely azt jelln, hny
darab van belle. A harmadik volna a helyszn, amelyen megtallhat - ez
annyiban mdosulna, hogy a fiktv trgy-helyisgek alapjt most mr nem a
trgysorszm jelenten, hanem egy, a pufferon belli msik elemre mutatna
tovbb. (Negyedikknt pedig hozzjnne mg az aktulis terheltsge - a sly s
a teherbrs elg, ha tovbbra is a trgysorszmhoz kapcsoldan van meg,
ugyanis azok lland rtkek. Ellenben ne felejtsk, hogy az sszeadandkat
itt mg a darabszmmal is szorozni kell!) Ha j trgy bukkanna el valahonnt,
elszr mindig helyet kne neki foglalni a pufferban, s hogyha betelne az
egsz terlet, akkor lehetne sorjban eldoblni a rgebbieket. A szz alma gy
mindssze egyetlen bejegyzst foglalna el, amiben 100 volna a darabszm (amikor
tovbbi almkat gyjtnk a mr meglvk mell, azokat egyszeren hozz kellene
adni ehhez). Ha kettesvel sztpakolnnk ket tven klnbz helyisgbe, akkor
mr tven bejegyzsnk lenne, 2-es darabszmokkal. Amikor keresnk egy trgyat,
a kzvetlen indexels helyett vgig kellene olvasnunk a puffer teljes mrett,
vizsglva, hogy melyik elemben egyezik a trgysorszm a kvnttal; amikor egy
trgyat trlnk, az az sszes hozz kapcsoldt is magval rntan. Vigyzni
kne, hogy a fontosabb trgyak ne tnjenek el.


4.1.9. "Sokasodjatok s nvekedjetek!"

	Az eddigiek folyamn egy meglehetsen kihalt s sivr valsgot
ptettnk fl - egyelre gy fest az egsz, mint az stengerek, a bennk
szkl egysejtek nlkl. Hinyzik belle valami, ami elevenn teszi azt: a
jtk szerepli mg nincsenek bekapcsolva az esemnyek vrkeringsbe. Az
llnyeket nemcsak az klnbzteti meg a tbbi trgytl, hogy a sorszmozs
legelejn foglalnak helyet, hanem hogy sokkal vltozatosabb mdokon lehetsges
rintkezsbe kerlni velk, illetve a mi kzremkdsnk nlkl is mindenfle
"akcikra" ragadtatjk magukat. Szlssges esetben ezek akr valsgos
szemlyek is lehetnek - ld. a msodik fejezetben megemltett hlzatos
kalandjtkokat -, msklnben neknk kell a program segtsgvel emullnunk
ket. Az egyes llnyeket leginkbb az klnbzteti meg egymstl, hogy
klnfle kzeledsi ksrleteinkre eltr mdon reaglnak. Vannak bizonyos
alapvet magatarts-formk, amelyeket egy j kalandjtknak fl szksges
ismernie, s ltalnos jelleggel lekezelnie ket: agresszv cselekedetek
(megtni vagy megtmadni valakit), a beszlgets klnbz formi (ksznni,
beszdbe vegylni ltalban, vagy pontosan meghatrozott dolgokat mondani,
esetleg faggatzni jl krlrt tmkrl) s a trgy-csere jelleg dolgok
(megmutatni, odaadni vagy elkrni egy trgyat, netalntn pnzt). Ezeket
valamennyi szereplre nzve kln-kln ki kell dolgozni, gy, hogy ltszlag
egyni mdon reagljanak.
	Sajnos, a legtbb kalandjtk gy kszl, hogy mr eleve egy szilrdan
lebetonozott nzpontbl mutatja a benne zajl esemnyeket. Ez azt jelenti,
hogy ltezik egy e clra kivlasztott fhs, s mi mindent egyedl az 
szemein keresztl ltunk. Ktsgtelenl ez a legknyelmesebb megolds, m
sokkal izgalmasabb a jtk, hogyha kvlrl is megfigyeljk benne nmagunkat
kzben. Programozstechnikailag legjobb, ha - a manapsg divatos
objektumorientlt programozshoz hasonlan - a jtk szereplinek mindegyike
egy nll, zrt egysget alkot, s valamennyikhz tartozik egy-egy, a
magatartsukat generl program vagy programrsz, amirl a vezrl fprogram
gyakorlatilag semmit nem tud, csupncsak az ltaluk jelzett cselekvsi
szndkaikat ltja. Ebben a felllsban - a fprogram szempontjbl legalbbis
- maga a jtkos, "a" fhs is csak "egy a sok kzl", a tbbiekkel egyenrang
lny, aki hasonl korltokkal s lehetsgekkel rendelkezik, akrcsak
balsorsban osztoz trsai; ms krds, hogy - valdi ltnl fogva - ezekkel
a lehetsgekkel hasonlthatatlanul sokoldalbban kpes lni s cselekedni,
mint k. Ez egyttal azt is jelenti, hogy brmilyen lpsre kpesek vagyunk,
azt akrki ms is megtehetn helyettnk ugyanebben a helyzetben - elmletileg
-, ms szval a tbbieket is aktvan bevonhatjuk a jtk feladvnyainak
teljestsbe; ahelyett, hogy magunk tennnk meg valamit, megkrnk r valaki
mst. (Pl. NYISD KI AZ AJTT helyett gy: KRD MEG AZ RT, HOGY NYISSA KI AZ
AJTT.) Ettl egyrszt mindjrt vltozatosabb lehetsgeink nylnak, hiszen ha
tbbszr prblkozunk valamivel, nem kell mindig ugyanazon a mdon
megfogalmaznunk, amit szeretnnk; msrszt pedig meglehet, vagy a program
netn el is vrja tlnk, hogy msokat is megmozgassunk a vgs siker
rdekben: lehetnek benne olyan epizdok, amelyek feloldsa kizrlag
csapatmunka rn lehetsges. Pldul ll valahol egy rszem, aki egy bizonyos
ponton nem enged tlpni senkit - de ha egy szereplnkkel gyesen eltereljk a
figyelmt a feladatrl, akkor msvalaki szrevtlenl elsurranhat a hta
mgtt kzben... Egycsapsra rdekesebb vlnak ily mdon a jtkunk
feladvnyai! Arra is lehetsget nyjt ez a rendszer, hogy akr egyszerre tbb
szerepl brbe is belebjjunk, llandan vltogatva azt, hogy melyikket
alaktjuk ppen. Egy jtk rsztvevinek viselkedse az albbi forrsokbl
szrmazhat:
	1.) Kzvetlenl a billentyzetrl begpelt utastsok hatrozzk meg
szmra a kvetkez lpst. Tipikusan a fszerepl magatartsa ilyen. Egy
fhs szemlynek kivlasztsa nem is olyan bonyolult, mint hinnnk: adott a
szereplk listja, amelyek kzl vlasztani lehet, s mindssze egy vltozban
folyton nyilvn kell tartani annak sorszmt, akik jelen pillanatban ppen
vagyunk. Amikor a jtkos azt mondja, hogy N, MAGAMAT, ENGEM... stb., ezeket
a szemlyes nvmsokat kicserljk az itt trolt sorszmra, zenetek kiratsa
kzben pedig annak neve helyett a "te" (n), "magad" (maga)... stb. alakokat
kell - persze helyesen felragozott formban - hasznlni. Na ez utbbival
szokott inkbb gond lenni - szeretjk az zeneteket ksz szvegknt,
rgztetten trolni, s nemigen flik a fogunk hozz, hogy mindenfle
kplkeny kifejezsekkel bonyoltsuk ket. Elvgre ez nemcsak egyetlen sznak
a cserjt jelenti, de a teljes szvegkrnyezetet is hozz kell igaztani
ehhez. (Pl. "Valaki kinyitja az ajtt." helyett "Kinyitod az ajtt." - az
alany mellett az lltmny is megvltozik stb.) Ha azt akarjuk elrni, hogy
egyes tevkenysgekre csak bizonyos "kivlasztottak" legyenek kpesek, nem
kell mst tenni, mint eltte ellenrizni, hogy ppen k vagyunk-e mi.
	2.) sztns sugallatait egy kln e clra ksztett, irnyt
programrsztl kapja. Ez ktfle mdon trtnhet: vagy adott helyzetben egy
elre lergztett cselekmnysort hajt vgre (pl. van valahol egy jjelir, aki
bizonyos idkznknt egy hatrozott tvonalat vgigjr, s ellenrzi, minden
rendben van-e arra - napkzben meg lefekszik aludni, s ki lehet figyelni az
rsgvlts idejt stb.), avagy pedig rszben vletlenszeren lltja el
ezeket a program (egyes alakok a jtkban szeszlyesen kborolnak ide-oda,
mikzben idnknt az "eszkbe jut" valami - mondjuk becsukni egy ajtt vagy
eldobni egy trgyat stb.). Esetenknt ez az elbbi ponttal kombinldhat,
olykppen, hogy a sajt figurnkon keresztl megkrnk r valaki mst, hogy
tegyen meg szmunkra valamit (az emltett KRD MEG AZ RT... kezdet plda!),
s ha j kedvben talljuk a fickt, akkor lehet, hogy mg engedelmeskedik
is... Nem knny - de igen hls! - feladat minden egyes szereplnkhz
klnbz programokat rni, s bizony komoly elzetes tervezst ignyel
sszhangba hozni szmos olyan esemnyt, amelyek egyidben, de a jtktr
klnbz pontjain mennek majd vgbe...
	3.) Valahonnan "kvlrl", a szmtgp szmra ismeretlen klvilgbl
rkeznek a parancsai - rendszerint mr elrtelmezett, azaz a legrvidebb,
legtmrebb alakra faragott formban. Ez az eset akkor llhat el, amikor egy
olyan programot runk, amivel egyszerre tbb felhasznl is zekedhet - az
egymssal sszekttetsben ll felek a hlzaton keresztl kommuniklnak
egymssal. Vegyk szre, hogy ez alig klnbzik az els ponttl, szinte csak
annyiban, hogy itt egyszerre tbb kalandorhoz kell hozzrendelt sorszmokat
nyilvntartani.
	Ezenkvl gondoskodni kell mg arrl, hogyha egy szerepl valamilyen
mdon "nkvleti" llapotba kerlt (meghalt vagy eljult), akkor az eredeti
irnyts ne rvnyesljn nla, s ne is kommuniklhasson a krnyezetvel
tbbet (de bizonyos id elteltvel azrt jra maghoz trjen - kivve, ha
meghalt). Az eddigiek konkrt megvalstsa nehz, de nem tlsgosan bonyolult
programozi feladatot jelent (meg lehet rni egy ltalnos szervez programot,
ami minden lehetsges bemenetet lekezel), sokkal kemnyebb mogyor azonban
ennek a fordtottja, vagyis az egyes rsztvevk tjkoztatsa a klnfle
trtnsek hatsairl. A gyakorlatban ez annyit tesz, hogy a kzponti rsznek
a jtk vilgban vgbemen minden egyes esemnyt figyelnie kell, s errl az
sszes szerepl fel valamilyen zenetet tovbbtania - mgpedig minden egyes
szerepl fel ms-ms tartalm zenetet! Radsul az egyes esemnyek is -
mintegy kvetkezmny gyannt - tovbbi esemnyeket vonhatnak maguk utn. Egy
nagyon egyszer pldval illusztrlva a dolgot: ha valahol egy Tompika nev
szerepl pl. kinyit egy ajtt (hogy tovbbra is ennl az oly srn flbukkan
motvumnl maradjunk), akkor nem elg az ajt llapott nyitottra vltoztatni,
hanem az illett rtesteni is kell rla: "Kinyitod az ajtt." (Az
egyszerepls kalandjtkok meg is elgednek ennyivel!) A vele azonos
helysznen tartzkodkat ugyanakkor mr arrl kell tjkoztatni, hogy
"Tompika kinyitja az ajtt." - mg vgl a tvol maradknak abszolte semmit
nem szabad megszimatolniuk errl az egsz cselekmnyrl. St, mg egy negyedik
csoport is van: az ajt tloldaln llk nem tudhatjk, ki cselekszik, gy
mindssze annyit szlelnek belle, hogy "Valaki kinyitja az ajtt." Ezenkvl
a helyzetet mg tovbb bonyolthatja, ha teszemazt a ktfle helyisg kzl
valamelyikben stt van: ekkor tudniillik az ott-tartzkodk nem lthatjk,
amidn Tompika kinyitja az ajtt, teht akkor ezeket nem is szabad rtesteni
rla... Viszont megeshet, hogy a msik szobbl, az immron nyitott ajtn
keresztl berad a fny, aminek kvetkeztben ezek a bcsik nemcsak hogy az
ajt kinyitsrl szereznek tudomst, de radsul mg megpillantjk azokat a
dolgokat is, amiket eddig a teremben honol sttsg eltakart a szemk ell.
(Teht mindjrt a helysznlerst is ki kell nekik rni, s az egsz szoba
kezelse megvltozik.) s akkor akr ez mg folytatdhat azzal, hogy mondjuk a
hirtelen vilgossgban valaki flismeri az ellensgt, s azonnal rtmad...
Vagy nla van egy tekercs film, ami fnyt kap s tnkremegy stb. Egy ilyen
egyszer dnts is, mint amilyen egy ajtnak a kinyitsa, alkalmasint a
trtnsek egsz lncolatval (vagy inkbb: hljval) jrhat egytt - amirl
pedig szintn mindig tudstanunk kell az rintett felek mindegyikt. Egy
dinamikusan szervezd kalandjtkban lpten-nyomon elfordulhatnak hasonl
jelleg problmk, ahol rengeteg, egymstl ltszlag fggetlen kls
krlmny egyttes hatst kell figyelembe venni.


4.1.10. Az id kerekhez ktve

	Egyltalban nem mindegy, hogy egy kalandjtkban mifle temhez
igaztva telik-mlik az id. A legegyszerbb megolds, klnsen az
egyszerepls kalandjtkokra leginkbb jellemz, hogy mindig egy-egy sikeres
parancs vgrehajtsa lpteti tovbb az egsz rendszert egyetlen idegysggel,
mintha valamifle, vltozkony hosszsg rajelet adna neki ezzel. Ameddig
gpelnk, a kvetkez mondatunkat szerkesztjk, addig a jtkban ll az id -
mihelyst azonban letjk az ENTER-t (s be is rtunk neki valamit),
egycsapsra mindenki regebb vlik, mondjuk egy negyed rval. Tulajdonkppen
nem is idhz, hanem lpsszmhoz vannak szinkronizlva egy ilyen jtk
trtnsei - pl. olyan idztseket alkalmaznak bennk, hogy - mondjuk egy
kopogtatst kveten - t lps mlva kinyitja neknk az ajtt valaki.
Tetszleges ideig lehet tprengeni a pillanatnyi helyzet megoldsa fltt, s
hiba ugrik a nyakunkba egy vrszomjas dmon, nyugodtan elmehetnk
megvacsorzni, mieltt vgkpp az arcunkra fagyna az az utols vigyor... A
program bels szmllit, amelyek az eljvend esemnyek titkos elhrnkei, a
vgrehajtott utastsok cskkentik rendszeresen eggyel. s ez nagyon helyesen
van gy! Egy elssorban kpzeletre s gondolkodsra pl jtknl ez egy
idelis helyzet - tkletesen megengedhet s elfogadhat, hogy ki-ki a sajt
bels ritmusa szerint haladjon elre a feladatok megoldsban. (Hogy is nzne
ki, ha egy gyakorlott gyors- s gpr illetktelen elnyre tenne szert a
lasskezvel szemben...)
	Csakhogy egy tbbszerepls kalandjtkban mr egyszeren
tarthatatlann vlik ez az llapot. Ha a program mondjuk hat klnbz jtkos
parancsait fogadja prhuzamosan, akik mind eltr ritmus szerint gpelnek,
akkor mgis melyikkhz alkalmazkodjon a tbbi? Amikor az egyik semmit nem
csinl, hanem csak karbatett kzzel s sszerncolt homlokkal bmulja a
kpernyt, akkor is ktelessge a programnak, hogy pontosan a trtnsek
idejben haladktalanul rtestse t a msik lpseirl, ha az ppen akkor
halad el mellette, vagy ugyanazon a helysznen tevkenykedik. Az effle
programokban eszerint nem tehetnk mst: vals idej idztseket vagyunk
knytelenek alkalmazni bennk. Ez viszont maga utn vonja, hogy a bevitel s
kirs funkcijt az eddigieknl sokkal lesebben el kell hatrolnunk
egymstl - mert mi trtnjk, hogyha vletlenl ppen akkor rkezik valakihez
egy fontos kirand zenet, amikor  sajt mondata szerkesztsnek a kells
kzepnl tart; esetleg fl sem pillantva a kpernyre, keresi a megfelel
billentyt? Nem lehet csak gy otrombn kettvgni a flig begpelt mondatot,
s a kzepbe belenyomtatni a szveget! (De lehet: a TELNET-es jtkok sajnos
pontosan ezt teszik...) Okvetlenl ktfel kell bontanunk a kpernyt, gy,
hogy kln legyen egy fellet a kirs s szintn kln a bevitel szmra
(utbbinak kt-hrom sor is elg lesz). gy azok mr nem zavarjk egymst -
vagy mgis?! Mit tehetnk akkor, ha a megjelents mezejben egy klnsen
hossz lers kezd el szpen, megfontoltan kibontakozni az ismeretlensg
homlybl, mialatt mi szorgosan a parancsunkat gpeljk? Bevett gyakorlat,
hogyha egy szveg hosszabb annl, mint amennyi a kpernyre egy adagban kifr,
akkor oldalanknt meg-megszaktva, minden oldal vgn egy billenty-lenyomsra
vrakozva fokozatosan lptetjk azt tovbb (<More> vagy magyarul <Tovbb>
funkci). De mg ha ez az eset nem is forog fenn, akkor is az ablak grgetse
tbb msodpercig is eltarthat, s rendkvl illzirombol lenne, ha erre az
idre hirtelen megakadna az als sorokban a bevitel. Msik problma: mi van,
ha a kirs-ablakban egy flig megjelentett szveg ppen ENTER-rel val
tovbblptetsre vr, de mi nem trdnk vele, s zavartalanul csak a
mondatunkra figyelnk - hol vrakozzon addig a szveg htralev rsze, s ha
kirs kzben jabb zenetek rkeznek, azokat mikppen vrakoztassuk? Meg kell
oldanunk teht azt is, hogy a ktfle funkci ne csak trben, de idben is
egymstl teljesen fggetlen s prhuzamos legyen: mialatt gpelnk, tnyleg
akzben folyjon odat a kirs! A mg kiratlan, de a kldtl mr tvett
"szz" szveget pedig addig is egy tmeneti pufferban kell trolnunk, ahol egy
bizonyos hatrig gylhetnek s halmozdhatnak a sorok s a mondatok, de ha a
puffer betelt, akkor haladktalanul ki kell grgetnnk ket a kpernyre -
akr tetszik a felhasznlnak, akr nem. Klnsen mks tud lenni, amikor a
szereplt a jtkban egy slyos baleset rte, de  mg valahol tz oldallal
fljebb tart a szvegek olvassban, mikzben a tbbiek mr rges-rgen
rtesltek rla, hogy jultan hever a fldn, s aprnknt kipakoljk a
htizskjbl az rtkesebb cuccokat...
	Egyetlen megolds ltezik a legsimbb prhuzamossg elrsre, az, ha
a program kzponti, vezrl rsze sohasem "ragad le" valamilyen szubrutinnl,
hanem egy rks vgtelen ciklusban meglls nlkl kering hrom alapvet
tevkenysg: a beviteli mez szerkesztse, az esemnyek vgrehajtsa
(belertve termszetesen a sajt s a tbbiek ltal kiadott utastsok
vgrehajtsait is) s a szvegkirs alapvet fzisai kzt. Ehhez az
szksges, hogy valamennyi funkcit apr, sztvlaszthat s nllan
vgrehajthat kis lpsekre tagoltan valstsuk meg. A szvegkirs esetben
ilyen ptkocka lehet pl. az tmeneti puffer egyetlen sornak kilptetse a
kpernyablakba, vagy a beviteli rutin esetben egyetlen lenyomott billenty
beolvassa a billentyzet-pufferbl (ha van olyan), s annak megfelelen a
beviteli mez mdostsa. A program teht gy fog mkdni, hogy folyton
figyeli, trtnnie kell-e valamilyen esemnynek, s ha igen, akkor vgrehajtja
azt, s a neki megfelel szveget a puffer als vghez hozzcsapja (ez
egyetlen szemvillans alatt megvan); majd rgtn tovbbadja a vezrlst a
kir rutinnak, amelyik a szvegpuffer legfels sort kigrgeti a kpre
(hacsak nem res a puffer ppen akkor); ezt kveten a beviteli szubrutin lp
sznre, mely pedig egyetlen karaktert beolvas, ha kpes; vgezetl pedig
vissza az elejre, s ez gy megy tovbb meglls nlkl... Nem kis feladat
elrni, hogy ez az egsz gy egyben kellkpp sszehangoltan fusson -
klnsen, hogyha grafikus kpernyt hasznlunk a megjelentshez, ami mr
eleve alaposan lelasstja a kirsokat. (Ajnlott az ASSEMBLY nyelv
hasznlata pldul.)
	Tbbek kztt emiatt is szmt, hogy mind az rtelmez szubrutin, mind
pedig a program ms egyb vgrehajt eljrsai igen-igen sernyen vgezzk a
dolgukat - mert mirt ne fordulhatna el, hogy hsz klnbz jtkos
egyszerre adja ki, egyenknt hatszz betbl s harminc parancsbl ll
mondatait? Amibl mindjrt egy msik szempont is kvetkezik, nevezetesen hogy
az egyes jtkosok teendit is hasonl pufferokban kell elzetesen
nyilvntartani - elvgre mindnyjan kiadhatnak tbb parancsbl ll mondatokat
is, amibl egyelre mg csak az els vagy a msodik hajtdik vgre, amelyeket
addig is trolni kell valahol, de  gonosz mosollyal az ajkn tstnt begpeli
mris a kvetkez adagot, s lehet, hogy ezt egyszerre akr tbben is
megteszik...
	s ne gondoljuk azt sem, hogy mindezek a szrnysgek kizrlag
hlzatos kalandjtkokban fordulhatnak el! Ha egy olyan kalandot ksztnk,
amiben ugyanazt az egyetlen szmtgpet hasznl jtkos tbb szereplt is
irnythat egymssal prhuzamosan, mondjuk ESC-pel vagy TAB-bal kapcsolgatva
az egyik vagy a msik kztt (esetleg osztott kpernyn megjelentve egyms
mellett egyidejleg akr tbbet is), mikzben vals idej megjelentst
alkalmaztunk benne, az pontosan ugyanakkora galibkat teremthet, mintha ezren
kldzgetnk az utastsaikat a komputernek egyszerre! De megri a
belefektetett munkt a dolog, mert rendkvl ltvnyos lesz a vgeredmny.
	Ezltal teht elrtk, hogy - elmletileg - akrhny jtkos
tnykedst le tudjuk kezelni egyidejleg, mikzben sem a vgrehajts, sem a
folyamatosan a httrben zajl szvegkirs nem zavarja egymst, s fkppen
pedig a bevitel mindekzben zkkenmentes marad. De nyitva maradt mg egy
problma: a klnbz jtkosok klnbz sebessge. Ha valaki gpr, mint a
villm, annak a parancsai is fokozott temben hajtdnak vgre, amire mg
rfoghatjuk, hogy megrdemli ezt a kis elnyt, mg ha a tbbiek nemhogy
reaglni r, de mg csak figyelemmel kvetni se nagyon brjk kzben; de ha
egy tbb parancsbl ll mondatot rt be valaki - erre ugyebr egy lassbb
illet is kpes -, akkor mr igazn tisztessgtelenl manverez vgtzsba
kezdenek az utastsai - ennek egymst kvet lpseit a program mindenfajta
ksleltets nlkl, teljesen egybefolyva, mondhatni szinte egyszerre vgja a
tbbiek kpbe. Fokozott mrtkben ll ez a szmtgp ltal irnytott
szereplkre (n. NPC-k: ez a "Non Player Character" - "nem jtkos szerepl" -
angol nyelv kifejezs rvidtse): nluk tudniillik abszolte semmifle
gprsrl nincsen sz - az illet fick cselekvsi szndkai a msodperc
trtrsze alatt alakulnak ki egy kln e clra berendezett "mhelyben". Ennek
eredmnyekppen aztn ezek olyan kvethetetlen mokfutsba kezdenek, hogy
szinte ltni se nagyon fogjk ket a tbbiek, amint nagyritk n fltnedeznek
egy-kt tizedmsodpercre itt-ott... A megolds kzenfekv: minden egyes
llnynek - fggetlenl attl, valdi-e vagy NPC - osszunk ki valamilyen
maximlis sebessgrtket, amivel haladhat. Ez pl. gy nz ki, hogy
mindenkihez tartozik egy-egy szmll, melyeket bizonyos idkznknt
cskkentnk, s ha nullra cskkent, akkor kvetkezik lpsre az az illet.
Ezeket egytl nhny msodpercig terjed tartamokra clszer belltani,
miltal mindenkinek szemlyre szabott sebessge lehet - bizonyos jtkosokat
vagy NPC-ket tetszlegesen flgyorsthatunk vagy lelassthatunk, amivel a
helyzetek nehzsgt is lehet nmikppen lltani. Az emltett rtkeket akr
dinamikusan is vltoztathatjuk: pl. minl jobban meg van pakolva slyos
trgyakkal valaki vagy minl fradtabb s kimerltebb, annl jobban lelassul a
mozgsa stb.


4.1.11. Nhny jtancs s tovbbi lehetsgek

	Az eddigiek sorn elgg nagyvonalan s magas szinten kezeltk a
tmt - ha ugyanezt rszletekbe menen kne kifejteni, egy egsz knyvet sem
volna nehz megtlteni a kalandjtk ksztsrl. (F. DaCosta megtette mr
ezt, de  csak az egsznek az alapjaival foglalkozott.) Most befejezsl
mindssze nhny hasznos jtancsot szeretnk felsorolni azok szmra, akik
komolyabban szeretnnek foglalkozni ilyesmivel, illetve egy kicsit
eltprengeni rajta, hogy mire is lehetne mg flhasznlni a leszrt
tapasztalatokat.
	Elszr is, a kalandjtkok vilgban kezdettl fogva lteznek
bizonyos kialakult szoksok s elvrsok, amiknek nem rt, ha az jdonslt
jvevnyek is megprblnak eleget tenni. Nem elg egy helyisgekbl ll
trkprendszert flpteni, s megtlteni trgyakkal s llnyekkel - ahhoz,
hogy ez igazn kzzelfoghatan megjelenjen a jtkosok szmra, az is
szksges, hogy az informciknak lehetleg minl bsgesebb tmegvel
elhalmozzuk ket azok milyensgt illeten. Mint ahogy a val vilgban, itt is
a szemt hasznlja leggyakrabban, azaz mindent, ami csak elrhet, vizsglni s
tanulmnyozni igyekszik: ktsgtelenl a mozgsi parancsok mellett a
leggyakrabban alkalmazott funkcijuk a VIZSGLD ige. gy kell megoldanunk,
hogy ezzel minl tbbmindent elrjen, s lehetleg minden trgyrl, amelyet
megvizsgl, hossz s rszletes lersokat bocsssunk a rendelkezsre. Ha
mondjuk egy helysznnek a lersban hangslyozottan szerepel, hogy "az
erdben, egy hatalmas fenyfa tvnl llsz", akkor nem tlzottan szerencss,
ha egy NZD MEG A FENYFT prblkozsra valami ilyesmi lesz a vlasz: "Nem
rtem azt, hogy fenyft." - vagy: "Nincs itt semmifle fenyfa." Ilyesmi a
legjobb krkben is elfordul nha, elvgre mindent belezsfolni mg a
legbvebb memriba sem lehetsges, de trekednnk kell r, hogy minl
ritkbban forduljon el. Ha pedig mr flvettk a sztrba, s vizsglni is
engedi a program, akkor ne csak valami olyasmi ktszavas kzhelyet vessnk oda
neki, hogy "Szp nagy fa." - hanem aprlkosan rjuk le, ahogy a krge
pikkelyei repedsekkel tarktva bortjk a trzst, amelyet egybknt tmny,
bdt illat vesz krl, fldbl kill gykerei krl arasznyi vastagon fedik
a talajt a tbbves, boml fenytskk, itt-ott kibuggyant belle a ragacsos
gyanta, s egszen elszdlnk, amikor a magasban ered legals gaira
nznk... Ennek nemcsak ncl szrakoztat szerepe van a jtkban, hanem gy
burkoltan utalunk esetleges tovbbi trgyakra, melyeket a jtkos szrevesz,
ha egy kicsit is ksrletez hajlam. Pl. az emltett avart flpiszklva egy
odahullott fenytobozt tallhat, amire majd a jtk valamelyik msik pontjn
lesz szksge, vagy a trzsrl lekapart gyantt ragasztknt alkalmazhatja
mshol stb. A lnyeg az, hogy nem szabad mindent direktben az orra el trni,
hanem el kell rejteni az rtkesebb dolgokat, s a jtkosra bzni, hogy
aprnknt elmlyedve flfedezze ket. Lttuk, mikppen lehet a trgyakat
egymshoz kapcsolni s egymsba gyazni, gy most mr nem a szoba kzepre
helyeznk majd mindent egyetlen halomban, hanem sztosztva mindenfle
asztalokkal, polcokkal s szekrnyekkel tltjk meg a falakat, melyek
mindegyike akr egy egsz kln kis vilgot is tartalmazhat elrejtve
magban. Ez a helyisgek elrendezsre is vonatkozik, azaz ne egyetlen
kijellt tvonalon lehessen vgighaladni rajtuk, st, mg csak egyltaln
ilyen "tvonalak" se ltezzenek a jtkban, hanem olyan legyen az egsz, mint
egy nagy, kerek, zegzugos arbortum, vratlanul egymsba visszakanyarod
svnyekkel, s egyedl a jtkoson mljon, hogy merrefel mozog rajtuk - ne
akarjuk a szjba rgni semmilyen elzetes elkpzelsnket. (Vagy ha igen,
akkor azt gy tegyk, hogy  ezt ne vegye szre...) A jtkban ppenhogy az
elrejtett, nem lthat dolgok jelentik a legfbb vonzert - ha tudjuk, hogy
ott vannak, s mgse talljuk meg ket...
	Nagyon sokan elrontjk a jtkot azzal, hogy mindenron valamilyen
trtnetet akarnak elmeslni ltala; holott egy kalandjtk egyltaln nem
errl szl! Az persze nem baj, ha van ilyen - st, egy jl kitallt
kerettrtnet sokat emel a jtk sznvonaln -, de vegyk tudomsul, hogy ez
egy msodlagos dolog: kicsit szigoran azt is mondhatnnk, hogy a bevezetnl
tovbb nem szabad(na) menni ezzel. Mirt? Ha mi elejtl a vgig kimdoljuk a
cselekmnyt, majd a szereplket arra knyszertjk, hogy lpsrl lpsre ezen
az ton haladjanak vgig, azzal elvesszk tlk azt az illzit, amirt
voltakppen leltek a szmtgp el: hogy a jtk tlk fgg, hogy szabadon
k alaktjk az esemnyeket. Ha gy tesznk, azzal nyltan uralkodni akarunk a
fhsn, amivel bizony knnyen elvehetjk a kedvt a jtktl - az ilyesmi
csakis ellenrzseket szlhet. Az effle tlszerkesztst leggyakrabban attl
val flelem motivlja, hogy a jtkos esetleg tsiklik a kedvenc tleteink
fltt, egyszeren nem veszi szre azt, amit mi a legnagyobb ponnak szntunk
- s ennek elkerlse vgett mindenron megprbljuk bebiztostani a dolgot,
mintegy szjbargni a kvetkez lpst. s ezzel - akaratlanul is -
agyoncsapjuk az egszet: kapkodva lerntjuk a leplet az sszes titokrl, mg
vgl szegny kalandor ott ll teljesen kibrndultan. Egy kalandjtk
tartalmt nem egy trtnetnek az elmeslse adja, hanem hogy tulajdon
kpzeletnkbl mertve flptnk egy miniatr vilgot, ami a megfelel
eszkzkkel azt a ltszatot kelti magrl, hogy l - s ennek a clnak
kimondottan jt tesz, ha az t alkot rszletek s epizdok lazn sztszrtan
hevernek, s minl kevesebb sszefggst mutatnak egymssal a felsznen.
(Hossz ideig eltart, mire az ember megsejti a ltszlagos kosz mgtt mlyen
meghzd rendet.) A jl sikerlt jtk nem egy vagy tbb, elre elrendelt
tvonalat jelent, hanem gyszlvn egyszerre terjeszkedik valamennyi irnyban.
	Minden lehetsges eszkzzel akadlyozni kell, hogy vilgunkrl pontos,
rszletes trkp kszljn! lljon minl nagyobb szm helyisgbl az egsz,
s azok is minl bonyolultabban kapcsoldjanak egymshoz (pl. ne csak
vzszintesen, hanem fgglegesen is keresztl-kasul, akr egy tbbszintes
barlangrendszer esetben) - gyhogy ha valami vakmer nekillna brzolni
ket, ht minimum A1-es paprra legyen hozz szksge... Minl tbb vltoz
krlmny legyen! (Pl.: stt helyek, ahol vilgtani kell, de a lmpban egy
id mlva kimerl az elem; vletlen utakon bolyong, csavarg szereplk; pnz,
amivel vsrolni lehet, de igencsak szkben mrjk szmra; vzalatti zugok,
melyekben csak rvid ideig tartzkodhatunk megfullads nlkl; napszakok
vltakozsa - jszakra bezrnak a boltok, becsukjk a vroskaput - stb.)
Szlssges esetben akr mg az is elkpzelhet, hogy napszakok szerint
vltozik a helysznek lersa, gyhogy ha jszaka jrunk ugyanazon a helyen,
akkor meglehet, egszen ms dolgokat tallunk ott, mint nappal... Csak
rszletesebb vizsglds rn flfedezhet rejtekutak kellenek (festmny
mgtti rejtekajt, csapajt az gy alatt, ltra a ktban...), lelakatolt
ajtk, egyirny tjrk, helyket vltoztat rszemek. Sok-sok csukott ajt
legyen, s ms hasonl akadlyok, s mg az sem kizrt, hogy nmelyik ajtt
netn sohasem lehet kinyitni, gy a kalandor rkk csak tallgathat, mi is
lehet mgtte. Roppantul lnyeges, hogy minl tbb olyan epizd szerepeljen
benne, melynek nemcsak egyfle megoldsa van! Ha mondjuk be szeretnnk jutni
egy fallal krlkertett vrosba, akkor cselekedhetnk gy is, hogy bizonyos
sszeget fizetnk a fkapu rnek, aki erre kinyitja neknk a fkaput; esetleg
ha elg ersek vagyunk, meglhetjk s elvehetjk tle a kulcsokat; valahol,
egy msik ponton tmszhatunk a kfalon; vagy akr egy fldalatti alagton
keresztl is behatolhatunk, hogy aztn az egyik lakhz pincjben bukkanjunk
el... stb. stb. Sose felejtsk el, hogy minl nagyobb szabadsgot kap tlnk
a jtkos, annl jobban lvezi majd a jtkot - igaz, msik fele a dolognak,
hogy ez sajnos nagysgrendekkel megnehezti szmunkra a jtkprogram
megtervezst s elksztst...
	Emltettk: a kalandjtk bizonyos szempontbl a valsgos vilg
szimulcijra trekszik. Rendkvl sokat rt ennek a szndknak, hogy
bizonyos konkrt clok elrsre irnyul vonalakba rendezdik a cselekmny -
azt a hamis illzit keltve, mintha az egsz vilgnak egy bizonyos clja s
rtelme lenne... Ha a jtkos elrte a vgs cljt, akkor egyszercsak mintha
elvgtk volna: nincs tovbb, lellt, filmszakads, drma... Attl kezdve mr
nem is rdekelheti tovbb az egsz. Segthet ezen valamennyire a sokflesg,
az, hogy mindennek tbbfle megoldsa van; gy legalbb van rtelme mindig
jrakezdeni, s az jabb s jabb vltozatokat prblni, flfedezni az
elrejtett, mellkes kis rszleteket is. De a legjobb (s persze legnehezebben
elkpzelhet) megolds az volna, ha egyltaln nem lenne sem eleje, sem pedig
vge az esemnyeknek. Ez esetben tnylegesen is fl lehetne hasznlni a
valsg jelensgeinek brzolsra. Lehetne pldul egy programot rni, ami -
valsgos tnyekre s tapasztalatokra ptve - megjelenten egy erd
mindennapos lett. Az alapszntr sokezer, egymshoz nagyon hasonl
helysznbl llna, amely lassan s fokozatosan, de nem szn
kvetkezetessggel folyton-folyvst vltozna: bizonyos svnyeket lassanknt
benne a csaln, mg elbb-utbb teljesen eltnnnek, s ekzben mshol j,
friss csapsok kpzdnnek az llatok lbai nyomn - nem lehetne egy lland
trkpet rajzolni a vilgunk flptsrl, mert mire elkszlnnk ezzel,
addigra taln mr teljesen megvltozna a helyisgek elrendezse; st, maguk a
helyisgek is eltnnnek idvel, hogy azutn hasonlak, de nem pontosan
ugyanolyanok bukkanjanak fel valahol egy msik pozcijn. ppgy
cserldnnek a bennket megtlt trgyak s llnyek is: termszetesen ehhez
min. hetekig vagy hnapokig kellene futtatni a programot, de ennyi id alatt
az oszlopos fk is szpen kiregednnek s kidlnnek (ha szerencss a fhs,
akkor ppen olyankor tartzkodik egy ilyen rdekes esemny helysznn, amikor
az megtrtnik, s gy nha-nha kzvetlenl figyelemmel ksrheti azt), hogy
aztn jabb hossz ideig korhadjanak a fldn, mialatt a friss nyiladkban
fejldik a kvetkez nemzedk. A keletkezett tisztsokat bennk a cserjk s
a virgok, rajtuk madarak s rovarok csapataival, es utn elbjnnak a
csigk s szeptemberben bgnnek a szarvasok... Termszetesen az id mlsa
is figyelemmel ksrhet lenne - alaposan felgyorstva, pl. egy msodperc
alatt mlna el ott egy perc, egy perc alatt egy ra, kvetkezskppen 24 perc
alatt egy nap; a napszakok vltakozsai nyomn vltoznnak a helyisgek
lersai s a bennk tallhat llnyek sszettele; kb. fl nap leforgsa
alatt pedig mr egy teljes hnap peregne le a szemeink eltt - hat nap alatt
telne el egy v... Ezalatt mind a ngy vszak megtenn a magt: tli lomba
vonulnnak a medvk, leesne a h s a fk lombjai, februrban malacokat
ellene a vaddiszn, majd ezutn a kvetkez tavasszal jra kezddne minden.
Ebben a jtkban mszklva nem azon mesterkedne a kalandor, hogy valamilyen
clhoz kerljn mindegyre kzelebb, hanem elssorban a nagysgval s a
gazdagsgval nygzn le t: brmekkora kirndulutakat tenne is benne,
sohasem fedezhetn fl egszen, s kptelen volna egyszer s mindenkorra
emlkezetben tartani annak a seregnyi llat- s nvnyfajnak a nevt, amelyek
letciklusa mind-mind parnyi rszt nyjtan a vgleges kpnek - kztk akr
olyan ritkasgok is, amivel j, ha egy letben egyszer tallkozik az ember,
vagy a teljes v folyamn mindssze nhny rig vagy napig tallhat
szabadon... Sohasem lehetne megunni, elvgre rkk ms-ms lenne benne
minden, s a kiss rszletesebb megismershez is rendkvl hossz ideig kne
foglalkozni vele. Br szintn megvallva, a valsgos termszetjrs azrt
valamivel izgalmasabb idtlts ennl... Nem is ez volna benne az igazi
kihvs - hanem egy ilyen programot elkszteni!
	Ez volna az egyik t, amelyen tovbb lehetne lpni innen; a msik
pedig a jtkok szveges voltt hasznln ki, s magnak a Nyelvnek a
szimulcijra trne. Trtntek is mr ez irnyban klnfle kisebb-nagyobb
prblkozsok; de az elfuserlt fordt- s beszlgetprogramok - minden
beljk fektetett szorgalmas s kemny munka ellenre is - igen sznalmas
ltvnyt nyjtanak... Nem csoda, ugyanis ez mg az elbbinl is jval
hatalmasabb feladat volna, s nem tudom, hogy egyltaln megvalsthat-e.
Roppant rdekes adalkok ehhez a tmhoz Noam Chomskynak, az amerikai
nyelvsznek s filozfusnak magyarul csak nemrg megjelent Mondattani
szerkezetek valamint Nyelv s elme cm rsai - elbbiben az emberi
beszdnek egy pontos matematikai modelljt igyekszik fllltani,
sszetevkkel s n. nyelvi transzformcik segtsgvel; utbbiban azt
foglalja ssze, milyen hatssal volt s lehet a nyelvszet az emberi elme
kutatsra. Szmtan s nyelvtan sszekapcsolsra msok is tettek mr
ksrletet, pl. a magyar Kiss Dnes is - de az v jval kevsb mdszeres s
alapos, mint a Chomsky, inkbb amolyan sztnsen ide-oda csapong.



4.2. Msodik rsz: A babtbor a szmtgpbe megy


4.2.1. A program mkdsnek lersa

	Ehhez a szakdolgozathoz program is kszlt - J. R. R. Tolkien: A bab
cm regnye alapjn, azonos cmmel. Mg annak idejn, C64-en rtam egy -
hivatalosan is forgalmazsra kerlt - kalandjtkot (A Glya volt a cme),
mely egy, a lehetsgekhez kpest elgg intelligens szvegrtelmezt
tartalmazott (az ismertetett szragoz algoritmusok alkalmazsval), benne
volt a tvoli clpont megkzeltse, a rekurzv trgy-keress, tbbszz
helyisggel s trggyal s hossz s szvevnyes cselekmnnyel volt elltva,
s jelents jdonsga pedig az volt, hogy egyszerre (pontosabban csak
felvltva) kt fhst lehetett irnytani benne egymstl fggetlenl: ennek a
programnak az elksztse majdnem kereken kt vig tartott. (Igaz, hogy
grafika is volt benne, amelyet szintn n magam rajzoltam meg hozz, azonkvl
kt nyelven rtam egyszerre, magyarul s angolul...) Nyilvnvalan egy
diplomamunka elksztshez rendelkezsre ll pr hnap alatt nem lehet
hasonl sznvonal vgeredmnyt elvrni, ezrt A Bab c. jtk ennl valamivel
egyszerbb. Illetleg maga az alapvet irnytsi rendszer jval fejlettebb s
bonyolultabb, de a jtk tartalma tredke sincs a msiknak.
	A szveg - rsos - brzolsnak alapegysge a bet, s nyilvn n is
innen indultam el. A hagyomnyos bc s az erre alapul ASCII-kdrendszer
elgg megnehezti a szavak kezelst bizonyos krlmnyek kztt: mr eleve
is vegyesen vannak benne a magnhangzk s a mssalhangzk, s miutn az
ASCII-rendszer alapveten az angol bcre pl, a PC-s karakterkszletbl a
magyar kezetes betk egy rsze hinyzik is, a tbbi pedig, ami megvan,
teljesen sszevissza, elszrtan helyezkedik el. A fontosabb rsjelek is
teljesen sszertlenl lzengek erre-arra... gy egy karakterrl eldnteni,
hogy pl. az bcbe tartozik-e egyltaln, elgg macers dolog, olyan
finomsgokrl, mint a sztr szavainak bc-sorrendbe val rendezse, nem is
beszlve. Ezrt n egy teljesen sajt kdrendszert alkalmaztam helyette: ez
gy nz ki, hogy az elejn vannak a magnhangzk, azok is sztvlasztva (elbb
az alacsony, majd a magas hangrendek), ill. a nulls karakter a szkz, s
mgttk jnnek a mssalhangzk, aztn egy ugyanilyen blokkban a nagybetk, a
szmok, vgl pedig az rsjelek zrjk a sort - mindsszesen ppen 128
karakter. Annak eldntse, hogy egy karakter bet-e, szm vagy rsjel, vagy
hogy egy bet magnhangz vagy mssalhangz-e, egyetlen sszehasonltssal
trtnik mindenfle tblzatokban val keresglsek helyett.
	A sztr szavai eszerint az j bc szerint blokkokba s szegmensekbe
csoportostva helyezkednek el. Egy blokkba tartozik az sszes olyan sz, aminek
az els kt betje egyezik (kis- s nagybetk kzt nem tesz klnbsget), egy
szegmensbe pedig az sszes olyan blokk, aminek a legels betje egyezik. Van
mg egy specilis, n. vegyesblokk is, amibe az esetleg nem betvel (hanem
mondjuk szmmal stb.) kezdd, valamint az egybets szavak kerlnek. Ezzel a
mdszerrel brmilyen hatalmas sztr is villmgyorsan kezelhetv vlik: ha
egy ismeretlen szt szeretnnk azonostani, az els kt betje mris kijelli
a blokkot, amiben keresni kell - azonos blokkba pedig mg egy sokezer szavas
sztr esetn is max. nhny tucatnyi kerlhet. Ezt a pr darab sztrbli
szt az rtelmez program minden lehetsges mdon vgigragozza, s az alakokat
sorban egyms utn sszehasonltja a beadott szval. (Erre azrt van szksg,
mert a szavaknak nha elgg sokfle ragozott alakja lehet.) Az ellenkez
irnybl ugyanez az t nem volna jrhat, vagyis egy ismeretlen sz vgrl
nem lehetsges lehastani semmifle ragot, miutn kptelenek volnnk
megllaptani, hol vgzdik a szt s kezddik a rag. (Pl. a KVET sz
egyarnt lehet a K trgyesete vagy a KVETNI ige alakja - de ha ezt
ltalnostani prblnnk, akkor a program esetleg a LVET igbl is levezetne
egy nemltez L fnevet stb.) Minden egyes szt egy-egy sorszm azonost, ezt
kapjuk vissza vgeredmnyl, valamint a ragozsnak a tpust. A szavak mellett
szerepel a sztrban mindegyiknek a sorszma, tovbb mg egyb informcik
is: a szfaja (ige, fnv, mellknv...), hogy milyen tpus ragozst
ignyelnek s hasonlk. A klnbz szfajok a sztrban abszolt vegyesen
helyezkednek el, a kezdbetk trvnynek engedve, de a sorszmozs alapjn
mr klnvlnak egymstl: az elejn a fnevek (azon bell is az llnyek,
trgyak stb. - ld. a korbbi fejezeteket), majd a mellknevek, az igk, az
igektk, s vgl a specilis, ragozatlan szavak jnnek (nvelk, ktszk
stb.). A parancsok igbl, trgybl, helyhatrozbl s eszkzhatrozbl
llnak, s lekezeli a program a "mellknv + fnv" tpus jelzs
szerkezeteket a gyjtnevek pontostsra (pl. szerepel benne tizenngy
klnbz szn csuklya: zld, srga... stb.). A legutbbi fnv
helyettestsre nvmsok is alkalmazhatk (kln van az lk s lettelenek
szmra is egy-egy: T s AZT), s egy mondaton bell tbb parancs is llhat
(ezeket lpsenknt hajtja vgre). A hinyos mondatokat is lekezeli a program:
ha egy fontos fnv vagy ige hinyzik, akkor kiegsztend jelleg krdseket
tesz fl arra vonatkozlag. A jtk teljes sztra kb. 1000 szt tartalmaz -
jllehet ezek tbbsge nem igazn van kihasznlva, a jelenlv fnevek s
trgyak tlnyom rsze inkbb csak ler, dszlet jelleg.
	Az egyes szfajok kezelse s megklnbztetse gy trtnik, hogyha
kirtelmeztk a soron kvetkez szt, akkor megvizsgljuk, hogy az ige-e vagy
igekt - s ha igen, akkor mg mieltt elraknnk a megfelel vltoz
rekeszbe, ott helyben megprbljuk az "ige + igekt" szkapcsolatot egy
sszetett igv alaktani. Ha mellknevet talltunk, gy azt azonnal eltesszk
a mellknv vltozjba. Innen csak akkor vesszk el legkzelebb, ha mr egy
fnv is rkezett, s akkor - az igektkhz hasonlan - megprbljuk ezt a
jelzs szkapcsolatot is talaktani. Ezek a lehetsges szprok valamennyien
egy-egy tblzatban fordulnak el, ahol egyrszt el vannak trolva az igk s
igektk (ill. mellknevek s fnevek) sszerendelt prjai, msrszt az
ezekhez tartoz j, kicserlend igk (ill. fnevek). A tblzat els rszvel
sorra sszehasonltjuk a keresett szavak sorszmait, s ha valahol egyezst
tallunk, akkor az ahhoz tartoz j szra cserljk ki a rgit. Hogy a
beazonostott fnv trgy, helyhatroz vagy eszkzhatroz lesz-e, azt annak
ragozsa dnti el, s ennek megfelelen a szksges vltozba kerl. A nvmsok
behelyettestsekor egy kisebbfajta trkkt kellett alkalmazni, mert ha csak
gy egyszeren kicserlnnk azt a legutbbi fnvre, akkor pldul az ADD ODA
A KULCSOT NEKI utasts esetn (ahol a NEKI a legutbbi llny neve helyett
llhat) az elsknt megtallt KULCS fnv troldna el legutbbiknt
(fellrva a korbbiakat), majd az is helyettestdnk be, s gy helytelenl
az ADD KULCSOT KULCSNAK parancsot kapnnk belle vgeredmnyl... Ennek
elkerlse rdekben a nvmsokat kt pldnyban kell trolni: kln van a
rgi, ahonnan a behelyettestskor mindig kiolvasunk, valamint az j, ahov
pedig mindig berjuk az ppen megtallt fnv sorszmt; a parancs vgre rve
azutn az jbl ttltjk az ott trolt rtket a rgibe, s gy a kvetkez
parancs mr azt veszi majd t. Ezenkvl radsul ktfle klnbz nvmst
vezettem be az l (, T, NEKI, NEKI, VELE... stb.) s az ltalnos
(nemcsak lettelen, hanem mindent, gy az lket is magba foglal) objektumok
szmra (AZT, ANNAK, VELE, AZZAL... stb. alakok). St, mg egy harmadik tpus
szemlyes nvms is ltezik, ez pedig magt a jtkost, teht az ltala
irnytott jelenlegi szereplt helyettesti (N, ENGEM, TE, TGED, MAGAD,
MAGAM... stb. alakok). Az eddigiekben elmondottak lehetv teszik szmunkra,
hogy a megfogalmazott utastsaink teljesen szabad szrendek legyenek -
elvgre is a vgrehajts nem kezddik meg mindaddig, mg a teljes parancsot
be nem olvasta a program, s valamennyi szfaj s mondatelem egymstl
fggetlen mdon kezeldik. (Leszmtva, hogy a mellknvnek a fnvnl elbb,
az igektnek pedig az ignl htrbb muszj llnia.)
	Ez a program tipikusan egy tbbszerepls kalandjtk: akr tizenngy
fhst is alakthatunk benne, amennyiben kedvnk tartja (az eredeti trtnet
fszereplit), s mindig kvethetjk a tbbiek szemvel is azt, hogy mit csinl
az egyik. Ezt radsul gy oldottam meg, hogy egy, kett vagy ngy, egymstl
teljesen fggetlen ablakra oszthatjuk a kpernyt, s valamennyi ilyen ablakban
egy-egy kln szereplt irnythatunk: ezeknek az ablakoknak a kezelse
teljesen prhuzamosan zajlik - akr mind a ngyben egyidejleg (!!!) is
trtnhet klnbz szvegeknek a folyamatos kiratsa. Mindekzben
szakadatlanul szerkeszthetjk a kperny legaljn fnntartott beviteli mezben
a kvetkez mondatunkat, s azt brmelyik ablak szmra el lehet kldeni.
Mindebbl kvetkezik, hogy a program termszetesen valsidej idztseket
alkalmaz. A msodpercenknt kb. 18.2-szer vgrehajtd IRQ megszaktsra
rszinkronizlva egy megszakts-alprogram kb. 1/3 msodpercenknt generl egy
rajelet az sszes szerepl szmra, s valamennyi szereplhz tartozik egy
szmll, ami azt tartja nyilvn, hny db. ilyen rajel mlva kvetkezik
lpsre. Az egyes szereplk szmlli 2-5 msodperces idkzkre vannak
belltva, szemlyenknt klnbzkppen (pl. a testes Bombur mozgsa lassbb,
mint a frge Bilb). Minden szerepl szmra fnntart a program egy-egy sajt
puffert, ahov a vgrehajtand utastsai kerlnek (ilyenkor mg szvegesen,
kirtelmezetlenl), s innen veszi el egyesvel ket. Ha az aktulis
szereplnknek egy friss mondatot begpelnk, mikzben az elzt mg nem
hajtotta vgre teljesen, akkor a vgrehajtsra vr lpsei elvesznek,
fellrja ket az j mondat. Mind a ngy ablakban lv szereplnknek kln
utastsokat adhatunk, s azutn htradlve leshetjk, ahogyan egymssal
versengve vgrehajtjk azokat... 
	Az ablakokba trtn kirats ugyancsak  - tbbszrsen - pufferelten
trtnik, rszben ez teszi lehetv, hogy egymssal prhuzamosan hasznlhassuk
ket. Az ablakok itt valban ablakot jelentenek, amelyeket a hozzjuk tartoz
- jval nagyobb mret - szvegpufferok terletn flfel-lefel egyarnt
mozgatni lehet (gy pl. visszanzhetjk a korbban kirt szvegeinket is).
Ngy ablak ltezik s ngy puffer, ezek kzl brmelyik puffer brmelyik
ablakban megjelenhet (egyszerre tbben is akr). A szvegpufferok tartalmt
klnfle mutatk tartjk karban: ltezik egy-egy a szveg kezdetnek s
vgnek meghatrozsra, arra, hogy hol helyezkedik el ppen az ablak a
szvegen, s hogy a szveg mely pontjtl kezddik annak mg rintetlen,
"szz" rsze, ami mg sohasem volt a kpernyn, s ezrt azt kln felszlts
nlkl is ki kell ratni. Egy-egy msik vltoz rzi a pufferban lv foglalt
s szabad terlet mrett. Egy zenet kirsa a pufferba gy trtnik, hogy
elszr is flszabadtjuk szmra a szksges helyet, majd onnantl bemsoljuk
a karaktereket, s ez hozzpl az als "szz" rszhez (hozzigaztjuk a
megfelel mutatkat). Ezutn kezd el ez soronknt innen kiaraszolni a
kpernyre - ha tbb volna, mint amennyi egyszerre kifr, akkor a jobb als
sarokban egy kis szamrfl jelenik meg, s ENTER-re folytatdik a kirs (de
bizonyos id elteltvel magtl is tovbblpteti a szveget). Az ablakok
megjelentsre a program grafikus kpernyt hasznl, a ma mr alapnak
szmt 640*480*256 szn SVGA zemmdban (ill. ha ez nem elrhet, akkor a
320*200*256 szn mdban). Az ablakokban lev szveg grgetse nem
karakterenknt, hanem kppontokknt trtnik! (llthatan 1,2,4... stb.
pixelenknt egy lpsben.) A program karakterkszlete 8*16 pontos
karakterekbl ll. Hogy mind a ngy ablakban prhuzamosan trtnhet a kirs,
az annak ksznhet, hogy egyszerre mindig csak egy pixelsornyit mozdtunk
rajta, majd vesszk a kvetkez ablakot s azon is, s gy tovbb. Ehhez mg
hozzjn a beviteli sornak a szerkesztse is, valamint a szereplk beidztett
lpseinek a vgrehajtsa - pontosan a 4.1.10. fejezetben elmondottaknak
megfelelen. Hogy ne dcgjn s normlis tempval haladjon mind a ngy
szveg, ehhez igen nagy sebessgre van szksg, ami ASSEMBLY nyelv
programozst s a 386-os kd 32-bites regiszterek hasznlatt vonja maga
utn. 386-osnl cskbb gpen (vagy ha nincsen hozz VGA) emiatt nem grafikus,
hanem csak sima szveges karakteres kpernyn jelenti meg a program. (Teht
elmletileg mg egy Hercules monitoros XT-n is mkdnie kell - br kiprblni
sajnos nem volt lehetsgem.) Egybknt is, az egsz program szntiszta
ASSEMBLY-ben kszlt...
	A helyisgek s a trkp trolsa pontosan a 4.1.5. fejezetben
ismertetett bejrsi tblzat formtumnak megfelelen trtnik. A jtkban
mintegy 120 helyisg tallhat. A trgyak trkpen val elhelyezse s
nyilvntartsa szintn a 4.1.7. s 4.1.8. fejezetekben lert statikus sorszm-
s rekurzv tblzatkezels elve alapjn zajlik. Ha egy helyisgben msodszor
jrunk, utna mr a teljes lers helyett csupn pr szavas nevt rja ki
neknk a program. A trgyak befogadkpessge is sly szerint korltozva van.
	Az egyes igkhez klnbz bels eljrsai vannak hozzrendelve a
programnak, ezeknek kezdcmei egy tblzatba foglalva vrjk, hogy az ige
sorszmval kiindexeljk s vgrehajtsuk ket. Mg az ige vgrehajtsa eltt
ellenrzi azonban, hogy a megadott fnevek helyesek-e s elrhetek, s ha
minden stimmel, akkor ugrik tovbb a megfelel eljrsra. Itt mg tovbbi
ellenrzseket vgez, s ha sikerlt vgrehajtania, akkor a tjkoztat jelleg
zeneteket egy specilis kir eljrson keresztl vezeti t az ablakok
puffereibe - ez a szubrutin mindig vgigteszteli mind a ngy ablakot s azok
"tulajdonosait", s amelyik ezek kzl ugyanazon a helysznen tartzkodik,
annak szmra rja ki a megfelelen talaktott zeneteket. (Pl. "Felveszed a
lmpt." helyett "Bilb felveszi a lmpt." stb.) Ha olyan fnv szerepel
benne, amelyik tbb helysznen is jelen van egyszerre (pl. egy ajt kt szobt
kt ssze), akkor a vele trtnt esemnyrl valamennyi helyen tudst - de
gy, hogy a mondatban szerepl tovbbi fnevek kzl, ha valamelyik nem
elrhet, akkor helyette a "valami" ill. "valaki" szt hasznlja a program
(attl fggen, hogy llnyrl van-e sz). Pl. ha kopogtatunk egy ajtn,
akkor annak tloldaln a "Valaki kopog az ajtn." zenetet kapjuk. Akkor is
ezek a hatrozatlan nvmsok kerlnek el, ha a kirs egy stt helyen
trtnik; s minden ilyen esetben a fnvvel egytt az ige ragozsa is
mdosul ("felveszed" helyett "felveszel" - trgyas helyett alanyi ragozst kap
- stb.). Ha a hivatkozs az ablakban irnytott szereplre vonatkozik, az 
neve helyett a "te" nvms megfelelen ragozott alakjai ("tged", "neked"...
stb.) jelennek meg; s hasonlkppen bnik a "maga" (ha a cselekv egyezik a
trggyal) ill. a "magad" (ha mindhrom fnv - teht a cselekv, a szemll s
a trgy - is ugyanaz) szemlyes nvmsokkal is. Kln rdekessge a jtknak,
hogy az eredeti regnyben szerepl varzslatos Gyr az t viselnek
lthatatlansgot ad - ez a szerepl teht egyszeren brmit megtehet a
jtkban anlkl, hogy a tbbieket errl rtestenie kne. (Kvetkezskppen
bizonyos akadlyokon is tmehet, pl. ha valahol egy rszem senkit nem enged
t, ott neki akkor is szabad bejrsa kell legyen, mert nem lthatjk, amikor
thalad; vagy elveheti brkitl a nla lev trgyakat stb.)
	A vgrehajtst kveten a vezrl fprogram minduntalan visszatr a
beviteli-megjelentsi vgtelen fciklusba, ahonnan csak az egyes szereplknek
adott kvetkez rajelek mozdtjk majd ki a programot. (Kicsit emlkeztet ez
a mkds a Delphi esemnykezelire: mindig a kvnt esemny bekvetkezte
indtja el a hozz tartoz lekezel eljrst.)


4.2.2. Hasznlati tmutat

	Mihelyt a programot elindtottuk, mindjrt a grafikus kpernyn
elhelyezked ngy darab ablakkal nznk farkasszemet. Az egyes ablakokban a
hozzjuk tartoz puffer szvege foglal helyet (hangulatos gtbets
karakterkszlettel), a krlttk elhelyezked egyb informcikbl azonban
egyszerre mindig csak a kivlasztott ablakhoz tartozt lthatjuk. Ezek: fll
az llapotsor, alul a beviteli mez, jobboldalt pedig az elmaradhatatlan
szvegkocka. Ez utbbi a szokvnyos stlusban mutatja az ablaknak a puffer
szvegben val elhelyezkedst, s mindig pontosan vele egytt mozog. A
beviteli mezben szerkeszthetjk brmikor, folyamatosan a kvetkezleg
kiadsra sznt mondatunk szvegt. Ezt a billentyzeten val gpelssel
tehetjk meg; a programban hasznlt billentyzetkioszts alapllapotban
99%-ban a magyar kezetes billentyzet pontos kiosztsnak felel meg (kezetes
betk az rsjeleken, Y s Z felcserlve stb.), m amennyiben ez neknk nem
tetszene, gy a CONTROL + CAPS LOCK billentykombincival tetszlegesen
tkapcsolhatunk a hagyomnyos angol billentyzet kiosztsra is. Ilyenkor az
kezetes betket az ALT vltbillentyvel egytt nyomva rhetjk el (pl. ALT +
A = ... stb.), ill. az , , ,  karaktereket a CONTROL + O, I, U, Y
kombincikkal; ezek nagybets megfeleli a kisbetsek "alatt" lv gombokon
vannak hasonlkppen elhelyezve (pl. ALT + Z = nagy , CONTROL + L = nagy 
stb.); magyar billentyzet esetn mindezek a kombincik teljessggel
hatstalanok. Magyar billentyzeten a nagybetket egyszeren SHIFT-elve
csalogathatjuk el; amellett a CAPS LOCK is hasznlhat a maga szoksos
funkcijban, ami ezttal mr az kezetes billentykre is rvnyes lesz - m
minderre egyszeren nincsen szksg, tudniillik a program egyltalban nem
tesz klnbsget a kis- s nagybetvel megfogalmazott utastsok kztt. Az
angol billentykiosztsrl a magyarra ugyancsak a CONTROL + CAPS LOCK
segtsgvel trhetnk vissza. A NUM LOCK billenty is megrizte elfogadott
szerept.
	A szveg szerkesztse kzben a kurzorvezrl JOBBRA/BALRA
billentykkel tetszlegesen elre-htra haladhatunk a mondatunk karakterei
kztt, a CONTROL + JOBBRA/BALRA rvn pedig ugyanezt nem betnknt, hanem
teljes szavanknt ugrlva tehetjk meg. Hogy a szveg belsejben beszrunk-e
vagy fellrunk, azt az INSERT kapcsol megfelel llapota dnti el. Max. 256
karakternyi hosszsg szveget rhatunk be egy szuszra - ennyi viszont nem
fr ki a beviteli sorban, ezrt ilyenkor a program megfelelen elre-htra
grgeti a szveget, s csak a szksges rszt lthatjuk belle. A HOME s END
gombokkal a teljes szveg elejre/vgre ugrunk. A DELETE az ismers mdon
letrli a kurzor pozcijn ll karaktert, a BACKSPACE pedig egyet balra
lpve trl; kellemes jdonsg viszont, hogy a CONTROL + BACKSPACE
kombincival itt is kiterjeszthetjk a trls szerept egy egsz szra nzve
(amiben a kurzor ll vagy balra tle tallhat, plusz a hozz fztt
rsjeleket is). A CONTROL + INSERT a kurzortl balra, a CONTROL + DELETE
pedig a jobbra fekv teljes szvegmennyisget tnteti el vgrvnyesen. Az
ENTER-rel tudjuk elkldeni az elkszlt mondatot, a CONTROL + ENTER pedig a
mostani s a legutbb elkldtt mondat szvegt felcserli egymssal - ennek
ismtelt megnyomsra a szvegek jfent visszacserldnek. Ezltal nemcsak az
utols mondat ismtlsre nylik lehetsg, de vltogathatjuk s prhuzamosan
szerkeszthetjk mind a kt mondatot, majd a vgn hatrozhatunk, hogy
melyikket dobjuk el.
	St, nemcsak ezt a kettt tudjuk ilyen szimultn mdon alaktani,
hanem egyenesen mind a ngy ablakhoz kln-kln inputsorok vannak rendelve!
Ezek kzl termszetesen mindig csak a jelenlegi ablakhoz tartozt lthatjuk
itt alant. Az aktulis ablak a sznben klnbzik az sszes tbbitl, s a
TAB ill. SHIFT + TAB billentykkel lapozgathatunk elre-htra az egyes ablakok
kztt; az F1...F4 ltal pedig kzvetlenl valamelyik ablak kijelzsre
vlthatunk. Az ablakok cserjvel egytt az llapotsor, beviteli sor s a
szvegkocka is rendesen a kivlasztottnak megfelelen ugrl. Emltettem, hogy
a ngy ablak mellett ngy puffer is ltezik: a pufferokhoz tartoznak a
szereplk, s az ablakokban jelennek meg a pufferok... Azt, hogy a jelenlegi
ablakban melyik puffert hajtjuk megjelenteni, a CONTROL + TAB ill. SHIFT +
CONTROL + TAB rvn lapozhatjuk, vagy kzvetlenl az F5...F8 billentykkel
kapcsolhatjuk be; ezltal tetszlegesen bellthatjuk akr mind a ngy ablakba
is ugyanazt a puffert (s akkor mindentt ugyanazt a szveget ltjuk...), de
jobb inkbb nem piszklni, mert knnyen sszekuszlhatjuk vele a dolgokat. Az
ESCAPE hasznlatval ugyanakkor a pillanatnyi ablakot kinagythatjuk a teljes
kperny nagysgra (vagy jabb megnyomsval vissza); a CONTROL + ESCAPE s
SHIFT + CONTROL + ESCAPE segtsgvel pedig a kperny ngyfle felosztst
vltogathatjuk: azt, hogy egyetlen ablak foglalja el az egsz kpernyt, kett
legyen vzszintesen, kett fgglegesen, vagy egyszerre tekintsk t mind a
ngyet. Akrmekkora mret ablakokkal "dolgozzunk" is, a szveg mindig annak
mreteihez igaztva, megfelel hosszsg sorokra szttrdelve  jelenik meg
majd benne, gy, hogy soha sz egy sor vgn meg ne trjn (ha nem fr ki,
akkor a kvetkez sor elejn folytatdik); s mindegy, hogy hny ablakot
ltunk t egyszerre, akkor is mind a ngyben zavartalanul folyhat a kirs -
TAB s trsai is ugyangy mkdnek mind ekkor. (Legfeljebb elsre egy kiss
furcsa lesz a ltvny.) Ablakok vltogatsakor az imntiekben emltett CONTROL
+ ENTER sikerrel alkalmazhat az inputsorban tallhat szvegnek egyik
ablakbl a msikba trtn tvitelre is: elszr kicserljk vele a mondatot,
s gy a jelenlegi a "tartalkba" toldik, majd a msik ablakba tlpve jbl
megnyomjuk - mire a httrbl elkerl az eltrolt mondatunk.
	Az ablakokat nem vletlenl hvjk ablaknak, hiszen a puffernak mindig
csak egy rszt ltjuk bennk. Ezt az ablakot a pufferon bell szabadon fl-le
tologathatjuk a kurzor FL/LE vezrlbillentyivel, illetve ugrlhatunk is
benne a PAGE UP/PAGE DOWN segtsgvel; a CONTROL + HOME s CONTROL + END a
puffer elejre s vgre lpteti az llst. A CONTROL + PAGE UP/PAGE DOWN
ugyancsak egy-egy oldalnak megfelel mennyisget halad, de nem ugrik, hanem
folyamatosan grgeti el azt. A CONTROL + FL/LE pedig folyamatosan grgeti az
ablakot a szveg elejig/vgig. (Prbljuk ki: ezekkel akr egyidejleg
mozgathatjuk mind a ngy ablakot is klnbz irnyokba! Olyan, mintha a
pternoszter flki haladnnak...) Igazi klnlegessge a programnak, hogy a
szvegek grgetse nem karakteresen, hanem finoman, kppontokra bontva
trtnik! Ennek a sebessgt (pontosabban a finomsgt) llthatjuk is: 1, 2,
4, 8, 16, 32, 64 vagy 128 pixeles lpskzkkel is vonulhat a ltvny. Az
F11-gyel lehet gyorstani (durvtani), az F12-vel pedig lasstani
(finomtani). Minthogy betink 16 kppont magasak, ez 1 kppontos mozgs
esetn azt jelenti, hogy 16 fzisban toldik ki a kpre egyetlen
karaktersornak megfelel mennyisg (ez a legfinomabb, egyenletes mozgs - de
az esetek tbbsgben a leglassbb is egyben); 16 kppontosnl ppen
karakterenknt halad; mg a 128 pixeles esetben mr egyenesen 8
karaktersoronknt ugrl (ezt csak akkor van rtelme hasznlni, ha valami
klnsen lass gpnk van, ami egyszeren nem brja szuflval a
grgetst...). A megjelents a kpernyfrissts
elektronsugr-visszafutshoz van szinkronizlva (ami a legtbb monitornl
50-70 Hz), gy ennek s a processzor gyorsasgnak megfelelen llthatjuk be
magunknak a legkellemesebb verzit. Az tmenetileg trtn lasstsra van mg
egy lehetsg, az, hogyha PAUSE llapotba tesszk a gpnket (mi mssal, mint
a PAUSE billentyvel): ennek megltt a szvegkocka invertld benyomdsa
jelzi (kikapcsolni ismtelt megnyomssal lehetsges): ilyenkor valamennyi
mozgs kb. az eredeti egytizenhatod-rszre lassul, s pldul a tl gyorsan
tvoz szveget kivlan el lehet olvasni kzben.
	A kirs sorn igen lnyeges szerepe van mg a SCROLL LOCK kapcsolnak
is: ameddig ez bekapcsolt llapotban van, addig a gp automatikusan trdeli
neknk a hossz szveget, vagyis ha nem fr ki egyben a kpernyre, akkor egy
oldal utn megtorpan, s egy ENTER lenyomsra vrakozik a tovbblptetse
rdekben; addig is az ablak jobb als sarkban megjelen kis behajtott
szamrfl jelzi ezt (ill. karakteres kpernynl a <Tovbb> felirat). Mg
ellenben kikapcsolt SCROLL LOCK mellett semmi ilyesmi nem trtnik: a szvegek
meglls nlkl vgtznak keresztl a kpernyn - ilyenkor jn jl az imnti
PAUSE funkci. Ha az ablakunk ilyen vrakoz llapotban van, akkor addig nem
tudunk j parancsot elkldeni, amg elzetesen tovbb nem lptettk a szveget
(az ENTER ilyenkor foglalt erre az j szerepkrre). De ms mdokon is
lptethetjk tovbb: a KURZOR LE vagy a PAGE DOWN gombokkal - esetleg egy
CONTROL + END-del azonnal a legaljra pottyanunk. (Akkor is megsznik a
vrakozs, hogyha flfel haladunk, m ekkor mr neknk magunknak kell
legrgetnnk majd.) Ha sokig nem nylunk hozz, az ablak idnknt nmagtl
is araszolgat egy-egy sort (kb. tizent msodpercenknt egyet). Ha viszont nem
kvnunk egyesvel vacakolni mind a ngy ablakkal, akkor vagy kapcsoljuk ki a
SCROLL LOCK-ot, vagy hasznljuk a BREAK (= CONTROL + PAUSE) billentyt, amely
az sszes ablakot egyszerre alapllapotba hozza (leugrik az aljra, s
mindenfajta ksleltetst megszntet).
	Kt klnleges szerep billenty maradt ki csupn a felsorolsbl: az
egyik a PRINT SCREEN (= CONTROL + SYS REQ), amelyik egy SCRNxxxx.TXT file
kpben elmenti a jelenlegi ablak puffernek teljes szvegt a programknyvtr
MENTS alknyvtrba (ahol xxxx egy 0000-tl 9999-ig terjed sorszm, gyhogy
rengeteg ilyen lehet); a msik pedig a CONTROL + ALT + DELETE - nem kell
megijedni, nem fogja RESET-elni a gpet, mindssze a jtkbl val azonnali
kilpsre szolgl (visszatrs DOS-ba). A program emellett mg egy beptett,
nmkd kpernyvd funkcival is rendelkezik: ha t percig nem nylunk a
billentyzethez, akkor lekapcsolja a kpernyt, amelyen egy - a Norton
Commander-hez hasonl - csillagmezt ltunk a kvetkez lenyomsig
tndklni.
	Most mr teht be tudjuk gpelni a programnak a kiadni hajtott
utastsainkat - igen m, de hogyan is fogalmazzuk meg ket? Felszlt mdban
megfogalmazott mondatokat vr el tlnk a jtk, gymint MENJ SZAKRA vagy
GYJTSD MEG A LMPT A GYUFVAL stb. A parancsok szrendje majdnem teljesen
szabad, teht az elz pldt akr berhatjuk a kvetkezkppen is: A GYUFVAL
A LMPT GYJTSD MEG... Vagy brmilyen ms sorrendben - egyetlen megkts,
hogy az igektnek az ignl htrbb ktelez llnia valahol, s a mellknvnek
pedig a fnvnl elbb (nem mondhatjuk pl. azt, hogy MEG GYJTSD vagy CSUKLYT
ZLD, de ezeknek amgy se lenne rtelme, ezrt nem is jutna eszbe senkinek
sem lerni hasonlt). Mivel ez nagyrszt az elz fejezetben mr elhangzott,
itt csak rviden sszefoglalnm a tovbbiakat. Teht tbb hasonl trgy
megklnbztetsre mellknvi jelzket alkalmazhatunk (FOGD MEG A NAGY
KULCSOT vagy DOBD EL A CIFRA KULCSOT stb.), a legutbbi fnevek pedig
nvmsokkal helyettesthetk (AZT, T s MAGAD s ezek msfle ragozs
alakjai). Egyetlen mondaton bell akrhny klnbz parancs is szerepelhet
(ponttal, vesszvel vagy S-sel elvlasztva), s termszetesen az sszes
felsorolt mondatelemet kombinlhatjuk is egymssal. Pl. gy: VEDD FEL A NAGY
KULCSOT S NYISD KI VELE A KAJTT. Ha valami hinyzik a mondatbl, akkor a
gp clzatosan rkrdez: VEDD LE hatsra pl. gy, hogy "Mit akarsz levenni?"
- ezekre a krdsekre elegend mr csak a hinyz mondatelemeket megadni (pl.
KABTOT). De valami teljesen j mondatot is berhatunk akr. Termszetesen,
ha nem rt meg egy szt, azt is jelzi a program. A mozgsi parancsok s nhny
ms sokszor hasznlt ige is a kezdbetivel rvidthet. (Pl. SZAK, mint ,
VIZSGLD, mint V, VEDD FEL, mint VF, RAKD LE, mint R, LELTR vagy LISTA, mint
LI vagy rvidebben I... stb.) Az egyes - ltalunk is irnythat - szereplk
kzl gy vlaszthatunk ki valakit, hogy egyszeren, ige s ragozs nlkl
lerjuk a nevt. A vlaszthat szereplk listja: Bilb, Thorin, Dwalin,
Balin, Fli, Kli, Dori, Nori, Ori, in, Glin, Bifur, Bofur s Bombur. Hogyha
teszemazt valamelyik ablakban lerjuk, hogy NORI, akkor attl kezdve abban az
ablakban (illetleg az ahhoz az ablakhoz tartoz pufferban) t fogjuk
irnytani. De rajtuk kvl is mg tovbbi illetket bevonhatunk a jtk
menetbe, azltal, hogy klnfle krseket vagy parancsokat intznk hozzjuk
(pl.: MONDD MEG GANDALFNAK, HOGY ADJA NEKEM A TRKPET), s gy kzvetve
manipullhatjuk ket is. Ezeknl a parancsoknl lnyeges, hogy a kr utasts
(MONDD, KRD, UTASTSD) s a tnyleges tennival kztt valamilyen
elvlasztjelet hagyjunk: pldul egy vesszt, egy idzjelet vagy egy HOGY
szcskt - mint az az idzett pldban is lthat. Mi tbb, akr mg tbb
ilyen parancsot is egymsba gyazhatunk, mondjuk valahogy gy: MONDD MEG
INNAK, HOGY SZLJON GLINNAK, HOGY KRJE MEG BIFURT, HOGY NYISSA KI AZ
AJTT... Az emberkk majd szpen egymsnak adogatjk tovbb a mondatot, mg
vgl az le nem bomlik a vgs mondanivalig, ami mr kzvetlenl is
vgrehajthat.



5. IRODALOM


Abonyi, Zsolt. (1996). PC hardver kziknyv. ComputerBooks, Budapest.

Agrdi, Gbor. (1995). IBM Gyakorlati Assembly haladknak. LSI Oktatkzpont
s A Mikroelektronika Alkalmazsnak Kultrjrt Alaptvny.

Chomsky, Noam. (1995). Mondattani szerkezetek - Nyelv s elme.
Osiris-Szzadvg, Budapest.

DaCosta, F. (1986). A kalandprogram rsnak rejtelmei. Mszaki Knyvkiad,
Budapest.

Gidfalvi, Zoltn Dr. (1995). Programozs MASM Assembly nyelven. Megyetemi
Kiad.

Jankovics, Marcell. (1996). Ahol a madr se jr. Pontifex Kiad.

Kiss, Dnes. (1993). Snyelv - nyelvS? Antolgia Kiad, Lakitelek.

Kiss, Lszl s Schmidt, Endre. (1988). 1001/2 jtk. LSI Alkalmazstechnikai
Tancsad Szolglat, Budapest.

Lszl, Jzsef. (1995). A VGA-krtya programozsa Pascal s Assembly nyelven.
ComputerBooks, Budapest.

Tolkien, J. R. R. (1992). A bab. Cicer.



