• Dialogsystem

    För ett tag sen så gjorde jag ett point-and-click äventyr, och en av de system jag utvecklade till det var ett enkelt script-format för att författa interaktiva dialoger. Nu har jag tagit mig tid till att städa upp och kommentera det lite, så tänkte jag skulle dela med mig av det.

    Jag ville ha ett format som är enkelt att läsa och editera, så man kan jobba fram dialogerna direkt i script-filerna, så jag ville inte använda ett befinitligt script-språk som redan har sina regler för syntax, utan skapade ett eget från scratch. Det är inte på några sätt ett fullfjädrat programmeringsspråk - jag föredrar att hålla koden i C/C++ - det är bara ett enkelt markup-språk.

    Här är ett exempel på ett dialog-skript, taget direkt från mitt spel:

    Kod:
    [ShowPicture]
    <O'Reilly> Have you seen this man around?
    <Bambi> Yeah, I've seen him with some of the *girls*.
    <O'Reilly> Did you see him with Amber last night?
    <Bambi> I *did*, now that you *mention* it...
    <O'Reilly> Any idea where he might have taken her?
    <Bambi> Probably to this *motel*... that's where he'd usually go....
    #UnlockMotel#
    
    [TalkToBambi]
    ^ Sorry to *bother* you, ma'am. I need to ask you some *questions*. @YouAcop
    ^ Well well well... ain't you a *classy* one. @Classy
    ^ Excuse me, do you know a woman by the name of Amber? @Amber
    ^^ I don't have any more questions right now. @EXIT
    
    [YouAcop]
    <Bambi> You a *cop* or something? Fuck off.
    <O'Reilly> *Believe* me, I hate those *bastards* just as much as you do.
    @RETURN
    
    [Classy]
    <Bambi> Errr.. No *offense*, pal, but you're not exactly one to *talk*.
    @RETURN
    
    [Amber]
    <Bambi> I knew Amber. But Amber is *dead*. 
    @RETURN
    Skriptet är uppdelat i Conversations, och en conversation definieras av ett ID inom hak-parenteser (ex. ShowPicture, TalkToBambi etc). Tanken är att man från koden startar en specifik conversation genom att ange dess ID. En conversation består av ett antal entries, som kan vara av typen Line, Option, Redirect eller Event, och löper tills inga fler entries finns, eller tills dess en Redirect med Id "EXIT" stöts på.

    Lines är de som börjar med ett karaktärs-ID inom < och > (t.ex. <O'Reilly>, <Bambi>). Dessa är repliker som är tänkta att spelas upp den ena efter den andra.

    Options börjar med ^ eller ^^ och är repliker som spelaren kan välja mellan - de följs av ett ID på den konversation som man ska hoppa till om alternativet väljs. Options som börjar med dubbla ^^ räknas som "bestående", och det innebär att man kan välja dem varje gång man spelar den dialogen, men de som börjar med ett enkelt ^ går bara att välja en gång.

    Events består bara av ett ID inom # tecken (t.ex #UnlockMotel#), och används för att kommunicera med spelet - om man vill att något ska hända, t.ex. att man får ett inventory-objekt, eller att en spel-variabel sätts, då skickar man ett unikt event som spelmotorn kan tolka och agera på.

    Redirects är som ett GOTO kommando. Det är bara ID:t på en konversation, som föregås av ett @ tecken för att visa att det är en redirect. Det finns dock två IDn som är reserverade specialare - EXIT (som innebär att man avslutar dialogen) och RETURN som innebär att man hoppar tillbaka till den konversation som ledde till denna.

    Här finns koden att ladda ned:
    http://www.colossusentertainment.com...System_1_0.zip

    Huvud-delen är själva parsern, som läser in dialog-filerna och ger ett API för att jobba med dess element. Dessutom finns en exempel-implementation av en "spelare" för dialogerna - men den kommer självklart att vara olika för varje spel. För att se ett annat exempel, kolla in koden för The Strangler.

    Koden är som vanligt fri att använda hursomhelst. Hoppas den kommer till nytta för nån.