Example #1
0
def hp_min_attack(value, attacker, target_units):
    target_units_lst = target_units.values()
    target_units_lst = sorted(target_units_lst,
                              key=lambda unit: unit.hp_percent)
    logger_cal.debug("hp百分比最少:")
    logger_cal.debug("%s" % target_units_lst)
    return target_units_lst[:value]
Example #2
0
    def perform_round(self):
        """
        perform mock battle, logger_cal.debug(battle process.)
        """
        logger_cal.debug("回合开始前,执行buff")
        self.perform_buff(self._red_units)
        self.perform_buff(self._blue_units)
        for i in range(1, 7):
            red_unit = self._red_units.get(i)
            self.handle_mock_special_skill(self._red_best_skill)
            if red_unit:
                logger_cal.debug(("red_%d" % i) + "-" * 20 + "我方攻击" + "-" * 20)
                self.perform_one_skill(self._red_units, self._blue_units,
                                       red_unit.skill)
                self._red_best_skill.add_mp()
                self._blue_best_skill.add_mp()
                logger_cal.debug("    ")
            self.handle_mock_special_skill(self._blue_best_skill)
            blue_unit = self._blue_units.get(i)
            if blue_unit:
                logger_cal.debug(("blue_%d" % i) + "-" * 20 + "敌方攻击" +
                                 "-" * 20)
                self.perform_one_skill(self._blue_units, self._red_units,
                                       blue_unit.skill)
                self._red_best_skill.add_mp()
                self._blue_best_skill.add_mp()
                logger_cal.debug("    ")

        self.remove_buff(self._red_units)
        self.remove_buff(self._blue_units)
        return self._red_units, self._blue_units
Example #3
0
    def perform_round(self):
        """
        perform mock battle, logger_cal.debug(battle process.)
        """
        logger_cal.debug("回合开始前,执行buff")
        self.perform_buff(self._red_units)
        self.perform_buff(self._blue_units)
        for i in range(1, 7):
            red_unit = self._red_units.get(i)
            self.handle_mock_special_skill(self._red_best_skill)
            if red_unit:
                logger_cal.debug(("red_%d" % i) + "-" * 20 + "我方攻击" + "-" * 20)
                self.perform_one_skill(self._red_units, self._blue_units, red_unit.skill)
                self._red_best_skill.add_mp()
                self._blue_best_skill.add_mp()
                logger_cal.debug("    ")
            self.handle_mock_special_skill(self._blue_best_skill)
            blue_unit = self._blue_units.get(i)
            if blue_unit:
                logger_cal.debug(("blue_%d" % i) + "-" * 20 + "敌方攻击" + "-" * 20)
                self.perform_one_skill(self._blue_units, self._red_units, blue_unit.skill)
                self._red_best_skill.add_mp()
                self._blue_best_skill.add_mp()
                logger_cal.debug("    ")

        self.remove_buff(self._red_units)
        self.remove_buff(self._blue_units)
        return self._red_units, self._blue_units
Example #4
0
    def perform_buff(self, owner):
        if not self._target_side: return
        effect_id = self._skill_buff_info.effectId
        if effect_id in [1, 2, 3, 8, 9, 26]:
            logger_cal.debug("执行buff %s" % self._skill_buff_info.id)
            self._continue_num -= 1

        if effect_id in [1, 2]:
            block_or_not = False
            if self._skill_buff_info.skill_key == 1:
                block_or_not = self._is_block
            else:
                block_or_not = check_block(self._attacker, owner, self._skill_buff_info)

            execute_demage(self._attacker, owner, self._skill_buff_info, block_or_not)
        elif effect_id in [3]:
            execute_pure_demage(self._attacker, owner, self._skill_buff_info)
        elif effect_id in [8, 9]:
            execute_mp(owner, self._skill_buff_info)
        elif effect_id in [26]:
            execute_treat(self._attacker, owner, self._skill_buff_info)

        if owner.hp<=0 and owner.slot_no in self._target_side:
            logger.debug(owner.hp)
            logger.debug(self._target_side)
            logger.debug(owner.slot_no)

            del self._target_side[owner.slot_no]
            logger_cal.debug("%s死了。" % owner.unit_no)
Example #5
0
    def perform_buff(self, owner):
        if not self._target_side: return
        effect_id = self._skill_buff_info.effectId
        if effect_id in [1, 2, 3, 8, 9, 26]:
            logger_cal.debug("执行buff %s" % self._skill_buff_info.id)
            self._continue_num -= 1

        if effect_id in [1, 2]:
            block_or_not = False
            if self._skill_buff_info.skill_key == 1:
                block_or_not = self._is_block
            else:
                block_or_not = check_block(self._attacker, owner,
                                           self._skill_buff_info)

            execute_demage(self._attacker, owner, self._skill_buff_info,
                           block_or_not)
        elif effect_id in [3]:
            execute_pure_demage(self._attacker, owner, self._skill_buff_info)
        elif effect_id in [8, 9]:
            execute_mp(owner, self._skill_buff_info)
        elif effect_id in [26]:
            execute_treat(self._attacker, owner, self._skill_buff_info)

        if owner.hp <= 0 and owner.slot_no in self._target_side:
            logger.debug(owner.hp)
            logger.debug(self._target_side)
            logger.debug(owner.slot_no)

            del self._target_side[owner.slot_no]
            logger_cal.debug("%s死了。" % owner.unit_no)
