Azioni che possono avere cooldown individuali o un cooldown di "gruppo"

0

Sto creando un gioco (beh, un plugin) in cui ogni giocatore ha una lista di abilità, ognuna delle quali ha un unico type object , ognuno dei quali ha un elenco di azioni che devono essere eseguite quando un giocatore esegue le sue abilità. Ho disegnato un diagramma per mostrare le mie classi: link

Ed ecco un rapido mockup in pseudo-python:

class Player:

    def __init__(self):
        self.skills = []

    def execute_actions(self, **event_args):
        for skill in self.skills:
            skill.execute_actions(player=self, **event_args)


class Skill:

    def __init__(self, type_object, level):
        self.type_object = type_object
        self.level = level

    @property
    def name(self):
        return self.type_object.name

    def execute_actions(self, **event_args):
        if self.level > 0:
            self.type_object.execute_actions(skill=self, **event_args)

    # more type_object properties


class SkillType:

    def __init__(self, name, max_level):
        self.name = name
        self.max_level = max_level
        self.actions = []

    def execute_actions(self, **event_args):
        for action in self.actions:
            if action.event == event_args['event_name']:
                action(**event_args)


class Action:

    def __init__(self, event, callback, group=None, cooldown=None):
        self.event = event
        self.callback = callback
        self.group = group
        self._cooldown = cooldown

   @property
   def cooldown(self):
       if self._cooldown is not None:
           return self._cooldown
       if self.group is not None:
           return self.group.get('cooldown', None)
       return None

# Usage

player = Player()

fireball = SkillType('Fireball', 5)

def fireball_deal_damage(skill, player, target, **event_args):
    player.damage(target, skill.level)

fireball.actions.append(
    Action('player_attack', fireball_deal_damage, cooldown=5)
)

player.skills.append(Skill(fireball, 1))

Quindi, questi tipi di abilità e azioni sono effettivamente analizzati da JSON:

// skills.json
[
  {
    "name": "Fireball",
    "max_level": 5,
    "actions": [
      {
        "event": "player_attack",
        "action": "deal_damage",
        "data": {"amount_base": 3, "amount_per_level": 1},
        "cooldown": 5
      }
    ]
  }
]

L'azione sopra ha un cooldown di cinque, che è abbastanza facile da implementare, basta dare ad ogni azione un dizionario di tipo {Skill: time_when_last_used} in modo che segua ogni cooldown dell'istanza Skill per quella particolare azione.

Il problema è che a volte ho bisogno di avere più azioni che usano tutte lo stesso cooldown (forse l'incantesimo palla di fuoco ha bisogno di infliggere danno e accendere il nemico, quindi sono due azioni separate), così mi è venuta l'idea di " gruppi ":

// skills.json
[
  {
    "name": "Fireball",
    "max_level": 5,
    "actions": [
      {
        "event": "player_attack",
        "action": "deal_damage",
        "data": {"amount_base": 3, "amount_per_level": 1},
        "group": 0
      },
      {
        "event": "player_attack",
        "action": "ignite",
        "data": {"duration_base": 0, "duration_per_level": 1},
        "group": 0
      }
    ],
    "groups": [
      {  // Group 0
        "cooldown": 5
      }
  }
]

Ora alcune azioni useranno il cooldown di questo gruppo, quindi non è più così semplice come dare ad ogni istanza di azione un dizionario. Tuttavia alcune azioni useranno comunque un tempo di recupero individuale piuttosto che un tempo di recupero di "gruppo". Come potrei continuare a implementare questo?

    
posta Markus Meskanen 19.01.2018 - 22:31
fonte

2 risposte

1

Il modello del tuo gruppo di azioni ha modificato in modo significativo il tuo progetto di azione di abilità originale. Provando a calzare il vecchio modello di cooldown sul nuovo design, stai solo supplicando problemi di complessità.

Riesamina il tuo nuovo modello di azione delle abilità, prova a vedere se avrà bisogno di ulteriori modifiche e prova a bloccarlo.

Solo quindi , crea un modello di cooldown delle azioni che in realtà si adatta al modello di azione delle abilità.

Lo so, fare un passo indietro è un vero dolore al collo per il momento, ma fare un passo indietro è meglio che uscire da una scogliera.

    
risposta data 19.01.2018 - 22:44
fonte
0

Invece di Action con un membro dati cooldown , perché non hai un metodo on_cooldown(time_of_use, time_of_last_use) . Quindi Skill può contenere il suo ultimo utilizzo.

    
risposta data 19.02.2018 - 14:15
fonte

Leggi altre domande sui tag