LevelLoader - Added an if check to se if it found the map file.

This commit is contained in:
Pontus Fransson 2014-02-19 09:39:19 +01:00
parent ca2695293f
commit 6e80c1c603
1 changed files with 148 additions and 145 deletions

View File

@ -33,184 +33,187 @@ std::vector<SmartPointer<ObjectTypeHeader>> LevelParser::Parse(std::string filen
Loader loader; Loader loader;
char* buffer = (char*)loader.LoadFile(filename.c_str(), bufferSize); char* buffer = (char*)loader.LoadFile(filename.c_str(), bufferSize);
//Read format version if(buffer)
LevelLoaderInternal::FormatVersion levelFormatVersion;
ParseObject(&buffer[counter], &levelFormatVersion, sizeof(levelFormatVersion));
counter += sizeof(levelFormatVersion);
if(this->formatVersion != levelFormatVersion)
{ {
//Returns an empty vector, because it will most likely fail to read the level format. //Read format version
return objects; LevelLoaderInternal::FormatVersion levelFormatVersion;
} ParseObject(&buffer[counter], &levelFormatVersion, sizeof(levelFormatVersion));
counter += sizeof(levelFormatVersion);
while(counter < bufferSize) if(this->formatVersion != levelFormatVersion)
{
loadCgf = true;
//Get typeID
ObjectType typeID;
ParseObject(&buffer[counter], &typeID, sizeof(typeID));
switch((int)typeID)
{ {
case ObjectType_LevelMetaData: //Returns an empty vector, because it will most likely fail to read the level format.
return objects;
}
while(counter < bufferSize)
{
loadCgf = true;
//Get typeID
ObjectType typeID;
ParseObject(&buffer[counter], &typeID, sizeof(typeID));
switch((int)typeID)
{ {
SmartPointer<ObjectTypeHeader> header = new LevelMetaData; case ObjectType_LevelMetaData:
ParseLevelMetaData(&buffer[counter], *(LevelMetaData*)header.Get(), counter);
objects.push_back(header);
break;
}
case ObjectType_SpawnPoint:
{
loadCgf = false;
ObjectHeader* header = new ObjectHeader;
ParseObject(&buffer[counter], *header, counter, loadCgf);
SpawnPointAttributes* spawn = new SpawnPointAttributes;
spawn->typeID = header->typeID;
for(int i = 0; i < 3; i++)
{ {
spawn->position[i] = header->position[i]; SmartPointer<ObjectTypeHeader> header = new LevelMetaData;
ParseLevelMetaData(&buffer[counter], *(LevelMetaData*)header.Get(), counter);
objects.push_back(header);
break;
} }
delete header; case ObjectType_SpawnPoint:
//objects.push_back(header);
objects.push_back(spawn);
break;
}
//This is by design, static and dynamic is using the same converter. Do not add anything inbetween them.
//Unless they are changed to not be the same.
case ObjectType_Static: case ObjectType_Dynamic:
{
//Get specialType.
ObjectSpecialType specialType;
ParseObject(&buffer[counter+4], &specialType, sizeof(typeID));
switch(specialType)
{ {
//there is no difference when parsing these specialTypes. loadCgf = false;
case ObjectSpecialType_CrystalShard: ObjectHeader* header = new ObjectHeader;
case ObjectSpecialType_CrystalFormation: ParseObject(&buffer[counter], *header, counter, loadCgf);
case ObjectSpecialType_Spike:
case ObjectSpecialType_SpikeBox:
case ObjectSpecialType_RedExplosiveBox:
case ObjectSpecialType_StandarsBox:
case ObjectSpecialType_Stone:
case ObjectSpecialType_Building:
{
ObjectHeader* header = new ObjectHeader;
ParseObject(&buffer[counter], *header, counter, loadCgf);
objects.push_back(header);
break; SpawnPointAttributes* spawn = new SpawnPointAttributes;
spawn->typeID = header->typeID;
for(int i = 0; i < 3; i++)
{
spawn->position[i] = header->position[i];
} }
case ObjectSpecialType_JumpPad: delete header;
//objects.push_back(header);
objects.push_back(spawn);
break;
}
//This is by design, static and dynamic is using the same converter. Do not add anything inbetween them.
//Unless they are changed to not be the same.
case ObjectType_Static: case ObjectType_Dynamic:
{
//Get specialType.
ObjectSpecialType specialType;
ParseObject(&buffer[counter+4], &specialType, sizeof(typeID));
switch(specialType)
{ {
JumpPadAttributes* header = new JumpPadAttributes; //there is no difference when parsing these specialTypes.
ParseObject(&buffer[counter], *header, counter, loadCgf); case ObjectSpecialType_CrystalShard:
case ObjectSpecialType_CrystalFormation:
case ObjectSpecialType_Spike:
case ObjectSpecialType_SpikeBox:
case ObjectSpecialType_RedExplosiveBox:
case ObjectSpecialType_StandarsBox:
case ObjectSpecialType_Stone:
case ObjectSpecialType_Building:
{
ObjectHeader* header = new ObjectHeader;
ParseObject(&buffer[counter], *header, counter, loadCgf);
objects.push_back(header);
//Read the spec break;
ParseObject(&buffer[counter], header->direction, 16); }
counter += 16;
objects.push_back(header);
break; case ObjectSpecialType_JumpPad:
} {
JumpPadAttributes* header = new JumpPadAttributes;
ParseObject(&buffer[counter], *header, counter, loadCgf);
//Read the spec
ParseObject(&buffer[counter], header->direction, 16);
counter += 16;
objects.push_back(header);
break;
}
case ObjectSpecialType_Portal: case ObjectSpecialType_Portal:
{ {
PortalAttributes* header = new PortalAttributes; PortalAttributes* header = new PortalAttributes;
ParseObject(&buffer[counter], *header, counter, loadCgf); ParseObject(&buffer[counter], *header, counter, loadCgf);
ParseObject(&buffer[counter], header->destination, 12); ParseObject(&buffer[counter], header->destination, 12);
counter += 12; counter += 12;
objects.push_back(header); objects.push_back(header);
break; break;
} }
case ObjectSpecialType_World: case ObjectSpecialType_World:
{ {
WorldAttributes* header = new WorldAttributes; WorldAttributes* header = new WorldAttributes;
ParseObject(&buffer[counter], *header, counter, loadCgf); ParseObject(&buffer[counter], *header, counter, loadCgf);
ParseObject(&buffer[counter], &header->worldSize, 8); ParseObject(&buffer[counter], &header->worldSize, 8);
counter += 8; counter += 8;
objects.push_back(header); objects.push_back(header);
break; break;
} }
case ObjectSpecialType_Sky: case ObjectSpecialType_Sky:
{ {
loadCgf = false; loadCgf = false;
SkyAttributes* header = new SkyAttributes; SkyAttributes* header = new SkyAttributes;
ParseObject(&buffer[counter], *header, counter, loadCgf); ParseObject(&buffer[counter], *header, counter, loadCgf);
ParseObject(&buffer[counter], &header->skySize, 4); ParseObject(&buffer[counter], &header->skySize, 4);
counter += 4; counter += 4;
objects.push_back(header); objects.push_back(header);
break; break;
} }
//this is a hotfix, fix so you only load the relevant data when the file is updated //this is a hotfix, fix so you only load the relevant data when the file is updated
default: default:
//Couldn't find specialType //Couldn't find specialType
break; break;
}
break;
} }
break;
}
case ObjectType_Light: case ObjectType_Light:
{ {
LightType lightType; LightType lightType;
//Get Light type //Get Light type
ParseObject(&buffer[counter+4], &lightType, sizeof(lightType)); ParseObject(&buffer[counter+4], &lightType, sizeof(lightType));
//We only support PointLight for now. //We only support PointLight for now.
BasicLight* header = new BasicLight; BasicLight* header = new BasicLight;
ParseObject(&buffer[counter], header, sizeof(*header));
counter += sizeof(*header);
objects.push_back(header);
/*switch(lightType)
{
case LightType_PointLight:
{
PointLight* header = new PointLight;
ParseObject(&buffer[counter], header, sizeof(*header)); ParseObject(&buffer[counter], header, sizeof(*header));
counter += sizeof(*header); counter += sizeof(*header);
objects.push_back(header); objects.push_back(header);
break; /*switch(lightType)
} {
case LightType_DirectionalLight: case LightType_PointLight:
{ {
DirectionalLight* header = new DirectionalLight; PointLight* header = new PointLight;
ParseObject(&buffer[counter], header, sizeof(*header)); ParseObject(&buffer[counter], header, sizeof(*header));
counter += sizeof(*header); counter += sizeof(*header);
objects.push_back(header); objects.push_back(header);
break; break;
} }
case LightType_SpotLight: case LightType_DirectionalLight:
{ {
SpotLight* header = new SpotLight; DirectionalLight* header = new DirectionalLight;
ParseObject(&buffer[counter], header, sizeof(*header)); ParseObject(&buffer[counter], header, sizeof(*header));
counter += sizeof(*header); counter += sizeof(*header);
objects.push_back(header); objects.push_back(header);
break; break;
}
case LightType_SpotLight:
{
SpotLight* header = new SpotLight;
ParseObject(&buffer[counter], header, sizeof(*header));
counter += sizeof(*header);
objects.push_back(header);
break;
}
default:
//Undefined LightType.
break;
}
break;*/
} }
default: default:
//Undefined LightType. //Couldn't find typeID. FAIL!!!!!!
break; break;
}
break;*/
} }
default:
//Couldn't find typeID. FAIL!!!!!!
break;
} }
} }