예제 #1
0
 def __init__(self, seed=None):
     Joinable.__init__(self)
     self.buf = ffi.new('char[]', 4096)
     if seed is None:
         seed = random.randint(0, 0xffffffff)
     self.seed = seed
     self.duel = lib.create_duel(seed)
     self.cm = callback_manager.CallbackManager()
     self.keep_processing = False
     self.to_ep = False
     self.to_m2 = False
     self.current_phase = 0
     self.watchers = []
     self.private = False
     self.started = False
     self.debug_mode = False
     self.debug_fp = None
     self.players = [None, None]
     self.tag_players = []
     self.lp = [8000, 8000]
     self.started = False
     self.message_map = {}
     self.state = ''
     self.cards = [None, None]
     self.tag_cards = [None, None]
     self.revealed = {}
     self.say = Say()
     self.watch = Watchers()
     self.tags = [Tag(), Tag()]
     self.bind_message_handlers()
     self.pause_timer = None
예제 #2
0
 def __init__(self, seed=None):
     self.buf = ffi.new('char[]', 4096)
     if seed is None:
         seed = random.randint(0, 0xffffffff)
     self.seed = seed
     self.duel = lib.create_duel(seed)
     lib.set_player_info(self.duel, 0, 8000, 5, 1)
     lib.set_player_info(self.duel, 1, 8000, 5, 1)
     self.cm = callback_manager.CallbackManager()
     self.keep_processing = False
     self.to_ep = False
     self.to_m2 = False
     self.current_phase = 0
     self.watchers = []
     self.private = False
     self.started = False
     self.debug_mode = False
     self.debug_fp = None
     self.players = [None, None]
     self.lp = [8000, 8000]
     self.started = False
     self.message_map = {}
     self.state = ''
     self.cards = [None, None]
     self.revealed = {}
     self.bind_message_handlers()
예제 #3
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'))
예제 #4
0
        cd.lscale = (row['level'] >> 24) & 0xff
        cd.rscale = (row['level'] >> 16) & 0xff
        cd.attack = row['atk']
        cd.defense = row['def']
        if cd.type & TYPE.LINK:
            cd.link_marker = cd.defense
            cd.defense = 0
        else:
            cd.link_marker = 0
        cd.race = row['race']
        cd.attribute = row['attribute']
        return 0

    lib.set_card_reader(lib.card_reader_callback)

    scriptbuf = ffi.new('char[131072]')

    @ffi.def_extern()
    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)

    lib.set_script_reader(lib.script_reader_callback)
예제 #5
0
파일: duel.py 프로젝트: guilevi/yugioh-game
 def __init__(self, seed=None):
     self.buf = ffi.new('char[]', 4096)
     if seed is None:
         seed = random.randint(0, 0xffffffff)
     self.seed = seed
     self.duel = lib.create_duel(seed)
     lib.set_player_info(self.duel, 0, 8000, 5, 1)
     lib.set_player_info(self.duel, 1, 8000, 5, 1)
     self.cm = callback_manager.CallbackManager()
     self.started = False
     self.message_map = {
         90: self.msg_draw,
         40: self.msg_new_turn,
         41: self.msg_new_phase,
         11: self.msg_idlecmd,
         1: self.msg_retry,
         2: self.msg_hint,
         18: self.msg_select_place,
         24: self.msg_select_place,
         37: self.msg_reversedeck,
         38: self.msg_decktop,
         50: self.msg_move,
         55: self.msg_swap,
         56: self.msg_field_disabled,
         60: self.msg_summoning,
         16: self.msg_select_chain,
         61: self.msg_summoned,
         64: self.msg_flipsummoning,
         54: self.msg_set,
         10: self.msg_select_battlecmd,
         101: self.msg_counters,
         102: self.msg_counters,
         110: self.msg_attack,
         113: self.msg_begin_damage,
         114: self.msg_end_damage,
         111: self.msg_battle,
         91: self.msg_damage,
         15: self.msg_select_card,
         14: self.msg_select_option,
         92: self.msg_recover,
         20: self.msg_select_tribute,
         53: self.msg_pos_change,
         70: self.msg_chaining,
         19: self.msg_select_position,
         13: self.msg_yesno,
         62: partial(self.msg_summoning, special=True),
         12: self.msg_select_effectyn,
         5: self.msg_win,
         100: self.msg_pay_lpcost,
         21: self.msg_sort_chain,
         141: self.msg_announce_attrib,
         142: self.msg_announce_card,
         143: self.msg_announce_number,
         144: self.msg_announce_card_filter,
         23: self.msg_select_sum,
         140: self.msg_announce_race,
         22: self.msg_select_counter,
         83: self.msg_become_target,
         25: self.msg_sort_card,
         130: self.msg_toss_coin,
         131: partial(self.msg_toss_coin, dice=True),
         31: self.msg_confirm_cards,
         73: self.msg_chain_solved,
         93: self.msg_equip,
         94: self.msg_lpupdate,
         32: self.msg_shuffle,
     }
     self.state = ''
     self.cards = [None, None]
     self.revealed = {}
예제 #6
0
def main():
    player_factory = {'manual': FakePlayer, 'random': RandomAI}
    parser = argparse.ArgumentParser()
    parser.add_argument("--deck1",
                        help="deck for player 1",
                        type=str,
                        required=True)
    parser.add_argument("--deck2",
                        help="deck for player 2",
                        type=str,
                        required=True)
    parser.add_argument("--lp1",
                        help="starting lp for player 1",
                        type=int,
                        default=8000)
    parser.add_argument("--lp2",
                        help="starting lp for player 2",
                        type=int,
                        default=8000)
    parser.add_argument("--p1",
                        help="type of player 1",
                        type=str,
                        default='random',
                        choices=player_factory.keys())
    parser.add_argument("--p2",
                        help="type of player 1",
                        type=str,
                        default='random',
                        choices=player_factory.keys())
    parser.add_argument("--preload",
                        help="path to preload script",
                        type=str,
                        default=None)
    args = parser.parse_args()

    decks = [load_deck(args.deck1), load_deck(args.deck2)]

    glb.language_handler = LanguageHandler()
    glb.language_handler.add("english", "en")
    glb.language_handler.set_primary_language("english")
    glb.server = server.Server()
    glb.server.db = sqlite3.connect("locale/en/cards.cdb")
    glb.server.db.row_factory = sqlite3.Row

    duel = dm.Duel()
    duel.room = FakeRoom()
    config = {"players": ["Alice", "Bob"], "decks": decks}
    players = [
        player_factory[args.p1](0, config["decks"][0]),
        player_factory[args.p2](1, config["decks"][1])
    ]
    for i, name in enumerate(config["players"]):
        players[i].nickname = name
        duel.load_deck(players[i])
    duel.players = players
    duel.set_player_info(0, args.lp1)
    duel.set_player_info(1, args.lp2)
    # rules = 1, Traditional
    # rules = 0, Default
    # rules = 4, Link
    # rules = 5, MR5
    rules = 5
    options = 0
    if args.preload:
        fn = args.preload
        fn_buff = ffi.new("char[]", fn.encode('ascii'))
        lib.preload_script(duel.duel, fn_buff, len(fn))
    duel.start(((rules & 0xFF) << 16) + (options & 0xFFFF))
    process_duel(duel)
    print(duel.lp)