Skip to content

idTech4A++ emulates Doom, Doom 3, Doom 3: BFG Edition and 22 more systems. It reads 16 files, 1 of them required: without a required file it does not start games. A required file is needed only by the machines that use it. Each file below cites the line of source code that reads it.

About this profile
Detail Value
Type standalone
Classification Game engine
Source https://github.com/glKarin/com.n0n3m4.diii4a
Version 1.1.0harmattan73
Revision glKarin/com.n0n3m4.diii4a@ce49510f3b0c
Profiled 2026-09-17
Profile YAML, JSON
Cores idtech4a++, idtech4amm, diii4a
Systems Doom, Doom 3, Doom 3: BFG Edition, Quake, Quake II, Quake III Arena, Quake 4, Prey, Wolfenstein 3D, Return to Castle Wolfenstein, Wolfenstein Enemy Territory, Return to Castle Wolfenstein (RealRTCW), The Dark Mod, Star Wars Jedi Knight: Jedi Academy, Star Wars Jedi Knight II: Jedi Outcast, Medal of Honor Allied Assault, Urban Terror, Enemy Territory: Quake Wars, Skin Deep, Quadrilateral Cowboy, Icarus Starship Command Simulator, Hexen II, Half-Life, Half-Life 2, Serious Sam
Author glKarin
Technical notes

Android package com.karin.idTech4Amm, arm64-v8a and armeabi-v7a, Android 4.4+, GPLv3, forked from n0n3m4's DIII4A. A Java launcher picks a game and a command line, then loads one of twenty-six engine libraries into the Q3E frontend, which owns the GL surface, the on-screen controls and the audio path. Another application starts a game directly through com.n0n3m4.q3e.Q3EMain with a game extra carrying the game token and a command extra carrying an argument vector that begins with game.arm. ref: README.md:13-26, 248-262, Q3E/src/main/java/com/n0n3m4/q3e/Q3EGameConstants.java:8-33, 91-116, 303, Q3E/src/main/java/com/n0n3m4/q3e/Q3EGlobals.java:9, idTech4Amm/build.gradle:10-14, 23

Game data lives under a working directory, /sdcard/diii4a unless the preference names another, and each game reads a base folder inside it. With the standalone-directory preference on, which is the default, the base folder sits under a per-game subdirectory. With it off, games that are not marked always standalone read the base folder directly under the working directory. The Dark Mod, UZDOOM, FTEQW, ECWolf, Xash3D, Source and both Serious Sam entries are always standalone and keep their subdirectory either way. ref: Q3E/src/main/java/com/n0n3m4/q3e/Q3EInterface.java:89, 106, 233-254, Q3E/src/main/java/com/n0n3m4/q3e/Q3EGameConstants.java:147-202, 421, 443-461

Engine, standalone directory and base folder per game, in registration order: DOOM 3 (dante, doom3/base), Quake 4 (dante, quake4/q4base), Prey 2006 (dante, prey/preybase), Enemy Territory: QUAKE Wars (Splash Damage idTech4, etqw/etqwbase), DOOM 3 BFG (RBDOOM-3-BFG 1.4.0, doom3bfg/base), The Dark Mod 2.14 (darkmod), Skin Deep 1.0.4 (skindeep/base), Quadrilateral Cowboy 1.0.2602252 (qc/base), Icarus Starship Command Simulator 1.0.9 (icarus/base), Quake III Arena (ioquake3 1.36, quake3/baseq3), Return to Castle Wolfenstein (iortcw 1.51d, rtcw/main), Wolfenstein: Enemy Territory (ET: Legacy 2.83.2, etw/etmain), Jedi Academy (OpenJK 1.0.1.1, openja/base), Jedi Outcast (OpenJK 1.0.1.1, openjo/base), Medal of Honor: Allied Assault (OpenMOHAA 0.82.1, openmohaa/main), Urban Terror (Q3-UT4 4.3.4, urt/q3ut4), RealRTCW 5.43 (realrtcw/Main), Quake II (Yamagi 8.60, quake2/baseq2), Quake (Darkplaces, quake1/darkplaces/id1), UZDOOM 4.14.3 (uzdoom), Wolfenstein 3D (ECWolf 1.4.2, ecwolf), FTEQW 1.05 (fteqw), Xash3D 0.21 (xash/valve), Source Engine 1.16 (srceng/hl2), Serious Sam TFE 1.10.7 (serioussamtfe) and Serious Sam TSE 1.10.7 (serioussamtse). Every one is built in this configuration. The F-Droid flavour leaves out Xash3D and Source, and the idtech flavour leaves out those two and Serious Sam. DOOM 3 BFG carries a second library for its Vulkan renderer. ref: Q3E/src/main/java/com/n0n3m4/q3e/Q3EGame.java:17-291, Q3E/src/main/java/com/n0n3m4/q3e/Q3EGameConstants.java:204-230, Q3E/src/main/jni/CMakeLists.txt:33-60, 137-266

