Jump to content
The Dark Mod Forums
Sign in to follow this  
hank morgan

Ultima Underworld to Dark Mod Map conversion sample.

Recommended Posts

Welcome!

 

This is really impressive. The two engines are so far apart in time and level of development you'd never think it would be possible to establish meaningful communication between the two. But it works, and produces functional, playable results. Building a game around the map would be an incredibly hard undertaking, but I'd play it.


Come the time of peril, did the ground gape, and did the dead rest unquiet 'gainst us. Our bands of iron and hammers of stone prevailed not, and some did doubt the Builder's plan. But the seals held strong, and the few did triumph, and the doubters were lain into the foundations of the new sanctum. -- Collected letters of the Smith-in-Exile, Civitas Approved

Share this post


Link to post
Share on other sites

Thanks. It's been a fun exercise and I'm tempted to make a single mega Stygian Abyss or Lord British's castle level just to see how it would come out. I had been playing around with DarkRadiant for a few weeks since it went standalone so this was nice opportunity to dive in with something a bit more complex. I don't exactly know where I want to go with this next but I do feel committed towards at the least seeing if I can come up with a tool to take the raw level data of an Underworld level and convert it to a usable format once I wrap my head around it all.

Share this post


Link to post
Share on other sites

Hopefully this doesn't come out as gibberish but here is some ascii output direct from lev.ark. What I'm showing here is a height map of the first level and an ascii tilemap of it's geometry.

Heights range from 0 to 15 and according to uw-formats.txt the tiles are as follows:

 

Underworld tile types are:

00 Solid (wall tile)

01 Open (square tile of empty space)

02 Diagonal, open SE

03 Diagonal, open SW

04 Diagonal, open NE

05 Diagonal, open NW

06 Sloping up to the north

07 Sloping up to the south

08 Sloping up to the east

09 Sloping up to the west

 

Trust me if you stare at it long enough it will make sense.

 

File opened successfully

There are 0x87 blocks in this file.
Header val is 135

