Changeset 776


Ignore:
Timestamp:
03/03/11 20:49:43 (7 years ago)
Author:
beliar
Message:

Merge branch 'character_creation_logic' into HEAD

Conflicts:

game/parpg/charactercreationcontroller.py

Location:
branches/active/character_customization/game
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • branches/active/character_customization/game/character_scripts/secondary_stats.xml

    r724 r776  
    2323    <unit>hp</unit> 
    2424    <mean type="float">10.0</mean> 
    25     <sd>4.0</sd> 
     25    <sd type="float">4.0</sd> 
    2626    <stat_modifiers> 
    2727      <strength type="float">0.70</strength> 
  • branches/active/character_customization/game/parpg/charactercreationcontroller.py

    r756 r776  
    1313#   You should have received a copy of the GNU General Public License 
    1414#   along with PARPG.  If not, see <http://www.gnu.org/licenses/>. 
    15 """Provides the controller that defines the behavior of the character creation 
     15"""Provides the controller that defines the behaviour of the character creation 
    1616   screen.""" 
     17 
     18import characterstatistics as char_stats 
     19from serializers import XmlSerializer 
    1720from controllerbase import ControllerBase 
    1821from gamescenecontroller import GameSceneController 
    1922from gamesceneview import GameSceneView 
    20  
     23from parpg.inventory import Inventory 
     24 
     25DEFAULT_STAT_VALUE = 50 
     26 
     27 
     28def getStatCost(offset): 
     29    """Gets and returns the cost to increase stat based on the offset""" 
     30    if offset < 0: 
     31        offset *= -1 
     32    if offset < 22: 
     33        return 1 
     34    elif offset < 29: 
     35        return 2 
     36    elif offset < 32: 
     37        return 3 
     38    elif offset < 35: 
     39        return 4 
     40    elif offset < 36: 
     41        return 5 
     42    elif offset < 38: 
     43        return 6 
     44    elif offset < 39: 
     45        return 7 
     46    elif offset < 40: 
     47        return 8 
     48    elif offset < 41: 
     49        return 9 
     50    else: 
     51        return 10     
     52 
     53#TODO: Should be replaced with the real character class once its possible 
     54class SimpleCharacter(object): 
     55    """This is a simple class that is used to store the data during the 
     56    character creation""" 
     57     
     58    def __init__(self, name, gender, origin, age, picture, traits, 
     59                 primary_stats, secondary_stats, inventory): 
     60        self.name = name 
     61        self.gender = gender 
     62        self.origin = origin 
     63        self.age = age 
     64        self.picture = picture 
     65        self.traits = traits 
     66        self.statistics = {} 
     67        for primary_stat in primary_stats: 
     68            short_name = primary_stat.short_name 
     69            self.statistics[short_name] = char_stats.PrimaryStatisticValue( 
     70                                                    primary_stat, 
     71                                                    self, 
     72                                                    DEFAULT_STAT_VALUE) 
     73            long_name = primary_stat.long_name 
     74            self.statistics[long_name] = char_stats.PrimaryStatisticValue( 
     75                                                    primary_stat, 
     76                                                    self, 
     77                                                    DEFAULT_STAT_VALUE) 
     78        for secondary_stat in secondary_stats: 
     79            name = secondary_stat.name             
     80            self.statistics[name] = char_stats.SecondaryStatisticValue( 
     81                                                    secondary_stat, 
     82                                                    self) 
     83        self.inventory = inventory 
     84             
    2185class CharacterCreationController(ControllerBase): 
    22     """Controller defining the behavior of the character creation screen.""" 
     86    """Controller defining the behaviour of the character creation screen.""" 
     87     
     88    #TODO: Change to actual values 
     89    MAX_TRAITS = 3 
     90    MIN_AGE = 16 
     91    MAX_AGE = 40 
     92    ORIGINS = {"None": None,} 
     93    GENDERS = ["Male", "Female",] 
     94    PICTURES = {"Male": ["None",], "Female": ["None",],} 
     95    TRAITS = {} 
    2396    def __init__(self, engine, view, model, application): 
    2497        """Construct a new L{CharacterCreationController} instance. 
     
    37110        self.view.cancel_new_game_callback = self.cancelNewGame 
    38111        self.view.show() 
    39      
     112        #TODO: Maybe this should not be hardcoded 
     113        stream = file("character_scripts/primary_stats.xml")         
     114        prim_stats = XmlSerializer.deserialize(stream) 
     115        stream = file("character_scripts/secondary_stats.xml")         
     116        sec_stats = XmlSerializer.deserialize(stream) 
     117        self.char_data = SimpleCharacter("", 
     118                                              self.GENDERS[0], 
     119                                              self.ORIGINS.keys()[0], 
     120                                              20, 
     121                                              self.PICTURES[self.GENDERS[0]][0], 
     122                                              [], 
     123                                              prim_stats, 
     124                                              sec_stats, 
     125                                              Inventory()) 
     126        self._stat_points = 200 
     127   
     128        
    40129    def startNewGame(self): 
    41130        """Create the new character and start a new game. 
     
    71160        """Returns the name of the character. 
    72161        @return: Name of the character""" 
    73         #TODO: Replace once an actual value is stored 
    74         return "" 
     162        return self.char_data.name 
    75163     
    76164    @property 
     
    78166        """Returns the age of the character. 
    79167        @return: Age of the character""" 
    80         #TODO: Replace once an actual value is stored 
    81         return 0 
     168        return self.char_data.age 
    82169     
    83170    @property 
     
    85172        """Returns the gender of the character. 
    86173        @return: Gender of the character""" 
    87         #TODO: Replace once an actual value is stored 
    88         return "" 
     174        return self.char_data.gender 
    89175     
    90176    @property 
     
    92178        """Returns the origin of the character. 
    93179        @return: Origin of the character""" 
    94         #TODO: Replace once an actual value is stored 
    95         return "" 
     180        return self.char_data.origin 
    96181     
    97182    @property 
    98183    def picture(self): 
    99184        """Returns the ID of the current picture of the character.""" 
    100         #TODO: Replace once an actual value is stored 
    101         return ""  
     185        return self.char_data.picture 
     186     
     187    def getStatPoints(self): 
     188        """Returns the remaining statistic points that can be distributed""" 
     189        return self._stat_points 
    102190     
    103191    def increaseStatistic(self, statistic): 
     
    105193        @param statistic: Name of the statistic to increase 
    106194        @type statistic: string"""  
    107         #TODO: Add Code 
    108         pass 
     195        if self.canIncreaseStatistic(statistic): 
     196            cost = self.getStatisticIncreaseCost(statistic) 
     197            if  cost <= self._stat_points: 
     198                self.char_data.statistics[statistic].value += 1 
     199                self._stat_points -= cost   
     200 
     201    def getStatisticIncreaseCost(self, statistic): 
     202        """Calculate and return the cost to increase the statistic 
     203        @param statistic: Name of the statistic to increase 
     204        @type statistic: string 
     205        @return cost to increase the statistic""" 
     206        cur_value = self.char_data.statistics[statistic].value 
     207        new_value = cur_value + 1 
     208        offset =  new_value - DEFAULT_STAT_VALUE 
     209        return getStatCost(offset) 
    109210     
    110211    def canIncreaseStatistic(self, statistic): 
     
    113214        @type statistic: string 
    114215        @return: True if the statistic can be increased, False if not.""" 
    115         #TODO: Add Code 
    116         return False 
     216        stat = self.char_data.statistics[statistic].value 
     217        return stat < stat.statistic_type.maximum 
    117218     
    118219    def decreaseStatistic(self, statistic): 
     
    120221        @param statistic: Name of the statistic to decrease 
    121222        @type statistic: string"""  
    122         #TODO: Add Code 
    123         pass 
     223        if self.canDecreaseStatistic(statistic): 
     224            gain = self.getStatisticDecreaseGain(statistic) 
     225            self.char_data.statistics[statistic].value -= 1 
     226            self._stat_points += gain   
     227 
     228    def getStatisticDecreaseGain(self, statistic): 
     229        """Calculate and return the gain of decreasing the statistic 
     230        @param statistic: Name of the statistic to decrease 
     231        @type statistic: string 
     232        @return cost to decrease the statistic""" 
     233        cur_value = self.char_data.statistics[statistic].value 
     234        new_value = cur_value - 1 
     235        offset =  new_value - DEFAULT_STAT_VALUE 
     236        return getStatCost(offset) 
    124237     
    125238    def canDecreaseStatistic(self, statistic): 
     
    128241        @type statistic: string 
    129242        @return: True if the statistic can be decreased, False if not.""" 
    130         #TODO: Add Code 
    131         return False 
     243        stat = self.char_data.statistics[statistic].value 
     244        return stat > stat.statistic_type.minimum 
    132245     
    133246    def getStatisticValue(self, statistic): 
     
    136249        @type statistic: string 
    137250        @return: Value of the given statistic""" 
    138         #TODO: Add Code 
    139         return 0 
     251        return self.char_data.statistics[statistic] 
     252     
     253    def areAllStatisticsValid(self): 
     254        """Checks if all statistics are inside the minimum/maximum values 
     255        @return True if all statistics are valid False if not""" 
     256        for stat in self.char_data.statistics.items(): 
     257            if not (stat.value > stat.statistic_type.minumum and\ 
     258                stat.value < stat.statistic_type.maximum): 
     259                return False 
     260        return True 
    140261     
    141262    def setName(self, name): 
     
    143264        @param name: New name 
    144265        @type name: string""" 
    145         #TODO: Add Code 
    146         pass 
     266        self.char_data.name = name 
    147267     
    148268    def isNameValid(self, name): 
     
    151271        @type name: string 
    152272        @return: True if the name is valid, False if not""" 
    153         #TODO: Add Code 
     273        if name: 
     274            return True 
    154275        return False 
    155276     
     
    157278        """Changes the origin of the character to the given value. 
    158279        @param origin: New origin 
    159         @type origin: string?""" 
    160         #TODO: Add Code 
    161         pass  
     280        @type origin: string""" 
     281        if self.isOriginValid(origin): 
     282            self.char_data.origin = origin 
     283            #TODO: Make changes according to origin 
    162284    
    163285    def isOriginValid(self, origin): 
    164286        """Checks whether the origin is valid. 
    165287        @param origin: Origin to check 
    166         @type origin: string? 
     288        @type origin: string 
    167289        @return: True if the origin is valid, False if not""" 
    168         #TODO: Add Code 
    169         return False 
     290        return origin in self.ORIGINS 
    170291     
    171292    def changeGender(self, gender): 
    172293        """Changes the gender of the character to the given value. 
    173294        @param gender: New gender 
    174         @param gender: string?""" 
    175         #TODO: Add Code 
    176         pass 
     295        @param gender: string""" 
     296        if self.isGenderValid(gender): 
     297            self.char_data.gender = gender 
    177298     
    178299    def isGenderValid(self, gender): 
     
    180301        @param gender: Gender to check 
    181302        @type gender: string? 
    182         @return: True if the origin is valid, False if not""" 
    183         #TODO: Add Code 
    184         return False 
     303        @return: True if the origin is valid, False if not"""         
     304        return gender in self.GENDERS 
    185305     
    186306    def changeAge(self, age): 
     
    189309        @type age: integer 
    190310        """ 
    191         #TODO: Add Code 
    192         pass 
     311        if self.isAgeValid(age): 
     312            self.char_data.age = age 
    193313     
    194314    def isAgeValid(self, age): 
     
    197317        @type age: integer 
    198318        @return: True if the origin is valid, False if not""" 
    199         #TODO: Add Code 
    200         return False 
     319        return age >= self.MIN_AGE and age <= self.MAX_AGE  
    201320     
    202321    def setPicture(self, picture): 
     
    204323        @param picture: ID of the new picture 
    205324        @type picture: string""" 
    206         pass 
     325        if self.isPictureValid(picture): 
     326            self.char_data.picture = picture 
    207327     
    208328    def isPictureValid(self, picture): 
     
    211331        @type picture: string 
    212332        @return: True if the picture is valid, False if not""" 
    213         #TODO: Add Code 
    214         return False 
     333        return picture in self.PICTURES[self.gender] 
    215334     
    216335    def addTrait(self, trait): 
     
    218337        @param trait: ID of the trait to add 
    219338        @type trait: string""" 
    220         #TODO: Add Code 
    221         pass 
     339        if self.canAddAnotherTrait() and self.isTraitValid(trait)\ 
     340                and not self.hasTrait(trait): 
     341            self.char_data.traits.append(trait)                 
    222342     
    223343    def canAddAnotherTrait(self): 
    224344        """Checks whether another trait can be added. 
    225345        @return: True if another trait can be added, False if not""" 
    226         #TODO: Add Code 
    227         return False 
     346        return len(self.char_data.traits) < self.MAX_TRAITS 
    228347     
    229348    def removeTrait(self, trait): 
     
    231350        @param trait: ID of the trait to remove 
    232351        @type trait: string""" 
    233         #TODO: Add Code 
    234         pass 
     352        if self.hasTrait(trait): 
     353            self.char_data.traits.remove(trait) 
    235354     
    236355    def hasTrait(self, trait): 
     
    239358        @type trait: string 
    240359        @return: True if the character has the trait, False if not""" 
    241         #TODO: Add Code 
    242         return False 
     360        return trait in self.char_data.traits 
    243361     
    244362    def isTraitValid(self, trait): 
     
    247365        @type trait: string 
    248366        @return: True if the trait is valid, False if not""" 
    249         #TODO: Add Code 
    250         return False 
     367        return trait in self.TRAITS 
    251368     
    252369    def areCurrentTraitsValid(self): 
    253370        """Checks whether the characters traits are valid. 
    254371        @return: True if the traits are valid, False if not""" 
    255         #TODO: Add Code 
    256         return False 
     372        if len(self.char_data.traits) > self.MAX_TRAITS: 
     373            return False  
     374        for trait in self.char_data.traits: 
     375            if not self.isTraitValid(trait): 
     376                return False 
     377        return True 
    257378     
    258379    def isCharacterValid(self): 
    259380        """Checks whether the character as a whole is valid.""" 
    260         #TODO: Add code 
     381        #Single checks can be disabled by putting a "#" in front of them 
     382        if True\ 
     383        and self._stat_points >= 0\ 
     384        and self.areAllStatisticsValid() \ 
     385        and self.areCurrentTraitsValid() \ 
     386        and self.isNameValid(self.name)\ 
     387        and self.isPictureValid(self.picture)\ 
     388        and self.isAgeValid(self.age)\ 
     389        and self.isGenderValid(self.gender)\ 
     390        and self.isOriginValid(self.origin)\ 
     391        : 
     392            return True 
    261393        return False 
  • branches/active/character_customization/game/parpg/characterstatistics.py

    r774 r776  
    142142        statistic_type = self.statistic_type 
    143143        stat_modifiers = statistic_type.stat_modifiers 
    144         character = statistic_type.character 
     144        character = self.character() 
    145145         
    146146        value = sum( 
    147             character.statistics[name] * modifier for name, modifier in 
     147            character.statistics[name].value * modifier for name, modifier in 
    148148                stat_modifiers.items() 
    149149        ) 
Note: See TracChangeset for help on using the changeset viewer.