亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? player.cpp

?? MUD游戲編程光盤代碼
?? CPP
字號(hào):
// MUD Programming
// Ron Penton
// (C)2003
// Player.cpp - The class defining Players in the SimpleMUD
// 
// 

#include <cmath>
#include <string>
#include <fstream>
#include <vector>

#include "SimpleMUDLogs.h"
#include "Player.h"
#include "Item.h"

namespace SimpleMUD
{



Player::Player()
{
    m_pass = "UNDEFINED";
    m_rank = REGULAR;

    m_connection = 0;
    m_loggedin = false;
    m_active = false;
    m_newbie = true;

    m_experience = 0;
    m_level = 1;
    m_room = 1;
    m_money = 0;

    m_nextattacktime = 0;

    m_baseattributes[STRENGTH] = 1;
    m_baseattributes[HEALTH]   = 1;
    m_baseattributes[AGILITY]  = 1;

    m_items = 0;
    m_weapon = -1;
    m_armor = -1;

    m_statpoints = 18;

    RecalculateStats();
    m_hitpoints = GetAttr( MAXHITPOINTS );
}


int Player::NeedForNextLevel()
{
    // how much more experience to the next level
    return NeedForLevel( m_level + 1 ) - m_experience;
}


bool Player::Train()
{
    if( NeedForNextLevel() <= 0 )
    {
        m_statpoints += 2;
        m_baseattributes[MAXHITPOINTS] += m_level;
        m_level++;
        RecalculateStats();
        return true;
    }
    return false;
}


void Player::RecalculateStats()
{
    m_attributes[MAXHITPOINTS] = 
        10 + ( (int)(m_level * ( GetAttr( HEALTH ) / 1.5 )) );

    m_attributes[HPREGEN] = 
        ( GetAttr( HEALTH ) / 5 ) + m_level;

    m_attributes[ACCURACY] = GetAttr( AGILITY ) * 3;
    m_attributes[DODGING] = GetAttr( AGILITY ) * 3;
    m_attributes[DAMAGEABSORB] = GetAttr( STRENGTH ) / 5;
    m_attributes[STRIKEDAMAGE] = GetAttr( STRENGTH ) / 5;

    // make sure the hitpoints don't overflow if your max goes down
    if( m_hitpoints > GetAttr( MAXHITPOINTS ) )
        m_hitpoints = GetAttr( MAXHITPOINTS );

    if( Weapon() != 0 )
        AddDynamicBonuses( Weapon() );
    if( Armor() != 0 )
        AddDynamicBonuses( Armor() );
}

void Player::AddDynamicBonuses( item p_item )
{
    if( p_item == 0 )
        return;

    Item& i = *p_item;

    for( int x = 0; x < NUMATTRIBUTES; x++ )
        m_attributes[x] += i.GetAttr( x );
}

void Player::SetBaseAttr( int p_attr, int p_val )
{
    m_baseattributes[p_attr] = p_val;
    RecalculateStats();
}


void Player::AddToBaseAttr( int p_attr, int p_val )
{
    m_baseattributes[p_attr] += p_val;
    RecalculateStats();
}

void Player::AddHitpoints( int p_hitpoints )
{
    SetHitpoints( m_hitpoints + p_hitpoints );
}

void Player::SetHitpoints( int p_hitpoints )
{
    m_hitpoints = p_hitpoints;

    if( m_hitpoints < 0 )
        m_hitpoints = 0;
    if( m_hitpoints > GetAttr( MAXHITPOINTS ) )
        m_hitpoints = GetAttr( MAXHITPOINTS );
}


bool Player::PickUpItem( item p_item )
{
    if( m_items < MaxItems() )
    {
        // find the first open index to put the item in.
        item* itr = m_inventory;
        while( *itr != 0 )
            ++itr;

        // insert the item
        *itr = p_item;
        m_items++;

        return true;
    }
    return false;
}


bool Player::DropItem( int p_index )
{
    if( m_inventory[p_index] != 0 )
    {
        // remove the weapon or armor if needed
        if( m_weapon == p_index )
            RemoveWeapon();
        if( m_armor == p_index )
            RemoveArmor();

        m_inventory[p_index] = 0;
        m_items--;

        return true;
    }
    return false;
}

void Player::AddBonuses( item p_item )
{
    if( p_item == 0 )
        return;

    Item& itm = *p_item;
    for( int i = 0; i < NUMATTRIBUTES; i++ )
        m_baseattributes[i] += itm.GetAttr( i );

    RecalculateStats();
}


void Player::RemoveWeapon()
{
    m_weapon = -1;
    RecalculateStats();
}


void Player::RemoveArmor()
{
    m_armor = -1;
    RecalculateStats();
}


void Player::UseWeapon( int p_index )
{
    RemoveWeapon();
    m_weapon = p_index;
    RecalculateStats();
}


void Player::UseArmor( int p_index )
{
    RemoveArmor();
    m_armor = p_index;
    RecalculateStats();
}


// ------------------------------------------------------------------------
//  This gets the index of an item within the players inventory given a 
//  name.
// ------------------------------------------------------------------------
int Player::GetItemIndex( const std::string& p_name )
{
    item* i = double_find_if( m_inventory, 
                              m_inventory + MaxItems(),
                              matchentityfull( p_name ),
                              matchentity( p_name ) );

    if( i == m_inventory + MaxItems() )
        return -1;
    return (int)(i - m_inventory);
}


// ------------------------------------------------------------------------
//  This sends a string to the players connection.
// ------------------------------------------------------------------------
void Player::SendString( const std::string& p_string )
{
    using namespace SocketLib;

    if( Conn() == 0 )
    {
        ERRORLOG.Log( "Trying to send string to player " +
                      Name() + " but player is not connected." );
        return;
    }

    // send the string, newline included.
    Conn()->Protocol().SendString( *Conn(), p_string + newline );

    if( Active() )
    {
        PrintStatbar();
    }
}

// ------------------------------------------------------------------------
//  This prints up the players "statbar", ie: his hitpoints.
// ------------------------------------------------------------------------
void Player::PrintStatbar( bool p_update )
{
    using namespace SocketLib;
    using namespace BasicLib;

    // if this is a statusbar update and the user is currently typing something,
    // then do nothing.
    if( p_update && Conn()->Protocol().Buffered() > 0 )
        return;

    string statbar = white + bold + "[";

    int ratio = 100 * HitPoints() / GetAttr( MAXHITPOINTS );

    // color code your hitpoints so that they are red if low,
    // yellow if medium, and green if high.
    if( ratio < 33 )
        statbar += red;
    else if( ratio < 67 )
        statbar += yellow;
    else 
        statbar += green;

    statbar += tostring( HitPoints() ) + white + "/" + 
                tostring( GetAttr( MAXHITPOINTS ) ) + "] ";

    Conn()->Protocol().SendString( *Conn(), clearline + "\r" + statbar + reset );
}



// --------------------------------------------------------------------
//  Inserts an item in text form into a stream
// --------------------------------------------------------------------
ostream& operator<<( ostream& p_stream, const Player& p )
{
    p_stream << "[NAME]           " << p.m_name << "\n";
    p_stream << "[PASS]           " << p.m_pass << "\n";
    p_stream << "[RANK]           " << GetRankString( p.m_rank ) << "\n";
    p_stream << "[STATPOINTS]     " << p.m_statpoints << "\n";
    p_stream << "[EXPERIENCE]     " << p.m_experience << "\n";
    p_stream << "[LEVEL]          " << p.m_level << "\n";
    p_stream << "[ROOM]           " << p.m_room << "\n";
    p_stream << "[MONEY]          " << p.m_money << "\n";
    p_stream << "[HITPOINTS]      " << p.m_hitpoints << "\n";
    p_stream << "[NEXTATTACKTIME] "; insert( p_stream, p.m_nextattacktime );
    p_stream << "\n";
    p_stream << p.m_baseattributes;

    p_stream << "[INVENTORY]      ";
    for( int i = 0; i < p.MaxItems(); i++ )
    {
        p_stream << p.m_inventory[i] << " ";
    }
    p_stream << "\n";


    p_stream << "[WEAPON]         " << p.m_weapon << "\n";
    p_stream << "[ARMOR]          " << p.m_armor << "\n";

    return p_stream;
}


// --------------------------------------------------------------------
//  Extracts an item in text form from a stream
// --------------------------------------------------------------------
istream& operator>>( istream& p_stream, Player& p )
{
    std::string temp;
    p_stream >> temp >> std::ws;
    std::getline( p_stream, p.m_name );
    p_stream >> temp >> p.m_pass;
    p_stream >> temp >> temp;
    p.m_rank = GetRank( temp );
    p_stream >> temp >> p.m_statpoints;
    p_stream >> temp >> p.m_experience;
    p_stream >> temp >> p.m_level;
    p_stream >> temp >> p.m_room;
    p_stream >> temp >> p.m_money;
    p_stream >> temp >> p.m_hitpoints;
    p_stream >> temp; extract( p_stream, p.m_nextattacktime );
    p_stream >> p.m_baseattributes;

    p_stream >> temp;
    p.m_items = 0;
    for( int i = 0; i < p.MaxItems(); i++ )
    {
        p_stream >> p.m_inventory[i];
        if( p.m_inventory[i] != 0 )   
            p.m_items++;
    }

    p_stream >> temp >> p.m_weapon;
    p_stream >> temp >> p.m_armor;

    p.RecalculateStats();

    return p_stream;
}




}   // end namespace SimpleMUD

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
中文字幕一区在线| 日韩av中文字幕一区二区三区| 欧洲国内综合视频| 精品一二三四区| 亚洲精品免费播放| 久久久噜噜噜久久人人看| 欧美日韩国产精选| av在线播放一区二区三区| 看片网站欧美日韩| 亚洲国产成人91porn| 国产精品国产三级国产aⅴ中文| 欧美一区二区三区男人的天堂| 97久久精品人人做人人爽| 激情av综合网| 奇米777欧美一区二区| 悠悠色在线精品| 亚洲欧美在线另类| 国产亚洲短视频| 欧美精品一区二区三区高清aⅴ | 中文字幕+乱码+中文字幕一区| 欧美精品粉嫩高潮一区二区| 色综合天天综合色综合av| 韩国v欧美v亚洲v日本v| 久热成人在线视频| 蜜桃视频在线一区| 日韩国产高清影视| 日本一不卡视频| 爽好多水快深点欧美视频| 91免费看`日韩一区二区| 国产制服丝袜一区| 九九**精品视频免费播放| 日本亚洲电影天堂| 日产国产高清一区二区三区| 亚洲妇女屁股眼交7| 亚洲一级二级在线| 午夜不卡av免费| 日本视频中文字幕一区二区三区| 亚洲成av人**亚洲成av**| 亚洲午夜激情网站| 婷婷中文字幕一区三区| 天堂av在线一区| 视频一区欧美精品| 免费看黄色91| 久久国产精品99久久人人澡| 精品一区二区影视| 国产福利不卡视频| 99麻豆久久久国产精品免费优播| 91同城在线观看| 欧美亚洲国产一区在线观看网站| 欧美中文字幕一区| 日韩一区二区三区三四区视频在线观看| 欧美美女一区二区在线观看| 51精品国自产在线| 精品日韩一区二区三区免费视频| 欧美tickling挠脚心丨vk| 精品sm在线观看| 国产精品狼人久久影院观看方式| 亚洲婷婷国产精品电影人久久| 一区二区三区四区激情| 午夜在线电影亚洲一区| 免费av成人在线| 成人免费毛片a| 欧美视频你懂的| 精品国产免费视频| 亚洲色图另类专区| 男男成人高潮片免费网站| 国产精品996| 91成人免费在线视频| 日韩精品在线网站| 亚洲欧美一区二区久久| 视频在线观看一区二区三区| 国内精品久久久久影院色| jlzzjlzz亚洲女人18| 欧美日韩国产乱码电影| 国产日产欧产精品推荐色 | 午夜在线电影亚洲一区| 韩国v欧美v日本v亚洲v| 色综合色狠狠综合色| 欧美一区二区女人| 国产精品久久综合| 日韩国产精品91| 波多野结衣中文字幕一区二区三区 | 日韩精品亚洲专区| 国产高清不卡一区| 欧美日韩一区二区欧美激情| 久久亚洲一区二区三区四区| 亚洲色欲色欲www| 美国三级日本三级久久99| 白白色 亚洲乱淫| 欧美大片一区二区| 亚洲老妇xxxxxx| 狠狠色狠狠色综合| 欧美日韩三级一区| 国产精品福利av| 久久99精品久久久久婷婷| 在线日韩国产精品| 久久久综合视频| 婷婷综合五月天| 色噜噜狠狠成人中文综合| 久久久久久久精| 九九九久久久精品| 67194成人在线观看| 亚洲蜜桃精久久久久久久| 国产精品99久久久久| 欧美一级欧美三级在线观看| 亚洲精品免费在线播放| 中文字幕在线不卡国产视频| 另类小说综合欧美亚洲| 欧美午夜在线一二页| 亚洲欧美一区二区久久| 成人夜色视频网站在线观看| 日韩欧美一级在线播放| 亚洲成av人**亚洲成av**| 日本韩国欧美在线| 国产精品理论片| 成人久久久精品乱码一区二区三区 | 亚洲激情图片小说视频| 国产成人免费在线视频| 日韩欧美高清一区| 日韩二区在线观看| 欧美日韩国产一级片| 亚洲综合在线电影| 色婷婷一区二区三区四区| 国产精品大尺度| 成a人片亚洲日本久久| 国产精品欧美一区喷水| 丰满放荡岳乱妇91ww| 国产夜色精品一区二区av| 国产剧情一区在线| 亚洲国产精品t66y| 国产成人啪免费观看软件| 国产拍揄自揄精品视频麻豆| 风间由美一区二区三区在线观看| 2020国产精品自拍| 激情亚洲综合在线| 久久精品男人天堂av| 国产一区高清在线| 国产日韩欧美在线一区| 国产91清纯白嫩初高中在线观看| 国产精品欧美一区喷水| 色综合久久88色综合天天免费| 亚洲人成影院在线观看| 91国在线观看| 性感美女久久精品| 日韩小视频在线观看专区| 久久成人羞羞网站| 久久精品亚洲精品国产欧美| 处破女av一区二区| 亚洲欧美一区二区在线观看| 91女厕偷拍女厕偷拍高清| 亚洲午夜激情网站| 欧美电影免费观看完整版| 精品综合久久久久久8888| 国产三级精品三级| 99视频有精品| 午夜不卡av免费| 精品99999| 91在线视频18| 日韩成人午夜精品| 久久久久久一级片| 99久久国产综合精品麻豆| 亚洲一区在线电影| 精品久久国产老人久久综合| 中文无字幕一区二区三区| www.av亚洲| 日韩在线观看一区二区| 久久久久久99精品| 欧美性猛片aaaaaaa做受| 青娱乐精品在线视频| 国产精品网友自拍| 欧美三级欧美一级| 国产精品 日产精品 欧美精品| 亚洲精品日日夜夜| 欧美成人r级一区二区三区| av亚洲精华国产精华精| 视频在线在亚洲| 国产精品视频一二| 欧美一级午夜免费电影| 99精品久久久久久| 免费精品99久久国产综合精品| 国产精品久久久久天堂| 欧美精品v国产精品v日韩精品| 国产成人av自拍| 日韩精品1区2区3区| 中文字幕一区在线观看| 欧美成人a在线| 欧美网站大全在线观看| 国产精品99精品久久免费| 午夜精品免费在线| 中文字幕乱码久久午夜不卡 | 精品在线播放免费| 亚洲一区二区三区四区在线观看| 精品国产乱子伦一区| 91老师国产黑色丝袜在线| 韩日av一区二区| 日韩在线一区二区| 一卡二卡欧美日韩| 中文乱码免费一区二区| 日韩精品综合一本久道在线视频| 91蜜桃传媒精品久久久一区二区|