The retail data is what the user brings, and no engine here names its archives one by one. The idTech 4 lineage lists .pk4 in the game directory, DOOM 3 BFG lists .resources, Yamagi walks pak0 through pak99 for each of its four container suffixes and then globs the rest, and Serious Sam globs *.gro. What every id-derived engine does gate on is default.cfg inside those archives: an empty read is a fatal error, and only the Splash Damage build is compiled past the check. UZDOOM ends with "Cannot find a game IWAD" when no known IWAD is present, and ECWolf with "Can not find base game data. (*.wl6, *.wl1, *.sdm, *.sod, *.n3d)". The launcher carries a store or homepage link per game and mod so the data can be bought or downloaded. ref: doom3/neo/framework/FileSystem.cpp:2052, 2503, 3392-3400, Q3E/src/main/jni/doom3bfg/neo/framework/FileSystem.cpp:3001, 3173, Q3E/src/main/jni/darkmod/framework/FileSystem.cpp:2650-2657, Q3E/src/main/jni/quake3/code/qcommon/files.c:4161-4165, Q3E/src/main/jni/rtcw/SP/code/qcommon/files.c:4340-4344, Q3E/src/main/jni/jk/code/qcommon/files.cpp:3020, Q3E/src/main/jni/openmohaa/code/qcommon/files.cpp:4011, Q3E/src/main/jni/quake2/yquake2/src/common/filesystem.c:1801-1850, Q3E/src/main/jni/zdoom/src/d_iwad.cpp:738, Q3E/src/main/jni/ecwolf/src/wl_iwad.cpp:766, idTech4Amm/src/main/java/com/karin/idTech4Amm/sys/GameResourceUrl.java:14-118

The Quake III lineage keeps id's release checksums for baseq3 pak0 through pak8 and missionpack pak0 through pak3, and an archive whose value disagrees only draws a console warning telling the user to re-copy from the CD or re-install the point release. Those numbers are a block checksum over the CRCs of the archive members, not a hash of the file, so they identify a release rather than validate a download. ref: Q3E/src/main/jni/quake3/code/qcommon/files.c:178-197, 3572-3690, Q3E/src/main/jni/quake3/code/qcommon/qcommon.h:592-593

UZDOOM reads the IWAD names it will accept from iwadinfo.txt inside game_support.pk3: the DOOM, DOOM II, Final DOOM, BFG and KEX re-releases, Freedoom, Heretic, Hexen, Strife, Blasphemer, Chex Quest, Action Doom 2, HacX, Harmony, Square, Delaweare and Return of the Triad, forty-nine names. The launcher itself names four of them as selectable data files, DOOM.WAD, DOOM2.WAD, freedoom1.wad and freedoom2.wad, because UZDOOM and ECWolf are the two games whose data is a file rather than a folder. ref: Q3E/src/main/jni/zdoom/src/d_iwad.cpp:287-297, 321-342, Q3E/src/main/jni/zdoom/src/version.h:100-102, idTech4Amm/src/main/java/com/karin/idTech4Amm/sys/Game.java:69-72, Q3E/src/main/java/com/n0n3m4/q3e/Q3EInterface.java:710-713

