Ejemplo n.º 1
0
def battle_action(dragon, foe):
    """
    логика сражения.
    :type dragon: Dragon
    :param dragon: текущий дракон
    :type foe: Enemy
    :param    foe: текущий противник
    :return: список, описывающий состояние боя
    """
    status = []
    # проверяем атаку дракона
    power = dragon.attack()
    immun = foe.immunity()
    # пробегаем все ключи словаря атаки дракона
    for key in power.keys():
        (r, p) = power[key]
        if (not (r + p)) or (key in immun):
            # удаляем нулевые атаки и те, к которым у противника иммунитет
            del power[key]
        else:
            # записываем чем дракон мог ударить в статус раунда боя
            status.append("dragon_" + key)
            # проверяем, если атака больше защиты - противника съели, иначе он еще жив
    dragon_hit = calc_hit_def(power)
    foe_defence = calc_hit_def(foe.protection())
    if dragon_hit > foe_defence:
        achieve_target(foe.name, "kill")  # событие для ачивок
        foe.die()
        status.append("foe_dead")
    else:
        status.append("foe_alive")
    # полностью зеркальная ситуация для атаки противника
    power = foe.attack()
    immun = dragon.immunity()
    # пробегаем все ключи словаря атаки противника
    for key in power.keys():
        (r, p) = power[key]
        if (not (r + p)) or (key in immun):
            # удаляем нулевые атаки и те, к которым у дракона иммунитет
            del power[key]
        else:
            # записываем чем противник мог ударить в статус раунда боя
            status.append("foe_" + key)
            # проверяем, если атака противника больше защиты дракона - дракон ранен
    foe_hit = calc_hit_def(power)
    dragon_defence = calc_hit_def(dragon.protection())
    if foe_hit > dragon_defence:
        # Если противник сразу обезглавливает дракона не наося ему ран.
        if "decapitator" in foe.modifiers():
            status.extend(dragon.decapitate())
        # А так просто наносим ранения.
        else:
            status.extend(dragon.struck())
    else:
        status.append("dragon_undamaged")
    return status
Ejemplo n.º 2
0
def battle_action(dragon, foe):
    """
    combat logic.
    :type dragon: Dragon
    :param dragon: current dragon
    :type foe: Enemy
    :param foe: current enemy
    :return: list which describes battle status
    """
    status = []
    # check dragon's attack
    power = dragon.attack()
    immun = foe.immunity()
    # check each key of the dragon's attack dictionary
    for key in power.keys():
        (r, p) = power[key]
        if (not (r + p)) or (key in immun):
            # removing null attacks and attacks enemy is immune to
            del power[key]
        else:
            # record things that dragon could attack with to a battle status
            status.append('dragon_' + key)
            # check if dragon's attack is over foe's protection, if yes foe has been eaten by dragon
    dragon_hit = calc_hit_def(power)
    foe_defence = calc_hit_def(foe.protection())
    if dragon_hit > foe_defence:
        achieve_target(foe.name, "kill")    # achievement event
        foe.die()
        status.append('foe_dead')
    else:
        status.append('foe_alive')
    # now same as before, but for foe's attack
    power = foe.attack()
    immun = dragon.immunity()
    # check each key of the foe's attack dictionary
    for key in power.keys():
        (r, p) = power[key]
        if (not (r + p)) or (key in immun):
            # removing null attacks and attacks dragon is immune to
            del power[key]
        else:
            # record things that foe could attack with to a battle status
            status.append('foe_' + key)
            # check if foe's attack if over dragon's protection, if yes dragon is wounded
    foe_hit = calc_hit_def(power)
    dragon_defence = calc_hit_def(dragon.protection())
    if foe_hit > dragon_defence:
        # If enemy decapitates dragon without wounds.
        if 'decapitator' in foe.modifiers():
            status.extend(dragon.decapitate())
        # Else just wounds.
        else:
            status.extend(dragon.struck())
    else:
        status.append('dragon_undamaged')
    return status
