Item update 2/5
118
arena.lua
|
@ -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
|
||||||
|
|
||||||
|
|
After Width: | Height: | Size: 476 B |
After Width: | Height: | Size: 445 B |
After Width: | Height: | Size: 459 B |
After Width: | Height: | Size: 398 B |
After Width: | Height: | Size: 500 B |
After Width: | Height: | Size: 521 B |
Before Width: | Height: | Size: 279 B After Width: | Height: | Size: 279 B |
After Width: | Height: | Size: 503 B |
Before Width: | Height: | Size: 351 B After Width: | Height: | Size: 351 B |
Before Width: | Height: | Size: 337 B After Width: | Height: | Size: 337 B |
After Width: | Height: | Size: 426 B |
After Width: | Height: | Size: 456 B |
After Width: | Height: | Size: 468 B |
Before Width: | Height: | Size: 405 B After Width: | Height: | Size: 405 B |
Before Width: | Height: | Size: 245 B After Width: | Height: | Size: 245 B |
After Width: | Height: | Size: 366 B |
After Width: | Height: | Size: 440 B |
After Width: | Height: | Size: 380 B |
Before Width: | Height: | Size: 361 B After Width: | Height: | Size: 361 B |
Before Width: | Height: | Size: 335 B After Width: | Height: | Size: 335 B |
Before Width: | Height: | Size: 276 B After Width: | Height: | Size: 276 B |
After Width: | Height: | Size: 483 B |
Before Width: | Height: | Size: 431 B After Width: | Height: | Size: 431 B |
After Width: | Height: | Size: 472 B |
After Width: | Height: | Size: 471 B |
Before Width: | Height: | Size: 425 B After Width: | Height: | Size: 425 B |
Before Width: | Height: | Size: 322 B After Width: | Height: | Size: 322 B |
|
@ -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)
|
||||||
|
|
|
@ -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
|
@ -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)
|
||||||
]]--
|
]]--
|
||||||
|
|
||||||
|
|
|
@ -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
|
@ -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:
|
||||||
|
|