The Dark Unknown: Development Progress; Denis Loubet Art

It has been a rather shamefully long time since I last posted an update about Goldenflame Dragon’s progress on his Ultima-inspired browser game, The Dark Unknown. Indeed, we haven’t checked in with him since late June, and a great deal of progress has been made on the game since that time.

Well…okay, in late June, Goldenflame was kind of on vacation, though he did still find the opportunity to make a few changes here and there:

…removed the Poison Blade spell (no one would ever use it), renamed Poison Wind to Poison Cloud and lowered it to 2nd level, and created Disrupt Undead.

Undead and constructs are now immune to poison.

He also implemented a title screen for the game:

There is now a title screen, from which you can create a character or journey onward if you have a saved game (or created character). From there I found a bunch of little bugs- save wasn’t properly handling something I added after writing the save system, music could not be turned off if it was triggered by a map change, a couple other little things. I’m pretty stoked. Gonna see how much play you can do from the beginning at this point.

Toward the very end of June, Goldenflame showed a demo of the game to a few friends, and (of course) also implemented a number of new features:

Showed a tech demo to some friends- a few embarrassing bugs popped up but not too many. Today’s accomplishments:

Fixed a timeline bug where cleaning out NPCs from a map being removed from memory could cause an infinite loop if it left the timeline too small;
Attacking a friendly NPC in town will cause the entire map to turn against you;

People who choose the “Other” gender option now have a formal title (unfortunately it’s “Prince”, as for the time being I can’t think of a better option);

You can no longer cast spells above your own level (important as I use them as a plot gate);

started implementing the Mirror Ward spell, which has to be checked for whenever you cast a targeted spell (the spell causes the next spell that hits you to randomly hit someone nearby instead).

In early July, he implemented a couple new spells:

Finished the spells Mirror Ward and Illusion. As usual, Mirror Ward is overly complicated- it’s a protective that redirects an incoming spell to a random other target. Naturally, if that target has a Ward, it can continue bouncing. It would have been a lot easier if I had just ripped off Magic Reflect from UO, but a lot less _fun_.

And over the Independence Day long weekend, he devoted a lot of time to cleaning up and refactoring the game’s code:

Spent a very large chunk of the long weekend working on DU. By midday today, I had things basically back to where everything that worked when I started worked again.

It doesn’t really feel like progress, but I refactored a whole bunch of code to be either more efficient or more general, which I’m going to need going forward. Also stomped a bunch of bugs. Am 3/4 of the way done with the Magic Bolt spell, which basically means I’m nearly done with pretty much all the attack spells since they’ll follow the same model.

Soon thereafter, the Magic Bolt spell was fully implemented:

Finished Magic Bolt! (Aside from sound effects, because I don’t _have_ a lot of sound effects yet.) Am therefore 80% of the way done with Fireball, Iceball, Smite, Swordstrike, and Arrow of Glass; 60% of the way done with Storm and Meteor Swarm; and 40% of the way done with Drain Life.

Second-level spells were finished a few days later:

Finished second level spells (adding Poison Cloud, Protection, and Unlock). Started to work on third, got diverted by making a spreadsheet of all the various damage values for weapons and spells so I could do some math.

However, before he could complete work on the third-level spells, he received some new graphics files, and shifted his focus to implementing those in The Dark Unknown instead:

I had the whole day to myself today, and hoped that maybe I’d get through another circle of spells or two.

As it happens, I didn’t look at magic at all. I did, however, finally get graphics for tables, braziers, and some carpets. As such Castle Olympus’s main floor is fully furnished, finally. I also streamlined a bunch of things about how loot is handled. And I watched 10 episodes of Steven Universe. What?

However, after addressing these changes, he returned to working on spells:

Another day mostly to myself. Rewrote damage mitigation (both from armor and creatures that are resistant to fire or ice), moving it into the function that actually deals damage. Finished my damage spreadsheet, creating defined damage ranges for spells. Will later take expected creature armor and resist levels and expected player weaponry at various levels and make sure that there’s no point where combat becomes too hard or easy. Coded 4 3rd circle spells (Disrupt Undead, Fire Armor, Fireball, Iceball, and Iceball keeps its silly name as a call-forward to Ultima IV)- fireball was essentially a palate swap of Magic Bolt, but Iceball slows the opponent as well as damaging it.

Next up is the Telekinesis spell, which will probably be tricky, and then Wall of Fire, which will at the least have a lot of checking in it as it tries to figure out where to put the firefields.

Also, this small update seems somehow pivotal to the whole idea of having support for spellcasting in a game:

Not a lot today (I don’t usually get much done on Mondays) but you now regenerate mana.

Telekinesis took a while to get implemented:

Working on Telekinesis, went through everything you can (U)se and added code to handle the case where you use it while not standing right next to it. (Traps, for instance, will still go off but will automatically miss you. Things you need to physically touch will not work.) From here the rest of the spell should be pretty easy- I’ll try to finish most of it before bed.

By the next day, however, Goldenflame had the spell completed:

Telekinesis finished, also realized that I didn’t have anything preventing you from casting spells on things that were in the dark and you couldn’t see, so I fixed that as well. One third level spell left: Wall of Fire.

Before he could work on Wall of Fire, however, Goldenflame again found reason to put some focus on the game’s graphics:

A few new graphics, thanks to an alternate U4 tileset crafted by Josh Steele.

Wall of Flame got its due attention, however:

