Esempio n. 1
0
string ReadString (int offset, FILE *f)
{
	int oldofs = ftell(f);
	fseek (f, offset, SEEK_SET);
	string str= ReadZStr (f);
	fseek (f, oldofs, SEEK_SET);
	return str;
}
bool BuildTable::LoadCache (const char *fn)
{
	FILE *f;

	f = fopen(fn, "rb");
	if (!f) {
		logPrintf ("BuildTable: Can't open cache file %s\n", fn);
		return false;
	}

	if (fgetc (f) != BT_CACHE_VERSION) {
		logPrintf ("BuildTable: File %s has wrong version.\n", fn);
		return false;
	}

	fread (&numDefs, sizeof(int), 1, f);

	if (numDefs != cb->GetNumUnitDefs ())
	{
		logPrintf ("Cache isn't generated for current mod version.\n");
		fclose (f);
		return false;
	}

	deflist = new UDef[numDefs];
	for (int a=0;a<numDefs;a++)
	{
		deflist[a].name = ReadZStr (f);
		fread (&deflist[a].cost, sizeof(ResourceInfo), 1, f);
		fread (&deflist[a].make, sizeof(ResourceInfo), 1, f);
		fread (&deflist[a].storage, sizeof(ResourceInfo), 1, f);
		fread (&deflist[a].buildTime, sizeof(float),1,f);
		fread (&deflist[a].metalExtractDepth, sizeof(float), 1, f);
		fread (&deflist[a].energyUse, sizeof(float), 1,f);
		fread (&deflist[a].buildSpeed, sizeof(float), 1,f);
		fread (&deflist[a].weaponDamage, sizeof(float),1,f);
		fread (&deflist[a].weaponRange, sizeof(float),1,f);
		fread (&deflist[a].flags, sizeof(ulong),1,f);
		fread (&deflist[a].numBuildOptions, sizeof(int), 1,f);
	}

	table.alloc (numDefs);

	for (int a=0;a<numDefs;a++) 
		if (deflist[a].IsBuilder())
			fread (&table.data[a*numDefs], sizeof(Table::ent), numDefs, f);

	buildby = new vector<int>[numDefs];
	for (int a=0;a<numDefs;a++)
	{
		vector<int>& v = buildby[a];
		short size;

		fread (&size, sizeof(short), 1, f);
		v.resize (size);

		fread (&v[0], sizeof(int), size, f);
		deflist[a].buildby = &v;
	}

	fread (buildAssistTypes, sizeof(int), NUM_BUILD_ASSIST, f);

	if (ferror(f)) {
		logPrintf ("Error reading AI mod cache file %s\n", fn);
		fclose(f);
		return false;
	}

	fclose (f);

	return true;
}
Esempio n. 3
0
static MdlObject* load_object(int ofs, FILE *f, MdlObject *parent, int r=0)
{
	MdlObject *n = new MdlObject;
	TA_Object obj;
	int org=ftell(f);

	fseek(f,ofs,SEEK_SET);
	fread(&obj, sizeof(TA_Object),1,f);

	if(obj.VersionSignature != 1)
	{
		logger.Trace (NL_Error,"Wrong version. Only version 1 is supported");;
		return 0;
	}

	n->verts.resize (obj.NumberOfVertexes);
	long ipos[3];

	fseek (f,obj.OffsetToVertexArray, SEEK_SET);
	for(int a=0;a<obj.NumberOfVertexes;a++)
	{
		fread(ipos, sizeof(long),3,f);
		for (int b=0;b<3;b++)
			n->verts[a].pos.v[b] = FROM_TA(ipos[b]);
	}

	std::vector<TA_Polygon> tapl;
	tapl.resize (obj.NumberOfPrimitives);

	fseek (f, obj.OffsetToPrimitiveArray, SEEK_SET);
	fread (&tapl[0], sizeof(TA_Polygon), obj.NumberOfPrimitives, f);
	for (int a=0;a<obj.NumberOfPrimitives;a++)
	{
		fseek (f, tapl[a].VertOfs,SEEK_SET);

		Poly *p = new Poly;
		p->verts.resize (tapl[a].VertNum);

		for (int b=0;b<tapl[a].VertNum;b++)
		{
			short vindex;
			fread (&vindex, sizeof(short), 1, f);
			p->verts[b] = vindex;
		}

		p->taColor = tapl[a].PaletteIndex;
		p->color = palette.GetColor(tapl[a].PaletteIndex);

		fseek (f, tapl[a].TexnameOfs, SEEK_SET);
		p->texname = ReadZStr(f);

		n->poly.push_back (p);
	}

	fseek (f, obj.OffsetToObjectName, SEEK_SET);
	n->name = ReadZStr (f);

	n->position.v[0] = FROM_TA(obj.XFromParent);
	n->position.v[1] = FROM_TA(obj.YFromParent);
	n->position.v[2] = FROM_TA(obj.ZFromParent);

	if (obj.OffsetToSiblingObject)
	{
		if (!parent)
		{
			logger.Trace (NL_Error,"Error: Root object can not have sibling nodes.\n");
		}
		else {
			MdlObject *sibling = load_object (obj.OffsetToSiblingObject,f, parent);

			if (sibling) {
				parent->childs.push_back (sibling);
				sibling->parent = parent;
			}
		}
	}

	if (obj.OffsetToChildObject)
	{
		MdlObject *ch = load_object (obj.OffsetToChildObject, f, n, r+1);
		if (ch) {
			n->childs.push_back (ch);
			ch->parent = n;
		}
	}

	fseek(f,org,SEEK_SET);
	return n;
}