Instruktioner för Swedish Inform v1.6

av Fredrik Ramsberg, 2008-08-24

Observera!

  1. För de senaste uppdateringarna, se http://swedish.ramsberg.net
  2. Swedish Inform finns i en liten och en stor distribution. Den lilla innehåller endast de allra mest kritiska filerna. En del beskrivningar i detta dokument hänvisar till filer och bibliotek som bara ingår i den stora distributionen.
  3. Det finns även en ny distribution i form av en installerare för Windows. Denna distribution innehåller bl a Crimson Editor med genvägar för att kompilera spel direkt från editorn.
    På en del ställen i instruktionerna nedan finns det rutor med ljusgul bakgrund. Dessa rutor innehåller tips om hur man kan göra saker enklare om man använder installerar-distributionen.
  4. Alla de olika distributionerna kan när som helst laddas ner från http://swedish.ramsberg.net , och kanske även från andra källor, då ju licensen tillåter vidaredistribution om distributören inte tar ut någon avgift.

Instruktionerna är uppdelade i följande avsnitt:

1. INTRODUKTION

Detta dokument innehåller instruktioner för hur man använder den svenska översättningen av Inform-biblioteket. Den svenska översättningen kallas ibland Swedish.h, trots att detta egentligen bara är namnet på en av de fyra filer som ingår i själva biblioteksöversättningen. Inform-biblioteket är gjort för att kunna översättas till andra språk, och Swedish.h heter den centrala filen i den svenska översättningen (det finns t ex även en tysk översättning som innehåller German.h, och motsvarande för franska, italienska osv).

Om man har använt Swedish Inform tidigare är det bäst att ta en titt på vad som är nytt i denna version.

1.1 Vad är Inform?

Inform är idag ett av de mest populära verktygen eller programmeringsspråken för att skriva textäventyr eller "interaktiv fiktion" i. Det har en egen hemsida på http://www.inform-fiction.org/inform6.html. (Denna sida gäller Inform 6, vilket är vad den svenska översättningen använder. Numera finns även Inform 7, men det är en helt annan sorts programmeringsspråk, och det lämpar sig inte särskilt väl för spel på andra språk än engelska). Inform är utvecklat av Graham Nelson, med det enda målet att det ska vara ett bra språk att skriva textäventyr i. För att språket inte ska sätta begränsningar för hur avancerade saker man kan ha med i sitt textäventyr, måste språket ändå i princip vara ett fullfjädrat programmeringsspråk, och det är det. Av den anledningen är det ungefär lika svårt att lära sig Inform som att lära sig t ex Basic. De goda nyheterna är att det finns gott om dokumentation, både för nybörjare och för erfarna programmerare.

Informs kompilator kompilerar källkod skriven i Inform till Z-kod. Detta är programkod som bara kan köras på en virtuell maskin kallad Z-maskinen. Z-maskinen uppfanns ursprungligen av Infocom ca 1980, och användes av alla Infocoms textäventyr. Konceptet med en virtuell maskin är exakt detsamma som idag används av Java, fast där heter den JVM eller Java Virtual Machine. Finessen med Z-maskinen är att den är förhållandevis lätt att emulera, och att programkod för den är mycket kompakt. Därmed kan man skriva emulatorer för Z-maskinen för alla möjliga plattformar, och så har också skett. Det finns idag Z-kods-tolkar (emulatorer) för t ex Windows, MS-DOS, Mac, Linux, PalmOS, VMS, OS/2, BeOS, NextStep etc etc. När man har släppt ett spel i Z-kod kan vem som helst ladda ner det till sin egen dator, oberoende av operativsystem, skaffa en Z-kods-tolk och köra spelet. Som spelförfattare måste man alltså inte fundera ett ögonblick över vad spelarna kommer ha för datorer eller operativsystem - spelet kommer automatiskt att kunna spelas på 99,9% av alla datorer som finns anslutna till Internet idag.

I slutet av 90-talet var det allt fler som ville ha möjlighet att gå utanför de begränsningar som Z-maskinen gav, men ändå behålla så mycket som möjligt av dess fördelar. Lösningen blev Glulx av Andrew Plotkin. Glulx är en ny virtuell maskin, som designades för att möta detta behov. Glulx stödjer sig i sin tur på ett nydesignat I/O-bibliotek för alla former av inmatning och utmatning av data och multimedia. Det heter Glk.

Inform-kompilatorn kan kompilera till både Z-kod och Glulx, så det är upp till författaren att välja vilken virtuell maskin man ska använda. Så länge man inte använder grafik och ljud är det lätt att skriva Inform-kod som kan kompileras till båda dessa format. Glulx skiljer sig i stort sett från Z-maskinen på följande punkter:

Z-maskinen Glulx
Grafik Stödjer grafik. Föråldrat grafikformat som kräver konverteringsprogram medan man jobbar med det. Fullt stöd för de moderna formaten PNG och JPG.
Ljud Stödjer ljud. Föråldrat ljudformat som kräver konverteringsprogram medan man jobbar med det. Ljud lagras med låg kvalitet och utan komprimering. Stödjer ljud i tre format:
  • AIFF-format - man kan själv välja kvalitet, men bra kvalitet ger stora filer, eftersom ljudet inte komprimeras.
  • MOD-format - används för att spela musik av god kvalitet utan att filen blir särskilt stor. Musiken måste dock komponeras i ett program kallat en "tracker" - man kan inte bara spela in en låt från en skiva eller dylikt
  • Ogg Vorbis-format - fungerar som MP3, men ger bättre kompression med samma ljudkvalitet, och formatet är gratis att använda på alla sätt, till skillnad från MP3.
