class PK2SPR_ANIM(cpystruct.CpyStruct(""" uchar seq[10]; uchar frames; bool loop; """)): def __repr__(self): return str(self)
class asciifile(cpystruct.CpyStruct("char filename[13]")): @classmethod def fromraw(cls, v): return re.search('[\w\.]*', v, re.U).group(0) def __repr__(self): return str(self) def __str__(self): return self.filename
class PK2MAP( cpystruct.CpyStruct(""" char ver[4]; BYTE nan; asciifile tileFile, fieldFile, musicFile; asciitxt mapName, author; asciinum lvl, air, trig1, trig2, trig3; asciinum playTime, v1, background, plrSpr; asciinum lvlX, lvlY, icon; asciinum spriteCount; asciifile spriteFiles[spriteCount]; """)): pass
class PK2SPR(cpystruct.CpyStruct(""" asciinum tyyppi; asciilongfile kuvatiedosto; asciilongfile aanitiedostot[7]; int aanet[7]; uchar frameja; PK2SPR_ANIM animaatiot[20]; uchar animaatioita; uchar frame_rate; int kuva_x; int kuva_y; int kuva_frame_leveys; int kuva_frame_korkeus; int kuva_frame_vali; char nimi[30]; int width, height; double paino; bool vihollinen; int energia; int vahinko; uchar vahinko_tyyppi; uchar suojaus; int pisteet; int AI[10]; uchar max_hyppy; double max_nopeus; int latausaika; uchar vari; bool este; int tuhoutuminen; bool avain; bool tarisee; uchar bonusten_lkm; int hyokkays1_aika; int hyokkays2_aika; int pallarx_kerroin; char muutos_sprite[100]; char bonus_sprite[100]; char ammus1_sprite[100]; char ammus2_sprite[100]; bool tiletarkistus; DWORD aani_frq; bool random_frq; bool este_ylos; bool este_alas; bool este_oikealle; bool este_vasemmalle; uchar lapinakyvyys; bool hehkuu; int tulitauko; bool liitokyky; bool boss; bool bonus_aina; bool osaa_uida; """)): def __init__(self, f, m): with open(f, 'rb') as fh: super(self.__class__, self).__init__(fh)
class PK2MAPLAYER(cpystruct.CpyStruct("asciinum lx, ly, w, h;")): MAXW = 256 MAXH = 224 MAXSZ = MAXW*MAXH def width(self): return self.w.num + 1 def height(self): return self.h.num + 1 def __init__(self, dat): # should make cpystruct support this usecase better super(self.__class__, self).__init__(dat) #print str(cpystruct.peek(dat, 128)) self.layer = bytearray(self.MAXSZ) for i in range(len(self.layer)): self.layer[i] = 0xff for y in range(self.ly.num, self.ly.num+self.height()): for x in range(self.lx.num, self.lx.num+self.width()): self.layer[x+y*self.MAXW] = dat.read(1) def findBounds(self): "find bounding box for coords that have tiles" mx,my,mw,mh = None,None,10,10 for y in range(self.ly, self.ly+self.height()): for x in range(self.lx, self.lx+self.width()): if self.layer[x + y * self.MAXW] != 255: if not my: my = y if not mx or x < mx: mx = x if x > mw: mw = x if y > mh: mh = y if not mx: mx = 0 if not my: my = 0 return mx, my, mw, mh def doSprites(self, la, bb): for y in range(self.height()): for x in range(self.width()): sprite = self.layer[self.lx.num + x + (self.ly.num + y) * self.MAXW] if sprite != 255: #if sprite > len(self.sprites): # print 'invalid spr',sprite # continue rx = self.lx.num + x - bb[0] ry = self.ly.num + y - bb[1] + 1 spr = self.sprites[sprite] obj = Tiled.MapObject(str(spr.kuvatiedosto), '', QPointF(rx, ry), QSizeF(1, 1)) #spr.width, spr.height)) # 0 should point to the actual sprite but how? obj.setCell(Tiled.Cell(self.spriteGfx[str(spr.kuvatiedosto)].tileAt(0))) la.addObject(obj) def doTiles(self, ts, la, bb): for y in range(self.height()): for x in range(self.width()): tile = self.layer[self.lx.num + x + (self.ly.num + y) * self.MAXW] if tile != 255: rx = self.lx.num + x - bb[0] ry = self.ly.num + y - bb[1] if tile == 149: print 'start @',rx,ry if tile == 150: print 'end @',rx,ry ti = ts.tileAt(tile) if ti != None and rx < bb[2] and ry < bb[3]: # app should check that coords are within layer #print rx,ry,self.ly,y la.setCell(rx, ry, Tiled.Cell(ti)) else: print 'invalid',rx,ry
class asciinum(cpystruct.CpyStruct("char num[8]")): @classmethod def fromraw(cls, v): #v = ''.join(re.findall('[0-9]', v)) v = re.sub('[^0-9]','',v) return 0 if not v.strip().isdigit() else int(v)
class asciitxt(cpystruct.CpyStruct("char txt[40]")): @classmethod def fromraw(cls, v): return re.search('[\w\. ]', v, re.U).group(0)
class RleData(cpystruct.CpyStruct('BYTE rep, sig, val')): pass
class LevelData(cpystruct.CpyStruct('ushort len; BYTE d[len];')): pass
class LevelData(cpystruct.CpyStruct('ushort len; BYTE d[len];')): pass class RleData(cpystruct.CpyStruct('BYTE rep, sig, val')): pass