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

📄 playerstats.cpp.svn-base

📁 ROSE的源代码。了解的自己研究,编译通过
💻 SVN-BASE
📖 第 1 页 / 共 5 页
字号:
/*
    Rose Online Server Emulator
    Copyright (C) 2006,2007 OSRose Team http://www.osrose.net
    
    This program is free software; you can redistribute it and/or
    modify it under the terms of the GNU General Public License
    as published by the Free Software Foundation; either version 2
    of the License, or (at your option) any later version.
    
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
    
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.

    depeloped with Main erose/hrose source server + some change from the original eich source        
*/
#include "player.h"
#include "worldserver.h"

// Return Dodge
unsigned int CPlayer::GetDodge( )
{
    UINT Dodge = 0;
    Dodge = (UINT)floor(( ((Stats->Level * 0.3) + ((Attr->Dex + Attr->Edex) * 1.9)) + 10 ) * 0.4);
    UINT ClothDodge = 0;
    for(UINT i=1;i<7;i++)
    {
        if( items[i].count != 0 )
            ClothDodge += items[i].durability;
    }    
    Dodge += (UINT)floor(ClothDodge*0.3);
    for(UINT i=1;i<12;i++)//cloth stats [from tomiz]
    {
        if( items[i].count != 0 )
        {    
            if(items[i].itemtype>9)
            {
                Log(MSG_WARNING, "Char %s have equip invalid item: %i,%i", CharInfo->charname, items[i].itemtype, items[i].itemnum );
                continue;
            }            
            if( GServer->EquipList[items[i].itemtype].Index[items[i].itemnum]->stat1[0] == A_DODGE)
            {
                Dodge += GServer->EquipList[items[i].itemtype].Index[items[i].itemnum]->stat1[1];
            }
            if( GServer->EquipList[items[i].itemtype].Index[items[i].itemnum]->stat2[0] == A_DODGE)
            {
                Dodge += GServer->EquipList[items[i].itemtype].Index[items[i].itemnum]->stat2[1];
            }
            if(items[i].stats>0 && items[i].stats<500)
            {
                if(GServer->StatsList[items[i].stats].stat[0] == A_DODGE)
                    Dodge += GServer->StatsList[items[i].stats].value[0];
                if(GServer->StatsList[items[i].stats].stat[1] == A_DODGE)
                    Dodge += GServer->StatsList[items[i].stats].value[1];
            }
        }
    }  
    if(Status->Dodge_up!=0xff)
        Dodge += MagicStatus[Status->Dodge_up].Value;
    if(Status->Dodge_down!=0xff)
        Dodge -= MagicStatus[Status->Dodge_down].Value;     
    if(Dodge<30)
        Dodge=30;        
    return Dodge;
}

// Return Accury
unsigned int CPlayer::GetAccury( )
{
    UINT Accury = 0;
    if(items[7].count==0 )
        Accury = (UINT)floor( (((Attr->Con + Attr->Econ )+10)*0.5) + 15 );
    else
        Accury = (UINT)floor( ((Attr->Con+Attr->Econ+10)*0.8) + ((GServer->EquipList[WEAPON].Index[items[7].itemnum]->quality*0.6) + (items[7].durability*0.8)) );
    UINT extra_refine[10] = { 0, 4, 7, 10, 14, 20, 26, 33, 40, 50};                
    if( items[7].refine>0 )
    {
        UINT refine = (UINT)floor(items[7].refine/16);
        if(refine<10)
        {
            Accury += extra_refine[refine];
        }
    }
    UINT Extra = 0;    
    for(UINT i=0;i<MAX_SKILL;i++)
    {
        if( cskills[i].id == 0 || cskills[i].thisskill == 0 )
            continue;
        if( cskills[i].thisskill->type == 15 ) //Pasive
        {         
            for(UINT j=0;j<3;j++ )
            {
                if( cskills[i].thisskill->buff[j] == ATK_ACCURACY || cskills[i].thisskill->buff[j] ==  A_ACCUR )
                {
                    if( cskills[i].thisskill->value2[j] > 0 )
                        Extra += Accury * cskills[i].thisskill->value2[j] / 100;
                    if( cskills[i].thisskill->value1[j] > 0 )
                    {
                        Extra += cskills[i].thisskill->value1[j];
                    }
                }
            }
        }
    }    
    Accury += Extra;  
    for(UINT i=1;i<12;i++)//cloth stats [from tomiz]
    {
        if( items[i].count != 0 )
        {
            if(items[i].itemtype>9)
            {
                Log(MSG_WARNING, "Char %s have equip invalid item: %i,%i", CharInfo->charname, items[i].itemtype, items[i].itemnum );
                continue;
            }            
            if( GServer->EquipList[items[i].itemtype].Index[items[i].itemnum]->stat1[0] == A_ACCUR)
            {
                Accury += GServer->EquipList[items[i].itemtype].Index[items[i].itemnum]->stat1[1];
            }
            if( GServer->EquipList[items[i].itemtype].Index[items[i].itemnum]->stat2[0] == A_ACCUR)
            {
                Accury += GServer->EquipList[items[i].itemtype].Index[items[i].itemnum]->stat2[1];
            }
            if(items[i].stats>0 && items[i].stats<500)
            {
                if(GServer->StatsList[items[i].stats].stat[0] == A_ACCUR)
                    Accury += GServer->StatsList[items[i].stats].value[0];
                if(GServer->StatsList[items[i].stats].stat[1] == A_ACCUR)
                    Accury += GServer->StatsList[items[i].stats].value[1];
            }            
        }
    }       
    if(Status->Accury_up!=0xff)
        Accury += MagicStatus[Status->Dodge_up].Value;
    if(Status->Accury_down!=0xff)
        Accury -= MagicStatus[Status->Accury_down].Value;          
    if(Accury<30)
        Accury=30;
    return Accury;
}