Ejemplo n.º 3
0
def battle_action(dragon, foe):
    """
    логика сражения.
    :type dragon: Dragon
    :param dragon: текущий дракон
    :type foe: Enemy
    :param    foe: текущий противник
    :return: список, описывающий состояние боя
    """
    status = []
    # проверяем атаку дракона
    power = dragon.attack()
    immun = foe.immunity()
    # пробегаем все ключи словаря атаки дракона
    for key in power.keys():
        (r, p) = power[key]
        if (not (r + p)) or (key in immun):
            # удаляем нулевые атаки и те, к которым у противника иммунитет
            del power[key]
        else:
            # записываем чем дракон мог ударить в статус раунда боя
            status.append('dragon_' + key)
            # проверяем, если атака больше защиты - противника съели, иначе он еще жив
    dragon_hit = calc_hit_def(power)
    foe_defence = calc_hit_def(foe.protection())
    if dragon_hit > foe_defence:
        achieve_target(foe.name, "kill")  # событие для ачивок
        foe.die()
        status.append('foe_dead')
    else:
        status.append('foe_alive')
    # полностью зеркальная ситуация для атаки противника
    power = foe.attack()
    immun = dragon.immunity()
    # пробегаем все ключи словаря атаки противника
    for key in power.keys():
        (r, p) = power[key]
        if (not (r + p)) or (key in immun):
            # удаляем нулевые атаки и те, к которым у дракона иммунитет
            del power[key]
        else:
            # записываем чем противник мог ударить в статус раунда боя
            status.append('foe_' + key)
            # проверяем, если атака противника больше защиты дракона - дракон ранен
    foe_hit = calc_hit_def(power)
    dragon_defence = calc_hit_def(dragon.protection())
    if foe_hit > dragon_defence:
        # Если противник сразу обезглавливает дракона не наося ему ран.
        if 'decapitator' in foe.modifiers():
            status.extend(dragon.decapitate())
        # А так просто наносим ранения.
        else:
            status.extend(dragon.struck())
    else:
        status.append('dragon_undamaged')
    return status
Ejemplo n.º 4
0
 def points(self, value):
     if value >= 0:
         delta = int(value - self._rp)
         if delta in reputation_gain:
             self._last_gain = delta
             self._gain += delta
             self._rp = int(value)
             achieve_target(self.level, "reputation")
         else:
             raise Exception("Cannot raise reputation. Invalid gain.")
Ejemplo n.º 5
0
 def points(self, value):
     if value >= 0:
         delta = int(value - self._rp)
         if delta in reputation_gain:
             self._last_gain = delta
             self._gain += delta
             self._rp = int(value)
             achieve_target(self.level, "reputation")
         else:
             raise Exception("Cannot raise reputation. Invalid gain.")
Ejemplo n.º 6
0
 def impregnate(self):
     """
     Осеменение женщины.
     """
     # self.description('prelude', True)
     # self.description('sex', True)
     # self.description('impregnate', True)
     self.game.girl.virgin = False
     if self.game.girl.quality < self.game.dragon.magic or \
             'impregnator' in self.game.dragon.modifiers():
         self.game.girl.pregnant = 2
     else:
         self.game.girl.pregnant = 1
     self.game.dragon.lust -= 1
     achieve_target(self.game.girl.type, "impregnate")
     return self.description('shout')
Ejemplo n.º 7
0
 def impregnate(self):
     """
     Осеменение женщины.
     """
     # self.description('prelude', True)
     # self.description('sex', True)
     # self.description('impregnate', True)
     self.game.girl.virgin = False
     if self.game.girl.quality < self.game.dragon.magic or \
             'impregnator' in self.game.dragon.modifiers():
         self.game.girl.pregnant = 2
     else:
         self.game.girl.pregnant = 1
     self.game.dragon.lust -= 1
     achieve_target(self.game.girl.type, "impregnate")
     return self.description('shout')
Ejemplo n.º 8
0
    def create_lair(self, lair_type=None):
        """
        Создание нового логова.
        """
        # Выпускаем всех женщин в прошлом логове на свободу.
        self.girls_list.free_all_girls()

        if lair_type is not None:
            # Если меняется логово на лучшее - сохраняем сокровищницу
            save_treas = self.lair.treasury
            # Создаем новое логово
            self.lair = Lair(lair_type)
            data.achieve_target(self.lair.type_name,
                                "lair")  #событие для ачивок
            # Копируем сокровищницу из прошлого логова
            self.lair.treasury = save_treas
        else:
            # определяем логово по умолчанию
            lair_list = []
            mods = self.dragon.modifiers()
            for lair in data.lair_types.iterkeys():
                # просматриваем логова, выдаваемые автоматически при выполнении требований
                if 'prerequisite' in data.lair_types[lair]:
                    prerequisite_list = data.lair_types[lair][
                        'prerequisite']  # получаем список требований к дракону
                    prerequisite_exists = True  # временная переменная для требований
                    for prerequisite in prerequisite_list:  # просматриваем список требований
                        # удостоверяемся, что список требований выполнен
                        prerequisite_exists = prerequisite_exists and prerequisite in mods
                    if prerequisite_exists:
                        # если список требований выполнен, добавляем логово к списку
                        lair_list.append((data.lair_types[lair].name, lair))
            if len(lair_list) == 0:
                lair_type = 'impassable_coomb'  # список логов пуст, выбираем начальное
            elif len(lair_list) == 1:
                lair_type = lair_list[0][
                    1]  # в списке одно логово, выбираем его автоматически
            else:
                lair_list.insert(0, (u"Выберите логово:", None))
                lair_type = renpy.display_menu(
                    lair_list
                )  # в списке больше одного логова, даём список на выбор
            self.lair = Lair(lair_type)
            data.achieve_target(self.lair.type_name,
                                "lair")  # событие для ачивок
