Orb update 4/4

master
a327ex 2021-06-25 13:25:13 -03:00
parent 97416c5d78
commit 8acbd6b1ae
9 changed files with 130 additions and 131 deletions

View File

@ -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) 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} spawn1:play{pitch = random:float(0.8, 1.2), volume = 0.15}
SpawnMarker{group = self.effects, x = x, y = y} 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]} self.boss = Seeker{group = self.main, x = x, y = y, character = 'seeker', level = self.level, boss = level_to_boss[self.level]}
end) end)
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 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] local p = spawn_points[spawn_type]
SpawnMarker{group = self.effects, x = p.x, y = p.y} 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) end)
end) end)
@ -182,8 +182,8 @@ function Arena:on_enter(from, level, units, passives, shop_level, shop_xp, lock)
2, 3, 4, 2, 3, 4,
3, 4, 4, 5, 3, 4, 4, 5,
5, 5, 5, 5, 7, 5, 5, 5, 5, 7,
6, 6, 7, 7, 7, 10, 6, 6, 7, 7, 8, 10,
6, 8, 10, 12, 14, 16, 25, 8, 8, 10, 12, 14, 16, 25,
} }
self.level_to_distributed_enemies_chance = { self.level_to_distributed_enemies_chance = {
0, 5, 10, 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 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] local p = spawn_points[spawn_type]
SpawnMarker{group = self.effects, x = p.x, y = p.y} 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) end)
end, self.max_waves+1) 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() self.t:after({0, 0.2}, function()
local p = random:table_remove(spawn_points) local p = random:table_remove(spawn_points)
SpawnMarker{group = self.effects, x = p.x, y = p.y} 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) end)
self.t:after({0, 0.2}, function() self.t:after({0, 0.2}, function()
local p = random:table_remove(spawn_points) local p = random:table_remove(spawn_points)
SpawnMarker{group = self.effects, x = p.x, y = p.y} 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) end)
self.t:after({0, 0.2}, function() self.t:after({0, 0.2}, function()
local p = random:table_remove(spawn_points) local p = random:table_remove(spawn_points)
SpawnMarker{group = self.effects, x = p.x, y = p.y} 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) end)
self.t:after({0, 0.2}, function() self.t:after({0, 0.2}, function()
local p = random:table_remove(spawn_points) local p = random:table_remove(spawn_points)
SpawnMarker{group = self.effects, x = p.x, y = p.y} 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) 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 self.enemy_spawns_prevented = 0
end) end)
end end
@ -945,22 +945,22 @@ function Arena:spawn_distributed_enemies()
if spawn_type == '4' then if spawn_type == '4' then
local p = random:table_remove(spawn_points) local p = random:table_remove(spawn_points)
SpawnMarker{group = self.effects, x = p.x, y = p.y} 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:spawn_n_enemies(p)
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 == '4+4' then elseif spawn_type == '4+4' then
local p = random:table_remove(spawn_points) local p = random:table_remove(spawn_points)
SpawnMarker{group = self.effects, x = p.x, y = p.y} 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:spawn_n_enemies(p)
self.t:after(2, function() self:spawn_n_enemies(p) end) self.t:after(2, function() self:spawn_n_enemies(p) 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 == '4+4+4' then elseif spawn_type == '4+4+4' then
local p = random:table_remove(spawn_points) local p = random:table_remove(spawn_points)
SpawnMarker{group = self.effects, x = p.x, y = p.y} 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:spawn_n_enemies(p)
self.t:after(1, function() self.t:after(1, function()
self:spawn_n_enemies(p) self:spawn_n_enemies(p)
@ -969,58 +969,58 @@ function Arena:spawn_distributed_enemies()
end) end)
end) 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 elseif spawn_type == '2x4' then
self.t:after({0, 0.2}, function() self.t:after({0, 0.2}, function()
local p = random:table_remove(spawn_points) local p = random:table_remove(spawn_points)
SpawnMarker{group = self.effects, x = p.x, y = p.y} 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) end)
self.t:after({0, 0.2}, function() self.t:after({0, 0.2}, function()
local p = random:table_remove(spawn_points) local p = random:table_remove(spawn_points)
SpawnMarker{group = self.effects, x = p.x, y = p.y} 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) 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 elseif spawn_type == '3x4' then
self.t:after({0, 0.2}, function() self.t:after({0, 0.2}, function()
local p = random:table_remove(spawn_points) local p = random:table_remove(spawn_points)
SpawnMarker{group = self.effects, x = p.x, y = p.y} 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) end)
self.t:after({0, 0.2}, function() self.t:after({0, 0.2}, function()
local p = random:table_remove(spawn_points) local p = random:table_remove(spawn_points)
SpawnMarker{group = self.effects, x = p.x, y = p.y} 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) end)
self.t:after({0, 0.2}, function() self.t:after({0, 0.2}, function()
local p = random:table_remove(spawn_points) local p = random:table_remove(spawn_points)
SpawnMarker{group = self.effects, x = p.x, y = p.y} 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) 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 elseif spawn_type == '4x2' then
self.t:after({0, 0.2}, function() self.t:after({0, 0.2}, function()
local p = random:table_remove(spawn_points) local p = random:table_remove(spawn_points)
SpawnMarker{group = self.effects, x = p.x, y = p.y} 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) end)
self.t:after({0, 0.2}, function() self.t:after({0, 0.2}, function()
local p = random:table_remove(spawn_points) local p = random:table_remove(spawn_points)
SpawnMarker{group = self.effects, x = p.x, y = p.y} 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) end)
self.t:after({0, 0.2}, function() self.t:after({0, 0.2}, function()
local p = random:table_remove(spawn_points) local p = random:table_remove(spawn_points)
SpawnMarker{group = self.effects, x = p.x, y = p.y} 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) end)
self.t:after({0, 0.2}, function() self.t:after({0, 0.2}, function()
local p = random:table_remove(spawn_points) local p = random:table_remove(spawn_points)
SpawnMarker{group = self.effects, x = p.x, y = p.y} 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) 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
end end

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 KiB

View File

@ -67,7 +67,7 @@ function BuyScreen:on_enter(from, level, units, passives, shop_level, shop_xp)
self:set_items() 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.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.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.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) 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} RerollButton{group = self.main, x = 150, y = 18, parent = self}
GoButton{group = self.main, x = gw - 90, y = gh - 20, 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} 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.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.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 = { 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 b.info_text = nil
end} 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 self.transitioning = true
ui_transition2:play{pitch = random:float(0.95, 1.05), volume = 0.5} 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} 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.free_reroll = true
self.text = Text({{text = '[bg10]reroll: [yellow]0', font = pixul_font, alignment = 'center'}}, global_text_tags) self.text = Text({{text = '[bg10]reroll: [yellow]0', font = pixul_font, alignment = 'center'}}, global_text_tags)
else 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 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) 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 end
elseif self.parent:is(Arena) then 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.spring:pull(0.2, 200, 10)
self.selected = true self.selected = true
error1:play{pitch = random:float(0.95, 1.05), volume = 0.5} 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.parent:set_passives(true)
self.selected = true self.selected = true
self.spring:pull(0.2, 200, 10) 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.parent.shop_text:set_text{{text = '[fg, nudge_down]gold: [yellow, nudge_down]' .. gold, font = pixul_font, alignment = 'center'}}
self.free_reroll = false 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 end
end end
@ -1015,7 +1015,7 @@ function RerollButton:on_mouse_enter()
if self.free_reroll then if self.free_reroll then
self.text:set_text{{text = '[fgm5]reroll: 0', font = pixul_font, alignment = 'center'}} self.text:set_text{{text = '[fgm5]reroll: 0', font = pixul_font, alignment = 'center'}}
else 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
end end
self.spring:pull(0.2, 200, 10) self.spring:pull(0.2, 200, 10)
@ -1029,7 +1029,7 @@ function RerollButton:on_mouse_exit()
if self.free_reroll then if self.free_reroll then
self.text:set_text{{text = '[fgm5]reroll: [yellow]0', font = pixul_font, alignment = 'center'}} self.text:set_text{{text = '[fgm5]reroll: [yellow]0', font = pixul_font, alignment = 'center'}}
else 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
end end
self.selected = false self.selected = false
@ -1696,7 +1696,10 @@ function CharacterIcon:on_mouse_enter()
self.info_text:activate({ 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 = '[' .. 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 = '[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'}, -- {text = character_stats[self.character](1), font = pixul_font, alignment = 'center'},
}, nil, nil, nil, nil, 16, 4, nil, 2) }, nil, nil, nil, nil, 16, 4, nil, 2)
self.info_text.x, self.info_text.y = gw/2, gh/2 + 10 self.info_text.x, self.info_text.y = gw/2, gh/2 + 10

