Ejemplo n.º 1
0
 def get_card(self, player, loc, seq):
     flags = QUERY.CODE | QUERY.ATTACK | QUERY.DEFENSE | QUERY.POSITION | QUERY.LEVEL | QUERY.RANK | QUERY.LINK
     bl = lib.query_card(self.duel, player, loc.value, seq, flags.value,
                         ffi.cast('byte *', self.buf), False)
     if bl == 0:
         return
     buf = io.BytesIO(ffi.unpack(self.buf, bl))
     f = self.read_u32(buf)
     if f == 4:
         return
     f = self.read_u32(buf)
     code = self.read_u32(buf)
     card = Card(code)
     position = self.read_u32(buf)
     card.set_location(position)
     level = self.read_u32(buf)
     if (level & 0xff) > 0:
         card.level = level & 0xff
     rank = self.read_u32(buf)
     if (rank & 0xff) > 0:
         card.level = rank & 0xff
     card.attack = self.read_u32(buf)
     card.defense = self.read_u32(buf)
     link = self.read_u32(buf)
     link_marker = self.read_u32(buf)
     if (link & 0xff) > 0:
         card.level = link & 0xff
     if link_marker > 0:
         card.defense = link_marker
     return card
Ejemplo n.º 2
0
    def get_cards_in_location(self, player, location):
        cards = []
        flags = QUERY.CODE | QUERY.POSITION | QUERY.LEVEL | QUERY.RANK | QUERY.ATTACK | QUERY.DEFENSE | QUERY.EQUIP_CARD | QUERY.OVERLAY_CARD | QUERY.COUNTERS | QUERY.LINK
        bl = lib.query_field_card(self.duel, player,
                                  location.value, flags.value,
                                  ffi.cast('byte *', self.buf), False)
        buf = io.BytesIO(ffi.unpack(self.buf, bl))
        while True:
            if buf.tell() == bl:
                break
            length = self.read_u32(buf)
            if length == 4:
                continue  #No card here
            f = self.read_u32(buf)
            code = self.read_u32(buf)
            card = Card(code)
            position = self.read_u32(buf)
            card.set_location(position)
            level = self.read_u32(buf)
            if (level & 0xff) > 0:
                card.level = level & 0xff
            rank = self.read_u32(buf)
            if (rank & 0xff) > 0:
                card.level = rank & 0xff
            card.attack = self.read_u32(buf)
            card.defense = self.read_u32(buf)

            card.equip_target = None

            if f & QUERY.EQUIP_CARD:  # optional

                equip_target = self.read_u32(buf)
                pl = equip_target & 0xff
                loc = LOCATION((equip_target >> 8) & 0xff)
                seq = (equip_target >> 16) & 0xff
                card.equip_target = self.get_card(pl, loc, seq)

            card.xyz_materials = []

            xyz = self.read_u32(buf)

            for i in range(xyz):
                card.xyz_materials.append(Card(self.read_u32(buf)))

            cs = self.read_u32(buf)
            card.counters = []
            for i in range(cs):
                card.counters.append(self.read_u32(buf))

            link = self.read_u32(buf)
            link_marker = self.read_u32(buf)

            if (link & 0xff) > 0:
                card.level = link & 0xff

            if link_marker > 0:
                card.defense = link_marker

            cards.append(card)
        return cards
Ejemplo n.º 3
0
	def process(self):
		res = lib.process(self.duel)
		l = lib.get_message(self.duel, ffi.cast('byte *', self.buf))
		data = ffi.unpack(self.buf, l)
		self.cm.call_callbacks('debug', event_type='process', result=res, data=data.decode('latin1'))
		data = self.process_messages(data)
		return res
Ejemplo n.º 4
0
def process_duel_replay(duel):
    res = lib.process(duel.duel)
    l = lib.get_message(duel.duel, ffi.cast('byte *', duel.buf))
    data = ffi.unpack(duel.buf, l)
    cb = duel.cm.callbacks
    duel.cm.callbacks = collections.defaultdict(list)

    def tp(t):
        duel.tp = t

    duel.cm.register_callback('new_turn', tp)

    def recover(player, amount):
        duel.lp[player] += amount

    def damage(player, amount):
        duel.lp[player] -= amount

    def tag_swap(player):
        c = duel.players[player]
        n = duel.tag_players[player]
        duel.players[player] = n
        duel.watchers[player] = c
        duel.tag_players[player] = c

    duel.cm.register_callback('recover', recover)
    duel.cm.register_callback('damage', damage)
    duel.cm.register_callback('tag_swap', tag_swap)
    duel.process_messages(data)
    duel.cm.callbacks = cb
    return data
Ejemplo n.º 5
0
 def script_reader_callback(name, lenptr):
     fn = ffi.string(name)
     if not os.path.exists(fn):
         lenptr[0] = 0
         return ffi.NULL
     s = open(fn, 'rb').read()
     buf = ffi.buffer(scriptbuf)
     buf[0:len(s)] = s
     lenptr[0] = len(s)
     return ffi.cast('byte *', scriptbuf)
Ejemplo n.º 6
0
 def get_card(self, player, loc, seq):
     flags = QUERY_CODE | QUERY_ATTACK | QUERY_DEFENSE | QUERY_POSITION | QUERY_LEVEL
     bl = lib.query_card(self.duel, player, loc, seq, flags,
                         ffi.cast('byte *', self.buf), False)
     buf = io.BytesIO(ffi.unpack(self.buf, bl))
     f = self.read_u32(buf)
     if f == 4:
         return
     f = self.read_u32(buf)
     code = self.read_u32(buf)
     card = Card.from_code(code)
     position = self.read_u32(buf)
     card.set_location(position)
     level = self.read_u32(buf)
     if (level & 0xff) > 0:
         card.level = level & 0xff
     card.attack = self.read_u32(buf)
     card.defense = self.read_u32(buf)
     return card
Ejemplo n.º 7
0
 def set_responseb(self, r):
     buf = ffi.new('char[64]', r)
     lib.set_responseb(self.duel, ffi.cast('byte *', buf))
     self.cm.call_callbacks('debug',
                            event_type='set_responseb',
                            response=r.decode('latin1'))