Day 63
parent
1008e91531
commit
7e11fd0c0b
Binary file not shown.
26
devlog.md
26
devlog.md
|
@ -997,3 +997,29 @@ thing, which should make it easier to work with. The rect cutting UI idea does s
|
|||
| Divine Machine Arrow | all arrows fired by rangers have a 40% chance to seek enemies and pierce 5 times |
|
||||
| Chronomancy | all mages cast their spells 25% faster |
|
||||
| Awakening | every round 1 mage is granted +100% cast speed and damage for that round |
|
||||
|
||||
# Day 63 - 20/04/21
|
||||
|
||||
| Name | Description |
|
||||
| --- | --- |
|
||||
| Divine Punishment | periodically deal 10X damage to all enemies, where X is how many mages you have |
|
||||
| Berserking | all warriors have up to +50% attack speed based on missing HP |
|
||||
| Unwavering Stance | all warriors gain +5% defense every 5 seconds |
|
||||
| Ultimatum | projectiles that chain gain +25% damage with each chain |
|
||||
| Flying Daggers | all knives thrown by rogues chain +2 times |
|
||||
| Magnify | +25% area size |
|
||||
| Concentrated Fire | -50% area size and +50% area damage |
|
||||
| Unleash | +2% area size and damage per second |
|
||||
| Reinforce | +10% damage, defense and attack speed to all allies if you have at least one enchanter |
|
||||
| Payback | +5% damage to all allies whenever an enchanter is hit |
|
||||
| Blessing | +20% healing effectiveness |
|
||||
| Hex Master | +25% curse duration |
|
||||
| Whispers of Doom | curses apply doom, when 4 doom instances are reached they deal 200 damage |
|
||||
| Force Push | +25% knockback force |
|
||||
| Heavy Impact | when enemies hit walls they take damage according to the knockback force |
|
||||
| Crucio | taking damage also shares that amount to each enemy |
|
||||
| Immolation | 3 allies will periodically take damage, all allies gain +8% damage per tick |
|
||||
| Call of the Void | +25% damage over time |
|
||||
| Spawning Pool | +1 critter health |
|
||||
| Hive | +2 critter health |
|
||||
| Void Rift | attacks by mages, nukers or voiders have a 20% chance to create a void rift on hit |
|
||||
|
|
18
enemies.lua
18
enemies.lua
|
@ -348,6 +348,12 @@ function Seeker:on_collision_enter(other, contact)
|
|||
hit2:play{pitch = random:float(0.95, 1.05), volume = 0.35}
|
||||
end
|
||||
|
||||
if main.current.player.heavy_impact then
|
||||
if self.being_pushed then
|
||||
self:hit(self.push_force)
|
||||
end
|
||||
end
|
||||
|
||||
elseif table.any(main.current.enemies, function(v) return other:is(v) end) then
|
||||
if self.being_pushed and math.length(self:get_velocity()) > 60 then
|
||||
other:hit(math.floor(self.push_force/4))
|
||||
|
@ -383,7 +389,6 @@ function Seeker:hit(damage, projectile)
|
|||
local actual_damage = self:calculate_damage(damage)*self.stun_dmg_m*self.bane_dmg_m
|
||||
if self.vulnerable then actual_damage = actual_damage*1.2 end
|
||||
self.hp = self.hp - actual_damage
|
||||
print(actual_damage)
|
||||
main.current.damage_dealt = main.current.damage_dealt + actual_damage
|
||||
|
||||
if projectile and projectile.spawn_critters_on_hit then
|
||||
|
@ -493,6 +498,17 @@ function Seeker:curse(curse, duration, arg1, arg2)
|
|||
elseif main.current.curser_level == 1 then curse_m = 1.25
|
||||
else curse_m = 1 end
|
||||
|
||||
if main.current.player.whispers_of_doom then
|
||||
if not self.doom then self.doom = 0 end
|
||||
self.doom = self.doom + 1
|
||||
if self.doom == 4 then
|
||||
self.doom = 0
|
||||
self:hit(200)
|
||||
buff1:play{pitch = random:float(0.95, 1.05), volume = 0.5}
|
||||
ui_switch1:play{pitch = random:float(0.95, 1.05), volume = 0.5}
|
||||
end
|
||||
end
|
||||
|
||||
if curse == 'launcher' then
|
||||
self.t:after(duration*curse_m, function()
|
||||
self.launcher_push = arg1
|
||||
|
|
|
@ -43,6 +43,7 @@ end
|
|||
|
||||
|
||||
function HitFX:use(name, x, k, d, flash_duration)
|
||||
if not self.parent then return end
|
||||
self.parent.flashes[name]:flash(flash_duration)
|
||||
self.parent.springs[name]:pull(x, k, d)
|
||||
end
|
||||
|
|
68
main.lua
68
main.lua
|
@ -19,6 +19,7 @@ function init()
|
|||
music.volume = 0
|
||||
|
||||
local s = {tags = {sfx}}
|
||||
thunder1 = Sound('399656__bajko__sfx-thunder-blast.ogg', s)
|
||||
flagellant1 = Sound('Whipping Horse 3.ogg', s)
|
||||
bard2 = Sound('376532__womb-affliction__flute-trill.ogg', s)
|
||||
bard1 = Sound('Magical Impact 12.ogg', s)
|
||||
|
@ -958,26 +959,26 @@ function init()
|
|||
['awakening'] = '[fg]every round [yellow]1[fg] mage is granted [yellow]+100%[fg] attack speed and damage for that round',
|
||||
['divine_punishment'] = '[fg]periodically deal [yellow]10X[fg] damage to all enemies, where [yellow]X[fg] is how many mages you have',
|
||||
['berserking'] = '[fg]all warriors have up to [yellow]+50%[fg] attack speed based on missing HP',
|
||||
['unwavering_stance'] = '[fg]all warriors gain [yellow]+5%[fg] defense every [yellow]5[fg] seconds, up to [yellow]+50%[fg]',
|
||||
['unwavering_stance'] = '[fg]all warriors gain [yellow]+5%[fg] defense every [yellow]5[fg] seconds',
|
||||
['ultimatum'] = '[fg]projectiles that chain gain [yellow]+25%[fg] damage with each chain',
|
||||
['flying_daggers'] = '[fg]all knives thrown by rogues chain [yellow]+2[fg] times',
|
||||
['assassination'] = '[fg]your crits deal [yellow]8x[fg] damage (up from [yellow]4x[fg]) but normal attacks deal [yellow]half[fg] damage',
|
||||
['assassination'] = '[fg]crits from rogues deal [yellow]8x[fg] damage but normal attacks deal [yellow]half[fg] damage',
|
||||
['magnify'] = '[yellow]+25%[fg] area size',
|
||||
['concentrated_fire'] = '[yellow]-50%[fg] area size and [yellow]+50%[fg] area damage',
|
||||
['unleash'] = '[yellow]+5%[fg] area size and damage per second, this resets when any AoE attack happens',
|
||||
['unleash'] = '[yellow]+2%[fg] area size and damage per second',
|
||||
['reinforce'] = '[yellow]+10%[fg] damage, defense and attack speed to all allies if you have at least one enchanter',
|
||||
['payback'] = '[yellow]+5%[fg] damage to all allies whenever an enchanter is hit',
|
||||
['blessing'] = '[yellow]+20%[fg] healing effectiveness',
|
||||
['hex_master'] = '[yellow]+25%[fg] curse duration',
|
||||
['whispers_of_doom'] = '[fg]curses apply doom, when [yellow]3[fg] doom instances are applied they are consumed, dealing [yellow]100[fg] damage',
|
||||
['whispers_of_doom'] = '[fg]curses apply doom, when [yellow]4[fg] doom instances are reached they deal [yellow]200[fg] damage',
|
||||
['force_push'] = '[yellow]+25%[fg] knockback force',
|
||||
['heavy_impact'] = '[fg]if knockbacked enemies hit walls they take damage according to the knockback force',
|
||||
['crucio'] = '[fg]taking damage shares [yellow]2X[fg] the amount across all enemies',
|
||||
['immolation'] = '[yellow]3[fg] units chosen at random will periodically take damage, all your allies gain [yellow]+8%[fg] damage per tick',
|
||||
['heavy_impact'] = '[fg]when enemies hit walls they take damage according to the knockback force',
|
||||
['crucio'] = '[fg]taking damage also shares that amount across all enemies',
|
||||
['immolation'] = '[yellow]3[fg] units will periodically take damage, all your allies gain [yellow]+8%[fg] damage per tick',
|
||||
['call_of_the_void'] = '[yellow]+25%[fg] damage over time',
|
||||
['spawning_pool'] = '[yellow]+1[fg] critter health',
|
||||
['hive'] = '[yellow]+2[fg] critter health',
|
||||
['void_rift'] = '[fg]AoE attacks by mages, nukers or voiders have a [yellow]20%[fg] chance to create a void rift',
|
||||
['void_rift'] = '[fg]attacks by mages, nukers or voiders have a [yellow]20%[fg] chance to create a void rift on hit',
|
||||
}
|
||||
|
||||
passive_tiers = {
|
||||
|
@ -1044,58 +1045,13 @@ function init()
|
|||
[24] = {20, 30, 50},
|
||||
}
|
||||
|
||||
--[[
|
||||
* ['ouroboros_technique_r'] = 2,
|
||||
* ['ouroboros_technique_l'] = 2,
|
||||
* ['wall_echo'] = 1,
|
||||
* ['wall_rider'] = 1,
|
||||
* ['centipede'] = 1,
|
||||
* ['intimidation'] = 2,
|
||||
* ['vulnerability'] = 2,
|
||||
* ['temporal_chains'] = 1,
|
||||
* ['amplify'] = 1,
|
||||
* ['amplify_x'] = 1,
|
||||
* ['resonance'] = 2,
|
||||
* ['ballista'] = 1,
|
||||
* ['ballista_x'] = 1,
|
||||
* ['point_blank'] = 2,
|
||||
* ['longshot'] = 2,
|
||||
* ['blunt_arrow'] = 1,
|
||||
* ['explosive_arrow'] = 2,
|
||||
* ['divine_machine_arrow'] = 3,
|
||||
* ['chronomancy'] = 2,
|
||||
* ['awakening'] = 2,
|
||||
['divine_punishment'] = 3,
|
||||
['berserking'] = 1,
|
||||
['unwavering_stance'] = 1,
|
||||
['ultimatum'] = 2,
|
||||
['flying_daggers'] = 3,
|
||||
['assassination'] = 1,
|
||||
['magnify'] = 1,
|
||||
['concentrated_fire'] = 2,
|
||||
['unleash'] = 1,
|
||||
['reinforce'] = 2,
|
||||
['payback'] = 2,
|
||||
['blessing'] = 1,
|
||||
['hex_master'] = 1,
|
||||
['whispers_of_doom'] = 2,
|
||||
['force_push'] = 1,
|
||||
['heavy_impact'] = 2,
|
||||
['crucio'] = 3,
|
||||
['immolation'] = 2,
|
||||
['call_of_the_void'] = 2,
|
||||
['spawning_pool'] = 1,
|
||||
['hive'] = 3,
|
||||
]]--
|
||||
|
||||
gold = 2
|
||||
passives = {'awakening'}
|
||||
passives = {'void_rift'}
|
||||
|
||||
main = Main()
|
||||
main:add(BuyScreen'buy_screen')
|
||||
main:go_to('buy_screen', 2, {
|
||||
{character = 'wizard', level = 1},
|
||||
{character = 'spellblade', level = 1},
|
||||
main:go_to('buy_screen', 20, {
|
||||
{character = 'spellblade', level = 3},
|
||||
--[[
|
||||
{character = 'swordsman', level = 3},
|
||||
{character = 'wizard', level = 3},
|
||||
|
|
10
objects.lua
10
objects.lua
|
@ -44,14 +44,14 @@ function LightningLine:init(args)
|
|||
self.lines = {}
|
||||
table.insert(self.lines, {x1 = self.src.x, y1 = self.src.y, x2 = self.dst.x, y2 = self.dst.y})
|
||||
self.w = 3
|
||||
self.generations = 3
|
||||
self.max_offset = 8
|
||||
self.generations = args.generations or 3
|
||||
self.max_offset = args.max_offset or 8
|
||||
self:generate()
|
||||
self.t:tween(0.1, self, {w = 1}, math.linear, function() self.dead = true end)
|
||||
self.t:tween(self.duration or 0.1, self, {w = 1}, math.linear, function() self.dead = true end)
|
||||
self.color = args.color or blue[0]
|
||||
HitCircle{group = main.current.effects, x = self.src.x, y = self.src.y, rs = 6, color = fg[0], duration = 0.1}
|
||||
HitCircle{group = main.current.effects, x = self.src.x, y = self.src.y, rs = 6, color = fg[0], duration = self.duration or 0.1}
|
||||
for i = 1, 2 do HitParticle{group = main.current.effects, x = self.src.x, y = self.src.y, color = self.color} end
|
||||
HitCircle{group = main.current.effects, x = self.dst.x, y = self.dst.y, rs = 6, color = fg[0], duration = 0.1}
|
||||
HitCircle{group = main.current.effects, x = self.dst.x, y = self.dst.y, rs = 6, color = fg[0], duration = self.duration or 0.1}
|
||||
HitParticle{group = main.current.effects, x = self.dst.x, y = self.dst.y, color = self.color}
|
||||
end
|
||||
|
||||
|
|
186
player.lua
186
player.lua
|
@ -384,7 +384,7 @@ function Player:init(args)
|
|||
local enemies = main.current.main:get_objects_by_classes(main.current.enemies)
|
||||
for _, enemy in ipairs(enemies) do
|
||||
if self:distance_to_object(enemy) < 128 then
|
||||
enemy:curse('infestor', 6, (self.level == 3 and 6 or 2), self.dmg)
|
||||
enemy:curse('infestor', 6*(self.hex_duration_m or 1), (self.level == 3 and 6 or 2), self.dmg)
|
||||
HitCircle{group = main.current.effects, x = self.x, y = self.y, rs = 6, color = orange[0], duration = 0.1}
|
||||
LightningLine{group = main.current.effects, src = self, dst = enemy, color = orange[0]}
|
||||
end
|
||||
|
@ -483,6 +483,7 @@ function Player:init(args)
|
|||
end
|
||||
|
||||
if self.leader and self.awakening then
|
||||
main.current.t:after(0.1, function()
|
||||
local units = self:get_all_units()
|
||||
local mages = {}
|
||||
for _, unit in ipairs(units) do
|
||||
|
@ -493,7 +494,99 @@ function Player:init(args)
|
|||
local mage = random:table(mages)
|
||||
mage.awakening_aspd_m = 2
|
||||
mage.awakening_dmg_m = 2
|
||||
end)
|
||||
end
|
||||
|
||||
if self.leader and self.divine_punishment then
|
||||
main.current.t:every(5, function()
|
||||
local units = self:get_all_units()
|
||||
local mages = {}
|
||||
for _, unit in ipairs(units) do
|
||||
if table.any(unit.classes, function(v) return v == 'mage' end) then
|
||||
table.insert(mages, unit)
|
||||
end
|
||||
end
|
||||
local leader = main.current.player:get_leader()
|
||||
local enemies = main.current.main:get_objects_by_classes(main.current.enemies)
|
||||
if #enemies > 0 then
|
||||
thunder1:play{volume = 0.5}
|
||||
camera:shake(4, 0.5)
|
||||
end
|
||||
for _, enemy in ipairs(enemies) do
|
||||
enemy:hit(10*#mages)
|
||||
LightningLine{group = main.current.effects, src = {x = enemy.x, y = enemy.y - 32}, dst = enemy, color = blue[0], duration = 0.2}
|
||||
_G[random:table{'spark1', 'spark2', 'spark3'}]:play{pitch = random:float(0.9, 1.1), volume = 0.3}
|
||||
end
|
||||
end)
|
||||
end
|
||||
|
||||
if self.unwavering_stance and table.any(self.classes, function(v) return v == 'warrior' end) then
|
||||
self.unwavering_stance_def_m = 1
|
||||
self.t:every(5, function()
|
||||
self.unwavering_stance_def_m = self.unwavering_stance_def_m + 0.05
|
||||
end)
|
||||
end
|
||||
|
||||
if self.magnify then
|
||||
self.magnify_area_size_m = 1.25
|
||||
end
|
||||
|
||||
if self.concentrated_fire then
|
||||
self.concentrated_fire_area_size_m = 0.66
|
||||
self.concentrated_fire_area_dmg_m = 1.5
|
||||
end
|
||||
|
||||
if self.unleash then
|
||||
self.unleash_area_dmg_m = 1
|
||||
self.unleash_area_size_m = 1
|
||||
self.t:every(1, function()
|
||||
self.unleash_area_dmg_m = self.unleash_area_dmg_m + 0.02
|
||||
self.unleash_area_size_m = self.unleash_area_size_m + 0.02
|
||||
end)
|
||||
end
|
||||
|
||||
if self.reinforce then
|
||||
local units = self:get_all_units()
|
||||
local any_enchanter = false
|
||||
for _, unit in ipairs(units) do
|
||||
if table.any(unit.classes, function(v) return v == 'enchanter' end) then
|
||||
any_enchanter = true
|
||||
break
|
||||
end
|
||||
end
|
||||
if any_enchanter then
|
||||
self.reinforce_dmg_m = 1.1
|
||||
self.reinforce_def_m = 1.1
|
||||
self.reinforce_aspd_m = 1.1
|
||||
end
|
||||
end
|
||||
|
||||
if self.payback then
|
||||
self.payback_dmg_m = 1
|
||||
end
|
||||
|
||||
if self.hex_master then
|
||||
self.hex_duration_m = 1.25
|
||||
end
|
||||
|
||||
if self.leader and self.immolation then
|
||||
main.current.t:after(0.1, function()
|
||||
local units = self:get_all_units()
|
||||
local unit_1 = random:table_remove(units)
|
||||
local unit_2 = random:table_remove(units)
|
||||
local unit_3 = random:table_remove(units)
|
||||
print(unit_1, unit_2, unit_3)
|
||||
if unit_1 then unit_1.t:every(2, function() unit_1:hit(0.05*unit_1.max_hp) end) end
|
||||
if unit_2 then unit_2.t:every(2, function() unit_2:hit(0.05*unit_2.max_hp) end) end
|
||||
if unit_3 then unit_3.t:every(2, function() unit_3:hit(0.05*unit_3.max_hp) end) end
|
||||
local units = self:get_all_units()
|
||||
for _, unit in ipairs(units) do
|
||||
unit.immolation_dmg_m = 1
|
||||
unit.t:every(2, function() unit.immolation_dmg_m = unit.immolation_dmg_m + 0.08 end)
|
||||
end
|
||||
end)
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
|
||||
|
@ -555,6 +648,7 @@ function Player:update(dt)
|
|||
if main.current.healer_level == 2 then self.heal_effect_m = 1.3
|
||||
elseif main.current.healer_level == 1 then self.heal_effect_m = 1.15
|
||||
else self.heal_effect_m = 1 end
|
||||
if self.blessing then self.heal_effect_m = self.heal_effect_m*1.2 end
|
||||
|
||||
if table.any(self.classes, function(v) return v == 'nuker' end) then
|
||||
if main.current.nuker_level == 2 then self.nuker_area_size_m = 1.25; self.nuker_area_dmg_m = 1.25
|
||||
|
@ -606,12 +700,14 @@ function Player:update(dt)
|
|||
if main.current.forcer_level == 2 then self.knockback_m = 1.5
|
||||
elseif main.current.forcer_level == 1 then self.knockback_m = 1.25
|
||||
else self.knockback_m = 1 end
|
||||
if self.force_push then self.knockback_m = self.knockback_m*1.25 end
|
||||
|
||||
if table.any(self.classes, function(v) return v == 'voider' end) then
|
||||
if main.current.voider_level == 2 then self.dot_dmg_m = 1.25
|
||||
elseif main.current.voider_level == 1 then self.dot_dmg_m = 1.15
|
||||
else self.dot_dmg_m = 1 end
|
||||
end
|
||||
if self.call_of_the_void then self.dot_dmg_m = self.dot_dmg_m*1.25 end
|
||||
|
||||
if self.ouroboros_technique_l and self.leader then
|
||||
local units = self:get_all_units()
|
||||
|
@ -626,12 +722,16 @@ function Player:update(dt)
|
|||
end
|
||||
end
|
||||
|
||||
if self.berserking and table.any(self.classes, function(v) return v == 'warrior' end) then
|
||||
self.berserking_aspd_m = math.remap(self.hp/self.max_hp, 0, 1, 1.5, 1)
|
||||
end
|
||||
|
||||
self.buff_def_a = (self.warrior_def_a or 0)
|
||||
self.buff_aspd_m = (self.chronomancer_aspd_m or 1)*(self.vagrant_aspd_m or 1)*(self.outlaw_aspd_m or 1)*(self.fairy_aspd_m or 1)*(self.psyker_aspd_m or 1)*(self.chronomancy_aspd_m or 1)*(self.awakening_aspd_m or 1)
|
||||
self.buff_dmg_m = (self.squire_dmg_m or 1)*(self.vagrant_dmg_m or 1)*(self.enchanter_dmg_m or 1)*(self.swordsman_dmg_m or 1)*(self.flagellant_dmg_m or 1)*(self.psyker_dmg_m or 1)*(self.ballista_dmg_m or 1)*(self.ballista_x_dmg_m or 1)*(self.awakening_dmg_m or 1)
|
||||
self.buff_def_m = (self.squire_def_m or 1)*(self.ouroboros_def_m or 1)
|
||||
self.buff_area_size_m = (self.nuker_area_size_m or 1)
|
||||
self.buff_area_dmg_m = (self.nuker_area_dmg_m or 1)*(self.amplify_area_dmg_m or 1)*(self.amplify_x_area_dmg_m or 1)
|
||||
self.buff_aspd_m = (self.chronomancer_aspd_m or 1)*(self.vagrant_aspd_m or 1)*(self.outlaw_aspd_m or 1)*(self.fairy_aspd_m or 1)*(self.psyker_aspd_m or 1)*(self.chronomancy_aspd_m or 1)*(self.awakening_aspd_m or 1)*(self.berserking_aspd_m or 1)*(self.reinforce_aspd_m or 1)
|
||||
self.buff_dmg_m = (self.squire_dmg_m or 1)*(self.vagrant_dmg_m or 1)*(self.enchanter_dmg_m or 1)*(self.swordsman_dmg_m or 1)*(self.flagellant_dmg_m or 1)*(self.psyker_dmg_m or 1)*(self.ballista_dmg_m or 1)*(self.ballista_x_dmg_m or 1)*(self.awakening_dmg_m or 1)*(self.reinforce_dmg_m or 1)*(self.payback_dmg_m or 1)*(self.immolation_dmg_m or 1)
|
||||
self.buff_def_m = (self.squire_def_m or 1)*(self.ouroboros_def_m or 1)*(self.unwavering_stance_def_m or 1)*(self.reinforce_def_m or 1)
|
||||
self.buff_area_size_m = (self.nuker_area_size_m or 1)*(self.magnify_area_size_m or 1)*(self.concentrated_fire_area_size_m or 1)*(self.unleash_area_size_m or 1)
|
||||
self.buff_area_dmg_m = (self.nuker_area_dmg_m or 1)*(self.amplify_area_dmg_m or 1)*(self.amplify_x_area_dmg_m or 1)*(self.concentrated_fire_area_dmg_m or 1)*(self.unleash_area_dmg_m or 1)
|
||||
self.buff_mvspd_m = (self.wall_rider_mvspd_m or 1)*(self.centipede_mvspd_m or 1)
|
||||
self:calculate_stats()
|
||||
|
||||
|
@ -781,6 +881,10 @@ function Player:hit(damage)
|
|||
camera:shake(4, 0.5)
|
||||
main.current.damage_taken = main.current.damage_taken + actual_damage
|
||||
|
||||
if self.payback and table.any(self.classes, function(v) return v == 'enchanter' end) then
|
||||
self.payback_dmg_m = self.payback_dmg_m + 0.05
|
||||
end
|
||||
|
||||
if self.character == 'beastmaster' and self.level == 3 then
|
||||
critter1:play{pitch = random:float(0.95, 1.05), volume = 0.5}
|
||||
trigger:after(0.01, function()
|
||||
|
@ -790,6 +894,14 @@ function Player:hit(damage)
|
|||
end)
|
||||
end
|
||||
|
||||
if self.crucio then
|
||||
local enemies = main.current.main:get_objects_by_classes(main.current.enemies)
|
||||
for _, enemy in ipairs(enemies) do
|
||||
enemy:hit(actual_damage)
|
||||
HitCircle{group = main.current.effects, x = self.x, y = self.y, rs = 6, color = fg[0], duration = 0.1}
|
||||
end
|
||||
end
|
||||
|
||||
local psykeeper = self:get_unit'psykeeper'
|
||||
if psykeeper then
|
||||
psykeeper.stored_heal = psykeeper.stored_heal + actual_damage
|
||||
|
@ -866,6 +978,11 @@ function Player:get_all_units()
|
|||
end
|
||||
|
||||
|
||||
function Player:get_leader()
|
||||
return (self.leader and self) or self.parent
|
||||
end
|
||||
|
||||
|
||||
function Player:get_unit(character)
|
||||
local all_units = self:get_all_units()
|
||||
for _, unit in ipairs(all_units) do
|
||||
|
@ -917,7 +1034,12 @@ function Player:shoot(r, mods)
|
|||
|
||||
local dmg_m = 1
|
||||
local crit = false
|
||||
if self.chance_to_crit and random:bool(self.chance_to_crit) then dmg_m = 4; crit = true end
|
||||
if self.chance_to_crit and random:bool(self.chance_to_crit) then dmg_m = (self.assassination and 8 or 4); crit = true end
|
||||
if self.assassination and table.any(self.classes, function(v) return v == 'rogue' end) then
|
||||
if not crit then
|
||||
dmg_m = 0.5
|
||||
end
|
||||
end
|
||||
|
||||
if crit and mods.spawn_critters_on_crit then
|
||||
critter1:play{pitch = random:float(0.95, 1.05), volume = 0.5}
|
||||
|
@ -1170,6 +1292,10 @@ function Projectile:init(args)
|
|||
self.knockback = 10
|
||||
end
|
||||
end
|
||||
|
||||
if self.parent.flying_daggers and table.any(self.parent.classes, function(v) return v == 'rogue' end) then
|
||||
self.chain = self.chain + 2
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
|
@ -1342,6 +1468,9 @@ function Projectile:on_trigger_enter(other, contact)
|
|||
if self.level == 3 and self.character == 'scout' then
|
||||
self.dmg = self.dmg*1.25
|
||||
end
|
||||
if self.parent.ultimatum then
|
||||
self.dmg = self.dmg*1.25
|
||||
end
|
||||
end
|
||||
end
|
||||
HitCircle{group = main.current.effects, x = self.x, y = self.y, rs = 6, color = fg[0], duration = 0.1}
|
||||
|
@ -1389,7 +1518,7 @@ function Projectile:on_trigger_enter(other, contact)
|
|||
end
|
||||
|
||||
if self.character == 'assassin' then
|
||||
other:apply_dot((self.crit and 4*self.dmg or self.dmg/2)*self.dot_dmg_m*(main.current.chronomancer_dot), 3)
|
||||
other:apply_dot((self.crit and 4*self.dmg or self.dmg/2)*(self.dot_dmg_m or 1)*(main.current.chronomancer_dot), 3)
|
||||
end
|
||||
|
||||
if self.parent.chain_infused then
|
||||
|
@ -1434,6 +1563,12 @@ function Projectile:on_trigger_enter(other, contact)
|
|||
dmg = 0.2*self.parent.area_dmg_m*self.dmg, character = self.character, level = self.level, parent = self}
|
||||
end
|
||||
end
|
||||
|
||||
if self.parent.void_rift and table.any(self.parent.classes, function(v) return v == 'mage' or v == 'nuker' or v == 'voider' end) then
|
||||
if random:bool(20) then
|
||||
DotArea{group = main.current.effects, x = self.x, y = self.y, rs = self.parent.area_size_m*24, color = self.color, dmg = self.parent.area_dmg_m*self.dmg*(self.parent.dot_dmg_m or 1), void_rift = true, duration = 1}
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -1465,7 +1600,7 @@ function Area:init(args)
|
|||
enemy:hit(6*self.dmg + resonance_dmg)
|
||||
elseif self.character == 'launcher' then
|
||||
if self.parent.resonance then resonance_dmg = (self.level == 3 and 6*self.dmg*0.05*#enemies or 2*self.dmg*0.05*#enemies) end
|
||||
enemy:curse('launcher', 4, (self.level == 3 and 6*self.dmg or 2*self.dmg) + resonance_dmg, self.parent)
|
||||
enemy:curse('launcher', 4*(self.hex_duration_m or 1), (self.level == 3 and 6*self.dmg or 2*self.dmg) + resonance_dmg, self.parent)
|
||||
else
|
||||
if self.parent.resonance then resonance_dmg = self.dmg*0.05*#enemies end
|
||||
enemy:hit(self.dmg + resonance_dmg)
|
||||
|
@ -1500,6 +1635,12 @@ function Area:init(args)
|
|||
end
|
||||
end
|
||||
|
||||
if self.parent.void_rift and table.any(self.parent.classes, function(v) return v == 'mage' or v == 'nuker' or v == 'voider' end) then
|
||||
if random:bool(20) then
|
||||
DotArea{group = main.current.effects, x = self.x, y = self.y, rs = self.parent.area_size_m*24, color = self.color, dmg = self.parent.area_dmg_m*self.dmg*(self.parent.dot_dmg_m or 1), void_rift = true, duration = 1}
|
||||
end
|
||||
end
|
||||
|
||||
self.color = fg[0]
|
||||
self.color_transparent = Color(args.color.r, args.color.g, args.color.b, 0.08)
|
||||
self.w = 0
|
||||
|
@ -1552,7 +1693,7 @@ function DotArea:init(args)
|
|||
pyro1:play{pitch = random:float(1.5, 1.8), volume = 0.1}
|
||||
enemy.pyrod = self
|
||||
end
|
||||
enemy:hit(self.dot_dmg_m*self.dmg/5)
|
||||
enemy:hit((self.dot_dmg_m or 1)*self.dmg/5)
|
||||
HitCircle{group = main.current.effects, x = enemy.x, y = enemy.y, rs = 6, color = fg[0], duration = 0.1}
|
||||
for i = 1, 1 do HitParticle{group = main.current.effects, x = enemy.x, y = enemy.y, color = self.color} end
|
||||
for i = 1, 1 do HitParticle{group = main.current.effects, x = enemy.x, y = enemy.y, color = enemy.color} end
|
||||
|
@ -1570,7 +1711,7 @@ function DotArea:init(args)
|
|||
if self.level == 3 then
|
||||
enemy:slow(0.4, 4)
|
||||
end
|
||||
enemy:hit(self.dot_dmg_m*2*self.dmg)
|
||||
enemy:hit((self.dot_dmg_m or 1)*2*self.dmg)
|
||||
HitCircle{group = main.current.effects, x = enemy.x, y = enemy.y, rs = 6, color = fg[0], duration = 0.1}
|
||||
for i = 1, 1 do HitParticle{group = main.current.effects, x = enemy.x, y = enemy.y, color = self.color} end
|
||||
for i = 1, 1 do HitParticle{group = main.current.effects, x = enemy.x, y = enemy.y, color = enemy.color} end
|
||||
|
@ -1586,10 +1727,10 @@ function DotArea:init(args)
|
|||
buff1:play{pitch = random:float(0.8, 1.2), volume = 0.1}
|
||||
end
|
||||
for _, enemy in ipairs(enemies) do
|
||||
enemy:curse('bane', 0.5)
|
||||
enemy:curse('bane', 0.5*(self.hex_duration_m or 1))
|
||||
if self.level == 3 then
|
||||
enemy:slow(0.5, 0.5)
|
||||
enemy:hit(self.dot_dmg_m*self.dmg/2)
|
||||
enemy:hit((self.dot_dmg_m or 1)*self.dmg/2)
|
||||
HitCircle{group = main.current.effects, x = enemy.x, y = enemy.y, rs = 6, color = fg[0], duration = 0.1}
|
||||
for i = 1, 1 do HitParticle{group = main.current.effects, x = enemy.x, y = enemy.y, color = self.color} end
|
||||
for i = 1, 1 do HitParticle{group = main.current.effects, x = enemy.x, y = enemy.y, color = enemy.color} end
|
||||
|
@ -1597,6 +1738,19 @@ function DotArea:init(args)
|
|||
end
|
||||
end, nil, nil, 'dot')
|
||||
end
|
||||
|
||||
elseif self.void_rift then
|
||||
self.t:every(0.2, function()
|
||||
local enemies = main.current.main:get_objects_in_shape(self.shape, main.current.enemies)
|
||||
if #enemies > 0 then self.spring:pull(0.05, 200, 10) end
|
||||
for _, enemy in ipairs(enemies) do
|
||||
hit2:play{pitch = random:float(0.8, 1.2), volume = 0.2}
|
||||
enemy:hit((self.dot_dmg_m or 1)*self.dmg/5)
|
||||
HitCircle{group = main.current.effects, x = enemy.x, y = enemy.y, rs = 6, color = fg[0], duration = 0.1}
|
||||
for i = 1, 1 do HitParticle{group = main.current.effects, x = enemy.x, y = enemy.y, color = self.color} end
|
||||
for i = 1, 1 do HitParticle{group = main.current.effects, x = enemy.x, y = enemy.y, color = enemy.color} end
|
||||
end
|
||||
end, nil, nil, 'dot')
|
||||
end
|
||||
|
||||
self.color = fg[0]
|
||||
|
@ -1613,6 +1767,10 @@ function DotArea:init(args)
|
|||
|
||||
self.vr = 0
|
||||
self.dvr = random:float(-math.pi/4, math.pi/4)
|
||||
|
||||
if self.void_rift then
|
||||
self.dvr = random:table{random:float(-4*math.pi, -2*math.pi), random:float(2*math.pi, 4*math.pi)}
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
|
@ -2014,7 +2172,7 @@ function Critter:init(args)
|
|||
self.t:after(0.5, function() self.invulnerable = false end)
|
||||
|
||||
self.dmg = args.dmg or self.parent.dmg
|
||||
self.hp = 1 + ((main.current.swarmer_level == 2 and 3) or (main.current.swarmer_level == 1 and 1) or 0)
|
||||
self.hp = 1 + ((main.current.swarmer_level == 2 and 3) or (main.current.swarmer_level == 1 and 1) or 0) + (self.parent.spawning_pool and 1 or 0) + (self.parent.hive and 2 or 0)
|
||||
end
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue