1. Archmage Rises
  2. News

Archmage Rises News

Weekly Dev Update: Nov 13

Hey! Phil here. Thomas couldn't make it because I locked him in a closet and usurped power from him. MUAHAHA!

Actually, he needed to head out on a last minute trip on Friday of last week, so that's why there was no Dynamic Quest update on Friday, and there will be none this week, but it'll make it's return next week when he is back.

With that out of the way, onward to what the team is up to this week!

[h2]Update 2b: Combat Rewrite[/h2]
  • Michel continuing work on flow of combat / event sequencing.
  • Zach is continuing work on Combat Buffs/Debuffs.
  • Josh is continuing work on Spell Casting UI and UX.
  • Tyler is continuing to work on spell school progression.
  • James / Mark are starting to implement the updated spell designs and data with the new tech.

[h2]Dynamic Quest Generation[/h2]

Lots of progress has been made on the Dynamic Quests front. I got to see some great work done on the first iterations of incorporating dialogue into the quests being dynamically generated. It's still a little rough around the edges, but Nolan and Thomas have been making rapid progress!

With Thomas out this week, Nolan will be riding solo on Dynamic Quests this week. When needed, Nolan may also help out with some other needed writing tasks this week.

The first version of the dynamic quests will come in Update #3 Exploration.

[h2]UI Redesign[/h2]

Jessi and I have been hard at work looking at our UI and working some magic at not only unifying the UI more, but also creating a clean design language that makes sense in context of the game. We're excited with what we've come up so far, and will continue making progress on this project this week.

[h2]Priority Tasks[/h2]

Thanks so much to everyone for all of the great feedback and suggestions! We're continuing on the QoL train this week, along with some priority bug fixes. Here's a few of the things we're working on for the upcoming patch at the end of the week:

  • We’re going to make tracking tracks easier at night: Light spell +2 , torch +1 against -4 at night (still on our list from last week)
  • Fixing an issue with books being stuck in the inventory
  • Using spacebar to skip intercession animations (like sleeping at the inn or a bard performance for example)

Build 0.2.17 is Live!

[h2]IMPROVED:[/h2]
Now when someone requests you to find a resource as part of a quest, you don't have to take the extra steps to ask where the resource is, they will just tell you! Unless they don't know... but in that case at least they will tell you who in town you should talk to to get that info! Saves you a few extra clicks :)

Dynamic Quests #3: Making Quest Tasks Make Sense

Last week a fan stated: “You only wrote that article to talk about Indiana Jones.” I’m trying to be transparent, but not that transparent! 😛

This is our super secret process, and so far we’re sticking to it!

See those loops that go backwards? Ya, that was last week.

As a reminder our context is: We’re trying to make a dynamic quest generator able to spit out a simple “kill the monster for me”. If we can do that well, we believe we’ll have the tech baseline to make the other kinds of quests with all the nuances required.

[h2]From Tasks to Text[/h2]

Our goal for the week is to go from basic story outline of motivations and tasks of the previous week, to generating some dialogue text.

Prepare to be underwhelmed!

[h3]TWO CHALLENGES[/h3]

  • Inappropriate Tasks - we’re generating quest task lists which may not have anything to do with the NPC’s goal. If they want a skeleton lair destroyed, but the tasks they give you are: Talk to NPC, Study a book, Fetch some Stone… it just doesn’t match the objective or feel right.

  • Pacing and Tension - if the tasks are in a randomized order, we go from amazing stories where the tasks seemingly build from the previous, to stupid ones that make no sense.

The solution to both of these is to use Templates!

[h2]Templates[/h2]

A template is a heuristic (I think i’m using that word right) to guide the hand of the generator to results we want.

For every given problem type and motivation, we can have a template for the kinds of tasks which would resolve it. Not so much a script as a trope.

Inappropriate tasks? Gone, we can use the template to define only the task types we know are appropriate.

Pacing and tension? Nolan was thrilled he can now control types of tasks and the size of them to build and release tension and build narrative progression.

I’m not afraid of some manual labor of making templates, as long as the # of templates is reasonable. I’ll define reasonable as < 300. Past that, it is too laborious to be useful to a game in active development.



Not a template like this!

We created a really rough template like this:

Quest Plot 1: Rohesia Streatfield wants Eliminate - Kill Unique Template: cEeiraaaaa

The length of the template determines how many tasks (steps) are in the quest. This can vary and we can modify the hand made templates at runtime with changes so we don’t have to create tons of templates

Each letter of the template defines a category of task allowed.

  • c = Combat, e = Exploration, E = Economy, i = Information, r = Relationship
  • a = any category

To make this work we needed some way of defining the data pools and allow Nolan to modify it. I was sick of doing all the grunt work myself!

Like all good game devs, we use Excel to store some of our very textual data. It’s better than JSON which we use for more crunchy data like monster hitpoints, and much much easier to read and edit.

For any curious programmers, we use ExcelDataReader to work with binary Excel files in C#. I already wrote an Adapter class (for the NPC dialogue system) that gets down to the business of reading in an excel file and turning it into custom class data objects in about 3 lines of code. Unfortunately, this code was only on the game side not our tooling, so I had to integrate it in and be able to read in data like this from Excel:



It took a day to rewrite the hacky prototype code we had from class/object based to external data driven. I got it all setup and working.

I showed the results to Nolan.

It sucked.

Quest Plot 1: Rohesia Streatfield wants Eliminate - Kill Unique Template: cEeiraaaaa
  1. Rohesia Streatfield: Meet quest giver. Get introduction to quest ()
  2. Rohesia Streatfield: Capture Enemy (Combat) (Allied - Eliminate - Kill Unique)
  3. Reginald Steed: Find Town (Exploration) (Allied - Eliminate - Persuade Other NPC for Current NPC) They provide assistance
  4. Grecia Pugsley: Get Generic Item (Economy) (Allied - Eliminate - Kill Enemy in Certain Place) They provide assistance
  5. Isabella Mossman: Ask Other NPC About Topic (Information) (Allied - Eliminate - Kill Enemy in Certain Place) They provide assistance
  6. Rohesia Streatfield: Persuade Other NPC (Relationship) (Allied - Eliminate - Kill Unique)
  7. Isabella Mossman: Raise Relationship with Current NPC (Relationship) (Allied - Eliminate - Kill Enemy in Certain Place) They provide assistance
  8. Estrilda Tibbles: Find Text (Exploration) (Allied - Eliminate - Clear Lair) They provide assistance
  9. Reginald Steed: Persuade Other NPC (Optional) (Relationship) (Allied - Eliminate - Persuade Other NPC for Current NPC) They provide assistance
  10. Grecia Pugsley: Get Training (Economy) (Allied - Eliminate - Kill Enemy in Certain Place) They provide assistance
  11. Lauretta Devereux: Persuade Current NPC [End Quest] (Relationship) (Allied - Eliminate - Clear Lair) They provide assistance


We hadn’t solved our core issue because we didn’t have enough detailed data on the NPCs actual problem. If their goal for the quest was Eliminate a Skeleton Lair we couldn’t just have any combat task at the end, we had to have a Destroy a Lair task!

I won’t make you figure it out but just tell you: There ain’t enough letters in the english alphabet to identify all the possible tasks we need now and in the future to make a letter based template work.

We were at a dead end.

I threw out what I’d done and started again with a new idea. A quote from a 1930’s journalist…

[h2]Enter Malcolm Muggeridge[/h2]



Malcolm Muggeridge - British writer and social critic, was one of the most brilliant controversialists and media personalities of his generation.

"All new news is old news happening to new people." — Malcolm Muggeridge

This is a fascinating insight on the human condition that we can take advantage of for game quests.

I’m playing Assassin’s Creed Valhalla right now (and will be for at 10 more months if I want to finish the story!), and each quest more or less follows this basic template:

  1. Go talk to some person
  2. Go talk to another person
  3. Fight some soldiers in some place
  4. Go talk to the original person

Am I bored? No.

Its not just similar across AC series, but its similar to Witcher, or Pillars, or Skyrim. It’s old news (tasks) happening to new people for new and contextually relevant reasons.

Worry less about task variety, and focus on better more detailed reasons for the goal.

With this new insight I added more data to the NPC goals:

  1. A reason why the NPC wants the objective, like a Lair destroyed.

    1. The [@target] have been proliferating again.
    2. The [@target] have been venturing dangerously close to our town.

  2. A scale for how strongly the NPC feels about the goal.

    1. If they are afraid of skeletons a little bit then the tasks will be reserved and quest rewards they are willing to pay small.
    2. If their passion is dialed to 11, they’ll take the most extreme measures and pay anything, up to half their kingdom!

  3. A separate value for tracking their feeling towards each monster type in the world. Similar to Ken Levine’s Orc who hates all elves, but indifferent to goblins.
