Difference between pages "FF7/Battle/Battle Mechanics" and "FF8/Menu sp2"

From Final Fantasy Inside
< FF7‎ | Battle(Difference between pages)
Jump to navigation Jump to search
my_wiki>Quantumpencil
 
my_wiki>Sebanisu
(Content of face1.tex and face2.tex: added link to info of what is in card textures)
 
Line 1: Line 1:
This page will be for Battle memory structures. This is consistent with the memory structure of the PC version. PSX may or may not reflect these structures.
+
by MaKi<br/>
 +
updated by Sebanisu
  
== Command Defaults ==
+
This file is a mapping file for atlas textures like icons.tex
 
 
Each command type has default execution values that can, in some cases, be overridden. These come from a hard-coded structure in the executable.
 
  
 +
== Layout of '''icon.sp1''': ==
 +
=== Header ===
 +
'''(4 x (PointerCount + 1))''' bytes
 
{| class="wikitable"
 
{| class="wikitable"
 
! Offset
 
! Offset
! Default
+
! SizeOf
 +
! Name
 +
! Description
 
|-
 
|-
| 0h
+
| 0
| Animation
+
| UInt32
 +
| PointerCount
 +
| Number of entries
 
|-
 
|-
| 1h
+
| 4
| Damage Calculation
+
| Struct Pointer[PointerCount]
|-
+
| Pointers
| 2h
+
| Seek locations for entry groups
| Command Properties
 
 
|}
 
|}
  
== Queued Actions ==
+
=== Pointer ===
 
+
'''4''' bytes
When a command is selected either by a player character or an enemy the action is inserted into a priority queue. Up to 64 actions can be queued. On each update loop, the main Queue function will pop off the next action with the lowest priority and execute it in FIFO order within priority bands.
 
 
 
Queue entries have the following structure in memory:
 
 
 
 
{| class="wikitable"
 
{| class="wikitable"
 
! Offset
 
! Offset
! Value
+
! SizeOf
 +
! Name
 +
! Description
 
|-
 
|-
 
| 0
 
| 0
| Action Priority (limits/counters 0, player chosen spells 6)
+
| UInt16
|-
+
| Pointer
| 1
+
| Seek location for entry group
| Queue position within priority band
 
 
|-
 
|-
 
| 2
 
| 2
| Attacker actor ID
+
| UInt16
|-
+
| Count
| 3
+
| Number of entries in group
| Action command index (e.g CMD_MAGIC = 0x02)
 
|-
 
| 4
 
| Action attack index (e.g Bolt = 0x21). (This index is absolute, not command relative)
 
|-
 
| 6
 
| Action target mask
 
 
|}
 
|}
  
== AI Structure ==
+
=== Entry Group ===
 
