The lack of polish is a bit annoying at times in Ultima IX.  One such place is early in Despise.  As you progress in the first half of the dungeon, you hear a Karma Ding (the sound for losing Karma).  And you haven't done anything to cause it.  Just being a certain distance from the beginning is all it took.  If you check your mana, you have only lost one point.  Still you are left wondering what happened.

Well, the karma loss is supposed to be from leaving Castro and Felix to rot in that storeroom.  Due to some incomplete scripting, however, you lose karma whether you free them or not.  In fact, if you don't free them early on, they disappear from the cell anyway.

What is occurring is a Timer repeatedly checks the area for the presence of either Castro and Felix.  If one or both disappear or get killed, there is a one point karma loss and another Timer object is supposed to be set off.  Only it seems to set itself off.  Might be the trigger is simply turning off the Timer, I didn't look that closely.  In any case, matter what you do, these two end up vanishing.

In my progress of finding the object that has the karma loss trigger, I found something rather interesting.  Apparently, at one time, another timer was supposed to activate and set Castro and Felix to fight each other.  It never fires even if you leave them in the cell.  Probably due to bugs or limits with the engine.

As you can see, there are several issues to be fixed here.  The first is only having the karma loss (reset to 5 points) occur if you them leave in the cell.  A quick fix is adding a Skip If (Jump If Global) command that skips the rest of the trigger if the variable for freeing them is true.  Unfortunately, there is no variable for that.  What is there is a Felix Trigger Activated variable that becomes true only if you accept the information (regarding Kiran Gems) reward.  If you leave the conversation early, this trigger is still activated with the Bye Dialogue, but the variable isn't set to true.  A quick addition of a command to set global variable for Felix Trigger Activated to true within the trigger itself is all that was needed there.

There is one final issue.  If you leave them inside the cell, they will disappear.  It makes no sense why they would disappear with the door remaining locked.  Even if they died somehow, there is nothing to indicate they did.  So I added some additional triggers and objects that reveals two dead bodies, some rags, and some blood if you leave the area near the storeroom without freeing them.  This is to indicate that they eventually came to blows while you were completing the dungeon.  The idea is largely inspired by the fighting script apparently intended by the designer. Their dialogue certainly indicates they are hunger and getting annoyed with each other.  Also being so close to the Column of Despise (and Hatred) should eventually cause some hostility.

Any way, that issue is effectively complete.  Other issues I'm working on this week include polishing up the Leeland/Joshua scripting, attempting to fix Moonglow Tydus crashes, and fixing the key/lock pairings.

For the keys, that task is partially completed as I have a full table of all keys and locks as well some ideas for feasible locks.  There are 65 keys in the game, and 19 of them are never used or get left in your inventory after being used in scripts/dialogue.  Fortunately, the task for changing keys and adding locks is really simple.  Check the Key Locations in Ultima IX page at the Codex wiki for more information.

Sergorn posted a rather extensive list of issues ranging from bugs to polish to balancing.  I am reposting his list here in order to comment on each issue with regards to the final U9 patches.

* Stackable reagents. I seem to recall we discussed it years ago and it's not doable, but, you know... that always was a beef about it, since reagent aren't stackable you never have them with you and that makes all the other binding circle moot.

Unfortunately, there is no interface mechanism that allows for unstacking of multiple quantity reagents.  So there is no way to undo this part.  Forgotten World will include reagent stacking thanks in part to adapting Ultima Return's Unity inventory system.

* Create reagent spell. As I recall it's supposed to create a different type of reagent depending on the terrain but you always get the same. It'd be a nice fix.

The nature of this particular problem is unclear.  We know that only the terrain around Lord British's Castle functions with this spell.  It could that something is not set properly with the terrain files, but I doubt the issue is something as spell as missing flags.  More likely the problem resides either with the terrain types (where terrain textures are matches up with their types) or the code for the spell itself was broken at some point.  This bug won't be fixed. 

* Raven's ship at Valoria. Raven's ship is supposed to move away from the dock at Valoria and she gets back to position once you light the fire. There is even a small cinematic when you do that, and before that some undeads on the dock you need to kill and she asks you to. 

This is definitely one of several significant bugs on our list that will be corrected even if I have to rescript the whole sequence. 

* Music triggers. Have all the music triggers been fixed? I have this reminder of some tracks unused in the game too... Also I always thought it'd be nice to have Stones played at the restored Shrines. Side note: the Stones.wav inside the music file sucked because it makes it start in the middle. Ugh.

