""" A classic Horn of Plenty. You can pull food out of it. Copyright 2001 Cabochon Technologies, Inc. Author: Rhialto """ from java.lang import Exception from wyvern.lib import Kernel, Range from wyvern.lib.properties import Applyable from wyvern.lib.classes import DynamicObject from wyvern.common.util import Strings class horn_of_plenty(DynamicObject, Applyable): """ This is a Python documentation string. You can put them just about anywhere, but it's most common to put them after a class or method declaration. The Horn of Plenty is an Applyable object that produces a random bit of food when you apply it. It keeps track of its charges, so it doesn't last forever. """ def initialize(self): """ Sets default properties, in case someone forgot to set them in the archetype, or someone cloned the object directly without an archetype. The use of setDefault* and ensureWeight makes sure that the object only gets a copy of the property if it hasn't already inherited it from the archetype. This saves memory. """ self.setDefaultImage('magic/misc/horn_of_plenty') self.setDefaultShortDesc('horn of plenty') self.setDefaultDesc('Apply the horn to get food from it.') self.ensureWeight('20 lb') self.initCharges() # it's usually best to call self.super__initialize() last. # Don't forget to call it, or your object may not work! self.super__initialize() def initCharges(self): """ If we're not dead, and not charged yet, then we add an initial set of charges. Then we set our shop value. """ if (not self.hasProperty('dead') and not self.hasProperty('charged')): charge = Range.randomValue(100, 200) self.setIntProperty('charges', charge) self.setIntProperty('initial-charges', charge) self.addProperty('charged') self.setShopValue() def setShopValue(self): """Sets a shop value of 100 gp per charge.""" charge = self.getIntProperty('charges') if self.getIntProperty('value') == 0: self.setIntProperty('value', charge*100) def apply(self, agent): """Creates some food, and uses a charge.""" if self.hasProperty('dead'): agent.message("The Horn's magic is used up.") return self.useOneCharge() self.createFood(agent) def useOneCharge(self): """ Uses up a charge. If we're out, then we mark the item as dead, which prevents us from recharging it next time self.initialize() is called, e.g. when the player logs in again. """ charge = self.getIntProperty('charges') charge = charge - 1 self.setIntProperty('charges', charge) if charge == 0: self.addProperty('dead') def createFood(self, player): """ Clones a random_food archetype. If successful, we call a utility method below to add it to their inv. If it fails, we print an error message to the player. If the player is a Wizard, we show very detailed error info. """ try: random = Kernel.instantiate('random/random_food') food = random.generate() self.addFoodToInventory(player, food) except Exception, x: player.message('An error occurred - please report a bug.') # show wizards the error, for debugging. We use # the wyvern.common.util.Strings class to print out # a stack trace for the object, to send as a message if player.isWizard(): player.message(Strings.captureStackTrace(x)) def addFoodToInventory(self, player, food): """ Tries to put the food in the player's inventory; if that fails, it puts the food on the ground where the player is standing, using food.positionAt(player) """ # don't let people sell the food for money food.setIntProperty('value', 0) player.message('You pull some food out of the horn.') try: inv = player.inventory inv.add(food) except: player.message('The food falls on the ground.') food.positionAt(player) |