예제 #1
0
        def runeCallback(thing, creature, position, onPosition, onThing, strength=None, **k):
            print "runeCallback"
            target = creature
            if self.targetType == TARGET_TARGET:
                target = onThing
                if not isinstance(target, Creature):
                    if not isinstance(target, Creature):
                        print onThing, onThing.position, onThing.position.getTile().getCreatureCount()
                        try:
                            target = onThing.position.getTile().topCreature()
                            print target
                        except:
                            raise                    
                    if not target:
                        creature.onlyOnCreatures()
                        return False

            creature.spellTargets = [target]
                    
            if creature.isPlayer():
                if not target.inRange(creature.position, self.targetRange, self.targetRange):
                    creature.cancelMessage(_l(creature, "Target is too far away"))
                    return False
                    
                if not creature.canDoSpell(self.icon, self.group):
                    creature.exhausted()
                    return False

                if creature.getSkull() == SKULL_BLACK and config.blackSkullDisableAreaRunes and self.targetType == TARGET_AREA:
                    return creature.cancelMessage(_l(creature, "You have a black skull and can't cast area spells."))
                
                if self.learned and not creature.canUseSpell(self.name):
                    return creature.cancelMessage(_l(creature, "You need to learn this spell first."))
                    
                if self.vocations and creature.getVocationId() not in self.vocations:
                    return creature.cancelMessage(_l(creature, "Your vocation cannot use this spell."))
                    
                if self._requireGreater:
                    for var in self._requireGreater:
                        if creature.data[var] < self._requireGreater[var]:
                            creature.notEnough(var)
                            return False
                            
                if self._requireLess:
                    for var in self._requireLess:
                        if creature.data[var] > self._requireLess[var]:
                            creature.message(_l(creature, "Your %s is too high!") % var)
                            return False
                
                if self._requireCallback:
                    for call in self._requireCallback:
                        if not call(caster=creature): return

                if not thing.count:
                    creature.needMagicItem()
                    creature.magicEffect(EFFECT_POFF)
                        
                else:
                    thing.modify(-1)  
                    
                    # Integrate mana seeker
                    try:
                        creature.modifyMana(-self._requireGreater["mana"])
                        creature.modifySpentMana(self._requireGreater["mana"])
                    except:
                        pass

                    # Integrate soul seeker
                    try:
                        creature.modifySoul(-self._requireGreater["soul"])
                    except:
                        pass
                    
                    creature.cooldownSpell(self.icon, self.group, self.cooldown, self.groupCooldown)
                    
            if self.castEffect:
                creature.magicEffect(self.castEffect)
            
            for call in self.effectOnCaster:
                call(caster=creature, target=creature, strength=strength)
            
            for array in self.conditionOnCaster:
                creature.condition(array[0].copy(), array[1])
                
            if self.targetType == TARGET_TARGET and self.shootEffect:
                creature.shoot(creature.position, target.position, self.shootEffect)
                
            if not self.targetType == TARGET_AREA:
                for call in self.effectOnTarget:
                    call(target=target, caster=creature, strength=strength)
                
                if self._targetEffect:
                    target.magicEffect(self._targetEffect)
                    
                for array in self.conditionOnTarget:
                    target.condition(array[0].copy(), array[1])
        
            else:
                area = self.targetArea(caster=creature) if callable(self.targetArea) else self.targetArea
                positions = calculateAreaDirection(creature.position, creature.direction, area)
                targetGenerators = []
                for pos in positions:
                    if self.areaEffect:
                        creature.magicEffect(self.areaEffect, pos)
                        
                    creatures = game.map.getTile(pos).creatures()
                    if creatures:
                        targetGenerators.append(creatures)
                        
                for generator in targetGenerators:
                    for targ in generator:
                        if creature.isMonster() and not config.monsterAoEAffectMonsters and targ.isMonster():
                            continue

                        creature.spellTargets.append(targ)

                        if self._targetEffect:
                            targ.magicEffect(self._targetEffect)
                        
                        for call in self.effectOnTarget:
                            call(target=targ, caster=creature, strength=strength)
예제 #2
0
        def spellCallback(creature, strength=None, **k):
            target = creature
            if self.targetType == TARGET_TARGET or self.targetType == TARGET_TARGETSELF or self.targetType == TARGET_TARGETONLY:
                if creature.target:
                    target = creature.target
                    if self.targetType == TARGET_TARGETONLY:
                        self.targetType = TARGET_TARGET
                elif self.targetType == TARGET_TARGET and self.targetArea: #if no target but area still cast the spell (dont need not creature.target)
                    self.targetType = TARGET_AREA #if not and the spell is cast as an area spell do the area being defined.
                elif self.targetType == TARGET_TARGET and not self.targetArea:
                    return False
                elif self.targetType == TARGET_TARGETONLY:
                    return creature.cancelMessage(_l(creature, "You need a target to cast this spell."))
 
            if creature.isPlayer():
                if not target.inRange(creature.position, self.targetRange, self.targetRange):
                    creature.cancelMessage(_l(creature, "Target is too far away"))

                    return False
                    
                if not creature.canDoSpell(self.icon, self.group):
                    creature.exhausted()

                    return False
                    
                if creature.getSkull() == SKULL_BLACK and config.blackSkullDisableAreaSpells and self.targetType == TARGET_AREA:
                    return creature.cancelMessage(_l(creature, "You have a black skull and can't cast area spells."))
                
                if self.learned and not creature.canUseSpell(self.name):
                    return creature.cancelMessage(_l(creature, "You need to learn this spell first."))
                    
                if self.vocations and creature.getVocationId() not in self.vocations:
                    return creature.cancelMessage(_l(creature, "Your vocation cannot use this spell."))
                    
                if self._requireGreater:
                    for var in self._requireGreater:
                        if creature.data[var] < self._requireGreater[var]:
                            creature.notEnough(var)

                            return False
                            
                if self._requireLess:
                    for var in self._requireLess:
                        if creature.data[var] > self._requireLess[var]:
                            creature.message(_l(creature, "Your %s is too high!") % var)

                            return False
                
                if self._requireCallback:
                    for call in self._requireCallback:
                        if not call(caster=creature):

                            return
                        
                # Integrate mana seeker
                try:
                    creature.modifyMana(-self._requireGreater["mana"])
                    creature.modifySpentMana(self._requireGreater["mana"])
                except:
                    pass

                # Integrate soul seeker
                try:
                    creature.modifySoul(-self._requireGreater["soul"])
                except:
                    pass
                
                creature.cooldownSpell(self.icon, self.group, self.cooldown, self.groupCooldown)
            creature.spellTargets = []
                    
            if self.castEffect:
                creature.magicEffect(self.castEffect)

            for call in self.effectOnCaster:
                call(caster=creature, target=creature, strength=strength)
            
            for array in self.conditionOnCaster:
                creature.condition(array[0].copy(), array[1])
                
            if self.targetType in (TARGET_TARGET, TARGET_TARGETSELF) and target and target != creature and self.shootEffect:
                creature.shoot(creature.position, target.position, self.shootEffect)
                
            if not self.targetType == TARGET_AREA:
                creature.spellTargets.append(target)
                for call in self.effectOnTarget:
                    call(target=target, caster=creature, strength=strength)
                
                if self._targetEffect:
                    target.magicEffect(self._targetEffect)
                    
                for array in self.conditionOnTarget:
                    target.condition(array[0].copy(), array[1])

            if self.targetType == TARGET_AREA:
                area = self.targetArea(caster=creature) if callable(self.targetArea) else self.targetArea
                positions = calculateAreaDirection(creature.position, creature.direction, area)
                targetGenerators = []
                for pos in positions:
                    if self.areaEffect:
                        creature.magicEffect(self.areaEffect, pos)
                        
                    creatures = game.map.getTile(pos).creatures()
                    if creatures:
                        targetGenerators.append(creatures)
                        
                for generator in targetGenerators:
                    for targ in generator:
                        if creature.isMonster() and not config.monsterAoEAffectMonsters and targ.isMonster():
                            continue

                        creature.spellTargets.append(targ)

                        if self._targetEffect:
                            targ.magicEffect(self._targetEffect)
                        
                        for call in self.effectOnTarget:
                            call(target=targ, caster=creature, strength=strength)