Skip to content
Sega CD Snatcher Language Patcher
PHP CSS Other
Branch: master
Clone or download
Latest commit 111d5ae Jul 1, 2015
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
Config
Console
Controller Reinstalled control path for SP24.BIN bug May 24, 2015
Files/BinaryFiles/original
Locale
Model
View
webroot Add all project and created a spatcher to path Snatcher Sega CD ISO. Jul 17, 2013
LICENSE
README

README

Sega-CD-Snatcher-Language-Patcher

##############
#   INTRO    #
##############

This is a CakePHP project to modify the texts from the great videogame Snatcher from Hideo Kojima for Sega/Mega CD.

You can read about this work in EOL post: http://www.elotrolado.net/hilo_proyecto-snatcher-en-espanol_1790142

################
#   CONTENT    #
################

- Console/spatcher.php: Script to patch sega cd ISO
- Controller/Component/BinaryComponent.php: Component class from CakePHP to generate translated binary files with the data from a file game.
- Controller/Component/QuicksaveComponent.php: Component class from CakePHP to patch quicksaves from Kega Fusion and include translated binary files. Usefull if you want to try a binary file from a Game directly without patch the ISO and use a save game.

################
# REQUIREMENTS # 
################

- CakePHP 2.4.8 or later
- jQuery 1.10 or later
- PHP 5.2 or later
- Web Server and MySQL database

###########
# INSTALL #
###########

- Download CakePHP (www.cakephp.org) and create a new project with cake bake script (I will call "app" here).
- Copy the folders from this project and paste into the new project.
- Use the sql file from Config/Schema/snatcher.sql to create database schema in MySQL.
- Copy data from Config/readme to the end of your core CakePHP file in app/Config/core.php (and change "esp" and "es" to your new language for translation).
- Copy app in your localhost directory from your web server and set user, groups and necesary permissions (app/tmp and app/File needs write permissions).
- To access web, first time you need create an user administrator:
	- Open Controller/UsersController.php with any text editor
	- Uncomment the line 26:
		$this->Auth->allowedActions = array('admin_index', 'admin_add', 'admin_changePassword');
	- Go to http://localhost/app/admin/users/
	- Click at "New User" and create a new user with the role "Admin" selected.
	- Comment the line 26 from Controller/UsersController.php file.
	- Go to http://localhost/app/ and sign in.

#############
# PATCH ISO #
#############

There is a spatcher.php CLI script in app/Console path for patch your ISO. Only needs specify the path from Snatcher Sega CD ISO and a folder where you stored the new binary files.

###############
# DESCRIPTION #
###############

Binary->wirteFile returns the new filesize. There is a limit for this files: 55296 bytes

Instrucctions for use:

1) For use add to your Controller from CakePHP:

	public $components = array('Binary');

2) Add in your method:

	$filesize = $this->Binary->writeFile(
			$path_ori_files . $filename,
			$path_new_files . $filename,
			$data);

$path_ori_files is the path where store original files from Sega CD Snatcher (f.e /app/Files/snatcher/)

$path_new_files is the patch where you can store new files pathed.

$filename is the name to patch (f. e. SP06.BIN)

$data is a array with this structure:

- characher_id: identify the character id necesary for patch offset for each character from the Game. You can find her names in SUBCODE.BIN
- position: It is the integer position from 0x3800, then first text in binary files has the integer position 0 (each word is one position)
- new_text: It is the translation text. It is important data array has all translations in order acording binary file you want patch.
- nchars: The number of characters from old original texts. I use it for avoid calculate the length in the "foreach" original texts loop.

An example:

array(
	(int) 0 => array(
		'character_id' => '1',
		'position' => '0',
		'new_text' => 'CONTINUAR',
		'nchars' => '13'
	),
	(int) 1 => array(
		'character_id' => '1',
		'position' => '14',
		'new_text' => 'TERMINAR',
		'nchars' => '6'
	),
	(int) 2 => array(
		'character_id' => '3',
		'position' => '21',
		'new_text' => '¡Oh no! ¡No hay suficiente <8>memoria<11> para guardar m¡s  datos! Tendrás que <8>sobrescribir<11> los datos existentes para guardar.',
		'nchars' => '143'
	),

	...

	(int) n => array(
		'character_id' => '3',
		'position' => '165',
		'new_text' => '¡Guardado!',
		'nchars' => '15',

)

3) You must convert special chars of the game into a <{number}> wildcard. The special chars are converted with array special_chars_orig:

		/** 
		 * WARNING!!! NO CHANGE THE ORDER OF special_chars 
		 * */ 
		$this->special_chars_orig = array(
				$this->new_line,   pack("H*" , "ec"), $this->new_page, // <0>, <1>, <2>
				pack("H*" , "ee"), pack("H*" , "f0"), pack("H*" , "fe"), // <3>, <4>, <5>
				pack("H*" , "f4"), pack("H*" , "fa"), pack("H*", "fb"), // <6>, <7>, <8>
				pack("H*", "fc"),  pack("H*" , "fd"), pack("H*" , "f9"), // <9>, <10>, <11>
				pack("H*" , "f7"), pack("H*" , "f8")  // <12>, <13>
		);


When the script tranlates your new texts, it replaces the wildcard <{number}> with his special char defined in special_chars_orig.

##########
# Thanks #
##########

- Joxer for create and manage the translate project for Snatcher from EOL.
- Mairtrus for his technical knowledge and helpful with romhacking and for explain me how to modify the binary files and iso.
- m4x1m0, jam007, Tolvatar, djnox, Manveru Ainu, livekraft, tonycc, Drasglaf, randam_hajile for their helpful translating the texts and review.
 
###########
# License #
###########

The source code for the web project is licensed under the GPL version 3 or later
(see LICENSE).
You can’t perform that action at this time.