Loop update 5/5
parent
868cae93ed
commit
9e8b98a51d
|
@ -107,7 +107,7 @@ function Arena:on_enter(from, level, loop, units, passives, shop_level, shop_xp,
|
|||
-- self.level_1000_text2 = Text2{group = self.ui, x = gw/2, y = gh/2 + 64, lines = {{text = '[fg, wavy_mid]SNKRX', font = pixul_font, alignment = 'center'}}}
|
||||
-- Wall{group = self.main, vertices = math.to_rectangle_vertices(gw/2 - 0.45*self.level_1000_text.w, gh/2 - 0.3*self.level_1000_text.h, gw/2 + 0.45*self.level_1000_text.w, gh/2 - 3), snkrx = true, color = bg[-1]}
|
||||
|
||||
elseif self.level == 6 or self.level == 12 or self.level == 18 or self.level == 24 or self.level == 25 then
|
||||
elseif (self.level - (25*self.loop)) % 6 == 0 or self.level % 25 == 0 then
|
||||
self.boss_level = true
|
||||
self.start_time = 3
|
||||
self.t:after(1, function()
|
||||
|
@ -222,7 +222,7 @@ function Arena:on_enter(from, level, loop, units, passives, shop_level, shop_xp,
|
|||
self.hfx:pull('condition2', 0.0625)
|
||||
self.t:after(0.5, function()
|
||||
if random:bool(self.level_to_distributed_enemies_chance[self.level]) then
|
||||
local n = math.ceil((8 + (self.wave-1)*2)/7)
|
||||
local n = math.ceil((8 + (self.wave+math.min(self.loop*6, 60)-1)*2)/7)
|
||||
for i = 1, n do
|
||||
self.t:after((i-1)*2, function()
|
||||
self:spawn_distributed_enemies()
|
||||
|
@ -235,7 +235,7 @@ function Arena:on_enter(from, level, loop, units, passives, shop_level, shop_xp,
|
|||
local spawn_points = {left = {x = self.x1 + 32, y = gh/2}, middle = {x = gw/2, y = gh/2}, right = {x = self.x2 - 32, y = gh/2}}
|
||||
local p = spawn_points[spawn_type]
|
||||
SpawnMarker{group = self.effects, x = p.x, y = p.y}
|
||||
self.t:after(1.125, function() self:spawn_n_enemies(p, nil, 8 + (self.wave-1)*2) end)
|
||||
self.t:after(1.125, function() self:spawn_n_enemies(p, nil, 8 + (self.wave+math.min(self.loop*12, 200)-1)*2) end)
|
||||
end
|
||||
end)
|
||||
end, self.max_waves+1)
|
||||
|
@ -982,6 +982,7 @@ function Arena:transition()
|
|||
self.shop_xp = 0
|
||||
self.shop_level = self.shop_level + 1
|
||||
end
|
||||
if self.shop_level > 5 then self.shop_level = 5 end
|
||||
end
|
||||
slow_amount = 1
|
||||
music_slow_amount = 1
|
||||
|
|
Binary file not shown.
After Width: | Height: | Size: 6.1 KiB |
|
@ -623,9 +623,16 @@ function Button:update(dt)
|
|||
end
|
||||
else
|
||||
if self.selected and input.m1.pressed then
|
||||
if self.action then
|
||||
self:action()
|
||||
end
|
||||
end
|
||||
if self.selected and input.m2.pressed then
|
||||
if self.action_2 then
|
||||
self:action_2()
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
|
@ -1974,7 +1981,7 @@ function ClassIcon:on_mouse_enter()
|
|||
local i, j, k, owned = class_set_numbers[self.class](self.units)
|
||||
self.info_text = InfoText{group = main.current.ui}
|
||||
self.info_text:activate({
|
||||
{text = '[' .. class_color_strings[self.class] .. ']' .. self.class:capitalize() .. '[fg] - owned: [yellow]' .. owned, font = pixul_font, alignment = 'center', height_multiplier = 1.25},
|
||||
{text = '[' .. class_color_strings[self.class] .. ']' .. (self.class == 'conjurer' and 'Builder' or self.class:capitalize()) .. '[fg] - owned: [yellow]' .. owned, font = pixul_font, alignment = 'center', height_multiplier = 1.25},
|
||||
{text = class_descriptions[self.class]((k and (owned >= k and 3)) or (owned >= j and 2) or (owned >= i and 1) or 0), font = pixul_font, alignment = 'center'},
|
||||
}, nil, nil, nil, nil, 16, 4, nil, 2)
|
||||
self.info_text.x, self.info_text.y = gw/2, gh/2 + 10
|
||||
|
|
18
enemies.lua
18
enemies.lua
|
@ -26,7 +26,7 @@ function Seeker:init(args)
|
|||
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
|
||||
LightningLine{group = main.current.effects, src = self, dst = enemy, color = green[0]}
|
||||
enemy:speed_boost(3 + self.level*0.025 + current_new_game_plus*0.1)
|
||||
enemy:speed_boost(3 + self.level*0.015 + current_new_game_plus*0.1)
|
||||
end
|
||||
end
|
||||
end, nil, nil, 'boss_attack')
|
||||
|
@ -154,7 +154,7 @@ function Seeker:init(args)
|
|||
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
|
||||
LightningLine{group = main.current.effects, src = self, dst = enemy, color = green[0]}
|
||||
enemy:speed_boost(3 + self.level*0.025 + current_new_game_plus*0.1)
|
||||
enemy:speed_boost(3 + self.level*0.015 + current_new_game_plus*0.1)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
@ -231,12 +231,12 @@ function Seeker:init(args)
|
|||
self.t:every({4, 6}, function()
|
||||
if self.silenced or self.barbarian_stunned then return end
|
||||
for i = 1, 3 do
|
||||
self.t:after((1 - self.level*0.01)*0.15*(i-1), function()
|
||||
self.t:after(math.max(1 - self.level*0.01, 0.25)*0.15*(i-1), function()
|
||||
shoot1:play{pitch = random:float(0.95, 1.05), volume = 0.1}
|
||||
self.hfx:use('hit', 0.25, 200, 10, 0.1)
|
||||
local r = self.r
|
||||
HitCircle{group = main.current.effects, x = self.x + 0.8*self.shape.w*math.cos(r), y = self.y + 0.8*self.shape.w*math.sin(r), rs = 6}
|
||||
EnemyProjectile{group = main.current.main, x = self.x + 1.6*self.shape.w*math.cos(r), y = self.y + 1.6*self.shape.w*math.sin(r), color = fg[0], r = r, v = 140 + 3.5*self.level + 2*current_new_game_plus,
|
||||
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 = math.min(140 + 3.5*self.level + 2*current_new_game_plus, 300),
|
||||
dmg = (current_new_game_plus*0.05 + 1)*self.dmg, source = 'shooter'}
|
||||
end)
|
||||
end
|
||||
|
@ -275,8 +275,8 @@ function Seeker:update(dt)
|
|||
if self.headbutt_charging or self.headbutting then self.buff_def_m = 3 end
|
||||
|
||||
if self.speed_boosting then
|
||||
local n = math.remap(love.timer.getTime() - self.speed_boosting, 0, (3 + 0.025*self.level + current_new_game_plus*0.1), 1, 0.5)
|
||||
self.speed_boosting_mvspd_m = (3 + 0.025*self.level + 0.1*current_new_game_plus)*n
|
||||
local n = math.remap(love.timer.getTime() - self.speed_boosting, 0, (3 + 0.015*self.level + current_new_game_plus*0.1), 1, 0.5)
|
||||
self.speed_boosting_mvspd_m = (3 + 0.015*self.level + 0.1*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
|
||||
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)
|
||||
|
@ -295,7 +295,7 @@ function Seeker:update(dt)
|
|||
self.stun_dmg_m = (self.barbarian_stunned and 2 or 1)
|
||||
|
||||
if self.shooter then
|
||||
self.t:set_every_multiplier('shooter', (1 - self.level*0.02))
|
||||
self.t:set_every_multiplier('shooter', (1 - math.min(self.level*0.02, 0.25)))
|
||||
end
|
||||
|
||||
if self.being_pushed then
|
||||
|
@ -703,7 +703,7 @@ function Seeker:push(f, r, push_invulnerable)
|
|||
local n = 1
|
||||
if self.tank then n = 0.7 end
|
||||
if self.boss then n = 0.2 end
|
||||
if self.level == 25 and self.boss then n = 0.7 end
|
||||
if self.level % 25 == 0 and self.boss then n = 0.7 end
|
||||
self.push_invulnerable = push_invulnerable
|
||||
self.push_force = n*f
|
||||
self.being_pushed = true
|
||||
|
@ -817,7 +817,7 @@ function ExploderMine:init(args)
|
|||
HitCircle{group = main.current.effects, x = self.x, y = self.y}
|
||||
local n = math.floor(8 + current_new_game_plus*1.5)
|
||||
for i = 1, n do
|
||||
EnemyProjectile{group = main.current.main, x = self.x, y = self.y, color = blue[0], r = (i-1)*math.pi/(n/2), v = 120 + 5*self.parent.level, dmg = 1.3*self.parent.dmg}
|
||||
EnemyProjectile{group = main.current.main, x = self.x, y = self.y, color = blue[0], r = (i-1)*math.pi/(n/2), v = 120 + math.min(5*self.parent.level, 300), dmg = 1.3*self.parent.dmg}
|
||||
end
|
||||
self.dead = true
|
||||
end, 'mine_count')
|
||||
|
|
|
@ -138,7 +138,8 @@ end
|
|||
|
||||
|
||||
function system.save_run(level, loop, gold, units, passives, shop_level, shop_xp, run_passive_pool, locked_state)
|
||||
local run = {level = level, loop = loop, 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 run = {level = level, loop = loop, gold = gold, units = units, passives = passives, shop_level = shop_level, shop_xp = shop_xp, run_passive_pool = run_passive_pool, locked_state = locked_state,
|
||||
current_new_game_plus = current_new_game_plus}
|
||||
local str = "return " .. table.tostring(run)
|
||||
love.filesystem.write("run_v4.txt", str)
|
||||
end
|
||||
|
|
42
main.lua
42
main.lua
|
@ -869,7 +869,7 @@ function init()
|
|||
['jester'] = function() return '[light_bg]curses 6 enemies and all knives seek enemies and pierce 2 times' end,
|
||||
['assassin'] = function() return '[light_bg]poison inflicted from crits deals 8x damage' end,
|
||||
['host'] = function() return '[light_bg]+100% critter spawn rate and spawn 2 critters instead' end,
|
||||
['carver'] = function() return '[light_bg]carves a tree that heals twice as fast, in a bigger area, and heals 2 units instead' end,
|
||||
['carver'] = function() return '[light_bg]carves a tree that creates healing orbs twice as fast' end,
|
||||
['bane'] = function() return "[light_bg]100% increased area for bane's void rifts" end,
|
||||
['psykino'] = function() return '[light_bg]enemies take ' .. 4*get_character_stat('psykino', 3, 'dmg') .. ' damage and are pushed away when the area expires' end,
|
||||
['barrager'] = function() return '[light_bg]every 3rd attack the barrage shoots 15 projectiles and they push harder' end,
|
||||
|
@ -1581,15 +1581,19 @@ function init()
|
|||
[25] = 'randomizer',
|
||||
}
|
||||
|
||||
local bosses = {'speed_booster', 'exploder', 'swarmer', 'forcer'}
|
||||
local bosses = {'speed_booster', 'exploder', 'swarmer', 'forcer', 'randomizer'}
|
||||
level_to_boss[31] = 'speed_booster'
|
||||
level_to_boss[37] = 'exploder'
|
||||
level_to_boss[43] = 'swarmer'
|
||||
level_to_boss[49] = 'forcer'
|
||||
level_to_boss[50] = 'randomizer'
|
||||
local i = 31
|
||||
local k = 1
|
||||
for i = 30, 5000, 6 do
|
||||
while i < 5000 do
|
||||
level_to_boss[i] = bosses[k]
|
||||
k = k + 1
|
||||
if k > 4 then k = 1 end
|
||||
end
|
||||
for i = 50, 5000, 25 do
|
||||
level_to_boss[i] = 'randomizer'
|
||||
if k == 5 then i = i + 1 else i = i + 6 end
|
||||
if k == 6 then k = 1 end
|
||||
end
|
||||
|
||||
level_to_elite_spawn_types = {
|
||||
|
@ -1940,7 +1944,17 @@ function open_options(self)
|
|||
b.selected = true
|
||||
ui_switch1:play{pitch = random:float(0.95, 1.05), volume = 0.5}
|
||||
sfx.volume = sfx.volume + 0.1
|
||||
if sfx.volume > 1 then sfx.volume = 0 end
|
||||
if sfx.volume > 1 then sfx.volume = 1 end
|
||||
state.sfx_volume = sfx.volume
|
||||
b:set_text('sfx volume: ' .. tostring((state.sfx_volume or 0.5)*10))
|
||||
end,
|
||||
action_2 = function(b)
|
||||
ui_switch2:play{pitch = random:float(0.95, 1.05), volume = 0.5}
|
||||
b.spring:pull(0.2, 200, 10)
|
||||
b.selected = true
|
||||
ui_switch1:play{pitch = random:float(0.95, 1.05), volume = 0.5}
|
||||
sfx.volume = sfx.volume - 0.1
|
||||
if sfx.volume <= 0 then sfx.volume = 0 end
|
||||
state.sfx_volume = sfx.volume
|
||||
b:set_text('sfx volume: ' .. tostring((state.sfx_volume or 0.5)*10))
|
||||
end}
|
||||
|
@ -1952,7 +1966,17 @@ function open_options(self)
|
|||
b.selected = true
|
||||
ui_switch1:play{pitch = random:float(0.95, 1.05), volume = 0.5}
|
||||
music.volume = music.volume + 0.1
|
||||
if music.volume > 1 then music.volume = 0 end
|
||||
if music.volume > 1 then music.volume = 1 end
|
||||
state.music_volume = music.volume
|
||||
b:set_text('music volume: ' .. tostring((state.music_volume or 0.5)*10))
|
||||
end,
|
||||
action_2 = function(b)
|
||||
ui_switch2:play{pitch = random:float(0.95, 1.05), volume = 0.5}
|
||||
b.spring:pull(0.2, 200, 10)
|
||||
b.selected = true
|
||||
ui_switch1:play{pitch = random:float(0.95, 1.05), volume = 0.5}
|
||||
music.volume = music.volume - 0.1
|
||||
if music.volume <= 0 then music.volume = 0 end
|
||||
state.music_volume = music.volume
|
||||
b:set_text('music volume: ' .. tostring((state.music_volume or 0.5)*10))
|
||||
end}
|
||||
|
|
|
@ -100,6 +100,7 @@ function MainMenu:on_enter(from)
|
|||
gold = run.gold or 3
|
||||
passives = run.passives or {}
|
||||
locked_state = run.locked_state
|
||||
current_new_game_plus = run.current_new_game_plus or current_new_game_plus or 0
|
||||
system.save_state()
|
||||
main:add(BuyScreen'buy_screen')
|
||||
main:go_to('buy_screen', run.level or 1, run.loop or 0, run.units or {}, passives, run.shop_level or 1, run.shop_xp or 0)
|
||||
|
|
|
@ -14,7 +14,7 @@ function Media:on_enter(from)
|
|||
graphics.set_background_color(blue[0])
|
||||
Text2{group = self.ui, x = gw/2, y = gh/2, lines = {
|
||||
{text = '[fg]SNKRX', font = fat_font, alignment = 'center', height_offset = -15},
|
||||
{text = '[fg]orb update', font = pixul_font, alignment = 'center'},
|
||||
{text = '[fg]loop update', font = pixul_font, alignment = 'center'},
|
||||
}}
|
||||
end
|
||||
|
||||
|
|
28
objects.lua
28
objects.lua
|
@ -234,34 +234,34 @@ function Unit:calculate_stats(first_run)
|
|||
local x = self.level
|
||||
local y = {0, 0, 3, 0, 0, 6, 0, 0, 9, 0, 0, 12, 0, 0, 18, 0, 0, 40, 0, 0, 32, 0, 0, 64, 90}
|
||||
local y2 = {0, 0, 24, 0, 0, 28, 0, 0, 32, 0, 0, 36, 0, 0, 44, 0, 0, 64, 0, 0, 48, 0, 0, 80, 100}
|
||||
local k = 1.1
|
||||
for i = 26, 50 do y[i] = y2[i] end
|
||||
local k = 1.07
|
||||
for i = 26, 50 do y[i] = y2[i-25] end
|
||||
for i = 51, 5000 do
|
||||
local n = i % 25
|
||||
if n == 0 then
|
||||
n = 25
|
||||
k = k + 0.1
|
||||
k = k + 0.07
|
||||
end
|
||||
y[i] = y2[n]*k
|
||||
end
|
||||
self.base_hp = 100 + (current_new_game_plus*5) + (90 + current_new_game_plus*10)*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]
|
||||
if x == 25 then
|
||||
if x % 25 == 0 then
|
||||
self.base_dmg = (12 + current_new_game_plus*2) + (1.25 + current_new_game_plus)*y[x]
|
||||
self.base_mvspd = 35 + 1.1*y[x]
|
||||
end
|
||||
else
|
||||
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 k = 1.2
|
||||
local k = 1.07
|
||||
for i = 26, 5000 do
|
||||
local n = i % 25
|
||||
if n == 0 then
|
||||
n = 25
|
||||
k = k + 0.2
|
||||
k = k + 0.07
|
||||
end
|
||||
y[i] = y[n]*k
|
||||
y[i] = y[i-10]*k
|
||||
end
|
||||
self.base_hp = 25 + 16.5*y[x]
|
||||
self.base_dmg = 4.5 + 2.5*y[x]
|
||||
|
@ -272,34 +272,34 @@ function Unit:calculate_stats(first_run)
|
|||
local x = self.level
|
||||
local y = {0, 0, 3, 0, 0, 6, 0, 0, 9, 0, 0, 12, 0, 0, 18, 0, 0, 40, 0, 0, 32, 0, 0, 64, 90}
|
||||
local y2 = {0, 0, 24, 0, 0, 28, 0, 0, 32, 0, 0, 36, 0, 0, 44, 0, 0, 64, 0, 0, 48, 0, 0, 80, 100}
|
||||
local k = 1.1
|
||||
for i = 26, 50 do y[i] = y2[i] end
|
||||
local k = 1.07
|
||||
for i = 26, 50 do y[i] = y2[i-25] end
|
||||
for i = 51, 5000 do
|
||||
local n = i % 25
|
||||
if n == 0 then
|
||||
n = 25
|
||||
k = k + 0.1
|
||||
k = k + 0.07
|
||||
end
|
||||
y[i] = y2[n]*k
|
||||
end
|
||||
self.base_hp = 100 + (current_new_game_plus*5) + (90 + current_new_game_plus*10)*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]
|
||||
if x == 25 then
|
||||
if x % 25 == 0 then
|
||||
self.base_dmg = (12 + current_new_game_plus*2) + (1.75 + 0.5*current_new_game_plus)*y[x]
|
||||
self.base_mvspd = 35 + 1.2*y[x]
|
||||
end
|
||||
else
|
||||
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 k = 1.2
|
||||
local k = 1.07
|
||||
for i = 26, 5000 do
|
||||
local n = i % 25
|
||||
if n == 0 then
|
||||
n = 25
|
||||
k = k + 0.2
|
||||
k = k + 0.07
|
||||
end
|
||||
y[i] = y[n]*k
|
||||
y[i] = y[i-10]*k
|
||||
end
|
||||
self.base_hp = 22 + (current_new_game_plus*3) + (15 + current_new_game_plus*2.7)*y[x]
|
||||
self.base_dmg = (4 + current_new_game_plus*1.15) + (2 + current_new_game_plus*0.83)*y[x]
|
||||
|
|
2
todo
2
todo
|
@ -51,7 +51,7 @@ Loop Update
|
|||
* Snake size goes up by 1 every loop, up to 12
|
||||
* Don't offer items if at maximum items
|
||||
QoL
|
||||
Default to mouse controls
|
||||
* Right click goes down on volume buttons
|
||||
* Show cooldown on elite attack
|
||||
* Added visuals for divine intervention and fairy buffs
|
||||
* Increased item choice slots to 4
|
||||
|
|
Loading…
Reference in New Issue