From 7a7fe714f8e3029bec979318baa1aba212cc39e1 Mon Sep 17 00:00:00 2001 From: a327ex Date: Sat, 17 Jul 2021 21:01:49 -0300 Subject: [PATCH] Maintenance 2 --- arena.lua | 14 ++++++++++++- assets/media/twitch_boxart.jpg | Bin 0 -> 44068 bytes assets/media/twitch_boxart.png | Bin 0 -> 9084 bytes buy_screen.lua | 36 +++++++++++++++++++++++++++++++++ engine/init.lua | 5 +++++ engine/system.lua | 2 +- main.lua | 36 +++++++++++++++++++++------------ mainmenu.lua | 1 + objects.lua | 12 +++++------ player.lua | 2 +- todo | 16 +++++++++++++++ 11 files changed, 102 insertions(+), 22 deletions(-) create mode 100644 assets/media/twitch_boxart.jpg create mode 100644 assets/media/twitch_boxart.png diff --git a/arena.lua b/arena.lua index 350eac5..1652c67 100644 --- a/arena.lua +++ b/arena.lua @@ -362,6 +362,10 @@ function Arena:update(dt) main_song_instance = _G[random:table{'song1', 'song2', 'song3', 'song4', 'song5'}]:play{volume = 0.5} end + if not self.paused and not self.died and not self.won then + run_time = run_time + dt + end + if self.shop_text then self.shop_text:update(dt) end if input.escape.pressed and not self.transitioning and not self.in_credits and not self.choosing_passives then @@ -381,6 +385,7 @@ function Arena:update(dt) TransitionEffect{group = main.transitions, x = gw/2, y = gh/2, color = state.dark_transitions and bg[-2] or fg[0], transition_action = function() slow_amount = 1 music_slow_amount = 1 + run_time = 0 gold = 3 passives = {} main_song_instance:stop() @@ -800,8 +805,13 @@ function Arena:draw() end end end + + if state.run_timer then + graphics.print_centered(math.round(run_time, 0), fat_font, self.x2 - 12, self.y2 + 16, 0, 0.6, 0.6, nil, nil, fg[0]) + end camera:detach() + if self.level == 20 and self.trailer then graphics.rectangle(gw/2, gh/2, 2*gw, 2*gh, nil, nil, modal_transparent) end if self.choosing_passives or self.won or self.paused or self.died then graphics.rectangle(gw/2, gh/2, 2*gw, 2*gh, nil, nil, modal_transparent) end self.ui:draw() @@ -848,6 +858,7 @@ function Arena:die() TransitionEffect{group = main.transitions, x = gw/2, y = gh/2, color = state.dark_transitions and bg[-2] or fg[0], transition_action = function() slow_amount = 1 music_slow_amount = 1 + run_time = 0 gold = 3 passives = {} main_song_instance:stop() @@ -875,7 +886,8 @@ 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 >= 5 then current_new_game_plus = 5 + else current_new_game_plus = current_new_game_plus - 1 end if current_new_game_plus < 0 then current_new_game_plus = 0 end self.loop = self.loop + 1 self:transition() diff --git a/assets/media/twitch_boxart.jpg b/assets/media/twitch_boxart.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0cf9c1ac14f323be3413ad694d3aa617ac1d608e GIT binary patch literal 44068 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 literal 0 HcmV?d00001 diff --git a/assets/media/twitch_boxart.png b/assets/media/twitch_boxart.png new file mode 100644 index 0000000000000000000000000000000000000000..a04d1f080f46e70273bd1ff41d9f5978c6258569 GIT binary patch literal 9084 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 Q#tiI?fyv3d6VA8(3+~;9TL1t6 literal 0 HcmV?d00001 diff --git a/buy_screen.lua b/buy_screen.lua index 03af0be..9d66e8a 100644 --- a/buy_screen.lua +++ b/buy_screen.lua @@ -136,6 +136,7 @@ function BuyScreen:on_enter(from, level, loop, units, passives, shop_level, shop TransitionEffect{group = main.transitions, x = gw/2, y = gh/2, color = state.dark_transitions and bg[-2] or fg[0], transition_action = function() slow_amount = 1 music_slow_amount = 1 + run_time = 0 gold = 3 passives = {} main_song_instance:stop() @@ -190,6 +191,10 @@ function BuyScreen:update(dt) main_song_instance = _G[random:table{'song1', 'song2', 'song3', 'song4', 'song5'}]:play{volume = 0.2} end + if not self.paused then + run_time = run_time + dt + end + self:update_game_object(dt*slow_amount) if not self.in_tutorial and not self.paused then @@ -543,6 +548,7 @@ function RestartButton:update(dt) TransitionEffect{group = main.transitions, x = gw/2, y = gh/2, color = state.dark_transitions and bg[-2] or fg[0], transition_action = function() slow_amount = 1 music_slow_amount = 1 + run_time = 0 gold = 3 passives = {} main_song_instance:stop() @@ -850,6 +856,36 @@ function LevelButton:update(dt) system.save_run(self.parent.level, self.parent.loop, gold, self.parent.units, self.parent.passives, self.parent.shop_level, self.parent.shop_xp, run_passive_pool, locked_state) end end + + if self.selected and input.m2.pressed then + if self.parent.shop_level <= 1 then return end + if gold < 10 then + self.spring:pull(0.2, 200, 10) + self.selected = true + error1:play{pitch = random:float(0.95, 1.05), volume = 0.5} + if not self.info_text_2 then + self.info_text_2 = InfoText{group = main.current.ui} + self.info_text_2:activate({ + {text = '[fg]not enough gold', font = pixul_font, alignment = 'center'}, + }, nil, nil, nil, nil, 16, 4, nil, 2) + self.info_text_2.x, self.info_text_2.y = gw/2, gh/2 + 30 + end + self.t:after(2, function() self.info_text_2:deactivate(); self.info_text_2.dead = true; self.info_text_2 = nil end, 'info_text_2') + else + ui_switch2:play{pitch = random:float(0.95, 1.05), volume = 0.5} + self.shop_xp = 0 + self.parent.shop_level = self.parent.shop_level - 1 + self.max_xp = (self.parent.shop_level == 1 and 3) or (self.parent.shop_level == 2 and 4) or (self.parent.shop_level == 3 and 5) or (self.parent.shop_level == 4 and 6) or (self.parent.shop_level == 5 and 0) + self.parent.shop_xp = self.shop_xp + self:create_info_text() + self.selected = true + self.spring:pull(0.2, 200, 10) + gold = gold - 10 + self.parent.shop_text:set_text{{text = '[wavy_mid, fg]shop [fg]- [fg, nudge_down]gold: [yellow, nudge_down]' .. gold, font = pixul_font, alignment = 'center'}} + self.text = Text({{text = '[bg10]' .. tostring(self.parent.shop_level), font = pixul_font, alignment = 'center'}}, global_text_tags) + system.save_run(self.parent.level, self.parent.loop, gold, self.parent.units, self.parent.passives, self.parent.shop_level, self.parent.shop_xp, run_passive_pool, locked_state) + end + end end diff --git a/engine/init.lua b/engine/init.lua index 44189cf..dba0c94 100644 --- a/engine/init.lua +++ b/engine/init.lua @@ -125,6 +125,11 @@ function engine_run(config) steam.shutdown() return a or 0 end + elseif name == "focus" then + if main.current:is(Arena) then + if not a then open_options(main.current) + else close_options(main.current) end + end elseif name == "keypressed" then input.keyboard_state[a] = true; input.last_key_pressed = a elseif name == "keyreleased" then input.keyboard_state[a] = false elseif name == "mousepressed" then input.mouse_state[input.mouse_buttons[c]] = true; input.last_key_pressed = input.mouse_buttons[c] diff --git a/engine/system.lua b/engine/system.lua index 27dd0b1..85db464 100644 --- a/engine/system.lua +++ b/engine/system.lua @@ -139,7 +139,7 @@ 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, - current_new_game_plus = current_new_game_plus} + current_new_game_plus = current_new_game_plus, run_time = run_time} local str = "return " .. table.tostring(run) love.filesystem.write("run_v4.txt", str) end diff --git a/main.lua b/main.lua index 973216c..3d9e853 100644 --- a/main.lua +++ b/main.lua @@ -774,7 +774,7 @@ function init() } character_effect_descriptions = { - ['vagrant'] = function() return '[yellow]+15%[fg] attack speed and damage per active set' end, + ['vagrant'] = function() return '[yellow]+15%[fg] attack speed and damage per active class' end, ['swordsman'] = function() return "[fg]the swordsman's damage is [yellow]doubled" end, ['wizard'] = function() return '[fg]the projectile chains [yellow]2[fg] times' end, ['magician'] = function() return '[fg]the magician becomes invulnerable for [yellow]6[fg] seconds but also cannot attack' end, @@ -834,7 +834,7 @@ function init() } character_effect_descriptions_gray = { - ['vagrant'] = function() return '[light_bg]+15% attack speed and damage per active set' end, + ['vagrant'] = function() return '[light_bg]+15% attack speed and damage per active class' end, ['swordsman'] = function() return "[light_bg]the swordsman's damage is doubled" end, ['wizard'] = function() return '[light_bg]the projectile chains 3 times' end, ['magician'] = function() return '[light_bg]the magician becomes invulnerable for 6 seconds but also cannot attack' end, @@ -1010,7 +1010,7 @@ function init() ylb1(lvl) .. ']4[light_bg]/[' .. ylb2(lvl) .. ']3[light_bg]/[' .. ylb3(lvl) .. ']2[fg] attacks' end, ['mercenary'] = function(lvl) return '[' .. ylb1(lvl) .. ']2[light_bg]/[' .. ylb2(lvl) .. ']4 [fg]- [' .. ylb1(lvl) .. ']+8%[light_bg]/[' .. ylb2(lvl) .. ']+16% [fg]chance for enemies to drop gold on death' end, - ['explorer'] = function(lvl) return '[yellow]+15%[fg] attack speed and damage per active set to allied explorers' end, + ['explorer'] = function(lvl) return '[yellow]+15%[fg] attack speed and damage per active class to allied explorers' end, } tier_to_characters = { @@ -1731,15 +1731,15 @@ function init() 'silencing_strike', 'culling_strike', 'lightning_strike', 'psycholeak', 'divine_blessing', 'hardening', 'kinetic_strike', } main:add(Arena'arena') - main:go_to('arena', 16, 0, { - {character = 'archer', level = 3}, - {character = 'barrager', level = 3}, - {character = 'corruptor', level = 3}, - {character = 'host', level = 3}, - {character = 'beastmaster', level = 3}, - {character = 'infestor', level = 3}, + main:go_to('arena', 7, 0, { + {character = 'arcanist', level = 1}, + {character = 'artificer', level = 1}, + {character = 'witch', level = 1}, + {character = 'warden', level = 3}, + {character = 'psychic', level = 1}, + {character = 'vulcanist', level = 1}, }, { - {passive = 'hive', level = 3}, + {passive = 'magnify', level = 3}, }) ]]-- @@ -1875,6 +1875,7 @@ function open_options(self) if self.restart_button then self.restart_button.dead = true; self.restart_button = nil end if self.mouse_button then self.mouse_button.dead = true; self.mouse_button = nil end if self.dark_transition_button then self.dark_transition_button.dead = true; self.dark_transition_button = nil end + if self.run_timer_button then self.run_timer_button.dead = true; self.run_timer_button = nil end if self.sfx_button then self.sfx_button.dead = true; self.sfx_button = nil end if self.music_button then self.music_button.dead = true; self.music_button = nil end if self.video_button_1 then self.video_button_1.dead = true; self.video_button_1 = nil end @@ -1904,6 +1905,7 @@ function open_options(self) TransitionEffect{group = main.transitions, x = gw/2, y = gh/2, color = state.dark_transitions and bg[-2] or fg[0], transition_action = function() slow_amount = 1 music_slow_amount = 1 + run_time = 0 gold = 3 passives = {} main_song_instance:stop() @@ -1925,20 +1927,27 @@ function open_options(self) end} end - self.mouse_button = Button{group = self.ui, x = gw/2 - 57, y = gh - 150, force_update = true, button_text = 'mouse control: ' .. tostring(state.mouse_control and 'yes' or 'no'), fg_color = 'bg10', bg_color = 'bg', + self.mouse_button = Button{group = self.ui, x = gw/2 - 113, y = gh - 150, force_update = true, button_text = 'mouse control: ' .. tostring(state.mouse_control and 'yes' or 'no'), fg_color = 'bg10', bg_color = 'bg', action = function(b) ui_switch1:play{pitch = random:float(0.95, 1.05), volume = 0.5} state.mouse_control = not state.mouse_control b:set_text('mouse control: ' .. tostring(state.mouse_control and 'yes' or 'no')) end} - self.dark_transition_button = Button{group = self.ui, x = gw/2 + 64, y = gh - 150, force_update = true, button_text = 'dark transitions: ' .. tostring(state.dark_transitions and 'yes' or 'no'), + self.dark_transition_button = Button{group = self.ui, x = gw/2 + 13, y = gh - 150, force_update = true, button_text = 'dark transitions: ' .. tostring(state.dark_transitions and 'yes' or 'no'), fg_color = 'bg10', bg_color = 'bg', action = function(b) ui_switch1:play{pitch = random:float(0.95, 1.05), volume = 0.5} state.dark_transitions = not state.dark_transitions b:set_text('dark transitions: ' .. tostring(state.dark_transitions and 'yes' or 'no')) end} + self.run_timer_button = Button{group = self.ui, x = gw/2 + 121, y = gh - 150, force_update = true, button_text = 'run timer: ' .. tostring(state.run_timer and 'yes' or 'no'), fg_color = 'bg10', bg_color = 'bg', + action = function(b) + ui_switch1:play{pitch = random:float(0.95, 1.05), volume = 0.5} + state.run_timer = not state.run_timer + b:set_text('run timer: ' .. tostring(state.run_timer and 'yes' or 'no')) + end} + self.sfx_button = Button{group = self.ui, x = gw/2 - 46, y = gh - 175, force_update = true, button_text = 'sfx volume: ' .. tostring((state.sfx_volume or 0.5)*10), fg_color = 'bg10', bg_color = 'bg', action = function(b) ui_switch2:play{pitch = random:float(0.95, 1.05), volume = 0.5} @@ -2113,6 +2122,7 @@ function close_options(self) if self.restart_button then self.restart_button.dead = true; self.restart_button = nil end if self.mouse_button then self.mouse_button.dead = true; self.mouse_button = nil end if self.dark_transition_button then self.dark_transition_button.dead = true; self.dark_transition_button = nil end + if self.run_timer_button then self.run_timer_button.dead = true; self.run_timer_button = nil end if self.sfx_button then self.sfx_button.dead = true; self.sfx_button = nil end if self.music_button then self.music_button.dead = true; self.music_button = nil end if self.video_button_1 then self.video_button_1.dead = true; self.video_button_1 = nil end diff --git a/mainmenu.lua b/mainmenu.lua index 9c2f107..8aee8b2 100644 --- a/mainmenu.lua +++ b/mainmenu.lua @@ -99,6 +99,7 @@ function MainMenu:on_enter(from) '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', 'kinetic_strike', } + run_time = run.time or 0 gold = run.gold or 3 passives = run.passives or {} locked_state = run.locked_state diff --git a/objects.lua b/objects.lua index f449af4..607757c 100644 --- a/objects.lua +++ b/objects.lua @@ -246,10 +246,10 @@ function Unit:calculate_stats(first_run) 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] + self.base_mvspd = math.min(35 + 1.5*y[x], 35 + 1.5*y[150]) 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] + self.base_mvspd = math.min(35 + 1.1*y[x], 35 + 1.1*y[150]) end else local x = self.level @@ -265,7 +265,7 @@ function Unit:calculate_stats(first_run) end self.base_hp = 25 + 16.5*y[x] self.base_dmg = 4.5 + 2.5*y[x] - self.base_mvspd = 70 + 3*y[x] + self.base_mvspd = math.min(70 + 3*y[x], 70 + 3*y[150]) end else if self.boss then @@ -284,10 +284,10 @@ function Unit:calculate_stats(first_run) 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] + self.base_mvspd = math.min(35 + 1.5*y[x], 35 + 1.5*y[150]) 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] + self.base_mvspd = math.min(35 + 1.2*y[x], 35 + 1.2*y[150]) end else local x = self.level @@ -303,7 +303,7 @@ function Unit:calculate_stats(first_run) 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] - self.base_mvspd = 70 + 3*y[x] + self.base_mvspd = math.min(70 + 3*y[x], 70 + 3*y[150]) end end elseif self:is(Saboteur) then diff --git a/player.lua b/player.lua index 131e842..27d097c 100644 --- a/player.lua +++ b/player.lua @@ -2965,7 +2965,7 @@ ForceField:implement(GameObject) ForceField:implement(Physics) function ForceField:init(args) self:init_game_object(args) - self:set_as_circle(12, 'static', 'force_field') + self:set_as_circle((self.parent and self.parent.magnify and (self.parent.magnify == 1 and 14) or (self.parent.magnify == 2 and 17) or (self.parent.magnify == 3 and 20)) or 12, 'static', 'force_field') self.hfx:add('hit', 1) self.color = fg[0] diff --git a/todo b/todo index 89797c2..d394308 100644 --- a/todo +++ b/todo @@ -1,5 +1,15 @@ Weekly maintenance updates: +#2 + + * Fixed a bug where NG+5 difficulty would go down to NG+4 after looping + * Capped enemy movement speed after level 150 + * Warden's bubble is now affected by magnify + * Changed all text instances of "active set" to "active class" to avoid confusion + * Added a run timer option - note that the timer will be off for saved runs that started before the patch + * Alt tabbing now automatically pauses the game while in the arena + * Shop level can now be reduced + #1 * Fixed several blue screen crashes due to broken looping state @@ -20,6 +30,8 @@ Weekly maintenance updates: --- +30Hz + Invoker - casts attacks and spells from other units having a unit like this from the start will help ensure that attacks are behind function calls that can be accessed by another unit easily rather than mostly hidden like they are now @@ -69,6 +81,8 @@ Unit ideas - https://i.imgur.com/VNMS2YV.png Unit ideas - https://steamcommunity.com/app/915310/discussions/0/3069747783693969554/ Unit ideas - https://steamcommunity.com/app/915310/discussions/0/3046104336668792953/ Achievement ideas - https://i.imgur.com/Q7jHWB2.png, https://i.imgur.com/2l5eist.png +general ideas - https://i.imgur.com/W8EYUU1.png +room types - https://i.imgur.com/u2AY1ea.png Draft system Ban system @@ -112,6 +126,8 @@ Roguelite update: i.e. 3 attack speed means the same internal attack rate value (like say 6 seconds) for the entire game In general it's better if units don't have hidden internal multipliers on these stats, although sometimes that may be inevitable Damage: + Hit: + Everything hits except DoT Damage type: Attack - physical attacks, decreased by the enemy's armor Spell - magical attacks, decreased by the enemy's magic resistance