On Jan 17, 2005, at 22:02, Chad Crabtree wrote:

(why would an attri bute need to be a separate class?)

So that the points or Karma (depending on the generation system) cost of the Attribute can be calculated without having to resort to procedural programming.


You'd be then able to get the Karma cost of all the attributes by using a line such as:

return sum([att.getKarmaCost() for att in attributes])

The following is a preliminary Attribute class I dug up from my hard drive, made for the BeCKS creation system. Feel free to use bits of it...




#!/usr/bin/env python

class Attribute:
"""Shadowrun character attribute."""
def __init__(self, baseRating = 1, racialMod = 0, augCyber = 0, augMagic = 0):
"""Create an Attribute."""


        # Initialize the class attributes...
        self._baseRating = 1
        self._racialMod = 0
        self._augCyber = 0
        self._augMagic = 0

        self.setBaseRating(baseRating)
        self.setRacialMod(racialMod)
        self.setAugCyber(augCyber)
        self.setAugMagic(augMagic)


def getRating(self): """Return the attribute's modified Rating.""" return self._baseRating + self._augCyber + self._augMagic


def getBaseRating(self):
"""Return the attribute's base Rating (unmodified by magic or cyber)."""
return self._baseRating



def setBaseRating(self, baseRating):
"""Set the attribute's base Rating. baseRating must be an int equal to or greater than max(1, 1 + racial mod)."""
if type(baseRating) != int:
raise TypeError, "Attribute rating must be an int."
if baseRating < 1:
# Attribute rating can't be lower than 1.
baseRating = 1
if baseRating < 1 + self._racialMod:
# Attribute rating can't be lower than 1 + racial mod.
baseRating = 1 + self._racialMod
self._baseRating = baseRating



def getRacialMod(self): return self._racialMod


def setRacialMod(self, racialMod = 0):
"""Set the racial modifier for the attribute. racialMod must be an int."""
if type(racialMod) != int:
raise TypeError, "Racial modifier must be an int."
self._racialMod = racialMod
# Re-set the base Rating to enforce the racial limits
self.setBaseRating(self._baseRating)



def getAugCyber(self): return self._augCyber


def setAugCyber(self, augCyber):
"""Set the cyber augmentation(s) for the Attribute. augCyber must be an int."""
if type(augCyber) != int:
raise TypeError, "Cyber augmentation must be an int."
self._augCyber = augCyber



def getAugMagic(self): return self._augMagic


def setAugMagic(self, augMagic):
"""Set the magic augmentation(s) for the Attribute. augMagic must be an int."""
if type(augMagic) != int:
raise TypeError, "Magic augmentation must be an int."
self._augMagic = augMagic



def getKarmaCost(self):
"""Return the BeCKS Karma cost of the Attribute."""
rating = self.getBaseRating()
racialMod = self.getRacialMod()
minr = max(1, 1 + racialMod)
maxr = 6 + racialMod
if rating <= maxr:
# Could (will) be optimized for speed, but the formula is much clearer this way
cost = sum([2*i for i in range(minr + 1, rating + 1)])
else:
cost = sum([2*i for i in range(minr + 1, maxr + 1)]) + sum([3*i for i in range(maxr + 1, rating + 1)])
return cost




if __name__ == '__main__':
    # Run a simple test procedure
    atr = Attribute()
    print atr.getRating()
    atr.setRacialMod(1)
    print atr.getRating()
    atr.setAugCyber(1)
    atr.setAugMagic(1)
    atr.setBaseRating(3)
    print atr.getBaseRating(), atr.getRating()
    print 'Karma total cost', atr.getKarmaCost()
    del atr




-- Max
maxnoel_fr at yahoo dot fr -- ICQ #85274019
"Look at you hacker... A pathetic creature of meat and bone, panting and sweating as you run through my corridors... How can you challenge a perfect, immortal machine?"


_______________________________________________
Tutor maillist  -  Tutor@python.org
http://mail.python.org/mailman/listinfo/tutor

Reply via email to