Giter Club home page Giter Club logo

sly1's Introduction

Sly Cooper and the Thievius Raccoonus

Build code-progress-badge data-progress-badge Contributors Discord Channel Docs Wiki

Sly 1 Decompilation Logo by Cooper941

This is a work-in-progress decompilation of Sly Cooper and the Thievius Raccoonus for the PlayStation 2. It builds the NTSC-U version of the game, SCUS_971.98 (SHA1: 57dc305d).

The goal of this project is to better understand the game engine. This repo does not contain any game assets or code from the game's executable; It requires your own copy of the game to build and run.

Documentation of the code can be found at theonlyzac.github.io/sly1. For further reading on the game's internal structures and mechanics, visit the SlyMods Wiki.

New contributors are welcome and encouraged to make a pull request! If you would like to help but aren't sure where to start, check out CONTRIBUTING.md and feel free to join our Discord server for guidance.

Quickstart

git clone https://github.com/theonlyzac/sly1 && \
cd sly1 && \
pip install -U -r requirements.txt && \
sudo ./scripts/setup_build_environment.sh

Copy the SCUS_971.98 file from your game disc to the disc directory of the project. Then build with:

./scripts/build.sh

If it works, you will see this:

[XXX/XXX] sha1sum checksum.sha1
out/SCUS_971.98: OK

If you have any issues, or you prefer to set up the project manually, follow the instructions below. Instructions to run the game are also provided below.

Manual Setup

The project can be built on Linux, or Windows using WSL. Follow the instructions below to set up the build environment.

Clone the repo

Clone the repository to your local machine:

git clone https://github.com/TheOnlyZac/sly1
cd sly1

Install python packages

You will need Python 3.8 or higher.

pip install -U -r requirements.txt

Setup build environment

  1. Setup wine:
sudo dpkg --add-architecture i386
sudo apt-get update
sudo apt-get install wine32
  1. Install MIPS assembler:
sudo apt-get install binutils-mips-linux-gnu
  1. Setup compiler:
cd scripts
./setup-progd-linux.sh

Setup binary splitting

To build the project you will need to extract the original ELF file from your own legally obtained copy of the game. Mount the disc on your PC and copy the file SCUS_971.98 from your disc to the disc directory of this project.

Build the project

The project builds the executable SCUS_971.98.

python configure.py
ninja

If you update the config files, you will need run a clean reconfigure:

python configure.py --clean

To only clean without reconfiguring (i.e. delete build files) use:

python configure.py --only-clean

Running

Running the executable requires PCSX2 2.0. You must have your own copy of the original game and the BIOS from your own PS2. They are not included in this repo and we cannot provide them for you.

Once you have those and you have built the executable, you can run it in one of three ways:

1. Autorun script

The run.sh script in the scripts dir will automatically rebuild the executable and run it in the PCSX2 emulator. To use it, you must first edit the script to set the PCSX2_PATH and ISO_PATH variables to the correct paths on your system.

2. Run from command line

To boot the elf in PCSX2 from the command line, use the following command:

pcsx2-1.7.exe -elf ".../sly1/bin/debug/SCUS_971.98" "/path/to/game/backup.iso"

Replace pcsx2-1.7.exe with the path to your PCSX2 v1.7 executable (for Linux it will be an .appimage file).

  • The -elf parameter specifies the path to the SCUS_971.98 you built from this project. Replace ... with the path to this repository. The emulator will use this ELF to boot the game.
  • The last argument is the path to your game ISO. Replace /path/to/game/backup.iso with the path to a backup of your own game disc. This is where the game will load the assets from.

3. Run from PCSX2 GUI

Copy SCUS_971.98 from the out dir to your PCSX2 Games folder and rename it to SCUS_971.98.elf. Right click on the game in PCSX2 and click "Properties...". Go to "Disc Path", click "Browse", and select the ISO of your game backup. Then click "Close" and start the game as normal.

Project Structure

The project is divided into the following directories:

  • include - Header files for the game engine.
  • src - The decompiled source code.
    • All of the code for the game engine is in src/P2.
    • Code for the game's scripting engine is in src/P2/splice.
  • config - Config files for Splat (binary splitting tool).
  • scripts - Utility scripts for setting up the build environment.
  • docs - Documentation and instructions for contributing.
  • tools - Utilities for function matching.
  • reference - Reference files for functions and data structures.

When you build the executable, the following directories will be created:

  • asm - Disassembled assembly code from the elf.
  • assets- Binary data extracted from the elf.
  • obj - Compiled object files.
  • out - Compiled executables.

FAQ

What is a decompilation?

