A Technical Guide to Equipment Transmutation
Updated Priestess_Emilia
by A Technical Guide to Equipment Transmutation
Final Fantasy Crystal Chronicles: Echoes of Time
- Equipment Transmutation works on all versions of the game
- Addresses mentioned in this guide come from the Japanese DS version
Definitions
Menu graph
[Main Menu]-+-[Status]-+-[Equipment]-+-[Weapons]
| | |
| | +-[Head_Armor]
| | |
| | +-[Body_Armor]
| | |
| | +-[Accessories]
| |
| +-[Equipped_Bonuses]
| |
| +-[Abilities]
| |
| +-[AI_Settings]
|
+-[Chronicles]
|
+-[Items]-+-[Weapons]
| |
| +-[Head_Armor]
| |
| +-[Body_Armor]
| |
| +-[Accessories]
| |
| +-[Materials]
| |
| +-[Jewels]
| |
| +-[Scrolls]-+-[Weapons]
| | |
| | +-[Head_Armor]
| | |
| | +-[Body_Armor]
| | |
| | +-[Accessories]
| | |
| | +-[Materials]
| |
| +-[Money]
|
+-[Scratch_Cards]
Equipment attributes
typedef struct Equipment_Attributes
{
uint8_t jewel_1;
uint8_t jewel_2;
uint8_t jewel_3;
uint8_t level;
}
Equipment_Attributes;
Equipment lists
#define SIZE 50
typedef struct Equipment_List
{
struct Undefined * undefined;
uint32_t length;
uint16_t * id[SIZE];
struct Equipment_Attributes attributes[SIZE];
}
Equipment_List;
[0x021236cc] struct Equipment_List Weapons;
[0x02123864] struct Equipment_List Body_Armor;
[0x021239fc] struct Equipment_List Head_Armor;
[0x02123b94] struct Equipment_List Accessories;
struct Equipment_List *type[4] =
{
&Weapons,
&Head_Armor,
&Body_Armor,
&Accessories
};
Characters
typedef struct Character
{
[+0x94] uint16_t * id_weapon;
[+0x98] uint16_t * id_head_armor;
[+0x9c] uint16_t * id_body_armor;
[+0xa0] uint16_t * id_accessory;
[+0xa4] struct Equipment_Attributes attributes_weapon;
[+0xa8] struct Equipment_Attributes attributes_head_armor;
[+0xac] struct Equipment_Attributes attributes_body_armor;
[+0xb0] struct Equipment_Attributes attributes_accessory;
}
Character;
[0x02122dd8] struct Character char_0;
[0x02123014] struct Character char_1;
[0x02123250] struct Character char_2;
[0x0212348c] struct Character char_3;
[0x02125f4c] uint32_t current_character;
struct Character *characters[4] =
{
&char_0,
&char_1,
&char_2,
&char_3
};
Menu variables
typedef struct Menu_Variables
{
[+0x04] uint32_t flag;
[+0x44] uint32_t equipment_index;
[+0x91] uint8_t submenu_index_scrolls;
[+0x93] uint8_t submenu_index_equipment;
[+0x94] uint8_t submenu_index_items;
[+0xa4] struct Equipment_List * equipment_list;
[+0xa8] uint16_t * equipment_id;
[+0xac] struct Equipment_Attributes equipment_attributes;
}
Menu_Variables;
[0x02135734] struct Menu_Variables menu_variables;
Flag behavior
The flag determines whether some variables should be updated
The flag is set upon:
- Opening the menu
- Closing the preview of a Scratch Card
The flag is cleared upon:
- Closing the menu
- Opening the preview of a Scratch Card
The flag is not set back when a Scratch Card is discarded
- Main reason the glitch exists
Updates requiring (flag == 1)
Opening [Main Menu] for the first time
equipment_list = &Weapons;
equipment_id = characters[current_character]->id_weapon;
equipment_attributes = characters[current_character]->attributes_weapon;
Highlighting an equipment from [Equipment]
equipment_list = type[submenu_index_equipment];
equipment_id = characters[current_character]->id_any;
equipment_attributes = characters[current_character]->attributes_any;
Closing [Equipment]
equipment_list = &Weapons;
equipment_id = characters[current_character]->id_weapon;
equipment_attributes = characters[current_character]->attributes_weapon;
Opening [Equipment] - [Any]
equipment_list = type[submenu_index_equipment];
Highlighting an equipment from [Equipment] - [Any]
equipment_id = equipment_list->id[equipment_index];
equipment_attributes = equipment_list->attributes[equipment_index];
Closing [Equipment] - [Any]
equipment_id = equipment_list->id[0];
equipment_attributes = equipment_list->attributes[0];
Note: these modifications are overridden as [Equipment] is then opened
Opening [Items] - [Any]
equipment_list = type[submenu_index_items];
Highlighting an equipment from [Items] - [Any]
equipment_id = equipment_list->id[equipment_index];
equipment_attributes = equipment_list->attributes[equipment_index];
Closing [Items] - [Any]
equipment_id = equipment_list->id[0];
equipment_attributes = equipment_list->attributes[0];
Opening [Scrolls] - [Any]
equipment_list = type[submenu_index_scrolls];
Note: highlighting a scroll updates other variables regardless of the flag
General rules
Highlighting an equipment
- equipment_index ranges from 0 to equipment_list->length - 1
Discarding an equipment
- Discarded equipments use equipment_id and equipment_attributes
- Clears entry equipment_index from the list the equipment would come from
- Crashes the game if equipment_id == NULL
Main applications
Transmutation from the first equipment of a list
- Open [Equipment] or [Items] - [Any_0]
- Discard a Scratch Card from [Scratch_Cards]
- Discard equipments from [Items] - [Any_1]
Transmutation from a scroll
- Discard a Scratch Card from [Scratch_Cards]
- Highlight a scroll from [Scrolls] - [Any_0]
- Discard equipments from [Items] - [Any_1]
Infinite transmutation from a scroll
- Considering [Any_1] different from either [Weapons] or [Any_0] respectively
- Open [Equipment], [Items] - [Any_0], or [Scrolls] - [Any_0]
- Discard a Scratch Card from [Scratch_Cards]
- Highlight a scroll from [Scrolls] - [Any_1]
- Discard equipments from [Items] - [Any_2]
Recent runs