Files
2025-08-11 11:09:09 -05:00

947 lines
40 KiB
C++

/*
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 "worldserver.h"
// Add Player buffs
bool CWorldServer::AddBuffs( CSkills* thisskill, CCharacter* character, int Evalue )
{
//Log(MSG_INFO, "called addbuffs." );
bool bflag = false;
for(unsigned int i=0;i<2;i++)
{
if(thisskill->status[i] != 0) // sets status flags in magicstatus array
{
bflag = CheckABuffs( thisskill, character, Evalue, i );
}
else // some skills are instant effects without status changes e.g. healing.
{
if(thisskill->buff[i] != 0)
{
bflag = InstantBuff( thisskill, character, Evalue, i );
}
}
}
return bflag;
}
// handle instant effect skills without status changes
bool CWorldServer::InstantBuff( CSkills* thisskill, CCharacter* character, int Evalue, int i )
{
//Log( MSG_INFO, "Instant skill cast: Status (should be zero):%i buff: %i", thisskill->status[i], thisskill->buff[i] );
switch( thisskill->buff[i])
{
case 16: // HP
{
if(thisskill->duration <= 0 )//is heal
{
if(character->Stats->HP <= 0) //character is dead
return true;
character->Stats->HP += (long int)thisskill->value1[i]; //apparently there is no buff here. // + Evalue - 8;
if(character->Stats->HP > character->Stats->MaxHP )
character->Stats->HP = character->Stats->MaxHP;
return true;
}
}
break;
case 17: // MP
{
if(thisskill->duration <= 0 )// recover MP
{
character->Stats->MP += (long int)thisskill->value1[i];
if(character->Stats->MP > character->Stats->MaxMP)
character->Stats->MP = character->Stats->MaxMP;
return true;
}
}
break;
case 76: // Stamina
{
if(character->IsPlayer()) //monsters do not have stamina it would seem
{
if(thisskill->duration <= 0 )// recover Stamina
{
CPlayer* thisclient = GServer->GetClientByID(character->clientid);
if(thisclient == NULL)return false;
thisclient->CharInfo->stamina += (long int)thisskill->value1[i];
if(thisclient->CharInfo->stamina > 5000)
thisclient->CharInfo->stamina = 5000;
//Log(MSG_INFO,"Character %i Stamina is now %i", character->clientid, thisclient->CharInfo->stamina);
return true;
}
}
else
return false;
}
break;
default:
return false;
break;
}
return false;
}
// Add DeBuffs
bool CWorldServer::CheckABuffs( CSkills* thisskill, CCharacter* character, int Evalue ,int i)
{
//Log( MSG_INFO, "checkabuffs status: %i buff: %i",( thisskill->status[i], thisskill->buff[i] ));
bool bflag = false;
if(thisskill->status[i] != 0)
{
switch( thisskill->status[i])
{
case 7: case 8: case 9: case 10: case 11: //poisoned
{
//Log( MSG_INFO, "checkabuffs: Poisoned Status detected %i", thisskill->status[i] );
CBValue BuffValue = GetBuffValue( thisskill, character, Evalue, i, 0xff, character->Status->Poisoned, character->Status->Poisoned,true, true );
if(BuffValue.Position != 0xff)
{
UINT j = BuffValue.Position;
if(j>14)
{
character->Status->Poisoned = j;
character->MagicStatus[j].Buff = 1; // needs some value or else it will not be counted in GetBuffValue. trying it with 1
character->MagicStatus[j].BuffTime = clock();
character->MagicStatus[j].Duration = thisskill->duration;
character->MagicStatus[j].Value = 0; // this might cause headaches later
character->MagicStatus[j].Status = thisskill->status[i];
//Log( MSG_INFO, "Poisoned Status applied");
bflag = true;
}
}
}
break;
case 30: // muted
{
//Log( MSG_INFO, "checkabuffs: Mute Status detected %i", thisskill->status[i] );
CBValue BuffValue = GetBuffValue( thisskill, character, Evalue, i, 0xff, character->Status->Muted, character->Status->Muted, true, true );
if(BuffValue.Position != 0xff)
{
UINT j = BuffValue.Position;
if(j>14)
{
character->Status->Muted = j;
character->Status->CanCastSkill = false;
character->MagicStatus[j].Buff = 1; // needs some value or else it will not be counted in GetBuffValue. trying it with 1
character->MagicStatus[j].BuffTime = clock();
character->MagicStatus[j].Duration = thisskill->duration;
character->MagicStatus[j].Value = 0; // this might cause headaches later
character->MagicStatus[j].Status = thisskill->status[i];
//Log( MSG_INFO, "Muted Status applied");
bflag = true;
}
}
}
break;
case 31: // sleep
{
//Log( MSG_INFO, "checkabuffs: Sleep Status detected %i", thisskill->status[i] );
CBValue BuffValue = GetBuffValue( thisskill, character, Evalue, i, 0xff, character->Status->Sleep, character->Status->Sleep, true, true );
Log( MSG_INFO, "Sleep Status attempted. position = %i", BuffValue.Position);
if(BuffValue.Position != 0xff)
{
UINT j = BuffValue.Position;
if(j>14)
{
character->Status->Sleep = j;
character->Status->CanAttack = false;
character->Status->CanMove = false;
character->Status->CanCastSkill = false;
character->MagicStatus[j].Buff = 1; // needs some value or else it will not be counted in GetBuffValue. trying it with 1
character->MagicStatus[j].BuffTime = clock();
character->MagicStatus[j].Duration = thisskill->duration;
character->MagicStatus[j].Value = 0; // this might cause headaches later
character->MagicStatus[j].Status = thisskill->status[i];
//Log( MSG_INFO, "Sleep Status applied");
bflag = true;
}
}
}
break;
case 32: // faint
{
//Log( MSG_INFO, "checkabuffs: Fainted Status detected %i", thisskill->status[i] );
CBValue BuffValue = GetBuffValue( thisskill, character, Evalue, i, 0xff, character->Status->Faint, character->Status->Faint, true, true );
//Log( MSG_INFO, "Stun Status attempted. position = %i", BuffValue.Position);
if(BuffValue.Position != 0xff)
{
UINT j = BuffValue.Position;
if(j>14)
{
character->Status->Faint = j;
character->Status->CanAttack = false;
character->MagicStatus[j].Buff = 1; // needs some value or else it will not be counted in GetBuffValue. trying it with 1
character->MagicStatus[j].BuffTime = clock();
character->MagicStatus[j].Duration = thisskill->duration;
character->MagicStatus[j].Value = 0; // this might cause headaches later
character->MagicStatus[j].Status = thisskill->status[i];
//Log( MSG_INFO, "Fainted Status applied");
bflag = true;
}
}
}
break;
case 39: // Dispell. removes all buff and debuff effects
{
Log( MSG_INFO, "checkabuffs: Dispell Status detected %i", thisskill->status[i] );
// some dispell skills have duration of 2 seconds. Others have zero.
// for now we will treat them all as instants so we don't need a buff slot
float randv = GServer->RandNumber(0, 100);
if(randv <= thisskill->successrate)
{
for(int j=0;j<30;j++)
{ // Clean Buffs
character->MagicStatus[j].Duration = 0;
}
Log( MSG_INFO, "Dispell Status applied successfully");
// the rest will be taken care of in RefreshBuffs()
}
bflag = true;
}
break;
case 54: //A_GMExtra_Damage:
case 36: //A_Extra_Damage:
{
CBValue BuffValue = GetBuffValue( thisskill, character, Evalue, i,
character->Status->ExtraDamage_up,
character->Status->ExtraDamage_down,
character->Stats->ExtraDamage, true );
if(BuffValue.Position != 0xff)
{
UINT j = BuffValue.Position;
character->Stats->ExtraDamage = thisskill->atkpower;
if(j<15)
character->Status->ExtraDamage_up = j;
else
character->Status->ExtraDamage_down = j;
character->MagicStatus[j].Buff = thisskill->buff[i];
character->MagicStatus[j].BuffTime = clock();
character->MagicStatus[j].Duration = thisskill->duration;
character->MagicStatus[j].Value = thisskill->atkpower;
character->MagicStatus[j].Status = thisskill->status[i];
bflag = true;
Log( MSG_INFO, "Extra Damage Buff. Value %i Status %i",character->MagicStatus[j].Value,character->MagicStatus[j].Status);
}
}
case 35: // shield damage
{
// uses skill power not buff value. Add later
}
break;
case 18: // attack power up
case 19: // attack power down
case 48: // attack power up
{
//Log( MSG_INFO, "checkabuffs: Attack buff detected %i", thisskill->buff[i] );
CBValue BuffValue = GetBuffValue( thisskill, character, Evalue, i,
character->Status->Attack_up,
character->Status->Attack_down,
character->Stats->Attack_Power, true );
if(BuffValue.NewValue!=0)
{
UINT j = BuffValue.Position;
character->Stats->Attack_Power = BuffValue.NewValue;
if(j<15)
character->Status->Attack_up = j;
else
character->Status->Attack_down = j;
character->MagicStatus[j].Buff = thisskill->buff[i];
character->MagicStatus[j].BuffTime = clock();
character->MagicStatus[j].Duration = thisskill->duration;
character->MagicStatus[j].Value = BuffValue.Value;
character->MagicStatus[j].Status = thisskill->status[i];
bflag = true;
}
}
break;
case 20: // def up
case 21: // def down
case 49: // def up
{
//Log( MSG_INFO, "checkabuffs: Defense buff detected %i", thisskill->buff[i] );
CBValue BuffValue = GetBuffValue( thisskill, character, Evalue, i,
character->Status->Defense_up,
character->Status->Defense_down,
character->Stats->Defense, true );
if(BuffValue.NewValue!=0)
{
UINT j = BuffValue.Position;
character->Stats->Defense = BuffValue.NewValue;
if(j<15)
character->Status->Defense_up = j;
else
character->Status->Defense_down = j;
character->MagicStatus[j].Buff = thisskill->buff[i];
character->MagicStatus[j].BuffTime = clock();
character->MagicStatus[j].Duration = thisskill->duration;
character->MagicStatus[j].Value = BuffValue.Value;
character->MagicStatus[j].Status = thisskill->status[i];
bflag = true;
}
}
break;
case 24: //accuracy up
case 25: //accuracy down
case 51: //attack accuracy up.
{
CBValue BuffValue = GetBuffValue( thisskill, character, Evalue, i,
character->Status->Accury_up,
character->Status->Accury_down,
character->Stats->Accury, true );
if(BuffValue.NewValue!=0)
{
UINT j = BuffValue.Position;
character->Stats->Accury = BuffValue.NewValue;
if(j<15)
character->Status->Accury_up = j;
else
character->Status->Accury_down = j;
character->MagicStatus[j].Buff = thisskill->buff[i];
character->MagicStatus[j].BuffTime = clock();
character->MagicStatus[j].Duration = thisskill->duration;
character->MagicStatus[j].Value = BuffValue.Value;
character->MagicStatus[j].Status = thisskill->status[i];
bflag = true;
}
}
break;
case 22: // macic resistance up
case 23: // magic resistance down
case 50: // magic resistance up
{
CBValue BuffValue = GetBuffValue( thisskill, character, Evalue, i,
character->Status->Magic_Defense_up,
character->Status->Magic_Defense_down,
character->Stats->Magic_Defense, true );
if(BuffValue.NewValue!=0)
{
UINT j = BuffValue.Position;
character->Stats->Magic_Defense = BuffValue.NewValue;
if(j<15)
character->Status->Magic_Defense_up = j;
else
character->Status->Magic_Defense_down = j;
character->MagicStatus[j].Buff = thisskill->buff[i];
character->MagicStatus[j].BuffTime = clock();
character->MagicStatus[j].Duration = thisskill->duration;
character->MagicStatus[j].Value = BuffValue.Value;
character->MagicStatus[j].Status = thisskill->status[i];
bflag = true;
}
}
break;
case 28: //dodge up
case 29: //dodge down
case 53: //dodge rate up
{
CBValue BuffValue = GetBuffValue( thisskill, character, Evalue, i,
character->Status->Dodge_up,
character->Status->Dodge_down,
character->Stats->Dodge, true );
if(BuffValue.NewValue!=0)
{
UINT j = BuffValue.Position;
character->Stats->Dodge = BuffValue.NewValue;
if(j<15)
character->Status->Dodge_up = j;
else
character->Status->Dodge_down = j;
character->MagicStatus[j].Buff = thisskill->buff[i];
character->MagicStatus[j].BuffTime = clock();
character->MagicStatus[j].Duration = thisskill->duration;
character->MagicStatus[j].Value = BuffValue.Value;
character->MagicStatus[j].Status = thisskill->status[i];
bflag = true;
}
}
break;
case 14: //dash
case 15: //slow
case 46: //movement speed increased
{
//Log( MSG_INFO, "checkabuffs: move speed buff detected %i", thisskill->buff[i] );
CBValue BuffValue = GetBuffValue( thisskill, character, Evalue, i,
character->Status->Dash_up,
character->Status->Dash_down,
character->Stats->Move_Speed, true );
if(BuffValue.NewValue != 0)
{
UINT j = BuffValue.Position;
character->Stats->Move_Speed = BuffValue.NewValue;
if(j<15)
character->Status->Dash_up = j;
else
character->Status->Dash_down = j;
//Log( MSG_INFO, "Move speed buff position %i. new move speed %i. buff value %i", j,BuffValue.NewValue,BuffValue.Value );
character->MagicStatus[j].Buff = thisskill->buff[i];
character->MagicStatus[j].BuffTime = clock();
character->MagicStatus[j].Duration = thisskill->duration;
character->MagicStatus[j].Value = BuffValue.Value;
character->MagicStatus[j].Status = thisskill->status[i];
bflag = true;
}
}
break;
case 16: // haste attack
case 17: // slow attack
case 47: // attack speed up
{
CBValue BuffValue = GetBuffValue( thisskill, character, Evalue, i,
character->Status->Haste_up,
character->Status->Haste_down,
(UINT)character->Stats->Attack_Speed, true );
if(BuffValue.NewValue!=0)
{
UINT j = BuffValue.Position;
character->Stats->Attack_Speed = BuffValue.NewValue;
if(j<15)
character->Status->Haste_up = j;
else
character->Status->Haste_down = j;
character->MagicStatus[j].Buff = thisskill->buff[i];
character->MagicStatus[j].BuffTime = clock();
character->MagicStatus[j].Duration = thisskill->duration;
character->MagicStatus[j].Value = BuffValue.Value;
character->MagicStatus[j].Status = thisskill->status[i];
bflag = true;
}
}
break;
case 26: // crit up
case 27: // crit down
case 52: // crit up
{
CBValue BuffValue = GetBuffValue( thisskill, character, Evalue, i,
character->Status->Critical_up,
character->Status->Critical_down,
character->Stats->Critical, true );
if(BuffValue.NewValue != 0)
{
UINT j = BuffValue.Position;
character->Stats->Critical = BuffValue.NewValue;
if(j<15)
character->Status->Critical_up = j;
else
character->Status->Critical_down = j;
character->MagicStatus[j].Buff = thisskill->buff[i];
character->MagicStatus[j].BuffTime = clock();
character->MagicStatus[j].Duration = thisskill->duration;
character->MagicStatus[j].Value = BuffValue.Value;
character->MagicStatus[j].Status = thisskill->status[i];
bflag = true;
}
}
break;
case 12: // max HP up
case 44: // max HP up
{
CBValue BuffValue = GetBuffValue( thisskill, character, Evalue, i,
character->Status->HP_up,
character->Status->HP_down,
character->Stats->MaxHP, true );
if(BuffValue.NewValue!=0)
{
UINT j = BuffValue.Position;
character->Stats->MaxHP = BuffValue.NewValue;
if(j<15)
character->Status->HP_up = j;
else
character->Status->HP_down = j;
character->MagicStatus[j].Buff = thisskill->buff[i];
character->MagicStatus[j].BuffTime = clock();
character->MagicStatus[j].Duration = thisskill->duration;
character->MagicStatus[j].Value = BuffValue.Value;
character->MagicStatus[j].Status = thisskill->status[i];
bflag = true;
}
}
break;
case 13: // max MP up
case 45: // max MP up
{
CBValue BuffValue = GetBuffValue( thisskill, character, Evalue, i,
character->Status->MP_up,
character->Status->MP_down,
character->Stats->MaxMP, true );
if(BuffValue.NewValue!=0)
{
UINT j = BuffValue.Position;
character->Stats->MaxMP = BuffValue.NewValue;
if(j<15)
character->Status->MP_up = j;
else
character->Status->MP_down = j;
character->MagicStatus[j].Buff = thisskill->buff[i];
character->MagicStatus[j].BuffTime = clock();
character->MagicStatus[j].Duration = thisskill->duration;
character->MagicStatus[j].Value = BuffValue.Value;
character->MagicStatus[j].Status = thisskill->status[i];
bflag = true;
}
}
break;
default:
Log(MSG_WARNING,"Status %i unknown. Possibly not coded yet",thisskill->status[i]);
break;
}
}
return bflag;
}
// Get the new buffs values (character)
CBValue CWorldServer::GetBuffValue( CSkills* thisskill, CCharacter* character, UINT Evalue, UINT i, UINT up, UINT down, UINT CurrentValue, bool Buff, bool Status )
{
CBValue NewValue;
NewValue.Position = 0xff;
NewValue.NewValue = 0;
NewValue.Value = 0;
INT Value = 0;
UINT NormalValue = 0;
UINT UpValue = 0;
UINT DownValue = 0;
bool BuffFlag = false;
// not currently detecting debuffs properly so let's bring in some new code :)
//PY buff mod based on thiskill->status[i]
switch(thisskill->status[i])
{
case 12: case 13: case 14: case 16: case 18: case 20: case 22: case 24: case 26: case 28: case 35: case 36: case 53:
case 54:
Buff = true;
break;
case 7: case 8: case 9: case 10: case 15: case 17: case 19: case 21: case 23: case 25: case 27: case 29:
case 30: case 31: case 32: case 59: case 60:
Buff = false;
break;
default:
Buff = true;
break;
}
Log(MSG_INFO, "Current Buff boolean status %i Skill status = %i up: %i down: %i", Buff,thisskill->status[i],up,down);
//PY end
if(Buff) //skill is a buff
{
//find whether character already has buffs for this stat
for(UINT z=0;z<15;z++) // 0 to 14 are upward
{
if(character->MagicStatus[z].Status == thisskill->status[i])
{
NewValue.Position = z;
//Log(MSG_INFO, "Existing Buff position = %i",z);
NormalValue = CurrentValue - character->MagicStatus[z].Value;
UpValue = character->MagicStatus[z].Value;
BuffFlag = true;
break;
}
}
if(BuffFlag == false) // no active buffs so find a new slot
{
for(UINT z=0;z<15;z++) // 0 to 14 are upward
{
if(character->MagicStatus[z].Status == 0)
{
NewValue.Position = z;
//Log(MSG_INFO, "New Buff position = %i",z);
NormalValue = CurrentValue;
BuffFlag = true;
break;
}
}
}
}
else
{
//find whether character already has debuffs for this stat
for(UINT z=15;z<32;z++) // 15 to 32 are downward
{
if(character->MagicStatus[z].Status == thisskill->status[i])
{
NewValue.Position = z;
//Log(MSG_INFO, "Existing De-Buff position = %i",z);
NormalValue = CurrentValue + character->MagicStatus[z].Value;
DownValue = character->MagicStatus[z].Value;
BuffFlag = true;
break;
}
}
if(BuffFlag == false) // no active debuffs so find a new slot
{
for(UINT z=15;z<32;z++) // 15 to 32 are downward
{
if(character->MagicStatus[z].Status == 0)
{
NewValue.Position = z;
//Log(MSG_INFO, "New De-Buff position = %i",z);
NormalValue = CurrentValue;
BuffFlag = true;
break;
}
}
}
}
if(BuffFlag == false) // no available spaces found
return NewValue;
//if(up != 0xff) //currently have a buff. up is its location
//{
// UpValue = character->MagicStatus[up].Value;
//Log(MSG_INFO, "Current active buff detected in position %i with value %i", NewValue.Position,UpValue);
// NormalValue = CurrentValue - character->MagicStatus[up].Value;
// if(Buff)
// NewValue.Position = up;
//}
//else // don't currently have a buff
if(NewValue.Position == 0xff)
{
//Log(MSG_INFO, "No buff currently active");
if(Buff) //is this skill a buff?
{
for(UINT z=0;z<15;z++) // 0 to 14 are upward
{
if(character->MagicStatus[z].Status == 0)
{
NewValue.Position = z; //z is the new index in the magicstatus array where the buff will be placed
//Log(MSG_INFO, "Buff position = %i",z);
break;
}
}
if(NewValue.Position == 0xff) //no spaces found ??
return NewValue;
NormalValue = CurrentValue; // no buffs currently active so set normalvalue to currentvalue
}
else //debuff
{
for(UINT z=15;z<30;z++) // 15 to 29 are downward
{
if(character->MagicStatus[z].Status == 0)
{
NewValue.Position = z; //z is the new index in the magicstatus array where the buff will be placed
Log(MSG_INFO, "DeBuff position = %i",z);
break;
}
}
if(NewValue.Position == 0xff) //no spaces found ??
return NewValue;
NormalValue = CurrentValue; // no buffs currently active so set normalvalue to currentvalue
}
}
/*
if (!Status) // status boolean set false as default so it will run this code in pretty much all cases
{
Log(MSG_INFO, "Status set to false so checking for debuffs");
if( down != 0xff) //do we have a debuff in place already? down is its location
{
DownValue = character->MagicStatus[down].Value;
Log(MSG_INFO, "Current active de-buff detected in position %i with value %i", i,DownValue);
if( NormalValue!=0)
NormalValue += character->MagicStatus[down].Value;
else
NormalValue = CurrentValue + character->MagicStatus[down].Value;
if(!Buff)
NewValue.Position = down;
}
else
{
Log(MSG_INFO, "No de-buff currently active");
if(!Buff) //is this a debuff?
{
Log(MSG_INFO, "Buff is false so adding a new de-buff");
for(UINT z=15;z<30;z++) // 15 to 29 are downward
{
if(character->MagicStatus[z].Status == thisskill->status[i])
{
NewValue.Position = z; //z is the index in the magicstatus array where the de-buff will be placed
Log(MSG_INFO, "#1 found status De-Buff in position = %i. refreshing it.",z);
break;
}
if(character->MagicStatus[z].Status == 0)
{
NewValue.Position = z; //z is the new index in the magicstatus array where the de-buff will be placed
Log(MSG_INFO, "#1 De-Buff position = %i",z);
break;
}
}
if(NewValue.Position == 0xff)
return NewValue;
NormalValue = CurrentValue;
}
}
}
else if ( down != 0xff ) //Status = true and we currently have a debuff in effect??
{
Log(MSG_INFO, "Current active debuff detected in position %i with value %i", DownValue, character->MagicStatus[down].Value);
NormalValue = CurrentValue + character->MagicStatus[down].Value;
if(!Buff)
NewValue.Position = down;
}
else //status set true and no current debuff. Used for skills with only a Status effect but no buff/debuff value
{
for(UINT z=15;z<30;z++) //check magicstatus array debuff area for spaces
{
if(character->MagicStatus[z].Status == 0)
{
NewValue.Position = z; //z is the new index in the magicstatus array where the de-buff will be placed
Log(MSG_INFO, "#2 De-Buff position = %i",z);
break;
}
}
if(NewValue.Position == 0xff)
return NewValue;
NormalValue = CurrentValue;
}
*/
//Log(MSG_INFO, "Newvalue.position = %i",NewValue.Position);
if( thisskill->value2[i] > 0 )
{
Value = NormalValue * thisskill->value2[i] / 100;
//Log(MSG_INFO, "Percentage buff = %i",Value);
}
if( thisskill->value1[i] > 0 )
{
Value += thisskill->value1[i];
if(thisskill->buff[i] == A_DASH || thisskill->buff[i] == MOV_SPEED)
{
//Log(MSG_DEBUG,"Made it into the DASH calculations. Evalue = %i",Evalue);
if( Evalue <= 60 )
{
int temp1 = Evalue - 60;
//Log(MSG_DEBUG,"temp1 = %i",temp1);
float temp2 = (20.0 / 45.0);
//Log(MSG_DEBUG,"temp2 = %f",temp2);
int temp = (int)(temp1 * temp2);
//Log(MSG_DEBUG,"Result of calculation for INT < 60 = %i",temp);
//int temp = (int)((Evalue - 60) * (20.0 / 45.0));
//Log(MSG_DEBUG,"Result of calculation for INT < 60 = %i",temp);
Value += temp;
}
if( Evalue > 60 && Evalue <= 150)
{
int temp1 = Evalue - 60;
float temp2 = (17.0 / 45.0);
int temp = (int)(temp1 * temp2);
Value += temp;
}
if( Evalue > 150 && Evalue <= 195)
{
int temp1 = Evalue - 150;
float temp2 = (18.0 / 45.0);
int temp = (int)(temp1 * temp2);
Value += 34 + temp;
}
if( Evalue > 195 && Evalue <= 240)
{
int temp1 = Evalue - 195;
float temp2 = (19.0 / 45.0);
int temp = (int)(temp1 * temp2);
Value += 52 + temp;
}
if( Evalue > 240 && Evalue <= 285)
{
int temp1 = Evalue - 240;
float temp2 = (17.0 / 45.0);
int temp = (int)(temp1 * temp2);
Value += 71 + temp;
}
if( Evalue > 285 && Evalue <= 330)
{
int temp1 = Evalue - 285;
float temp2 = (18.0 / 45.0);
int temp = (int)(temp1 * temp2);
Value += 88 + temp;
}
if( Evalue > 330 && Evalue <= 375)
{
int temp1 = Evalue - 330;
float temp2 = (17.0 / 45.0);
int temp = (int)(temp1 * temp2);
Value += 106 + temp;
}
if( Evalue > 375 && Evalue <= 385)
{
int temp1 = Evalue - 420;
float temp2 = (19.0 / 45.0);
int temp = (int)(temp1 * temp2);
Value += 123 + temp;
}
}
// Value += (Evalue - 15) / 10;
else
Value += (Evalue-15)/32;
//Log(MSG_INFO, "Number buff = %i",Value);
}
if(Buff)
{
if( Value + CurrentValue - DownValue >= CurrentValue )
{
CurrentValue = NormalValue - DownValue + Value;
}
else
{
CurrentValue = 0;
}
}
else
{
CurrentValue = NormalValue + UpValue - Value;
}
NewValue.NewValue = CurrentValue;
NewValue.Value = Value;
return NewValue;
}
// Build Buffs to Show
unsigned int CWorldServer::BuildBuffs( CCharacter* character )
{
BYTE buff1 = 0;
BYTE buff2 = 0;
BYTE buff3 = 0;
BYTE buff4 = 0;
//Build Debuffs and Buffs
//Up
if(character->Status->Attack_up != 0xff)//A_ATTACK:
buff2 += ATTACK_UP;
if(character->Status->Defense_up != 0xff)//A_DEFENSE:
buff2 += DEFENSE_UP;
if(character->Status->Magic_Defense_up != 0xff)//A_MDEFENSE_UP
buff2 += MDEFENSE_UP;
if(character->Status->Accury_up != 0xff)//A_ACCUR:
buff3 += HITRATE_UP;
if(character->Status->Dash_up != 0xff)//A_DASH:
buff1 += DASH_UP;
if(character->Status->Haste_up != 0xff)//A_HASTE:
buff2 += HASTE_UP;
if(character->Status->HP_up != 0xff)//A_HP:
buff1 += HP_UP;
if(character->Status->MP_up != 0xff)//A_MP:
buff1 += MP_UP;
if(character->Status->Critical_up != 0xff)//A_CRITICAL:
buff3 += CRITICAL_UP;
if(character->Status->Dodge_up != 0xff)//A_DODGE:
buff1 += DODGE_UP;
if(character->Status->ExtraDamage_up != 0xff)//A_Extra_Damage:
buff4 += DAMAGE_UP;
//Down
if(character->Status->Attack_down != 0xff) // A_ATTACK:
buff2 += ATTACK_DOWN;
if(character->Status->Defense_down != 0xff)//A_DEFENSE:
buff2 += DEFENSE_DOWN;
if(character->Status->Magic_Defense_down != 0xff)
buff2 += MDEFENSE_DOWN;
if(character->Status->Accury_down != 0xff)//A_ACCUR:
buff3 += HITRATE_DOWN;
if(character->Status->Dash_down != 0xff)//A_DASH:
buff1 += DASH_DOWN;
if(character->Status->Haste_down != 0xff)//A_HASTE:
buff2 += HASTE_DOWN;
if(character->Status->HP_down != 0xff)//A_HP:
buff1 += 0;
if(character->Status->MP_down != 0xff)//A_MP:
buff1 += 0;
if(character->Status->Critical_down != 0xff)//A_CRITICAL:
buff3 += CRITICAL_DOWN;
if(character->IsSummon( ))
buff4 += SUMMON;
if(character->Status->Stuned != 0xff)//A_STUN
buff4+= STUN;
if(character->Status->Poisoned != 0xff)//A_POISON
buff1+= POISONED;
if(character->Status->Muted != 0xff)//A_MUTE
buff3+= MUTED;
return (buff1 * 0x01) + (buff2 * 0x100 ) + (buff3 * 0x10000) + (buff4 * 0x1000000);
}
// Build Buffs to Show
unsigned int CWorldServer::BuildUpBuffs( CCharacter* character )
{
BYTE buff1 = 0;
BYTE buff2 = 0;
BYTE buff3 = 0;
BYTE buff4 = 0;
// Buffs
//Up
if(character->Status->Attack_up != 0xff)//A_ATTACK:
buff2 += ATTACK_UP;
if(character->Status->Defense_up != 0xff)//A_DEFENSE:
buff2 += DEFENSE_UP;
if(character->Status->Magic_Defense_up != 0xff)//A_MDEFENSE_UP
buff2 += MDEFENSE_UP;
if(character->Status->Accury_up != 0xff)//A_ACCUR:
buff3 += HITRATE_UP;
if(character->Status->Dash_up != 0xff)//A_DASH:
buff1 += DASH_UP;
if(character->Status->Haste_up != 0xff)//A_HASTE:
buff2 += HASTE_UP;
if(character->Status->HP_up != 0xff)//A_HP:
buff1 += HP_UP;
if(character->Status->MP_up != 0xff)//A_MP:
buff1 += MP_UP;
if(character->Status->Critical_up != 0xff)//A_CRITICAL:
buff3 += CRITICAL_UP;
if(character->Status->Dodge_up != 0xff)//A_DODGE:
buff1 += DODGE_UP;
if(character->Status->ExtraDamage_up != 0xff)//A_Extra_Damage:
buff4 += DAMAGE_UP;
return (buff1 * 0x01) + (buff2 * 0x100 ) + (buff3 * 0x10000) + (buff4 * 0x1000000);
}
// Build Buffs to Show
unsigned int CWorldServer::BuildDeBuffs( CCharacter* character )
{
BYTE buff1 = 0;
BYTE buff2 = 0;
BYTE buff3 = 0;
BYTE buff4 = 0;
//Build Debuffs
//Down
if(character->Status->Attack_down != 0xff) // A_ATTACK:
buff2 += ATTACK_DOWN;
if(character->Status->Defense_down != 0xff)//A_DEFENSE:
buff2 += DEFENSE_DOWN;
if(character->Status->Magic_Defense_down != 0xff)
buff2 += MDEFENSE_DOWN;
if(character->Status->Accury_down != 0xff)//A_ACCUR:
buff3 += HITRATE_DOWN;
if(character->Status->Dash_down != 0xff)//A_DASH:
buff1 += DASH_DOWN;
if(character->Status->Haste_down != 0xff)//A_HASTE:
buff2 += HASTE_DOWN;
if(character->Status->HP_down != 0xff)//A_HP:
buff1 += 0;
if(character->Status->MP_down != 0xff)//A_MP:
buff1 += 0;
if(character->Status->Critical_down != 0xff)//A_CRITICAL:
buff3 += CRITICAL_DOWN;
if(character->IsSummon( ))
buff4 += SUMMON;
if(character->Status->Stuned != 0xff)//A_STUN
buff4+= STUN;
if(character->Status->Poisoned != 0xff)//A_POISON
buff1+= POISONED;
if(character->Status->Muted != 0xff)//A_MUTE
buff3+= MUTED;
return (buff1 * 0x01) + (buff2 * 0x100 ) + (buff3 * 0x10000) + (buff4 * 0x1000000);
}