From 39abf59ab3fbd54dd9e5ffce793a84f53f4b877e Mon Sep 17 00:00:00 2001 From: a327ex Date: Fri, 9 Jul 2021 14:26:29 -0300 Subject: [PATCH] Maintenance 1 --- arena.lua | 9 ++++++--- buy_screen.lua | 9 ++++++--- main.lua | 20 ++++++++++---------- mainmenu.lua | 2 +- player.lua | 7 +++++-- todo | 13 ++++++++++++- 6 files changed, 40 insertions(+), 20 deletions(-) diff --git a/arena.lua b/arena.lua index 45e62f5..350eac5 100644 --- a/arena.lua +++ b/arena.lua @@ -391,7 +391,7 @@ function Arena:update(dt) 'assassination', 'flying_daggers', 'ultimatum', 'magnify', 'echo_barrage', 'unleash', 'reinforce', 'payback', 'enchanted', 'freezing_field', 'burning_field', 'gravity_field', 'magnetism', 'insurance', 'dividends', 'berserking', 'unwavering_stance', 'unrelenting_stance', 'blessing', 'haste', 'divine_barrage', 'orbitism', 'psyker_orbs', 'psychosink', 'rearm', 'taunt', 'construct_instability', 'intimidation', 'vulnerability', 'temporal_chains', 'ceremonial_dagger', 'homing_barrage', 'critical_strike', 'noxious_strike', 'infesting_strike', 'burning_strike', 'lucky_strike', 'healing_strike', 'stunning_strike', - 'silencing_strike', 'culling_strike', 'lightning_strike', 'psycholeak', 'divine_blessing', 'hardening', + 'silencing_strike', 'culling_strike', 'lightning_strike', 'psycholeak', 'divine_blessing', 'hardening', 'kinetic_strike', } max_units = math.clamp(7 + current_new_game_plus + self.loop, 7, 12) main:add(BuyScreen'buy_screen') @@ -858,9 +858,9 @@ function Arena:die() 'assassination', 'flying_daggers', 'ultimatum', 'magnify', 'echo_barrage', 'unleash', 'reinforce', 'payback', 'enchanted', 'freezing_field', 'burning_field', 'gravity_field', 'magnetism', 'insurance', 'dividends', 'berserking', 'unwavering_stance', 'unrelenting_stance', 'blessing', 'haste', 'divine_barrage', 'orbitism', 'psyker_orbs', 'psychosink', 'rearm', 'taunt', 'construct_instability', 'intimidation', 'vulnerability', 'temporal_chains', 'ceremonial_dagger', 'homing_barrage', 'critical_strike', 'noxious_strike', 'infesting_strike', 'burning_strike', 'lucky_strike', 'healing_strike', 'stunning_strike', - 'silencing_strike', 'culling_strike', 'lightning_strike', 'psycholeak', 'divine_blessing', 'hardening', + 'silencing_strike', 'culling_strike', 'lightning_strike', 'psycholeak', 'divine_blessing', 'hardening', 'kinetic_strike', } - max_units = math.clamp(7 + current_new_game_plus + self.loop, 7, 12) + max_units = math.clamp(7 + current_new_game_plus, 7, 12) main:add(BuyScreen'buy_screen') system.save_run() main:go_to('buy_screen', 1, 0, {}, passives, 1, 0) @@ -873,7 +873,10 @@ end function Arena:endless() + if self.clicked_loop then return end + self.clicked_loop = true current_new_game_plus = current_new_game_plus - 1 + if current_new_game_plus < 0 then current_new_game_plus = 0 end self.loop = self.loop + 1 self:transition() end diff --git a/buy_screen.lua b/buy_screen.lua index aa26bf7..03af0be 100644 --- a/buy_screen.lua +++ b/buy_screen.lua @@ -121,6 +121,7 @@ function BuyScreen:on_enter(from, level, loop, units, passives, shop_level, shop }, nil, nil, nil, nil, 16, 4, nil, 2) b.info_text.x, b.info_text.y = b.x, b.y + 20 end, mouse_exit = function(b) + if not b.info_text then return end b.info_text:deactivate() b.info_text.dead = true b.info_text = nil @@ -145,9 +146,9 @@ function BuyScreen:on_enter(from, level, loop, units, passives, shop_level, shop 'assassination', 'flying_daggers', 'ultimatum', 'magnify', 'echo_barrage', 'unleash', 'reinforce', 'payback', 'enchanted', 'freezing_field', 'burning_field', 'gravity_field', 'magnetism', 'insurance', 'dividends', 'berserking', 'unwavering_stance', 'unrelenting_stance', 'blessing', 'haste', 'divine_barrage', 'orbitism', 'psyker_orbs', 'psychosink', 'rearm', 'taunt', 'construct_instability', 'intimidation', 'vulnerability', 'temporal_chains', 'ceremonial_dagger', 'homing_barrage', 'critical_strike', 'noxious_strike', 'infesting_strike', 'burning_strike', 'lucky_strike', 'healing_strike', 'stunning_strike', - 'silencing_strike', 'culling_strike', 'lightning_strike', 'psycholeak', 'divine_blessing', 'hardening', + 'silencing_strike', 'culling_strike', 'lightning_strike', 'psycholeak', 'divine_blessing', 'hardening', 'kinetic_strike', } - max_units = math.clamp(7 + current_new_game_plus + self.loop, 7, 12) + max_units = math.clamp(7 + current_new_game_plus, 7, 12) main:add(BuyScreen'buy_screen') system.save_run() main:go_to('buy_screen', 1, 0, {}, passives, 1, 0) @@ -159,6 +160,7 @@ function BuyScreen:on_enter(from, level, loop, units, passives, shop_level, shop }, nil, nil, nil, nil, 16, 4, nil, 2) b.info_text.x, b.info_text.y = b.x, b.y + 20 end, mouse_exit = function(b) + if not b.info_text then return end b.info_text:deactivate() b.info_text.dead = true b.info_text = nil @@ -551,8 +553,9 @@ function RestartButton:update(dt) 'assassination', 'flying_daggers', 'ultimatum', 'magnify', 'echo_barrage', 'unleash', 'reinforce', 'payback', 'enchanted', 'freezing_field', 'burning_field', 'gravity_field', 'magnetism', 'insurance', 'dividends', 'berserking', 'unwavering_stance', 'unrelenting_stance', 'blessing', 'haste', 'divine_barrage', 'orbitism', 'psyker_orbs', 'psychosink', 'rearm', 'taunt', 'construct_instability', 'intimidation', 'vulnerability', 'temporal_chains', 'ceremonial_dagger', 'homing_barrage', 'critical_strike', 'noxious_strike', 'infesting_strike', 'burning_strike', 'lucky_strike', 'healing_strike', 'stunning_strike', - 'silencing_strike', 'culling_strike', 'lightning_strike', 'psycholeak', 'divine_blessing', 'hardening', + 'silencing_strike', 'culling_strike', 'lightning_strike', 'psycholeak', 'divine_blessing', 'hardening', 'kinetic_strike', } + max_units = math.clamp(7 + current_new_game_plus, 7, 12) system.save_state() main:add(BuyScreen'buy_screen') system.save_run() diff --git a/main.lua b/main.lua index e957a95..973216c 100644 --- a/main.lua +++ b/main.lua @@ -1432,7 +1432,7 @@ function init() ['haste'] = function(lvl) return '[yellow]+50%[fg] movement speed that decays over [yellow]4[fg] seconds on healing orb pick up' end, ['divine_barrage'] = function(lvl) return ts(lvl, '20%', '40%', '60%') .. ' chance to release a ricocheting barrage on healing orb pick up' end, ['orbitism'] = function(lvl) return ts(lvl, '+25%', '50%', '75%') .. ' psyker orb movement speed' end, - ['psyker_orbs'] = function(lvl) return ts(lvl, '+1', '2', '3') .. ' psyker orbs' end, + ['psyker_orbs'] = function(lvl) return ts(lvl, '+1', '2', '4') .. ' psyker orbs' end, ['psychosense'] = function(lvl) return ts(lvl, '+33%', '66%', '99%') .. ' orb range' end, ['psychosink'] = function(lvl) return '[fg]psyker orbs deal ' .. ts(lvl, '+40%', '80%', '120%') .. ' damage' end, ['rearm'] = function(lvl) return '[fg]constructs repeat their attacks once' end, @@ -1728,7 +1728,7 @@ function init() 'assassination', 'flying_daggers', 'ultimatum', 'magnify', 'echo_barrage', 'unleash', 'reinforce', 'payback', 'enchanted', 'freezing_field', 'burning_field', 'gravity_field', 'magnetism', 'insurance', 'dividends', 'berserking', 'unwavering_stance', 'unrelenting_stance', 'blessing', 'haste', 'divine_barrage', 'orbitism', 'psyker_orbs', 'psychosink', 'rearm', 'taunt', 'construct_instability', 'intimidation', 'vulnerability', 'temporal_chains', 'ceremonial_dagger', 'homing_barrage', 'critical_strike', 'noxious_strike', 'infesting_strike', 'burning_strike', 'lucky_strike', 'healing_strike', 'stunning_strike', - 'silencing_strike', 'culling_strike', 'lightning_strike', 'psycholeak', 'divine_blessing', 'hardening', + 'silencing_strike', 'culling_strike', 'lightning_strike', 'psycholeak', 'divine_blessing', 'hardening', 'kinetic_strike', } main:add(Arena'arena') main:go_to('arena', 16, 0, { @@ -1914,9 +1914,9 @@ function open_options(self) 'assassination', 'flying_daggers', 'ultimatum', 'magnify', 'echo_barrage', 'unleash', 'reinforce', 'payback', 'enchanted', 'freezing_field', 'burning_field', 'gravity_field', 'magnetism', 'insurance', 'dividends', 'berserking', 'unwavering_stance', 'unrelenting_stance', 'blessing', 'haste', 'divine_barrage', 'orbitism', 'psyker_orbs', 'psychosink', 'rearm', 'taunt', 'construct_instability', 'intimidation', 'vulnerability', 'temporal_chains', 'ceremonial_dagger', 'homing_barrage', 'critical_strike', 'noxious_strike', 'infesting_strike', 'burning_strike', 'lucky_strike', 'healing_strike', 'stunning_strike', - 'silencing_strike', 'culling_strike', 'lightning_strike', 'psycholeak', 'divine_blessing', 'hardening', + 'silencing_strike', 'culling_strike', 'lightning_strike', 'psycholeak', 'divine_blessing', 'hardening', 'kinetic_strike', } - max_units = math.clamp(7 + current_new_game_plus + self.loop, 7, 12) + max_units = math.clamp(7 + current_new_game_plus, 7, 12) main:add(BuyScreen'buy_screen') locked_state = nil system.save_run() @@ -1946,7 +1946,7 @@ 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 = 1 end + if sfx.volume > 1 then sfx.volume = 0 end state.sfx_volume = sfx.volume b:set_text('sfx volume: ' .. tostring((state.sfx_volume or 0.5)*10)) end, @@ -1956,8 +1956,8 @@ 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 math.abs(sfx.volume) < 0.001 then sfx.volume = 0 end - if sfx.volume <= 0 then sfx.volume = 0 end + if math.abs(sfx.volume) < 0.001 and sfx.volume > 0 then sfx.volume = 0 end + if sfx.volume < 0 then sfx.volume = 1 end state.sfx_volume = sfx.volume b:set_text('sfx volume: ' .. tostring((state.sfx_volume or 0.5)*10)) end} @@ -1969,7 +1969,7 @@ 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 = 1 end + if music.volume > 1 then music.volume = 0 end state.music_volume = music.volume b:set_text('music volume: ' .. tostring((state.music_volume or 0.5)*10)) end, @@ -1979,8 +1979,8 @@ 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 math.abs(music.volume) < 0.001 then music.volume = 0 end - if music.volume <= 0 then music.volume = 0 end + if math.abs(music.volume) < 0.001 and music.volume > 0 then music.volume = 0 end + if music.volume < 0 then music.volume = 1 end state.music_volume = music.volume b:set_text('music volume: ' .. tostring((state.music_volume or 0.5)*10)) end} diff --git a/mainmenu.lua b/mainmenu.lua index 2223493..9c2f107 100644 --- a/mainmenu.lua +++ b/mainmenu.lua @@ -97,7 +97,7 @@ function MainMenu:on_enter(from) 'assassination', 'flying_daggers', 'ultimatum', 'magnify', 'echo_barrage', 'unleash', 'reinforce', 'payback', 'enchanted', 'freezing_field', 'burning_field', 'gravity_field', 'magnetism', 'insurance', 'dividends', 'berserking', 'unwavering_stance', 'unrelenting_stance', 'blessing', 'haste', 'divine_barrage', 'orbitism', 'psyker_orbs', 'psychosink', 'rearm', 'taunt', 'construct_instability', 'intimidation', 'vulnerability', 'temporal_chains', 'ceremonial_dagger', 'homing_barrage', 'critical_strike', 'noxious_strike', 'infesting_strike', 'burning_strike', 'lucky_strike', 'healing_strike', 'stunning_strike', - 'silencing_strike', 'culling_strike', 'lightning_strike', 'psycholeak', 'divine_blessing', 'hardening', + 'silencing_strike', 'culling_strike', 'lightning_strike', 'psycholeak', 'divine_blessing', 'hardening', 'kinetic_strike', } gold = run.gold or 3 passives = run.passives or {} diff --git a/player.lua b/player.lua index 6a4e536..131e842 100644 --- a/player.lua +++ b/player.lua @@ -59,7 +59,7 @@ function Player:init(args) local cast = function(pitch_a) local enemy = table.shuffle(main.current.main:get_objects_by_classes(main.current.enemies))[1] if enemy then - gambler1:play{pitch = pitch_a, volume = math.remap(gold, 0, 50, 0, 0.5)} + gambler1:play{pitch = pitch_a, volume = math.clamp(math.remap(gold, 0, 50, 0, 0.5), 0, 0.75)} enemy:hit(2*gold) if main.current.sorcerer_level > 0 then self.sorcerer_count = self.sorcerer_count + 1 @@ -3637,7 +3637,9 @@ Gold:implement(GameObject) Gold:implement(Physics) function Gold:init(args) self:init_game_object(args) + if not self.group.world then self.dead = true; return end if tostring(self.x) == tostring(0/0) or tostring(self.y) == tostring(0/0) then self.dead = true; return end + if #self.group:get_objects_by_class(Gold) > 30 then self.dead = true; return end self:set_as_rectangle(3, 3, 'dynamic', 'ghost') self:set_restitution(0.5) local r = random:float(0, 2*math.pi) @@ -3742,8 +3744,9 @@ HealingOrb:implement(GameObject) HealingOrb:implement(Physics) function HealingOrb:init(args) self:init_game_object(args) - self:init_game_object(args) + if not self.group.world then self.dead = true; return end if tostring(self.x) == tostring(0/0) or tostring(self.y) == tostring(0/0) then self.dead = true; return end + if #self.group:get_objects_by_class(HealingOrb) > 30 then self.dead = true; return end self:set_as_rectangle(4, 4, 'dynamic', 'ghost') self:set_restitution(0.5) local r = random:float(0, 2*math.pi) diff --git a/todo b/todo index 5716de0..89797c2 100644 --- a/todo +++ b/todo @@ -1,13 +1,22 @@ Weekly maintenance updates: #1 + * Fixed several blue screen crashes due to broken looping state - * Limited critters to 100 due to performance issues + * Fixed several blue screen crashes due to broken physics state + * Fixed a bug where double clicking the loop button would lead to broken looping state and crashes * Fixed sold items not being restored to the passive pool * Fixed gambler's volume being too loud with high amounts of gold * Fixed soundtrack button not working on the win screen * Fixed volume text bug when decreasing it from 1 to 0 + * Fixed volume buttons not looping * Fixed a bug where the first run would not have certain items in the item pool + * Fixed psyker orbs item saying "+1/2/3" in the shop when it is "+1/2/4" + * Fixed kinetic strike not being in the passive pool + * Fixed a bug where sometimes restarting the game from a looped run would let you have more units than normal on the next run + * Limited critters to 100 due to performance issues + * Limited health orbs on the arena to 30 due to performance issues + * Limited gold coins on the arena to 30 due to performance issues --- @@ -32,6 +41,7 @@ Bodyguard - https://i.imgur.com/Y2pP20v.png Conjurer unit that creates an unit that actively protects you from enemy projectiles Guardians - https://i.imgur.com/Ynu5Cdw.png Cultists - https://i.imgur.com/GsfoZBd.png +psyker + builder - https://i.imgur.com/VjY6r1d.png Assists (2/4) - Ringmaster (tier 4 assist, nuker) - +15% to all stats to adjacent units, Lv.3 effect - create a cross that deals AoE damage 5 times for 10 seconds Absorber (tier 2 assist, warrior) - absorbs 50% damage from adjacent units, Lv.3 effect - absorbs 75% damage from adjacent units and gives the absorber +25% defense @@ -91,6 +101,7 @@ Roguelite update: Challenge + reward Go through the labyrinth without hitting any walls Go through the traps without getting hit + Room ideas - https://i.imgur.com/ajqtTOc.png 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: