diff --git a/mods/movement_inertia.diff b/mods/movement_inertia.diff new file mode 100644 index 0000000..407ce67 --- /dev/null +++ b/mods/movement_inertia.diff @@ -0,0 +1,65 @@ +This is a mod for game Anarch that adds simple movement inertia, made by +drummyfish, released under CC0 1.0, diff made against version 1.02d. + +diff --git a/constants.h b/constants.h +index 956baa0..00737f1 100644 +--- a/constants.h ++++ b/constants.h +@@ -141,6 +141,17 @@ + */ + #define SFG_DAMAGE_RANDOMNESS 64 + ++/** ++ Specifies the amount of movement inertia, every frame 1 / ++ SFG_MOVEMENT_INERTIA_AMOUNT th of the desired move direction will contribute ++ to the current movement state. ++*/ ++#if SFG_FPS >= 45 ++ #define SFG_MOVEMENT_INERTIA_AMOUNT 16 ++#else ++ #define SFG_MOVEMENT_INERTIA_AMOUNT 8 ++#endif ++ + /** + Height of monster collision BBox in RCL_Units. + */ +diff --git a/game.h b/game.h +index 24285cb..65c9ebf 100755 +--- a/game.h ++++ b/game.h +@@ -421,6 +421,7 @@ struct + int8_t squarePosition[2]; + RCL_Vector2D direction; + RCL_Unit verticalSpeed; ++ RCL_Vector2D movementForce; ///< for movement inertia + RCL_Unit previousVerticalSpeed; /**< Vertical speed in previous frame, needed + for determining whether player is in the + air. */ +@@ -1391,6 +1392,9 @@ void SFG_initPlayer() + SFG_player.camera.direction = SFG_currentLevel.levelPointer->playerStart[2] * + (RCL_UNITS_PER_SQUARE / 256); + ++ SFG_player.movementForce.x = 0; ++ SFG_player.movementForce.y = 0; ++ + SFG_recomputePLayerDirection(); + + SFG_player.previousVerticalSpeed = 0; +@@ -3549,7 +3553,16 @@ void SFG_gameStepPlaying() + SFG_player.camera.height += + SFG_PREVIEW_MODE_SPEED_MULTIPLIER * SFG_player.verticalSpeed; + #else +- RCL_moveCameraWithCollision(&(SFG_player.camera),moveOffset, ++ ++ SFG_player.movementForce.x = ++ (SFG_player.movementForce.x * (SFG_MOVEMENT_INERTIA_AMOUNT - 1) + ++ moveOffset.x) / SFG_MOVEMENT_INERTIA_AMOUNT; ++ ++ SFG_player.movementForce.y = ++ (SFG_player.movementForce.y * (SFG_MOVEMENT_INERTIA_AMOUNT - 1) + ++ moveOffset.y) / SFG_MOVEMENT_INERTIA_AMOUNT; ++ ++ RCL_moveCameraWithCollision(&(SFG_player.camera),SFG_player.movementForce, + verticalOffset,SFG_floorCollisionHeightAt,SFG_ceilingHeightAt,1,1); + + SFG_player.previousVerticalSpeed = SFG_player.verticalSpeed;