Dette har norsk tekst men selve
programmet er på engelsk.




[[[Note february 14, 2011: a translation of this 
kidpop01 into an english version is to be 
released and called kidpop02.
This is stored as .htm instead of .txt at 
norskesites.org/fic3 and moscowsites.org/fic3
because the Internet official convention on
writing norwegian ethnic letters rather is
used here, for ease of browsing, instead of
the way which involves B9NORW.ZIP which is
indeed how this Big Art Booklet published
in 2010 (cfr News about Aristo Tacoma section
about B.A.B.) was written. The release of this
text in free electronic form is unusual since
these B.A.B.'s are for sales, but reflects
increased demand for tutorial material of f3 
  NOTE THAT THE GAME HERE DISCUSSED IS
WRITTEN PRIMARELY FOR THE SAKE OF HOW
IT LOOKS AS A PROGRAM, RATHER THAN
BY COMPETING ON THE LOOKS OF THE RESULT.
IT IS SUPPOSED TO TEACH HOW TO WRITE
GAMES YOURSELF THAT ARE MUCH, MUCH BETTER! ;)
HERE ARE LINKS TO THE COMPLETED GAME:
http://www.norskesites.org/fic3/SUPERBT.TXT
AND THE SAME,
http://www.moscowsites.org/fic3/SUPERBT.TXT
COPYRIGHT AND FURTHER REDISTRIBUTION RIGHTS,
IN EDUCATIONAL SETTINGS GOOD: 
www.yoga4d.org/cfdl.txt



Screen copies from game generated by CTR-F5 
in Dosbox on an Asus laptop running Microsoft 
Windows 7 in 2011, using fullscreen mode, 
frameskip=18, but it can be just as well run 
in all sorts of other ways, and in the future,
the frameskip=18 is not necessary. Dosbox
provides a uniform glamorous shielding from
the fluctuating layers of a security-issue-
ridden internet, where we run this standard
warp-friendly programming language with its
always fixed, standard syntax, so that your
games and other apps will really be performable
in the future. The Dosbox is relatively safe
from various security issues but note that
it can be configured to respond to internet
networking so you should always be aware of
natural security issues in using any computer
which is connected to any network. 
  Note -- I haven't quite said this earlier
on in the update page on f3, that on the 
Dosbox, in fullscreen mode anyway, the caps 
lock key has to be pressed several times
rapidly in order to be switched back and forth, 
sometimes. Use B9 in fullscreen mode with F12
clicked for cruise mode writing deep beautiful
meditative thoughts. -- A.T., february 14, 2011]]]







 
Aristo Tacoma 
  
 
 
 
***VELKOMMEN TIL LISA PROGRAMMERING                                   
Bind 1, 2d spill i Lisa GJ2 FIC3 
 
 
 
 
 
 
 
 
 
 
[[[These BIG ART BOOKLETS by Yoga4d von Reusch Gamemakers 
(in size more like a book, but in text pleasingly short, like 
booklets) are typeset in the B9 font created by Aristo Tacoma  
and available as part of the norskesites.org/f3 package. 
The pages have print on one side to allow use as notebooks. 
Cateory (fiction, nonfiction), subcategory, 
and number of pages should be at the the backcover.
Illustrations by author unless other clearly indicated. 
The BIG ART BOOKLETS cover all areas of life, fiction as 
nonfiction. Cfr also the website www.yoga6d.org.
Publisher: Yoga4d von Reusch Gamemakers,  
Holmenv 68, 0376 Oslo, Norway.]]] 
 
First published 2010. Regular print-on-demand production. 
Questions? atiroal@yoga6d.org. Content, illustrations, 
and font are copyright Aristo Tacoma, but font can be 
utilized by others when acknowledgement is clearly given. 
  
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
FORORD AV FORFATTEREN 
Bokheftet er skrevet i tekstbehandlingen B9, en del av  
programmeringsspråket f3 -- en forkortelse for Lisa GJ2 
Fic3, og tilgjengelig på www.norskesites.org/f3. PCen 
skal være svårt rask for å kjøre Dosbox-versjonen,
som anbefales, fordi den har høy grad av skjerming 
fra alt som kan være av virus og net-sikkerhets-. 
spørsmål. Programmeringsspråket er gratis og 
gir bedre trening i essensiell logisk tenkning enn alle 
andre tilnærminger, etter denne forfatterens helt 
uhildete mening (har selv laget språket). 
  Dette heftet er bra for begynnere.
  I planlagte bind i denne serien forklares bl.a.
hvordan bruke det åpne programmet -- skrevet i F3 -- 
som heter LIGHT3D.TXT til å bygge egne 3D spill 
via programmering som bruker LIGHT3D som bibliotek 
av bakgrunnsprogrammer egnet for visse typer 
spill som stimulerer hjernen uten å virke 
avhengighetsskapende, med første-hånds bruk av 
impresjonistisk grovkornet oppløsning (som  
stimulererer egen fantasi). 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
*** 
Vi skal lage et spill og det skal hete SUPERBT! Hele 
heftet er vevet rundt oppbyggingen av dette enkle 2D 
spill slik at de som er nydelige debutanter, totale 
begynnere i programmering vil være -- langt på vei 
ihvertfall -- suverene mestere etter å ha bladd litt i 
dette heftet. Eller mer presist, nilest den om og om 
igjen sammen med svettedryppende øvelser foran 
computeren.
 
 
 
 
 
 
 
*** 
Skaff deg Lisa på din datamaskin, hvis du har en som er  
rask nok, eller standard nok. Se her: norskesites.org/f3  
-- med kopier av alle filene her: moscowsites.org/f3. 
  Vi trenger bruk av tekstbehandling for å skrive, 
fikse på, og videreutvikle vårt SUPERBT program. En 
del av mitt programmeringsspråk er tekstbehandlingen 
B9. Uttalt be-nine, eller: benign, altså velgjørende. 
Denne tekstbehandlingen stimulerer hjernen garantert. 
Har masse erfaring med at den virker slik. Alt jeg gjør 
med tekster gjør jeg på denne, stort sett. Den er 
leken i bokstavene, enkel i funksjonene, og likevel ikke 
så over-forenklet at den "overtar" skriveprosessen.   
  Lær deg den. Du starter opp F3 [igjen, se siste side 
hvis du ikke vet hvordan gjøre det], og skriver
  B9 
og vips! du har tekstbehandlingen. Press CTR-S for å 
lagre etter du har skrevet, ESC-tasten for å forlate 
den. Lek rundt inntil du forstår den. Jeg antar at du 
har tilbrakt de dager som trengs med B9 som 
tekstbehandling før du leser videre, at du kan litt om 
hvordan flytte tekster, at du kan bruke F1 eller CTR-O 
for å åpne, CTR-F eller F4 for å finne, at du har 
funnet ut noen av hemmelighetene ved CTR-C eller INS for 
å begynne å markere, og (etter flytting av 
tekstmarkøren), samme tast igjen for å indikere at du 
er ferdig med å markere. CTR-V eller F5 innsetter 
teksten et nytt sted, og kan brukes gjentatte ganger.
  CTR-Y eller CTR-INS kan brukes til å sette inn blanke  
linjer. CTR-J eller F8 kan brukes til -- noe du som 
programmerer bør merke deg med ekstrem interesse -- å 
hoppe direkte til et bestemt linjenummer. Linje nummer 1 
er første linje i teksten, nummer 2 er andre linje, og 
når det er en skrivefeil, som er svært vanlig i 
programmering, vil dette noen ganger plukkes opp av F3 
(som jeg sier fra nå av, som forkortelse for Lisa GJ2 
Fic3 programmeringsspråk) og den vil fortelle deg 
hvilken linje du vil glede F3 ved å se litt nærmere 
på. De vanskeligste feilene er de der man har skrevet 
noe som er "grammatisk" rett, men som blir kokelimonke 
for den dumme, pene, fine datamaskinen å prøve å 
utføre. Det er her det hjelper å lage programmet 
langsomt, linje for linje kanskje, og teste hver gang du 
utvider -- hvertfall hvis du er det minste usikker. Da 
vi du automatisk vite, når datamaskinen blir til et 
gedigent spørsmålstegn, at det var nettopp den siste 
utvidelsen som den ikke forstod. 
 
 
 
 
 
 
 
 
*** 
Vårt spill skal hete 
  :SUPERBT  B9 
eller mer presist, det skal hete SUPERBT.TXT, og ved å 
starte opp F3 og skrive det der som begynner med kolon 
og fortsetter (uten noe mellomrom) til ordet SUPERBT, 
kommer du rett inn i (den kanskje blanke tekst, hvis du 
ikke allerede har laget en fil som heter dette) 
dokumentet, og kan rette på det, tilføye, og slikt.
  Jeg har en ide om spillet som jeg utvikler "sammen med  
med deg" -- jeg skriver, du leser og tenker med meg og 
programmerer din PC mens jeg programmerer min PC, og 
resultatene utvikler vi kapittel for kapittel, 
SUPERBT.TXT blir en kanon av et spill. [Jeg har kikket 
litt på noen ulike mobil-telefon-spill fra Nokia for å 
hente ideer til hva som er egnet for begynnere å lage 
av 2D spill, og noe som het Snake Xenia eller lignende 
-- som også finnes i andre versjoner, med andre navn -- 
syntes meg å være mest rett på sak som enkelt 2D 
brettspill med visse forførende anlegg -- dette er 
altså en slags inspirasjonskilde, selv om jeg regner 
med at mens vi begynner å programmere dette, uten at 
jeg har spillet spesielt friskt i hukommelsen, vil det 
som vi her kaller SUPERBT bli en god del annerledes 
også. Uansett, takk Nokia!]
  Det blir masse repitisjoner her. Og der er BRA. Du 
skal jo tross alt lære deg et nytt språk. Fire-fem 
repitisjoner av noe i løpet av et par dager gjør at 
det begynner å bli del av hva din hjerne har lett for 
å fremkalle. Det er hundrevis av trekk ved F3 vi skal 
få på plass. Det har ingen hensikt å levere med 
ferdige programfiler slik at du slipper tasting. Taste 
skal du gjøre, hvis du skal programmere, og lære 
hvordan programmere. Men likevel skal jeg ikke gjøre 
SUPERBT unødig stort. Og hvis du lærer deg 
touch-tasting og samtidig lærer deg å bruke B9 
effektivt med kopiering og liming, og det er forbausende 
mange små tricks man kan lære seg selv med de få 
kommandoer B9 tilbyr, vil du feie over disse øvelser 
elegant. Du er, m.a.o., en elegant begynner!
 
 
 
 
 
 
 
 
 
*** 
SUPERBT: Det er et spill som har et slags brett knyttet 
til seg, hvertfall starter vi der. Du kan jo også 
videreutvikle dette etter at heftet er lest. En god 
regel knyttet til programmer som videreutvikles er at du 
i et kommentarfelt i begynnelsen av programmet beskriver  
temmelig tydelig og temmelig inngående hva du har 
hentet hvorfra, og når din egen videreutvikling er 
laget, slik at andre ser hva som er laget før hva, og 
at det hele virker og faktisk er lovlig og alt det. Se 
på www.yoga4d.org/cfdl.txt for en noe tørr 
lisens-tekst for deling til offentligheten av programmer 
-- også programmer som selges for penger. La det være 
sagt at denne SUPERBT.TXT som presenteres her i heftet, 
[med Nokia-inspirasjonen nevnt og videreført hvis du 
bruker programmet i andre sammenhenger] er gratis men
slik at den bruker yoga4d.org/cfdl.txt lisens for 
videreføring av programmet. Altså, du har full rett 
til videreutvikling av programmet hvis du gir videre den 
opprinnelige versjon av programmet, med korrekte navn og  
alt slikt. Dette er et visst plunder men det gir en 
majestetisk aura når du vet at du har det formelle i 
orden, at du forholder deg lovlig til kildekoder. Dette 
inspirerer andre til å gjøre det samme. 
 
 
 
 
 
 
 
 
 
 
 
*** 
Når du skal lære deg F3, trenger du å vite hvilke ord  
som er innebygd i F3, og hvilke ord vi definerer oss 
frem til som del av programmeringen, -- der vi bygger 
på innebygde ord. Det er min erfaring at ved å ha en 
skarp kontrast der ordene vi selv føyer til er svært 
lekende og fantasifulle -- sogar noen ganger inn i det 
absurde -- vil sinnet plukke opp hvilke ord som er fast 
del av F3 fortere. Husk at datamaskinen bare mottar 
instruksjoner, den driver ikke med tolkning av de 
bokstav-rekker vi kommer med. Enten er ordet en kjent 
instruksjon, eller så er det totalt ukjent -- det er 
ingen egentlig mellomting her, selv om det går an å 
lage programmer som gjetter en del. Men i bunn og grunn 
er datamaskinens CPU -- dens Central Processing Unit, 
dens maskinelle hjerne -- nøyaktig slik som F3 -- 
nemlig at enten er instruksjonen gjenkjent, eller så er 
den overhodet ikke gjenkjent. Gjenkjennes den, vil den 
bli utført. Gjenkjennes den ikke, kommer en feilmelding 
eller noe slikt. Det er ingen vanlig mental fortolkning 
utover dette.
 
 
 
 
 
 
 
 
*** 
Altså, du skriver, etter å ha started F3, 
  :SUPERBT  B9 
og setter igang. Vi skal ha noe vist på skjermen og vi 
kan bruke en rutine, et innebygget ord, som heter RECT 
for dette, en forkortelse, naturligvis, for 'rectangle'. 
Vi trenger å pakke dette litt inn, noen ord foran og 
noen ord etter det, noen ord for å gi navn til hele 
programmet, noen ord for å starte det opp. Dette blir 
straks et ritual, når du har vært gjennom det tyve 
ganger, og et hyggelig, inspirerende og kreativt ritual. 
Men det virker totalt kryptisk på en total begynner og 
i slike tilfelle skal man fortelle seg selv, om og om 
igjen, at etterhvert kjenner jeg dette herre her igjen 
og etterhvert gir det mer og mer god mening og god, klar  
følelse. Det er repitisjonen som gjør at det blir 
familiært. Jeg kan godt gi deg en myte, en forklaring, 
til hvert eneste uttrykk men det bare forlenger hele 
arbeidet, la oss heller bare være tøffe og tålmodige 
nok til å godta nye fraser, der jeg påpeker det 
viktigste, og påpeker mulige forandringer, og forøvrig 
viser til andre tekster så som manual for utdypning. 
På denne måten vil vårt felles arbeide med å lage 
dette spill sparke unna.
  Få disse ordene her på plass. Gidd nøyaktighet -- 
du kan f.eks. sette inn to blanke (tabulator-tast) foran 
hver tekstlinje som skal ha innrykk, og to ekstra 
blanke, når det trengs ekstra innrykk. Dette er en 
vakker, dansende, poetisk stil for å skrive programmer, 
selv om PCen vil fungere bra også uten slik estetikk i 
innskrivingen. Skriv det med store bokstaver, selv om 
sm/ også fungerer bra. Pass på at når noen tegn 
hører sammen, så som (LET eller OK), at de fortsetter 
å høre sammen, og ikke blir til noen slikt som ( LET 
eller OK ). Der det allerede er en blank, kan det 
generelt være flere blank, i noen tilfeller også 
linjeskift. 
  En ting til: i B9 er CTR-W noe som skrur av og på 
såkalt Wordwrap. Denne bør skrus av når du 
programmerer, for linjene trenger ekstra lengde uten at 
det skal gå ut over linjene under med noen plutselig 
wordwrap. Den er normalt skrudd av når du går inn i 
B9, men du kan sjekke ved å presse CTR-W en eller to 
ganger for å finne ut hvilken tilstand -- modus -- B9 
befinner seg i, når det gjelder wordwrap.
  Skriv dette, lagre, og i neste avsnitt forklarer jeg 
hvor enkelt det er å teste det lille program vi har 
skrevet. Husk at repitisjon lager familiaritet, og at 
dette er langt viktigere i begynnelsen enn noen 
analytisk forståelse av hvert komponent:
 
(LET SUPERBT BE (( )) 
  (( 
    (( GJ-ON ))
    (( 100 ; 100 ; 400 ; 400 ; 1  
      => RECT )) 
    (( A-KEY ))
    (( GJ-DONE ))
  )) OK)
