avp/src/win95/oechunk.cpp
2019-08-20 02:22:37 +02:00

158 lines
4.1 KiB
C++

#include "oechunk.h"
#include "chunk.hpp"
//macro for helping to force inclusion of chunks when using libraries
FORCE_CHUNK_INCLUDE_IMPLEMENT(oechunk)
extern Chunk *Parent_File;
RIF_IMPLEMENT_DYNCREATE("MAPBLOCK",Map_Block_Chunk)
Map_Block_Chunk::Map_Block_Chunk(Chunk_With_Children * parent,const char* data,size_t)
:Chunk(parent,"MAPBLOCK")
{
strncpy(map_data.TemplateName,data,20);
strncpy(map_data.TemplateNotes,data+20,100);
map_data.MapType=*((int*)(data+120));
map_data.MapShape=*((int*)(data+124));
map_data.MapFlags=*((int*)(data+128));
map_data.MapFlags2=*((int*)(data+132));
map_data.MapFlags3=*((int*)(data+136));
map_data.MapCType=*((int*)(data+140));
map_data.MapCGameType=*((int*)(data+144));
map_data.MapCStrategyS=*((int*)(data+148));
map_data.MapCStrategyL=*((int*)(data+152));
map_data.MapInteriorType=*((int*)(data+126));
map_data.MapLightType=*((int*)(data+160));
map_data.MapMass=*((int*)(data+164));
map_data.MapNewtonV.vx=*((int*)(data+168));
map_data.MapNewtonV.vy=*((int*)(data+172));
map_data.MapNewtonV.vz=*((int*)(data+176));
map_data.MapOrigin.vx=*((int*)(data+180));
map_data.MapOrigin.vy=*((int*)(data+184));
map_data.MapOrigin.vz=*((int*)(data+188));
map_data.MapViewType=*((int*)(data+192));
map_data.MapVDBData=*((int*)(data+196));
map_data.SimShapeList=*((int*)(data+200));
}
RIF_IMPLEMENT_DYNCREATE("STRATEGY",Strategy_Chunk)
Strategy_Chunk::Strategy_Chunk(Chunk_With_Children * parent,const char * data,size_t)
:Chunk(parent,"STRATEGY")
{
strncpy(strategy_data.StrategyName,data,20);
strncpy(strategy_data.StrategyNotes,data+20,100);
strategy_data.Strategy=*((int*)(data+120));
}
void Map_Block_Chunk::fill_data_block (char* data_start)
{
strncpy (data_start, identifier, 8);
data_start += 8;
*((int *) data_start) = chunk_size;
data_start += 4;
strncpy (data_start,map_data.TemplateName,20);
data_start+=20;
strncpy (data_start,map_data.TemplateNotes,100);
data_start+=100;
*((int*)data_start)=map_data.MapType;
data_start += 4;
*((int*)data_start)=map_data.MapShape;
data_start += 4;
*((int*)data_start)=map_data.MapFlags;
data_start += 4;
*((int*)data_start)=map_data.MapFlags2;
data_start += 4;
*((int*)data_start)=map_data.MapFlags3;
data_start += 4;
*((int*)data_start)=map_data.MapCType;
data_start += 4;
*((int*)data_start)=map_data.MapCGameType;
data_start += 4;
*((int*)data_start)=map_data.MapCStrategyS;
data_start+=4;
*((int*)data_start)=map_data.MapCStrategyL;;
data_start+=4;
*((int*)data_start)=map_data.MapInteriorType;
data_start+=4;
*((int*)data_start)=map_data.MapLightType;
data_start+=4;
*((int*)data_start)=map_data.MapMass;
data_start+=4;
*((int*)data_start)=map_data.MapNewtonV.vx;
data_start+=4;
*((int*)data_start)=map_data.MapNewtonV.vy;
data_start+=4;
*((int*)data_start)=map_data.MapNewtonV.vz;
data_start+=4;
*((int*)data_start)=map_data.MapOrigin.vx;
data_start+=4;
*((int*)data_start)=map_data.MapOrigin.vy;
data_start+=4;
*((int*)data_start)=map_data.MapOrigin.vz;
data_start+=4;
*((int*)data_start)=map_data.MapViewType;
data_start+=4;
*((int*)data_start)=map_data.MapVDBData;
data_start+=4;
*((int*)data_start)=map_data.SimShapeList;
}
void Strategy_Chunk::fill_data_block(char* data_start)
{
strncpy (data_start, identifier, 8);
data_start += 8;
*((int *) data_start) = chunk_size;
data_start += 4;
strncpy (data_start,strategy_data.StrategyName,20);
data_start+=20;
strncpy (data_start,strategy_data.StrategyNotes,100);
data_start+=100;
*((int*)data_start)=strategy_data.Strategy;
}
BOOL Map_Block_Chunk::output_chunk(HANDLE &hand)
{
unsigned long junk;
BOOL ok;
char * data_block;
data_block = this->make_data_block_from_chunk();
ok = WriteFile (hand, (long *) data_block, (unsigned long) chunk_size, &junk, 0);
delete [] data_block;
if (!ok) return FALSE;
return TRUE;
}
BOOL Strategy_Chunk::output_chunk(HANDLE &hand)
{
unsigned long junk;
BOOL ok;
char * data_block;
data_block = this->make_data_block_from_chunk();
ok = WriteFile (hand, (long *) data_block, (unsigned long) chunk_size, &junk, 0);
delete [] data_block;
if (!ok) return FALSE;
return TRUE;
}