UNIT Unit4_Exporters;
INTERFACE
USES Classes, Dialogs, StrUtils, SysUtils, Math, Unit3_data, Unit6_imgfuncs;

PROCEDURE ExportDatFile(fileid:LongWord; filename:String);

FUNCTION ExportSNDD(fileid:LongWord; filename:String; convert:Boolean):Integer;
FUNCTION ExportTRAC(fileid:LongWord; filename:String; convert:Boolean):Integer;
FUNCTION ExportTXAN(fileid:LongWord; filename:String; convert:Boolean):Integer;
FUNCTION ExportTXMB(fileid:LongWord; filename:String; convert:Boolean):Integer;
FUNCTION ExportTXMP(fileid:LongWord; filename:String; convert:Boolean):Integer;
VAR
  ExportHandlers:Array[1..1] OF TExportHandlers=(
//    (Ext:'ABNA'; needed:False),
    //(Ext:'AGDB'; needed:False),
    (Ext:'SNDD'; needed:True; Handler:ExportSNDD)
{    (Ext:'TRAC'; needed:True; Handler:ExportTRAC),
    (Ext:'TXAN'; needed:True; Handler:ExportTXAN),
    (Ext:'TXMB'; needed:True; Handler:ExportTXMB),
    (Ext:'TXMP'; needed:True; Handler:ExportTXMP)
}  );



IMPLEMENTATION
USES Unit2_functions;

PROCEDURE ExportDatFile(fileid:LongWord; filename:String);
  VAR
    filestream:TFileStream;
    data:Tdata;
  BEGIN
    data:=LoadDatFile(fileid);
    filestream:=TFileStream.Create(filename,fmCreate);
    filestream.Write(data[0],Length(data));
    filestream.Free;
  END;

FUNCTION ExportSNDD;
  TYPE
    TDatData=RECORD
      _fileid:LongWord;
      level:LongWord;
      Flag:LongWord;
      ChanNo:LongWord;
      SampleRate:LongWord;
      BytesPSec:LongWord;
      BPSample:LongWord;
      BitsPS:LongWord;
      Unknown:Array[1..7] OF LongWord;
      Unknown2:Word;
      RawSize:LongWord;
      RawPos:LongWord;
    END;
  VAR
  	filestream:TFileStream;

    DatData:TDatData;
  	//Wave Header Stuff
	  ASCII_Group:LongWord; //RIFF
  	WAV_Len:LongWord;
	  ASCII_WAV:LongWord; //WAVE
  	ASCII_FMT:LongWord; //"fmt "
	  WAV_FMT_Len:LongWord;
  	ASCII_DATA:LongWord; //DATA
	  WAV_FolLen:LongWord;

  	data:Tdata;
  BEGIN
	  Result:=export_noerror;
    LoadDatFilePart(fileid,0,SizeOf(DatData),@DatData);
    WITH DatData DO BEGIN
    	//Initializing Header vars
	    ASCII_Group:=1179011410;
  	  WAV_Len:=RAWSize+70;
  	  ASCII_WAV:=1163280727;
    	ASCII_FMT:=544501094;
	    WAV_FMT_Len:=50;
    	ASCII_DATA:=1635017060;
	    WAV_FolLen:=RAWSize;
  	  SetLength(data,RAWSize);
  	  LoadRawFile(fileid,68,Length(data),data);

      filestream:=TFileStream.Create(filename+'.raw',fmCreate);
      filestream.Write(data[0],Length(data));
      filestream.Free;

      IF convert THEN BEGIN
      	//Now start packing this into a neat wave...
        filestream:=TFileStream.Create(filename+'.wav',fmCreate);
    	  filestream.Write(ASCII_Group,SizeOf(ASCII_Group));
  	    filestream.Write(WAV_Len,SizeOf(WAV_Len));
    	  filestream.Write(ASCII_WAV,SizeOf(ASCII_WAV));
  	    filestream.Write(ASCII_FMT,SizeOf(ASCII_FMT));
    	  filestream.Write(WAV_FMT_Len,SizeOf(WAV_FMT_Len));
  	    filestream.Write(ChanNo,SizeOf(ChanNo));
      	filestream.Write(Samplerate,SizeOf(Samplerate));
	      filestream.Write(BytesPSec,SizeOf(BytesPSec));
  	    filestream.Write(BPSample,SizeOf(BPSample));
    	  filestream.Write(BitsPS,SizeOf(BitsPS));
      	filestream.Write(Unknown[1],SizeOf(Unknown));
      	filestream.Write(Unknown2,SizeOf(Unknown2));
      	filestream.Write(ASCII_DATA,SizeOf(ASCII_DATA));
	      filestream.Write(WAV_FolLen,SizeOf(WAV_FolLen));
    	  filestream.Write(data[0],Length(data));
  	    filestream.Free;
      END;
    END;
  END;

FUNCTION ExportTRAC;
  VAR
    link:LongWord;
    linkcount:Word;
    i:LongWord;
  BEGIN
    Result:=export_noerror;

    LoadDatFilePart(fileid,$18,SizeOf(link),@link);
    link:=link DIV 256;

    LoadDatFilePart(fileid,$1E,SizeOf(linkcount),@linkcount);
    FOR i:=1 TO linkcount DO BEGIN
      LoadDatFilePart(fileid,$20+(i-1)*12+8,SizeOf(link),@link);
      link:=link DIV 256;
    END;
  END;

FUNCTION ExportTXAN;
  VAR
    loop_speed,unknown:Word;
    linkcount:LongWord;
    link:LongWord;
    i:Byte;
  BEGIN
    Result:=export_noerror;

    LoadDatFilePart(fileid,$14,SizeOf(loop_speed),@loop_speed);
    LoadDatFilePart(fileid,$16,SizeOf(unknown),@unknown);

    LoadDatFilePart(fileid,$1C,SizeOf(linkcount),@linkcount);
    FOR i:=0 TO linkcount-1 DO BEGIN
      LoadDatFilePart(fileid,$20+i*4,SizeOf(link),@link);
      link:=link DIV 256;
      IF link=0 THEN link:=fileid-1;
    END;
  END;

FUNCTION ExportTXMB;
  VAR
    filestream:TFileStream;
    img:TImgPackage;
    data:Tdata;
  BEGIN
    Result:=export_noerror;
    IF convert THEN BEGIN
      img:=LoadTXMBconnected(fileid);
      data:=ImgdataToBmp(img.imgx,img.imgy,img.imgdepth,img.storetype,img.imgdata);
      filestream:=TFileStream.Create(filename+'.bmp',fmCreate);
      filestream.Write(data[0],Length(data));
      filestream.Free;
    END;
  END;

FUNCTION ExportTXMP;
  VAR
    filestream:TFileStream;
    img:TImgPackage;
  BEGIN
    Result:=export_noerror;
    img:=LoadImgData(fileid);

    filestream:=TFileStream.Create(filename+'.raw',fmCreate);
    filestream.Write(img.imgdata[0],Length(img.imgdata));
    filestream.Free;

    IF convert THEN BEGIN
      img.imgdata:=ImgdataToBMP(img.imgx,img.imgy,img.imgdepth,img.storetype,img.imgdata);
      filestream:=TFileStream.Create(filename+'.bmp',fmCreate);
      filestream.Write(img.imgdata[0],Length(img.imgdata));
      filestream.Free;
    END;
  END;

END.
