Read from the Arx Libertatis tree at H:\Work\Projects\ArxSharp\ArxLibertatis and the unpacked retail scripts. See Sources for the port-divergence caveat.
Character & progression
| Value |
Formula |
Source |
| Starting character |
All four attributes 6, 16 attribute points, 18 skill points, level 0 |
Player.cpp |
| Level up |
+1 attribute, +15 skill, full life and mana restore |
Player.cpp |
| XP thresholds |
2,000 / 4,000 / 6,000 / 10,000 / 16,000 / 26,000 / 42,000 / 68,000 / 110,000 / 178,000 |
Player.cpp |
| Beyond the table |
level × 60000 — unreachable; the level-up loop stops at 10 |
Player.cpp |
| Lifetime budget |
26 attribute points, 168 skill points, no respec |
derived |
Attribute contributions to skills
| Skill |
Attribute contribution |
| Stealth |
Dex × 2 |
| Mecanism |
Dex + Mind |
| Intuition |
Mind × 2 |
| Ethereal Link |
Mind × 2 |
| Object Knowledge |
Mind × 1.5 + Dex × 0.5 + Str × 0.5 |
| Casting |
Mind × 2 |
| Projectile |
Dex × 2 + Str |
| Close Combat |
Dex + Str × 2 |
| Defense |
Con × 3 |
Mind feeds five of the nine skills — the overload discussed in Tensions & Lessons.
Derived pools & regeneration
| Value |
Formula |
Source |
| Max life |
Con × (level + 2) |
Player.cpp |
| Max mana |
Mind × (level + 1) |
Player.cpp |
| Life regen per frame |
0.00008 × ms × (Con + Str × 0.5 + Defense) × 0.02 |
Player.cpp |
| Mana regen per frame |
0.0000008 × ms × (Mind + EtherealLink) × 10 |
Player.cpp |
| Hunger decay per frame |
0.00008 × ms × (Con + Str × 0.5) × 0.02 × 0.5 |
Player.cpp |
| Hunger floor |
-10; below 0 the life-regen term inverts to a drain at half rate |
Player.cpp |
| Poison tick |
cp = poison × ms × 0.00025, saving throw vs resistPoison + (10 − poison) |
Player.cpp |
| Failed poison save |
deals cp / 3 damage and burns poison off more slowly than a success |
Player.cpp |
Combat
| Value |
Formula |
Source |
| Melee attack value |
max(1, Str × 0.5 − 5) + CloseCombat × 0.1 + equipment |
Player.cpp |
| Damage dealt |
attack × ratioaim × backstab, then − (damage × absorb × 0.01) |
Equipment.cpp |
| Hit chance |
100 − (targetAC − attackerAttack) — rolled after the swing visually connects |
Equipment.cpp |
| Armor class |
floor(max(1, Defense × 0.1 − 1)) |
Player.cpp |
| Damage absorb (player) |
Defense × 0.5 percent — Defense 100 = 50% flat reduction |
Equipment.cpp |
| Critical hit chance |
Dex × 2 + CloseCombat × 0.2 − 18, multiplier × 1.5 |
Player.cpp |
| Backstab |
× 1.5 at Stealth × 0.5 percent, only vs NPCFLAG_BACKSTAB targets, no facing check |
Equipment.cpp |
| Aim time |
weapon aim_time − (Dex − 10) × 20 ms, hard floor 1500 ms |
Player.cpp |
| Resist magic |
floor(Mind × 2 × (1 + Casting × 0.005)) |
Player.cpp |
| Resist poison |
floor(Con × 2 + Defense × 0.25) |
Player.cpp |
Magic
| Value |
Formula |
Source |
| Caster level |
clamp((Casting + Mind) × 0.1, 1, 10) |
Player.h |
| Precast buffer |
3 slots, FIFO eviction, 1 s global cooldown, ~550 ms cast animation |
Precast.cpp |
| Precast mana |
Checked and charged at launch, not at memorisation |
Precast.cpp |
| Rune vocabulary |
21 symbols, of which Akbaa is never player-obtainable |
Rune.h |
| Spell count |
50 across 10 tiers, sequences 2–4 runes, 10 flagged secret |
SpellData.cpp |
Per-spell costs: Spell Data.
Stealth & detection
| Value |
Formula |
Source |
| Visibility threshold |
Seen if ambient light > 15 + Stealth × 0.1 |
Player.cpp |
| Unconditional detection |
A lit torch, or range < 200 units |
NPC.cpp |
| Vision cone |
± 110° with line of sight, or trace within 25 units |
NPC.cpp |
| Hearing — footsteps |
600 units |
NPC.cpp |
| Hearing — items |
800 units |
NPC.cpp |
| Events fired |
DETECTPLAYER / UNDETECTPLAYER / HEAR with distance |
NPC.cpp |
| Value |
Formula |
Source |
| Buy price |
basePrice × shopMultiplier × (durability / maxDurability) |
Interactive.cpp |
| Sell value |
(buyPrice / 3) × count × (1 + Intuition × 0.005) |
Interactive.cpp |
| Item identification |
ObjectKnowledge + Mind ≥ item identify_value, re-evaluated in bulk |
Inventory.cpp |
| Lockpick attempt |
(Mecanism − lockpickability + 20) percent per 3-second attempt |
lockpick.asl |
| Lockpick failure |
Auto-fail and pick damage if Mecanism < lockpickability; rating 100 is impossible |
lockpick.asl |
| Lockpick reward |
+150 XP on success |
lockpick.asl |
| Disarm Trap spell |
casterLevel × 10 ≥ trap_lockpickability — CL 10 clears any trap |
lever.asl |
| Lockpick abort |
Attempt cancels if the player moves > 400 units away |
lockpick.asl |
| Stealth pathfinding cost |
300 × intensity × mean(rgb) × falloff per ignited light |
PathFinder.cpp |
| Pathfinder heuristic |
0.0 (distance only) to 0.5 (balanced, default) |
PathFinder.h |
NPC behaviour
| Value |
Formula |
Source |
| Behaviour flags |
NONE FRIENDLY MOVE_TO WANDER_AROUND FLEE SNEAK FIGHT DISTANT MAGIC GO_HOME LOOK_AROUND STARE_AT |
NPC.cpp |
| Behaviour stack |
Pushes flags, param, target, movemode and animation layers; pop re-launches pathfinding |
NPC.cpp |
| Melee evade |
Always inside TOLERANCE − 20, else 3% per check: 10% back / 45% left / 45% right |
NPC.cpp |
| Caster evade |
Always inside 340 units, else 15% per check: 33% / 33% / 33% |
NPC.cpp |
| Reaction to player strike |
Every time: 20% back / 40% strafe left / 40% strafe right |
NPC.cpp |
| NPC damage roll |
damages × ratioaim × Random(0.5, 1.0) |
Equipment.cpp |
| Curse on an NPC |
−5% damage, AC and absorb per caster level |
Equipment.cpp |
Character Build · Combat · Spell Data · Sources