Povezave:
 Originalna igra 'Hounted House'
 Knjiga v kateri je igra prvič objavljena 'Write Your Own Adventure Programs'
Opisi:
Računari, #3, Decembar 1984
Ukleti dvorac i druge bajke - Škola avanturističkih igara
  Ako kupite  neku avanturu  koja košta desetak funti i  pokušate da je listate,
čeka  vas iznenađenje:   program je   u celini   pisan na   bejziku! Zar  strane
softverske firme  nemaju  dovoljno  poznavalaca  mašinskog  jezika?  Naravno  da
imaju  ali  se  pokazalo da  je  pisanje  igre avanture   na mašincu  nepotrebno
razmetanje; za ove  igre nije  neophodno  prebrzo  izvršavanje ali   je potrebno
da  računar   razmatra  mnogo  različitih   situacija  i   analizira  raznorazne
reakcije igrača  što  se  na nekom  višem programskom  jeziku  (u našem  slučaju
bejziku) obavlja  daleko lakše nego  na jezicima  nižeg nivoa.  Avanture, dakle,
mogu da  pišu i  oni koji   se užasavaju "pikovanja" i "poukovanja" po  memoriji
njihovog kompjutera.
  Pisanje igara avantura je daleko bolja škola za profesionalnog programera nego
što bi se  reklo na prvi  pogled. Svaki autor  nekog poslovnog paketa  za obradu
podataka ili, pogotovu,  kompajlera nekog programskog  jezika treba da  predvidi
sve moguće ulaze (kako tačne tako i  pogrešne) i pobrine se da računar u  takvim
slučajevima izbegne krah  koji bi doveo  do gubitka već  unetih podataka. Ovakav
zanat može  dobro da  se "ispeče"  pisanjem avantura  u kojima  se neće javljati
'Type mismatch', 'Nonsence  in BASIC' ili  neka slična poruka  kada igrač otkuca
POJEDI HELIKOPTER.
  U toku  ove Škole  zajednički  ćemo napisati  jednu  umereno jednostavnu  igru 
- avanturu koja  se zove 'Zli  dvorac'. Ukoliko do  sada niste imali  kontakt sa
igrama  ovoga  tipa  (što je  krajnje neverovatno)  ili niste  uspeli da  nađete
zajednički jezik sa kompjuterom koji govori jedino Engleski, nije loša ideja  da
najpre otkucate program  i provedete izvesno  vreme otkrivajući tajne  ove igre.
Dobrim poznavaocima  bejzika bismo  predložili da  ubede (kako  li se  to radi?)
nekoga drugoga da  im otkuca ovaj  program jer će  u protivnom nehotice  otkriti
neke od tajni igre koja će izgubiti na draži.
  "Zli dvorac",pisan na računaru sa standardnim Microsoftovim bejzikom,ima oko 8
kilobajta i zahteva  još otprilike toliko  za nizove i  promenljive koje koristi
(vlasnici Spectruma 48 K će morati da modifikuju program prema sugestijama  koje
dajemo na  kraju teksta)  dok druge  komercijale avanture  umeju da  zauzmu i po
pedesetak kilobajta.  Ipak, najgori  način da  pišete program  ovoga tipa  je da
sednete, uključite kompjuter i pomislite: "Teško meni, treba da napišem šesnaest
kilobajta programa". Savetujemo vam da  se za početak ne približavate  računaru;
uzmite olovku i papir i pokušajte da zamislite osnovni scenario vaše igre.
Okvirni plan "Ukletog dvorca":
     
Pravila igre
  Vreme u kome se smeštaju igre avanture je  najčešće daleka prošosti ili daleka
budućnost. U poslednje vreme se  javljaju i avanture iz svakodnevnog  života kao
što je Kontrabant. Kontrabant je  prva ozbiljna avantura pripremljena kod  nas i
deo je kasete sa  programima za Spectruma koju  izdaje Radio Študent. Tema  je u
pravom  smislu  savremena:  kako  uvesti  računar  u  Jugoslaviju.  Izgovor   za
zadržavanje na dalekoj  prošlosti ili budućnosti  su razne vrste  magije koje se
vrlo dobro slažu sa igrama ovoga  tipa. Priznaćete da je prilično teško  tražiti
od nekoga  da ozbiljno  shavti igru  u kojoj  se ispred  "Beograđanke" pronalazi
čarobni štap ili zarobljena princeza koju čuva vukodlak!
  Pošto smo odredili istorijski trenutak u koji stavljamo našu avanturu,treba da
odlučimo o ciljevima koje igrač treba  da postigne. Obično se od njega  traži da
pobegne sa nekoga mesta ili da se vrati negde ili da sakupi neke vredne predmete
(ukoliko  želite  da  igrač oslobodi  nekoga (ili,  da budemo  precizniji, neku)
možete i njega (nju) da dodate spisku vrednih predmeta).
  Prema  zadacima  koje  igrač treba  da obavi  pripremamo  okvirnu  mapu  mesta
događaja, u našem  slučaju 'Zlog  dvorca'. U  ovom trenutku  mapa je  daleko  od
detaljne; potrebno  nam je  samo da  uočimo osnovni  raspored prostorija koje su
bitne za igru a  docnije ćemo  dodati i  mnogo  "slepih hodnika". Okvirna   mapa
'Zlog dvorca'  i okoline je data na prvoj slici.
  Pošto ste  nacrtali okvirnu  mapu,  treba da  izaberete  informacije koje ćete
saopštiti igraču na početku igre. Tih  nekoliko rečenica treba da budu takve  da
probude u njemu interes za avanturu, i da mu eventualno, na zavijen način,  kažu
nešto o zadacima koje  treba obaviti. Evo onoga  što treba da zna  čovek koji se
usudi da priđe Zlom dvorcu.
  'Zli dvorac se nalazi  blizu samoga  kraja sveta,  okružen močvarom koja je na
ivici  ogromne i  strašne provalije.  Njegovi krivi  i padu  skloni tornjevi  se
jezivo pružaju ka uvek tamnom i oblačnom nebeskom svodu. Ni jedan zid, ni  jedan
ugao nije prav, ni jedan prozor nije  čitav ali ni kroz jedan ne dopire  nikakva
svetlost. Ni malo čudno, niko ne živi dvorcu ili, da budemo precizniji, ni jedan
čovek ne živi u njemu...
  Priča se da je,u nekoj dalekoj prošlosti, najbogatiji čovek na svetu,bežeći od
svojih  neprijatelja,   proveo  poslednje   dane  u   dvorcu  plaćajući   zlatom
gostoprimstvo  zlih sila  koje su  mu prodale  predmete neophodne  za  opstanak.
Začudo, niko nikada nije video njegovo telo...'
Crtanje mape
  Sledeći korak je  crtanje precizne  mape dvorca.  Najlakše ćemo  je dobiti ako
najpre nacrtamo  matricu sa  onoliko polja  koliko želimo  da imamo  lokacija (u
našem slučaju se neke lokacije odnose  i na okolinu dvorca) a zativ  svako polje
označimo brojem počevši od nule, baš kao na slici 2.
Matrica za ucrtavanje prolaza:
     
  Na matrici, koristeći običnu olovku, ucrtavamo zidove i vrata. Zatim, u skladu