Starting a game extracts that game's bundled resources first. A text file named idtech4amm.version is written beside them and compared on the next run, so an engine update replaces the copy and a user edit survives otherwise. The Dark Mod, DOOM 3 BFG, UZDOOM, Xash3D, Source, Enemy Territory, ECWolf, Skin Deep and ETQW are covered by this path, while the bot, Rivensin and translation archives are extracted on request from the launcher instead. ref: Q3E/src/main/java/com/n0n3m4/q3e/Q3EMain.java:167, Q3E/src/main/java/com/n0n3m4/q3e/Q3EGameHelper.java:667-746, 964-984, Q3E/src/main/java/com/n0n3m4/q3e/Q3EPatchResource.java:12-47, Q3E/src/main/java/com/n0n3m4/q3e/Q3EPatchResourceManager.java:32-218

On-screen button images are read through a search path built from the working directory, the external files directory of the package, its internal data directory and the assets of the apk, plus every .zipak archive found in the first three. A file of the same name in any of them replaces the built-in image, and a folder under controls_theme/ becomes a named theme in the chooser, described by a description.txt that may be suffixed with a language tag. ref: Q3E/src/main/java/com/n0n3m4/q3e/karin/KFDManager.java:66-96, Q3E/src/main/java/com/n0n3m4/q3e/Q3EContextUtils.java:236-241, 305-345, Q3E/src/main/java/com/n0n3m4/q3e/Q3EGlobals.java:230, idTech4Amm/src/main/java/com/n0n3m4/DIII4A/launcher/SetupControlsThemeFunc.java:149-179

16 files: 1 required, 15 optional. 23 more files come with the app.

By kind: 18 BIOS and 21 game data.

39 rows
File Required Hash
autoexec.cfg no -
description.txt no -
controller_map.txt no -
controls_theme/<name>/btn_jump.png no -
doom3/base/gameaarch64.so no -
doom3/base/gamearm.so no -
doom3/d3xp/gameaarch64.so no -
doom3/d3xp/gamearm.so no -
doom3/bloodmod/gameaarch64.so no -
doom3/bloodmod/gamearm.so no -
quake4/q4base/gameaarch64.so no -
quake4/q4base/gamearm.so no -
prey/preybase/gameaarch64.so no -
prey/preybase/gamearm.so no -
server.so no -
zzz_etqwbase.pk4 yes MD5 5b72ab7bb1c2
uzdoom/uzdoom.pk3 with the app MD5 d3f231863ee2
uzdoom/game_support.pk3 with the app MD5 64d976172bae
uzdoom/game_widescreen_gfx.pk3 with the app MD5 8ebf4d4a7b95
uzdoom/lights.pk3 with the app MD5 5e5977e018d3
uzdoom/brightmaps.pk3 with the app MD5 302fd7cffd2b
uzdoom/soundfonts/uzdoom.sf2 with the app MD5 f306ebc541a4
uzdoom/fm_banks/GENMIDI.GS.wopl with the app MD5 29570afc6cce
uzdoom/fm_banks/gs-by-papiezak-and-sneakernets.wopn with the app MD5 4978fd39a6d7
ecwolf/ecwolf.pk3 with the app MD5 d9dcd91db4a0
glprogs.pk4 with the app MD5 a0fcf6c54d45
renderprogs.pk4 with the app MD5 7edee35e1e53
glsl.pk4 with the app MD5 b94d15df5bf7
etw/legacy/legacy_v2.83.2.pk3 with the app MD5 ea838df0911a
xash/extras.pk3 with the app MD5 1a65bf279b96
xash/cs16client-extras.pk3 with the app MD5 15bf94e95c94
extras.zip with the app MD5 15944b906860
doom3/base/zzz_idTech4Amm_d3_sabot_a7.pk4 with the app MD5 494bd9601fc8
quake4/q4base/zzz_idTech4Amm_q4_sabot_a9.pk4 with the app MD5 710997decddd
doom3/rivensin/zzz_idTech4Amm_play_original_doom3_level.pk4 with the app MD5 214e3daebf5d
doom3/base/doom3_chinese_translation_doom3bfg.pk4 with the app MD5 4fa638d0accd
controls_theme.zipak with the app MD5 9f6f5073fda9
btn_jump.png with the app -
keyboard/generic.json with the app MD5 ef9b27699a62

In this collection: 15 in repo, 0 missing and 1 unsourceable.

15 files

autoexec.cfg optional in repo

Console script the engine runs at startup

  • Executed by the id-derived engines from the mod folder and from the base folder. The launcher lists both positions next to the config file each game writes for itself, DoomConfig.cfg, Quake4Config.cfg, preyconfig.cfg, q3config.cfg, wolfconfig.cfg, Darkmod.cfg, uzdoom.ini and the rest, and opens any of them in its editor. The config files are written by the engines, but this one only ever comes from the user.

