示例#1
0
文件: mala.py 项目: kun1989/rl-slg
class UserClient(object):
    def __init__(self, user_name, debug=False):
        self.logger = add_log('mala_%s' % user_name, debug)
        self.user_id = 0
        self.user_name = user_name
        self.tcp_client = TcpClient(self)
        self.tcp_client.setDaemon(True)
        self.tcp_client.start()
        self.user_data = None
        self.action_state = 0
        self.enabled_actions = ['build', 'army', 'fast_forward']

    def on_message(self, message):
        self.logger.debug('on_message#############################')
        self.logger.debug(message)
        self.logger.debug('#######################################')
        if message.result == 0:
            func = rsp.cmd_prot_rsp_method.get(message.cmd)
            if func is None:
                rsp.default_func(self, message)
                return
            self.logger.debug('func_name: ' + func.__name__)
            func(self, message)
        else:
            self.logger.debug(message)

    def send_message(self, cmd, data):
        self.logger.debug('send_message: ' + cmd)
        self.logger.debug(data)
        cs_info = sp.CsInfo(**data)
        cs_info.cmd = getattr(sp, cmd)
        cs_info.id = self.user_id
        send_af = AppFrame()
        send_af.message = cs_info
        send_af.frame_command = cs_info.cmd
        send_af.frame_id = cs_info.id
        self.tcp_client.send(send_af)

    def get_action_list(self):
        """agent使用 获取当前可用的Action"""
        self.update()
        self.full_resource()
        action_list = self._get_action_list()
        if not [a for a in action_list if a.status == 0]:
            if ActionLogin(self).run():
                action_list = self._get_action_list()
        return action_list

    def _get_action_list(self):
        action_list = []
        if 'build' in self.enabled_actions:
            action_list += create_build_actions(self)
        if 'army' in self.enabled_actions:
            action_list += create_army_actions(self)
        if 'fast_forward' in self.enabled_actions:
            action_list += create_fast_forward_actions(self)
        return action_list

    def get_user_data(self):
        """agent使用 获取游戏状态信息"""
        return copy.deepcopy(self.user_data)

    def update(self):
        self._update_progress()

    def _update_progress(self):
        pass

    def login(self):
        self.tcp_client.open()
        if ActionLogin(self).run():
            return True
        self.tcp_client.close()
        return False

    def register(self):
        if self.login():
            ActionMove(self).run()
            return True
        return False

    def heart(self):
        def _heart():
            self.send_message('ReqHeart', {'req_heart': {'revert': 1}})
            t = threading.Timer(30, _heart)
            t.setDaemon(True)
            t.start()
        timer = threading.Timer(30, _heart)
        timer.setDaemon(True)
        timer.start()

    def add_cash(self, cash=1000):
        data = {
            'req_gm': {
                'gm_info': {
                    'gm_cmd': ['add_cash', str(cash)]
                    }
                }
            }
        self.send_message('ReqGM', data)

    def add_resource(self, _type, num):
        num = str(num)
        if _type == 'cash':
            gm_cmd = ['add_cash', num]
        elif _type == 'energy':
            gm_cmd = ['add_resource', '0', num]
        elif _type == 'mineral':
            gm_cmd = ['add_resource', '1', num]
        elif _type == 'crystal':
            gm_cmd = ['add_resource', '2', num]
        elif _type == 'alloy':
            gm_cmd = ['add_resource', '3', num]
        else:
            return
        data = {
            'req_gm': {
                'gm_info': {
                    'gm_cmd': gm_cmd
                    }
                }
            }
        self.send_message('ReqGM', data)

    def full_resource(self):
        energy_max = self.user_data['city_count']['energy_max']
        mineral_max = self.user_data['city_count']['mineral_max']
        energy = energy_max - self.user_data['base_info']['energy']
        mineral = mineral_max - self.user_data['base_info']['mineral']
        if energy > 0:
            self.add_resource('energy', energy)
            self.user_data['base_info']['energy'] = energy_max
        if mineral > 0:
            self.add_resource('mineral', mineral)
            self.user_data['base_info']['mineral'] = mineral_max
        self.logger.debug('add_resource: %s%s' % (energy, mineral))

        if self.user_data['base_info']['crystal'] < 100:
            self.add_resource('crystal', 1000)
            self.user_data['base_info']['crystal'] += 1000
        if self.user_data['base_info']['alloy'] < 100:
            self.add_resource('alloy', 1000)
            self.user_data['base_info']['alloy'] += 1000