Translating Culdcept: notes, tutos, calls for help

Hi everyone,

Following the acquisition of the original disc, I explored a bit the content of the card/board-RPG game "Culcept" and found out that it "might be" relatively easy and straightfoward to translate it to english. In the following thread I will post updates about my finds, but also call for help or advices when I'm stuck. Ultimately, my aim is to translate it.

On the other hand, I really appreciated other segaxtreme threads which documented step by step some approach for other translations.
This was very helpful to explore my 1st saturn game and might be help to other future enthousiasts.
So I decided to make my posts a small tutorial, when possible.

And I found that this approach (forum posts) is much much better than having knowledge spread in discord conversations (finding some information a few weeks later is a nightmare...)


Current situation is:

Confirmed:

- main script is in shift-JIS and can be edited relatively easily
- a full translation exists for the DS port AND is very well documented here : Culdcept DS translation wiki
- there are minor modifications between both scripts, but not more than a few kanji here and there

In progress :

- multiplayer mode will need specific re-translation: it is wifi-based in the DS version, while it is local 4 player in the saturn version and there are quite a few differences
- it seems that both fixed and variable width fonts are present in the game (needs confirmation, more on this later)
- on top of shift-JIS, used for dialog windows, there are some accessory smaller fonts. They do not seems to match any classic fonts, but I may be wrong. Values and offsets need to be determined.


Will need help at some point :

- how to modify the text routine to switch between variable width and fixed width, depending on context (e.g. dialogs VS menus)


SO, after this short introduction. Let's dive into content.

----------------------------------------------------------

Version:

REDUMP lists 2 version:
My disc matches v1.004, any offset listed below is valid for this particular version.
I had a look at the track files, but there is only 1 small binary file of a few megabytes and 2 large bin files.

So I went back to work on the full track dump.
All offset below are valid for track_1.bin, sha-1 == 82003c2bf26d23f8824f8934ce5ca9ae403f0043

If anyone has information about any potential difference between these version, please let me know.


Tools:


  • windows calculator (for octal/hexa converstions and shifts)
  • notepad++ : for my markdown notes
  • crystaltile & tilemolester : tile search, police search, texture searches
  • vxMedit : direct edition of main scenario text, pattern or texts searches...
  • mednaffen and yabasanchiro emulator : VDP1/2, CPU RAMs exploration via debuggers, creation of savestates, test of modifications...
  • Hex to String Converter Online - DenCode : for rapid hex / shift-JIS conversions

Dialogs font & text replacement :
  • shift-JIS police is present in : [ 1DE64,36404 )
HOWTO :
  • open track_1.bin with crystaltile
  • click on "tile" icon in the top bar
  • on left menu, select width=16, height = 12, tile form = solid 1bpp
  • set offset at 1DE64 to see the shift-JS police

crystaltile_shift-JIS.png


So it may be that the game use the same code as in https://mattsmessyroom.com/uploads/sjis.tbl.
We will test that by searching for a simple japanese word that uses a few easy-to-recognize hirigana or katakana.

For instance, will will replace the word "creature" (クリーチャー) which appears a lot in the first game dialogs.

How did I got this ? (I do not speak japanese) Well, using the deepL app and my phone camera, I observed the dialogs in the 5 first minutes of the main scenario. And I saw that this word appears many times early in the tutorial dialogs.


HOWTO :
  • using the shift-JS table above, we expect that クリーチャー in shift-JS hexa is 834E 838A 815B 8360 8383 815B
  • open track_1.bin with wxMedit
  • menu display -> encoding -> est asian -> select shift-JIS
  • menu search -> check search hexa chain -> paste 834E838A815B83608383815B
  • click count, you should see 246 occurences
  • click next, then previous to display the 1st occurence
  • you should see text dialogs on the right, as shown in the following image:
vxMedit_look_for_creature.png


  • If you look for the 1st occurence at 00CE110A, you can see this word "creature" (クリーチャー) appears in a block of text, separated from other blocks of text by a run of 00 values:
vxMedit_text_block.png


  • We can copy a sentence and check it using the website: Hex to String Converter Online - DenCode
    • overline a sentence piece
    • menu edit -> advanced -> copy as hex string
    • past in the aformentionned website, make sure it uses shift-JIS, I used this piece of sentence:
      • hex value : 834A838B8368838982CC8EF4949B82AA81418DA182BE82C989E482AA91CC82F0 0A 8D5391A982B582C482A282E982C682A282A482CC82A9814581458145
      • in the website, it should be displayed as :
        カルドラの呪縛が、今だに我が体を
        拘束しているというのか・・・
        • note that all characters are 2-bytes (8xxx or 9xxx in hexa), while 0A is a 1-byte character, highlighted with space in example above
        • this one has been been converted as a line return
      • so, 0A : will likely be a line return
      • spoiler : 07 value will be a special code meaning "go to new dialog window"
  • If you browse this block with your mouse in wxMedit, will will notice blocks of text are split by a chunk of seven "00".
    • you can see this pattern: 00 seven times, then 32 00 ** 0F [some shift-JIS text] [some control code to end the block]
  • So, there is a chance we get the text data structure, with maybe some pointer to character names at the wondo header, or any other control codes.

  • Now, let's move back to the existing translation, we are looking for the beginning of above sentence (カルドラの呪縛が) and do a CTRL-F on each page of the translation website, which gives a match in this page :
  • We just translated something !

Going further, let's see if modifying some text directly in wxMedit will actually makes the translation to appear in-game

HOW TO :
  • We will replace the word "クリーチャー" (creature in japanese) which shift-JS hexa is 834E 838A 815B 8360 8383 815B, by 63 72 65 61 74 75 72 65 20 20 20 20 which is "creature ", e.g. 8 characters plus 4 spaces, e.g hex value 20, to make it as many bytes as in "クリーチャー" (note that the spaces in the hexa pattern above are only for understanding)
  • menu search -> replace -> check "find hex string"
  • then replace 834E838A815B83608383815B, by 637265617475726520202020
  • save the results to track_1.bin (make sure the name fits the cue file associated to your bin/cue dump)
  • then load this modified game image into mednaffen
  • in the main menu, select first icon in main menu ant enter you name to create a new game
  • you enter the main scenario, after a few dialogs, you will see this :)


vxMedit_creature_text.png






TODO in next updates :

- supplementary fonts found via VDP memory exploration
- deciphering the dialog control codes
- observations related to variable width font in menus
 
Last edited:
You can work on the BIN as 1 big file or extract the contents , but Culdcept has the lowest file count I've ever seen.

1713708376346.png


If you open Culdcept.dto in a hex editor, you'll see the same data.
1713708736112.png



I've never made an SSP file using the whole bin I've always done it by file but I'm sure there's a way to make it work. Great write up, looking forward to watching the progress and ultimately playing this :)

EDIT: just looked and the txt files are in English, neat.
 
Back
Top