All pastes #834125 Raw Edit

robertj

public text v1 · immutable
#834125 ·published 2007-12-27 23:19 UTC
rendered paste body
from effects import Effectclass StatAdjustment:	level = 100	multiplier = 0	bonus = 0class StatCollection:		def __init__(self):		self.strength = Stat()		self.stamina = Stat()		self.agility = Stat()		self.spirit = Stat()		self.intellect = Stat()		self.armor = Stat()		self.attack_power = Stat()		self.level = Stat()class Stat:	def __init__(self):		self.multiplier = 1		self.bonus = 0		self.levels = {}		self.effects_modified = []		self.value = 0	def recomputeValue(self):		x = 0		for level in self.levels:			level_multiplier = 1			level_bonus = 0			for adjustment in self.levels[level]:				level_multiplier += adjustment.multiplier				level_bonus += adjustment.bonus			x *= level_multiplier			x += level_bonus		if self.value != int(x):			self.value = int(x)			for effect in self.effects_modified:				effect.removed()				effect.applied()	def add(self, adjustment):		if self.levels.has_key(adjustment.level): 			self.levels[adjustment.level].append(adjustment)		else:			self.levels[adjustment.level] = [adjustment]		self.recomputeValue()	def remove(self, adjustment):		self.levels[adjustment.level].remove(adjustment)		self.recomputeValue()class StatBooster(Effect):	def __init__(self):		self.adjustment_pack = []		Effect.__init__(self)	def addBonus(self, stat, bonus=False, multiplier=False, level=False):		x = StatAdjustment()		if bonus:			x.bonus = bonus		if multiplier:			x.multiplier = multiplier		if level:			x.level = level		# we can only add bonuses after we have a target, so queue it up and do it at apply if need be		if self.target:			stat.add(x)		else:			self.adjustment_pack.append((stat, x))	def applied(self):		for stat,adjustment in self.adjustment_pack:			stat.add(adjustment)		Effect.applied(self)	def removed(self):		for stat,adjustment in self.adjustment_pack:			stat.remove(adjustment)		self.adjustment_pack = []		Effect.removed(self)import unittestfrom effects import EffectsContainerclass StatCollectionTest(unittest.TestCase):	def setUp(self):		self.stats = StatCollection()	def testRelatedStats(self):		self.assertEquals(self.stats.agility.value, 0)class TestStatBooster(unittest.TestCase):	class DummyPlayer(StatCollection, EffectsContainer):		def __init__(self):			StatCollection.__init__(self)			EffectsContainer.__init__(self)	def setUp(self):		self.player = self.DummyPlayer()		self.cheese = StatBooster()		self.cheese.addBonus(self.player.strength, 7, level = 100)		self.toast = StatBooster()		self.toast.addBonus(self.player.strength, 13, level = 25)		self.toast.addBonus(self.player.strength, multiplier=.5, level=100)	def testInit(self):		self.assertFalse(self.cheese.target)	def testSimpleBonus(self):		self.player.applyEffect(self.cheese)		self.assertEqual(self.cheese.target, self.player)		self.assertEqual(self.player.strength.value, 7)	def testCompoundBonus(self):		self.player.applyEffect(self.cheese)		self.player.applyEffect(self.toast)		self.assertEqual(self.player.strength.value, 26)		self.player.removeEffect(self.cheese)	def testAddBonusPostApply(self):		self.player.applyEffect(self.cheese)		self.assertEqual(self.player.strength.value, 7)		self.cheese.addBonus(self.player.strength, 5)		self.assertEqual(self.player.strength.value, 12)if __name__ == '__main__':	unittest.main()