(LET AUTOSTART BE SUPERBT OK) 
 
 
 
 
 
 
 
 
 
 
*** 
Jeg håper du er anatomisk våken, tantrisk våken, det 
gjør at din hukommelse tar opp ny viktig kunnskap 
fortere. Lek med assosiasjoner. Det var ved god lek at 
(( )) ble til som en ganske heftig, dryppende 
assosiasjon.. som en symbolsk kraft som skal strømme 
gjennom dataspråket for alltid. Lisa's lepper. Greit?
  Start programmet ditt. Programmet heter SUPERBT, filen  
heter SUPERBT.TXT, og dette er normalt lagret automatisk  
med store bokstaver uansett om du skriver store eller 
små bokstaver inn i B9.
  Start opp F3 og skriv, med store bokstaver for 
sikkerhets skyld, hver gang du bruker den følgende 
kommando, med det enkle, positive, korte ord IN:
  :SUPERBT  IN 
  Hvis du har syntaktisk -- grammatisk, altså -- alt 
helt super-perfekt vil du se et kvadrat risset inn på 
skjermen, som fjernes når du taster en vanlig tast, og 
da takker programmet for seg. Hvis du har skrivefeil ta 
deg endelig tid til å smile over den høflige meldingen 
som dataspråket kommer med, og vit at uansett hvor 
hyper-proff man er som programmerer, er skrivefeil en 
del av leken, og du skal motstå impulsen til å 
irritere deg over det. Vit at enkle, dumme feil såvel 
som kompliserte feil er noe som datamaskinen vil melde 
til enhver programmerer på ethvert nivå, og det er en 
øvelse for din gentleman-verdighet / ladylike-eleganse 
at du tar disse meldingene uten å rynke pannen.
  Fiks på hver linje inntil programmet funker. 
Forresten, skriv
  XO 
for å komme deg ut av F3. Det skulle jeg kanskje ha 
sagt før. Men det er særlig lurt når det er en 
skrivefeil, at programmet kastes ut av dataminnet, som 
og/sa er RAM, og dette kalles også, knyttet til dette 
språket, for RAM-REFRESH, og det skjer automatisk når 
programmet lukker seg ELLER at du skriver XO når du er 
inne i F3. 
  Så hvis det er en skrivefeil, vil programmet enten 
gjøre at maskinen må skrus av og på, og det kan ta en 
hel del tid, eller -- mer normalt -- det vil bli en 
feilmelding, enten en som knytter seg til et linjenummer 
eller en som bare gjør at programmer slutter uventet --  
og hvis du får en pen og pyntelig melding med 
linjenummer, det er da du skal taste XO, og presse 
linjeskift. Så starter du F3 igjen, og skriver den 
vanlige
  :SUPERBT B9 
der du hopper til den aktuelle linje -- kanskje med 
CTR-J -- særlig når programmet er langt og du får en 
melding om at noe underlig skjer på linje 235 eller 
lignende.
  Denne opplevelsen av hvordan takle feil er så viktig 
å bli vant med at hvis du gidder, sleng inn noen 
skrivefeil med vilje for å lære deg å takle det!
Eller, hvis du var så heldig at du hadde noen 
skrivefeil med en gang, slipper du å legge dem inn med 
vilje. Du ser, uansett hva du gjør når du 
programmerer, lærer du av det, hvis du gir 
oppmerksomhet til det. Akkurat som i livet.
 
 
 
 
 
 
 
 
 
 
 
*** 
Noen ville kanskje mene -- et høyst diskutabelt 
synspunkt, etter min mening -- at vårt fantastiske 
spill ikke er ferdig ennå. At vi burde utvikle det 
videre. At det er noe ved spill som innebærer denne 
merkelige oppfinnelse som heter BEVEGELSE. Jaja, vi får 
gå videre, da.  
  Jeg har sett spill der man må utnevne seg enten til 
nybegynner, en smule viderekommende, eller 
ultra-ekspert. Og for alle andre enn ultra-eksperten, er 
det ikke den samme gleden ved å score poenger. Jeg 
synes vi skal gå rett på sak og lage et mer universelt 
opplegg. Vanskelighetsgraden ved dette spillet kan 
simpelthen knyttes til hastigheten. Man er nødt til å 
være rask med fingrene hvis hastigheten er stor for at 
spillomgangen skal ha nok varighet til at man kan samle 
mange poenger -- vi skal sørge for en slik mekanisme.
  Men aller først, la oss legge et eller annet inn i 
rammen, slik at den ser en smule mer tiltrekkende ut. 
Kanskje et ord eller to. I neste avsnitt skal vi arbeide  
litt med bevegelse, jeg har noen ideer, det blir nok 
endel linjer som må legges inn men kommer vi oss 
gjennom disse, er vi godt igang med å få kontakt med 
F3 språket som helhet, og det blir enkelt å få 
bevegelsen inn i vårt oppkommende 2D spill SUPERBT.
  Friskt mot, opp med   :SUPERBT  B9   igjen og, med 
blikket festet klart mot målet om å gjøre deg kjent 
med ord og uttrykk og fraser i F3 gjennom repitisjon, og 
med mindre fokus akkurat nå på analytisk forståelse, 
tast inn disse ekstra linjene, slik at det nye, utvidete 
programmet blir som følger (de 4 første linjene er 
kommentarfelt, inne i }* .. }*, og syntaksen der
vil ikke bli forsøkt dekodet av maskinen -- pass på å  
finne frem krølleparentes-tegnet }, heller enn det 
vanlige parentes-tegnet, ellers blir det snodige 
meldinger fra F3 om at det hele er litt vanskelig å 
tyde. F3 er enkel i hva den godtar, og denne enkelheten 
er en del av utviklingen når du skal oversette noe 
fra den dansende meningshorisonten til levende sinn og 
oversette til det som gir mening for maskin, for å si 
de slik:
}* SUPERBT.TXT -- SUPREME FAST LEARNING OF F3       }* 
}* BY SUPREMELY SIMPLE FUN 2D GAME-MAKING.          }* 
}* THIS PROGRAM IS YOGA4D.ORG/cfdl.txt              }* 
}* REDISTRIBUTABLE (FROM B.A.BOOKLET BY A.T. 2010)  }* 
(LET BEAUTIFUL-CONTENT-OF-FRAME BE (( )) 
  (( 
    (( :@@@@@@@@SUPERBT!!! ; 120 ; 150  
      => B9-POP )) 
    (( :@@@FIGHT_WELL! ; 120 ; 200  
      => B9-POP ))
    (( :@@@SCORE_MUCH! ; 120 ; 250  
      => B9-POP ))
   )) OK)
(LET SUPERBT BE (( )) 
  (( 
    (( GJ-ON ))
    (( 100 ; 100 ; 400 ; 400 ; 1  
      => RECT )) 
    (( BEAUTIFUL-CONTENT-OF-FRAME )) 
    (( A-KEY ))
    (( GJ-DONE ))
  )) OK)
(LET AUTOSTART BE SUPERBT OK) 
  
 
 
 
 
 
 
 
 
 
 
*** 
Du vet kanskje -- hvis du ikke vet det, vet du det snart  
-- etter du har lest denne setningen, mener jeg -- at 
Sherlock Holmes var av den oppfatning, slik den ble 
uttrykt til Dr Watson, at det var ofte de uviktige 
sakene som var mest interessante og lærerike. Slik er 
det også med programmering. Legg mål-middel tenkning 
til side, akkurat når du lærer Lisa GJ2 Fic3, verdens 
beste programmeringsspråk, og skru på den lekende 
holdning, som ubekymret og selvsikkert danser med dette 
hav av merkelige symboler. Se etter snodige fiffigheter, 
merk deg pussige kombinasjoner. Denne leken er ekstremt 
nyttig men la ikke nyttegraden være av bekymring -- 
bortsett fra, et sted i bakhodet eller i magefølelsen, 
kan det være greit å ha arkivert at du blir smartere, 
penere, flinkere, mer kreativ, mer intuitiv, mer 
analytisk, morsommere, og i det hele tatt bedre anlagt 
til å få mer ut av hver dag og flinkere også i 
business, ved å arbeide med Lisa GJ2 Fic3, eller F3, 
som vi sier som forkortelse. Det styrker din nerver, det 
gir en kontakt med essensideer om harmoni, og i denne 
verden er mind-over-matter en realitet, så dermed 
påvirker det også ditt utseende. Derfor, legg 
mål-middel tenkning vekk. Det er ingenting mer egnet 
som middel til all verdens interessante mål, på lang 
sikt, enn at du vekker opp din F3 nerve.
  Vi må ha noe inn knyttet til hastighet, altså. Jeg 
tror at vi skal gi litt meldinger i ny og ne, under den 
firkanten, og etter at meldingen har vært avlevert, 
skal den utviskes slik at skjermen er pen og blank og 
fin. Dette er egnet til å gi litt ekstra tanke helt i 
begynnelsen. Du la kanskje merke til at (LET .. OK) 
samlet en beskrivelse av SUPERBT i den første versjonen 
vi hadde av programmet: og at i den siste, finner vi 
ogs/ en (LET .. OK) høyere opp i programmet. Denne har 
et langt navn med binde-streker imellom, noe fleipende, 
og det er akkurat slike navn vi gjerne bruker her når 
vi vil understreke at akkurat dette elementet -- til 
forskjell fra f.eks. B9-POP, som er et innebygget ord 
for å skrive ut på skjermen (poppe ut i B9-fonten 
min), -- akkurat dette lange elementet med morsomt navn 
og mange bindestreker er totalt selvvalgt. Du kan skrive 
akkurat hva du vil der, bare det ikke har mellomrom i 
seg, og ikke for mange underlige tegn -- hold deg til 
ABCDEFGHIJKLMNOPQRSTUVWXYZ og 0123456789 stort sett.
  Men hvis du bytter ut navnet med noe annet, gjør det 
systematisk. Bytter du ut navnet der, bytter du det 
navnet ut på akkurat samme måte alle andre steder i 
programmet. Der kan CTR-F (eller funksjonstasten F4) 
hjelpe deg med å søke frem alle forekomstene -- når 
du har et program over flere sider, og CTR-L gjentar 
siste leting etter noen bokstaver (der CTR-U velger 
av/på når det gjelder Uppercase-test, slik at normalt 
vil programmet gi blaffen i om ordet er skrevet med 
store eller små bokstaver, men noen ganger betyr det 
mye å kunne differensiere og da kan du presse CTR-U 
før første gang du søker).
  Så, for å klare hjernen med hensyn til vår neste 
utvikling, la oss late som om programmet allerede har 
denne funksjonen med at hastigheten kan angis, og la oss 
sørge for -- på en måte som vi kan lett bruke senere 
og/sa -- skrive en fin melding under rammen, som om vi 
var kommet mye lengre i programmeringen. Igjen, bare la 
gjentagelser være måten du lærer på, la de ord som 
gir mening gi mening, men la ikke de ord hverken i 
programmet eller i det jeg sier i disse avsnitt være 
til bekymrning hvis de ikke gir full mening de første 
gangene du arbeider med dette bokhefte. Etterhvert blir det 
lekende og lett. Og det vil alltid være noen 
formuleringer som er så tvetydige at de ikke vil gi 
total enkel mening uansett hvor mye du har arbeidet med 
F3.
  Brett opp skjorten, arbeid med å få SUPERBT.TXT, 
gjennom kommandoen   :SUPERBT  B9   tastet inn, til å 
bli ganske nøyaktig, men ikke nødvendigvis helt 
nøyaktg, dette følgende.
  Vet du hvordan du kan kopiere ditt eksisterende, 
velfungerende program over til et annet navn, eller over 
til en midlertidig lagringsplass? Kan være greit å 
finne ut etterhvert. Noen ganger føles det lettere å 
gå videre med eksperimentative endringer av et program 
når du vet at du alltids kan gå tilbake til den 
versjonen som fungerte bra for noen minutter siden bare 
ved å flytte en fil eller skifte dets filnavn.
Bare ville nevne det. Backups er programmererens venn. 
  I det neste program brukes krøllete parentes -- den 
som ser slik ut: } 
  Du vet kanskje at hvert tastatur har tre typer 
parenteser: 
  (vanlig parentes)
  [hakke-parentes.] 
  ækrølle-parentes.}
  Skal du gi en melding til spilleren eller brukeren -- 
interaktøren, hva vi nå enn kaller den smilende, søte 
personen som arbeider med ditt program -- deg selv!? -- 
som inneholder mellomrom, f.eks. en setning, trenger vi 
å fange opp hele setningen. Hvis det bare er et ord, 
eller et uttrykk uten mellomrom, så som @@@@SUPBERT!, 
holder det med et kolon foran. Du ser kanskje i 
programmet det står noe slikt som :@@@@SUPBERT der.
  Men hvis vi skal gi en hel setning, m} vi bruke en 
annen metode, en som forteller hvor begynnelsen er, og 
hvor setningen fullføres, slik at datamaskinen vet hvor 
den skal se etter den neste kommando. Vi vil jo 
forhindre at den forsøker å dekode en engelsk setning 
som om det var en F3 kommando. Du har allerede sett 
kommentarer, }* dette er kommentarer }* og du vil nå se 
at }en setning kan legges inn slik}. Hvis den hadde hatt  
f.eks. den lave streken (hyphen) istedenfor mellomrom 
kunne du lagt den inn slik: 
  :strek_setninger_kan_legges_inn_slik 
Når setningen er lagt inn, er den tilgjengelig 
for F3 kommandoer, slik som B9-POP. Du kan legge inn 
flere setninger på toppen av hverandre, som en haug av 
noe på et bord -- der det du legger på toppen av
haugen (the stack) blir det som plukkes først av F3. 
Bare nevner dette i farten, ikke viktig akkurat nå.
Her er den neste versjon av programmet: 
 
}* SUPERBT.TXT -- SUPREME FAST LEARNING OF F3       }* 
}* BY SUPREMELY SIMPLE FUN 2D GAME-MAKING.          }* 
}* THIS PROGRAM IS YOGA4D.ORG/cfdl.txt              }* 
}* REDISTRIBUTABLE (FROM B.A.BOOKLET BY A.T. 2010)  }* 
(LET WIPE-CLEAR-GAME-MESSAGE-AREA BE (( ))
  ((
    (( 1 ; 500 ; 1024 ; 760 ; 0 => RECTFILL )) 
  )) OK) 
(LET TELL-SOMETHING-GOOD BE (( ; ))
  ((  
    (( ; 120 ; 550 => B9-POP ))
  )) OK) 
(LET TELL-SOMETHING-GOOD-SECOND-LINE BE (( ; ))
  ((  
    (( ; 120 ; 600 => B9-POP ))
  )) OK) 
(LET TELL-SOMETHING-GOOD-THIRD-LINE BE (( ; ))
  ((  
    (( ; 120 ; 650 => B9-POP ))
  )) OK) 
(LET BEAUTIFUL-CONTENT-OF-FRAME BE (( )) 
  (( 
    (( :@@@@@@@@SUPERBT!!! ; 120 ; 150  
      => B9-POP )) 
    (( :@@@FIGHT_WELL! ; 120 ; 200  
      => B9-POP ))
    (( :@@@SCORE_MUCH! ; 120 ; 250  
      => B9-POP ))
   )) OK)
(LET GET-A-WONDERFUL-SENSE-OF-TIMING BE (( )) 
  ((
    (( }Dear master of this game!} => 
      TELL-SOMETHING-GOOD ))
    (( }Please press lineshift, wait a little,} =>
      TELL-SOMETHING-GOOD-SECOND-LINE ))
    (( }and press it again, to indicate game speed.} => 
      TELL-SOMETHING-GOOD-THIRD-LINE ))
    (( A-KEY ))
    (( A-KEY ))
    (( WIPE-CLEAR-GAME-MESSAGE-AREA ))
    (( }Thanks! Lineshift to begin} =>
      TELL-SOMETHING-GOOD ))
    (( }Have courage! Be brave! Win win win!}
      TELL-SOMETHING-GOOD-SECOND-LINE ))
  )) OK)
(LET SUPERBT BE (( )) 
  (( 
    (( GJ-ON ))
    (( 100 ; 100 ; 400 ; 400 ; 1  
      => RECT )) 
    (( BEAUTIFUL-CONTENT-OF-FRAME )) 
    (( GET-A-WONDERFUL-SENSE-OF-TIMING )) 
    (( A-KEY ))
    (( GJ-DONE ))
  )) OK)
(LET AUTOSTART BE SUPERBT OK) 
  
