Orb update 4/4
parent
97416c5d78
commit
8acbd6b1ae
56
arena.lua
56
arena.lua
|
@ -121,7 +121,7 @@ function Arena:on_enter(from, level, units, passives, shop_level, shop_xp, lock)
|
|||
SpawnEffect{group = self.effects, x = gw/2, y = gh/2, action = function(x, y)
|
||||
spawn1:play{pitch = random:float(0.8, 1.2), volume = 0.15}
|
||||
SpawnMarker{group = self.effects, x = x, y = y}
|
||||
self.t:after(0.75, function()
|
||||
self.t:after(1.125, function()
|
||||
self.boss = Seeker{group = self.main, x = x, y = y, character = 'seeker', level = self.level, boss = level_to_boss[self.level]}
|
||||
end)
|
||||
end}
|
||||
|
@ -141,7 +141,7 @@ function Arena:on_enter(from, level, units, passives, shop_level, shop_xp, lock)
|
|||
local spawn_points = {left = {x = self.x1 + 32, y = gh/2}, middle = {x = gw/2, y = gh/2}, right = {x = self.x2 - 32, y = gh/2}}
|
||||
local p = spawn_points[spawn_type]
|
||||
SpawnMarker{group = self.effects, x = p.x, y = p.y}
|
||||
self.t:after(0.75, function() self:spawn_n_enemies(p, nil, 8 + math.floor(self.level/2)) end)
|
||||
self.t:after(1.125, function() self:spawn_n_enemies(p, nil, 8 + math.floor(self.level/2)) end)
|
||||
end)
|
||||
end)
|
||||
end)
|
||||
|
@ -182,8 +182,8 @@ function Arena:on_enter(from, level, units, passives, shop_level, shop_xp, lock)
|
|||
2, 3, 4,
|
||||
3, 4, 4, 5,
|
||||
5, 5, 5, 5, 7,
|
||||
6, 6, 7, 7, 7, 10,
|
||||
6, 8, 10, 12, 14, 16, 25,
|
||||
6, 6, 7, 7, 8, 10,
|
||||
8, 8, 10, 12, 14, 16, 25,
|
||||
}
|
||||
self.level_to_distributed_enemies_chance = {
|
||||
0, 5, 10,
|
||||
|
@ -224,7 +224,7 @@ function Arena:on_enter(from, level, units, passives, shop_level, shop_xp, lock)
|
|||
local spawn_points = {left = {x = self.x1 + 32, y = gh/2}, middle = {x = gw/2, y = gh/2}, right = {x = self.x2 - 32, y = gh/2}}
|
||||
local p = spawn_points[spawn_type]
|
||||
SpawnMarker{group = self.effects, x = p.x, y = p.y}
|
||||
self.t:after(0.75, function() self:spawn_n_enemies(p, nil, 8 + (self.wave-1)*2) end)
|
||||
self.t:after(1.125, function() self:spawn_n_enemies(p, nil, 8 + (self.wave-1)*2) end)
|
||||
end
|
||||
end)
|
||||
end, self.max_waves+1)
|
||||
|
@ -299,24 +299,24 @@ function Arena:on_enter(from, level, units, passives, shop_level, shop_xp, lock)
|
|||
self.t:after({0, 0.2}, function()
|
||||
local p = random:table_remove(spawn_points)
|
||||
SpawnMarker{group = self.effects, x = p.x, y = p.y}
|
||||
self.t:after(0.75, function() self:spawn_n_enemies(p, 1, math.floor(n/4), true) end)
|
||||
self.t:after(1.125, function() self:spawn_n_enemies(p, 1, math.floor(n/4), true) end)
|
||||
end)
|
||||
self.t:after({0, 0.2}, function()
|
||||
local p = random:table_remove(spawn_points)
|
||||
SpawnMarker{group = self.effects, x = p.x, y = p.y}
|
||||
self.t:after(0.75, function() self:spawn_n_enemies(p, 2, math.floor(n/4), true) end)
|
||||
self.t:after(1.125, function() self:spawn_n_enemies(p, 2, math.floor(n/4), true) end)
|
||||
end)
|
||||
self.t:after({0, 0.2}, function()
|
||||
local p = random:table_remove(spawn_points)
|
||||
SpawnMarker{group = self.effects, x = p.x, y = p.y}
|
||||
self.t:after(0.75, function() self:spawn_n_enemies(p, 3, math.floor(n/4), true) end)
|
||||
self.t:after(1.125, function() self:spawn_n_enemies(p, 3, math.floor(n/4), true) end)
|
||||
end)
|
||||
self.t:after({0, 0.2}, function()
|
||||
local p = random:table_remove(spawn_points)
|
||||
SpawnMarker{group = self.effects, x = p.x, y = p.y}
|
||||
self.t:after(0.75, function() self:spawn_n_enemies(p, 4, math.floor(n/4), true) end)
|
||||
self.t:after(1.125, function() self:spawn_n_enemies(p, 4, math.floor(n/4), true) end)
|
||||
end)
|
||||
self.t:after(0.75 + math.floor(n/4)*0.25, function() self.spawning_enemies = false end, 'spawning_enemies')
|
||||
self.t:after(1.125 + math.floor(n/4)*0.25, function() self.spawning_enemies = false end, 'spawning_enemies')
|
||||
self.enemy_spawns_prevented = 0
|
||||
end)
|
||||
end
|
||||
|
@ -945,22 +945,22 @@ function Arena:spawn_distributed_enemies()
|
|||
if spawn_type == '4' then
|
||||
local p = random:table_remove(spawn_points)
|
||||
SpawnMarker{group = self.effects, x = p.x, y = p.y}
|
||||
self.t:after(0.75, function()
|
||||
self.t:after(1.125, function()
|
||||
self:spawn_n_enemies(p)
|
||||
end)
|
||||
self.t:after(1.5, function() self.spawning_enemies = false end, 'spawning_enemies')
|
||||
self.t:after(2.25, function() self.spawning_enemies = false end, 'spawning_enemies')
|
||||
elseif spawn_type == '4+4' then
|
||||
local p = random:table_remove(spawn_points)
|
||||
SpawnMarker{group = self.effects, x = p.x, y = p.y}
|
||||
self.t:after(0.75, function()
|
||||
self.t:after(1.125, function()
|
||||
self:spawn_n_enemies(p)
|
||||
self.t:after(2, function() self:spawn_n_enemies(p) end)
|
||||
end)
|
||||
self.t:after(3.5, function() self.spawning_enemies = false end, 'spawning_enemies')
|
||||
self.t:after(4.25, function() self.spawning_enemies = false end, 'spawning_enemies')
|
||||
elseif spawn_type == '4+4+4' then
|
||||
local p = random:table_remove(spawn_points)
|
||||
SpawnMarker{group = self.effects, x = p.x, y = p.y}
|
||||
self.t:after(0.75, function()
|
||||
self.t:after(1.125, function()
|
||||
self:spawn_n_enemies(p)
|
||||
self.t:after(1, function()
|
||||
self:spawn_n_enemies(p)
|
||||
|
@ -969,58 +969,58 @@ function Arena:spawn_distributed_enemies()
|
|||
end)
|
||||
end)
|
||||
end)
|
||||
self.t:after(3.5, function() self.spawning_enemies = false end, 'spawning_enemies')
|
||||
self.t:after(4.25, function() self.spawning_enemies = false end, 'spawning_enemies')
|
||||
elseif spawn_type == '2x4' then
|
||||
self.t:after({0, 0.2}, function()
|
||||
local p = random:table_remove(spawn_points)
|
||||
SpawnMarker{group = self.effects, x = p.x, y = p.y}
|
||||
self.t:after(0.75, function() self:spawn_n_enemies(p, 1) end)
|
||||
self.t:after(1.125, function() self:spawn_n_enemies(p, 1) end)
|
||||
end)
|
||||
self.t:after({0, 0.2}, function()
|
||||
local p = random:table_remove(spawn_points)
|
||||
SpawnMarker{group = self.effects, x = p.x, y = p.y}
|
||||
self.t:after(0.75, function() self:spawn_n_enemies(p, 2) end)
|
||||
self.t:after(1.125, function() self:spawn_n_enemies(p, 2) end)
|
||||
end)
|
||||
self.t:after(1.5, function() self.spawning_enemies = false end, 'spawning_enemies')
|
||||
self.t:after(2.25, function() self.spawning_enemies = false end, 'spawning_enemies')
|
||||
elseif spawn_type == '3x4' then
|
||||
self.t:after({0, 0.2}, function()
|
||||
local p = random:table_remove(spawn_points)
|
||||
SpawnMarker{group = self.effects, x = p.x, y = p.y}
|
||||
self.t:after(0.75, function() self:spawn_n_enemies(p, 1) end)
|
||||
self.t:after(1.125, function() self:spawn_n_enemies(p, 1) end)
|
||||
end)
|
||||
self.t:after({0, 0.2}, function()
|
||||
local p = random:table_remove(spawn_points)
|
||||
SpawnMarker{group = self.effects, x = p.x, y = p.y}
|
||||
self.t:after(0.75, function() self:spawn_n_enemies(p, 2) end)
|
||||
self.t:after(1.125, function() self:spawn_n_enemies(p, 2) end)
|
||||
end)
|
||||
self.t:after({0, 0.2}, function()
|
||||
local p = random:table_remove(spawn_points)
|
||||
SpawnMarker{group = self.effects, x = p.x, y = p.y}
|
||||
self.t:after(0.75, function() self:spawn_n_enemies(p, 3) end)
|
||||
self.t:after(1.125, function() self:spawn_n_enemies(p, 3) end)
|
||||
end)
|
||||
self.t:after(1.5, function() self.spawning_enemies = false end, 'spawning_enemies')
|
||||
self.t:after(2.25, function() self.spawning_enemies = false end, 'spawning_enemies')
|
||||
elseif spawn_type == '4x2' then
|
||||
self.t:after({0, 0.2}, function()
|
||||
local p = random:table_remove(spawn_points)
|
||||
SpawnMarker{group = self.effects, x = p.x, y = p.y}
|
||||
self.t:after(0.75, function() self:spawn_n_enemies(p, 1, 2) end)
|
||||
self.t:after(1.125, function() self:spawn_n_enemies(p, 1, 2) end)
|
||||
end)
|
||||
self.t:after({0, 0.2}, function()
|
||||
local p = random:table_remove(spawn_points)
|
||||
SpawnMarker{group = self.effects, x = p.x, y = p.y}
|
||||
self.t:after(0.75, function() self:spawn_n_enemies(p, 2, 2) end)
|
||||
self.t:after(1.125, function() self:spawn_n_enemies(p, 2, 2) end)
|
||||
end)
|
||||
self.t:after({0, 0.2}, function()
|
||||
local p = random:table_remove(spawn_points)
|
||||
SpawnMarker{group = self.effects, x = p.x, y = p.y}
|
||||
self.t:after(0.75, function() self:spawn_n_enemies(p, 3, 2) end)
|
||||
self.t:after(1.125, function() self:spawn_n_enemies(p, 3, 2) end)
|
||||
end)
|
||||
self.t:after({0, 0.2}, function()
|
||||
local p = random:table_remove(spawn_points)
|
||||
SpawnMarker{group = self.effects, x = p.x, y = p.y}
|
||||
self.t:after(0.75, function() self:spawn_n_enemies(p, 4, 2) end)
|
||||
self.t:after(1.125, function() self:spawn_n_enemies(p, 4, 2) end)
|
||||
end)
|
||||
self.t:after(1.5, function() self.spawning_enemies = false end, 'spawning_enemies')
|
||||
self.t:after(2.25, function() self.spawning_enemies = false end, 'spawning_enemies')
|
||||
end
|
||||
end
|
||||
|
||||
|
|
Binary file not shown.
After Width: | Height: | Size: 6.1 KiB |
|
@ -67,7 +67,7 @@ function BuyScreen:on_enter(from, level, units, passives, shop_level, shop_xp)
|
|||
self:set_items()
|
||||
|
||||
self.shop_text = Text({{text = '[wavy_mid, fg]shop [fg]- gold: [yellow]' .. gold, font = pixul_font, alignment = 'center'}}, global_text_tags)
|
||||
self.party_text = Text({{text = '[wavy_mid, fg]party', font = pixul_font, alignment = 'center'}}, global_text_tags)
|
||||
self.party_text = Text({{text = '[wavy_mid, fg]party ' .. tostring(#units) .. '/' .. tostring(max_units), font = pixul_font, alignment = 'center'}}, global_text_tags)
|
||||
self.sets_text = Text({{text = '[wavy_mid, fg]classes', font = pixul_font, alignment = 'center'}}, global_text_tags)
|
||||
self.items_text = Text({{text = '[wavy_mid, fg]items', font = pixul_font, alignment = 'center'}}, global_text_tags)
|
||||
self.ng_text = Text({{text = '[fg]NG+' .. current_new_game_plus, font = pixul_font, alignment = 'center'}}, global_text_tags)
|
||||
|
@ -81,7 +81,7 @@ function BuyScreen:on_enter(from, level, units, passives, shop_level, shop_xp)
|
|||
RerollButton{group = self.main, x = 150, y = 18, parent = self}
|
||||
GoButton{group = self.main, x = gw - 90, y = gh - 20, parent = self}
|
||||
LevelButton{group = self.main, x = gw/2, y = 18, parent = self}
|
||||
self.tutorial_button = Button{group = self.main, x = gw/2 + 134, y = 18, button_text = '?', fg_color = 'bg10', bg_color = 'bg', action = function()
|
||||
self.tutorial_button = Button{group = self.main, x = gw/2 + 129, y = 18, button_text = '?', fg_color = 'bg10', bg_color = 'bg', action = function()
|
||||
self.in_tutorial = true
|
||||
self.title_text = Text2{group = self.tutorial, x = gw/2, y = 35, lines = {{text = '[fg]WELCOME TO SNKRX!', font = fat_font, alignment = 'center'}}}
|
||||
self.tutorial_text = Text2{group = self.tutorial, x = 228, y = 160, lines = {
|
||||
|
@ -128,7 +128,7 @@ function BuyScreen:on_enter(from, level, units, passives, shop_level, shop_xp)
|
|||
b.info_text = nil
|
||||
end}
|
||||
|
||||
self.restart_button = Button{group = self.ui, x = gw/2 + 156, y = 18, force_update = true, button_text = 'R', fg_color = 'bg10', bg_color = 'bg', action = function(b)
|
||||
self.restart_button = Button{group = self.ui, x = gw/2 + 148, y = 18, force_update = true, button_text = 'R', fg_color = 'bg10', bg_color = 'bg', action = function(b)
|
||||
self.transitioning = true
|
||||
ui_transition2:play{pitch = random:float(0.95, 1.05), volume = 0.5}
|
||||
ui_switch2:play{pitch = random:float(0.95, 1.05), volume = 0.5}
|
||||
|
@ -933,7 +933,7 @@ function RerollButton:init(args)
|
|||
self.free_reroll = true
|
||||
self.text = Text({{text = '[bg10]reroll: [yellow]0', font = pixul_font, alignment = 'center'}}, global_text_tags)
|
||||
else
|
||||
self.text = Text({{text = '[bg10]reroll: [yellow]8', font = pixul_font, alignment = 'center'}}, global_text_tags)
|
||||
self.text = Text({{text = '[bg10]reroll: [yellow]5', font = pixul_font, alignment = 'center'}}, global_text_tags)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
@ -966,7 +966,7 @@ function RerollButton:update(dt)
|
|||
system.save_run(self.parent.level, gold, self.parent.units, self.parent.passives, self.parent.shop_level, self.parent.shop_xp, run_passive_pool, locked_state)
|
||||
end
|
||||
elseif self.parent:is(Arena) then
|
||||
if gold < 8 and not self.free_reroll then
|
||||
if gold < 5 and not self.free_reroll then
|
||||
self.spring:pull(0.2, 200, 10)
|
||||
self.selected = true
|
||||
error1:play{pitch = random:float(0.95, 1.05), volume = 0.5}
|
||||
|
@ -983,10 +983,10 @@ function RerollButton:update(dt)
|
|||
self.parent:set_passives(true)
|
||||
self.selected = true
|
||||
self.spring:pull(0.2, 200, 10)
|
||||
if not self.free_reroll then gold = gold - 8 end
|
||||
if not self.free_reroll then gold = gold - 5 end
|
||||
self.parent.shop_text:set_text{{text = '[fg, nudge_down]gold: [yellow, nudge_down]' .. gold, font = pixul_font, alignment = 'center'}}
|
||||
self.free_reroll = false
|
||||
self.text = Text({{text = '[bg10]reroll: [yellow]8', font = pixul_font, alignment = 'center'}}, global_text_tags)
|
||||
self.text = Text({{text = '[bg10]reroll: [yellow]5', font = pixul_font, alignment = 'center'}}, global_text_tags)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
@ -1015,7 +1015,7 @@ function RerollButton:on_mouse_enter()
|
|||
if self.free_reroll then
|
||||
self.text:set_text{{text = '[fgm5]reroll: 0', font = pixul_font, alignment = 'center'}}
|
||||
else
|
||||
self.text:set_text{{text = '[fgm5]reroll: 8', font = pixul_font, alignment = 'center'}}
|
||||
self.text:set_text{{text = '[fgm5]reroll: 5', font = pixul_font, alignment = 'center'}}
|
||||
end
|
||||
end
|
||||
self.spring:pull(0.2, 200, 10)
|
||||
|
@ -1029,7 +1029,7 @@ function RerollButton:on_mouse_exit()
|
|||
if self.free_reroll then
|
||||
self.text:set_text{{text = '[fgm5]reroll: [yellow]0', font = pixul_font, alignment = 'center'}}
|
||||
else
|
||||
self.text:set_text{{text = '[fgm5]reroll: [yellow]8', font = pixul_font, alignment = 'center'}}
|
||||
self.text:set_text{{text = '[fgm5]reroll: [yellow]5', font = pixul_font, alignment = 'center'}}
|
||||
end
|
||||
end
|
||||
self.selected = false
|
||||
|
@ -1696,7 +1696,10 @@ function CharacterIcon:on_mouse_enter()
|
|||
self.info_text:activate({
|
||||
{text = '[' .. character_color_strings[self.character] .. ']' .. self.character:capitalize() .. '[fg] - cost: [yellow]' .. self.parent.cost, font = pixul_font, alignment = 'center', height_multiplier = 1.25},
|
||||
{text = '[fg]Classes: ' .. character_class_strings[self.character], font = pixul_font, alignment = 'center', height_multiplier = 1.25},
|
||||
{text = character_descriptions[self.character](1), font = pixul_font, alignment = 'center'},
|
||||
{text = character_descriptions[self.character](1), font = pixul_font, alignment = 'center', height_multiplier = 2},
|
||||
{text = '[' .. (self.level == 3 and 'yellow' or 'light_bg') .. ']Lv.3 [' .. (self.level == 3 and 'fg' or 'light_bg') .. ']Effect - ' ..
|
||||
(self.level == 3 and character_effect_names[self.character] or character_effect_names_gray[self.character]), font = pixul_font, alignment = 'center', height_multiplier = 1.25},
|
||||
{text = (self.level == 3 and character_effect_descriptions[self.character]() or character_effect_descriptions_gray[self.character]()), font = pixul_font, alignment = 'center'},
|
||||
-- {text = character_stats[self.character](1), font = pixul_font, alignment = 'center'},
|
||||
}, nil, nil, nil, nil, 16, 4, nil, 2)
|
||||
self.info_text.x, self.info_text.y = gw/2, gh/2 + 10
|
||||
|
|
67
enemies.lua
67
enemies.lua
|
@ -16,7 +16,7 @@ function Seeker:init(args)
|
|||
if self.boss == 'speed_booster' then
|
||||
self.color = green[0]:clone()
|
||||
self.t:every(8, function()
|
||||
if self.silenced then return end
|
||||
if self.silenced or self.barbarian_stunned then return end
|
||||
local enemies = table.head(self:get_objects_in_shape(Circle(self.x, self.y, 128), main.current.enemies), 4)
|
||||
if #enemies > 0 then
|
||||
buff1:play{pitch = random:float(0.95, 1.05), volume = 0.5}
|
||||
|
@ -31,7 +31,7 @@ function Seeker:init(args)
|
|||
elseif self.boss == 'forcer' then
|
||||
self.color = yellow[0]:clone()
|
||||
self.t:every(6, function()
|
||||
if self.silenced then return end
|
||||
if self.silenced or self.barbarian_stunned then return end
|
||||
local enemies = main.current.main:get_objects_by_classes(main.current.enemies)
|
||||
local x, y = 0, 0
|
||||
if #enemies > 0 then
|
||||
|
@ -78,7 +78,7 @@ function Seeker:init(args)
|
|||
elseif self.boss == 'swarmer' then
|
||||
self.color = purple[0]:clone()
|
||||
self.t:every(4, function()
|
||||
if self.silenced then return end
|
||||
if self.silenced or self.barbarian_stunned then return end
|
||||
local enemies = table.select(main.current.main:get_objects_by_classes(main.current.enemies), function(v) return v.id ~= self.id and v:is(Seeker) end)
|
||||
local enemy = random:table(enemies)
|
||||
if enemy then
|
||||
|
@ -94,23 +94,22 @@ function Seeker:init(args)
|
|||
elseif self.boss == 'exploder' then
|
||||
self.color = blue[0]:clone()
|
||||
self.t:every(4, function()
|
||||
if self.silenced then return end
|
||||
if self.silenced or self.barbarian_stunned then return end
|
||||
local enemies = table.select(main.current.main:get_objects_by_classes(main.current.enemies), function(v) return v.id ~= self.id and v:is(Seeker) end)
|
||||
local enemy = random:table(enemies)
|
||||
if enemy then
|
||||
HitCircle{group = main.current.effects, x = self.x, y = self.y, rs = 6, color = blue[0], duration = 0.1}
|
||||
LightningLine{group = main.current.effects, src = self, dst = enemy, color = blue[0]}
|
||||
enemy:hit(10000)
|
||||
shoot1:play{pitch = random:float(0.95, 1.05), volume = 0.4}
|
||||
local n = math.floor(8 + current_new_game_plus*1.5)
|
||||
for i = 1, n do EnemyProjectile{group = main.current.main, x = enemy.x, y = enemy.y, color = blue[0], r = (i-1)*math.pi/(n/2), v = 120 + 5*enemy.level, dmg = (1 + 0.1*current_new_game_plus)*enemy.dmg} end
|
||||
mine1:play{pitch = random:float(0.95, 1.05), volume = 0.5}
|
||||
ExploderMine{group = main.current.main, x = enemy.x, y = enemy.y, color = blue[0], parent = enemy}
|
||||
end
|
||||
end)
|
||||
|
||||
elseif self.boss == 'randomizer' then
|
||||
self.t:every_immediate(0.07, function() self.color = _G[random:table{'green', 'purple', 'yellow', 'blue'}][0]:clone() end)
|
||||
self.t:every(6, function()
|
||||
if self.silenced then return end
|
||||
if self.silenced or self.barbarian_stunned then return end
|
||||
local attack = random:table{'explode', 'swarm', 'force', 'speed_boost'}
|
||||
if attack == 'explode' then
|
||||
local enemies = self:get_objects_in_shape(Circle(self.x, self.y, 128), {Seeker})
|
||||
|
@ -121,7 +120,7 @@ function Seeker:init(args)
|
|||
enemy:hit(10000)
|
||||
shoot1:play{pitch = random:float(0.95, 1.05), volume = 0.4}
|
||||
local n = 8 + current_new_game_plus*2
|
||||
for i = 1, n do EnemyProjectile{group = main.current.main, x = enemy.x, y = enemy.y, color = blue[0], r = (i-1)*math.pi/(n/2), v = 125 + 5*enemy.level, dmg = (1 + 0.2*current_new_game_plus)*enemy.dmg} end
|
||||
for i = 1, n do EnemyProjectile{group = main.current.main, x = enemy.x, y = enemy.y, color = blue[0], r = (i-1)*math.pi/(n/2), v = 125 + 5*enemy.level, dmg = (1 + 0.15*current_new_game_plus)*enemy.dmg} end
|
||||
end
|
||||
elseif attack == 'swarm' then
|
||||
local enemies = self:get_objects_in_shape(Circle(self.x, self.y, 128), {Seeker})
|
||||
|
@ -189,7 +188,7 @@ function Seeker:init(args)
|
|||
self.last_headbutt_time = 0
|
||||
local n = math.remap(current_new_game_plus, 0, 5, 1, 0.5)
|
||||
self.t:every(function() return math.distance(self.x, self.y, main.current.player.x, main.current.player.y) < 76 and love.timer.getTime() - self.last_headbutt_time > 10*n end, function()
|
||||
if self.silenced then return end
|
||||
if self.silenced or self.barbarian_stunned then return end
|
||||
if self.headbutt_charging or self.headbutting then return end
|
||||
self.headbutt_charging = true
|
||||
self.t:tween(2, self.color, {r = fg[0].r, b = fg[0].b, g = fg[0].g}, math.cubic_in_out, function()
|
||||
|
@ -212,12 +211,12 @@ function Seeker:init(args)
|
|||
self.hp = self.max_hp
|
||||
local n = math.remap(current_new_game_plus, 0, 5, 1, 0.75)
|
||||
self.t:every({3*n, 5*n}, function()
|
||||
local enemy = self:get_closest_object_in_shape(Circle(self.x, self.y, 128), main.current.enemies)
|
||||
local enemy = self:get_closest_object_in_shape(Circle(self.x, self.y, 64), main.current.enemies)
|
||||
if enemy then
|
||||
wizard1:play{pitch = random:float(0.95, 1.05), volume = 0.5}
|
||||
HitCircle{group = main.current.effects, x = self.x, y = self.y, rs = 6, color = yellow[0], duration = 0.1}
|
||||
LightningLine{group = main.current.effects, src = self, dst = enemy, color = yellow[0]}
|
||||
enemy:push(random:float(40, 80), enemy:angle_to_object(main.current.player), true)
|
||||
enemy:push(random:float(30, 50), enemy:angle_to_object(main.current.player), true)
|
||||
end
|
||||
end)
|
||||
elseif self.shooter then
|
||||
|
@ -226,7 +225,7 @@ function Seeker:init(args)
|
|||
self.t:after({2*n, 4*n}, function()
|
||||
self.shooting = true
|
||||
self.t:every({4, 6}, function()
|
||||
if self.silenced then return end
|
||||
if self.silenced or self.barbarian_stunned then return end
|
||||
for i = 1, 3 do
|
||||
self.t:after((1 - self.level*0.01)*0.15*(i-1), function()
|
||||
shoot1:play{pitch = random:float(0.95, 1.05), volume = 0.1}
|
||||
|
@ -234,7 +233,7 @@ function Seeker:init(args)
|
|||
local r = self.r
|
||||
HitCircle{group = main.current.effects, x = self.x + 0.8*self.shape.w*math.cos(r), y = self.y + 0.8*self.shape.w*math.sin(r), rs = 6}
|
||||
EnemyProjectile{group = main.current.main, x = self.x + 1.6*self.shape.w*math.cos(r), y = self.y + 1.6*self.shape.w*math.sin(r), color = fg[0], r = r, v = 140 + 3.5*self.level + 2*current_new_game_plus,
|
||||
dmg = (current_new_game_plus*0.1 + 1)*self.dmg, source = 'shooter'}
|
||||
dmg = (current_new_game_plus*0.05 + 1)*self.dmg, source = 'shooter'}
|
||||
end)
|
||||
end
|
||||
end, nil, nil, 'shooter')
|
||||
|
@ -498,7 +497,7 @@ function Seeker:hit(damage, projectile, dot)
|
|||
end
|
||||
|
||||
if self.speed_booster then
|
||||
if self.silenced then return end
|
||||
if self.silenced or self.barbarian_stunned then return end
|
||||
local enemies = self:get_objects_in_shape(self.area_sensor, main.current.enemies)
|
||||
if #enemies > 0 then
|
||||
buff1:play{pitch = random:float(0.95, 1.05), volume = 0.5}
|
||||
|
@ -511,7 +510,7 @@ function Seeker:hit(damage, projectile, dot)
|
|||
end
|
||||
|
||||
if self.exploder then
|
||||
if self.silenced then return end
|
||||
if self.silenced or self.barbarian_stunned then return end
|
||||
mine1:play{pitch = random:float(0.95, 1.05), volume = 0.5}
|
||||
trigger:after(0.01, function()
|
||||
ExploderMine{group = main.current.main, x = self.x, y = self.y, color = blue[0], parent = self}
|
||||
|
@ -519,7 +518,7 @@ function Seeker:hit(damage, projectile, dot)
|
|||
end
|
||||
|
||||
if self.spawner then
|
||||
if self.silenced then return end
|
||||
if self.silenced or self.barbarian_stunned then return end
|
||||
critter1:play{pitch = random:float(0.95, 1.05), volume = 0.35}
|
||||
trigger:after(0.01, function()
|
||||
for i = 1, random:int(5, 8) do
|
||||
|
@ -609,11 +608,6 @@ end
|
|||
|
||||
|
||||
function Seeker:curse(curse, duration, arg1, arg2, arg3)
|
||||
local curse_m = 1
|
||||
if main.current.curser_level == 2 then curse_m = 1.5
|
||||
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
|
||||
|
@ -633,7 +627,7 @@ function Seeker:curse(curse, duration, arg1, arg2, arg3)
|
|||
|
||||
buff1:play{pitch = random:float(0.65, 0.75), volume = 0.25}
|
||||
if curse == 'launcher' then
|
||||
self.t:after(duration*curse_m, function()
|
||||
self.t:after(duration, function()
|
||||
self.launcher_push = arg1
|
||||
self.launcher = arg2
|
||||
self:push(random:float(50, 75)*self.launcher.knockback_m, random:table{0, math.pi, math.pi/2, -math.pi/2})
|
||||
|
@ -642,20 +636,20 @@ function Seeker:curse(curse, duration, arg1, arg2, arg3)
|
|||
self.jester_cursed = true
|
||||
self.jester_lvl3 = arg1
|
||||
self.jester_ref = arg2
|
||||
self.t:after(duration*curse_m, function() self.jester_cursed = false end, 'jester_curse')
|
||||
self.t:after(duration, function() self.jester_cursed = false end, 'jester_curse')
|
||||
elseif curse == 'bane' then
|
||||
self.bane_cursed = true
|
||||
self.bane_lvl3 = arg1
|
||||
self.bane_ref = arg2
|
||||
self.t:after(duration*curse_m, function() self.bane_cursed = false end, 'bane_curse')
|
||||
self.t:after(duration, function() self.bane_cursed = false end, 'bane_curse')
|
||||
elseif curse == 'infestor' then
|
||||
self.infested = arg1
|
||||
self.infested_dmg = arg2
|
||||
self.infested_ref = arg3
|
||||
self.t:after(duration*curse_m, function() self.infested = false end, 'infestor_curse')
|
||||
self.t:after(duration, function() self.infested = false end, 'infestor_curse')
|
||||
elseif curse == 'silencer' then
|
||||
self.silenced = true
|
||||
self.t:after(duration*curse_m, function() self.silenced = false end, 'silencer_curse')
|
||||
self.t:after(duration, function() self.silenced = false end, 'silencer_curse')
|
||||
elseif curse == 'usurer' then
|
||||
if arg1 then
|
||||
self.usurer_count = self.usurer_count + 1
|
||||
|
@ -703,13 +697,11 @@ function ExploderMine:init(args)
|
|||
HitCircle{group = main.current.effects, x = self.x, y = self.y}
|
||||
local n = math.floor(8 + current_new_game_plus*1.5)
|
||||
for i = 1, n do
|
||||
EnemyProjectile{group = main.current.main, x = self.x, y = self.y, color = blue[0], r = (i-1)*math.pi/(n/2), v = 120 + 5*self.parent.level, dmg = 1.5*self.parent.dmg}
|
||||
EnemyProjectile{group = main.current.main, x = self.x, y = self.y, color = blue[0], r = (i-1)*math.pi/(n/2), v = 120 + 5*self.parent.level, dmg = 1.3*self.parent.dmg}
|
||||
end
|
||||
self.dead = true
|
||||
end, 'mine_count')
|
||||
end)
|
||||
--[[
|
||||
]]--
|
||||
end
|
||||
|
||||
|
||||
|
@ -856,11 +848,6 @@ end
|
|||
|
||||
|
||||
function EnemyCritter:curse(curse, duration, arg1, arg2, arg3)
|
||||
local curse_m = 1
|
||||
if main.current.curser_level == 2 then curse_m = 1.5
|
||||
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
|
||||
|
@ -873,7 +860,7 @@ function EnemyCritter:curse(curse, duration, arg1, arg2, arg3)
|
|||
end
|
||||
|
||||
if curse == 'launcher' then
|
||||
self.t:after(duration*curse_m, function()
|
||||
self.t:after(duration, function()
|
||||
self.launcher_push = arg1
|
||||
self.launcher = arg2
|
||||
self:push(random:float(50, 75)*self.launcher.knockback_m, random:table{0, math.pi, math.pi/2, -math.pi/2})
|
||||
|
@ -882,20 +869,20 @@ function EnemyCritter:curse(curse, duration, arg1, arg2, arg3)
|
|||
self.jester_cursed = true
|
||||
self.jester_lvl3 = arg1
|
||||
self.jester_ref = arg2
|
||||
self.t:after(duration*curse_m, function() self.jester_cursed = false end, 'jester_curse')
|
||||
self.t:after(duration, function() self.jester_cursed = false end, 'jester_curse')
|
||||
elseif curse == 'bane' then
|
||||
self.bane_cursed = true
|
||||
self.bane_lvl3 = arg1
|
||||
self.bane_ref = arg2
|
||||
self.t:after(duration*curse_m, function() self.bane_cursed = false end, 'bane_curse')
|
||||
self.t:after(duration, function() self.bane_cursed = false end, 'bane_curse')
|
||||
elseif curse == 'infestor' then
|
||||
self.infested = arg1
|
||||
self.infested_dmg = arg2
|
||||
self.infested_ref = arg3
|
||||
self.t:after(duration*curse_m, function() self.infested = false end, 'infestor_curse')
|
||||
self.t:after(duration, function() self.infested = false end, 'infestor_curse')
|
||||
elseif curse == 'silencer' then
|
||||
self.silenced = true
|
||||
self.t:after(duration*curse_m, function() self.silenced = false end, 'silencer_curse')
|
||||
self.t:after(duration, function() self.silenced = false end, 'silencer_curse')
|
||||
elseif curse == 'usurer' then
|
||||
if arg1 then
|
||||
self.usurer_count = self.usurer_count + 1
|
||||
|
|
40
main.lua
40
main.lua
|
@ -943,7 +943,7 @@ function init()
|
|||
['nuker'] = function(lvl) return '[' .. ylb1(lvl) .. ']3[light_bg]/[' .. ylb2(lvl) .. ']6 [fg]- [' .. ylb1(lvl) .. ']+15%[light_bg]/[' .. ylb2(lvl) .. ']+25% [fg]area damage and size to allied nukers' end,
|
||||
['conjurer'] = function(lvl) return '[' .. ylb1(lvl) .. ']2[light_bg]/[' .. ylb2(lvl) .. ']4 [fg]- [' .. ylb1(lvl) .. ']+25%[light_bg]/[' .. ylb2(lvl) .. ']+50% [fg]summon damage and duration' end,
|
||||
['psyker'] = function(lvl) return '[fg]create a piercing, damaging orb around each psyker' end,
|
||||
['curser'] = function(lvl) return '[' .. ylb1(lvl) .. ']2[light_bg]/[' .. ylb2(lvl) .. ']4 [fg]- [' .. ylb1(lvl) .. ']+25%[light_bg]/[' .. ylb2(lvl) .. ']+50% [fg]curse duration' end,
|
||||
['curser'] = function(lvl) return '[' .. ylb1(lvl) .. ']2[light_bg]/[' .. ylb2(lvl) .. ']4 [fg]- [' .. ylb1(lvl) .. ']+1[light_bg]/[' .. ylb2(lvl) .. ']+3 [fg]max curse targets to allied cursers' end,
|
||||
['forcer'] = function(lvl) return '[' .. ylb1(lvl) .. ']2[light_bg]/[' .. ylb2(lvl) .. ']4 [fg]- [' .. ylb1(lvl) .. ']+25%[light_bg]/[' .. ylb2(lvl) .. ']+50% [fg]knockback force to all allies' end,
|
||||
['swarmer'] = function(lvl) return '[' .. ylb1(lvl) .. ']2[light_bg]/[' .. ylb2(lvl) .. ']4 [fg]- [' .. ylb1(lvl) .. ']+1[light_bg]/[' .. ylb2(lvl) .. ']+3 [fg]hits to critters' end,
|
||||
['voider'] = function(lvl) return '[' .. ylb1(lvl) .. ']2[light_bg]/[' .. ylb2(lvl) .. ']4 [fg]- [' .. ylb1(lvl) .. ']+20%[light_bg]/[' .. ylb2(lvl) .. ']+40% [fg]damage over time to allied voiders' end,
|
||||
|
@ -1246,13 +1246,13 @@ function init()
|
|||
['magnify'] = '[yellow]+20/35/50%[fg] area size',
|
||||
['echo_barrage'] = '[yellow]10/20/30%[fg] chance to create [yellow]1/2/3[fg] secondary AoEs on AoE hit',
|
||||
['unleash'] = '[fg]all nukers gain [yellow]+1%[fg] area size and damage every second',
|
||||
['reinforce'] = '[yellow]+10/20/30%[fg] damage, defense and aspd to all allies if you have >=1 enchanter',
|
||||
['reinforce'] = '[yellow]+10/20/30%[fg] global damage, defense and aspd if you have one or more enchanters',
|
||||
['payback'] = '[yellow]+2/5/8%[fg] damage to all allies whenever an enchanter is hit',
|
||||
['enchanted'] = '[yellow]+33/66/99%[fg] attack speed to a random unit if you have >=2 enchanters',
|
||||
['enchanted'] = '[yellow]+33/66/99%[fg] attack speed to a random unit if you have two or more enchanters',
|
||||
['freezing_field'] = '[fg]creates an area that slows enemies by [yellow]50%[fg] for [yellow]2[fg] seconds on sorcerer spell repeat',
|
||||
['burning_field'] = '[fg]creates an area that deals [yellow]30[fg] dps for [yellow]2[fg] seconds on sorcerer spell repeat',
|
||||
['gravity_field'] = '[fg]creates an area that pulls enemies in for [yellow]1[fg] seconds on sorcerer spell repeat',
|
||||
['magnetism'] = '[fg]gold coins are attracted to the snake',
|
||||
['magnetism'] = '[fg]gold coins and healing orbs are attracted to the snake',
|
||||
['insurance'] = "[fg]heroes have [yellow]4[fg] times the chance of mercenary's bonus to drop [yellow]2[fg] gold on death",
|
||||
['dividends'] = '[fg]mercenaries deal [yellow]+X%[fg] damage, where X is how much gold you have',
|
||||
['berserking'] = '[fg]all warriors have up to [yellow]+50/75/100%[fg] attack speed based on missing HP',
|
||||
|
@ -1265,7 +1265,7 @@ function init()
|
|||
['psyker_orbs'] = '[yellow]+1/2/3[fg] psyker orbs',
|
||||
['psychosense'] = '[yellow]+33/66/99%[fg] orb range',
|
||||
['rearm'] = '[fg]summons repeat their attacks once',
|
||||
['taunt'] = '[yellow]10/20/30% chance for summons to taunt nearby enemies on attack',
|
||||
['taunt'] = '[yellow]10/20/30%[fg] chance for summons to taunt nearby enemies on attack',
|
||||
['summon_instability'] = '[fg]summons explode when disappearing, dealing [yellow]100/150/200%[fg] damage',
|
||||
}
|
||||
|
||||
|
@ -1313,13 +1313,13 @@ function init()
|
|||
['magnify'] = function(lvl) return ts(lvl, '+20%', '35%', '50%') .. ' area size' end,
|
||||
['echo_barrage'] = function(lvl) return ts(lvl, '10%', '20%', '30%') .. ' chance to create ' .. ts(lvl, '1', '2', '3') .. ' secondary AoEs on AoE hit' end,
|
||||
['unleash'] = function(lvl) return '[fg]all nukers gain [yellow]+1%[fg] area size and damage every second' end,
|
||||
['reinforce'] = function(lvl) return ts(lvl, '+10%', '20%', '30%') .. ' damage, defense and aspd to all allies if you have >=1 enchanter' end,
|
||||
['reinforce'] = function(lvl) return ts(lvl, '+10%', '20%', '30%') .. ' global damage, defense and aspd if you have one or more enchanters' end,
|
||||
['payback'] = function(lvl) return ts(lvl, '+2%', '5%', '8%') .. ' damage to all allies whenever an enchanter is hit' end,
|
||||
['enchanted'] = function(lvl) return ts(lvl, '+33%', '66%', '99%') .. ' attack speed to a random unit if you have >=2 enchanters' end,
|
||||
['enchanted'] = function(lvl) return ts(lvl, '+33%', '66%', '99%') .. ' attack speed to a random unit if you have two or more enchanters' end,
|
||||
['freezing_field'] = function(lvl) return '[fg]creates an area that slows enemies by [yellow]50%[fg] for [yellow]2[fg] seconds on sorcerer spell repeat' end,
|
||||
['burning_field'] = function(lvl) return '[fg]creates an area that deals [yellow]30[fg] dps for [yellow]2[fg] seconds on sorcerer spell repeat' end,
|
||||
['gravity_field'] = function(lvl) return '[fg]creates an area that pulls enemies in for [yellow]1[fg] seconds on sorcerer spell repeat' end,
|
||||
['magnetism'] = function(lvl) return '[fg]gold coins are attracted to the snake' end,
|
||||
['magnetism'] = function(lvl) return '[fg]gold coins and healing orbs are attracted to the snake' end,
|
||||
['insurance'] = function(lvl) return "[fg]heroes have [yellow]4[fg] times the chance of mercenary's bonus to drop [yellow]2[fg] gold on death" end,
|
||||
['dividends'] = function(lvl) return '[fg]mercenaries deal [yellow]+X%[fg] damage, where X is how much gold you have' end,
|
||||
['berserking'] = function(lvl) return '[fg]all warriors have up to ' .. ts(lvl, '+50%', '75%', '100%') .. ' attack speed based on missing HP' end,
|
||||
|
@ -1365,15 +1365,15 @@ function init()
|
|||
}
|
||||
|
||||
level_to_gold_gained = {
|
||||
[1] = {2, 2},
|
||||
[2] = {2, 2},
|
||||
[3] = {4, 6},
|
||||
[4] = {3, 5},
|
||||
[5] = {4, 7},
|
||||
[6] = {6, 10},
|
||||
[1] = {3, 3},
|
||||
[2] = {3, 3},
|
||||
[3] = {5, 6},
|
||||
[4] = {4, 5},
|
||||
[5] = {5, 8},
|
||||
[6] = {8, 10},
|
||||
[7] = {8, 10},
|
||||
[8] = {10, 12},
|
||||
[9] = {12, 15},
|
||||
[8] = {12, 14},
|
||||
[9] = {14, 18},
|
||||
[10] = {10, 13},
|
||||
[11] = {12, 15},
|
||||
[12] = {18, 20},
|
||||
|
@ -1412,11 +1412,11 @@ function init()
|
|||
[17] = {6, 5, 4, 3},
|
||||
[18] = {18},
|
||||
[19] = {10, 6},
|
||||
[20] = {10, 6, 2},
|
||||
[21] = {28},
|
||||
[22] = {10, 10, 5},
|
||||
[20] = {8, 6, 2},
|
||||
[21] = {22},
|
||||
[22] = {10, 8, 4},
|
||||
[23] = {20, 5, 5},
|
||||
[24] = {35},
|
||||
[24] = {30},
|
||||
[25] = {5, 5, 5, 5, 5, 5},
|
||||
}
|
||||
|
||||
|
|
|
@ -14,7 +14,7 @@ function Media:on_enter(from)
|
|||
graphics.set_background_color(blue[0])
|
||||
Text2{group = self.ui, x = gw/2, y = gh/2, lines = {
|
||||
{text = '[fg]SNKRX', font = fat_font, alignment = 'center', height_offset = -15},
|
||||
{text = '[fg]item update', font = pixul_font, alignment = 'center'},
|
||||
{text = '[fg]orb update', font = pixul_font, alignment = 'center'},
|
||||
}}
|
||||
end
|
||||
|
||||
|
|
|
@ -5,11 +5,11 @@ function SpawnMarker:init(args)
|
|||
self.color = red[0]
|
||||
self.r = random:float(0, 2*math.pi)
|
||||
self.spring:pull(random:float(0.4, 0.6), 200, 10)
|
||||
self.t:after(0.75, function() self.dead = true end)
|
||||
self.t:after(1.125, function() self.dead = true end)
|
||||
self.m = 1
|
||||
self.n = 0
|
||||
pop3:play{pitch = 1, volume = 0.15}
|
||||
self.t:every({0.13, 0.16}, function()
|
||||
self.t:every({0.195, 0.24}, function()
|
||||
self.hidden = not self.hidden
|
||||
self.m = self.m*random:float(0.84, 0.87)
|
||||
end, nil, nil, 'blink')
|
||||
|
@ -262,7 +262,7 @@ function Unit:calculate_stats(first_run)
|
|||
local x = self.level
|
||||
local y = {0, 1, 3, 3, 4, 6, 5, 6, 9, 7, 8, 12, 10, 11, 15, 12, 13, 18, 16, 17, 21, 17, 20, 24, 25}
|
||||
self.base_hp = 22 + (current_new_game_plus*3) + (15 + current_new_game_plus*2.7)*y[x]
|
||||
self.base_dmg = (4 + current_new_game_plus*1.15) + (2 + current_new_game_plus*1)*y[x]
|
||||
self.base_dmg = (4 + current_new_game_plus*1.15) + (2 + current_new_game_plus*0.83)*y[x]
|
||||
self.base_mvspd = 70 + 3*y[x]
|
||||
end
|
||||
end
|
||||
|
|
30
player.lua
30
player.lua
|
@ -59,7 +59,7 @@ function Player:init(args)
|
|||
local cast = function(pitch_a)
|
||||
local enemy = table.shuffle(main.current.main:get_objects_by_classes(main.current.enemies))[1]
|
||||
if enemy then
|
||||
gambler1:play{pitch = pitch_a, volume = math.remap(gold, 0, 50, 0, 0.8)}
|
||||
gambler1:play{pitch = pitch_a, volume = math.remap(gold, 0, 50, 0, 0.5)}
|
||||
enemy:hit(2*gold)
|
||||
if main.current.sorcerer_level > 0 then
|
||||
self.sorcerer_count = self.sorcerer_count + 1
|
||||
|
@ -69,7 +69,7 @@ function Player:init(args)
|
|||
self.t:after(0.25, function()
|
||||
local enemy = table.shuffle(main.current.main:get_objects_by_classes(main.current.enemies))[1]
|
||||
if enemy then
|
||||
gambler1:play{pitch = pitch_a + 0.05, volume = math.remap(gold, 0, 50, 0, 0.8)}
|
||||
gambler1:play{pitch = pitch_a + 0.05, volume = math.remap(gold, 0, 50, 0, 0.5)}
|
||||
enemy:hit(2*gold)
|
||||
end
|
||||
end)
|
||||
|
@ -536,7 +536,8 @@ function Player:init(args)
|
|||
self.wide_attack_sensor = Circle(self.x, self.y, 128)
|
||||
self.t:cooldown(6, function() local enemies = self:get_objects_in_shape(self.attack_sensor, main.current.enemies); return enemies and #enemies > 0 end, function()
|
||||
buff1:play{pitch = random:float(0.9, 1.1), volume = 0.5}
|
||||
local enemies = table.first2(table.shuffle(self:get_objects_in_shape(self.wide_attack_sensor, main.current.enemies)), 6 + ((self.malediction == 1 and 1) or (self.malediction == 2 and 3) or (self.malediction == 3 and 5) or 0))
|
||||
local enemies = table.first2(table.shuffle(self:get_objects_in_shape(self.wide_attack_sensor, main.current.enemies)),
|
||||
6 + ((self.malediction == 1 and 1) or (self.malediction == 2 and 3) or (self.malediction == 3 and 5) or 0) + ((main.current.curser_level == 2 and 3) or (main.current.curser_level == 1 and 1) or 0))
|
||||
for _, enemy in ipairs(enemies) do
|
||||
if self:distance_to_object(enemy) < 128 then
|
||||
enemy:curse('jester', 6*(self.hex_duration_m or 1), self.level == 3, self)
|
||||
|
@ -551,7 +552,8 @@ function Player:init(args)
|
|||
self.wide_attack_sensor = Circle(self.x, self.y, 128)
|
||||
self.t:cooldown(6, function() local enemies = self:get_objects_in_shape(self.attack_sensor, main.current.enemies); return enemies and #enemies > 0 end, function()
|
||||
buff1:play{pitch = random:float(0.9, 1.1), volume = 0.5}
|
||||
local enemies = table.first2(table.shuffle(self:get_objects_in_shape(self.wide_attack_sensor, main.current.enemies)), 3 + ((self.malediction == 1 and 1) or (self.malediction == 2 and 3) or (self.malediction == 3 and 5) or 0))
|
||||
local enemies = table.first2(table.shuffle(self:get_objects_in_shape(self.wide_attack_sensor, main.current.enemies)),
|
||||
3 + ((self.malediction == 1 and 1) or (self.malediction == 2 and 3) or (self.malediction == 3 and 5) or 0) + ((main.current.curser_level == 2 and 3) or (main.current.curser_level == 1 and 1) or 0))
|
||||
for _, enemy in ipairs(enemies) do
|
||||
enemy:curse('usurer', 10000, self.level == 3, self)
|
||||
enemy:apply_dot(self.dmg*(self.dot_dmg_m or 1)*(main.current.chronomancer_dot or 1), 10000)
|
||||
|
@ -567,15 +569,12 @@ function Player:init(args)
|
|||
self.t:cooldown(6, function() local enemies = self:get_objects_in_shape(self.attack_sensor, main.current.enemies); return enemies and #enemies > 0 end, function()
|
||||
local curse = function()
|
||||
buff1:play{pitch = random:float(0.9, 1.1), volume = 0.5}
|
||||
local enemies = table.first2(table.shuffle(self:get_objects_in_shape(self.wide_attack_sensor, main.current.enemies)), 6 + ((self.malediction == 1 and 1) or (self.malediction == 2 and 3) or (self.malediction == 3 and 5) or 0))
|
||||
local enemies = table.first2(table.shuffle(self:get_objects_in_shape(self.wide_attack_sensor, main.current.enemies)),
|
||||
6 + ((self.malediction == 1 and 1) or (self.malediction == 2 and 3) or (self.malediction == 3 and 5) or 0) + ((main.current.curser_level == 2 and 3) or (main.current.curser_level == 1 and 1) or 0))
|
||||
for _, enemy in ipairs(enemies) do
|
||||
enemy:curse('silencer', 6*(self.hex_duration_m or 1), self.level == 3, self)
|
||||
if self.level == 3 then
|
||||
local curse_m = 1
|
||||
if main.current.curser_level == 2 then curse_m = 1.5
|
||||
elseif main.current.curser_level == 1 then curse_m = 1.25
|
||||
else curse_m = 1 end
|
||||
enemy:apply_dot(self.dmg*(self.dot_dmg_m or 1)*(main.current.chronomancer_dot or 1), 6*(self.hex_duration_m or 1)*(curse_m or 1))
|
||||
enemy:apply_dot(self.dmg*(self.dot_dmg_m or 1)*(main.current.chronomancer_dot or 1), 6*(self.hex_duration_m or 1))
|
||||
end
|
||||
HitCircle{group = main.current.effects, x = self.x, y = self.y, rs = 6, color = blue2[0], duration = 0.1}
|
||||
LightningLine{group = main.current.effects, src = self, dst = enemy, color = blue2[0]}
|
||||
|
@ -628,7 +627,8 @@ function Player:init(args)
|
|||
self.wide_attack_sensor = Circle(self.x, self.y, 128)
|
||||
self.t:cooldown(6, function() local enemies = self:get_objects_in_shape(self.attack_sensor, main.current.enemies); return enemies and #enemies > 0 end, function()
|
||||
buff1:play{pitch = random:float(0.9, 1.1), volume = 0.5}
|
||||
local enemies = table.first2(table.shuffle(self:get_objects_in_shape(self.wide_attack_sensor, main.current.enemies)), 6 + ((self.malediction == 1 and 1) or (self.malediction == 2 and 3) or (self.malediction == 3 and 5) or 0))
|
||||
local enemies = table.first2(table.shuffle(self:get_objects_in_shape(self.wide_attack_sensor, main.current.enemies)),
|
||||
6 + ((self.malediction == 1 and 1) or (self.malediction == 2 and 3) or (self.malediction == 3 and 5) or 0) + ((main.current.curser_level == 2 and 3) or (main.current.curser_level == 1 and 1) or 0))
|
||||
for _, enemy in ipairs(enemies) do
|
||||
enemy:curse('bane', 6*(self.hex_duration_m or 1), self.level == 3, self)
|
||||
HitCircle{group = main.current.effects, x = self.x, y = self.y, rs = 6, color = purple[0], duration = 0.1}
|
||||
|
@ -828,7 +828,8 @@ function Player:init(args)
|
|||
self.wide_attack_sensor = Circle(self.x, self.y, 128)
|
||||
self.t:cooldown(6, function() local enemies = self:get_objects_in_shape(self.attack_sensor, main.current.enemies); return enemies and #enemies > 0 end, function()
|
||||
buff1:play{pitch = random:float(0.9, 1.1), volume = 0.5}
|
||||
local enemies = table.first2(table.shuffle(self:get_objects_in_shape(self.wide_attack_sensor, main.current.enemies)), 8 + ((self.malediction == 1 and 1) or (self.malediction == 2 and 3) or (self.malediction == 3 and 5) or 0))
|
||||
local enemies = table.first2(table.shuffle(self:get_objects_in_shape(self.wide_attack_sensor, main.current.enemies)),
|
||||
8 + ((self.malediction == 1 and 1) or (self.malediction == 2 and 3) or (self.malediction == 3 and 5) or 0) + ((main.current.curser_level == 2 and 3) or (main.current.curser_level == 1 and 1) or 0))
|
||||
for _, enemy in ipairs(enemies) do
|
||||
enemy:curse('infestor', 6*(self.hex_duration_m or 1), (self.level == 3 and 6 or 2), self.dmg, self)
|
||||
HitCircle{group = main.current.effects, x = self.x, y = self.y, rs = 6, color = orange[0], duration = 0.1}
|
||||
|
@ -1215,6 +1216,7 @@ function Player:update(dt)
|
|||
else self.knockback_m = 1 end
|
||||
if self.force_push then self.knockback_m = self.knockback_m*1.25 end
|
||||
|
||||
self.dot_dmg_m = 1
|
||||
if table.any(self.classes, function(v) return v == 'voider' end) then
|
||||
if main.current.voider_level == 2 then self.dot_dmg_m = 1.4
|
||||
elseif main.current.voider_level == 1 then self.dot_dmg_m = 1.2
|
||||
|
@ -1453,6 +1455,7 @@ function Player:on_collision_enter(other, contact)
|
|||
else other:hit(self.dmg) end
|
||||
if other.headbutting then
|
||||
self:hit((4 + math.floor(other.level/3))*other.dmg)
|
||||
other.headbutting = false
|
||||
else self:hit(other.dmg) end
|
||||
HitCircle{group = main.current.effects, x = x, y = y, rs = 6, color = fg[0], duration = 0.1}
|
||||
for i = 1, 2 do HitParticle{group = main.current.effects, x = x, y = y, color = self.color} end
|
||||
|
@ -2031,7 +2034,8 @@ function Projectile:update(dt)
|
|||
|
||||
if self.character == 'psyker' then
|
||||
if self.parent.dead then self.dead = true; self.parent = nil; return end
|
||||
self:set_position(self.parent.x + self.orbit_distance*math.cos(self.orbit_speed*time + self.orbit_offset), self.parent.y + self.orbit_distance*math.sin(self.orbit_speed*time + self.orbit_offset))
|
||||
self:set_position(self.parent.x + self.orbit_distance*math.cos(self.orbit_speed*time + self.orbit_offset),
|
||||
self.parent.y + self.orbit_distance*math.sin(self.orbit_speed*time + self.orbit_offset))
|
||||
local dx, dy = self.x - (self.previous_x or 0), self.y - (self.previous_y or 0)
|
||||
self.r = Vector(dx, dy):angle()
|
||||
self:set_angle(self.r)
|
||||
|
|
37
todo
37
todo
|
@ -27,18 +27,19 @@ Orb Update
|
|||
* Flagellant - Lv.3: 2X flagellant max HP and +12% damage to all allies per cast
|
||||
* Psykeeper - creates a healing orb every time the psykeeper takes 20% of its max HP in damage, Lv.3: deal double the damage taken by the psykeeper to all enemies
|
||||
Balance
|
||||
Change cursers to add more curse targets as set bonuses
|
||||
Decrease reroll cost to 5
|
||||
* Changed cursers to add more curse targets as set bonuses
|
||||
* Decreased item reroll cost to 5
|
||||
* Increased sage's attack speed
|
||||
Increase spawn marker time
|
||||
Decrease range and thrown speed for forcers
|
||||
Decrease damage for blue and white on higher NG
|
||||
Increase gold rewards at higher NG
|
||||
Prevent orange from killing multiple units at once
|
||||
Slightly decrease probability of special spawn at levels above 20
|
||||
* Increased spawn marker time by 50%
|
||||
* Decreased range and throw speed for tanks
|
||||
* Decreased damage for blue and white enemies
|
||||
* Increased gold rewards at levels 1-9
|
||||
* Prevent orange from killing multiple units at once
|
||||
* Slightly decrease probability of special spawn at levels above 20
|
||||
* Exploder elite spawns mines instead of exploding enemies directly
|
||||
* Decreased overall enemy damage at higher difficulties
|
||||
QoL
|
||||
Lowered sound effect for gambler
|
||||
Show cooldown on elite attack
|
||||
* Lowered sound effect for gambler
|
||||
* Options menu from buy screen
|
||||
* Add main menu
|
||||
* Title
|
||||
|
@ -48,10 +49,14 @@ Orb Update
|
|||
* Quit button
|
||||
* Soundtrack button
|
||||
* Volume slider
|
||||
https://i.imgur.com/4hOt5uX.png "party 7/9"
|
||||
https://i.imgur.com/dlGbx0k.png lvl 3 effect on shop card
|
||||
Add visuals divine intervention, fairy buff
|
||||
Change text for enchanted to "if you have >= 2 enchanters" and change text for reinforce to "if you have >= 1 enchanter"
|
||||
* Party x/y
|
||||
* Lv.3 effect on shop card
|
||||
* Changed text saying "with at least n enchanters" to "if you have >=n enchanters" for 2 enchanter items
|
||||
Bug fixes
|
||||
* Fixed fullscreen button and general resolution issues
|
||||
* Fixed barbarian stun just slowing and not stunning
|
||||
* Fixed a bug with Call of the Void that caused its DoT damage bonus to become infinite
|
||||
|
||||
|
||||
Loop Update
|
||||
New items:
|
||||
|
@ -83,9 +88,9 @@ Loop Update
|
|||
Selling items
|
||||
Your party + items on end, death and passive screens - https://i.imgur.com/JJUddT3.png
|
||||
Add option for mouse cursor to always be visible
|
||||
Show cooldown on elite attack
|
||||
Add visuals divine intervention, fairy buff
|
||||
Bug fixes
|
||||
* Fixed fullscreen button and general resolution issues
|
||||
Fix barbarian stun just slowing and not stunning
|
||||
Fixed a series of crashes that happened rarely right before changing from the arena back to the shop
|
||||
https://i.imgur.com/Rk6qbDD.png - merchant doesnt give reroll if dies
|
||||
https://i.imgur.com/1soUUdk.png - 5th position stops shooting when 1-4 die
|
||||
|
|
Loading…
Reference in New Issue