Spelstorlek Max 512KB + ev multimediaresurser. Eftersom Z-kods-formatet är mycket kompakt räcker det ändå till mycket stora spel. Max 2GB + ev multimediaresurser. Glulx-kod är något mindre kompakt än Z-kod, så spelen blir lite större, men de flesta spel är ändå mindre än 1MB.
Skrivbart minne Max 64KB Max 2GB.
Talformat 16 bitar, dvs heltal mellan -32 768 och 32 767. 32 bitar, dvs heltal mellan -2 147 483 648 och 2 147 483 647.
Speltolkar Finns för massor av plattformar, inklusive Windows, Mac, Mac OS X, Linux, MS-DOS, Unix, Palm OS, Pocket PC, Windows CE, Psion Revo och Amiga. Alla tolkar stödjer inte grafik och ljud. Finns just nu (augusti 2008) för Windows, Mac, Mac OS X, Linux, MS-DOS, Pocket PC, Windows Mobile, Java, Solaris, Amiga och Archos PMA430. Alla tolkar stödjer inte alla ljudformat.

Sammanfattningsvis kan sägas att om man inte tänkte visa bilder eller spela ljud så väljer man troligen Z-kod, eftersom det färdiga spelet då kan spelas på nära nog alla datorer som finns idag. Om man vill ha bilder och/eller ljud så är Glulx det bästa valet. Det mer begränsade talformatet i Z-kod upplevs ytterst sällan som ett problem för äventyrsförfattare. Vad gäller den maximala storleken på spel och det skrivbara minnet, så är det inte en begränsning man ska fästa för stor vikt vid. Skulle man mot all förmodan överskrida någon av dessa två gränser så beror det troligen på att man inte förstått hur man använder Inform effektivt, och då kan man få hjälp att banta koden utan att ändra själva spelet, eller också har man verkligen skrivit ett helt gigantiskt spel, och då är det inget stort arbete att skifta till Glulx när man når gränsen. De allra flesta Z-kods-spel som släpps är mindre än 256KB, och redan att skriva ett bra spel i den storleken är ett stort arbete. Den maximala storleken på det skrivbara minnet (RAM - Random Access Memory) är sällan något problem heller. Alla strängar och rutiner som man skriver i programkoden lagras i ROM (Read Only Memory, dvs minne som endast kan läsas), och de utgör tillsammans den allra största delen av ett spel. Z-maskinen designades med minne uppdelat i RAM och ROM bl a för att det hjälper till att göra Z-kods-formatet så kompakt.

1.2 Innehållsöversikt - stora distributionen

För en komplett förteckning över de filer som ingår i den stora distributionen, se filen Filelist.html. Här nedan följer en översikt av de bibliotek som ingår:

Bin Innehåller kompilatorn för Windows, samt alla filer som ingår i iBlorb, ett paket för att sätta ihop Blorb-filer (liknar zip-filer, används för att samla ihop ljud- och grafikfiler och eventuellt en spelfil till en enda fil, så att det blir lättare att distribuera ett spel).
Drakmagi Exempelspelet Drakmagi. Ett komplett textäventyr för både Z-kod och Glulx, med viss grafik vid kompilering till Glulx.
Hus Programmeringshandledningen Hus. Källkod för ett enkelt textäventyr som gradvis byggs ut i åtta steg.
Lib611 Innehåller det engelska Inform-biblioteket, de fyra filer som behövs för översättningen till svenska, samt infglk.h - en uppsättning konstanter som gör att man kan skriva Glulx-kod mycket mer begriplig.
Manteln Exempelspelet Den mörka manteln. Ett minispel som ändå har några rum, ett bestämt mål, poängräkning och lite enkel programmering. Med i biblioteket finns även en HTML-version av koden, där man kan peka på olika nyckelord och få en förklaring av vad de gör.
Test1 Exempelspelet Test1. Litet och enkelt spel som dock demonstrerar många av de tekniker som man behöver använda när man skriver egna spel.

1.3 Skillnader mellan det svenska och engelska biblioteket

Det allra mesta är sig likt, så dessa instruktioner behandlar endast det som fungerar annorlunda jämfört med att skriva spel med den engelska versionen (dvs originalversionen) av biblioteket. Enkelt uttryckt är det bara inmatning av text samt utmatning av text som skiljer sig. Världsmodellen, och därmed det mesta som rör programmeringen, ligger fast. Det som skiljer sig vad gäller inmatning och utmatning av text kan delas upp i följande punkter:

  • Genus - Svenskan har fyra genus (kön) medan engelskan bara har tre.
  • Utskrift av artiklar - Svenskan har mer komplicerade regler än Engelskan för vilka artiklar som ska skrivas ut och när.
  • Utskrift av namn - Svenskan böjer både adjektiv och substantiv i bestämd form.
  • Utskrift av tal - I svenskan spelar det roll vilket genus det är på det man räknar, eller om man räknar utan att åsyfta något objekt alls.
  • Spelarens inmatning - De tillgängliga kommandona är desamma som i originalbiblioteket, men alla ord och grammatik är översatta till svenska.