Husk at du kan bruke CTR-C .. CTR-C og deretter CTR-V 
for å kopiere lange ord, slik at de blir presist, på 
prikken, uten en bokstav endret. Lange ord -- et "ord" i 
F3 sammenheng betyr omtrent hva som helst som ikke 
begynner med et tall og som ikke har mellomrom i seg. 
Komplett identitet er viktig i programmering. Denne 
firkantetheten skjerper hjernen, gir bedre forståelse
av forskjell på hva et ord betyr, og hvordan det 
skrives, og alt slikt.
  Husk at dette programmet taler mer enn det gjør, i 
dette avsnittet. Programmet er ganske overraskende 
villig til å ta imot timing -- men det er bare 
tilsynelatende. Selve timing-greia, der vi skal innføre 
en ny og vidunderlig størrelse som heter "variabler", 
som beskrives gjennom formen ((DATA .. )), i neste 
avsnitt -- den timing-dingsen er ikke på plass akkurat 
i dette avsnittet. Men programmet later som om den er 
på plass, for å inspirere til tenkning, for å få en 
følelse av hvor vi skal gå hen med det.
  Dette ordet A-KEY dukker opp stadig. Det betyr: la F3 
vente med videre utføring av akkurat dette programmet 
inntil f.eks. linjeskift eller en annen tast (a key) is 
pressed. Denne er grei når en melding er gitt, og hva 
som helst av vanlige taster kan presses for å gå 
videre. Men når vi trenger mer nøyaktig avlesing av 
tastaturet, det våre seg for timing eller for mer 
konkret informasjon, har vi andre ord -- dvs., andre 
kommandoer, og jeg kan -- bare for gjentagelsens skyld, 
for at disse ord skal bli del av det vi gjør oss kjent 
med, uten at jeg forklarer dem her, nevne at blant disse 
mer presise kommandoer er KEY, KEYNUM, KEYTOUCH, og for 
hele linjer, B9-READLN. Det er noen flere også når vi 
ikke klarer oss med bokstav- og tall-staturet men må bruke 
funksjonstaster så som F1 og F12 (bl.a. FKEYNUM). Og 
når vi skal lage noe som avleser musepekerens posisjon 
trenger vi ord som SHOWMOUSE eller FEET, UNSHOWMOUSE 
eller FT (disse er synonymer), i tillegg til MOUSEXY og 
MOUSECLICK og slikt -- jeg skriver dette nå etter 
hukommelsen, men i praksis sjekker jeg f.eks. med 
manualen eller med noen av mine veldig mange tidligere 
programmer når jeg bruker slike ord, slik at det ikke 
blir alt for mye av en ren hukommelses-prøve. Men det 
er greit å ha en anelse om hvilke ord som finnes, før 
man leter etter dem.. ;)
  I dette 2D programmet skal vi klare oss med 
bokstav-tastaturet, det er lett for deg, hvis du fikser 
etterhvert en bra forståelse av dette program, å 
begynne å leke med musepeker-program f.eks. ved å 
studere noen av de innebygde programmer i F3-pakken, 
og raskt utvikle forståelse. For alt i F3 er bygget 
over samme lest. Forstår du hovedessensene, kan du 
arbeide stort sett med hvilken som helst del av F3 helt 
enkelt.
  I neste avsnitt vil programmet faktisk klare å fange 
opp timingen, ved at vi innfører en variabel som vi 
kaller for TICKET -- ordet er inspirert av ideen om at 
en klokke "tikker", f.eks. en gang hvert sekund, og at 
denne "tikkingen" i dette spill har noe å gjøre med en 
slik tick. Vi skal ogå bruke ordet til å lage en slags  
aperitif, et lite glimt, for å få spilleren til å bli  
kjent med den timingen som spilleren velger -- og dette 
gir oss samtidig en sjanse til å sjekke om vi fikk 
dette til sånn noenlunde bra.
 
 
 
 
 
 
 
 
 
 
 
 
*** 
øvelse gjør mester. Sleng inn disse utvidelsene når 
orker, og se frem til å teste programmet. Hvis det ikke 
fungerer, vær ubekymret. Let etter tullete småfeil. En  
liten endring av semikolon til kolon eller omvendt, et 
for mye mellomrom det det overhodet ikke skal være noe 
mellomrom -- alle slike syntatiske småting er det som 
er nuts and bolts for datamaskinen. Det er her det 
menneskelige sinn strekker seg langt, langt utover det 
et slikt enkelt F3 program er: men nettopp i denne 
kontrast, er det et hav av innsikt å hente. 
Datamaskinen smiler til deg så snart du har syntaksen 
rett, og programmet er vel gjennomtenkt -- den tilgir 
absolutt alt, fort, så snart du har rettet opp feilene. 
Den bærer ikke nag. Den er, i en viss forstand, en sann  
meditatør. Men den levende intelligens krever ikke 
syntaks av denne type for forstålelse. Dermed føler du 
også mestring, du lar maskinen jobbe for deg, med dine 
instruksjoner, mens du lener deg tilbake og iakttar hva 
det er du har satt igang. Dette er en lekestue som gir 
deg en sinnsro som er god, så lenge som du husker på 
at mennesker er når seg uendelig rike sammenlignet med 
slike spørsmål om syntaks. Det er også av denne grunn 
jeg har lagt inn en skrivefeil allerede i overskriften 
av mine ukentlig-eller-oftere økonomiske kommentarer, 
der det står -- "can contacted at" -- heller enn "can 
be contacted at", og at jeg generelt aldri retter feil 
dersom det er lesbart og forståelig for levende sinn. 
Dette er en frihet som det er ekstra deilig å ta seg 
når du samtidig har en pekepinn om hva riktig 
skrivemåte er.
  Her er neste versjon. Husk backup av forrige, hvis du 
gidder.
  Denne har stadig ingenting av selve spillet, men den 
har hyggelige meldinger, som slettes (RECTFILL), og den 
har en god del tall som ikke er annet enn 
plasseringstall på skjermen -- horisontalt er det 1024 
punkter, og loddrett 768 punkter. B9-POP skriver ut på 
betingelse at du slender inn to slike tall, vannrett 
1..1024 først, deretter vertikalt 1..768. RECTFILL 
fyller et rektangel fra x1 y1 til x2 y2 der x1 y1 er 
starten av øvre venstre hjørne, normalt, mens x2 y2 er 
nedre høyre hjørne, og x er bokstaven vi noen ganger 
bruker for uformelt å snakke om den vannrette mengden 
punkter, y den loddrette mengden punkter. Det spiller 
ingen rolle nå å forstå noe av dette, jeg bare ville 
ha nevnt at disse tallene er bare en veldig valgfri 
plassering av tekstene her og der på skjermen.
  Vi skal snakke mer om det som det er viktig å snakke 
om, bare la de kommentarene jeg kom med gli inn i 
bakgrunnen av ditt sinn. Du har full mestring av hvert 
trinn simpelthen ved å få dette programmet tastet inn, 
testet det, ved   :SUPERBT IN   og rettet det hvis du 
har skrevet det annerledes enn det står her. Det kan 
tenkes at det er kommet inn noe feil i denne boken men 
dette har jeg sjekket ganske grundig for hver gang jeg 
har satt inn programmet. Skulle det være noen 
kopieringsfeil fra min side, som ikke er fanget opp 
innen heftet trykkes, vil det trolig ikke være verre enn 
at det er skrevet riktig i neste avsnitt igjen. Husk 
også at hvis du bruker B9 til å rette på disse 
programmene, bruker du et program som bruker ALLE disse 
funksjonene hele tiden, og det tyder på at din F3 
virker helt fantastisk bra. Ha derfor lite bekymring, 
bare rett på programmet til det fungerer. Hvis selv 
etter nitidig sammenligning med det som står her i 
heftet det ikke virker, i dette kapittel, ta for deg 
programmet i neste kapittel (eller avsnitt, for å være 
mer presis), og skriv det inn langsommere, fra 
begynnelsen. Er det en bokstav du konsekvent taster 
feil, eller et tegn? Ta deg tid, rett, du skal få det 
til, og alt slikt ekstra arbeid med programmet gir 
ekstra hukommelse av hvordan lage programmer i F3, slik 
at du kan lage programmer hurtigere i fremtiden. Altå 
er det ikke noe bortkastet tid med dette.
  Husk: For å sette inn blanke linjer, plasser 
tekst-markøren på linjen over, og press CTR-Y fulgt av 
antall linjer du vil sette inn, deretter linjeskift! 
(Eller CTR-R for å fjerne 1 eller flere linjer.) 
  It's a bit much to type in, please spend the extra 
time you need to get it really, really accurate. I 
promise this is what your learning process wants; and 
there are masses of things to pick up from this
program, and which the subconscious part of your mind, 
even if you are a beginner in this, is already
sorting out and analysing and all that. So it is worth 
spending time with. The understanding will come, 
by various activities we engage in together 
in the upcoming paragraphs, and by your own 
further playing along with examples and manual 
and other books on your own later on. All this 
works together. So DO please spend time with this 
-- to get it up in your own B9 session, and to 
test it. Good luck! IT'LL TAKE TIME -- but then 
you'll get SO near a real game, it is just urging you 
on automatically. I'll give some quick comments  
in the beginning of the next paragraph about  
what some of the new features are all about, to 
make the learning of it all come faster. Now, here:
}* SUPERBT.TXT -- SUPREME FAST LEARNING OF F3       }* 
}* BY SUPREMELY SIMPLE FUN 2D GAME-MAKING.          }* 
}* THIS PROGRAM IS YOGA4D.ORG/cfdl.txt              }* 
}* REDISTRIBUTABLE (FROM B.A.BOOKLET BY A.T. 2010)  }* 
((DATA TICKET )) 
(LET WIPE-CLEAR-GAME-MESSAGE-AREA BE (( ))
  ((
    (( 1 ; 500 ; 1024 ; 760 ; 0 => RECTFILL )) 
  )) OK) 
(LET WIPE-CLEAR-GAME-BOARD-AREA BE (( >N1 ))
  ((
    (( 101 ; 101 ; 399 ; 399 ; N1 => RECTFILL )) 
  )) OK) 
(LET TELL-SOMETHING-GOOD BE (( ; ))
  ((  
    (( ; 120 ; 550 => B9-POP ))
  )) OK) 
(LET TELL-SOMETHING-GOOD-SECOND-LINE BE (( ; ))
  ((  
    (( ; 120 ; 600 => B9-POP ))
  )) OK) 
(LET TELL-SOMETHING-GOOD-THIRD-LINE BE (( ; ))
  ((  
    (( ; 120 ; 650 => B9-POP ))
  )) OK) 
(LET GET-A-GOOD-TICKET-TO-RIDE BE (( )) 
  ((
    (( 100000 TICKET <<ASSERT ))
    (( 1,000,000,000 => RICH
      (COUNT
        (( KEYTOUCH
          (MATCHED
            (( N1 TICKET <<ASSERT ))
            (( RMS RMS ; EXIT ))
          MATCHED) ))
      COUNTUP) ))
  )) OK)
(LET USE-THE-TICKET-TO-TRAVEL-FAR BE (( )) 
  ((
    (( TICKET >>>
      (COUNT
        (( N1 => >N1 ))
      COUNTUP) ))
  )) OK)
(LET BEAUTIFUL-CONTENT-OF-FRAME BE (( )) 
  (( 
    (( :@@@@@@@@SUPERBT!!! ; 120 ; 150  
      => B9-POP )) 
    (( :@@@FIGHT_WELL! ; 120 ; 200  
      => B9-POP ))
    (( :@@@SCORE_MUCH! ; 120 ; 250  
      => B9-POP ))
   )) OK)
(LET GET-A-WONDERFUL-SENSE-OF-TIMING BE (( )) 
  ((
    (( }Dear master of this game!} => 
      TELL-SOMETHING-GOOD ))
    (( }Please press lineshift, wait a little,} =>
      TELL-SOMETHING-GOOD-SECOND-LINE ))
    (( }and press it again, to indicate game speed.} => 
      TELL-SOMETHING-GOOD-THIRD-LINE ))
    (( A-KEY ))
    (( WIPE-CLEAR-GAME-MESSAGE-AREA ))
    (( GET-A-GOOD-TICKET-TO-RIDE ))
    (( WIPE-CLEAR-GAME-MESSAGE-AREA ))
    (( }Thanks! Lineshift to begin} =>
      TELL-SOMETHING-GOOD ))
    (( }Have courage! Be brave! Win win win!}
      TELL-SOMETHING-GOOD-SECOND-LINE ))
  )) OK)
(LET SHOW-FUN-AT-FOUR-TIMES-THE-SPEED BE (( )) 
  (( 
    (( TICKET >>> ; ))
    (( ; TICKET >>> ; 4 => DIV 
      TICKET <<ASSERT ; ))
    (( ; 3
      (COUNT
        (( 191 => WIPE-CLEAR-GAME-BOARD-AREA )) 
        (( }*YOU ARE ELECTRIC!*} ; 110 ; 350 => B9-POP ))  
        (( USE-THE-TICKET-TO-TRAVEL-FAR )) 
        (( 191 => WIPE-CLEAR-GAME-BOARD-AREA )) 
        (( }*EEEELLLECTRIC!!!*} ; 175 ; 250 => B9-POP ))  
        (( USE-THE-TICKET-TO-TRAVEL-FAR )) 
        (( 191 => WIPE-CLEAR-GAME-BOARD-AREA )) 
        (( }*ELECTRICITY!*} ; 220 ; 110 => B9-POP ))  
        (( USE-THE-TICKET-TO-TRAVEL-FAR )) 
        (( 128 => WIPE-CLEAR-GAME-BOARD-AREA )) 
      COUNTUP) ; ))
    (( ; TICKET <<ASSERT ))
  )) OK)
(LET GET-ON-WITH-THE-GAME BE (( ))
  (( 
    (( A-KEY ))
  )) OK)
(LET SUPERBT BE (( )) 
  (( 
    (( GJ-ON ))
    (( 100 ; 100 ; 400 ; 400 ; 1  
      => RECT )) 
    (( BEAUTIFUL-CONTENT-OF-FRAME )) 
    (( GET-A-WONDERFUL-SENSE-OF-TIMING )) 
    (( SHOW-FUN-AT-FOUR-TIMES-THE-SPEED )) 
    (( USE-THE-TICKET-TO-TRAVEL-FAR )) 
    (( WIPE-CLEAR-GAME-MESSAGE-AREA ))
    (( GET-ON-WITH-THE-GAME ))
    (( GJ-DONE ))
  )) OK)
(LET AUTOSTART BE SUPERBT OK) 
  
  
 
 
 
 
 
 
 
 
*** 
Have you got it work? Then, congratulations! You see 
that once we have got timing in, or duration as it also 
can be called -- the word 'duration' is quite intense in 
meaning if you go to philosophical writings, by the way 
-- once we got such stuff in, anyway, it starts getting 
having a sense of life to it.
  That is to say, if you spend a little time getting the  
timing right. You just have to experiment, get the knack  
of it. I tried out a couple of alternatives before I 
decided on knocking off three-quarters of the pause when 
I put those 'you are electricity' joke texts raising 
upwards, to the right, inside the board area, three 
times. For if they are so slow that one starts getting a 
bit irritated at their slowness, then one is not giving 
the pep the game ought to give to the person who is 
about to play. So this is about tuning of timing.
  I'll briefly comment on various features so that you 
can easier pick up more and more understanding of what 
is going on, forming your own concepts, getting your own 
idea of what this programming is all about. 
  But let me say something practical: since the program 
is now getting into considerable amount of lines, I am 
going to discipline myself from next paragraph and 
onwards, and group each change of the program inside a 
commentary line about like this:
  }* ****NEW PART OF PROGRAM FOLLOWS HERE:***** }*} 
  .. 
  .. 
  }* ***NEW PART OF PROGRAM ABOVE HERE**** }* 
  Hopefully, there will be just one or a few such parts 
each time. That includes both new lines, and changed 
lines. You'll have good use of CTR-Y to insert lines and 
sometimes CTR-R to remove lines just in those sections, 
in other words, to progress from one paragraph to the 
next, concerning your SUPERBT.TXT, 
  -- whoops, jeg gjorde det igjen, skriver på Engelsk 