Example #6
0
    def process(self):
        """docstring for process"""
        battle_round = BattleRound()
        if not battle_round.init_round(self._red_units, self._red_best_skill,
                                       self._blue_units, self._blue_best_skill,
                                       self._firent_skill):
            return True
        logger_cal.debug("开始战斗...")

        #return True, 0
        blue_units = None
        for i in range(game_configs.base_config.get("max_times_fight")):
            i = i + 1
            logger_cal.debug("第%d回合......" % i)
            red_units, blue_units = battle_round.perform_round()
            result = battle_round.result
            if result == 0: continue
            if result == 1:
                logger_cal.debug("我赢了。")
                return True, 0
            if result == -1:
                logger_cal.debug("我输了。")
                return False, blue_units.get(5).hp
        logger_cal.debug("我输了。")
        return False, blue_units.get(5).hp
Example #7
0
def mp_max_attack(value, attacker, target_units):
    target_units_lst = target_units.values()
    target_units_lst = sorted(target_units_lst,
                              key=lambda unit: unit.mp,
                              reverse=True)
    logger_cal.debug("mp最多:")
    logger_cal.debug("%s" % target_units_lst)
    return target_units_lst[:value]
Example #8
0
def execute_mp(target, skill_buff_info):
    """
    mp: 8,9
    """
    if skill_buff_info.effectId == 8:
        logger_cal.debug("mp 增加%s" % skill_buff_info.valueEffect)
        target.mp += skill_buff_info.valueEffect
    elif skill_buff_info.effectId == 9:
        target.mp -= skill_buff_info.valueEffect
        logger_cal.debug("mp 减少%s" % skill_buff_info.valueEffect)
Example #9
0
def execute_mp(target, skill_buff_info):
    """
    mp: 8,9
    """
    if skill_buff_info.effectId == 8:
        logger_cal.debug("mp 增加%s" % skill_buff_info.valueEffect)
        target.mp += skill_buff_info.valueEffect
    elif skill_buff_info.effectId == 9:
        target.mp -= skill_buff_info.valueEffect
        logger_cal.debug("mp 减少%s" % skill_buff_info.valueEffect)
Example #10
0
 def remove(self):
     """docstring for remove"""
     for k, value in self._buffs.items():
         temp = []
         for buff in value:
             buff.continue_num -= 1
             if buff.continue_num > 0:
                 temp.append(buff)
             else:
                 logger_cal.debug("去除buff %s", buff.skill_buff_info.id)
         self._buffs[k] = temp
Example #11
0
 def remove(self):
     """docstring for remove"""
     for k, value in self._buffs.items():
         temp = []
         for buff in value:
             buff.continue_num -= 1
             if buff.continue_num > 0:
                 temp.append(buff)
             else:
                 logger_cal.debug("去除buff %s", buff.skill_buff_info.id)
         self._buffs[k] = temp
Example #12
0
    def init_round(self, red_units, red_best_skill, blue_units, blue_best_skill, friend_skill):
        self._red_units = copy.deepcopy(red_units)  # copy.deepcopy(red_units)
        self._red_best_skill = red_best_skill
        self._blue_units = copy.deepcopy(blue_units)
        self._blue_best_skill = blue_best_skill
        self._friend_skill = friend_skill

        if len(self._blue_units) == 0:
            logger_cal.debug("敌方人数为0!")
            return False
        self.enter_battle()
        return True
Example #13
0
    def perform_best_skill(self, army, enemy, skill):
        """执行技能:无双"""
        if not skill.is_full():
            return
        for skill_buff_info in skill.skill_buffs:
            target_units, target_side = find_target_units(None, army, enemy, skill_buff_info, None)
            demage_hp = skill.player_level * skill_buff_info.levelEffectValue
            for target_unit in target_units:
                target_unit.hp -= demage_hp
            logger_cal.debug("无双的伤害值为 %s" % demage_hp)

        skill.reset_mp()
Example #14
0
    def set_mp(self, is_mp_skill):
        """
        攻击结束后,修改怒气值。
        """
        if not is_mp_skill:
            self._mp += self._mp_step
            logger_cal.debug("正常添加 mp:%s" % self._mp_step)
            if self._mp > self._mp_max:
                self._mp = self._mp_max

        else:
            self._mp = self._owner._mp_base
            logger_cal.debug("重置 mp: %s" % self._mp)
Example #15
0
    def set_mp(self, is_mp_skill):
        """
        攻击结束后,修改怒气值。
        """
        if not is_mp_skill:
            self._mp += self._mp_step
            logger_cal.debug("正常添加 mp:%s" % self._mp_step)
            if self._mp > self._mp_max:
                self._mp = self._mp_max

        else:
            self._mp = self._owner._mp_base
            logger_cal.debug("重置 mp: %s" % self._mp)
