I have the skeleton files part way figured out. these can be found in the ssk directory that the script generates. For the most part they're pretty straight forward, but I've hit a bit of a snag with them. While the hierarchy was easy to figure out, the exact way it stores the bone transform(s) is kind of bizarre. I've worked with stranger stuff before though, so we'll see how it goes. For the technically inclined people, the problem is this:
typically each bone in a skeleton has a transform matrix used to deform the vertices that are assigned to it. this usually takes the form of one of the following:
1. A 4x4 transform matrix (16 floats)
2. A 3x4 transform matrix (12 floats)
3. A versor and a vector (7 floats)
4. Euler angles and a vector (6 floats)
Sometimes there may be an extra value for scale (1-3 floats), but this is uncommon.
But here though, we have 21 floats worth of information, and none of it seems to fit any of the above patterns. It's quite a puzzle, so I decided to look at the .scf files, which is where character geometry is stored, and as far as I can tell, they are the same format as the .smf files used for static geometry, perhaps with some extra fields to weight vertices to their skeletons. This is good news, since it means once one format is known, then we know the other. More interesting, it appears that vectors may be stored as 4D, with an extra 1.0 padding the end, which makes them homogeneous. This is all subject to change though.
I've also loaded the code into ghidra to help get some more insight. I'd kill for IDA, but the free version does not support super H, unfortunately, but I digress. I poked around for some strings and found some fun things to share:
0008f374 | "%s.bin" |
000a10c8 | "%s.scf" |
000c7100 | "%s.smt" |
000a10d0 | "%s.ssk" |
000a10d8 | "%s.ssn" |
This appears to confirm some of the file extensions, which are not encoded in the .bin files.
0007bc40 | "%s_actors.txt" |
000af0c8 | "%s_AIDefs.txt" |
0006cc70 | "%s_animsets.txt" |
0008f37c | "%s_e" |
000dfdc8 | "%s_emitters.txt" |
00078320 | "%s_entities.txt" |
0007c3e4 | "%s_fountain.txt" |
0007bc50 | "%s_items.txt" |
0007c3f4 | "%s_lightning" |
00087c28 | "%s_lightsets.txt" |
00078330 | "%s_nibillboards." |
The engine seems to organise around the concept of a 'level', this appears to be broadly similar to a 'scene' in Unity or UDK. A level is composed of multiple text files, and these strings appear to confirm the naming scheme for them. Upon loading a level, the engine will look for the above text files and load their contents to produce the level. the %s is a place holder for a level name. These files may be found in the ramdisk directory, where there are ones like s2_01_items.txt, s2_01_lightsets.txt and so on. It appears not all files have to be present, as many levels are lacking a _fountain.txt.
00074ba8 | ".\\\\DC5\\\\SOURCE/filesys.c" |
0007137c | ".\\\\DC5\\\\SOURCE/kc_file.c" |
00074c08 | ".\\\\DC5\\\\SOURCE/kc_kmtexturesys.c" |
00071524 | ".\\\\DC5\\\\SOURCE/kc_xfstk.ic" |
0007155c | ".\\\\DC5\\\\SOURCE/smfrdr.c" |
00067da4 | ".\\\\DREAMCAST/dcinit.c" |
00068dd8 | ".\\\\SOURCE/ActorSys.c" |
00070e70 | ".\\\\SOURCE/AISys.c" |
000689f4 | ".\\\\SOURCE/Alarm.c" |
00070724 | ".\\\\SOURCE/AnimUtil.c" |
00074c38 | ".\\\\SOURCE/basetracksys.c" |
00070158 | ".\\\\SOURCE/BSpline.c" |
00071a0c | ".\\\\SOURCE/canimsys.c" |
00074c90 | ".\\\\SOURCE/canimtrk.c" |
00073f0c | ".\\\\SOURCE/cmesh.c" |
00071618 | ".\\\\SOURCE/cmodelsys.c" |
0007274c | ".\\\\SOURCE/CollSrvr.c" |
0007166c | ".\\\\SOURCE/cskelsys.c" |
0007168c | ".\\\\SOURCE/cskinsys.c" |
00071ba4 | ".\\\\SOURCE/database.c" |
00074ce4 | ".\\\\SOURCE/dirsys.c" |
00068a34 | ".\\\\SOURCE/EmitSys.c" |
00068960 | ".\\\\SOURCE/Entity.c" |
00071730 | ".\\\\SOURCE/fontsys.c" |
00069dd4 | ".\\\\SOURCE/FountainSys.c" |
00074140 | ".\\\\SOURCE/gameloader.c" |
00067f64 | ".\\\\SOURCE/GMain.c" |
00069d34 | ".\\\\SOURCE/ItemSys.c" |
00074c54 | ".\\\\SOURCE/kc_cam.c" |
00074c68 | ".\\\\SOURCE/kc_light.c" |
00071ee0 | ".\\\\SOURCE/kc_pool.c" |
000716c0 | ".\\\\SOURCE/kc_vbuf.c" |
00071700 | ".\\\\SOURCE/kc_view.c" |
00069f50 | ".\\\\SOURCE/LightningSys.c" |
0006a060 | ".\\\\SOURCE/lightset.c" |
000718e0 | ".\\\\SOURCE/lightsys.c" |
0007416c | ".\\\\SOURCE/msgsys.c" |
000701c0 | ".\\\\SOURCE/NIBillboardSys.c" |
00074d54 | ".\\\\SOURCE/nmempool.c" |
00074414 | ".\\\\SOURCE/partsrvr.c" |
00072128 | ".\\\\SOURCE/pdfsys.c" |
000680dc | ".\\\\SOURCE/Scene.c" |
00071fbc | ".\\\\SOURCE/set.c" |
00074cac | ".\\\\SOURCE/smf.c" |
00071b38 | ".\\\\SOURCE/smfsys.c" |
00071b68 | ".\\\\SOURCE/smfuser.c" |
00071b04 | ".\\\\SOURCE/smt.c" |
0006e330 | ".\\\\SOURCE/sndutls.c" |
00074cc0 | ".\\\\SOURCE/ssk.c" |
00074cd4 | ".\\\\SOURCE/ssn.c" |
0007502c | ".\\\\SOURCE/stacksys.c" |
0006e9a8 | ".\\\\SOURCE/stream.c" |
00068140 | ".\\\\SOURCE/StrReg.c" |
00074da0 | ".\\\\SOURCE/strutil.c" |
00074228 | ".\\\\SOURCE/sttmachn.c" |
0007194c | ".\\\\SOURCE/texturesys.c" |
00074e2c | ".\\\\SOURCE/tuningsys.c" |
00073eb8 | ".\\\\SOURCE/Zone.c" |
00068d14 | ".\\\\SOURCE\\OBJECTS/Actor.c" |
000704c8 | ".\\\\SOURCE\\OBJECTS/BookOfProtection.c" |
000690c4 | ".\\\\SOURCE\\OBJECTS/camera.c" |
00070610 | ".\\\\SOURCE\\OBJECTS/Clock.c" |
0006c998 | ".\\\\SOURCE\\OBJECTS/E00_Skeleton.c" |
0006ca44 | ".\\\\SOURCE\\OBJECTS/E02_BlueGhost.c" |
0006cbf0 | ".\\\\SOURCE\\OBJECTS/E05_BoneSkeleton.c" |
0006cd0c | ".\\\\SOURCE\\OBJECTS/E06_GhostCardinal.c" |
0006cf18 | ".\\\\SOURCE\\OBJECTS/E07_EvilCleric.c" |
0006d064 | ".\\\\SOURCE\\OBJECTS/E07_EvilClericCrystal.c" |
0006d158 | ".\\\\SOURCE\\OBJECTS/E33_Bat.c" |
0006d24c | ".\\\\SOURCE\\OBJECTS/E43_SkullPillar.c" |
0006d2ac | ".\\\\SOURCE\\OBJECTS/E43S_Fireball.c" |
0006d674 | ".\\\\SOURCE\\OBJECTS/E70_Medusa.c" |
0006da60 | ".\\\\SOURCE\\OBJECTS/E70_MedusaHead.c" |
0006dc18 | ".\\\\SOURCE\\OBJECTS/E70_MedusaSpit.c" |
000709c0 | ".\\\\SOURCE\\OBJECTS/EmitterCandle.c" |
00070814 | ".\\\\SOURCE\\OBJECTS/HolyWater.c" |
0006984c | ".\\\\SOURCE\\OBJECTS/RigidMdl.c" |
0006f6c0 | ".\\\\SOURCE\\OBJECTS/Scene2Section1.c" |
0006e180 | ".\\\\SOURCE\\OBJECTS/shield.c" |
0006df10 | ".\\\\SOURCE\\OBJECTS/SpecialAxe.c" |
00070560 | ".\\\\SOURCE\\OBJECTS/SpecialBookOfProtection.c" |
0006e07c | ".\\\\SOURCE\\OBJECTS/SpecialBoomerang.c" |
00070694 | ".\\\\SOURCE\\OBJECTS/SpecialClock.c" |
0006de20 | ".\\\\SOURCE\\OBJECTS/SpecialDagger.c" |
000708dc | ".\\\\SOURCE\\OBJECTS/SpecialHolyWater.c" |
00069814 | ".\\\\SOURCE\\OBJECTS/UsrObj.c" |
00069760 | ".\\\\SOURCE\\OBJECTS/Whip.c" |
There is also a list of source files, which appears to be partial. It appears the game was written in C, which was fairly common up until the early 2000s or so.
000fcf5d | "S37at motherfucker *****" |
There was also this entry. No comment!
00081a00 | "0,4 Build:Jul 23 1999 11:28:48\n" |
00063120 | "04 Build:Mar 01 1999 11:57:40\n" |
There are a few build strings through out as well, which should help date it exactly.
There are also numerous references to other enemies:
Evil Cleric, Pirate Skeleton With Sword, Boomerang Skeleton, Blood Skeleton, Headless Zombie, Lantern Mummy, Axe Knight, Spear Knight, Zombie, Great Armour With Sword, Headless Knight, Ghost Musician, Aristocrat Ghost, Fishman, Hunchback, Succubus, Bat, Hell Hound, Raven, Flying Fish, Skull Pillar, Grasping Hand, Hydra, Gorgon, Medusa Head, Skeletal Dragon Head, Wyvern, Harpy, Spirit, Flying Furniture, Flying Book, Marionette, Lesser Demon, Beelzebub, Maggot, Werewolf, Frankenstein, Female Dracula, Death Horse, Death, and of course, Dracula.
You can't say they didn't have ambition!
There are references to 'Victor' as well, which I think was the second playable character?
For the technical people, there are lots of debug bits in the string list too. I've attached the string dump from ghidra to this post for others to look at. One interesting trivia bit is that the collision detection system appears to have at least two primitives: trimeshes and spheres. It's likely that they supported capsules as well.
More to come, hopefully!
EDIT: It appears the forum does not like csv files. I've uploaded it here:
1 file sent via WeTransfer, the simplest way to send your files around the world
we.tl
The link will expire in a week.