Поставил сразу два типа урона - рубящий и колющий?
Правильно, а потом несколько часов подбирал формулу комплексного урона, избивая крестьян. Проблема в том, что движок при двойном типе урона в виде
damagetype = DAM_EDGE | DAM_POINT;
damage[DAM_INDEX_EDGE] = 0;
damage[DAM_INDEX_POINT] = 40;
минимально бьет на 5 + 5, а максимально добавляет в формулу только половину бонуса от ловкости от 30. Пришлось применить метод "чёрного ящика" - строить одну гипотезу, тестировать урон после одного удара, проверять и всё заново, потом пришло озарение и формула подошла, правда с погрешностью, движок от 0 до 30 ловкости считает комплексный от колющего по одной формуле, а свыше 30 - по другой. Хотя это не критично, + 5-10 доп. урона до 30 ловкости.
После 30 ловки данная формула считает правильно урон
GS = GS(EDGE) + GS(POINT) = (WS[DAM_EDGE] + STR - RS[PROT_EDGE]) + (WS[DAM_POINT] + (DEX + 30) / 2 - RS[PROT_POINT]) , GS >= 10
GS = GS(EDGE) + GS(POINT) = (WS[DAM_EDGE] + STR - RS[PROT_EDGE]) + (WS[DAM_POINT] + DEX/ 2 + 15 - RS[PROT_POINT]) , GS >= 10
, где
GS = причиненный совокупный ущерб
WS = повреждение оружия
STR/DEX = сила/ловкость (бонус повреждения)
RS = защита вооружения противника
Также протестировал обратный вариант
damagetype = DAM_POINT | DAM_EDGE;
damage[DAM_INDEX_POINT] = 40;
damage[DAM_INDEX_EDGE] = 0;
ничего не изменилось, бонус ловкости понижается. Но нужного эффекта я добился - шпагой можно вырубить в нокаут, а не убить.
после этого нужно добавить поправку к урону шпаги ((hero.attribute[ATR_DEXTERITY] - 30) / 2 и раскрыть скобки, чтобы получить при SBMODE = 2 для шпаги 40 урона/20 ловкости
if(Npc_HasItems(hero,ItMw_1h_Vlk_Sword) > 0)
{
Npc_GetInvItem(hero,ItMw_1h_Vlk_Sword);
item.damageTotal = 30 + (hero.attribute[ATR_DEXTERITY] / SBMODE);
item.count[1] = item.damageTotal;
};
if(Npc_HasItems(hero,ItMw_1h_Vlk_Sword) > 0)
{
Npc_GetInvItem(hero,ItMw_1h_Vlk_Sword);
item.damageTotal = 15 + hero.attribute[ATR_DEXTERITY];
item.count[1] = 30 + (hero.attribute[ATR_DEXTERITY] / SBMODE);
};
Примечание: расчет приведен для частного случая, когда сила = 0 и урон от шпаги damage[DAM_INDEX_POINT] = 40
1. как убрать влияние силы на итоговый урон я не знаю, надо протестировать шпагу вида
damageTotal = Damage_VLKSchwert;
damagetype = DAM_EDGE | DAM_POINT;
damage[DAM_INDEX_EDGE] = -1000;
damage[DAM_INDEX_POINT] = 40;
Но возникает вопрос, если ударить минусным уроном, то монстр подлечиться?
2. как устроена формула урона, что происходит, если заданы damageTotal и damage[DAM_INDEX_POINT] вместе? Если предположить, что урон это damageTotal + damage[DAM_INDEX_POINT], то тогда
damageTotal = Damage_VLKSchwert;
damagetype = DAM_EDGE | DAM_POINT;
damage[DAM_INDEX_EDGE] = 0;
damage[DAM_INDEX_POINT] = 0;
если же берется только переменная damage[DAM_INDEX_POINT], то нужно изменять только её.