Dune data files description

Liste of files in floppy version

31/03/2008  19:12              .
31/03/2008  19:12              ..
07/03/1992  22:52             9.027 ARRAKIS.AGD
14/02/1992  22:33             8.998 ARRAKIS.HSQ
20/03/1992  14:00            12.210 ARRAKIS.M32
14/01/1992  16:17             5.761 ATTACK.HSQ
02/04/1992  15:16            20.172 BACK.HSQ
07/03/1992  22:52             5.553 BAGDAD.AGD
29/05/1991  17:29             5.523 BAGDAD.HSQ
20/03/1992  14:01             7.522 BAGDAD.M32
14/01/1992  15:41            16.809 BALCON.HSQ
22/12/1991  02:48            14.103 BARO.HSQ
16/02/1992  00:59            29.142 BOOK.HSQ
02/11/1991  20:08            18.618 BOTA.HSQ
28/10/1991  18:43            14.502 BUNK.HSQ
02/04/1992  15:54             8.670 CHAN.HSQ
31/10/1991  20:29             3.244 CHANKISS.HSQ
13/01/1992  02:26            10.824 COMM.HSQ
08/04/1992  00:28             4.525 COMMAND1.HSQ
04/04/1992  04:11             4.587 COMMAND2.HSQ
07/04/1992  01:11             4.656 COMMAND3.HSQ
07/04/1992  01:57             5.550 CONDIT.HSQ
28/12/1991  20:15            10.524 CORR.HSQ
06/04/1992  19:23            12.763 CREDITS.HSQ
06/04/1992  02:41             7.829 CRYO.HSQ
05/01/1992  23:21            45.408 DEATH1.HSQ
05/01/1992  23:21            44.024 DEATH2.HSQ
05/01/1992  23:21            42.098 DEATH3.HSQ
07/04/1992  01:57             4.222 DIALOGUE.HSQ
13/05/2000  21:49                50 DUNE.BAT
06/04/2008  22:19             9.565 DUNE21S0.SAV
06/04/2008  16:58            13.416 DUNE21S1.SAV
14/04/1998  19:45            13.601 DUNE21S2.SAV
06/04/2008  20:01             9.610 DUNE21S3.SAV
05/04/2008  23:14             9.720 DUNE21S4.SAV
27/03/1992  01:30             9.479 DUNE386.HSQ
30/03/1992  01:22             1.760 DUNEADL.HSQ
09/04/1992  20:36             2.780 DUNEAGD.HSQ
04/04/1992  04:13               963 DUNECHAR.HSQ
30/03/1992  01:21               941 DUNEMID.HSQ
25/02/1992  02:13               704 DUNEPCS.HSQ
13/04/1992  12:14            74.341 DUNEPRG.EXE
12/11/1991  19:21            21.874 DUNES.HSQ
14/11/1991  19:15            14.068 DUNES2.HSQ
14/01/1992  18:35            18.866 DUNES3.HSQ
07/04/1992  20:07             3.174 DUNESDB.HSQ
27/03/1992  01:29             9.338 DUNEVGA.HSQ
13/04/1992  12:45             6.514 DUNEVRF.EXE
02/04/1992  16:03            10.113 EMPR.HSQ
07/12/1991  19:04             7.007 EQUI.HSQ
22/12/1991  02:48            15.683 FEYD.HSQ
18/01/1992  17:04            16.274 FINAL.HSQ
28/10/1991  17:30            24.607 FORT.HSQ
10/01/1992  16:39            14.284 FRESK.HSQ
02/04/1992  16:26            28.711 FRM1.HSQ
02/04/1992  16:26            24.080 FRM2.HSQ
02/04/1992  16:26            18.417 FRM3.HSQ
24/08/1991  18:32             4.009 GENERIC.HSQ
03/02/1991  14:46             4.741 GLOBDATA.HSQ
02/04/1992  15:50            10.002 GURN.HSQ
23/12/1991  19:48            10.858 HARA.HSQ
02/04/1992  16:04            12.324 HARK.HSQ
02/04/1992  04:59               447 HARK.SAL
02/04/1992  15:45            11.511 HAWA.HSQ
02/04/1992  04:39            14.995 ICONES.HSQ
29/10/1991  19:13             4.672 IDAH.HSQ
13/04/1992  12:14            10.552 INSTALL.EXE
10/10/1991  20:33            15.155 INTDS.HSQ
21/02/1992  20:33             9.472 JESS.HSQ
15/11/1991  12:15            21.411 KYNE.HSQ
02/04/1992  15:39             6.991 LETO.HSQ
06/04/1992  23:38             2.437 LOGO.EXE
06/04/1992  02:32            18.417 LOGO.HNM
21/09/1991  01:46            15.984 MAP.HSQ
19/09/1991  16:44             5.146 MAP2.HSQ
28/01/1992  20:45            12.246 MIRROR.HSQ
15/11/1991  15:27             8.700 MOIS.HSQ
07/03/1992  22:52             5.812 MORNING.AGD
03/07/1991  00:01             5.787 MORNING.HSQ
20/03/1992  23:51             4.950 MORNING.M32
17/02/1992  13:57            13.907 ONMAP.HSQ
14/12/1991  17:01             2.993 ORNY.HSQ
07/10/1991  18:45             2.369 ORNYCAB.HSQ
17/12/1991  20:49             3.718 ORNYPAN.HSQ
15/12/1991  03:50             9.311 ORNYTK.HSQ
05/03/1992  14:03               493 PALPLAN.HSQ
11/01/1992  18:19            11.907 PAUL.HSQ
13/08/1991  02:59            14.360 PERS.HSQ
08/04/1992  00:31            17.476 PHRASE11.HSQ
08/04/1992  00:31            14.888 PHRASE12.HSQ
07/04/1992  01:24            19.047 PHRASE21.HSQ
07/04/1992  01:24            16.338 PHRASE22.HSQ
07/04/1992  03:33            19.908 PHRASE31.HSQ
07/04/1992  03:33            16.354 PHRASE32.HSQ
29/03/1992  19:39            19.275 POR.HSQ
13/01/1992  02:26             9.525 PROUGE.HSQ
05/04/1992  06:03           130.328 PRT.HNM
18/02/1992  19:49            15.410 SD1.HSQ
18/02/1992  19:49            11.992 SD2.HSQ
18/02/1992  19:49            16.473 SD3.HSQ
20/02/1992  23:36             3.567 SD4.HSQ
04/04/1992  18:36            25.259 SD5.HSQ
02/04/1992  05:11            10.546 SD6.HSQ
02/04/1992  05:11            12.621 SD7.HSQ
02/04/1992  05:11            23.865 SD8.HSQ
19/02/1992  16:09             2.986 SD9.HSQ
19/02/1992  16:10            10.880 SDA.HSQ
06/04/1992  22:07            49.687 SDB.HSQ
08/03/1992  12:03            10.802 SEKENCE.AGD
19/05/1991  19:44            10.774 SEKENCE.HSQ
20/03/1992  14:01            13.892 SEKENCE.M32
21/09/1991  18:34            20.814 SERRE.HSQ
09/10/1991  17:13            43.574 SHAI.HSQ
09/10/1991  17:13            41.838 SHAI2.HSQ
02/11/1991  20:09             4.392 SIET.SAL
14/12/1991  18:42             5.468 SIET0.HSQ
05/08/1991  23:13            32.634 SIET1.HSQ
07/03/1992  22:43             7.507 SIETCHM.AGD
12/06/1991  16:30             7.477 SIETCHM.HSQ
20/03/1992  18:09             7.344 SIETCHM.M32
06/01/1992  19:47             8.609 SKY.HSQ
02/04/1992  16:06            11.118 SMUG.HSQ
29/03/1992  17:20            42.234 STARS.HSQ
02/04/1992  15:52            11.043 STIL.HSQ
11/12/1991  16:54             2.139 SUN.HSQ
19/08/1991  00:29            21.837 SUNRS.HSQ
03/02/1991  15:06               792 TABLAT.BIN
14/01/1992  18:29             5.010 VER.HSQ
02/04/1992  14:04               660 VERBIN.HSQ
20/12/1991  18:04            27.724 VILG.HSQ
20/12/1991  17:59             1.937 VILG.SAL
12/09/1991  19:22            22.125 VIS.HSQ
07/03/1992  22:53             2.946 WARSONG.AGD
28/02/1992  02:00             2.919 WARSONG.HSQ
20/03/1992  17:56             4.285 WARSONG.M32
07/03/1992  22:53             1.935 WATER.AGD
29/05/1991  17:29             1.905 WATER.HSQ
20/03/1992  14:01             3.471 WATER.M32
07/03/1992  19:43             5.618 WORMINTR.AGD
08/03/1992  02:07             6.501 WORMINTR.HSQ
20/03/1992  18:09             8.274 WORMINTR.M32
07/03/1992  23:47             8.600 WORMSUIT.AGD
13/05/1991  15:08             8.283 WORMSUIT.HSQ
20/03/1992  14:02             5.074 WORMSUIT.M32
02/04/1992  04:59             1.859 PALACE.SAL
             143 fichier(s)        1.902.320 octets

