Troberg
Sinister eater
- Joined
- 27 Jun 2001
- Messages
- 17,659
"Nya insikter i rollspelskonstruktion" eller "Hur man blir en fullfjädrad programmerare på fem minuter"
Inom programmeringen så har man de senaste 15-20 åren haft OOP, dvs objektorienterad programmering som buzzword. Som alla bra buzzwords så är det mycket fluff och marknadsföringstomgångsprat, men det finns också en solid kärna som är användbar. Lyssnar man på försäljarna så är den lösningen på alla problem med socker på, i praktiken är den bara ett sätt att strukturera sitt program. Det underlättar, men det är inte magiskt.
Varför pladdrar jag om programmering?
Jo, för att filosofin kan tillföra något till sättet att strukturera rollspel.
Först en turbointroduktion till OOP:
Tanken är att man, istället för att som traditionellt där programmet styr flödet i en viss ordning, har fristående objekt som interagerar med varandra. Ett objekt kan vara olika saker, det kan vara en färg, en fil, ett Word-dokument, en knapp eller något annat. De kan också ha hierarkier, till exempel så är ett Word-dokument också en fil.
Skulle man bygga upp en ordbehandlare från ett OOP-perspektiv (det här är ett exempel, ingen skulle göra på det här sättet på riktigt, men principen håller) så skulle man göra något i stil med att man börjar med ett teckenobjekt. Detta är ett enda tecken, vilket man kan applicera på andra objekt, tex en skärm eller en skrivare. Man kan också applicera andra objekt på teckenobjektet, tex färg, storlek och stiltyp. Detta objekt använder man sedan för att för att skapa ett nytt objekt, som ärver alla dess egenskaper och möjligheter, men som kan hantera flera tecken. Detta objekt ärver man sedan vidare in i ett sidobjekt och så vidare.
För att räknas som OO så brukar fyra krav ställas på ett språk:
- Inheritance (Arv)
Arv innebär att jag utifrån ett grundobjekt kan skapa nya objekt som har dess egenskaper, men som utökar det på något sätt. Ett Word-dokument ärver egenskaperna från en fil, och får då automatiskt all funktionalitet och alla egenskaper en fil har. Dokumentet behöver inte själv hålla rätt på hur filen kan döpas om, skickas via mail, läsas från disk, uppge sin storlek och sånt, det får det genom att tala om att det ärver från fil. Dock är dokumentet mer än en godtycklig fil, det har kompletterats med en massa saker för att beskriva en textmängd, diagram och annat pynt.
Ett mycket konkret exempel. Om jag köper en packe printerpapper, lägger dem i hålslaget och hålslår dem så kan man säga att objektet HålslagetPapper ärver Papper, dvs det är ett Papper, men med vissa tillägg.
Ett sätt att utgå från tidigare arbeten och bygga vidare på det andra gjort, samt att dela in lösningen i behändiga bitar helt enkelt. Kan beskrivas som "Är av typen..., fast med...".
- Encapsulation (Inkapsling)
En av mina favoriter. I grund och botten handlar inkapsling om att lägga kunskap på burk. Man kan dölja den interna konstruktionen för den som brukar ett objekt, till exempel så behöver inte vår Word-objekts-programmerare ha en aning om hur en fil egentligen ligger lagrad i olika block utspridda över en eller flera diskar, det har Fil-objekts-programmeraren löst åt honom och kapslat in det så att han slipper hantera det. Ungefär som att man inte behöver veta något om hur en startmotor är lindad eller vilka legeringar som används i ett tändstift för att vrida om tändningsnyckeln i en bil.
Ett sätt att leverera enkla, färdiga lösningar som står på egna ben. Kan beskrivas som "Tar hand om problemet...".
- Polymorphism (Mångfacetteradhet?)
Polymorphism är ett lite klurigare begrepp. Det hela bottnar i att ett objekt kan ha flera olika användningsområden som kan kräva att det visar lite olika beteenden. Låt oss återigen exemplifiera med bilar. Vad är en bil och vilka ansikten ska den visa utåt? Tja, den ska kunna förflytta en förare, så vi måste ha ett interface för föraren, i form av ett säte, styrdon och instrumentering. Den ska också kunna transportera passagerare, men de ska inte kunna styra så där räcker ett säte. För att kunna transportera last behöver den ha ett lastutrymme. För att passa mot vägen behöver den hjul. Och så vidare. Beroende på vem jag är (förare, passagerar, last, väg, mekaniker, bensinpump och så vidare) så ska jag se olika ansikten på bilen. Polymorphism ger också olika objekt möjlighet att bete sig på samma sätt. En människa har kanske interfacet äta vilket en robot inte har, men båda har interfacet greppa.
Ett sätt att ge flexibilitet i brukandet av ett objekt. Kan beskrivas som "Kan se ut som..." eller "Kan utföra operationen...".
- Operator overloading (Interaktionsflexibilitet)
Den här brukar vara den svåraste att förklara. Den handlar om att kunna definiera om hur objekt interagerar med varandra. För siffror är det redan definierat, 1+1=2 osv, men man måste ofta kunna tala om vad exempelvis röd+svart är, sant+falskt och så vidare. I vissa fall kan det finnas olika definitioner. Är skadad>halvdöd? Kanske för en människa, kanske inte för en robot.
Ett sätt att definierar hur olika objekt interagerar. Kan beskrivas som "Kan interagera med ... enligt...".
(Jag har medvetet undvikit att krångla till det genom att undvika att peta i distinktionen klass/objekt, eftersom den dels tenderar att vara svår att greppa för ickeprogrammerare, dels inte riktigt är relevant i sammanhanget.)
OK, vad innebär då det här i rollspelstermer?
Vi går genom ovanstående lista igen, denna gång så pratar vi om hur mekanismerna kan brukas i rollspel:
- Inheritance (Arv)
Arv används väldigt mycket i rollspel. Enklaste exemplet är i den mest grundläggande konstruktionen av alla, karaktärer. Karaktär är ett objekt. Detta ärvs av objekt som Barbar, Magiker och så vidare, vilka sedan ärvs av objekten SpelarKaraktär och SpelledarKaraktär. Dessa objekt i sin tur ärvs av objektet Tryggtorkel. Så man kan alltså säga att Tryggtorkel är en SpelarKaraktär, vilken är en Barbar, vilken i sin tur är en Karaktär.
Är inte det här då bara en jädra massa snack och överanalysrerande som inte ger något?
Nej, vi har faktiskt fått något. Genom att vi talar om att Tryggtorkel är en SpelarKaraktär så får han automatiskt hela paketet med regler och sånt som en SpelarKaraktären får. Genom att SpelarKaraktären är en Barbar så får vi hela Barbar regeluppsättning och framför allt så får vi genom att Barbaren är en Karaktär hela paketet regler som gäller för karaktärer.
Andra exempel är när man har en enkel grundkärna för reglerna, men med avancerade frivilliga regler. Om möjligt så bör man då lägga upp det enligt en liknande princip, dvs att man behåller arvet från de enkla reglerna oförändrat, men utökar dem med nya möjligheter. På så sätt påverkas inte ursprungsreglerna, eftersom de avancerade reglerna fortfarande är de enkla, men med lite påbyggnad.
Ytterligare ett exempel är sådant som grundegenskap, färdighet, fördelar, vapen och så vidare. Så längt som det är möjligt så ska alla fördelar ärva från samma grundobjekt, Fördel, och bara lägga till det som de behöver. Man ska ska undvika att bygga upp parallella mekansimer för samma sak. Visst, Vapen kanske behöver ärvas ner i underobjekten Närstridsvapen och Avståndsvapen, men så mycket som möjligt i regelmängden bör ligga i Vapen.
- Encapsulation (Inkapsling)
Här handlar det främst om två olika saker.
Först så bör man avgränsa olika objekt från varandra. Varje koppling mellan dem är en komplikation som måste hanteras och som kan gå fel. I de fall man måste koppla ihop dem så görs det via tydliga, väldokumenterade anslutningspunkter. Vi accepterar inte att att behöva öppna stereon för att löda fast högtalarkablarna direkt på kretskorter utan vi använder de dokumentarade och standardiserade uttagen på utsidan. På samma sätt så bör man undvika att göra regelmekanismer som är inne och påtar in de interna mekanismerna i andra regler. Man gör exempelvis en spell som delar ut skada som skadesystemet förväntar sig den, man gör den inte så att den är inne och petar i mekanismerna som styr hur man tar skada. Det viktiga är att för varje korsberoende fundera på om det verkligen är motiverat. Ger det så mycket att det är värt besväret för spelledaren att lära sig regeln, att administrera den och risken för problem då man ändrar i andra änden av beroendet? Är det verkligen viktigt nog för att motivera sin existens?
Den andra, vilken rent formellt antagligen är att tänja lite på begreppet, är att kapsla in krångligheterna i rätt skede. Om beräkningar krävs, gör dem i första hand när karaktären skapas, i andra hand när det inte är bråttom och först i tredje hand när man vill ha resultat direkt. Jag har själv "lånat" ett koncept i Generica där man i strid bara får reda på de stridsmässiga effekterna av skador. Hur mycket hindrar det mig? Kan jag fortfarande slåss? Först efter striden, när saker lugnat ned sig, tar man reda på hur illa skadorna verkligen är.
- Polymorphism (Mångfacetteradhet?)
Polymorphism i rollspel handlar huvudsakligen om att konsekvent använda samma mekanismer. Visst, ett slag mot en grundegenskap, ett färdighetsslag, en attack, ett turslag eller något annat slag kan operera på helt olika objekt och under olika omständigheter. Det innebär inte att de inte kan använda samma mekanism. Om man tittar på gamla AD&D så var det en katastrof i detta avseende, med olika slag för attacker, färdigheter, saves, magi, grundegenskaper och så vidare. Se till att de bitar som spelare och spelledare måste interagera med så långt som möjligt visar samma ansikte utåt. Ha så få mekanismer som möjligt, gör dem så enkla som möjligt och gör dem så lika som möjligt även om det opererar på helt olika objekt.
- Operator overloading (Interaktionsflexibilitet)
Den här är kanske den svåraste att se nyttan av i rollspelssammanhang, även om den poppar upp i vissa spel. GURPS första edition hade regler för hur man räknade om plusmodifikationer på skada till tärningar (tex blev en skada på 1D6+8 omräknad till 3D6+2 (om jag minns rätt)), D&D har det med sina dubbel skada-regler och sånt (x2 + x2 blir x3 om jag minns rätt), Vamprie och Ars Magica har det i sina skadesystem.
Jag skulle dock kunna tänka mig att detta tänkande kan användas i andra sammanhang, exempelvis kan ett magisystem ha regler för att luft+illusionism=buktaleri och så vidare.
Ska man se nyttan av det här så måste man nog tänja lite på begreppet. Man bör helt enkelt försöka göra systemet på ett sådant sätt att allt passar ihop med varannat. Saker och ting ska vara tillräckligt lika och förhållanden mellan dem tillräckligt väldokumenterade för att man ska kunna bygga ihop saker mer eller mindre ad hoc, utan att behöva ändra grundsystemet.
Summering:
Vad kan vi då vinna med det här? Kommer våra spel att bli helt revulotionerande?
Nej, antagligen kommer det inte att vara världsomvälvande, men genom att tänka strukturerat på detta sätt så får man spel som är enklare att lära sig och att spela. Vi sparar arbete, både för författaren och för brukaren. Framför allt så undviker vi att göra helt onödiga misstag som kan undvikas och som leder till onödigt krångel. Vi gör system som är enklare att modifiera, eftersom varje mekanism står på egna ben. Vi får en struktur i tanke som förhoppningsvis återspeglas i spelet och som gör det tydligare och begripligare. Vi får flexibilitet och stabilitet. Vi får system med robusta delar som hänger ihop med tydliga anslutningar och lagom glappassning för att vara tillförlitlig.
Inte stora skillnader, men många små steg i rätt riktning.
Någon som hängde med?
Inom programmeringen så har man de senaste 15-20 åren haft OOP, dvs objektorienterad programmering som buzzword. Som alla bra buzzwords så är det mycket fluff och marknadsföringstomgångsprat, men det finns också en solid kärna som är användbar. Lyssnar man på försäljarna så är den lösningen på alla problem med socker på, i praktiken är den bara ett sätt att strukturera sitt program. Det underlättar, men det är inte magiskt.
Varför pladdrar jag om programmering?
Jo, för att filosofin kan tillföra något till sättet att strukturera rollspel.
Först en turbointroduktion till OOP:
Tanken är att man, istället för att som traditionellt där programmet styr flödet i en viss ordning, har fristående objekt som interagerar med varandra. Ett objekt kan vara olika saker, det kan vara en färg, en fil, ett Word-dokument, en knapp eller något annat. De kan också ha hierarkier, till exempel så är ett Word-dokument också en fil.
Skulle man bygga upp en ordbehandlare från ett OOP-perspektiv (det här är ett exempel, ingen skulle göra på det här sättet på riktigt, men principen håller) så skulle man göra något i stil med att man börjar med ett teckenobjekt. Detta är ett enda tecken, vilket man kan applicera på andra objekt, tex en skärm eller en skrivare. Man kan också applicera andra objekt på teckenobjektet, tex färg, storlek och stiltyp. Detta objekt använder man sedan för att för att skapa ett nytt objekt, som ärver alla dess egenskaper och möjligheter, men som kan hantera flera tecken. Detta objekt ärver man sedan vidare in i ett sidobjekt och så vidare.
För att räknas som OO så brukar fyra krav ställas på ett språk:
- Inheritance (Arv)
Arv innebär att jag utifrån ett grundobjekt kan skapa nya objekt som har dess egenskaper, men som utökar det på något sätt. Ett Word-dokument ärver egenskaperna från en fil, och får då automatiskt all funktionalitet och alla egenskaper en fil har. Dokumentet behöver inte själv hålla rätt på hur filen kan döpas om, skickas via mail, läsas från disk, uppge sin storlek och sånt, det får det genom att tala om att det ärver från fil. Dock är dokumentet mer än en godtycklig fil, det har kompletterats med en massa saker för att beskriva en textmängd, diagram och annat pynt.
Ett mycket konkret exempel. Om jag köper en packe printerpapper, lägger dem i hålslaget och hålslår dem så kan man säga att objektet HålslagetPapper ärver Papper, dvs det är ett Papper, men med vissa tillägg.
Ett sätt att utgå från tidigare arbeten och bygga vidare på det andra gjort, samt att dela in lösningen i behändiga bitar helt enkelt. Kan beskrivas som "Är av typen..., fast med...".
- Encapsulation (Inkapsling)
En av mina favoriter. I grund och botten handlar inkapsling om att lägga kunskap på burk. Man kan dölja den interna konstruktionen för den som brukar ett objekt, till exempel så behöver inte vår Word-objekts-programmerare ha en aning om hur en fil egentligen ligger lagrad i olika block utspridda över en eller flera diskar, det har Fil-objekts-programmeraren löst åt honom och kapslat in det så att han slipper hantera det. Ungefär som att man inte behöver veta något om hur en startmotor är lindad eller vilka legeringar som används i ett tändstift för att vrida om tändningsnyckeln i en bil.
Ett sätt att leverera enkla, färdiga lösningar som står på egna ben. Kan beskrivas som "Tar hand om problemet...".
- Polymorphism (Mångfacetteradhet?)
Polymorphism är ett lite klurigare begrepp. Det hela bottnar i att ett objekt kan ha flera olika användningsområden som kan kräva att det visar lite olika beteenden. Låt oss återigen exemplifiera med bilar. Vad är en bil och vilka ansikten ska den visa utåt? Tja, den ska kunna förflytta en förare, så vi måste ha ett interface för föraren, i form av ett säte, styrdon och instrumentering. Den ska också kunna transportera passagerare, men de ska inte kunna styra så där räcker ett säte. För att kunna transportera last behöver den ha ett lastutrymme. För att passa mot vägen behöver den hjul. Och så vidare. Beroende på vem jag är (förare, passagerar, last, väg, mekaniker, bensinpump och så vidare) så ska jag se olika ansikten på bilen. Polymorphism ger också olika objekt möjlighet att bete sig på samma sätt. En människa har kanske interfacet äta vilket en robot inte har, men båda har interfacet greppa.
Ett sätt att ge flexibilitet i brukandet av ett objekt. Kan beskrivas som "Kan se ut som..." eller "Kan utföra operationen...".
- Operator overloading (Interaktionsflexibilitet)
Den här brukar vara den svåraste att förklara. Den handlar om att kunna definiera om hur objekt interagerar med varandra. För siffror är det redan definierat, 1+1=2 osv, men man måste ofta kunna tala om vad exempelvis röd+svart är, sant+falskt och så vidare. I vissa fall kan det finnas olika definitioner. Är skadad>halvdöd? Kanske för en människa, kanske inte för en robot.
Ett sätt att definierar hur olika objekt interagerar. Kan beskrivas som "Kan interagera med ... enligt...".
(Jag har medvetet undvikit att krångla till det genom att undvika att peta i distinktionen klass/objekt, eftersom den dels tenderar att vara svår att greppa för ickeprogrammerare, dels inte riktigt är relevant i sammanhanget.)
OK, vad innebär då det här i rollspelstermer?
Vi går genom ovanstående lista igen, denna gång så pratar vi om hur mekanismerna kan brukas i rollspel:
- Inheritance (Arv)
Arv används väldigt mycket i rollspel. Enklaste exemplet är i den mest grundläggande konstruktionen av alla, karaktärer. Karaktär är ett objekt. Detta ärvs av objekt som Barbar, Magiker och så vidare, vilka sedan ärvs av objekten SpelarKaraktär och SpelledarKaraktär. Dessa objekt i sin tur ärvs av objektet Tryggtorkel. Så man kan alltså säga att Tryggtorkel är en SpelarKaraktär, vilken är en Barbar, vilken i sin tur är en Karaktär.
Är inte det här då bara en jädra massa snack och överanalysrerande som inte ger något?
Nej, vi har faktiskt fått något. Genom att vi talar om att Tryggtorkel är en SpelarKaraktär så får han automatiskt hela paketet med regler och sånt som en SpelarKaraktären får. Genom att SpelarKaraktären är en Barbar så får vi hela Barbar regeluppsättning och framför allt så får vi genom att Barbaren är en Karaktär hela paketet regler som gäller för karaktärer.
Andra exempel är när man har en enkel grundkärna för reglerna, men med avancerade frivilliga regler. Om möjligt så bör man då lägga upp det enligt en liknande princip, dvs att man behåller arvet från de enkla reglerna oförändrat, men utökar dem med nya möjligheter. På så sätt påverkas inte ursprungsreglerna, eftersom de avancerade reglerna fortfarande är de enkla, men med lite påbyggnad.
Ytterligare ett exempel är sådant som grundegenskap, färdighet, fördelar, vapen och så vidare. Så längt som det är möjligt så ska alla fördelar ärva från samma grundobjekt, Fördel, och bara lägga till det som de behöver. Man ska ska undvika att bygga upp parallella mekansimer för samma sak. Visst, Vapen kanske behöver ärvas ner i underobjekten Närstridsvapen och Avståndsvapen, men så mycket som möjligt i regelmängden bör ligga i Vapen.
- Encapsulation (Inkapsling)
Här handlar det främst om två olika saker.
Först så bör man avgränsa olika objekt från varandra. Varje koppling mellan dem är en komplikation som måste hanteras och som kan gå fel. I de fall man måste koppla ihop dem så görs det via tydliga, väldokumenterade anslutningspunkter. Vi accepterar inte att att behöva öppna stereon för att löda fast högtalarkablarna direkt på kretskorter utan vi använder de dokumentarade och standardiserade uttagen på utsidan. På samma sätt så bör man undvika att göra regelmekanismer som är inne och påtar in de interna mekanismerna i andra regler. Man gör exempelvis en spell som delar ut skada som skadesystemet förväntar sig den, man gör den inte så att den är inne och petar i mekanismerna som styr hur man tar skada. Det viktiga är att för varje korsberoende fundera på om det verkligen är motiverat. Ger det så mycket att det är värt besväret för spelledaren att lära sig regeln, att administrera den och risken för problem då man ändrar i andra änden av beroendet? Är det verkligen viktigt nog för att motivera sin existens?
Den andra, vilken rent formellt antagligen är att tänja lite på begreppet, är att kapsla in krångligheterna i rätt skede. Om beräkningar krävs, gör dem i första hand när karaktären skapas, i andra hand när det inte är bråttom och först i tredje hand när man vill ha resultat direkt. Jag har själv "lånat" ett koncept i Generica där man i strid bara får reda på de stridsmässiga effekterna av skador. Hur mycket hindrar det mig? Kan jag fortfarande slåss? Först efter striden, när saker lugnat ned sig, tar man reda på hur illa skadorna verkligen är.
- Polymorphism (Mångfacetteradhet?)
Polymorphism i rollspel handlar huvudsakligen om att konsekvent använda samma mekanismer. Visst, ett slag mot en grundegenskap, ett färdighetsslag, en attack, ett turslag eller något annat slag kan operera på helt olika objekt och under olika omständigheter. Det innebär inte att de inte kan använda samma mekanism. Om man tittar på gamla AD&D så var det en katastrof i detta avseende, med olika slag för attacker, färdigheter, saves, magi, grundegenskaper och så vidare. Se till att de bitar som spelare och spelledare måste interagera med så långt som möjligt visar samma ansikte utåt. Ha så få mekanismer som möjligt, gör dem så enkla som möjligt och gör dem så lika som möjligt även om det opererar på helt olika objekt.
- Operator overloading (Interaktionsflexibilitet)
Den här är kanske den svåraste att se nyttan av i rollspelssammanhang, även om den poppar upp i vissa spel. GURPS första edition hade regler för hur man räknade om plusmodifikationer på skada till tärningar (tex blev en skada på 1D6+8 omräknad till 3D6+2 (om jag minns rätt)), D&D har det med sina dubbel skada-regler och sånt (x2 + x2 blir x3 om jag minns rätt), Vamprie och Ars Magica har det i sina skadesystem.
Jag skulle dock kunna tänka mig att detta tänkande kan användas i andra sammanhang, exempelvis kan ett magisystem ha regler för att luft+illusionism=buktaleri och så vidare.
Ska man se nyttan av det här så måste man nog tänja lite på begreppet. Man bör helt enkelt försöka göra systemet på ett sådant sätt att allt passar ihop med varannat. Saker och ting ska vara tillräckligt lika och förhållanden mellan dem tillräckligt väldokumenterade för att man ska kunna bygga ihop saker mer eller mindre ad hoc, utan att behöva ändra grundsystemet.
Summering:
Vad kan vi då vinna med det här? Kommer våra spel att bli helt revulotionerande?
Nej, antagligen kommer det inte att vara världsomvälvande, men genom att tänka strukturerat på detta sätt så får man spel som är enklare att lära sig och att spela. Vi sparar arbete, både för författaren och för brukaren. Framför allt så undviker vi att göra helt onödiga misstag som kan undvikas och som leder till onödigt krångel. Vi gör system som är enklare att modifiera, eftersom varje mekanism står på egna ben. Vi får en struktur i tanke som förhoppningsvis återspeglas i spelet och som gör det tydligare och begripligare. Vi får flexibilitet och stabilitet. Vi får system med robusta delar som hänger ihop med tydliga anslutningar och lagom glappassning för att vara tillförlitlig.
Inte stora skillnader, men många små steg i rätt riktning.
Någon som hängde med?