sa njima, obeležavamo svaku prostoriju imenom koje odgovara našem scenariju.  Mi
smo  izabrali  imena kao  što  je "ugao  sveta",  "soba puna  paučine",  "duboki
podrum..." ali i sasvim ovozemaljske nazive kao što je "kuhinja",  "pretsoblje",
"biblioteka"... Osim imena prostorija, treba  da zamislite načine na koje  se iz
jedne sobe stiže  u drugu tj.  da rasporedite vrata.  Neka vrata mogu  da budu i
jednosmerna ali za  to morate da  smislite jak razlog.  U našoj avanturi  se, na
primer,  ulazna vrata  zamka zatvaraju  kada prođete  kroz njih  čime "personal
dvorca" sprečava bekstvo kukavica koje bi zlim silama uskratile zadovoljstvo  da
ih same unište.  Moguće prevce kretanja  je najlakše označavati  stranama sveta,
pri čemu je sever na gornjem  kraju mape. Obično se koriste engleske  skraćenice
N, S, E,  W za sever,  jug, istok i  zapad respektivno. U  Zlom dvorcu je moguće
koristiti kako engleske skraćenice tako i naše rečenice "idi na sever", "idi  na
zapad" i slično.
  Ubacujući stepenice,podrumska vrata i tavanske prozore kojima se stiže iz sobe
u sobu stvarate deo utiska trodimenzionalnosti. Kada završite ovu Školu  možete,
naročito ako posedujete računar sa  RAM-om solidnih "dimenzija", da pokušate  da
napišete pravu trodimenzionalnu avanturu dodajući, na primer, podrum u pokrovlje
našem dvorcu.  Treba da  imate u  vidu da  se na  ovim dodatnim nivoima obavezno
nalazi veliki broj soba, približno jednak broju soba u prizemlju. Vredne objekte
ćete, naravno, sakriti u najudaljenije budžake poslednjeg sprata.
  Specijalne efekte možete da dobijete dajući  isto ime različitim lokacijama. U
avanturi "Jerusalim" koja je  pisana za TRS 80  četiri objekta nose naziv  ULICA
JERUSALIMA. Da biste se "ispetljali" iz ove ulice morate najpre da znate u  kome
se od njenih komponanti nalazite  a zatim da primenite neki  algoritam kretanja.
Obzirom da smo se truduli da 'Zli dvorac' ne bude preteška avantura, nismo u nju
ubacili zagonetke ovoga tipa.
  Sledeća tačka "dnevnog reda"  su blaga koja treba  smestiti u  prostorije. Ova
blaga mogu da budu prave  dragocenosti poput zlata i dijamanata  ili tajanstveni
planovi  i dokumenti  ili, jednostavno,  tragovi  koji  pomažu da  se reši  neka
zagonetka.  Osim objekata  koji mogu  da se  ponesu, treba  uključiti i  ormane,
stolove, vrata  i sličnu  "nepokretnu imovinu".  Neki od  ovih predmeta  mogu da
imaju fioke, pregrade i slične delove koje igrač najpre treba da ispita da bi ih
iskoristio dok drugi mogu  da budu samo lažni  tragovi. U našoj avanturi  se, na
primer, u ormanu nalazi kaput na kome treba pronaći džep u kome je ključ.
  Pre nego što konačno rasporedite blaga, treba da zamislite i prepreke koje  će
ih čuvati:  avantura u   kojoj bi  igrač  jednostavno  obišao sve   prostorije i
pokupio blaga  bi bila  previše jednostavna.  Neka blaga  treba da  budu  čuvana
posebno pažljivo i  da zahtevaju posedovanje  određenog broja predmeta  da bi se
osvojila. U programu 'Sphinx adventure' koji  je pisan  za BBC B jedno  od blaga
čuva  slon. Da bi se slon oterao treba dovesti miša a miša, opet, treba uhvatiti
pomoću sira i mišolovke koje treba najpre pronaći.
  U gornjem primeru sir  i mišolovka  nisu nikakvi  posebno vredni objekti; njih
igrač treba da pronađe da bi rešio neku zagonetu a zatim može da ih baci. Možete
da se odlučite da dodate neke naoko vredne i korisne ali inače sasvim nepotrebne
predmete iako ovako nešto nije u skladu sa "fer plejom".
  Na slici 3.  je prikazana  mapa 'Zlog  dvorca' i  okoline na  kojoj su ucrtani
zidovi, pravci kretanja i blaga koja  igrač treba da pronađe. Blaga su,  kao što
vidimo, obeležena brojevima 1-8 (nešto docnije ćemo videti zašto ni jedno  blago
nije označeno brojem 0) i neka od  njih su čuvana na odgovarajući način koji  je
takođe ubeležen.
Mapa "Ukletog dvorca" sa upisanim dragocenostima:
     
Korisni objekti i zagonetke
  Neka od blaga mogu, osim same  vrednosti, imati i  neku sekundarnu funkciju. U
našoj  avanturi  svećnjak  je,  najpre, potreban  da  bi  se  upalila sveća  ali
predstavlja  i "blago"  bez koga  igra ne  može da  se završi.  Ostale  koristne
objekte treba da upišemo na  spisak dragocenosti numerišući ih brojevima  9, 10,
11...  Igru  ćemo  otežati  ukoliko ne  uvodimo  predmete  koji  imaju očiglednu
funkiju: umesto ključa  možemo, na primer,  negde da sakrijemo  zlatnu ukosnicu.
Važno je, međutim,  da je upotreba  predmeta opšte poznata,  makar i iz  crtanih
filmova: u gornjem primeru nije bilo važno da li se slonovi stvarno boje  miševa
ili ne.
  Treba takođe smestiti objekte  na logična  i pristupačna  mesta. Ponekad se, u
nepažnji, dogodi  da smestimo  ključ u  sobu koju  čuva aždaja  koju treba ubiti
mačem koji je sakriven  u kovčeg koji ne  možemo da otvorimo bez  ključa. Ovakve
greške ćemo, doduše, otkriti u fazi testiranja programa ali će tada biti  daleko
teže ispraviti ih.
  Sledi pravljenje spiska zagonetki koje igrač treba da reši. Obzirom da je 'Zli
dvorac' jednostavna avantura, pripremili smo za nju samo devet zagonetki koje su
ispisane na slici 4. Na kraju  teksta ćemo napisati nekoliko reči o  eventualnim
proširenjima programa koja se uglavnom svode na dodavanje novih problema.
slika 4: Problemi i rešenja
    ========================================================================
    =     Problem                Rešenje                 Potrebni objekti  =  
    ========================================================================
    =                                                                      =
    =  Previše mracno          Upali sveću             Sveća, svećnjak,    =
    =                                                  šibice              =
    =                                                                      =
    =  Napadaju šišmiši        Pošpricaj šišmiše       Superbum sprej      =
    =                          superbumom                                  =
    =                                                                      =
    =  Tajna soba              Probij lažni zid        Sekira              =
    =                                                                      =
    =  Zaključna vrata         Otključaj ih            Ključ               =
    =                                                                      =
    =  Parališuci duh          Usisaj ga               Usisivač, baterije  =
    =                                                                      =
    =  Magicna barijera        Kaži magičnu reč        Magicna cedulja     =
    =                                                                      =
    =  Močvara                 Uzmi čamac              Čamac               =
    =                          (posle jedne upotrebe                       =
    =                          čamac se zaglibi)                           =
    =                                                                      =
    =  Zatrpani prozor         Iskopaj rupu            Lopata              =
    =                                                                      =
    =  Mrtvački sanduk         Otvori ga               ništa               =
    =                                                                      =
    ========================================================================
Spisak imenica i glagola
  Pošto ste pripremili  kompletan scenario,  pristupate formiranju kompjuterovog
rečnika. Obično korisnik komunicira sa računarom pomoću kratkih rečenica koje se
sastoje  od  glagola  i  imenice.  Ukoliko  pišete  avanturu  kod  koje  će   se
komunikacija odvijati na  srpskohrvatskom jeziku, u  nekim slučajevima je  nužno
koristiti povratnu zamenicu 'se' a neophodan je i poneki prilog. Očekujte,  osim
toga, i ogromne probleme  sa padežima. Zato je  zgodno primeniti mali trik  koji
korisnici  avantura retko  primete: reči  mogu da  se prepoznaju  samo po  prvih
nekoliko  slova,  najčešće  tri.  Obzirom  da  je  'Zli  dvorac'  školski primer
avanture, nismo želeli da se služimo trikovima pa smo se potrudili da  izaberemo
reči koje će se uklopiti u naše rečenice.
  Spisak glagola koje kompjuter poznaje uz imenice na  koje se glagoli odnose je