Liste of files in CD version

31/03/2008  19:12              .
31/03/2008  19:12              ..
22/06/1993  20:12            78.700 DNCDPRG.EXE
23/06/1993  13:12       397.794.384 DUNE.DAT
13/03/1993  06:19             6.486 DUNE.EXE
30/03/1993  14:52            22.697 INSTALL.EXE
20/02/1993  18:49                30 README.BAT
13/03/1993  06:05             7.037 README.DOC
               6 fichier(s)      397.909.334 octets

HSQ compression

The HSQ compression used on dune data file is similar to LZ** dictionary algorithms.

Here is a source of decompression program.
Here is a dos decompression program.

Sprites and graphics files format

All those files are compressed with HSQ. So, before being able to correctly read them, you need to uncompress them.

Some of the files dont have a palette definition inside. This is the case for the sprites which get palette effects in the game (for exemple, the dunes and sand in the desert).
Some of the sprites with no palette definition can be both used with palette effects or fixed classic palette (for exemple, status bar in the bottom of the screen).
In such case, the palette can be set by the loading of another sprite file.

Exemple of the bottom status bar:
When outside it vary depending of the sun, in that case the program is making palette manipulation for the index used for the bar.

When inside, the sprite file of the room is loaded, and the palett is set.

Thats why in files like corr.hsq or por.hsq there is square sprite with used to force definition of the palette.

