Browse Source

Clean up AddPlrExperience

pull/4/head
Anders Jenbo 8 years ago committed by Dennis Duda
parent
commit
e42cee1bb5
  1. 136
      Source/player.cpp

136
Source/player.cpp

@ -734,93 +734,63 @@ void __fastcall NextPlrLevel(int pnum)
void __fastcall AddPlrExperience(int pnum, int lvl, int exp)
{
int v3; // eax
int v4; // esi
int v5; // esi
char v6; // bl
int v7; // edi
signed int v8; // ecx
int v9; // ecx
int *v10; // eax
int v11; // eax
int v12; // ecx
int v13; // ecx
int v14; // esi
int arglist; // [esp+4h] [ebp-Ch]
int v16; // [esp+8h] [ebp-8h]
if ( pnum != myplr ) {
return;
}
v3 = myplr;
v4 = pnum;
v16 = lvl;
arglist = pnum;
if ( pnum == myplr )
{
if ( (unsigned int)myplr >= MAX_PLRS )
{
TermMsg("AddPlrExperience: illegal player %d", myplr);
v3 = myplr;
if ( (DWORD)myplr >= MAX_PLRS ) {
TermMsg("AddPlrExperience: illegal player %d", myplr);
}
if ( plr[myplr]._pHitPoints <= 0 ) {
return;
}
// Adjust xp based on difference in level between player and monster
exp *= 1 + ((double)lvl - plr[pnum]._pLevel) / 10;
if ( exp < 0 ) {
exp = 0;
}
// Prevent power leveling
if ( gbMaxPlayers > 1 ) {
int powerLvlCap = plr[pnum]._pLevel < 0 ? 0 : plr[pnum]._pLevel;
if ( powerLvlCap >= 50 ) {
powerLvlCap = 50;
}
if ( plr[v3]._pHitPoints > 0 )
{
v5 = v4;
v6 = plr[v5]._pLevel;
v7 = (signed __int64)((((double)v16 - (double)v6) * 0.1 + 1.0) * (double)exp);
if ( v7 < 0 )
v7 = 0;
if ( (unsigned char)gbMaxPlayers > 1u )
{
if ( v6 >= 0 )
{
v8 = v6;
if ( v6 >= 50 )
v8 = 50;
}
else
{
v8 = 0;
}
if ( v7 >= ExpLvlsTbl[v8] / 20 )
v7 = ExpLvlsTbl[v8] / 20;
v9 = 200 * v8;
if ( v7 >= v9 )
v7 = v9;
}
v10 = &plr[v5]._pExperience;
*v10 += v7;
if ( plr[v5]._pExperience > MAXEXP )
*v10 = MAXEXP;
v11 = *v10;
if ( v11 < ExpLvlsTbl[49] )
{
v12 = 0;
if ( v11 >= ExpLvlsTbl[0] )
{
do
++v12;
while ( v11 >= ExpLvlsTbl[v12] );
}
if ( v12 != v6 )
{
v13 = v12 - v6;
if ( v13 > 0 )
{
v14 = v13;
do
{
NextPlrLevel(arglist);
--v14;
}
while ( v14 );
}
}
NetSendCmdParam1(0, CMD_PLRLEVEL, plr[myplr]._pLevel);
}
else
{
plr[v5]._pLevel = 50;
}
// cap to 1/20 of current levels xp
if ( exp >= ExpLvlsTbl[powerLvlCap] / 20 ) {
exp = ExpLvlsTbl[powerLvlCap] / 20;
}
// cap to 200 * current level
int expCap = 200 * powerLvlCap;
if ( exp >= expCap ) {
exp = expCap;
}
}
plr[pnum]._pExperience += exp;
if ( (DWORD)plr[pnum]._pExperience > MAXEXP ) {
plr[pnum]._pExperience = MAXEXP;
}
if ( plr[pnum]._pExperience >= ExpLvlsTbl[49] ) {
plr[pnum]._pLevel = 50;
return;
}
// Increase player level if applicable
int newLvl = 0;
while ( plr[pnum]._pExperience >= ExpLvlsTbl[newLvl] ) {
newLvl++;
}
if ( newLvl != plr[pnum]._pLevel ) {
for ( int i = newLvl - plr[pnum]._pLevel; i > 0; i--) {
NextPlrLevel(pnum);
}
}
NetSendCmdParam1(FALSE, CMD_PLRLEVEL, plr[myplr]._pLevel);
}
// 679660: using guessed type char gbMaxPlayers;

Loading…
Cancel
Save