Example #16
0
    def perform_best_skill(self, army, enemy, skill):
        """执行技能:无双"""
        if not skill.is_full():
            return
        for skill_buff_info in skill.skill_buffs:
            target_units, target_side = find_target_units(
                None, army, enemy, skill_buff_info, None)
            demage_hp = skill.player_level * skill_buff_info.levelEffectValue
            for target_unit in target_units:
                target_unit.hp -= demage_hp
            logger_cal.debug("无双的伤害值为 %s" % demage_hp)

        skill.reset_mp()
Example #17
0
    def init_round(self, red_units, red_best_skill, blue_units,
                   blue_best_skill, friend_skill):
        self._red_units = copy.deepcopy(red_units)  # copy.deepcopy(red_units)
        self._red_best_skill = red_best_skill
        self._blue_units = copy.deepcopy(blue_units)
        self._blue_best_skill = blue_best_skill
        self._friend_skill = friend_skill

        if len(self._blue_units) == 0:
            logger_cal.debug("敌方人数为0!")
            return False
        self.enter_battle()
        return True
Example #18
0
 def process(self):
     """docstring for process"""
     battle_round = BattleRound()
     battle_round.init_round(self._red_units, self._red_best_skill, self._blue_groups.pop(0),
                             friend_skill=self._friend_skill)
     while True:
         battle_round.perform_round()
         result = battle_round.result
         if result == 0: continue
         if result == 1 and self.blue_groups:
             battle_round.init_round(self._red_units, self._red_best_skill, self._blue_groups.pop(0),
                                     friend_skill=self._friend_skill)
             continue
         if result == 1:
             logger_cal.debug("I finally win the battle.")
             break
         if result == -1:
             logger_cal.debug("I finally lose the battle.")
             break
Example #19
0
    def add(self, buff):
        """
        add a buff.
        """
        if not check_trigger(buff.skill_buff_info):
            return
        logger_cal.debug("添加buff: %s" % buff.skill_buff_info.id)
        effect_id = buff.skill_buff_info.effectId
        if effect_id not in self._buffs:
            self._buffs[effect_id] = []

        if buff.skill_buff_info.overlay:
            self._add_buff(buff, effect_id)
        elif not buff.skill_buff_info.overlay:
            if self._buffs[effect_id]:
                temp = self._buffs[effect_id][0]
                if temp.skill_buff_info.replace <= buff.skill_buff_info.replace:
                    self._add_buff(buff, effect_id, True)
            else:
                self._add_buff(buff, effect_id)
Example #20
0
    def add(self, buff):
        """
        add a buff.
        """
        if not check_trigger(buff.skill_buff_info):
            return
        logger_cal.debug("添加buff: %s" % buff.skill_buff_info.id)
        effect_id = buff.skill_buff_info.effectId
        if effect_id not in self._buffs:
            self._buffs[effect_id] = []

        if buff.skill_buff_info.overlay:
            self._add_buff(buff, effect_id)
        elif not buff.skill_buff_info.overlay:
            if self._buffs[effect_id]:
                temp = self._buffs[effect_id][0]
                if temp.skill_buff_info.replace <= buff.skill_buff_info.replace:
                    self._add_buff(buff, effect_id, True)
            else:
                self._add_buff(buff, effect_id)
Example #21
0
    def enter_battle(self):
        """
        在战斗开始前,进行触发类别为2的突破技能buff
        """
        logger_cal.debug("    进入战场,添加的buff...")
        for temp in self._red_units.values():
            for skill_buff_info in temp.skill.begin_skill_buffs():
                target_units, target_side = find_target_units(
                    temp, self._red_units, self._blue_units, skill_buff_info)
                self.handle_skill_buff(temp, target_side, target_units,
                                       skill_buff_info)
                if DEBUG:
                    target_nos = []
                    for temp in target_units:
                        target_nos.append(temp.slot_no)
                    logger_cal.debug("    作用目标: %s" % (target_nos))

        for temp in self._blue_units.values():
            for skill_buff_info in temp.skill.begin_skill_buffs():
                target_units, target_side = find_target_units(
                    temp, self._blue_units, self._red_units, skill_buff_info)
                self.handle_skill_buff(temp, target_side, target_units,
                                       skill_buff_info)
                if DEBUG:
                    target_nos = []
                    for temp in target_units:
                        target_nos.append(temp.slot_no)
                    logger_cal.debug("    作用目标: %s" % (target_nos))
Example #22
0
 def process(self):
     """docstring for process"""
     battle_round = BattleRound()
     battle_round.init_round(self._red_units,
                             self._red_best_skill,
                             self._blue_groups.pop(0),
                             friend_skill=self._friend_skill)
     while True:
         battle_round.perform_round()
         result = battle_round.result
         if result == 0: continue
         if result == 1 and self.blue_groups:
             battle_round.init_round(self._red_units,
                                     self._red_best_skill,
                                     self._blue_groups.pop(0),
                                     friend_skill=self._friend_skill)
             continue
         if result == 1:
             logger_cal.debug("I finally win the battle.")
             break
         if result == -1:
             logger_cal.debug("I finally lose the battle.")
             break
