This project runs the original Ultima 4 in VR using the Unity3D game engine. Currently it will run on the Windows PC with an Oculus Rift or Oculus Quest using a link connection or natively on the oculus quest, other systems may be supported in the future. It is functionally complete but there are bugs and minor stuff and improvements to make but I would consider it alpha on the oculus quest and Beta on the PC at this point. It also supports Text to Speech (TTS) using Wit.AI, however you must be connected to a nework for this to work.
The oculus quest version does not rely on patching the original EXE into a modern shared library like the PC version and instead references all internal text and data from the original EXE's. The Android OS current does not allow dynamic linking with non-NDK native libraries https://developer.android.com/about/versions/nougat/android-7.0-changes#ndk
Instructions for PC or Oculus Quest:
Aquire or purchase a free copy of Ultima 4 from gog.com or other source.
https://www.gog.com/en/game/ultima_4
Install the game on a Windows PC in a folder.
e.g. [GOGLibrary]\Ultima 4 - Quest of the Avatar
Download, rename and place in the ultima 4 install folder the original mockingboard music or other suitable music in MP3 or OGG format. FYI, android/Quest is case sensitive.
http://www.applevault.com/ultima/
CASTLES.MP3
COMBAT.MP3
DUNGEON.MP3
FANFARE.MP3
RULEBRIT.MP3
SHOPPING.MP3
SHRINES.MP3
TOWNS.MP3
WANDERER.MP3
or
https://bitbucket.org/mcmagi/ultima-exodus/downloads/u4-voyd-music-12.zip
Move any game save files you would like to use to the root of the ultima 4 install directory.
DNGMAP.SAV
MONSTERS.SAV
OUTMONST.SAV
PARTY.SAV
To run on your PC, download and extract the AVATAR.bps & TITLE.bps patch file for your system from the link below and copy them to the ultima 4 install directory, you do not need to do this if planning to install on an Oculus Quest.
https://github.com/plaidpants/u4-decompiled/releases
Copy the contents of the entire ultima 4 install folder to the Unity Persistant Storage area for the ANKH-VR game on your system and then run ANKH-VR, FYI Android/Quest is case sensitive.
Windows PC ANKH-VR Unity Persistant Storage area location
%APPDATA%\..\LocalLow\SwivelChairGames\ANKH-VR\u4
%APPDATA%\..\LocalLow\SwivelChairGames\ANKH-VR\u4\AVATAR.EXE <- you should have this file at this directory location along with all the other files from the Utima 4 Install directory
Oculus Quest Android ANKH-VR Unity Persistant Storage area location, use SideQuest or other means to copy these files to this location. NOTE: Sidequest sometimes fails to copy all the files when you copy a bunch of them so double check all the files transferred before continuing.
![snap2](https://private-user-images.githubusercontent.com/8979271/302010305-0844bed8-4837-4609-83a3-c18c1aecb53d.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MTkyNjQxNzcsIm5iZiI6MTcxOTI2Mzg3NywicGF0aCI6Ii84OTc5MjcxLzMwMjAxMDMwNS0wODQ0YmVkOC00ODM3LTQ2MDktODNhMy1jMThjMWFlY2I1M2QucG5nP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI0MDYyNCUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNDA2MjRUMjExNzU3WiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9NTc4OTZkNmIyOTA0YzFhNmMwOTI0Y2ZjMzc2OGM2NGEwNDlkYzgxOWQwNmMzMWU0OThlNGUyNDQyZDQ4YzYyOCZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QmYWN0b3JfaWQ9MCZrZXlfaWQ9MCZyZXBvX2lkPTAifQ.oBkVHAYzEe_LMUatTcXqDHEoYlDjIC8tluKwbgkRiKM)
/sdcard/Android/data/com.SwivelChairGames.ANKHVR/files/u4
/sdcard/Android/data/com.SwivelChairGames.ANKHVR/files/u4/AVATAR.EXE <- you should have this file at this directory location along with all the other files from the Utima 4 Install directory
Extra step is required on the Oculus Quest, if you copy any save game files, the .SAV files, you will need to make them write-able as by default when you upload them to the Oculus Quest they are only readable by the game not write-able, to fix this you need to execute this custom command from SideQuest or from adb directly to change the permission on the .SAV files to allow reading and writing. If you don't copy these files and you create a new game the files will be created write-able by default.
![snap](https://private-user-images.githubusercontent.com/8979271/302010065-2c168cd5-7e3b-42c9-bbb6-246b87613552.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MTkyNjQxNzcsIm5iZiI6MTcxOTI2Mzg3NywicGF0aCI6Ii84OTc5MjcxLzMwMjAxMDA2NS0yYzE2OGNkNS03ZTNiLTQyYzktYmJiNi0yNDZiODc2MTM1NTIucG5nP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI0MDYyNCUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNDA2MjRUMjExNzU3WiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9Y2UxMmI1NzIwMGM2YTZhMDg5MjI3NWIzMTViM2I2OTllY2UzOTM4ZjQ3YWMzOTg2ZmE0YTdlZjkxMjUzZDExYSZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QmYWN0b3JfaWQ9MCZrZXlfaWQ9MCZyZXBvX2lkPTAifQ.SQ1tt5KYZu0gQKa6M3-1Op0DtUVdtmW4NXiiZ-Q9aVs)
adb shell chmod 666 /sdcard/Android/data/com.SwivelChairGames.ANKHVR/files/u4/*.SAV
The Quest version now supports dynamically changing the tile set while playing the game. Press the primary button on your controller to switch between the different tile sets. It supports the CGA, EGA, Apple2 and a custom PNG file. You need to copy the following files to your Quest for this to function, remember filenames are case sensitive on the Quest.
SHAPES.CGA - for CGA graphics - already included in the PC DOS version
SHAPES.EGA - for EGA graphics - already included in the PC DOS version
SHP0.B and SHP1.B - for Apple2 graphics - these must be extracted from the original Apple 2 disks using ciderpress - http://a2ciderpress.com/ and https://archive.org/details/UltimaIV4amCrack
SHAPES.PNG - for custom graphics - https://ultima4.ultimacodex.com/alternate-ultima-4-tileset/
You can disable the text to speech (TTS) by clicking the volume command in the main menu, it cycles through different combinations of music, sound and speech.
Note: this port of Ultima 4 does not support any modifications or patches to the AVATAR.EXE or TITLE.EXE that move any of the data around in these files so many of the randomizer or other patchers will cause trouble and make it not work. It does support patches to the other files (.TLK, .DNG, etc.) so any fixes or modifications to those files would probabaly be supported. I will try and incorperate some of the fixes from other Ultima 4 projects in the future.
This project does not contain any copyrighted game assets or code or data or text or graphics or fonts or any other intellectual property related to Ultima 4 it relies completely on the files from the original game. This project is not licensed by Origin Systems or Electronic Arts.
This project make use of the following:
"Effects Pro: Simple Image Effects" from the Unity Asset Store for the magic inverse screen effect, MIT license.
https://assetstore.unity.com/packages/vfx/shaders/fullscreen-camera-effects/effects-pro-simple-image-effects-191099
Combine textures and meshes for tile map mesh and texture generation, MIT license.
https://forum.unity.com/threads/combine-textures-and-meshes-reduce-draw-calls.117155/
ScreenShakeVR for the tremor effect, License: You can freely use/modify the code.
from here https://www.zulubo.com/gamedev/2019/1/5/vr-screen-shake-the-art-of-not-throwing-up
Zulubo Productions zach.tsiakalis.brown@gmail.com
Wireframe Shader for the highlighted box around the party member in combat, License information http://www.shaderslab.com/index.html free to use without any credits.
http://www.shaderslab.com/demo-94---wireframe-without-diagonal.html
Unlit-AlphaTest shader modified for lighting effect in the dungeon, MIT license
Unity built-in shader source
https://unity3d.com/get-unity/download/archive
Native dll invocation helper by Francis R. Griffiths-Keam to dynamicaly load the patched DLL at startup, license: free to use this code as you please.
http://runningdimensions.com/blog/?p=5
BSP file format used to patch AVATAR.EXE and TITLE.EXE to AVATAR.DLL and TITLE.DLL at startup
https://www.romhacking.net/documents/746/
https://raw.githubusercontent.com/TheAnsarya/bps-patch/master/bps-patch/Decoder.cs (was completely rewritten from scratch for mono for unity)
Flips, free file patching tool, used to create AVATAR.BPS and TITLE.BPS from the modified u4-decompiled binaries and the original AVATAR.EXE and TITLE.EXE
https://github.com/Alcaro/Flips
https://www.smwcentral.net/?p=section&a=details&id=11474
lzw algorithm and file format used by ultima 4
https://ultima4.ultimacodex.com/ultima-4-encodedecode/ (was completely rewritten from scratch in mono for unity)
u4-decompiled, used to create a modified binary DLL instead of the original ultima 4 EXE so we can have unity link and run the original game engine, this project also uses a patch file system to create the DLL from the original EXE at startup so no original intellectual property from utlima 4 must be included in the release. there is quite a bit of magic going on under the hood to be able to make this work. This appears to not be possible with Android so I will need to do it a different way for the Oculsu Quest.
https://github.com/plaidpants/u4-decompiled/
https://github.com/ergonomy-joe/u4-decompiled/
ScatterMyStars for the stars and sky, MIT License
https://github.com/ReCogMission/FirstTutorials