with palette without palette
attack.hsq
back.hsq
balcon.hsq
baro.hsq
book.hsq
bota.hsq
bunk.hsq
chan.hsq
chankiss.hsq
comm.hsq
corr.hsq
credits.hsq
cryo.hsq
death1.hsq
empr.hsq
equi.hsq
feyd.hsq
final.hsq
fort.hsq
fresk.hsq
frm1.hsq
frm2.hsq
frm3.hsq
gurn.hsq
hara.hsq
hark.hsq
hawa.hsq
idah.hsq
intds.hsq
jess.hsq
kyne.hsq
leto.hsq
mirror.hsq
mois.hsq
onmap.hsq
orny.hsq
ornycab.hsq
ornypan.hsq
ornytk.hsq
paul.hsq
pers.hsq
por.hsq
prouge.hsq
serre.hsq
shai.hsq
siet1.hsq
smug.hsq
stars.hsq
stil.hsq
sunrs.hsq
ver.hsq
vilg.hsq
vis.hsq
death2.hsq
death3.hsq
dunes2.hsq
dunes3.hsq
dunes.hsq
icones.hsq
palplan.hsq
shai2.hsq
siet0.hsq
sun.hsq
sky.hsq


Here is the description of the graphic format:

BEGIN
offset of "end of pal definition"    (2 bytes)
  ...
  ...
n sub-palette are now defined
a sub palette is defined by:
	- the offset of the sub-pal in the general palette. (1 byte)
	- the number of colors in the sub palette. (Nb-col) (1 byte)
	- definition of Red-Green-Blue values for each of the Nb-col colors. (Nb-col * 3 bytes)
	(the RGB values are only defined on 6 bits, 
	so you need to shift left by 2 (multiply by 4) to get the correct value)
  ...
  ...
an End-of-bloc delimiter let you check the end of palette definition (value: 0xFFFF, 2 bytes)
Take care, some garbage bytes may be following...(to realign on 4 bytes ?)
  ...
  ...
Now is comming a list of index, to allow you to define where each sprite start and end.
The base for these offsets is right here (before reading the first offset).
n offsets ( n * 2 bytes )
  ...
  ...
n sprite data blocs structured like this:
	-width (and compression indicator on the most significant bit)(2 bytes) 
	-height (1 byte)
	-base offset of the sub-pal to use (1 byte)
	-sprite content.

