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; }
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; }