Anonymous

Changes

From Final Fantasy Inside

FF7/Text encoding

7,797 bytes added, 05:20, 23 May 2019
m
23 revisions imported
FF Text is a format that Squaresoft used to encrypt store strings in the English version of Final Fantasy VII. Below you can find Large subsets of the character (e.g. A-Z, a table that will help you decrypt strings in game. ''Note: to get letters-z, numbers and some special chars you only need to shift all character 0-9) set are coded as simply their ASCII values offset by +20h''0x20.
{| border="1" cellspacing="1" cellpadding="3" align="center" style="border: 1px solid black; border-collapse: collapse; font-family: Tahoma; font-size: 10px;"
! style="background:rgb(204,204,204)" align="center" |
! style="background:rgb(204,204,204); width:53px;" align="center" | 00! style="background:rgb(204,204,204); width:53px;" align="center" | 01! style="background:rgb(204,204,204); width:53px;" align="center" | 02! style="background:rgb(204,204,204); width:53px;" align="center" | 03! style="background:rgb(204,204,204); width:53px;" align="center" | 04! style="background:rgb(204,204,204); width:53px;" align="center" | 05! style="background:rgb(204,204,204); width:53px;" align="center" | 06! style="background:rgb(204,204,204); width:53px;" align="center" | 07! style="background:rgb(204,204,204); width:53px;" align="center" | 08! style="background:rgb(204,204,204); width:53px;" align="center" | 09! style="background:rgb(204,204,204); width:53px;" align="center" | 0A! style="background:rgb(204,204,204); width:53px;" align="center" | 0B! style="background:rgb(204,204,204); width:53px;" align="center" | 0C! style="background:rgb(204,204,204); width:53px;" align="center" | 0D! style="background:rgb(204,204,204); width:53px;" align="center" | 0E! style="background:rgb(204,204,204); width:53px;" align="center" | 0F
|-
! style="background:rgb(204,204,204)" | 00
| align="center" | {SPACE}| align="center" | !| align="center"| "| align="center" | #| align="center" | $| align="center" | %| align="center" | &| align="center" | '| align="center" | (| align="center" | )| align="center" | *| align="center" | +| align="center" | ,| align="center" | -| align="center" | .| align="center" | /
|-
! style="background:rgb(204,204,204)" | 10
| align="center" | 0| align="center" | 1| align="center" | 2| align="center" | 3| align="center" | 4| align="center" | 5| align="center" | 6| align="center" | 7| align="center" | 8| align="center" | 9| align="center" | :| align="center" | ;| <align="center" | &lt;| align="center" | =| >align="center" | &gt;| align="center" | ?
|-
! style="background:rgb(204,204,204)" | 20
| align="center" | @| align="center" | A| align="center" | B| align="center" | C| align="center" | D| align="center" | E| align="center" | F| align="center" | G| align="center" | H| align="center" | I| align="center" | J| align="center" | K| align="center" | L| align="center" | M| align="center" | N| align="center" | O
|-
! style="background:rgb(204,204,204)" | 30
| align="center" | P| align="center" | Q| align="center" | R| align="center" | S| align="center" | T| align="center" | U| align="center" | V| align="center" | W| align="center" | X| align="center" | Y| align="center" | Z| align="center" | [| align="center" | \| align="center" | ]| align="center" | ^| align="center" | _
|-
! style="background:rgb(204,204,204)" | 40
| align="center" | `| align="center" | a| align="center" | b| align="center" | c| align="center" | d| align="center" | e| align="center" | f| align="center" | g| align="center" | h| align="center" | i| align="center" | j| align="center" | k| align="center" | l| align="center" | m| align="center" | n| align="center" | o
|-
! style="background:rgb(204,204,204)" | 50
| align="center" | p| align="center" | q| align="center" | r| align="center" | s| align="center" | t| align="center" | u| align="center" | v| align="center" | w| align="center" | x| align="center" | y| align="center" | z| align="center" | {| align="center" | <nowiki>|</nowiki>| align="center" | }| align="center" | ~
|-
! style="background:rgb(204,204,204)" | 60
| Äalign="center" | &Auml;| Áalign="center" | &Aacute;| Çalign="center" | &Ccedil;| Éalign="center" | &Eacute;| Ñalign="center" | &Ntilde;| Öalign="center" | &Ouml;| Üalign="center" | &Uuml;| áalign="center" | &aacute;| àalign="center" | &agrave;| âalign="center" | &acirc;| äalign="center" | &auml;| ãalign="center" | &atilde;| åalign="center" | &aring;| çalign="center" | &ccedil;| éalign="center" | &eacute;| èalign="center" | &egrave;
|-
! style="background:rgb(204,204,204)" | 70
| êalign="center" | &ecirc;| ëalign="center" | &euml;| íalign="center" | &iacute;| ìalign="center" | &igrave;| îalign="center" | &icirc;| ïalign="center" | &iuml;| ñalign="center" | &ntilde;| óalign="center" | &oacute;| òalign="center" | &ograve;| ôalign="center" | &ocirc;| öalign="center" | &ouml;| õalign="center" | &otilde;| úalign="center" | &uacute;| ùalign="center" | &ugrave;| ûalign="center" | &ucirc;| üalign="center" | &uuml;
|-
! style="background:rgb(204,204,204)" | 80
| align="center" | &#8984;| °align="center" | &deg;| ¢align="center" | &cent;| £align="center" | &pound;| align="center" | &Ugrave;| align="center" | &Ucirc;| align="center" | &para;| align="center" | &szlig;| align="center" | &reg;| align="center" | &copy;| align="center" | ™| 'align="center" | &acute;| align="center" | &uml;| align="center" | &#8800;| align="center" | &AElig;| align="center" | &Oslash;
|-
! style="background:rgb(204,204,204)" | 90
| align="center" | &#8734;| align="center" | &plusmn;| align="center" | &#8804;| align="center" | &#8805;| align="center" | &yen;| align="center" | &micro;| align="center" | &#8706;| align="center" | &#931;| align="center" | &#928;| align="center" | &#960;| align="center" | &#8993;| align="center" | <u>&ordf;</u>| align="center" | <u>&ordm;</u>| align="center" | &#937;| align="center" | &aelig;| align="center" | &oslash;
|-
! style="background:rgb(204,204,204)" | A0
| align="center" | &iquest;| align="center" | &iexcl;| align="center" | &not;| align="center" | &#8730;| align="center" | ƒ| align="center" | &#8776;| align="center" | &#8710;| align="center" | &laquo;| align="center" | &raquo;| …align="center" | …| align="center" | {NOTHING}| align="center" | &Agrave;| align="center" | &Atilde;| align="center" | &Otilde;| align="center" | Œ| align="center" | œ
|-
! style="background:rgb(204,204,204)" | B0
| align="center" | –| align="center" | —| “align="center" | “| ”align="center" | ”| ’align="center" | ‘| align="center" | ’| align="center" | &divide;| align="center" | &#9674;| align="center" | &yuml;| align="center" | Ÿ| align="center" | &#8260;| align="center" | &curren;| align="center" | ‹| align="center" | ›| align="center" | &#64257;| align="center" | &#64258;
|-
! style="background:rgb(204,204,204)" | C0
| align="center" | &#9632; | align="center" | &middot#9642;| align="center" | ‚| align="center" | „| align="center" | ‰| align="center" | &Acirc;| align="center" | &Ecirc;| align="center" | &Euml;| align="center" | &Aacute;| align="center" | &Egrave;| align="center" | &iacute;| align="center" | &icirc;| align="center" | &iuml;| align="center" | &igrave;| align="center" | &Oacute;| align="center" | &Ocirc;
|-
! style="background:rgb(204,204,204)" | D0
| align="center" | {SPACE}| align="center" | &Ograve;| align="center" | &Ugrave;| align="center" | &Ucirc;
|
|
|-
! style="background:rgb(204,204,204)" | E0
| align="center" | {Choice}| align="center" | {Tab}| align="center" | , | align="center" | ."| align="center" | ..."
|
|
| align="center" | {EOL}| align="center" | {NewScrNew&nbsp;Scr}| align="center" | {NewScr/SpaceNew&nbsp;Scr?}| align="center" | {Cloud}| align="center" | {Barret}| align="center" | {Tifa}| align="center" | {Aerith}| align="center" | {Red 13&nbsp;XIII}| align="center" | {Yuffie}
|-
! style="background:rgb(204,204,204)" | F0
| align="center" | {Cait &nbsp;Sith}| align="center" | {Vincent}| align="center" | {Cid}| align="center" | {Party&nbsp;#1}| align="center" | {Party&nbsp;#2}| align="center" | {Party&nbsp;#3}| â—‹align="center" | &#12295;| â–³align="center" | &#9651;| â–¡align="center" | &#9744;| ×align="center" | &#10005; 
|
|
|
! style="background:rgb(255,205,154)" | {FUNC}
| align="center" | {END}
|}
There is no equivalent character to 80h in most font families.<br/>
Characters D4h - DFh appear to produce odd graphical errors.
=== {FUNC} Character ===
More info can be found in [[FF7/Field/DialogWindow#Special_Letters|Dialog Window]] section of the wiki.
 
=== Battle Text within the KERNEL.BIN ===
 
Sections 10-17 and 26 of the [[FF7/Kernel/Kernel.bin|KERNEL.BIN]] are encoded differently than the rest of the text data. Several other values have additional functions:
 
'''EA - F0''': These are variable position markers used in the Battle Text section (25) of KERNEL.BIN. These will only appear in specific texts and should only be used in those texts. These tell the battle engine that when a title needs to be displayed that certain values need to be inserted into the string. These are always followed by two NULL pointers (FFFFh).
 
EA: Name of a Character
EB: Name of an Item
EC: Number
ED: Name of the Target
EF: Name of Attack
FO: Target's Letter (for enemies)
 
Example
S t o l e X !
33 54 4F 4C 45 00 EB FF FF 01 FF
 
The battle engine will replace the "EB FF FF" with the name of the item at the index passed to it.
 
'''F8''': This appears at the beginning of a text. It tells the battle engine that the next byte will determine the color of the box the text is to be displayed in. 02h is the only one used and it displays a red box associated with Limit Breaks.
 
'''F9''': This is an encoding technique designed to make the raw data smaller. It is based on the LZS compression method, but optimized for smaller files with fewer large similar blocks. A byte following this value will tell the game's memory the location of, and how much, text to read. The byte is set up like this:
In binary:
YYXXXXXX
Where YY is the number of bytes to read and XXXXXX is how far back from the F9 byte to look.
The number of bytes to read uses the formula:
no_of_bytes = (YY) * 2 + 4 [Where YY is binary]
The location starts at the position that the data read the byte F9 and proceeds backwards XXXXXX + 1 times.<br/>
Ex:
This is the description of the Poison Ring stored in section 15 of the kernel, both raw data and decoded text.
24 52 41 49 4E 53 00 3B 30 4F 49 53 4F 4E 3D 00 41 54 54 41 43 4B 53 0C 00 50 52 4F 54 45 43 54 53 00 41 47 F9 21 54 F9 A0 3D
D r a i n s [ P o i s o n ] a t t a c k s , p r o t e c t s a g ** ?? t ** ?? ]
 
At the end we have two F9 functions located at the end. The first one references the "ains" in the word "Drains" earlier in the description and the second one references the " [Poison" shortly after. The bytes following the F9 describe how to get to those texts:
21
00 100001 - go back 34 bytes and display four characters
A0
10 100000 - go back 33 bytes and display eight characters
This is an absolute position so it does not matter if there are other encrypted segments between it and the text it is trying to read.
 
NOTE: This may even request that a NULL terminator (0xFF) be output as well, but the data will then be terminated after the last piece of encoded text. This encoding can span back to previous descriptions as well.
===Useful downloads===