dat na slici 5. Glagole smo, kao što se vidi, obeležili brojevima 1, 2, ...  dok
je nula rezervisana za situaciju u kojoj traženi glagol nije pronađen na  listi.
Uvrstili smo i naredbe UPOMOC  i INVENTAR koje, respektivno, daju  igraču spisak
naredbi  koje  računar poznaje  kao  i spisak  predmeta  koje trenutno  nosi.  U
složenijim avanturama  naredba UPOMOC  je daleko  složenija: u  odgovoru na  nju
računar  u nekim  slučajevima daje  igraču indicije  o rešenju  nekog  problema.
Ukoliko  ste igrali  Hobbita svakako  znate da  je najveća  veština u  tumačenju
odgovora koje računar daje kada otkucate HELP.
  Neke reči mogu da imaju isto značenje (npr.uzmi i ponesi) omogućavajući igraču
da otkuca rečenicu koja mu  prva padne na pamet. Uštedećete  određeni memorijski
prostor ako te reči tretirate  istim potprogramima što znači da  ovakve sinonime
treba uočiti od samoga početka.
slika 5: Rečnik 'Ukletog dvorca'
    =========================================================================
    =  Broj      Glagol        Odgovarajuće         Značenje                =
    = glagola                  Imenice                                      =
    =========================================================================
    =                                                                       =
    =   0      -               -               Glagol nije pronaden         =
    =   1      upomoc          -               Prikazuje recnik             =
    =   2      inventar        -               Predmeti koje igrac nosi     =
    =   3      idi             strane sveta    Kretanje                     =
    =   4      n               -               Kretanje na sever            =
    =   5      s               -               Kretanje na jug              =
    =   6      w               -               Kretanje na zapad            =
    =   7      e               -               Kretanje na istok            =
    =   8      u               -               Kretanje uz stepenice        =
    =   9      d               -               Kretanje niz stepenice       =
    =  10      uzmi            predmeti        Uzimanje vidljivog predmeta  =
    =  11      digni           predmeti        Sinonim za uzmi              =
    =  12      ispitaj         bilo šta        Ispitivanje osobina predmeta =
    =  13      otvori          vrata, fioka    Ocigledno                    =
    =  14      procitaj        knjige, cedulja Prikazivanje tajnih poruka   =
    =                          zamotuljak                                   =
    =  15      kaži            bilo šta        Ocigledno                    =
    =  16      kopaj           rupa            Ocigledno                    =
    =  17      upotrebi        lopata, konopac Probijanje zida ili vešanje  =
    =  18      popni se        -               Penjanje uz konopac          =
    =  19      upali           sveca           Ocigledno                    =
    =  20      ugasi           sveca           Ocigledno                    =
    =  21      pošpricaj       šišmiši         Ubijanje insekata superbumom =
    =  22      ukljuci         usisivac        Usisavanje duhova            =
    =  23      otkljucaj       vrata           Ocigledno                    =
    =  24      baci            predmeti        Ostavljanje objekta          =
    =  25      skor            -               Prikazivanje skora           =
    =  26      sidji           -               Silaženje niz konopac        =
    =                                                                       =
    =========================================================================
Glavni plan
  Na slici 6  je dat  konačni plan  naše avanture.  Vidimo da  su sve prostorije
označene brojevima,  da su  označeni svi  prolazi i  vrata, da  je svaki objekat
obeležen brojem i smešten na odgovarajuće mesto te da su upisani razni  problemi
sa  kojima će  se igrač  suočiti (raster,  na primer,  označava mračne  predele,
upisana je magična barijera...).
Konačni plan ukletog dvorca:
   
  Glavni plan je  poslednji trenutak da izmenite  ponešto u scenariju  avanture;
kada ga  konačno usvojite,  preostaje samo  tehnički posao  pisanja programa. Na
tržištu mogu čak da  se nađu  i  programi koji, na  osnovu glavnog  plana,  sami
pišu igre  -avanture! Pomoću  jednog  takvog  programa je,   uzgred budi rečeno,
pisana čak i igra  Kontrabant.   Ovo  pominjemo  zbog  toga  što   pisanje  igre
avanture    po  komplikovanom  scenariju početniku  može da  izgleda nedostižno.
Treba,  ipak, imati  poverenja  u  sebe: došli  smo do  mesta od  koga bi  čak i
kompjuter mogao da nastavi dalje; zar da budemo gluplji od kompjutera?
Smeštanje podataka
  Došlo je, najzad, vreme da počnemo da pišemo program. Taj program, najpre,mora
da poseduje malu biblioteku podataka u kojoj treba da se nalaze imena svih  soba
i objekata  kao i  čitava mapa  dvorca. Za  ovakvo smeštanje  koristimo nizove i
matrice.
  Niz  podataka  možemo da  zamislimo kao  poštanske fahove.  Cedulja smeštena u
svakom fahu  predstavlja samostalni  elemenat koji,  ipak, ima  logičku vezu  sa
ceduljama u ostalim  pregradama. Čitav niz  podataka ima ime  (npr. A, B,  NIZ i
slično) dok  se njegovi elementi razlikuju po brojevima (npr. A(0), A(1), ...  ,
A(N)). Sa N  smo obeležili takozvanu dimenziju niza koja označava broj  njegovih
elemenata. Da  bi  računar znao  koliko  memorijskog  prostora da   rezerviše za
neki niz,   na samom  početku programa  koristimo  naredbu  DIM iza  koje pišemo
imena  svih nizova koje ćemo koristiti i njihove dimenzije.
  U Zlom dvorcu se koristi više  nizova. Prvi i  najlakše shvatljiv je  niz D$()
koji sadrži imena i opise svih  prostorija u zamku i okolini. Obzirom  da, prema
glavnom planu,  zamak ima  64 prostorije,  koristićemo DIM  D$(63) (zašto ne DIM
D$(64)?).  Imena  svih  lokacija  će  biti  zapamćena  prema  redosledu   svojih
karakterističnih brojeva.
  Potreban nam je, zatim, niz R$() čiji će elementi čuvati informacije o mogućim
pravcima kretanja. Ukoliko,  na primer, R$(0)  ima vrednost "SE",  iz prostorije
broj 0 može da se pođe  na jug i na istok. Niz  R$( ) ima 64 elementa kao  i niz
D$( ).
  Niz O$() sadrži imenice i ostale reči koje se javljaju iza glagola u naredbama
koje kompjuter razume. Da bi olakšali promenu broja elemenata rečnika, uveli smo
promenljivu W koja  označava broj imenica  a zatim koristili  DIM O$(W), naredbu
koju razumeju jedino jezici tipa  bejzika. Ukoliko poželite da proširite  rečnik
računara jednostavno povećajte W i dodajte nekoliko novih DATA naredbi.
  Niz V$() dopunjava rečnik glagolima.Slično imenicama, uvedena je promenljiva V
koja označava broj glagola koje  kompjuter razume. Prema našoj ranijoj  ideji, V
ima vrednost  25 pri  čemu se  V$(0) koristi  za situaciju  u kojoj  glagol nije
prepoznat.
  Na prvi  pogled  bi se  reklo  da  nam nije  potrebno  više nizova. Podrobnije
razmišljanje  nas,  medutim,  upozorava  da  na  neki  način  treba registrovati
lokacije pojedinih  objekata kao  i spisak  objekata koje  igrač nosi  sa sobom.
Jedan  od načina  da  rešimo  ovaj problem  je  uvođenje  niza L()  koji  sadrži
lokacije pojedinih predmeta  i niz C()  koji sadrži brojeve objekata koje  igrač
nosi sa sobom. Ukoliko je broj objekata koji mogu da se nose G (u našem  slučaju
G=18),  koristićemo  DIM  L(G),  C(G).  Naprednije  programere  upozoravamo   na
mogućnost da, po cenu  izvesnog usporenja programa, uštedimo  memorijski prostor
za niz C(  ) time što  bi 0 kao  lokacija nekog objekta  označavala da ga  igrač
poseduje.
  Pored svih pomenutih, potreban  nam je i niz flegova F(). Elementi  ovoga niza