// Return Critical
unsigned int CPlayer::GetCritical( )
{
    UINT Critical = 0;
    Critical = (UINT)floor(((Attr->Con + Attr->Econ + 20)*0.2) + Attr->Sen + Attr->Esen );
    for(UINT i=0;i<MAX_SKILL;i++)
    {
        if( cskills[i].id == 0 || cskills[i].thisskill == 0 )
            continue;
    	if( cskills[i].thisskill->type == 15 ) //Pasive
        {   // Passive skill fixed by tomiz
            for( UINT j=0;j<3;j++ )
            {
                if( cskills[i].thisskill->buff[j] == A_CRITICAL ) 
                {
                    if( cskills[i].thisskill->value2[j] > 0 )
                        Critical += Critical * cskills[i].thisskill->value2[j] / 100;
                    if( cskills[i].thisskill->value1[j] > 0 )
                        Critical += cskills[i].thisskill->value1[j];
                }
            }
        }
    }    
    for(UINT i=1;i<12;i++)//cloth stats [from tomiz]
    {
        if( items[i].count != 0)
        {
            if(items[i].itemtype>9)
            {
                Log(MSG_WARNING, "Char %s have equip invalid item: %i,%i", CharInfo->charname, items[i].itemtype, items[i].itemnum );
                continue;
            }            
            if( GServer->EquipList[items[i].itemtype].Index[items[i].itemnum]->stat1[0] == A_CRITICAL)
            {
                Critical += GServer->EquipList[items[i].itemtype].Index[items[i].itemnum]->stat1[1];
            }
            if( GServer->EquipList[items[i].itemtype].Index[items[i].itemnum]->stat2[0] == A_CRITICAL)
            {
                Critical += GServer->EquipList[items[i].itemtype].Index[items[i].itemnum]->stat2[1];
            }
            if(items[i].stats>0 && items[i].stats<500)
            {
                if(GServer->StatsList[items[i].stats].stat[0] == A_CRITICAL)
                    Critical += GServer->StatsList[items[i].stats].value[0];
                if(GServer->StatsList[items[i].stats].stat[1] == A_CRITICAL)
                    Critical += GServer->StatsList[items[i].stats].value[1];
            }               
        }
    }       
    if(Fairy)Critical = (unsigned int)floor(Critical*1.2);    
    if(Status->Critical_up!=0xff)
        Critical += MagicStatus[Status->Critical_up].Value;
    if(Status->Critical_down!=0xff)
        Critical -= MagicStatus[Status->Critical_down].Value;  
    if(Critical<10)
        Critical=10;     
    return Critical;
}