Now Printing Height Map.
15151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515040404040404040415151515151515151515
15151515151515151515151515151515151212151515151515151515040904040404040404040404040404040404040404040404040415151515151515151515
15151515151212121212121212121212121212151515151504040415150505050409091004090809040909090909120909090909090909090909090915151515
15151515151207070707070707070707151212121515151504040415150505051208121004090909040909121212121212090909090909091212090915151515
15151515121207070606070706060707151512121215150404040405050606060708091112101010040912121212121212121212121212121212090915151515
15151212121207070607070707060707151515121215040404041515110909040404121204111111040909121209090909121010101012091212090909151515
15151212121207070707070707070707151515120912040404111111121212121212121212121212121209121212121109121010101012090912090909151515
15151212121207070607070707060707151515090915040404040411111212120909090909091212121209121212121209121009091012121212120909151515
15151515121207070606070706060707151509090915151504040404151515121204040404040404121209121212121209121009091012121212120909151515
15151212151207070707070707070707151509090909091515040404151515121204041111111115121209090912121309121009091012121212120909151515
15151212121212121212121212120707151509090909090815150404041512111215101011111115121212121212090009121010101012090912090909151515
15151212121215151215151515120707151515090909090815151504041504101515101004110404121209121212090912121110101112091212121212151515
15151512121212121212121215120707151515040404040805050404040410101515100909040404121212121212121212121212121212091312121212151515
15151512121212121212121215120707151515040404040404040404150410101015090909030315121204151515040404040404041212090909091513151515
15151515121212121212121215120707151515040404040404040404150909101009090910100304121204010203040506070809090912121212121512151515
15151512121212121213121215120707151515040404040808050408080909151509090309090304121215000404040404040400100912120912120909151515
15151512121515151515151515120707151515040404040808080808080803030303030309090304121215000000000000000000110912090909090909151515
15151512121511121212121212120707151515040404040409040808080803030303030303030315121215000000000000000000121212121212121209151515
15151512121512131213121315120707151512120404040404040808080303030303030303030303121210000000000000000000000012091212121209151515
15151512121512121212121212120707151512121204040404040808030303030303030303030303121215020003000400050000000012090909090909151515
15151512121512121212121212120707151512121212040404040403030303030303030303031212121215000000000000000000000012090909090909151515
15151512121212121112121212120707151512121204040404040303030303030303030303031212121215070008000900100900000012151515151515151515
15151515091515151515151515120707151512121204040404040303030303030303030303030303030303030303120404101010000012151515151515151515
15150909090909090909090909110707151512121203030404040403030303030303030303030303030303030303121210101010040412151515151515151515
15150911121212121512121215100707151512120303030315151503030303030303151212030303030303030303031515121515151212121515151515151515
15150912121212121212121215090707151512120303030303030303030303031515151212121212121203030303121212121212121212121212121212121515
15150912041204041204151515080707120707121203030303030303030303031212151212121212121203030303121211100908080710070808091011121515
15121212121212121212151515070707070707120403040303031515151515151212121212121215150303030303031515151515081012100815151515151215
15151200001100001212151515070707070715150415150415151515121212121212121212121515150303030303031515151508081008100808151515151515
15151212151000000112111015070707070715150404040404050607121215000015121211121515150303030303031515150807071009070707151515151515
15151212150900000201010915070707070707070707070707070707121504040404151210121515030303030303031515150807121210121207121212151515
15151512150915000301010815070707070707070707070708091011120004000004001210121515030303030303040404040808121211121208121212040415
15151515080909150405060715070707070707070707070708091011120004000004001210121515030303030303040404040809121212121209121212040415
15151515080909151515151515070701011515151515150015151515121504040404151210120303030303030303030315150810101112111010121204040415
15151515080909090807070707070707070809101112121212151515121215120015121211120303030303030303030304040404040400041212121204040415
15151515150915150101010505060707010101121212121212151515121212121212121212121210030303030303030304040404040400041212121204040415
15151515150915150101010101010101010101121212121212151515151515151515151212121210030303030303151515151504040404041212121210040415
15151515150915150101010101010101010101010101121215151515121212121215151212121203030303030312151515150505040405040404040404040415
15150909090915150101020202020101010101011212121211101011121212120202020202020303030315151512121215150505050505050505040404040415
15150909090915150101020202020101010101010101020202020202020202020202020202020303031515151212121212151515050505050505060606060415
15150909090915150101010101010101010101010101010202020202020202020202020212121215151515121212121212121515050505050505060707071515
15150909090915150101010101010101010101010101010202021010020202020202020212121215001515121212151212121515050505050505060707071515
15150909090915150101010101010101010101010101020202021002020202020202020202121015001515121215151512121515050506060606060707071515
15150909090915151515121212010101010101010113121212131010121212121212121010111015001515121215151512121515050506060606060607071515
15150909090910111212121212010101010101010113121212121213121211101011121010101015001515121212151212121515050506060606060607071515
15150909090900000000090909090101010101010113121212121212121211101011121010101515001215121212121212151212050505050505060707071515
15150909090900000000000000000101010101010101121512121212121212121212121010101515001212121212121212121212151515151507070707071515
15150000000000000000000000000101121201010101121512121212121212121212121212101515001212121212121212121212151515090807070715151515
15150101000000000000000000000112121212121212121212111009080707070707121212101515001212121212121215151212151515101515150015151515
15150101000000000000000000011212121212010101111512121212121207070707121212101515001215121512121215151515151515101011111115151515
15150000000000000000000000151212121512151010111010101009091207070707121212101515001515151512121212121212151515101511131115151515
15150000000000000001010100151515151512151010101010121010091206070707121212101515001212121212111212121212151515091511111115151515
15150000000000000001000009091011121212151010101010050510121212121212121212101515001515151512101215151515151515081111111115151515
15150000000000000101000009080815151212150909151010101210101010101012101010101012001515151212091212151515151515081515151515151515
15040001010101010101000000150715151515150912101010101210101010101012101010101015001215121212091212121515151515080815151515151515
15040401010100010101010105060715121212151215101010101210101312101010101010101015000000000000090000000009151515150815151515151515
15040401010100010101010101010115121212151212151510121210101012101012121210121515000000000001010101090101151515150815151515151515
15040401010100010111111212121212121212151215151010101210101012101012091010101009080815150101090101010101090908080808081515151515
15040401010100010111110101011112121212111010101010101010101212101012121211121015130815150101090109090101090908080815071515151515
15151501000000010101010101121015121212151210151010101010101512101012121211121012130812120101010101010101010110080810061515151515
15151501010101010101010101120915151512151111151010101012121512111112121011101012130808080909090101010101010108081515051515151515
15151515010101020301050607080915151511111111111212121212121512121212151212121515131515151515150101090901010102020304051515151515
15151515151515151515151515151515151515151515121515151515151512121212151515151515151515151515151515151515151515151515151515151515
15151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515
Now Printing Tilemap.
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000001130021301810273000000000000000000000000
0000011111111111000000001150077706070777000211113000000011000000
0000211111111111000000021181811881070777000111111111111111000000
0011111111111111000000211500000000010777000110000111111011000000
0011111111111111000020111000011111111111110111110111111000000000
0011111111111111000150411130011100000011110111110111111111300000
0000411111111111002130004113000100000000110411110111111111100000
0000011111111111001112300411000130021130110000010111111111500000
0000011111111111004111170041302650461150110213010171171001000000
0000000010000111000415460001100600210000110111002171171011111000
0001101111110111000000012321502100463000111111111111111011111000
0001101111110111000000211111004130215000110000000000041000001000
0000101111010111000021111115028119181300110111111111101111101000
0001111111010111000011513002815004506600110100000000101001100000
0001100000000111000011041891130023004500110111111111101000000000
0001101000000111000011300021152111130000110111111111111111110000
0001101111110111000041113011701154111300110111111111111011110000
0001101111111111000000411045021100115000110111111111111000000000
0001101111110111000000211302111500413011110111111111111000000000
0001111111110111000002111191150000011311110111111104111000000000
0000000000000111000001154195000021111111000000000113001000000000
0000000000000611000006600000000111115411302110000115001000000000
0001111101110611000021130000021115000011111113000000021300000000
0001111111110611000041113211111100021111111111111111111111111100
0000010000000611011001111111111500011111111111119999100018888100
0011111111000611111011111500000000011150004115000000100010000000
0010010001000111150010000000111111111100000110000002107013000000
0011010111110001000011118881150000416100000110000006607066000000
0011010011110111111111111111102113016100000110000007117117000000
0000010011110111111111188888101111011100000113000007117117000000
0000811011110111111111188888101111011100002111000007111117000000
0000811000000110000000000000104115017100211111300001881991000000
0000811199111111888881111000130000217100111504181130000000000000
0000010000018811000111111000111111111132111000004111100000000000
0000010002111111300111111000000000041111115000000004130000000000
0000010011111111113000100000213000001111150000000000770000000000
0011110011111111111000119988118000211811500000000000110000000000
0010110011111111111300021111130021111815000021113000110000000000
0011110041111111111111811111111111111110000211111300413000000000
0010110004111115011111811515411111154150000115041100077700000000
0011110000000000211115000010000000000100000110001100004130000200
0010110000111000111502110011011111100600000110001100000111181100
0011188811111002111000113000211111100600000413021500000004181500
0010110000000021115004111111111111100100030041115002000000700000
0011110000021811110000104111111111100100011111111111000001110000
0000000000011815210000100000000000000100011111111111000111110000
0011000000211852111111111999991111000100050001110004000100000000
0011000021111021101000600000001111000100000001110000000181110000
0006211111115011101018115029101111000100000001110000000101110000
0011111111150000001011150011701111000100000001610000000101110000
0011111501001888111011500001000000000100000001610000000100000000
0011150001001910011015023001111110111110000021613000000100000000
0000000001000060000050211301111110111110000211111300000110000000
0000111111118810111000111101104111151410000000100000000010000000
0000111111111110111000001001100110001000000002113023000010000000
0000111111811111111000011101100110007019910021111111119111100000
0000111111111060111991111131100110027310010011111111150110600000
0000111111111060111000010111100770016110010041111111132113600000
0000111111111060001000011150002773081910011811111111110000600000
0000118881888810000000000000001111041500000000045114111888100000
0000000000000000000000000000004115000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000

Edited by hank morgan

Share this post


Link to post
Share on other sites

Is there any texture information on the initial .map geometry export whatsoever? Even distinct missing shaders?

There's a fixup utility in DR that will automate texture/model/etc. replacements by parsing through a text file.

e.g.

# Material shaders:
MATERIAL: UW1/TEXTUREGRASS => textures/darkmod/nature/grass/thick_grass01


yay seuss crease touss dome in ouss nose tair

Share this post


Link to post
Share on other sites

Not in what I just posted but the values I'm looking at to get that info also contain the index numbers for the textures so it would just be a simple matter of masking those particular bits to get the texture indices.

 

All of this work is passed on the Uw1/2 formats specification. http://bootstrike.com/Ultima/Online/uwformat.php. Basically there are two 4bit entries that set the floor and wall textures. That is my next step.

Share this post


Link to post
Share on other sites

Heh that actually looks similar to what Tels did with swift maze: ascii file -> DR.map


Clipper

-The mapper's best friend.

Share this post


Link to post
Share on other sites

Okay. I've updated my code. It now returns an ascii representation of the following:

1 Level heightmap. Heights in the range of 0 to 15

2 Tilemap of the level.

3.Index numbers for the floor textures (these refer to another block of data in the file that I have yet to look at)

4.Index numbers for the wall textures.