imaju vrednosti  0 sve  dok igrač  ne pronađe  objekat N  posle čega F(N) dobija
vrednost 1.  Vrednost 0  označava, dakle,  normalno ili  neaktivno stanje  nekog
objekta dok  vrednost 1  označava neku  njegovu aktivnost  (npr. upaljena sveća,
vidljiv predmet itd.).  Obzirom da neke  imenice (sever, jug,  prsten...) nemaju
potrebe za svojim  različitim stanjima, neki  flegovi se koriste  za "specijalne
efekte". Sveći su,  na primer, potrebna  dva flega: F(17)  označava da li  ju je
igrač  našao u  fioci a  F(0) -  da li  je sveća  upaljena.  Možete  da popišete
nekorišćene flegove i koristite ih za proširenja igre.
  Najlakši (ali ne i najracionalniji,bar kod većine računara) način da se podaci
smeste u nizove je korišćenje READ - DATA naredbi. Da bismo, na primer,  preneli
nazive lokacija u D$, koristimo naredbe:
FOR I=0 TO 63
READ D$(I)
NEXT I
DATA ...
  Početno stanje flegova je  daleko lakše  postaviti. Kada nekom bejzik računaru
kažemo  da  dimenzioniše  niz,  svi njegovi  elementi  će  imati  vrednost nula.
Nekoliko flegova (u  našem slučaju 2,  17, 18, 23,  26 i 28)  u početku treba da
dobije vrednost 1 što najlakše postižemo jednostavnim LET naredbama.
  Ukoliko  posedujemo kompjuter  sa manje  memorije  (na  primer ZX 81  sa 16 Kb
RAM-a) ili računar koji  nema READ - DATA  naredbe, moraćemo najpre da  otkucamo
program a  zatim da  unesemo podatke  i snimimo   ih na  kasetu zajedno sa samim
programom. Na taj način smo izbegli   da dugi komentari budu  jednom smešteni  u
DATA  naredbu a drugi put u zonu (alfa)numeričkih promenljivih. Postoje i toliko
pametni  bejzik interpretatori (jedan takav ima TRS 80) da automatski izbegavaju
ovo  prenošenje sve dok korisnik ne  zatraži promenu nekog na  ovaj način unetog
podatka  i tako štede memorijski prostor i programerovo vreme.
Struktura programa
  U skladu  sa modernim  programerskim  standardima, razložićemo  problem na niz
operacija  koje kompjuter  treba da  obavi a  zatim realizovati  svaku od  njih.
Čitajući dalji tekst biće neophodno  da s vremena na vreme  konsultujete sekcije
samoga programa i tako  u praksi proverite ono  o čemu govorimo. Posle  izvesnog
vremena  primetićete da  se sve  lakše snalazite  u dugom  listingu i  da  svaka
naredba  postepeno  dobija  smisao.  Ukoliko ne  možete  da  uočite  namenu neke
naredbe, možete da pokušate da je  izmenite ili čak izostavite i posmatrate  rad
programa.
  Prvi posao koji računar treba da  obavi je inicijalizacija.  Ona se sastoji od
dodeljivanja  vrednosti  promenljivima  i  elementima  nizova  i  odvojena  je u
potprogram koji se  nalazi na samom  kraju glavnog programa.  Zbog čega smo  ovo
učinili? Pokazuje se da sve GOTO  i GOSUB naredbe brže pronalaze linije  koje su
bliže početku programa.  Inicijalizacija se obavlja  samo jednom i  nema nikakve
svrhe da opterećuje početak  programa koji će se  izvršvati ogroman broj puta  u
toku igre.
  Dolazimo do početka "glavne petlje" u kojoj računar najpre obaveštava igrača o
mestu na  kome se  nalazi. Za  to se  koristi promenljiva  RM u  kojoj je stalno
smešten broj potrebne prostorije tako da PRINT D$(RM) ispisuje njen opis.  Sledi
obaveštenje o mogućim pravcima kretanja koje je nešto teže pripremiti. Znamo  da
su ovi  pravci smešteni  u promenljivu  R$(RM) koju,  dakle, treba razdvojiti na
slova. To postižemo primenom  naredbe MID$: MID$(R$(RM),I,1) izdvaja  I-to slovo
promenljive R$(RM). Jasno je da I predstavlja indeks petlje koji uzima vrednosti
1, 2, ...  sve do dužine  alfanumerika R$(RM) koju  određujemo primenom funkcije
LEN.
  Treba, posle ovoga, da  štampamo imena  predmeta koje igrač vidi. To postižemo
naredbama:
FOR I=1 TO G
IF L(I)=RM AND F(I)=0 THEN PRINT "Vidiš ";O$(I);"."
NEXT I
  Vidimo da računar proverava da li je lokacija  objekta I koju čuva promenljiva
L(I) jednaka broju prostorije u kojoj se trenutno nalazi igrač (RM) a zatim i da
li je predmet vidljiv (F(I)=0). Ukoliko su oba uslova ispunjena, štampa se O$(I)
to jest ime predmeta. Ova naredba se ponavlja za svaki vidljiv predmet to jest G
puta.
  Ostaje još da se  štampa eventualna  poruka koja iskazuje reakciju računara na
prethodni igračev postupak. Moguće  je, naime, da računar  nije bio u stanju  da
razume  ili,  u datim  okolnostima,  izvrši igračev  nalog  i da  treba  pružiti
obaveštenje o tome. Moguće je, osim  toga, da računar saopšti igraču ono  što je
pročitao u nekoj knjizi  ili na nekoj cedulji.  Sva ova komunikacija se  obavlja
pomoću promenljive M$. Pošto je,  sa PRINT M$, štampana njena  vrednost, računar
izvršava M$="Šta?",  naredbu koja  će vam  se u  prvi mah  učiniti čudnom.  Malo
dublje  razmišljanje  nas, međutim,  uverava  u korisnost  ove  naredbe: ostatku
programa se nudi mogućnost da  promeni sadržaj promenljive M$ (ukoliko  ste sami
kucali  program,  svakako  se  sećate toga  da  se  većina  naredbi završava  sa
M$="..."). Ukoliko ni  jedna "sekcija" programa  nije uspela da  razume igračevu
naredbu i promeni M$, naredba je bila sasvim nerazumljiva ili pogrešno  otkucana
čemu komentar "Šta" odlično pristaje.
  Sledeća sekcija  programa je  izuzetno  jednostavna: računar  ispisuje "Šta da
radim" a zatim igračev odgovor smešta u promenljivu Q$ primenom naredbe INPUT.
  Faza do koje dolazimo je, za promenu, veoma složena i predstavlja srce čitavog
programa: računar treba da analizira Q$, razdvoji je na imenicu i glagol a zatim
da pronađe te reči u svome rečniku i kodira ih njihovim brojevima. Pošto nam  je
za  sada cilj  samo da  shvatimo kako  program radi  u globalu,  nećemo se  više
zadržavati na ovoj fazi; docnije ćemo joj posvetiti čitavo poglavlje.
  Ukoliko se tokom analize pokazalo da instrukcija nema smisla, treba pripremiti