når jeg skal skrive norsk. Jeg antar at du kan tilgi 
meg, og jeg lar det stå, akkurat som mine elskelige 
skrivefeil. Uansett, det jeg skulle til å si var at 
når du gjør disse endringene av din SUPERBT.TXT, pass 
på å lagre den forrige versjonen. Dermed, hvis det 
blir helt umulig skrullete feil når du prøver den nye 
versjonen, kan du alltids gå tilbake til den forrige 
versjonen, og legge til noen få linjer av gangen, 
langsomt, og se hvordan det går.
  Det er et ord -- COMPILEPAUSED og et annet, 
COMPILEPAUSEDALITTLE -- i tillegg til ordet 
VISIBLECOMPILATION -- som kan slenges inn i begynnelsen 
av ditt program om hele din PC plutselig slokner mens du 
kompilerer et program. Da vil du kunne se hvilken linje 
som programmet er kommet til, før PCen trenger reboot, 
-- COMPILEPAUSED er langsommere enn CompilePausedALittle 
-- og VISIBLECOMPILATION gjør at linjene vises, en 
etter en, mens syntaksen til hver linje du har skrevet 
blir gjort synlig. Flere slike ord står i manualen.
  Forresten har jeg ikke satt inn ordet LOOKSTK ennå. 
Det er en god ide, i neste utgave vil (( LOOKSTK )) 
stå her og der. Dette ord sjekker om det er tastet et 
tall utenfor (LET .. OK) som ikke er koplet til noe, som 
bare er blitt liggende, eller om det er skrevet den ene 
delen av et uttrykk, f.eks. (MATCHED, uten at den 
fullførende del av samme uttrykk -- f.eks. MATCHED) -- 
er tatt med. Da blir det liggende litt rot på "bordet" 
-- the stack -- og LOOKSTK eller "pls look at the stack" 
gir da en melding om hvilken linje som programmet 
befinner seg på, når ordet LOOKSTK står på den 
linje, hvis det er blitt noe liggende på toppen av 
bordet som antakelig ikke skal være der. Press Q eller 
q -- kanskje flere ganger -- for å avbryte 
gjennomgangen (kompileringen) av ditt program hvis det 
dukker opp en melding fra LOOKSTK. Den er formet en 
smule underlig, for ikke å virke for negativt hvis den 
skulle oppstå lenge etter at du har solgt programmet. 
Dette er usannsynlig men i noen få tilfelle tenkelig -- 
uten at det behøver å gjøre noe. Derfor er meldingen 
ikke helt opplagt noen feilmelding. Den lyder omtrent 
slik: "Hello, I just wanted to say hello!". Den gir 
også et linjenummer. Merk deg dette, forlat F3, gå inn 
i F3 igjen, hent opp SUPERBT.TXT, og press CTR-J og hopp  
direkte til denne linjen ved at du taster inn 
linjenummeret. Merk at CTR-J også kan brukes til å 
hoppe til begynnelsen av programmet simpelthen ved å 
presse linjeskift til svar. CTR-N hopper til slutten av 
programmet. CTR-S, som sagt, kan brukes for å lagre. 
Lagre ofte, når du gjør kompliserte endringer, og ta 
backup der du bruker andre filnavn eller putter filen i 
en midlertid folder, slik at du kan gå tilbake til 
tidligere versjoner dersom en feil blir med et stykke 
før du oppdager feilen. Alle programmere, uansett hvor 
super-ultra de tror de er, gjør hele tiden feil i 
programmering -- om ikke hele tiden, så nesten hele 
tiden. Det er noe man må ta som en del av moroa. 
Programmering i seg selv er litt som et spill. Et spill 
er ikke spill dersom alt er totalt lett uten den aller 
minste utfordring på noe punkt. Programmering er ALLTID 
fullt av utfordringer, men ved at du har egnete 
oppgaver, vil du oppleve mestring på hvert nivå, og 
dermed opprettholde gløden.
  Fargetonene i F3 er, bortsett fra 0 som generelt er 
bakgrunnsfargen, satt til komplett skinnende grønn, av 
den typen som gir rosa hvis du ser mot noe veldig lyst 
etterpå som "afterglow", og 1 som generelt er fargen 
som brukes til å skrive eller tegne mot denne 
bakgrunnen. Dette kan endres via noen variabler og 
funksjoner, men dette gjelder etter GJ-ON er startet, og 
du ser ordet GJ-DONE som brukes hver gang man har 
skrevet GJ-ON, og som avslutter programmet. Uten bruk av 
disse ord er det kun tekst man kan skrive, og da kan man  
ikke bruke slike ord som RECT og RECTFILL. GJ-ON er 
standard å bruke for alle spill som har det minste 
grafikk i seg. 
  Men fargene har en viss kompleksitet over seg. Hvis du  
skal gjengi et nydelig foto trenger du normalt litt mer 
enn helt lyst og helt mørkt. Da er 128..191 mer de tall 
du trenger. Alt nær opptil 191 inklusive 191 er lyst, 
og alt som er nær nedtil 128 inklusive 128 er mørkt 
eller sort. Dette brukes når brettet plutselig blir 
satt til sort -- til 128. Du ser   128 => ...
brukes i en funksjon i programmet -- den som heter noe 
med ..FUN-AT-FOUR-TIMES-THE-SPEED.  
  Ordene "funksjon" og "program" eller "program inne i 
programmet" er nærmest ensbetydende med hverandre og 
med ordet "definisjon", når vi snakker om F3 
programmering. Hver gang vi sier noe med (LET .. 
begynner vi å definere en ny funksjon, kan vi si, eller 
-- om vi fokuserer på den nye bokstav-rekken, som 
gjerne kan være lang og morsom -- et nytt ord.
  Når vi senere bruker ordet -- den står f.eks. på en 
linje for seg selv slik som (i et tenkt eksempel) 
  (( ..GOTTA-DO-A-LOT-OF-FUN ))
kan vi snakke om at vi "kaller på funksjonen". Dette 
kan gjøres ved at navnet på den skrives på en linje 
for seg uten noe (LET på samme linjen. Det kan også 
gjøres ved at den fores, i de tilfelle der den er laget 
på egnet måte, med tekst og eller tall eller noe 
slikt. Da brukes gjerne en pil, =>, men denne pil er en 
slags forklaring om hva vi mener, den kan droppes, og
jeg la merke til at jeg hadde glemt å skrive den minst 
ett sted når jeg lagde programmet. Og jeg puttet det
ikke inn etterpå, fordi dette er en slik frihet man 
har. 
  Normalt, hvis det ikke står noe inne i BE (( )) som 
følger etter (LET .., betyr det at funksjonen --  
"programmet inne i programmet" -- ikke er laget for å 
bli foret med noe tall eller tekst. Står det f.eks. et 
semikolon der, skal den gjerne ha en tekst. Står det
noe slikt som >N1 eller >N5 der, skal den gjerne ha et 
tall. Det kan også være flere ting den skal ha.
Semikolon gjør ingenting, akkurat som pil =>, og 
akkurat som (( og )), når disse står for seg selv.
Disse er bare konvensjoner som hjelper på leseligheten 
av programmet, og forenkler rettingen, og i det hele
tatt bidrar til skjønnheten ved det å programmere -- 
og skjønnhetsopplevelsen er praktisk nyttig, for
den gjør det langt enklere å finne ut hvor feil er 
(mao., noe som bryter med programmets eleganse).
  Hvis du ser opp til det ord som kommer etter 128 =>, 
vil du finne at (( >N1 )) står i den linjen der ordet 
først innføres -- defineres -- samme linje som det 
står (LET på. Uttrykket >N1 -- som kan våre maksimum 
>N11 -- betyr at tallet, i dette tilfellet 128, skal 
puttes inn i en midlertidig lagringsplass, nemlig N1. 
Hver gang, inne imellom (LET og OK) man bruker N1, 
generelt sagt, vil det inneholde 128 eller hva det nå 
enn er man bruker når man påkaller dette ordet. Hvis 
du kikker rundt omkring vil du se at akkurat samme ord 
brukes i forbindelse med 191 =>. Her ser du hvor nyttig 
det er med funksjoner -- med (LET .. OK) definisjoner. 
Istedenfor å ha en funksjon for å gjøre brettet helt 
lyst, og en annen funksjon for å gjøre det helt 
mørkt, har vi simpelthen brukt >N1 og N1 slik at vi kan 
variere fritt. 
  Gir disse kommentarer lite mening til å begynne med, 
les dem på nytt etter en eller to gangers 
gjennomarbeidelse av alt i dette bokheftet, med masse 
oppmerksomhet, og la det være stunder der du må sette 
viljen til for å fortsette, for det virker kjedelig, 
men gi da ikke opp! For det varsler enda større gleder 
på den andre siden, når du kommer det gjennom det 
kjedelig. Om du ikke har hast, legg inn litt ekstra 
gåturer, sov litt ekstra for hjernen plukker opp nytt 
tillært materiale under søvn og drømming, men arbeid 
litt hver dag slik at du opplever fremgang, akkurat som 
når du leser en lang, god tekst.
  Skal jeg kommentere mer nå om programmet i sin 
nåværende form bør jeg kanskje nevne denne (COUNT .. 
COUNTUP) tingen, og også veldig fort <<ASSERT. Den 
siste først: <<ASSERT forteller at vi skal ha lagret 
noe i en variabel. TICKET inneholder et gedigent tall, 
og hvilket tall blir gitt det via <<ASSERT.
  (COUNT .. COUNTUP) er en gjentagelse, en loop -- 
sløyfe. Hvor mange gjentagelser vites ikke alltid før 
begynnelsen av loopen. Da kan man bare skrive et altfor 
stort tall, men ikke bruk større tall enn to milliarder 
-- omtrent -- som er 2 med ni nuller etter, som kan 
skrives 2000000000 men som kan skrives, for synlighets 
skyld, ved en ekstra funksjon som fjerner kommaer, 
nemlig slik:  2,000,000,000 => RICH -- dette er greit 
f.eks. foran en loop, men ordet RICH bør ofte ikke 
puttes på innsiden i en loop (fordi på innsiden skal 
det være ikke noe unødvendig, for ikke å tynge 
datamaskinen).
  For større tall, kan de lagres som tekster -- 
såkalte "tekst-strenger" eller simpelthen "strenger", 
-- vi har sett eksempler på slike i }-parentes -- eller 
som -- i tilfelle de er lengre enn cirka 250 tegn -- som  
en serie med tall, der hvert tall angir hvilket siffer. 
Slike serier kan være rader i en matrise, for den 
som allerede nå skal se i manualen om slikt se blant 
annet RAM-PM for å lage matriser og %MAKE for å lage 
tallrekker, eller "arrays". En matrise er rader og 
kolonner, akkurat som skjermens punkter i x og y. 
Disse har ikke særlig andre begrensinger enn minnet 
for datamaskinen, som for skikkelige, ordentlige, 
ikke-for-store 32-bit datamaskiner består av endel 
millioner tilgjengelig matriseplasser. 
  En svær (COUNT .. COUNTUP) loop brukes for å finne 
ut hvor mye tid, omtrent, spilleren ønsker mellom hvert 
øyeblikk av endring av brettet. Straks linjeskift 
trykkes, vil KEYTOUCH gi et signal og (MATCHED .. 
MATCHED) vil avslutte loopen, da brukes RMS RMS EXIT, 
som gjerne er greit å ha sett allerede nå på et 
tidlig tidspunkt. EXIT brukes for å forlate en 
funksjon, og RMS RMS EXIT brukes for å forlate en 
funksjon dersom man er inne i en loop, som minimum 
opprydding, -- i situasjoner hvor man har mange 
mellomlagringer her og der kan det være flere ting, 
flere typer RM -- remove -- som skal skrives.
  Hvis brukeren mot all formodning ikke presser 
linjeskift selv etter et hav av tid slenger vi inn i 
tall likevel, inn i TICKET, derfor er det to stykker 
<<ASSERT der. Programmerere skal ofte tenke på slike 
underlige situasjoner, fordi programmer blir noen ganger 
brukt på måter som ikke er helt tiltenkt og det skal 
vise seg robust og ikke firkantet men smidig i slike 
situasjoner.
  Jeg synes vi skal komme oss lengre inn mot spillets 
essens. Vi må finne litt ut av hva det er som spilleren 
skal bevege, ha kontroll over, og hva det er spilleren 
skal bevege dette et-eller-annet i forhold til, og hvor 
score skal stå, og hvordan tastaturet skal brukes for 
å gi spilleren denne kontrollen. Jeg antar vi også 
bør skrive et sted på skjermen hvilke kontroller som 
gjelder. Hvis vi finner et ganske anonymt sted å skrive 
dette, behøver vi ikke slette det, spill-opplevelsen 
vil fremdeles være god. 
  Jeg merker selv at det er en gnistrende energi av 
stimulans for meg både med at et spill har en blinking 
ved seg, og ved at det er endel elementer som er helt 
firkantete -- harde kanter kan være stimulerende, at 
ikke alt er smurt ut til noe sirkulært. Denne følelsen 
er gjenspeilet også vet at jeg "tegnet" (i B9) starten  
(toppen av) websiden for Lisa, norskesites.org/fic3, 
ved hjelp av stjerner på tastaturet, -- skarpt 
atskilte, vanlige tekst-stjerner, -- som utgjør en 
helhet du SELV i ditt eget sinn, egen fantasi, setter 
sammen. Dette har å gjøre med det vi filosofisk kan 
kalle første-hånds programmering -- med å stimulere 
heller enn å simulere, heller enn å etterligne 
virkeligheten, med virkelighetens alle vakre myke 
overganger. Datamaskinen skal ha en kontrast også slik 
at vi husker at datamaskinen er en datamaskin, og at 
virkeligheten rundt er noe annet: dette er stimulerende, 
fordi det er, på sett og vis, ærlig. [[[Man kan 
argumentere for dypere nivåer av virkeligheten der det 
digitale eller datamaskiner i en dypere forstand spiller 
en vesentlig rolle, og med rette, men det er i seg selv 
ikke noe argument for at de datamaskiner vi i den 
manifeste hverdagen omgir oss med skal tilsludre 
virkelighetsopplevelsen, ikke sant? Det er et komplisert 
spørsmål men min egen intuisjon er i alle fall helt 
klar over at F3 i sine spill i denne manifeste 
virkelighet er akkurat det den bør være!!!]]]
  Her, dermed, neste versjon -- der alle nye elementer 
er å finne samlet med kommentar }* .. }* før og etter, 
som lovet, og du behøver selvsagt ikke inkludere disse 
linjene som inneholder akkurat denne beskjeden til deg 
-- alle linjer inne i programmet som begynner med }* og 
som slutter også med }* kan trygt utelates, fordi de er 
beskjeder til deg for å forenkle prosessen for å 
utvide SUPERBT.TXT fra forrige avsnitt over til den nye, 
utvidete SUPERBT.TXT i dette avsnitt, som har enda litt 
mer 2D spill-essens i seg (tilgi meg for at jeg legger:
inn en god del, men det er VIRKELIG mange repitisjoner 
her -- et hav av dem. Og hva er vel bedre for å 
lære nyansene i hva de ulike F3-ord betyr?  
  Merk at litt tegnes opp inne i det sorte spill-feltet 
men selve spill-bevegelsen kommer vi nærmere først
i avsnittet etter dette. Har du tastet det følgende
riktig, vil programmet straks avsluttes når du  
presser hvilken som helst bokstav eller linjeskift. 
Men det vil virkelig se mye mer ut som et spill. 
Og veien videre er forenklet av at vi har  
-- i denne versjon -- fått på plass noen  
funksjoner som gjør det lettere å få action,
selv om de her bare såvidt brukes. Altså, 
lykke til, ta deg tid, det er virkelig en 
god del -- se etter }* .. }* kommentarene 
som forteller hva som er nytt i dette avsnitt: 
}* SUPERBT.TXT -- SUPREME FAST LEARNING OF F3       }* 
}* BY SUPREMELY SIMPLE FUN 2D GAME-MAKING.          }* 
}* THIS PROGRAM IS YOGA4D.ORG/cfdl.txt              }* 
}* REDISTRIBUTABLE (FROM B.A.BOOKLET BY A.T. 2010)  }* 
((DATA TICKET )) 
(LET WIPE-CLEAR-GAME-MESSAGE-AREA BE (( ))
  ((
    (( 1 ; 500 ; 1024 ; 760 ; 0 => RECTFILL )) 
  )) OK) 
(LET WIPE-CLEAR-GAME-BOARD-AREA BE (( >N1 ))
  ((
    (( 101 ; 101 ; 399 ; 399 ; N1 => RECTFILL )) 
  )) OK) 