When the developers created the game, they wrote source code and compiled it to assembly code that can run on the PS2. A decompilation involves reverse-engineering the assembly code to produce new, original code that compiles to matching assembly. This process leaves us with source code that is similar to and behaves the same as the source code (though not necessarily identical), which helps us understand what the programmers were thinking when they made the game.

How does it work?

We use a tool called Splat to split the binary into assembly files representing each individual function. We then reimplement every function and data structure by writing C++ code that compiles to the same assembly code. We do not include any data or code from the original game binary in the decompilation.

Has this ever been done before?

This was one the first PS2 decompilations; Several others have been started since we began in 2020. Our main inspiration was other projects such as the Super Mario 64 decomp for the N64 and the Breath of the Wild decomp for the Wii U (the latter being more similar in scope to this project). There is also a Jak & Daxter decomp/PC port called OpenGOAL, though that game is 98% GOAL language rather than C/C++.

Is this a matching decomp?

Yes. This was the first PS2 decompilation project that targeted the PS2 and utilized function matching, before it was even possible to produce a byte-matching executable. We have built a matching elf since July 2024. The ultimate goal is to match 100% of the game's functions.

How can I help?

If you want to contribute, check out CONTRIBUTING.md and feel free to join our discord server if you have any questions!

Star History

Star History Chart

sly1's People

Contributors

felinis avatar lordbozo avatar mc-muffin avatar modeco80 avatar theclub654 avatar theonlyzac avatar yotona avatar zzamizz avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

sly1's Issues

Unnamed split at 0xec518

Not sure what to call the text split at 0xec518. It would fit alphabetically between P2/util and P2/vec.

Match P2/chkpnt.c

  • ResetChkmgrCheckpoints
  • SaveChkmgrCheckpoint
  • ReturnChkmgrToCheckpoint
  • RestoreChkmgrFromCheckpoint
  • IchkAllocChkmgr
  • FGetChkmgrIchk
  • SetChkmgrIchk
  • ClearChkmgrIchk
  • LoadVolFromBrx
  • FCheckVolPoint
  • InitChkpnt
  • LoadChkpntFromBrx
  • BindChkpnt
  • PostChkpntLoad
  • CloneChkpnt
  • UpdateChkpnt
  • FUN_001417f0
  • TriggerChkpnt

Show decomp progress % in readme/website

  • Configure calculating the total number of bytes and functions matched
  • Set up continuous integration with frogress
  • Add progress badge to readme
  • Add graph of progress vs time to website

Rendering functions

Rendering functions are known to be in the following files

  • screen.c
  • render.c
  • binoc.c

Match P2/util.c

P2/util.c contains utility functions.

  • RadNormalize
  • GLimitAbs
  • GSmooth
  • GSmoothA
  • RadSmooth
  • RadSmoothA
  • PosSmooth
  • SmoothMatrix
  • NRandInRange
  • GRandInRange
  • GRandGaussian
  • FFloatsNear
  • CSolveQuadratic
  • PrescaleClq
  • CalculateSinCos
  • GTrunc
  • GTrunc1
  • GModPositive
  • FitClq
  • FCheckLm
  • FCheckAlm
  • GLimitLm
  • SgnCompareG
  • Force
  • MinimizeRange

The names Cheats and Savegame are probably inaccurate

Since these functions aren't in the proto debug symbols I made up a name for their files, but I think cheat code stuff is mostly handled by joy.c, and it's probably possible to piece together the proper home for the savedata-related functions.

Typo in README.md

The first mention of contributing to the project in the README.md file links to "/CONTRIBUTING.MD", which doesn't exist.
Line 38 should be modified from [CONTRIBUTING.md](/CONTRIBUTING.MD) to [CONTRIBUTING.md](/CONTRIBUTING.md) (the extension ".md" should be lowercase), like at line 139.

Unnamed split at 0xd41d0

The text split at 0xd41d0 is probably P2/steprail. It fits alphabetically, and it wouldn't be in the May proto because it doesn't have any rails.

Match P2/difficulty.c

  • FUN_001519e0
  • OnDifficultyGameLoad
  • OnDifficultyWorldPreLoad
  • OnDifficultyWorldPostLoad
  • OnDifficultyInitialTeleport
  • OnDifficultyPlayerDeath
  • OnDifficultyTriggerCheckpoint
  • OnDifficultyCollectKey
  • OnDifficultyBreak
  • ChangeSuck

Pass function args by reference instead of ptr

&g_difficulty is a ptr. change function signature to void ... (Difficulty& difficulty)

An L-value reference is a ptr that the compiler has guaranteed is a valid object before it's passed into the function. therefore it's a ptr in binary but in the code it's a reference. Also, as mentioned in the discord, it's a possibility that all these functions are member functions of the difficulty structure if a reversed calling convention is assumed (i have no idea what calling convention this binary uses).

