rendered paste bodyfrom 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()