Example program for Object Oriented Programing Review cookbook page.

Dependencies:   life_entity mbed

main.cpp

Committer:
Nakor
Date:
2011-04-01
Revision:
0:8954122ba76f

File content as of revision 0:8954122ba76f:

/*
    Object Oriented Programing Review

    Refreshing my memory on things I
    haven't touched since college.
    
    This version is intended for public use.
    You may use this in any way you choose, free of charge.
    No permission is required (written or verbal), and you
    do not HAVE to attribute.  It would however, be very
    nice if you would mention me in any product or project
    you may create with this.
    
    Aaron Goselin 2011
*/

#include "mbed.h"
#include "life_entity.h"
#include "player.h"
#include "enemy.h"
#include "armoured_vehicle.h"

Serial PC(USBTX, USBRX);

// Pointer to player's class
// Does not change to any other class
// Only resets on death (delete then new)
player *user = new player();

// Pointer to the current enemy.
// Can change from enemy to armoured_vehicle (or the other way around)
// Also resets on death (delete and new)
// Pointer to user class is always passed to the current enemy's
// constructor.
life_entity *currentEnemy;

int main() 
{
    PC.baud(230400);
    
    // Setting RTC for rand()
    set_time(1256729737);
    
    int enemyHealth = 0;
    char enemyLevel = 0x00;
    int roll = 0;  // Damage roll
    int roundCount = 1;  // Round counter
    char thereIsCake = 0x00;
    
    while(1) 
    {
        srand ( time(NULL) );
        // Spawn elite enemy
        if( (rand() % 1000) > 200 )
        {
            delete currentEnemy;
            currentEnemy = new armoured_vehicle(user);
        }
        // Spawn normal enemy
        else
        {
            delete currentEnemy;
            currentEnemy = new enemy(user);
        }
        
        enemyHealth = currentEnemy->getHealth();
        enemyLevel = currentEnemy->getLevel();
        
        // This isn't really used in the version of code
        // being added to the site but you can use it
        // however you like.
        user->setCurrentEnemy(enemyHealth, enemyLevel);
        
        // Keep going through the rounds until someone is dead
        while(currentEnemy->getHealth() > 0)
        {
            printf("ROUND #%i\n", roundCount);
            printf("----------\n");
            // User rolls for damage
            roll = user->rollDamage();
            // Current enemy takes the hit
            currentEnemy->takeDamage(roll);
            // Get current enemy health
            enemyHealth = currentEnemy->getHealth();
            // Send update on enemy health status to user
            user->setCurrentEnemy(enemyHealth);
            // Enemy rolls for damage
            roll = currentEnemy->rollDamage();
            // User takes the hit (one third of it anyway)
            user->takeDamage(roll / 3);
            // Check to see if the user is dead
            thereIsCake = user->isDead();
            // Exit if user is dead (they promised cake though)
            if(thereIsCake) break;
            wait(.5);
            
            roundCount++;
        }
        
        // If the user dies restart everything
        if(thereIsCake)
        {
            delete user;
            user = new player();
            roundCount = 1;
        }
        // User is still alive.  Crap, no cake yet.
        else
        {        
            // User won, so add xp (also adds a bit of health)
            user->addExperience();
            // Check to see if user leveled up
            user->isLevelUp();
            // Reset round counter
            roundCount = 1;
        }
        
    }
}