All pastes #87672 Raw Edit

Mine

public text v1 · immutable
·published 2006-07-14 03:39 UTC
rendered paste body
//--------------------------------------
//--- 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();