int WMPImporter::GetStoredFileSize(WorldMapArray *wmap, unsigned int index) { assert(!index || !wmap->IsSingle()); int headersize = 16; int WorldMapsOffset; WorldMapsCount = wmap->GetMapCount(); if (index>WorldMapsCount || index>1) return 0; WorldMapsOffset = headersize; if (index) { WorldMapsCount2 = 0; } else { WorldMapsCount1 = 0; } for (unsigned int i=index;i<WorldMapsCount; i++) { if (index) { WorldMapsCount2++; } else { WorldMapsCount1++; } headersize += 184; WorldMap *map = wmap->GetWorldMap(i); //Update the links and entries counts now, in case the worldmap has changed map->AreaEntriesCount = map->GetEntryCount(); headersize += map->AreaEntriesCount * 240; map->AreaLinksCount = map->GetLinkCount(); headersize += map->AreaLinksCount * 216; //put the first array into the first map //the rest into the second map if not single if (!wmap->IsSingle() && !index) { break; } } if (index) { WorldMapsOffset2 = WorldMapsOffset; } else { WorldMapsOffset1 = WorldMapsOffset; } return headersize; }
int WMPImporter::PutMap(DataStream *stream, WorldMapArray *wmap, unsigned int index) { unsigned int i; unsigned int WorldMapsOffset; unsigned int count; int ret; char filling[128]; assert(!index || !wmap->IsSingle()); if (index) { WorldMapsOffset = WorldMapsOffset2; count = WorldMapsCount2; } else { WorldMapsOffset = WorldMapsOffset1; count = WorldMapsCount1; } memset (filling,0,sizeof(filling)); ieDword AreaEntriesOffset = WorldMapsOffset + count * 184; ieDword AreaLinksOffset = AreaEntriesOffset; for (i=index;i<WorldMapsCount; i++) { WorldMap *map = wmap->GetWorldMap(i); AreaLinksOffset += map->GetEntryCount() * 240; if (!wmap->IsSingle() && !index) { break; } } //map headers for (i=index;i<WorldMapsCount; i++) { ieDword AreaEntriesCount, AreaLinksCount; WorldMap *map = wmap->GetWorldMap(i); AreaLinksCount = map->GetLinkCount(); AreaEntriesCount = map->GetEntryCount(); stream->WriteResRef( map->MapResRef ); stream->WriteDword( &map->Width ); stream->WriteDword( &map->Height ); stream->WriteDword( &map->MapNumber ); stream->WriteDword( &map->AreaName ); stream->WriteDword( &map->unknown1 ); stream->WriteDword( &map->unknown2 ); //??? stream->WriteDword( &AreaEntriesCount ); stream->WriteDword( &AreaEntriesOffset ); stream->WriteDword( &AreaLinksOffset ); stream->WriteDword( &AreaLinksCount ); stream->WriteResRef( map->MapIconResRef ); AreaEntriesOffset += AreaEntriesCount * 240; AreaLinksOffset += AreaLinksCount * 216; stream->Write( filling, 128); if (!wmap->IsSingle() && !index) { break; } } //area entries for (i=index;i<WorldMapsCount; i++) { WorldMap *map = wmap->GetWorldMap(i); ret = PutAreas( stream, map); if (ret) { return ret; } if (!wmap->IsSingle() && !index) { break; } } //links for (i=index;i<WorldMapsCount; i++) { WorldMap *map = wmap->GetWorldMap(i); ret = PutLinks( stream, map); if (ret) { return ret; } if (!wmap->IsSingle() && !index) { break; } } return 0; }