acdream/tests/AcDream.Core.Tests/Physics
Erik 88348f6791 fix(physics): #299 — port retail's mover-side IsImpenetrable exemption branch
CollisionExemption checked only the TARGET's IsImpenetrable, and the class doc
asserted "retail's pseudo-C only checks the target's IsImpenetrable(); acdream
follows retail" while blaming ACE for checking both. That was backwards: ACE was
retail-faithful and acdream was missing half the check.

Retail short-circuits on EITHER the mover's own state & IS_IMPENETRABLE (0x80)
OR the target's IsImpenetrable(); either alone exempts. Verified at the byte
level rather than from the decompiler's rendering — Binary Ninja shows the mover
test as `int16_t state_1 ... if (state_1 < 0)`, which reads like a 0x8000 test,
but decoding the PDB-paired binary at the mapped offset gives:

    8b 43 04   mov  eax,[ebx+4]     ; mover object_info.state
    f6 c4 01   test ah,1            ; 0x100  IsPlayer
    84 c0      test al,al           ; sign bit of AL = state & 0x80
    78 3d      js   ...             ; -> collide

`test al, al; js` is a byte-level sign test on AL, i.e. 0x80, not 0x8000.
Corroborated downstream in the same block (`test ah,8` = 0x800 IsPK,
`test ah,0x10` = 0x1000 IsPKLite) and by OBJECTINFO::init @0x0050cf30 setting
state |= 0x80 from the object's own IsImpenetrable().

Also corrected: ACCWeenieObject::IsImpenetrable @0x0058c8c0 returns
(_bitfield >> 0x15) & 1 — retail genuinely conflates BF_FREE_PKSTATUS with
"impenetrable", so acdream's FromPwdBitfield decode was already right.

Both retail arms set collide, so ordering between them is semantically free and
a misreading here could only ever produce spurious collisions, never a
walk-through.

Found while investigating #297; not symptom-causing on its own. No divergence
row: this retires a missing port rather than introducing a deviation, and
nothing in the register or the collision digest's DO-NOT-RETRY tables covers it.