description.txt optional in repo

Blurb shown for a mod in the chooser

  • Read from the root of a mod folder when the mod list is built and shown under the folder name with its size. The control theme chooser reads a file of the same name from a theme folder, there with an optional language suffix.

controller_map.txt optional in repo

Extra SDL controller mappings

  • Read from: the app's internal storage, not the BIOS directory
  • SDL builds this path from the internal storage directory of the package when SDL_GAMECONTROLLERCONFIG_FILE is unset, which it is here, and reads it while the game controller subsystem starts, after the compiled-in mappings and before the ones the environment carries. It reaches the six games the app runs on SDL, Xash3D, Source, ECWolf, Skin Deep, Quadrilateral Cowboy and Icarus. The other engines take input from the Q3E frontend instead. The SDL2 tree under deplibs is what the build compiles, version 2.32.5.

controls_theme/<name>/btn_jump.png optional in repo

Button images of a user theme

  • A folder under controls_theme/ in any search path, or inside a .zipak there, appears in the chooser under its own name and its images replace the built-in ones. A description.txt beside them, optionally suffixed with a language tag, supplies the name, author and description the chooser shows.

gameaarch64.so optional in repo

DOOM 3 game library for arm64, built from the DOOM 3 SDK the README links

  • Path: doom3/base/gameaarch64.so
  • Looked for in the mod folder of DOOM 3, Quake 4, Prey or ETQW when the external-library preference is on, copied to a private cache and named to the engine through harm_fs_gameLibPath. The folder is the one fs_game names, the base folder of the game when it names none. The file name follows the running architecture, gameaarch64.so on arm64 and gamearm.so on armv7. Without it the engine keeps the game code built into the apk. The launcher also accepts a full path to any libxxxxx.so instead.

gamearm.so optional in repo

DOOM 3 game library for armv7, built from the DOOM 3 SDK the README links

  • Path: doom3/base/gamearm.so
  • Looked for in the DOOM 3 base folder under the same preference, armv7 builds only.

gameaarch64.so optional in repo

DOOM 3 Resurrection of Evil game library for arm64, built from the DOOM 3 SDK the README links

  • Path: doom3/d3xp/gameaarch64.so
  • Looked for in the d3xp mod folder of DOOM 3 under the same preference, arm64 builds only.

gamearm.so optional in repo

DOOM 3 Resurrection of Evil game library for armv7, built from the DOOM 3 SDK the README links

  • Path: doom3/d3xp/gamearm.so
  • Looked for in the d3xp mod folder of DOOM 3 under the same preference, armv7 builds only.

gameaarch64.so optional in repo

DOOM 3 Blood Mod game library for arm64, released from the DOOM 3 SDK repository

  • Path: doom3/bloodmod/gameaarch64.so
  • Looked for in the bloodmod mod folder of DOOM 3 under the same preference, arm64 builds only.

gamearm.so optional in repo

DOOM 3 Blood Mod game library for armv7, released from the DOOM 3 SDK repository

  • Path: doom3/bloodmod/gamearm.so
  • Looked for in the bloodmod mod folder of DOOM 3 under the same preference, armv7 builds only.

gameaarch64.so optional in repo

Quake 4 game library for arm64, built from the Quake 4 SDK the README links

  • Path: quake4/q4base/gameaarch64.so
  • Looked for in the Quake 4 base folder under the same preference, arm64 builds only.

gamearm.so optional in repo

Quake 4 game library for armv7, built from the Quake 4 SDK the README links

  • Path: quake4/q4base/gamearm.so
  • Looked for in the Quake 4 base folder under the same preference, armv7 builds only.

gameaarch64.so optional in repo

Prey game library for arm64, built from the Prey SDK the README links

  • Path: prey/preybase/gameaarch64.so
  • Looked for in the Prey base folder under the same preference, arm64 builds only.

gamearm.so optional in repo

Prey game library for armv7, built from the Prey SDK the README links

  • Path: prey/preybase/gamearm.so
  • Looked for in the Prey base folder under the same preference, armv7 builds only.

server.so optional unsourceable