Alla dessa skillnader förtydligas med utförliga förklaringar och exempel i kapitlet om programmering.

1.4 Kompletterande litteratur

De som aldrig har programmerat innan rekommenderas att börja med att läsa The Inform Beginner's Guide, ofta kallad IBG - en pedagogisk introduktion till Inform som börjar från absoluta början.

Om man har någon erfarenhet av programmering och tycker det är enklast att lära sig med exempel, kan man prova att gå igenom programmeringshandledningen Hus, som finns med i stora distributionen. Se stycke 1.5 nedan.

Graham Nelson, som har gjort Inform, har även dokumenterat det grundligt, och resultatet är den ganska digra volymen The Inform Designer's Manual, 4th Edition, ofta kallad DM4. DM4 är gjord för att läsas från pärm till pärm, och den är inte direkt tungläst. Innehållsförteckningen och index-delen samt det faktum att det är den mest kompletta dokumentationen av Inform gör att den även är det viktigaste referensverket. Många har lärt sig Inform genom att bara läsa DM4.

Den svenska dokumentationen är mycket liten jämfört med IBG och DM4. Min rekommendation är att först läsa en eller båda av dessa och försöka göra ett litet testspel på engelska, för att lära sig grunderna i det engelska biblioteket. När man kan det, läser man avsnittet om programmering i detta dokument, och det kapitlet kommer då förhoppningsvis upplevas som lättsmält och logiskt. Om man läser det utan att kunna något om Inform kan det däremot säkert upplevas som ganska kryptiskt. För mer detaljerade läsråd vad gäller IBG och DM4, se Roger Firth's Inform FAQ.

Både IBG och DM4 finns tillgängliga på:

http://www.inform-fiction.org/manual/

Tips: Tryck F1 i Crimson Editor för att öppna DM4. Både DM4 och IBG finns även tillgängliga på startmenyn.

I skrivande stund är DM4 inte uppdaterad för att innefatta de små men viktiga förändringar och förbättringar som Inform v6.30 och Informbiblioteket v 6/11 innebär. För att få ett grepp om dessa förändringar kan det vara bra att även läsa Release Notes för Inform 6.3 (ett annat namn på Inform 6.30), som kan hämtas från:

http://www.ifarchive.org/indexes/if-archiveXinfocomXcompilersXinform6.html

Om man vill använda grafik och ljud i sitt spel vill man troligen kompilera till Glulx istället för Z-kod. Förutom de tidigare nämnda länkarna till Inform-dokumentation kan man behöva lite dokumentation om hur man inkluderar grafik och ljud i Glulx-spel, samt vad som faktiskt skiljer Glulx från Z-kod. Här finns en del information:


http://eblong.com/zarf/glulx/inform-guide.txt
http://www.firthworks.com/roger/glulx/chars.html
http://www.firthworks.com/roger/glulx/blorb.html
http://adamcadre.ac/gull/
http://members.aol.com/doepage/glkdunces.htm

Om man får problem med Inform-programmering i allmänhet kan man vända sig till Usenet-gruppen rec.arts.int-fiction, vilken t ex kan nås på:

http://groups.google.com/group/rec.arts.int-fiction

Om man har problem med att förstå eller använda den svenska översättningen av biblioteket, går det bra att maila mig på adressen nedan. Man kan även gå med i mailinglistan för alla som är intresserade av att skriva textäventyr på svenska, vilken även fungerar som support för Swedish Inform, och där nya versioner av Swedish Inform påannonseras:

http://groups.yahoo.com/group/skriva_textaventyr/

Det finns mycket skrivet om hur man bygger upp ett textäventyr på ett bra sätt, dels sådant som fokuserar på tekniken, men även sådant som helt lämnar de tekniska bitarna. Några bra ställen att börja på är t ex:

http://www.brasslantern.org/writers/
http://www.microheaven.com/Textaventyr/
http://emshort.wordpress.com/writing-if/
http://www.plover.net/~textfire/raiffaq/

Buggrapporter och tips om förbättringar för det svenska biblioteket är givetvis också alltid välkomna. Det vore också roligt att bara få höra om biblioteket kommer till användning, och kanske höra om vilka spel som är under utveckling eller som har släppts. Även rapporter om vilka kompilatorer och tolkar som fungerar bra eller mindre bra med svenska tecken är mycket intressanta, för att jag ska kunna bygga upp en så komplett lista som möjligt på hemsidan för Swedish Inform. Tveka inte att skicka ett mail till:

1.5 Programmeringshandledningen Hus

Med i Swedish Inform finns även en programmeringshandledning kallad Hus. Den är tänkt som ett enkelt sätt att komma in i Inform-programmering för personer med någon tidigare erfarenhet av programmering. Hus är ett enkelt textäventyr som byggs ut steg för steg i åtta delar. Ladda in hus1.inf, läs igenom källkoden och alla kommentarer, och kompilera det sedan till en z5-fil eller ulx-fil som du sedan kan provköra. Självklart kan det vara en god idé att göra en kopia av källkodsfilen och göra små förändringar för att se om man förstått rätt. Gå sedan vidare med hus2.inf och så vidare upp till hus8.inf. Varje del har rikliga kommentarer om allt som är nytt.