(LET TELL-SOMETHING-GOOD BE (( ; ))
  ((  
    (( ; 120 ; 550 => B9-POP ))
  )) OK) 
(LET TELL-SOMETHING-GOOD-SECOND-LINE BE (( ; ))
  ((  
    (( ; 120 ; 600 => B9-POP ))
  )) OK) 
(LET TELL-SOMETHING-GOOD-THIRD-LINE BE (( ; ))
  ((  
    (( ; 120 ; 650 => B9-POP ))
  )) OK) 
(LET GET-A-GOOD-TICKET-TO-RIDE BE (( )) 
  ((
    (( 100000 TICKET <<ASSERT ))
    (( 1,000,000,000 => RICH
      (COUNT
        (( KEYTOUCH
          (MATCHED
            (( N1 TICKET <<ASSERT ))
            (( RMS RMS ; EXIT ))
          MATCHED) ))
      COUNTUP) ))
  )) OK)
(LET USE-THE-TICKET-TO-TRAVEL-FAR BE (( )) 
  ((
    (( TICKET >>>
      (COUNT
        (( N1 => >N1 ))
      COUNTUP) ))
  )) OK)
(LET BEAUTIFUL-CONTENT-OF-FRAME BE (( )) 
  (( 
    (( :@@@@@@@@SUPERBT!!! ; 120 ; 150  
      => B9-POP )) 
    (( :@@@FIGHT_WELL! ; 120 ; 200  
      => B9-POP ))
    (( :@@@SCORE_MUCH! ; 120 ; 250  
      => B9-POP ))
   )) OK)
(LET GET-A-WONDERFUL-SENSE-OF-TIMING BE (( )) 
  ((
    (( }Dear master of this game!} => 
      TELL-SOMETHING-GOOD ))
    (( }Please press lineshift, wait a little,} =>
      TELL-SOMETHING-GOOD-SECOND-LINE ))
    (( }and press it again, to indicate game speed.} => 
      TELL-SOMETHING-GOOD-THIRD-LINE ))
    (( A-KEY ))
    (( WIPE-CLEAR-GAME-MESSAGE-AREA ))
    (( GET-A-GOOD-TICKET-TO-RIDE ))
    (( WIPE-CLEAR-GAME-MESSAGE-AREA ))
    (( }Thanks! Lineshift to begin} =>
      TELL-SOMETHING-GOOD ))
    (( }Have courage! Be brave! Win win win!}
      TELL-SOMETHING-GOOD-SECOND-LINE ))
  )) OK)
(LET SHOW-FUN-AT-FOUR-TIMES-THE-SPEED BE (( )) 
  (( 
    (( TICKET >>> ; ))
    (( ; TICKET >>> ; 4 => DIV 
      TICKET <<ASSERT ; ))
    (( ; 3
      (COUNT
        (( 191 => WIPE-CLEAR-GAME-BOARD-AREA )) 
        (( }*YOU ARE ELECTRIC!*} ; 110 ; 350 => B9-POP ))  
        (( USE-THE-TICKET-TO-TRAVEL-FAR )) 
        (( 191 => WIPE-CLEAR-GAME-BOARD-AREA )) 
        (( }*EEEELLLECTRIC!!!*} ; 175 ; 250 => B9-POP ))  
        (( USE-THE-TICKET-TO-TRAVEL-FAR )) 
        (( 191 => WIPE-CLEAR-GAME-BOARD-AREA )) 
        (( }*ELECTRICITY!*} ; 220 ; 110 => B9-POP ))  
        (( USE-THE-TICKET-TO-TRAVEL-FAR )) 
        (( 128 => WIPE-CLEAR-GAME-BOARD-AREA )) 
      COUNTUP) ; ))
    (( ; TICKET <<ASSERT ))
  )) OK)
}* ****NEW PART OF PROGRAM FOLLOWS HERE:***** }*} 
((DATA THE-SCORE )) 
((DATA PLAYERS-ROW-NUMBER )) 
((DATA PLAYERS-COLUMN-NUMBER )) 
((DATA TREASURE-ROW-NUMBER )) 
((DATA TREASURE-COLUMN-NUMBER )) 
((DATA USE-THIS-GREEN-TONE )) 
(LET EXPLAIN-TO-THE-GAMER-SOME-GAME-CONTROLS BE (( ))  
  (( 
    (( }GAME-CONTROLS:} ; 750 ; 100 => B9-POP )) 
    (( }    Y       F } ; 750 ; 125 => B9-POP )) 
    (( }  G   H} ; 750 ; 150 => B9-POP )) 
    (( }    B} ; 750 ; 175 => B9-POP )) 
  )) OK) 
(LET SHOW-THE-GAMER-HER-PRESENT-SCORE BE (( )) 
  ((
    (( }S C O R E >>>       } ;
      450 ; 300 => B9-POP ))       
    (( }S C O R E >>> } ; THE-SCORE >>>
      => CONCAT ; 450 ; 300 => B9-POP ))       
  )) OK) 
(LET BIG-PIXEL-HERE BE (( >N11 >N1 )) 
  (( 
    (( N1 ; 4 => MUL ;                                    
      97 => ADD => >N1 ))
    (( N11 ; 4 => MUL ;                                 
      97 => ADD => >N11 ))
    (( N1 ; N11 ; BRIDGE 4 ADD ;
      BRIDGE 4 ADD ; 191 => RECTFILL ))
  )) OK)
(LET GAMER-SYMBOL BE (( )) 
  ((
    (( PLAYERS-ROW-NUMBER >>> => >N1 ))                                  
    (( PLAYERS-COLUMN-NUMBER >>> => >N3 ))                      
    (( N1 => INC ; N3 => BIG-PIXEL-HERE ))
    (( N1 ; N3 => INC => BIG-PIXEL-HERE ))
    (( N1 ; 3 => ADD ;                           
      N3 => INC => BIG-PIXEL-HERE ))
    (( N1 => INC ;                           
      N3 ; 3 => ADD => BIG-PIXEL-HERE ))
  )) OK)
(LET TREASURE-SYMBOL BE (( )) 
  ((
    (( TREASURE-ROW-NUMBER >>> => >N1 ))                                  
    (( TREASURE-COLUMN-NUMBER >>> => >N3 ))                      
    (( N1 ; 3 => ADD ; N3 => BIG-PIXEL-HERE ))
    (( N1 => INC => INC ; N3 => INC => BIG-PIXEL-HERE ))
    (( N1 => INC ; N3 => INC => INC                            
      => BIG-PIXEL-HERE ))
  )) OK)
(LET GET-ON-WITH-THE-GAME BE (( ))
  (( 
    (( EXPLAIN-TO-THE-GAMER-SOME-GAME-CONTROLS ))
    (( THE-SCORE => SETBASIS )) 
    (( SHOW-THE-GAMER-HER-PRESENT-SCORE )) 
    (( 15 PLAYERS-ROW-NUMBER <<ASSERT )) 
    (( 5 PLAYERS-COLUMN-NUMBER <<ASSERT )) 
    (( 5 TREASURE-ROW-NUMBER <<ASSERT  )) 
    (( 15 TREASURE-COLUMN-NUMBER <<ASSERT )) 
    (( 191 USE-THIS-GREEN-TONE <<ASSERT )) 
    (( GAMER-SYMBOL )) 
    (( TREASURE-SYMBOL ))
    (( A-KEY )) 
  )) OK)
(LET SUPERBT BE (( )) 
  (( 
    (( GJ-ON ))
    (( }MY DEAR GAMER! You must be sure} ;
      10 ; 10 => B9-POP ))
    (( }that you don't get absolutely addicted} ;
      10 ; 50 => B9-POP ))
    (( }to me.  -- The program.  ENTER if you dare!} ;
      10 ; 90 => B9-POP ))
    (( A-KEY ))
    (( CLS ))
}* ***NEW PART OF PROGRAM ABOVE HERE**** }* 
    (( 100 ; 100 ; 400 ; 400 ; 1  
      => RECT )) 
    (( BEAUTIFUL-CONTENT-OF-FRAME )) 
    (( GET-A-WONDERFUL-SENSE-OF-TIMING )) 
    (( SHOW-FUN-AT-FOUR-TIMES-THE-SPEED )) 
    (( USE-THE-TICKET-TO-TRAVEL-FAR )) 
    (( WIPE-CLEAR-GAME-MESSAGE-AREA ))
    (( GET-ON-WITH-THE-GAME ))
    (( GJ-DONE ))
  )) OK)
(LET AUTOSTART BE SUPERBT OK) 
  
  
 
 
 
 
 
 
 
*** 
Forklaringer! Forklaringer! Forklaringer! 
  Eh? 
Vi vil ha forklaringer? 
  Aha, dere vil ha forklaringer? 
JA! 
  Javel, ja, nettopp ja, litt forklaringer skal dere 
få, mine kjære elever. Så fantastisk flott at dere 
vil ha forklaringer! Det er jo det som er lærerens 
drøm, at elevene trygler og ber om forklaringer, 
forklaringer, og atter mer forklaringer!
  La oss ta, mine kjære elever, INC. Det betyr 
INCrement. Altså legg til 1. Hvis det står 
  SOMETHING-OR-OTHER ... => INC => 
  Betyr det at vi øker verdien av dette, legger til en,  
men det betyr ikke at vi har lagret det der vi hentet 
det. Vi henter et tall frem, øker det. Dersom det står 
noe slikt som 
  THIS-OR-THAT .. => INC  HERE-AND-SOMEWHERE <<ASSERT 
derimot, vil vi lagre det nye, økte tallet -- i dette 
tilfelle i den tenkte variabel HERE-AND-SOMEWHERE. Hver 
gang vi bruker <<ASSERT for å lagre et tall i en 
variabel vil vi gjerne ha en ((DATA .. høyere opp i 
programmet (noe jeg selv ofte putter samlet på toppen, 
men det er ikke strengt tatt nødvendig). Vi ser f.eks. 
((DATA THE-SCORE )) eller noe lignende og dette er noe 
vi kan bruke til <<ASSERT. Men dersom vi skal legge 0 
inn som startverdi, kan vi skrive SETBASIS istedenfor å 
skrive 0 (null) og deretter <<ASSERT. Det er mange slike  
alternative skrivemåter, forkortelser, det er gjerne 
alltid mange måter å programmere på.
  Du der ja, hva spør du om? 
  Aha, du spør om hvorfor det er så mange mange 
setninger og vi enda ikke har noe spill. Ha! Men vi er 
jo nesten ferdig. Er vi ikke? Det blir litt klipping og 
liming av tekstlinjer, litt regning og tulling frem og 
tilbake, vi er straks der. Er det mange linjer? Hvis du 
leser en spennende novelle, og et mystisk skummelt 
mysterium er iferd med å løse seg, skuffer du gjennom 
mange sider uten at du sier: så mange sider det er! Du 
tar tyve sider og glemmer tiden litt og skulle ønsket 
at det var tre ganger så mange sider, for det gnistret 
med spenning. Men når du må slå opp hvert eneste ord 
i en ordbok, virker tyve sider nesten fantastisk mye. 
Det er her en lærer må si, kom igjen, bare repiter, 
glem detaljene akkurat nå, svett litt, slit litt, kom i 
kontakt med materien -- og den dag kommer nærmere at 
det slett ikke virker som mye, så lenge det er under et 
tusen linjer eller så.  
  Så bare lat som du forstår, lek med biter av 
forståelse, bygg fra disse bitene, forsøk ikke å 
tvinge deg til å si: enten forstår jeg alt sammen med 
en gang, eller så er det noe feil med verden eller meg. 
Slett ikke! Verden og du er fin og du har all grunn til 
å regne forstålse som noe som vokser for hver måned 
du har kontakt med dette. Anstrengelse! Gleden ved den 
uanstrengte anstrengelse! Noen protester? Ingen? Da går 
vi videre. 
  Men fikk du programmet til å virke? Det står noe om 
bokstav-kontroller, Y G H B, der Y er øverst, B er 
nedert, G til venstre, og H til høyre, og disse kan 
brukes til å flytte spillerens symbol, som er den greia 
som er ganske symmetrisk og fin. Under spillerens symbol  
skal vises nå, hvis du har tastet det hele inn riktig, 
en slags oppover-til-høyre rutete strek. BIG-PIXEL.. er 
den rutinen som lager dette her. 
  Du ser noe slikt som ... ; 4 => MUL ... og andre 
steder noe slikt som ... ; 3 => ADD. Istedenfor 3 => ADD 
kan man også skrive INC => INC => INC, altså legg til 
3. Istedenfor 4 => MUL kan man skrive TWICE => TWICE, 
altså ta det dobbelte to ganger.
  De 1024 ganger 768 pixler som utgjør den synlige 
skjermen er ganske bittesmå og finkornete. Noe av det 
morsomme med spill er å spille på fantasien, utfordre 
hjernen ved bevisst bare å lage et symbol -- av store 
firkanter. Derfor bruker vi en RECTFILL som har noen av 
disse 4 => MUL aller først, slik at alt sammen blir 
forsto/rret fire ganger. Vi legger til cirka 100 først, 
dette skyldes at spille-rammen -- brettet -- matrisen --  
kall den hva du vil -- er en sort flekk som begynner på  
piksel nummer x=100, y=100. Altså, kolonne 100, rad 
100. 
  Det er også en god ide å gi en velkomstskjerm, som 
forteller litt hva dette dreier seg om, før man er rett 
inne i selve programmet; og også en avskjedsskjerm, 
når man er ferdig. Dette er en god energi -- det pakker 
spill-opplevelsen sammen slik at den ikke flyter ut og 
inn i dagsbevisstheten når man skal gjøre andre ting 
etter at man har spilt. Og skulle man lage et program 
som ligner på et spill men som dreier seg om noe langt 
mer reellt er det viktig at velkomstskjermen har sagt 
ifra om dette, slik at man ikke begynner å tenke spill 
i en situasjon hvor det dreier seg om noen virkelige 
effekter. 
  Hvis du kikker på det programmet (inne i programmet) 
som heter noe med ..BIG-PIXEL.. vil du se at den henter 
et tall fra en variabel rett før RECTFILL kalles, dette 
er grønntonen, enten helt sort eller helt lysegrønn, 
kanskje. 
  Du ser, mer bestemt, linjen   
  USE-THIS-GREEN-TONE >>> => RECTFILL )) 
En av de vanskeligste tingene å huske på kanskje, som 
du bør gi noen ekstra sekunder til, inntil det fester 
seg grundig i hukommelsen, er at når du skal HENTE en 
verdi fra en variabel skal tre > brukes
  USE-THIS-GREEN-TONE >>> => RECTFILL  
mens når du skal lagre i den, skal <<ASSERT brukes, 
  191 USE-THIS-GREEN-TONE <<ASSERT  
-- og grunnen til at dette er vanskelig å huske er at 
det er lett å tenke seg at => er nok. Det ser ganske 
bra ut, men selve arbeidet med å hente ut en verdi dypt 
fra dataminnet er totalt annerledes for datamaskinen enn  
arbeidet med å legge en ny verdi inn dypt i dataminnet.  
USE-THIS-GREEN-TONE er bare navn på boksen. Innholdet 
skal enten HENTES MED >>> eller LAGRES MED <<ASSERT. 
Glemmer du å skrive >>> vil ofte veldig underlige ting 
skje, som kanskje ikke fanges opp til å begynne med. 
Det er her man må si: man lærer ved å gi 
oppmerksomhet til erfaring, til leking, man lærer ved 
øvelse, man lærer ved også å gå turer, tenke litt 
over det hele, sove på det, tenke over det.
  Flere forklaringer? Ja, kanskje noe med dette med å 
skrive ut score. Det er et ord der -- CONCAT -- og 
CONCAT er for tekster det ADD er for tall -- det dreier 
seg om å legge to og to sammen. Eller 1 og 1. Hvis du 
starter opp F3 og skriver
  512 512 ADD POP 
vil du antakelig få ut noe i nærheten av 1024. Dette 
er et eksempel på TEKSTMODUS av F3. Derimot, hvis du 
skriver
  512 512 CONCAT POP 
vil du antakelig få ut noe i nærheten av 512512. Og 
like lite som det gir mening å bruke ADD etter noen 
ord, gir det mening f.eks. å skrive
  :HELLO } YOUNG WORLD} CONCAT POP 
Da får du  
  HELLO YOUNG WORLD 
