acdream/docs/research/acclient_function_map.md
Erik 50c0704ada research: complete acclient.exe function map — 70+ identified functions
Maps decompiled functions to their real AC class::method names by
cross-referencing against ACE's C# physics port. Covers:

- CPhysicsObj (13 functions): Euler integration, velocity, gravity,
  collision dispatch, friction, contact checking
- CMotionInterp (18 functions): full motion state machine including
  jump, movement, velocity computation, motion dispatch
- CLandBlockStruct (7 functions): terrain mesh construction, split
  direction, UVs, water depth, normal lighting
- CLandBlock (6 functions): landblock lifecycle, static object loading,
  cell management, neighbor expansion
- LandDefs (4 functions): coordinate system constants and transforms
- Collision/Transition (13 functions): sphere-polygon intersection,
  ray-plane tests, BSP traversal, walkable surface detection,
  slide/step sphere, main collision loop
- WeenieObject vtable (7 entries): confirmed from call site analysis

Also documents PhysicsObj struct layout (13 fields with offsets) and
MotionInterp struct layout (14 fields with offsets).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 23:46:22 +02:00

8 KiB
Raw Blame History

acclient.exe Decompiled Function Map

Mapped from 22,225 decompiled functions (688K lines of C) against ACE's C# physics port and ACME's ClientReference.cs.

CPhysicsObj (chunk_00510000.c, chunk_00500000.c)

Address FUN name ACE method Description
0x515020 FUN_00515020 PhysicsObj::update_object Top-level per-frame update
0x5111D0 FUN_005111d0 PhysicsObj::UpdatePhysicsInternal Euler integration: pos += vel*dt + 0.5*accel*dt²
0x511420 FUN_00511420 PhysicsObj::calc_acceleration Sets gravity (-9.8 Z) when Gravity flag set
0x511EC0 FUN_00511ec0 PhysicsObj::set_velocity Stores velocity, clamps to MaxVelocity (50.0)
0x511FA0 FUN_00511fa0 PhysicsObj::set_local_velocity Body→world transform then set_velocity
0x511DE0 FUN_00511de0 PhysicsObj::set_on_walkable Sets/clears OnWalkable transient flag
0x511560 FUN_00511560 PhysicsObj::report_collision_start Fires environment collision callback
0x513AC0 FUN_00513ac0 PhysicsObj::report_collision_end Fires collision-end callback
0x513B60 FUN_00513b60 PhysicsObj::handle_obj_collision Object-to-object collision dispatch
0x515280 FUN_00515280 PhysicsObj::handle_collision Elasticity bounce response
0x513730 FUN_00513730 PhysicsObj::UpdatePositionInternal Position advance + interpenetration resolve
0x50F940 FUN_0050f940 PhysicsObj::calc_friction Friction from ground normal + slope
0x510080 FUN_00510080 PhysicsObj::check_contact_velocity Velocity vs contact normal check

PhysicsObj Struct Layout

Offset Field Type
+0xA8 State (PhysicsState flags) uint
+0xAC TransientState uint
+0xB0 Elasticity float
+0xD8 LastUpdateTime double
+0xE0/E4/E8 Velocity XYZ float[3]
+0xEC/F0/F4 Acceleration XYZ float[3]
+0xF8/FC/100 Omega XYZ float[3]
+0x12C WeenieObject ptr ptr
+0x130/134/138 Ground normal XYZ float[3]

CMotionInterp (chunk_00520000.c)

Address FUN name ACE method Description
0x5286B0 FUN_005286b0 MotionInterp::get_jump_v_z Jump Z velocity (delegates to WeenieObj)
0x528660 FUN_00528660 MotionInterp::jump_charge_is_allowed Can charge jump?
0x5285E0 FUN_005285e0 MotionInterp::motion_allows_jump Current anim permits jump?
0x528EC0 FUN_00528ec0 MotionInterp::jump_is_allowed Top-level jump permission
0x528CD0 FUN_00528cd0 MotionInterp::get_leave_ground_velocity Full 3D launch vector
0x529390 FUN_00529390 MotionInterp::jump Initiate jump
0x529710 FUN_00529710 MotionInterp::LeaveGround Reset jump state on airborne
0x5296D0 FUN_005296d0 MotionInterp::HitGround Landing handler
0x528960 FUN_00528960 MotionInterp::get_state_velocity Compute velocity for current motion
0x528A50 FUN_00528a50 MotionInterp::StopCompletely Reset to Ready/idle
0x5287F0 FUN_005287f0 MotionInterp::adjust_motion Apply pending motion adjustments
0x5293F0 FUN_005293f0 MotionInterp::apply_raw_movement Raw→interpreted state conversion
0x529210 FUN_00529210 MotionInterp::apply_current_movement Set physics velocity from interpreted state
0x528DD0 FUN_00528dd0 MotionInterp::contact_allows_move Slope angle check
0x528F70 FUN_00528f70 MotionInterp::DoInterpretedMotion Core animation state machine
0x529080 FUN_00529080 MotionInterp::StopInterpretedMotion Stop specific interpreted motion
0x529140 FUN_00529140 MotionInterp::StopMotion Stop specific raw motion
0x529930 FUN_00529930 MotionInterp::DoMotion Process one raw motion command
0x529A90 FUN_00529a90 MotionInterp::PerformMovement Top-level dispatcher (switch 1-5)