We can utilize this data in other interesting ways.

  • Events can happen that increase NPC’s passion about something.
  • Players can do/say something to change an NPCs passion scale value.

With this new approach, we created a new template system. These are comma separated lists of task ID’s that are super easy to read:



The output now looks like this. We show the task categories in ():

Quest Plot 1: Gilbert Worthington wants Eliminate - Kill Unique
Template: Ask Other NPC About Topic, Find Lair, Clear Lair, Kill Unique


  1. Gilbert Worthington: Meet quest giver. Get introduction to quest ()
  2. Gilbert Worthington: Ask Other NPC About Topic (Information) (Allied - Eliminate - Kill Unique)
  3. Eleanor Bastable: Find Lair (Exploration) (Allied - Eliminate - Get Generic Item) They provide assistance
  4. Gilbert Worthington: Clear Lair (Combat) (Allied - Eliminate - Kill Unique)
  5. Gilbert Worthington: Kill Unique [End Quest] (Combat) (Allied - Eliminate - Kill Unique)

And another

Quest Plot 1: Agnes Cloyne wants Eliminate - Clear Lair - (Underlying reason: NEW ENEMY LEADER) Template: Find Text, Find Lair, Track Enemy, Kill Enemy in Certain Place

  1. Agnes Cloyne: Meet quest giver. Get introduction to quest ()
  2. Geoffrey Dartrey: Find Text (Exploration) (Allied - Eliminate - Kill Enemy in Certain Place) They provide assistance
  3. Beneger Meeson: Kill Unique (Optional) (Combat)
  4. Aytrop Pannell: Find Lair (Exploration) (Allied - Eliminate - Persuade Other NPC for Current NPC) They provide assistance
  5. Aytrop Pannell: Kill Unique (Optional) (Combat)
  6. Amice Nutt: Track Enemy (Exploration) (Allied - Eliminate - Get Generic Item) They provide assistance
  7. Agnes Cloyne: Kill Enemy in Certain Place [End Quest] (Combat) (Allied - Eliminate - Clear Lair)

There is nothing special about these quests. Many a junior designer has made quests like these across many games. But that is precisely the point! The algorithm is popping out intern or junior designer quality level quests! Progress!

This is all very difficult. And it’s not as if someone wrote a book on how to do it!



Oh wait, there is a book on how to do this. I’ve read it. I’ll say we are beyond what is covered in the book.

[h2]Hey! What About the Text Gen Goal?[/h2]

With all the work (and rework) last week I did squeak in a tiny start on the quest giver dialogue. It’s pretty bad, but hey, everything is bad until it isn’t! Here is what the system currently spits out:

Quest Plot 1: Bardulf Samways wants Eliminate - Get Generic Item - (Underlying reason: DON’T UNDERSTAND THEM)
Template: Find Text, Find Lair, Track Enemy, Kill Enemy in Certain Place


  1. Bardulf Samways: Find Text (Exploration) (Allied - Eliminate - Get Generic Item)
    Well met. We’ve got a problem. These Skeleton are a mystery. Nobody understands them.I need you to Find Text
  2. Walter Maunder: Find Lair (Exploration) (Allied - Eliminate - Clear Lair) They provide assistance
    I need you to Find Lair
  3. Alan Lugg: Track Enemy (Exploration) (Allied - Eliminate - Clear Lair) They provide assistance I need you to Track Enemy
  4. Richard Mabbs: Kill Unique (Optional) (Combat)
    I need you to Kill Unique
  5. Bardulf Samways: Kill Enemy in Certain Place [End Quest] (Combat) (Allied - Eliminate - Get Generic Item)
    I need you to Kill Enemy in Certain Place


