Shop update 1/5

master
a327ex 2021-06-08 01:21:35 -03:00
parent f5b8eaf2a3
commit cc83ae6e10
34 changed files with 121 additions and 24 deletions

View File

@ -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.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() self:create_credits()
end} 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.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 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}
@ -657,6 +658,7 @@ function Arena:quit()
main:go_to('buy_screen', 0, {}, passives) main:go_to('buy_screen', 0, {}, passives)
end, text = Text({{text = '[wavy, bg]restarting...', font = pixul_font, alignment = 'center'}}, global_text_tags)} end, text = Text({{text = '[wavy, bg]restarting...', font = pixul_font, alignment = 'center'}}, global_text_tags)}
end} end}
]]--
end end
end) end)

Binary file not shown.

After

Width:  |  Height:  |  Size: 500 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 911 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 961 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 826 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 944 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 875 B

View File

@ -779,8 +779,13 @@ function RerollButton:init(args)
self.text = Text({{text = '[bg10]reroll: [yellow]2', font = pixul_font, alignment = 'center'}}, global_text_tags) self.text = Text({{text = '[bg10]reroll: [yellow]2', font = pixul_font, alignment = 'center'}}, global_text_tags)
elseif self.parent:is(Arena) then elseif self.parent:is(Arena) then
self.shape = Rectangle(self.x, self.y, 60, 16) self.shape = Rectangle(self.x, self.y, 60, 16)
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) self.text = Text({{text = '[bg10]reroll: [yellow]15', font = pixul_font, alignment = 'center'}}, global_text_tags)
end end
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) 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 end
elseif self.parent:is(Arena) then 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.spring:pull(0.2, 200, 10)
self.selected = true self.selected = true
error1:play{pitch = random:float(0.95, 1.05), volume = 0.5} 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.parent:set_passives(true)
self.selected = true self.selected = true
self.spring:pull(0.2, 200, 10) 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.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 end
end end
@ -851,8 +858,12 @@ function RerollButton:on_mouse_enter()
if self.parent:is(BuyScreen) then if self.parent:is(BuyScreen) then
self.text:set_text{{text = '[fgm5]reroll: 2', font = pixul_font, alignment = 'center'}} self.text:set_text{{text = '[fgm5]reroll: 2', font = pixul_font, alignment = 'center'}}
elseif self.parent:is(Arena) then elseif self.parent:is(Arena) then
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'}} self.text:set_text{{text = '[fgm5]reroll: 15', font = pixul_font, alignment = 'center'}}
end end
end
self.spring:pull(0.2, 200, 10) self.spring:pull(0.2, 200, 10)
end end
@ -861,8 +872,12 @@ function RerollButton:on_mouse_exit()
if self.parent:is(BuyScreen) then if self.parent:is(BuyScreen) then
self.text:set_text{{text = '[bg10]reroll: [yellow]2', font = pixul_font, alignment = 'center'}} self.text:set_text{{text = '[bg10]reroll: [yellow]2', font = pixul_font, alignment = 'center'}}
elseif self.parent:is(Arena) then elseif self.parent:is(Arena) then
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'}} self.text:set_text{{text = '[fgm5]reroll: [yellow]15', font = pixul_font, alignment = 'center'}}
end end
end
self.selected = false self.selected = false
end end
@ -1061,7 +1076,7 @@ end
function CharacterPart:get_sale_price() function CharacterPart:get_sale_price()
local total = 0 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 then
if self.reserve[2] then total = total + self.reserve[2]*character_tiers[self.character]*2 end 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 if self.reserve[1] then total = total + self.reserve[1]*character_tiers[self.character] end

View File

@ -670,7 +670,7 @@ function EnemyCritter:hit(damage, projectile)
-- print(projectile == self.invulnerable_to) -- print(projectile == self.invulnerable_to)
if projectile == self.invulnerable_to then return end if projectile == self.invulnerable_to then return end
self.hfx:use('hit', 0.25, 200, 10) self.hfx:use('hit', 0.25, 200, 10)
self.hp = self.hp - damage self.hp = self.hp - math.max(damage, 0)
self:show_hp() self:show_hp()
if self.hp <= 0 then self:die() end if self.hp <= 0 then self:die() end
end end

View File

@ -116,6 +116,7 @@ function init()
song5 = Sound('Kubbi - Ember - 05 Compass.ogg', {tags = {music}}) song5 = Sound('Kubbi - Ember - 05 Compass.ogg', {tags = {music}})
death_song = Sound('Kubbi - Ember - 09 Formed by Glaciers.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') speed_booster_elite = Image('speed_booster_elite')
exploder_elite = Image('exploder_elite') exploder_elite = Image('exploder_elite')
swarmer_elite = Image('swarmer_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, ['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, ['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, ['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, ['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, ['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, ['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, ['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, ['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, ['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, ['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, ['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, ['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:add(BuyScreen'buy_screen')
main:go_to('buy_screen', run.level or 0, run.units or {}, passives) 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') main:add(Arena'arena')
@ -1351,6 +1352,7 @@ function init()
end end
end) end)
--[[
print(table.tostring(love.graphics.getSupported())) print(table.tostring(love.graphics.getSupported()))
print(love.graphics.getRendererInfo()) print(love.graphics.getRendererInfo())
local formats = love.graphics.getImageFormats() local formats = love.graphics.getImageFormats()
@ -1359,6 +1361,7 @@ function init()
for f, s in pairs(canvasformats) do print(f, tostring(s)) end for f, s in pairs(canvasformats) do print(f, tostring(s)) end
print(table.tostring(love.graphics.getSystemLimits())) print(table.tostring(love.graphics.getSystemLimits()))
print(table.tostring(love.graphics.getStats())) print(table.tostring(love.graphics.getStats()))
]]--
end end

View File

@ -11,7 +11,7 @@ function Media:on_enter(from)
self.effects = Group() self.effects = Group()
self.ui = 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 = { Text2{group = self.ui, x = gw/2, y = gh/2, lines = {
{text = '[fg]SNKRX', font = fat_font, alignment = 'center', height_offset = -15}, {text = '[fg]SNKRX', font = fat_font, alignment = 'center', height_offset = -15},
{text = '[fg]sorcerer update', font = pixul_font, alignment = 'center'}, {text = '[fg]sorcerer update', font = pixul_font, alignment = 'center'},
@ -30,4 +30,6 @@ function Media:draw()
self.main:draw() self.main:draw()
self.effects:draw() self.effects:draw()
self.ui:draw() self.ui:draw()
lock_image:draw(30, 30, 0, 1, 1, 0, 0, bg[4])
end end

View File

@ -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_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_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]
if x == 25 then
self.base_mvspd = 35 + 1.2*y[x]
end
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}
@ -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_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_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]
if x == 25 then
self.base_mvspd = 35 + 1.2*y[x]
end
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}

95
todo
View File

@ -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 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
Go through this later https://i.imgur.com/4t7NA32.png <- lots of good improvements 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: Roguelite update:
Hades-like no map system, this is more elegant and requires way less work than something like Isaac or StS Technical improvements:
Units die permanently when they die 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 Units can have items attached to them like in Underlords
Unit item ideas: Unit item ideas:
This unit's projectiles pierce/chain/fork/seek/split/stun/etc This unit's projectiles pierce/chain/fork/seek/split/stun/etc