ut, etter at du presser linjeskift. Så POP brukes i 
tekstmodus, mens B9-POP med X og Y koordinater -- altså 
vannrett og loddrett hvilken pixel som skal brukes for 
begynnelsen av teksten -- skal brukes inne i grafiske 
spill og slikt (som alle starter med GJ-ON og slutter 
med GJ-DONE, mens tekstmodus-programmer slutter med 
RAM-REFRESH og trenger ingen begynnelse).
  Skal du skrive ut SCORE skal du først fjerne den 
tidligere score -- derfor det blanke feltet i den 
første B9-POP som skriver ut score. Deretter brukes 
CONCAT for at tallet for score legges inn på riktig 
plass, rett etter teksten, og en ny B9-POP sørger for 
at tallet kommer på plass. Du kan selvfølgelig 
kalkulere eller eksperimentere for å finne nøyaktig 
hvor tallet skal skrives ut istedenfor å bruke CONCAT, 
og det vil da virke bittelitte grann fortere, siden vi 
ikke skriver ut SCORE>>> på nytt hver gang, men jeg 
tror vi lar det stå. Litt enkelt skal det være, det er 
alltids muligheter for å få ting fortere senere der 
det trengs. Som regel er datamaskinen rask nok hvis vi 
bare tenker oss litt om. Dessuten behøver vi ikke 
skrive ut SCORE hele tiden -- bare hver gang den endres.
  Ordet CLS -- clear screen -- det fjerner teksten som 
står over. Husket jeg selv på det med en gang? Nei. 
Hver gang jeg legger ut et program her har jeg alltid 
vært noen runder frem og tilbake, men jeg tror på at 
læringen er størst ved at det programmet som står her 
til enhver tid er ganske velfungerende, for det er mange  
nok muligheter for at det blir tastefeil hvis du skriver  
litt fort, og da er det greit at du har en mal.  
   
 
 
 
 
 
 
 
 
*** 
Har jeg ikke sagt det før, er det jammen på tide å 
få det sagt nå: du kan eksperimentere med en god del 
av funksjonene direkte uten å lage noe program som du 
lagrer og henter inn. 
  Jo, jeg HaR sagt det før. Se lenger opp, der vi 
snakket om CONCAT.
  Du kan bruke F3 også som regne-maskin. Dette kan 
også være en måte å lære deg hvordan tenke på 
dette som vi kaller "stacks", hauger av data som ligger 
klart til bruk for funksjonene, der det vi legger til 
sist er det vi plukker ut først (LIFO, last in, first 
out, til forskjell fra FIFO, first in, first out, som er 
en annen type stack som brukes noen ganger). 
  3 5 ADD 8 MUL 
er noe slikt som 3 pluss 5, nemlig 8, ganger med 8, 
nemlig 64.
  POP 
skal da gi 64. 
  Vi burde få det samme resultat ved å skrive 
  8 3 5 ADD MUL POP 
  Og dette kan også, inne i et program, skrives pent og  
pyntelig som 
  (( 8 ; 3 ; 5 => ADD => MUL => POP )) 
  SUB er substract, altså å trekke fra. DIV er dele. 
  Skal vi ta summen av to tall, og summen av to andre 
tall, og multiplisere dem, kan vi skrive i naturlig 
språk noe slikt som (2+3) * (3+4). Datamaskinen tenker 
gjerne i stacks og vil ha funksjoner presentert etter 
data er på plass. Da får vi:
  2 3 ADD 
  3 4 ADD 
  MUL 
  POP 
  Tilsvarende syntaks, mer eller mindre, men med slike 
endringer som at vi skriver åDD istedenfor ADD, og vi 
skriver :A2 og :A3 og slikt for å referere til kolonne 
og rad, brukes inne i programmet SPC -- Lisa Business 
Space -- den kommer opp ved at du skriver SPC eller ved 
at du presser CTR-D inne i B9. 
  Til sterk forskjell fra B9 er det meningen at du skal 
holde tunga rett i munnen og ha støtt blikk og 
uskjelvende hender, i tillegg til meget klar tanke, for 
å skrive inn formler og lagre filer i SPC. Det er et 
program som krever, med andre ord, en viss ferdighet. 
Men det springer rett ut av hvordan dataspråket 
fungerer.
  Hvis du kikker på SPC -- press ESC noen ganger for å  
komme ut av det og tilbake til B9 (hvis det var der du 
startet det, du kan gå frem og tilbake for å kalkulere 
videre på de samme tall) -- ser du en matrise, altså 
noe som både har rader og kolonner. Denne matrisen kan 
lages ved en funksjon som heter RAM-PM. I sin enkleste 
forstand er det kun ett tall, og bare tall, i hver node 
eller plass i matrisen. Tekster vil normalt lagres som 
en serie tall når vi skal ha dem i en matrise. Se 
funksjonen ASCII og funksjonen GETASCII i manualen 
F3DOCS for å gå frem og tilbake mellom tallform og 
tegnform -- f.eks. er tallet for A 65, mens lowercase a 
har samme tall som A har, bare at det er 32 høyere, i 
dette tilfelle 97. Mellomrom har eget tall, 32. Tallene 
-- siffrene -- 0 til 9 har, forvirrende nok, men det er 
nødvendig for å være konsekvent, egne tall, som er 
lavere enn tallene for bokstavene A..Z, men høyere enn 
tallene for mellomrom og endel tegn slik som ! og 
lignende. Det høyeste tall man opererer med når man 
snakker om ASCII i denne sammenheng er 126. De laveste 
tallene, under 32, fra 0 og oppover, har noe å gjøre 
med kontroll-taster og funksjons-taster. Hvis du f.eks. 
presser CTR-D og bruker KEYNUM istedenfor KEY til å 
lese fra tastaturet, kommer tallet 4. CTR-F gir 6.
  Vel, dette var bare for å ha nevnt det.  
  La oss fortsette med spillet. Jeg hadde en ide om å 
nevne SPC knyttet til matrise, og det er at hvis vi skal 
bygge spillet ut fra at vi vil ha flere dingser inn, 
ikke bare en dings som skal fanges opp for å få score, 
kan vi jo putte dem her og der i nettopp en slik matrise  
eller "tabell av tabeller". Dette er noe som lett kan 
videreutvikles til mer avanserte 2D spill. 
  Men i dette spillet har vi en greie som vi skal styre 
ved å trykke noen bokstaver på tastaturet, og denne 
ene greien, siden det bare er en av den, kan vi like 
gjerne holde rede på ved at vi har lagret X -- den 
horisontale plassen -- og Y -- den vertikale plassen -- 
i slike ((DATA .. )) greier -- variabler, som det også 
heter -- som vi allerede har.
  For å lage et brett, et spillområde, som har noen 
faste plasser som vi matcher mot det grafiske spill-felt 
på skjermen, kan vi altså lage en matrise i RAM. Vi 
kan bruke PM for Put to Matrix og GM for Get from 
Matrix, altså PM og GM. I denne sammenheng, med andre 
ord, er PM ikke akkurat Prime Minister, men mer et 
uttrykk for matrise og noe med lagring av den. Dette er 
bakgrunnen for at RAM-PM er ordet som brukes til å 
sette av plass i RAMmen, i minnet, (opprinnelig, Random 
Access Memory, at vi kan ha alle plasser i dette minnet 
direkte tilgjengelig, istedenfor som ved en tape, at 
bare det som spilles av akkurat nå er tilgjengelig) -- 
og i neste versjon av programmet, er RAM-PM på plass.
  Jeg tror du begynner å bli helt fantastisk 
super-ultra bra i programmering. Du er allerede, ifølge 
den fantastiske benign text editor B9 som brukes til å 
lage dette manuset, forbi selveste linje 1750 i heftet. Du 
er i ferd med å bli farlig god og bruk din kompetanse 
med stor etikk, for ansvar går med slik kunnen!!!
  Derfor skal du også få det spillbare program ferdig,  
og tillatelse til å se her og der i FIC3.TXT og i 
F3DOCS.TXT samt bruke din egen intuisjon til å frariste 
programmet dets siste hemmeligheter. Lykke til! 
  Her er det -- det virker! -- og det er gøy! 
 
P.S. Det er et par ting du vil finne ut ved mer om ved å 
bla i F3DOCS. En av disse er at matriser gjerne vises 
til ved symbolet #. (Flere matriser, ##, ### m.v.). For 
å "lade opp" symbolet brukes en formlering av typen
  (( GAME-BOARD >>> => & )) 
og for å formidle til F3 at vi er ferdig med å bruke 
symbolet # i akkurat denne funksjonen brukes 
  (( && )) 
Dette er en lagring på noe som heter variabel-stack, som  
også kan kikkes på via navnet VARSTK i tekstmodus. 
  Henting av tall fra matriser: .. .. ; # => GM. 
  Putting av tall inn i den: .. .. ; # => PM. 
  En annen ting er at hvis du vil ha et nokså tilfeldig 
tall ut fra datamaskinen, si mellom 1 og 1000, bruk
noe slikt som    1000 => FUNNYRFFG 
eller noe slikt som  ^1000 FR GETV 
  og alle SUPRE spill, SUPERBT inklusive, bruker begge 
metoder for RFFG -- relativt fri fluktuering-generator 
-- for det er en egen synkronistet ved dette (se mine 
filosofi bøker). 
  Men her er resultatet -- bruk F for å gripe hver ting 
som utgjør score når du ved de øvrige tastene har 
manøvrert deg nær dem, og ikke vent for lenge, -- der 
ligger utfordringen -- at du forholder deg bevisst til 
hver ting som gir score. Bare slik fortsetter spillet, 
og kompleksiteten økes etterhvert ved at flere og flere 
dingser dukker opp, som kan gi score og som må møtes med 
F-tasten i riktig øyeblikk. Vær snill mot tastaturet! 
  HER er programmet, og lykke til videre -- vi sees i 
3D-heftet -- og så videre!!!
 
 
 
}* SUPERBT.TXT -- SUPREME FAST LEARNING OF F3       }* 
}* BY SUPREMELY SIMPLE FUN 2D GAME-MAKING.          }* 
}* THIS PROGRAM IS YOGA4D.ORG/cfdl.txt              }* 
}* REDISTRIBUTABLE (FROM B.A.BOOKLET BY A.T. 2010)  }* 
}* =====> BIG AND IMPORTANT NOTES: <=============== }* 
}* FROM THE COMPLETION OF THE BIG ART BOOKLET, TO   }* 
}* THESE FINAL PAGES WITH THE COMPLETED GAME, TOOK  }* 
}* A BIT OF SOME QUANTUM JUMPS! PLS FORGIVE! ;-)    }* 
}* IT GOT REALLY LONGER, BUT NOW IT IS A REAL GAME! }* 
}* THE  R E A L L Y   G O O D   N E W S     IS THAT }*
}* THERE'S HARDLY ANY BIT OF WHAT FOLLOWS WHICH IS  }* 
}* COMPLICATED COMPARED TO WHAT YOU'VE ALREADY BEEN }* 
}* LOOKING AT IN PREVIOUS CHAPTERS. ANYTHING NEW    }* 
}* HERE IS MENTIONED IN COMMENTS, SEE F3DOCS.TXT    }* 
}* WHERE IT HAS EASY-TO-UNDERSTAND COMMENTS ALSO.   }* 
}* THERE ARE SEVERAL CHANGES HERE -- INSIDE MARKED  }* 
}* AREAS, WITH LINES LIKE : ****NEW PART FOLLOWS!   }* 
}* AS OFTEN HAPPENS, WHILE WORKING THE MOTORICS OUT,}* 
}* SOME IDEAS CHANGED -- AND EVOLVED. GAMER'S SYMBOL}* 
}* NOW MOVES  O N L Y   WHEN KEYBOARD IS USED, AND  }* 
}* THE SYMBOLS ARE SPACED OUT, LESS TIGHT. AND:     }* 
}* PLEASE LOOK AT  E V E R Y   ROW-.. AND COLUMN-.. }* 
}* IN THIS PROGRAM -- CAREFULLY! -- AS I CONFUSED   }* 
}* THE MEANING OF THE TWO IN ALL EARLIER VERSIONS   }* 
}* OF THIS PROGRAM IN YOUR BOOKLET. THIS TYPE OF    }* 
}* THING EASILY HAPPENS DURING PROGRAMMING, AND     }*
}* INSTEAD OF CONCEALING IT, I HAVE ALLOWED IT TO   }* 
}* BE PART OF THE JOURNEY OF MAKING THIS PROGRAM.   }* 
}* ROW, OF COURSE, IS Y, WHILE COLUMN IS X.         }* 
}* THERE IS A LOT OF CONDENSED LEARNING INSIDE THIS,}* 
}* SPEND WEEKS WITH IT -- AND MANUAL -- TO LEARN ALL!}* 
}* THOUGH A LONGER PROGRAM THAN THE INITIAL ONES IN  }* 
}* BOOK, IT USES NO NEW FUNDAMENTAL TECHNIQUE, IT IS }* 
}* JUST MORE OF THE SAME THAT YOU'VE ALREADY LEARNED!}* 
}* BE PATIENT ON CORRECTING ANY EVEN SLIGHT TYPING   }* 
}* ISSUES. WATCH E.G. FOR TYPING ONE BILLION RATHER  }* 
}* THAN TEN BILLION, AND TO HAVE SPACE BEFORE AND    }* 
}* AFTER SEMICOLONS, TO GET SEQUENCE RIGHT WITH N1   }* 
}* .. N11, TO AVOID HAVING SPACE AFTER COLON, TO     }* 
}* AVOID HAVING SPACE AFTER ( BEFORE MATCHED, ETC.   }* 
}* PLAYFULLY CORRECT YOUR PROGRAM TO BE LIKE THIS.   }* 
}* PLAY IT, AND HAVE FUN!!! GOOD LUCK. --ARISTO      }* 
((DATA TICKET )) 
(LET WIPE-CLEAR-GAME-MESSAGE-AREA BE (( ))
  ((
    (( 1 ; 500 ; 1024 ; 760 ; 0 => RECTFILL )) 
  )) OK) 
(LET WIPE-CLEAR-GAME-BOARD-AREA BE (( >N1 ))
  ((
    (( 101 ; 101 ; 399 ; 399 ; N1 => RECTFILL )) 
  )) OK) 
(LET TELL-SOMETHING-GOOD BE (( ; ))
  ((  
    (( ; 120 ; 550 => B9-POP ))
  )) OK) 
(LET TELL-SOMETHING-GOOD-SECOND-LINE BE (( ; ))
  ((  
    (( ; 120 ; 600 => B9-POP ))
  )) OK) 
(LET TELL-SOMETHING-GOOD-THIRD-LINE BE (( ; ))
  ((  
    (( ; 120 ; 650 => B9-POP ))
  )) OK) 
(LET GET-A-GOOD-TICKET-TO-RIDE BE (( )) 
  ((
    (( 100000 TICKET <<ASSERT ))
    (( 1,000,000,000 => RICH
      (COUNT
        (( KEYTOUCH
          (MATCHED
            (( N1 TICKET <<ASSERT ))
            (( RMS RMS ; EXIT ))
          MATCHED) ))
      COUNTUP) ))
  )) OK)
(LET USE-THE-TICKET-TO-TRAVEL-FAR BE (( )) 
  ((
    (( TICKET >>>
      (COUNT
        (( N1 => >N1 ))
      COUNTUP) ))
  )) OK)
(LET BEAUTIFUL-CONTENT-OF-FRAME BE (( )) 
  (( 
    (( :@@@@@@@@SUPERBT!!! ; 120 ; 150  
      => B9-POP )) 
    (( :@@@FIGHT_WELL! ; 120 ; 200  
      => B9-POP ))
    (( :@@@SCORE_MUCH! ; 120 ; 250  
      => B9-POP ))
   )) OK)
(LET GET-A-WONDERFUL-SENSE-OF-TIMING BE (( )) 
  ((
    (( }Dear master of this game!} => 
      TELL-SOMETHING-GOOD ))
    (( }Please press lineshift, wait a little,} =>
      TELL-SOMETHING-GOOD-SECOND-LINE ))
    (( }and press it again, to indicate game speed.} => 
      TELL-SOMETHING-GOOD-THIRD-LINE ))
    (( A-KEY ))
    (( WIPE-CLEAR-GAME-MESSAGE-AREA ))
    (( GET-A-GOOD-TICKET-TO-RIDE ))
    (( WIPE-CLEAR-GAME-MESSAGE-AREA ))
    (( }Thanks! Lineshift to begin} =>
      TELL-SOMETHING-GOOD ))
    (( }Have courage! Be brave! Win win win!}
      TELL-SOMETHING-GOOD-SECOND-LINE ))
  )) OK)
