Devlog №4 . Браузерный проект на React + Tailwind. Механика блокирования
export const calcBlockCostSM = (
incomingDamage,
defenderMainHandItem,
defenderOffHandItem,
) => {
const safeIncomingDamage = Math.max(0, incomingDamage || 0); // Убеждаемся, что урон не отрицательный.
const weaponMass =
(defenderMainHandItem?.mass || 0) + (defenderOffHandItem?.mass || 0);
const isShieldEquipped = defenderOffHandItem?.itemType === "shield";
const baseCost = safeIncomingDamage * 0.45;
const massMitigation = weaponMass * 0.25;
const shieldMitigation = isShieldEquipped ? 2.5 : 0;
const minCost = isShieldEquipped ? 1 : 2;
return Math.max(
minCost,
Math.round(baseCost - massMitigation - shieldMitigation),
);
};
Формула блокирования
if (pIsBlocking) {
if (eIsAttacking) {
const enemyShieldMass =
Number(selectedEnemy.equippedItems?.OFF_HAND?.mass) || 0;
const incomingToPlayer =
eSkill?.id === "shield_bash"
? (eSkill?.multiplier || 1) * enemyShieldMass
: (Number(selectedEnemy.combat_mods?.DAMAGE) || 5) *
(eSkill?.multiplier || 1);
pCostSM = calcBlockCostSM(
incomingToPlayer,
equippedItems.MAIN_HAND,
equippedItems.OFF_HAND,
);
} else {
pCostSM = 0;
}
}
Логика блокирования
{
id: "wooden_shield",
itemType: "shield",
name: "Деревянный Щит",
rarity: ITEM_RARITY.COMMON,
category: ITEM_CATEGORY.ARMOR,
slot: ITEM_SLOT.WEAPON_OFF_HAND,
durability: 100,
description: "Простой деревянный щит, годится для защиты от слабых ударов.",
stats: { STR: 0, AGI: -1, END: 1, INT: 0, WIL: 0, LUK: 0 },
combat_mods: { DEFENSE_RATING: 5, DEFENSE_RATING_COLD: 1 },
mass: 5,
iconSrc: WoodenShield,
price: 15,
vendor: VENDOR_TYPES.BLACKSMITH,
minLevel: 1,
minStats: { END: 5 },
},
Объект конфигурации навыка блокирования
Начать дискуссию