BFEVFL: Difference between revisions

From ZeldaMods (Breath of the Wild)
Jump to navigation Jump to search
imported>Leoetlino
No edit summary
imported>Leoetlino
No edit summary
Line 7: Line 7:


As a direct consequence, most sections don't have any fixed order. Therefore, this article will only document the data structures and mention the order Nintendo places sections in. For more details, it is recommended to look at the [https://github.com/leoetlino/evfl <code>evfl</code> library] directly.
As a direct consequence, most sections don't have any fixed order. Therefore, this article will only document the data structures and mention the order Nintendo places sections in. For more details, it is recommended to look at the [https://github.com/leoetlino/evfl <code>evfl</code> library] directly.
Another consequence is that sections must be aligned to 8-byte boundaries in most cases to avoid unaligned memory accesses (this is not as important for strings).


=== Header ===
=== Header ===
Line 52: Line 54:


=== Relocation table ===
=== Relocation table ===
{{empty section}}
{|class="wikitable"
! Offset !! Type !! Description
|-
| 0x0 || char[4] || Magic ("RELT")
|-
| 0x4 || u32 || Offset to relocation table start
|-
| 0x8 || u32 || Number of sections (almost always 1)
|-
| 0xc || u32 || Padding
|-
| 0x10 || Section[num_sections] || Sections
|}
 
==== Relocation table section ====
{|class="wikitable"
! Offset !! Type !! Description
|-
| 0x0 || void* || Alternative base offset (unused by Nintendo)
|-
| 0x8 || u32 || Used to calculate the base pointer if an alternative base offset is used
|-
| 0xc || u32 || Data end offset (before alignment)
|-
| 0x10 || u32 || Number of entries to skip
|-
| 0x14 || u32 || Number of entries (includes skipped entries)
|-
| 0x18 || Entry[num_entries] || Entries
|}
 
==== Relocation table entry ====
{|class="wikitable"
! Offset !! Type !! Description
|-
| 0x0 || u32 || Offset to pointers to relocate
|-
| 0x4 || u32 || Bit field that determines which pointers need to be relocated (up to 32 contiguous pointers starting from the listed offset)
|}


=== Dictionary ===
=== Dictionary ===
Line 58: Line 98:


=== Container ===
=== Container ===
{{empty section}}


=== Flowchart ===
=== Flowchart ===

Revision as of 18:06, 12 September 2018

bfevfl is a binary file format for event flows.

Structures

bfevfl is a little endian format, so values are stored in little endian even on Wii U.

bfevfl uses pointers very heavily to refer to strings, to other sections, etc. All pointers are always 64 bit long -- since the same format is used on the Switch which is a 64 bit platform. They must be present in the #Relocation table if the file is to be loaded correctly by the official bfevfl code.

As a direct consequence, most sections don't have any fixed order. Therefore, this article will only document the data structures and mention the order Nintendo places sections in. For more details, it is recommended to look at the evfl library directly.

Another consequence is that sections must be aligned to 8-byte boundaries in most cases to avoid unaligned memory accesses (this is not as important for strings).

Header

Offset Type Description
0x0 char[8] Magic ("BFEVFL\x00\x00")
0x8 u16 Version (0x0300)
0xa u8 Unknown (must be zero)
0xb u8 Unknown
0xc u16 Byte order mark
0xe u8 Alignment (to get the actual value: 1 << raw_value)
0xf u8 Unknown
0x10 u32 File name offset
0x14 u16 Is relocated flag (set in memory)
0x16 u16 First block offset
0x18 u32 Relocation table offset
0x1c u32 File size
0x20 u16 Number of flowcharts
0x22 u16 Number of timelines
0x24 u32 Padding
0x28 Flowchart* Flowchart (nullptr if no flowchart)
0x30 Dictionary* Flowchart name dictionary
0x38 Timeline* Timeline (nullptr if no timeline)
0x40 Dictionary* Timeline name dictionary

Relocation table

Offset Type Description
0x0 char[4] Magic ("RELT")
0x4 u32 Offset to relocation table start
0x8 u32 Number of sections (almost always 1)
0xc u32 Padding
0x10 Section[num_sections] Sections

Relocation table section

Offset Type Description
0x0 void* Alternative base offset (unused by Nintendo)
0x8 u32 Used to calculate the base pointer if an alternative base offset is used
0xc u32 Data end offset (before alignment)
0x10 u32 Number of entries to skip
0x14 u32 Number of entries (includes skipped entries)
0x18 Entry[num_entries] Entries

Relocation table entry

Offset Type Description
0x0 u32 Offset to pointers to relocate
0x4 u32 Bit field that determines which pointers need to be relocated (up to 32 contiguous pointers starting from the listed offset)

Dictionary

Container

Flowchart

Timeline

Section order

File

  • Header (0x48 bytes)
  • Flowchart* array if it exists
  • Flowchart dictionary (always)
  • Timeline* array if it exists
  • Timeline dictionary (always)
  • Timeline
  • Flowchart
  • String pool (STR )
  • Relocation table (RELT)

Timeline

Flowchart

  • Flowchart header
  • Actors
  • Argument name is put in the string pool.
  • Events
  • Entry point dictionary
  • Entry points
  • Event param containers, fork structs, etc. (in order)
  • Actor param containers, string pointer arrays (in order)
  • Entry point extra data
  • Sub flow event index arrays are written here
  • ptr_x10 data may be written here? (ptr_x10 has always been a nullptr in files that have been checked by leoetlino.)
  • The size for each entry point is sizeof(event_idx_array) rounded up to the nearest multiple of 8 + 0x18 bytes.

Container

  • Container header (variable size)
  • Container dictionary
  • Container items (+ values)

Tools

  • evfl: Python library for parsing and writing event flows
  • EventEditor: graphical editor for event flows