External Xash3D game libraries

  • Aliases: client.so, menu.so
  • Read from lib/<arch>/ inside the Xash3D mod folder when the external-library preference is on, copied to the private cache and passed as the dll, clientlib and menulib parameters with gamelibdir pointing at the cache. The three default names are used unless the command line names others, and any further libraries in the folder are copied alongside.
  • Not collectable: compiled per mod from hlsdk-portable, with no released binary to collect (acknowledged gaps)
1 file

zzz_etqwbase.pk4 required in repo game data

ETQW shader set and megatexture patches

  • Unpacked into the ETQW base folder. The name sorts last so the entries override the ones the retail archives carry. ETQW_GLSL_SHADER_VERSION names the set the build expects and reads .6 here. The .3 pack it replaced is kept as a variant for older builds. Only the universal v1.1.0harmattan73 APK carries it in its assets, the arm64 and armv7 APKs of the same release do not.
23 files

uzdoom.pk3 comes with the app game data

UZDOOM engine resource archive

  • Path: uzdoom/uzdoom.pk3
  • Named by BASEWAD and searched before anything else. A miss ends the process with "Cannot find uzdoom.pk3". Carries the hex font, the widget resources and the script definitions the engine needs before a game is chosen. Copied out of the apk with the rest of the UZDOOM resource directory.

game_support.pk3 comes with the app game data

UZDOOM IWAD definitions and per-game filters

  • Path: uzdoom/game_support.pk3
  • Named by OPTIONALWAD and opened as the second file of the IWAD manager. It holds the IWADINFO lump, so without it no IWAD is recognised and startup ends on "Cannot find a game IWAD" even when the WAD is in place. Also carries the per-game filter trees keyed by IWAD identity.

game_widescreen_gfx.pk3 comes with the app game data

Widescreen replacements for the stock graphics

  • Path: uzdoom/game_widescreen_gfx.pk3
  • Searched by name and loaded only when the startup dialog leaves widescreen graphics enabled.

lights.pk3 comes with the app game data

Dynamic light definitions

  • Path: uzdoom/lights.pk3
  • Searched by name on the user choice recorded at first start, and offered a second time as a launcher switch that appends it to the file list.

brightmaps.pk3 comes with the app game data

Brightmap definitions

  • Path: uzdoom/brightmaps.pk3
  • Loaded on the same choice and the same launcher switch as the light definitions.

uzdoom.sf2 comes with the app game data

SoundFont for the MIDI devices

  • Path: uzdoom/soundfonts/uzdoom.sf2
  • Collected by scanning a soundfonts directory added to the search paths of the config file (Q3E/src/main/jni/zdoom/src/gameconfigfile.cpp:220, 258). Every .sf2 and zipped GUS patch set found there becomes a menu entry. fluid_patchset defaults to GAMENAMELOWERCASE, "uzdoom", which FindSoundFont matches against the file base name.

GENMIDI.GS.wopl comes with the app game data

OPL3 instrument bank

  • Path: uzdoom/fm_banks/GENMIDI.GS.wopl
  • Collected from an fm_banks directory added to the search paths beside the soundfont directory, for the OPL synthesiser.

gs-by-papiezak-and-sneakernets.wopn comes with the app game data

OPN2 instrument bank

  • Path: uzdoom/fm_banks/gs-by-papiezak-and-sneakernets.wopn
  • Collected from the same fm_banks directory, for the OPN2 synthesiser.

ecwolf.pk3 comes with the app game data

ECWolf engine resource archive

  • Path: ecwolf/ecwolf.pk3
  • Named by MAIN_PK3 and passed to the game selector with the program directory (Q3E/src/main/jni/ecwolf/src/wl_main.cpp:1294-1307). Failing to open it ends the process with "Could not open ecwolf.pk3!". It holds the IWADINFO rules that identify which Wolfenstein data set is present, the palettes and the actor definitions. This build reads it from disk after extraction, unlike the libretro core which compiles it in.

glprogs.pk4 comes with the app game data