5.Door positions. This is slightly odd since it only shows about half of the doors I expect to see on a level. I'm guessing some doors are actually implemented as tile objects

6.Object map. Unverified. Still need to reference the objects to their types in their data block.

 

I'm uploading a copy of my code. Please forgive my sloppy programming. It's been 10 years since I last touched C so this has been a bit of a learning experience. Note this doesn't support Uw2 yet.

main.txt

Share this post


Link to post
Share on other sites

Latest update.

I've just spent some time prototyping the export from the tilemap to .map in a spreadsheet macro to get familiar with the formats and I can now use that to create a nearly functional level based on the tile data. I've yet to implement textures, floor heights or slopes but all in it's own good time.

 

You can download the level from http://www.mediafire...cm98tx8cav6rwrz.

 

Here are a couple of screenshots of the level

ib1v5kIcpAptV5.jpg

iOTtE4rQkQqcR.png

 

P.s. I tried looking for that Ascii to Dr tool that a few of you have mentioned but I could not find a download for it. I assume it's not been released yet?

Edited by hank morgan
  • Like 2

Share this post


Link to post
Share on other sites

This is all very cool! I love UU.


What do you see when you turn out the light? I can't tell you but I know that it's mine.

Share this post


Link to post
Share on other sites

New features implemented.

Heights and slopes now work.

Tiles can be rendered in any x:y:z scale.

Placeholder texture loading for Level 1 of Underworld. (hardcoded)

Code will not generate brushes for hidden solids.

Code will attempt to merge neighbouring tiles of identical properties (height,texture etc) together.

Structured the tile data for easier handling.

 

0849f0287841515.jpg bf7653287841517.jpg

 

I'm attaching the latest version of my code. It's a bit messy but hopefully it makes some bit of sense.

 

Known issues.

UW data file is in little-endian. I switch the bytes around in code so I'm not sure how that will affect you on non-windows platforms.

Parameters are hard-coded. Change x,y,z ratios in void exportMaps(). Don't forget to point the file path to your copy of Underworld 1