Originally posted by @detolly in #3 (comment)

Add contributing.md

By the time function matching is set up we should have a file CONTRIBUTING.md to help people get involved with the project. It should include sections for:

  • Forking the repo
  • Finding functions to decompile
  • Using the function matching script
  • The style guide
  • Making a pull request

Match P2/clock.c

  • SetClockRate
  • MarkClockTick
  • MarkClockTickRealOnly
  • ResetClock
  • SetClockEnabled
  • StartupClock
  • TickNow

Simplify project structure

Regarding code structure, the additional directories seem pointless.

I would probably put everything under src/, no reason to do Cheats/cheats.cpp and Cheats/cheats.h etc if all dirs are just gonna have a same named source & header file.

Never thought I'd say this but flat is just better in this case.

Originally posted by @VelocityRa in #3 (review)

Match P2/chkpnt.c

  • ResetChkmgrCheckpoints
  • SaveChkmgrCheckpoint
  • ReturnChkmgrToCheckpoint
  • RestoreChkmgrFromCheckpoint
  • IchkAllocChkmgr
  • FGetChkmgrIchk
  • SetChkmgrIchk
  • ClearChkmgrIchk
  • LoadVolFromBrx
  • FCheckVolPoint
  • InitChkpnt
  • LoadChkpntFromBrx
  • BindChkpnt
  • PostChkpntLoad
  • CloneChkpnt
  • UpdateChkpnt
  • FUN_001417f0
  • TriggerChkpnt

Match P2/joy.c

  • StartupJoy
  • AddGrfusr
  • RemoveGrfusr
  • UpdateGrfjoytFromGrfusr
  • InitJoy
  • UpdateJoy
  • SetJoyJoys
  • GetJoyXYDeflection
  • FReadJoy
  • SetJoyBtnHandled
  • rumble_related
  • StartJoySelection
  • DxSelectionJoy
  • DySelectionJoy
  • UBtnpJoy
  • AddCode
  • _ResetCodes
  • _MatchCodes
  • UpdateCodes
  • remove_all_fchts
  • AddFcht
  • Chetkido
  • StartupCodes

Match P2/game.c

Most of the function names need work.

  • StartupGame
  • func_00160090
  • search_level_by_load_data
  • search_level_by_id
  • PchzFriendlyFromWid
  • func_00160178
  • call_search_level_by_id
  • FFindLevel
  • func_001601D0
  • get_level_completion_by_id
  • tally_world_completion
  • check_game_completion
  • UnlockIntroCutsceneFromWid
  • DefeatBossFromWid
  • UnlockEndgameCutscenesFromFgs
  • PlayEndingFromCompletionFlags
  • InitGameState
  • FUN_00160650
  • SetupGame
  • UpdateGameState
  • LsFromWid
  • GrflsFromWid
  • UnloadGame
  • RetryGame
  • StartGame
  • FUN_00160948
  • calculate_percent_completion
  • SetCcharm
  • FCharmAvailable
  • func_00160C90
  • PfLookupDialog
  • clr_8_bytes_1
  • FUN_00160ce8
  • OnGameAlarmTriggered
  • OnGameAlarmDisabled
  • grfvault_something
  • GetBlueprintInfo
  • CcharmMost
  • reload_post_death

Switch compiler to ee-gcc

To eventually produce a matching decomp we need to switch the compiler to the ee-gcc (archived here). That means reformatting the code to follow to the older C++ standard.

Tasks

  • Refactor code as C++98
  • Add/update Makefiles
  • Write instructions for using the new compiler

Match P2/binoc.c

First step will be identifying and naming all of the default-named FUN_ functions.

  • InitBei
  • GEvaluateBei
  • FUN_001310f0
  • FUN_00131140
  • FUN_00131198
  • DrawBinocCompass
  • DrawBinocZoom
  • DrawBinocReticle
  • DrawBinocOutline
  • FUN_00134aa0
  • FUN_00134b48
  • DrawBinocFilter
  • FUN_00135550
  • open_close_binoc
  • FUN_001357f0
  • FUN_00135858
  • FUN_001358d0
  • SetBinocBfk
  • FUN_00135f48
  • FUN_00136040
  • FUN_00136238
  • FUN_001363d0
  • SetBinocAchzDraw
  • FDoneBinocAchz
  • SetBinocLookat
  • SetBinocZoom
  • FUN_001365f0
  • FUN_00136648
  • DrawBinoc
  • GetBinocReticleFocus
  • FUN_00136ef8
  • FUN_00136fa8
  • __static_initialization_and_destruction_0
  • CTextBox::SetPos
  • CTextBox::SetSize
  • CTextBox::SetTextColor
  • CTextBox::SetHorizontalJust
  • CTextBox::SetVerticalJust

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.