87 lines
2.9 KiB
Python
87 lines
2.9 KiB
Python
"""Altar of Valkyrie
|
|
Followers of Valkyrie don't get any praying spells, because Valkyrie hates magic.
|
|
Instead, they gain experience by combat bravery; and the way they prove that is
|
|
by bringing the flesh of dead enemies as a sacrifice in Her altar.
|
|
|
|
Of course, the script only activates for followers of Valkyrie, and only runs for
|
|
sacrifices of type FLESH.
|
|
|
|
Then, it can handle each in two ways:
|
|
|
|
- Ideally, all items will have Exp stored. In this case, you'll get 1/5 of that
|
|
Exp, with a bonus if it's a head or heart.
|
|
|
|
- Otherwise, we'll use the Level and resistances to estimate how hard it was to
|
|
kill the monster. In fact, I'm not at all certain the algorithm used to
|
|
estimate is reasonable at all for higher levels... but then again, I'm not
|
|
sure it's still necessary either, so feel free to remove it :-)
|
|
"""
|
|
|
|
import Crossfire
|
|
|
|
def accept(description):
|
|
pl.Write('Valkyrie accepts your %s sacrifice!' % description)
|
|
|
|
# XXX: need to expose NROFATTACKS to Python
|
|
|
|
altar = Crossfire.WhoAmI()
|
|
pl = Crossfire.WhoIsActivator()
|
|
praying = pl.CheckArchInventory('skill_praying')
|
|
if praying and praying.Title == 'Valkyrie':
|
|
|
|
# accept sacrifice
|
|
obj = altar.Above
|
|
while obj:
|
|
if obj.Unpaid:
|
|
pl.Write('Valkyrie scorns your stolen sacrifice!')
|
|
break
|
|
if obj.Type & 0xffff == Crossfire.Type.FLESH:
|
|
level_factor = 0
|
|
part_factor = 1
|
|
|
|
if obj.Level < praying.Level / 2:
|
|
if obj.Exp:
|
|
pl.Write('Valkyrie grudgingly accepts your pathetic sacrifice!')
|
|
else:
|
|
pl.Write('Valkyrie scorns your pathetic sacrifice!')
|
|
elif obj.Level < praying.Level:
|
|
accept('poor')
|
|
level_factor = 0.5
|
|
elif obj.Level < praying.Level * 1.5:
|
|
accept('modest')
|
|
level_factor = 1
|
|
elif obj.Level < praying.Level * 2:
|
|
accept('adequate')
|
|
level_factor = 1.5
|
|
elif obj.Level < praying.Level * 5:
|
|
accept('devout')
|
|
level_factor = 2
|
|
else:
|
|
accept('heroic')
|
|
level_factor = 2.5
|
|
|
|
# heads and hearts are worth more. Because.
|
|
if obj.Name.endswith('head') or obj.Name.endswith('heart'):
|
|
part_factor = 1.5
|
|
|
|
if obj.Exp:
|
|
# obj has stored exp, use it
|
|
value = obj.Exp / 5 * part_factor
|
|
|
|
else:
|
|
# no stored exp, estimate
|
|
# flesh with lots of resists is worth more
|
|
res = 0
|
|
for at in range(26): # XXX should be NROFATTACKS
|
|
res += obj.GetResist(at)
|
|
|
|
value = max(res, 10) * level_factor * part_factor
|
|
|
|
if obj.Quantity > 1:
|
|
obj.Quantity -= 1
|
|
else:
|
|
obj.Remove()
|
|
pl.AddExp(int(value), 'praying')
|
|
break
|
|
obj = obj.Above
|