Minoc, Valoria, and Skara Brae themes are ones with some issues.  I will fix it.  I promise you I will fit it.  It will play great.  Stopping and Starting under the right conditions.  In fact, I was considering adding the themes to each of the shrines so you can hear the theme transition during the cleansing.  No Stones (well they are all Stones), but no original Stones except at Iolo's.

* CG Cutscenes. I know some people have issues reading them properly, always wondered if something could be done about that. Notably I once wondered if the vids could be upscaled in a res more like the res you'd play the game now, the way it changes resolution when going to the cutscenes tends to mess things up a bit.

We don't have the tools to implement this nor is there going to be an effort to accomplish this. That said, if anyone wanted to do this, we would support it and incorporate it into the patch.

* Combat balance. I stand with my assessment that U9 has a pretty neat combat system with all its attacks and monsters being more susceptible to this or that attack, but it obviously need more balancing in term of damages, hit points and the like. The eco/monster patch does some of this but....not in a very satisfactory way I think.

Definitely agree, but I think part of the balance requires altering the list of monster resistances and vulnerabilities. So in the interests of compatibility, our patches won't alter the NPC file.

* Shamino statue. Any possibility of having multiple statues reacts ? Always got this feeling you were supposed to get parts of the post Britain dialogue at the various statue, I seem to recall if you cheat and go straight to SB even you get ALL the dialogues...

I did too and had wanted to implement them.  Unfortunately, none of them were ever written.  There is just the one near the Shrine of Compassion and the ones in Skara Brae.

* Final 2H sword training - it can get buggy if you "take" the book underwater and then you don't lean the skill. That would make a good fix.

Huh, never thought that one was a problem.  I'll check into it and see want I can do to enforce it goes off correctly.

* Serpents' Hold trigger: There is some bug of sort in Serpent's Hold that sometimes makes the water not go away and you end up drowning. Last time I played I literally had to cheat to get the bell and whatshername was in the water. Ugh.

This is one of those really edge cases where a full editor would be valuable.  Water is the most difficult thing to alter in the game involving scripting objects and special terrain structures.  We still don't have a real clear idea about how it is supposed to work.  Originally, I thought the area of the Hold was a block of non-water area surrounded by water and that the problem was the block not being large enough.  Nope, the whole area is water, which disappears when you pass a point.  Now that is a really insane way of doing things.  This is definitely going to be an involved alteration and probably the one thing that will delay the first patch.

* Troll bridge: Does he have to ask it EVERY time?

Of course, he is pretty stupid and forgetful. Although I might try some things here to adjust this so he at least remembers you for a time.  I do plan on having him sleep.  Although having him blocking the bridge does present something of an issue.  Would the Britain guard not go to take him out after the shrine is cleansed or would that not be very compassionate?  I guess I will just have him disappear about the cleansing or once you leave Britain for Buc's Den.

* Monster respawn, that's a complicated one.  In U9 much, like in all the Ultimas nearly since U6, monsters basically respawn whenever you leave the screen and come back, at the same place the same monsters. Wonder if there is a possibility to randomize things a tad more.

Hmm... Yeah if only there was a way to randomize this.  ;)

This is an issue I will think about the best way of implementing.  I can easily add a low respawn percentage to keep the likelihood of a respawn from nearly all the time you leave to rarely popping up.  There are some I might remove completely as they make little since like the goblins near Paws.

* Unpassable mountains. Wonder if some slight terrain modification can be done to prevent climbing the mountain to yew before you're supposed to. It's all complicated of course because the game is also supposed to let you levitate over these mountains to get to Destard later on, but if you do that early, you get to Yew and... ugh.

Terrain editing is not something we are going to worry about.  Besides everybody already knows not to go to Yew early.  As for the levitation spell, nothing can be done to fix it.  I don't know why or how it got broken.  But I'm left wondering whether one of the later patches broke the several of the games spells somehow because I find it odd that levitate and create reagents don't work in 1.19f or possibly 1.18f but seemingly did in earlier versions.

Oh and Moonglow. Gah.

My sentiments exactly. Gah.  Even fixing Leeland was a real pain... and technically it isn't even finished yet because I broke it trying to adjust the conceal/reveal of objects for the ransacking and clean-up.  In any case, expect the next couple of posts will be about my non-fun adventures in fixing this disaster of scripting.

