Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
129 changes: 125 additions & 4 deletions src/entity.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2528,6 +2528,24 @@ void Entity::modHP(int amount)
{
Compendium_t::Events_t::eventUpdateCodex(skill[2], Compendium_t::CPDM_HP_LOST_RUN, "hp", oldHP - entitystats->HP);
Compendium_t::Events_t::eventUpdateCodex(skill[2], Compendium_t::CPDM_HP_LOST_TOTAL, "hp", oldHP - entitystats->HP);

if ( gameplayCustomManager.inUse() && gameplayCustomManager.doTraumaDamage ) // damage maxHP based on settings
{
double damage = oldHP - entitystats->HP;
double percent = ( (double)gameplayCustomManager.traumaDamagePercent / 100.0 );
double traumaDmg = percent * damage;
int oldMaxHP = entitystats->MAXHP;

if (traumaDmg < 1.0)
{
traumaDmg = 0.0; // don't allow player to take unfair trauma damage
}

entitystats->MAXHP -= traumaDmg;
entitystats->MAXHP = std::min(oldMaxHP, std::max( gameplayCustomManager.traumaDamageHPLimit, entitystats->MAXHP ) );
entitystats->HP = std::min(entitystats->HP, entitystats->MAXHP);
// prevent maxHP from dropping below minimum, don't increase maxHP by mistake, don't allow HP to exceed maxHP
}
}
}
}
Expand Down Expand Up @@ -3141,13 +3159,29 @@ void Entity::handleEffects(Stat* myStats)
static ConsoleVariable<int> cvar_lvlup_ally_sfx("/lvlup_ally_sfx", 520);

// increase MAXHP/MAXMP
myStats->MAXHP += HP_MOD;
if ( gameplayCustomManager.inUse() && behavior == &actPlayer )
{
myStats->MAXHP += gameplayCustomManager.playerLevelupHP;
}
else
{
myStats->MAXHP += HP_MOD;
}
modHP(getHPRestoreOnLevelUp());
myStats->HP = std::min(myStats->HP, myStats->MAXHP);
if ( !(behavior == &actMonster && monsterAllySummonRank != 0) )
{
myStats->MP += MP_MOD;
myStats->MAXMP += MP_MOD;
if ( gameplayCustomManager.inUse() && behavior == &actPlayer)
{
myStats->MP += gameplayCustomManager.playerLevelupMP;
myStats->MAXMP += gameplayCustomManager.playerLevelupMP;
}
else
{
myStats->MP += MP_MOD;
myStats->MAXMP += MP_MOD;
}

if ( behavior == &actPlayer && myStats->playerRace == RACE_INSECTOID && myStats->stat_appearance == 0 )
{
myStats->MAXMP = std::min(100, myStats->MAXMP);
Expand Down Expand Up @@ -5453,7 +5487,10 @@ real_t Entity::getACEffectiveness(Entity* my, Stat* myStats, bool isPlayer, Enti

if ( myStats->defending )
{
return 1.0;
if ( !gameplayCustomManager.inUse() || my->behavior != &actPlayer )
{
return 1.0;
}
}

int blessings = 0;
Expand Down Expand Up @@ -5496,6 +5533,26 @@ real_t Entity::getACEffectiveness(Entity* my, Stat* myStats, bool isPlayer, Enti
blessings += cursedItemIsBuff ? abs(myStats->amulet->beatitude) : myStats->amulet->beatitude;
}
outNumBlessings = blessings;

if ( gameplayCustomManager.inUse() && my->behavior == &actPlayer )
{
double playerACEffPassive = gameplayCustomManager.playerACEpassive / 100.0;
double playerACEffActive = gameplayCustomManager.playerACEactive / 100.0;
double ACEtoCalculate = 0.0;

if ( myStats->defending )
{
ACEtoCalculate = playerACEffActive;
}
else
{
ACEtoCalculate = playerACEffPassive;
}
ACEtoCalculate = std::max(0.0, std::min(1.0, ACEtoCalculate));

double blessingModifier = gameplayCustomManager.playerACEbless / 100.0;
return std::max(0.0, std::min(1.0, ACEtoCalculate + blessingModifier * blessings));
}
return std::max(0.0, std::min(1.0, .75 + 0.025 * blessings));
}

Expand Down Expand Up @@ -5836,6 +5893,10 @@ Sint32 statGetSTR(Stat* entitystats, Entity* my)
break;
}
}
if ( gameplayCustomManager.inUse() && my && my->behavior == &actPlayer )
{
STR *= gameplayCustomManager.playerMultiplierSTR;
}
return STR;
}

Expand Down Expand Up @@ -6084,6 +6145,10 @@ Sint32 statGetDEX(Stat* entitystats, Entity* my)
{
DEX += 8;
}
if ( gameplayCustomManager.inUse() && my && my->behavior == &actPlayer )
{
DEX *= gameplayCustomManager.playerMultiplierDEX;
}
return DEX;
}

