From e42cee1bb51e304d6401b13e9562d984156cbae7 Mon Sep 17 00:00:00 2001 From: Anders Jenbo Date: Mon, 10 Sep 2018 03:33:41 +0200 Subject: [PATCH] Clean up AddPlrExperience --- Source/player.cpp | 136 ++++++++++++++++++---------------------------- 1 file changed, 53 insertions(+), 83 deletions(-) diff --git a/Source/player.cpp b/Source/player.cpp index 9ecbf1c8f..a8c495850 100644 --- a/Source/player.cpp +++ b/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;