Tips: Om du laddar in inf-filerna i Crimson Editor får du syntax-färgning, vilket gör det lättare att läsa källkoden. Då kan du även använda Ctrl-1 för att snabbt kompilera koden, och Ctrl-2 för att provköra det kompilerade spelet.

2. KOMPILERING

Den här avdelningen handlar om hur man kompilerar, och till viss del hur man spelar, spel utvecklade med Swedish Inform.

2.1 Plattform

Detta paket i allmänhet och dessa instruktioner i synnerhet är i första hand utformade för Windows-användare. Detta är bara av praktiska skäl, grundat på att de allra flesta idag använder Windows. Biblioteket i sig är plattformsoberoende och kan med lika gott resultat användas på en rad andra plattformar. För att kompilera på en annan plattform måste man ha Inform- kompilatorn för den plattformen. Den finns att ladda ner för alla populära plattformar. För att spela de färdiga spelen behöver man en tolk, dvs ett program som läser spelfilen och visar spelet för spelaren. Spelfilen är helt plattformsoberoende, medan man måste ha en tolk som är skriven för ens egen plattform. Dessa tolkar finns i många varianter för mängder av olika plattformar. Information om alla de tekniker som används av Swedish Inform finns samlat på:

http://swedish.ramsberg.net

Alla tillgängliga distributioner av kompilatorn finns i regel på:

http://www.ifarchive.org/indexes/if-archiveXinfocomXcompilersXinform6Xexecutables.html

De flesta tolkar för Z-kod finns samlade på:

http://www.ifarchive.org/indexes/if-archiveXinfocomXinterpreters.html
(Frotz är mycket populär, och täcker de flesta plattformar.)

Tips: Z-kods-tolken Windows Frotz ingår i installerardistributionen. Efter att du kompilerat ett spel med Ctrl-1 i Crimson Editor, tryck Ctrl-2 för att starta det i Windows Frotz.

Tolkar för Glulx kan hämtas från:

http://www.ifarchive.org/indexes/if-archiveXprogrammingXglulxXinterpreters.html

Tips: Glulx-tolken WinGlulxe ingår i installerardistributionen. Efter att du kompilerat ett spel med Ctrl-5 i Crimson Editor, tryck Ctrl-6 för att starta det i WinGlulxe.

2.2 Användning

För att kompilera ett spel med detta bibliotek måste man bara tänka på att ange för kompilatorn att man vill använda den svenska språkfilen, samt se till att själv inkludera de tre övriga filerna som ingår i biblioteket på rätt ställe i sin källkod. Att hänvisa till den svenska språkfilen gör man smidigast genom att som första rad i programmet skriva:
!% +language_name=Swedish
För att kompilera med Inform till Z-kod skriver man typiskt:
C:\Inform\Swedish\Bin\inform +C:\Inform\Swedish\Lib611 -C1 spelnamn

Tips: Ladda in inf-filen i Crimson Editor och tryck Ctrl-1 för att kompilera den till en z5-fil. Om du får kompileringsfel kan du dubbelklicka på felmeddelandet för att gå direkt till rätt rad i koden.

Det ovanstående skrives som en rad vid kommandoprompten. Byt först ut C:\Inform\Swedish mot det ställe på hårddisken där du har packat upp detta paket, och byt ut spelnamn mot namnet på din inf-fil.

För att se i vilken ordning man ska inkludera de olika filerna, läs filen bas.inf, vilken innehåller ett fullt kompilerbart kodskelett för ett spel på svenska.

Att kompilera ett Glulx-spel är något mer komplicerat, i alla fall om det ska innehålla multimediaresurser och ska paketeras som en Blorb-fil (.blb). Studera exempelspelet Drakmagi närmare för att se hur det går till om man använder det medskickade paketet iBlorb av L. Ross Raszewski. Det finns även dokumentation om iBlorb.

2.3 Exempel

Med detta bibliotek följer fyra kompilerbara filer:

bas.inf

För att kompilera: Ställ dig i den katalog där du packat upp detta paket. Skriv sedan:
bin\inform +Lib611 -C1 bas

Tips: Ladda in bas.inf i Crimson Editor och tryck Ctrl-1 för att kompilera det. Om kompileringen lyckades kan du trycka på Ctrl-2 för att provköra spelet.

test1.inf

För att kompilera: Gå in i katalogen Test1. Kör maketest.bat. Detta kompilerar spelet till både Z-kod (test1.z5) och Glulx (test1.ulx).

Tips: Du kan också ladda in test1.inf i Crimson Editor och trycka Ctrl-1 för att kompilera till en z5-fil, vilken du sedan kan starta med Ctrl-2. Vill du använda Glulx-formatet trycker du istället Ctrl-5 för att kompilera spelet och Ctrl-6 för att starta det.

manteln.inf

För att kompilera: Gå in i katalogen Manteln. Kör makemanteln.bat. Detta kompilerar spelet till både Z-kod (manteln.z5) och Glulx (manteln.ulx).