When examining the current status of my Patches project, I imagine many of you are wondering why there are so many issues listed as only partially resolved considering previous news articles about my patch progress.  This is because I am reimplementing these changes and fixes onto the original version of map files.  The reason for this repeat of corrections is to avoid potential bugs or issues introduced during my earlier efforts.   One possible source of these comes from some bugs with our object property editor that may have introduced bugs into other objects around the map.  The second and more real source of potential bugs is from the earlier method we employed to add objects by entering a copy of the map to place objects and then pasting over the original map.  

This effort is actually fairly straight forward due to knowing what issues were corrected and being able to compare the Old Patched Version with the Original.  In addition, there aren't any issues with the other scripting files.  Thus, much of work with non-map files is re-examining the triggers and activities and testing to be sure the fix is effective and works with the changes with the new map files.  As a result, many of the partials won't take much effort to reimplement, test, and reach the complete stage.

Another area of curiosity would be what constitutes the difference between a Serious bug and one that is Major or how significant is a Polishing issue.  For that matter, why is a patch focused on Serious and Major bugs have so many smaller issues?  Firstly, most of the polishing issues are being included because these fixes were already partially or completely implemented with my older work.  In addition, though not a bug, the odd and scattered placement of keys throughout maps has always bugged me.  Part of this is because a significant portion of the keys have the same key number (nominally 0) allowing them to be used on large number of possible doors.   While finding all of the keys and altering their target locks would seem a time-consuming task, I have already identified all of the keys (using a combination of walkthroughs and playthroughs) and drafted a list of their new target locks.  As a result, the task merely involves changing a single property value on all locks and keys in the game, which isn't actually that large of a number.

Finally, I will talk about how I have categorized the bugs.

Serious Bugs - These are the bugs that either lead to significant problems during gameplay or involve restoring missing NPCs that shouldn't be missing (Mariah and Jaana).  The bugs included in this list are as follows:  Restoring Mariah to Moonglow, Restoring Jaana to Yew, Removing the Camera Script from Tydus's dialogue, preventing Leeland from bothering you too early, lowering the Runes/Sigils after each Shrine Cleansing, fixing the Signal Fire bugs with Raven in Valoria, fixing the Shipwreck/Flann's Son Quest bugs, and removing the breathing problem when going to Serpent's Hold.

Major Bugs - Though not as significant as the aforementioned bugs, these are issues that are easily identifiable as bugs.  Usually, they involves scripts that block off or interfere with access to areas (Catacombs, Deceit, Liche chamber), prevent the correct/virtuous music from playing, or cause NPCs to not be in the correct location (Dermont and Eleena, specifically).  Two other issues with this category is one of the Demon Triumvirate not being slain and Deadly Tiles in the Abyss bugging out.

Minor Bugs - This category consists of the issues that are technically considered bugs, but they generally will go unnoticed or be easily forgotten since they do not interfere with the player.  This group of bugs is fairly diverse, but the issues selected for this next patch are the more noticeable bugs.  The only group of notable bugs from this category not included in the patch involve a series of teleports to keep the shopkeepers grounded.

