diff --git a/arena.lua b/arena.lua index 83d1b69..6e08ad7 100644 --- a/arena.lua +++ b/arena.lua @@ -634,6 +634,7 @@ function Arena:quit() self.credits_button = Button{group = self.ui, x = gw - 40, y = gh - 44, force_update = true, button_text = 'credits', fg_color = 'bg10', bg_color = 'bg', action = function() self:create_credits() end} + --[[ self.restart_button = Button{group = self.ui, x = gw - 40, y = gh - 68, force_update = true, button_text = 'restart', fg_color = 'bg10', bg_color = 'bg', action = function(b) self.transitioning = true ui_transition2:play{pitch = random:float(0.95, 1.05), volume = 0.5} @@ -657,6 +658,7 @@ function Arena:quit() main:go_to('buy_screen', 0, {}, passives) end, text = Text({{text = '[wavy, bg]restarting...', font = pixul_font, alignment = 'center'}}, global_text_tags)} end} + ]]-- end end) diff --git a/assets/images/lock.png b/assets/images/lock.png new file mode 100644 index 0000000..d4085ba Binary files /dev/null and b/assets/images/lock.png differ diff --git a/assets/media/achievement_ascension_1_gray.png b/assets/media/achievement_ascension_1_gray.png deleted file mode 100644 index 4e086d7..0000000 Binary files a/assets/media/achievement_ascension_1_gray.png and /dev/null differ diff --git a/assets/media/achievement_ascension_5_gray.png b/assets/media/achievement_ascension_5_gray.png deleted file mode 100644 index b22e0f7..0000000 Binary files a/assets/media/achievement_ascension_5_gray.png and /dev/null differ diff --git a/assets/media/achievement_cluster_gray.png b/assets/media/achievement_cluster_gray.png deleted file mode 100644 index 1c42ed7..0000000 Binary files a/assets/media/achievement_cluster_gray.png and /dev/null differ diff --git a/assets/media/achievement_conjurers_win_gray.png b/assets/media/achievement_conjurers_win_gray.png deleted file mode 100644 index 8042726..0000000 Binary files a/assets/media/achievement_conjurers_win_gray.png and /dev/null differ diff --git a/assets/media/achievement_cursers_win_gray.png b/assets/media/achievement_cursers_win_gray.png deleted file mode 100644 index 03b9ccd..0000000 Binary files a/assets/media/achievement_cursers_win_gray.png and /dev/null differ diff --git a/assets/media/achievement_enchanters_win_gray.png b/assets/media/achievement_enchanters_win_gray.png deleted file mode 100644 index 914aa42..0000000 Binary files a/assets/media/achievement_enchanters_win_gray.png and /dev/null differ diff --git a/assets/media/achievement_exploder_gray.png b/assets/media/achievement_exploder_gray.png deleted file mode 100644 index ca37dbe..0000000 Binary files a/assets/media/achievement_exploder_gray.png and /dev/null differ diff --git a/assets/media/achievement_forcer_gray.png b/assets/media/achievement_forcer_gray.png deleted file mode 100644 index d65ee61..0000000 Binary files a/assets/media/achievement_forcer_gray.png and /dev/null differ diff --git a/assets/media/achievement_game_complete_gray.png b/assets/media/achievement_game_complete_gray.png deleted file mode 100644 index b05a6d9..0000000 Binary files a/assets/media/achievement_game_complete_gray.png and /dev/null differ diff --git a/assets/media/achievement_healers_win_gray.png b/assets/media/achievement_healers_win_gray.png deleted file mode 100644 index b5a7cee..0000000 Binary files a/assets/media/achievement_healers_win_gray.png and /dev/null differ diff --git a/assets/media/achievement_level_2_win_gray.png b/assets/media/achievement_level_2_win_gray.png deleted file mode 100644 index 819d445..0000000 Binary files a/assets/media/achievement_level_2_win_gray.png and /dev/null differ diff --git a/assets/media/achievement_level_3_win_gray.png b/assets/media/achievement_level_3_win_gray.png deleted file mode 100644 index 97033bb..0000000 Binary files a/assets/media/achievement_level_3_win_gray.png and /dev/null differ diff --git a/assets/media/achievement_locked.png b/assets/media/achievement_locked.png new file mode 100644 index 0000000..be194af Binary files /dev/null and b/assets/media/achievement_locked.png differ diff --git a/assets/media/achievement_mages_win_gray.png b/assets/media/achievement_mages_win_gray.png deleted file mode 100644 index 7c99778..0000000 Binary files a/assets/media/achievement_mages_win_gray.png and /dev/null differ diff --git a/assets/media/achievement_new_game_1_gray.png b/assets/media/achievement_new_game_1_gray.png deleted file mode 100644 index 03cafff..0000000 Binary files a/assets/media/achievement_new_game_1_gray.png and /dev/null differ diff --git a/assets/media/achievement_new_game_5_gray.png b/assets/media/achievement_new_game_5_gray.png deleted file mode 100644 index bc1d26d..0000000 Binary files a/assets/media/achievement_new_game_5_gray.png and /dev/null differ diff --git a/assets/media/achievement_nukers_win_gray.png b/assets/media/achievement_nukers_win_gray.png deleted file mode 100644 index 11b52ff..0000000 Binary files a/assets/media/achievement_nukers_win_gray.png and /dev/null differ diff --git a/assets/media/achievement_psykers_win_gray.png b/assets/media/achievement_psykers_win_gray.png deleted file mode 100644 index a59b085..0000000 Binary files a/assets/media/achievement_psykers_win_gray.png and /dev/null differ diff --git a/assets/media/achievement_rangers_win_gray.png b/assets/media/achievement_rangers_win_gray.png deleted file mode 100644 index 77bde30..0000000 Binary files a/assets/media/achievement_rangers_win_gray.png and /dev/null differ diff --git a/assets/media/achievement_rogues_win_gray.png b/assets/media/achievement_rogues_win_gray.png deleted file mode 100644 index 21b3e8c..0000000 Binary files a/assets/media/achievement_rogues_win_gray.png and /dev/null differ diff --git a/assets/media/achievement_sorcerers_win.png b/assets/media/achievement_sorcerers_win.png new file mode 100644 index 0000000..430a7d9 Binary files /dev/null and b/assets/media/achievement_sorcerers_win.png differ diff --git a/assets/media/achievement_speed_booster_gray.png b/assets/media/achievement_speed_booster_gray.png deleted file mode 100644 index 9cc26d1..0000000 Binary files a/assets/media/achievement_speed_booster_gray.png and /dev/null differ diff --git a/assets/media/achievement_swarmer_gray.png b/assets/media/achievement_swarmer_gray.png deleted file mode 100644 index 00fa33b..0000000 Binary files a/assets/media/achievement_swarmer_gray.png and /dev/null differ diff --git a/assets/media/achievement_swarmers_win_gray.png b/assets/media/achievement_swarmers_win_gray.png deleted file mode 100644 index c758dc1..0000000 Binary files a/assets/media/achievement_swarmers_win_gray.png and /dev/null differ diff --git a/assets/media/achievement_voiders_win_gray.png b/assets/media/achievement_voiders_win_gray.png deleted file mode 100644 index 590f845..0000000 Binary files a/assets/media/achievement_voiders_win_gray.png and /dev/null differ diff --git a/assets/media/achievement_warriors_win_gray.png b/assets/media/achievement_warriors_win_gray.png deleted file mode 100644 index 16ea1f5..0000000 Binary files a/assets/media/achievement_warriors_win_gray.png and /dev/null differ diff --git a/buy_screen.lua b/buy_screen.lua index d338998..529f2cf 100644 --- a/buy_screen.lua +++ b/buy_screen.lua @@ -779,7 +779,12 @@ function RerollButton:init(args) self.text = Text({{text = '[bg10]reroll: [yellow]2', font = pixul_font, alignment = 'center'}}, global_text_tags) elseif self.parent:is(Arena) then self.shape = Rectangle(self.x, self.y, 60, 16) - self.text = Text({{text = '[bg10]reroll: [yellow]15', font = pixul_font, alignment = 'center'}}, global_text_tags) + if self.parent.level == 3 then + self.free_reroll = true + self.text = Text({{text = '[bg10]reroll: [yellow]0', font = pixul_font, alignment = 'center'}}, global_text_tags) + else + self.text = Text({{text = '[bg10]reroll: [yellow]15', font = pixul_font, alignment = 'center'}}, global_text_tags) + end end end @@ -811,7 +816,7 @@ function RerollButton:update(dt) system.save_run(self.parent.level == 1 and 0 or self.parent.level, gold, self.parent.units, passives, run_passive_pool_by_tiers, locked_state) end elseif self.parent:is(Arena) then - if gold < 15 then + if gold < 15 and not self.free_reroll then self.spring:pull(0.2, 200, 10) self.selected = true error1:play{pitch = random:float(0.95, 1.05), volume = 0.5} @@ -828,8 +833,10 @@ function RerollButton:update(dt) self.parent:set_passives(true) self.selected = true self.spring:pull(0.2, 200, 10) - gold = gold - 15 + if not self.free_reroll then gold = gold - 15 end self.parent.shop_text:set_text{{text = '[fg, nudge_down]gold: [yellow, nudge_down]' .. gold, font = pixul_font, alignment = 'center'}} + self.free_reroll = false + self.text = Text({{text = '[bg10]reroll: [yellow]15', font = pixul_font, alignment = 'center'}}, global_text_tags) end end end @@ -851,7 +858,11 @@ function RerollButton:on_mouse_enter() if self.parent:is(BuyScreen) then self.text:set_text{{text = '[fgm5]reroll: 2', font = pixul_font, alignment = 'center'}} elseif self.parent:is(Arena) then - self.text:set_text{{text = '[fgm5]reroll: 15', font = pixul_font, alignment = 'center'}} + if self.free_reroll then + self.text:set_text{{text = '[fgm5]reroll: 0', font = pixul_font, alignment = 'center'}} + else + self.text:set_text{{text = '[fgm5]reroll: 15', font = pixul_font, alignment = 'center'}} + end end self.spring:pull(0.2, 200, 10) end @@ -861,7 +872,11 @@ function RerollButton:on_mouse_exit() if self.parent:is(BuyScreen) then self.text:set_text{{text = '[bg10]reroll: [yellow]2', font = pixul_font, alignment = 'center'}} elseif self.parent:is(Arena) then - self.text:set_text{{text = '[fgm5]reroll: [yellow]15', font = pixul_font, alignment = 'center'}} + if self.free_reroll then + self.text:set_text{{text = '[fgm5]reroll: [yellow]0', font = pixul_font, alignment = 'center'}} + else + self.text:set_text{{text = '[fgm5]reroll: [yellow]15', font = pixul_font, alignment = 'center'}} + end end self.selected = false end @@ -1061,7 +1076,7 @@ end function CharacterPart:get_sale_price() local total = 0 - total = total + ((self.level == 1 and character_tiers[self.character]) or (self.level == 2 and 2*character_tiers[self.character]) or (self.level == 3 and 6*character_tiers[self.character])) + total = total + ((self.level == 1 and character_tiers[self.character]) or (self.level == 2 and 2*character_tiers[self.character]) or (self.level == 3 and 6*character_tiers[self.character]) or 0) if self.reserve then if self.reserve[2] then total = total + self.reserve[2]*character_tiers[self.character]*2 end if self.reserve[1] then total = total + self.reserve[1]*character_tiers[self.character] end diff --git a/enemies.lua b/enemies.lua index baf7a4a..262a5d8 100644 --- a/enemies.lua +++ b/enemies.lua @@ -670,7 +670,7 @@ function EnemyCritter:hit(damage, projectile) -- print(projectile == self.invulnerable_to) if projectile == self.invulnerable_to then return end self.hfx:use('hit', 0.25, 200, 10) - self.hp = self.hp - damage + self.hp = self.hp - math.max(damage, 0) self:show_hp() if self.hp <= 0 then self:die() end end diff --git a/main.lua b/main.lua index dd4a53a..ea54784 100644 --- a/main.lua +++ b/main.lua @@ -116,6 +116,7 @@ function init() song5 = Sound('Kubbi - Ember - 05 Compass.ogg', {tags = {music}}) death_song = Sound('Kubbi - Ember - 09 Formed by Glaciers.ogg', {tags = {music}}) + lock_image = Image('lock') speed_booster_elite = Image('speed_booster_elite') exploder_elite = Image('exploder_elite') swarmer_elite = Image('swarmer_elite') @@ -691,7 +692,7 @@ function init() ['infestor'] = function() return '[fg][yellow]triples[fg] the number of critters released' end, ['flagellant'] = function() return '[fg]deals [yellow]' .. 2*get_character_stat('flagellant', 3, 'dmg') .. '[fg] damage to all allies and grants [yellow]+12%[fg] damage to all allies per cast' end, ['arcanist'] = function() return '[yellow]+50%[fg] attack speed for the orb and [yellow]2[fg] projectiles are released per cast' end, - ['illusionist'] = function() return '[yellow]doubles[fg] the number of copies created and they release [yellow]12[fg] projectiles on death that pierce and ricochet once' end, + ['illusionist'] = function() return '[yellow]doubles[fg] the number of copies created and they release [yellow]12[fg] projectiles on death' end, ['witch'] = function() return '[fg]the area periodically releases projectiles, each dealing [yellow]' .. get_character_stat('witch', 3, 'dmg') .. '[fg] damage and chaining once' end, ['silencer'] = function() return '[fg]the curse also deals [yellow]' .. get_character_stat('silencer', 3, 'dmg') .. '[fg] damage per second' end, ['vulcanist'] = function() return '[fg]the number and speed of explosions is [yellow]doubled[fg]' end, @@ -743,7 +744,7 @@ function init() ['infestor'] = function() return '[light_bg]triples the number of critters released' end, ['flagellant'] = function() return '[light_bg]deals ' .. 2*get_character_stat('flagellant', 3, 'dmg') .. ' damage to all allies and grants +12% damage to all allies per cast' end, ['arcanist'] = function() return '[light_bg]+50% attack speed for the orb and 2 projectiles are released per cast' end, - ['illusionist'] = function() return '[light_bg]doubles the number of copies created and they release 12 projectiles on death that pierce and ricochet once' end, + ['illusionist'] = function() return '[light_bg]doubles the number of copies created and they release 12 projectiles on death' end, ['witch'] = function() return '[light_bg]the area periodically releases projectiles, each dealing ' .. get_character_stat('witch', 3, 'dmg') .. ' damage and chaining once' end, ['silencer'] = function() return '[light_bg]the curse also deals ' .. get_character_stat('silencer', 3, 'dmg') .. ' damage per second' end, ['vulcanist'] = function() return '[light_bg]the number and speed of explosions is doubled' end, @@ -1320,7 +1321,7 @@ function init() main:add(BuyScreen'buy_screen') main:go_to('buy_screen', run.level or 0, run.units or {}, passives) - -- main:go_to('buy_screen', 2, run.units or {}, passives) + -- main:go_to('buy_screen', 7, run.units or {}, {'unleash'}) --[[ main:add(Arena'arena') @@ -1351,6 +1352,7 @@ function init() end end) + --[[ print(table.tostring(love.graphics.getSupported())) print(love.graphics.getRendererInfo()) local formats = love.graphics.getImageFormats() @@ -1359,6 +1361,7 @@ function init() for f, s in pairs(canvasformats) do print(f, tostring(s)) end print(table.tostring(love.graphics.getSystemLimits())) print(table.tostring(love.graphics.getStats())) + ]]-- end diff --git a/media.lua b/media.lua index 4e16a8d..094a5a9 100644 --- a/media.lua +++ b/media.lua @@ -11,7 +11,7 @@ function Media:on_enter(from) self.effects = Group() self.ui = Group() - graphics.set_background_color(blue2[0]) + graphics.set_background_color(bg[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]sorcerer update', font = pixul_font, alignment = 'center'}, @@ -30,4 +30,6 @@ function Media:draw() self.main:draw() self.effects:draw() self.ui:draw() + + lock_image:draw(30, 30, 0, 1, 1, 0, 0, bg[4]) end diff --git a/objects.lua b/objects.lua index 43464a7..5ea29b4 100644 --- a/objects.lua +++ b/objects.lua @@ -236,6 +236,9 @@ function Unit:calculate_stats(first_run) 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 + 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} @@ -250,6 +253,9 @@ function Unit:calculate_stats(first_run) 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 + 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} diff --git a/todo b/todo index abbf963..682be12 100644 --- a/todo +++ b/todo @@ -1,4 +1,69 @@ -Unleash does not affect Witch +Shop Update + New units + Assists (2/4) - +25/50% assist buff effectiveness + Ringmaster (tier 4 assist, nuker) + Absorber (tier 2 assist, warrior) + Pardoner (tier 3 assist, mercenary) + Oracle (tier 1 assist) + Seraph (tier 2 assist, healer) + Mercenaries (3/3) - enemies occasionally drop pieces of gold + Treasure Hunter (tier 1 mercenary) + Merchant (tier 2 mercenary) + Pardoner (tier 3 assist, mercenary) + Gambler (tier 4 mercenary, rogue) + + Shop changes + Owned units highlighted in shop + Fix highlight colors and highlight reserve + Shop level up + + QoL + * Added sorcerer achievement + * Removed restart button from end screen + * First item reroll is now free + Gold is given right after the round ends in the arena rather than on the shop for easier item rerolls + Show hero HP + Endless mode + Remove level 3 units from rotation + Hide cursor during waves + Mouse follow control + Volume slider + Options menu from buy screen + Add visuals for defensive ouroboros, divine intervention, fairy buff + + Balance + * Decreased level 25 boss movement speed + + Bug fixes + * Fixed a crash when too many illusions would be spawned in short succession + * Fixed a bug where enemy critters would sometimes be unkillable + * Fixed text for the illusionist's Lv.3 effect going outside the screen + * Fixed a rare crash when hovering over your owned in the shop + Fix a crash when warden's force field would spawn on top of enemies + Fix enemies still spawning after arena clear (this happens with the extra enemy spawns that were blocked earlier) + Fix fullscreen with different resolutions that don't scale properly + https://i.imgur.com/Lxu8skX.png + https://i.imgur.com/mnivI4d.png + +Sacrifice Update + New mechanics + Sacrifice units to level items up + New items + Reworked items + Items shouldn't just be more powerful versions of other items + Items should have drawbacks + Items that apply to a position on the snake (a good middle step between applying them to individual units like in Underlords) + New units + Nocturnals/Darks/??? (3/6) + Shadowmancer + Necromancer + Demonologist + Demon + Lich + Lifestealer + Zombie + QoL + Current items visible on item selection screen --- @@ -17,20 +82,24 @@ Bench? - https://i.imgur.com/B1gNVKk.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 Go through this later https://i.imgur.com/4t7NA32.png <- lots of good improvements -Remove level 3 units from rotation -Hide cursor during waves -Mouse follow control? -Visuals for divine intervertion, fairy buff -Fix enemies still spawning after arena clear (this happens with the extra enemy spawns that were blocked earlier) -Fix highlight colors and highlight reserve -Add visuals for defensive ouroboros -Options menu from buy screen -Volume slider -Fix fullscreen with different resolutions that don't scale properly Roguelite update: -Hades-like no map system, this is more elegant and requires way less work than something like Isaac or StS -Units die permanently when they die + Technical improvements: + Spawn tech: spawn every entity in a grid, before spawning check to see if grid position is clear, this will prevent any issues due to entities spawning inside one another + Battle stats: DPS, damage taken, etc + Key rebinding (for non-QWERTY keyboards) +StS-like map with nodes, node types: + Arena + Elite + Boss + Map (map of bigger size than arena with fixed spawns) + Unit shop + Item shop + Text + reward + Training grounds (upgrade unit) + Tavern (heal units) + +Units die permanently when they die (dead units can be stored in bench to be revived later) Units can have items attached to them like in Underlords Unit item ideas: This unit's projectiles pierce/chain/fork/seek/split/stun/etc