summaryrefslogtreecommitdiff
path: root/3dc/win95/fragchnk.cpp
diff options
context:
space:
mode:
Diffstat (limited to '3dc/win95/fragchnk.cpp')
-rw-r--r--3dc/win95/fragchnk.cpp255
1 files changed, 255 insertions, 0 deletions
diff --git a/3dc/win95/fragchnk.cpp b/3dc/win95/fragchnk.cpp
new file mode 100644
index 0000000..dc998d7
--- /dev/null
+++ b/3dc/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;
+}
+