diff --git a/arena.lua b/arena.lua index f152396..45e62f5 100644 --- a/arena.lua +++ b/arena.lua @@ -511,7 +511,7 @@ function Arena:quit() }} ]]-- SteamFollowButton{group = self.ui, x = gw/2 + 40, y = gh/2 - 10, force_update = true} - Button{group = self.ui, x = gw/2 + 40, y = gh/2 + 33, force_update = true, button_text = 'buy the soundtrack!', fg_color = 'greenm5', bg_color = 'green', action = function() open_url(b, 'https://kubbimusic.com/album/ember') end} + Button{group = self.ui, x = gw/2 + 40, y = gh/2 + 33, force_update = true, button_text = 'buy the soundtrack!', fg_color = 'greenm5', bg_color = 'green', action = function(b) open_url(b, 'https://kubbimusic.com/album/ember') end} Button{group = self.ui, x = gw - 40, y = gh - 44, force_update = true, button_text = ' loop ', fg_color = 'bg10', bg_color = 'bg', action = function() self:endless() end} RestartButton{group = self.ui, x = gw - 40, y = gh - 20, force_update = true} self.try_loop_text = Text2{group = self.ui, x = gw - 200, y = gh - 44, force_update = true, lines = { diff --git a/buy_screen.lua b/buy_screen.lua index c6eb805..aa26bf7 100644 --- a/buy_screen.lua +++ b/buy_screen.lua @@ -1450,6 +1450,7 @@ function ItemCard:update(dt) if self.selected and input.m2.pressed then _G[random:table{'coins1', 'coins2', 'coins3'}]:play{pitch = random:float(0.95, 1.05), volume = 0.5} self.parent:gain_gold((self.level == 1 and 10) or (self.level == 2 and 20) or (self.level == 3 and 30)) + table.insert(run_passive_pool, self.passive) table.remove(self.parent.passives, self.i) input.m2.pressed = false self.parent:set_items() diff --git a/main.lua b/main.lua index 09f7928..0e8fb75 100644 --- a/main.lua +++ b/main.lua @@ -1731,16 +1731,15 @@ function init() 'silencing_strike', 'culling_strike', 'lightning_strike', 'psycholeak', 'divine_blessing', 'hardening', } main:add(Arena'arena') - main:go_to('arena', 6, 0, { - {character = 'cleric', level = 1}, - {character = 'priest', level = 3}, - {character = 'carver', level = 1}, - {character = 'psykeeper', level = 1}, - {character = 'fairy', level = 3}, + 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}, }, { - {passive = 'psychosink', level = 3}, - {passive = 'psyker_orbs', level = 3}, - {passive = 'awakening', level = 3}, + {passive = 'hive', level = 3}, }) ]]-- diff --git a/mainmenu.lua b/mainmenu.lua index 8d8af79..2223493 100644 --- a/mainmenu.lua +++ b/mainmenu.lua @@ -95,7 +95,9 @@ function MainMenu:on_enter(from) 'defensive_stance', 'offensive_stance', 'kinetic_bomb', 'porcupine_technique', 'last_stand', 'seeping', 'deceleration', 'annihilation', 'malediction', 'hextouch', 'whispers_of_doom', 'tremor', 'heavy_impact', 'fracture', 'meat_shield', 'hive', 'baneling_burst', 'blunt_arrow', 'explosive_arrow', 'divine_machine_arrow', 'chronomancy', 'awakening', 'divine_punishment', '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' + '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', } gold = run.gold or 3 passives = run.passives or {} diff --git a/player.lua b/player.lua index 14f6f7d..6a4e536 100644 --- a/player.lua +++ b/player.lua @@ -69,7 +69,7 @@ function Player:init(args) self.t:after(0.25, function() local enemy = table.shuffle(main.current.main:get_objects_by_classes(main.current.enemies))[1] if enemy then - gambler1:play{pitch = pitch_a + 0.05, volume = math.remap(gold, 0, 50, 0, 0.5)} + gambler1:play{pitch = pitch_a + 0.05, volume = math.clamp(math.remap(gold, 0, 50, 0, 0.5), 0, 0.75)} enemy:hit(2*gold) end end) @@ -1955,6 +1955,8 @@ Projectile:implement(GameObject) Projectile:implement(Physics) function Projectile: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 self.hfx:add('hit', 1) self:set_as_rectangle(10, 4, 'dynamic', 'projectile') self.pierce = args.pierce or 0 @@ -3852,6 +3854,7 @@ Critter:implement(Unit) function Critter:init(args) self:init_game_object(args) 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(Critter) > 100 then self.dead = true; return end self:init_unit() self:set_as_rectangle(7, 4, 'dynamic', 'player') self:set_restitution(0.5) diff --git a/todo b/todo index 80bb86c..5716de0 100644 --- a/todo +++ b/todo @@ -1,81 +1,13 @@ -Loop Update - New items: - General: - * Intimidation - enemies spawn with -10/20/30% max HP - * Vulnerability - enemies take +10/20/30% damage - * Temporal Chains - enemies are 10/20/30% slower - * Ceremonial Dagger - killing an enemy fires a homing dagger - * Homing Barrage - 8/16/24% chance to release a homing barrage on enemy kill - * Critical Strike - 5/10/15% chance for attacks to critically strike, dealing 2x damage - * Noxious Strike - 8/16/24% chance for attacks to poison enemies, dealing 20% dps for 3 seconds - * Infesting Strike - 10/20/30% chance for attacks to spawn 2 critters on kill - * Kinetic Strike - 10/20/30% chance for attacks to push enemies away with high force - * Burning Strike - 15% chance for attacks to ignite, dealing 20% dps for 3 seconds - * Lucky Strike - 8% chance for attacks to cause enemies to drop gold on death - * Healing Strike - 8% chance for attacks to spawn a healing orb on kill - * Stunning Strike - 8/16/24% chance for attacks to stun for 2 seconds - * Silencing Strike - 8/16/24% chance for attacks to silence for 4 seconds on hit - * Culling Strike - instantly kill elites below 10/20/30% max HP - * Lightning Strike - 5/10/15% chance for projectiles to create chain lightning, dealing 60/80/100% damage - * Psycholeak - position 1 generates 1 psyker orb every 10 seconds - * Divine Blessing - generate 1 healing orb every 8 seconds - * Hardening - +150% defense for 3 seconds after an ally dies - Psyker - * Orb speed scales with the unit's attack speed - * Increased default orb range - * Decreased default orb speed - * Additional psyker orbs will prefer to be assigned to psykers, if there are no psykers then they will be assigned to units randomly - * Changed psyker class bonus: +2/4 total orbs - * Removed Psychosense - * Added Psychosink - psyker orbs deal +40/80/120% damage - Healer - * Double healing per orb - * Fixed heal targetting, now it should always target the lowest HP unit - * Healing orbs and gold coins are now slightly attracted to the snake with a weak magnetism effect - * Changed healer class bonus: +15/30% chance to create an additional healing orb on healing orb creation - * Psykeeper: spawn 3 healing orbs every time the psykeeper takes 25% of max HP in damage - Warriors - * Decreased sensor range for all warriors, this will make them attack only when enemies are closer and consequently make it so that they hit more enemies in general - * Juggernaut and barbarian now only attack when there are enemies nearby - Builders - * Carver (builder, healer) - creates a tree that creates 1 healing orb every 6 seconds, Lv.3 effect: healing orbs are created twice as fast - * Engineer (builder): unchanged - * Illusionist -> Artificer (builder, sorcerer): unchanged - * Saboteur -> Bomber (builder, nuker): plants a bomb, when it explodes it deals 2X AoE damage, Lv.3 effect: +100% bomb area and damage - * Hunter -> Sentry (builder, ranger): spawns a turret that shoots projectiles, each dealing X damage, Lv.3 effect: +50% attack speed and the projectiles ricochet twice - Looping - * Change end screen - * Loop button on end screen - * Looping lets you continue with the current snake until you die - * Difficulty is increased according to the formula for levels 25+ - * Snake size goes up by 1 every loop, up to 12 - * Don't offer items if at maximum items - QoL - * Right click goes down on volume buttons - * Show cooldown on elite attack - * Added visuals for divine intervention and fairy buffs - * Increased item choice slots to 4 - * Party + items on death screen - * Silenced units are now gray - * Items on end screen - * Items on passive screen - * Selling items - * Decreased sound effect volume for shoot 5 - Bug fixes - * Fixed a series of crashes that happened sometimes right before changing from the arena back to the shop - * Fixed merchant not giving interest or free reroll if it died in combat - * Fixed shoot 5 and death 6 not working if a unit placed before it on the snake died - * Fixed undying unit from lasting 7 being able to become immortal if it was healed during the 10 seconds before it truly died - * Fixed a bug where max units wouldn't be properly changed when changing NG difficulty in the menu - * Fixed Whispers of Doom applying before curses, now it applies after and triggers their effect when enemies are killed due to it - * Fixed mobile users not being able to close the credits screen due to there being no close button - * Fixed shop party numbers not being updated when units are bought or sold - * Fixed a bug where movement speed would become zero if the game was paused while under the effects of decaying haste - * Fixed baneling burst not dealing the correct amount of damage - - Weekly maintenance updates: +#1 + * Fixed several blue screen crashes due to broken looping state + * Limited critters to 100 due to performance issues + * 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 a bug where the first run would not have certain items in the item pool --- @@ -106,7 +38,7 @@ Assists (2/4) - Pardoner (tier 3 assist, mercenary) - Oracle (tier 1 assist) - +10% dodge chance to adjacent units, Lv.3 effect - +20% dodge chance to adjacent units Seraph (tier 2 assist, healer) - periodically chooses 1 random unit and gives it +100% defense for 6 seconds, Lv.3 - choose 2 units instead -Passive that makes critters and summons block enemy projectiles +Add a few builder units that create walls/solids the player can hide behind (https://www.youtube.com/watch?v=KqwBZ_2f7QU&t=2331s) 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