Example #23
0
    def handle_skill_buff(self, attacker, target_side, target_units, skill_buff_info):
        """
        根据作用位置找到攻击目标,然后执行技能或者添加buff
        """
        logger_cal.debug("-" * 80)
        for target_unit in target_units:
            buff = Buff(target_side, attacker, skill_buff_info)
            target_unit.buff_manager.add(buff)

        logger_cal.debug("    技能或buffID:%s, 受击后的状态:" % (skill_buff_info.id))

        for temp in target_units:
            if temp.hp > 0:
                logger_cal.debug("    %s" % temp)

        logger_cal.debug("-" * 80)
Example #24
0
    def process(self):
        """docstring for process"""
        battle_round = BattleRound()
        if not battle_round.init_round(self._red_units, self._red_best_skill, self._blue_units, self._blue_best_skill, self._firent_skill):
            return True
        logger_cal.debug("开始战斗...")

        #return True, 0
        blue_units = None
        for i in range(game_configs.base_config.get("max_times_fight")):
            i = i + 1
            logger_cal.debug("第%d回合......" % i)
            red_units, blue_units = battle_round.perform_round()
            result = battle_round.result
            if result == 0: continue
            if result == 1:
                logger_cal.debug("我赢了。")
                return True, 0
            if result == -1:
                logger_cal.debug("我输了。")
                return False, blue_units.get(5).hp
        logger_cal.debug("我输了。")
        return False, blue_units.get(5).hp
Example #25
0
    def handle_skill_buff(self, attacker, target_side, target_units,
                          skill_buff_info):
        """
        根据作用位置找到攻击目标,然后执行技能或者添加buff
        """
        logger_cal.debug("-" * 80)
        for target_unit in target_units:
            buff = Buff(target_side, attacker, skill_buff_info)
            target_unit.buff_manager.add(buff)

        logger_cal.debug("    技能或buffID:%s, 受击后的状态:" % (skill_buff_info.id))

        for temp in target_units:
            if temp.hp > 0:
                logger_cal.debug("    %s" % temp)

        logger_cal.debug("-" * 80)
Example #26
0
    def enter_battle(self):
        """
        在战斗开始前,进行触发类别为2的突破技能buff
        """
        logger_cal.debug("    进入战场,添加的buff...")
        for temp in self._red_units.values():
            for skill_buff_info in temp.skill.begin_skill_buffs():
                target_units, target_side = find_target_units(temp, self._red_units, self._blue_units, skill_buff_info)
                self.handle_skill_buff(temp, target_side, target_units, skill_buff_info)
                if DEBUG:
                    target_nos = []
                    for temp in target_units:
                        target_nos.append(temp.slot_no)
                    logger_cal.debug("    作用目标: %s" % (target_nos))

        for temp in self._blue_units.values():
            for skill_buff_info in temp.skill.begin_skill_buffs():
                target_units, target_side = find_target_units(temp, self._blue_units, self._red_units, skill_buff_info)
                self.handle_skill_buff(temp, target_side, target_units, skill_buff_info)
                if DEBUG:
                    target_nos = []
                    for temp in target_units:
                        target_nos.append(temp.slot_no)
                    logger_cal.debug("    作用目标: %s" % (target_nos))
Example #27
0
    def __init__(self, red_units, red_best_skill_no, red_player_level,
                 blue_units, blue_best_skill_no, blue_player_level):
        self._red_units = red_units
        self._blue_units = blue_units

        self._red_best_skill = BestSkill(
            red_best_skill_no,
            red_player_level) if red_best_skill_no else BestSkillNone()
        self._blue_best_skill = BestSkill(
            blue_best_skill_no,
            blue_player_level) if blue_best_skill_no else BestSkillNone()
        self._firent_skill = FriendSkillNone()
        logger_cal.debug("我方阵容:")
        for k, v in self._red_units.items():
            logger_cal.debug("%d %s" % (k, v))
        logger_cal.debug("-" * 80)
        logger_cal.debug("敌方阵容:")
        for k, v in self._blue_units.items():
            logger_cal.debug("%d %s" % (k, v))
        logger_cal.debug("-" * 80)
Example #28
0
    def __init__(self, red_units, red_player_level, red_best_skill_no, blue_units, debuff_no=0):
        self._red_units = red_units
        self._blue_units = blue_units

        # add debuff
        skill_info = game_configs.skill_config.get(debuff_no)
        if skill_info:
            for k, v in blue_units.items():
                for temp in skill_info.group:
                    skill_buff_info = game_configs.skill_buff_config.get(temp)
                    if not skill_buff_info:
                        continue

                    buff = Buff(blue_units, None, skill_buff_info)
                    v.buff_manager.add(buff)

        self._red_best_skill = BestSkill(red_best_skill_no, red_player_level) if red_best_skill_no else BestSkillNone()
        self._blue_best_skill = BestSkillNone()
        self._firent_skill = FriendSkillNone()
        logger_cal.debug("我方阵容:")
        for k, v in self._red_units.items():
            logger_cal.debug("%d %s" % (k, v))
        logger_cal.debug("-" * 80)
        logger_cal.debug("敌方阵容:")
        for k, v in self._blue_units.items():
            logger_cal.debug("%d %s" % (k, v))
        logger_cal.debug("-" * 80)
