WIP Exp math

temp changes to distribution debugger
This commit is contained in:
Ashnal 2024-08-19 00:10:45 -04:00
parent 57fb5b758c
commit 9cfa67dae6
7 changed files with 76 additions and 50 deletions

View file

@ -497,7 +497,7 @@ struct itemroulette_t
UINT8 useOdds;
UINT8 playing, exiting;
UINT32 dist, baseDist;
UINT32 preexpdist, preexpuseOdds, dist, baseDist;
UINT32 firstDist, secondDist;
UINT32 secondToFirst;

View file

@ -5698,46 +5698,53 @@ static void K_drawDistributionDebugger(void)
K_FillItemRouletteData(stplyr, &rouletteData, false);
for (i = 0; i < rouletteData.itemListLen; i++)
{
const kartitems_t item = static_cast<kartitems_t>(rouletteData.itemList[i]);
UINT8 amount = 1;
// for (i = 0; i < rouletteData.itemListLen; i++)
// {
// const kartitems_t item = static_cast<kartitems_t>(rouletteData.itemList[i]);
// UINT8 amount = 1;
if (y > (BASEVIDHEIGHT << FRACBITS) - space - pad)
{
x += space;
y = -pad;
}
// if (y > (BASEVIDHEIGHT << FRACBITS) - space - pad)
// {
// x += space;
// y = -pad;
// }
V_DrawFixedPatch(x, y, scale, V_SNAPTOTOP,
K_GetSmallStaticCachedItemPatch(item), NULL);
// V_DrawFixedPatch(x, y, scale, V_SNAPTOTOP,
// K_GetSmallStaticCachedItemPatch(item), NULL);
// Display amount for multi-items
amount = K_ItemResultToAmount(item);
if (amount > 1)
{
V_DrawStringScaled(
x + (18 * scale),
y + (23 * scale),
scale, FRACUNIT, FRACUNIT,
V_SNAPTOTOP,
NULL, HU_FONT,
va("x%d", amount)
);
}
// // Display amount for multi-items
// amount = K_ItemResultToAmount(item);
// if (amount > 1)
// {
// V_DrawStringScaled(
// x + (18 * scale),
// y + (23 * scale),
// scale, FRACUNIT, FRACUNIT,
// V_SNAPTOTOP,
// NULL, HU_FONT,
// va("x%d", amount)
// );
// }
y += space;
}
// y += space;
// }
V_DrawString((x >> FRACBITS) + 20, 2, V_SNAPTOTOP, va("useOdds[%u]", rouletteData.useOdds));
V_DrawString((x >> FRACBITS) + 20, 10, V_SNAPTOTOP, va("speed = %u", rouletteData.speed));
// V_DrawString((x >> FRACBITS) + 20, 2, V_SNAPTOTOP, va("useOdds[%u]", rouletteData.useOdds));
// V_DrawString((x >> FRACBITS) + 20, 10, V_SNAPTOTOP, va("speed = %u", rouletteData.speed));
// V_DrawString((x >> FRACBITS) + 20, 22, V_SNAPTOTOP, va("baseDist = %u", rouletteData.baseDist));
// V_DrawString((x >> FRACBITS) + 20, 30, V_SNAPTOTOP, va("dist = %u", rouletteData.dist));
// V_DrawString((x >> FRACBITS) + 20, 42, V_SNAPTOTOP, va("firstDist = %u", rouletteData.firstDist));
// V_DrawString((x >> FRACBITS) + 20, 50, V_SNAPTOTOP, va("secondDist = %u", rouletteData.secondDist));
// V_DrawString((x >> FRACBITS) + 20, 58, V_SNAPTOTOP, va("secondToFirst = %u", rouletteData.secondToFirst));
V_DrawString((x >> FRACBITS) + 20, 10, V_SNAPTOTOP, va("pre-exp dist %u", rouletteData.preexpdist));
V_DrawString((x >> FRACBITS) + 20, 18, V_SNAPTOTOP, va("pre-exp useOdds %u", rouletteData.preexpuseOdds));
V_DrawString((x >> FRACBITS) + 20, 26, V_SNAPTOTOP, va(" dist %u", rouletteData.dist));
V_DrawString((x >> FRACBITS) + 20, 34, V_SNAPTOTOP, va(" useOdds %u", rouletteData.useOdds));
V_DrawString((x >> FRACBITS) + 20, 22, V_SNAPTOTOP, va("baseDist = %u", rouletteData.baseDist));
V_DrawString((x >> FRACBITS) + 20, 30, V_SNAPTOTOP, va("dist = %u", rouletteData.dist));
V_DrawString((x >> FRACBITS) + 20, 42, V_SNAPTOTOP, va("firstDist = %u", rouletteData.firstDist));
V_DrawString((x >> FRACBITS) + 20, 50, V_SNAPTOTOP, va("secondDist = %u", rouletteData.secondDist));
V_DrawString((x >> FRACBITS) + 20, 58, V_SNAPTOTOP, va("secondToFirst = %u", rouletteData.secondToFirst));
#ifndef ITEM_LIST_SIZE
Z_Free(rouletteData.itemList);
@ -6509,11 +6516,12 @@ void K_drawKartHUD(void)
K_drawInput();
}
if (cv_kartdebugdistribution.value)
// if (cv_kartdebugdistribution.value)
K_drawDistributionDebugger();
// temp debug
V_DrawSmallString(8, 2, V_SNAPTOTOP, va("Exp/Dist mult: %.2f", FixedToFloat(stplyr->exp)));
V_DrawString(8, 2, V_SNAPTOTOP, va("Exp/Dist mult: %.2f", FixedToFloat(stplyr->exp)));
// V_DrawSmallString(8, 4, V_SNAPTOTOP, va("Exp/Dist mult: %.2f", FixedToFloat(stplyr->exp)));
if (cv_kartdebugnodes.value)
{

View file

@ -12703,6 +12703,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground)
else
{
UINT32 behind = K_GetItemRouletteDistance(player, player->itemRoulette.playing);
behind = FixedMul(behind, K_GetExpAdjustment(player));
UINT32 behindMulti = behind / 500;
behindMulti = min(behindMulti, 60);
award = award * (behindMulti + 10) / 10;
@ -14768,4 +14769,24 @@ boolean K_PlayerCanUseItem(player_t *player)
return (player->mo->health > 0 && !player->spectator && !P_PlayerInPain(player) && !mapreset && leveltime > introtime);
}
fixed_t K_GetExpAdjustment(player_t *player)
{
fixed_t exp_power = 1*FRACUNIT/100; // adjust to change overall xp volatility
fixed_t exp_drainrate = 995*FRACUNIT/1000; // adjust to change overall item chaos
fixed_t result = 0;
for (INT32 i = 0; i < MAXPLAYERS; i++)
{
if (!playeringame[i] || player->spectator)
continue;
result -= exp_power;
if (player->position < players[i].position)
{
result += FixedMul(exp_power, exp_drainrate);
}
}
return result;
}
//}