Tips: Du kan ladda in manteln.inf i Crimson Editor och trycka Ctrl-1 för att kompilera till en z5-fil, vilken du sedan kan starta med Ctrl-2. Vill du använda Glulx-formatet trycker du istället Ctrl-5 för att kompilera spelet och Ctrl-6 för att starta det.

drakmagi.inf

Detta spel är skrivet för att kunna kompileras antingen till Z-kod eller till Glulx, med en del grafik vid vid kompilering till Glulx.

För att kompilera till Z-kod: Gå in i katalogen Drakmagi. Kör Zcompile.bat.

Tips: Du kan ladda in drakmagi.inf i Crimson Editor och trycka Ctrl-1 för att kompilera till en z5-fil, vilken du sedan kan starta med Ctrl-2.

För att kompilera till Glulx: Gå in i katalogen Drakmagi. Kör Gcompile.bat.

3. PROGRAMMERING

Den här avdelningen handlar om hur programmering av spel med Swedish Inform skiljer sig från programmering med det engelska biblioteket.

3.1 Genus

Svenskan har fyra genus: maskulinum, femininum, neutrum och reale. I biblioteket heter de male, female, neuter och uter. Objekt som har animate-attributet antas vara male om man inte har givit dem något annat genus. Övriga objekt antas vara uter om man inte givit dem något genus. Om man vill vara säker på att ett visst objekt har något genus satt, så måste man köra rutinen SetGender(obj) först. Därefter har objektet garanterat minst ett av genus-attributen satt. SetGender undersöker om objektet har något genus. Om det inte har det, så får det genuset male om det har attributet animate, och annars får det genuset uter.

Man kan även använda SetGender för att byta genus på ett objekt. SetGender(obj, neuter) gör t ex att objektet obj får genuset neuter, och tappar det eller de genus det tidigare eventuellt hade.

Ett objekt kan ha två genus samtidigt. Detta är bl a tänkt att användas för objekt som är maskulina eller feminina, men ändå ska behandlas som neutrum vid utskrifter. Exempel på sådana objekt kan vara "hondjuret", "det glada lejonet" och liknande. Dubbla genus påverkar även vilka personliga pronomen spelaren kan använda för att referera till objektet. Om man t ex har en kvinnlig drake i sitt spel kan man ge den både female och uter, för att spelaren ska kunna skriva antingen "undersök draken. slå på den." eller "undersök draken. slå på henne.". Objektet ges två genus genom att man helt enkelt sätter två av genusattributen för objektet.

3.2 Namnutskrift

Det system som finns för att skriva ut artiklar och namn på objekt i originalbiblioteket visar sig snabbt bli både osmidigt och otillräckligt för svenska. Därför har detta system omarbetats en del.

Här följer en lista av alla de properties och attribut som generellt påverkar hur ett objekts namn skrivs ut. Observera att de properties som används i speciella situationer i standardbiblioteket fortfarande kan användas, såsom invent, when_on, when_open osv.

Properties som påverkar artikeln

articles sträng, rutin eller array med 3 värden ( CDef, Def, Indef ), där varje värde kan vara en sträng som ska skrivas ut eller 0 om inget ska skrivas ut. Artiklarna ska inte avslutas med mellanslag.

Attribut som påverkar artikeln

male Objektet är en "han".
female Objektet är en "hon".
uter Objektet är en "den".
neuter Objektet är en "det".
proper Objektets namn ska aldrig föregås av en artikel.
pluralname Objektets namn är i pluralform (som t ex "byxor").
def_article Objektets namn ska föregås av en artikel även i bestämd form.

Properties som påverkar namnet

objektets namnsträng Sträng (den som anges i objekthuvudet).
short_name Sträng eller rutin.
short_name_indef Sträng eller rutin.
short_name_def Sträng eller rutin.
plural Sträng eller rutin. Det namn som objektet ska ha om det vid utskrift grupperas ihop med andra likadana objekt.

Attribut som påverkar namnet

(finns inga)

Hur ett objekt skrivs ut

När namnet på ett objekt ska skrivas ut används, i prioriteringsordning:
  1. short_name_indef eller short_name_def, för obestämd respektive bestämd form
  2. short_name
  3. objektets namnsträng

Om en av ovanstående properties innehåller en sträng, skrivs den ut. Om den innehåller en rutin, körs den. Om rutinen vill tala om för biblioteket att den har skrivit ut namnet, ska den returnera true. Annars fortsätter biblioteket till nästa punkt i listan ovan.

Ett stycke ner i detta kaptiel följer en uppsättning vettiga exempel som troligen är det bästa sättet att lära sig använda systemet. Titta även på källkoden till exempelspelen för att se hur det fungerar.

En mer exakt beskrivning av hur objekt skrivs ut finns i Appendix A. Denna beskrivning kan vara bra att ha när man är i behov av ett särskilt komplicerat objektnamn, eller när man behöver felsöka ett objekt som inte uppträder som väntat.

Bestämd artikel och stor bokstav

I svenskan skrivs ingen bestämd artikel ut före ett objektnamn, om namnet inte föregås av ett eller flera adjektiv (jmf "bollen" resp "den stora bollen"). Biblioteket utgår ifrån att endast objekt som har attributet def_article ska ha artikel i bestämd form. Objekt som har attributet proper skrivs aldrig med artikel före, varken i bestämd eller obestämd form. Detta används främst för personnamn.

