Taking a break from the game, this blog is currently on hiatus. 💤

Modifying Localize File

You can add your own codes to change certain superficial aspects of the game, including errata for text. Note that all changes are client-sided, so only your modified client can see the changes. Also, certain things (item prices, weapon ATK Rating, etc.) are server-sided, so changing them will only change the display, but not the actual in-game value.

💣 WARNING! This guide is provided as is. Tamper with the game client at your own risks!

To do this, follow these steps:
  1. Extract ies.ipf file with GE Tools or IPF Extractor.
  2. Convert the desired .ies file(s) to .xml and .prn files with GE Tools.
  3. Open the .xml file as a xml table or .prn file as a tab-delimited table in Microsoft Excel.
    • Look through the file to find the required ClassNames.
  4. Extract shared.ipf file with GE Tools or IPF Extractor.
    • Extract shared00000,ipf for SEA server instead.
  5. Open localize.scp file in the extracted folder with Notepad.
  6. Search for func Localize_USA() in localize.scp file. 
    • Replace USA with your client's region (JPN, KOR, DEU).
    • You can check the value of "ServiceNation" in release\client.xml file.
  7. Insert your own codes (see below) anywhere in between the curly brackets {} below func Localize_USA().
  8. Check to see if the line UpdateItemTable(); is there just before the closing curly bracket. If it is absent, add the line.
  9. Save and exit Notepad.
  10. Create IPF from Folder (shared folder) with GE Tools.

Customizing Codes

The two basic code formats are:
SetPropertyString("Id", "ClassName", "ColumnName", "Text");
SetPropertyNumber("Id", "ClassName", "ColumnName", Number);
Open the respective .xml or .prn table converted from .ies file and find the following:
  • Id refers to the value of the Id column. All rows should have the same value.
  • ClassName refers to the value of the ClassName column for the specific row in the .ies table.
  • ColumnName refers to the name of the column whose value you want to change for the specified ClassName. For example, Id and ClassName are column names.
  • Text refers to the new text value with your own changes.
  • Number refers to the new number value with your own changes. Unlike other variables, number does not need to be enclosed in double quotation marks.
For certain text (e.g. Desc column), you would usually find it referring the ClassID of dictionary_local.xml file, which can be extracted from dictionary.ipf file. For example, the Wheel of Destiny back costume (ClassName "wheelofdestiny") has a Desc value of <$>32113</>. You will find this line in dictionary_local.xml file:
<Text ClassID="32113" Text="The One who controls Fate. [ATK Rating +1, DEF -1, Max HP +800]" />
You can directly change dictionary_local.xml file, which will apply the same modification to all texts that refer to that line (32112). This is not always an option since different items may refer to the same dictionary line, and you may want each item to have its own text value. Thus, as an alternative, you can use this method to change only the value for a specific item (ClassName "wheelofdestiny").


Sample Code

So as an example, let's change the description for Wheel of Destiny, since the statistics listed in USA client is obviously wrong (see Baron System). Wheel of Destiny is a back costume, so extract and convert datatable_item_back.ies file. Opening the datatable_item_back.xml file, search for the desired item:



We want to change the item description, so the column required is Desc. Instead of referring the dictionary file, we will customize our own text here. Following the format above, we end up with:
SetPropertyString("Item", "wheelofdestiny", "Desc", "The One who controls Fate. [ATK Rating +1, DEF Rating -1, DEF -20, Max HP +800]");
However, take note that the same item may have more than one variants (normal version, event version, temporary version, etc.). If these exist, you need to change each one separately. In the case of Wheel of Destiny, we find a temporary version (1-day) that is sold in Feso Shop. Therefore, we have a second code that looks like this:
SetPropertyString("Item", "Wheelofdestiny2", "Desc", "The One who controls Fate. Can be worn by players that are not in Baron mode. [ATK Rating +1, DEF Rating -1, DEF -20, Max HP +800]");
Do the same for Deadly Cross, Revenant, and Bloody Coffin. Add the codes in Step 7 above, so that localize.scp file looks like this:
func Localize_USA()
{
SetPropertyString("Item", "BloodyCoffin", "Desc", "A coffin seeping blood. [DEF -5]");
SetPropertyString("Item", "Deadlycross", "Desc", "A cross used to crucify the damned. [DEF -10]");
SetPropertyString("Item", "Revenant", "Desc", "Ghosts who haunt their slayer. [DEF -15, Max HP +800]");
SetPropertyString("Item", "wheelofdestiny", "Desc", "The One who controls Fate. [ATK Rating +1, DEF Rating -1, DEF -20, Max HP +800]");
SetPropertyString("Item", "Wheelofdestiny2", "Desc", "The One who controls Fate. Can be worn by players that are not in Baron mode. [ATK Rating +1, DEF Rating -1, DEF -20, Max HP +800]");

//...whatever else is normally supposed to be here
UpdateItemTable();
}
You can disable a code by adding // at the start of the line (i.e. rendering the line as a remark). If the function is empty by default, you need to add the line UpdateItemTable(); to the end. If it has some codes by default, the line should already be there.


This is the general overview. I will write more on various useful or amusing codes some other day. 😊

Extra: Finding ClassName

ClassName "wheelofdestiny" is pretty straight-forward on what the item is, but others might not be so clear. If you cannot guess an entry from its ClassName, you need to reference dictionary_local.xml file to find it. Basically, reversing the process mentioned above under Customizing Codes. I will clarify here in case it is too confusing to reverse the previous process:
  1. Look up a known text (name, description, tooltip, etc.) about the target monster/character/item/etc. in dictionary_local.xml (using Notepad or any text editor) and take note of the ClassID.
  2. Search for the ClassID inside the respective .xml/.prn file converted from .ies file. If there are multiple results, look through them individually.
  3. Find the value on the same row under ClassName column.
For example, we want to find the ClassName of a monster named Straggled Lanceman in USA client. So we open dictionary_local.xml and search for "Straggled Lanceman" and returns the result:

    <Text ClassID="111753" Text="Straggled Lanceman"/>

So its dictionary ClassID is 111753. Next, we convert datatable_monster.ies and open datatable_monster.xml in Excel as an XML Table. Search for <$>111753</> and we find it only in row 2045 under Name column. Move across the row to ClassName column and its value is Monster_AbyssKnight_FldBoss1.

Thus, the ClassName for Straggled Lanceman is Monster_AbyssKnight_FldBoss1.


Localize Mod ♠ Change Sizes ♠ Change Texts ♠ Change Sounds ♠ Change Appearances

Comments