The Dark Mod GLSL shader set rewritten for OpenGL ES

  • Unpacked into the standalone directory as glslprogs/, the tree the renderer compiles its programs from. Version-stamped with the engine release and a patch number, so a Dark Mod update or a shader fix replaces it. TDM_GLSL_SHADER_VERSION reads 2.14.2 here: the four SSAO programs moved their uniform-dependent initialisers out of global scope and cast their integer terms to float. The 2.14.1 pack it replaced is kept as a variant. Hash of the copy in the universal APK, the arm64 and armv7 APKs ship a 98436 byte glprogs.pk4 instead.

renderprogs.pk4 comes with the app game data

DOOM 3 BFG shader set rewritten for OpenGL ES

  • Unpacked into base/renderprogs/ beside the game resources. The shipped BFG data carries the desktop HLSL set, which this build cannot use.

glsl.pk4 comes with the app game data

Skin Deep shader set rewritten for OpenGL ES

  • Unpacked into base/glsl/ and stamped with the game version.

legacy_v2.83.2.pk3 comes with the app game data

ET: Legacy mod archive matching the built engine

  • Path: etw/legacy/legacy_v2.83.2.pk3
  • Copied into the legacy folder, the mod the engine runs by default. The retail Enemy Territory data in etmain stays the user's to supply. The file name is built from the engine version, so a Legacy update lands under a new name.

extras.pk3 comes with the app game data

Xash3D touch controls, fonts and controller database

  • Path: xash/extras.pk3
  • Mounted ahead of every game directory from the path in XASH3D_EXTRAS_PAK1. It carries the touch-control textures the mobile build draws and the gamecontrollerdb.txt the SDL joystick layer reads through the virtual filesystem.

cs16client-extras.pk3 comes with the app game data

Counter-Strike 1.6 client resources for Xash3D

  • Path: xash/cs16client-extras.pk3
  • Extracted right after the base extras and mounted the same way, for the cs16 and cs16_yapb server classes the launcher offers.

extras.zip comes with the app game data

Source engine fonts and platform archive

  • Unpacked into files/ under the Source standalone directory. It carries the DejaVu, Droid Sans Fallback, Itim and Liberation faces the engine substitutes for the Windows fonts, and extras_dir.vpk.

d3_sabot_a7.pk4 comes with the app game data

Stupid Angry Bot definitions for DOOM 3 multiplayer

  • Path: doom3/base/zzz_idTech4Amm_d3_sabot_a7.pk4
  • Extracted on request into the current mod folder under a name prefixed to sort last. It holds the defs, scripts and multiplayer AAS files the bot commands need. A second entry repacks only the maps/ tree into zzz_idTech4Amm_d3_sabot_a7_aas.pk4 for users who already have the mod.

q4_sabot_a9.pk4 comes with the app game data

Stupid Angry Bot definitions for Quake 4 multiplayer

  • Path: quake4/q4base/zzz_idTech4Amm_q4_sabot_a9.pk4
  • The Quake 4 counterpart, extracted the same way, with the same maps-only variant written as zzz_idTech4Amm_q4_sabot_a9_aas.pk4.

play_original_doom3_level.pk4 comes with the app game data

Rivensin patch restoring the original DOOM 3 levels

  • Path: doom3/rivensin/zzz_idTech4Amm_play_original_doom3_level.pk4
  • Extracted on request into the rivensin mod folder, the one patch tied to a named mod rather than to whichever mod is selected.

doom3_chinese_translation_doom3bfg.pk4 comes with the app game data

Chinese text and fonts for DOOM 3, taken from the BFG release

  • Path: doom3/base/doom3_chinese_translation_doom3bfg.pk4
  • Copied into the DOOM 3 base folder on request. It pairs with the wide-character language and BFG font support compiled into the engine.

controls_theme.zipak comes with the app

Button image themes carried in the apk

  • Read in place from the assets, never extracted. Archives with this suffix are folded into the search path wherever they are found, and the controls_theme/ folders inside become named entries in the theme chooser. This one carries the cs16-client and source-engine sets.

btn_jump.png comes with the app

Default on-screen button images, 52 files

  • Read from the assets root when the theme is the built-in one. The set covers the alphabet, the digits and the named actions the games bind, and any of the 52 names can be replaced by putting a file of the same name in one of the external search paths.

generic.json comes with the app

Virtual keyboard layout

  • Path: keyboard/generic.json
  • Read straight from the assets when the on-screen keyboard is built, without going through the external search path, so nothing outside the archive replaces it.
.