Make environment database parser generic
data: Properly handle raw data types

I initially thought these were a list of _R_emoved items, but after
examining some of the other databases it is clear they are just store
arbitrary binary data.

Encode these into hexadecimal in JSON.
Add script to generate height map
Add script to help analyse unknown data in different formats

Give it a struct format string. Starting with floats seems to work well
- numbers in the range [0.0, 8192.0) may be map coordinates,
infinitesimally small numbers are probably not floats.
Highlight parts of the map below 187 units

So that's what the black ink spots on the game map are!
rs5-extractor: Add list option
rs5-extractor: Add option to extract specific files

Also now use -f to specify RS5 archive
Add options to strip headers & overwrite files
fixup for option to extract specific files
Add option to list all chunks within files
rs5-extractor.py: Make usage more like tar
Rename rs5.py -> rs5file.py
OOify the RSFile & chunk decoder
Convert rs5-extractor to use new OO Rs5File types
Fix a bunch of issues with Rs5ChunkedFile
Make environment.py & data.py use OO Rs5File
Add DDS file decoder

This is rather slow and not likely to get much faster. It also only
supports one pretty specific type of DDS file. For working with these
files you are probably better off using nVidia's DDS utilities.

This gives me a way to access images directly though, which is useful
for some of the mapping scripts.

The alternative implementations I looked at either didn't seem to
support DXT5, or failed to supply a pre-compiled DLL and stable Python
bindings (I don't mind telling any Windows users to install Python +
PIL, but I don't think it would be smart to ask them to install MSVC and
build some random library after patching it so it will even compile...).
Plus, I learnt a bit more by writing this myself.
Add --add and --repack options

--add allows additional files to be added to an existing archive, or for
files within an archive to be updated. It is currently extremely
wasteful as the new/updated files are just appended to the end of the
archive along with a new copy of the central directory. There is no
attempt to reclaim the space taken by the old copy of the file at all.

--repack is originally for testing - to confirm my theory that the
random garbage in the central directory is just that - random stack
garbage.  It can be used to defragment an existing archive by writing a
new archive with no gaps, which is useful to reclaim the space wasted by
--add, but enough free space must exist to fit a second copy of the
archive. Even just running it over main.rs5 that ships with Miasmata
will save about 45MB.
Add exposure_map.py script to decode the map in the saved.dat

Useful for tracking down which pixels are missing for the Bored
Cartographer achievement.
exposure_map.py: Display achievement progress