Om man skriver ut ett objekt med utskriftsdirektivet (A) eller (The) så skrivs artikeln ut med stor bokstav. Om ingen artikel ska skrivas ut, blir det istället första bokstaven i objektets namn som blir stor. Om man vill hindra biblioteket från att skriva ut objektnamnet med stor bokstav, måste objektet ha en namnutskriftsrutin (short_name, short_name_indef, short_name_def). I den rutinen kan man detektera att biblioteket tänker sätta stor bokstav på namnet genom att testa om caps_mode har värdet true eller false. Man kan förhindra att första bokstaven blir stor genom att sätta caps_mode till false i denna rutin. Exempel:

Object rymdman "ooga-boo"
  with
    name 'rymdman' 'ooga-boo',
    short_name [;
      caps_mode = false;
    ],
  has animate proper;

Exempel på ett helt vanligt objekt som låter biblioteket styra när det ska vara stor bokstav:

Object Boll "boll"
  with
    name 'boll' 'bollen',
    short_name_def "bollen";

Detta objekt kan nu skrivas ut i följande former:

print (name) Boll; ! skriver ut "boll"
print (a) Boll;    ! skriver ut "en boll"
print (A) Boll;    ! skriver ut "En boll"
print (the) Boll;  ! skriver ut "bollen"
print (The) Boll;  ! skriver ut "Bollen"

Namnutskrift i praktiken

Här följer exempel på några typiska sätt att definiera namn på ett objekt. Fall 1-5 nedan är enkla och är de som används nästan hela tiden. De övriga fallen förekommer endast undantagsvis, men de är förstås viktiga när man väl behöver dem. Objekt kan givetvis även vara en kombination av dessa fall.

  1. Objekt med ett enkelt namn, utan adjektiv (ska inte ha bestämd artikel)
    Object vaeska "väska"
      with
        name 'väska' 'väskan',
        short_name_def "väskan";
    
  2. Objekt med ett enkelt namn, med adjektiv (ska ha bestämd artikel)
    Object groen_vaeska "grön väska"
      with
        name 'grön' 'gröna' 'väska' 'väskan',
        short_name_def "gröna väskan",
      has def_article;
    
  3. Objekt som inte har default-genus (male för objekt med animate-attributet, uter för övriga)
    Object hus "hus"
      with
        name 'hus',
        short_name_def "huset",
      has neuter;
    
  4. Objekt med samma namn i bestämd och obestämd form, utan artikel
    Object gunnar "Gunnar"
      with
        name 'gunnar',
      has animate proper;
    
  5. Objekt med pluralnamn
    Object -> kulor "kulor"
      with name 'kulor' 'kulorna',
        short_name_def "kulorna",
      has pluralname;
    
  6. Objekt med olika rutiner för namnutskrift i bestämd och obestämd form
    Object laada "låda"
      with
        name 'låda' 'lådan',
        short_name_indef [;
          if(self has open)
            print "uppbruten ";
          print "gammal låda";
          rtrue;
        ],
        short_name_def [;
          if(self has open)
            print "uppbrutna ";
          print "gamla lådan";
          rtrue;
        ],
      has def_article container;
    
  7. Objekt med samma rutin för namnutskrift i både bestämd och obestämd form
    Object lampa "lampa"
      with
        name 'lampa' 'lampan',
        short_name [;
          if(self has light) print "klart lysande "
          print "lampa";
          if(indef_mode==false) print "n";
          rtrue;
        ],
        articles [;
          if(indef_mode==false && self has light) {
              print "den";
              rtrue;
          } else if(indef_mode==true) {
            print "en";
            rtrue;
          }
        ];
    
  8. Klasser (vilka som bekant inte kan ha någon vanlig namnsträng)
    Class Soffa
      with
        name 'soffa' 'soffan',
        short_name_indef "soffa",
        short_name_def "soffan";
    
  9. Klasser som används för att skapa flera likadana objekt
    Class Mynt
      with
        name 'mynt' 'myntet' 'mynten//p',
        short_name_indef "mynt",
        short_name_def "myntet",
        plural "mynt",
      has neuter;
    
  10. Objekt med speciella artiklar
    Object skolkatalog "gammal skolkatalog"
      with
        name 'skolkatalog' 'skolkatalogen' 'katalog' 'katalogen'
             'gammal' 'gamla',
        short_name_def "gamla skolkatalog",
        articles "Din" "din" "en";
    
  11. Objekt med speciell artikel i obestämd form, men ingen artikel i bestämd form
    Object saedeskorn "sädeskorn"
      with
        name 'sädeskorn' 'sädeskornen' 'några' 'dussin' 'dussinen',
        short_name_def "sädeskornen",
        articles 0 0 "några dussin",
      has pluralname;
    

3.3 Utskrift av personliga pronomen

Om man behöver skriva ut ett personligt pronomen eller liknande, finns följande utskriftsdirektiv att tillgå (med exempel på utskrift för olika objekt):

                                  bord   stol   Gunnar    Eva    träden

