From 521ce0cca5629b4e9cc480ea9fedf84a37d22d5d Mon Sep 17 00:00:00 2001 From: a327ex Date: Fri, 4 Jun 2021 01:05:59 -0300 Subject: [PATCH] Sorcerer update 3/4 --- arena.lua | 19 +++++++++++++++---- buy_screen.lua | 9 +++++---- enemies.lua | 6 ++++-- main.lua | 4 ---- player.lua | 9 ++++++--- todo | 49 ++++++++++++++++++++++++++----------------------- 6 files changed, 56 insertions(+), 40 deletions(-) diff --git a/arena.lua b/arena.lua index 02907e8..929dbb0 100644 --- a/arena.lua +++ b/arena.lua @@ -265,6 +265,8 @@ function Arena:on_enter(from, level, units, passives) if self.arena_clear_text then return end if self.quitting then return end if self.spawning_enemies then return end + if self.won then return end + if self.choosing_passives then return end local n = self.enemy_spawns_prevented if math.floor(n/4) <= 0 then return end @@ -327,7 +329,7 @@ function Arena:update(dt) -- print(self.enemy_spawns_prevented) - if input.escape.pressed and not self.transitioning and not self.in_credits then + if input.escape.pressed and not self.transitioning and not self.in_credits and not self.choosing_passives then if not self.paused then trigger:tween(0.25, _G, {slow_amount = 0}, math.linear, function() slow_amount = 0 @@ -381,6 +383,7 @@ function Arena:update(dt) } max_units = 7 + current_new_game_plus main:add(BuyScreen'buy_screen') + locked_state = nil system.save_run() main:go_to('buy_screen', 0, {}, passives) end, text = Text({{text = '[wavy, bg]restarting...', font = pixul_font, alignment = 'center'}}, global_text_tags)} @@ -521,6 +524,7 @@ function Arena:update(dt) } max_units = 7 + current_new_game_plus main:add(BuyScreen'buy_screen') + locked_state = nil system.save_run() main:go_to('buy_screen', 0, {}, passives) end, text = Text({{text = '[wavy, bg]restarting...', font = pixul_font, alignment = 'center'}}, global_text_tags)} @@ -550,10 +554,13 @@ end function Arena:quit() + if self.died then return end + self.quitting = true if self.level == 25 then if not self.win_text and not self.win_text2 then self.won = true + locked_state = nil system.save_run() trigger:tween(1, _G, {slow_amount = 0}, math.linear, function() slow_amount = 0 end, 'slow_amount') trigger:tween(4, camera, {x = gw/2, y = gh/2, r = 0}, math.linear, function() camera.x, camera.y, camera.r = gw/2, gh/2, 0 end) @@ -880,9 +887,10 @@ end function Arena:die() - if not self.died_text and not self.won then + if not self.died_text and not self.won and not self.arena_clear_text then self.t:cancel('divine_punishment') self.died = true + locked_state = nil system.save_run() self.t:tween(2, self, {main_slow_amount = 0}, math.linear, function() self.main_slow_amount = 0 end) self.died_text = Text2{group = self.ui, x = gw/2, y = gh/2 - 32, lines = { @@ -916,6 +924,7 @@ function Arena:die() end, text = Text({{text = '[wavy, bg]restarting...', font = pixul_font, alignment = 'center'}}, global_text_tags)} end} end) + return true end end @@ -988,8 +997,8 @@ function Arena:transition() TransitionEffect{group = main.transitions, x = self.player.x, y = self.player.y, color = self.color, transition_action = function(t) slow_amount = 1 main:add(BuyScreen'buy_screen') - system.save_run(self.level, gold, self.units, passives, run_passive_pool_by_tiers, locked_state) - main:go_to('buy_screen', self.level, self.units, passives) + system.save_run(self.level, gold, self.units, self.passives, run_passive_pool_by_tiers, locked_state) + main:go_to('buy_screen', self.level, self.units, self.passives) t.t:after(0.1, function() t.text:set_text({ {text = '[nudge_down, bg]gold gained: ' .. tostring(gold_gained), font = pixul_font, alignment = 'center', height_multiplier = 1.5}, @@ -1115,6 +1124,8 @@ function Arena:spawn_n_enemies(p, j, n, pass) if self.died then return end if self.arena_clear_text then return end if self.quitting then return end + if self.won then return end + if self.choosing_passives then return end if n and n <= 0 then return end j = j or 1 diff --git a/buy_screen.lua b/buy_screen.lua index 240365b..f1d0a61 100644 --- a/buy_screen.lua +++ b/buy_screen.lua @@ -116,7 +116,7 @@ function BuyScreen:on_enter(from, level, units, passives) end, mouse_enter = function(b) b.info_text = InfoText{group = main.current.ui, force_update = true} b.info_text:activate({ - {text = '[fg]tutorial', font = pixul_font, alignment = 'center'}, + {text = '[fg]guide', font = pixul_font, alignment = 'center'}, }, 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) @@ -733,7 +733,7 @@ function LockButton:update(dt) if not self.parent.locked then locked_state = nil end if self.parent.locked then locked_state = {locked = true, cards = {self.parent.cards[1] and self.parent.cards[1].unit, self.parent.cards[2] and self.parent.cards[2].unit, self.parent.cards[3] and self.parent.cards[3].unit}} - system.save_run(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 ui_switch2:play{pitch = random:float(0.95, 1.05), volume = 0.5} self.selected = true @@ -802,7 +802,7 @@ function RerollButton:update(dt) self.spring:pull(0.2, 200, 10) gold = gold - 2 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'}} - system.save_run(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 end @@ -1107,6 +1107,7 @@ function PassiveCard:update(dt) if self.selected and input.m1.pressed and self.arena.choosing_passives then self.arena.choosing_passives = false table.insert(passives, self.passive) + table.insert(self.arena.passives, self.passive) self.arena:restore_passives_to_pool(self.card_i) trigger:tween(0.25, _G, {slow_amount = 1}, math.linear, function() slow_amount = 1 @@ -1242,7 +1243,7 @@ function ShopCard:update(dt) _G[random:table{'coins1', 'coins2', 'coins3'}]:play{pitch = random:float(0.95, 1.05), volume = 0.5} self:die() self.parent.cards[self.i] = nil - system.save_run(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) else error1:play{pitch = random:float(0.95, 1.05), volume = 0.5} self.spring:pull(0.2, 200, 10) diff --git a/enemies.lua b/enemies.lua index 47b984c..c37ba0d 100644 --- a/enemies.lua +++ b/enemies.lua @@ -479,8 +479,10 @@ function Seeker:hit(damage, projectile) if self.infested then critter1:play{pitch = random:float(0.95, 1.05), volume = 0.5} trigger:after(0.01, function() - for i = 1, self.infested do - Critter{group = main.current.main, x = self.x, y = self.y, color = orange[0], r = random:float(0, 2*math.pi), v = 10, dmg = self.infested_dmg, parent = self.infested_ref} + if type(self.infested) == 'number' then + for i = 1, self.infested do + Critter{group = main.current.main, x = self.x, y = self.y, color = orange[0], r = random:float(0, 2*math.pi), v = 10, dmg = self.infested_dmg, parent = self.infested_ref} + end end end) end diff --git a/main.lua b/main.lua index 7a93d50..03ad1ff 100644 --- a/main.lua +++ b/main.lua @@ -1389,10 +1389,6 @@ function update(dt) state.fullscreen = false end - if input.p.pressed then - system.save_state() - end - --[[ if input.f12.pressed then steam.userStats.resetAllStats(true) diff --git a/player.lua b/player.lua index cb59c8c..8f8760c 100644 --- a/player.lua +++ b/player.lua @@ -1212,11 +1212,14 @@ function Player:hit(damage) else hit4:play{pitch = random:float(0.95, 1.05), volume = 0.5} slow(0.25, 1) - self.dead = true for i = 1, random:int(4, 6) do HitParticle{group = main.current.effects, x = self.x, y = self.y, color = self.color} end HitCircle{group = main.current.effects, x = self.x, y = self.y, rs = 12}:scale_down(0.3):change_color(0.5, self.color) if self.leader and #self.followers == 0 then - main.current:die() + if main.current:die() then + self.dead = true + else + self.hp = 1 + end else if self.leader then self:recalculate_followers() else self.parent:recalculate_followers() end @@ -1669,7 +1672,7 @@ function Projectile:die(x, y, r, n) self.dead = true if self.character == 'wizard' then - Area{group = main.current.effects, x = self.x, y = self.y, r = self.r, w = self.parent.area_size_m*32, color = self.color, dmg = self.parent.area_dmg_m*self.dmg, character = self.character, level = self.level, parent = self, + Area{group = main.current.effects, x = self.x, y = self.y, r = self.r, w = self.parent.area_size_m*24, color = self.color, dmg = self.parent.area_dmg_m*self.dmg, character = self.character, level = self.level, parent = self, void_rift = self.parent.void_rift, echo_barrage = self.parent.echo_barrage} elseif self.character == 'blade' then Area{group = main.current.effects, x = self.x, y = self.y, r = self.r, w = self.parent.area_size_m*64, color = self.color, dmg = self.parent.area_dmg_m*self.dmg, character = self.character, level = self.level, parent = self, diff --git a/todo b/todo index a72606f..55f91b0 100644 --- a/todo +++ b/todo @@ -11,39 +11,30 @@ Sorcerer update Rename tutorial to guide or manual Add visuals for defensive ouroboros Unlock automatically on shop enter - Bug fixes - Headbutter damage should falloff faster after it strikes - https://i.imgur.com/QN0Ntq2.png - https://i.imgur.com/YfhqDYr.png - https://i.imgur.com/ps4OA7o.png - https://i.imgur.com/j1LS3zt.png - https://i.imgur.com/XXJn4uW.png - Fix bug where quitting on level 1 jumps to level 2 - Fix lock bug after death/win - https://i.imgur.com/iUyOtLk.png - Fix enemies still spawning after arena clear (this happens with the extra enemy spawns that were blocked earlier) - Fix death + win at the same time bug - Fix leader distance being off on certain speeds Balance Buff tanks, maybe add a simple forcer ability to them Buff 24/25 HP again Buff headbutter (+ trigger range) - * New - * Sorcerer = sorcerers repeat their attacks once every 4/3/2 attacks - * Arcanist (tier 1 sorcerer) - launches a slow piercing orb that launches other piercing projectiles, Lv.3 effect - 50% increased attack speed for the orb and 2 projectiles are released per cast - * Sorcerer + Conjurer = Illusionist - launches a projectile that deals X damage and creates copies that do the same, Lv.3 effect - doubles the number of copies created and they release 12 projectiles on death that pierce and ricochet once - * Sorcerer + Voider = Witch - creates an area that ricochets around the arena and deals X damage over time, Lv.3 effect - the area periodically releases projectiles that chain once - * Sorcerer + Curser = Silencer - curses 6 nearby enemies for 6 seconds, preventing them from using special attacks, Lv.3 effect - the curse also deals X damage over time - * Sorcerer + Nuker = Vulcanist - creates a volcano that explodes the nearby area 4 times, Lv.3 effect - the number and speed of explosions is doubled - * Sorcerer + Forcer = Warden - creates a force field around a random unit that prevents enemies from entering, Lv.3 effect - creates the force field around 2 units instead - * Sorcerer + Psyker = Psychic - creates a small area that deals X damage, Lv.3 effect - the attack can happen from any distance and repeats twice - * Magician (tier 1 mage) - creates a small area that deals X damage, Lv.3 effect - the magician becomes invulnerable for 6 seconds + Bugs + Fix leader (snake head) distance being off by 1 or 2 pixels on certain snake speeds Sorcerer update patch notes +Summary: This update adds 1 new class with 8 new units, implements more QoL features, further balance changes and lots of bug fixes. + Added sorcerer class: sorcerers repeat their attacks once every 4/3/2 attacks + Added 8 new units: + Arcanist (tier 1 sorcerer) - launches a slow piercing orb that launches other piercing projectiles, Lv.3 effect - 50% increased attack speed for the orb and 2 projectiles are released per cast + Illusionist (tier 3 sorcerer, conjurer) - launches a projectile that deals X damage and creates copies that do the same, Lv.3 effect - doubles the number of copies created and they release 12 projectiles on death that pierce and ricochet once + Witch (tier 2 sorcerer, voider) - creates an area that ricochets around the arena and deals X damage over time, Lv.3 effect - the area periodically releases projectiles that chain once + Silencer (tier 2 sorcerer, curser) - curses 6 nearby enemies for 6 seconds, preventing them from using special attacks, Lv.3 effect - the curse also deals X damage over time + Vulcanist (tier 4 sorcerer, nuker) - creates a volcano that explodes the nearby area 4 times, Lv.3 effect - the number and speed of explosions is doubled + Warden (tier 4 sorcerer, forcer) - creates a force field around a random unit that prevents enemies from entering, Lv.3 effect - creates the force field around 2 units instead + Psychic (tier 2 sorcerer, psyker) - creates a small area that deals X damage, Lv.3 effect - the attack can happen from any distance and repeats twice + Magician (tier 1 mage) - creates a small area that deals X damage, Lv.3 effect - the magician becomes invulnerable for 6 seconds Changed cursers to trigger only when near enemies Decreased projectile speed for the exploder (blue enemy) Changed shooters (white enemy) to scale with NG+ difficulty Increased damage and movement speed for enemy swarmers (small purple enemies) - Added tooltips for "restart run" and "tutorial" buttons on the shop + Added tooltips for "restart run" and "guide" buttons on the shop Fixed text that was going outside the screen for the Priest and the Assassin Fixed bug where Divine Punishment would continue triggering after death Removed cooldown visuals on snake for units that don't have cooldowns (Squire, Chronomancer and Psykeeper) @@ -61,6 +52,15 @@ Sorcerer update patch notes Added Nuker class to Wizard Change Wizard's Lv.3 effect's chain to 2 (from 3) Fixed Blade's Lv.3 effect's damage text not being rounded + Fixed headbutter (orange enemy) damage buff lasting too long after an attack + Fixed a crash whenever the Fairy would try to select a unit that just died this or last frame + Fixed a crash that would happen when trying to restart the game through the menu on the passive selection screen + Fixed a bug where you could die and win at the same time + Fixed a crash triggered by infested enemies on death rarely + Fixed a bug where quitting on level 1 would automatically jump to level 2 + Fixed a bug where lock state would carry over after a run death/win/restart + Fixed a bug where items from a previous restarted run would remain after the 1st round + --- @@ -71,6 +71,8 @@ Trappers: Triangler - drops a trap and the 3rd trap will trigger the area, dealing X AoE damage 2-3 times Brawlers: units focused on crashing on enemies https://i.imgur.com/5YubukS.png - unit idea +Conjurer unit that creates an unit that actively protects you from enemy projectiles +Passive that makes critters and summons block enemy projectiles Hexblaster? - curser that consumes curses to deal damage Bench? - https://i.imgur.com/B1gNVKk.png Balance option for when there are more sets - https://i.imgur.com/JMynwbL.png @@ -80,6 +82,7 @@ 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) Roguelite update: Slay the Spire-like node selection map (copy code from SHOOTRX repo as this is already implemented there)