NG+ up/down fix
parent
968c09a8d9
commit
aa598914ac
41
arena.lua
41
arena.lua
|
@ -331,7 +331,7 @@ function Arena:update(dt)
|
||||||
self.paused = true
|
self.paused = true
|
||||||
self.paused_t1 = Text2{group = self.ui, x = gw/2, y = gh/2 - 108, sx = 0.6, sy = 0.6, lines = {{text = '[bg10]<-, a or m1 ->, d or m2', font = fat_font, alignment = 'center'}}}
|
self.paused_t1 = Text2{group = self.ui, x = gw/2, y = gh/2 - 108, sx = 0.6, sy = 0.6, lines = {{text = '[bg10]<-, a or m1 ->, d or m2', font = fat_font, alignment = 'center'}}}
|
||||||
self.paused_t2 = Text2{group = self.ui, x = gw/2, y = gh/2 - 92, lines = {{text = '[bg10]turn left turn right', font = pixul_font, alignment = 'center'}}}
|
self.paused_t2 = Text2{group = self.ui, x = gw/2, y = gh/2 - 92, lines = {{text = '[bg10]turn left turn right', font = pixul_font, alignment = 'center'}}}
|
||||||
self.ng_t = Text2{group = self.ui, x = gw/2 + 33, y = gh - 50, lines = {{text = '[bg10]current: ' .. new_game_plus, font = pixul_font, alignment = 'center'}}}
|
self.ng_t = Text2{group = self.ui, x = gw/2 + 63, y = gh - 50, lines = {{text = '[bg10]current: ' .. current_new_game_plus, font = pixul_font, alignment = 'center'}}}
|
||||||
|
|
||||||
self.resume_button = Button{group = self.ui, x = gw/2, y = gh - 200, force_update = true, button_text = 'resume game (esc)', fg_color = 'bg10', bg_color = 'bg', action = function(b)
|
self.resume_button = Button{group = self.ui, x = gw/2, y = gh - 200, force_update = true, button_text = 'resume game (esc)', fg_color = 'bg10', bg_color = 'bg', action = function(b)
|
||||||
trigger:tween(0.25, _G, {slow_amount = 1}, math.linear, function()
|
trigger:tween(0.25, _G, {slow_amount = 1}, math.linear, function()
|
||||||
|
@ -353,7 +353,8 @@ function Arena:update(dt)
|
||||||
if self.quit_button then self.quit_button.dead = true; self.quit_button = nil end
|
if self.quit_button then self.quit_button.dead = true; self.quit_button = nil end
|
||||||
if self.screen_shake_button then self.screen_shake_button.dead = true; self.screen_shake_button = nil end
|
if self.screen_shake_button then self.screen_shake_button.dead = true; self.screen_shake_button = nil end
|
||||||
if self.cooldown_snake_button then self.cooldown_snake_button.dead = true; self.cooldown_snake_button = nil end
|
if self.cooldown_snake_button then self.cooldown_snake_button.dead = true; self.cooldown_snake_button = nil end
|
||||||
if self.ng_plus_button then self.ng_plus_button.dead = true; self.ng_plus_button = nil end
|
if self.ng_plus_plus_button then self.ng_plus_plus_button.dead = true; self.ng_plus_plus_button = nil end
|
||||||
|
if self.ng_plus_minus_button then self.ng_plus_minus_button.dead = true; self.ng_plus_minus_button = nil end
|
||||||
system.save_state()
|
system.save_state()
|
||||||
end, 'pause')
|
end, 'pause')
|
||||||
end}
|
end}
|
||||||
|
@ -375,7 +376,7 @@ function Arena:update(dt)
|
||||||
'reinforce', 'payback', 'whispers_of_doom', 'heavy_impact', 'immolation', 'call_of_the_void'},
|
'reinforce', 'payback', 'whispers_of_doom', 'heavy_impact', 'immolation', 'call_of_the_void'},
|
||||||
[3] = {'divine_machine_arrow', 'divine_punishment', 'flying_daggers', 'crucio', 'hive', 'void_rift'},
|
[3] = {'divine_machine_arrow', 'divine_punishment', 'flying_daggers', 'crucio', 'hive', 'void_rift'},
|
||||||
}
|
}
|
||||||
max_units = 7 + 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)
|
main:go_to('buy_screen', 0, {}, passives)
|
||||||
|
@ -446,11 +447,22 @@ function Arena:update(dt)
|
||||||
b:set_text('cooldowns on snake: ' .. tostring(state.cooldown_snake and 'yes' or 'no'))
|
b:set_text('cooldowns on snake: ' .. tostring(state.cooldown_snake and 'yes' or 'no'))
|
||||||
end}
|
end}
|
||||||
|
|
||||||
self.ng_plus_button = Button{group = self.ui, x = gw/2 - 53, y = gh - 50, force_update = true, button_text = 'NG+ difficulty-', fg_color = 'bg10', bg_color = 'bg', action = function()
|
self.ng_plus_minus_button = Button{group = self.ui, x = gw/2 - 58, y = gh - 50, force_update = true, button_text = 'NG+ down', fg_color = 'bg10', bg_color = 'bg', 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}
|
||||||
new_game_plus = math.clamp(new_game_plus - 1, 0, 5)
|
b.spring:pull(0.2, 200, 10)
|
||||||
state.new_game_plus = new_game_plus
|
b.selected = true
|
||||||
self.ng_t.text:set_text({{text = '[bg10]current: ' .. new_game_plus, font = pixul_font, alignment = 'center'}})
|
current_new_game_plus = math.clamp(current_new_game_plus - 1, 0, 5)
|
||||||
|
state.current_new_game_plus = current_new_game_plus
|
||||||
|
self.ng_t.text:set_text({{text = '[bg10]current: ' .. current_new_game_plus, font = pixul_font, alignment = 'center'}})
|
||||||
|
end}
|
||||||
|
|
||||||
|
self.ng_plus_plus_button = Button{group = self.ui, x = gw/2 + 5, y = gh - 50, force_update = true, button_text = 'NG+ up', fg_color = 'bg10', bg_color = 'bg', action = function(b)
|
||||||
|
ui_switch1:play{pitch = random:float(0.95, 1.05), volume = 0.5}
|
||||||
|
b.spring:pull(0.2, 200, 10)
|
||||||
|
b.selected = true
|
||||||
|
current_new_game_plus = math.clamp(current_new_game_plus + 1, 0, new_game_plus)
|
||||||
|
state.current_new_game_plus = current_new_game_plus
|
||||||
|
self.ng_t.text:set_text({{text = '[bg10]current: ' .. current_new_game_plus, font = pixul_font, alignment = 'center'}})
|
||||||
end}
|
end}
|
||||||
|
|
||||||
self.quit_button = Button{group = self.ui, x = gw/2, y = gh - 25, force_update = true, button_text = 'quit', fg_color = 'bg10', bg_color = 'bg', action = function()
|
self.quit_button = Button{group = self.ui, x = gw/2, y = gh - 25, force_update = true, button_text = 'quit', fg_color = 'bg10', bg_color = 'bg', action = function()
|
||||||
|
@ -479,7 +491,8 @@ function Arena:update(dt)
|
||||||
if self.screen_shake_button then self.screen_shake_button.dead = true; self.screen_shake_button = nil end
|
if self.screen_shake_button then self.screen_shake_button.dead = true; self.screen_shake_button = nil end
|
||||||
if self.cooldown_snake_button then self.cooldown_snake_button.dead = true; self.cooldown_snake_button = nil end
|
if self.cooldown_snake_button then self.cooldown_snake_button.dead = true; self.cooldown_snake_button = nil end
|
||||||
if self.quit_button then self.quit_button.dead = true; self.quit_button = nil end
|
if self.quit_button then self.quit_button.dead = true; self.quit_button = nil end
|
||||||
if self.ng_plus_button then self.ng_plus_button.dead = true; self.ng_plus_button = nil end
|
if self.ng_plus_plus_button then self.ng_plus_plus_button.dead = true; self.ng_plus_plus_button = nil end
|
||||||
|
if self.ng_plus_minus_button then self.ng_plus_minus_button.dead = true; self.ng_plus_minus_button = nil end
|
||||||
system.save_state()
|
system.save_state()
|
||||||
end, 'pause')
|
end, 'pause')
|
||||||
end
|
end
|
||||||
|
@ -503,7 +516,7 @@ function Arena:update(dt)
|
||||||
'reinforce', 'payback', 'whispers_of_doom', 'heavy_impact', 'immolation', 'call_of_the_void'},
|
'reinforce', 'payback', 'whispers_of_doom', 'heavy_impact', 'immolation', 'call_of_the_void'},
|
||||||
[3] = {'divine_machine_arrow', 'divine_punishment', 'flying_daggers', 'crucio', 'hive', 'void_rift'},
|
[3] = {'divine_machine_arrow', 'divine_punishment', 'flying_daggers', 'crucio', 'hive', 'void_rift'},
|
||||||
}
|
}
|
||||||
max_units = 7 + 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)
|
main:go_to('buy_screen', 0, {}, passives)
|
||||||
|
@ -548,7 +561,7 @@ function Arena:quit()
|
||||||
CharacterPart{group = self.ui, x = 40, y = 40 + (i-1)*19, character = unit.character, level = unit.level, force_update = true, cant_click = true, parent = self}
|
CharacterPart{group = self.ui, x = 40, y = 40 + (i-1)*19, character = unit.character, level = unit.level, force_update = true, cant_click = true, parent = self}
|
||||||
end
|
end
|
||||||
|
|
||||||
if new_game_plus == 5 then
|
if current_new_game_plus == 5 then
|
||||||
self.win_text2 = Text2{group = self.ui, x = gw/2, y = gh/2 + 30, force_update = true, lines = {
|
self.win_text2 = Text2{group = self.ui, x = gw/2, y = gh/2 + 30, force_update = true, lines = {
|
||||||
{text = "[fg]now you've really beaten the game!", font = pixul_font, alignment = 'center', height_multiplier = 1.24},
|
{text = "[fg]now you've really beaten the game!", font = pixul_font, alignment = 'center', height_multiplier = 1.24},
|
||||||
{text = "[fg]thanks a lot for playing it and completing it entirely!", font = pixul_font, alignment = 'center', height_multiplier = 1.24},
|
{text = "[fg]thanks a lot for playing it and completing it entirely!", font = pixul_font, alignment = 'center', height_multiplier = 1.24},
|
||||||
|
@ -605,7 +618,7 @@ function Arena:quit()
|
||||||
'reinforce', 'payback', 'whispers_of_doom', 'heavy_impact', 'immolation', 'call_of_the_void'},
|
'reinforce', 'payback', 'whispers_of_doom', 'heavy_impact', 'immolation', 'call_of_the_void'},
|
||||||
[3] = {'divine_machine_arrow', 'divine_punishment', 'flying_daggers', 'crucio', 'hive', 'void_rift'},
|
[3] = {'divine_machine_arrow', 'divine_punishment', 'flying_daggers', 'crucio', 'hive', 'void_rift'},
|
||||||
}
|
}
|
||||||
max_units = 7 + 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)
|
main:go_to('buy_screen', 0, {}, passives)
|
||||||
|
@ -614,14 +627,14 @@ function Arena:quit()
|
||||||
end
|
end
|
||||||
end)
|
end)
|
||||||
|
|
||||||
if new_game_plus == 1 then
|
if current_new_game_plus == 1 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 new_game_plus == 5 then
|
if current_new_game_plus == 5 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')
|
||||||
|
@ -886,7 +899,7 @@ function Arena:die()
|
||||||
'reinforce', 'payback', 'whispers_of_doom', 'heavy_impact', 'immolation', 'call_of_the_void'},
|
'reinforce', 'payback', 'whispers_of_doom', 'heavy_impact', 'immolation', 'call_of_the_void'},
|
||||||
[3] = {'divine_machine_arrow', 'divine_punishment', 'flying_daggers', 'crucio', 'hive', 'void_rift'},
|
[3] = {'divine_machine_arrow', 'divine_punishment', 'flying_daggers', 'crucio', 'hive', 'void_rift'},
|
||||||
}
|
}
|
||||||
max_units = 7 + 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)
|
main:go_to('buy_screen', 0, {}, passives)
|
||||||
|
|
|
@ -68,7 +68,7 @@ function BuyScreen:on_enter(from, level, units, passives)
|
||||||
self.party_text = Text({{text = '[wavy_mid, fg]party', font = pixul_font, alignment = 'center'}}, global_text_tags)
|
self.party_text = Text({{text = '[wavy_mid, fg]party', font = pixul_font, alignment = 'center'}}, global_text_tags)
|
||||||
self.sets_text = Text({{text = '[wavy_mid, fg]classes', font = pixul_font, alignment = 'center'}}, global_text_tags)
|
self.sets_text = Text({{text = '[wavy_mid, fg]classes', font = pixul_font, alignment = 'center'}}, global_text_tags)
|
||||||
self.items_text = Text({{text = '[wavy_mid, fg]items', font = pixul_font, alignment = 'center'}}, global_text_tags)
|
self.items_text = Text({{text = '[wavy_mid, fg]items', font = pixul_font, alignment = 'center'}}, global_text_tags)
|
||||||
self.ng_text = Text({{text = '[fg]NG+' .. new_game_plus, font = pixul_font, alignment = 'center'}}, global_text_tags)
|
self.ng_text = Text({{text = '[fg]NG+' .. current_new_game_plus, font = pixul_font, alignment = 'center'}}, global_text_tags)
|
||||||
local get_elite_str = function(lvl)
|
local get_elite_str = function(lvl)
|
||||||
if lvl == 6 or lvl == 12 or lvl == 18 or lvl == 24 or lvl == 25 then return ' (elite)'
|
if lvl == 6 or lvl == 12 or lvl == 18 or lvl == 24 or lvl == 25 then return ' (elite)'
|
||||||
elseif lvl % 3 == 0 then return ' (hard)'
|
elseif lvl % 3 == 0 then return ' (hard)'
|
||||||
|
@ -125,7 +125,7 @@ function BuyScreen:on_enter(from, level, units, passives)
|
||||||
b.info_text = nil
|
b.info_text = nil
|
||||||
end}
|
end}
|
||||||
|
|
||||||
self.restart_button = Button{group = self.ui, x = gw/2 + 156, y = 18, force_update = true, hold_button = 1, button_text = 'R', fg_color = 'bg10', bg_color = 'bg', action = function(b)
|
self.restart_button = Button{group = self.ui, x = gw/2 + 156, y = 18, force_update = true, button_text = 'R', fg_color = 'bg10', bg_color = 'bg', action = function(b)
|
||||||
self.transitioning = true
|
self.transitioning = true
|
||||||
ui_transition2:play{pitch = random:float(0.95, 1.05), volume = 0.5}
|
ui_transition2:play{pitch = random:float(0.95, 1.05), volume = 0.5}
|
||||||
ui_switch2:play{pitch = random:float(0.95, 1.05), volume = 0.5}
|
ui_switch2:play{pitch = random:float(0.95, 1.05), volume = 0.5}
|
||||||
|
@ -142,7 +142,7 @@ function BuyScreen:on_enter(from, level, units, passives)
|
||||||
'reinforce', 'payback', 'whispers_of_doom', 'heavy_impact', 'immolation', 'call_of_the_void'},
|
'reinforce', 'payback', 'whispers_of_doom', 'heavy_impact', 'immolation', 'call_of_the_void'},
|
||||||
[3] = {'divine_machine_arrow', 'divine_punishment', 'flying_daggers', 'crucio', 'hive', 'void_rift'},
|
[3] = {'divine_machine_arrow', 'divine_punishment', 'flying_daggers', 'crucio', 'hive', 'void_rift'},
|
||||||
}
|
}
|
||||||
max_units = 7 + 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)
|
main:go_to('buy_screen', 0, {}, passives)
|
||||||
|
@ -237,7 +237,7 @@ function BuyScreen:draw()
|
||||||
if self.shop_text then self.shop_text:draw(64, 20) end
|
if self.shop_text then self.shop_text:draw(64, 20) end
|
||||||
if self.sets_text then self.sets_text:draw(328, 20) end
|
if self.sets_text then self.sets_text:draw(328, 20) end
|
||||||
if self.party_text then self.party_text:draw(440, 20) end
|
if self.party_text then self.party_text:draw(440, 20) end
|
||||||
if new_game_plus > 0 then self.ng_text:draw(260, 20) end
|
if current_new_game_plus > 0 then self.ng_text:draw(260, 20) end
|
||||||
|
|
||||||
if self.in_tutorial then
|
if self.in_tutorial then
|
||||||
graphics.rectangle(gw/2, gh/2, 2*gw, 2*gh, nil, nil, modal_transparent_2)
|
graphics.rectangle(gw/2, gh/2, 2*gw, 2*gh, nil, nil, modal_transparent_2)
|
||||||
|
@ -499,7 +499,7 @@ function RestartButton:init(args)
|
||||||
self:init_game_object(args)
|
self:init_game_object(args)
|
||||||
self.shape = Rectangle(self.x, self.y, pixul_font:get_text_width('restart') + 4, pixul_font.h + 4)
|
self.shape = Rectangle(self.x, self.y, pixul_font:get_text_width('restart') + 4, pixul_font.h + 4)
|
||||||
self.interact_with_mouse = true
|
self.interact_with_mouse = true
|
||||||
self.text = Text({{text = '[bg10]NG+' .. tostring(new_game_plus+1), font = pixul_font, alignment = 'center'}}, global_text_tags)
|
self.text = Text({{text = '[bg10]NG+' .. tostring(current_new_game_plus+1), font = pixul_font, alignment = 'center'}}, global_text_tags)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
@ -524,9 +524,13 @@ function RestartButton:update(dt)
|
||||||
'reinforce', 'payback', 'whispers_of_doom', 'heavy_impact', 'immolation', 'call_of_the_void'},
|
'reinforce', 'payback', 'whispers_of_doom', 'heavy_impact', 'immolation', 'call_of_the_void'},
|
||||||
[3] = {'divine_machine_arrow', 'divine_punishment', 'flying_daggers', 'crucio', 'hive', 'void_rift'},
|
[3] = {'divine_machine_arrow', 'divine_punishment', 'flying_daggers', 'crucio', 'hive', 'void_rift'},
|
||||||
}
|
}
|
||||||
new_game_plus = new_game_plus + 1
|
if current_new_game_plus == new_game_plus then
|
||||||
state.new_game_plus = new_game_plus
|
new_game_plus = new_game_plus + 1
|
||||||
max_units = 7 + new_game_plus
|
state.new_game_plus = new_game_plus
|
||||||
|
end
|
||||||
|
current_new_game_plus = current_new_game_plus + 1
|
||||||
|
state.current_new_game_plus = current_new_game_plus
|
||||||
|
max_units = 7 + current_new_game_plus
|
||||||
system.save_state()
|
system.save_state()
|
||||||
main:add(BuyScreen'buy_screen')
|
main:add(BuyScreen'buy_screen')
|
||||||
system.save_run()
|
system.save_run()
|
||||||
|
@ -549,14 +553,14 @@ function RestartButton:on_mouse_enter()
|
||||||
ui_hover1:play{pitch = random:float(1.3, 1.5), volume = 0.5}
|
ui_hover1:play{pitch = random:float(1.3, 1.5), volume = 0.5}
|
||||||
pop2:play{pitch = random:float(0.95, 1.05), volume = 0.5}
|
pop2:play{pitch = random:float(0.95, 1.05), volume = 0.5}
|
||||||
self.selected = true
|
self.selected = true
|
||||||
self.text:set_text{{text = '[fgm5]NG+' .. tostring(new_game_plus+1), font = pixul_font, alignment = 'center'}}
|
self.text:set_text{{text = '[fgm5]NG+' .. tostring(current_new_game_plus+1), font = pixul_font, alignment = 'center'}}
|
||||||
self.spring:pull(0.2, 200, 10)
|
self.spring:pull(0.2, 200, 10)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
function RestartButton:on_mouse_exit()
|
function RestartButton:on_mouse_exit()
|
||||||
if main.current.in_credits then return end
|
if main.current.in_credits then return end
|
||||||
self.text:set_text{{text = '[bg10]NG+' .. tostring(new_game_plus+1), font = pixul_font, alignment = 'center'}}
|
self.text:set_text{{text = '[bg10]NG+' .. tostring(current_new_game_plus+1), font = pixul_font, alignment = 'center'}}
|
||||||
self.selected = false
|
self.selected = false
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
22
enemies.lua
22
enemies.lua
|
@ -22,7 +22,7 @@ function Seeker:init(args)
|
||||||
HitCircle{group = main.current.effects, x = self.x, y = self.y, rs = 6, color = green[0], duration = 0.1}
|
HitCircle{group = main.current.effects, x = self.x, y = self.y, rs = 6, color = green[0], duration = 0.1}
|
||||||
for _, enemy in ipairs(enemies) do
|
for _, enemy in ipairs(enemies) do
|
||||||
LightningLine{group = main.current.effects, src = self, dst = enemy, color = green[0]}
|
LightningLine{group = main.current.effects, src = self, dst = enemy, color = green[0]}
|
||||||
enemy:speed_boost(3 + self.level*0.05 + new_game_plus*0.2)
|
enemy:speed_boost(3 + self.level*0.05 + current_new_game_plus*0.2)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end)
|
end)
|
||||||
|
@ -96,8 +96,8 @@ function Seeker:init(args)
|
||||||
LightningLine{group = main.current.effects, src = self, dst = enemy, color = blue[0]}
|
LightningLine{group = main.current.effects, src = self, dst = enemy, color = blue[0]}
|
||||||
enemy:hit(10000)
|
enemy:hit(10000)
|
||||||
shoot1:play{pitch = random:float(0.95, 1.05), volume = 0.4}
|
shoot1:play{pitch = random:float(0.95, 1.05), volume = 0.4}
|
||||||
local n = 8 + new_game_plus*2
|
local n = 8 + current_new_game_plus*2
|
||||||
for i = 1, n do EnemyProjectile{group = main.current.main, x = enemy.x, y = enemy.y, color = blue[0], r = (i-1)*math.pi/(n/2), v = 120 + 5*enemy.level, dmg = (1 + 0.1*new_game_plus)*enemy.dmg} end
|
for i = 1, n do EnemyProjectile{group = main.current.main, x = enemy.x, y = enemy.y, color = blue[0], r = (i-1)*math.pi/(n/2), v = 120 + 5*enemy.level, dmg = (1 + 0.1*current_new_game_plus)*enemy.dmg} end
|
||||||
end
|
end
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
@ -113,8 +113,8 @@ function Seeker:init(args)
|
||||||
LightningLine{group = main.current.effects, src = self, dst = enemy, color = blue[0]}
|
LightningLine{group = main.current.effects, src = self, dst = enemy, color = blue[0]}
|
||||||
enemy:hit(10000)
|
enemy:hit(10000)
|
||||||
shoot1:play{pitch = random:float(0.95, 1.05), volume = 0.4}
|
shoot1:play{pitch = random:float(0.95, 1.05), volume = 0.4}
|
||||||
local n = 8 + new_game_plus*2
|
local n = 8 + current_new_game_plus*2
|
||||||
for i = 1, n do EnemyProjectile{group = main.current.main, x = enemy.x, y = enemy.y, color = blue[0], r = (i-1)*math.pi/(n/2), v = 150 + 5*enemy.level, dmg = (1 + 0.2*new_game_plus)*enemy.dmg} end
|
for i = 1, n do EnemyProjectile{group = main.current.main, x = enemy.x, y = enemy.y, color = blue[0], r = (i-1)*math.pi/(n/2), v = 150 + 5*enemy.level, dmg = (1 + 0.2*current_new_game_plus)*enemy.dmg} end
|
||||||
end
|
end
|
||||||
elseif attack == 'swarm' then
|
elseif attack == 'swarm' then
|
||||||
local enemies = self:get_objects_in_shape(Circle(self.x, self.y, 128), {Seeker})
|
local enemies = self:get_objects_in_shape(Circle(self.x, self.y, 128), {Seeker})
|
||||||
|
@ -145,7 +145,7 @@ function Seeker:init(args)
|
||||||
HitCircle{group = main.current.effects, x = self.x, y = self.y, rs = 6, color = green[0], duration = 0.1}
|
HitCircle{group = main.current.effects, x = self.x, y = self.y, rs = 6, color = green[0], duration = 0.1}
|
||||||
for _, enemy in ipairs(enemies) do
|
for _, enemy in ipairs(enemies) do
|
||||||
LightningLine{group = main.current.effects, src = self, dst = enemy, color = green[0]}
|
LightningLine{group = main.current.effects, src = self, dst = enemy, color = green[0]}
|
||||||
enemy:speed_boost(3 + self.level*0.05 + new_game_plus*0.2)
|
enemy:speed_boost(3 + self.level*0.05 + current_new_game_plus*0.2)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -212,8 +212,8 @@ function Seeker:init(args)
|
||||||
self.hfx:use('hit', 0.25, 200, 10, 0.1)
|
self.hfx:use('hit', 0.25, 200, 10, 0.1)
|
||||||
local r = self.r
|
local r = self.r
|
||||||
HitCircle{group = main.current.effects, x = self.x + 0.8*self.shape.w*math.cos(r), y = self.y + 0.8*self.shape.w*math.sin(r), rs = 6}
|
HitCircle{group = main.current.effects, x = self.x + 0.8*self.shape.w*math.cos(r), y = self.y + 0.8*self.shape.w*math.sin(r), rs = 6}
|
||||||
EnemyProjectile{group = main.current.main, x = self.x + 1.6*self.shape.w*math.cos(r), y = self.y + 1.6*self.shape.w*math.sin(r), color = fg[0], r = r, v = 150 + 5*self.level + 8*new_game_plus,
|
EnemyProjectile{group = main.current.main, x = self.x + 1.6*self.shape.w*math.cos(r), y = self.y + 1.6*self.shape.w*math.sin(r), color = fg[0], r = r, v = 150 + 5*self.level + 8*current_new_game_plus,
|
||||||
dmg = (new_game_plus*0.1 + 1)*self.dmg}
|
dmg = (current_new_game_plus*0.1 + 1)*self.dmg}
|
||||||
end)
|
end)
|
||||||
end
|
end
|
||||||
end, nil, nil, 'shooter')
|
end, nil, nil, 'shooter')
|
||||||
|
@ -248,8 +248,8 @@ function Seeker:update(dt)
|
||||||
if self.headbutt_charging or self.headbutting then self.buff_def_m = 3 end
|
if self.headbutt_charging or self.headbutting then self.buff_def_m = 3 end
|
||||||
|
|
||||||
if self.speed_boosting then
|
if self.speed_boosting then
|
||||||
local n = math.remap(love.timer.getTime() - self.speed_boosting, 0, (3 + 0.05*self.level + new_game_plus*0.2), 1, 0.5)
|
local n = math.remap(love.timer.getTime() - self.speed_boosting, 0, (3 + 0.05*self.level + current_new_game_plus*0.2), 1, 0.5)
|
||||||
self.speed_boosting_mvspd_m = (3 + 0.05*self.level + 0.2*new_game_plus)*n
|
self.speed_boosting_mvspd_m = (3 + 0.05*self.level + 0.2*current_new_game_plus)*n
|
||||||
if not self.speed_booster and not self.exploder and not self.headbutter and not self.tank and not self.shooter and not self.spawner then
|
if not self.speed_booster and not self.exploder and not self.headbutter and not self.tank and not self.shooter and not self.spawner then
|
||||||
self.color.r = math.remap(n, 1, 0.5, green[0].r, red[0].r)
|
self.color.r = math.remap(n, 1, 0.5, green[0].r, red[0].r)
|
||||||
self.color.g = math.remap(n, 1, 0.5, green[0].g, red[0].g)
|
self.color.g = math.remap(n, 1, 0.5, green[0].g, red[0].g)
|
||||||
|
@ -432,7 +432,7 @@ function Seeker:hit(damage, projectile)
|
||||||
if self.exploder then
|
if self.exploder then
|
||||||
shoot1:play{pitch = random:float(0.95, 1.05), volume = 0.4}
|
shoot1:play{pitch = random:float(0.95, 1.05), volume = 0.4}
|
||||||
trigger:after(0.01, function()
|
trigger:after(0.01, function()
|
||||||
local n = 8 + new_game_plus*2
|
local n = 8 + current_new_game_plus*2
|
||||||
for i = 1, n do
|
for i = 1, n do
|
||||||
EnemyProjectile{group = main.current.main, x = self.x, y = self.y, color = blue[0], r = (i-1)*math.pi/(n/2), v = 150 + 5*self.level, dmg = 2*self.dmg}
|
EnemyProjectile{group = main.current.main, x = self.x, y = self.y, color = blue[0], r = (i-1)*math.pi/(n/2), v = 150 + 5*self.level, dmg = 2*self.dmg}
|
||||||
end
|
end
|
||||||
|
|
2
main.lua
2
main.lua
|
@ -1172,6 +1172,8 @@ function init()
|
||||||
steam.userStats.requestCurrentStats()
|
steam.userStats.requestCurrentStats()
|
||||||
new_game_plus = state.new_game_plus or 0
|
new_game_plus = state.new_game_plus or 0
|
||||||
if not state.new_game_plus then state.new_game_plus = new_game_plus end
|
if not state.new_game_plus then state.new_game_plus = new_game_plus end
|
||||||
|
current_new_game_plus = state.current_new_game_plus or new_game_plus
|
||||||
|
if not state.current_new_game_plus then state.current_new_game_plus = current_new_game_plus end
|
||||||
max_units = 7 + new_game_plus
|
max_units = 7 + new_game_plus
|
||||||
|
|
||||||
main = Main()
|
main = Main()
|
||||||
|
|
14
objects.lua
14
objects.lua
|
@ -229,12 +229,12 @@ function Unit:calculate_stats(first_run)
|
||||||
self.base_dmg = 10*math.pow(2, self.level-1)
|
self.base_dmg = 10*math.pow(2, self.level-1)
|
||||||
self.base_mvspd = 75
|
self.base_mvspd = 75
|
||||||
elseif self:is(Seeker) then
|
elseif self:is(Seeker) then
|
||||||
if new_game_plus == 0 then
|
if current_new_game_plus == 0 then
|
||||||
if self.boss then
|
if self.boss then
|
||||||
local x = self.level
|
local x = self.level
|
||||||
local y = {0, 0, 3, 0, 0, 6, 0, 0, 9, 0, 0, 12, 0, 0, 18, 0, 0, 24, 0, 0, 32, 0, 0, 40, 48}
|
local y = {0, 0, 3, 0, 0, 6, 0, 0, 9, 0, 0, 12, 0, 0, 18, 0, 0, 24, 0, 0, 32, 0, 0, 40, 48}
|
||||||
self.base_hp = 100 + (new_game_plus*5) + (90 + new_game_plus*10)*y[x]
|
self.base_hp = 100 + (current_new_game_plus*5) + (90 + current_new_game_plus*10)*y[x]
|
||||||
self.base_dmg = (12 + new_game_plus*2) + (2 + new_game_plus)*y[x]
|
self.base_dmg = (12 + current_new_game_plus*2) + (2 + current_new_game_plus)*y[x]
|
||||||
self.base_mvspd = 35 + 1.5*y[x]
|
self.base_mvspd = 35 + 1.5*y[x]
|
||||||
else
|
else
|
||||||
local x = self.level
|
local x = self.level
|
||||||
|
@ -247,14 +247,14 @@ function Unit:calculate_stats(first_run)
|
||||||
if self.boss then
|
if self.boss then
|
||||||
local x = self.level
|
local x = self.level
|
||||||
local y = {0, 0, 3, 0, 0, 6, 0, 0, 9, 0, 0, 12, 0, 0, 18, 0, 0, 24, 0, 0, 32, 0, 0, 40, 48}
|
local y = {0, 0, 3, 0, 0, 6, 0, 0, 9, 0, 0, 12, 0, 0, 18, 0, 0, 24, 0, 0, 32, 0, 0, 40, 48}
|
||||||
self.base_hp = 100 + (new_game_plus*5) + (90 + new_game_plus*10)*y[x]
|
self.base_hp = 100 + (current_new_game_plus*5) + (90 + current_new_game_plus*10)*y[x]
|
||||||
self.base_dmg = (12 + new_game_plus*2) + (2 + new_game_plus)*y[x]
|
self.base_dmg = (12 + current_new_game_plus*2) + (2 + current_new_game_plus)*y[x]
|
||||||
self.base_mvspd = 35 + 1.5*y[x]
|
self.base_mvspd = 35 + 1.5*y[x]
|
||||||
else
|
else
|
||||||
local x = self.level
|
local x = self.level
|
||||||
local y = {0, 1, 3, 3, 4, 6, 5, 6, 9, 7, 8, 12, 10, 11, 15, 12, 13, 18, 16, 17, 21, 17, 20, 24, 25}
|
local y = {0, 1, 3, 3, 4, 6, 5, 6, 9, 7, 8, 12, 10, 11, 15, 12, 13, 18, 16, 17, 21, 17, 20, 24, 25}
|
||||||
self.base_hp = 22 + (new_game_plus*3) + (15 + new_game_plus*2.7)*y[x]
|
self.base_hp = 22 + (current_new_game_plus*3) + (15 + current_new_game_plus*2.7)*y[x]
|
||||||
self.base_dmg = (4 + new_game_plus*1.25) + (2 + new_game_plus*1.2)*y[x]
|
self.base_dmg = (4 + current_new_game_plus*1.25) + (2 + current_new_game_plus*1.2)*y[x]
|
||||||
self.base_mvspd = 70 + 3*y[x]
|
self.base_mvspd = 70 + 3*y[x]
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
28
todo
28
todo
|
@ -2,14 +2,36 @@ Hide cursor during waves
|
||||||
Mouse follow control?
|
Mouse follow control?
|
||||||
Item reroll for 15 gold
|
Item reroll for 15 gold
|
||||||
Option to have an arrow at the head of the snake - https://imgur.com/a/poXVsoN
|
Option to have an arrow at the head of the snake - https://imgur.com/a/poXVsoN
|
||||||
Balance option for when there are more sets - https://i.imgur.com/JMynwbL.png
|
Option to turn off camera movement
|
||||||
Bench? - https://i.imgur.com/B1gNVKk.png
|
Headbutter damage should falloff faster after it strikes
|
||||||
|
https://i.imgur.com/QN0Ntq2.png
|
||||||
|
https://i.imgur.com/YfhqDYr.png
|
||||||
|
https://i.imgur.com/ps4OA7o.png
|
||||||
|
Remove level 3 units from rotation
|
||||||
|
Fix highlight colors and highlight reserve
|
||||||
|
Fix bug where quitting on level 1 jumps to level 2
|
||||||
|
Fix lock bug after death/win - https://i.imgur.com/iUyOtLk.png
|
||||||
|
Options menu from buy screen
|
||||||
|
Fix fullscreen with different resolutions that don't scale properly
|
||||||
|
Volume slider
|
||||||
|
|
||||||
|
Sorcerer = sorcerers repeat their attacks once every 3/2 attacks
|
||||||
|
Sorcerer + Conjurer = Illusionist - launches a projectile that deals X damage and creates copies that do the same, Lv.3 effect - doubles the number of copies created and they release additional projectiles on death
|
||||||
|
Sorcerer + Voider = Witch - creates an area that deals X damage over time and seeks nearby enemies, Lv.3 effect - the area periodically releases homing projectiles that pierce 2 times
|
||||||
|
Sorcerer + Curser = Linker - links 3 enemies together, they share damage taken, Lv.3 effect - link 6 enemies instead and damage shared is doubled
|
||||||
|
Sorcerer + Nuker = Vulcanist - creates a volcano that explodes the nearby area 5 times, Lv.3 effect - the volcano spawn also deals damage and doubles the number of explosions
|
||||||
|
Sorcerer + Forcer = Warden - creates a force field around a random unit that prevents enemies from entering, Lv.3 effect - creates the force field around 2 other random units
|
||||||
|
|
||||||
Patch Notes:
|
Patch Notes:
|
||||||
Decreased projectile speed for the exploder (blue enemy)
|
Decreased projectile speed for the exploder (blue enemy)
|
||||||
Added tooltips for "restart run" and "tutorial" buttons on the shop
|
Added tooltips for "restart run" and "tutorial" buttons on the shop
|
||||||
Added a hold mechanism to the restart button, now it will only trigger a restart if you hold the button down for 1 second
|
|
||||||
Fixed text that was going outside the screen for the Priest and the Assassin
|
Fixed text that was going outside the screen for the Priest and the Assassin
|
||||||
Fixed bug where Divine Punishment would continue triggering after death
|
Fixed bug where Divine Punishment would continue triggering after death
|
||||||
Removed cooldown visuals on snake for units that don't have cooldowns (Squire, Chronomancer and Psykeeper)
|
Removed cooldown visuals on snake for units that don't have cooldowns (Squire, Chronomancer and Psykeeper)
|
||||||
Slightly decreased base game's difficulty
|
Slightly decreased base game's difficulty
|
||||||
|
Fixed NG+ difficulty only being able to be lowered, now you can lower or increase it (up to your maximum acquired value)
|
||||||
|
|
||||||
|
Future ideas:
|
||||||
|
Chaos related class = Invoker - shoots a projectile with random properties, Lv.3 effect - ???
|
||||||
|
Bench? - https://i.imgur.com/B1gNVKk.png
|
||||||
|
Balance option for when there are more sets - https://i.imgur.com/JMynwbL.png
|
||||||
|
|
Loading…
Reference in New Issue