poruku o tome i vratiti se na  početak glavne petlje da bi se očekivala  sledeća
igračeva naredba. Ukoliko instrukcija izgleda logično (programeri bi rekli da je
sintaksno  ispravna ali  da je  njena semantika  (značenje) i  dalje pod  znakom
pitanja), računar izvršava potprogram koji će do kraja analizirati i  eventualno
izvršiti naredbu.  Obzirom da  svaka rečenica  koju igrač  otkuca treba da počne
glagolom, najjednostavnije je čitavu sintaksnu analizu zasnovati na izdvajanju i
numerisanju tog  glagola brojem  između 1  i 26  koji će  čuvati promenljiva VB.
Zatim ćemo  izvršiti ON  VB GOSUB  n1, n2,  ..., n26  gde je,  na primer,  sa n2
označen linijski broj bejzik naredbe koja  tretira glagol čiji je broj u  jeziku
koji kreiramo 2.
  Pošto je izvršena akcija  koja se  sastoji u  promeni neke od promenljivih ili
elemenata nizova i čiji rezultat  sumira M$, kontrola se vraća  glavnom programu
koji proverava da  li postoji neka  izuzetno prioritetna poruka  koju bi trebalo
ispisati. Ukoliko, na primer, upalite sveću  i nastavite da se krećete sa  njom,
promenljiva LL će  biti umanjivana za  1 posle svakog  vašeg poteza. Ukoliko  je
sveća blizu dogorevanja, računar  će vas upozoriti na  to. Ovo upozorenje se  ne
odnosi na vašu  prethodnu akciju; ono  je, kako bi  rekli programeri, "sistemske
prirode".
  Na kraju preostaje  samo da  se izvrši  jednostavna GOTO  naredba koja  ponovo
započinje glavnu petlju. Glavna petlja  je, dakle, neka vrsta procedure  iz koje
se  izlazi jedino  kada neki  od potprograma  (to je  potprogram koji  realizuje
naredbu SKOR) detektuje kraj igre u kom slučaju biva izdata odgovarajuća  poruka
i izvršena naredba END. 'Zli dvorac' je avantura koja je prijateljski nastrojena
prema  korisniku  pa ne  postoji  mogućnost da  on  usput pogine  (premda  treba
primetiti da igrač može da zapadne u nevolju iz koje nema izlaza bez posedovanja
nekog predmeta što  je, na neki  način, ekvivalentno sa  smrtnim ishodom) ali  i
sami znate da u većini komercijalnih avantura postoji jedan pozitivan i  mnoštvo
"smrtnih" izlaza iz glavne petlje.
Analiza naredbe
  Vraćamo se,kao što smo obećali, trenutku kada je igrač otkucao naredbu koja se
sastoji od dve reči  (u principu glagola i  imenice) koje je računar  zapamtio u
promenljivoj Q$. Računar, najpre, treba da razdvoji alfanumerik Q$ na reči  koje
prepoznaje po praznom prostoru kojim su odvojene. To činimo naredbama:
10 V$="":W$=""
20 FOR I=1 TO LEN(Q$)
30 IF MID$(Q$,I,1)=" " AND V$="" THEN V$=LEFT$(Q$,I-1)
40 IF MID$(Q$,I+1,1)<>"" AND V$<>""THEN W$ = MID$(Q$,I+1,LEN(Q$)-1):I=LEN(Q$)
50 NEXT I
60 IF W$="" THEN V$=Q$
  Naredba 30 pokušava da pronađe blanko simbol u alfanumeriku Q$. Ukoliko joj to
uspe, promenljiva V$ dobija vrednost prve reči stringa. Potom računar traži prvi
sledeći  neprazan simbol  (za slučaj  da su  reči odvojene  sa nekoliko  praznih
mesta) i ostatak  rečenice smešta u  W$. Naredba 60  ima smisla u  slučaju da je
igrač otkucao samo jednu reč (npr. SKOR). U tom slučaju nije nađen blanko simbol
pa ni V$ ni W$ nisu dobili nikakve vrednosti. Zahvaljujući, međutim, naredbi 60,
čitava reč koju je igrač otkucao biva preneta u V$.
  Sledi kodiranje (autori bejzik  interpretatora bi rekli tokenizacija) igračeve
naredbe. Potrebno nam je da oformimo promenljivu VB koja će sadržati redni  broj
glagola koji je otkucan i smešten u V$. Ništa lakše:
10 VB=0
20 FOR I=1 TO V
30 IF V$=V$(I) THEN VB=I
40 NEXT I
  Program je toliko jednostavan da ga ne treba ni komentarisati. Pokušajte,ipak,
da sebi dokažete  da ste ga  razumeli tako što  ćete ga dopuniti  programom koji
izračunava broj objekta na listi i smešta ga u promenljivu OB.
  Ukoliko u spisku reči  koje računar  poznaje nije  pronađena ona koju je igrač
otkucao, VB ili OB  imaju vrednost nula. Ovakva  situacija je dobra indicija  za
prijavljivanje greške ali treba primetiti  da uspešno kodiranje još ne  označava
ispravnu konstrukciju:  već smo  rekli da  ispravna sintaksa  nužno ne povlači i
ispravnu semantiku. Greške tipa "OTVORI  SVEĆU" će biti otkrivene i  prijavljene
tek docnije.
  Sa prijavljivanjem greški, reklo bi se,nema mnogo problema. Zahvaljujući malom
triku koji smo  primenili dodeljujući promenljivoj  M$ vrednost "Šta?"  na samom
početku glavne petlje, bilo bi sasvim dovoljno da program prepozna sve  ispravne
situacije  dok  bi  neprepoznavanje  značilo  da  M$  ne  treba  menjati. Ovakvo
razmišljanje, međutim, upravo pravi  razliku između inventivnog i  neinventivnog
programera.
  Loš program ima jednu  ili samo  nekoliko poruka  o greškama dok dobar program
prepoznaje svakakve situacije i prevazilazi ih. Svaki igrač će mnogo više voleti
da mu računar,  kada otkuca "Ponesi  vrata" odvrati sa  "Što ih ti  ne poneseš?"
umesto sa "Šta?"!
  U 'Zlom dvorcu' se obavljaju razni  testovi ulaznih  podataka. Najpre  računar
ispituje da li  je W$ veće  a OB jednako  nuli što označava  da je igrač otkucao
glagol bez imenice (ova situacija još ima šansi da se povoljno okonča ukoliko je
otkucani  "glagol" SKOR,  UPOMOC  ili  INVENTAR ali  računar za  sada evidentira
potencijalnu grešku komentarom GLUPO koji ne mora nužno biti prikazan).  Testira
se, zatim, i  da li je  nepoznat glagol praćen  imenicom sa liste  u kom slučaju
biva štampano nešto poput "Ne mogu  da..." praćeno rečenicom smeštenom u Q$.  Na
kraju  sekcije  testova  računar  izvšava  IF  VB=0  THEN  VB=V+1.  Ova  naredba
predstavlja neku vrstu sigurnosnog ventila ali samo za neke računare. Ukoliko VB
ima vrednost nula, naredba  ON VB GOSUB će  izazvati nastavak rada ili  ON RANGE
grešku (zavisno  od kompjutera).  Zato smo  predvideli jedan  nepostojeći glagol
čiji je broj V+1 i koji upućuje program na "praznu" naredbu RETURN.
  Kada je sve provereno, naredba ON VB GOSUB izvršava jedan od potprograma kojim
se realizuju naredbe. U okviru tog potprograma biva kompletirana analiza ulaznih
podataka a zatim  se nalog izvršava  ili biva izdata  poruka o grešci.  U okviru
ovih potprograma treba primetiti mnogobrojne logičke funkcije AND, OR i NOT koje
su kao stvorene za ovakve primene.
  Već smo  pominjali situacije u  kojima je nastupio  neki nepredviđeni  događaj
koji zahteva trenutnu pažnju  igrača. Ukoliko se,  na primer, nađemo  u  gornjoj
kuli, postoji velika šansa da nas  napadnu šišmiši. U tom slučaju čak  i valjane
naredbe  bivaju  stalno   odbijane sve   dok ne   ne uništimo   dosadne šišmiše.
Možete li da zamislite još neku  zagonetku ovoga tipa kojom biste dopunili  'Zli
dvorac'?
Kretanje po dvorcu
  Ostalo nam je još da objasnimo deo programa koji omogućava kretanje po  dvorcu