Example #29
0
 def __init__(self, red_units, red_best_skill, red_player_level, blue_groups, blue_player_level, friend_skill):
     super(BattlePVEProcess, self).__init__()
     self._red_units = red_units
     self._blue_groups = blue_groups
     self._red_best_skill = red_best_skill
     self._friend_skill = friend_skill
     logger_cal.debug("我方阵容:")
     for k, v in self._red_units.items():
         logger_cal.debug(k, v)
     logger_cal.debug("-" * 80)
     logger_cal.debug("敌方阵容:")
     for item in blue_groups:
         for k, v in item.items():
             logger_cal.debug(k, v)
         logger_cal.debug('next group:')
     logger_cal.debug("-" * 80)
Example #30
0
def mp_min_attack(value, attacker, target_units):
    target_units_lst = target_units.values()
    target_units_lst = sorted(target_units_lst, key=lambda unit: unit.mp)
    logger_cal.debug("mp最少:")
    logger_cal.debug("%s" % target_units_lst)
    return target_units_lst[:value]
Example #31
0
def execute_demage(attacker, target, skill_buff_info, is_block):
    """
    执行技能[1,2]
    """
    logger_cal.debug("    攻方 no(%d), unit_no(%d), name(%s), hp(%f), mp(%f), buff(%s)" % (attacker.slot_no, attacker.unit_no, attacker.unit_name, attacker.hp, attacker.mp, attacker.buff_manager))
    logger_cal.debug("    守方 no(%d), unit_no(%d), name(%s), hp(%f), mp(%f), buff(%s)" % (target.slot_no, target.unit_no, target.unit_name, target.hp, target.mp, target.buff_manager))

    is_cri = False # 是否暴击
    if check_cri(attacker.cri, target.ductility):
        is_cri = True

    k1 = attacker.atk # 攻方总实际攻击力
    k2 = 0            # 守方总物理或者魔法防御
    if skill_buff_info.effectId == 1:
        k2 = target.physical_def
    elif skill_buff_info.effectId == 2:
        k2 = target.magic_def

    # 1.base_demage_value 基础伤害值
    base_demage_vars = dict(atkArray=k1,
                            def2=k2,
                            heroLevel=attacker.level)

    base_demage_formula = game_configs.formula_config.get("baseDamage").get("formula")
    assert base_demage_formula!=None, "baseDamage formula can not be None!"
    base_demage_value = eval(base_demage_formula, base_demage_vars)

    # 2.cri_coeff 暴击伤害系数
    cri_coeff_vars = dict(criCoeffArray1=attacker.cri_coeff,
                          criDedCoeffArray2=target.cri_ded_coeff)

    cri_coeff_formula = game_configs.formula_config.get("criDamage").get("formula")
    assert cri_coeff_formula!=None, "criDamage formula can not be None!"
    cri_coeff = eval(cri_coeff_formula, cri_coeff_vars)

    # 3. levelDamage 等级压制系数
    level_coeff_vars = dict(heroLevel1=attacker.level,
                          heroLevel2=target.level)

    level_coeff_formula = game_configs.formula_config.get("levelDamage").get("formula")
    assert level_coeff_formula!=None, "levelDamage formula can not be None!"
    level_coeff = eval(level_coeff_formula, level_coeff_vars)

    # 4. floatDamage 等级压制系数
    temp = game_configs.base_config.get("a6")                           # 伤害浮动调整参数
    k1, k2 = temp[0], temp[1]                              #
    float_coeff_vars = dict(k1=k1,
                            k2=k2,
                            random=get_random_int(0, 99))
    float_coeff_formula = game_configs.formula_config.get("floatDamage").get("formula")
    assert float_coeff_formula!=None, "levelDamage formula can not be None!"
    float_coeff = eval(float_coeff_formula, float_coeff_vars)

    # 5. allDamage
    total_demage_vars = dict(baseDamage=base_demage_value,
                             isHit=True,
                             criDamage=cri_coeff,
                             isCri=is_cri,
                             isBlock=is_block,
                             levelDamage=level_coeff,
                             floatDamage=float_coeff)

    total_demage_formula = game_configs.formula_config.get("allDamage").get("formula")
    assert total_demage_formula!=None, "allDamage formula can not be None!"
    total_demage = eval(total_demage_formula, total_demage_vars) # 总伤害值

    all_vars = dict(
        skill_buff=skill_buff_info,
        allDamage=total_demage,
        valueEffect=skill_buff_info.valueEffect,
        levelEffectValue=skill_buff_info.levelEffectValue,
        heroLevel=attacker.level
    )
    actual_demage_1 = actual_value("damage_1", all_vars)
    actual_demage_2 = actual_value("damage_2", all_vars)

    logger_cal.debug("    技能ID(%d),暴击(%s),格挡(%s),基础伤害值(%s),暴击伤害系数(%s),等级压制系数(%s),伤害浮动系数(%s),总伤害值(%s),攻方实际伤害值(%s)" \
    % (skill_buff_info.id, is_cri, is_block, base_demage_value, cri_coeff, level_coeff, float_coeff,
            total_demage, actual_demage_1))
    target.hp = target.hp - actual_demage_1 - actual_demage_2
