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
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
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
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
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