//--------------------------------------
//--- 010 Editor v2.0.2d Binary Template
//
// File: CHRTemplate.bt
// Author: Rick (rick@gibbed.us)
// Revision: 1.0
// Purpose: Template for Titan Quest CHR files
//--------------------------------------
local unsigned int guiv;
local char gsb[1024];
local quad gsp;
unsigned int getUInt()
{
guiv = ReadInt(FTell());
FSkip(4);
return guiv;
}
string getString()
{
gsp = FTell();
Memset(gsb, 0, 1024);
ReadBytes(gsb, gsp + 4, ReadInt(gsp));
return gsb;
}
typedef struct
{
local unsigned int length;
char name[getUInt()];
switch (name)
{
case "headerVersion":
case "playerVersion":
case "begin_block":
case "isInMainQuest":
case "disableAutoPopV2":
case "numTutorialPagesV2":
case "currentPageV2":
case "versionCheckTeleportInfo":
case "teleportUIDsSize":
case "versionCheckMovementInfo":
case "markerUIDsSize":
case "versionCheckRespawnInfo":
case "respawnUIDsSize":
case "versionRespawnPoint":
case "money":
case "compassState":
case "skillWindowShowHelp":
case "end_block":
case "max":
case "skillLevel":
case "skillSubLevel":
case "skillTransition":
case "masteriesAllowed":
case "skillReclamationPointsUsed":
case "equipmentSelection":
case "skillWindowSelection":
case "skillSettingValid":
case "primarySkill1":
case "secondarySkill1":
case "skillActive1":
case "primarySkill2":
case "secondarySkill2":
case "skillActive2":
case "primarySkill3":
case "secondarySkill3":
case "skillActive3":
case "primarySkill4":
case "secondarySkill4":
case "skillActive4":
case "primarySkill5":
case "secondarySkill5":
case "skillActive5":
case "currentStats.charLevel":
case "currentStats.experiencePoints":
case "modifierPoints":
case "skillPoints":
case "playTimeInSeconds":
case "numberOfDeaths":
case "numberOfKills":
case "experienceFromKills":
case "healthPotionsUsed":
case "manaPotionsUsed":
case "maxLevel":
case "numHitsReceived":
case "numHitsInflicted":
case "greatestDamageInflicted":
case "(*greatestMonsterKilledLevel)[i]":
case "(*greatestMonsterKilledLifeAndMana)[i]":
case "criticalHitsInflicted":
case "criticalHitsReceived":
case "numberOfSacks":
case "currentlyFocusedSackNumber":
case "currentlySelectedSackNumber":
case "size":
case "seed":
case "var1":
case "pointX":
case "pointY":
case "storedType":
case "storedDefaultType":
{
unsigned int value;
break;
}
case "temp":
{
float value;
break;
}
case "alternateConfigEnabled":
case "hasBeenInGame":
case "skillEnabled":
case "skillActive":
case "controllerStreamed":
case "itemPositionsSavedAsGridCoords":
case "tempBool":
case "useAlternate":
case "itemAttached":
case "alternate":
case "isItemSkill":
{
unsigned int value <read=readBoolValue>;
break;
}
case "playerCharacterClass":
case "streamData":
case "alternateConfig":
case "playerTexture":
case "skillName":
case "baseName":
case "prefixName":
case "suffixName":
case "relicName":
case "description":
case "relicBonus":
{
length = getUInt();
if (length > 0)
{
char value[length] <read=readCharValue>;
}
break;
}
case "myPlayerName":
case "(*greatestMonsterKilledName)[i]":
{
length = getUInt();
if (length > 0)
{
char value[length * 2];
}
break;
}
case "uniqueId":
case "teleportUID":
case "markerUID":
case "respawnUID":
case "strategicMovementRespawnPoint[i]":
{
unsigned int value[4];
break;
}
default:
{
return;
}
}
} DATAVALUE <read=readDataValue>;
string readDataValue(DATAVALUE &dv)
{
return dv.name;
}
string readCharValue(char &value)
{
return value;
}
string readBoolValue(unsigned int &value)
{
return value == 0 ? "false" : "true";
}
void readBlocks()
{
local string name;
local int tc = 0;
while (FEof() == false)
{
name = getString();
if (name == "begin_block")
{
FSkip(19);
struct DATABLOCK
{
readBlocks();
} block;
}
else if (name == "end_block")
{
FSkip(17);
break;
}
else if (name == "temp")
{
if (tc == 0) DATAVALUE strength;
else if (tc == 1) DATAVALUE dexterity;
else if (tc == 2) DATAVALUE intelligence;
else if (tc == 3) DATAVALUE energy;
else if (tc == 4) DATAVALUE health;
else
{
DATAVALUE value;
}
tc++;
}
else
{
DATAVALUE value;
}
}
}
readBlocks();