⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gameloop.cpp

📁 MUD游戏编程光盘代码
💻 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 <fstream>
#include <string>

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

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -