I am working to improve the current system I have because... well its trash. Here is a proposed way I can see this working. I am looking for pointers into how I can improve this, or at least keep it pythonic.
Syntax: Select all
RPGPlayer...
def cast(self, spell : Spell):
spell.cast(self)
class Spell():
spells = []
def __init__(self, name, source, resource, cost):
self.name = name
self.source = source
self.resource = resource
self.cost = cost
self.kwargs = {}
Spell.spells.append(self)
def cast(self, callback, (player : RPGPlayer, *args, **kwargs)):
if player.getClass() != self.source:
if player.getRace() != self.source:
return
if not hasattr(player,self.resource):
return
if not player.spellCooldown >= time.time() - 1.5:
messagePlayer('Your spells are on cooldown!', player.index)
return
if not getattr(player, resource) >= self.cost:
if 'resource' in ['mana']:
messagePlayer('You do not have enough {0} to cast {1}'.format(resource, self.name.title()), player.index)
else:
messagePlayer('You do not have any more uses of {0}'.format(self.name.title()), player.index)
return
if callback(player, args, kwargs):
setattr(player, self.resource, getattr(player, self.resource) - self.cost)
class TargetedSpell(Spell):
def cast(self, callback, *args, **kwargs):
if player.getClass() != self.source:
if player.getRace() != self.source:
return
if not hasattr(player,self.resource):
return
if not player.spellCooldown >= time.time() - 1.5:
messagePlayer('Your spells are on cooldown!', player.index)
return
if not getattr(player, self.resource) >= self.cost:
if self.resource in ['mana']:
messagePlayer('You do not have enough {0} to cast {1}'.format(resource, self.name.title()), player.index)
else:
messagePlayer('You do not have any more uses of {0}'.format(self.name.title()), player.index)
return
target = player.getViewPlayer()
if not target:
return
if target.is_dead():
return
if callback(player, target, args, kwargs):
setattr(player, self.resource, getattr(player, self.resource) - self.cost)
@ClientCommand('!cast')
def cast(command, index):
player = players.from_userid(userid_from_index(index))
spell = None
for s in Spell.spells:
if command.arg_string.lower() == s.name.lower():
spell = s
player.cast(spell)