i okolini. Kretanje na sever  možemo, kao što znamo,  da ostvarimo kako sa   IDI
NA  SEVER tako  i kucanjem  običnog N.  Pokušaćemo da  objasnimo kako  radi deo
programa koji čine linije 750-1080.
  Najpre se promenljivoj D dodeljuje vrednost koja odgovara pravcu kretanja koji
je igrač izabrao (1 za sever, 2 za jug, 3 za zapad, 4 za istok, 5 za gore i 6 za
dole). Linija 760 to radi u slučaju da je igrač otkucao samo jedno slovo (N,  S,
W, E, U ili D) dok sledećih  6 linija rešavaju slučaj kada su otkucane  tri reči
(npr. 'idi  na sever').  Linije 830-880  su, na  neki način,  veštački dodane  i
tretiraju igračevo kretanje gore odnosno dole na paru postojećih stepenica.  Ova
kretanja se, kao što vidimo, svode na obično kretanje na neku od strana sveta.
  Linije 890-960 tretiraju neke  specijalne situacije  u kojima računar treba da
onemogući  igračevo  kretanje.  To  kretanje  mogu  da  spreče  duhovi,  magična
barijera, živi  pecak u  močvari, mračni  predeli i  težak čamac  koji možemo da
nosimo samo kratko vreme.
  Ukoliko je sve u redu, računar  treba da promeni  igračevu lokaciju. Taj posao
obavljaju linije  970-1040. Analizira  se R$(RM),  string koji,  kao što  znamo,
sadrži sve moguće pravce kretanja. Ukoliko je pravac kretanja moguć, promenljiva
RM dobija novu vrednost i fleg 35 biva postavljen na vrednost 1. Na samom  kraju
(linija 1050) računar proverava da li je fleg 35 setovan; ukoliko nije, igrač je
tražio kretanje u nemogućem pravcu i treba izdati poruku 'Tuda ne mogu'.  Linija
1070, najzad, za sva vremena zatvara  ulazna vrata kada igrač jednom prođe  kroz
njih. Izlaz iz  kuće je moguć  kroz dvorišna vrata,  zatrpani prozor i  primenom
čarolije.
Modifikacije programa - Kako olakšati...
  Kada ste razumeli kako 'Zli dvorac' radi, možete  da ga modifikujete i učinite
jednostavnijim ili složenijim; pojednostavljenju ćete, jasno, pristupiti ako vaš
kompjuter nema dovoljno memorije da primi program u sadašnjem obliku.
  Vlasnici ZX  Spectruma moraju  da  modifikuju program  da  bi uopšte  mogao da
funkcioniše. Potrebno je, najpre,  dodati LET ispred svake  naredbe dodeljivanja
što kod Microsoft-ovog bejzika nije  nužno. Zatim treba sve alfanumerike  u DATA
listama  (linije  iza  1810)  omeđiti  navodnicima  (npr.  1810  DATA  "upomoc",
"inventar",  "idi"...).  Otkucajte, najzad,  sve  programske linije  sa  slike 7
kojima  zamenjujete  neke  linije  glavnog  programa.  Treba  primetiti  da   je
organizacija  nizova unekoliko  promenjena pošto  kod Spectruma  indeksi  nizova
počinju od 1 a ne od nule.
      
i kako otežati igru...
  Klasično otežanje igre je  uvođenje vremenskog  limita. Možete,  na primer, da
zahtevate da igrač završi  posao do ponoći jer  se tada dešavaju grozne  stvari.
Posle  svakoga  poteza treba,  jednostavno,  smanjiti vrednost  nekog  brojača i
ispitati  da  li  je  on  došao do  nule;  sličan  princip  je  primenjen i  kod
dogorevanja sveće.
  Možete, zatim, da ograničite broj predmeta koje igrač sme da nosi.Pokušajte da
isplanirate ovo ograničenje tako da zadatak može da se obavi samo na jedan način
ali se potrudite da rešenje bude moguće!
  Uvedite, zatim, veoma redak događaj (primenom naredbe RND) koji "baca"  igrača
na neko zabačeno mesto u zamku i  lišava ga nekih predmeta koje skriva na  stara
ili neka nova   mesta. Možete  da  dodate  i zatvorske   ćelije koje  zadržavaju
igrača izvesno vreme pod  pretnjom  oduzimanja nekih dragocenih  predmeta.  Ima,
naravno, mesta i za dodavanje drugih stanovnika zamka i problema sa njima.
  Unapredite sistem bodovanja tako da dragoceniji predmeti donose više poena kao
i  kazne  koje   se  sastoje  od  oduzimanja   poena  u   nekim situacijama.   U
poslednjem  slučaju  je  potrebno  obezbediti   način na   koji  igrač  može  da
"zaradi" oduzete poene i završi igru.
  Dodajte, najzad,mogućnost da se  u nekom trenutku situacija (sadržaji nizova i
promenljivih) snimi na traku kako bi se igra sutradan nastavila. Rešavanje ovoga
problema može korisno  da posluži kao  motivacija za upoznavanje  načina na koji
vaš kompjuter opšti sa kasetofonom!
  Na  slici 8  je,  najzad,  dato  nekoliko  naredbi  koje  dodaju  ton u raznim
situacijama. Avanturu  ćete učiniti  daleko interesantnijom  ukoliko dodate neke
grafičke efekte.
Listing programa
napomena: Zli dvorac je pisan i  testiran na Acorn BBC B računaru.  Verzija koja
sledi je neznatno promenjena tako da se uspešno prevodi i na PC-ju,  korišćenjem
GWBASIC-a ili  QBASIC-a. PC  verzija nije  detaljno testirana,  tako da  se može
desiti da u nekoj grani programa naiđete na problem, ali će se on verovatno lako
rešiti sitnom sintaksnom izmenom naredbe.
10 REM
20 REM
30 REM
40 REM  *************************
50 REM  *       Zli dvorac      *
60 REM  *************************
70 REM
80 REM
90 REM  "Racunari u vasoj kuci" 3
100 REM
110 REM
120 REM prema programu 'Haunted House'
130 REM  Jenny Tyler i Lesa Howartha
140 REM
150 REM    Dejan Ristanovic 1984.
160 REM
170 V = 26: W = 36: G = 18
171 DIM R$(63), D$(63), O$(W), V$(V)
172 DIM C(W), L(G), F(W)
180 GOSUB 1742
190 CLS : PRINT "Zli Dvorac"
200 PRINT "----------"
210 PRINT "Nalazim se"
220 PRINT D$(RM)
230 PRINT "Pravci kretanja:";
240 FOR I = 1 TO LEN(R$(RM))
250 PRINT MID$(R$(RM), I, 1); ",";
260 NEXT I
270 PRINT
280 FOR I = 1 TO G
290 IF L(I) = RM AND F(I) = 0 THEN PRINT "Vidim "; O$(I); "."
300 NEXT I
310 PRINT "========================="
320 PRINT M$: M$ = "Sta?"
330 INPUT "Sta da radim"; Q$
340 V$ = "": W$ = "": VB = 0: OB = 0
350 FOR I = 1 TO LEN(Q$)
360 IF MID$(Q$, I, 1) = " " AND V$ = "" THEN V$ = LEFT$(Q$, I - 1)
370 IF MID$(Q$, I + 1, I) <> " " AND V$ <> "" THEN W$ = MID$(Q$, I + 1, LEN(Q$)
    - 1): I = LEN(Q$)
