Skip to content

Sources

Primary — engine code

Arkane released the Arx Fatalis source under GPL on 14 January 2011 (game assets remain proprietary). Every formula in this vault was read from the Arx Libertatis tree, a maintained cross-platform port of that release, as checked out locally at H:\Work\Projects\ArxSharp\ArxLibertatis.

File What it verifies
src/game/Player.cpp Starting stats (4×6, 16 attr / 18 skill), XP table, level-up rewards, life/mana formulas, attribute→skill contributions, misc stats, hunger + regen + poison clock, GetPlayerStealth
src/game/Player.h Skill list; spellLevel() = clamp((Casting + Mind) × 0.1, 1, 10)
src/game/Equipment.cpp ARX_EQUIPMENT_ComputeDamages — attack, backstab ×1.5, absorb, crit ×1.5, hit chance
src/game/Spells.cpp Full mana cost table, caster-level assignment, fizzle conditions
src/game/magic/SpellData.cpp All 50 spells: tier, rune sequence, secret flag
src/game/magic/Rune.h The 21 rune symbols and their meanings
src/game/magic/Precast.cpp MAX_PRECAST = 3, FIFO eviction, 1 s cooldown, mana charged at launch
src/game/magic/spells/SpellsLvl01.cpp, SpellsLvl03.cpp Magic Missile and Fireball damage/count/radius scaling
src/game/NPC.cpp Behaviour flags and stack, evade rolls, reaction to player strikes, vision cone ±110°, detection conditions, hearing radii (600 / 800)
src/ai/PathFinder.h / PathFinder.cpp A* over the anchor graph, tunable heuristic, cylinder constraint, flee and wander queries, STEALTH_LIGHT_COST = 300 illumination cost
src/scene/Interactive.cpp Buy/sell price formulas, the Intuition modifier, and HaveCommonGroup (group set intersection)
src/game/Inventory.cpp Identification threshold ObjectKnowledge + Mind ≥ identify_value
src/script/ScriptedLang.cpp SENDEVENT dispatch: -g global-by-group, -gr radius-by-group, -gz zone-by-group; ISGROUP / !ISGROUP operators
src/game/Damage.cpp Area damage skips NPCs sharing a group with the source, except where the player is involved

Primary — retail game data

Unpacked at H:\Work\Projects\ArxSharp\Build\unpacked:

  • graph/obj3d/interactive/fix_inter/_common/lockpick.asl — the shared lockpicking routine: auto-fail below the lock's rating, Mecanism − lockpickability + 20 percent per 3-second attempt, 150 XP on success, picks damaged on failure, attempt aborts beyond 400 units
  • graph/obj3d/interactive/fix_inter/lever/lever.asl — trap state (trapped, trap_lockpickability, SETTRAP) and the Disarm Trap check: casterLevel × 10 ≥ rating
  • graph/obj3d/interactive/fix_inter/puzzle_pillar01/puzzle_pillar01_0001/ — controlled-zone object-placement puzzle with a ^POSSESS check
  • graph/obj3d/interactive/fix_inter/akbaa_puzzle/akbaa_puzzle.aslCOMBINEDESTROYSENDEVENTREPLACEME pattern
  • Mechanism census by script folder: 118 levers, 83 teleport markers, 56 buttons, 44 secret objects, 36 plates/elevators, 30 puzzle_*, 22 traps, 13 statues, 10 wheels, 7 pillars, 6 portcullises, 6 bridges, 3 altars
  • graph/obj3d/interactive/npc/ — 41 NPC class folders. Stat blocks (SET_NPC_STAT, SET_XP_VALUE, SET_POISONOUS) read from rat_base, ratman_base, goblin_base (base / lord / king), troll_base, undead_base (zombie / mummy), spider_base (base / baby / nasty), golem, demon
  • The two shared NPC include sets, main_animal and main_clever — faction membership, CALL_FOR_HELP (600 units fighting, 1200 fleeing), cowardice escalation, confusability gates, the Harm/Life-Drain panic branch, ratman teleport and gold theft
  • Faction census from base scripts (SET §friend, SETGROUP): goblin (+ goblin_castle / goblin_earth / goblin_water), ratmen, trolls, UNDEAD, DEMON, kingdom / human_kingdom, akbaa, sacred_sword, plus MICECARE as a non-faction subscription channel. Spiders, golems and rats are friend "NONE"
  • graph/levels/ — 24 level directories (level0level24, no level9)
  • localisation/utext_english.ini — all in-game book, note and journal text: the Noden laws, the god register, Lord Long's account, the High Priest's memoir, Falan Orbiplanax's letter, and the quest journal spine. Source of everything in World History & Lore, including the year 199 / 216 discrepancy
  • items/provisions/ — the crafting chain: flour, bread_uncooked, pie_uncooked, applepie_uncooked, food_prep. ON COMBINE + REPLACEME transformations, prices, and the ^INPLAYERINVENTORY guard on every ON COOK
  • Item category census: 285 movable, 229 quest items, 195 provisions, 169 magic, 120 special, 109 armor, 104 weapons, 36 jewelry
  • ~3,600 .asl entity scripts across fix_inter, items, npc, system

Divergence caveat

Arx Libertatis is a port, not a byte-identical build. It fixes bugs and has changed behaviour in at least one analysed area: version 1.2 (2021) shipped a more forgiving rune-recognition algorithm and frame-rate-independent detection. Treat casting-feel claims as describing AL, not retail 1.21. Arithmetic formulas (damage, mana, prices, XP) are inherited from the original code and are far more likely to be faithful, but any single number could in principle have been touched — spot-check against the retail binary before publishing anything load-bearing.

Secondary — development history

  • "From New To Arkane: Ten Years Of Development", Gamasutra / Game Developer. Colantonio on Arx: he calls it the truest game they made, admits it shipped buggy, and states the team was nine people at a time when 30+ was normal.
  • Wikipedia — Arx Fatalis: release dates (DE 28 June 2002; UK 8 Nov 2002; NA 12 Nov 2002; Xbox 2003–04), credits (director/designer Raphaël Colantonio, programmer Cyril Meynier), 2011 GPL source release.
  • Wikipedia — Arkane Studios: founded 1 October 1999 in Lyon; intended as Ultima Underworld III until EA declined; publisher difficulties then JoWooD; critically well received but a commercial failure; the critical praise led to the Source-engine relationship and ultimately Dark Messiah.
  • Arx Libertatis 1.2 release coverage, GamingOnLinux, 2021: confirms the 2011 GPL release and the reworked rune-detection algorithm.

Gaps to close

  • Whether Intuition has any engine-side effect beyond sell price (in-game framing suggests sensing hidden things; not found in code)
  • ~~Where Mecanism gates trap disarming as opposed to locks~~ — closed: traps are disarmed by the Disarm Trap spell on a casterLevel × 10 check (lever.asl); Mecanism governs locks only
  • ~~Whether any NPC script implements coordination between multiple attackers, or whether all tactics are per-entity~~ — partly closed: there is no formation or flanking logic, but CALL_FOR_HELP and the PLAYER_ENEMY group broadcast do pull whole factions into a fight
  • Stat blocks not yet extracted: liche, gargoyle, snake woman, black thing, worm, ice dragon, ylside, the Akbaa boss phases
  • Named-region ↔ level-index mapping, and the status of the missing level9
  • A retail-1.21 spot-check of the damage and mana tables