Example #32
0
 def perform_buff(self, units):
     for k, temp in units.items():
         logger_cal.debug("武将: %s" % temp.unit_no)
         temp.buff_manager.perform_buff()
Example #33
0
def execute_demage(attacker, target, skill_buff_info, is_block):
    """
    执行技能[1,2]
    """
    logger_cal.debug(
        "    攻方 no(%d), unit_no(%d), name(%s), hp(%f), mp(%f), buff(%s)" %
        (attacker.slot_no, attacker.unit_no, attacker.unit_name, attacker.hp,
         attacker.mp, attacker.buff_manager))
    logger_cal.debug(
        "    守方 no(%d), unit_no(%d), name(%s), hp(%f), mp(%f), buff(%s)" %
        (target.slot_no, target.unit_no, target.unit_name, target.hp,
         target.mp, target.buff_manager))

    is_cri = False  # 是否暴击
    if check_cri(attacker.cri, target.ductility):
        is_cri = True

    k1 = attacker.atk  # 攻方总实际攻击力
    k2 = 0  # 守方总物理或者魔法防御
    if skill_buff_info.effectId == 1:
        k2 = target.physical_def
    elif skill_buff_info.effectId == 2:
        k2 = target.magic_def

    # 1.base_demage_value 基础伤害值
    base_demage_vars = dict(atkArray=k1, def2=k2, heroLevel=attacker.level)

    base_demage_formula = game_configs.formula_config.get("baseDamage").get(
        "formula")
    assert base_demage_formula != None, "baseDamage formula can not be None!"
    base_demage_value = eval(base_demage_formula, base_demage_vars)

    # 2.cri_coeff 暴击伤害系数
    cri_coeff_vars = dict(criCoeffArray1=attacker.cri_coeff,
                          criDedCoeffArray2=target.cri_ded_coeff)

    cri_coeff_formula = game_configs.formula_config.get("criDamage").get(
        "formula")
    assert cri_coeff_formula != None, "criDamage formula can not be None!"
    cri_coeff = eval(cri_coeff_formula, cri_coeff_vars)

    # 3. levelDamage 等级压制系数
    level_coeff_vars = dict(heroLevel1=attacker.level, heroLevel2=target.level)

    level_coeff_formula = game_configs.formula_config.get("levelDamage").get(
        "formula")
    assert level_coeff_formula != None, "levelDamage formula can not be None!"
    level_coeff = eval(level_coeff_formula, level_coeff_vars)

    # 4. floatDamage 等级压制系数
    temp = game_configs.base_config.get("a6")  # 伤害浮动调整参数
    k1, k2 = temp[0], temp[1]  #
    float_coeff_vars = dict(k1=k1, k2=k2, random=get_random_int(0, 99))
    float_coeff_formula = game_configs.formula_config.get("floatDamage").get(
        "formula")
    assert float_coeff_formula != None, "levelDamage formula can not be None!"
    float_coeff = eval(float_coeff_formula, float_coeff_vars)

    # 5. allDamage
    total_demage_vars = dict(baseDamage=base_demage_value,
                             isHit=True,
                             criDamage=cri_coeff,
                             isCri=is_cri,
                             isBlock=is_block,
                             levelDamage=level_coeff,
                             floatDamage=float_coeff)

    total_demage_formula = game_configs.formula_config.get("allDamage").get(
        "formula")
    assert total_demage_formula != None, "allDamage formula can not be None!"
    total_demage = eval(total_demage_formula, total_demage_vars)  # 总伤害值

    all_vars = dict(skill_buff=skill_buff_info,
                    allDamage=total_demage,
                    valueEffect=skill_buff_info.valueEffect,
                    levelEffectValue=skill_buff_info.levelEffectValue,
                    heroLevel=attacker.level)
    actual_demage_1 = actual_value("damage_1", all_vars)
    actual_demage_2 = actual_value("damage_2", all_vars)

    logger_cal.debug("    技能ID(%d),暴击(%s),格挡(%s),基础伤害值(%s),暴击伤害系数(%s),等级压制系数(%s),伤害浮动系数(%s),总伤害值(%s),攻方实际伤害值(%s)" \
    % (skill_buff_info.id, is_cri, is_block, base_demage_value, cri_coeff, level_coeff, float_coeff,
            total_demage, actual_demage_1))
    target.hp = target.hp - actual_demage_1 - actual_demage_2
Example #34
0
def mp_min_attack(value, attacker, target_units):
    target_units_lst = target_units.values()
    target_units_lst = sorted(target_units_lst, key=lambda unit: unit.mp)
    logger_cal.debug("mp最少:")
    logger_cal.debug("%s" % target_units_lst)
    return target_units_lst[:value]
Example #35
0
def hp_min_attack(value, attacker, target_units):
    target_units_lst = target_units.values()
    target_units_lst = sorted(target_units_lst, key=lambda unit: unit.hp_percent)
    logger_cal.debug("hp百分比最少:")
    logger_cal.debug("%s" % target_units_lst)
    return target_units_lst[:value]
