Beispiel #1
0
class Battle:

    def __init__(self):
        self.attackers_list = [];
        self.defenders_list = [];
        self.frame = 0;
        self.msg_manager = MsgManager();
        self.event_manager = EventManager();

    def add_msg(self,msg):
        self.msg_manager.add_msg(msg);

    """
        战斗中的存活对象执行自己的操作
    """
    def execute_actors(self):
        alive_attack_actors = list(Battle.get_all_alive(self.attackers_list));
        alive_defend_actors = list(Battle.get_all_alive(self.defenders_list));

        for attacker in alive_attack_actors:
            attacker.run();
        for defender in alive_defend_actors:
            defender.run();

    def add_event(self,event):
        self.event_manager.get_event_list_by_key(event.event_type).append(event);

        """
        让怪物进入战场
    """
    def enter_battle(self,monsters,is_attackers):
        if is_attackers:
            self.attackers_list.extend(monsters);
        else:
            self.defenders_list.extend(monsters);

    @staticmethod
    def is_one_side_all_dead(side_list):
        for one in side_list:
            if one.hp > 0:
                    return False;
        return True;

    """
        检查比赛是否真的结束了
    """
    def is_end(self):
        if Battle.is_one_side_all_dead(self.defenders_list):
            self.msg_manager.add_msg("defenders all dead");
            return True;
        if Battle.is_one_side_all_dead(self.attackers_list):
            self.msg_manager.add_msg("attackers all dead");
            return True;
        return False;


    @staticmethod
    def get_all_alive(monster_list):
        return filter(lambda  attack:attack.hp > 0, monster_list);

    def do_one_frame(self):
        self.msg_manager.clear_one_round_msg();
        # 处理帧开始的事件,例如时间注册函数(buff到期,dot的执行和到期)
        self.event_manager.handle_event_list(EventManager.FRAME_EVENT_KEY);

        if self.is_end():
            print(self.msg_manager.send_msg());
            self.msg_manager.send_msg();
            return False;

        #执行玩家操作
        self.execute_actors();

        if self.is_end():
            self.msg_manager.send_msg();
            self.msg_manager.send_msg();
            return False;

        # 处理玩家操作使得使用的技能的事件
        self.event_manager.handle_event_list(EventManager.ACTION_EVENT_KEY);

        # 处理技能释放出来未经过处理的伤害增益buff等
        self.event_manager.handle_event_list(EventManager.FILTER_EFFECT_EVENT_KEY);

        # 处理实际最后增减释放过的伤害buff等
        self.event_manager.handle_event_list(EventManager.REAL_EFFECT_EVENT_KEY);

        if self.is_end():
            self.msg_manager.send_msg();
            self.msg_manager.send_msg();
            return False;
        self.msg_manager.send_msg();
        print("frame" + str(self.frame) + ":===================")
        time.sleep(2);
        return True;

    def all_run(self):
        while self.do_one_frame():
            self.frame += 1;