Gates: complete Release solution 10,887 passed / 4 skipped / 0 failed
(baseline 10,867/4/0). Adversarial + retail-conformance review PASS on this
change specifically. Both new tests discrimination-verified by reverting the
branch and confirming failure.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-03 20:13:05 +02:00
..
Motion feat(physics): P5 commit 1 - port ConstraintManager leash distance constants (#167) 2026-07-30 11:54:35 +02:00
A6P7DispatchRulesTests.cs feat(physics): port retail projectile integration 2026-07-14 11:43:11 +02:00
AnimationCommandRouterTests.cs feat(R2-Q4): adapter cutover — SetCycle/PlayAction rehosted on PerformMovement; Fix B / fast-path / stop-anim fallback / G17 gate DELETED 2026-07-02 21:41:27 +02:00
AnimationHookRouterTests.cs feat(anim): Phase E.1 hook router + GameWindow wiring 2026-04-18 16:30:23 +02:00
AnimationSequencerCutoverTraceTests.cs fix(runtime): align portal and movement presentation 2026-07-17 08:48:27 +02:00
AnimationSequencerTests.cs feat(physics): port retail complete object frame pipeline 2026-07-20 09:10:31 +02:00
Ap10WaterSemanticsTests.cs fix(physics): AP-10 - restore retail's 0.1m dry-corner water sink-in; wire WATER_CONTACT_TS 2026-07-30 10:52:39 +02:00
Ap71EntryRestrictionGateTests.cs fix(physics): AP-129 review fix - port CanMoveInto/IsAllowedIn, stop failing closed 2026-07-30 11:36:11 +02:00
BSPQueryTests.cs fix #137 (mechanism 2): BSP full-hit stubs leaked sliding normals — the corridor absorbing wedge 2026-07-05 18:08:29 +02:00
BSPStepUpFixtures.cs feat(physics): Phase L.2.1+L.2.2 — BSP step-up and rooftop landing 2026-04-29 16:16:39 +02:00
BSPStepUpTests.cs fix(physics): restore retail path-6 collision response 2026-07-31 13:44:55 +02:00
BuildShadowCellSetTests.cs fix(physics): validate retail cell containment roots 2026-07-31 14:48:26 +02:00
CameraCornerSealReplayTests.cs fix(physics): traverse prepared indoor portal topology 2026-07-27 00:02:44 +02:00
CellarLipWedgeTests.cs chore(p2): strip cellar-lip dispatch-trace probes after visual confirmation 2026-06-05 09:24:20 +02:00
CellArrayTests.cs feat(physics): Stage 1 — CellArray ordered/deduped cell collection (retail CELLARRAY) 2026-06-03 08:54:45 +02:00
CellarUpTrajectoryReplayTests.cs fix(physics): #265 landing-bounce family - retail check_contact seed + velocity-free landing commit 2026-07-30 20:12:06 +02:00
CellDumpRoundTripTests.cs feat(phys): A6.P3 #98 Step 2 — cell-dump probe + roundtrip test 2026-05-23 15:16:56 +02:00
CellGraphMembershipTests.cs fix(physics): validate retail cell containment roots 2026-07-31 14:48:26 +02:00
CellGraphPopulationTests.cs fix(physics): validate retail cell containment roots 2026-07-31 14:48:26 +02:00
CellMarchLandblockPreservationTests.cs fix(teleport D): cell-march preserves seed landblock id when no resident LB (no more lbX=0 outbound) 2026-06-22 13:38:48 +02:00
CellPhysicsPortalWiringTests.cs feat(physics): Phase 2 — wire CellBSP + Portals into CellPhysics 2026-05-19 16:52:20 +02:00
CellSurfaceTests.cs refactor(physics): remove parsed collision graphs 2026-07-25 18:21:19 +02:00
CellTransitAddAllOutsideCellsTests.cs fix(phys): #106 — outdoor membership crosses landblock boundaries (LandDefs global-lcoord port) 2026-06-09 23:10:59 +02:00
CellTransitCheckBuildingTransitTests.cs fix(physics): validate retail cell containment roots 2026-07-31 14:48:26 +02:00
CellTransitFindCellListTests.cs feat(physics): Phase 2 — BuildingPhysics + CheckBuildingTransit 2026-05-19 17:34:38 +02:00
CellTransitFindCellSetTests.cs fix(physics): validate retail cell containment roots 2026-07-31 14:48:26 +02:00
CellTransitFindTransitCellsSphereTests.cs fix(physics): traverse prepared indoor portal topology 2026-07-27 00:02:44 +02:00
CellTransitFindVisibleChildCellTests.cs fix(physics): validate retail cell containment roots 2026-07-31 14:48:26 +02:00
CellTransitTests.cs T6 (BR-7) C4: straddle-only outside-add (A6.P5 widening DELETED) + #90 stickiness removed 2026-06-11 14:44:49 +02:00
CollisionExemptionTests.cs fix(physics): #299 — port retail's mover-side IsImpenetrable exemption branch 2026-08-03 20:13:05 +02:00
CollisionPrimitivesTests.cs feat(physics): port 9 collision primitives from acclient.exe (chunk_00530000.c) 2026-04-12 23:53:47 +02:00
CollisionShadowVerifierTests.cs perf(physics): cut production traversal to flat assets 2026-07-25 17:00:04 +02:00
CylSphereFamilyTests.cs fix #172: port the retail CCylSphere collision family (platform step-up) 2026-07-05 14:52:28 +02:00
DoorBugTrajectoryReplayTests.cs feat(net): port retail physics spawn and event timestamps 2026-07-14 00:22:17 +02:00
DoorCollisionApparatusTests.cs docs(physics): #165 diagnostic pass - rule out (a)/(b), stop at (c) 2026-07-30 10:01:11 +02:00
DoorSetupGfxObjInspectionTests.cs test(phys): A6.P4 door inside-out — locate cottage wall, identify corner-slide hypothesis 2026-05-25 08:34:52 +02:00
DoorwayMembershipReplayTests.cs test(core): commit doorway-threshold fixture for DoorwayMembershipReplayTests (portable) 2026-06-02 15:22:57 +02:00
EdgeSlideBackProbePrecipiceSlideTests.cs docs+test(physics): retire stale TS-1 row; file AD-53/AD-54 for its two acdream-only branches 2026-07-30 08:13:20 +02:00
EncumbranceSystemTests.cs feat(physics): Campaign P P1 - stat-coupled movement (burden/stamina/vitae) 2026-07-30 08:18:06 +02:00
EntityCollisionFlagsTests.cs fix(physics): TS-23 - plumb real PK/PKLite/Impenetrable mover flags 2026-07-30 09:52:55 +02:00
FindEnvCollisionsMultiCellTests.cs T6 (BR-7) C3: per-cell shadow architecture - flood registration, building channel, per-cell query; b3ce505 stopgap DELETED (closes #99) 2026-06-11 14:37:50 +02:00
FlatBspQueryDifferentialTests.cs fix(physics): traverse prepared indoor portal topology 2026-07-27 00:02:44 +02:00
FlatCollisionAssetBuilderTests.cs feat(physics): define deterministic flat collision assets 2026-07-25 14:52:47 +02:00
FlatCollisionInstalledDatTests.cs fix(physics): traverse prepared indoor portal topology 2026-07-27 00:02:44 +02:00
FramesStationaryFallTests.cs feat(#182): frames_stationary_fall round-trip in the kept transition internals (Slice 1b/1c) 2026-07-07 14:11:35 +02:00
GfxObjDumpRoundTripTests.cs feat(phys): A6.P3 #98 — GfxObj dump infrastructure (ACDREAM_DUMP_GFXOBJS) 2026-05-23 20:24:26 +02:00
HandleAllCollisionsTests.cs feat(vfx): port retail hidden and teleport presentation 2026-07-14 14:59:48 +02:00
HumanoidMotionTableRootMotionTests.cs feat(physics): port retail complete object frame pipeline 2026-07-20 09:10:31 +02:00
IndoorContactPlaneRetentionTests.cs fix(physics): hold retail cell across inner retries 2026-07-31 12:40:50 +02:00
IndoorWalkablePlaneTests.cs Revert "fix(physics): remove per-frame indoor walkable-plane synthesis" 2026-05-20 09:17:24 +02:00
InitialPlacementOverlapTests.cs feat(vfx): port retail hidden and teleport presentation 2026-07-14 14:59:48 +02:00
InterpolationManagerTests.cs feat(physics): port retail complete object frame pipeline 2026-07-20 09:10:31 +02:00
InWorldLinkGuardTests.cs fix(R4-V5): remote transition links stripped by the detached-object guard - door swings snapped (adds register TS-40) 2026-07-03 15:10:16 +02:00
Issue98CellarUpReplayTests.cs test(phys): A6.P3 #98 Step 3 — deterministic replay harness 2026-05-23 15:25:40 +02:00
Issue108CellarAscentViewerReplayTests.cs #108-residual apparatus: vertical cellar-ascent viewer harness - membership/viewer layer EXONERATED 2026-06-12 22:05:06 +02:00
Issue133DungeonTeleportPrefixTests.cs fix(physics): validate retail cell containment roots 2026-07-31 14:48:26 +02:00
Issue137CorridorSeamInspectionTests.cs fix #137 (window climb): the player's collision capsule topped out at 1.2m — head sphere 0.63m too low 2026-07-05 19:57:11 +02:00
Issue137CorridorSeamReplayTests.cs fix #137 (window climb): the player's collision capsule topped out at 1.2m — head sphere 0.63m too low 2026-07-05 19:57:11 +02:00
Issue137SlidingNormalLifecycleTests.cs fix #137 (corridor phantom resolved): slide_sphere opposing branch returns Collided; the 'wall' was synthetic 2026-07-05 18:27:40 +02:00
Issue147ArwicBuildingsDumpTests.cs fix(physics): #147 — far-town city/perimeter walls had no collision (portal-less buildings skipped) 2026-06-24 16:24:48 +02:00
Issue165RemoteWallPenetrationDiagnosticTests.cs docs(physics): #165 diagnostic pass - rule out (a)/(b), stop at (c) 2026-07-30 10:01:11 +02:00
Issue175HubDoorPoseInspectionTests.cs fix #175 (take 2): the cycle lookup used the bare style key — silent no-op 2026-07-05 17:10:19 +02:00
Issue180CorridorSweepHysteresisReplayTests.cs fix #180 (root): retail adjust_to_plane - PathClipped stops now resolve to the contact point, not a step boundary 2026-07-06 17:20:46 +02:00
Issue182CrowdJumpTests.cs feat(#182): route player collision response through the ported UpdateObjectInternal chain (Slice 2b/2c) 2026-07-07 14:25:47 +02:00
Issue185OutdoorStairsSeamReplayTests.cs test(physics): harden tight-gap collision controls 2026-07-31 12:17:35 +02:00
Issue186ConnectorCellGeometryInspectionTests.cs fix(#186): render side-cull mis-sided thin connectors — use dat PortalSide bit, not AABB centroid 2026-07-08 15:06:33 +02:00
Issue188FadingDoorMotionTableInspectionTests.cs feat(#188): fading-wall + sliding-door translucency; hold open past animation settle 2026-07-09 09:17:50 +02:00
Issue265SteepSlopeCaptureBisectTests.cs fix(physics): #265/#166 - stop zeroing grounded residual velocity, wire GroundNormal 2026-07-30 19:28:28 +02:00
Issue273HoltburgTightGapReplayTests.cs test(physics): harden tight-gap collision controls 2026-07-31 12:17:35 +02:00
Issue176177SeamTransitLagTests.cs docs+test #176/#177: 12 mechanisms refuted, apparatus shipped, probe protocol staged 2026-07-05 21:20:03 +02:00
LandDefsBlockOffsetTests.cs feat(physics #145): Slice 1 — Position/Frame types + LandDefs.GetBlockOffset (0x0043e630) 2026-06-21 10:30:20 +02:00
LandDefsTests.cs fix(phys): #106 — outdoor membership crosses landblock boundaries (LandDefs global-lcoord port) 2026-06-09 23:10:59 +02:00
LandingBounceSeedingTests.cs fix(physics): #265 landing-bounce family - retail check_contact seed + velocity-free landing commit 2026-07-30 20:12:06 +02:00
MissileCollisionRulesTests.cs feat(physics): port retail projectile integration 2026-07-14 11:43:11 +02:00
MotionCommandCatalogDatTests.cs feat(L.1b): dual MotionCommand catalog — AceModern runtime + Retail2013 conformance 2026-06-30 22:13:36 +02:00
MotionCommandCatalogTests.cs feat(L.1b): dual MotionCommand catalog — AceModern runtime + Retail2013 conformance 2026-06-30 22:13:36 +02:00
MotionCommandResolverTests.cs fix(anim): Phase L.1b route motion commands 2026-04-28 10:46:22 +02:00
MotionInterpreterDoMotionFamilyTests.cs feat(R3-W5): DoMotion family verbatim + the ONE DoInterpretedMotion + per-op zero-tick flush (closes J3, J4, J9, J14) 2026-07-03 08:57:33 +02:00
MotionInterpreterFunnelTests.cs feat(physics): R5-V4 behavioral slice — head stance dispatch (all mt) + #164 autonomy bit + mt-0 wire flags 2026-07-05 10:18:26 +02:00
MotionInterpreterGroundLifecycleTests.cs feat(R3-W4): ground transitions + lifecycle verbatim; K-fix18 DELETED (closes J8, J10, J11-shape, J12, J13, J18, J19) 2026-07-02 23:01:31 +02:00
MotionInterpreterJumpFamilyTests.cs feat(physics): P5 commit 1 - port ConstraintManager leash distance constants (#167) 2026-07-30 11:54:35 +02:00
MotionInterpreterPendingMotionsTests.cs feat(R3-W2): pending_motions lifecycle + the MotionDone consumer — the R2 seam lands (closes J1, J17) 2026-07-02 22:24:56 +02:00
MotionInterpreterTests.cs fix(physics): movement-parity fixes - adjusted catch-up cap, autorun retail semantics, AP-30 retired 2026-07-30 15:04:17 +02:00
MotionNormalizationTests.cs feat(R3-W6): LOCAL PLAYER UNIFICATION — edge-driven retail input; UpdatePlayerAnimation + the synthesis layer DELETED (closes J15) 2026-07-03 09:19:56 +02:00
MotionSequenceGateTests.cs feat(runtime): own initial create residence transaction 2026-08-01 19:35:08 +02:00
MotionVelocityPipelineTests.cs feat(physics): port retail complete object frame pipeline 2026-07-20 09:10:31 +02:00
MovementSystemTests.cs fix #266: retail run-rate 800 branch is exact-equality sentinel, not a cap 2026-07-30 19:22:41 +02:00
ObjectRangeMathTests.cs fix(items): use retail cylinder range for loot windows 2026-07-17 20:32:34 +02:00
ObstructionEtherealTests.cs fix(physics): port retail Layer-2 ethereal override -- open doors passable (pc:276961) 2026-06-24 21:03:08 +02:00
PhysicsBodyCellSyncTests.cs fix(portal): synchronize destination presentation state 2026-07-16 21:17:13 +02:00
PhysicsBodyTests.cs fix(physics): #265/#166 - stop zeroing grounded residual velocity, wire GroundNormal 2026-07-30 19:28:28 +02:00
PhysicsDataCacheProductionTests.cs fix(physics): validate retail cell containment roots 2026-07-31 14:48:26 +02:00
PhysicsDiagnosticsTests.cs feat(core): Phase W Stage 0 — [cell-swept] diagnostic (swept vs static cell, no behavior change) 2026-06-02 14:08:00 +02:00
PhysicsEngineAdjustPositionTests.cs fix(physics): validate retail cell containment roots 2026-07-31 14:48:26 +02:00
PhysicsEngineResidencyTests.cs refactor(streaming): extract landblock physics publisher 2026-07-21 21:13:22 +02:00
PhysicsEngineTests.cs fix(physics): make collision activation starvation-free 2026-07-31 18:34:46 +02:00
PhysicsSetPositionTests.cs feat(runtime): seal dormant SetPosition evaluations 2026-08-01 11:31:58 +02:00
PhysicsStateFlagsTests.cs feat(net): port retail physics spawn and event timestamps 2026-07-14 00:22:17 +02:00
PlayerWeenieTests.cs fix(physics): TS-23 - plumb real PK/PKLite/Impenetrable mover flags 2026-07-30 09:52:55 +02:00
PortalInfoTests.cs feat(physics): Phase 2 — wire CellBSP + Portals into CellPhysics 2026-05-19 16:52:20 +02:00
PortalPlaneTests.cs feat(core): Phase B.3 — PortalPlane (plane math + crossing detection) 2026-04-12 18:17:48 +02:00
PositionFrameValidationTests.cs feat(net): port retail physics spawn and event timestamps 2026-07-14 00:22:17 +02:00
ProjectilePhysicsStepperTests.cs feat(physics): port retail complete object frame pipeline 2026-07-20 09:10:31 +02:00
RemoteDeOverlapMechanismTests.cs fix(physics): #265 landing-bounce family - retail check_contact seed + velocity-free landing commit 2026-07-30 20:12:06 +02:00
RemoteMotionCombinerTests.cs fix(runtime): align portal and movement presentation 2026-07-17 08:48:27 +02:00
RemoteWeenieRunRateTests.cs fix(R4-V5): #160 remote run movetos in slow motion - remote interps had no weenie, so retail's run-rate chain never reached my_run_rate 2026-07-03 16:18:40 +02:00
RemoveCellsForLandblockTests.cs fix(physics): D8 — RemoveCellsForLandblock; cell transforms rebase per apply 2026-06-24 19:34:16 +02:00
ResolveCellIdTests.cs feat(physics): Phase 2 — BuildingPhysics + CheckBuildingTransit 2026-05-19 17:34:38 +02:00
ResolveResultOkTests.cs feat(A): wire SweepEye to the verbatim update_viewer (start-cell + fallbacks) 2026-06-05 11:10:32 +02:00
RestrictionObjPrevalenceInspectionTests.cs test(physics): P4 review - RestrictionObj prevalence inspection over the installed cell DAT 2026-07-30 11:01:10 +02:00
RetailEdgeResponseOrderingTests.cs fix(physics): restore retail path-6 collision response 2026-07-31 13:44:55 +02:00
RetailObjectActivityGateTests.cs feat(physics): port retail complete object frame pipeline 2026-07-20 09:10:31 +02:00
RetailObjectManagerTailTests.cs fix(motion): restore retail object manager order 2026-07-19 21:40:14 +02:00
RetailObjectQuantumClockTests.cs feat(physics): port retail complete object frame pipeline 2026-07-20 09:10:31 +02:00
RetailObserverTraceConformanceTests.cs feat(physics): R5-V4 behavioral slice — head stance dispatch (all mt) + #164 autonomy bit + mt-0 wire flags 2026-07-05 10:18:26 +02:00
RetailPhysicsStateTransitionTests.cs feat(vfx): port retail hidden and teleport presentation 2026-07-14 14:59:48 +02:00
RetailStepDownPlacementTests.cs fix(physics): preserve retail step-down probe state 2026-07-31 13:24:25 +02:00
ServerControlledLocomotionTests.cs fix(combat): persist death and retarget on kill 2026-07-12 09:19:38 +02:00
ShadowObjectRegistryMultiPartTests.cs test(phys): Task 6 regression — Deregister clears _entityShapes cache 2026-05-24 15:22:30 +02:00
ShadowObjectRegistryTests.cs feat(runtime): C3c - production placement cutover: both hosts on the residence conductors (routes 1+8) 2026-08-02 18:10:33 +02:00
ShadowRegistrationOverflowTests.cs fix(#185): landblock collision part-id uint32 overflow dropped stair steps 2026-07-08 10:07:50 +02:00
ShadowSetPositionCommitTests.cs fix(runtime): preserve hidden setposition collision ownership 2026-08-01 18:22:45 +02:00
ShadowShapeBuilderShapeSourceTests.cs fix #182: port CSphere collision family — retail-faithful crowd wiggle (retires TS-45) 2026-07-07 11:25:56 +02:00
ShadowShapeBuilderTests.cs refactor(world): extract live projection mechanics 2026-07-21 16:17:03 +02:00
SpawnPlacementSettlerTests.cs feat(runtime): C3c - production placement cutover: both hosts on the residence conductors (routes 1+8) 2026-08-02 18:10:33 +02:00
SphereCollisionFamilyTests.cs fix #182: port CSphere collision family — retail-faithful crowd wiggle (retires TS-45) 2026-07-07 11:25:56 +02:00
SphereIntersectsCellBspTests.cs fix(physics): #90 — sphere-overlap cell stickiness at doorway threshold 2026-05-20 20:30:36 +02:00
SphereIntersectsSphereConformanceTests.cs feat(physics): Task 2 — true sphere collision primitive (CSphere::intersects_sphere) 2026-06-24 19:08:53 +02:00
TeleportFarTownRunawayTests.cs fix(teleport D): cell-march preserves seed landblock id when no resident LB (no more lbX=0 outbound) 2026-06-22 13:38:48 +02:00
TerrainSurfaceTests.cs perf(physics): reuse reset-complete transition scratch 2026-07-25 14:37:02 +02:00
TransitionAllocationBaselineTests.cs perf(physics): reuse reset-complete transition scratch 2026-07-25 14:37:02 +02:00
TransitionCheckOtherCellsTests.cs chore(phys): A6.P3 #98 triage — revert neg-poly + bldg-check experiments 2026-05-23 15:11:49 +02:00
TransitionInsertIntoCellRetryTests.cs fix(physics): hold retail cell across inner retries 2026-07-31 12:40:50 +02:00
TransitionScratchDifferentialTests.cs perf(physics): reuse reset-complete transition scratch 2026-07-25 14:37:02 +02:00
TransitionScratchResetTests.cs perf(physics): reuse reset-complete transition scratch 2026-07-25 14:37:02 +02:00
TransitionTests.cs feat(physics): port retail projectile integration 2026-07-14 11:43:11 +02:00
TransitionTypesTests.cs refactor(physics): remove parsed collision graphs 2026-07-25 18:21:19 +02:00
Ts4Path6ConformanceTests.cs fix(physics): restore retail path-6 collision response 2026-07-31 13:44:55 +02:00
Ts4ProductionQuantumConformanceTests.cs fix(physics): validate retail cell containment roots 2026-07-31 14:48:26 +02:00
Ts4SteepRoofWedgeCaptureTests.cs test(physics): harden TS-4 production chronology 2026-07-31 14:08:51 +02:00
Ts46SphereListConformanceTests.cs fix(physics): TS-46 - seed the sweep from the Setup's own sphere list 2026-07-30 09:05:44 +02:00
WalkMissDiagnosticTests.cs feat(physics): WalkMissDiagnostic aggregator for ISSUES #83 probe spike 2026-05-20 10:31:39 +02:00
WeenieErrorCodeTableTests.cs feat(R4-V1): command-selection family + state widening (closes M2-mechanics, M11, M12, M15) 2026-07-03 11:13:15 +02:00