Skip to content

Commit

Permalink
feat(elysiera): runic applies a multiplier to every damage rune (#28)
Browse files Browse the repository at this point in the history
  • Loading branch information
luan committed Jul 27, 2023
1 parent 131f8a5 commit 0833056
Show file tree
Hide file tree
Showing 23 changed files with 55 additions and 39 deletions.
3 changes: 3 additions & 0 deletions config.lua.dist
Original file line number Diff line number Diff line change
Expand Up @@ -441,3 +441,6 @@ vipBonusSkill = 0
vipAutoLootVipOnly = false
vipStayOnline = false
vipFamiliarTimeCooldownReduction = 0

-- Runic
runicMultiplier = 1/500
6 changes: 3 additions & 3 deletions data-otservbr-global/scripts/spells/runes/avalanche.lua
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,12 @@ combat:setArea(createCombatArea(AREA_CIRCLE3X3))

-- example of runic usage
function onGetFormulaValues(player, level, maglevel, runic)
local min = (level / 5) + (maglevel * 1.2) + 7 + runic / 5
local max = (level / 5) + (maglevel * 2.8) + 17 + runic / 5
local min = (level / 5) + (maglevel * 1.2) + 7
local max = (level / 5) + (maglevel * 2.8) + 17
return -min, -max
end

combat:setCallback(CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues")
combat:setCallback(CALLBACK_PARAM_RUNICVALUE, "onGetFormulaValues")

local rune = Spell("rune")

Expand Down
4 changes: 2 additions & 2 deletions data-otservbr-global/scripts/spells/runes/explosion.lua
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ function onGetFormulaValues(player, level, maglevel)
return -min, -max
end

combat:setCallback(CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues")
combat:setCallback(CALLBACK_PARAM_RUNICVALUE, "onGetFormulaValues")

local rune = Spell("rune")

Expand All @@ -32,4 +32,4 @@ rune:magicLevel(6)
rune:cooldown(2 * 1000)
rune:groupCooldown(2 * 1000)
rune:isBlocking(true) -- True = Solid / False = Creature
rune:register()
rune:register()
4 changes: 2 additions & 2 deletions data-otservbr-global/scripts/spells/runes/fireball.lua
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ function onGetFormulaValues(player, level, maglevel)
return -min, -max
end

combat:setCallback(CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues")
combat:setCallback(CALLBACK_PARAM_RUNICVALUE, "onGetFormulaValues")

local rune = Spell("rune")

Expand All @@ -31,4 +31,4 @@ rune:cooldown(2 * 1000)
rune:groupCooldown(2 * 1000)
rune:needTarget(true)
rune:isBlocking(true) -- True = Solid / False = Creature
rune:register()
rune:register()
4 changes: 2 additions & 2 deletions data-otservbr-global/scripts/spells/runes/great_fireball.lua
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ function onGetFormulaValues(player, level, maglevel)
local max = (level / 5) + (maglevel * 2.8) + 17
return -min, -max
end
combat:setCallback(CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues")
combat:setCallback(CALLBACK_PARAM_RUNICVALUE, "onGetFormulaValues")

local rune = Spell("rune")

Expand All @@ -30,4 +30,4 @@ rune:magicLevel(4)
rune:cooldown(2 * 1000)
rune:groupCooldown(2 * 1000)
rune:isBlocking(true) -- True = Solid / False = Creature
rune:register()
rune:register()
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ function onGetFormulaValues(player, level, maglevel)
return -min, -max
end

combat:setCallback(CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues")
combat:setCallback(CALLBACK_PARAM_RUNICVALUE, "onGetFormulaValues")

local rune = Spell("rune")

Expand All @@ -31,4 +31,4 @@ rune:cooldown(2 * 1000)
rune:groupCooldown(2 * 1000)
rune:needTarget(true)
rune:isBlocking(true) -- True = Solid / False = Creature
rune:register()
rune:register()
4 changes: 2 additions & 2 deletions data-otservbr-global/scripts/spells/runes/holy_missile.lua
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ function onGetFormulaValues(player, level, maglevel)
return -min, -max
end

combat:setCallback(CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues")
combat:setCallback(CALLBACK_PARAM_RUNICVALUE, "onGetFormulaValues")

local rune = Spell("rune")

Expand All @@ -33,4 +33,4 @@ rune:groupCooldown(2 * 1000)
rune:needTarget(true)
rune:isBlocking(true) -- True = Solid / False = Creature
rune:vocation("paladin;true", "royal paladin;true")
rune:register()
rune:register()
4 changes: 2 additions & 2 deletions data-otservbr-global/scripts/spells/runes/icicle.lua
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ function onGetFormulaValues(player, level, maglevel)
return -min, -max
end

combat:setCallback(CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues")
combat:setCallback(CALLBACK_PARAM_RUNICVALUE, "onGetFormulaValues")

local rune = Spell("rune")

Expand All @@ -30,4 +30,4 @@ rune:magicLevel(4)
rune:cooldown(2 * 1000)
rune:groupCooldown(2 * 1000)
rune:needTarget(true) -- True = Solid / False = Creature
rune:register()
rune:register()
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ function onGetFormulaValues(player, level, maglevel)
return min, max
end

combat:setCallback(CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues")
combat:setCallback(CALLBACK_PARAM_RUNICVALUE, "onGetFormulaValues")

local rune = Spell("rune")

Expand Down Expand Up @@ -40,4 +40,4 @@ rune:groupCooldown(1 * 1000)
rune:isAggressive(false)
rune:needTarget(true)
rune:isBlocking(true) -- True = Solid / False = Creature
rune:register()
rune:register()
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ function onGetFormulaValues(player, level, maglevel)
return -min, -max
end

combat:setCallback(CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues")
combat:setCallback(CALLBACK_PARAM_RUNICVALUE, "onGetFormulaValues")

local rune = Spell("rune")

Expand All @@ -31,4 +31,4 @@ rune:cooldown(2 * 1000)
rune:groupCooldown(2 * 1000)
rune:needTarget(true)
rune:isBlocking(true) -- True = Solid / False = Creature
rune:register()
rune:register()
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ function onGetFormulaValues(player, level, maglevel)
return -min, -max
end

combat:setCallback(CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues")
combat:setCallback(CALLBACK_PARAM_RUNICVALUE, "onGetFormulaValues")

local rune = Spell("rune")

Expand All @@ -32,4 +32,4 @@ rune:level(1)
rune:magicLevel(0)
rune:cooldown(2 * 1000)
rune:groupCooldown(2 * 1000)
rune:register()
rune:register()
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ function onGetFormulaValues(player, level, maglevel)
return -3, -5
end

combat:setCallback(CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues")
combat:setCallback(CALLBACK_PARAM_RUNICVALUE, "onGetFormulaValues")

local rune = Spell("rune")

Expand All @@ -30,4 +30,4 @@ rune:groupCooldown(2 * 1000)
rune:needTarget(true)
rune:isBlocking(true) -- True = Solid / False = Creature
rune:vocation("sorcerer;true", "master sorcerer;true", "druid;true", "elder druid;true", "paladin;true", "royal paladin;true", "knight;true", "elite knight;true")
rune:register()
rune:register()
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ function onGetFormulaValues(player, level, maglevel)
return -min, -max
end

combat:setCallback(CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues")
combat:setCallback(CALLBACK_PARAM_RUNICVALUE, "onGetFormulaValues")

local rune = Spell("rune")

Expand All @@ -32,4 +32,4 @@ rune:groupCooldown(2 * 1000)
rune:needTarget(true)
rune:isBlocking(true) -- True = Solid / False = Creature
rune:vocation("sorcerer;true", "master sorcerer;true", "druid;true", "elder druid;true", "paladin;true", "royal paladin;true")
rune:register()
rune:register()
4 changes: 2 additions & 2 deletions data-otservbr-global/scripts/spells/runes/stalagmite.lua
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ function onGetFormulaValues(player, level, maglevel)
return -min, -max
end

combat:setCallback(CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues")
combat:setCallback(CALLBACK_PARAM_RUNICVALUE, "onGetFormulaValues")

local rune = Spell("rune")

Expand All @@ -30,4 +30,4 @@ rune:magicLevel(3)
rune:cooldown(2 * 1000)
rune:groupCooldown(2 * 1000)
rune:needTarget(true) -- True = Solid / False = Creature
rune:register()
rune:register()
4 changes: 2 additions & 2 deletions data-otservbr-global/scripts/spells/runes/stone_shower.lua
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ function onGetFormulaValues(player, level, magicLevel)
return -min, -max
end

combat:setCallback(CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues")
combat:setCallback(CALLBACK_PARAM_RUNICVALUE, "onGetFormulaValues")

local rune = Spell("rune")

Expand All @@ -30,4 +30,4 @@ rune:level(28)
rune:magicLevel(4)
rune:cooldown(2 * 1000)
rune:groupCooldown(2 * 1000)
rune:register()
rune:register()
2 changes: 1 addition & 1 deletion data-otservbr-global/scripts/spells/runes/sudden_death.lua
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ function onGetFormulaValues(player, level, maglevel)
local max = (level / 5) + (maglevel * 7.395) + 46
return -min, -max
end
combat:setCallback(CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues")
combat:setCallback(CALLBACK_PARAM_RUNICVALUE, "onGetFormulaValues")

local rune = Spell("rune")

Expand Down
4 changes: 2 additions & 2 deletions data-otservbr-global/scripts/spells/runes/thunderstorm.lua
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ function onGetFormulaValues(player, level, magicLevel)
return -min, -max
end

combat:setCallback(CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues")
combat:setCallback(CALLBACK_PARAM_RUNICVALUE, "onGetFormulaValues")

local rune = Spell("rune")

Expand All @@ -30,4 +30,4 @@ rune:level(28)
rune:magicLevel(4)
rune:cooldown(2 * 1000)
rune:groupCooldown(2 * 1000)
rune:register()
rune:register()
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ function onGetFormulaValues(player, level, maglevel)
return min, max
end

combat:setCallback(CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues")
combat:setCallback(CALLBACK_PARAM_RUNICVALUE, "onGetFormulaValues")

local rune = Spell("rune")

Expand Down Expand Up @@ -40,4 +40,4 @@ rune:groupCooldown(1 * 1000)
rune:isAggressive(false)
rune:needTarget(true)
rune:isBlocking(true) -- True = Solid / False = Creature
rune:register()
rune:register()
2 changes: 2 additions & 0 deletions src/config/config_definitions.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -279,6 +279,8 @@ enum floatingConfig_t {
RATE_NPC_DEFENSE,
LOYALTY_BONUS_PERCENTAGE_MULTIPLIER,

RUNIC_MULTIPLIER,

LAST_FLOATING_CONFIG
};

Expand Down
15 changes: 11 additions & 4 deletions src/creatures/combat/combat.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,9 @@ CombatDamage Combat::getCombatDamage(Creature* creature, Creature* target) const
} else if (Player* player = creature->getPlayer()) {
if (params.valueCallback) {
params.valueCallback->getMinMaxValues(player, damage, params.useCharges);
} else if (formulaType == COMBAT_FORMULA_RUNIC) {
int32_t levelFormula = player->getLevel() * 2 + player->getMagicLevel() * 3;
damage.primary.value = (1 + player->getSkillLevel(SKILL_RUNIC) * g_configManager().getFloat(RUNIC_MULTIPLIER)) * normal_random(static_cast<int32_t>(levelFormula * mina + minb), static_cast<int32_t>(levelFormula * maxa + maxb));
} else if (formulaType == COMBAT_FORMULA_LEVELMAGIC) {
int32_t levelFormula = getLevelFormula(player, wheelSpell, damage);
damage.primary.value = normal_random(
Expand Down Expand Up @@ -478,6 +481,11 @@ bool Combat::setParam(CombatParam_t param, uint32_t value) {

bool Combat::setCallback(CallBackParam_t key) {
switch (key) {
case CALLBACK_PARAM_RUNICVALUE: {
params.valueCallback.reset(new ValueCallback(COMBAT_FORMULA_RUNIC));
return true;
}

case CALLBACK_PARAM_LEVELMAGICVALUE: {
params.valueCallback.reset(new ValueCallback(COMBAT_FORMULA_LEVELMAGIC));
return true;
Expand Down Expand Up @@ -513,6 +521,7 @@ bool Combat::setCallback(CallBackParam_t key) {

CallBack* Combat::getCallback(CallBackParam_t key) {
switch (key) {
case CALLBACK_PARAM_RUNICVALUE:
case CALLBACK_PARAM_LEVELMAGICVALUE:
case CALLBACK_PARAM_SKILLVALUE: {
return params.valueCallback.get();
Expand Down Expand Up @@ -1470,6 +1479,7 @@ void ValueCallback::getMinMaxValues(Player* player, CombatDamage &damage, bool u
bool shouldCalculateSecondaryDamage = false;

switch (type) {
case COMBAT_FORMULA_RUNIC:
case COMBAT_FORMULA_LEVELMAGIC: {
// onGetPlayerMinMaxValues(player, level, maglevel, runic)
lua_pushnumber(L, player->getLevel());
Expand Down Expand Up @@ -1533,10 +1543,7 @@ void ValueCallback::getMinMaxValues(Player* player, CombatDamage &damage, bool u
if (lua_pcall(L, parameters, 2, 0) != 0) {
LuaScriptInterface::reportError(nullptr, LuaScriptInterface::popString(L));
} else {
int32_t defaultDmg = normal_random(
LuaScriptInterface::getNumber<int32_t>(L, -2),
LuaScriptInterface::getNumber<int32_t>(L, -1)
);
int32_t defaultDmg = (1 + player->getSkillLevel(SKILL_RUNIC) * g_configManager().getFloat(RUNIC_MULTIPLIER)) * normal_random(LuaScriptInterface::getNumber<int32_t>(L, -2), LuaScriptInterface::getNumber<int32_t>(L, -1));

if (shouldCalculateSecondaryDamage) {
double factor = (double)elementAttack / (double)attackValue; // attack value here is phys dmg + element dmg
Expand Down
2 changes: 2 additions & 0 deletions src/creatures/creatures_definitions.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -223,6 +223,7 @@ enum formulaType_t {
COMBAT_FORMULA_LEVELMAGIC,
COMBAT_FORMULA_SKILL,
COMBAT_FORMULA_DAMAGE,
COMBAT_FORMULA_RUNIC,
};

enum CombatParam_t {
Expand Down Expand Up @@ -256,6 +257,7 @@ enum CallBackParam_t {
CALLBACK_PARAM_TARGETCREATURE,
CALLBACK_PARAM_CHAINVALUE,
CALLBACK_PARAM_CHAINPICKER,
CALLBACK_PARAM_RUNICVALUE,
};

enum charm_t {
Expand Down
2 changes: 1 addition & 1 deletion src/creatures/players/player.h
Original file line number Diff line number Diff line change
Expand Up @@ -2778,7 +2778,7 @@ class Player final : public Creature, public Cylinder {
uint32_t getAttackSpeed() const {
if (onFistAttackSpeed) {
uint32_t baseAttackSpeed = vocation->getAttackSpeed();
uint32_t skillLevel = getSkillLevel(SKILL_DEXTERITY);
uint32_t skillLevel = getSkillLevel(SKILL_COOKING);
uint32_t attackSpeed = baseAttackSpeed - (skillLevel * g_configManager().getNumber(MULTIPLIER_ATTACKONFIST));

if (attackSpeed < MAX_ATTACK_SPEED) {
Expand Down
2 changes: 2 additions & 0 deletions src/lua/functions/core/game/lua_enums.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -245,6 +245,7 @@ void LuaEnums::initCallbackParamEnums(lua_State* L) {
registerEnum(L, CALLBACK_PARAM_SKILLVALUE);
registerEnum(L, CALLBACK_PARAM_TARGETTILE);
registerEnum(L, CALLBACK_PARAM_TARGETCREATURE);
registerEnum(L, CALLBACK_PARAM_RUNICVALUE);
registerEnum(L, CALLBACK_PARAM_CHAINVALUE);
registerEnum(L, CALLBACK_PARAM_CHAINPICKER);
}
Expand Down Expand Up @@ -277,6 +278,7 @@ void LuaEnums::initCombatFormulaEnums(lua_State* L) {
registerEnum(L, COMBAT_FORMULA_LEVELMAGIC);
registerEnum(L, COMBAT_FORMULA_SKILL);
registerEnum(L, COMBAT_FORMULA_DAMAGE);
registerEnum(L, COMBAT_FORMULA_RUNIC);
}

void LuaEnums::initDirectionEnums(lua_State* L) {
Expand Down

0 comments on commit 0833056

Please sign in to comment.