diff options
| author | Steven Fuller <relnev@icculus.org> | 2001-07-01 00:55:22 +0000 |
|---|---|---|
| committer | Patryk Obara <dreamer.tan@gmail.com> | 2019-08-20 02:09:04 +0200 |
| commit | 2186d5f3f95cd74a070a490d899291648d58667a (patch) | |
| tree | 55241a1afa3e1a22e0b6593a8dead0b703800f44 /src/win95/fragchnk.cpp | |
| parent | 218ca90543758a20ac326e444ca0643174ca7384 (diff) | |
Initial revision
Diffstat (limited to 'src/win95/fragchnk.cpp')
| -rw-r--r-- | src/win95/fragchnk.cpp | 255 |
1 files changed, 255 insertions, 0 deletions
diff --git a/src/win95/fragchnk.cpp b/src/win95/fragchnk.cpp new file mode 100644 index 0000000..dc998d7 --- /dev/null +++ b/src/win95/fragchnk.cpp @@ -0,0 +1,255 @@ +#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; +} + |