380 NEXT I
390 IF W$ = "" THEN V$ = Q$
400 FOR I = 1 TO V
410 IF V$ = V$(I) THEN VB = I
420 NEXT I
430 IF W$ = "se" OR VB = 26 THEN W$ = "konopac": OB = 14: GOTO 470
440 FOR I = 1 TO W
450 IF W$ = O$(I) THEN LET OB = I
460 NEXT I
470 IF W$ > "" AND OB = 0 THEN M$ = "Glupo!"
480 IF VB = 0 THEN VB = V + 1
490 IF W$ = "" THEN M$ = "Recenica obicno ima subjekat i predikat"
500 IF VB > V AND OB > 0 THEN M$ = Q$ + " ti!"
510 IF VB > V AND OB = 0 THEN M$ = "Ne radim besmislice!"
520 IF VB < V AND OB> 0 AND C(OB) = 0 THEN M$ = "Nemam " + W$
530 IF F(26) = 1 AND RM = 13 AND VB <> 21 AND VB > 2 THEN M$ = "Napadaju
    sismisi!": GOTO 190
540 IF RM = 44 AND RND(2) = 1 AND F(24) <> 1 THEN F(27) = 1
550 IF F(0) = 1 THEN LL = LL - 1
560 IF LL < 1 THEN F(0)="0" 570 ON VB GOSUB 610, 680, 750, 750, 750, 750, 750,
    750, 750, 1090, 1090, 1150, 1190, 1260, 1300, 1340, 1370, 1420, 1470, 1520,
    1540, 1570, 1600, 1630, 1650, 1450, 1740
580 IF LL="10" THEN M$="Sveca mi dogoreva!"
590 IF LL="1" THEN LL="0:" M$="Sveca je izgorela!" : F(0)="0"
600 GOTO 190
602 REM naredba 'upomoc'
610 PRINT "Znam sledece reci:"
620 FOR I="1" TO V
630 PRINT V$(I); ",";
640 NEXT I
650 M$ : PRINT
660 GOSUB 1730
670 RETURN
672 REM naredba 'inventar'
680 PRINT "Nosim:"
690 FOR I="1" TO G
700 IF C(I)="1" THEN PRINT O$(I); ",";
710 NEXT I
720 M$ : PRINT
730 GOSUB 1730
740 RETURN
742 REM naredbe za kretanje
750 D="0"
760 IF OB="0" THEN D="VB"
770 IF OB="19" THEN D="1"
780 IF OB="20" THEN D="2"
790 IF OB="21" THEN D="3"
800 IF OB="22" THEN D="4"
810 IF OB="23" THEN D="5"
820 IF OB="24" THEN D="6"
830 IF RM="20" AND D="5" THEN D="1"
840 IF RM="20" AND D="6" THEN D="3"
850 IF RM="22" AND D="6" THEN D="2"
860 IF RM="22" AND D="5" THEN D="3"
870 IF RM="36" AND D="6" THEN D="1"
880 IF RM="36" AND D="5" THEN D="2"
890 IF F(14)="1" THEN M$="Bup!!! Pao sam sa drveta!" : F(14)="0:" RETURN
900 IF F(27)="1" AND RM="52" THEN M$="Duhovi mi ne daju da mrdnem!" : RETURN
910 IF RM="45" AND C(1)="1" AND F(34)="0" THEN M$="Osecam magicnu barijeru na
    zapadu" : RETURN
