Задать вопрос
  • Как реализовать систему эффектов (модификаторов) накладываемых на игрока?

    @bromzh
    Drugs-driven development
    Так как ты не сказал, на каком языке пишешь, скину код на питоне:
    class Effect:
    
        def __init__(self, name, mods):
            self.name = name
            self.mods = mods
            # mods - это словарь с модификаторами
            # ключ - имя поля в классе User
            # значение - функция, которая принимает экземпляр класса User и промежуточное значение поля
            # а возвращает изменённое значение поля
    
    
    class User:
    
        def __init__(self, name, strength, agility):
            # Инициируем начальные значения
            self.name = name
            self.strength = strength
            self.health = strength * 100
            self.agility = agility
            self.effects = list()
    
        # в самом классе храним только независимые значения
        # но любой доступ к параметрам должен идти через геттер
        # для каждого необходимого параметра создаём функцию-геттер
        # которая будет учитывать применение эффектов
        # можно вместо этого использовать @property
        def get_strength(self):
            strength = self.strength
            for effect in self.effects:
                if effect.mods.get('strength'):
                    strength = effect.mods['strength'](strength, self)  # вызываем функцию - модификатор
            return strength
    
        def get_agility(self):
            agility = self.agility
            for effect in self.effects:
                if effect.mods.get('agility'):
                    agility = effect.mods['agility'](agility, self)  # вызываем функцию - модификатор
            return agility
    
        def get_health(self):
            health = self.health
            for effect in self.effects:
                if effect.mods.get('health'):
                    health = effect.mods['health'](health, self)  # вызываем функцию - модификатор
            return health
    
        # Это зависимый параметр
        def get_max_health(self):
            max_health = self.get_strength() * 100  # первоначальное значение вычисляется на основе силы
            for effect in self.effects:
                if effect.mods.get('max_health'):
                    max_health = effect.mods['max_health'](max_health, self)  # вызываем функцию - модификатор
            return max_health
    
    
    if __name__ == '__main__':
        foo = User('Foo', 10, 10)
        god_strength = Effect('God strength', {
            'strength': lambda s, u: s + 10
        })
    
        def _life_power_func(value, user):
            return value + 100
    
        life_power = Effect('Life Power', {
            'max_health': _life_power_func
        })
    
        def _extra_agility_func(value, user):
            return value + 10
    
        # этот эффект влияет сразу на 2 параметра
        extra_agility = Effect('Extra agility', {
            'agility': _extra_agility_func,
            'max_health': lambda h, u: h - 400
        })
        print(foo.get_strength(), foo.get_max_health(), foo.get_health(), foo.get_agility(), [e.name for e in foo.effects])
        foo.effects.append(god_strength)
        print(foo.get_strength(), foo.get_max_health(), foo.get_health(), foo.get_agility(), [e.name for e in foo.effects])
        foo.effects.append(life_power)
        print(foo.get_strength(), foo.get_max_health(), foo.get_health(), foo.get_agility(), [e.name for e in foo.effects])
        foo.effects.append(extra_agility)
        print(foo.get_strength(), foo.get_max_health(), foo.get_health(), foo.get_agility(), [e.name for e in foo.effects])

    Результат:
    10 1000 1000 10 []
    20 2000 1000 10 ['God strength']
    20 2100 1000 10 ['God strength', 'Life Power']
    20 1700 1000 20 ['God strength', 'Life Power', 'Extra agility']
    Ответ написан
    3 комментария
  • Почему при запуске Skype зависает Win7 x64 sp1?

    Prognosticator
    @Prognosticator
    TODO: Здесь будут ворованные умные мысли, типа мои
    А еще бытует мнение, что с линуксом нужны танцы с бубном :)
    Попробуйте отписаться в поддержку скайпа.
    И судя по этому и этому - вы не одиноки.
    Ответ написан
    Комментировать
  • Программа для редактирования GPS маршрутов?

    Zigmar
    @Zigmar
    «Маршрут GPS»? Что это?!
    Проложить и редактировать маршрут можно на Google Maps.
    Ответ написан
    1 комментарий