49 lines
1.9 KiB
Python
49 lines
1.9 KiB
Python
import Crossfire
|
|
import random
|
|
|
|
def tame_angry_pets():
|
|
"""
|
|
Look for pets (monsters owned by the player) who are not marked as friendly.
|
|
Then try to re-pet them with a 1 in 10 change to fail.
|
|
|
|
Some pets miss their Friendly flag only, others also miss the IsPet property.
|
|
Others also have the wrong value for attack_movement which should be PETMOVE for pets.
|
|
"""
|
|
|
|
PETMOVE = Crossfire.AttackMovement.PETMOVE
|
|
player = Crossfire.WhoIsActivator()
|
|
if player.Type != Crossfire.Type.PLAYER:
|
|
return
|
|
Crossfire.SetReturnValue( 1 )
|
|
|
|
fizzle = True
|
|
|
|
#Can't do this check by looking at the FriendlyList because we are looking for
|
|
#those pets who are *not* in that list. So check for the monsters in the same map
|
|
#as the player, owned by it, and yet not friendly.
|
|
#Is there a better way than checking all _items_ in the map?
|
|
for w in range(player.X-5, player.X+5):
|
|
if w<1 or w>range(player.Map.Width):
|
|
continue
|
|
for h in range(player.Y-5, player.Y+5):
|
|
if h<1 or h>range(player.Map.Height):
|
|
continue
|
|
obj = player.Map.ObjectAt(w,h)
|
|
while obj != None:
|
|
if obj.Monster and obj.Owner == player and not obj.Friendly: #angry pet
|
|
fizzle = False
|
|
if random.randint(0,9): #tame
|
|
obj.Friendly = True
|
|
if not obj.IsPet:
|
|
obj.IsPet = True
|
|
if obj.AttackMovement != PETMOVE:
|
|
obj.AttackMovement = PETMOVE
|
|
player.Write( 'Your %s looks at you tenderly, fearless at your enemies.' % obj.Name )
|
|
else: #fail
|
|
player.Write( 'Your %s is still angry with you.' % obj.Name )
|
|
obj = obj.Above
|
|
if fizzle:
|
|
player.Write('Fzzzzzzzz...')
|
|
|
|
tame_angry_pets()
|