Testing Wall of Flame has involved setting a considerable amount of Nassau on fire. Spells seems to work, this finishes the first three levels and 1/3 of the fourth level. The remaining 4th level spells are pretty straightforward, so hopefully tomorrow I’ll have half of the spells coded.

As July drew to a close, Goldenflame shifted his focus to AI, additional graphics adjustments, and creatures:

Some AI work this weekend. I had hoped to get to the point where monsters would start to fight back, but instead I got distracted by some shiny things. Townsfolk now have peaceful AI, wandering if they wander, going varying distances from their start points, and if they want to return to their start point and there is a closed door in the way, they should in theory open it. One of the shiny things was that some NPCs can now do and say things outside of conversations- bards might sing, barkeeps might invite you to take a drink, etc. It’s a small thing but I think it adds disproportionately to the feeling that it’s an actual world.

Yesterday and today: some streamlining on AI. Removed the graphics I’d added from the GameDev Humble Bundle so that all of my art can be things that others can use as well. Created graphics for mistletoe, mandrake root, and lightning wood. Decided to add small jaunts to the elemental planes as side quests. Am considering giving some kind of bonus if you play particularly virtuously.

More creature work, applying effects to some on creation, and decided after just a few minutes of working on it that I’d rather just remove the “acid blood” special (which would have had a chance of destroying your melee weapon) from the game rather than deal with coding it, as I only put it on one monster. It won’t be missed.

At the beginning of August, Goldenflame implemented a castle with a familiar name (if, that is, you’ve played Ultima 1):

Made the map for Black Dragon Castle. I think there are only two “civilized” locations left that need maps.

And then he added this area:

I have mapped the Ethereal Plane. I apologize in advance.

This was followed by work on a few different things:

Anyway, since yesterday I have:

* Made some new graphics (for the ethereal)
* Saying HEAL to the king will now actually heal you
* Fixed a bug in the conversation editor
* Your XP value is now colored on the stats screen if you have enough XP to level
* Similarly, if you have enough XP to level, the King will level you automatically when you talk to him. (Just once, though- I guess if you level twice between talking to him you’ll have to start conversations multiple times. I’m ok with this.)
* Leveling gives you 3 Training Points, which you can spend to train your stats. Stats start at 10 and cap at 25 from training, but can go higher with magical assistance.

And then he switched gears yet again and set about figuring out a critical system:

No new code tonight- a little work on the map for the ethereal plane, but the bulk of the actual work was on flowcharting the combat AI. It’s a little complicated.

The AI received more work as the month rolled on:

More AI work. Created a “find nearest” function, made it so monsters won’t walk off the edge of a map (and onto the world map, in some cases!) unless I deliberately want them to, and am working on the fear code for either when the player has attacked a town (for non-combatant NPCs) and for when monsters that are not undead/constructs/mindless get severely wounded.

Since I didn’t post yesterday, I’ll add that yesterday I made it so monsters that have decided to melee will attack a foe that they are adjacent to. Also, if everyone in a group loses track of the PC, they’ll drop out of combat mode and return home.

All of this stuff is untested as of yet- once I have a few more branches of the AI’s decision tree finished I’ll put some melee only NPCs on a test map and try to beat them up.

The combat AI also saw some work:

Running away is done, monsters who want to punch something now look for the nearest target, and if they see that enough people are already punching it, they look for the second nearest. Also, finished the map for the Ethereal Plane, and linked all its moongates. Haven’t added monsters or anything yet, though.

He also eliminated what sounds like it would have been a really handy exploit:

A minor change, but one that feels bigger because it moves away from what players will expect: spaces with chests and items are now walkable. Since you are solo rather than with a party, it was too easy to find a corner in a dungeon, melee three things to death, and use the chests they drop as a wall to let you ranged things to death. (G)et and (U)se are still directional. (You can’t use an item if you’re standing right on it because (U)se and selecting yourself is how you use things from your inventory. (G)et may be modified to allow you to select yourself and get things you’re standing on.)

Thereafter, his attention returned to the combat AI:

Ok! Monsters now have a rudimentary combat AI! All monsters have a % chance to do something other than approach/attack- stuff like orcs always tries to approach or attack, while wizards will try to cast spells most of the time. Right now, the approach/attack routine is done.

This gives me a break from the coding tedium, in that tomorrow I get to test it. I’ll make a dungeon room with a small group of melee only monsters, see that they properly trigger when they see me and properly fight me. I’m sure it won’t work, but hopefully by a few hours after I start, it should be working.

At that point, I will back off on AI for a bit- the next project for that is adding all the specific things various monsters can choose to do if they aren’t following the approach/attack routine, which means I can do it piecemeal. Next up, I will work on adding NPCs and dialogue so you can actually play the first few quests. Possibly including a delve into the dungeon I’ll make for testing- I haven’t made Shadow yet, which has one of the earliest quests in it, so maybe I’ll set that up to be what I need. My goal, a few months ago, was have a playable demo by around Labor Day weekend, and I might actually be able to make that.

Unfortunately, Goldenflame’s most recent update speaks of an issue that has cropped up as a result of his recent work:

AI as yet untested as my work on them over the past few weeks has broken… well, a lot of things. They are mostly fixed now, so a lot did get done tonight. Less than hoped but I got more housework done, so that’s a tossup. Started the Dungeon of Shadow as a test bed for AI.

Also, in late June, well-known Ultima artist Denis Loubet announced this in a tweet:

Here is hoping that The Dark Unknown’s Almanac is full of many such illustrations.