Releases: Codex64ai/daggerfall-unity-ios
Release list
Pre-Alpha 0.1.7 — Icon, graphic & button improvements
Pre-Alpha 0.1.7 for iPad and iPhone. Unsigned IPA — sideload with AltStore, SideStore or
Xcode. You still need your own Daggerfall arena2 folder; see README-iOS.md for setup.
This release is about how the touch HUD looks, plus three buttons that were missing.
Every custom icon redrawn
All 21 illustrated icons were regenerated and replaced. The old set never quite looked like
Daggerfall, and measuring it against the game's own ART_PAL.COL showed why: 39.7% of its
pixels sat above value 200 — a specular blowout that 1996 VGA item art simply doesn't have.
The art was being asked for it directly, with terms like "thick dark outline", "high contrast"
and "bright highlights". Those are modern game-icon conventions. The new set describes the
digitized painted look of the real thing instead.
Every icon is then conditioned to the house style measured off the shipped art — a 56×56
native grid, hard pixel edges with no anti-aliasing, and quantisation to a sampled
palette. Each one now lands at 24–58 colours, against a house range of 51–82.
The two 4-colour placeholders, btn_menu and btn_pause, are real art at last.
Joysticks are drawn, not generated
The ring and knob are geometry rather than illustration — the knob has to read as concentric
with the ring no matter where you drag it. Image generation can't deliver that: the generated
ring measured aspect 1.041, visibly tilted, and the knob was too big to sit inside it.
Both are now computed analytically on the same 56×56 grid — true circles, knob radius 16
against ring inner radius 18.5, giving 2.5 px of clearance. This also retires the old knob,
which was the single worst-matching asset in the set at 852 colours.
Three missing buttons
- Character sheet — opens your character record, in both classic and non-classic modes.
- Interaction mode — cycles Grab → Info → Talk → Steal. Steal is how you pick a lock on
touch: cycle to it, then tap the door with the action button. - Automap — non-classic fullscreen had no way to open the dungeon map. It does now.
(The travel map is unchanged; it already worked.)
Tapping a locked door you can't open now shows a proper Daggerfall-styled message instead of
doing nothing.
Known rough edges
Five icons are weaker than the rest and are already queued for another pass:
btn_combat_off reads faint, btn_back looks more like a crescent than an arrow,
btn_crouch goes murky at small size, btn_jump reads as a bird rather than a boot, and
rest / map / sheet are three rolled-parchment shapes that can be confused in a row.
Mods remain loose-file only — .dfmod code mods can't run on iOS, since IL2CPP has no
runtime compiler. See README-iOS.md.
Pre-Alpha 0.1.6 — Archery, aiming & diagnostics
Archery, aiming, and diagnostics. Same binary that passed on-device testing.
Bows work properly now
Bows used to fire continuously while you tried to aim. Two things were wrong at once.
Daggerfall drives a bow from the attack button being held rather than from a swing, and
the touch layer kept that action held briefly after every look-drag so that a quick flick
would still register as a sword swing. With a bow that made aiming itself the trigger -
line up a shot, and an arrow left on its own. On top of that, the drawback setting was off
by default, which fires the instant an attack starts, so there was no draw to hold at all.
Archery now works the way a bow should:
Hold anywhere on the view to draw the bow. Keep holding and move to aim - with the same
finger, or the look stick. Lift your thumb to loose the arrow.
No button, nothing to learn. A brief tap will not fire, so incidental touches are safe, and
melee is untouched - swords still swing by swiping. Bow drawback is switched on for you;
Daggerfall's own Settings > Controls still owns it if you prefer click-to-fire.
One crosshair
There were two: Daggerfall's crosshair, and a small square the touch layer drew. In
fullscreen they sat almost on top of each other; with the classic bar docked they pulled
apart and it became obvious. The extra one is gone - and the Crosshair setting now
actually turns the crosshair off, which it could not before.
Diagnostics
Two small text logs now appear in the app's Documents folder, alongside arena2:
session-log.csv- a line every 30 seconds with frame time, fps, battery and memory.
Useful for spotting whether long sessions degrade. About 32KB for three hours.controller-unknown-buttons.txt- only appears if your gamepad sends a button this port
does not recognise. If your controller has a button that does nothing, send us this
file - it is the fastest way to get that pad properly supported.
Both are plain text and safe to delete.
Also
README-iOS now documents the 0.1.5 interface work (per-icon layout editing, separate
layouts for fullscreen and classic mode, the classic interface bar) and the log files. For
anyone building the fork, UPSTREAM-PATCHES.md inventories exactly what it changes in
Daggerfall Unity's own files and how to rebase it.
Carried forward
Everything from v0.1.5: classic bar touch support, per-mode touch layouts, per-icon
customisation, controller menu clicks on the face buttons, fast-travel and keyboard fixes,
loose-file mod support.
Unsigned IPA; free-Apple-ID sideloads expire after 7 days. Requires your own copy of
Daggerfall's arena2 - never included.
Pre-Alpha 0.1.5 — Classic UI control tweaks
Classic UI control tweaks. Same binary that passed on-device testing.
This release is about playing with the classic interface bar - the recreation of
Daggerfall's original bottom HUD (Large HUD, docked, in DFU's settings). Until now it
was pure decoration on iOS; the whole release makes it a real way to play.
The classic bar responds to touch
Tap any icon on the bar and it works: inventory, map, rest, options, spellbook, use
magic item, transport, sheathe weapon, the interaction-mode icon (cycles
steal/talk/grab/info), and the portrait (opens the character sheet). Previously the
engine required a desktop "release the mouse cursor" mode before accepting clicks on
these, so they did nothing on a touchscreen.
This works with a controller connected too - the bar stays tappable even when the
touch overlay has stood down for the gamepad.
Taps route precisely: a look-drag that strays across the bar is not a click, and a tap
on a bar icon can never grab a joystick or turn the camera.
The touch overlay adapts to the bar
- With the bar docked, every touch control lifts above it automatically, and controls
the bar already provides (weapon, pause, inventory, map, rest) start hidden. - Hidden is a default, not a rule. Any control can be shown or hidden in any mode -
the overlay MAP button jumps straight to the travel map, so you can have it alongside
the bar's map icon if you want it. - The TUNE settings panel now claims the whole screen while open (the bar was covering
its bottom rows).
Two layouts, two modes
Fullscreen and classic mode now keep separate touch layouts. Arrange each mode
however you like; switching back and forth restores each mode's own arrangement
exactly. Reset all only resets the mode you are in. (This also fixes a bug where
editing the layout in classic mode corrupted saved positions and icons crept up the
screen on every mode switch.)
Every icon moves on its own
The action row and menu drawer are no longer grouped blocks: every icon - weapon,
spell, jump, crouch, pause, inventory, status, map, rest, and the TUNE gear - can be
dragged, resized and hidden individually, per mode. Layout editor fixes ride along:
icons can no longer be pushed off-screen or under the editor toolbar, the drawer stays
open (and visible) while arranging, and hide/show state is always truthful.
New defaults
Both modes ship hand-tuned default layouts. Classic mode starts minimal: compact
sticks tucked above the bar, activate/crouch/jump under the right thumb, menu beside
them, settings and travel map at the top right - the bar itself does the rest. Existing
layout customisations are preserved; use TUNE > Edit layout > Reset all in each mode to
adopt the new defaults.
Carried forward
Everything from v0.1.4: controller menu clicks on the face buttons, fast-travel search
and soft-keyboard fixes, loose-file mod support.
Unsigned IPA; free-Apple-ID sideloads expire after 7 days. Requires your own copy of
Daggerfall's arena2 - never included.
Pre-Alpha 0.1.4 — Controller menus, touch layout & fixes
Controller, touch, and layout update.
Controller: menus now use the face buttons
| Button | Menu action |
|---|---|
| A | Select (left click) |
| B | Back / close window |
| X | Right click |
| Y | Middle click |
This fixes a real bug, not just a preference: Daggerfall Unity's stock UI-pointer
bindings sit on joystick buttons 0-3, and on an Xbox controller under iPadOS nothing
useful lives there - button 0 is what Start emits, and 1-3 map to no physical control.
So Start acted as the click button, A did nothing, and right-click and window-close were
unreachable from a controller at all. All four now sit on the measured face buttons,
applied automatically whenever a controller connects. Default for everyone; rebindable
in Settings > Controls > Joystick.
Touch: new default layout
The touch HUD's default arrangement is now one tuned on a real iPad over actual play,
replacing the original authored guesses:
- Action bank runs along the bottom centre, with COMBAT at its left end and MENU at its
right, where both thumbs can reach without leaving the sticks. - ACTIVATE sits between the action row and the look stick.
- The menu drawer opens as a compact column tucked against the right edge.
- Controls are a step smaller across the board - the old sizes crowded the look/swipe
area. Every target still clears Apple's minimum touch size.
If you have already customised your layout, nothing changes - your edits always win.
TUNE > Edit layout > Reset all switches an existing install to the new defaults.
Carried forward
All of v0.1.3's fixes: fast-travel search and the soft keyboard with a controller,
loose-file mod support (textures, sounds, quests, books, iOS-built .dfmod packages),
and the controller probe.
Unsigned IPA; free-Apple-ID sideloads expire after 7 days. Requires your own copy of
Daggerfall's arena2 - never included.
Pre-Alpha 0.1.3 — Fast travel & keyboard fixes, loose-file mods
Bug-fix release. Same binary that passed on-device testing; if you sideloaded a debug
build from the last few days, this replaces it.
Fixed
Fast travel search works with a controller. The big one. Two bugs stacked: with a
gamepad connected the on-screen keyboard was suppressed entirely (it was gated behind a
touch-only check, but a gamepad cannot type - that left no input method at all), and even
once text arrived, pressing return did nothing, because the classic input prompt confirms
on a raw hardware key event that the iOS soft keyboard never produces. Return is now
forwarded as a real confirmation, so typing a location name and pressing return actually
searches.
The keyboard opens when you need it and stays closed when you don't. A window with a
text field brings the keyboard up automatically, once. Dismissing it sticks for as long as
that window is open, and the next prompt starts fresh. On the travel map's find prompt,
tapping the popup brings a dismissed keyboard back. (Tap-the-field-to-open was tried and
is impossible against Daggerfall's classic UI: an empty text box has a zero-width
clickable area - there is nothing to tap.)
Added
Loose files and mods load from the app's Documents folder - the same place arena2
goes. Folders are created on first launch with a readme: Textures/, Textures/Img/,
Textures/CifRci/, Sound/, Quests/, QuestPacks/, Books/, WorldData/, Mods/.
Anything you add takes precedence; anything you leave out falls back to the app's own
files, so partial packs are fine. Two texture bugs that broke this on iOS are fixed
(desktop-only DXT5 compression; a legacy audio loader that silently produced empty clips).
The sharp boundary, measured on a real device and not negotiable:
- Mods containing C# code cannot run on iOS, ever. iOS compiles ahead-of-time; there
is no way to execute downloaded code. This rules out most popular gameplay mods. .dfmodpackages from Nexus are refused - they are built for desktop platforms.
Asset-only mods rebuilt for iOS load fine, and DFU's mod builder now has an iOS target.- Quest packs (plain text) and loose texture packs work as-is. Music replacement (
.ogg)
ships but is unverified.
See the "Mods and loose files" section of README-iOS for the full table.
Also
- The controller probe (TUNE > Controller probe overlay) now debounces, so the phantom
button pulse iPadOS emits during touches can no longer corrupt a reading. - Self test grew from 31 to 45 checks.
Unsigned IPA; free-Apple-ID sideloads expire after 7 days as usual. Requires your own
copy of Daggerfall's arena2 - never included.
Pre-Alpha 0.1.2 — Controller mapping
Full hardware controller mapping, built from measurements taken on device rather than
guessed. Two complete layers: a base layer, and a second layer while LT is held.
Base layer
| Input | Action | Input | Action | |
|---|---|---|---|---|
| A | Activate | D-Up | Character sheet | |
| X | Ready weapon | D-Down | Status | |
| RT | Swing weapon | D-Left | Automap | |
| B | Cast spell | D-Right | Travel map | |
| Y | Jump | Start | Pause | |
| RB | Switch hand | L3 (stick click) | Crouch | |
| LB | Autorun | R3 (stick click) | Transport |
Hold LT
| Input | Action | Input | Action | |
|---|---|---|---|---|
| LT + Y | Inventory | LT + D-Up | Steal mode | |
| LT + A | Recast spell | LT + D-Down | Grab mode | |
| LT + B | Use magic item | LT + D-Left | Info mode | |
| LT + X | Notebook | LT + D-Right | Talk mode | |
| LT + RB | Logbook | LT + Start | Quicksave | |
| LT + LB | Run | LT + RT | Rest | |
| LT + L3 | Sneak | LT + R3 | Quickload |
Holding LT suppresses the base action of any button that has an LT variant, so LT+Y opens
the inventory without also jumping. That comes from Daggerfall Unity's own combo-keybind
system, not a bolted-on input layer, so every combo also appears in
Settings > Controls > Joystick and can be rebound like any other binding. Everything is
applied as a secondary binding, so keyboard controls are untouched.
Why the old mapping felt scrambled
It bound JoystickButton0-JoystickButton9, the conventional face-button numbering. On an
Xbox controller under iPadOS that is wrong in an interesting way: nothing useful lives below
button 4. The d-pad is 4-7, shoulders 8-9, triggers 10-11, and the face buttons are
12-15. So the old layout was mostly firing d-pad and shoulder actions.
Measured with the new on-device probe (v0.1.2-probe1), which also turned up:
- Every control except the stick clicks reports as both a button and a duplicate axis,
offset by one (Btn4 = Axis5 ... Btn15 = Axis16). This build binds the buttons. - Every axis rests at
0.00on this controller - no trigger resting at-1, so no
permanently-half-pressed trigger to design around. - Select / View is not mapped. It reports as
JoystickButton0and so does Start (which
also reports its own button 16). Binding button 0 would either fire Select's action every
time you paused, or bind the phantom button iPadOS pulses during touches. Rest and
Quickload sit onLT + RTandLT + R3instead.
Also in this release
- The probe ships permanently, off by default: TUNE > Controller probe overlay. Turn it
on before connecting a controller. If your controller maps wrongly, it will tell you
exactly what your hardware reports. - Gamepad bindings are no longer written to
KeyBinds.txt. Persisting joystick bindings to
disk is what caused the original phantom-input bug, since every scene reload restored
them. They are applied live on connect and removed on disconnect. - Unsigned IPA; free-Apple-ID sideloads expire after 7 days as usual.
Pre-Alpha 0.1.1 — PAUSE/Save menu button
Daggerfall Unity iOS — Pre-Alpha 0.1.1
Fix release on top of 0.1.0.
What's new
- PAUSE button added to the MENU drawer. The pause options window (Save, Load,
Exit, settings) was unreachable from the touch HUD — there was no on-screen control
bound to Escape during gameplay. Tap MENU (three lines) → PAUSE to open it.
New matching pixel-art icon included. - Drawer buttons slightly resized so all six (PAUSE, INVENTORY, STATUS, MAP, REST,
TUNE) fit on screen.
You must supply the game data (not included)
Same as 0.1.0 — the app waits at the data screen until Daggerfall's arena2 folder
(~512 MB, ~1560 files) is on the device. Full copy steps (Mac/PC and iPad-only paths):
see README-iOS.md.
cloud placeholders — placeholders look like real files but are empty.
Installing (unsigned IPA)
The IPA is unsigned — sideload it with AltStore, Sideloadly, or Xcode. Free Apple IDs
give a 7-day signing window before you need to re-sign.
Known pre-alpha limitations
- Mods are not supported (iOS platform restriction)
- Tested on iPad Pro 11" (M4) only; other devices/iPhones untested
- Save-file compatibility across pre-alpha builds is not guaranteed
Pre-Alpha 0.1.0 — Daggerfall on iPad & iPhone
Daggerfall Unity iOS — Pre-Alpha 0.1.0
The Elder Scrolls II: Daggerfall, playable entirely by touch on iPhone and iPad.
This is a pre-alpha: core gameplay is verified working on real hardware (iPad Pro 11"
M4, iPadOS 26) — exploration, two-handed touch combat, doors/NPCs/loot, the full classic
menu system, saving, cutscenes. Expect rough edges everywhere else.
Touch controls
- Left stick — move (full tilt runs) · Right stick — camera, always and only
- Swipe with a weapon drawn — attack; swipe direction picks the strike
- Hand-and-ring button — activate doors/NPCs/loot (aims from the centre crosshair)
- MENU drawer — Inventory, Status, Map, Rest, and TUNE (live sensitivity, swipe
distance, control size/opacity, and a drag-anywhere layout editor) - Classic menus are direct touch; the keyboard appears for text fields; hold to skip videos
- Hardware keyboards/controllers auto-hide the touch HUD
You must supply the game data (not included)
Daggerfall's assets remain Bethesda's copyright (the game is a free download, the data
is still theirs). Like upstream Daggerfall Unity, nothing is bundled:
The app launches without it but waits at the data screen until the arena2 folder
(~512 MB, ~1560 files) is on the device:
- Get Daggerfall free from Bethesda (or GOG/Steam) and locate the
arena2folder
inside the install - Install this app and launch it once (this creates its Files-app folder)
- Copy the whole
arena2folder into the app:- With a Mac/PC: connect the iPad → Finder (or iTunes on Windows) → your device →
Files → Daggerfall Unity → dragarena2in - iPad only: get
arena2into the Files app any way you like (iCloud Drive,
Google Drive/Dropbox, a USB drive, or unzip a downloaded copy on-device), then in
Files copy it to On My iPad → Daggerfall Unity
- With a Mac/PC: connect the iPad → Finder (or iTunes on Windows) → your device →
- Relaunch — the game finds
arena2and starts
actually downloaded first — cloud placeholders look like real files but are empty, and
the game will fail at world load in a way that looks like a crash.
Installing the .ipa
The attached .ipa is unsigned — Apple requires every installed app to be signed,
so sideload it with your own (free) Apple ID using AltStore,
Sideloadly, or similar. Free-account signatures expire after 7 days; re-sideload to renew.
Building from source in Xcode (below) signs it the same way with less friction if you
have a Mac.
Building from source
Unity 2022.3.62f3 + iOS Build Support, then:
Tools → Daggerfall Mobile → Apply iOS Player Settings → Build Touch HUD → Build for iOS
→ open in Xcode, set your team, Run. Full instructions in README-iOS.md.
Known pre-alpha limitations
- Mods are not supported (iOS platform restriction)
- Tuned on one device (iPad Pro 11" M4); other devices will want a TUNE pass
- Haptics are iPhone-only (iPads have no Taptic Engine)
- Long-session stability beyond ~15 minute tests is unproven
- 23 documented platform findings in
REVIEW.md— worth reading if you're porting
anything to iPadOS
Built on Daggerfall Unity (MIT,
© Daggerfall Workshop). Daggerfall © Bethesda Softworks.