This project provides an easy way for modding the PS1 version of Rayman 1 using the PSX Modding Toolchain. It includes symbols exported from the game, allowing mods to directly access its functions and data. Currently the NTSC and PAL versions are supported by this project, though not all mods have been updated to work for the PAL version.
Included in here are several mods as well as an example. Feel free to submit your own mods through pull requests!
Below is a list of every mod available in this repo, in alphabetical order. In order to apply a mod without using the toolchain you can download the provided xdelta
patch file and apply it to the game's first .bin disc file. Note that when using xdelta files you can only apply one mod at a time. Some mods have combined downloads to make this easier.
Image | Name | Author | Description | Status | Download |
---|---|---|---|---|---|
Ability Shop | fuerchter | Provides an all new way to play the game where you now have a goal to collect a certain number of items, an ability shop for unlocking powers and all levels unlocked from the start. For more info, see the readme. |
Crashes on latest version | ||
Blind Race | RayCarrot | Created for the Rayman 1 Blind Community Race in 2023. Adds a cage counter to the worldmap and allows accessing Mr Dark's Dare without collecting all cages. For more info, see the readme. |
Complete | NTSC | |
Crowd Control | RayCarrot | Created for the Rayman 1 Crowd Control implementation. Allows toggling more advanced effects like Dark Rayman in any level. | Can only be used with Crowd Control | ||
Death Counter | RayCarrot | This mod replaces the lives counter with a death counter and also gives you infinite lives. | Complete | NTSC | |
Debug Menu | RayCarrot | Replaces the pause screen with an advanced menu, allowing you to skip between levels, toggle active powers, enable cheats and more. NOTE: This was mainly made to make it easier testing things in the game and as such is not stable enough to be used normally. Some levels may crash due to the game rendering too much on screen at once. |
Unstable | NTSC | |
Distance Counter | Robin | Tracks the total distance travelled throughout the game and displays it while playing. | Complete | NTSC | |
Flipping Jumps | Robin | Reverses your input directions each time you jump. | Complete | NTSC | |
Hello World | RayCarrot | A simple test mod. | Complete | ||
Kaizoman | RayCarrot | Created for the Kaizoman ROM hack. For more info, see the readme. |
Can only be used with Kaizoman | NTSC | |
Level Effects | RayCarrot | Allows playing the game with different effects which can also be randomized per level. For more info, see the readme. |
Complete | NTSC NTSC (incl. Timer & Death Counter) |
|
Lost Cages | RayCarrot | Created for the Lost Cages ROM hack. Makes you start the game with all powers unlocked and allows you to get 99 lives by pressing the circle button while paused. For more info, see the readme. |
Complete | ||
Max Percentage | RayCarrot | Provides progress counters for collecting everything in the game. | Complete | NTSC | |
MCM Visibility | fuerchter | Provides a visualization to help with memory-card manipulations. | Complete | ||
Menezis | RayCarrot | An early test for re-creating the Menezis minigame from Rayman 2. For more info, see the readme. |
Incomplete | ||
Shuffle | RayCarrot Robin |
Randomly shuffles the objects in each level. | Incomplete | ||
Single-hit Death | RayCarrot | Forces you to always have 1 hp. | Complete | NTSC | |
Skip Splash-screens | RayCarrot | Skips the splash screens and intro when starting the game and instead loads directly into the main menu. For more info, see the readme. |
Complete | NTSC | |
Sounds Player | RayCarrot | Replaces the pause screen with a simple menu for playing all of the sounds in the game. | Complete | ||
Speedrun Practice | RayCarrot | Various tools to help practice speedrunning the game, including an in-game menu with different cheats, such as no-clip, custom checkpoints, a speed storage visualizer and more. For more info, see the readme. |
Complete | NTSC NTSC (incl. Timer & Skip Splash Screens) |
|
Stop Hitting Yourself | Robin | Makes you take damage when your fist returns to you, unless it hits something first. | Complete | NTSC | |
Timer | RayCarrot | Providers an in-game timer display, with various settings for it. | Complete | NTSC | |
Ting Counter | Robin | Keeps track of and shows the total number of collected tings. | Complete | ||
Zero Patience | fuerchter | Various changes to speed up playing the game. | Complete |
- Download and set up the PSX Modding Toolchain.
- Clone or download this repo and add it to a new folder under
games
.
Each mod folder has a MOD.BAT
file which allows building the mod and accessing other options from the toolchain.
Every mod will include the files under the include
folder. For this project this contains the export.h
file which is a header file exported from Ghidra. Symbols are named from the Android version of Rayman 1 and from the PSYQ SDK. If a symbol name is not known then it is prefixed with PS1_
to indicate it uses a custom name.
The resources
folder includes additional reusable files which can be copied into and modified for your mods. Usually these are re-implementations of game functions which can then be used to more easily rewrite them.
Currently the NTSC and PAL versions are supported. In the future it is planned to add support for the remaining versions (DemoDemo vol. 3, DemoDemo vol. 6, NTSC-J and Rayman 2 2D prototype). Once they are added they will use separate export.h
files and thus any mod that targets them alongside other versions will require conditional compilation based on version. Many functions are however the same across them making it not too difficult to multi-target your mods. In cases were structs are changes many of the fields still remain the same.
To create a mod the easiest to do is to first run the clean command on an existing mod and then copy its folder. The most important thing to keep in mind is to not make your code too big or else it can overwrite existing code in the game.
Generally the easiest way to hook in your code is to extend an existing function by replacing its return instruction with a jump j
. Another easy option is to replace a function call jal
with your own one and then have your custom function also call the original function.
Once you've added a hook you also need a place to write your custom code. Generally any unused space in the exe will do. One option used in some examples here is to truncate the FntPrint
function and overwrite the remaining part of it with your own code.
- BinarySerializer.Ray1 - a C# library for serializing the game data from all versions of the game
- rayman-ps1-decomp - a matching decompilation of the PS1 version
- Ray1Editor - a level editor for the PS1 and PC versions