//-------------------------------------- //--- 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 ; 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] ; } 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 ; 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();