Skip to content
Snippets Groups Projects
Combat.lua 79 KiB
Newer Older
  • Learn to ignore specific revisions
  • dg's avatar
    dg committed
    	if weapon and weapon.twohanded then return 0 end
    
    dg's avatar
    dg committed
    --- Check if the actor dual wields
    
    DarkGod's avatar
    DarkGod committed
    function _M:hasDualWeapon(type)
    
    dg's avatar
    dg committed
    	if self:attr("disarmed") then
    		return nil, "disarmed"
    	end
    
    
    dg's avatar
    dg committed
    	if not self:getInven("MAINHAND") or not self:getInven("OFFHAND") then return end
    	local weapon = self:getInven("MAINHAND")[1]
    	local offweapon = self:getInven("OFFHAND")[1]
    	if not weapon or not offweapon or not weapon.combat or not offweapon.combat then
    		return nil
    	end
    
    DarkGod's avatar
    DarkGod committed
    	if type and weapon.combat.talented ~= type then return nil end
    	if type and offweapon.combat.talented ~= type then return nil end
    
    dg's avatar
    dg committed
    	return weapon, offweapon
    end
    
    dg's avatar
    dg committed
    
    
    --- Check if the actor uses psiblades
    function _M:hasPsiblades(main, off)
    	if self:attr("disarmed") then
    		return nil, "disarmed"
    	end
    
    	local weapon, offweapon = nil, nil
    	if main then
    		if not self:getInven("MAINHAND") then return end
    		weapon = self:getInven("MAINHAND")[1]
    
    		if not weapon or not weapon.combat or not weapon.psiblade_active then return nil, "unactivated psiblade" end
    
    	end
    	if off then
    		if not self:getInven("OFFHAND") then return end
    		offweapon = self:getInven("OFFHAND")[1]
    
    		if not offweapon or not offweapon.combat or not offweapon.psiblade_active then return nil, "unactivated psiblade" end
    
    dg's avatar
    dg committed
    --- Check if the actor has a light armor
    function _M:hasLightArmor()
    	if not self:getInven("BODY") then return end
    	local armor = self:getInven("BODY")[1]
    	if not armor or (armor.subtype ~= "cloth" and armor.subtype ~= "light") then
    		return nil
    	end
    	return armor
    end
    
    
    dg's avatar
    dg committed
    --- Check if the actor has a heavy armor
    function _M:hasHeavyArmor()
    	if not self:getInven("BODY") then return end
    	local armor = self:getInven("BODY")[1]
    
    	if not armor or (armor.subtype ~= "heavy" and armor.subtype ~= "massive") then
    
    dg's avatar
    dg committed
    		return nil
    	end
    
    dg's avatar
    dg committed
    	return armor
    
    dg's avatar
    dg committed
    end
    
    --- Check if the actor has a massive armor
    function _M:hasMassiveArmor()
    	if not self:getInven("BODY") then return end
    	local armor = self:getInven("BODY")[1]
    	if not armor or armor.subtype ~= "massive" then
    		return nil
    	end
    
    dg's avatar
    dg committed
    	return armor
    
    dg's avatar
    dg committed
    end
    
    dg's avatar
    dg committed
    
    
    dg's avatar
    dg committed
    --- Check if the actor has a cloak
    function _M:hasCloak()
    	if not self:getInven("CLOAK") then return end
    	local cloak = self:getInven("CLOAK")[1]
    	if not cloak then
    		return nil
    	end
    	return cloak
    end
    
    
    dg's avatar
    dg committed
    -- Unarmed Combat; this handles grapple checks and building combo points
    -- Builds Comob; reduces the cooldown on all unarmed abilities on cooldown by one
    function _M:buildCombo()
    
    	local duration = 5
    
    dg's avatar
    dg committed
    	local power = 1
    	-- Combo String bonuses
    	if self:knowTalent(self.T_COMBO_STRING) then
    
    		local t = self:getTalentFromId(self.T_COMBO_STRING)
    
    dg's avatar
    dg committed
    		if rng.percent(t.getChance(self, t)) then
    			power = 2
    		end
    
    		duration = 5 + t.getDuration(self, t)
    
    dg's avatar
    dg committed
    	end
    
    dg's avatar
    dg committed
    
    
    dg's avatar
    dg committed
    	if self:knowTalent(self.T_RELENTLESS_STRIKES) then
    
    		local t = self:getTalentFromId(self.T_RELENTLESS_STRIKES)
    
    dg's avatar
    dg committed
    		self:incStamina(t.getStamina(self, t))
    
    dg's avatar
    dg committed
    	end
    
    dg's avatar
    dg committed
    	self:setEffect(self.EFF_COMBO, duration, {power=power})
    end
    
    function _M:getCombo(combo)
    	local combo = 0
    	local p = self:hasEffect(self.EFF_COMBO)
    
    dg's avatar
    dg committed
    		combo = p.cur_power
    	end
    		return combo
    end
    
    function _M:clearCombo()
    	if self:hasEffect(self.EFF_COMBO) then
    		self:removeEffect(self.EFF_COMBO)
    	end
    end
    
    -- Check to see if the target is already being grappled; many talents have extra effects on grappled targets
    function _M:isGrappled(source)
    	local p = self:hasEffect(self.EFF_GRAPPLED)
    
    	if p and p.src == source then
    
    dg's avatar
    dg committed
    		return true
    	else
    		return false
    	end
    end
    
    -- Breaks active grapples; called by a few talents that involve a lot of movement
    function _M:breakGrapples()
    	if self:hasEffect(self.EFF_GRAPPLING) then
    
    		local p = self:hasEffect(self.EFF_GRAPPLING)
    		if p.trgt then
    			p.trgt:removeEffect(p.trgt.EFF_GRAPPLED)
    		end
    
    dg's avatar
    dg committed
    		self:removeEffect(self.EFF_GRAPPLING)
    	end
    end
    
    -- grapple size check; compares attackers size and targets size
    function _M:grappleSizeCheck(target)
    	size = target.size_category - self.size_category
    	if size > 1 then
    		game.logSeen(target, "%s fails because %s is too big!", self.name:capitalize(), target.name:capitalize())
    		return true
    	else
    		return false
    	end
    end
    
    -- Starts the grapple
    function _M:startGrapple(target)
    	-- pulls boosted grapple effect from the clinch talent if known
    	if self:knowTalent(self.T_CLINCH) then
    		local t = self:getTalentFromId(self.T_CLINCH)
    		power = t.getPower(self, t)
    		duration = t.getDuration(self, t)
    		hitbonus = self:getTalentLevel(t)/2
    	else
    		power = 5
    		duration = 4
    		hitbonus = 0
    	end
    	-- Breaks the grapple before reapplying
    	if self:hasEffect(self.EFF_GRAPPLING) then
    		self:removeEffect(self.EFF_GRAPPLING, true)
    		target:setEffect(target.EFF_GRAPPLED, duration, {src=self, power=power}, true)
    
    		self:setEffect(self.EFF_GRAPPLING, duration, {trgt=target}, true)
    
    dg's avatar
    dg committed
    		return true
    
    dg's avatar
    dg committed
    		target:setEffect(target.EFF_GRAPPLED, duration, {src=self, power=power, apply_power=self:combatPhysicalpower()})
    		target:crossTierEffect(target.EFF_GRAPPLED, self:combatPhysicalpower())
    
    		self:setEffect(self.EFF_GRAPPLING, duration, {trgt=target})
    
    dg's avatar
    dg committed
    		return true
    	else
    		game.logSeen(target, "%s resists the grapple!", target.name:capitalize())
    		return false
    	end