diff --git a/data/spells/lib/spells.lua b/data/spells/lib/spells.lua index adf9a2c014..577020b2df 100644 --- a/data/spells/lib/spells.lua +++ b/data/spells/lib/spells.lua @@ -1,220 +1,325 @@ --- Pre-made areas --- Waves -AREA_WAVE3 = {{1, 1, 1}, {1, 1, 1}, {0, 3, 0}} +--Pre-made areas + +--Waves +AREA_WAVE3 = { + {1, 1, 1}, + {1, 1, 1}, + {0, 3, 0} +} AREA_WAVE4 = { - {1, 1, 1, 1, 1}, {0, 1, 1, 1, 0}, {0, 1, 1, 1, 0}, {0, 0, 3, 0, 0} + {1, 1, 1, 1, 1}, + {0, 1, 1, 1, 0}, + {0, 1, 1, 1, 0}, + {0, 0, 3, 0, 0} } -AREA_WAVE6 = {{0, 0, 0, 0, 0}, {0, 1, 3, 1, 0}, {0, 0, 0, 0, 0}} +AREA_WAVE6 = { + {0, 0, 0, 0, 0}, + {0, 1, 3, 1, 0}, + {0, 0, 0, 0, 0} +} AREA_WAVE7 = { - {1, 1, 1, 1, 1}, {1, 1, 1, 1, 1}, {0, 1, 1, 1, 0}, {0, 1, 1, 1, 0}, - {0, 0, 3, 0, 0} + {1, 1, 1, 1, 1}, + {1, 1, 1, 1, 1}, + {0, 1, 1, 1, 0}, + {0, 1, 1, 1, 0}, + {0, 0, 3, 0, 0} } -AREA_SQUAREWAVE5 = {{1, 1, 1}, {1, 1, 1}, {1, 1, 1}, {0, 1, 0}, {0, 3, 0}} +AREA_SQUAREWAVE5 = { + {1, 1, 1}, + {1, 1, 1}, + {1, 1, 1}, + {0, 1, 0}, + {0, 3, 0} +} AREA_SQUAREWAVE6 = { - {0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0}, {0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0}, - {0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0}, {0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0}, - {0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0}, {0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0}, - {0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0}, {0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0}, - {0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0}, {0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0} + {0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0}, + {0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0}, + {0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0}, + {0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0}, + {0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0}, + {0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0}, + {0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0}, + {0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0}, + {0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0}, + {0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0} } AREA_SQUAREWAVE7 = { - {0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0}, {0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0}, - {0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0}, {0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0}, - {0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0}, {0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0}, - {0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0}, {0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0}, - {0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0} + {0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0}, + {0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0}, + {0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0}, + {0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0}, + {0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0}, + {0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0}, + {0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0}, + {0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0}, + {0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0} } --- Diagonal waves +--Diagonal waves AREADIAGONAL_WAVE4 = { - {0, 0, 0, 0, 1, 0}, {0, 0, 0, 1, 1, 0}, {0, 0, 1, 1, 1, 0}, - {0, 1, 1, 1, 1, 0}, {1, 1, 1, 1, 1, 0}, {0, 0, 0, 0, 0, 3} + {0, 0, 0, 0, 1, 0}, + {0, 0, 0, 1, 1, 0}, + {0, 0, 1, 1, 1, 0}, + {0, 1, 1, 1, 1, 0}, + {1, 1, 1, 1, 1, 0}, + {0, 0, 0, 0, 0, 3} } AREADIAGONAL_SQUAREWAVE5 = { - {1, 1, 1, 0, 0}, {1, 1, 1, 0, 0}, {1, 1, 1, 0, 0}, {0, 0, 0, 1, 0}, - {0, 0, 0, 0, 3} + {1, 1, 1, 0, 0}, + {1, 1, 1, 0, 0}, + {1, 1, 1, 0, 0}, + {0, 0, 0, 1, 0}, + {0, 0, 0, 0, 3} } -AREADIAGONAL_WAVE6 = {{0, 0, 1}, {0, 3, 0}, {1, 0, 0}} +AREADIAGONAL_WAVE6 = { + {0, 0, 1}, + {0, 3, 0}, + {1, 0, 0} +} AREADIAGONAL_WAVE7 = { - {0, 0, 0, 0, 0, 1, 0}, {0, 0, 0, 0, 1, 1, 0}, {0, 0, 0, 1, 1, 1, 0}, - {0, 0, 1, 1, 1, 1, 0}, {0, 1, 1, 1, 1, 1, 0}, {1, 1, 1, 1, 1, 1, 0}, - {0, 0, 0, 0, 0, 0, 3} + {0, 0, 0, 0, 0, 1, 0}, + {0, 0, 0, 0, 1, 1, 0}, + {0, 0, 0, 1, 1, 1, 0}, + {0, 0, 1, 1, 1, 1, 0}, + {0, 1, 1, 1, 1, 1, 0}, + {1, 1, 1, 1, 1, 1, 0}, + {0, 0, 0, 0, 0, 0, 3} } --- Beams -AREA_BEAM1 = {{3}} +--Beams +AREA_BEAM1 = { + {3} +} -AREA_BEAM5 = {{1}, {1}, {1}, {1}, {3}} +AREA_BEAM5 = { + {1}, + {1}, + {1}, + {1}, + {3} +} -AREA_BEAM7 = {{1}, {1}, {1}, {1}, {1}, {1}, {3}} +AREA_BEAM7 = { + {1}, + {1}, + {1}, + {1}, + {1}, + {1}, + {3} +} -AREA_BEAM8 = {{1}, {1}, {1}, {1}, {1}, {1}, {1}, {3}} +AREA_BEAM8 = { + {1}, + {1}, + {1}, + {1}, + {1}, + {1}, + {1}, + {3} +} --- Diagonal Beams +--Diagonal Beams AREADIAGONAL_BEAM5 = { - {1, 0, 0, 0, 0}, {0, 1, 0, 0, 0}, {0, 0, 1, 0, 0}, {0, 0, 0, 1, 0}, - {0, 0, 0, 0, 3} + {1, 0, 0, 0, 0}, + {0, 1, 0, 0, 0}, + {0, 0, 1, 0, 0}, + {0, 0, 0, 1, 0}, + {0, 0, 0, 0, 3} } AREADIAGONAL_BEAM7 = { - {1, 0, 0, 0, 0, 0, 0}, {0, 1, 0, 0, 0, 0, 0}, {0, 0, 1, 0, 0, 0, 0}, - {0, 0, 0, 1, 0, 0, 0}, {0, 0, 0, 0, 1, 0, 0}, {0, 0, 0, 0, 0, 1, 0}, - {0, 0, 0, 0, 0, 0, 3} + {1, 0, 0, 0, 0, 0, 0}, + {0, 1, 0, 0, 0, 0, 0}, + {0, 0, 1, 0, 0, 0, 0}, + {0, 0, 0, 1, 0, 0, 0}, + {0, 0, 0, 0, 1, 0, 0}, + {0, 0, 0, 0, 0, 1, 0}, + {0, 0, 0, 0, 0, 0, 3} } --- Circles +--Circles AREA_CIRCLE2X2 = { - {0, 1, 1, 1, 0}, {1, 1, 1, 1, 1}, {1, 1, 3, 1, 1}, {1, 1, 1, 1, 1}, - {0, 1, 1, 1, 0} + {0, 1, 1, 1, 0}, + {1, 1, 1, 1, 1}, + {1, 1, 3, 1, 1}, + {1, 1, 1, 1, 1}, + {0, 1, 1, 1, 0} } AREA_CIRCLE3X3 = { - {0, 0, 1, 1, 1, 0, 0}, {0, 1, 1, 1, 1, 1, 0}, {1, 1, 1, 1, 1, 1, 1}, - {1, 1, 1, 3, 1, 1, 1}, {1, 1, 1, 1, 1, 1, 1}, {0, 1, 1, 1, 1, 1, 0}, - {0, 0, 1, 1, 1, 0, 0} + {0, 0, 1, 1, 1, 0, 0}, + {0, 1, 1, 1, 1, 1, 0}, + {1, 1, 1, 1, 1, 1, 1}, + {1, 1, 1, 3, 1, 1, 1}, + {1, 1, 1, 1, 1, 1, 1}, + {0, 1, 1, 1, 1, 1, 0}, + {0, 0, 1, 1, 1, 0, 0} } -- Crosses -AREA_CROSS1X1 = {{0, 1, 0}, {1, 3, 1}, {0, 1, 0}} +AREA_CROSS1X1 = { + {0, 1, 0}, + {1, 3, 1}, + {0, 1, 0} +} AREA_CIRCLE5X5 = { - {0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0}, {0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0}, - {0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0}, {0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0}, - {0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0}, {1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1}, - {0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0}, {0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0}, - {0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0}, {0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0}, - {0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0} + {0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0}, + {0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0}, + {0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0}, + {0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0}, + {0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0}, + {1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1}, + {0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0}, + {0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0}, + {0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0}, + {0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0}, + {0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0} } AREA_CIRCLE6X6 = { - {0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0}, - {0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0}, - {0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0}, - {0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0}, - {0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0}, - {1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1}, - {0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0}, - {0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0}, - {0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0}, - {0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0}, - {0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0} -} - --- Squares -AREA_SQUARE1X1 = {{1, 1, 1}, {1, 3, 1}, {1, 1, 1}} + {0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0}, + {0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0}, + {0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0}, + {0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0}, + {0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0}, + {1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1}, + {0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0}, + {0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0}, + {0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0}, + {0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0}, + {0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0} +} + +--Squares +AREA_SQUARE1X1 = { + {1, 1, 1}, + {1, 3, 1}, + {1, 1, 1} +} -- Walls -AREA_WALLFIELD = {{1, 1, 3, 1, 1}} +AREA_WALLFIELD = { + {1, 1, 3, 1, 1} +} AREADIAGONAL_WALLFIELD = { - {0, 0, 0, 0, 1}, {0, 0, 0, 1, 1}, {0, 1, 3, 1, 0}, {1, 1, 0, 0, 0}, - {1, 0, 0, 0, 0} + {0, 0, 0, 0, 1}, + {0, 0, 0, 1, 1}, + {0, 1, 3, 1, 0}, + {1, 1, 0, 0, 0}, + {1, 0, 0, 0, 0}, } -- This array contains all destroyable field items -FIELDS = { - 1487, 1488, 1489, 1490, 1491, 1492, 1493, 1494, 1495, 1496, 1500, 1501, - 1502, 1503, 1504 -} +FIELDS = {1487, 1488, 1489, 1490, 1491, 1492, 1493, 1494, 1495, 1496, 1500, 1501, 1502, 1503, 1504} function Player:addPartyCondition(combat, variant, condition, baseMana) - local party = self:getParty() - if not party then - self:sendCancelMessage(RETURNVALUE_NOPARTYMEMBERSINRANGE) - self:getPosition():sendMagicEffect(CONST_ME_POFF) - return false - end - - local positions = combat:getPositions(self, variant) - local members = party:getMembers() - members[#members + 1] = party:getLeader() - - local affectedMembers = {} - for _, member in ipairs(members) do - local memberPosition = member:getPosition() - for _, position in ipairs(positions) do - if memberPosition == position then - affectedMembers[#affectedMembers + 1] = member - end - end - end - - if #affectedMembers <= 1 then - self:sendCancelMessage(RETURNVALUE_NOPARTYMEMBERSINRANGE) - self:getPosition():sendMagicEffect(CONST_ME_POFF) - return false - end - - local mana = math.ceil(#affectedMembers * - math.pow(0.9, #affectedMembers - 1) * baseMana) - if self:getMana() < mana then - self:sendCancelMessage(RETURNVALUE_NOTENOUGHMANA) - self:getPosition():sendMagicEffect(CONST_ME_POFF) - return false - end - - self:addMana(-mana) - self:addManaSpent(mana) - - for _, member in ipairs(affectedMembers) do - member:addCondition(condition) - end - - for _, position in ipairs(positions) do - position:sendMagicEffect(CONST_ME_MAGIC_BLUE) - end - return true + local party = self:getParty() + if not party then + self:sendCancelMessage(RETURNVALUE_NOPARTYMEMBERSINRANGE) + self:getPosition():sendMagicEffect(CONST_ME_POFF) + return false + end + + local positions = combat:getPositions(self, variant) + local members = party:getMembers() + members[#members + 1] = party:getLeader() + + local affectedMembers = {} + for _, member in ipairs(members) do + local memberPosition = member:getPosition() + for _, position in ipairs(positions) do + if memberPosition == position then + affectedMembers[#affectedMembers + 1] = member + end + end + end + + if #affectedMembers <= 1 then + self:sendCancelMessage(RETURNVALUE_NOPARTYMEMBERSINRANGE) + self:getPosition():sendMagicEffect(CONST_ME_POFF) + return false + end + + local mana = math.ceil(#affectedMembers * math.pow(0.9, #affectedMembers - 1) * baseMana) + if self:getMana() < mana then + self:sendCancelMessage(RETURNVALUE_NOTENOUGHMANA) + self:getPosition():sendMagicEffect(CONST_ME_POFF) + return false + end + + self:addMana(-mana) + self:addManaSpent(mana) + + for _, member in ipairs(affectedMembers) do + member:addCondition(condition) + end + + for _, position in ipairs(positions) do + position:sendMagicEffect(CONST_ME_MAGIC_BLUE) + end + return true end function Player:conjureItem(reagentId, conjureId, conjureCount, effect) - if not conjureCount and conjureId ~= 0 then - local itemType = ItemType(conjureId) - if itemType:getId() == 0 then return false end - - local charges = itemType:getCharges() - if charges ~= 0 then conjureCount = charges end - end - - if reagentId ~= 0 and not self:removeItem(reagentId, 1, -1) then - self:sendCancelMessage(RETURNVALUE_YOUNEEDAMAGICITEMTOCASTSPELL) - self:getPosition():sendMagicEffect(CONST_ME_POFF) - return false - end - - local item = self:addItem(conjureId, conjureCount) - if not item then - self:sendCancelMessage(RETURNVALUE_NOTPOSSIBLE) - self:getPosition():sendMagicEffect(CONST_ME_POFF) - return false - end - - if item:hasAttribute(ITEM_ATTRIBUTE_DURATION) then item:decay() end - - self:getPosition():sendMagicEffect(item:getType():isRune() and - CONST_ME_MAGIC_RED or effect) - return true + if not conjureCount and conjureId ~= 0 then + local itemType = ItemType(conjureId) + if itemType:getId() == 0 then + return false + end + + local charges = itemType:getCharges() + if charges ~= 0 then + conjureCount = charges + end + end + + if reagentId ~= 0 and not self:removeItem(reagentId, 1, -1) then + self:sendCancelMessage(RETURNVALUE_YOUNEEDAMAGICITEMTOCASTSPELL) + self:getPosition():sendMagicEffect(CONST_ME_POFF) + return false + end + + local item = self:addItem(conjureId, conjureCount) + if not item then + self:sendCancelMessage(RETURNVALUE_NOTPOSSIBLE) + self:getPosition():sendMagicEffect(CONST_ME_POFF) + return false + end + + if item:hasAttribute(ITEM_ATTRIBUTE_DURATION) then + item:decay() + end + + self:getPosition():sendMagicEffect(item:getType():isRune() and CONST_ME_MAGIC_RED or effect) + return true end function Creature:addAttributeCondition(parameters) - local condition = Condition(CONDITION_ATTRIBUTES) - for _, parameter in ipairs(parameters) do - if parameter.key and parameter.value then - condition:setParameter(parameter.key, parameter.value) - end - end - - self:addCondition(condition) + local condition = Condition(CONDITION_ATTRIBUTES) + for _, parameter in ipairs(parameters) do + if parameter.key and parameter.value then + condition:setParameter(parameter.key, parameter.value) + end + end + + self:addCondition(condition) end