www.pudn.com > SimpleMUD.rar > GameLoop.cpp


// MUD Programming 
// Ron Penton 
// (C)2003 
// GameLoop.cpp - This class performs the game loop in SimpleMUD 
//  
//  
 
 
#include "BasicLib/BasicLibTypes.h" 
#include "GameLoop.h" 
#include  
#include  
 
using namespace BasicLib; 
using namespace SocketLib; 
 
namespace SimpleMUD 
{ 
 
sint64 DBSAVETIME = minutes( 15 ); 
sint64 ROUNDTIME  = seconds( 1 ); 
sint64 REGENTIME  = minutes( 2 ); 
sint64 HEALTIME   = minutes( 1 ); 
 
 
void GameLoop::Load() 
{ 
    std::ifstream file( "game.data" ); 
    file >> std::ws; 
 
    if( file.good() ) 
    { 
        std::string temp; 
        sint64 time; 
        file >> temp;   extract( file, time ); 
        Game::GetTimer().Reset( time ); 
 
        file >> temp;   extract( file, m_savedatabases ); 
        file >> temp;   extract( file, m_nextround ); 
        file >> temp;   extract( file, m_nextregen ); 
        file >> temp;   extract( file, m_nextheal ); 
    } 
    else 
    { 
        Game::GetTimer().Reset(); 
        m_savedatabases = DBSAVETIME; 
        m_nextround = ROUNDTIME; 
        m_nextregen = REGENTIME; 
        m_nextheal = HEALTIME; 
    } 
 
    Game::Running() = true; 
} 
 
 
void GameLoop::Save() 
{ 
    std::ofstream file( "game.data" ); 
 
    // save the game time 
    file << "[GAMETIME]      "; insert( file, Game::GetTimer().GetMS() ); file << "\n"; 
    file << "[SAVEDATABASES] "; insert( file, m_savedatabases );          file << "\n"; 
    file << "[NEXTROUND]     "; insert( file, m_nextround );              file << "\n"; 
    file << "[NEXTREGEN]     "; insert( file, m_nextregen );              file << "\n"; 
    file << "[NEXTHEAL]      "; insert( file, m_nextheal );               file << "\n"; 
} 
 
void GameLoop::Loop() 
{ 
    if( Game::GetTimer().GetMS() >= m_nextround ) 
    { 
        PerformRound(); 
        m_nextround += ROUNDTIME; 
    } 
 
    if( Game::GetTimer().GetMS() >= m_nextregen ) 
    { 
        PerformRegen(); 
        m_nextregen += REGENTIME; 
    } 
 
    if( Game::GetTimer().GetMS() >= m_nextheal ) 
    { 
        PerformHeal(); 
        m_nextheal += HEALTIME; 
    } 
 
    if( Game::GetTimer().GetMS() >= m_savedatabases ) 
    { 
        SaveDatabases(); 
        m_savedatabases += DBSAVETIME; 
    } 
} 
 
 
void GameLoop::LoadDatabases() 
{ 
    Load(); 
    ItemDatabase::Load(); 
    PlayerDatabase::Load(); 
    RoomDatabase::LoadTemplates(); 
    RoomDatabase::LoadData(); 
    StoreDatabase::Load(); 
    EnemyTemplateDatabase::Load(); 
    EnemyDatabase::Load(); 
} 
 
 
void GameLoop::SaveDatabases() 
{ 
    Save(); 
    PlayerDatabase::Save(); 
    RoomDatabase::SaveData(); 
    EnemyDatabase::Save(); 
} 
 
 
void GameLoop::PerformRound() 
{ 
    EnemyDatabase::iterator itr = EnemyDatabase::begin(); 
    sint64 now = Game::GetTimer().GetMS(); 
 
    while( itr != EnemyDatabase::end() ) 
    { 
        if( now >= itr->NextAttackTime() &&  
            itr->CurrentRoom()->Players().size() > 0 ) 
            Game::EnemyAttack( itr->ID() ); 
        ++itr; 
    } 
} 
 
void GameLoop::PerformRegen() 
{ 
    RoomDatabase::iterator itr = RoomDatabase::begin(); 
     
    while( itr != RoomDatabase::end() ) 
    { 
        if( itr->SpawnWhich() != 0 && 
            itr->Enemies().size() < itr->MaxEnemies() ) 
        { 
            EnemyDatabase::Create( itr->SpawnWhich(), itr->ID() ); 
            Game::SendRoom( red + bold + itr->SpawnWhich()->Name() +  
                            " enters the room!", itr->ID() ); 
        } 
 
        ++itr; 
    } 
} 
 
 
void GameLoop::PerformHeal() 
{ 
    PlayerDatabase::iterator itr = PlayerDatabase::begin(); 
    while( itr != PlayerDatabase::end() ) 
    { 
        if( itr->Active() ) 
        { 
            itr->AddHitpoints( itr->GetAttr( HPREGEN ) ); 
            itr->PrintStatbar( true ); 
        } 
        ++itr; 
    } 
} 
 
 
 
}   // end namespace SimpleMUD