print (CDenEllerHan) obj;         Det    Den    Han       Hon    De
print (DenEllerHan) obj;          det    den    han       hon    de
print (CDenEllerHonom) obj;       Det    Den    Honom     Henne  Dem
print (DenEllerHonom) obj;        det    den    honom     henne  dem
Exempel på användning av personliga pronomen:
Object drake "drake"
  with
    name 'drake' 'draken',
    short_name_def "draken",
    life [;
      Give: remove noun; ! Ta bort objektet från spelet
            "Draken kastar en slö blick på ", (the) noun,
               " innan hon kastar in ",(DenEllerHonom) noun,
               " i sitt enorma gap och sväljer. ~",
               (CDenEllerHan), " smakade inte dumt!~, tillägger hon.";
    ],
  has animate female uter;

3.4 Utskrift av tal

För att skriva ut tal med bokstäver använder man rutinen SwedishNumber:
SwedishNumber(n, force_neuter_1, obj, gender);

Det finns i princip tre sätt att anropa SwedishNumber:
1: Med force_neuter_1=true:
SwedishNumber(n, true);
Skriver ut tal som ej är kopplade till något objekt. En etta i slutet av ett tal skrivs alltid som "ett". Exempel: Ett, två, ..., tjugoett. Användningsområde: T ex utrop av könummer eller bingonummer.
2a: Med gender=neuter:
SwedishNumber(n, false, false, neuter);
Talet 1 skrivs som "ett", men andra tal som slutar på 1 skrivs med "en" på slutet. Exempel: Ett, två, ..., tjugoen.
2b: Med gender=uter:
SwedishNumber(n, false, false, uter);
Alla tal som slutar på 1 skrivs med "en" på slutet. Exempel: En, två, ..., tjugoen.
3: Med ett objekt:
SwedishNumber(n, false, obj);
Skriver ut talet som om det gäller antalet av objektet obj. Om obj har attributet neuter blir det som fall 2a, annars som fall 2b.

Om man anropar SwedishNumber(n), alltså med bara det första argumentet angivet, fungerar det som fall 2b ovan.

3.5 Debug-verb

De debug-verb som finns i det engelska biblioteket har lämnats oöversatta i den svenska översättningen. De heter alltså precis som i det engelska biblioteket, och fungerar likadant. Det finns även ett debug-verb som inte nämns i DM4, nämligen "glklist", vilket ger en lista av alla Glkobjekt i ett Glulx-spel.

Det har även tillkommit ett helt nytt debug-verb: "örnkolla" - det går igenom alla objekt och letar efter sådant som troligen är missar från programmerarens sida. Bl a testar det att alla ord som används i namnen för objekt också finns med som synonymer (name-propertyn). Använd "örnkolla" när du har lagt till nya objekt eller ändrat i existerande. Om den rapporterar några objekt som verkar konstiga kan de behöva mer testande.

Det viktigaste sättet att använda örnkolla är att bara skriva "örnkolla". Då går rutinen igenom alla objekt i spelet, sorterar bort de objekt som det verkar som att spelaren inte ska kunna referera till, och kollar efter symptom på misstag i de resterande. De objekt som sorteras bort är framför allt rum.

Man kan även skriva "örnkolla vilka". Då listar rutinen alla objekt, och markerar vilka som sorteras bort av den automatiska kollen. Om man nu ser att rutinen gör ett misstag - att ett objekt som borde kollas faktiskt sorteras bort, då kan man skriva "örnkolla [objektnamn]" alternativt "örnkolla [objektnummer]". Objektnumret för alla objekt kan man se när man skriver "örnkolla vilka". Ser man t ex att man har en fackla som inte kollas, och den har objektnummer 32, så kan man skriva antingen "örnkolla fackla" eller "örnkolla 32", så kollas endast detta objekt.

4. ÖVRIGT

Här följer mer allmän information om och kring Swedish Inform.

4.1 Kompatibilitet

Denna version av Swedish Inform är gjord för att användas tillsammans med Informkompilatorn v6.31 och Inform-biblioteket v6/11. Den fungerar även med v 6.30 av kompilatorn, och har goda chanser att fungera med senare versioner av både kompilatorn och biblioteket, så länge huvudversionsnumret fortfarande är 6. Det fungerar inte med tidigare versioner varken av kompilatorn eller biblioteket. Det finns i nuläget inga planer på att stödja Inform 7.

Ingen modulkompilering

Informkompilatorn stödjer något som kallas modulkompilering, men den funktionen är inte kompatibel med Swedish Inform. Modulkompilering är en teknik som ska förkorta kompileringstiden, men den innebär samtidigt vissa begränsningar, och valfri PC är idag så snabb att modulkompilering helt har spelat ut sin roll.

Svenska tecken i speltolkar

Spelen man skriver kan kompileras till två olika spelformat: Glulx och Z-kod. I princip ska man sedan kunna spela spelen med valfri tolk för respektive format. Man måste tyvärr notera att en del tolkar inte stödjer utskrift och/eller inmatning av svenska tecken. Några som klarar det galant är t ex Windows Frotz och Frotz 2.43 för Linux. Glulx-tolkar har bättre chanser att acceptera svenska tecken än Z-kods-tolkar, men för vissa plattformar där teckenuppsättningen ISO 8859-1 (även kallad Latin-1) ännu är ett okänt fenomen, som t ex MS-DOS, kan det fortfarande bli problem. Exempelspelet Drakmagi är testat med WinGlulxe, och det fungerar problemfritt. Notera även att spelaren kan skriva kommandot "transkription" vid prompten och därefter använda "aa" istället för å, "ae" istället för ä samt "oe" istället för ö, som t ex i "maala roeret med faergen". Detta fungerar i både Glulx och Z-kod, och är gjort för att hjälpa spelare som antingen har en dålig tolk, eller saknar svenskt tangentbord.