If sprite content isn't compressed:
	just read bytes until you fill all the surface (knowing width and height).
	1 byte is coding 2 pixels (half a byte indicate the pal-offset from the base offset of the sprite.
	Take care that at end of each line can exist garbage bytes ( to realign on 4 bytes ?)
If content is compressed:
	you need to apply a sort of RLE decoding process.
	read a repeat-indicator (R) (1 byte).
	If repeat-indicator is negative so repeat (-R) times the following byte (2 pixels).
	If repeat-indicator is positive so read the R bytes following and draw them (R * 2 pixels).	
END


Here is a source of dump program.
Here is a dos dump program.

Scene description files format

This files describe different screens of the game.
They mainly define which sprite to draw where, and which effect to apply on this sprite.
It is interesting to see that the game engine is able to use HSQ compressed form or not of file (with same name).
This mean that before loading a SAL file, the game test if it is compressed or not.
(Maybe with the rule (byte0 + byte1 + byte2 + byte3 + byte4 + byte5)%256 == 171 indicating that the file is probably HSQ compressed)

vilg.sal
siet.sal
palace.sal (originaly HSQ compressed)
hark.sal (originaly HSQ compressed)


Here is the description of the 'sprite-position' file format:

BEGIN
n1 offsets indicating the place of each room in the file. (n1 * 2 bytes)
 ...
n1 data blocs describing a room structured like this:
	- number of position markers (1 byte)
	- n2 drawing commands data blocs (size depend the drawing command)
	- end of room description indicator: 0xFFFF (2 bytes)
 ...
END
different drawing command exists. They are like this:
If its a normal sprite drawing command:
BEGIN
number of the sprite (in the related graphic file) to draw. (value > 0x01) (1 byte)
modificator (1 byte)
x position (1 byte)
y position (1 byte)
sprite palette offset override (1 byte)
END

modificator is a bit field. In this case it work like this:
MSB bit_7	0
    bit_6	flip Left-Right indicator
    bit_5	rotate 180 degree indicator
    bit_4	reduction factor bit2 (MSB) 
    bit_3	reduction factor bit1
    bit_2	reduction factor bit0
    bit_1	if set you need to add 256 to x position
    bit_0	0

If its a position marker command:
Markers indicates the game where can be positioned peoples in a room.
They have -like sprites drawing command- a modificator byte to apply an effect
(typicaly flip Left-Right and Size reduction for perspective effect)
Markers can be between drawing commands. For exemple to make a person to appear
behind a table but in front of a chair.

BEGIN
number of the sprite = 0x01 (1 byte)
modificator (1 byte)
x position (1 byte)
y position (1 byte)
sprite palette offset override (1 byte)
END


modificator is a bit field. In this case it work like this:
MSB bit_7	0
    bit_6	flip Left-Right indicator
    bit_5	rotate 180 degree indicator
    bit_4	reduction factor bit2 (MSB) 
    bit_3	reduction factor bit1
    bit_2	reduction factor bit0
    bit_1	if set you need to add 256 to x position
    bit_0	0
If its a shape drawing command, there is 2 possibilities:

polygone:
BEGIN
base color index (1 byte)
modificator with bit_7=1 and bit_6=0 (1 byte) (bit_0 to bit_6 = ??)
horizontal gradient (value related to the width of the vertical bands -
	if value is 0 there is no horizontal gradient(1 byte)
vertical gradient (value related to the height of the horizontal bands -
	if value is 0 there is no vertical gradient(1 byte)
n points to build the polygone:
	x (2 bytes)  
		(MSB bits 14 and 15 probably are some kind of trigger to stop reading points,
		  for now, each time I read a point, I'm addind the x position MSB byte &(0xF0) in a counter.
		  I stop reading points when its 0xB0 or more).
	y (2 bytes)
END
line:
BEGIN
base color index (1 byte)
modificator with bit_7=1 and bit_6=1 (1 byte) (bit_0 to bit_6 = ??)
2 points to build the line:
x1 (2 bytes)  
y1 (2 bytes)
x2 (2 bytes)  
y2 (2 bytes)
END
base color index have bit_7 (MSB) always set to 1 to make difference with the other command types.

Here is the begining of my dune game engine for DS. The sal part is almost finished.

Music files format

warsong.agd
wormintr.agd
water.agd
wormsuit.agd
sietchm.agd
sekence.agd
morning.agd
arrakis.agd
bagdad.agd
warsong.hsq
water.hsq
wormintr.hsq
wormsuit.hsq
sietchm.hsq
sekence.hsq
morning.hsq
arrakis.hsq
bagdad.hsq
warsong.m32
water.m32
wormintr.m32
wormsuit.m32
sietchm.m32
sekence.m32
morning.m32
arrakis.m32
bagdad.m32

Sound files format

sd1.hsq
sd2.hsq
sd3.hsq
sd4.hsq
sd5.hsq
sd6.hsq
sd7.hsq
sd8.hsq
sd9.hsq
sda.hsq
sdb.hsq

Game save data files

*.sav

Maps data

globdata.hsq
map2.hsq
map.hsq
GLOBDATA.HSQ seams to contain trigonometrics values and thing needed to display the globe.


MAP.HSQ contain information about the map when displaying situation. (it is possible to directly use a uncompressed version)

here is what we have in the map.hsq file once we managed to find the end of each line.

the following big map is build using the same MAP.HSQ but with an interpolation process.



MAP2.HSQ contain information about the map you can see when asking for spice density

Others data files

command1.hsq
command2.hsq
command3.hsq
condit.hsq
dialogue.hsq
dune386.hsq
duneadl.hsq
duneagd.hsq
dunechar.hsq
dunemid.hsq
dunepcs.hsq
dunesdb.hsq
dunevga.hsq
phrase11.hsq
phrase12.hsq
phrase21.hsq
phrase22.hsq
phrase31.hsq
phrase32.hsq
generic.hsq
logo.hnm
tablat.bin
prt.hnm
verbin.hsq