$Id: svenska.html,v 1.34 2002/07/24 23:40:44 hpa Exp $

Stöd för svenska i VÄS MOO

VÄS MOO är ett MUD baserat på en LambdaMOO server och en kärndatabas kallad LambdaCore. Denna fil beskriver förändringar som vi gjort lokalt för att anpassa det till svenska.

Stöd i databasen

Standardnamn på exits

Svenska har väldigt många synonymer för riktningar, så om följande standardnamn används känner systemet automatiskt igen synonymer:

Om du skriver egna namn på exits, så kom ihåg att det första ("officiella") namnet bör passa in i meningen "Spelarnamn går riktning." (t.ex. Zytor går norrut.) Till exempel:

@dig "in i sfären,in" to #62

Stöd för svensk grammatik

Vi har infört ett objektorienterat genussystem på alla konkreta (fysiska) objekt. Alla fysiska objekt (d.v.s. som motsvarar verkliga föremål i spelvärlden) ska härstamma från $phys (#141). $phys definierar följade verb och properties:

Property Definition
OBJ .genus Objektnummer för genusobjektet som gäller det här objektet.
STR .dname Namn i bestämd form (t.ex. "den gröna gurkan")
Verb Definition
STR :dtitle() Egenligen definierad på $root_class; returnerar namn i bestämd form (motsvarande :title).
STR :dtitlec() Egenligen definierad på $root_class; returnerar namn i bestämd form med stor bokstav (motsvarande :titlec).
:set_dname(STR name) Sätter .dname. Motsvarar :set_name.
:set_genus(OBJ genus) Sätter .genus.
STR :genus_sub(STR text, LIST objekt [, LIST alt]) Se nedan.

För att göra det enklare att se till att .dname är korrekt satt, tar alla kommandon som sätter namn (@create, @rename, o.s.v) numera följande syntax:

namn,dnamn,alias,alias,...
namn:dnamn,alias,alias,...
namn:dnamn:alias,alias,...
I normalt användande ska namn ha obestämd artikel (en eller ett) och dnamn ha bestämd artikel (den, det eller de) om det normalt används (normalt om det finns ett adjektiv med i namnet.) Ingendera ska ha stor bokstav, utom för namn (som alltid ska skrivas som namn oavsett platsen i meningen.) För namn ska det inte vara någon obestämd artikel.

Till exempel:

@create $thing named "en grön gurka,den gröna gurkan,grön gurka,gröna gurkan,gurka,gurkan"
@create $phys named "ett staket,staketet,staket"
För att sedan sätta rätt genus på grejerna, använd kommandot @genus:
@genus gurka är rs
@genus staket är ns
Följande genus finns definierade:
maskulinum singularis (ms) #169
femininum singularis (fs) #170
reale singularis (rs) #171
neutrum singularis (ns) #172
maskulinum pluralis (mp) #173
femininum pluralis (fp) #174
reale pluralis (rp) #175
neutrum pluralis (np) #176
För att bygga texter med hjälp av detta finns det nya verbet $genus_utils:substitute och hjälpverbet :genus_sub definierat på $phys. Det senare används på följande sätt:
objekt:genus_sub(text [,{andra_objekt} [,{special}]])
... där objekt är huvudobjekt, normalt player, andra_objekt är andra föremål som behöver nämnas, och special används normalt inte. text kan vara en sträng eller lista av strängar, som kan innehålla följande specialsekvenser. Alla sekvenser börjar med % följt av en siffra; om siffran är 0 eller saknas avses huvudobjektet, annars avses ett objekt i listan andra_objekt; t.ex. %3n gäller det tredje objektet i listan andra_objekt. Dessutom kan alla sekvenser skrivas med stor bokstav, t.ex. %3N, för att få samma text med stor bokstav.

Sekvens Definition
nr n Objektets namn i obestämd form.
% ~ nr n Objektets namn i obestämd form, utan inledande en eller ett.
nr d Objektets namn i bestämd form.
% ~ nr d Objektets namn i bestämd form, utan inledande den, det, eller de.
nr s Objektets pronomen i subjektsform (t.ex. han).
nr o Objektets pronomen i objektsform (t.ex. honom).
nr r Objektets pronomen i reflexiv form (t.ex. sig).
nr p vad Objektets pronomen i possesiv form (t.ex. sin, sitt eller sina). Formen ska passa vad, som antingen kan vara en siffra av samma typ som nr (och då anpassas till motsvarande objekt) eller en bokstav n, t eller a för n-form (maskulinum, femininum eller reale), t-form (neutrum) eller pluralform, respektive.
nr g vad Objektets pronomen i genitivform (t.ex. hans). Formen ska passa vad, som antingen kan vara en siffra av samma typ som nr (och då anpassas till motsvarande objekt) eller en bokstav n, t eller a för n-form (maskulinum, femininum eller reale), t-form (neutrum) eller pluralform, respektive. (Formen används inte i tredje person, men har betydelse när man använder special, se nedan.)
nr e Artikel för ental i obestämd form, d.v.s. en eller ett. Om objektet är i plural blir det ingenting; dessutom utplånas eventuella blanktecken som följer kommandot.
nr ( property ) Innehållet av property på det respektiva objektet.
nr < verb > Anropar objekt:verb_sub("verb") och sätter i resultatet; om inte objekt:verb_sub existerar, sätter in verb omodifierat.
nr { n-form , t-form , pluralform } Välj fras beroende på det specificerade objektets genus. Kan användas b.la. för att prata om något i less specifika termer, t.ex. %{någon sådan,något sådant,några sådana}.
nr # Objektets objektnummer, t.ex. #123.

Användningen av special

Listan special specificerar att vissa objekt inte har sina normala pronomen; special börjar med huvudobjektet och sedan alla objekten i andra_objekt i tur och ordning. Om special saknar värden, eller värdena är icke-objekt (t.ex. 0) antas att det objektet inte har någonting speciellt.

Special används normalt med objekten $jag, $du, $vi och $ni för att få meddelanden att anpassa sig efter den det är riktat till. För att ytterligare underlätta, finns det två specialsekvenser som normalt ger namn, men ger pronomen om de används med special:

Sekvens Definition
nr m typ  Objektets namn i obestämd form (som %n), eller pronomen av typ typ.
nr c typ  Objektets namn i bestämd form (som %d), eller pronomen av typ typ.

Exempel på användning:

; me:genus_sub("%Ms äter %1d.", {#231})
=> "Zytor äter den gröna gurkan."
; me:genus_sub("%Ms äter %1d.", {#231}, {$du})
=> "Du äter den gröna gurkan."
; me:genus_sub("%Ms äter %1d.", {#233})
=> "Zytor äter det vita brödet."
; me:genus_sub("%Ms äter %1d.", {#233}, {$du})
=> "Du äter det vita brödet."

; me:genus_sub("%Ms äter %1n.", {#231}, {$du})
=> "Du äter en grön gurka."
; me:genus_sub("%Ms äter %1n.", {#231})
=> "Zytor äter en grön gurka."
; me:genus_sub("%Ms äter %1n.", {#233})
=> "Zytor äter ett vitt bröd."
; me:genus_sub("%Ms äter %1n.", {#233}, {$du})
=> "Du äter ett vitt bröd."

; me:genus_sub("%Ms sätter %r.")
=> "Zytor sätter sig."
; me:genus_sub("%Ms sätter %r.", {}, {$jag})
=> "Jag sätter mig."
; me:genus_sub("%Ms sätter %r.", {}, {$du})
=> "Du sätter dig."
; me:genus_sub("%Ms sätter %r.", {}, {$vi})
=> "Vi sätter oss."
; me:genus_sub("%Ms sätter %r.", {}, {$ni})
=> "Ni sätter er."

Sammanfattning av pronomen

Sekvens Singularis Pluralis Special
Maskulinum Femininum Reale Neutrum $jag $du $vi $ni
%s han hon den det de jag du vi ni
%o honom henne den det dem mig dig oss er
%r sig mig dig oss er
%pn sin min din vår er
%pt sitt mitt ditt vårt ert
%pa sina mina dina våra era
%gn hans hennes dess deras min din vår er
%gt mitt ditt vårt ert
%ga mina dina våra era
%e en ett <inget> Påverkas ej av special

Rekommenderad kodningsteknik

För maximal flexibilitet rekommenderas det att använda följade teknik för att koda meddelanden:

Lagra alla meddelanden som properties med namn som slutar med _msg. Denna konvention används i LambdaCore för att ange att detta är ett meddelande som kan sättas av en Builder eller annan användare. Ett exempel på en sådan sträng:

@prop #1234.spark_msg "%Ms sparkar till %1d."
Denna sträng kan ändras med kommandot:
@spark föremål is "%Ms sparkar till %1d."

Definiera ett verb som har som alias alla dina _msg-strängar. Detta verb definieras lämpligen som:

return player:genus_sub(this.(verb),{this,player.location,dobj,iobj},args);

Du kan sedan använda det i kod på följande sätt:

player:tell(this:spark_msg($du));
player.location:announce(this:spark_msg());

För det givna meddelandet, kommer den som gör något att se:

Du sparkar till den lustiga lilla strutsen.

... medan resten av alla närvande ser:

Zytor sparkar till den lustiga lilla strutsen.

En sak som är värd att tänka på är att ibland kan det vara lämpligt att ha olika meddelandesträngar för dig och alla andra. LambdaCore brukar ha ett "o" före den "offentliga" versionen av sådana meddelanden; t.ex. $thing har take_failed_msg som bara användaren ser, och otake_failed_msg som alla andra ser, men som normalt är blank. I det ovanstående exemplet kan du göra något som:

@prop #1234.spark_msg "%Ms sparkar till %1d.  Är %ms helt pucko?"
@prop #1234.ospark_msg "%Ms sparkar till %1d.  Har %s ballat ur totalt?"

player:tell(this:spark_msg($du));
player.location:announce(this:ospark_msg());
Du ser då:

Du sparkar till den lustiga lilla strutsen.  Är du helt pucko?

... medan resten av alla närvande ser:

Zytor sparkar till den lustiga lilla strutsen.  Har han ballat ur totalt?

Stöd i servern

Servern vet nu att mig och här är samma sak som me och here. Dessutom har prepositionsförrådet fått svenska synonymer:

Följade nya inbyggda funktioner har laggts till i servern för att stödja icke-ASCII-tecken:

Funktion Betydelse
INT isupper(STR c) Sant om första tecknet i c är en stor bokstav.
INT islower(STR c) Sant om första tecknet i c är en liten bokstav.
INT isalpha(STR c) Sant om första tecknet i c är en bokstav.
INT isdigit(STR c) Sant om första tecknet i c är en siffra.
INT isxdigit(STR c) Sant om första tecknet i c är en hexadecimal siffra.
INT isspace(STR c) Sant om första tecknet i c är ett blanktecken.
INT isprint(STR c) Sant om första tecknet i c är ett icke kontrolltecken.
INT isgraph(STR c) Sant om första tecknet i c är ett icke kontroll-, icke blanktecken.
INT ispunct(STR c) Sant om första tecknet i c är ett punkteringstecken.
INT iscntrl(STR c) Sant om första tecknet i c är ett kontrolltecken.
INT isalnum(STR c) Sant om första tecknet i c är en bokstav eller siffra.
INT isascii(STR c) Sant om första tecknet i c är ett tecken som finns i 7 bitars ASCII.
STR tolower(STR s) Returnerar en sträng med alla stora bokstäver i s utbytta mot små.
STR toupper(STR s) Returnerar en sträng med alla små bokstäver i s utbytta mot stora.
INT ord(STR c) Returnerar ISO-koden för första tecknet i c.
STR chr(INT n, ...) Returnerar en sträng med tecken av de givna ISO-koderna. Om de givna koderna inte är legala teckenkoder returneras E_INVARG. (Legala teckenkoder är f.n. 9, 32-126, och 161-255.)

Ytterligare lokala tillägg

Följande funktioner, som inte har något särskilt med språk att göra, har lags till:

Funktion Betydelse
STR ctime([INT t [, STR zon]]) Returnerar tiden t (eller nuvarande tid) som sträng. Om zon är angiven anpassa tiden till den angivna zonen. (zon är lokalt tillägg.)
FLOAT ftime() Returnerar nuvarande tid, som time(), men som flyttal.

... plus de följade för avancerad matematik:

Funktion Betydelse
FLOAT asinh(FLOAT x) Hyperbolisk arcsinus.
FLOAT acosh(FLOAT x) Hyperbolisk arccosinus.
FLOAT atanh(FLOAT x) Hyperbolisk arctangent.
FLOAT expm1(FLOAT x) Returnerar exp(x)-1, men med högre precision för värden nära x = 0.
FLOAT log1p(FLOAT x) Returnerar log(1+x), men med högre precision för värden nära x = 0.
FLOAT erf(FLOAT x) Returnerar 2/sqrt(pi) * integral[0..x] exp(-t^2) dt, en funktion som förekommer i sannolikhetslära.
FLOAT erfc(FLOAT x) Returnerar 1 - erf(x), men med högre precision för stora värden på x.
FLOAT lgamma(FLOAT x) Returnerar log(abs(gamma(x))), där gamma(x) = (x-1)!.
FLOAT j(INT n, FLOAT x) Returnerar besselfunktionen av första slaget Jn(x).
FLOAT y(INT n, FLOAT x) Returnerar besselfunktionen av andra slaget Yn(x).