void CHARACTER::DeathPenalty(BYTE bTown)
{
sys_log(1, "DEATH_PENALTY_CHECK(%s) town(%d)", GetName(), bTown);
Cube_close(this);
#ifdef ENABLE_ACCE_COSTUME_SYSTEM
CloseAcce();
#endif
if (GetLevel() < 10)
{
sys_log(0, "NO_DEATH_PENALTY_LESS_LV10(%s)", GetName());
ChatPacket(CHAT_TYPE_INFO, "[LS;901]");
return;
}
if (number(0, 2))
{
sys_log(0, "NO_DEATH_PENALTY_LUCK(%s)", GetName());
ChatPacket(CHAT_TYPE_INFO, "[LS;901]");
return;
}
if (!IS_SET(m_pointsInstant.instant_flag, INSTANT_FLAG_DEATH_PENALTY))
return;
REMOVE_BIT(m_pointsInstant.instant_flag, INSTANT_FLAG_DEATH_PENALTY);
// NO_DEATH_PENALTY_BUG_FIX
if (!bTown)
{
if (FindAffect(AFFECT_NO_DEATH_PENALTY))
{
sys_log(0, "NO_DEATH_PENALTY_AFFECT(%s)", GetName());
ChatPacket(CHAT_TYPE_INFO, "[LS;901]");
RemoveAffect(AFFECT_NO_DEATH_PENALTY);
return;
}
}
// END_OF_NO_DEATH_PENALTY_BUG_FIX
int iLoss = 0;
if (!bTown)
{
const long long llNextExp = static_cast<long long>(GetNextExp());
const int iLossPerc = __GetExpLossPerc(GetLevel());
long long llLoss = (llNextExp * iLossPerc) / 100;
if (llLoss > 800000)
llLoss = 800000;
if (llLoss < 0)
llLoss = 0;
iLoss = static_cast<int>(llLoss);
if (IsEquipUniqueItem(UNIQUE_ITEM_TEARDROP_OF_GODNESS))
iLoss /= 2;
const int iCurExp = std::max(0, GetPoint(POINT_EXP));
if (iLoss > iCurExp)
iLoss = iCurExp;
if (iLoss < 0)
iLoss = 0;
}
sys_log(0, "DEATH_PENALTY(%s) EXP_LOSS: %d percent %d%% CUR_EXP: %d",
GetName(),
iLoss,
__GetExpLossPerc(GetLevel()),
GetPoint(POINT_EXP));
if (iLoss > 0)
PointChange(POINT_EXP, -iLoss, true);
}