Expand Down Expand Up @@ -6191,6 +6256,10 @@ Sint32 statGetCON(Stat* entitystats, Entity* my)
percentHP = 100 - percentHP;
CON += percentHP / 10;
}
if ( gameplayCustomManager.inUse() && my && my->behavior == &actPlayer )
{
CON *= gameplayCustomManager.playerMultiplierCON;
}
return CON;
}

Expand Down Expand Up @@ -6298,6 +6367,10 @@ Sint32 statGetINT(Stat* entitystats, Entity* my)
{
INT -= std::max(8, static_cast<int>(INT * 0.25));
}
if ( gameplayCustomManager.inUse() && my && my->behavior == &actPlayer )
{
INT *= gameplayCustomManager.playerMultiplierINT;
}
return INT;
}

Expand Down Expand Up @@ -6464,6 +6537,10 @@ Sint32 statGetPER(Stat* entitystats, Entity* my)
{
PER -= std::max(5, PER / 2);
}
if ( gameplayCustomManager.inUse() && my && my->behavior == &actPlayer )
{
PER *= gameplayCustomManager.playerMultiplierPER;
}
return PER;
}

Expand Down Expand Up @@ -6555,6 +6632,10 @@ Sint32 statGetCHR(Stat* entitystats, Entity* my)
{
CHR += std::max(4, static_cast<int>(CHR * .25));
}
if ( gameplayCustomManager.inUse() && my && my->behavior == &actPlayer )
{
CHR *= gameplayCustomManager.playerMultiplierCHR;
}
return CHR;
}

Expand Down Expand Up @@ -12964,6 +13045,14 @@ void Entity::awardXP(Entity* src, bool share, bool root)
if ( gameplayCustomManager.inUse() )
{
xpGain = (gameplayCustomManager.globalXPPercent / 100.f) * xpGain;

if ( gameplayCustomManager.doConditionalXPModifier )
{
if ( destStats->LVL - srcStats->LVL >= gameplayCustomManager.conditionalXPModLvlThreshold ) // check if level difference exceeds level threshold
{
xpGain = (gameplayCustomManager.conditionalXPModPercent / 100.f) * xpGain;
}
}
}
else if ( gameModeManager.currentSession.challengeRun.isActive()
&& gameModeManager.currentSession.challengeRun.globalXPPercent != 100 )
Expand Down Expand Up @@ -22822,6 +22911,7 @@ int getEntityHungerInterval(int player, Entity* my, Stat* myStats, EntityHungerI
{
bool isInsectoidPlayer = false;
bool isAutomatonPlayer = false;
bool isSkeletonPlayer = false;
if ( player >= 0 )
{
if ( stats[player]->type == AUTOMATON )
Expand All @@ -22832,6 +22922,10 @@ int getEntityHungerInterval(int player, Entity* my, Stat* myStats, EntityHungerI
{
isInsectoidPlayer = true;
}
else if ( stats[player]->type == SKELETON )
{
isSkeletonPlayer = true;
}
}
else if ( my && my->behavior == &actPlayer && myStats )
{
Expand All @@ -22843,6 +22937,10 @@ int getEntityHungerInterval(int player, Entity* my, Stat* myStats, EntityHungerI
{
isInsectoidPlayer = true;
}
else if ( myStats->type == SKELETON )
{
isSkeletonPlayer = true;
}
}
else if ( myStats )
{
Expand All @@ -22858,6 +22956,10 @@ int getEntityHungerInterval(int player, Entity* my, Stat* myStats, EntityHungerI
{
isInsectoidPlayer = true;
}
else if ( myStats->type == SKELETON )
{
isSkeletonPlayer = true;
}
break;
}
}
Expand All @@ -22883,6 +22985,20 @@ int getEntityHungerInterval(int player, Entity* my, Stat* myStats, EntityHungerI
return 1000;
}
}
else if ( isSkeletonPlayer )
{
switch ( hungerInterval )
{
case HUNGER_INTERVAL_OVERSATIATED:
return 5000; // unreachable
case HUNGER_INTERVAL_HUNGRY:
return -1; //unreachable
case HUNGER_INTERVAL_WEAK:
return -1; //unreachable
case HUNGER_INTERVAL_STARVING:
return -1; //unreachable
}
}

switch ( hungerInterval )
{
Expand Down Expand Up @@ -23113,6 +23229,11 @@ int Entity::getHPRestoreOnLevelUp()
{
int hpMod = HP_MOD;

if ( gameplayCustomManager.inUse() && behavior == &actPlayer )
{
hpMod = gameplayCustomManager.playerLevelupHP;
}

if ( Stat* myStats = getStats() )
{
if ( myStats->helmet && myStats->helmet->type == HAT_CROWN )
Expand Down
Loading