A Technical Guide to Equipment Transmutation
Guides
/
A Technical Guide to Equipment Transmutation
Updated 3 months ago by Priestess_Emilia

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]