Okay, I'm back and this time with Geist Force. This one has been on the todo list for some time now, and while waiting for stuff to compile at work I decided to dig in. No time like the present, right?
I'm using @Sega Dreamcast Info's latest release for this. Right out of the gate it seems all of the game's assets are stored inside these mysterious MIFFs. What is a MIFF? Great question! Upon opening it in 010 Editor, or the hex editor of your choice, it seems that the MIFF is a generic container for various data types. Each data is prefixed with a 4 letter code and a length. From observation I've seen the following types:
There might be more as well, but so far these are all the types I've found. Bitmaps seem like normal PVR textures, and the MTex block is more mysterious to me. It appears more like a list of textures, and MMat seems similar, but likely contain parameters for diffuse and specular lighting and such. The Hierarchy type is the most interesting to me - it seems like they're generic scene nodes, and, they might also function as bones for skeletal animation. There's also variable length data attached to each one, which at the moment I believe are key frames for animation. There appears to be no compression or anything like we saw in Agartha, so that makes this a much simpler task to figure out.
Beyond that it seems like audio is kept out in the open on the GDI. I suspect it's the usual Yamaha ADPCM, but VLC wouldn't play any of it, nor did ffmpeg recognise it, so there is likely some extra data to frame it. I was under the impression that there might be a lot of interesting things buried in Geist Force, but from my high level perspective it seems like most of the disk's contents are accessible in game? Does anyone have any particular files they'd like to be investigated?
More to come, hopefully soon. The end goal is to get the assets translated into common formats so that they may be viewed in all the different 3D/art packages out there. In the mean time for those wanting to play along, I have included my work so far!
MIFF template for 010 Editor
I'm using @Sega Dreamcast Info's latest release for this. Right out of the gate it seems all of the game's assets are stored inside these mysterious MIFFs. What is a MIFF? Great question! Upon opening it in 010 Editor, or the hex editor of your choice, it seems that the MIFF is a generic container for various data types. Each data is prefixed with a 4 letter code and a length. From observation I've seen the following types:
- MAct - Actions
- MMdl - Models
- MMat - Materials
- MTex - Textures
- MBmp - Bitmaps
- MHch - Hierarchy
There might be more as well, but so far these are all the types I've found. Bitmaps seem like normal PVR textures, and the MTex block is more mysterious to me. It appears more like a list of textures, and MMat seems similar, but likely contain parameters for diffuse and specular lighting and such. The Hierarchy type is the most interesting to me - it seems like they're generic scene nodes, and, they might also function as bones for skeletal animation. There's also variable length data attached to each one, which at the moment I believe are key frames for animation. There appears to be no compression or anything like we saw in Agartha, so that makes this a much simpler task to figure out.
Beyond that it seems like audio is kept out in the open on the GDI. I suspect it's the usual Yamaha ADPCM, but VLC wouldn't play any of it, nor did ffmpeg recognise it, so there is likely some extra data to frame it. I was under the impression that there might be a lot of interesting things buried in Geist Force, but from my high level perspective it seems like most of the disk's contents are accessible in game? Does anyone have any particular files they'd like to be investigated?
More to come, hopefully soon. The end goal is to get the assets translated into common formats so that they may be viewed in all the different 3D/art packages out there. In the mean time for those wanting to play along, I have included my work so far!
MIFF template for 010 Editor
Code:
//GEIST FORCE
//Miff template
//By Sifting, 2022
BigEndian ();
//Ensure that the file is a miff
char magick[4];
if (magick != "MIFF")
{
Error ("NOT A MIFF!");
}
uint32 size; //Size of the entire file
char endian[4]; //Only Litl encoutnered - endian mode for file contents
//Each record seems to be prefixed with this
struct Record_info
{
float unk;
float unk;
uint32 len;
char name[len];
};
//MAct data
struct Action_entry
{
uint32 unk;
uint32 unk;
uint32 unk;
uint32 len;
char name[len];
};
struct Record_action
{
uint32 unk;
uint32 count;
local int i = 0;
while (i++ < count)
{
Action_entry entries;
}
};
//Record framing
struct Record
{
char type[4];
uint32 size;
//Records may be little endian
if ("Litl" == endian)
{
LittleEndian ();
}
Record_info info;
if ("MAct" == type)
{
Record_action action;
}
else
{
byte data[size - sizeof(info)];
}
BigEndian ();
};
//Parse the file
local int _record_header_size = 8;
local int _header_size = 12;
local int _read = size - _header_size;
while (0 < _read)
{
Record record;
_read -= record.size + _record_header_size;
Printf ("Read %i (%i)\n", record.size, _read);
}