Player class. Written for OOP Review. Derived from life_entity.

Dependents:   life_entity

player.cpp

Committer:
Nakor
Date:
2011-04-01
Revision:
1:2548417420a3
Parent:
0:7c89d9ec2d76

File content as of revision 1:2548417420a3:

#include "player.h"

#define PLAYER_XP_PER_LEVEL 5


// Comparison template function.
// I didn't end up using it in this code
// but if you want to give differing amounts of
// xp depending on player and enemy levels this
// could prove useful (although you will likely
// want to customize it).
template <class T>
T getMax(T a, T b) 
{
  T result;
  result = (a > b) ? a : b;
  return (result);
}

// Constructor
player::player()
{
    _level = 0x01;
    
    _baseHealth = 300;
    
    _health = _level * _baseHealth;
    
    _experience = 0;
    
    #if DEBUG_PLAYER
    printf("Creating player character.\n");
    #endif
    
}


// Return the player's experience point count
unsigned long int player::getExperience()
{
    return _experience;
}

// Check experience with required experience
// and level up if needed/possible
void player::isLevelUp()
{   
    unsigned long int xpToLevel = ( (PLAYER_XP_PER_LEVEL * _level) * (PLAYER_XP_PER_LEVEL * _level) + 360);
    
    if(_experience >= xpToLevel)
    {
        if(_level <= 0xFF)
        {
            _level++;
            printf("LEVEL UP!\nYou are now level %i\n", _level);
            xpToLevel = ( (PLAYER_XP_PER_LEVEL * _level) * (PLAYER_XP_PER_LEVEL * _level) + 360);
            printf("Current XP is (%ul / %ul)\n", _experience, xpToLevel);
            _health = (_level * _baseHealth) - _health;
        }
    }
    else if(_experience >= xpToLevel)
    {
        printf("Level cap reached!\n");
    }
    else
    {
        printf("Current XP is (%ul / %ul)\n", _experience, xpToLevel);
    }
    
    wait(1);
}

// Add experience points
// You would likely want to update this
// to give more or less xp depending on 
// player and enemy levels.
void player::addExperience()
{   
    int xp;
    
    if(_level < 0x09)
    {
        xp = (_level * PLAYER_XP_PER_LEVEL) + 45;
    }
    else
    {
        xp = (_level * PLAYER_XP_PER_LEVEL) + 90;
    }
    
    _experience = _experience + xp;
    
    printf("A winner is you!  You have gained %i XP\n", xp);
    
    srand ( time(NULL) );
    int healthGain = (_baseHealth - ( rand() % _baseHealth ) ) / 3;
    
    if(_health + healthGain > (_level * _baseHealth) ) 
    {
        _health = (_level * _baseHealth);
        printf("You have a chance to rest between fights.  Your health is restored to full.\n");
    }
    else 
    {
        _health += healthGain;
        printf("You have a chance to rest between fights.  You regain %i health.\n", healthGain);
    }
}

// Use this if you want a super long output of
// the entire experience ramp.
void player::displayExpRamp()
{
    printf("XP TO LEVEL:\n");
    
    _level = 0x01;
    
    unsigned long int xpToLevel = 0;
    unsigned int clump = 0;
    
    for(int i = 1; i < 256; i++)
    {
        _level = i;
        clump = PLAYER_XP_PER_LEVEL * _level;
        xpToLevel = ( (clump * clump * clump) + 360);
        printf("Level %i to %i:  %ul\n", _level, _level+1, xpToLevel);
    }
    
    _level = 0x01;
}

// Applies damage to player after
// doing a dodge roll.
void player::takeDamage(int roll)
{
    srand ( time(NULL) );
    int dodgeRoll = ( rand() % 1000 );
    
    int dodgeChance = 15 * _level;
    if(dodgeChance > 500) dodgeChance = 500;
    
    if(dodgeRoll > 1000 - dodgeChance)
    {
        printf("You have dodged the enemy's attack!\n");
        return;
    }
    
    _health -= roll;
    
    printf("You have taken %i damage!  (Current health:  %i)\n", roll, _health);
}

// Returns current player level
char player::getLevel()
{
    return _level;
}

// Function to communicate enemy info
// Use however you like or go with another method
void player::setCurrentEnemy(int health, char level)
{
    if(level)
    {
        _enemyLevel = level;
    }
    
    _enemyHealth = health;
}

// Checks to see if the player is dead and returns true if dead
// Also makes fun of you :)
char player::isDead()
{
    if(_health <= 0)
    {
        printf("\n\nOOOOOOOH!  So sorry, a loser is you!\n");
        printf("Stats:\n");
        printf("Current Level:  %i\n", _level);
        printf("Currrent XP:  %ul\n", _experience);
        wait(3);
        printf("Burning your useless body...\n");
        wait(1);
        printf("Cloning you (although we aren't sure why after that last failure)...\n");
        wait(2);
        printf("Ready to go!\n\n");
        return 0x01;
    }
    else
    {
        return 0x00;
    }
}