#!/usr/bin/python3 import ctypes #--------------------------------------+ # Devil 1: PLD #--------------------------------------+ class PldHeader(ctypes.Structure): _fields_ = [ ("numOffset", ctypes.c_int), ("offsets", ctypes.POINTER(ctypes.c_int)) ] class Devil1PLD_FN(ctypes.Structure): _fields_ = [ ("getheader" , ctypes.CFUNCTYPE( ctypes.c_bool, ctypes.POINTER(PldHeader), ctypes.c_char_p)), ("sizeofsector", ctypes.CFUNCTYPE( ctypes.c_int, ctypes.POINTER(PldHeader), ctypes.c_int)), ("printheader" , ctypes.CFUNCTYPE(None, ctypes.POINTER(PldHeader))) ] #--------------------------------------+ # Devil 1: TEX #--------------------------------------+ class TexturePack(ctypes.Structure): _fields_ = [ ("id", ctypes.c_char * 4), # fixed length 4, reverse order ("batchNumber", ctypes.c_int), ("firstBatchOffset", ctypes.c_int), ("unknownA", ctypes.c_int) ] class TextureBatchDescriptor(ctypes.Structure): _fields_ = [ ("batchIdx", ctypes.c_int), ("hash", ctypes.c_int), ("texNumber", ctypes.c_int), ("unknownA", ctypes.c_int * 8), ("textureSize", ctypes.c_int), ("unknownB", ctypes.c_int * 30) ] class Texture(ctypes.Structure): _fields_ = [ ("data", ctypes.c_ubyte) ] class TextureBatch(ctypes.Structure): _fields_ = [ ("batch", ctypes.POINTER(Texture)) ] class Devil1TEX_FN(ctypes.Structure): _fields_ = [ ("printheader", ctypes.CFUNCTYPE( None, ctypes.POINTER(TexturePack))), ("printbatchdesc", ctypes.CFUNCTYPE( None, ctypes.POINTER(TextureBatchDescriptor))), ("getbatchdesc", ctypes.CFUNCTYPE( ctypes.c_bool, ctypes.POINTER(TextureBatchDescriptor), ctypes.c_uint, ctypes.c_char_p, ctypes.c_uint)), ("getbatch", ctypes.CFUNCTYPE( ctypes.c_bool, ctypes.POINTER(TextureBatch), ctypes.c_uint, ctypes.c_char_p, ctypes.c_uint)), ("gettexture", ctypes.CFUNCTYPE( ctypes.c_bool, ctypes.POINTER(Texture), ctypes.c_uint, ctypes.c_char_p, ctypes.c_uint)) ] #--------------------------------------+ # Devil 1: GEO #--------------------------------------+ #--------------------------------------+ # Regular Python #--------------------------------------+ def pldtest(devil1pld, pldheader): with open("pl01.pld", "rb") as f: data = f.read() devil1pld.getheader(ctypes.byref(pldheader), data) devil1pld.printheader(ctypes.byref(pldheader)) def textest(devil1tex, texheader): with open("pl01.pld_1.txp", "rb") as f: data = f.read() texheader = ctypes.cast(data, ctypes.POINTER(TexturePack)) devil1tex.printheader(texheader) def main(): sharedlib='./lib3ddevil1.so' libc = ctypes.cdll.LoadLibrary(sharedlib) if (not libc): print("Couldn't load %s" % sharedlib) return 1 print("OK") pldfn = Devil1PLD_FN.in_dll(libc, "DEVIL1PLD") pldh = PldHeader() pldtest(pldfn, pldh) texfn = Devil1TEX_FN.in_dll(libc, "DEVIL1TEX") texh = TexturePack() textest(texfn, texh) #---------------------------------------+ main()