View File

@ -16,7 +16,7 @@ function Seeker:init(args)
if self.boss == 'speed_booster' then if self.boss == 'speed_booster' then
self.color = green[0]:clone() self.color = green[0]:clone()
self.t:every(8, function() 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) local enemies = table.head(self:get_objects_in_shape(Circle(self.x, self.y, 128), main.current.enemies), 4)
if #enemies > 0 then if #enemies > 0 then
buff1:play{pitch = random:float(0.95, 1.05), volume = 0.5} 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 elseif self.boss == 'forcer' then
self.color = yellow[0]:clone() self.color = yellow[0]:clone()
self.t:every(6, function() 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 enemies = main.current.main:get_objects_by_classes(main.current.enemies)
local x, y = 0, 0 local x, y = 0, 0
if #enemies > 0 then if #enemies > 0 then
@ -78,7 +78,7 @@ function Seeker:init(args)
elseif self.boss == 'swarmer' then elseif self.boss == 'swarmer' then
self.color = purple[0]:clone() self.color = purple[0]:clone()
self.t:every(4, function() 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 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) local enemy = random:table(enemies)
if enemy then if enemy then
@ -94,23 +94,22 @@ function Seeker:init(args)
elseif self.boss == 'exploder' then elseif self.boss == 'exploder' then
self.color = blue[0]:clone() self.color = blue[0]:clone()
self.t:every(4, function() 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 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) local enemy = random:table(enemies)
if enemy then if enemy then
HitCircle{group = main.current.effects, x = self.x, y = self.y, rs = 6, color = blue[0], duration = 0.1} 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]} LightningLine{group = main.current.effects, src = self, dst = enemy, color = blue[0]}
enemy:hit(10000) enemy:hit(10000)
shoot1:play{pitch = random:float(0.95, 1.05), volume = 0.4} mine1:play{pitch = random:float(0.95, 1.05), volume = 0.5}
local n = math.floor(8 + current_new_game_plus*1.5) ExploderMine{group = main.current.main, x = enemy.x, y = enemy.y, color = blue[0], parent = enemy}
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
end end
end) end)
elseif self.boss == 'randomizer' then 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_immediate(0.07, function() self.color = _G[random:table{'green', 'purple', 'yellow', 'blue'}][0]:clone() end)
self.t:every(6, function() 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'} local attack = random:table{'explode', 'swarm', 'force', 'speed_boost'}
if attack == 'explode' then if attack == 'explode' then
local enemies = self:get_objects_in_shape(Circle(self.x, self.y, 128), {Seeker}) 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) enemy:hit(10000)
shoot1:play{pitch = random:float(0.95, 1.05), volume = 0.4} shoot1:play{pitch = random:float(0.95, 1.05), volume = 0.4}
local n = 8 + current_new_game_plus*2 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 end
elseif attack == 'swarm' then elseif attack == 'swarm' then
local enemies = self:get_objects_in_shape(Circle(self.x, self.y, 128), {Seeker}) 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 self.last_headbutt_time = 0
local n = math.remap(current_new_game_plus, 0, 5, 1, 0.5) 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() 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 if self.headbutt_charging or self.headbutting then return end
self.headbutt_charging = true 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() 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 self.hp = self.max_hp
local n = math.remap(current_new_game_plus, 0, 5, 1, 0.75) local n = math.remap(current_new_game_plus, 0, 5, 1, 0.75)
self.t:every({3*n, 5*n}, function() 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 if enemy then
wizard1:play{pitch = random:float(0.95, 1.05), volume = 0.5} 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} 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]} 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
end) end)
elseif self.shooter then elseif self.shooter then
@ -226,7 +225,7 @@ function Seeker:init(args)
self.t:after({2*n, 4*n}, function() self.t:after({2*n, 4*n}, function()
self.shooting = true self.shooting = true
self.t:every({4, 6}, function() 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 for i = 1, 3 do
self.t:after((1 - self.level*0.01)*0.15*(i-1), function() 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} shoot1:play{pitch = random:float(0.95, 1.05), volume = 0.1}
@ -234,7 +233,7 @@ function Seeker:init(args)
local r = self.r 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} 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, 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 end
end, nil, nil, 'shooter') end, nil, nil, 'shooter')
@ -498,7 +497,7 @@ function Seeker:hit(damage, projectile, dot)
end end
if self.speed_booster then 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) local enemies = self:get_objects_in_shape(self.area_sensor, main.current.enemies)
if #enemies > 0 then if #enemies > 0 then
buff1:play{pitch = random:float(0.95, 1.05), volume = 0.5} buff1:play{pitch = random:float(0.95, 1.05), volume = 0.5}
@ -511,7 +510,7 @@ function Seeker:hit(damage, projectile, dot)
end end
if self.exploder then 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} mine1:play{pitch = random:float(0.95, 1.05), volume = 0.5}
trigger:after(0.01, function() trigger:after(0.01, function()
ExploderMine{group = main.current.main, x = self.x, y = self.y, color = blue[0], parent = self} 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 end
if self.spawner then 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} critter1:play{pitch = random:float(0.95, 1.05), volume = 0.35}
trigger:after(0.01, function() trigger:after(0.01, function()
for i = 1, random:int(5, 8) do for i = 1, random:int(5, 8) do
@ -609,11 +608,6 @@ end
function Seeker:curse(curse, duration, arg1, arg2, arg3) 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 main.current.player.whispers_of_doom then
if not self.doom then self.doom = 0 end if not self.doom then self.doom = 0 end
self.doom = self.doom + 1 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} buff1:play{pitch = random:float(0.65, 0.75), volume = 0.25}
if curse == 'launcher' then if curse == 'launcher' then
self.t:after(duration*curse_m, function() self.t:after(duration, function()
self.launcher_push = arg1 self.launcher_push = arg1
self.launcher = arg2 self.launcher = arg2
self:push(random:float(50, 75)*self.launcher.knockback_m, random:table{0, math.pi, math.pi/2, -math.pi/2}) 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_cursed = true
self.jester_lvl3 = arg1 self.jester_lvl3 = arg1
self.jester_ref = arg2 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 elseif curse == 'bane' then
self.bane_cursed = true self.bane_cursed = true
self.bane_lvl3 = arg1 self.bane_lvl3 = arg1
self.bane_ref = arg2 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 elseif curse == 'infestor' then
self.infested = arg1 self.infested = arg1
self.infested_dmg = arg2 self.infested_dmg = arg2
self.infested_ref = arg3 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 elseif curse == 'silencer' then
self.silenced = true 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 elseif curse == 'usurer' then
if arg1 then if arg1 then
self.usurer_count = self.usurer_count + 1 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} HitCircle{group = main.current.effects, x = self.x, y = self.y}
local n = math.floor(8 + current_new_game_plus*1.5) local n = math.floor(8 + current_new_game_plus*1.5)
for i = 1, n do 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 end
self.dead = true self.dead = true
end, 'mine_count') end, 'mine_count')
end) end)
--[[
]]--
end end
@ -856,11 +848,6 @@ end
function EnemyCritter:curse(curse, duration, arg1, arg2, arg3) 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 main.current.player.whispers_of_doom then
if not self.doom then self.doom = 0 end if not self.doom then self.doom = 0 end
self.doom = self.doom + 1 self.doom = self.doom + 1
@ -873,7 +860,7 @@ function EnemyCritter:curse(curse, duration, arg1, arg2, arg3)
end end
if curse == 'launcher' then if curse == 'launcher' then
self.t:after(duration*curse_m, function() self.t:after(duration, function()
self.launcher_push = arg1 self.launcher_push = arg1
self.launcher = arg2 self.launcher = arg2
self:push(random:float(50, 75)*self.launcher.knockback_m, random:table{0, math.pi, math.pi/2, -math.pi/2}) 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_cursed = true
self.jester_lvl3 = arg1 self.jester_lvl3 = arg1
self.jester_ref = arg2 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 elseif curse == 'bane' then
self.bane_cursed = true self.bane_cursed = true
self.bane_lvl3 = arg1 self.bane_lvl3 = arg1
self.bane_ref = arg2 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 elseif curse == 'infestor' then
self.infested = arg1 self.infested = arg1
self.infested_dmg = arg2 self.infested_dmg = arg2
self.infested_ref = arg3 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 elseif curse == 'silencer' then
self.silenced = true 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 elseif curse == 'usurer' then
if arg1 then if arg1 then
self.usurer_count = self.usurer_count + 1 self.usurer_count = self.usurer_count + 1

View File

@ -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, ['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, ['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, ['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, ['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, ['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, ['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', ['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', ['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', ['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', ['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', ['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', ['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', ['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", ['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', ['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', ['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', ['psyker_orbs'] = '[yellow]+1/2/3[fg] psyker orbs',
['psychosense'] = '[yellow]+33/66/99%[fg] orb range', ['psychosense'] = '[yellow]+33/66/99%[fg] orb range',
['rearm'] = '[fg]summons repeat their attacks once', ['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', ['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, ['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, ['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, ['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, ['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, ['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, ['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, ['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, ['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, ['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, ['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 = { level_to_gold_gained = {
[1] = {2, 2}, [1] = {3, 3},
[2] = {2, 2}, [2] = {3, 3},
[3] = {4, 6}, [3] = {5, 6},
[4] = {3, 5}, [4] = {4, 5},
[5] = {4, 7}, [5] = {5, 8},
[6] = {6, 10}, [6] = {8, 10},
[7] = {8, 10}, [7] = {8, 10},
[8] = {10, 12}, [8] = {12, 14},
[9] = {12, 15}, [9] = {14, 18},
[10] = {10, 13}, [10] = {10, 13},
[11] = {12, 15}, [11] = {12, 15},
[12] = {18, 20}, [12] = {18, 20},
@ -1412,11 +1412,11 @@ function init()
[17] = {6, 5, 4, 3}, [17] = {6, 5, 4, 3},
[18] = {18}, [18] = {18},
[19] = {10, 6}, [19] = {10, 6},
[20] = {10, 6, 2}, [20] = {8, 6, 2},
[21] = {28}, [21] = {22},
[22] = {10, 10, 5}, [22] = {10, 8, 4},
[23] = {20, 5, 5}, [23] = {20, 5, 5},
[24] = {35}, [24] = {30},
[25] = {5, 5, 5, 5, 5, 5}, [25] = {5, 5, 5, 5, 5, 5},
} }

View File

@ -14,7 +14,7 @@ function Media:on_enter(from)
graphics.set_background_color(blue[0]) graphics.set_background_color(blue[0])
Text2{group = self.ui, x = gw/2, y = gh/2, lines = { Text2{group = self.ui, x = gw/2, y = gh/2, lines = {
{text = '[fg]SNKRX', font = fat_font, alignment = 'center', height_offset = -15}, {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 end

View File

@ -5,11 +5,11 @@ function SpawnMarker:init(args)
self.color = red[0] self.color = red[0]
self.r = random:float(0, 2*math.pi) self.r = random:float(0, 2*math.pi)
self.spring:pull(random:float(0.4, 0.6), 200, 10) 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.m = 1
self.n = 0 self.n = 0
pop3:play{pitch = 1, volume = 0.15} 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.hidden = not self.hidden
self.m = self.m*random:float(0.84, 0.87) self.m = self.m*random:float(0.84, 0.87)
end, nil, nil, 'blink') end, nil, nil, 'blink')
@ -262,7 +262,7 @@ function Unit:calculate_stats(first_run)
local x = self.level 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} 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_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] self.base_mvspd = 70 + 3*y[x]
end end
end end

View File

@ -59,7 +59,7 @@ function Player:init(args)
local cast = function(pitch_a) local cast = function(pitch_a)
local enemy = table.shuffle(main.current.main:get_objects_by_classes(main.current.enemies))[1] local enemy = table.shuffle(main.current.main:get_objects_by_classes(main.current.enemies))[1]
if enemy then 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) enemy:hit(2*gold)
if main.current.sorcerer_level > 0 then if main.current.sorcerer_level > 0 then
self.sorcerer_count = self.sorcerer_count + 1 self.sorcerer_count = self.sorcerer_count + 1
@ -69,7 +69,7 @@ function Player:init(args)
self.t:after(0.25, function() self.t:after(0.25, function()
local enemy = table.shuffle(main.current.main:get_objects_by_classes(main.current.enemies))[1] local enemy = table.shuffle(main.current.main:get_objects_by_classes(main.current.enemies))[1]
if enemy then 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) enemy:hit(2*gold)
end end
end) end)
@ -536,7 +536,8 @@ function Player:init(args)
self.wide_attack_sensor = Circle(self.x, self.y, 128) 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() 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} 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 for _, enemy in ipairs(enemies) do
if self:distance_to_object(enemy) < 128 then if self:distance_to_object(enemy) < 128 then
enemy:curse('jester', 6*(self.hex_duration_m or 1), self.level == 3, self) 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.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() 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} 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 for _, enemy in ipairs(enemies) do
enemy:curse('usurer', 10000, self.level == 3, self) 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) 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() 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() local curse = function()
buff1:play{pitch = random:float(0.9, 1.1), volume = 0.5} 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 for _, enemy in ipairs(enemies) do
enemy:curse('silencer', 6*(self.hex_duration_m or 1), self.level == 3, self) enemy:curse('silencer', 6*(self.hex_duration_m or 1), self.level == 3, self)
if self.level == 3 then if self.level == 3 then
local curse_m = 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))
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))
end end
HitCircle{group = main.current.effects, x = self.x, y = self.y, rs = 6, color = blue2[0], duration = 0.1} 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]} 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.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() 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} 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 for _, enemy in ipairs(enemies) do
enemy:curse('bane', 6*(self.hex_duration_m or 1), self.level == 3, self) 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} 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.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() 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} 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 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) 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} 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 else self.knockback_m = 1 end
if self.force_push then self.knockback_m = self.knockback_m*1.25 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 table.any(self.classes, function(v) return v == 'voider' end) then
if main.current.voider_level == 2 then self.dot_dmg_m = 1.4 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 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 else other:hit(self.dmg) end
if other.headbutting then if other.headbutting then
self:hit((4 + math.floor(other.level/3))*other.dmg) self:hit((4 + math.floor(other.level/3))*other.dmg)
other.headbutting = false
else self:hit(other.dmg) end else self:hit(other.dmg) end
HitCircle{group = main.current.effects, x = x, y = y, rs = 6, color = fg[0], duration = 0.1} 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 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.character == 'psyker' then
if self.parent.dead then self.dead = true; self.parent = nil; return end 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) local dx, dy = self.x - (self.previous_x or 0), self.y - (self.previous_y or 0)
self.r = Vector(dx, dy):angle() self.r = Vector(dx, dy):angle()
self:set_angle(self.r) self:set_angle(self.r)

