avp/src/win95/fragchnk.cpp

256 lines
5.3 KiB
C++
Raw Normal View History

#include "fragchnk.hpp"
//macro for helping to force inclusion of chunks when using libraries
FORCE_CHUNK_INCLUDE_IMPLEMENT(fragchnk)
RIF_IMPLEMENT_DYNCREATE("FRAGTYPE",Fragment_Type_Chunk)
CHUNK_WITH_CHILDREN_LOADER("FRAGTYPE",Fragment_Type_Chunk)
/*
Children for Fragment_Type_Chunk :
Fragment_Type_Data_Chunk "FRGTYPDC"
Fragment_Type_Shape_Chunk "FRGTYPSC"
Fragment_Type_Sound_Chunk "FRGSOUND"
*/
const char* Fragment_Type_Chunk::get_name()
{
Fragment_Type_Data_Chunk* ftdc=(Fragment_Type_Data_Chunk*)lookup_single_child("FRGTYPDC");
if(ftdc)
return ftdc->frag_type_name;
else
return 0;
}
////////////////////////////////////////////////////////////////////////
RIF_IMPLEMENT_DYNCREATE("FRGTYPDC",Fragment_Type_Data_Chunk)
Fragment_Type_Data_Chunk::Fragment_Type_Data_Chunk(Chunk_With_Children* parent,const char* name)
:Chunk(parent,"FRGTYPDC")
{
frag_type_name=new char[strlen(name)+1];
strcpy(frag_type_name,name);
pad1=pad2=pad3=0;
}
Fragment_Type_Data_Chunk::Fragment_Type_Data_Chunk(Chunk_With_Children* const parent,const char* data,size_t const )
:Chunk(parent,"FRGTYPDC")
{
int length=strlen(data)+1;
frag_type_name=new char[length];
strcpy(frag_type_name,data);
data+=(length+3)&~3;
pad1=*(int*)data;
data+=4;
pad2=*(int*)data;
data+=4;
pad3=*(int*)data;
data+=4;
}
Fragment_Type_Data_Chunk::~Fragment_Type_Data_Chunk()
{
if(frag_type_name) delete frag_type_name;
}
void Fragment_Type_Data_Chunk::fill_data_block(char* data_start)
{
strncpy (data_start, identifier, 8);
data_start += 8;
*((int *) data_start) = chunk_size;
data_start += 4;
strcpy(data_start,frag_type_name);
data_start+=(strlen(frag_type_name)+4)&~3;
*(int*)data_start=pad1;
data_start+=4;
*(int*)data_start=pad2;
data_start+=4;
*(int*)data_start=pad3;
data_start+=4;
}
size_t Fragment_Type_Data_Chunk::size_chunk()
{
chunk_size=12+12;
chunk_size+=(strlen(frag_type_name)+4)&~3;
return chunk_size;
}
////////////////////////////////////////////////////////////////////////
RIF_IMPLEMENT_DYNCREATE("FRGTYPSC",Fragment_Type_Shape_Chunk)
Fragment_Type_Shape_Chunk::Fragment_Type_Shape_Chunk(Chunk_With_Children* parent,const char* _name,int number,ChunkVectorInt _location)
:Chunk(parent,"FRGTYPSC")
{
name=new char[strlen(_name)+1];
strcpy(name,_name);
num_fragments=number;
location=_location;
pad1=pad2=pad3=0;
}
#if UseOldChunkLoader
Fragment_Type_Shape_Chunk::Fragment_Type_Shape_Chunk(Chunk_With_Children* const parent,const char* data,size_t const )
:Chunk(parent,"FRGTYPSC")
{
int length=strlen(data)+1;
name=new char[length];
strcpy(name,data);
data+=(length+3)&~3;
num_fragments=*(int*)data;
data+=4;
location=*(ChunkVector*)data;
data+=sizeof(ChunkVector);
pad1=*(int*)data;
data+=4;
pad2=*(int*)data;
data+=4;
pad3=*(int*)data;
data+=4;
};
#else
Fragment_Type_Shape_Chunk::Fragment_Type_Shape_Chunk(Chunk_With_Children* const parent,const char* data,size_t const )
:Chunk(parent,"FRGTYPSC")
{
int length=strlen(data)+1;
name=new char[length];
strcpy(name,data);
data+=(length+3)&~3;
num_fragments=*(int*)data;
data+=4;
location=*(ChunkVectorInt*)data;
data+=sizeof(ChunkVectorInt);
pad1=*(int*)data;
data+=4;
pad2=*(int*)data;
data+=4;
pad3=*(int*)data;
data+=4;
}
#endif
Fragment_Type_Shape_Chunk::~Fragment_Type_Shape_Chunk()
{
if(name) delete name;
}
void Fragment_Type_Shape_Chunk::fill_data_block(char* data_start)
{
strncpy (data_start, identifier, 8);
data_start += 8;
*((int *) data_start) = chunk_size;
data_start += 4;
strcpy(data_start,name);
data_start+=(strlen(name)+4)&~3;
*(int*)data_start=num_fragments;
data_start+=4;
*(ChunkVectorInt*)data_start=location;
data_start+=sizeof(ChunkVectorInt);
*(int*)data_start=pad1;
data_start+=4;
*(int*)data_start=pad2;
data_start+=4;
*(int*)data_start=pad3;
data_start+=4;
}
size_t Fragment_Type_Shape_Chunk::size_chunk()
{
chunk_size=12+16+sizeof(ChunkVectorInt);
chunk_size+=(strlen(name)+4)&~3;
return chunk_size;
}
////////////////////////////////////////////////////////////////////////
RIF_IMPLEMENT_DYNCREATE("FRGSOUND",Fragment_Type_Sound_Chunk)
Fragment_Type_Sound_Chunk::Fragment_Type_Sound_Chunk(Chunk_With_Children* parent)
:Chunk(parent,"FRGSOUND")
{
wav_name=0;
inner_range=5000;
outer_range=40000;
max_volume=127;
pitch=0;
pad=0;
}
Fragment_Type_Sound_Chunk::Fragment_Type_Sound_Chunk(Chunk_With_Children* const parent,const char* data,size_t const )
:Chunk(parent,"FRGSOUND")
{
inner_range=*(unsigned long*)data;
data+=4;
outer_range=*(unsigned long*)data;
data+=4;
max_volume=*(int*)data;
data+=4;
pitch=*(int*)data;
data+=4;
pad=*(int*)data;
data+=4;
wav_name=new char[strlen(data)+1];
strcpy(wav_name,data);
}
Fragment_Type_Sound_Chunk::~Fragment_Type_Sound_Chunk()
{
if(wav_name) delete wav_name;
}
void Fragment_Type_Sound_Chunk::fill_data_block(char* data_start)
{
strncpy (data_start, identifier, 8);
data_start += 8;
*((int *) data_start) = chunk_size;
data_start += 4;
*(unsigned long*)data_start=inner_range;
data_start+=4;
*(unsigned long*)data_start=outer_range;
data_start+=4;
*(int*)data_start=max_volume;
data_start+=4;
*(int*)data_start=pitch;
data_start+=4;
*(int*)data_start=pad;
data_start+=4;
strcpy(data_start,wav_name);
}
size_t Fragment_Type_Sound_Chunk::size_chunk()
{
chunk_size=12+20;
chunk_size+=(strlen(wav_name)+4)&~3;
return chunk_size;
}