Ejemplo n.º 9
0
    def create_lair(self, lair_type=None):
        """
        Create new lair.
        """
        # Frees all girls from old lair. 
        self.girls_list.free_all_girls()

        if lair_type is not None:
            # If lair changed for better one - save treasury
            save_treas = self.lair.treasury
            # Create new lair
            self.lair = Lair(lair_type)
            data.achieve_target(self.lair.type_name, "lair")#событие для ачивок
            # Copy treasury from old lair
            self.lair.treasury = save_treas
        else:
            # define default lair
            lair_list = []
            mods = self.dragon.modifiers()
            for lair in data.lair_types.iterkeys():
                # review lairs which are given away automatically if requirements done
                if 'prerequisite' in data.lair_types[lair]:
                    prerequisite_list = data.lair_types[lair]['prerequisite']  # get list of requirements for dragon
                    prerequisite_exists = True  # temporary variable for requirements
                    for prerequisite in prerequisite_list:  # look through requirements list
                        # Make sure that list of requirements is done
                        prerequisite_exists = prerequisite_exists and prerequisite in mods
                    if prerequisite_exists:
                        # if list of requirements is done, adding lair to a list
                        lair_list.append((data.lair_types[lair].name, lair))
            if len(lair_list) == 0:
                lair_type = 'impassable_coomb'  # list of lairs is empty, choose default
            elif len(lair_list) == 1:
                lair_type = lair_list[0][1]  # one lair in a list, choose it automatically
            else:
                lair_list.insert(0, (u"Выберите логово:", None))
                lair_type = renpy.display_menu(lair_list)  # more than one lair in list, give a list to choose from
            self.lair = Lair(lair_type)
            data.achieve_target(self.lair.type_name, "lair")# achievements event
Ejemplo n.º 10
0
    def create_lair(self, lair_type=None):
        """
        Создание нового логова.
        """
        # Выпускаем всех женщин в прошлом логове на свободу. 
        self.girls_list.free_all_girls()

        if lair_type is not None:
            # Если меняется логово на лучшее - сохраняем сокровищницу
            save_treas = self.lair.treasury
            # Создаем новое логово
            self.lair = Lair(lair_type)
            data.achieve_target(self.lair.type_name, "lair")#событие для ачивок
            # Копируем сокровищницу из прошлого логова
            self.lair.treasury = save_treas
        else:
            # определяем логово по умолчанию
            lair_list = []
            mods = self.dragon.modifiers()
            for lair in data.lair_types.iterkeys():
                # просматриваем логова, выдаваемые автоматически при выполнении требований
                if 'prerequisite' in data.lair_types[lair]:
                    prerequisite_list = data.lair_types[lair]['prerequisite']  # получаем список требований к дракону
                    prerequisite_exists = True  # временная переменная для требований
                    for prerequisite in prerequisite_list:  # просматриваем список требований
                        # удостоверяемся, что список требований выполнен
                        prerequisite_exists = prerequisite_exists and prerequisite in mods
                    if prerequisite_exists:
                        # если список требований выполнен, добавляем логово к списку
                        lair_list.append((data.lair_types[lair].name, lair))
            if len(lair_list) == 0:
                lair_type = 'impassable_coomb'  # список логов пуст, выбираем начальное
            elif len(lair_list) == 1:
                lair_type = lair_list[0][1]  # в списке одно логово, выбираем его автоматически
            else:
                lair_list.insert(0, (u"Выберите логово:", None))
                lair_type = renpy.display_menu(lair_list)  # в списке больше одного логова, даём список на выбор
            self.lair = Lair(lair_type)
            data.achieve_target(self.lair.type_name, "lair")# событие для ачивок