// Return Magic Defense
unsigned int CPlayer::GetMagicDefense( )
{
    UINT MagicDefense = 0;
    switch( CharInfo->Job )
    {
        case 121:case 122:
        case 221:case 222:
        case 321:case 322:
        case 421:case 422:
            MagicDefense += 20;
        break;
    } 
    MagicDefense += (UINT)floor(((Attr->Int + Attr->Eint+5)*0.6) + ((Stats->Level+15)*0.8));                         
    for(UINT i=1;i<9;i++)
    {        
        if(items[i].itemtype>9)
        {
            Log(MSG_WARNING, "Char %i have equipped invalid item: %i,%i", CharInfo->charname, items[i].itemtype, items[i].itemnum );
            continue;
        }
        if(items[i].itemtype==WEAPON || items[i].count<1 )
            continue;
        MagicDefense += GServer->EquipList[items[i].itemtype].Index[items[i].itemnum]->magicresistence;
    }                        
    for(UINT i=1;i<12;i++)//cloth stats [from tomiz]
    {
        if( items[i].count != 0 )
        {
            if(items[i].itemtype>9)
            {
                Log(MSG_WARNING, "Char %s have equip invalid item: %i,%i", CharInfo->charname, items[i].itemtype, items[i].itemnum );
                continue;
            }            
            if( GServer->EquipList[items[i].itemtype].Index[items[i].itemnum]->stat1[0] == A_MRESIST)
            {
                MagicDefense += GServer->EquipList[items[i].itemtype].Index[items[i].itemnum]->stat1[1];
            }
            if( GServer->EquipList[items[i].itemtype].Index[items[i].itemnum]->stat2[0] == A_MRESIST)
            {
                MagicDefense += GServer->EquipList[items[i].itemtype].Index[items[i].itemnum]->stat2[1];
            }
            if(items[i].stats>0 && items[i].stats<500)
            {
                if(GServer->StatsList[items[i].stats].stat[0] == A_MRESIST)
                    MagicDefense += GServer->StatsList[items[i].stats].value[0];
                if(GServer->StatsList[items[i].stats].stat[1] == A_MRESIST)
                    MagicDefense += GServer->StatsList[items[i].stats].value[1];
            }                           
        }
    }      
    if(Status->Magic_Defense_up!=0xff)
        MagicDefense += MagicStatus[Status->Magic_Defense_up].Value;
    if(Status->Magic_Defense_down!=0xff)
        MagicDefense -= MagicStatus[Status->Magic_Defense_down].Value;
    return MagicDefense;
}


// Return Attack
unsigned int CPlayer::GetAttackPower( )
{			    
    UINT attack = 0;
    UINT weapontype = 0;   
    UINT weaponatk = 0;      
    switch(CharInfo->Job)
    {
        case 121:case 122:
        case 221:case 222:
        case 321:case 322:
        case 421:case 422:
            attack += 30;
        break;
    }       
	if( items[7].itemnum!=0 && items[7].count > 0 && items[7].durability>0 )
    {
        UINT extra_refine[10] = {0, 7, 14, 21, 31, 41, 51, 65, 80 , 100};                      
        weaponatk = GServer->EquipList[WEAPON].Index[items[7].itemnum]->attackpower;
        weapontype = GServer->EquipList[WEAPON].Index[items[7].itemnum]->type;        
        if( items[7].refine>0 ) 
        {
            UINT refine = (UINT)floor(items[7].refine/16);
            if(refine>0 && refine<10)
            {
                weaponatk += (UINT)floor(extra_refine[refine] * 0.01 * weaponatk);        
            }
        }
    }
    else
    {
        attack += (UINT)floor( Stats->Level*0.2 + (Attr->Str + Attr->Estr)*0.5 + (Attr->Dex + Attr->Edex)*0.3 );
    }
    switch( weapontype )
    {
        case ONE_HAND_SWORD://one hand sword
        {  
            attack += (UINT)floor( (Attr->Str + Attr->Estr)*0.75 + Stats->Level*0.2 + ((Attr->Str + Attr->Estr)*0.05 + 29) * weaponatk * 0.03333334 );
            for(UINT i=0;i<MAX_SKILL;i++)
            {
                if( cskills[i].id == 0 || cskills[i].thisskill == 0 )
                    continue;
                if( cskills[i].thisskill->type == 15 ) //Pasive
                {         
                    for( UINT j=0;j<3;j++ )
                    {
                        if( cskills[i].thisskill->buff[j] == ONE_HAND_WEAP_AP || 
                            cskills[i].thisskill->buff[j] == ONE_HAND_SWORD_AP )
                        {
                            if( cskills[i].thisskill->value2[j] > 0 )
                                attack += attack * cskills[i].thisskill->value2[j] / 100;
                            if( cskills[i].thisskill->value1[j] > 0 )
                            {
                                attack += cskills[i].thisskill->value1[j];

⌨️ 快捷键说明

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