Item update 2/5

master
a327ex 2021-06-16 02:37:40 -03:00
parent 4de2640da1
commit e99644a45b
33 changed files with 425 additions and 309 deletions

118
arena.lua
View File

@ -369,6 +369,7 @@ function Arena:update(dt)
if self.resume_button then self.resume_button.dead = true; self.resume_button = nil end if self.resume_button then self.resume_button.dead = true; self.resume_button = nil end
if self.restart_button then self.restart_button.dead = true; self.restart_button = nil end if self.restart_button then self.restart_button.dead = true; self.restart_button = nil end
if self.mouse_button then self.mouse_button.dead = true; self.mouse_button = nil end if self.mouse_button then self.mouse_button.dead = true; self.mouse_button = nil end
if self.dark_transition_button then self.dark_transition_button.dead = true; self.dark_transition_button = nil end
if self.sfx_button then self.sfx_button.dead = true; self.sfx_button = nil end if self.sfx_button then self.sfx_button.dead = true; self.sfx_button = nil end
if self.music_button then self.music_button.dead = true; self.music_button = nil end if self.music_button then self.music_button.dead = true; self.music_button = nil end
if self.video_button_1 then self.video_button_1.dead = true; self.video_button_1 = nil end if self.video_button_1 then self.video_button_1.dead = true; self.video_button_1 = nil end
@ -390,27 +391,27 @@ function Arena:update(dt)
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}
ui_switch1:play{pitch = random:float(0.95, 1.05), volume = 0.5} ui_switch1:play{pitch = random:float(0.95, 1.05), volume = 0.5}
TransitionEffect{group = main.transitions, x = gw/2, y = gh/2, color = fg[0], transition_action = function() TransitionEffect{group = main.transitions, x = gw/2, y = gh/2, color = state.dark_transitions and bg[-2] or fg[0], transition_action = function()
slow_amount = 1 slow_amount = 1
gold = 3 gold = 3
passives = {} passives = {}
main_song_instance:stop() main_song_instance:stop()
run_passive_pool_by_tiers = { run_passive_pool = {
[1] = { 'wall_echo', 'wall_rider', 'centipede', 'temporal_chains', 'amplify', 'amplify_x', 'ballista', 'ballista_x', 'blunt_arrow', 'berserking', 'unwavering_stance', 'assassination', 'unleash', 'blessing', 'centipede', 'ouroboros_technique_r', 'ouroboros_technique_l', 'amplify', 'resonance', 'ballista', 'call_of_the_void', 'crucio', 'speed_3', 'damage_4', 'level_5', 'death_6', 'lasting_7',
'hex_master', 'force_push', 'spawning_pool'}, 'defensive_stance', 'offensive_stance', 'kinetic_bomb', 'porcupine_technique', 'last_stand', 'seeping', 'deceleration', 'annihilation', 'malediction', 'pandemic', 'whispers_of_doom',
[2] = {'ouroboros_technique_r', 'ouroboros_technique_l', 'intimidation', 'vulnerability', 'resonance', 'point_blank', 'longshot', 'explosive_arrow', 'chronomancy', 'awakening', 'ultimatum', 'echo_barrage', 'tremor', 'heavy_impact', 'fracture', 'meat_shield', 'hive', 'baneling_burst', 'blunt_arrow', 'explosive_arrow', 'divine_machine_arrow', 'chronomancy', 'awakening', 'divine_punishment',
'reinforce', 'payback', 'whispers_of_doom', 'heavy_impact', 'immolation', 'call_of_the_void'}, 'assassination', 'flying_daggers', 'ultimatum', 'magnify', 'echo_barrage', 'unleash', 'reinforce', 'payback', 'enchanted', 'freezing_field', 'burning_field', 'gravity_field', 'magnetism',
[3] = {'divine_machine_arrow', 'divine_punishment', 'flying_daggers', 'crucio', 'hive', 'void_rift'}, 'insurance', 'dividends', 'berserking', 'unwavering_stance', 'unrelenting_stance'
} }
max_units = 7 + current_new_game_plus max_units = 7 + current_new_game_plus
main:add(BuyScreen'buy_screen') main:add(BuyScreen'buy_screen')
locked_state = nil locked_state = nil
system.save_run() system.save_run()
main:go_to('buy_screen', 0, {}, passives, 1, 0) main:go_to('buy_screen', 0, {}, passives, 1, 0)
end, text = Text({{text = '[wavy, bg]restarting...', font = pixul_font, alignment = 'center'}}, global_text_tags)} end, text = Text({{text = '[wavy, ' .. tostring(state.dark_transitions and 'fg' or 'bg') .. ']restarting...', font = pixul_font, alignment = 'center'}}, global_text_tags)}
end} end}
self.mouse_button = Button{group = self.ui, x = gw/2, y = gh - 150, force_update = true, button_text = 'mouse control: ' .. tostring(state.mouse_control and 'yes' or 'no'), fg_color = 'bg10', bg_color = 'bg', self.mouse_button = Button{group = self.ui, x = gw/2 - 57, y = gh - 150, force_update = true, button_text = 'mouse control: ' .. tostring(state.mouse_control and 'yes' or 'no'), fg_color = 'bg10', bg_color = 'bg',
action = function(b) action = function(b)
ui_switch1:play{pitch = random:float(0.95, 1.05), volume = 0.5} ui_switch1:play{pitch = random:float(0.95, 1.05), volume = 0.5}
state.mouse_control = not state.mouse_control state.mouse_control = not state.mouse_control
@ -418,6 +419,13 @@ function Arena:update(dt)
input:set_mouse_visible(state.mouse_control) input:set_mouse_visible(state.mouse_control)
end} end}
self.dark_transition_button = Button{group = self.ui, x = gw/2 + 64, y = gh - 150, force_update = true, button_text = 'dark transitions: ' .. tostring(state.dark_transitions and 'yes' or 'no'),
fg_color = 'bg10', bg_color = 'bg', action = function(b)
ui_switch1:play{pitch = random:float(0.95, 1.05), volume = 0.5}
state.dark_transitions = not state.dark_transitions
b:set_text('dark transitions: ' .. tostring(state.dark_transitions and 'yes' or 'no'))
end}
self.sfx_button = Button{group = self.ui, x = gw/2 - 46, y = gh - 175, force_update = true, button_text = 'sounds (n): ' .. tostring(state.volume_muted and 'no' or 'yes'), fg_color = 'bg10', bg_color = 'bg', self.sfx_button = Button{group = self.ui, x = gw/2 - 46, y = gh - 175, force_update = true, button_text = 'sounds (n): ' .. tostring(state.volume_muted and 'no' or 'yes'), fg_color = 'bg10', bg_color = 'bg',
action = function(b) action = function(b)
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}
@ -547,6 +555,7 @@ function Arena:update(dt)
if self.resume_button then self.resume_button.dead = true; self.resume_button = nil end if self.resume_button then self.resume_button.dead = true; self.resume_button = nil end
if self.restart_button then self.restart_button.dead = true; self.restart_button = nil end if self.restart_button then self.restart_button.dead = true; self.restart_button = nil end
if self.mouse_button then self.mouse_button.dead = true; self.mouse_button = nil end if self.mouse_button then self.mouse_button.dead = true; self.mouse_button = nil end
if self.dark_transition_button then self.dark_transition_button.dead = true; self.dark_transition_button = nil end
if self.sfx_button then self.sfx_button.dead = true; self.sfx_button = nil end if self.sfx_button then self.sfx_button.dead = true; self.sfx_button = nil end
if self.music_button then self.music_button.dead = true; self.music_button = nil end if self.music_button then self.music_button.dead = true; self.music_button = nil end
if self.video_button_1 then self.video_button_1.dead = true; self.video_button_1 = nil end if self.video_button_1 then self.video_button_1.dead = true; self.video_button_1 = nil end
@ -570,24 +579,24 @@ function Arena:update(dt)
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}
ui_switch1:play{pitch = random:float(0.95, 1.05), volume = 0.5} ui_switch1:play{pitch = random:float(0.95, 1.05), volume = 0.5}
TransitionEffect{group = main.transitions, x = gw/2, y = gh/2, color = fg[0], transition_action = function() TransitionEffect{group = main.transitions, x = gw/2, y = gh/2, color = state.dark_transitions and bg[-2] or fg[0], transition_action = function()
slow_amount = 1 slow_amount = 1
gold = 3 gold = 3
passives = {} passives = {}
main_song_instance:stop() main_song_instance:stop()
run_passive_pool_by_tiers = { run_passive_pool = {
[1] = { 'wall_echo', 'wall_rider', 'centipede', 'temporal_chains', 'amplify', 'amplify_x', 'ballista', 'ballista_x', 'blunt_arrow', 'berserking', 'unwavering_stance', 'assassination', 'unleash', 'blessing', 'centipede', 'ouroboros_technique_r', 'ouroboros_technique_l', 'amplify', 'resonance', 'ballista', 'call_of_the_void', 'crucio', 'speed_3', 'damage_4', 'level_5', 'death_6', 'lasting_7',
'hex_master', 'force_push', 'spawning_pool'}, 'defensive_stance', 'offensive_stance', 'kinetic_bomb', 'porcupine_technique', 'last_stand', 'seeping', 'deceleration', 'annihilation', 'malediction', 'pandemic', 'whispers_of_doom',
[2] = {'ouroboros_technique_r', 'ouroboros_technique_l', 'intimidation', 'vulnerability', 'resonance', 'point_blank', 'longshot', 'explosive_arrow', 'chronomancy', 'awakening', 'ultimatum', 'echo_barrage', 'tremor', 'heavy_impact', 'fracture', 'meat_shield', 'hive', 'baneling_burst', 'blunt_arrow', 'explosive_arrow', 'divine_machine_arrow', 'chronomancy', 'awakening', 'divine_punishment',
'reinforce', 'payback', 'whispers_of_doom', 'heavy_impact', 'immolation', 'call_of_the_void'}, 'assassination', 'flying_daggers', 'ultimatum', 'magnify', 'echo_barrage', 'unleash', 'reinforce', 'payback', 'enchanted', 'freezing_field', 'burning_field', 'gravity_field', 'magnetism',
[3] = {'divine_machine_arrow', 'divine_punishment', 'flying_daggers', 'crucio', 'hive', 'void_rift'}, 'insurance', 'dividends', 'berserking', 'unwavering_stance', 'unrelenting_stance'
} }
max_units = 7 + current_new_game_plus max_units = 7 + current_new_game_plus
main:add(BuyScreen'buy_screen') main:add(BuyScreen'buy_screen')
locked_state = nil locked_state = nil
system.save_run() system.save_run()
main:go_to('buy_screen', 0, {}, passives, 1, 0) main:go_to('buy_screen', 0, {}, passives, 1, 0)
end, text = Text({{text = '[wavy, bg]restarting...', font = pixul_font, alignment = 'center'}}, global_text_tags)} end, text = Text({{text = '[wavy, ' .. tostring(state.dark_transitions and 'fg' or 'bg') .. ']restarting...', font = pixul_font, alignment = 'center'}}, global_text_tags)}
end end
if input.escape.pressed then if input.escape.pressed then
@ -695,14 +704,14 @@ function Arena:quit()
end end
end) end)
if current_new_game_plus == 1 then if current_new_game_plus == 2 then
state.achievement_new_game_1 = true state.achievement_new_game_1 = true
system.save_state() system.save_state()
steam.userStats.setAchievement('NEW_GAME_1') steam.userStats.setAchievement('NEW_GAME_1')
steam.userStats.storeStats() steam.userStats.storeStats()
end end
if current_new_game_plus == 5 then if current_new_game_plus == 6 then
state.achievement_new_game_5 = true state.achievement_new_game_5 = true
system.save_state() system.save_state()
steam.userStats.setAchievement('GAME_COMPLETE') steam.userStats.setAchievement('GAME_COMPLETE')
@ -877,23 +886,17 @@ function Arena:set_passives(from_reroll)
local w = 3*card_w + 2*20 local w = 3*card_w + 2*20
self.choosing_passives = true self.choosing_passives = true
self.cards = {} self.cards = {}
local tier_1 = random:weighted_pick(unpack(level_to_passive_tier_weights[level or self.level])) local passive_1 = random:table_remove(run_passive_pool)
local tier_2 = random:weighted_pick(unpack(level_to_passive_tier_weights[level or self.level])) local passive_2 = random:table_remove(run_passive_pool)
local tier_3 = random:weighted_pick(unpack(level_to_passive_tier_weights[level or self.level])) local passive_3 = random:table_remove(run_passive_pool)
local passive_1 = random:table_remove(run_passive_pool_by_tiers[tier_1])
local passive_2 = random:table_remove(run_passive_pool_by_tiers[tier_2])
local passive_3 = random:table_remove(run_passive_pool_by_tiers[tier_3])
if passive_1 then if passive_1 then
table.insert(self.cards, table.insert(self.cards, PassiveCard{group = main.current.ui, x = gw/2 - w/2 + 0*(card_w + 20) + card_w/2, y = gh/2 - 6, w = card_w, h = card_h, card_i = 1, arena = self, passive = passive_1, force_update = true})
PassiveCard{group = main.current.ui, x = gw/2 - w/2 + 0*(card_w + 20) + card_w/2, y = gh/2 - 6, w = card_w, h = card_h, card_i = 1, tier = tier_1, arena = self, passive = passive_1, force_update = true})
end end
if passive_2 then if passive_2 then
table.insert(self.cards, table.insert(self.cards, PassiveCard{group = main.current.ui, x = gw/2 - w/2 + 1*(card_w + 20) + card_w/2, y = gh/2 - 6, w = card_w, h = card_h, card_i = 2, arena = self, passive = passive_2, force_update = true})
PassiveCard{group = main.current.ui, x = gw/2 - w/2 + 1*(card_w + 20) + card_w/2, y = gh/2 - 6, w = card_w, h = card_h, card_i = 2, tier = tier_2, arena = self, passive = passive_2, force_update = true})
end end
if passive_3 then if passive_3 then
table.insert(self.cards, table.insert(self.cards, PassiveCard{group = main.current.ui, x = gw/2 - w/2 + 2*(card_w + 20) + card_w/2, y = gh/2 - 6, w = card_w, h = card_h, card_i = 3, arena = self, passive = passive_3, force_update = true})
PassiveCard{group = main.current.ui, x = gw/2 - w/2 + 2*(card_w + 20) + card_w/2, y = gh/2 - 6, w = card_w, h = card_h, card_i = 3, tier = tier_3, arena = self, passive = passive_3, force_update = true})
end end
self.passive_text = Text2{group = self.ui, x = gw/2, y = gh/2 - 65, lines = {{text = '[fg, wavy]choose one', font = fat_font, alignment = 'center'}}} self.passive_text = Text2{group = self.ui, x = gw/2, y = gh/2 - 65, lines = {{text = '[fg, wavy]choose one', font = fat_font, alignment = 'center'}}}
if not passive_1 and not passive_2 and not passive_3 then if not passive_1 and not passive_2 and not passive_3 then
@ -905,8 +908,8 @@ end
function Arena:restore_passives_to_pool(j) function Arena:restore_passives_to_pool(j)
for i = 1, 3 do for i = 1, 3 do
if i ~= j then if i ~= j then
if self.cards[i] and run_passive_pool_by_tiers[self.cards[i].tier] then if self.cards[i] then
table.insert(run_passive_pool_by_tiers[self.cards[i].tier], self.cards[i].passive) table.insert(run_passive_pool, self.cards[i].passive)
end end
end end
end end
@ -971,7 +974,7 @@ end
function Arena:die() function Arena:die()
if not self.died_text and not self.won and not self.arena_clear_text then if not self.died_text and not self.won and not self.arena_clear_text then
input:set_mouse_visible(false) input:set_mouse_visible(true)
self.t:cancel('divine_punishment') self.t:cancel('divine_punishment')
self.died = true self.died = true
locked_state = nil locked_state = nil
@ -989,23 +992,23 @@ function Arena:die()
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}
ui_switch1:play{pitch = random:float(0.95, 1.05), volume = 0.5} ui_switch1:play{pitch = random:float(0.95, 1.05), volume = 0.5}
TransitionEffect{group = main.transitions, x = gw/2, y = gh/2, color = fg[0], transition_action = function() TransitionEffect{group = main.transitions, x = gw/2, y = gh/2, color = state.dark_transitions and bg[-2] or fg[0], transition_action = function()
slow_amount = 1 slow_amount = 1
gold = 3 gold = 3
passives = {} passives = {}
main_song_instance:stop() main_song_instance:stop()
run_passive_pool_by_tiers = { run_passive_pool = {
[1] = { 'wall_echo', 'wall_rider', 'centipede', 'temporal_chains', 'amplify', 'amplify_x', 'ballista', 'ballista_x', 'blunt_arrow', 'berserking', 'unwavering_stance', 'assassination', 'unleash', 'blessing', 'centipede', 'ouroboros_technique_r', 'ouroboros_technique_l', 'amplify', 'resonance', 'ballista', 'call_of_the_void', 'crucio', 'speed_3', 'damage_4', 'level_5', 'death_6', 'lasting_7',
'hex_master', 'force_push', 'spawning_pool'}, 'defensive_stance', 'offensive_stance', 'kinetic_bomb', 'porcupine_technique', 'last_stand', 'seeping', 'deceleration', 'annihilation', 'malediction', 'pandemic', 'whispers_of_doom',
[2] = {'ouroboros_technique_r', 'ouroboros_technique_l', 'intimidation', 'vulnerability', 'resonance', 'point_blank', 'longshot', 'explosive_arrow', 'chronomancy', 'awakening', 'ultimatum', 'echo_barrage', 'tremor', 'heavy_impact', 'fracture', 'meat_shield', 'hive', 'baneling_burst', 'blunt_arrow', 'explosive_arrow', 'divine_machine_arrow', 'chronomancy', 'awakening', 'divine_punishment',
'reinforce', 'payback', 'whispers_of_doom', 'heavy_impact', 'immolation', 'call_of_the_void'}, 'assassination', 'flying_daggers', 'ultimatum', 'magnify', 'echo_barrage', 'unleash', 'reinforce', 'payback', 'enchanted', 'freezing_field', 'burning_field', 'gravity_field', 'magnetism',
[3] = {'divine_machine_arrow', 'divine_punishment', 'flying_daggers', 'crucio', 'hive', 'void_rift'}, 'insurance', 'dividends', 'berserking', 'unwavering_stance', 'unrelenting_stance'
} }
max_units = 7 + current_new_game_plus max_units = 7 + current_new_game_plus
main:add(BuyScreen'buy_screen') main:add(BuyScreen'buy_screen')
system.save_run() system.save_run()
main:go_to('buy_screen', 0, {}, passives, 1, 0) main:go_to('buy_screen', 0, {}, passives, 1, 0)
end, text = Text({{text = '[wavy, bg]restarting...', font = pixul_font, alignment = 'center'}}, global_text_tags)} end, text = Text({{text = '[wavy, ' .. tostring(state.dark_transitions and 'fg' or 'bg') .. ']restarting...', font = pixul_font, alignment = 'center'}}, global_text_tags)}
end} end}
end) end)
return true return true
@ -1084,7 +1087,7 @@ function Arena:transition()
self.transitioning = true self.transitioning = true
if not self.lock then locked_state = nil end if not self.lock then locked_state = nil end
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}
TransitionEffect{group = main.transitions, x = self.player.x, y = self.player.y, color = self.color, transition_action = function(t) TransitionEffect{group = main.transitions, x = self.player.x, y = self.player.y, color = state.dark_transitions and bg[-2] or self.color, transition_action = function(t)
if self.level % 2 == 0 and self.shop_level < 5 then if self.level % 2 == 0 and self.shop_level < 5 then
self.shop_xp = self.shop_xp + 1 self.shop_xp = self.shop_xp + 1
local max_xp = 0 local max_xp = 0
@ -1100,36 +1103,39 @@ function Arena:transition()
end end
slow_amount = 1 slow_amount = 1
main:add(BuyScreen'buy_screen') main:add(BuyScreen'buy_screen')
system.save_run(self.level, gold, self.units, self.passives, self.shop_level, self.shop_xp, run_passive_pool_by_tiers, locked_state) system.save_run(self.level, gold, self.units, self.passives, self.shop_level, self.shop_xp, run_passive_pool, locked_state)
main:go_to('buy_screen', self.level, self.units, self.passives, self.shop_level, self.shop_xp) main:go_to('buy_screen', self.level, self.units, self.passives, self.shop_level, self.shop_xp)
t.t:after(0.1, function() t.t:after(0.1, function()
t.text:set_text({ t.text:set_text({
{text = '[nudge_down, bg]gold gained: ' .. tostring(self.gold_gained or 0) .. ' + ' .. tostring(self.gold_picked_up or 0), font = pixul_font, alignment = 'center', height_multiplier = 1.5}, {text = '[nudge_down, ' .. tostring(state.dark_transitions and 'fg' or 'bg') .. ']gold gained: ' .. tostring(self.gold_gained or 0) .. ' + ' .. tostring(self.gold_picked_up or 0), font = pixul_font,
{text = '[wavy_lower, bg]interest: 0', font = pixul_font, alignment = 'center', height_multiplier = 1.5}, alignment = 'center', height_multiplier = 1.5},
{text = '[wavy_lower, bg]total: 0', font = pixul_font, alignment = 'center'} {text = '[wavy_lower, ' .. tostring(state.dark_transitions and 'fg' or 'bg') .. ']interest: 0', font = pixul_font, alignment = 'center', height_multiplier = 1.5},
{text = '[wavy_lower, ' .. tostring(state.dark_transitions and 'fg' or 'bg') .. ']total: 0', font = pixul_font, alignment = 'center'}
}) })
_G[random:table{'coins1', 'coins2', 'coins3'}]:play{pitch = random:float(0.95, 1.05), volume = 0.5} _G[random:table{'coins1', 'coins2', 'coins3'}]:play{pitch = random:float(0.95, 1.05), volume = 0.5}
t.t:after(0.2, function() t.t:after(0.2, function()
t.text:set_text({ t.text:set_text({
{text = '[wavy_lower, bg]gold gained: ' .. tostring(self.gold_gained or 0) .. ' + ' .. tostring(self.gold_picked_up or 0), font = pixul_font, alignment = 'center', height_multiplier = 1.5}, {text = '[wavy_lower, ' .. tostring(state.dark_transitions and 'fg' or 'bg') .. ']gold gained: ' .. tostring(self.gold_gained or 0) .. ' + ' .. tostring(self.gold_picked_up or 0), font = pixul_font,
{text = '[nudge_down, bg]interest: ' .. tostring(self.interest or 0), font = pixul_font, alignment = 'center', height_multiplier = 1.5}, alignment = 'center', height_multiplier = 1.5},
{text = '[wavy_lower, bg]total: 0', font = pixul_font, alignment = 'center'} {text = '[nudge_down, ' .. tostring(state.dark_transitions and 'fg' or 'bg') .. ']interest: ' .. tostring(self.interest or 0), font = pixul_font, alignment = 'center', height_multiplier = 1.5},
{text = '[wavy_lower, ' .. tostring(state.dark_transitions and 'fg' or 'bg') .. ']total: 0', font = pixul_font, alignment = 'center'}
}) })
_G[random:table{'coins1', 'coins2', 'coins3'}]:play{pitch = random:float(0.95, 1.05), volume = 0.5} _G[random:table{'coins1', 'coins2', 'coins3'}]:play{pitch = random:float(0.95, 1.05), volume = 0.5}
t.t:after(0.2, function() t.t:after(0.2, function()
t.text:set_text({ t.text:set_text({
{text = '[wavy_lower, bg]gold gained: ' .. tostring(self.gold_gained or 0) .. ' + ' .. tostring(self.gold_picked_up or 0), font = pixul_font, alignment = 'center', height_multiplier = 1.5}, {text = '[wavy_lower, ' .. tostring(state.dark_transitions and 'fg' or 'bg') .. ']gold gained: ' .. tostring(self.gold_gained or 0) .. ' + ' .. tostring(self.gold_picked_up or 0), font = pixul_font,
{text = '[wavy_lower, bg]interest: ' .. tostring(self.interest or 0), font = pixul_font, alignment = 'center', height_multiplier = 1.5}, alignment = 'center', height_multiplier = 1.5},
{text = '[nudge_down, bg]total: ' .. tostring((self.gold_gained or 0) + (self.interest or 0) + (self.gold_picked_up or 0)), font = pixul_font, alignment = 'center'} {text = '[wavy_lower, ' .. tostring(state.dark_transitions and 'fg' or 'bg') .. ']interest: ' .. tostring(self.interest or 0), font = pixul_font, alignment = 'center', height_multiplier = 1.5},
{text = '[nudge_down, ' .. tostring(state.dark_transitions and 'fg' or 'bg') .. ']total: ' .. tostring((self.gold_gained or 0) + (self.interest or 0) + (self.gold_picked_up or 0)), font = pixul_font, alignment = 'center'}
}) })
_G[random:table{'coins1', 'coins2', 'coins3'}]:play{pitch = random:float(0.95, 1.05), volume = 0.5} _G[random:table{'coins1', 'coins2', 'coins3'}]:play{pitch = random:float(0.95, 1.05), volume = 0.5}
end) end)
end) end)
end) end)
end, text = Text({ end, text = Text({
{text = '[wavy_lower, bg]gold gained: 0 + 0', font = pixul_font, alignment = 'center', height_multiplier = 1.5}, {text = '[wavy_lower, ' .. tostring(state.dark_transitions and 'fg' or 'bg') .. ']gold gained: 0 + 0', font = pixul_font, alignment = 'center', height_multiplier = 1.5},
{text = '[wavy_lower, bg]interest: 0', font = pixul_font, alignment = 'center', height_multiplier = 1.5}, {text = '[wavy_lower, ' .. tostring(state.dark_transitions and 'fg' or 'bg') .. ']interest: 0', font = pixul_font, alignment = 'center', height_multiplier = 1.5},
{text = '[wavy_lower, bg]total: 0', font = pixul_font, alignment = 'center'} {text = '[wavy_lower, ' .. tostring(state.dark_transitions and 'fg' or 'bg') .. ']total: 0', font = pixul_font, alignment = 'center'}
}, global_text_tags)} }, global_text_tags)}
end end

Binary file not shown.

After

Width:  |  Height:  |  Size: 476 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 445 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 459 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 398 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 500 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 521 B

View File

Before

Width:  |  Height:  |  Size: 279 B

After

Width:  |  Height:  |  Size: 279 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 503 B

View File

Before

Width:  |  Height:  |  Size: 351 B

After

Width:  |  Height:  |  Size: 351 B

View File

Before

Width:  |  Height:  |  Size: 337 B

After

Width:  |  Height:  |  Size: 337 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 426 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 456 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 468 B

View File

Before

Width:  |  Height:  |  Size: 405 B

After

Width:  |  Height:  |  Size: 405 B

View File

Before

Width:  |  Height:  |  Size: 245 B

After

Width:  |  Height:  |  Size: 245 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 366 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 440 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 380 B

View File

Before

Width:  |  Height:  |  Size: 361 B

After

Width:  |  Height:  |  Size: 361 B

View File

Before

Width:  |  Height:  |  Size: 335 B

After

Width:  |  Height:  |  Size: 335 B

View File

Before

Width:  |  Height:  |  Size: 276 B

After

Width:  |  Height:  |  Size: 276 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 483 B

View File

Before

Width:  |  Height:  |  Size: 431 B

After

Width:  |  Height:  |  Size: 431 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 472 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 471 B

View File

Before

Width:  |  Height:  |  Size: 425 B

After

Width:  |  Height:  |  Size: 425 B

View File

Before

Width:  |  Height:  |  Size: 322 B

After

Width:  |  Height:  |  Size: 322 B

View File

@ -137,23 +137,23 @@ function BuyScreen:on_enter(from, level, units, passives, shop_level, shop_xp)
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}
ui_switch1:play{pitch = random:float(0.95, 1.05), volume = 0.5} ui_switch1:play{pitch = random:float(0.95, 1.05), volume = 0.5}
locked_state = nil locked_state = nil
TransitionEffect{group = main.transitions, x = gw/2, y = gh/2, color = fg[0], transition_action = function() TransitionEffect{group = main.transitions, x = gw/2, y = gh/2, color = state.dark_transitions and bg[-2] or fg[0], transition_action = function()
slow_amount = 1 slow_amount = 1
gold = 3 gold = 3
passives = {} passives = {}
main_song_instance:stop() main_song_instance:stop()
run_passive_pool_by_tiers = { run_passive_pool = {
[1] = {'wall_echo', 'wall_rider', 'centipede', 'temporal_chains', 'amplify', 'amplify_x', 'ballista', 'ballista_x', 'blunt_arrow', 'berserking', 'unwavering_stance', 'assassination', 'unleash', 'blessing', 'centipede', 'ouroboros_technique_r', 'ouroboros_technique_l', 'amplify', 'resonance', 'ballista', 'call_of_the_void', 'crucio', 'speed_3', 'damage_4', 'level_5', 'death_6', 'lasting_7',
'hex_master', 'force_push', 'spawning_pool'}, 'defensive_stance', 'offensive_stance', 'kinetic_bomb', 'porcupine_technique', 'last_stand', 'seeping', 'deceleration', 'annihilation', 'malediction', 'pandemic', 'whispers_of_doom',
[2] = {'ouroboros_technique_r', 'ouroboros_technique_l', 'intimidation', 'vulnerability', 'resonance', 'point_blank', 'longshot', 'explosive_arrow', 'chronomancy', 'awakening', 'ultimatum', 'echo_barrage', 'tremor', 'heavy_impact', 'fracture', 'meat_shield', 'hive', 'baneling_burst', 'blunt_arrow', 'explosive_arrow', 'divine_machine_arrow', 'chronomancy', 'awakening', 'divine_punishment',
'reinforce', 'payback', 'whispers_of_doom', 'heavy_impact', 'immolation', 'call_of_the_void'}, 'assassination', 'flying_daggers', 'ultimatum', 'magnify', 'echo_barrage', 'unleash', 'reinforce', 'payback', 'enchanted', 'freezing_field', 'burning_field', 'gravity_field', 'magnetism',
[3] = {'divine_machine_arrow', 'divine_punishment', 'flying_daggers', 'crucio', 'hive', 'void_rift'}, 'insurance', 'dividends', 'berserking', 'unwavering_stance', 'unrelenting_stance'
} }
max_units = 7 + current_new_game_plus max_units = 7 + current_new_game_plus
main:add(BuyScreen'buy_screen') main:add(BuyScreen'buy_screen')
system.save_run() system.save_run()
main:go_to('buy_screen', 0, {}, passives, 1, 0) main:go_to('buy_screen', 0, {}, passives, 1, 0)
end, text = Text({{text = '[wavy, bg]restarting...', font = pixul_font, alignment = 'center'}}, global_text_tags)} end, text = Text({{text = '[wavy, ' .. tostring(state.dark_transitions and 'fg' or 'bg') .. ']restarting...', font = pixul_font, alignment = 'center'}}, global_text_tags)}
end, mouse_enter = function(b) end, mouse_enter = function(b)
b.info_text = InfoText{group = main.current.ui, force_update = true} b.info_text = InfoText{group = main.current.ui, force_update = true}
b.info_text:activate({ b.info_text:activate({
@ -169,7 +169,10 @@ function BuyScreen:on_enter(from, level, units, passives, shop_level, shop_xp)
trigger:tween(1, main_song_instance, {volume = 0.2}, math.linear) trigger:tween(1, main_song_instance, {volume = 0.2}, math.linear)
if self.level == 1 then if self.level == 1 then
self.screen_text = Text2{group = self.ui, x = gw/2, y = gh/2, lines = {{text = '[bg3]press K if screen is too large', font = pixul_font, alignment = 'center'}}} self.screen_text = Text2{group = self.ui, x = gw/2, y = gh/2, lines = {
{text = '[bg3]press K if screen is too large', font = pixul_font, alignment = 'center'},
{text = '[bg3]press L if screen is too small', font = pixul_font, alignment = 'center'},
}}
self.t:after(8, function() self.t:after(8, function()
self.t:tween(0.2, self.screen_text, {sy = 0}, math.linear, function() self.screen_text.sy = 0 end) self.t:tween(0.2, self.screen_text, {sy = 0}, math.linear, function() self.screen_text.sy = 0 end)
end) end)
@ -335,7 +338,7 @@ function BuyScreen:set_cards(shop_level, dont_spawn_effect, first_call)
local unit_2 local unit_2
local unit_3 local unit_3
local shop_level = shop_level or 1 local shop_level = shop_level or 1
local tier_weights = get_shop_odds_by_level(shop_level) local tier_weights = level_to_shop_odds[shop_level]
repeat repeat
unit_1 = random:table(tier_to_characters[random:weighted_pick(unpack(tier_weights))]) unit_1 = random:table(tier_to_characters[random:weighted_pick(unpack(tier_weights))])
unit_2 = random:table(tier_to_characters[random:weighted_pick(unpack(tier_weights))]) unit_2 = random:table(tier_to_characters[random:weighted_pick(unpack(tier_weights))])
@ -379,9 +382,9 @@ function BuyScreen:set_items()
if self.items then for _, item in ipairs(self.items) do item:die() end end if self.items then for _, item in ipairs(self.items) do item:die() end end
self.items = {} self.items = {}
local y = 182 local y = 182
for k, item in ipairs(self.passives) do for k, passive in ipairs(self.passives) do
local i, j = math.index_to_coordinates(k, 4) local i, j = math.index_to_coordinates(k, 4)
table.insert(self.items, ItemCard{group = self.main, x = 45 + (i-1)*60, y = y + (j-1)*50, w = 40, h = 50, passive = item}) table.insert(self.items, ItemCard{group = self.main, x = 45 + (i-1)*60, y = y + (j-1)*50, w = 40, h = 50, passive = passive.passive , level = passive.level, xp = passive.xp})
end end
end end
@ -521,23 +524,23 @@ function RestartButton:update(dt)
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}
ui_switch1:play{pitch = random:float(0.95, 1.05), volume = 0.5} ui_switch1:play{pitch = random:float(0.95, 1.05), volume = 0.5}
TransitionEffect{group = main.transitions, x = gw/2, y = gh/2, color = fg[0], transition_action = function() TransitionEffect{group = main.transitions, x = gw/2, y = gh/2, color = state.dark_transitions and bg[-2] or fg[0], transition_action = function()
slow_amount = 1 slow_amount = 1
gold = 3 gold = 3
passives = {} passives = {}
main_song_instance:stop() main_song_instance:stop()
run_passive_pool_by_tiers = { run_passive_pool = {
[1] = { 'wall_echo', 'wall_rider', 'centipede', 'temporal_chains', 'amplify', 'amplify_x', 'ballista', 'ballista_x', 'blunt_arrow', 'berserking', 'unwavering_stance', 'assassination', 'unleash', 'blessing', 'centipede', 'ouroboros_technique_r', 'ouroboros_technique_l', 'amplify', 'resonance', 'ballista', 'call_of_the_void', 'crucio', 'speed_3', 'damage_4', 'level_5', 'death_6', 'lasting_7',
'hex_master', 'force_push', 'spawning_pool'}, 'defensive_stance', 'offensive_stance', 'kinetic_bomb', 'porcupine_technique', 'last_stand', 'seeping', 'deceleration', 'annihilation', 'malediction', 'pandemic', 'whispers_of_doom',
[2] = {'ouroboros_technique_r', 'ouroboros_technique_l', 'intimidation', 'vulnerability', 'resonance', 'point_blank', 'longshot', 'explosive_arrow', 'chronomancy', 'awakening', 'ultimatum', 'echo_barrage', 'tremor', 'heavy_impact', 'fracture', 'meat_shield', 'hive', 'baneling_burst', 'blunt_arrow', 'explosive_arrow', 'divine_machine_arrow', 'chronomancy', 'awakening', 'divine_punishment',
'reinforce', 'payback', 'whispers_of_doom', 'heavy_impact', 'immolation', 'call_of_the_void'}, 'assassination', 'flying_daggers', 'ultimatum', 'magnify', 'echo_barrage', 'unleash', 'reinforce', 'payback', 'enchanted', 'freezing_field', 'burning_field', 'gravity_field', 'magnetism',
[3] = {'divine_machine_arrow', 'divine_punishment', 'flying_daggers', 'crucio', 'hive', 'void_rift'}, 'insurance', 'dividends', 'berserking', 'unwavering_stance', 'unrelenting_stance'
} }
system.save_state() system.save_state()
main:add(BuyScreen'buy_screen') main:add(BuyScreen'buy_screen')
system.save_run() system.save_run()
main:go_to('buy_screen', 0, {}, passives, 1, 0) main:go_to('buy_screen', 0, {}, passives, 1, 0)
end, text = Text({{text = '[wavy, bg]restarting...', font = pixul_font, alignment = 'center'}}, global_text_tags)} end, text = Text({{text = '[wavy, ' .. tostring(state.dark_transitions and 'fg' or 'bg') .. ']restarting...', font = pixul_font, alignment = 'center'}}, global_text_tags)}
end end
end end
@ -682,11 +685,11 @@ function GoButton:update(dt)
ui_switch1:play{pitch = random:float(0.95, 1.05), volume = 0.5} ui_switch1:play{pitch = random:float(0.95, 1.05), volume = 0.5}
ui_transition1:play{pitch = random:float(0.95, 1.05), volume = 0.5} ui_transition1:play{pitch = random:float(0.95, 1.05), volume = 0.5}
self.transitioning = true self.transitioning = true
system.save_run(self.parent.level, gold, self.parent.units, passives, self.parent.shop_level, self.parent.shop_xp, run_passive_pool_by_tiers, locked_state) system.save_run(self.parent.level, gold, self.parent.units, passives, self.parent.shop_level, self.parent.shop_xp, run_passive_pool, locked_state)
TransitionEffect{group = main.transitions, x = self.x, y = self.y, color = character_colors[random:table(self.parent.units).character], transition_action = function() TransitionEffect{group = main.transitions, x = self.x, y = self.y, color = state.dark_transitions and bg[-2] or character_colors[random:table(self.parent.units).character], transition_action = function()
main:add(Arena'arena') main:add(Arena'arena')
main:go_to('arena', ((self.parent.first_screen and 1) or (self.parent.level + 1)), self.parent.units, self.parent.passives, self.parent.shop_level, self.parent.shop_xp, self.parent.locked) main:go_to('arena', ((self.parent.first_screen and 1) or (self.parent.level + 1)), self.parent.units, self.parent.passives, self.parent.shop_level, self.parent.shop_xp, self.parent.locked)
end, text = Text({{text = '[wavy, bg]level ' .. ((self.parent.first_screen and 1) or (self.parent.level + 1)) .. '/25', font = pixul_font, alignment = 'center'}}, global_text_tags)} end, text = Text({{text = '[wavy, ' .. tostring(state.dark_transitions and 'fg' or 'bg') .. ']level ' .. ((self.parent.first_screen and 1) or (self.parent.level + 1)) .. '/25', font = pixul_font, alignment = 'center'}}, global_text_tags)}
end end
end end
end end
@ -736,7 +739,7 @@ function LockButton:update(dt)
if not self.parent.locked then locked_state = nil end if not self.parent.locked then locked_state = nil end
if self.parent.locked then if self.parent.locked then
locked_state = {locked = true, cards = {self.parent.cards[1] and self.parent.cards[1].unit, self.parent.cards[2] and self.parent.cards[2].unit, self.parent.cards[3] and self.parent.cards[3].unit}} locked_state = {locked = true, cards = {self.parent.cards[1] and self.parent.cards[1].unit, self.parent.cards[2] and self.parent.cards[2].unit, self.parent.cards[3] and self.parent.cards[3].unit}}
system.save_run(self.parent.level == 1 and 0 or self.parent.level, gold, self.parent.units, passives, self.parent.shop_level, self.parent.shop_xp, run_passive_pool_by_tiers, locked_state) system.save_run(self.parent.level == 1 and 0 or self.parent.level, gold, self.parent.units, passives, self.parent.shop_level, self.parent.shop_xp, run_passive_pool, locked_state)
end end
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}
self.selected = true self.selected = true
@ -817,7 +820,7 @@ function LevelButton:update(dt)
gold = gold - 5 gold = gold - 5
self.parent.shop_text:set_text{{text = '[wavy_mid, fg]shop [fg]- [fg, nudge_down]gold: [yellow, nudge_down]' .. gold, font = pixul_font, alignment = 'center'}} self.parent.shop_text:set_text{{text = '[wavy_mid, fg]shop [fg]- [fg, nudge_down]gold: [yellow, nudge_down]' .. gold, font = pixul_font, alignment = 'center'}}
self.text = Text({{text = '[bg10]' .. tostring(self.parent.shop_level), font = pixul_font, alignment = 'center'}}, global_text_tags) self.text = Text({{text = '[bg10]' .. tostring(self.parent.shop_level), font = pixul_font, alignment = 'center'}}, global_text_tags)
system.save_run(self.parent.level, gold, self.parent.units, passives, self.parent.shop_level, self.parent.shop_xp, run_passive_pool_by_tiers, locked_state) system.save_run(self.parent.level, gold, self.parent.units, passives, self.parent.shop_level, self.parent.shop_xp, run_passive_pool, locked_state)
end end
end end
end end
@ -947,7 +950,7 @@ function RerollButton:update(dt)
self.spring:pull(0.2, 200, 10) self.spring:pull(0.2, 200, 10)
gold = gold - 2 gold = gold - 2
self.parent.shop_text:set_text{{text = '[wavy_mid, fg]shop [fg]- [fg, nudge_down]gold: [yellow, nudge_down]' .. gold, font = pixul_font, alignment = 'center'}} self.parent.shop_text:set_text{{text = '[wavy_mid, fg]shop [fg]- [fg, nudge_down]gold: [yellow, nudge_down]' .. gold, font = pixul_font, alignment = 'center'}}
system.save_run(self.parent.level, gold, self.parent.units, passives, self.parent.shop_level, self.parent.shop_xp, run_passive_pool_by_tiers, locked_state) system.save_run(self.parent.level, gold, self.parent.units, 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 < 10 and not self.free_reroll then if gold < 10 and not self.free_reroll then
@ -1289,6 +1292,7 @@ function PassiveCard:init(args)
self.interact_with_mouse = true self.interact_with_mouse = true
self.passive_name = Text({{text = '[fg, wavy_mid]' .. passive_names[self.passive], font = pixul_font, alignment = 'center'}}, global_text_tags) self.passive_name = Text({{text = '[fg, wavy_mid]' .. passive_names[self.passive], font = pixul_font, alignment = 'center'}}, global_text_tags)
self.passive_description = passive_descriptions[self.passive] self.passive_description = passive_descriptions[self.passive]
self.spring:pull(0.2, 200, 10)
end end
@ -1298,7 +1302,7 @@ function PassiveCard:update(dt)
if self.selected and input.m1.pressed and self.arena.choosing_passives then if self.selected and input.m1.pressed and self.arena.choosing_passives then
self.arena.choosing_passives = false self.arena.choosing_passives = false
table.insert(self.arena.passives, self.passive) table.insert(self.arena.passives, {passive = self.passive, level = 1, xp = 0})
self.arena:restore_passives_to_pool(self.card_i) self.arena:restore_passives_to_pool(self.card_i)
trigger:tween(0.25, _G, {slow_amount = 1}, math.linear, function() trigger:tween(0.25, _G, {slow_amount = 1}, math.linear, function()
slow_amount = 1 slow_amount = 1
@ -1381,7 +1385,7 @@ function ItemCard:on_mouse_enter()
self.info_text = InfoText{group = main.current.ui, force_update = true} self.info_text = InfoText{group = main.current.ui, force_update = true}
self.info_text:activate({ self.info_text:activate({
{text = '[fg]' .. passive_names[self.passive], font = pixul_font, alignment = 'center', height_multiplier = 1.25}, {text = '[fg]' .. passive_names[self.passive], font = pixul_font, alignment = 'center', height_multiplier = 1.25},
{text = passive_descriptions[self.passive], font = pixul_font, alignment = 'center', height_multiplier = 1.25}, {text = passive_descriptions_level[self.passive](self.level), font = pixul_font, alignment = 'center', height_multiplier = 1.25},
}, 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
end end
@ -1462,7 +1466,7 @@ function ShopCard:update(dt)
self:die() self:die()
self.parent.cards[self.i] = nil self.parent.cards[self.i] = nil
self.parent:refresh_cards() self.parent:refresh_cards()
system.save_run(self.parent.level == 1 and 0 or self.parent.level, gold, self.parent.units, passives, self.parent.shop_level, self.parent.shop_xp, run_passive_pool_by_tiers, locked_state) system.save_run(self.parent.level == 1 and 0 or self.parent.level, gold, self.parent.units, passives, self.parent.shop_level, self.parent.shop_xp, run_passive_pool, locked_state)
else else
error1:play{pitch = random:float(0.95, 1.05), volume = 0.5} error1:play{pitch = random:float(0.95, 1.05), volume = 0.5}
self.spring:pull(0.2, 200, 10) self.spring:pull(0.2, 200, 10)

View File

@ -137,15 +137,15 @@ function system.load_state()
end end
function system.save_run(level, gold, units, passives, shop_level, shop_xp, run_passive_pool_by_tiers, locked_state) function system.save_run(level, gold, units, passives, shop_level, shop_xp, run_passive_pool, locked_state)
local run = {level = level, gold = gold, units = units, passives = passives, shop_level = shop_level, shop_xp = shop_xp, run_passive_pool_by_tiers = run_passive_pool_by_tiers, locked_state = locked_state} local run = {level = level, gold = gold, units = units, passives = passives, shop_level = shop_level, shop_xp = shop_xp, run_passive_pool= run_passive_pool, locked_state = locked_state}
local str = "return " .. table.tostring(run) local str = "return " .. table.tostring(run)
love.filesystem.write("run_v2.txt", str) love.filesystem.write("run_v3.txt", str)
end end
function system.load_run() function system.load_run()
local chunk = love.filesystem.load("run_v2.txt") local chunk = love.filesystem.load("run_v3.txt")
if chunk then return chunk() if chunk then return chunk()
else return {} end else return {} end
end end

425
main.lua
View File

@ -141,50 +141,62 @@ function init()
voider = Image('voider') voider = Image('voider')
sorcerer = Image('sorcerer') sorcerer = Image('sorcerer')
mercenary = Image('mercenary') mercenary = Image('mercenary')
star = Image('star')
arrow = Image('arrow')
centipede = Image('centipede')
ouroboros_technique_r = Image('ouroboros_technique_r') ouroboros_technique_r = Image('ouroboros_technique_r')
ouroboros_technique_l = Image('ouroboros_technique_l') ouroboros_technique_l = Image('ouroboros_technique_l')
wall_echo = Image('wall_echo')
wall_rider = Image('wall_rider')
centipede = Image('centipede')
intimidation = Image('intimidation')
vulnerability = Image('vulnerability')
temporal_chains = Image('temporal_chains')
amplify = Image('amplify') amplify = Image('amplify')
amplify_x = Image('amplify_x')
resonance = Image('resonance') resonance = Image('resonance')
ballista = Image('ballista') ballista = Image('ballista')
ballista_x = Image('ballista_x') call_of_the_void = Image('call_of_the_void')
point_blank = Image('point_blank') crucio = Image('crucio')
longshot = Image('longshot') speed_3 = Image('speed_3')
damage_4 = Image('damage_4')
level_5 = Image('level_5')
death_6 = Image('death_6')
lasting_7 = Image('lasting_7')
defensive_stance = Image('defensive_stance')
offensive_stance = Image('offensive_stance')
kinetic_bomb = Image('kinetic_bomb')
porcupine_technique = Image('porcupine_technique')
last_stand = Image('last_stand')
seeping = Image('seeping')
deceleration = Image('deceleration')
annihilation = Image('annihilation')
malediction = Image('malediction')
pandemic = Image('pandemic')
whispers_of_doom = Image('whispers_of_doom')
tremor = Image('tremor')
heavy_impact = Image('heavy_impact')
fracture = Image('fracture')
meat_shield = Image('meat_shield')
hive = Image('hive')
baneling_burst = Image('baneling_burst')
blunt_arrow = Image('blunt_arrow') blunt_arrow = Image('blunt_arrow')
explosive_arrow = Image('explosive_arrow') explosive_arrow = Image('explosive_arrow')
divine_machine_arrow = Image('divine_machine_arrow') divine_machine_arrow = Image('divine_machine_arrow')
chronomancy = Image('chronomancy') chronomancy = Image('chronomancy')
awakening = Image('awakening') awakening = Image('awakening')
divine_punishment = Image('divine_punishment') divine_punishment = Image('divine_punishment')
berserking = Image('berserking')
unwavering_stance = Image('unwavering_stance')
ultimatum = Image('ultimatum')
flying_daggers = Image('flying_daggers')
assassination = Image('assassination') assassination = Image('assassination')
flying_daggers = Image('flying_daggers')
ultimatum = Image('ultimatum')
magnify = Image('magnify') magnify = Image('magnify')
echo_barrage = Image('echo_barrage') echo_barrage = Image('echo_barrage')
unleash = Image('unleash') unleash = Image('unleash')
reinforce = Image('reinforce') reinforce = Image('reinforce')
payback = Image('payback') payback = Image('payback')
blessing = Image('blessing') enchanted = Image('enchanted')
hex_master = Image('hex_master') freezing_field = Image('freezing_field')
whispers_of_doom = Image('whispers_of_doom') burning_field = Image('burning_field')
force_push = Image('force_push') gravity_field = Image('gravity_field')
heavy_impact = Image('heavy_impact') magnetism = Image('magnetism')
crucio = Image('crucio') insurance = Image('insurance')
immolation = Image('immolation') dividends = Image('dividends')
call_of_the_void = Image('call_of_the_void') berserking = Image('berserking')
spawning_pool = Image('spawning_pool') unwavering_stance = Image('unwavering_stance')
hive = Image('hive') unrelenting_stance = Image('unrelenting_stance')
void_rift = Image('void_rift')
star = Image('star')
arrow = Image('arrow')
class_colors = { class_colors = {
['warrior'] = yellow[0], ['warrior'] = yellow[0],
@ -904,23 +916,24 @@ function init()
else return 'light_bg' end else return 'light_bg' end
end end
class_descriptions = { class_descriptions = {
['ranger'] = function(lvl) return '[' .. ylb1(lvl) .. ']3[' .. ylb2(lvl) .. ']/6 [fg]- [' .. ylb1(lvl) .. ']8%[' .. ylb2(lvl) .. ']/16% [fg]chance to release a barrage on attack to allied rangers' end, ['ranger'] = function(lvl) return '[' .. ylb1(lvl) .. ']3[light_bg]/[' .. ylb2(lvl) .. ']6 [fg]- [' .. ylb1(lvl) .. ']8%[light_bg]/[' .. ylb2(lvl) .. ']16% [fg]chance to release a barrage on attack to allied rangers' end,
['warrior'] = function(lvl) return '[' .. ylb1(lvl) .. ']3[' .. ylb2(lvl) .. ']/6 [fg]- [' .. ylb1(lvl) .. ']+25[' .. ylb2(lvl) .. ']/+50 [fg]defense to allied warriors' end, ['warrior'] = function(lvl) return '[' .. ylb1(lvl) .. ']3[light_bg]/[' .. ylb2(lvl) .. ']6 [fg]- [' .. ylb1(lvl) .. ']+25[light_bg]/[' .. ylb2(lvl) .. ']+50 [fg]defense to allied warriors' end,
['mage'] = function(lvl) return '[' .. ylb1(lvl) .. ']3[' .. ylb2(lvl) .. ']/6 [fg]- [' .. ylb1(lvl) .. ']-15[' .. ylb2(lvl) .. ']/-30 [fg]enemy defense' end, ['mage'] = function(lvl) return '[' .. ylb1(lvl) .. ']3[light_bg]/[' .. ylb2(lvl) .. ']6 [fg]- [' .. ylb1(lvl) .. ']-15[light_bg]/[' .. ylb2(lvl) .. ']-30 [fg]enemy defense' end,
['rogue'] = function(lvl) return '[' .. ylb1(lvl) .. ']3[' .. ylb2(lvl) .. ']/6 [fg]- [' .. ylb1(lvl) .. ']15%[' .. ylb2(lvl) .. ']/30% [fg]chance to crit to allied rogues, dealing [yellow]4x[] damage' end, ['rogue'] = function(lvl) return '[' .. ylb1(lvl) .. ']3[light_bg]/[' .. ylb2(lvl) .. ']6 [fg]- [' .. ylb1(lvl) .. ']15%[light_bg]/[' .. ylb2(lvl) .. ']30% [fg]chance to crit to allied rogues, dealing [yellow]4x[] damage' end,
['healer'] = function(lvl) return '[' .. ylb1(lvl) .. ']2[' .. ylb2(lvl) .. ']/4 [fg]- [' .. ylb1(lvl) .. ']+15%[' .. ylb2(lvl) .. ']/+30% [fg]healing effectiveness' end, ['healer'] = function(lvl) return '[' .. ylb1(lvl) .. ']2[light_bg]/[' .. ylb2(lvl) .. ']4 [fg]- [' .. ylb1(lvl) .. ']+15%[light_bg]/[' .. ylb2(lvl) .. ']+30% [fg]healing effectiveness' end,
['enchanter'] = function(lvl) return '[' .. ylb1(lvl) .. ']2[' .. ylb2(lvl) .. ']/4 [fg]- [' .. ylb1(lvl) .. ']+15%[' .. ylb2(lvl) .. ']/+25% [fg]damage to all allies' end, ['enchanter'] = function(lvl) return '[' .. ylb1(lvl) .. ']2[light_bg]/[' .. ylb2(lvl) .. ']4 [fg]- [' .. ylb1(lvl) .. ']+15%[light_bg]/[' .. ylb2(lvl) .. ']+25% [fg]damage to all allies' end,
['nuker'] = function(lvl) return '[' .. ylb1(lvl) .. ']3[' .. ylb2(lvl) .. ']/6 [fg]- [' .. ylb1(lvl) .. ']+15%[' .. 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[' .. ylb2(lvl) .. ']/4 [fg]- [' .. ylb1(lvl) .. ']+25%[' .. 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 '[' .. ylb1(lvl) .. ']2[' .. ylb2(lvl) .. ']/4 [fg]- [' .. ylb1(lvl) .. ']+10%[' .. ylb2(lvl) .. ']/+20% [fg]damage and attack speed per active set to allied psykers' end, ['psyker'] = function(lvl) return '[' .. ylb1(lvl) .. ']2[light_bg]/[' .. ylb2(lvl) .. ']4 [fg]- [' .. ylb1(lvl) .. ']+10%[light_bg]/[' .. ylb2(lvl) .. ']+20% [fg]damage and attack speed per active set to allied psykers' end,
['curser'] = function(lvl) return '[' .. ylb1(lvl) .. ']2[' .. ylb2(lvl) .. ']/4 [fg]- [' .. ylb1(lvl) .. ']+25%[' .. ylb2(lvl) .. ']/+50% [fg]curse duration' 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,
['forcer'] = function(lvl) return '[' .. ylb1(lvl) .. ']2[' .. ylb2(lvl) .. ']/4 [fg]- [' .. ylb1(lvl) .. ']+25%[' .. 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[' .. ylb2(lvl) .. ']/4 [fg]- [' .. ylb1(lvl) .. ']+1[' .. 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[' .. ylb2(lvl) .. ']/4 [fg]- [' .. ylb1(lvl) .. ']+15%[' .. ylb2(lvl) .. ']/+25% [fg]damage over time to allied voiders' end, ['voider'] = function(lvl) return '[' .. ylb1(lvl) .. ']2[light_bg]/[' .. ylb2(lvl) .. ']4 [fg]- [' .. ylb1(lvl) .. ']+15%[light_bg]/[' .. ylb2(lvl) .. ']+25% [fg]damage over time to allied voiders' end,
['sorcerer'] = function(lvl) ['sorcerer'] = function(lvl)
return '[' .. ylb1(lvl) .. ']2[' .. ylb2(lvl) .. ']/4[' .. ylb3(lvl) .. ']/6 [fg]- sorcerers repeat their attacks once every [' .. ylb1(lvl) .. ']4/[' .. ylb2(lvl) .. ']3/[' .. ylb3(lvl) .. ']2[fg] attacks' return '[' .. ylb1(lvl) .. ']2[light_bg]/[' .. ylb2(lvl) .. ']4[light_bg]/[' .. ylb3(lvl) .. ']6 [fg]- sorcerers repeat their attacks once every [' ..
ylb1(lvl) .. ']4[light_bg]/[' .. ylb2(lvl) .. ']3[light_bg]/[' .. ylb3(lvl) .. ']2[fg] attacks'
end, end,
['mercenary'] = function(lvl) return '[' .. ylb1(lvl) .. ']2[' .. ylb2(lvl) .. ']/4 [fg]- [' .. ylb1(lvl) .. ']+10%[' .. ylb2(lvl) .. ']/+20% [fg]chance for enemies to drop gold on death' end, ['mercenary'] = function(lvl) return '[' .. ylb1(lvl) .. ']2[light_bg]/[' .. ylb2(lvl) .. ']4 [fg]- [' .. ylb1(lvl) .. ']+10%[light_bg]/[' .. ylb2(lvl) .. ']+20% [fg]chance for enemies to drop gold on death' end,
} }
tier_to_characters = { tier_to_characters = {
@ -1093,146 +1106,175 @@ function init()
} }
passive_names = { passive_names = {
['centipede'] = 'Centipede',
['ouroboros_technique_r'] = 'Ouroboros Technique R', ['ouroboros_technique_r'] = 'Ouroboros Technique R',
['ouroboros_technique_l'] = 'Ouroboros Technique L', ['ouroboros_technique_l'] = 'Ouroboros Technique L',
['wall_echo'] = 'Wall Echo',
['wall_rider'] = 'Wall Rider',
['centipede'] = 'Centipede',
['intimidation'] = 'Intimidation',
['vulnerability'] = 'Vulnerability',
['temporal_chains'] = 'Temporal Chains',
['amplify'] = 'Amplify', ['amplify'] = 'Amplify',
['amplify_x'] = 'Amplify X',
['resonance'] = 'Resonance', ['resonance'] = 'Resonance',
['ballista'] = 'Ballista', ['ballista'] = 'Ballista',
['ballista_x'] = 'Ballista X', ['call_of_the_void'] = 'Call of the Void',
['point_blank'] = 'Point Blank', ['crucio'] = 'Crucio',
['longshot'] = 'Longshot', ['speed_3'] = 'Speed 3',
['damage_4'] = 'Damage 4',
['level_5'] = 'Level 5',
['death_6'] = 'Death 6',
['lasting_7'] = 'Lasting 7',
['defensive_stance'] = 'Defensive Stance',
['offensive_stance'] = 'Offensive Stance',
['kinetic_bomb'] = 'Kinetic Bomb',
['porcupine_technique'] = 'Porcupine Technique',
['last_stand'] = 'Last Stand',
['seeping'] = 'Seeping',
['deceleration'] = 'Deceleration',
['annihilation'] = 'Annihilation',
['malediction'] = 'Malediction',
['pandemic'] = 'Pandemic',
['whispers_of_doom'] = 'Whispers of Doom',
['tremor'] = 'Tremor',
['heavy_impact'] = 'Heavy Impact',
['fracture'] = 'Fracture',
['meat_shield'] = 'Meat Shield',
['hive'] = 'Hive',
['baneling_burst'] = 'Baneling Burst',
['blunt_arrow'] = 'Blunt Arrow', ['blunt_arrow'] = 'Blunt Arrow',
['explosive_arrow'] = 'Explosive Arrow', ['explosive_arrow'] = 'Explosive Arrow',
['divine_machine_arrow'] = 'Divine Machine Arrow', ['divine_machine_arrow'] = 'Divine Machine Arrow',
['chronomancy'] = 'Chronomancy', ['chronomancy'] = 'Chronomancy',
['awakening'] = 'Awakening', ['awakening'] = 'Awakening',
['divine_punishment'] = 'Divine Punishment', ['divine_punishment'] = 'Divine Punishment',
['berserking'] = 'Berserking',
['unwavering_stance'] = 'Unwavering Stance',
['ultimatum'] = 'Ultimatum',
['flying_daggers'] = 'Flying Daggers',
['assassination'] = 'Assassination', ['assassination'] = 'Assassination',
['flying_daggers'] = 'Flying Daggers',
['ultimatum'] = 'Ultimatum',
['magnify'] = 'Magnify', ['magnify'] = 'Magnify',
['echo_barrage'] = 'Echo Barrage', ['echo_barrage'] = 'Echo Barrage',
['unleash'] = 'Unleash', ['unleash'] = 'Unleash',
['reinforce'] = 'Reinforce', ['reinforce'] = 'Reinforce',
['payback'] = 'Payback', ['payback'] = 'Payback',
['blessing'] = 'Blessing', ['enchanted'] = 'Enchanted',
['hex_master'] = 'Hex Master', ['freezing_field'] = 'Freezing Field',
['whispers_of_doom'] = 'Whispers of Doom', ['burning_field'] = 'Burning Field',
['force_push'] = 'Force Push', ['gravity_field'] = 'Gravity Field',
['heavy_impact'] = 'Heavy Impact', ['magnetism'] = 'Magnetism',
['crucio'] = 'Crucio', ['insurance'] = 'Insurance',
['immolation'] = 'Immolation', ['dividends'] = 'Dividends',
['call_of_the_void'] = 'Call of the Void', ['berserking'] = 'Berserking',
['spawning_pool'] = 'Spawning Pool', ['unwavering_stance'] = 'Unwavering Stance',
['hive'] = 'Hive', ['unrelenting_stance'] = 'Unrelenting Stance',
['void_rift'] = 'Void Rift',
} }
passive_descriptions = { passive_descriptions = {
['ouroboros_technique_r'] = '[fg]rotating around yourself to the right makes units release projectiles', ['centipede'] = '[yellow]+10/20/30%[fg] movement speed',
['ouroboros_technique_l'] = '[fg]rotating around yourself to the left grants [yellow]+25%[fg] defense to all units', ['ouroboros_technique_r'] = '[fg]rotating around yourself to the right releases [yellow]2/3/4[fg] projectiles per second',
['wall_echo'] = '[fg]hitting walls has a [yellow]34%[fg] chance of releasing [yellow]2[fg] projectiles', ['ouroboros_technique_l'] = '[fg]rotating around yourself to the left grants [yellow]+15/25/35%[fg] defense to all units',
['wall_rider'] = '[fg]hitting walls grants a [yellow]25%[fg] movement speed buff to your snake for [yellow]1[fg] second', ['amplify'] = '[yellow]+20/35/50%[fg] AoE damage',
['centipede'] = '[yellow]+20%[fg] movement speed', ['resonance'] = '[fg]all AoE attacks deal [yellow]+3/5/7%[fg] damage per unit hit',
['intimidation'] = '[fg]enemies spawn with [yellow]-20%[fg] max HP', ['ballista'] = '[yellow]+20/35/50%[fg] projectile damage',
['vulnerability'] = '[fg]all enemies take [yellow]+20%[fg] damage', ['call_of_the_void'] = '[yellow]+30/60/90%[fg] DoT damage',
['temporal_chains'] = '[fg]all enemies move [yellow]20%[fg] slower', ['crucio'] = '[fg]taking damage also shares that across all enemies at [yellow]20/30/40%[fg] its value',
['amplify'] = '[yellow]+25%[fg] AoE damage', ['speed_3'] = '[fg]position [yellow]3[fg] has [yellow]+50%[fg] attack speed',
['amplify_x'] = '[yellow]+50%[fg] AoE damage', ['damage_4'] = '[fg]position [yellow]4[fg] has [yellow]+30%[fg] damage',
['resonance'] = '[fg]all AoE attacks deal [yellow]+5%[fg] damage per unit hit', ['level_5'] = '[fg]position [yellow]5[fg] is [yellow]1[fg] level higher',
['ballista'] = '[yellow]+25%[fg] damage to rangers and rogues ', ['death_6'] = '[fg]position [yellow]6[fg] takes [yellow]10%[fg] of its health as damage every [yellow]3[fg] seconds',
['ballista_x'] = '[yellow]+50%[fg] damage to rangers and rogues', ['lasting_7'] = '[fg]position [yellow]7[fg] will stay alive for [yellow]10[fg] seconds after dying',
['point_blank'] = '[fg]projectiles deal up to [yellow]+100%[fg] damage up close and down to [yellow]-50%[fg] damage far away', ['defensive_stance'] = '[fg]first and last positions have [yellow]+10/20/30%[fg] defense',
['longshot'] = '[fg]projectiles deal up to [yellow]+100%[fg] damage far away and down to [yellow]-50%[fg] up close', ['offensive_stance'] = '[fg]first and last positions have [yellow]+10/20/30%[fg] damage',
['blunt_arrow'] = '[fg]all arrows fired by rangers have a [yellow]20%[fg] chance to knockback', ['kinetic_bomb'] = '[fg]when a unit dies it explodes, launching enemies away',
['explosive_arrow'] = '[fg]arrows fired by rangers have a [yellow]30%[fg] chance to explode, dealing [yellow]20%[fg] AoE damage', ['porcupine_technique'] = '[fg]when a unit dies it explodes, releasing piercing projectiles',
['divine_machine_arrow'] = '[fg]arrows fired by rangers have a [yellow]40%[fg] chance to seek enemies and pierce [yellow]4[fg] times', ['last_stand'] = '[fg]the last unit alive is fully healed and receives a [yellow]+20%[fg] bonus to all stats',
['chronomancy'] = '[fg]all mages and sorcerers cast their spells [yellow]25%[fg] faster', ['seeping'] = '[fg]enemies taking DoT damage take [yellow]+15/20/25%[fg] damage for [yellow]6[fg] seconds',
['awakening'] = '[yellow]+100%[fg] aspd and damage to [yellow]1[fg] mage or sorcerer every round for that round', ['deceleration'] = '[fg]enemies damaged by voiders have their movement speed reduced by [yellow]15/20/25%',
['divine_punishment'] = '[fg]repeatedly deal damage to all enemies based on how many mages or sorcerers you have', ['annihilation'] = '[fg]when a voider dies deal its DoT damage to all enemies for [yellow]3[fg] seconds',
['berserking'] = '[fg]all warriors have up to [yellow]+50%[fg] attack speed based on missing HP', ['malediction'] = '[fg]cursed enemies take [yellow]+15/25/35%[fg] damage and deal [yellow]-15/25/35%[fg] damage',
['unwavering_stance'] = '[fg]all warriors gain [yellow]+5%[fg] defense every [yellow]5[fg] seconds', ['pandemic'] = '[fg]when a cursed enemy dies its curse spreads',
['ultimatum'] = '[fg]projectiles that chain gain [yellow]+25%[fg] damage with each chain', ['whispers_of_doom'] = '[fg]curses apply doom, deal [yellow]100/150/200[fg] damage every [yellow]4/3/2[fg] doom instances',
['flying_daggers'] = '[fg]all knives thrown by rogues chain [yellow]+2[fg] times', ['tremor'] = '[fg]when enemies die from hitting walls they create an area based on the knockback force',
['assassination'] = '[fg]crits from rogues deal [yellow]8x[fg] damage but normal attacks deal [yellow]half[fg] damage', ['heavy_impact'] = '[fg]when enemies hit walls they take damage based on the knockback force',
['magnify'] = '[yellow]+25%[fg] area size', ['fracture'] = '[fg]when enemies die from hitting walls they explode into projectiles',
['echo_barrage'] = '[yellow]20%[fg] chance to create [yellow]3[fg] secondary AoEs on AoE hit', ['meat_shield'] = '[fg]critters [yellow]block[fg] enemy projectiles',
['unleash'] = '[yellow]+1%[fg] area size and damage per second', ['hive'] = '[fg]critters have [yellow]+1/2/3[fg] HP',
['reinforce'] = '[yellow]+10%[fg] damage, defense and attack speed to all allies with at least one enchanter', ['baneling_burst'] = '[fg]critters die immediately on contact but also deal [yellow]50/100/150[fg] AoE damage',
['payback'] = '[yellow]+5%[fg] damage to all allies whenever an enchanter is hit', ['blunt_arrow'] = '[fg]ranger arrows have [yellow]+10/20/30%[fg] chance to knockback',
['blessing'] = '[yellow]+20%[fg] healing effectiveness', ['explosive_arrow'] = '[fg]ranger arrows have [yellow]+10/20/30%[fg] chance to deal [yellow]10/20/30%[fg] AoE damage',
['hex_master'] = '[yellow]+25%[fg] curse duration', ['divine_machine_arrow'] = '[fg]ranger arrows have a [yellow]10/20/30%[fg] chance to seek and pierce [yellow]1/2/3[fg] times',
['whispers_of_doom'] = '[fg]curses apply doom, when [yellow]4[fg] doom instances are reached they deal [yellow]200[fg] damage', ['chronomancy'] = '[fg]mages cast their spells [yellow]15/25/35%[fg] faster',
['force_push'] = '[yellow]+25%[fg] knockback force', ['awakening'] = '[yellow]+50/75/100%[fg] attack speed and damage to [yellow]1[fg] mage every round for that round',
['heavy_impact'] = '[fg]when enemies hit walls they take damage according to the knockback force', ['divine_punishment'] = '[fg]deal damage to all enemies based on how many mages you have',
['crucio'] = '[fg]taking damage also shares that across all enemies at [yellow]25%[fg] its value', ['assassination'] = '[fg]crits from rogues deal [yellow]8/10/12x[fg] damage but normal attacks deal [yellow]half[fg] damage',
['immolation'] = '[yellow]3[fg] units will periodically take damage, all your allies gain [yellow]+8%[fg] damage per tick', ['flying_daggers'] = '[fg]all projectiles thrown by rogues chain [yellow]+2/3/4[fg] times',
['call_of_the_void'] = '[yellow]+25%[fg] damage over time', ['ultimatum'] = '[fg]projectiles that chain gain [yellow]+10/20/30%[fg] damage with each chain',
['spawning_pool'] = '[yellow]+1[fg] critter health', ['magnify'] = '[yellow]+20/35/50%[fg] area size',
['hive'] = '[yellow]+2[fg] critter health', ['echo_barrage'] = '[yellow]10/20/30%[fg] chance to create [yellow]1/2/3[fg] secondary AoEs on AoE hit',
['void_rift'] = '[fg]attacks by mages, nukers or voiders have a [yellow]20%[fg] chance to create a void rift on 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 with at least one enchanter',
['payback'] = '[yellow]+2/5/8%[fg] damage to all allies whenever an enchanter is hit',
['enchanted'] = '[yellow]+10/20/30%[fg] attack speed to a random unit with at least two 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]2[fg] seconds on sorcerer spell repeat',
['magnetism'] = '[fg]gold coins 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',
['unwavering_stance'] = '[fg]all warriors gain [yellow]+4/8/12%[fg] defense every [yellow]5[fg] seconds',
['unrelenting_stance'] = '[yellow]+2/5/8%[fg] defense to all allies whenever a warrior is hit',
} }
passive_tiers = { local ts = function(lvl, a, b, c) return '[' .. ylb1(lvl) .. ']' .. tostring(a) .. '[light_bg]/[' .. ylb2(lvl) .. ']' .. tostring(b) .. '[light_bg]/[' .. ylb3(lvl) .. ']' .. tostring(c) .. '[fg]' end
['ouroboros_technique_r'] = 2, passive_descriptions_level = {
['ouroboros_technique_l'] = 2, ['centipede'] = function(lvl) return ts(lvl, '+10%', '20%', '30%') .. ' movement speed' end,
['wall_echo'] = 1, ['ouroboros_technique_r'] = function(lvl) return '[fg]rotating around yourself to the right releases ' .. ts(lvl, '2', '3', '4') .. ' projectiles per second' end,
['wall_rider'] = 1, ['ouroboros_technique_l'] = function(lvl) return '[fg]rotating around yourself to the left grants ' .. ts(lvl, '+15%', '25%', '35%') .. ' defense to all units' end,
['centipede'] = 1, ['amplify'] = function(lvl) return ts(lvl, '+20%', '35%', '50%') .. ' AoE damage' end,
['intimidation'] = 2, ['resonance'] = function(lvl) return '[fg]all AoE attacks deal ' .. ts(lvl, '+3%', '5%', '7%') .. ' damage per unit hit' end,
['vulnerability'] = 2, ['ballista'] = function(lvl) return ts(lvl, '+20%', '35%', '50%') .. ' projectile damage' end,
['temporal_chains'] = 1, ['call_of_the_void'] = function(lvl) return ts(lvl, '+30%', '60%', '90%') .. ' DoT damage' end,
['amplify'] = 1, ['crucio'] = function(lvl) return '[fg]taking damage also shares that across all enemies at ' .. ts(lvl, '20%', '30%', '40%') .. ' its value' end,
['amplify_x'] = 2, ['speed_3'] = function(lvl) return '[fg]position [yellow]3[fg] has [yellow]+50%[fg] attack speed' end,
['resonance'] = 3, ['damage_4'] = function(lvl) return '[fg]position [yellow]4[fg] has [yellow]+30%[fg] damage' end,
['ballista'] = 1, ['level_5'] = function(lvl) return '[fg]position [yellow]5[fg] is [yellow]1[fg] level higher' end,
['ballista_x'] = 2, ['death_6'] = function(lvl) return '[fg]position [yellow]6[fg] takes [yellow]10%[fg] of its health as damage every [yellow]3[fg] seconds' end,
['point_blank'] = 2, ['lasting_7'] = function(lvl) return '[fg]position [yellow]7[fg] will stay alive for [yellow]10[fg] seconds after dying' end,
['longshot'] = 2, ['defensive_stance'] = function(lvl) return '[fg]first and last positions have ' .. ts(lvl, '+10%', '20%', '30%') .. ' defense' end,
['blunt_arrow'] = 1, ['offensive_stance'] = function(lvl) return '[fg]first and last positions have ' .. ts(lvl, '+10%', '20%', '30%') .. ' damage' end,
['explosive_arrow'] = 2, ['kinetic_bomb'] = function(lvl) return '[fg]when a unit dies it explodes, launching enemies away' end,
['divine_machine_arrow'] = 3, ['porcupine_technique'] = function(lvl) return '[fg]when a unit dies it explodes, releasing piercing projectiles' end,
['chronomancy'] = 2, ['last_stand'] = function(lvl) return '[fg]the last unit alive is fully healed and receives a [yellow]+20%[fg] bonus to all stats' end,
['awakening'] = 2, ['seeping'] = function(lvl) return '[fg]enemies taking DoT damage take ' .. ts(lvl, '+15%', '20%', '25%') .. ' damage for [yellow]6[fg] seconds' end,
['divine_punishment'] = 3, ['deceleration'] = function(lvl) return '[fg]enemies damaged by voiders have their movement speed reduced by ' .. ts(lvl, '15%', '20%', '25%') end,
['berserking'] = 1, ['annihilation'] = function(lvl) return '[fg]when a voider dies deal its DoT damage to all enemies for [yellow]3[fg] seconds' end,
['unwavering_stance'] = 1, ['malediction'] = function(lvl) return '[fg]cursed enemies take ' .. ts(lvl, '+15%', '25%', '35%') .. ' damage and deal ' .. ts(lvl, '-15%', '25%', '35%') .. ' damage' end,
['ultimatum'] = 2, ['pandemic'] = function(lvl) return '[fg]when a cursed enemy dies its curse spreads' end,
['flying_daggers'] = 3, ['whispers_of_doom'] = function(lvl) return '[fg]curses apply doom, deal ' .. ts(lvl, '100', '150', '200') .. ' every ' .. ts(lvl, '4', '3', '2') .. ' doom instances' end,
['assassination'] = 1, ['tremor'] = function(lvl) return '[fg]when enemies die from hitting walls they create an area based to the knockback force' end,
['magnify'] = 1, ['heavy_impact'] = function(lvl) return '[fg]when enemies hit walls they take damage based on the knockback force' end,
['echo_barrage'] = 2, ['fracture'] = function(lvl) return '[fg]when enemies die from hitting walls they explode into projectiles' end,
['unleash'] = 1, ['meat_shield'] = function(lvl) return '[fg]critters [yellow]block[fg] enemy projectiles' end,
['reinforce'] = 2, ['hive'] = function(lvl) return '[fg]critters have ' .. ts(lvl, '+1', '2', '3') .. ' HP' end,
['payback'] = 2, ['baneling_burst'] = function(lvl) return '[fg]critters die immediately on contact but also deal ' .. ts(lvl, '50', '100', '150') .. ' AoE damage' end,
['blessing'] = 1, ['blunt_arrow'] = function(lvl) return '[fg]ranger arrows have ' .. ts(lvl, '+10%', '20%', '30%') .. ' chance to knockback' end,
['hex_master'] = 1, ['explosive_arrow'] = function(lvl) return '[fg]ranger arrows have ' .. ts(lvl, '+10%', '20%', '30%') .. ' chance to deal ' .. ts(lvl, '10%', '20%', '30%') .. ' AoE damage' end,
['whispers_of_doom'] = 2, ['divine_machine_arrow'] = function(lvl) return '[fg]ranger arrows have a ' .. ts(lvl, '10%', '20%', '30%') .. ' chance to seek and pierce ' .. ts(lvl, '1', '2', '3') .. ' times' end,
['force_push'] = 1, ['chronomancy'] = function(lvl) return '[fg]mages cast their spells ' .. ts(lvl, '15%', '25%', '35%') .. ' faster' end,
['heavy_impact'] = 2, ['awakening'] = function(lvl) return ts(lvl, '+50%', '75%', '100%') .. ' attack speed and damage to [yellow]1[fg] mage every round for that round' end,
['crucio'] = 3, ['divine_punishment'] = function(lvl) return '[fg]deal damage to all enemies based on how many mages you have' end,
['immolation'] = 2, ['assassination'] = function(lvl) return '[fg]crits from rogues deal ' .. ts(lvl, '8x', '10x', '12x') .. ' damage but normal attacks deal [yellow]half[fg] damage' end,
['call_of_the_void'] = 2, ['flying_daggers'] = function(lvl) return '[fg]all projectiles thrown by rogues chain ' .. ts(lvl, '+2', '3', '4') .. ' times' end,
['spawning_pool'] = 1, ['ultimatum'] = function(lvl) return '[fg]projectiles that chain gain ' .. ts(lvl, '+10%', '20%', '30%') .. ' damage with each chain' end,
['hive'] = 3, ['magnify'] = function(lvl) return ts(lvl, '+20%', '35%', '50%') .. ' area size' end,
['void_rift'] = 3, ['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 with at least one enchanter' end,
tier_to_passives = { ['payback'] = function(lvl) return ts(lvl, '+2%', '5%', '8%') .. ' damage to all allies whenever an enchanter is hit' end,
[1] = {'wall_echo', 'wall_rider', 'centipede', 'temporal_chains', 'amplify', 'amplify_x', 'ballista', 'ballista_x', 'blunt_arrow', 'berserking', 'unwavering_stance', 'assassination', 'unleash', 'blessing', ['enchanted'] = function(lvl) return ts(lvl, '+10%', '20%', '30%') .. ' attack speed to a random unit with at least two enchanters' end,
'hex_master', 'force_push', 'spawning_pool'}, ['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,
[2] = {'ouroboros_technique_r', 'ouroboros_technique_l', 'intimidation', 'vulnerability', 'resonance', 'point_blank', 'longshot', 'explosive_arrow', 'chronomancy', 'awakening', 'ultimatum', 'echo_barrage', ['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,
'reinforce', 'payback', 'whispers_of_doom', 'heavy_impact', 'immolation', 'call_of_the_void'}, ['gravity_field'] = function(lvl) return '[fg]creates an area that pulls enemies in for [yellow]2[fg] seconds on sorcerer spell repeat' end,
[3] = {'divine_machine_arrow', 'divine_punishment', 'flying_daggers', 'crucio', 'hive', 'void_rift'}, ['magnetism'] = function(lvl) return '[fg]gold coins 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,
['unwavering_stance'] = function(lvl) return '[fg]all warriors gain ' .. ts(lvl, '+4%', '8%', '12%') .. ' defense every [yellow]5[fg] seconds' end,
['unrelenting_stance'] = function(lvl) return ts(lvl, '+2%', '5%', '8%') .. ' defense to all allies whenever a warrior is hit' end,
} }
level_to_tier_weights = { level_to_tier_weights = {
@ -1291,17 +1333,6 @@ function init()
[25] = {100, 100}, [25] = {100, 100},
} }
level_to_passive_tier_weights = {
[3] = {70, 20, 10},
[6] = {60, 25, 15},
[9] = {50, 30, 20},
[12] = {40, 40, 20},
[15] = {30, 45, 25},
[18] = {20, 50, 30},
[21] = {20, 40, 40},
[24] = {20, 30, 50},
}
level_to_elite_spawn_weights = { level_to_elite_spawn_weights = {
[1] = {0}, [1] = {0},
[2] = {4, 2}, [2] = {4, 2},
@ -1366,19 +1397,13 @@ function init()
[25] = {'speed_booster', 'exploder', 'headbutter', 'tank', 'shooter', 'spawner'}, [25] = {'speed_booster', 'exploder', 'headbutter', 'tank', 'shooter', 'spawner'},
} }
get_shop_odds_by_level = function(lvl) level_to_shop_odds = {
if lvl == 1 then [1] = {70, 20, 10, 0},
return {70, 20, 10, 0} [2] = {50, 30, 15, 5},
elseif lvl == 2 then [3] = {25, 45, 20, 10},
return {50, 30, 15, 5} [4] = {10, 25, 45, 20},
elseif lvl == 3 then [5] = {5, 15, 30, 50},
return {25, 45, 20, 10} }
elseif lvl == 4 then
return {10, 25, 45, 20}
elseif lvl == 5 then
return {5, 15, 30, 50}
end
end
get_shop_odds = function(lvl, tier) get_shop_odds = function(lvl, tier)
if lvl == 1 then if lvl == 1 then
@ -1435,12 +1460,12 @@ function init()
end end
local run = system.load_run() local run = system.load_run()
run_passive_pool_by_tiers = run.run_passive_pool_by_tiers or { run_passive_pool = run.run_passive_pool or {
[1] = { 'wall_echo', 'wall_rider', 'centipede', 'temporal_chains', 'amplify', 'amplify_x', 'ballista', 'ballista_x', 'blunt_arrow', 'berserking', 'unwavering_stance', 'assassination', 'unleash', 'blessing', 'centipede', 'ouroboros_technique_r', 'ouroboros_technique_l', 'amplify', 'resonance', 'ballista', 'call_of_the_void', 'crucio', 'speed_3', 'damage_4', 'level_5', 'death_6', 'lasting_7',
'hex_master', 'force_push', 'spawning_pool'}, 'defensive_stance', 'offensive_stance', 'kinetic_bomb', 'porcupine_technique', 'last_stand', 'seeping', 'deceleration', 'annihilation', 'malediction', 'pandemic', 'whispers_of_doom',
[2] = {'ouroboros_technique_r', 'ouroboros_technique_l', 'intimidation', 'vulnerability', 'resonance', 'point_blank', 'longshot', 'explosive_arrow', 'chronomancy', 'awakening', 'ultimatum', 'echo_barrage', 'tremor', 'heavy_impact', 'fracture', 'meat_shield', 'hive', 'baneling_burst', 'blunt_arrow', 'explosive_arrow', 'divine_machine_arrow', 'chronomancy', 'awakening', 'divine_punishment',
'reinforce', 'payback', 'whispers_of_doom', 'heavy_impact', 'immolation', 'call_of_the_void'}, 'assassination', 'flying_daggers', 'ultimatum', 'magnify', 'echo_barrage', 'unleash', 'reinforce', 'payback', 'enchanted', 'freezing_field', 'burning_field', 'gravity_field', 'magnetism',
[3] = {'divine_machine_arrow', 'divine_punishment', 'flying_daggers', 'crucio', 'hive', 'void_rift'}, 'insurance', 'dividends', 'berserking', 'unwavering_stance', 'unrelenting_stance'
} }
gold = run.gold or 3 gold = run.gold or 3
passives = run.passives or {} passives = run.passives or {}
@ -1467,16 +1492,16 @@ function init()
main:add(Arena'arena') main:add(Arena'arena')
main:go_to('arena', 25, { main:go_to('arena', 25, {
{character = 'swordsman', level = 3}, {character = 'swordsman', level = 3},
{character = 'plague_doctor', level = 3}, {character = 'scout', level = 3},
{character = 'pyromancer', level = 3}, {character = 'thief', level = 3},
{character = 'witch', level = 3}, {character = 'blade', level = 3},
{character = 'arcanist', level = 3}, {character = 'dual_gunner', level = 3},
{character = 'usurer', level = 3}, {character = 'saboteur', level = 3},
{character = 'warden', level = 3}, {character = 'spellblade', level = 3},
{character = 'silencer', level = 3}, {character = 'jester', level = 3},
{character = 'vulcanist', level = 3}, {character = 'assassin', level = 3},
{character = 'bane', level = 3}, {character = 'barrager', level = 3},
{character = 'illusionist', level = 3}, {character = 'cannoneer', level = 3},
}, passives) }, passives)
]]-- ]]--

View File

@ -6,7 +6,7 @@ function Player:init(args)
self:init_game_object(args) self:init_game_object(args)
self:init_unit() self:init_unit()
if self.passives then for k, v in pairs(self.passives) do self[v] = true end end if self.passives then for k, v in pairs(self.passives) do self[v.passive] = v.level end end
self.color = character_colors[self.character] self.color = character_colors[self.character]
self:set_as_rectangle(9, 9, 'dynamic', 'player') self:set_as_rectangle(9, 9, 'dynamic', 'player')
@ -992,6 +992,7 @@ function Player:update(dt)
if class_levels.conjurer >= 1 then number_of_active_sets = number_of_active_sets + 1 end if class_levels.conjurer >= 1 then number_of_active_sets = number_of_active_sets + 1 end
if class_levels.enchanter >= 1 then number_of_active_sets = number_of_active_sets + 1 end if class_levels.enchanter >= 1 then number_of_active_sets = number_of_active_sets + 1 end
if class_levels.psyker >= 1 then number_of_active_sets = number_of_active_sets + 1 end if class_levels.psyker >= 1 then number_of_active_sets = number_of_active_sets + 1 end
if class_levels.nuker >= 1 then number_of_active_sets = number_of_active_sets + 1 end
if class_levels.curser >= 1 then number_of_active_sets = number_of_active_sets + 1 end if class_levels.curser >= 1 then number_of_active_sets = number_of_active_sets + 1 end
if class_levels.forcer >= 1 then number_of_active_sets = number_of_active_sets + 1 end if class_levels.forcer >= 1 then number_of_active_sets = number_of_active_sets + 1 end
if class_levels.swarmer >= 1 then number_of_active_sets = number_of_active_sets + 1 end if class_levels.swarmer >= 1 then number_of_active_sets = number_of_active_sets + 1 end
@ -1058,6 +1059,7 @@ function Player:update(dt)
if class_levels.conjurer >= 1 then number_of_active_sets = number_of_active_sets + 1 end if class_levels.conjurer >= 1 then number_of_active_sets = number_of_active_sets + 1 end
if class_levels.enchanter >= 1 then number_of_active_sets = number_of_active_sets + 1 end if class_levels.enchanter >= 1 then number_of_active_sets = number_of_active_sets + 1 end
if class_levels.psyker >= 1 then number_of_active_sets = number_of_active_sets + 1 end if class_levels.psyker >= 1 then number_of_active_sets = number_of_active_sets + 1 end
if class_levels.nuker >= 1 then number_of_active_sets = number_of_active_sets + 1 end
if class_levels.curser >= 1 then number_of_active_sets = number_of_active_sets + 1 end if class_levels.curser >= 1 then number_of_active_sets = number_of_active_sets + 1 end
if class_levels.forcer >= 1 then number_of_active_sets = number_of_active_sets + 1 end if class_levels.forcer >= 1 then number_of_active_sets = number_of_active_sets + 1 end
if class_levels.swarmer >= 1 then number_of_active_sets = number_of_active_sets + 1 end if class_levels.swarmer >= 1 then number_of_active_sets = number_of_active_sets + 1 end

117
todo
View File

@ -1,23 +1,88 @@
Item Update Item Update
New mechanics New mechanics
Sacrifice units to level items up Spend gold to level items up
Items Items
New items General:
Position X has +Y% attack speed vt Centipede - +10/20/30% movement speed
Position X has +Y% damage vt Ouroboros Technique R - rotating around yourself to the right releases 2/3/4 projectiles per second
Position X is 1 tier higher vt Ouroboros Technique L - rotating around yourself to the left grants +15/25/35% defense to all units
Position X is also class Y vt Amplify - +20/35/50% AoE damage
When a unit dies it explodes, launching enemies away vt Resonance - all AoE attacks deal +3/5/7% damage per unit hit
When a unit dies it explodes, releasing piercing projectiles vt Ballista - +20/35/50% projectile damage
Reworked items vt Call of the Void - +30/60/90% DoT damage
Items shouldn't just be more powerful versions of other items vt Crucio - taking damage also shares that damage across all enemies at 20/30/40% its value
Items should have drawbacks Position:
Items that apply to a position on the snake (a good middle step between applying them to individual units like in Underlords) vt Speed 3 - position 3 has +20/35/50% attack speed
Item discussions vt Damage 4 - position 4 has +20/30/40% damage
https://steamcommunity.com/app/915310/discussions/0/3106901028662504698/ vt Level 5 - position 5 is 1 level higher
https://steamcommunity.com/app/915310/discussions/0/3106901665846294204/ vt Death 6 - position 6 takes 15% of its health as damage every 3 seconds
https://steamcommunity.com/app/915310/discussions/0/4658391921151238820/ vt Lasting 7 - position 7 will stay alive for 10 seconds after dying
https://i.imgur.com/cfIyMBL.png vt Defense Stance - first and last positions have +10/20/30% defense
vt Offensive Stance - first and last positions have +10/20/30% damage
Death:
vt Kinetic Bomb - when a unit dies it explodes, launching enemies away
vt Porcupine Technique - when a unit dies it explodes, releasing piercing projectiles
vt Last Stand - the last unit alive is fully healed and receives a +20/30/40% bonus to all stats
Voider:
vt Seeping - enemies taking DoT damage take +15/20/25% damage from all sources for 6 seconds
vt Deceleration - enemies damaged by voiders have their movement speed reduced by 15/20/25%
vt Annihilation - when a voider dies deal its DoT damage to all enemies for 3 seconds
Curser:
vt Malediction - cursed enemies take 15/25/35% more damage and deal 15/25/35% less damage
vt Pandemic - when a cursed enemy dies its curse spreads
vt Whispers of Doom - curses apply doom, when 4/3/2 doom instances are reached they deal 100/150/200
Forcer:
vt Tremor - when enemies die from hitting walls they create a damaging area with size according to the knockback force
vt Heavy Impact - when enemies hit walls they take damage according to the knockback force
vt Fracture - when enemies die from hitting walls explode into projectiles
Swarmer:
vt Meat Shield - critters block enemy projectiles
vt Hive - critters have +1/2/3 HP
vt Baneling Burst - critters die immediately on contact but also deal AoE damage
Ranger:
vt Blunt Arrow - arrows fired by rangers have a 10/20/30% chance to knockback
vt Explosive Arrow - arrows fired by rangers have a 10/20/30% chance to explode, dealing 10/20/30% AoE damage
vt Divine Machine Arrow - arrows fired by rangers have a 10/20/30% chance to seek enemies and pierce 1/2/3 times
Mage:
vt Chronomancy - mages cast their spells 15/25/35% faster
vt Awakening - +50/75/100% attack speed and damage to 1 mage every round for that round
vt Divine Punishment - repeatedly deal damage to all enemies based on how many mages you have
Rogue:
vt Assassination - crits from rogues deal 8/10/12x damage but normal attacks deal half damage
vt Flying Daggers - all projectiles thrown by rogues chain +2/3/4 times
vt Ultimatum - projectiles that chain gain +10/20/30% damage with each chain
Nuker:
vt Magnify - +20/35/50% area size
vt Echo Barrage - 10/20/30% chance to create 1/2/3 secondary AoEs on AoE hit
vt Unleash - all nukers gain +1% area size and damage every second
Enchanter:
vt Reinforce - +10/20/30% damage, defense and attack speed to all allies with at leats one enchanter
vt Payback - +2/5/8% damage to all allies whenever an enchanter is hit
vt Enchanted - when enemies die they have a 10/20/30% release X homing projectiles, where X is how many enchanters you have
Sorcerer:
vt Freezing Field - Create an area that slows enemies by 50% for 2 seconds whenever a sorcerer repeats a spell
vt Burning Field - Create an area that deals 30 damage per second for 2 seconds whenever a sorcerer repeats a spell
vt Gravity Field - Create an area that sucks enemies in for 2 seconds whenever a sorcerer repeats a spell
Mercenary:
vt Magnetism - Gold coins are attracted to the snake
vt Insurance - Dying heroes have 4 times the chance of mercenary's bonus to drop 2 gold on death
vt Dividends - Mercenaries deal +X% extra damage, where X is how much gold you have
Warrior:
vt Berserking - all warriors have up to +50/75/100% attack speed based on missing HP
vt Unwavering Stance - all warriors gain +4/8/12% defense every 5 seconds
vt Unrelenting Stance - +2/5/8% defense to all allies whenever a warrior is hit
Removed items
* Wall Echo
* Wall Rider
* Point Blank
* Longshot
* Hex Master
* Force Push
* Call of the Void
* Spawning Pool
* Void Rift
* Blessing
* Immolation
Balance Balance
* Decreased shop reroll cost to 10 * Decreased shop reroll cost to 10
Decrease mercenary gold drop chance to 8/16% (from 10/20%) Decrease mercenary gold drop chance to 8/16% (from 10/20%)
@ -31,10 +96,10 @@ Item Update
Add option for mouse cursor to always be visible Add option for mouse cursor to always be visible
Add main menu Add main menu
Soundtrack button Soundtrack button
Discord button
Arena run button Arena run button
Options button Options button
Quit button Quit button
* Added an option to force all screen transitions to be dark
* Added tier text to characters on the shop screen * Added tier text to characters on the shop screen
* Added shop unit highlights/markers to make it easier to tell when you already own something * Added shop unit highlights/markers to make it easier to tell when you already own something
* Added unit names to the "your build" section of the end game screen * Added unit names to the "your build" section of the end game screen
@ -42,6 +107,13 @@ Item Update
Bug fixes Bug fixes
Fix fullscreen with different resolutions that don't scale properly - https://steamcommunity.com/app/915310/discussions/0/3106901665841020282/ Fix fullscreen with different resolutions that don't scale properly - https://steamcommunity.com/app/915310/discussions/0/3106901665841020282/
Fix enemies still spawning after arena clear (this happens with the extra enemy spawns that were blocked earlier) Fix enemies still spawning after arena clear (this happens with the extra enemy spawns that were blocked earlier)
Kill enemies that go outside play area - https://i.imgur.com/QPgZbve.png
https://i.imgur.com/lCdPFZx.png
https://i.imgur.com/1CwmFYX.png
Ouroboros doesn't work with mouse controls
* Fixed mouse not showing up on death
* Fixed NG+5 achievement not triggering (this happened only between last Sunday night and Monday morning due to a small update I pushed breaking it)
* Fixed a bug where the nuker class was not counting towards Vagrant's and Psyker's active set bonus
* Fixed a bug where passives would sometimes disappear from a run? * Fixed a bug where passives would sometimes disappear from a run?
* Fixed a bug where clicking "window size-" too many times could bug out the game * Fixed a bug where clicking "window size-" too many times could bug out the game
* Fixed a bug where the shop would be rerolled after quitting in the arena * Fixed a bug where the shop would be rerolled after quitting in the arena
@ -58,8 +130,13 @@ Item Update
* Fixed a crash involving broken state for Pets, Critters or Volcanos * Fixed a crash involving broken state for Pets, Critters or Volcanos
* Fixed a crash that happened after rerolling items too many times * Fixed a crash that happened after rerolling items too many times
Endless Update Endless Update
Healer rework:
Enemies have an X/Y% chance to create healing cells on death
Cleric: creates a healing cell at a random position
Priest: creates multiple healing cells at a random position
Psyker rework:
Create orbitting damaging balls equal to the number of psykers (similar to those balls in Nova Drift)
Endless mode Endless mode
Units die permanently when they die Units die permanently when they die
Slower scaling with less individually threatening units Slower scaling with less individually threatening units
@ -88,6 +165,8 @@ Bench? - https://i.imgur.com/B1gNVKk.png
Balance option for when there are more sets - https://i.imgur.com/JMynwbL.png Balance option for when there are more sets - https://i.imgur.com/JMynwbL.png
Negative effect: colliding with yourself kills one of your units Negative effect: colliding with yourself kills one of your units
https://i.imgur.com/bxfvA7g.png https://i.imgur.com/bxfvA7g.png
https://steamcommunity.com/app/915310/discussions/0/4658391921156086711/ - general feedback
https://steamcommunity.com/app/915310/discussions/0/4658391921156325745/ - math on gold, rerolls and units
Roguelite update: Roguelite update: