Showing posts with label rpg. Show all posts
Showing posts with label rpg. Show all posts

Thursday, 31 October 2019

Giving Players Difficult choices

I could probably write a lot about the second season of D&D which I have been running, but lets keep this simple and to the point. This is all about a season finale for a set of adventures and the difficult choices that it included and the results it had. There is quite a bit of background to read, but its worth the read to understand the importance of the decisions.

The season has been very much like a TV series, a set of episodes (one-shot adventures) with generally the same cast (player characters), but a few guest stars (PC's who join for a session or two). As the season progresses, there is a general theme to the adventures and the actions which the characters take have effects or consequences in later adventures. The players enjoy this style of play as it makes the campaign feel alive and it helps keep the story together.

The regulars

Of the table of 5-6, three of the regulars characters meshed themselves into the campaign story:

  • Eion the Dwarven Paladin of no-particular-god. At the end of season one, he was fighting along side a group of knights of Bahamut (good dragon god) and was rolling hopelessly. So out of frustration/desperation he called upon Tiamat (evil dragon god) for aid and started rolling well. Seeing an opportunity, I took it. We had the closing scene for Eion in a dream and Tiamat declaring that Eion was now his servant. And so he became a Paladin of Tiamat.
  • Sunny the Tiefling Warlock. Sunny is the parties chaos engine and McGuffin. She is a young Tiefling who was held for her entire life in captivity by a cult. She only broke away from them recently, murdering the cult in the process. So she has a rather naive/childish outlook on life, but the potential to also be destructive when she wants to. Her current fixations are her 'brother' (Eion), talking wolves, dragons and shiny things (which she puts in her mouth).
  • Tak the half elf Warlock. She is the parties mainly functional drunk. Spending most of the time drinking and trying to hit off anything male. When she first appeared, towards the end of season 1, she spent her first session trying to hit off with a Revenant knight, who was later lost into a portal to hell at the season finale
So quite an interesting bunch of characters to work with.

Beginning of the season

As the beginning of season 2, we were working through some of the old D&D adventurers league missions, which put the PC's against the dragon cult. The idea was for the adventurers to fight through cultist and kobolds, eventually working their way up to fighting a dragon. But no plan survives contact with the players. What actually happened was the first time they encounter a small dragon they hang back and start planning what to do. Eion walk's up and starts befriending the dragon, as he is a follower of Tiamat. Sunny decides that this is a good idea and joins him, and starts going all googly eyes over a real dragon, even if it is the size of a large dog. Eventually Lakonic (dragon hunting ranger) decides to try to kill the dragon, which promptly escapes and the PC's end up arguing on whether or not they should be fighting the dragons.

Errr... Scrap all current plans and go for plan B.

Then try to figure out what plan B is.

Plan B

Plan B involved activating my other bad guy. The Revenant knight (Sir Keegan) who was lost to a portal of hell and came back as an Incubus (male succubus). At the start of the season there has been a throwaway scene which saw the Keegan seducing Tak, sleeping with her and then flying off into the distance. At end of session I had asked Tak's player (out of earshot of the others) whether Tak was pregnant. Her response was, "why not".

Suddenly there was a plan B. Keegan started appearing regularly, finding a certain artifact (massive gem) and causing issues at the same time.

Season finale

Without going through the adventure details, the PC's had returned home from a mission to discover their home city covered in an energy dome, put there by Keegan. The party meet a rather angry, but powerful white dragon who demands they go into the city and find a big gem which the dragon has decided is his. They get in, fight Keegan, find the gem (a source of great magical power) which Tak picks up and then all hell breaks loose.
  • Tak with a demon baby inside her and a gem of vast magic in her hands suddently goes into spasm and her belly starts contorting (think Alien chest-burster) as the baby is coming out
  • Sunny who was distracted by the wonderful colours of the stained glass window of the Regents throne room (where they were all fighting) is standing in front of them when the angry dragon (Grathnax) bursts through, landing (on Sunny) and demanding his gem
I then called a break and handed out love letters to Eion, Sunny & Tak. 

The love letter is a idea I got from some of the PBTA RPG's. They gives each character a vignette and choices on what they wish to do. Normally they are not this drastic, but these letters gave each of the three characters the option to remove themselves from the story in a suitable dramatic manner, but they also has the option to keep their character providing dramatic salvation to them. By giving them time (the break) and encouraging them to talk between themselves, I hoped to get a suitably epic outcome to the story.

Here are the letters (as I gave it to them):

I hope you have enjoyed this season, and I hope you are ok with the story liberties I have taken with your characters to put them into this situation. Now its your turn to control the story. I have a set of possible options on how the story progresses and what happens to people. In the adventure introduction it was asked “How much are our heroes prepared to sacrifice to be victorious? Will this price be too high?” Lets find out.
There are no best choices: the right choice is the thing that gives the most epic and memorable story. I want you to make this story epic and memorable. 
For all these choices, if you can narrate a great event, go for it! If you would rather not, I will take any suggestions and run with the ideas.
Tak: Your stomach splits as the Cambion (Demon spawn) erupts from your body. 
  • Option1: Tak dies, Keegan dies/killed. You are joined together in the afterlife 
  • Option2: Tak dies, Keegan lives, Keegan remains on the dark side, (Sunny may yet try to kill Keegan, so he is not confirmed safe) 
  • Option3: Keegan dies restoring Tak’s life, Keegan is redeemed, Tak will be bitter forever 
  • Option4: Tak and Keegan live. But you are going to have to think of a very good reason why/how this can happen
Bonus: the Cambion is going to be a major force in the upcoming season, as the mother you get to name him (or her). Alternatively he will be known as Raphael
Sunny: You are badly (possibly mortally) wounded and under a dragons claw, it is looking down at you. Pain is making is difficult to see clearly, but you vaguely see a red-brown shape in the rafters and you remember Angelo’s words: “One day soon, you are going to be facing the open jaws of a dragon and it may be too late to change your mind. I pray that it is not”. You also know that, it's not just you who is in trouble, you can sense Eoin near you and know what a dreadful challenge he will be facing  
  • Option1: Sunny unleashed with whatever magic she has left, the dragon will lose an eye from your assault but it will eat Sunny. Eion will be free to act as he wishes (probably following Tiamat) 
  • Option2: Sunny stays put/feigns death/cries for help. This gives you time, but it means that Eion is going to have to make the toughest decision of his life 
  • Option3: (if Keegan is still alive) Sunny can burn the last of her life energy to destroy Keegan forever, but it will cost Sunny’s life
Eion: Tak is in a bad way, but Sunny is lying in a pool of pinkish blood under the claw of Grathanx. It looks at you smiling, challenging you, then it looks at the small form of the Tiefling under its claw and licks its lips hungrily. As for the voice of Tiamat, it is deathly silent, but you know she is watching you.
  • Option1: Kill Sunny. Prove your dedication to Tiamat by sacrificing everything. Eion will become a major NPC in the upcoming season and Sunny will be dead 
  • Option2: Join with the dragon on condition of sparing Sunny’s life. Eion will become a minor NPC in the upcoming season, but Sunny will live 
  • Option3: Suicide charge, you don’t stand a chance against this creature, but you could give is a scar or two so it remembers you by. You have no idea if this will save Sunny, but it will give her a chance 
  • Option4: Curse Tiamat and refuse to serve her. Eion will lose his Paladin status and be considered a fighter (we need to work this out), and he still needs to come up with a plan to stay alive and save Sunny
Let me ask you reader, what would you choose? Would you keep your characters alive or lose them for the storyline?

I tried to balance the options, but its not possible to keep them completely balanced, but I tried to make them reasonable. (I would not recommend giving a character the option to execute his fellow party member, this might have gone horribly wrong and we could have had some major fallout at the table. But because of the table dynamics, knowing the players, and general level of trust at the table, I knew I could offer this option.)

The results

As planned, the decisions were hard, some harder than others.
  • Tak chose to die. I wasn't surprised. When I wrote the love letter, I didn't know that the player was thinking about dropping out anyway. But it gave her a suitable way out of the story with a memorable exit
  • Sunny chose to burst into tears (almost literal tears from the player), she called to her patron (an old one known only as mother) for help. Again this didn't surprise me too much, Sunny is much too fun a character to let die, so I didn't expect her to take any of the martyr options
  • Eion (who I purposely left to last) was left in a very difficult situation, Sunny's tears had made it much harder for all at the table, and Eion's player did comment that he was close to tears. As he narrated the story.
I was not sure what Eion was going to choose, I half expecting he might turn away from Tiamat, but his choice delivered the most moving storyline:
Eion looks the dragon in the face, "Spare her, I will bring you the gem and serve you!" 
The dragon kicks the Tiefling away. Eion walks away from the party, Sabrina (the cleric who sprinted to Sunny and burned her last spell points saving her) is holding a crying Sunny back as the dwarf climbed onto the back of the dragon. "I'm sorry" he says as the dragon takes to the air and flies off.
This is how legends are made.

Mark

PS. I cannot wait to see whats going to happen in Season 3, but I don't think I want to end a season like this again. It cheapens the decisions which happened this season. They should be remembered.

But I will be doing love letters again at lower stakes.

Thursday, 9 May 2019

Apocalypse Initiative for D&D

So D&D initiative is rather boring turn based. Over the years D&D has used a variety of methods to manage it. But some of the games that I have been playing (Masks, Dungeon World, The Warren, Night Witches) use a different kind of initiative system. They all get the idea from the original Apocalypse World. The idea situation runs roughly like this:
  1. As the story progresses, pick a character and put them in a situation and ask ‘What do you do?’
  2. The character narrates an action which resolves the situation of escalates the issue
  3. Based upon the narrative, select another character & put them in a situation…

So here is how I have been attempting to use Apocalypse Initiative in my current D&D game.  It worked very well for the adventure ‘Midnight on Blood lake’ which had the characters hunting/being hunted by a high level warlock. Think the characters trying to hunt the Alien in the original Alien movie. It went something like this:
  • GM: Eion- You head the sound of movement to the left in the area with the large rock. (Its actually a minor illusion to distract the party) What do you do?
  • Eion: I callout to the party that there is evil over there by the big rock and charge around the left of the rock
  • GM: OK (looking around) Khatak, you hear the call, what do you want to do?
  • Khatak: Drawing my sword I charge around the rock from the right
  • GM: Right, so Etelion what are you doing?
  • Etelion: I hang back and wait and see what happens?
  • GM: Eion and Khatak you advance around the rock and find another there (Rolling dice) Etelion, you are hit in the back for 7 points of damage, by some kind of spell. What do you want to do?
  • Etelion: Thats half my HP! I fall down on the floor and mumble an invisibility spell
  • GM: sounds good, meanwhile (Rolling dice) Mordelinal you are also hit in the back at almost the same time for 3 points of damage. What do you want to do?
  • Mordelinal: I spin around and charge whatever attacked me.
  • GM: great, roll perception, (seeing the roll fail) you spin around and fail to see anything, there are a bunch of boulders around you but you have no idea where the attack came from. Meanwhile Etelion and Khatak you have reached each other when you hear the bolt of energy and a cry of pain from the others, what do you do?
Generally this worked quite well, everyone was trying different things, and it worked fine when the party split off trying different methods to hunt the warlock. I didn’t always require characters to make rolls when they acted and I still have problems with thinking about ways to increase the drama rather than say ‘nothing happens’ or ‘you miss’.


When the party was in a more normal battle I found that I was able to modify the method by instead of jumping from player to player I would work sequentially around the table, putting each player in a situation and asking them what they do? In essence breaking down the battle into a set of single character battles. It's important that in a strict combat, each player gets a turn. I went a little like this:

  • GM: As the party go down the slope into the archeological dig the gnome suddenly shouts something out. Etelion, you hear a sound behind you and realise a pair of dogs are running towards you at top speed. What do you do?
  • Etelion: Burning hands on the dogs as they approach me (dice are rolled, the dogs are injured but not killed)
  • GM: (rolling) the dogs attack doing 5 damage, meanwhile Eion the workers near you heft their pickaxes and attack you, what are you doing?
  • Eion: I hit them with my greataxe (rolling) 15 damage
  • GM: Ouch! That cleaves one of the men in two, the other one (rolls) slices into your leg, 6 damage.
  • Meanwhile, Mordelinal being in the middle of the party you are currently unengaged, in front of you Eion is fighting some of the workers, Khatak is going to be engaged in a second or two, meanwhile behind you Etelion is being mauled by dogs. Who are you going to help?
  • Mordelinal: I unsling my bow and take aim at the gnome...
And as such the battle progressed, Etelion overcame the dogs and was then unengaged, so they had flexibility on their actions. Meanwhile the frontliners (Eion and Khatak) continued to carve through the workers, while Mordelinal got into a sniper battle with the gnome.


Right now the idea is not complete, and I’m still testing how it feels with my current group. Have a try and let me know what you think of the idea.

Enjoy you game:
Mark

Monday, 3 November 2014

How to fail the most important roll of the adventure and make the adventure better

An incredible thing happened to us in our last RPG session.  “The paladin is on his knees before the undead king, bolstered by the bard who had been singing praises, and makes his case to the long dead king.”
I picked up my 2 six sided dice and rolled them.

Snake eyes!

Even with all the bonuses, this was a failure, big time.

But as a result of that roll, the adventure became so much better.

Introducing Dungeon World

For those who have never heard of it, Dungeon world is a rules-light narrative based fantasy adventure game.  The core rules are simple, every time you want to do an action, roll 2 dice and add your attribute bonus (-3 to +3).

  • If you roll a 10+ it works
  • If you roll a 7-9 it works, but there is a complication (you put yourself in danger, you get hurt, you lose something, and so on)
  • If you roll a 6 or less, the action fails and the GM gets to add a new event to the game (which usually ups the stakes or makes a misfortune happen).

As you might have noticed, there is a lot of story telling, and it puts the GM under a lot of stress to come up with new ideas on the fly.  But I am enjoying playing it and it is giving me such good ideas for my own games.

The Story So Far

Sir Grifford of Imos (Paladin, my character) was tasked by the Church of the Silverflame to verify that the body of the long dead king Boltar the brave, was still resting in its hidden tomb.  With Nanoc the Barbarian, Galadiir the Elvish Wizard and Bertam the Bard, the adventures discovered that the body had been taken and had tracked it to an abandoned elven temple high on the mountains.
Having hacked and slashed their way through the orcs and bandits defending the place our brave adventurers reached the high temple and saw the body of Boltar lying on the alter with cultists around it performing a ritual.  One black knight stood between us and our goal, with right on our side what could go wrong? (Famous last words)

What Did Go Wrong

Remember earlier when I mentioned that every time the player rolls 6 or less the action fails and the GM introduced a new event.  Well, I seem to remember that just about every one of the first ten rolls we made failed.  So here are some of the complications that happened:

  • The magical spell casting skull which we beat earlier reappeared
  • The female drow elf which had fallen off the side of the mountain reappeared in the combat seeking to murder Bertam who tricked her
  • One of the PC’s stands on one of many long dead corpses which turned out to be undead rather than dead (big oops)
  • The ritual which was to reincarnate Boltar hits the point of no return and we realise we cannot stop his resurrect, only stop the cult from completing the ritual to control the resurrect d king
  • The ghost of the Boltars wife (a very possessive woman), who has been hidden inside Galadiir’s staff, decides that she must protect her husband at all costs and allow him to come back to life, so she possessed the drow and takes to defending the body.
  • Nanoc fighting the black knight with her great sword manage to together smash into the wall of the temple and the wall and then sections of the floor begin to crumble

As you can see the stakes are getting pretty high, but the worst is yet to come.  For one of the failures, the GM asked me a question:
“What would be the worst thing if Boltar were to come back to life?”
Put on the spot I came up with the first thing on my mind:
“Boltar was an Elf hater (In our story, the Great Elven Empire has just fallen apart), if he finds out what the elves have done well…”
With hindsight, it was a great answer from the perspective of the story, but not from the perspective of common sense.
I also love the way that our GM often asks us to give facts for the story and weaves it all together.  Some of that is Dungeon world, and some of that if just good storytelling.

The Final Roll

Having defeated the cultists, watched several of the major NPC’s fall/escape through the crumbling floor, and having nearly lost the body of the king to the chasm, we try to explain to the undead king what has happened.  The king believes that we resurrected him and demands to know what has happened.  So we explain that the Church of the Silverflame sent us to find him (we don’t mention that we tried to stop his resurrection), and he sort of believes it until he spots the elf wizard (oops).  At which point we try to explain about the need to a local guide to navigate around the elven temple and place of power which he was brought back to life in.
But that’s when I rolled the snake eyes.
The king decides that he has had enough of us, binds the part in a web of lightning and flies off to the distance.  By the time the lightning has worn off, he is long gone.

Conclusion

Well, it wasn’t just my bad roll which messed the party up.  It was a lot of bad rolls all around.  But what a story we made out of those bad rolls.
So here is a thought to all you GM’s out there:
Instead of just using a bad roll as ‘you miss’ or ‘it doesn’t work’, think about using those bad rolls to introduce new story elements or new problems for the party to encounter.  Increase the stakes, add to the tension, or make it much tougher for the party.
Make those failures more meaningful.

Thursday, 26 September 2013

The Programmers RPG

If you have not played it, please go and play the Programmers RPG.
Kongregate Games logo
Its a silly 5-10 minute game which I built as final assignment for a class I was taking on Unity 3D. After I finished it, I decided, ‘let try to publish it on Kongregate, the worst they can do is laugh at it and reject it’, so I did.
Well, I put it up, it was accepted instantly & is still on the main page (4 days after being put up).


That’s kind of cool, but I’m not really impressed with this game.  What I am impressed with was the way I got a reasonable RPG system to work & that’s what I’m going to be talking about in these posts.

The Basics:

What things are the “must have” for RPG’s? Here are the main bits I added.

  • Dialog system (PC’s talking to NPC’s)
  • Message display (for any other stuff)
  • Quests/Missions
  • Combat (but my combat system wasn’t very good, so I won’t talk on it much)

There are also some other “must have’s” for RPG’s which I didn’t add:

  • Levels & XP
  • Items & Inventory systems
  • Saving games

There were also a lot of over standard game conventions dropped in this game, which I might cover later:

  • Health bars (2D & 3D)
  • Arrow’s showing you where to go
  • Knockback
  • Treasure springing from the chest & being attracted to the player
  • Respawns
  • Mouse look with the zoom in & out
  • Things flashing for a bit & vanishing

But lets get back to the main bit, the quests.

Dialog system:

For those not sure, go over to google & type ‘RPG dialog box’.  The hoards of pictures show a very clear idea of what we want: the text appearing letter by letter, faster if you hold the button, often with pictures of the character(s) talking.

So here is roughly what the code looked like:

public class RpgDialog : MonoBehaviour 
{
    public GUISkin skin;
    public float textRate = 2; // how fast the text appears
    public AudioClip tickSound; // audio
    public int border=5, height=100; // size of dialog 

    float textCounter = 0;
    Texture2D leftImage, rightImage; // images
    string theText = null; // the text (null means hidden)
    Rect mainRect; // rectangle for box

    public bool Finished { get { return theText==null; } }
    public void Show(string txt, Texture2D left, Texture2D right)
    {
        theText = txt;
        leftImage = left;
        rightImage = right;
        textCounter = 0;
    }

    public void Hide()
    {
        theText=null;
    }

    void Start()
    {
        // if sound add the audio
 if (tickSound!=null)
 {
     AudioSource aud=gameObject.AddComponent<AudioSource>();
     aud.clip=tickSound;
 }

        // put the box at bottom of screen
        mainRect = new Rect(border, Screen.width-border-height, Screen.width - border*2, height);
    }

    // Update is called once per frame
    void Update () 
    {
        if (Finished) return;

 int oldCounter=Mathf.FloorToInt(textCounter); // for use later in audio
        if (Input.anyKey)   // any key makes it faster
            textCounter += Time.deltaTime * textRate*10;
 else
     textCounter += Time.deltaTime * textRate;
 // tick sound when displaying
 if (tickSound!=null && textCounter < theText.Length)
 {
     if (oldCounter!=Mathf.FloorToInt(textCounter)) // if new text
     {
  audio.clip=tickSound; // make sure it stays as a tick
  audio.Play();
     }
 }
        // if finished & space bar
        if (textCounter >= theText.Length)
        {         
            if (Input.GetKeyDown(KeyCode.Space))
                Hide();
        }
    }

    void OnGUI()
    {
        if (Finished) return;
 // set the skin
        GUISkin oldskin = GUI.skin;
        GUI.skin = skin;        
        GUI.Box(mainRect, ""); // draw the box
 // inner rect is where we must display the text
        Rect innerRect = GuiUtils.InflateRect(mainRect, -border, -border);
        // draw images as needed
        if (leftImage != null)
        {
            GUI.DrawTexture(new Rect(innerRect.x + border, innerRect.y + (innerRect.height - leftImage.height) / 2, leftImage.width, leftImage.height), leftImage);
            innerRect.x += leftImage.width + border * 2;
            innerRect.width -= leftImage.width + border * 2;
        }
        if (rightImage != null)
        {
            GUI.DrawTexture(new Rect(innerRect.xMax - rightImage.height - border, innerRect.y + (innerRect.height - rightImage.height) / 2, rightImage.width, rightImage.height), rightImage);
            innerRect.width -= rightImage.width + border * 2;
        }
        // draw the text
        if (theText != null)
        {
            string s = theText;
            if ((int)textCounter < theText.Length)
                s = theText.Substring(0, (int)textCounter);
            GUI.Label(innerRect, s);
        }
        // restore old skin
        GUI.skin = oldskin;
    }
}

The actual code had a little more than this, it also had a fade out routine to make it look a little nicer.
Notice the use of the GUISkin.  This allows me to customise the appearance of the dialog box, setting the font, text colour & background.

To make the dialog work I had a single game object, tagged as game controller and with this behaviour added.
Then the code to make this dialog appear looks like this:

// get the dialog
RpgDialog  dialog= GameObject.FindGameObjectWithTag("GameController") . GetComponent< RpgDialog>();
dialog.Show(“hello world”,null,null);

I will get on to how to stream all the dialogs together later.


Status message system:

This is not always found in RPG’s, its also very common on multiplayer games.  Its the one which appears and says general information, without stopping the gameplay.

In essence its just a simple GUI routine with a list of strings to hold.  The only clever bits, were just a timer to automatically move the text up once in a while & finding out how much text to hold. Here is the code:

public class MessageDisplay : MonoBehaviour {

    public float height = 100;
    public float border = 5;
    public float advanceDelay = 5;

    Rect mainRect;
    List<string> messages = new List<string>();
    float nextAdvance = float.MaxValue;

    public void Clear()
    {
        for(int i=0;i<messages.Count;i++)
     messages[i]="";
    }
    public void ShowMessage(string msg)
    {
        // remove one, add one
        messages.RemoveAt(0);
        messages.Add(msg);
        nextAdvance=Time.time+advanceDelay;   // in X seconds remove a message
    }
    
    // Use this for initialization
    void Start () 
    {
        // put the box at bottom of screen
        mainRect = new Rect(border, Screen.width-border-height, Screen.width - border*2, height);
        float lineHeight = skin.label.CalcSize(new GUIContent("W")).y;
        int maxLines = Mathf.FloorToInt(mainRect.height / lineHeight);
        // setup it with empties
        for (int i = 0; i < maxLines; i++)
            messages.Add("");        
    }
 
    // Update is called once per frame
    void OnGUI() 
    {
        // don’t show if the dialog is active
        if (!GetComponent<RpgDialog>().Finished()) return;
        // clear the screen after a while
        if (Time.time >= nextAdvance)
        {
            ShowMessage("");    // adds a blank
            // which will reset the timer too
        }
        string s = "";
        for (int i = 0; i < messages.Count; i++)
        {
            s += messages[i];
            s += "\n";
        }
        GUI.Label(mainRect, s, skin.label); 
    }
}
To use this, just put the component on the same game controller object. And access it the same way.  To stop the message display interfering with the rpg dialog, there is a simple check to spot if its in use & then don’t display the messages.

Again to use it is simple, just get a reference to the script & call a method or two.

// get the message
MessageDisplay message= GameObject.FindGameObjectWithTag("GameController").GetComponent<MessageDisplay>();
message.ShowMessage(“its a message”);

The quest system:

Ok, now its time to get technical.
You will need to self study a couple of topics:

Here is the basic idea of how it all works:
When the player walks up to the NPC they touch a trigger, the script on the old man reacts to this and checks the flags.
The flags are a collection of static variables which store which quests/missions have been performed or not.
If the correct flags are set, the NPC’s script will attach the quest script to the game controller.
The quest script is basically a big coroutine which will trigger the various other scripts we just wrote (the dialog and message) and activate them.

Lets look at some code, first the trigger:

public class QuestTrigger : MonoBehaviour {

    public string questName;
    void OnTriggerEnter(Collider other)
    {
        if (other.tag == "Player")
        {
     // add quest to the main RPG & this destroy myself to stop muliple triggers
     GameObject rpg=GameObject.FindGameObjectWithTag("GameController");
     rpg.AddComponent(questName);
     Destroy(this);
        }
    }
}

Lets look at a silly quest. These can be written in C# or Javascript. I found Javascript to be simpler to work with because of the auto wrapping of coroutines, but I give them both as examples.

A C# quest:

public class qst_start : MonoBehaviour {

    // Use this for initialization
    void Start () 
    {
        StartCoroutine(DoQuest()); // start a coroutine
    }
    // all C# coroutines must return a IEnumerator
    IEnumerator DoQuest() 
    {
        // load the resource
        Texture2D portrait=(Texture2D)Resources.Load("portrait");
         
        // get the dialog box
        RpgDialog dialog= GameObject.FindGameObjectWithTag("GameController").GetComponent< RpgDialog>();

        // show the dialog and wait for it to close
        dialog.Show("<Yawn>\nThat was a good nap", portrait, null);
        while (!dialog.Finished()) yield 0;
        dialog.Show("<Looks Around>\nErr", portrait, null);
        while (!dialog.Finished()) yield 0;
        dialog.Show("Where am I?", portrait, portrait, null);
        while (!dialog.Finished()) yield 0;
        dialog.Show("I don't remember drinking *that* much beer", portrait, null);
        while (!dialog.Finished()) yield 0;

        // PS if any of the functions called from here yield anything, 
        // you cannot call them directly, but must StartCoroutine(), them

        // and so our adventure continues:

        // done: now exit
        Destroy(this);  // remove myself
        yield return 0;
    }
}

A Javascript quest:

function Start () 
{
    // in JS: you don't need the StartCoroutine, only the yield
    var portrait:Texture2D=Resources.Load("portrait") as Texture2D;
    var oldport:Texture2D=Resources.Load("port_oldman") as Texture2D;

    Dialog("Greetings mighty warrior",null,oldport);
    Dialog("Do you have the key?",null,oldport);
    if (RPG.has_key==true) // check the static variables
    {
        Dialog("Yes here is is",portrait,null);
  // etc,etc,etc
    }
    else
    {
        Dialog("Err, not yet ",portrait,null);
  // etc,etc,etc
    }
}

// don’t need to do anything complex for a coroutine in JS
function Dialog(txt:string, left:Texture2D, right:Texture2D)
{
    var dialog: RpgDialog=GameObject.FindGameObjectWithTag("GameController").GetComponent("RpgDialog");    
    dialog.Show(txt,left,right);
    while (!dialog.Finished()) yield 0;
}

Conclusion:

Thats the heart of the quests systems, the coroutines turned out to seriously simplify the work.  My original version had its own mini scripting engine, but was just so much work to do.
To really get it working well I would need to design how to manage the saving on game (probably at save points) and how to manage the coroutines between loading & saving.

Later I will write a bit more on the other features, but this is the most complex bit.

I hope that it helps some of you think on this.

Happy coding,
Mark