The game has no option to invert the vertical mouse axis. This repository contains small scripts that add one.
Nothing is overwritten and nothing is deleted: the mod is three extra files placed next to the game data. Removing them restores the original state.
Works on Windows and on Linux/Proton (tested on Bazzite).
The scripts build the mod from your own copy of the game. No game files are distributed here — see Legal.
- Download this repository (green Code button → Download ZIP) and unpack it.
- Double-click
windows\Install.bat. - Start the game.
git clone https://github.com/cuinhellcat/Mouse-invert-Meccha-Chamelion.git
cd Mouse-invert-Meccha-Chamelion/linux
./install.shIf the game is not in the default Steam folder:
MECCHA_GAME_DIR="/path/to/MECCHA CHAMELEON" ./install.shRequirements: curl, tar, python3. On the first run the scripts download
retoc and verify its checksum.
windows\Uninstall.bat or linux/uninstall.sh. Or simply delete these three
files from Chameleon/Content/Paks/:
pakchunk99-Windows_P.utoc
pakchunk99-Windows_P.ucas
pakchunk99-Windows_P.pak
Steam removes the mod on updates and on Verify integrity of game files. Just run the install script again — it rebuilds from the current game files, so it keeps working across versions.
Most advice found online suggests a Game.ini containing:
[/script/engine.playercontroller]
InputPitchScale=-2.5This does nothing for this game, for two independent reasons:
InputPitchScaleis deprecated in UE5 and is not consulted at all when a game uses Enhanced Input — which this one does.- A shipping build does not read its config from the game folder but from
%LOCALAPPDATA%\Chameleon\Saved\Config\Windows\. Under Proton that is inside the compatdata prefix, not the game directory.
The game is Unreal Engine 5.6 with Enhanced Input. Mouse look is bound in
/Game/FirstPerson/Input/IMC_Default_FirstPerson
where the action IA_Look is mapped to Mouse2D with a single modifier,
InputModifierNegate_5, which mirrors the Y axis. That asset lives inside the
IoStore container (Chameleon-Windows.utoc / .ucas), not in the .pak.
The package uses unversioned property serialization, so property names are
replaced by a bitmask. Unreal's FFragment packs into a uint16 as:
| bits | meaning |
|---|---|
| 0–6 | SkipNum |
| 7 | bHasAnyZeroes |
| 8 | bIsLast |
| 9–15 | ValueNum |
The modifier serializes to five bytes, 80 02 81 03 03:
| fragment | decoded | effect |
|---|---|---|
0x0280 |
skip 0, 1 value | bX |
0x0381 |
skip 1 (skips bY), 1 value |
bZ |
0x03 |
zero mask, both values are 0 | bX=false, bZ=false |
So bY is not serialized and keeps its default of true — that is the Y
mirroring.
The patch changes SkipNum in the second fragment from 1 to 0, so bY is
serialized instead of bZ:
80 02 81 03 03 -> 80 02 80 03 03
^^ ^^
Result: bX=false, bY=false, bZ=true. bZ is irrelevant for 2D mouse input,
and because the export keeps its exact size, no offsets or headers need
fixing — which is what makes this safe to do with a one-byte edit.
The asset is then repacked into a small mod container that mounts with higher priority than the main one.
This repository contains no game files. The scripts extract the asset from your own installation, change one byte, and repack it locally. Redistributing the built container would mean redistributing copyrighted game content.
- The Windows scripts are untested — they were written on a Linux machine with no Windows available. The Linux path is confirmed working in-game. If you hit a problem on Windows, please open an issue.
- The game has an online component (EOS). Modified game files are always some amount of risk there. Only a local input setting is touched here, but that is not a guarantee.
- If a future update changes the input asset, the scripts will refuse to patch rather than corrupt anything, and will say so.
- retoc by trumank — IoStore ↔ legacy asset conversion. Downloaded on first run, not bundled.
MIT — see LICENSE.