📄 playerstats.cpp.svn-base
字号:
/*
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 + -