Ascii print and other printout of tile data need to be commented out in order to run them. Ascii will be inverted unless you change the loop.

I need to add an higher offset to the ceiling so I can have a smaller z scale for gentler slopes.

Textures are a bit messed at the moment since I am not reading the texture blocks yet (next weeks project). Any tile with a brass texture is not right.

All those printfs need to be cleared out.

That code for calculating the dimensions of the normal to an angled plane is just incomprehensible to me and I wrote it.

Water is still to be done. Hence the ice.

 

Future plans

-doors & visportals

-load objects into a level (match with darkmod equivalent or place-holder) including wall decals such as the abyss door,the stairs and readables such as notes and graffiti.

-Friendly Npc's and monsters.

-Generate light/sounds automatically

-caulk texturing on hidden surfaces

-working switches & elevators

-hopefully level transitioning if supported by engine.

-better texturing handling

-Support of Underworld demo and Underworld 2. (The demo level is just a single file so in theory it's just a matter of loading that file into the leveldata data structure.

main.txt

Edited by hank morgan
  • Like 2

Share this post


Link to post
Share on other sites

Say to hello to Bragit. Bragit is a mellow outcast.

161ddd288752038.jpg

 

I've managed to pair up objects from Underworld with similar or placeholder objects in Dark Mod and populate an entire level with almost all of it's objects and npcs.

 

6fd490288752061.jpg

  • Like 1

Share this post


Link to post
Share on other sites

Nice. I'm still kind of interested/stumped in how water could get handled in conversion. It seems to me that UW1 just generates its geometry like any other floor; the player just interacts with it differently. Since idTech4 uses brush volumes for water, it seems like this would have to be something done by hand.


yay seuss crease touss dome in ouss nose tair

Share this post


Link to post
Share on other sites

As far as it matters to my implementation water is just a texture in Underworld. Seeing as I already know the texture numbers I'm planning to just add a special case for when the tile has a water texture. In my current implementation I already extend the base of every tile down to the same depth across the entire map so it's should just be a matter of extending the base around water tiles down a bit more and adding a water entity and base to the bottom. I just knocked up a simple room in DarkRadiant with a water entity in it's middle and it looks like this in a text editor.

// entity 3
{
"classname" "atdm:liquid_water"
"name" "atdm_liquid_water_1"
"model" "atdm_liquid_water_1"
"origin" "-789 541 30"
"underwater_gui" "guis\underwater\underwater_green_thinmurk.gui"
// primitive 0
{
brushDef3
{
( 0 0 1 -21 ) ( ( 0.0078125 0 0 ) ( 0 0.0078125 0 ) ) "textures/water_source/water_clear2" 0 0 0
( 0 1 0 -176 ) ( ( 0.015625 0 0 ) ( 0 0.015625 0 ) ) "textures/common/nodraw" 0 0 0
( 1 0 0 -126 ) ( ( 0.015625 0 0 ) ( 0 0.015625 0 ) ) "textures/common/nodraw" 0 0 0
( 0 0 -1 -21 ) ( ( 0.015625 0 0 ) ( 0 0.015625 0 ) ) "textures/common/nodraw" 0 0 0
( 0 -1 0 -176 ) ( ( 0.015625 0 0 ) ( 0 0.015625 0 ) ) "textures/common/nodraw" 0 0 0
( -1 0 0 -126 ) ( ( 0.015625 0 0 ) ( 0 0.015625 0 ) ) "textures/common/nodraw" 0 0 0
}
}
}

 

If I'm right in how I understand the map format I just create the entity entry for the water at it's origin and any brush (which I'm already generating) within that entity will become water with the correct texture settings. I need to clean the code up a lot more and move some of my hardcoded stuff into config files before I move on to water but I'm very confident that it's possible to do water.

Edited by hank morgan

Share this post


Link to post
Share on other sites

I've cleaned up my code a bit so I think it's high time I released the latest version of the program code as I have not done so since the initial demo map. A lot of stuff is still hardcorded but it should be in good enough shape for anyone interested to play around with.

 

You can download the code* from https://www.mediafir...5j3ffw4k5yy41d9

 

 

What new since I last posted?

 

-System Shock support. This is in very very early stages and I only just got started on it but I can read in tile data and produce basic flat levels. Shock has a lot of new tile types which I have to add support for.

-Underworld Demo support.

-Underworld 2 support.

-Original texture extraction

-Game strings extraction

 

Note that most of the implementation is based around Underworld 1 Level 1 so if you go beyond that level expect alot more default textures/placeholder objects. I will be making improvements in passing off texture mapping to config files in the near future.

 

 

* I do want to emphasise my gratitude for some of the resources from previous Underworld/System Shock projects that I have been able to draw on. I have given credit to those projects in the code credits.txt and readme.txt file.

Edited by hank morgan

Share this post


Link to post
Share on other sites

Its an interesting concept. I never really loved dungeon crawl, but I would be interested in seeing how would the TDM mechanics work in such a genre. I used to say the same to Tels, who was developing a project like that several months ago. If you take the physics of light and sound, the melee system, the AI sensitivity and behaviour, how would that behave in a rpg environment? I suspect it would be quite a good gaming experience. You could do away with annoying/useless stuff like random chance in combat, random chance in sneaking, random chance and armor multipliers in damage, put that all on the players shoulders in a fair, consistent world system as it is in TDM, and focuse solely on the exploration experience, creating interesting situations, etc.

Edited by RPGista

Share this post


Link to post
Share on other sites

I still think cRPG is about customizing your character, if not developing new abilities and their levels. If role playing is visible only in behaviour, such character looks bland to me. Sure I love to stun bad guys in DeusEx instead of killing in sake of "being human", but assuming goal of one role will be perfectly clear and separated from another role/approach... is wishful thinking. But maybe I'm missing the point, Thief is a true rpg experience, and TES-like games are Monopoly clones.


S2wtMNl.gif

Share this post


Link to post
Share on other sites

To be honest I'm not sure how well the Underworld maps lend themselves towards a stealth experience. Gameplay has been a minor part of my thinking on this since I just find it a lot more interesting at the moment just to see these games that I love recreated somewhat in a modern engine. Once I'm happy with things I intend to do a proper release of Underworld Level 1 with Thief like objectives that mesh with the original game. I've only just nibbled at System Shock so there is a fair bit of work to get that in a state where I'm happy with it (for instance there are almost twice as many tile types in that game that) but I think maybe there is real potential there for something fun with Doom3 itself since Doom3 is closer to System Shock than Underworld is to the DarkMod.

Share this post


Link to post
Share on other sites

It's ugly with default textures and the scaling has to be tweaked but here are some shots of the hospital level of System Shock. The tool can now handle variable ceiling heights, steeper slopes and a number of new tile types that SS needs.

 

iP2YGscJ81k8x.jpgigaCYGKuaruAt.jpg

ib0rjLGePT33u4.jpg

  • Like 1

Share this post


Link to post
Share on other sites

It's ugly with default textures and the scaling has to be tweaked but here are some shots of the hospital level of System Shock. The tool can now handle variable ceiling heights, steeper slopes and a number of new tile types that SS needs.

 

Funny how instantly recognizable the second pic is, even without proper textures.

 

This is really cool stuff: I mean the first I heard of TDM going stand-alone, I didn't think "Yay! Modern Thief!" but "I wonder if the guys at Strange Bedfellows are already trying to convert this into System Shock." I don't want to get my hopes up, but its great to see someone pioneering this stuff even if this particular project doesn't go any further.

 

If at some point you decide to stop working on this, I really think you should do a little write-up or documentation on what you have managed so far. Sooner or later someone will be interested.

 

If you don't know Strange Bedfellows, it's a large System Shock fan community centered around modding SS1 and SS2 and preserving their legacy. There have been some remake attempts of SS1 made there, and if you haven't already, I think you should cross-post this there.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

×
×
  • Create New...