Issues for Polishing - This category consists of issues that aren't technically bugs as they don't interfere much with gameplay or prevent access to areas or break scripts, but are more a matter of pedanticity.  Most of the related fixes involve minor changes to object properties or adjusting an object's position so it isn't going through other objects or walls (like the Book of Justice or the Valor Banner in Serpent's Hold).  In addition to the issue over the keys, corrections in this area involve correct time shifts around cutscenes, reorganizing the books in Yew's library (by altering the book ID numbers), or completing several NPC's questlines that lack their final states (specifically Joshua/Leeland of Moonglow and Katie/Herzog of New Magincia).

The final category is just a catchall for planned additions to certain areas of the game.  For this patch, this involves adding a few bags and other items across several dungeons and redoing Mariah's basement.

As you can see, it is a busy list even for this patch, but most of the corrections are straight forward or easy requiring more time than involved scripting work. 

I've been making some comments on the UDIC Facebook page about some of my work attempting to polish a few of the triggers from early in the game.  My initial foray has left a little stumbling as a I try and interconvert a word of bytes (2 bytes or 16 bits) from decimal to binary and back and sometimes into hex.  The ordering can get a little fuzzy as the byte order for the parameters in the files are first byte corresponds to the values of 0 to 255 and the second bytes results in the larger decimal values.  Most converters on the web, however, use the reverse.  Additionally most trigger parameters aren't housed as full bytes.  Parameters are often subdivided with strings of bits providing the value used by the trigger.  Sometimes individual bits are actually flags.

To show this more succinctly, here is one of the trigger commands (Reveal Item) displayed as hexcode:

  • 0x0003 corresponds to a list of options:  "No FadeIn", "Slow FadeIn", and "Fast FadeIn"
  • 0x000c corresponds to a list of options:  "No Scale Up", "Slow Scale Up", and "Fast Scale Up"
  • 0x00f0 corresponds to a list of options:  "No Special Effects", "Special Effect 1", "Special Effect 2", "Special Effect 3", "Special Effect 4", "Special Effect 5", "Special Effect 6", "Special Effect 7", "Special Effect 8"
  • 0xc000 corresponds to a list of options: "Stop Reveal If Blocked", "Ignore Object If Blocked", and "Wait Until Clear If Blocked"

Translating this to something more comprehensible:  The value of 3 means the first bits (the ones on the far right as traditionally presented - 0000 0011) have values of 1 in binary while the other 6 bits of the byte are zero.  As a result, the engine collects the value as determined by only these two bits.  This means that the values possible are 0 to 3.  This is because when only the first bit is true, you get a value of 1; and when only the second bit is true, you get a value of 2.  If both are true, you get an additive result of 3.  It examines these in isolation from the rest of the byte as if they don't exist for the purposes of determining the fade effect.  Similarly, the value of c is a decimal value of 12, which can only be obtained when the third (corresponding to 4) and fourth (corresponding 8) bits are true (0000 1100).  This means that for the Scale effect, the engine looks at the third and fourth bits in isolation and it will only get a value between 0 and 3.

As you can see, the 0xc000 means the last two bits (the ones on the far left) define what to do if dealing with a blocked area.  My trigger editor currently treats the parameters as a single 2 byte/16 bit word meaning I have to convert between decimal and binary and make changes to the individual bits, and convert back.  The ordering got a little confusing at first especially because of the hex-bytes being in refuse order within the file compared to the traditional notation.

I'm rapidly getting back into the groove as the above detailed explanation should indicate.


The first little bug I decided to focus on to get my feet wet on is the fire place in the Avatar's house.  When turned on and off the first time, the fire appears (as a fade in effect) and disappears (as a scale down effect) as it should; however, subsequent turning of the valve doesn't cause the fire to appear.  Luckily, I noticed quickly during testing that the fire did indeed appear, but was just a tiny scaled down version.  Unfortunately, adding the scale up tag to the reveal command didn't fix the issue.  On the first turn of the valve, the fire scaled up correctly and scaled down correctly; however subsequent turn off does not cause the fire to scale back up.  Even including ignore if blocked wasn't enough.

I think remembered having a similar bug before with the Moonglow catacomb teleport.  So after looking at the scripting fixes I performed there, I found out that....I just... changed the scaling to a fading effect only.  Ugh, buggy buggy scripting effects.   I'm left to conclude that the hardcoded scale down does not work correctly with the scale up effect, which works on its own.


Another bug I've been looking at is the vase in Stonegate that you knock off the shelf with the gust spell.  The issue being that the vase won't fully fall with the gust spell and appears stuck partially thru the shelf.  No position adjustment of anything had any effect.  So I decided to try and fake it and add a hurl command to help the visual.... and just wow. The gust spell is rather broken.  The trigger for this "puzzle" already includes a command to hurl the vase at the pressure plate.  There is actually some contrivances with the way this "puzzle" is scripted.  Both the vase and shelf aren't solid.  In fact, the vase and pressure plate are not involved at all.  There is a path cross (also known as a pathegg by Ultima designers) that the gust spell must cause to "Turn On" resulting in a trigger that causes the vase to become solid and get hurled at the pressure plate.  I'm not sure that the gust spell can do anything to other objects except maybe nudge them a little.  In any case, I'll be making a cleaner looking contrivance with this particular puzzle.

I mean dang, the designers, scripters, and programmers didn't even have time to put bandaids on properly.  The buggy and issues that just won't let themselves be fixed really makes you appreciate the frustrations they must have had under a time crunch.

That is all for today.  I'm going back in, wish me luck.

Welcome to the Updates Section of the Ultima IX patching project.


Over time I have been making comments regarding bugs and oddities I've find in my work on reverse engineering and patching Ultima IX.  Unfortunately, these comments will often get lost at UDIC due to Facebook's limited discussion forum design.  So I will be posting this comments and asides on the site here for those interested in some of the behind-the-scenes scripting oddities within Ultima IX or my development work in correcting various bugs and addition of a small layer of polish onto UIX's game world.


- Iceblade