cnv.ark and decompiled
strings.datUnused Animations#
Critter Animation Slot 13#
Some critters have frames in their seemingly unused critter animations not used in any other animation slot. These are listed below:
- Critter animation #17 (0o21), the female human fighter, has unused frames in page #0, they are #13 and 14
- Critter animation #26 (0o32), the male human fighter, has unused frames in page #0, they are #13 and 14
- Critter animation #27 (0o33), the dwarf, has unused frames in page #0, they are #18 and 19
For these critters slot #13 seems to be a weapon drawing animation. It's a shame that it wasn't used because in-game these characters go from peaceful weapon-sheathed animations to combat-ready weapon-drawn animations without any transition animations.
A user-made animation including frames #13 and 14]] [[Image:uw1.critter26.drawandsheath.gif|anim #26 pal #0 page #0
A user-made animation including frames #13 and 14]] [[Image:uw1.critter20.drawandsheath.gif|anim #27 pal #0 page #0
A user-made animation including frames #18 and 19]]
Demon Death#
Fun fact: The demon, The Slasher of Veils, is unkillable in the game, but does indeed have a slot #12 for a death animation. In it are just the frames of him standing so even if one were to kill him then visually, he would just be standing there for a few frames and then disappear.
Some people can sleep standing up, this guy can die standing up]]
Unintentional Animations#
Some graphics are drawn with special colors where they shouldn't have been:
Graphic |
Description |
|---|---|
Genhead #22 is used as the generic portrait for the white-haired mountain men. The portrait itself is (erroneously?) red-haired. Is seen on Ironwit, Kallistan, and Smonden. Parts of it were drawn using fire animation colors. |
|
Charhead #26 is used as the portrait for the ghost of Garamon. Parts of it were drawn using water animation colors. |
Other Critters#
There are no critter animations defined that are not assigned to used critters however there are some auxiliary palettes defined in critter animations that are not assigned to any critter. See Unused Enemies for more information.
Unused Areas#
It's pretty hard to hide anything in Ultima Underworld because once a player gains the ability to cast the Roaming Sight spell they can view any part of the game they want to. They can also map some areas behind walls with the Daylight spell. If an area is known and meets the requirements it can be entered using the Silver Sapling trick.
Zanium Hollows#
The Zanium mines on the fifth level have many hollow walls, likely not intended to be entered.
The Zanium mines are a bit of an easter egg, a tribute to Pac-Man, as the layout of the mines matches the first level of the original Pac-Man game, they are haunted by four ghosts like in Pac-Man, and the player moves through the mines collecting small floating orbs, similar to the Pac-Man game play. Some versions of Pac-Man had the maze drawn with thin hollow walls instead of the solid blocks found in other versions. Perhaps these cavities and hollow walls in the Zanium mines are a continuing tribute to that.
Volcano Shaft#
The game is set in an 8-level colony built inside a volcano. The center of every level is inaccessible, because it is the central shaft of the volcano. Most levels have an unreachable cavity there to represent the shaft, but not all do. They obviously were not meant to be viewed, as they don't even have lava in them. The one on the third level has a dirt floor and can be reached with the Silver Sapling trick.
There are windows around the shaft on each level the player can use to look into the shaft, but these views are of pre-rendered images and don't depict what is actually in the shaft cavity of the level.
Unused Code#
There are several trigger/trap/scripting objects defined in the code (see Unused Objects) but never actually placed in any level. This section is for objects that were placed in the levels but never activated.
Pit Trap#
In the southwest area of the third level there is a locked door with a series of buttons on a nearby wall. The buttons must be pressed in the correct order to unlock the door, effectively making it a combination lock. If a wrong sequence is entered, a hostile skeleton is summoned nearby for the player to deal with. There is some unused code near this door, seemingly a sort of pit trap.
It is possible that the intent was that if the player enters the wrong code a pit would open under their feet and they would drop to the level below. In the southeast area of the fourth level there is a room with several corpses in it, where the silver ring of leap can be found. This may have been the intended destination of the pit on the third level, though the areas don't line up when the levels are overlaid.
Development-Related Text#
In the Executable#
The uw.exe files contain remnants of the Underworld Editor:
Text inside the file uw.exe:
Offset (hex) |
Text |
|
|---|---|---|
F1.50S |
F1.94S |
|
5AF2C |
5988C |
Thank you, and you, may i add, for using the Underworld Editor |
5DD58 |
5C6C8 |
uwedit.exe |
5F2F4 |
5DCC8 |
Turbo C++ - Copyright 1990 Borland Intl. |
Since most in-game strings seem to be stored in strings.pak the strings found in the executable file are presumed to be for development/editing/debugging. A full list of string in the exe file can be found in this sub article:
In the Strings Pack#
Even in strings.pak there are what look to be debugging text, not seen in a normal game. See them in string block 24:
In the Animation Associations#
In the file assoc.anm the animations are given names. These names aren't seen anywhere in the game, probably there for the developers to have something to call them by and keep track of them with. This data is missing in UW2. The data in UW1 is listed below. Note these are the animation numbers, not the critter numbers. And the octal column because the files are labeled in octal because ... reasons.
anm |
oct |
Name |
Used by |
|---|---|---|---|
0 |
00 |
gngob32 |
goblins with clubs |
1 |
01 |
skela |
skeletons |
2 |
02 |
lizman |
lizardmen |
3 |
03 |
bat |
bats |
4 |
04 |
wiza |
male mages w/o staves |
5 |
05 |
spider |
spiders |
6 |
06 |
gazer |
gazers |
7 |
07 |
troll |
trolls |
8 |
10 |
femwiz |
female mages |
9 |
11 |
slug |
slugs |
10 |
12 |
fire |
elementals |
11 |
13 |
ghoul |
ghouls |
12 |
14 |
demon |
the Slasher of Veils |
13 |
15 |
ghost |
ghosts |
14 |
16 |
graygob |
goblins with swords |
15 |
17 |
reaper |
reapers |
16 |
20 |
rat |
rats |
17 |
21 |
femfite |
female fighters |
18 |
22 |
imp |
imps, mongbats |
19 |
23 |
golem |
golems |
20 |
24 |
hedless |
headlesses |
21 |
25 |
wizb |
male mages w/ staves |
22 |
26 |
rotgrub |
rotworms |
23 |
27 |
wisp |
wisps |
24 |
30 |
batskull |
void creatures |
25 |
31 |
Lurk |
lurkers |
26 |
32 |
fight32 |
male fighters |
27 |
33 |
dwarf32 |
mountainmen |
28 |
34 |
shadow |
shadow beasts |
29 |
35 |
tybal |
Tyball |
30 |
36 |
eye |
void creatures |
31 |
37 |
litening |
void creatures |
See development related graphics in buttons.gr
Unused Enemies#
Unseen Critter Palettes#
There are 32 critter animations defined and all of them are technically seen in the game. Each definition includes 1-5 color palettes to draw the critter's sprites in and there are a total of 76 possible combinations of definitions and palettes. The game engine only has 64 slots for these combinations, so 12 are not slotted and thus never seen in-game. These 12 unseen combinations are seen below:
Animation |
Anim Num |
Anim Name |
Aux Pal |
Notes |
|---|---|---|---|---|
3 |
bat |
2 |
A brown bat |
|
4 |
wiza |
3 |
A mage in blue robes |
|
4 |
wiza |
4 |
a dark-skinned dark-haired mage in yellow robes Not to be confused with critter #45, a dark-skinned gray-haired mage in yellow robes |
|
8 |
femwiz |
1 |
a female mage in yellow robes |
|
8 |
femwiz |
2 |
a female mage in red robes |
|
8 |
femwiz |
3 |
A female mage in green robes. There are no other green robed mages in the game. |
|
10 |
fire |
1 |
A water elemental. |
|
17 |
femfite |
2 |
A blonde fighter with green sleeves |
|
21 |
wizb |
2 |
A mage in yellow robes with a staff |
|
24 |
batskull |
1 |
A shadow of void creature, with four animations: hellbat, mouth, spiral, and hellhound |
|
27 |
dwarf32 |
2 |
A mountainman with a red helmet and brown beard |
|
28 |
shadow |
1 |
A "light beast", like a shadow beast but light instead of dark. Note that this critter is not actually this color in-game. See translucencies for more info. If the rotation on this one looks a little strange, it's because this critter doesn't have sprites for 8-way rotations like the others, only 4-way, so it uses "front" and "back" sprites for its diagonal rotations. |
|
Note that the animations in the table above don't show all animations and all frames for each critter, just a few user-selected frames to be representative of the character. To see the full set of frames, see the sprite sheets by clicking the button in the sprite sheet column.
Unseen Player Character#
The player character is defined as critter #63, but since there are no mirrors, 3D cutscenes, or any other opportunity for the player to see themself, this critter is never actually seen in-game. This critter is visually identical to critter #26, a light-skinned right-handed human fighter, used by the outcast class NPCs such as Bragit and Hagbard. The player's critter's class is adventurer. These things are hardcoded regardless of what gender, handiness, class, or appearance the player picks during character creation.
Unseen Named and Conversational Critters#
These characters exist in data files but don't normally occur in the game. For the ones that are of a generic unnamed critter (ones that have a critter number in the table) it is randomly possible to summon them with a Summon Monster spell. The dark ghoul conversation can also be observed by finding a hostile dark ghoul and casting either Ally or Confusion on it and then talking to it.
Portrait |
Name |
crit num |
cnv num |
string block |
portrait source |
Notes |
|---|---|---|---|---|---|---|
Thorlson |
10 |
11 |
3595 |
charhead.gr |
Apparently some aging warrior, he requests the Avatar slay him in battle so that he can die honorably. His portrait looks very similar to the generic portrait for critter #40 (used by Cardon, Bolinard, and Carasso) but it is distinct and not seen on any other character. |
|
Celaven |
25 |
26 |
3610 |
charhead.gr |
He is looking for a particular wand. His portrait is unique and is not seen on any other character. |
|
Janus |
genhead.gr |
This character exists in name only, as entry 107 in string block 7. There is no portrait, no conversation code, and no string block, and no critter in the game bears this identity. Conversation slot #91 is what this character would use but the slot is empty. |
||||
Crazy Bob |
115 |
3699 |
genhead.gr |
Seems to be a character created to test and debug the bartering system. His name isn't present in string block 7, it is gleaned from the conversation strings. |
||
Folina |
186 |
3770 |
genhead.gr |
This may be the one who lost the ring of levitation that is found on level 7. She will take the dragonskin boots if given and is in no hurry to give them back. |
||
goblin |
7 |
263 |
3847 |
genhead.gr |
This is the generic green goblin with a sword. This character is never seen naturally in-game because all the green goblins with a sword are named characters. The conversation and string block are identical copies of critter #6, the civil green goblin with a club. The one that this could be is the green goblin treasury guard, but he's a bit of an anomaly. He is not a generic because he has an npc_whoami (0xFF) however this link doesn't point to a defined name or conversation code. So that's why he doesn't speak. It's unknown if this was done intentionally or is a bug. |
|
mountainman |
22 |
278 |
3862 |
genhead.gr |
This is the generic white-bearded mountainman, although his portrait is red-bearded. This character is never seen naturally in-game because all white-bearded mountainmen critters are named characters. His conversation and strings are duplicates of the generic red-bearded mountainman (critter #20, conv #276, sb #3860) whose portrait is white-bearded. |
|
ghoul |
35 |
291 |
3875 |
genhead.gr |
This is the generic ghoul. This character is never seen naturally in-game because all ghouls are named characters. When you talk to him, it doesn't matter what option you pick in the dialogue tree, he always says he wants to eat you then ends the conversation and turns hostile. You can continue to talk to him, but the dialogue doesn't change. |
|
mage |
39 |
295 |
3879 |
genhead.gr |
This is the generic, yellow-robed mage. This character is never seen naturally in-game because all yellow-robed age characters are named characters. The first time you speak with him he says one of four random lines and ends the conversation. His attitude goes from "mellow" before the conversation to "friendly" after. Speaking to him after that he has nothing to say, and his attitude goes to "upset". He has many strings in his string block that are not used in his dialogue tree. |
|
dark ghoul |
41 |
297 |
3881 |
genhead.gr |
This is the generic dark ghoul. Peaceful talkative dark ghouls do not occur naturally in the game; however, they can be created by casting spells Ally or Confusion on a hostile dark ghoul. This character's conversation and strings are an exact duplicate of the generic ghoul except for one line missing a final "heh heh", that would be string #6. Since there are no talking instances of this critter, this portrait isn't seen anywhere in the game either. |
Unused Objects#
The game engine has slots for 512 object definitions. Less than slots 464 are used. And of those, some are not placed anywhere in the game.
This section is for functional objects. For pick-up objects, see Unused Items.
# |
icon |
description |
notes |
|---|---|---|---|
344 |
a_table |
see Unused Models |
|
351 |
a_lotus turbo esprit |
see Unused Models |
|
354 |
a_switch |
an 8-way switch similar in function to #353 a_lever but with different graphics. See tmobj.gr |
|
355 |
unknown |
||
388 |
a_pit trap |
see Unused Code |
|
393 |
a_ward trap |
||
394 |
a_tell trap |
||
399 |
a_combination trap |
||
420 |
a_step on trigger |
Unused Graphics#
In file #
The file buttons.gr has many graphics in it that are not seen in the game. These seem to be buttons, controls, icons, and other graphics for an editor/debugger.
In files charhead.gr and genhead.gr#
The NPC portraits files (charhead.gr for unique characters and genhead.gr for generic) have a few portraits that are not normally seen in-game:
Image |
Source |
Owner |
Notes |
|---|---|---|---|
charhead #10 |
Thorlson |
A portrait for a character that doesn't appear in the game. This looks very similar to generic head #40, used by Cardon, Bolinard, and Carasso, but it is distinct. |
|
charhead #25 |
Celaven |
A portrait for a character that doesn't appear in the game. |
|
genhead #14 |
generic savage gray goblin |
This exact image is never seen however it is identical to #12 the civil gray goblin which is seen. The savage gray goblin does not have a generic conversation so even if he is calmed with Ally or Confusion spells he cannot be conversed with and thus his portrait is never shown. |
|
genhead #41 |
generic dark ghoul |
There are no naturally occurring peaceful dark ghouls to converse with. However, if one is summoned with Summon Monster or if a hostile one is calmed with Ally or Confusion then it can be conversed with, and the portrait is seen. |
|
genhead #48 |
generic great troll |
The great troll does not have a generic conversation so even if he is calmed with Ally or Confusion spells he cannot be conversed with and thus his portrait is never shown. This image looks similar to #47 the generic feral troll, which is seen on the level 7 prison guard, but it is distinct. |
- For more information on unseen characters see Unused Enemies
In file cursors.gr#
At the end of cursors.gr are 4 icons that appear to be an anhk rotating about its y-axis. Perhaps this was meant to be a "Loading..." animation or perhaps a text cursor but it is not seen in-game.
In files f16.tr and f32.tr#
The floor texture graphics files (f16.tr and f32.tr) have the same textures defined that are not used anywhere in the game, notably the flowing water textures. All water floors in the game are non-flowing, except the pool in the shrine room on level 5.
|
|
To do: |
In file objects.gr#
The file objects.gr has icons for almost every object in the game. Many of these icons are not seen because either the object is not seen by the player or the object has another way to display itself, for example critters, animations, models, and texture map objects. Regardless, most of the objects still have an icon defined in this file that is never seen by the players. Likely they are used in the editors for the developer to have an icon to place an item in the game with.
The weapon used when no weapons is equipped]] [[Image:uw1.obj19.png|obj #19: a stone
see Unused Items]]
this is the unseen player character]] [[Image:uw1.obj271.png|obj #271: a lock
locked doors have an invisible lock object attached to them]] [[Image:uw1.obj288.png|obj #288: a spell
wands have this invisible spell object attached to them]]
see Unused Models]] [[Image:uw1.obj345.png|obj #345: a beam
see Unused Models]]
see Unused Models]]
see Unused Objects]]
see Unused Code]]
see Unused Objects]] [[Image:uw1.obj394.png|obj #394: a tell trap
see Unused Objects]]
see Unused Objects]]
In file tmobj.gr#
The texture mapped objects file tmobj.gr has graphics for different objects seen in the game.
One of them is an 8-way switch seen in for example the level 1 pillars puzzle, level 4 bullfrog puzzle, level 5 mine dispatch chamber, etc. There are also graphics in there for another 8-way switch that is not seen in-game.
At the end of tmobj.gr there are 6 slots to define door textures, but the door textures used in-game are actually defined in the file doors.gr and there are 13 of them. The game must have originally been designed to have only 6 doors because the level definitions only have slots for 6 doors. However, there is also a system (perhaps coded later) to allow those 6 slots to be picked from any of the 13 defined. In the graphic above, the first row is the last 6 entries of
tmobj.gr. The first has a door texture and the rest seem to have place-holder graphics. This door is not seen anywhere in-game. For comparison, the second row shows all 13 entries of doors.gr. That door looks similar to some of them but not exactly like any of them.
Also of note in the doors above is that many of them have transparency areas. These are not visible in the PC version of the game, as it renders texture transparencies as solid black. However, the PSX port of Ultima Underworld does allow transparencies in the textures, and in that version of the game you can peek through the cracks and keyholes that some doors have. See Regional Differences for more information on the differences in the PSX version. These transparencies are seen clearly in the Pocket PC version. See Transparencies (Pocket PC)
In files w16.tr and w64.tr#
The wall texture graphics files (w16.tr and w64.tr) have the same textures defined that are not used anywhere in the game.
|
|
To do: |
In file views.gr#
The file views.gr has only a single entry, a 16x16 icon of the letter 'm' over the letter 'v'. It is not seen in-game, and most likely used in an editor/debugger.
Unused Models#
|
|
To do: |
- Object #344 is "a table" and it has a defined model, though it is not placed anywhere in the game. Object #350 is a nightstand, a smaller table, and it is placed twice in the game. The Abyss has several chairs and benches but a real lack of tables.
- Object #345 is "a beam" and it has a defined model. It looks like it is meant to be a heavy horizontal wood beam for supporting a ceiling or bridge, but it is never used in-game.
- Object #351 is "a lotus turbo esprit" and it has a model but doesn't exist in the game. The story is that the game was made by developers who had just finished a car racing game. They were writing the 3D engine for this game and needed to have a 3D object to test it out with, so they took one from their last project. A corresponding unused inventory object for the car is visible in Unused Objects.
Unused Items#
This section is for game objects that are some combination of: defined in comobjs.dat, defined in objects.dat, have an icon defined in objects.gr, and/or have a description in string block 4, but don't actually appear in the game.
This section is for pick-up items. For other objects in the game see Unused Objects.
# |
icon |
description |
notes |
|---|---|---|---|
19 |
a_stone |
Object #19 is a stone, not to be confused with object #16, a sling stone. It is defined in the object table, has a graphic assigned to it, and exists in the projectiles table. It was likely a projectile for certain critters, like a stone thrown by a troll in the same way that the yeti (really a palette-swapped troll) throws snowballs in Ultima Underworld II. Fun fact: this object is also fully defined in the sequel, yet it doesn't actually appear in either of these games. It doesn't really match the graphic style of the rest of the game. Likely this was just a place-holder graphic. |
|
199 |
some_vines |
Perhaps there was a time when it was intended that the player could cut vines down from vine-covered walls. This would (kind of) explain the unusual secret door to the dam controls on the third level. |
|
282 |
a_figurine |
Object #282 is in a block among other quest items. Perhaps it was intended to be part of a quest at some point. |
Unused Abilities#
Traps#
Traps is one of the skills the player character has. This skill can be acquired at character creation, and there exists a mantra to improve it at a shrine. There is also a spell for detecting traps. There are several text strings in both strings.pak and uw.exe that deal with traps - detecting, disarming, accidentally setting off, etc. - and yet there's not a single trap in the game that is affected by the skill or the spell or that uses any of those strings.
Identifying Remains#
This is a fully coded and functional ability and could have had some interesting uses but it seems that the developers simply forgot to do much of anything with it. If the player casts the spell Name Enchantment on any bones found scattered about the Abyss, there is a chance that the spell will reveal the former owner of said bones. This ability isn't mentioned in the manual nor by any character or note or other form within the game, so the player just has to discover it by experimenting. Sadly, few of the bones in the game can be identified this way, which seems like a missed opportunity for environmental storytelling.
Aside from that, there are two very specific quests where this ability could have been useful:
- Ishtass asks the player to bring news of Ossikka, who disappeared upstream some time ago. The player can find a note to Ossikka among some bones and bring the bones to Ishtass, but he doesn't accept the bones as proof of Ossikka, even if they have been identified. Only the note will trigger the quest.
- Garamond's bones, the most important set of bones in the whole game, can't be identified with the spell.
Unused Mantra#
At the end of string block 2, strings #51-76 are the mantras that can be used at a shrine. String #73 is "NO" which is not a mantra that is mentioned in the documentation or anywhere in the game. Using this mantra at a shrine does not give any message that anything happened, nor does it give a message that it is an invalid mantra. Likely it is a valid mantra for a feature that was never coded.
When the "NO" mantra is used at a shrine, the contents of string 31 from message block 1 are printed in the message scroll. However, as this string entry is blank, nothing is printed. Using an editor to put text into this string slot confirms that it is printed when the mantra is used.
Unused Magic#
In string block 6 is a list of magic spell and enchantments. Some are not seen in-game and can be found on the table below.
Index |
Value |
Notes |
|---|---|---|
0 |
Darkness |
Why is this needed? The only light in the game is controlled by the player. Maybe a debugging tool. |
1 |
Burning Match |
This gives off light equal to a candle |
2 |
Candlelight |
This gives off light equal to a torch |
7 |
Sunlight |
Sunlight and Daylight are equal light levels. See double top strength. |
130 |
Set Guard |
|
306 |
Local Teleport |
Maybe this is the spell used internally by the teleporter objects in the game. |
397 |
Haste |
This is probably the Speed spell in enchantment form |
Unused Translucencies#
The file xfer.dat defines 5 translucency look-up tables, but only 2 are ever used in the game. They are black, white, red, green, and blue. UW1 only uses the black and white ones, while UW2 uses the red one for the red haunt critter. Below are samples of the white and black effects as well as the others enabled by a hack to demonstrate them.
Unused Text#
The file strings.pak compresses its strings in some Huffman-type encoding. Strings are grouped into blocks/sets used by the engine for particular purposes. The fully decoded contents of this file can be found here for reference. There are several random strings throughout the file that are never seen in-game. Particularly interesting ones are listed here in this section.
Message Text#
- The first string in string set 1, at offset 9b6:
-
Hey, its all the game strings
- At the end of Block 2, entries #51-76 are the mantras that can be used at a shrine. #73 is "NO" which is not a mantra mentioned in the documentation or anywhere in the game. See Unused Mantra for more information.
- Block 4 has the descriptions of all objects defined in the game. Some of these objects are not actually used in the game. See the Unused Items and Unused Objects for more information.
- Block 6 has the names of spells and item enchantments. Some are not seen in-game. See Unused Magic for more information.
- Block 7 has some conversation-related text, including proper names of all named characters. Four names in here are not seen on any in-game character - see also Unused Enemies.
- {|class=wikitable
!Index!!Value |- |27||Thorlson |- |42||Celaven |- |107||Janus |- |202||Folina |}
- Block 9 seems to be messages triggered by certain in-game events. String #385 doesn't seem to be used anywhere in the game:
-
You hear a piercing scream from where you left the wizard!
- In block 10, strings #0-209 are for describing wall textures, #459-510 are for describing floor textures, and #511 is for the ceiling. However, there is an entry #300 that doesn't describe anything in the game:
-
a psychedellic sixties kaleidescope viewed through rose colored glasses
Developer Text#
The entirety of Block 24 seem to be strings meant to be used in the game's editor and/or debugger.
NPC Conversation Text#
The majority of blocks are strings for NPCs' dialogue trees, with each tree's strings contained entirely within a particular block. There are several blocks for dialogue that is never seen in the game, most likely this is left over code for NPCs that were designed but never placed in the final game. See Conversations for more information.
|
The Ultima series | |
|---|---|
|
Apple II |
|
|
Commodore 64 |
|
|
Atari 8-bit |
|
|
Amiga |
Ultima IV: Quest of the Avatar • Ultima VI: The False Prophet |
|
DOS |
Ultima I • Ultima V: Warriors of Destiny • Ultima VI: The False Prophet • Ultima VII: The Black Gate • Ultima VII Part Two: Serpent Isle (Prototype) • Ultima VIII: Pagan |
|
NES |
|
|
Sega Master System |
|
|
Windows |
|
|
Worlds of Ultima | |
|
DOS |
Worlds of Ultima: The Savage Empire • Ultima: Worlds of Adventure 2: Martian Dreams |
|
Ultima Underworld | |
|
DOS |
|
|
PlayStation |
|
|
Other | |
|
DOS |
|