View file

@ -288,6 +288,8 @@ boolean K_ThunderDome(void);
boolean K_PlayerCanUseItem(player_t *player);
fixed_t K_GetExpAdjustment(player_t *player);
#ifdef __cplusplus
} // extern "C"
#endif

View file

@ -445,7 +445,7 @@ static UINT32 K_ScaleItemDistance(const player_t* player, UINT32 distance, UINT8
);
// Distance is reduced based on the player's exp
distance = FixedMul(distance, min(FRACUNIT, player->exp));
// distance = FixedMul(distance, player->exp);
return distance;
}
@ -1487,7 +1487,10 @@ void K_FillItemRouletteData(const player_t *player, itemroulette_t *const roulet
// Special cases are all handled, we can now
// actually calculate actual item reels.
roulette->dist = K_GetItemRouletteDistance(player, roulette->playing);
roulette->preexpdist = K_GetItemRouletteDistance(player, roulette->playing);
roulette->dist = roulette->preexpdist;
roulette->preexpuseOdds = K_FindUseodds(player, roulette);
roulette->dist = FixedMul(roulette->preexpdist, player->exp);
roulette->useOdds = K_FindUseodds(player, roulette);
for (i = 1; i < NUMKARTRESULTS; i++)

View file

@ -669,18 +669,14 @@ void __attribute__((optimize("O0"))) Obj_CrossCheckpoints(player_t* player, fixe
if (player->position == 1)
{
player->lapPoints += 2;
player->exp += FRACUNIT/10;
}
else
{
player->lapPoints += 1;
player->exp += FRACUNIT/20;
}
}
else if (K_IsPlayerLosing(player))
{
player->exp -= FRACUNIT/20;
}
player->exp += K_GetExpAdjustment(player);
K_UpdatePowerLevels(player, player->laps, false);
}

View file

@ -2111,18 +2111,14 @@ static void K_HandleLapIncrement(player_t *player)
if (inDuel == false && player->position == 1) // 1st place in 1v1 uses thumbs up
{
player->lapPoints += 2;
player->exp += FRACUNIT/10;
}
else
{
player->lapPoints++;
player->exp += FRACUNIT/20;
}
}
else if (K_IsPlayerLosing(player))
{
player->exp -= FRACUNIT/20;
}
player->exp += K_GetExpAdjustment(player);
if (player->position == 1 && !(gametyperules & GTR_CHECKPOINTS))
{