# Parse command line arguments if(ARGV.size != 2) print "Converts a DragonSpeak Binary file back into text.\n" print "Revision 2, 2004-09-13, by Tafyrn\n\n" print "Usage: ruby dsbconverter dslist.ini default.dsb > default.ds\n" print " Where the dslist.ini file can be found in your furcadia folder.\n" exit else dsdFileName = ARGV[0] dsbFileName = ARGV[1] end # Create a new method to convert # the numeric values. class String def as_UINT16 lsbNum = self[0] msbNum = self[1] value = msbNum * 256 + lsbNum return value end end # Parse the DS Dictionary dsDict = File.open(dsdFileName, "rb") dictionaryHash = Hash.new while(dsDict.eof? == false) print "Loading DS Dictionary file '", dsdFileName, "'...\n" # Parse lines dsDict.each do |line| if(line[3] == ?:) line = line.slice(2, line.length) trigger = line.slice!(0, line.index(" ")) line.squeeze!(" \t") line = line.slice(2, line.length - 4) line = line.slice(0, line.index("\"")) # Add to hash dictionaryHash[trigger] = line end end end dsDict.close # Open the file dsbFile = File.open(dsbFileName, "rb") magicNum = dsbFile.read(4) if(magicNum == 'DSB1') print "Analyzing Furcadia DSB file '", dsbFileName, "'...\n" print "--------------------------------------------\n" # Skip the ignore section dsbFile.read(17) while(dsbFile.eof? == false) dsMajor = dsbFile.read(2) dsMinor = dsbFile.read(2) # Put a line between causes if(dsMajor.as_UINT16 == 0) print "\n" end # Print the DS command trigger = dsMajor.as_UINT16, ":", dsMinor.as_UINT16 trigger = trigger.join dsline = " " * dsMajor.as_UINT16, "(", trigger, ") ", dictionaryHash[trigger], "\n" dsline = dsline.join.sub("...", "#") dsarray = dsline.split("#") finalarray = Array.new # Insert the parameters into the array. for i in 1..8 param = dsbFile.read(2) if(dsarray.length > 1) finalarray = finalarray << dsarray.delete_at(0) finalarray = finalarray << param.as_UINT16 end end finalarray = finalarray << dsarray.delete_at(0) print finalarray.join("") end print "--------------------------------------------\n" print "End of DSB.\n" dsbFile.close else print "The file '", dsbFileName, "' does not appear to be a valid Furcadia DSB File.\n" end