Example #36
0
    def __init__(self,
                 red_units,
                 red_player_level,
                 red_best_skill_no,
                 blue_units,
                 debuff_no=0):
        self._red_units = red_units
        self._blue_units = blue_units

        # add debuff
        skill_info = game_configs.skill_config.get(debuff_no)
        if skill_info:
            for k, v in blue_units.items():
                for temp in skill_info.group:
                    skill_buff_info = game_configs.skill_buff_config.get(temp)
                    if not skill_buff_info:
                        continue

                    buff = Buff(blue_units, None, skill_buff_info)
                    v.buff_manager.add(buff)

        self._red_best_skill = BestSkill(
            red_best_skill_no,
            red_player_level) if red_best_skill_no else BestSkillNone()
        self._blue_best_skill = BestSkillNone()
        self._firent_skill = FriendSkillNone()
        logger_cal.debug("我方阵容:")
        for k, v in self._red_units.items():
            logger_cal.debug("%d %s" % (k, v))
        logger_cal.debug("-" * 80)
        logger_cal.debug("敌方阵容:")
        for k, v in self._blue_units.items():
            logger_cal.debug("%d %s" % (k, v))
        logger_cal.debug("-" * 80)
Example #37
0
def mp_max_attack(value, attacker, target_units):
    target_units_lst = target_units.values()
    target_units_lst = sorted(target_units_lst, key=lambda unit: unit.mp, reverse=True)
    logger_cal.debug("mp最多:")
    logger_cal.debug("%s" % target_units_lst)
    return target_units_lst[:value]
Example #38
0
 def __init__(self, red_units, red_best_skill, red_player_level,
              blue_groups, blue_player_level, friend_skill):
     super(BattlePVEProcess, self).__init__()
     self._red_units = red_units
     self._blue_groups = blue_groups
     self._red_best_skill = red_best_skill
     self._friend_skill = friend_skill
     logger_cal.debug("我方阵容:")
     for k, v in self._red_units.items():
         logger_cal.debug(k, v)
     logger_cal.debug("-" * 80)
     logger_cal.debug("敌方阵容:")
     for item in blue_groups:
         for k, v in item.items():
             logger_cal.debug(k, v)
         logger_cal.debug('next group:')
     logger_cal.debug("-" * 80)
Example #39
0
    def perform_one_skill(self, army, enemy, skill):
        """执行技能:普通技能或者怒气技能"""
        attacker = skill.owner


        is_mp_skill = skill.is_mp_skill()
        logger_cal.debug("is_mp_skill %s" % is_mp_skill)
        logger_cal.debug("    进行攻击: 攻击者位置(%d), 攻击者(%d), 主技能ID(%d), buff(%s)" % \
                         (attacker.slot_no, attacker.unit_no, skill.main_skill_buff.id, attacker.buff_manager))

        if not attacker.buff_manager.is_dizzy():
            logger_cal.debug("    攻击者在buff中,无法攻击!")
            return

        main_target_units, main_target_side = find_target_units(attacker, army, enemy, skill.main_skill_buff)  # 主技能作用目标

        # 1.计算命中, 格挡
        # 规则:主技能作用多个目标,只要有一个命中的,则判定命中
        is_main_hit = False
        main_target_unit_infos = []

        for target_unit in main_target_units:
            if check_hit(skill.main_skill_buff, attacker.hit, target_unit.dodge):
                is_main_hit = True
            block_or_not = check_block(attacker, target_unit, skill.main_skill_buff)
            main_target_unit_infos.append((target_unit, block_or_not))


        logger_cal.debug("    是否命中:%s" % is_main_hit)
        # 2.主技能释放前,触发的buff
        logger_cal.debug("    1. 攻击前, 添加的buff")
        for skill_buff_info in skill.before_skill_buffs(is_main_hit):
            target_units, target_side = find_target_units(attacker, army, enemy, skill_buff_info, main_target_units)
            self.handle_skill_buff(attacker, target_side, target_units, skill_buff_info)

        # 3.触发攻击技能
        logger_cal.debug("    2. 攻击...")
        for skill_buff_info in skill.attack_skill_buffs():
            if not is_main_hit and skill_buff_info.skill_key and skill_buff_info.effectId in (1, 2, 3):
                # 当攻击主技能没有命中,则退出
                break
            if skill_buff_info.skill_key:
                self.handle_skill_buff(attacker, main_target_side, main_target_units, skill_buff_info)
                continue
            target_units, target_side = find_target_units(attacker, army, enemy, skill_buff_info, main_target_units)
            self.handle_skill_buff(attacker, target_side, target_units, skill_buff_info)


        # 4.主技能释放后,触发的buff
        logger_cal.debug("    3. 攻击后的buff...")
        for skill_buff_info in skill.after_skill_buffs(is_main_hit):
            target_units, target_side = find_target_units(attacker, army, enemy, skill_buff_info, main_target_units)
            self.handle_skill_buff(attacker, target_side, target_units, skill_buff_info)
        # 在攻击技能触发完成后,处理mp
        skill.set_mp(is_mp_skill)

        # 5. 反击
        for backer, is_block in main_target_unit_infos:
            for skill_buff_info in backer.skill.back_skill_buffs(is_main_hit, is_block):
                target_units, target_side = find_target_units(backer, army, enemy, skill_buff_info, main_target_units=None, target=attacker)
                target_nos = []
                for temp in target_units:
                    target_nos.append(temp.slot_no)
                logger_cal.debug("    反击目标: %s" % (target_nos))
                buff = Buff(target_side, attacker, skill_buff_info, is_block)
                target_unit.buff_manager.add(buff)