+
'''(8 x Count)''' bytes <br/>
There is a single block of memory that holds AI information on the current running script. Each Actor "owns" this while their scripts are executing.
+
At pointer's location there will be '''Struct Entry[Count]'''. Example of an entry group is the direction pad is in eight pieces. Four of them are unpressed and four are pressed versions. It has four entries for the direction pad depending on the directions it is highlighting.
  
 +
=== Entry ===
 +
'''8''' bytes
 
{| class="wikitable"
 
{| class="wikitable"
 
! Offset
 
! Offset
! Function
+
! SizeOf
|-
+
! Name
| 0h
+
! Description
| Actor Index
 
|-
 
| 4h
 
| Script Position
 
|-
 
| 8h
 
| Remaining Stack Space (initially 200h)
 
|-
 
| 0Ch
 
| Current AI OpCode
 
|-
 
| 10h
 
| OpCode Lower Nybble
 
 
|-
 
|-
| 14h
+
|0
| OpCode Upper Nybble
+
|Byte
 +
|xPos
 +
|Pixel X coordinate in image atlas
 
|-
 
|-
| 18h
+
|1
| First Group Type
+
|Byte
 +
|yPos
 +
|Pixel Y coordinate in image atlas
 
|-
 
|-
| 1Ch
+
|2
| Second Group Type
+
|Byte[2]
 +
|UNK
 +
|Unknown data
 
|-
 
|-
| 20h
+
|4
| OpCode Lower Nybble (related to group 1?)
+
|Byte
 +
|Width
 +
|Width of entry in pixels
 
|-
 
|-
| 24h
+
|5
| OpCode Lower Nybble (related to group 2?)
+
|Byte
 +
|Offset X
 +
|Offset of X coordinate for when drawing
 
|-
 
|-
| 28h
+
|6
| Mask of ''non-null'' values in Group 1
+
|Byte
 +
|Height
 +
|Height of entry in pixels
 
|-
 
|-
| 2Ah
+
|7
| Mask of ''non-null'' values in Group 2
+
|Byte
|-
+
|Offset Y
| 2Ch - 50h
+
|Offset of Y coordinate for when drawing
| Group 1 of variables
 
|-
 
| 54h - 78h
 
| Group 2 of variables
 
|-
 
| 7Ch - 27Ch
 
| Stack of values
 
 
|}
 
|}
 +
Invalid Entries will have '''X''' and '''Y''' of '''zero'''. The top '''16x16''' pixel area is blank. Everything in '''icon.tex''' is aligned to a '''8x8 grid'''. Some entry groups leave out connecting pieces I think you are expected to fill in the blank. Some things like the menu border and menu background don't appear to be listed in this file.
  
== Active Character Data ==
+
===End of file===
 +
Everything at and beyond file pointer '''4272 {0x10C0}''' appears to be garbage.
  
This is an array that each playable character maintains an instance of.
+
== Layout of '''face.sp2''' and '''cardanm.sp2''': ==
  
 +
Both '''face.sp2''' and '''cardanm.sp2''' have the same layout. Main difference is '''face.sp2''' has '''32''' valid and '''64''' total entries.  '''cardanm.sp2''' only has '''11''' valid entries and '''1''' invalid, as it has no dims. In each of the card texture files the final slot is the '''Triple Triad''' card back. If the entry had dims they would be  X='''192''',Y='''128''', W='''64''', H='''64'''.
 +
 +
=== Header ===
 
{| class="wikitable"
 
{| class="wikitable"
 
! Offset
 
! Offset
! style="background: rgb(204,204,204)" colspan="2" | Value
+
! SizeOf
 +
! Name
 +
! Description
 
|-
 
|-
| 000h
+
| 0
| colspan="2" | Character ID
+
| UInt32
 +
| Count
 +
| Number of entries
 +
Count can be more than the actual images in the texture.<br/>
 +
'''face.sp2''': There are 8 images per texture in 2 textures, and there are 32/64 valid entries. 1 is blank.<br/>
 +
'''cardanm.sp2''': There are 11 images pre texture in 10 textures, and there are 11/12 valid entries. The 12th entry is the card back but it's missing dims.
 +
 
 
|-
 
|-
| 001h
+
| 4
| colspan="2" | Cover Chance
+
| UInt32[Count]
|-
+
| Locations
| 002h
+
| Seek location for each entry
| colspan="2" | Strength
+
|}
|-
+
=== Entry ===
| 003h
+
'''16''' bytes
| colspan="2" | Vitality
+
 
|-
+
{| class="wikitable"
| 004h
+
! Offset
| colspan="2" | Magic
+
! SizeOf
|-
+
! Name
| 005h
+
! Description
| colspan="2" | Spirit
 
|-
 
| 006h
 
| colspan="2" | Speed
 
|-
 
| 007h
 
| colspan="2" | Luck
 
|-
 
| 008h
 
| colspan="2" | Phys Attack
 
|-
 
| 00Ah
 
| colspan="2" | Phys Def
 
|-
 
| 00Ch
 
| colspan="2" | Mag Attack
 
|-
 
| 00Eh
 
| colspan="2" | Mag Def
 
|-
 
| 010h
 
| colspan="2" | Current HP
 
|-
 
| 012h
 
| colspan="2" | Max HP
 
|-
 
| 014h
 
| colspan="2" | Current MP
 
|-
 
| 016h
 
| colspan="2" | Max MP
 
|-
 
| 018h
 
| colspan="2" | Timer
 
|-
 
| 01Ch
 
| colspan="2" | Counter Attack Action Index
 
|-
 
| 01Eh
 
| colspan="2" | Counter Attack Chance
 
|-
 
| 021h
 
| colspan="2" | Some sort of divisor?
 
|-
 
| 023h
 
| colspan="2" | Character Flags (Underwater, Long Range, HP&lt;-&gt;MP, etc)
 
|-
 
| 024h
 
| colspan="2" | Eight entries of three bytes...
 
|-
 
| 03Ch
 
| colspan="2" | Attacking Elements
 
|-
 
| 03Eh
 
| colspan="2" | Halved Elements
 
|-
 
| 040h
 
| colspan="2" | Nullified Elements
 
|-
 
| 042h
 
| colspan="2" | Absorbed Elements
 
|-
 
| 044h
 
| colspan="2" | Attacking Elements
 
 
|-
 
|-
| 048h
 
| colspan="2" | Immune Statuses
 
|-
 
| 04Ch
 
| colspan="2" | Enabled Command Menu (16 entries of 6 bytes)
 
|-
 
| 0ACh
 
| colspan="2" | Limit Actions for current Limit Level
 
|-
 
| 0B4h
 
| colspan="2" | Enabled Limit Data (three entries in Attack Data format(0x1C))
 
|-
 
| 108h
 
| colspan="2" | Enabled Magics (54 entries of 8 bytes)
 
|-
 
| style="background: rgb(204,204,255)" rowspan="7" |
 
 
| 0
 
| 0
| Magic Index
+
| UInt32
 +
| Count
 +
| Number of entries at this location
 +
Always '''1'''
 
|-
 
|-
| 1h
+
| 4
| MP Cost
+
| byte
 +
| xPos
 +
| Pixel X coordinate in image atlas
 
|-
 
|-
| 2h
+
| 5
| All Count
+
| byte
 +
| yPos
 +
| Pixel Y coordinate in image atlas
 +
'''face.sp2''': Invalid entries seem to have '''yPos>=Texture.Height'''.<br />
 +
Detected switch from '''face1.tex''' to '''face2.tex''' when '''yPos<previous.yPos'''.
 
|-
 
|-
| 3h
+
| 6
| Quad Enabled?
+
| byte[2]
 +
| UNK
 +
| Unknown
 +
'''face.sp2''': '''{0x20,0x36}''' on the valid entries. '''{0x60,0x36}''' on invalid entries.<br />
 +
'''cardanm.sp2''': '''{0x20,0xB6}''' on the valid entries. '''{0x00,0x00}''' on the invalid entry.
 
|-
 
|-
| 4h
+
| 8
| Quad Count?
+
| UInt16
 +
| Width
 +
| Width of entry in pixels
 +
Possible this is really a '''byte''' with a '''0 x-offset'''.
 
|-
 
|-
| 5h
+
| 10
| Target Data
+
| UInt16
|-
+
| Height
| 6h
+
| Height of entry in pixels
| Properties
+
Possible this is really a '''byte''' with a '''0 y-offset'''.
|-
 
| 2C8h
 
| colspan="2" | Enabled Summons (format like above)
 
|-
 
| 348h
 
| colspan="2" | Enabled ESkills (format like above)
 
|-
 
| 408h
 
| colspan="2" | First 11 bytes of Weapon Data
 
|-
 
| 40Dh
 
| colspan="2" | Status of weapon added to Attacking Statuses above
 
|-
 
| 410h
 
| colspan="2" | Weapon's Accuracy
 
|-
 
| 418h
 
| colspan="2" | Additional Attack Elements
 
|-
 
| 41Ch
 
| colspan="2" | Four sets of two DWords : (Stat to increase, Increase value)
 
|-
 
| 43Ch
 
| colspan="2" | Gil Bonus granted by this character
 
 
|-
 
|-
| 43Dh
+
| 12
| colspan="2" | Encounter rate ""
+
| byte[4]
|-
+
| UNK
| 43Eh
+
| Unknown
| colspan="2" | Chocobo Chance ""
+
'''face.sp2''': '''{0x00,0x00,0x8E,0x00}''' on most. Last one has all '''{0x00}'''<br />
|-
+
'''cardanm.sp2''': '''{0x00,0x00,0xAE,0x00}''' on most. Last one has all '''{0x00}'''
| 43Fh
 
| colspan="2" | PreEmptive Chance ""
 
 
|}
 
|}
  
== Actor Battle Data ==
+
=== End of file ===
 
+
'''face.sp2'''File ends with '''byte[16]''' of '''{0x00}'''
Similar to Active Character Data, but more detailed. This data is dependent on who is performing the current action and only one instance of it exists during each action and all stats are relative to the performing actor and current action unless otherwise noted. Addresses 200h and above will change for each target of the action.
 
  
 +
=== Content of '''face1.tex''' and '''face2.tex''' ===
 
{| class="wikitable"
 
{| class="wikitable"
! Offset
+
!Name
! style="background: rgb(204,204,204)" colspan="2" | Value
+
!File
|-
+
!X
| 0h
+
!Y
| colspan="2" | Index
+
!Width
|-
+
!Height
| 4h
 
| colspan="2" | Level
 
|-
 
| 8h
 
| colspan="2" | Formation Entry (Enemy A, Enemy B, etc)
 
|-
 
| 0Ch
 
| colspan="2" | Command Index
 
|-
 
| 10h
 
| colspan="2" | Action Index
 
|-
 
| 14h
 
| colspan="2" | Action Animation Base (for relative to absolute animation indexes)
 
|-
 
| 18h
 
| colspan="2" | Allowed Targets (Active and targetable)
 
|-
 
| 1Ch
 
| colspan="2" | Active Allies?
 
|-
 
| 20h
 
| colspan="2" | Command Animation (player characters only)
 
|-
 
| 24h
 
| colspan="2" |
 
[[FF7/Battle/Attack_Effect_Id_List|Attack Effect]]
 
|-
 
| 28h
 
| colspan="2" | Command Index (again)
 
|-
 
| 2Ch
 
| colspan="2" | Action Index (again)
 
|-
 
| 30h
 
| colspan="2" | Self Mask
 
|-
 
| 38h
 
| colspan="2" | MP Cost
 
|-
 
| 3Ch
 
| colspan="2" | Action Accuracy
 
|-
 
| 40h
 
| colspan="2" |
 
[[FF7/Battle/Damage_Calculation|Damage Calculation]]
 
|-
 
| 44h
 
| colspan="2" |
 
[[FF7/Battle/Elemental_Data|Action's Element]]
 
|-
 
| 48h
 
| colspan="2" | Action's Power
 
|-
 
| 4Ch
 
| colspan="2" | Phys/Mag Attack Power
 
|-
 
| 50h
 
| colspan="2" | Action's Target(s) Mask
 
|-
 
| 54h
 
| colspan="2" | Normal Impact Sound
 
|-
 
| 58h
 
| colspan="2" | Critical Impact Sound
 
|-
 
| 5Ch
 
| colspan="2" | Miss Sound
 
|-
 
| 60h
 
| colspan="2" | Single Target Camera
 
|-
 
| 64h
 
| colspan="2" | Multi Target Camera
 
|-
 
| 68h
 
| colspan="2" | Action Reaction Animation Index
 
|-
 
| 6Ch
 
| colspan="2" |
 
[[FF7/Battle/Attack_Special_Effects|Attack Special Effects]]
 
|-
 
| 78h
 
| colspan="2" | Non-self target mask?
 
|-
 
| 80h
 
| colspan="2" |
 
[[FF7/Battle/Status_Effects|Inflicting Status(es)]]
 
|-
 
| 84h
 
| colspan="2" |
 
[[FF7/Battle/Status_Effects|Curing Status(es)]]
 
|-
 
| 88h
 
| colspan="2" |
 
[[FF7/Battle/Status_Effects|Toggling Status(es)]]
 
|-
 
| 8Ch
 
| colspan="2" | Chance to inflict Status
 
|-
 
| 90h
 
| colspan="2" | Command Properties (details pending)
 
|-
 
| 94h
 
| colspan="2" | Target Mask
 
|-
 
| 98h
 
| colspan="2" | Attack Index position in scene data (enemy only)
 
|-
 
| A0h
 
| colspan="2" |
 
Action Accuracy function (upper nybble of [[FF7/Battle/Damage_Calculation|Damage Calculation]])
 
|-
 
| A4h
 
| colspan="2" |
 
Action Damage function (lower nybble of [[FF7/Battle/Damage_Calculation|Damage Calculation]])
 
|-
 
| ACh
 
| colspan="2" | Quad Magic Count?
 
|-
 
| B0h
 
| colspan="2" | Number of attack damage calculations?
 
|-
 
| B4h
 
| colspan="2" | Follow-up action count (Tifa's Limits, Finishing Touch, etc)
 
|-
 
| B8h
 
| colspan="2" | Number of Targets?
 
|-
 
| BCh
 
| colspan="2" |
 
[[FF7/Battle/Attack_Special_Effects|Attack Additional Effects]]
 
|-
 
| C0h
 
| colspan="2" | Additional Effect Modifier
 
|-
 
| C4h
 
| colspan="2" | Attack Power
 
|-
 
| C8h
 
| colspan="2" | Actor's current status
 
|-
 
| D0h - D7h
 
| colspan="2" | Follow-up Action(s)
 
|-
 
| D8h
 
| colspan="2" | Actor's Strength
 
|-
 
| DCh
 
| colspan="2" | Used during String display?
 
|-
 
| E0h
 
| colspan="2" | Number of successful hits
 
|-
 
| F0h
 
| colspan="2" | Character-specific action properties (mp absorb, hp absorb, etc)
 
|-
 
| F8h
 
| colspan="2" | Related to enabled magic. Also ACh above.
 
|-
 
| FCh
 
| colspan="2" | Multiple hit count
 
|-
 
| 100h - 1FFh
 
| colspan="2" | large unused gap
 
|-
 
| 200h
 
| colspan="2" | ???
 
|-
 
| 204h
 
| colspan="2" | Character Map (players only)
 
|-
 
| 208h
 
| colspan="2" | Current Target Index
 
|-
 
| 20Ch
 
| colspan="2" | Formation Slot
 
|-
 
| 210h
 
| colspan="2" | Target's Phys/Mag Def (whichever attack type is)
 
 
|-
 
|-
| 214h
+
|Squall Leonhart
| colspan="2" | Damage done to target
+
|face1.tex
 +
|0
 +
|0
 +
|32
 +
|48
 
|-
 
|-
| 218h
+
|Zell Dincht
| colspan="2" | Properties of attack
+
|face1.tex
 +
|32
 +
|0
 +
|32
 +
|48
 
|-
 
|-
| style="background: rgb(204,204,255)" rowspan="8" |
+
|Irvine Kinneas
| 1
+
|face1.tex
| missed
+
|64
 +
|0
 +
|32
 +
|48
 
|-
 
|-
| 2
+
|Quistis Trepe
| Physical if set; Magical if unset
+
|face1.tex
 +
|96
 +
|0
 +
|32
 +
|48
 
|-
 
|-
| 4
+
|Rinoa Heartilly
| Attempt Steal
+
|face1.tex
 +
|128
 +
|0
 +
|32
 +
|48
 
|-
 
|-
| 20
+
|Selphie Tilmitt
| Won't Miss
+
|face1.tex
 +
|160
 +
|0
 +
|32
 +
|48
 
|-
 
|-
| 4000
+
|Seifer Almasy
| Physical Barrier
+
|face1.tex
 +
|192
 +
|0
 +
|32
 +
|48
 
|-
 
|-
| 8000
+
|Edea Kramer
| Magical Barrier
+
|face1.tex
 +
|224
 +
|0
 +
|32
 +
|48
 
|-
 
|-
| 40000
+
|Laguna Loire
| ???
+
|face1.tex
 +
|0
 +
|48
 +
|32
 +
|48
 
|-
 
|-
| 800000
+
|Kiros Seagill
| ???
+
|face1.tex
 +
|32
 +
|48
 +
|32
 +
|48
 
|-
 
|-
| 220h
+
|Ward Zabac
| colspan="2" | More properties (heal, critical, damage MP, etc)
+
|face1.tex
 +
|64
 +
|48
 +
|32
 +
|48
 
|-
 
|-
| 224h
+
|Lion
| colspan="2" | Target's reaction animation
+
|face1.tex
 +
|128
 +
|48
 +
|32
 +
|48
 
|-
 
|-
| 228h
+
|MiniMog
| colspan="2" | Target's status
+
|face1.tex
 +
|160
 +
|48
 +
|32
 +
|48
 
|-
 
|-
| 22Ch
+
|Boko
| colspan="2" | Target's status immunities
+
|face1.tex
 +
|192
 +
|48
 +
|32
 +
|48
 
|-
 
|-
| 230h
+
|Angelo
| colspan="2" | Damage level to current Action
+
|face1.tex
 +
|224
 +
|48
 +
|32
 +
|48
 
|-
 
|-
| style="background: rgb(204,204,255)" rowspan="8" |
+
|Quezacotl
| 1
+
|face2.tex
| Death (if not immune)
+
|0
 +
|0
 +
|32
 +
|48
 
|-
 
|-
| 2
+
|Shiva
| Always hit?
+
|face2.tex
|-
+
|32
| 4
+
|0
| Double (Damage &amp; Accuracy)
+
|32
|-
+
|48
| 8
 
| Normal (Never checked)
 
|-
 
| 10
 
| Half (Damage &amp; Accuracy)
 
 
|-
 
|-
| 20
+
|Ifrit
| Null (won't miss?)
+
|face2.tex
 +
|64
 +
|0
 +
|32
 +
|48
 
|-
 
|-
| 40
+
|Siren
| Absorb (won't miss?)
+
|face2.tex
 +
|96
 +
|0
 +
|32
 +
|48
 
|-
 
|-
| 80
+
|Brothers
| Full-Heal
+
|face2.tex
 +
|128
 +
|0
 +
|32
 +
|48
 
|-
 
|-
| 234h
+
|Diablos
| colspan="2" | Target condition flags (back exposed, multiple targets, etc)
+
|face2.tex
 +
|160
 +
|0
 +
|32
 +
|48
 
|-
 
|-
| 238h
+
|Carbuncle
| colspan="2" | Status(es) to add to Target
+
|face2.tex
 +
|192
 +
|0
 +
|32
 +
|48
 
|-
 
|-
| 23Ch
+
|Leviathan
| colspan="2" | Status(es) to Cure from Target
+
|face2.tex
 +
|224
 +
|0
 +
|32
 +
|48
 
|-
 
|-
| 240h
+
|Pandemona
| colspan="2" | Status(es) to Toggle from Target
+
|face2.tex
 +
|0
 +
|48
 +
|32
 +
|48
 
|-
 
|-
| 244h
+
|Cerberus
| colspan="2" | All Target's statuses that will be affected from action
+
|face2.tex
 +
|32
 +
|48
 +
|32
 +
|48
 
|-
 
|-
| 248h
+
|Alexander
| colspan="2" | Sound to play (determined from hit/critical/miss sounds above)
+
|face2.tex
 +
|64
 +
|48
 +
|32
 +
|48
 
|-
 
|-
| 24Ch
+
|Doomtrain
| colspan="2" | Action Animation to use (varies from single/multiple targets)
+
|face2.tex
 +
|96
 +
|48
 +
|32
 +
|48
 
|-
 
|-
| 254h
+
|Bahamut
| colspan="2" | Target's Level
+
|face2.tex
 +
|128
 +
|48
 +
|32
 +
|48
 
|-
 
|-
| 258h
+
|Cactuar
| colspan="2" | Target's HP
+
|face2.tex
 +
|160
 +
|48
 +
|32
 +
|48
 
|-
 
|-
| 25Ch
+
|Tonberry
| colspan="2" | Target's MP
+
|face2.tex
 +
|192
 +
|48
 +
|32
 +
|48
 
|-
 
|-
| 260h
+
|Eden
| colspan="2" | Action's final Accuracy
+
|face2.tex
 +
|224
 +
|48
 +
|32
 +
|48
 
|}
 
|}
 +
There is one blank space in '''face1.tex''', I skipped that entry.
 +
=== Content of '''mc00.tex'''-'''mc09.tex''' ===
 +
Each level on the [https://finalfantasy.fandom.com/wiki/Final_Fantasy_VIII_Triple_Triad_cards fandom wiki page]is in the same order of the contents of the tex files.  The cardback is always the bottom right of each texture.

Revision as of 18:27, 15 April 2019

by MaKi
updated by Sebanisu

This file is a mapping file for atlas textures like icons.tex

Layout of icon.sp1:

Header

(4 x (PointerCount + 1)) bytes

Offset SizeOf Name Description
0 UInt32 PointerCount Number of entries
4 Struct Pointer[PointerCount] Pointers Seek locations for entry groups

Pointer

4 bytes

Offset SizeOf Name Description
0 UInt16 Pointer Seek location for entry group
2 UInt16 Count Number of entries in group

Entry Group

(8 x Count) bytes
At pointer's location there will be Struct Entry[Count]. Example of an entry group is the direction pad is in eight pieces. Four of them are unpressed and four are pressed versions. It has four entries for the direction pad depending on the directions it is highlighting.

Entry

8 bytes

Offset SizeOf Name Description
0 Byte xPos Pixel X coordinate in image atlas
1 Byte yPos Pixel Y coordinate in image atlas
2 Byte[2] UNK Unknown data
4 Byte Width Width of entry in pixels
5 Byte Offset X Offset of X coordinate for when drawing
6 Byte Height Height of entry in pixels
7 Byte Offset Y Offset of Y coordinate for when drawing

Invalid Entries will have X and Y of zero. The top 16x16 pixel area is blank. Everything in icon.tex is aligned to a 8x8 grid. Some entry groups leave out connecting pieces I think you are expected to fill in the blank. Some things like the menu border and menu background don't appear to be listed in this file.

End of file

Everything at and beyond file pointer 4272 {0x10C0} appears to be garbage.

Layout of face.sp2 and cardanm.sp2:

Both face.sp2 and cardanm.sp2 have the same layout. Main difference is face.sp2 has 32 valid and 64 total entries. cardanm.sp2 only has 11 valid entries and 1 invalid, as it has no dims. In each of the card texture files the final slot is the Triple Triad card back. If the entry had dims they would be X=192,Y=128, W=64, H=64.

Header

Offset SizeOf Name Description
0 UInt32 Count Number of entries

Count can be more than the actual images in the texture.
face.sp2: There are 8 images per texture in 2 textures, and there are 32/64 valid entries. 1 is blank.
cardanm.sp2: There are 11 images pre texture in 10 textures, and there are 11/12 valid entries. The 12th entry is the card back but it's missing dims.

4 UInt32[Count] Locations Seek location for each entry

Entry

16 bytes

Offset SizeOf Name Description
0 UInt32 Count Number of entries at this location

Always 1

4 byte xPos Pixel X coordinate in image atlas
5 byte yPos Pixel Y coordinate in image atlas

face.sp2: Invalid entries seem to have yPos>=Texture.Height.
Detected switch from face1.tex to face2.tex when yPos<previous.yPos.

6 byte[2] UNK Unknown

face.sp2: {0x20,0x36} on the valid entries. {0x60,0x36} on invalid entries.
cardanm.sp2: {0x20,0xB6} on the valid entries. {0x00,0x00} on the invalid entry.

8 UInt16 Width Width of entry in pixels

Possible this is really a byte with a 0 x-offset.

10 UInt16 Height Height of entry in pixels

Possible this is really a byte with a 0 y-offset.

12 byte[4] UNK Unknown

face.sp2: {0x00,0x00,0x8E,0x00} on most. Last one has all {0x00}
cardanm.sp2: {0x00,0x00,0xAE,0x00} on most. Last one has all {0x00}

End of file

face.sp2File ends with byte[16] of {0x00}

Content of face1.tex and face2.tex

Name File X Y Width Height
Squall Leonhart face1.tex 0 0 32 48
Zell Dincht face1.tex 32 0 32 48
Irvine Kinneas face1.tex 64 0 32 48
Quistis Trepe face1.tex 96 0 32 48
Rinoa Heartilly face1.tex 128 0 32 48
Selphie Tilmitt face1.tex 160 0 32 48
Seifer Almasy face1.tex 192 0 32 48
Edea Kramer face1.tex 224 0 32 48
Laguna Loire face1.tex 0 48 32 48
Kiros Seagill face1.tex 32 48 32 48
Ward Zabac face1.tex 64 48 32 48
Lion face1.tex 128 48 32 48
MiniMog face1.tex 160 48 32 48
Boko face1.tex 192 48 32 48
Angelo face1.tex 224 48 32 48
Quezacotl face2.tex 0 0 32 48
Shiva face2.tex 32 0 32 48
Ifrit face2.tex 64 0 32 48
Siren face2.tex 96 0 32 48
Brothers face2.tex 128 0 32 48
Diablos face2.tex 160 0 32 48
Carbuncle face2.tex 192 0 32 48
Leviathan face2.tex 224 0 32 48
Pandemona face2.tex 0 48 32 48
Cerberus face2.tex 32 48 32 48
Alexander face2.tex 64 48 32 48
Doomtrain face2.tex 96 48 32 48
Bahamut face2.tex 128 48 32 48
Cactuar face2.tex 160 48 32 48
Tonberry face2.tex 192 48 32 48
Eden face2.tex 224 48 32 48

There is one blank space in face1.tex, I skipped that entry.

Content of mc00.tex-mc09.tex

Each level on the fandom wiki pageis in the same order of the contents of the tex files. The cardback is always the bottom right of each texture.