MotionInterp Struct Layout

Offset Field ACE name
+0x04 WeenieObject ptr WeenieObj
+0x08 PhysicsObject ptr PhysicsObj
+0x14 RawMotionState start RawState
+0x20 ForwardCommand RawState.ForwardCommand
+0x28 ForwardSpeed RawState.ForwardSpeed
+0x2C SideStepCommand RawState.SideStepCommand
+0x38 TurnCommand RawState.TurnCommand
+0x44 InterpretedMotionState start InterpretedState
+0x4C InterpretedState.ForwardCommand
+0x50 InterpretedState.ForwardSpeed
+0x70 StandingLongJump bool
+0x74 JumpExtent float
+0x7C MyRunRate float

CLandBlockStruct (chunk_00530000.c)

Address FUN name ACE method Description
0x531D10 FUN_00531d10 IsSWtoNECut Split direction helper (inner)
0x532A50 FUN_00532a50 ConstructPolygons Outer 8×8 loop with 0xCCAC033 constants
0x532EB0 FUN_00532eb0 GetCellRotation / ConstructUVs PalCode computation
0x532D10 FUN_00532d10 unpack Deserialize from dat stream
0x531F10 FUN_00531f10 get_packed_size Returns 0xF4 (244 bytes)
0x532440 FUN_00532440 AdjustPlanes Normal accumulation + lighting
0x532290 FUN_00532290 CalcCellWater Water depth check

CLandBlock (chunk_00530000.c)

Address FUN name ACE method Description
0x530690 FUN_00530690 Init / constructor Initialize landblock fields
0x5307E0 FUN_005307e0 release_all Free all resources
0x531780 FUN_00531780 init_static_objs Load static objects from LandBlockInfo
0x531000 FUN_00531000 release_visible_cells Free cell data
0x5301E0 FUN_005301e0 grab_visible_cells BFS neighbor expansion
0x530650 FUN_00530650 add_server_object Add entity to landblock

LandDefs (chunk_005A0000.c)

Address FUN name ACE method Description
0x5AAA30 FUN_005aaa30 get_vars Set 8 coordinate constants
0x5AABB0 FUN_005aabb0 get_outside_lcoord Cell ID → world coord
0x5AAC70 FUN_005aac70 AdjustToOutside Normalize position to outdoor coords
0x5AAB50 FUN_005aab50 get_block_dir Quadrant → Direction enum

Collision / Transition (chunk_00530000.c)

Address FUN name ACE method Description
0x5384E0 FUN_005384e0 Sphere::SphereIntersectsRay Ray-sphere intersection
0x539500 FUN_00539500 Polygon::sphere_intersects_poly Sphere-polygon contact
0x539750 FUN_00539750 Polygon::sphere_intersects_solid Both-side penetration
0x539BA0 FUN_00539ba0 Polygon::find_time_of_collision Ray-plane-polygon t
0x539DF0 FUN_00539df0 Polygon::find_time_of_collision Cylinder variant
0x53A040 FUN_0053a040 Polygon::find_walkable_collision Edge normal return
0x539110 FUN_00539110 Polygon::calc_normal Face normal from vertices
0x539060 FUN_00539060 Plane::ray_plane_intersect Basic ray-plane t
0x538EB0 FUN_00538eb0 Sphere::slide_sphere Slide along surface
0x538F50 FUN_00538f50 Sphere::land_on_sphere Step down to surface
0x538180 FUN_00538180 CTransition::collide_with_point Point collision handler
0x5387C0 FUN_005387c0 CTransition::find_collisions Main collision loop
0x53A230 FUN_0053a230 Polygon::hits_walkable Walkable surface check

WeenieObject vtable (confirmed from call sites)

vtable offset ACE method Called from
+0x30 InqJumpVelocity get_jump_v_z
+0x34 InqRunRate get_state_velocity
+0x3C CanJump jump_is_allowed
+0x4C HandleCollisionEnd report_collision_end
+0x50 HandleCollisionStart handle_obj_collision
+0x54 HandleMissileCollision handle_obj_collision
+0x58 HandleEnvironmentCollision report_collision_start

PhysicsEngine (chunk_00450000.c)

Address FUN name ACE method Description
0x452A10 FUN_00452a10 PhysicsEngine::update Main simulation loop