Example #40
0
    def __init__(self, red_units, red_best_skill_no, red_player_level, blue_units, blue_best_skill_no, blue_player_level):
        self._red_units = red_units
        self._blue_units = blue_units

        self._red_best_skill = BestSkill(red_best_skill_no, red_player_level) if red_best_skill_no else BestSkillNone()
        self._blue_best_skill = BestSkill(blue_best_skill_no, blue_player_level) if blue_best_skill_no else BestSkillNone()
        self._firent_skill = FriendSkillNone()
        logger_cal.debug("我方阵容:")
        for k, v in self._red_units.items():
            logger_cal.debug("%d %s" % (k, v))
        logger_cal.debug("-" * 80)
        logger_cal.debug("敌方阵容:")
        for k, v in self._blue_units.items():
            logger_cal.debug("%d %s" % (k, v))
        logger_cal.debug("-" * 80)
Example #41
0
    def perform_one_skill(self, army, enemy, skill):
        """执行技能:普通技能或者怒气技能"""
        attacker = skill.owner

        is_mp_skill = skill.is_mp_skill()
        logger_cal.debug("is_mp_skill %s" % is_mp_skill)
        logger_cal.debug("    进行攻击: 攻击者位置(%d), 攻击者(%d), 主技能ID(%d), buff(%s)" % \
                         (attacker.slot_no, attacker.unit_no, skill.main_skill_buff.id, attacker.buff_manager))

        if not attacker.buff_manager.is_dizzy():
            logger_cal.debug("    攻击者在buff中,无法攻击!")
            return

        main_target_units, main_target_side = find_target_units(
            attacker, army, enemy, skill.main_skill_buff)  # 主技能作用目标

        # 1.计算命中, 格挡
        # 规则:主技能作用多个目标,只要有一个命中的,则判定命中
        is_main_hit = False
        main_target_unit_infos = []

        for target_unit in main_target_units:
            if check_hit(skill.main_skill_buff, attacker.hit,
                         target_unit.dodge):
                is_main_hit = True
            block_or_not = check_block(attacker, target_unit,
                                       skill.main_skill_buff)
            main_target_unit_infos.append((target_unit, block_or_not))

        logger_cal.debug("    是否命中:%s" % is_main_hit)
        # 2.主技能释放前,触发的buff
        logger_cal.debug("    1. 攻击前, 添加的buff")
        for skill_buff_info in skill.before_skill_buffs(is_main_hit):
            target_units, target_side = find_target_units(
                attacker, army, enemy, skill_buff_info, main_target_units)
            self.handle_skill_buff(attacker, target_side, target_units,
                                   skill_buff_info)

        # 3.触发攻击技能
        logger_cal.debug("    2. 攻击...")
        for skill_buff_info in skill.attack_skill_buffs():
            if not is_main_hit and skill_buff_info.skill_key and skill_buff_info.effectId in (
                    1, 2, 3):
                # 当攻击主技能没有命中,则退出
                break
            if skill_buff_info.skill_key:
                self.handle_skill_buff(attacker, main_target_side,
                                       main_target_units, skill_buff_info)
                continue
            target_units, target_side = find_target_units(
                attacker, army, enemy, skill_buff_info, main_target_units)
            self.handle_skill_buff(attacker, target_side, target_units,
                                   skill_buff_info)

        # 4.主技能释放后,触发的buff
        logger_cal.debug("    3. 攻击后的buff...")
        for skill_buff_info in skill.after_skill_buffs(is_main_hit):
            target_units, target_side = find_target_units(
                attacker, army, enemy, skill_buff_info, main_target_units)
            self.handle_skill_buff(attacker, target_side, target_units,
                                   skill_buff_info)
        # 在攻击技能触发完成后,处理mp
        skill.set_mp(is_mp_skill)

        # 5. 反击
        for backer, is_block in main_target_unit_infos:
            for skill_buff_info in backer.skill.back_skill_buffs(
                    is_main_hit, is_block):
                target_units, target_side = find_target_units(
                    backer,
                    army,
                    enemy,
                    skill_buff_info,
                    main_target_units=None,
                    target=attacker)
                target_nos = []
                for temp in target_units:
                    target_nos.append(temp.slot_no)
                logger_cal.debug("    反击目标: %s" % (target_nos))
                buff = Buff(target_side, attacker, skill_buff_info, is_block)
                target_unit.buff_manager.add(buff)
Example #42
0
 def perform_buff(self, units):
     for k, temp in units.items():
         logger_cal.debug("武将: %s" % temp.unit_no)
         temp.buff_manager.perform_buff()