För den senaste informationen om rekommenderade kompilatordistributioner och tolkar, besök hemsidan på http://swedish.ramsberg.net

Svenska tecken på Macintosh

Inform-kompilatorn finns att ladda ner även för Mac. Problemet är att Mac använder en annan teckenkodning än resten av världen. De använder samma system som alla andra för de 128 första teckenkoderna, vilket bland annat täcker in alla tecken som behövs i engelskan, men sedan blir det helt annorlunda. Därför måste man göra sök-och-ersätt i alla källkodsfiler som innehåller svenska tecken och byta ut dem mot escape-koder som baserar sig på vanliga engelska tecken och därmed fungerar även på Mac. De goda nyheterna är dock att om man väl lyckas kompilera spel med svenska tecken i på en Mac, och de fungerar bra i en speltolk för Mac, då kan man vara 99% säker på att de fungerar bra på alla andra plattformar också. Detta beror på att kompilatorn producerar plattformsoberoende spelfiler.

Här är de filer som måste genomsökas:

  Drakmagi/drakmagi.inf
  Drakmagi/magic.inf
  Lib611/SweAlpha.h
  Lib611/Swedish.h
  Lib611/SwedishG.h
  Lib611/SweRout.h
  Manteln/manteln.inf
  Test1/test1.inf
Här är de tecken som måste bytas ut:
  å mot @oa
  ä mot @:a
  ö mot @:o
  é mot @'e
  Å mot @oA
  Ä mot @:A
  Ö mot @:O

4.2 Tack

Ett stort tack går till Johan Berntsson för hans arbete med betatestning, införandet av Glulx-kompatibilitet, samt skrivandet av det första riktiga spelet som använder Swedish-paketet och vänligheten att tillåta fri distribution av källkoden till det. Ett annat tack går till Fredrik Vuorela för hjälp med förbättring av dokumentationen. Tack även till Tomas Öberg som översatt programmeringshandledningen Hus från engelska till svenska.

Tack även till Graham Nelson, Andrew Plotkin, John Cater och L. Ross Raszewski för deras arbete med att utveckla de verktyg som distribueras med detta bibliotek.

Slutligen ett tack till de som gjort och fortsättningsvis gör ansträngningar för att Inform, Z-kod och Glulx-kod ska fungera fullt ut med svenska tecken. Till dessa hör bl a Rikard Peterson, Kirk Klobe och Kevin Bracey.

Appendix A: Namnutskrift

Del A: Förberedelser

1. Sätt indef_mode=true om namnet ska skrivas ut i obestämd form, annars false
2. Sätt caps_mode=true om namnet ska skrivas ut med stor bokstav, annars false

Del B: Artikelutskrift

3. Om objektet har 'proper', hoppa till 7.
4. Om objektet definierar 'articles':
   4.1 Om det är en array, hämta articles-->0, 1 eller 2, beroende på värdena
         på indef_mode och caps_mode.
       4.1.1 Om värdet är en sträng, skriv ut den, följd av ett mellanslag.
       4.1.2 Varken värdet är en sträng eller inte, hoppa till 7.
   4.2 Om det är en sträng, skriv ut den, följd av ett mellanslag och hoppa
         till 7.
   4.3 Om det är en rutin, kör den.
       4.3.1 Om den returnerar true, skriv ut ett mellanslag.
       4.3.2 Vad den än returnerade, hoppa till 7.
5. Om indef_mode==false och objektet inte har 'def_article', hoppa till 7.
6. Skriv ut objektets default-artikel ("en", "ett", "den", "det", "några",
     "de", eller ingenting.), följt av ett mellanslag om något skrevs ut.

Del C: Namnutskrift

7. Om objektet definierar 'short_name_indef' respektive 'short_name_def':
   7.1 Om det är en sträng, skriv ut den.
   7.2 Om det är en rutin, kör den. Om den returnerar false, hoppa till 8.
   7.3 Hoppa till 10.
8. Om objektet definierar 'short_name':
   8.1 Om det är en sträng, skriv ut den.
   8.2 Om det är en rutin, kör den.
       8.2.1 Om den returnerar false, hoppa till 9.
   8.3 Hoppa till 10.
9. Skriv ut objektets namnsträng.

Del D: Efterarbete

10. Om caps_mode sattes till värdet true från början, och det fortfarande har
      värdet true: Gör första bokstaven (i artikeln eller namnet) stor.
11. Återställ de ursprungliga värdena på indef_mode och caps_mode
Då ett objekt ska skrivas ut i infinitivform sätts caps_mode=false och indef_mode=NULL. Därefter börjar namnutskriften direkt på punkt 7 ovan.



© Fredrik Ramsberg,

Detta paket får i stort sett användas och spridas fritt. Se separat licens.