920 IF (RM="26" AND F(0)="0)" AND (D="1" OR D="4)" THEN M$="Sasvim je mracno":
    RETUR
930 IF RM="54" AND C(15) <> 1 THEN M$ = "Zaglibio sam se": RETURN
940 IF C(15) = 1 AND NOT (RM = 53 OR RM = 54 OR RM = 55 OR RM = 47) THEN M$ =
    "Sad malo ti nosi camac!": RETURN
950 IF (RM > 26 AND RM < 30) AND F(0)="0" THEN M$="Ja u mrak ne idem!" :
    RETURN
960 F(35)="0:" RL="LEN(R$(RM))"
970 FOR I="1" TO RL
980 U$="MID$(R$(RM)," I, 1)
990 IF (U$="N" AND D="1" AND F(35)="0)" THEN RM="RM" 8: F(35)="1"
1000 IF (U$="S" AND D="2" AND F(35)="0)" THEN RM="RM" + 8: F(35)="1"
1010 IF (U$="W" AND D="3" AND F(35)="0)" THEN RM="RM" 1: F(35)="1"
1020 IF (U$="E" AND D="4" AND F(35)="0)" THEN RM="RM" + 1: F(35)="1"
1030 NEXT I
1040 M$="O.K."
1050 IF F(35)="0" THEN M$="Tuda ne mogu!"
1060 IF D < 1 THEN M$="Kud' da idem?"
1070 IF RM="41" AND F(23)="1" THEN R$(49)="SW" : M$="Vrata su se zalupila" :
     F(23)="0"
1080 RETURN
1082 REM naredba 'uzmi'
1090 IF OB> G THEN M$ = "Ne mogu da uzmem " + W$: RETURN
1100 IF L(OB) <> RM THEN M$ = "A gde je?"
1110 IF F(OB) <> 0 THEN M$ = "Koji " + W$ + "?"
1120 IF C(OB) = 1 THEN M$ = "Vec ga imam!"
1130 IF OB > 0 AND L(OB) = RM AND F(OB) = 0 THEN C(OB) = 1: L(OB) = 65: M$ =
     "Imam " + W$
1140 RETURN
1142 REM  naredba 'otvori'
1150 IF RM = 43 AND (OB = 28 OR OB = 29) THEN F(17) = 0: M$ = "Otvorio sam
     fioku"
1160 IF RM = 28 AND OB = 25 THEN M$ = "Zakljucano!"
1170 IF RM = 38 AND OB = 32 THEN M$ = "Bas je uzasno!": F(2) = 0
1180 RETURN
1182 REM  naredba 'ispitaj'
1190 IF OB = 30 THEN F(18) = 0: M$ = "Nesto je tu!!!"
1200 IF OB = 31 THEN M$ = "Odvratno mi je."
1210 IF (OB = 28 OR OB = 29) THEN M$ = "Vidim fioku"
1220 IF OB = 33 OR OB = 5 THEN GOSUB 1260
1230 IF RM = 43 AND OB = 35 THEN M$ = "Ima nesto ispod..."
1240 IF OB = 32 THEN GOSUB 1150
1250 RETURN
1252 REM  naredba 'procitaj'
1260 IF RM = 42 AND OB = 33 THEN M$ = "To su demonske reci!"
1270 IF (OB = 3 OR OB = 36) AND C(3) = 1 AND F(34) = 0 THEN M$ = "Tajanstvena
     magicna rec je XZANFAR."
1280 IF C(5) = 1 AND OB = 5 THEN M$ = "Napis je na stranom jeziku."
1290 RETURN
1292 REM  naredba 'kazi'
1300 M$ = "O.K. '" + W$ + "'"
1310 IF C(3) = 1 AND OB = 34 THEN M$ = "** CAROLIJA **": IF RM <> 45 THEN RM =
     RND(63)
1320 IF C(3) = 1 AND OB = 34 AND RM = 45 THEN F(34) = 1
1330 RETURN
1332 REM  naredba 'kopaj'
1340 IF C(12) = 1 THEN M$ = "Nisam ja destruktivac!"
1350 IF C(12) = 1 AND RM = 30 THEN M$ = "Iscupao sam gomilu greda": D$(RM) =
     "Kraj otvora u zidu": R$(RM) = "NSE"
1360 RETURN
1362 REM  naredba 'upotrebi'
1370 IF C(14) <> 1 AND RM = 7 THEN M$ = "Nije vreme za igru!!"
1380 IF OB = 14 AND C(14) = 1 THEN PRINT : INPUT "Obesio sam se... To je kraj!";
     X$: RUN
1390 IF OB = 13 AND C(13) = 1 THEN M$ = "WHUUSH"
1400 IF OB = 13 AND C(13) = 1 AND RM = 43 THEN R$(RM) = "WN": D$(RM) = "U radnoj
     sobi sa skrivenim separeom": M$ = "Probio sam tanki zid."
1410 RETURN
1412 REM  naredba 'popni se'
1420 IF OB = 14 AND C(14) = 1 THEN M$ = "Nije pricvrsceno!"
1430 IF OB = 14 AND C(14) <> 1 AND RM = 7 AND F(14) = 0 THEN M$ = "Vidim sumu i
     liticu na jugu": F(14) = 1: RETURN
1440 RETURN
1442 REM  naredba 'sidji'
1450 IF OB = 14 AND C(14) <> 1 AND RM = 7 AND F(14) = 1 THEN M$ = "Idem dole.":
     F(14) = 0
1460 RETURN
1462 REM  naredba 'upali'
1470 IF OB = 17 AND C(17) = 1 AND C(8) = 0 THEN M$ = "Opeci cu se!"
1480 IF OB = 17 AND C(17) = 1 AND C(8) = 0 THEN M$ = "Cime da je upalim?"
1490 IF OB = 17 AND C(17) = 1 AND C(9) = 1 AND C(8) = 1 AND LL = 0 THEN M$ =
     "Izgorela je!"
1500 IF OB = 17 AND C(17) = 1 AND C(9) = 1 AND C(8) = 1 AND LL > 1 THEN M$ =
     "Jeste da zmirka ali bar svetli!": F(0) = 1
1510 RETURN
1512 REM  naredba 'ugasi'
1520 IF F(0) = 1 THEN F(0) = 0: M$ = "Ugasena je."
1530 RETURN
1532 REM  naredba 'pospricaj'
1540 IF OB = 26 AND C(16) = 1 THEN M$ = "Hssssss"
1550 IF OB = 26 AND C(16) = 1 AND F(26) = 1 AND RM = 13 THEN F(26) = 0: M$ =
     "PFFT! Gotovi su!"
1560 RETURN
1562 REM  naredba 'ukljuci'
1570 IF OB = 10 AND C(10) = 1 AND C(11) = 1 THEN M$ = "Ukljucen je.": F(24) = 1
1580 IF F(27) = 1 AND F(24) = 1 THEN M$ = "Usisao sam duhove.": F(27) = 0
1590 RETURN
1592 REM  naredba 'otvori'
1600 IF RM = 43 AND (OB = 27 OR OB = 28) THEN GOSUB 1150
1610 IF RM = 28 AND OB = 25 AND F(25) = 0 AND C(18) = 1 THEN F(25) = 1: R$(RM) =
     "SEW": D$(RM) = "Kraj velikih otvorenih vrata": M$ = "Kljuc se okrece."
1620 RETURN
1622 REM  naredba 'baci'
1630 IF C(OB) = 1 THEN C(OB) = 0: L(OB) = RM: M$ = "Izvrseno!"
1640 RETURN
1642 REM  naredba 'skor'
1650 M$ = ""
1660 S = 0
1670 FOR I = 1 TO 8
1680 IF C(I) = 1 THEN S = S + 1
1690 NEXT I
1700 IF S = 8 AND C(15) <> 1 AND RM <> 57 THEN PRINT :PRINT "Prikupio sam sve!":
     PRINT "Treba jos da izadjem..."
1710 IF S = 8 AND RM = 57 THEN PRINT "Dolazak ovde duplira skor!": S = S * 2
1720 PRINT "Skor je "; S: IF S > 9 THEN PRINT : PRINT "B R A V O. Avantura je
     zavrsena!": END
1730 PRINT : PRINT : INPUT "Pritisni RETURN za nastavak"; Q$
1740 RETURN
1742 REM  inicijalizacija nizova
1770 DATA 46,38,35,50,13,18,28,42,10,25,26,4,2,7,47,60,43,32
1780 FOR I = 1 TO G
1790 READ L(I)
1800 NEXT I
1810 DATA upomoc,inventar,idi,n,s,w,e,u,d,uzmi,digni,otvori,ispitaj,procitaj,
     kazi,kopaj,upotrebi,popni,upali,ugasi,pospricaj,ukljuci,otkljucaj,baci,
     skor,sidji
1820 FOR I = 1 TO V
1830 READ V$(I)
1840 NEXT I
1850 DATA SE,WE,WE,SWE,WE,WE,SWE,WS
1860 DATA NS,SE,WE,NW,SE,W,NE,NSW
1870 DATA NS,NS,SE,WE,NWUD,SE,WSUD,NS
1880 DATA N,NS,NSE,WE,WE,NSW,NS,NS
1890 DATA S,NSE,NSW,S,NSUD,N,N,NS
1900 DATA NE,NW,NE,W,NSE,WE,W,NS
1910 DATA SE,NSW,E,WE,NW,S,SW,NW
1920 DATA NE,NWE,WE,WE,WE,NWE,NWE,W
1930 FOR I = 0 TO 63
1940 READ R$(I)
1950 NEXT I
1960 DATA u tamnom uglu,u zapustenoj basti,kraj velike gomile drva,u dvoristu
     kraj otpadaka
1970 DATA na gradilistu,u sumi,u gustoj sumi,kod suvog drveta
1980 DATA na uglu kuce,na ulazu u kuhinju,u kuhinji,u perionici sudova
1990 DATA u sobi punoj prasine,sa zadnje strane kule,na cistini kraj kuce,na
     puticu
2000 DATA uz zid kuce,iza trema,u tamnom alkovu,u mracnoj sobici
2010 DATA na dnu spiralnih stepenica,u sirokom prolazu,kraj klizavih stepenica,
     na vrhu grebena
2020 DATA blizu srusenog zida,u sumornom prolazu,u kucnoj elektricnoj centrali,
     u svecanom hodniku
2030 DATA kraj okovanih drvenih vrata,u svecanoj sali,u podrumu sa zatrpanim
     prozorom,na putu ka litici
2040 DATA kraj eksera na kome visi kaput,ulaznom holu,u dnevnoj sobi,u tajnom
     sobicku
2050 DATA kraj strmih mramornih stepenica,u trpezariji,u dubokom podrumu s
     mrtvackim sandukom,na putu ka litici
2060 DATA u ormanu,u predvorju,u biblioteci sa zlim knjigama,radnoj sobi sa
     stolom i rupom u zidu
2070 DATA u zlokobnoj sobi punoj paucine,u ledenom prolazu,u avetinjskoj sobi,
     na strmom putu kraj mocvare
2080 DATA na verandi punoj komadica stakla,pred glavnim ulazom,u prednjem
     tornju,u vlaznom hodniku
2090 DATA na gornjoj galeriji,na mocvarnoj strani zida,u mocvari,na raskvasenoj
     stazi
2100 DATA na krivini,na putu ka gvozdenim vratima,na putu,ispod prednjeg tornja
2110 DATA kod gomile opalog maltera,kod velikog odronjenog kamena,pokraj
     propalog svoda,na uglu sveta
2120 FOR I = 0 TO 63
2130 READ D$(I)
2140 NEXT I
2150 DATA sliku,prsten,magicnu cedulju,pehar,zamotuljak,novcice,kip,svecnjak
2160 DATA sibice,usisivac,baterije,lopatu,sekiru,konopac,camac,superbum,svecu,
     kljuc
2170 DATA na sever,na jug,na zapad,na istok,gore,dole
2180 DATA vrata,sismise,avet,fioku,sto,kaput,otpatke
2190 DATA sanduk,knjige,xzanfar,zid,caroliju
2200 FOR I = 1 TO W
2210 READ O$(I)
2220 NEXT I
2230 F(18) = 1: F(17) = 1: F(2) = 1: F(26) = 1: F(28) = 1: F(23) = 1: LL = 60:
     RM = 57: M$ = "O.K."
2240 RETURN
2260 REM Dejan Ristanovic 1984.
  |