[h2]Additional Discoveries[/h2]

  • Totally random stinks, use templates BUT allow totally random sometimes to keep it spicy.
  • I wanted to push off data importing to a later time. When prototyping speed is king. But the data started to get unweildly. Nolan typing things up in confluence and then me recreating it in code was slower not faster. Also, enabling Nolan to iterate in parallel with me gets us to the end result faster.
  • There wasn’t a good place to bring this up in the narrative above, but we had a really significant realization on how to do this better in an open world. A reward for making it this far in the article!

    When the player has a task, like needing some knowledge from a scribe, or a blacksmith to sharpen a blade, we use domains of knowledge - a system we created for the NPC Update #1 to answer knowledge questions - to lead you to the correct person.

    • So if the task is to find out some knowledge about Skeletons, that could be a Scribe level 3 knowledge requirement. The game will then point you to an NPC with that knowledge (like Gandalf or Eliminster). It will try to reuse experts. So in Quest 1 you need knowledge you go to town A and ask Expert X. In Quest 8 if you need similar knowledge, it will point you back to Expert X in Town A. This reuse makes the world feel real, and the people matter!
    • Based on relationship (to you or the quest giver), the expert may not help you, unless you do some task for them. Once you do, they will then give you what you need.
    • This now allows the player to play strategically. If they come across a field expert they can purposefully build relationship with them, so that when they get to a quest and need their expert knowledge, the person just gives it to them, no quid-pro-quo!
    • If that expert dies (goblin attack, old age), time to find someone new! The game stays fresh.
  • I hope I explained this clearly. It’s a pretty exciting new idea we’ll take advantage of later.

Weekly Dev Update: Nov 6

[h2]Update 2b: Combat Rewrite[/h2]

Continuing my misdirection by showing random internet battle art, I’ve always liked this from the DragonLance 1985 Calendar by Clyde Caldwell

Last week was a good week in combat. The team is liking Mark’s leadership and feeling good, so we’ll continue this way. Combat Rewrite continues to be the primary development focus involving: Jessi, James, Tyler, Michel, Josh, Jonathan, Mark, Zach, and Rubi.

  • Zach is working on the new Buff/Status system which allows for stacking buffs as seen in many games. For example, fire school builds up ‘Embers’ which can then be utilized in special ways.
  • We’re going to release a new monster race with this combat update! How can we not?! Longtime supports have been staring at the same 4 races for a very long time. The new system, and reason for rewrite, allows this to be done (hopefully) easily. James is working on stats for a new race. What is the new race? Not saying yet until we get the artwork animated.


Finally, here is another new spell VFX being worked on. It’s a WIP for Ground Spike. The Earth spells in the current build are under represented, so this is part of making them a fully featured equal to the other schools.

[previewyoutube][/previewyoutube]

[h2]Dynamic Quest Generation[/h2]

I continue to publish weekly deep dives on the proc-gen quests. I’ll begin publishing these on Fridays, meaning one today and one on Friday of this week.

Summary is we zeroed in on making NPC goals more specific so we can generate meaningful tasks and dialogue text based upon them.

The first version of the dynamic quests will come in Update #3 Exploration.

[h2]Priority Tasks[/h2]

Last week’s patch contained some good quality of life improvements thanks to fan feedback. We also fixed a dungeon room with no doors problem, something that has plagued us for 6 months and thanks to a recent bug report we managed to see the problem and solve it!

This week we’re continuing with more improvements.

  • We’re going to make the NPCs a little smarter where they tell you the next step of the quest rather than requiring you to ask “Tell me about [Resource] or [Town]” to find out where it is.
  • Based on a discussion on the forums weeks ago, we’re going to make tracking tracks easier at night: Light spell +2 , torch +1 against -4 at night

Build 0.2.16 is Live!

[H2]FIXED:[/h2]
  • Fixed a bug with some dialogue options not being numbered properly
  • Fixed a bug in the randomized selection code that should improve the variety of quest generation
  • Fixed a bug causing quests to perpetually fail to be prompted by an NPC if they didn’t meet the initial quest requirements.
  • Fixed an issue that can cause a number of various dungeon-related bugs (double dungeon doors, double dungeon rooms, dungeon scene listeners triggering outside of dungeons, etc)
  • Fixed an issue of dungeon rooms being generated without doors. This bug also could potentially fix some remaining issues with dungeon levers

Big thanks to Spoorthuzad, hodak2, Drazhya, Mielepieltje, Augurianius, Mator, ManPie, Emroko, El'Reach, FluffyJadey, Osmentane, triplesixsmokey, kernoriordan1, kognito, and Seros Senric (among others) for all of your dungeon bug-related reports. While we can't guarantee all of these bugs reports have been address yet, these fixes should hopefully address many of these recently submitted bug reports.

[h2]IMPROVED:[/h2]
  • Added keyboard controls to Archopedia (thanks to KafkaExMachina and others for the suggestion). It's not pretty but it will work for now ːsteammockingː
  • Innkeepers are now the source of knowledge in the town when it comes to quest finding. If you are looking for a quest, they'll know who in town might be looking for some help and where to find them
  • The subject picker dialog window now highlights quest-related subjects and prioritizes them at the top of the list so they are easier to find when bringing them up in conversations