37
todo
View File

@ -27,18 +27,19 @@ Orb Update
* Flagellant - Lv.3: 2X flagellant max HP and +12% damage to all allies per cast * 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 * 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 Balance
Change cursers to add more curse targets as set bonuses * Changed cursers to add more curse targets as set bonuses
Decrease reroll cost to 5 * Decreased item reroll cost to 5
* Increased sage's attack speed * Increased sage's attack speed
Increase spawn marker time * Increased spawn marker time by 50%
Decrease range and thrown speed for forcers * Decreased range and throw speed for tanks
Decrease damage for blue and white on higher NG * Decreased damage for blue and white enemies
Increase gold rewards at higher NG * Increased gold rewards at levels 1-9
Prevent orange from killing multiple units at once * Prevent orange from killing multiple units at once
Slightly decrease probability of special spawn at levels above 20 * 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 QoL
Lowered sound effect for gambler * Lowered sound effect for gambler
Show cooldown on elite attack
* Options menu from buy screen * Options menu from buy screen
* Add main menu * Add main menu
* Title * Title
@ -48,10 +49,14 @@ Orb Update
* Quit button * Quit button
* Soundtrack button * Soundtrack button
* Volume slider * Volume slider
https://i.imgur.com/4hOt5uX.png "party 7/9" * Party x/y
https://i.imgur.com/dlGbx0k.png lvl 3 effect on shop card * Lv.3 effect on shop card
Add visuals divine intervention, fairy buff * Changed text saying "with at least n enchanters" to "if you have >=n enchanters" for 2 enchanter items
Change text for enchanted to "if you have >= 2 enchanters" and change text for reinforce to "if you have >= 1 enchanter" 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 Loop Update
New items: New items:
@ -83,9 +88,9 @@ Loop Update
Selling items Selling items
Your party + items on end, death and passive screens - https://i.imgur.com/JJUddT3.png Your party + items on end, death and passive screens - https://i.imgur.com/JJUddT3.png
Add option for mouse cursor to always be visible Add option for mouse cursor to always be visible
Show cooldown on elite attack
Add visuals divine intervention, fairy buff
Bug fixes 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 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/Rk6qbDD.png - merchant doesnt give reroll if dies
https://i.imgur.com/1soUUdk.png - 5th position stops shooting when 1-4 die https://i.imgur.com/1soUUdk.png - 5th position stops shooting when 1-4 die