(LET SHOW-FUN-AT-FOUR-TIMES-THE-SPEED BE (( )) 
  (( 
    (( TICKET >>> ; ))
    (( ; TICKET >>> ; 4 => DIV 
      TICKET <<ASSERT ; ))
    (( ; 3
      (COUNT
        (( 191 => WIPE-CLEAR-GAME-BOARD-AREA )) 
        (( }*YOU ARE ELECTRIC!*} ; 110 ; 350 => B9-POP ))  
        (( USE-THE-TICKET-TO-TRAVEL-FAR )) 
        (( 191 => WIPE-CLEAR-GAME-BOARD-AREA )) 
        (( }*EEEELLLECTRIC!!!*} ; 175 ; 250 => B9-POP ))  
        (( USE-THE-TICKET-TO-TRAVEL-FAR )) 
        (( 191 => WIPE-CLEAR-GAME-BOARD-AREA )) 
        (( }*ELECTRICITY!*} ; 220 ; 110 => B9-POP ))  
        (( USE-THE-TICKET-TO-TRAVEL-FAR )) 
        (( 128 => WIPE-CLEAR-GAME-BOARD-AREA )) 
      COUNTUP) ; ))
    (( ; TICKET <<ASSERT ))
  )) OK)
((DATA THE-SCORE )) 
((DATA PLAYERS-ROW-NUMBER )) 
((DATA PLAYERS-COLUMN-NUMBER )) 
((DATA TREASURE-ROW-NUMBER )) 
((DATA TREASURE-COLUMN-NUMBER )) 
((DATA USE-THIS-GREEN-TONE )) 
(LET EXPLAIN-TO-THE-GAMER-SOME-GAME-CONTROLS BE (( ))  
  (( 
    (( }GAME-CONTROLS:} ; 750 ; 100 => B9-POP )) 
    (( }    Y       F } ; 750 ; 125 => B9-POP )) 
    (( }  G   H} ; 750 ; 150 => B9-POP )) 
    (( }    B} ; 750 ; 175 => B9-POP )) 
  )) OK) 
(LET SHOW-THE-GAMER-HER-PRESENT-SCORE BE (( )) 
  ((
    (( }S C O R E >>>       } ;
      450 ; 300 => B9-POP ))       
    (( }S C O R E >>> } ; THE-SCORE >>>
      => CONCAT ; 450 ; 300 => B9-POP ))       
  )) OK) 
(LET BIG-PIXEL-HERE BE (( >N11 >N1 )) 
  (( 
}* ****NEW PART OF PROGRAM FOLLOWS HERE:***** }* 
     (( N1 ; 13 => MUL ;                                    
      88 => ADD => >N1 ))
    (( N11 ; 13 => MUL ;                                 
      88 => ADD => >N11 ))
}* ***NEW PART OF PROGRAM ABOVE HERE**** }* 
    (( N1 ; N11 ; BRIDGE 4 ADD ;
      BRIDGE 4 ADD ; 191 => RECTFILL ))
  )) OK)
(LET GAMER-SYMBOL BE (( )) 
  (( 
}* ****NEW PART OF PROGRAM FOLLOWS HERE:***** }* 
    (( PLAYERS-COLUMN-NUMBER >>> => >N1 ))                                  
    (( PLAYERS-ROW-NUMBER >>> => >N3 ))                      
}* ***NEW PART OF PROGRAM ABOVE HERE**** }* 
    (( N1 => INC ; N3 => BIG-PIXEL-HERE ))
    (( N1 ; N3 => INC => BIG-PIXEL-HERE ))
    (( N1 ; 3 => ADD ;                           
      N3 => INC => BIG-PIXEL-HERE ))
    (( N1 => INC ;                           
      N3 ; 3 => ADD => BIG-PIXEL-HERE ))
  )) OK)
(LET TREASURE-SYMBOL BE (( )) 
  (( 
}* ****NEW PART OF PROGRAM FOLLOWS HERE:***** }*
    (( TREASURE-COLUMN-NUMBER >>> => >N1 ))                                  
    (( TREASURE-ROW-NUMBER >>> => >N3 ))                      
}* ***NEW PART OF PROGRAM ABOVE HERE**** }* 
    (( N1 ; 3 => ADD ; N3 => BIG-PIXEL-HERE ))
    (( N1 => INC => INC ; N3 => INC => BIG-PIXEL-HERE ))
    (( N1 => INC ; N3 => INC => INC                            
      => BIG-PIXEL-HERE ))
  )) OK)
}* ****NEW PART OF PROGRAM FOLLOWS HERE:***** }*
}* LOTS OF COMMENT LINES LIKE THIS, HERE, -- DON'T HAVE TO TYPE'EM! }* 
}* JUST TYPE IN THE PROGRAM  E X A C T L Y   AND CHECK IT, LINE FOR }* 
}* LINE, AND YOU HAVE A WORKING GAME!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! }* 
}* BUT OMIT ALL THESE LINES WITH A CURLY BRACKET FOLLOWED BY STAR.  }* 
((DATA GAME-CONTINUES GAME-CONTINUES => SETDANCE )) 
((DATA QUANTITY-OF-TREASURES QUANTITY-OF-TREASURES => SETDANCE )) 
}* THIS CONTAINS NUMBER OF TREASURES, AND WE }* 
}* BEGIN WITH 1, AND INCREASE A LITTLE AS    }* 
}* THE DURATION OF THE GAME INCREASES.       }* 
((DATA GAME-BOARD 20 ; 20 => RAM-PM 
  GAME-BOARD <<ASSERT )) 
}* NOTE: DIRECTIONS ARE 12, 15, 18, 21 AS A CLOCK.     }* 
}* THE GAME-BOARD HAS SUCH DIRECTIONS FOR THE          }* 
}* TREASURES. GAMER SYMBOL NOW ONLY MOVES BY KEY,      }* 
}* IN GAME-ACTION.                                     }* 
(( LOOKSTK )) 
}* SEE NOTE ABOUT (COUNT INSIDE (COUNT LOOP AND ABOUT  }* 
}* FUNCTIONS   WITH, AND, ISPRO   FURTHER IN PROGRAM.  }* 
}* THIS ADDS SCORE AND REMOVES TREASURES WHEN THEY ARE }* 
}* NEAR THE GAMER SYMBOL, AND IT IS CALLED AT  "F".    }* 
}* NOTE THAT   ADDVAR   DOES THE SAME THING AS ADD,    }* 
}* FOLLOWED BY   <<ASSERT    -- ONE OF THE             }* 
}* NICE QUICKIES. SCORE GETS MUCH HIGHER WHEN MORE     }* 
}* COMPLICATED BOARD, FULL OF TREASURES ONE MUST       }* 
}* AVOID BUMPING INTO.                                 }* 
(LET CAPTURE-TREASURE-WHEN-NEAR BE (( ))
  ((
    (( GAME-BOARD >>> => & )) 
    (( 20 
      (COUNT
        (( 20
          (COUNT
            (( PLAYERS-COLUMN-NUMBER >>> => >N8 ))                            
            (( PLAYERS-ROW-NUMBER >>> => >N9 ))                      
            (( N1 ; (( N8 2 SUB )) ; (( N8 4 ADD )) => WITH ;
              N3 ; (( N9 2 SUB )) ; (( N9 4 ADD )) => WITH => AND  
              (MATCHED               
                (( N1 ; N3 ; # => GM => ISPRO 
                  (MATCHED
                    (( 100 ; 
                      QUANTITY-OF-TREASURES >>> => MUL ; 
                      THE-SCORE => ADDVAR )) 
                    (( 0 ; N1 ; N3 ; # => PM ))
                    (( -1 ; QUANTITY-OF-TREASURES => ADDVAR ))   
                  MATCHED) ))
              MATCHED) ))
          COUNTUP) ))
      COUNTUP) ))
    (( && )) 
  )) OK)
}* NEXT FUNCTION IS FIXED-ON COPY OF THE ABOVE, }* 
}* BUT WITHOUT SCORE ADDED IN THE MIDDLE.     }* 
}* IT IS CALLED WHEN F IS NOT CLICKED.        }* 
(LET FINISH-IF-NEAR-TREASURE-WITHOUT-F BE (( ))
  ((
    (( GAME-BOARD >>> => & )) 
    (( 20 
      (COUNT
        (( 20
          (COUNT
            (( PLAYERS-COLUMN-NUMBER >>> => >N8 ))                            
            (( PLAYERS-ROW-NUMBER >>> => >N9 ))                      
            (( N1 ; (( N8 DEC )) ; (( N8 3 ADD )) => WITH ;
              N3 ; (( N9 DEC )) ; (( N9 3 ADD )) => WITH => AND  
              (MATCHED               
                (( N1 ; N3 ; # => GM => ISPRO 
                  (MATCHED
                    (( GAME-CONTINUES => SETBASIS ))
                  MATCHED) ))
              MATCHED) ))
          COUNTUP) ))
      COUNTUP) ))
    (( && )) 
  )) OK)
(LET SYMBOL-ADD-XY BE (( >N2 >N1 ))
  ((
    (( PLAYERS-COLUMN-NUMBER >>> => >N8 ))                                  
    (( PLAYERS-ROW-NUMBER >>> => >N9 ))                      
    (( N1 ; N8 => ADD ; 1 ; 20 => SET-RANGE => >N8 )) 
    (( N2 ; N9 => ADD ; 1 ; 20 => SET-RANGE => >N9 )) 
    (( N8 PLAYERS-COLUMN-NUMBER <<ASSERT )) 
    (( N9 PLAYERS-ROW-NUMBER <<ASSERT )) 
}* WASN'T THAT NEAT? THE   SET-RANGE   ENSURES THAT YOU GET }* 
}* NUMBERS WHICH ARE KEPT WITHIN A RANGE, HERE, 1 TO 20.    }* 
}* EXERCISE: TRY AND REWRITE THIS FUNCTION ENTIRELY WITHOUT }* 
}* THE USE OF ANY N1, N2, .. N11, PUTTING TWO SEMICOLONS    }* 
}* INSIDE THE    BE (( ))   SO IT BECOMES   BE (( ; ; ))    }* 
}* IT'S PROBABLY MORE THAN ONE WAY TO REWRITE IT, IT OFTEN IS. }* 
}* ANOTHER THING: NOWHERE IN THIS PROGRAM DO WE USE   GOLABEL: }* 
}* AND THE  GOUP1 .. GOFORWARD1 .. BUT IF YOU SEE THE F3DOCS   }* 
}* MANUAL, YOU CAN LEARN ABOUT THIS SIMPLE THING. WHY DON'T    }* 
}* YOU TRY TO PUT IT IN INSTEAD OF A (COUNT .. COUNTUP) WHERE  }* 
}* THE COUNT-LOOP IS GIVEN A VERY LARGE NUMBER LIKE 1000000?   }* 
}* SPEND TIME WITH IT! THE GOLABEL/GOUP/GOFORWARD DOESN'T USE  }* 
}* THE STACK, SO THERE IS NO RMS NOR ANY N1 COUNTER THEN.      }* 
}* AND THOUGH WE DON'T NEED WARPS IN THIS GAME, LOOK UP THE    }* 
}* QUESTION-MARK AND THE WORD   HYPERCONNECT  (OR JUST  H  )   }* 
}* AND START EXPERIMENTING WITH IT A LITTLE BIT AT LEAST WHEN  }* 
}* YOU HAVE TIME. IT IS GOING TO BE HANDLED IN NEXT BOOKLET!   }* 
  )) OK)
(LET GAME-ACTION BE (( ))   
  ((  
    (( KEYTOUCH  
      (MATCHED
        (( KEY ; ))
}* NEXT LINE ALLOWS EXIT IF BACKSPACE IS PRESSED. IT HAS A NUMBER, '8'. }*
        (( ; => ONE ; '8' => EQ 
}* THE WORD 'ONE' MEANS MAKE ONE COPY OF WHAT'S ON TOP OF STACK.     }* 
}* USE EQ FOR TEXTS AND FOR KEY, EQN FOR NUMBERS AND KEYNUM.         }* 
}* THE PECULIAR PHRASE '8' MEANS CONVERT THIS NUMBER INTO CHARACTER.}* 
          (MATCHED
}* WHEN MATCH, WE REMOVE (RM) THE COPY OF WHAT KEY THE USER PRESSED: }* 
            (( ; RM ))
            (( GAME-CONTINUES => SETBASIS ))
}* SETBASIS, THEN, SETS TO BASIS (ZERO), WHILE SETDANCE TO DANCE (ONE). }* 
}* THE FUNCTION  'EXIT',  NEXT,  EXITS ONLY FROM PRESENT FUNCTION.      }*
            (( EXIT ))
          )(OTHER
}* IN NEXT LINES, WE USE THE = .. == .. === STYLE, WHICH IS }* 
}* SHORT-HAND FOR (MATCHED .. )(OTHER .. MATCHED), SEE NEXT FUNCTION ALSO.}* 
}* ALL THE SEMICOLONS, THE ; SIGNS, MEAN NOTHING TO THE PC. THEY ARE      }* 
}* BUT A REMINDER THAT SOMETHING IS ON THE STACK, NAMELY THE KEY PRESSED. }* 
}* THE FUNCTION   UPCM    MEANS PUT TO UPPERCASE, ON THE MAIN STACK.      }* 
            (( ; => UPCM => ONE ; :F => EQ 
              = CAPTURE-TREASURE-WHEN-NEAR ; ==
}* THE NEXT FUNCTION IS CALLED WHEN ANYTHING BUT F CLICKED }* 
              ; FINISH-IF-NEAR-TREASURE-WITHOUT-F                             
              ; => ONE ; :H => EQ 
              = 4 ; 0 => SYMBOL-ADD-XY ; ==
              ; => ONE ; :G => EQ 
              = -4 ; 0 => SYMBOL-ADD-XY ; ==
              ; => ONE ; :Y => EQ 
              = 0 ; -4 => SYMBOL-ADD-XY ; ==
              ; => ONE ; :B => EQ 
              = 0 ; 4 => SYMBOL-ADD-XY ; 
              === === === === ===    
          MATCHED) ; ))
        (( ; RM ))
      )(OTHER 
        (( FINISH-IF-NEAR-TREASURE-WITHOUT-F ))  
      MATCHED) ))
    (( MANUAL-CLEAR-KEYBUF )) 
  )) OK) 
(( LOOKSTK )) 
}* THE   MANUAL-CLEAR-KEYBUF   CLEARS ALL CHARACTERS FROM   }* 
}* BEING STORED UP IF RAPID CLICKING ON KEYBOARD HAS TAKEN  }* 
}* PLACE. THIS IS IMPORTANT SINCE ONLY ONE CLICK IS         }* 
}* IS PROCESSED PR EACH 'TICK' TO KEEP INTERACTIVENESS.     }* 
}* THE NEXT FUNCTION USES  ^4 FR GETV   TO GET A FREE FUNNY }* 
}* NUMBER SUITABLE FOR GAMING AND VARIABLE RESPONSES WHICH  }* 
}* IN THIS CASE VARIES FROM 1 TO 4. THIS IS CONVERTED TO    }* 
}* CLOCK NUMBER DIRECTIONS 12, 15, 18, 21. YOU NOTICE THE   }* 
}* COMPLETING LINE HAS    N3 => =>    WHERE THE ARROWS      }* 
}* ARE DOUBLE AS OUR CONVENTION TO SAY: SOMETHING IS        }* 
}* LEFT ON THE STACK   AFTER   THIS FUNCTION HAS BEEN       }* 
}* PERFORMED, AND THIS OUGHT TO BE PICKED UP BY THE PLACE   }* 
}* WHERE THIS FUNCTION IS BEING CALLED (WHICH IS NEXT FUNC.)}* 
(LET GET-A-FUNNY-FREE-DIRECTION BE (( )) 
  ((
    (( ^4 FR GETV => >N1 )) 
    (( N1 ; 1 => EQN = 15 => >N3 
      == N1 ; 2 => EQN = 18 => >N3  
      == N1 ; 3 => EQN = 21 => >N3 
      == 12 => >N3 
      === === === )) 
    (( N3 => => ))
  )) OK)
}* THE NEXT IS MODIFIED FROM A COPY OF SOME OF THE COUNT STUFF ABOVE.    }* 
}* WHEREAS   .. => DIV   IS A WHOLE NUMBER DIVISION, ONE CAN       }* 
}* USE THE DECIMAL NUMBER STACK, MENTIONED IN NEXT BOOKLET,        }* 
}* TO CALCULATE E.G.  $8000 $5000 => \R => RICHTOSTK => POP        }* 
}* GIVES 1.6, APPROXIMATELY THE GOLDEN MEAN. DIVISION IS \ AND     }* 
}* THE R AFTER IT MEANS USE THE RICH NUMBER STACK, WITH DECIMALS.  }* 
}* A DOLLAR SIGN BEFORE NUMBERS ALSO MEANS USE RICH NUMBER STACK.  }* 
}* IF YOU LIKE, LOOK UP FUNCTION   RICHTOSTK    IN THE MANUAL.     }* 
}* BUT WE DON'T NEED ANYTHING OF THIS HERE. WHAT WE NEED IS TO     }* 
}* GRADUALLY, BUT NOT TOO QUICKLY, UP THE NUMBER OF TREASURES.     }* 
}* BY DECREASING THE NUMBER FED TO   DIV   IT GOES MORE QUICKLY UP.}* 
(LET UPDATE-QUANTITY-OF-TREASURES BE (( >N9 )) 
  (( 
    (( N9 ; 8 => DIV => INC => >N9 )) 
    (( QUANTITY-OF-TREASURES >>> ; N9 => INTGREATER   
       (MATCHED 
        (( EXIT ))
      MATCHED) ))
}* IN THE MIDDLE OF THE COUNT LOOP, THE N9 ABOVE                    }* 
}* MYSTERIOUSLY BECOMES N11, SOME HINTS ABOUT WHY ARE GIVEN         }* 
}* IN COMMENTS ABOUT COUNT LOOPS FURTHER AHEAD IN THIS PROGRAM! ;-) }* 
}* NOTICE ALSO THE VERY CLEVER FUNCTION     NOT    WHICH IS AT A    }* 
}* LINE BY ITSELF AFTER THE  ..WITH..WITH..AND  STUFF, HERE.        }* 
}*   YES => NOT   GIVES  NO     WHILE  NO => NOT   GIVES  YES.      }* 
}* WHAT WE'RE DRIVING AT HERE IS TO INSERT TREASURES AT GOOD        }* 
}* DISTANCE FROM THE GAMER SYMBOL. WE TRY A CERTAIN NUMBER OF       }* 
}* TIMES, THEN AFTER THAT NUMBER OF TIMES, WE DON'T PUSH IT.        }* 
    (( GAME-BOARD >>> => & )) 
    (( 20 ; N9 => MUL
      (COUNT
        (( PLAYERS-COLUMN-NUMBER >>> => >N8 ))                            
        (( PLAYERS-ROW-NUMBER >>> => >N9 ))                      
}* NOTE THAT INSIDE A COUNT LOOP WE'VE GOTTA WATCH OUT TO }* 
}* STORE TEMPORARY STUFF NOT IN THE N1 AND N2 USED BY THE COUNT, }* 
}* MORE COMMENTS ABOUT THIS ELSEWHERE IN PROGRAM, MORE IN F3DOCS. }* 
        (( 20 => FUNNYRFFG => >N4 ))
        (( ^20 FR GETV => >N6 ))
        (( N4 ; (( N8 3 SUB )) ; (( N8 5 ADD )) => WITH ;
          N6 ; (( N9 3 SUB )) ; (( N9 5 ADD )) => WITH => AND  
          => NOT 
          (MATCHED               
            (( N4 ; N6 ; # => GM => ISBASIS  
              (MATCHED
}* ISBASIS MEANS IT'S NOTHING THERE. INCVAR MEANS: ADD ONE TO THE VARIABLE. }*
                (( QUANTITY-OF-TREASURES => INCVAR ))   
                (( QUANTITY-OF-TREASURES >>> ; N11 => INTGREATER   
                  (MATCHED 
}* THE NEXT LINE IS A GENTLE WAY TO EXIT THIS LOOP, WHEN ENOUGH. }* 
}* THE DEEPER REASON IS THAT N2, INSIDE A COUNT, HAS THE TOP-COUNT. }* 
                    (( N2 => >N1 ))
                  MATCHED) ))
              MATCHED) ))  
}* THIS WAS NOT MUCH PLANNED, BUT SEEMS RIGHT: IF THERE IS ALREADY A }* 
}* TREASURE THERE, IT  M I G H T   GET A NEW DIRECTION. WHY NOT?! }* 
            (( GET-A-FUNNY-FREE-DIRECTION ; N4 ; N6 ; # => PM ))
          MATCHED) ))
      COUNTUP) ))
    (( && )) 
   )) OK) 
(LET DO-THE-MOTIONS BE (( ))      
  (( 
    (( GAME-BOARD >>> => & )) 
}* USING ONLY THE SAME VOCABULARY OF FUNCTIONS AS WE HAVE ALREADY }* 
}* USED, WE GO THROUGH THE GAME-BOARD, EVERY PLACE IN IT (20X20)  }* 
}* AND MOVE EACH TREASURE SYMBOL TO THE PLACE IT OUGHT TO GO.     }* 
}* WE ADD A NUMBER -- 10,000 -- EACH TIME WE HAVE MOVED ONE,      }* 
}* SO THAT, IF WE RUN INTO IT ONCE MORE DURING THE LOOP-INSIDE-   }* 
}* THE-LOOP-OF-20-COLUMNS-AND-20-ROWS, WE DON'T MOVE IT TWICE.    }* 
}* BUT THEN WE GOTTA LOOP THROUGH IT AGAIN, GETTING THE NUMBERS   }* 
}* FIXED BACK TO THE ORIGINAL. HOWEVER 20X20=400 IS A SMALL LOOP  }* 
}* FOR THE COMPUTER DOES A LOT MORE THAN THAT IN A SPLIT SECOND.  }* 
    (( 20 
      (COUNT
        (( 20
          (COUNT
}* NOTE THAT A (COUNT INSIDE A (COUNT MEANS THAT N3 BECOMES THE }* 
}* COUNTER FOR THE OUTER LOOP, WHILE N1 THE INNER LOOP, AND ANY }* 
}* PREVIOUS USE OF N1, N2, ETC, GETS CHANGED UP TO N4, N5, ETC. }* 
}* THE VALUES OF N1..N11 ARE LOCAL TO EACH FUNCTION, BUT        }* 
}* EACH COUNT-LOOP PUSHES TWO NEW NUMBERS TO THIS 'SIMPLESTACK'.}* 
}* THE FUNCTION   INTGREATER  COMPARES TWO NUMBERS FOR SIZE,    }* 
}* SO THAT  100 ; 10 => INTGREATER   GIVES A YES,               }* 
}* WHILE THE FUNCTION    ISPRO   GIVES YES FOR VALUES ABOVE 0.  }* 
}* THEN, THE FUNCTION   AND   GIVES YES WHEN BOTH OF ITS INPUTS }* 
}* ARE YES. SO THE NEXT CHECK IS WHETHER THE NUMBER IS NONZERO  }* 
}* BUT NOT TOO BIG:                                             }* 
            (( N1 ; N3 ; # => GM => >N10 ))
            (( 10000 ; N10 => INTGREATER ; 
              N10 => ISPRO => AND 
              (MATCHED
                (( N1 => >N8 ))
                (( N3 => >N9 ))
}* IN THE NEXT LINES, A SHORTER FORM OF (MATCHED..)(OTHER..MATCHED) }* 
}* IS USED, NAMELY = .. == .. ===. WE MOVE TREASURES AROUND GIVEN   }* 
}* A CHECK ON WHICH OF THE FOUR DIRECTIONS THEY ARE MOVING. WE ALSO }* 
}* HAVE TO DEAL WITH THOSE GOING OFF LIMIT, OTHERWISE PROGRAM CRASHES. }* 
                (( N10 ; 15 => EQN 
                  = INCN8 ==
                  N10 ; 18 => EQN 
                  = INCN9 == 
                  N10 ; 21 => EQN 
                  = DECN8 ==
                  DECN9 
}* THE RULE IS:  ONE === FOR EACH =, NOT COUNTING THE ==. HERE, 3: }* 
                  === === === 
}* THE NEXT FUNCTION   WITH    GIVES A YES WHEN WITHIN GIVEN RANGE. }* 
                (( N8 ; 1 ; 20 => WITH ; 
                  N9 ; 1 ; 20 => WITH => AND  
                  (MATCHED
                    (( N10 ; 10000 => ADD ; N8 ; N9 ; # => PM ))  
                  MATCHED) ))
                (( 0 ; N1 ; N3 ; # => PM ))
              MATCHED) ))
          COUNTUP) ))
      COUNTUP) ))
    (( 128 => WIPE-CLEAR-GAME-BOARD-AREA ))    
    (( 191 USE-THIS-GREEN-TONE <<ASSERT )) 
    (( 20 
      (COUNT
        (( 20
          (COUNT
            (( N1 ; N3 ; # => GM ; 10000 => INTGREATER 
              (MATCHED
                (( N1 ; N3 ; # => GM ; 10000 => SUB ; 
                  N1 ; N3 ; # => PM )) 
                (( N1 TREASURE-COLUMN-NUMBER <<ASSERT )) 
                (( N3 TREASURE-ROW-NUMBER <<ASSERT  )) 
                (( TREASURE-SYMBOL ))
              MATCHED) ))
          COUNTUP) ))
      COUNTUP) ))
    (( GAMER-SYMBOL ))    
}* DID YOU COUNT ONE COUNTUP) FOR EACH (COUNT, AND ONE }* 
}* MATCHED) FOR EACH (MATCHED, IN THE ABOVE? THE USE OF }* 
}* THE TABL (TABULATOR) KEY HELPS ENORMOUSLY TO ORGANISE }* 
}* A FUNCTION WHEN IT HAS SUCH A HIEARCHY AS THIS.       }* 
    (( && )) 
}* NOTE THAT ANYTHING YOU STORE WITH ((DATA .. )) STAYS ON DURING }* 
}* THE PROGRAM, TYPICALLY. THE & STUFF WITH THE # STUFF AND &&    }* 
}* STUFF IS ALL ABOUT A SHORTCUT, SO WE DON'T HAVE TO REPEAT      }* 
}* THE LONG NAME OVER AND OVER AGAIN. NO DATA IS REALLY LOST WHEN }* 
}* THE FUNCTION DOES THE && AT ITS COMPLETING LINE. ALL RIGHT?    }* 
  )) OK) 
}* THE LOOKSTK ON THE NEXT LINE MIGHT TELL IF THERE IS AN ISSUE       }* 
}* ABOUT THE HIERARCHY IN THE FUNCTIONS ABOVE IT.                     }* 
}* BUT IF YOU LEAVE OUT THE   OK)   IT CAN MAKE VERY PECULIAR ERRORS, }* 
}* WHICH USUALLY THEN ARE SHOWN AS SYNTAX ERRORS AT THE NEXT (LET     }* 
(( LOOKSTK )) 
(LET GET-ON-WITH-THE-GAME BE (( ))
  (( 
    (( GAME-BOARD >>> => & )) 
    (( EXPLAIN-TO-THE-GAMER-SOME-GAME-CONTROLS ))
    (( THE-SCORE => SETBASIS )) 
    (( SHOW-THE-GAMER-HER-PRESENT-SCORE )) 
}* THE NEXT ROW.. AND COLUMN.. ARE SWAPPED AROUND, COMPARED TO BEFORE: }* 
    (( 15 PLAYERS-COLUMN-NUMBER <<ASSERT )) 
    (( 5 PLAYERS-ROW-NUMBER <<ASSERT )) 
    (( # => CLEAR-MATRIX )) 
    (( 5 TREASURE-COLUMN-NUMBER <<ASSERT  )) 
    (( 15 TREASURE-ROW-NUMBER <<ASSERT )) 
    (( 15 ; 5 ; 15 ; # => PM )) 
}* THIS MEANS: DIRECTION 15 FOR A TREASURE AT X 5 AND Y 15. }* 
    (( 191 USE-THIS-GREEN-TONE <<ASSERT )) 
    (( GAMER-SYMBOL )) 
    (( TREASURE-SYMBOL ))
    (( 1000000000  
      (COUNT
        (( GAME-ACTION )) 
        (( GAME-CONTINUES => VISDANCE
          (MATCHED
             (( N1 => UPDATE-QUANTITY-OF-TREASURES )) 
             (( DO-THE-MOTIONS ))
             (( SHOW-THE-GAMER-HER-PRESENT-SCORE )) 
             (( USE-THE-TICKET-TO-TRAVEL-FAR )) 
          )(OTHER
            (( }***GAME DONE! USED } ; N1 => CONCAT ;                 
              } TICKS TO SCORE } => CONCAT ;                                 
              THE-SCORE >>> => PRETTIFY-NUMBER => CONCAT ;  
              } POINTS.} => CONCAT ; 
              50 ; 50 => B9-POP )) 
             (( N2 => >N1 ))
}* THIS SAYS: PUT COUNTER TO FINISH-VALUE. EXIT LOOP. }* 
          MATCHED) ))
      COUNTUP) ))
    (( SHOW-FUN-AT-FOUR-TIMES-THE-SPEED )) 
    (( TICKET >>> ; 10 => MUL TICKET <<ASSERT )) 
    (( USE-THE-TICKET-TO-TRAVEL-FAR )) 
    (( && )) 
  )) OK)
}* ***NEW PART OF PROGRAM ABOVE HERE**** }* 
(LET SUPERBT BE (( )) 
  (( 
    (( GJ-ON ))
    (( }MY DEAR GAMER! You must be sure} ;
      10 ; 10 => B9-POP ))
    (( }that you don't get absolutely addicted} ;
      10 ; 50 => B9-POP ))
    (( }to me.  -- The program.  ENTER if you dare!} ;
      10 ; 90 => B9-POP ))
    (( A-KEY ))
    (( CLS ))
    (( 100 ; 100 ; 400 ; 400 ; 1  
      => RECT )) 
    (( BEAUTIFUL-CONTENT-OF-FRAME )) 
    (( GET-A-WONDERFUL-SENSE-OF-TIMING )) 
    (( SHOW-FUN-AT-FOUR-TIMES-THE-SPEED )) 
    (( USE-THE-TICKET-TO-TRAVEL-FAR )) 
    (( WIPE-CLEAR-GAME-MESSAGE-AREA ))
    (( GET-ON-WITH-THE-GAME ))
    (( GJ-DONE ))
  )) OK)
(LET AUTOSTART BE SUPERBT OK) 
}* IF YOU DON'T GET IT TO WORK AFTER TYPING IT IN, IT             }*  
}* IS LIKELY TO BE SOMETHING WHICH IS THERE, BUT HARD TO SEE      }* 
}* WITHOUT LOOKING AT  E V E R Y   LINE AFTER A WALK, --          }* 
}* TRY THEN, IF THERE IS A MYSTERIOUS SUDDEN PROGRAM EXIT         }* 
}* WHILE YOU RUN THE PROGRAM, TO REMOVE THE CALL TO ONE FUNCTION, }* 
}* BY PUTTING COMMENT SYMBOLS AROUND IT. THEN PUT IT BACK IF NO   }* 
}* CHANGE, AND PUT COMMENT SYMBOLS AROUND ANOTHER.                }* 
}* OR, PUT FOUR STARS **** ON LINE BEFORE A LOOP, AND LEFT-CURL   }* 
}* ON THE LINE AFTER, TO CHECK IF IT IS THAT LOOP CAUSING IT.     }* 
}* A TOO MUCH  >N5   CAN REMOVE TOO MUCH ON STACK,  OR A LACKING  }* 
}* && CAN FILL IT TOO MUCH;  A CHANGE OF SEQUENCE OF NUMBERS      }* 
}* CAN MAKE A MATRIX SCREWED UP -- THERE ARE VERY MANY WAYS ONE   }* 
}* CAN MESS IT UP, AND IT IS A KIND OF GAME IN ITSELF TO GET IT   }* 
}* ENTIRELY RIGHT.                                                }*
}* HEAD UP, TIGER, AND CORRECT ALL PROGRAM ISSUES, AND HAVE FUN!  }* 
}* IN NEXT BIG ART BOOKLET, WE GO INTO BOTH 3D  A N D  WARPS!     }* 
}* SEE YA!                                                        }*