From 8acbd6b1ae5955329038f345c7db6e6aaa37475e Mon Sep 17 00:00:00 2001 From: a327ex Date: Fri, 25 Jun 2021 13:25:13 -0300 Subject: [PATCH] Orb update 4/4 --- arena.lua | 56 +++++++++++++++---------------- assets/media/orb_cover.png | Bin 0 -> 6223 bytes buy_screen.lua | 23 +++++++------ enemies.lua | 67 +++++++++++++++---------------------- main.lua | 40 +++++++++++----------- media.lua | 2 +- objects.lua | 6 ++-- player.lua | 30 ++++++++++------- todo | 37 +++++++++++--------- 9 files changed, 130 insertions(+), 131 deletions(-) create mode 100644 assets/media/orb_cover.png diff --git a/arena.lua b/arena.lua index b9f71fb..9fd2f7a 100644 --- a/arena.lua +++ b/arena.lua @@ -121,7 +121,7 @@ function Arena:on_enter(from, level, units, passives, shop_level, shop_xp, lock) SpawnEffect{group = self.effects, x = gw/2, y = gh/2, action = function(x, y) spawn1:play{pitch = random:float(0.8, 1.2), volume = 0.15} SpawnMarker{group = self.effects, x = x, y = y} - self.t:after(0.75, function() + self.t:after(1.125, function() self.boss = Seeker{group = self.main, x = x, y = y, character = 'seeker', level = self.level, boss = level_to_boss[self.level]} end) end} @@ -141,7 +141,7 @@ function Arena:on_enter(from, level, units, passives, shop_level, shop_xp, lock) local spawn_points = {left = {x = self.x1 + 32, y = gh/2}, middle = {x = gw/2, y = gh/2}, right = {x = self.x2 - 32, y = gh/2}} local p = spawn_points[spawn_type] SpawnMarker{group = self.effects, x = p.x, y = p.y} - self.t:after(0.75, function() self:spawn_n_enemies(p, nil, 8 + math.floor(self.level/2)) end) + self.t:after(1.125, function() self:spawn_n_enemies(p, nil, 8 + math.floor(self.level/2)) end) end) end) end) @@ -182,8 +182,8 @@ function Arena:on_enter(from, level, units, passives, shop_level, shop_xp, lock) 2, 3, 4, 3, 4, 4, 5, 5, 5, 5, 5, 7, - 6, 6, 7, 7, 7, 10, - 6, 8, 10, 12, 14, 16, 25, + 6, 6, 7, 7, 8, 10, + 8, 8, 10, 12, 14, 16, 25, } self.level_to_distributed_enemies_chance = { 0, 5, 10, @@ -224,7 +224,7 @@ function Arena:on_enter(from, level, units, passives, shop_level, shop_xp, lock) local spawn_points = {left = {x = self.x1 + 32, y = gh/2}, middle = {x = gw/2, y = gh/2}, right = {x = self.x2 - 32, y = gh/2}} local p = spawn_points[spawn_type] SpawnMarker{group = self.effects, x = p.x, y = p.y} - self.t:after(0.75, function() self:spawn_n_enemies(p, nil, 8 + (self.wave-1)*2) end) + self.t:after(1.125, function() self:spawn_n_enemies(p, nil, 8 + (self.wave-1)*2) end) end end) end, self.max_waves+1) @@ -299,24 +299,24 @@ function Arena:on_enter(from, level, units, passives, shop_level, shop_xp, lock) self.t:after({0, 0.2}, function() local p = random:table_remove(spawn_points) SpawnMarker{group = self.effects, x = p.x, y = p.y} - self.t:after(0.75, function() self:spawn_n_enemies(p, 1, math.floor(n/4), true) end) + self.t:after(1.125, function() self:spawn_n_enemies(p, 1, math.floor(n/4), true) end) end) self.t:after({0, 0.2}, function() local p = random:table_remove(spawn_points) SpawnMarker{group = self.effects, x = p.x, y = p.y} - self.t:after(0.75, function() self:spawn_n_enemies(p, 2, math.floor(n/4), true) end) + self.t:after(1.125, function() self:spawn_n_enemies(p, 2, math.floor(n/4), true) end) end) self.t:after({0, 0.2}, function() local p = random:table_remove(spawn_points) SpawnMarker{group = self.effects, x = p.x, y = p.y} - self.t:after(0.75, function() self:spawn_n_enemies(p, 3, math.floor(n/4), true) end) + self.t:after(1.125, function() self:spawn_n_enemies(p, 3, math.floor(n/4), true) end) end) self.t:after({0, 0.2}, function() local p = random:table_remove(spawn_points) SpawnMarker{group = self.effects, x = p.x, y = p.y} - self.t:after(0.75, function() self:spawn_n_enemies(p, 4, math.floor(n/4), true) end) + self.t:after(1.125, function() self:spawn_n_enemies(p, 4, math.floor(n/4), true) end) end) - self.t:after(0.75 + math.floor(n/4)*0.25, function() self.spawning_enemies = false end, 'spawning_enemies') + self.t:after(1.125 + math.floor(n/4)*0.25, function() self.spawning_enemies = false end, 'spawning_enemies') self.enemy_spawns_prevented = 0 end) end @@ -945,22 +945,22 @@ function Arena:spawn_distributed_enemies() if spawn_type == '4' then local p = random:table_remove(spawn_points) SpawnMarker{group = self.effects, x = p.x, y = p.y} - self.t:after(0.75, function() + self.t:after(1.125, function() self:spawn_n_enemies(p) end) - self.t:after(1.5, function() self.spawning_enemies = false end, 'spawning_enemies') + self.t:after(2.25, function() self.spawning_enemies = false end, 'spawning_enemies') elseif spawn_type == '4+4' then local p = random:table_remove(spawn_points) SpawnMarker{group = self.effects, x = p.x, y = p.y} - self.t:after(0.75, function() + self.t:after(1.125, function() self:spawn_n_enemies(p) self.t:after(2, function() self:spawn_n_enemies(p) end) end) - self.t:after(3.5, function() self.spawning_enemies = false end, 'spawning_enemies') + self.t:after(4.25, function() self.spawning_enemies = false end, 'spawning_enemies') elseif spawn_type == '4+4+4' then local p = random:table_remove(spawn_points) SpawnMarker{group = self.effects, x = p.x, y = p.y} - self.t:after(0.75, function() + self.t:after(1.125, function() self:spawn_n_enemies(p) self.t:after(1, function() self:spawn_n_enemies(p) @@ -969,58 +969,58 @@ function Arena:spawn_distributed_enemies() end) end) end) - self.t:after(3.5, function() self.spawning_enemies = false end, 'spawning_enemies') + self.t:after(4.25, function() self.spawning_enemies = false end, 'spawning_enemies') elseif spawn_type == '2x4' then self.t:after({0, 0.2}, function() local p = random:table_remove(spawn_points) SpawnMarker{group = self.effects, x = p.x, y = p.y} - self.t:after(0.75, function() self:spawn_n_enemies(p, 1) end) + self.t:after(1.125, function() self:spawn_n_enemies(p, 1) end) end) self.t:after({0, 0.2}, function() local p = random:table_remove(spawn_points) SpawnMarker{group = self.effects, x = p.x, y = p.y} - self.t:after(0.75, function() self:spawn_n_enemies(p, 2) end) + self.t:after(1.125, function() self:spawn_n_enemies(p, 2) end) end) - self.t:after(1.5, function() self.spawning_enemies = false end, 'spawning_enemies') + self.t:after(2.25, function() self.spawning_enemies = false end, 'spawning_enemies') elseif spawn_type == '3x4' then self.t:after({0, 0.2}, function() local p = random:table_remove(spawn_points) SpawnMarker{group = self.effects, x = p.x, y = p.y} - self.t:after(0.75, function() self:spawn_n_enemies(p, 1) end) + self.t:after(1.125, function() self:spawn_n_enemies(p, 1) end) end) self.t:after({0, 0.2}, function() local p = random:table_remove(spawn_points) SpawnMarker{group = self.effects, x = p.x, y = p.y} - self.t:after(0.75, function() self:spawn_n_enemies(p, 2) end) + self.t:after(1.125, function() self:spawn_n_enemies(p, 2) end) end) self.t:after({0, 0.2}, function() local p = random:table_remove(spawn_points) SpawnMarker{group = self.effects, x = p.x, y = p.y} - self.t:after(0.75, function() self:spawn_n_enemies(p, 3) end) + self.t:after(1.125, function() self:spawn_n_enemies(p, 3) end) end) - self.t:after(1.5, function() self.spawning_enemies = false end, 'spawning_enemies') + self.t:after(2.25, function() self.spawning_enemies = false end, 'spawning_enemies') elseif spawn_type == '4x2' then self.t:after({0, 0.2}, function() local p = random:table_remove(spawn_points) SpawnMarker{group = self.effects, x = p.x, y = p.y} - self.t:after(0.75, function() self:spawn_n_enemies(p, 1, 2) end) + self.t:after(1.125, function() self:spawn_n_enemies(p, 1, 2) end) end) self.t:after({0, 0.2}, function() local p = random:table_remove(spawn_points) SpawnMarker{group = self.effects, x = p.x, y = p.y} - self.t:after(0.75, function() self:spawn_n_enemies(p, 2, 2) end) + self.t:after(1.125, function() self:spawn_n_enemies(p, 2, 2) end) end) self.t:after({0, 0.2}, function() local p = random:table_remove(spawn_points) SpawnMarker{group = self.effects, x = p.x, y = p.y} - self.t:after(0.75, function() self:spawn_n_enemies(p, 3, 2) end) + self.t:after(1.125, function() self:spawn_n_enemies(p, 3, 2) end) end) self.t:after({0, 0.2}, function() local p = random:table_remove(spawn_points) SpawnMarker{group = self.effects, x = p.x, y = p.y} - self.t:after(0.75, function() self:spawn_n_enemies(p, 4, 2) end) + self.t:after(1.125, function() self:spawn_n_enemies(p, 4, 2) end) end) - self.t:after(1.5, function() self.spawning_enemies = false end, 'spawning_enemies') + self.t:after(2.25, function() self.spawning_enemies = false end, 'spawning_enemies') end end diff --git a/assets/media/orb_cover.png b/assets/media/orb_cover.png new file mode 100644 index 0000000000000000000000000000000000000000..d0566a50977cbce8cb6b1c682a13747ac8f52307 GIT binary patch literal 6223 zcmb_gdpy(o|6ln!&QZ}hlysqs6uIWiEi>mx7YxTX*BGh9u$YnSN~b!dQpsh8r84=< ztsE20wP4mPvp^8IjrKWEjspYI=g?E3lab$PyC&*%Gj&c$i(3dOaG z5C~+&{(ZY$ArQHZ5Xh1rKK%szL@l8BG5E9u@4EMENJ-mzKKSN8fnOoMf#C5Plm+AB(~#s|mzEGXqB=jw^YNcrRjX}=cwI=n33>@s`Z zW4`i4nbmPSNZxY9x7o7~)N4*=_u4oSGtbrtYr)7HKHCU^*sNLd9|+{rEhoSa{Qt8O z0@-*0vJ?XO_H!Eua30HNWYIZya zLt4=C4M`IC*v;%qT35cLaMg0$|`(| zUFD^6-m!8PV25UnlyhVMO&eP3-HA0$gup?LF8Ww3ez>VJgs+_aY_awRa=+VYDo@8_ zTVYbGR`Lw$&!gtKzw;&F}G;-e}Vre<3Fb@G_uBPA$!<-_OIeA zbEkuW>Z-{%nn|57>SP6G{AD2Vnsq_mNO+Cb8J1GNV_lZQ=uVjxU=&^n zpPCv;(jGtOAz8aaZ2lljW>Gv+)jO{PYdRRF65OQ=dv@gZU>`TKD3AKhimj9+H196^ zjy92NYMq~ox!c5k+k*x&E27BjQ>zYe)-7z2iW!cRrLc~*5s_8dQi5OmT z#DT!;I2lxACfONN{Z`O~{nztKh}NzAyGXLBW1W~SH6g{Y0#XX%!A^7lC@L$Fa_` z&xL&_ilEs3LIfQP+x}5vZ~e-LulEZaI9ObJ36Led>uCf_4|kz+7>yS$>Ud1NzsXN@-kW)~ zEn4kCNq0yE;AQls4EZ_M-N<~Ns^{3awq3QrZ{QNn>M8)@g+K;Sf#;EB)PrE@tKz%+ zU07j3cybiFQMKp;A~X8@m+7eL3gH)eEvE@!okh&dmyyhAY5%fE_P^3-=D;iXY#b3; z=0-!+@mnk0P5U%p5)P`hTVytu3G6(;ON5dlCv511pW2n2>Hxe*lw6?iBWeB$I8#nz z?M@xU6tuj1K2Tnt^O;kluJN$$s5;VJS}yncr4OiE7P(q`WKx01yzl28LKmX+ABWO4 za*8b;v&=9?&<`LMka_3|&cQNq#JjLdU(%oTg*VFHdAgANsY%*7(@;_p$Ctk!2R@5p zd}5t3lnvDJqDWE_^z5+PN5JdYB-vdQUw5r4qj3vmU%H_*&G}xl+K{45snapBRgECk zfLsGEWFj10uU?;iF}ilw6Jc>9v4a&^MD8O3`f?Hv-fhIIDzQzcAp>wAPC}k<-Q_`4U#=IHVFft368nTIb4}ah0q&o)% z-95oK+OW(oOGfM%%O@YCnm28Z*s+(-_n05IZ4^}%i&cQ({Of|&v6Rq*p5Qn4E#+xW zn3`Ko-7F;}e@Q4u#Hccs$7;mO$x5a};Bw4&zZLK0!d%mSglxxIO9ld-a69fbE_sBI z1woyd*x9XGG{Cf~Z}2@g!YQysD^fDuL%1`XU; z&%TqnQwBNUkgh?NojI)7UIy;>4Dp$GvJ*eZ32e-c3<`J6CH(S6wp&jP{DqKCr&@1l z`DjKV%a4@X@j~pXiC*l^q(YMo$vP{4O>&;WjOBOiNo_JGWQD|$npKM|Z4r$-dtG|+qxdYAar!z+Ur;>$a!R9oXBm1082Q?A!eH=sDXVg-YR=Q-Rlu1%+|jsFLX2CMm5Qw>SDObt^SX3b+v{~HR9&~!xT@mnxVg!*lv@H}yn?impC9KO zln>u!r1S+S_ZB6*ksLWx9lh*CEV;_}`(z<`n}uxvcKCU%$V`5IAj>?8oSj_J zzO!508(HvlApE|xE3Qy?)c)158zS*g(Zg#DgYNZVlV92i#*|c|>_gZ`<9uz`6Ek{U zqzc2;Ry+2x5>3!Ok^B`P5*$W{2F>49hxv>QSSG-3N+OG*AmcX$1J7gjbmT6CulF9N3v}%?qtr*~T6jhNXs(7Z}R{=MSJww}(BugEqtPA{B zWk%FT7Q53>D|k+?&RGPQ&^6TJ&@1-1#_b8d8L-(eYVwB5eWjl2 zfLKWI%};^D+osFwORSR#Z=#rp3$M!M2KFys3@l*T>V^vv?2E#X*0tT~fC05bQ`)6r zOdnPXWzj}oQzlj?GhwbGqUHxBRqruJbe8O#um#;}HI~{}aK13h9%mjq z`3eQa&otILa2OReVYxvO*1P^p;=jc!w&#LtDz?IY)eG_2n+2NoXcO+-zzoV5jpVPW z^m4*iA5mrO2Mn2!G(YbEDtH+-KHY4Rdm2`W!(b5RMUTFYa<6JvG7$GderVjoEa zR6h|RMNBYM=74tvCCU4MP>JRd=OUsnb`Gal7ay=yuQ&ekie_Ms;D$gng0Uqx!>m^! z8Mz5PDG4=BB@eMbl&E~Tt_I^JT3OoOn=Vm^dg#^{h-yCe2Eux58)Yce0=@U~S3;_U>-3A?z7-xIagm*M0bFm!84OsxU-}Cli)0iu1*T`{j+GUmVgMSQ4h_ zhGB)3l)f&Ciy|M5o52=*%MqTj3>~FB7f=b|7W2IS5JdK(Q?UF{`RSiR(p;n>yri$0 zt4cb`MkLORb26ACrPG9Qs42Sfo@YW~>~QN(5x~ey>(Y^}Cl)8;Nf4xSd7S|JRf#~O zbAaQ0kIcbgTYqKc~$|KcMSOqGyxv!=8Y~5?+vC2pbI;}99MxBtm$3j>K493m7n<*j# z_^}Rd%z!vVeG*U$o$@c)@vcR+m?f3fQTe^||q zjyPnGs{@d+o1( zm|{+Qr$dKyiv_sc1$=&o_Tu!dk4RfBsWjLDe`G-W9;l5W&13yIiIV|vt#N5?A~XG# zYNF(mUwyW81;go(37>t2j&+*@ugY7@_rCR>w1z{H~A59#t(;N!9D{8fp3K9+?ay{bTDi{jA}1WR9S1UIe}rzUfNE zbw1ZLzxn^B?fZwgztP#hSU5f9S}}XU5&PxL-=#O0ZurMt`hz8+kq7&k4s V{`tf6sbGa5`|X@|mwfG)^j{6ch#dd` literal 0 HcmV?d00001 diff --git a/buy_screen.lua b/buy_screen.lua index f6d5402..b0f373e 100644 --- a/buy_screen.lua +++ b/buy_screen.lua @@ -67,7 +67,7 @@ function BuyScreen:on_enter(from, level, units, passives, shop_level, shop_xp) self:set_items() self.shop_text = Text({{text = '[wavy_mid, fg]shop [fg]- gold: [yellow]' .. gold, font = pixul_font, alignment = 'center'}}, global_text_tags) - self.party_text = Text({{text = '[wavy_mid, fg]party', font = pixul_font, alignment = 'center'}}, global_text_tags) + self.party_text = Text({{text = '[wavy_mid, fg]party ' .. tostring(#units) .. '/' .. tostring(max_units), font = pixul_font, alignment = 'center'}}, global_text_tags) self.sets_text = Text({{text = '[wavy_mid, fg]classes', font = pixul_font, alignment = 'center'}}, global_text_tags) self.items_text = Text({{text = '[wavy_mid, fg]items', font = pixul_font, alignment = 'center'}}, global_text_tags) self.ng_text = Text({{text = '[fg]NG+' .. current_new_game_plus, font = pixul_font, alignment = 'center'}}, global_text_tags) @@ -81,7 +81,7 @@ function BuyScreen:on_enter(from, level, units, passives, shop_level, shop_xp) RerollButton{group = self.main, x = 150, y = 18, parent = self} GoButton{group = self.main, x = gw - 90, y = gh - 20, parent = self} LevelButton{group = self.main, x = gw/2, y = 18, parent = self} - self.tutorial_button = Button{group = self.main, x = gw/2 + 134, y = 18, button_text = '?', fg_color = 'bg10', bg_color = 'bg', action = function() + self.tutorial_button = Button{group = self.main, x = gw/2 + 129, y = 18, button_text = '?', fg_color = 'bg10', bg_color = 'bg', action = function() self.in_tutorial = true self.title_text = Text2{group = self.tutorial, x = gw/2, y = 35, lines = {{text = '[fg]WELCOME TO SNKRX!', font = fat_font, alignment = 'center'}}} self.tutorial_text = Text2{group = self.tutorial, x = 228, y = 160, lines = { @@ -128,7 +128,7 @@ function BuyScreen:on_enter(from, level, units, passives, shop_level, shop_xp) b.info_text = nil end} - self.restart_button = Button{group = self.ui, x = gw/2 + 156, y = 18, force_update = true, button_text = 'R', fg_color = 'bg10', bg_color = 'bg', action = function(b) + self.restart_button = Button{group = self.ui, x = gw/2 + 148, y = 18, force_update = true, button_text = 'R', fg_color = 'bg10', bg_color = 'bg', action = function(b) self.transitioning = true ui_transition2:play{pitch = random:float(0.95, 1.05), volume = 0.5} ui_switch2:play{pitch = random:float(0.95, 1.05), volume = 0.5} @@ -933,7 +933,7 @@ function RerollButton:init(args) 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]8', font = pixul_font, alignment = 'center'}}, global_text_tags) + self.text = Text({{text = '[bg10]reroll: [yellow]5', font = pixul_font, alignment = 'center'}}, global_text_tags) end end end @@ -966,7 +966,7 @@ function RerollButton:update(dt) system.save_run(self.parent.level, gold, self.parent.units, self.parent.passives, self.parent.shop_level, self.parent.shop_xp, run_passive_pool, locked_state) end elseif self.parent:is(Arena) then - if gold < 8 and not self.free_reroll then + if gold < 5 and not self.free_reroll then self.spring:pull(0.2, 200, 10) self.selected = true error1:play{pitch = random:float(0.95, 1.05), volume = 0.5} @@ -983,10 +983,10 @@ function RerollButton:update(dt) self.parent:set_passives(true) self.selected = true self.spring:pull(0.2, 200, 10) - if not self.free_reroll then gold = gold - 8 end + if not self.free_reroll then gold = gold - 5 end 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]8', font = pixul_font, alignment = 'center'}}, global_text_tags) + self.text = Text({{text = '[bg10]reroll: [yellow]5', font = pixul_font, alignment = 'center'}}, global_text_tags) end end end @@ -1015,7 +1015,7 @@ function RerollButton:on_mouse_enter() 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: 8', font = pixul_font, alignment = 'center'}} + self.text:set_text{{text = '[fgm5]reroll: 5', font = pixul_font, alignment = 'center'}} end end self.spring:pull(0.2, 200, 10) @@ -1029,7 +1029,7 @@ function RerollButton:on_mouse_exit() 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]8', font = pixul_font, alignment = 'center'}} + self.text:set_text{{text = '[fgm5]reroll: [yellow]5', font = pixul_font, alignment = 'center'}} end end self.selected = false @@ -1696,7 +1696,10 @@ function CharacterIcon:on_mouse_enter() self.info_text:activate({ {text = '[' .. character_color_strings[self.character] .. ']' .. self.character:capitalize() .. '[fg] - cost: [yellow]' .. self.parent.cost, font = pixul_font, alignment = 'center', height_multiplier = 1.25}, {text = '[fg]Classes: ' .. character_class_strings[self.character], font = pixul_font, alignment = 'center', height_multiplier = 1.25}, - {text = character_descriptions[self.character](1), font = pixul_font, alignment = 'center'}, + {text = character_descriptions[self.character](1), font = pixul_font, alignment = 'center', height_multiplier = 2}, + {text = '[' .. (self.level == 3 and 'yellow' or 'light_bg') .. ']Lv.3 [' .. (self.level == 3 and 'fg' or 'light_bg') .. ']Effect - ' .. + (self.level == 3 and character_effect_names[self.character] or character_effect_names_gray[self.character]), font = pixul_font, alignment = 'center', height_multiplier = 1.25}, + {text = (self.level == 3 and character_effect_descriptions[self.character]() or character_effect_descriptions_gray[self.character]()), font = pixul_font, alignment = 'center'}, -- {text = character_stats[self.character](1), font = pixul_font, alignment = 'center'}, }, nil, nil, nil, nil, 16, 4, nil, 2) self.info_text.x, self.info_text.y = gw/2, gh/2 + 10 diff --git a/enemies.lua b/enemies.lua index cd9e10b..861e187 100644 --- a/enemies.lua +++ b/enemies.lua @@ -16,7 +16,7 @@ function Seeker:init(args) if self.boss == 'speed_booster' then self.color = green[0]:clone() self.t:every(8, function() - if self.silenced then return end + if self.silenced or self.barbarian_stunned then return end local enemies = table.head(self:get_objects_in_shape(Circle(self.x, self.y, 128), main.current.enemies), 4) if #enemies > 0 then buff1:play{pitch = random:float(0.95, 1.05), volume = 0.5} @@ -31,7 +31,7 @@ function Seeker:init(args) elseif self.boss == 'forcer' then self.color = yellow[0]:clone() self.t:every(6, function() - if self.silenced then return end + if self.silenced or self.barbarian_stunned then return end local enemies = main.current.main:get_objects_by_classes(main.current.enemies) local x, y = 0, 0 if #enemies > 0 then @@ -78,7 +78,7 @@ function Seeker:init(args) elseif self.boss == 'swarmer' then self.color = purple[0]:clone() self.t:every(4, function() - if self.silenced then return end + if self.silenced or self.barbarian_stunned then return end local enemies = table.select(main.current.main:get_objects_by_classes(main.current.enemies), function(v) return v.id ~= self.id and v:is(Seeker) end) local enemy = random:table(enemies) if enemy then @@ -94,23 +94,22 @@ function Seeker:init(args) elseif self.boss == 'exploder' then self.color = blue[0]:clone() self.t:every(4, function() - if self.silenced then return end + if self.silenced or self.barbarian_stunned then return end local enemies = table.select(main.current.main:get_objects_by_classes(main.current.enemies), function(v) return v.id ~= self.id and v:is(Seeker) end) local enemy = random:table(enemies) if enemy then HitCircle{group = main.current.effects, x = self.x, y = self.y, rs = 6, color = blue[0], duration = 0.1} LightningLine{group = main.current.effects, src = self, dst = enemy, color = blue[0]} enemy:hit(10000) - shoot1:play{pitch = random:float(0.95, 1.05), volume = 0.4} - local n = math.floor(8 + current_new_game_plus*1.5) - for i = 1, n do EnemyProjectile{group = main.current.main, x = enemy.x, y = enemy.y, color = blue[0], r = (i-1)*math.pi/(n/2), v = 120 + 5*enemy.level, dmg = (1 + 0.1*current_new_game_plus)*enemy.dmg} end + mine1:play{pitch = random:float(0.95, 1.05), volume = 0.5} + ExploderMine{group = main.current.main, x = enemy.x, y = enemy.y, color = blue[0], parent = enemy} end end) elseif self.boss == 'randomizer' then self.t:every_immediate(0.07, function() self.color = _G[random:table{'green', 'purple', 'yellow', 'blue'}][0]:clone() end) self.t:every(6, function() - if self.silenced then return end + if self.silenced or self.barbarian_stunned then return end local attack = random:table{'explode', 'swarm', 'force', 'speed_boost'} if attack == 'explode' then local enemies = self:get_objects_in_shape(Circle(self.x, self.y, 128), {Seeker}) @@ -121,7 +120,7 @@ function Seeker:init(args) enemy:hit(10000) shoot1:play{pitch = random:float(0.95, 1.05), volume = 0.4} local n = 8 + current_new_game_plus*2 - for i = 1, n do EnemyProjectile{group = main.current.main, x = enemy.x, y = enemy.y, color = blue[0], r = (i-1)*math.pi/(n/2), v = 125 + 5*enemy.level, dmg = (1 + 0.2*current_new_game_plus)*enemy.dmg} end + for i = 1, n do EnemyProjectile{group = main.current.main, x = enemy.x, y = enemy.y, color = blue[0], r = (i-1)*math.pi/(n/2), v = 125 + 5*enemy.level, dmg = (1 + 0.15*current_new_game_plus)*enemy.dmg} end end elseif attack == 'swarm' then local enemies = self:get_objects_in_shape(Circle(self.x, self.y, 128), {Seeker}) @@ -189,7 +188,7 @@ function Seeker:init(args) self.last_headbutt_time = 0 local n = math.remap(current_new_game_plus, 0, 5, 1, 0.5) self.t:every(function() return math.distance(self.x, self.y, main.current.player.x, main.current.player.y) < 76 and love.timer.getTime() - self.last_headbutt_time > 10*n end, function() - if self.silenced then return end + if self.silenced or self.barbarian_stunned then return end if self.headbutt_charging or self.headbutting then return end self.headbutt_charging = true self.t:tween(2, self.color, {r = fg[0].r, b = fg[0].b, g = fg[0].g}, math.cubic_in_out, function() @@ -212,12 +211,12 @@ function Seeker:init(args) self.hp = self.max_hp local n = math.remap(current_new_game_plus, 0, 5, 1, 0.75) self.t:every({3*n, 5*n}, function() - local enemy = self:get_closest_object_in_shape(Circle(self.x, self.y, 128), main.current.enemies) + local enemy = self:get_closest_object_in_shape(Circle(self.x, self.y, 64), main.current.enemies) if enemy then wizard1:play{pitch = random:float(0.95, 1.05), volume = 0.5} HitCircle{group = main.current.effects, x = self.x, y = self.y, rs = 6, color = yellow[0], duration = 0.1} LightningLine{group = main.current.effects, src = self, dst = enemy, color = yellow[0]} - enemy:push(random:float(40, 80), enemy:angle_to_object(main.current.player), true) + enemy:push(random:float(30, 50), enemy:angle_to_object(main.current.player), true) end end) elseif self.shooter then @@ -226,7 +225,7 @@ function Seeker:init(args) self.t:after({2*n, 4*n}, function() self.shooting = true self.t:every({4, 6}, function() - if self.silenced then return end + if self.silenced or self.barbarian_stunned then return end for i = 1, 3 do self.t:after((1 - self.level*0.01)*0.15*(i-1), function() shoot1:play{pitch = random:float(0.95, 1.05), volume = 0.1} @@ -234,7 +233,7 @@ function Seeker:init(args) local r = self.r HitCircle{group = main.current.effects, x = self.x + 0.8*self.shape.w*math.cos(r), y = self.y + 0.8*self.shape.w*math.sin(r), rs = 6} EnemyProjectile{group = main.current.main, x = self.x + 1.6*self.shape.w*math.cos(r), y = self.y + 1.6*self.shape.w*math.sin(r), color = fg[0], r = r, v = 140 + 3.5*self.level + 2*current_new_game_plus, - dmg = (current_new_game_plus*0.1 + 1)*self.dmg, source = 'shooter'} + dmg = (current_new_game_plus*0.05 + 1)*self.dmg, source = 'shooter'} end) end end, nil, nil, 'shooter') @@ -498,7 +497,7 @@ function Seeker:hit(damage, projectile, dot) end if self.speed_booster then - if self.silenced then return end + if self.silenced or self.barbarian_stunned then return end local enemies = self:get_objects_in_shape(self.area_sensor, main.current.enemies) if #enemies > 0 then buff1:play{pitch = random:float(0.95, 1.05), volume = 0.5} @@ -511,7 +510,7 @@ function Seeker:hit(damage, projectile, dot) end if self.exploder then - if self.silenced then return end + if self.silenced or self.barbarian_stunned then return end mine1:play{pitch = random:float(0.95, 1.05), volume = 0.5} trigger:after(0.01, function() ExploderMine{group = main.current.main, x = self.x, y = self.y, color = blue[0], parent = self} @@ -519,7 +518,7 @@ function Seeker:hit(damage, projectile, dot) end if self.spawner then - if self.silenced then return end + if self.silenced or self.barbarian_stunned then return end critter1:play{pitch = random:float(0.95, 1.05), volume = 0.35} trigger:after(0.01, function() for i = 1, random:int(5, 8) do @@ -609,11 +608,6 @@ end function Seeker:curse(curse, duration, arg1, arg2, arg3) - local curse_m = 1 - if main.current.curser_level == 2 then curse_m = 1.5 - elseif main.current.curser_level == 1 then curse_m = 1.25 - else curse_m = 1 end - if main.current.player.whispers_of_doom then if not self.doom then self.doom = 0 end self.doom = self.doom + 1 @@ -633,7 +627,7 @@ function Seeker:curse(curse, duration, arg1, arg2, arg3) buff1:play{pitch = random:float(0.65, 0.75), volume = 0.25} if curse == 'launcher' then - self.t:after(duration*curse_m, function() + self.t:after(duration, function() self.launcher_push = arg1 self.launcher = arg2 self:push(random:float(50, 75)*self.launcher.knockback_m, random:table{0, math.pi, math.pi/2, -math.pi/2}) @@ -642,20 +636,20 @@ function Seeker:curse(curse, duration, arg1, arg2, arg3) self.jester_cursed = true self.jester_lvl3 = arg1 self.jester_ref = arg2 - self.t:after(duration*curse_m, function() self.jester_cursed = false end, 'jester_curse') + self.t:after(duration, function() self.jester_cursed = false end, 'jester_curse') elseif curse == 'bane' then self.bane_cursed = true self.bane_lvl3 = arg1 self.bane_ref = arg2 - self.t:after(duration*curse_m, function() self.bane_cursed = false end, 'bane_curse') + self.t:after(duration, function() self.bane_cursed = false end, 'bane_curse') elseif curse == 'infestor' then self.infested = arg1 self.infested_dmg = arg2 self.infested_ref = arg3 - self.t:after(duration*curse_m, function() self.infested = false end, 'infestor_curse') + self.t:after(duration, function() self.infested = false end, 'infestor_curse') elseif curse == 'silencer' then self.silenced = true - self.t:after(duration*curse_m, function() self.silenced = false end, 'silencer_curse') + self.t:after(duration, function() self.silenced = false end, 'silencer_curse') elseif curse == 'usurer' then if arg1 then self.usurer_count = self.usurer_count + 1 @@ -703,13 +697,11 @@ function ExploderMine:init(args) HitCircle{group = main.current.effects, x = self.x, y = self.y} local n = math.floor(8 + current_new_game_plus*1.5) for i = 1, n do - EnemyProjectile{group = main.current.main, x = self.x, y = self.y, color = blue[0], r = (i-1)*math.pi/(n/2), v = 120 + 5*self.parent.level, dmg = 1.5*self.parent.dmg} + EnemyProjectile{group = main.current.main, x = self.x, y = self.y, color = blue[0], r = (i-1)*math.pi/(n/2), v = 120 + 5*self.parent.level, dmg = 1.3*self.parent.dmg} end self.dead = true end, 'mine_count') end) - --[[ - ]]-- end @@ -856,11 +848,6 @@ end function EnemyCritter:curse(curse, duration, arg1, arg2, arg3) - local curse_m = 1 - if main.current.curser_level == 2 then curse_m = 1.5 - elseif main.current.curser_level == 1 then curse_m = 1.25 - else curse_m = 1 end - if main.current.player.whispers_of_doom then if not self.doom then self.doom = 0 end self.doom = self.doom + 1 @@ -873,7 +860,7 @@ function EnemyCritter:curse(curse, duration, arg1, arg2, arg3) end if curse == 'launcher' then - self.t:after(duration*curse_m, function() + self.t:after(duration, function() self.launcher_push = arg1 self.launcher = arg2 self:push(random:float(50, 75)*self.launcher.knockback_m, random:table{0, math.pi, math.pi/2, -math.pi/2}) @@ -882,20 +869,20 @@ function EnemyCritter:curse(curse, duration, arg1, arg2, arg3) self.jester_cursed = true self.jester_lvl3 = arg1 self.jester_ref = arg2 - self.t:after(duration*curse_m, function() self.jester_cursed = false end, 'jester_curse') + self.t:after(duration, function() self.jester_cursed = false end, 'jester_curse') elseif curse == 'bane' then self.bane_cursed = true self.bane_lvl3 = arg1 self.bane_ref = arg2 - self.t:after(duration*curse_m, function() self.bane_cursed = false end, 'bane_curse') + self.t:after(duration, function() self.bane_cursed = false end, 'bane_curse') elseif curse == 'infestor' then self.infested = arg1 self.infested_dmg = arg2 self.infested_ref = arg3 - self.t:after(duration*curse_m, function() self.infested = false end, 'infestor_curse') + self.t:after(duration, function() self.infested = false end, 'infestor_curse') elseif curse == 'silencer' then self.silenced = true - self.t:after(duration*curse_m, function() self.silenced = false end, 'silencer_curse') + self.t:after(duration, function() self.silenced = false end, 'silencer_curse') elseif curse == 'usurer' then if arg1 then self.usurer_count = self.usurer_count + 1 diff --git a/main.lua b/main.lua index cb9a782..c286248 100644 --- a/main.lua +++ b/main.lua @@ -943,7 +943,7 @@ function init() ['nuker'] = function(lvl) return '[' .. ylb1(lvl) .. ']3[light_bg]/[' .. ylb2(lvl) .. ']6 [fg]- [' .. ylb1(lvl) .. ']+15%[light_bg]/[' .. ylb2(lvl) .. ']+25% [fg]area damage and size to allied nukers' end, ['conjurer'] = function(lvl) return '[' .. ylb1(lvl) .. ']2[light_bg]/[' .. ylb2(lvl) .. ']4 [fg]- [' .. ylb1(lvl) .. ']+25%[light_bg]/[' .. ylb2(lvl) .. ']+50% [fg]summon damage and duration' end, ['psyker'] = function(lvl) return '[fg]create a piercing, damaging orb around each psyker' end, - ['curser'] = function(lvl) return '[' .. ylb1(lvl) .. ']2[light_bg]/[' .. ylb2(lvl) .. ']4 [fg]- [' .. ylb1(lvl) .. ']+25%[light_bg]/[' .. ylb2(lvl) .. ']+50% [fg]curse duration' end, + ['curser'] = function(lvl) return '[' .. ylb1(lvl) .. ']2[light_bg]/[' .. ylb2(lvl) .. ']4 [fg]- [' .. ylb1(lvl) .. ']+1[light_bg]/[' .. ylb2(lvl) .. ']+3 [fg]max curse targets to allied cursers' end, ['forcer'] = function(lvl) return '[' .. ylb1(lvl) .. ']2[light_bg]/[' .. ylb2(lvl) .. ']4 [fg]- [' .. ylb1(lvl) .. ']+25%[light_bg]/[' .. ylb2(lvl) .. ']+50% [fg]knockback force to all allies' end, ['swarmer'] = function(lvl) return '[' .. ylb1(lvl) .. ']2[light_bg]/[' .. ylb2(lvl) .. ']4 [fg]- [' .. ylb1(lvl) .. ']+1[light_bg]/[' .. ylb2(lvl) .. ']+3 [fg]hits to critters' end, ['voider'] = function(lvl) return '[' .. ylb1(lvl) .. ']2[light_bg]/[' .. ylb2(lvl) .. ']4 [fg]- [' .. ylb1(lvl) .. ']+20%[light_bg]/[' .. ylb2(lvl) .. ']+40% [fg]damage over time to allied voiders' end, @@ -1246,13 +1246,13 @@ function init() ['magnify'] = '[yellow]+20/35/50%[fg] area size', ['echo_barrage'] = '[yellow]10/20/30%[fg] chance to create [yellow]1/2/3[fg] secondary AoEs on AoE hit', ['unleash'] = '[fg]all nukers gain [yellow]+1%[fg] area size and damage every second', - ['reinforce'] = '[yellow]+10/20/30%[fg] damage, defense and aspd to all allies if you have >=1 enchanter', + ['reinforce'] = '[yellow]+10/20/30%[fg] global damage, defense and aspd if you have one or more enchanters', ['payback'] = '[yellow]+2/5/8%[fg] damage to all allies whenever an enchanter is hit', - ['enchanted'] = '[yellow]+33/66/99%[fg] attack speed to a random unit if you have >=2 enchanters', + ['enchanted'] = '[yellow]+33/66/99%[fg] attack speed to a random unit if you have two or more enchanters', ['freezing_field'] = '[fg]creates an area that slows enemies by [yellow]50%[fg] for [yellow]2[fg] seconds on sorcerer spell repeat', ['burning_field'] = '[fg]creates an area that deals [yellow]30[fg] dps for [yellow]2[fg] seconds on sorcerer spell repeat', ['gravity_field'] = '[fg]creates an area that pulls enemies in for [yellow]1[fg] seconds on sorcerer spell repeat', - ['magnetism'] = '[fg]gold coins are attracted to the snake', + ['magnetism'] = '[fg]gold coins and healing orbs are attracted to the snake', ['insurance'] = "[fg]heroes have [yellow]4[fg] times the chance of mercenary's bonus to drop [yellow]2[fg] gold on death", ['dividends'] = '[fg]mercenaries deal [yellow]+X%[fg] damage, where X is how much gold you have', ['berserking'] = '[fg]all warriors have up to [yellow]+50/75/100%[fg] attack speed based on missing HP', @@ -1265,7 +1265,7 @@ function init() ['psyker_orbs'] = '[yellow]+1/2/3[fg] psyker orbs', ['psychosense'] = '[yellow]+33/66/99%[fg] orb range', ['rearm'] = '[fg]summons repeat their attacks once', - ['taunt'] = '[yellow]10/20/30% chance for summons to taunt nearby enemies on attack', + ['taunt'] = '[yellow]10/20/30%[fg] chance for summons to taunt nearby enemies on attack', ['summon_instability'] = '[fg]summons explode when disappearing, dealing [yellow]100/150/200%[fg] damage', } @@ -1313,13 +1313,13 @@ function init() ['magnify'] = function(lvl) return ts(lvl, '+20%', '35%', '50%') .. ' area size' end, ['echo_barrage'] = function(lvl) return ts(lvl, '10%', '20%', '30%') .. ' chance to create ' .. ts(lvl, '1', '2', '3') .. ' secondary AoEs on AoE hit' end, ['unleash'] = function(lvl) return '[fg]all nukers gain [yellow]+1%[fg] area size and damage every second' end, - ['reinforce'] = function(lvl) return ts(lvl, '+10%', '20%', '30%') .. ' damage, defense and aspd to all allies if you have >=1 enchanter' end, + ['reinforce'] = function(lvl) return ts(lvl, '+10%', '20%', '30%') .. ' global damage, defense and aspd if you have one or more enchanters' end, ['payback'] = function(lvl) return ts(lvl, '+2%', '5%', '8%') .. ' damage to all allies whenever an enchanter is hit' end, - ['enchanted'] = function(lvl) return ts(lvl, '+33%', '66%', '99%') .. ' attack speed to a random unit if you have >=2 enchanters' end, + ['enchanted'] = function(lvl) return ts(lvl, '+33%', '66%', '99%') .. ' attack speed to a random unit if you have two or more enchanters' end, ['freezing_field'] = function(lvl) return '[fg]creates an area that slows enemies by [yellow]50%[fg] for [yellow]2[fg] seconds on sorcerer spell repeat' end, ['burning_field'] = function(lvl) return '[fg]creates an area that deals [yellow]30[fg] dps for [yellow]2[fg] seconds on sorcerer spell repeat' end, ['gravity_field'] = function(lvl) return '[fg]creates an area that pulls enemies in for [yellow]1[fg] seconds on sorcerer spell repeat' end, - ['magnetism'] = function(lvl) return '[fg]gold coins are attracted to the snake' end, + ['magnetism'] = function(lvl) return '[fg]gold coins and healing orbs are attracted to the snake' end, ['insurance'] = function(lvl) return "[fg]heroes have [yellow]4[fg] times the chance of mercenary's bonus to drop [yellow]2[fg] gold on death" end, ['dividends'] = function(lvl) return '[fg]mercenaries deal [yellow]+X%[fg] damage, where X is how much gold you have' end, ['berserking'] = function(lvl) return '[fg]all warriors have up to ' .. ts(lvl, '+50%', '75%', '100%') .. ' attack speed based on missing HP' end, @@ -1365,15 +1365,15 @@ function init() } level_to_gold_gained = { - [1] = {2, 2}, - [2] = {2, 2}, - [3] = {4, 6}, - [4] = {3, 5}, - [5] = {4, 7}, - [6] = {6, 10}, + [1] = {3, 3}, + [2] = {3, 3}, + [3] = {5, 6}, + [4] = {4, 5}, + [5] = {5, 8}, + [6] = {8, 10}, [7] = {8, 10}, - [8] = {10, 12}, - [9] = {12, 15}, + [8] = {12, 14}, + [9] = {14, 18}, [10] = {10, 13}, [11] = {12, 15}, [12] = {18, 20}, @@ -1412,11 +1412,11 @@ function init() [17] = {6, 5, 4, 3}, [18] = {18}, [19] = {10, 6}, - [20] = {10, 6, 2}, - [21] = {28}, - [22] = {10, 10, 5}, + [20] = {8, 6, 2}, + [21] = {22}, + [22] = {10, 8, 4}, [23] = {20, 5, 5}, - [24] = {35}, + [24] = {30}, [25] = {5, 5, 5, 5, 5, 5}, } diff --git a/media.lua b/media.lua index 4948673..2b113d9 100644 --- a/media.lua +++ b/media.lua @@ -14,7 +14,7 @@ function Media:on_enter(from) graphics.set_background_color(blue[0]) Text2{group = self.ui, x = gw/2, y = gh/2, lines = { {text = '[fg]SNKRX', font = fat_font, alignment = 'center', height_offset = -15}, - {text = '[fg]item update', font = pixul_font, alignment = 'center'}, + {text = '[fg]orb update', font = pixul_font, alignment = 'center'}, }} end diff --git a/objects.lua b/objects.lua index 81b45ed..880ccf3 100644 --- a/objects.lua +++ b/objects.lua @@ -5,11 +5,11 @@ function SpawnMarker:init(args) self.color = red[0] self.r = random:float(0, 2*math.pi) self.spring:pull(random:float(0.4, 0.6), 200, 10) - self.t:after(0.75, function() self.dead = true end) + self.t:after(1.125, function() self.dead = true end) self.m = 1 self.n = 0 pop3:play{pitch = 1, volume = 0.15} - self.t:every({0.13, 0.16}, function() + self.t:every({0.195, 0.24}, function() self.hidden = not self.hidden self.m = self.m*random:float(0.84, 0.87) end, nil, nil, 'blink') @@ -262,7 +262,7 @@ function Unit:calculate_stats(first_run) 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} 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*1)*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] end end diff --git a/player.lua b/player.lua index 2d32abe..e676228 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.8)} + gambler1:play{pitch = pitch_a, volume = math.remap(gold, 0, 50, 0, 0.5)} enemy:hit(2*gold) if main.current.sorcerer_level > 0 then self.sorcerer_count = self.sorcerer_count + 1 @@ -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.8)} + gambler1:play{pitch = pitch_a + 0.05, volume = math.remap(gold, 0, 50, 0, 0.5)} enemy:hit(2*gold) end end) @@ -536,7 +536,8 @@ function Player:init(args) self.wide_attack_sensor = Circle(self.x, self.y, 128) self.t:cooldown(6, function() local enemies = self:get_objects_in_shape(self.attack_sensor, main.current.enemies); return enemies and #enemies > 0 end, function() buff1:play{pitch = random:float(0.9, 1.1), volume = 0.5} - local enemies = table.first2(table.shuffle(self:get_objects_in_shape(self.wide_attack_sensor, main.current.enemies)), 6 + ((self.malediction == 1 and 1) or (self.malediction == 2 and 3) or (self.malediction == 3 and 5) or 0)) + local enemies = table.first2(table.shuffle(self:get_objects_in_shape(self.wide_attack_sensor, main.current.enemies)), + 6 + ((self.malediction == 1 and 1) or (self.malediction == 2 and 3) or (self.malediction == 3 and 5) or 0) + ((main.current.curser_level == 2 and 3) or (main.current.curser_level == 1 and 1) or 0)) for _, enemy in ipairs(enemies) do if self:distance_to_object(enemy) < 128 then enemy:curse('jester', 6*(self.hex_duration_m or 1), self.level == 3, self) @@ -551,7 +552,8 @@ function Player:init(args) self.wide_attack_sensor = Circle(self.x, self.y, 128) self.t:cooldown(6, function() local enemies = self:get_objects_in_shape(self.attack_sensor, main.current.enemies); return enemies and #enemies > 0 end, function() buff1:play{pitch = random:float(0.9, 1.1), volume = 0.5} - local enemies = table.first2(table.shuffle(self:get_objects_in_shape(self.wide_attack_sensor, main.current.enemies)), 3 + ((self.malediction == 1 and 1) or (self.malediction == 2 and 3) or (self.malediction == 3 and 5) or 0)) + local enemies = table.first2(table.shuffle(self:get_objects_in_shape(self.wide_attack_sensor, main.current.enemies)), + 3 + ((self.malediction == 1 and 1) or (self.malediction == 2 and 3) or (self.malediction == 3 and 5) or 0) + ((main.current.curser_level == 2 and 3) or (main.current.curser_level == 1 and 1) or 0)) for _, enemy in ipairs(enemies) do enemy:curse('usurer', 10000, self.level == 3, self) enemy:apply_dot(self.dmg*(self.dot_dmg_m or 1)*(main.current.chronomancer_dot or 1), 10000) @@ -567,15 +569,12 @@ function Player:init(args) self.t:cooldown(6, function() local enemies = self:get_objects_in_shape(self.attack_sensor, main.current.enemies); return enemies and #enemies > 0 end, function() local curse = function() buff1:play{pitch = random:float(0.9, 1.1), volume = 0.5} - local enemies = table.first2(table.shuffle(self:get_objects_in_shape(self.wide_attack_sensor, main.current.enemies)), 6 + ((self.malediction == 1 and 1) or (self.malediction == 2 and 3) or (self.malediction == 3 and 5) or 0)) + local enemies = table.first2(table.shuffle(self:get_objects_in_shape(self.wide_attack_sensor, main.current.enemies)), + 6 + ((self.malediction == 1 and 1) or (self.malediction == 2 and 3) or (self.malediction == 3 and 5) or 0) + ((main.current.curser_level == 2 and 3) or (main.current.curser_level == 1 and 1) or 0)) for _, enemy in ipairs(enemies) do enemy:curse('silencer', 6*(self.hex_duration_m or 1), self.level == 3, self) if self.level == 3 then - local curse_m = 1 - if main.current.curser_level == 2 then curse_m = 1.5 - elseif main.current.curser_level == 1 then curse_m = 1.25 - else curse_m = 1 end - enemy:apply_dot(self.dmg*(self.dot_dmg_m or 1)*(main.current.chronomancer_dot or 1), 6*(self.hex_duration_m or 1)*(curse_m or 1)) + enemy:apply_dot(self.dmg*(self.dot_dmg_m or 1)*(main.current.chronomancer_dot or 1), 6*(self.hex_duration_m or 1)) end HitCircle{group = main.current.effects, x = self.x, y = self.y, rs = 6, color = blue2[0], duration = 0.1} LightningLine{group = main.current.effects, src = self, dst = enemy, color = blue2[0]} @@ -628,7 +627,8 @@ function Player:init(args) self.wide_attack_sensor = Circle(self.x, self.y, 128) self.t:cooldown(6, function() local enemies = self:get_objects_in_shape(self.attack_sensor, main.current.enemies); return enemies and #enemies > 0 end, function() buff1:play{pitch = random:float(0.9, 1.1), volume = 0.5} - local enemies = table.first2(table.shuffle(self:get_objects_in_shape(self.wide_attack_sensor, main.current.enemies)), 6 + ((self.malediction == 1 and 1) or (self.malediction == 2 and 3) or (self.malediction == 3 and 5) or 0)) + local enemies = table.first2(table.shuffle(self:get_objects_in_shape(self.wide_attack_sensor, main.current.enemies)), + 6 + ((self.malediction == 1 and 1) or (self.malediction == 2 and 3) or (self.malediction == 3 and 5) or 0) + ((main.current.curser_level == 2 and 3) or (main.current.curser_level == 1 and 1) or 0)) for _, enemy in ipairs(enemies) do enemy:curse('bane', 6*(self.hex_duration_m or 1), self.level == 3, self) HitCircle{group = main.current.effects, x = self.x, y = self.y, rs = 6, color = purple[0], duration = 0.1} @@ -828,7 +828,8 @@ function Player:init(args) self.wide_attack_sensor = Circle(self.x, self.y, 128) self.t:cooldown(6, function() local enemies = self:get_objects_in_shape(self.attack_sensor, main.current.enemies); return enemies and #enemies > 0 end, function() buff1:play{pitch = random:float(0.9, 1.1), volume = 0.5} - local enemies = table.first2(table.shuffle(self:get_objects_in_shape(self.wide_attack_sensor, main.current.enemies)), 8 + ((self.malediction == 1 and 1) or (self.malediction == 2 and 3) or (self.malediction == 3 and 5) or 0)) + local enemies = table.first2(table.shuffle(self:get_objects_in_shape(self.wide_attack_sensor, main.current.enemies)), + 8 + ((self.malediction == 1 and 1) or (self.malediction == 2 and 3) or (self.malediction == 3 and 5) or 0) + ((main.current.curser_level == 2 and 3) or (main.current.curser_level == 1 and 1) or 0)) for _, enemy in ipairs(enemies) do enemy:curse('infestor', 6*(self.hex_duration_m or 1), (self.level == 3 and 6 or 2), self.dmg, self) HitCircle{group = main.current.effects, x = self.x, y = self.y, rs = 6, color = orange[0], duration = 0.1} @@ -1215,6 +1216,7 @@ function Player:update(dt) else self.knockback_m = 1 end if self.force_push then self.knockback_m = self.knockback_m*1.25 end + self.dot_dmg_m = 1 if table.any(self.classes, function(v) return v == 'voider' end) then if main.current.voider_level == 2 then self.dot_dmg_m = 1.4 elseif main.current.voider_level == 1 then self.dot_dmg_m = 1.2 @@ -1453,6 +1455,7 @@ function Player:on_collision_enter(other, contact) else other:hit(self.dmg) end if other.headbutting then self:hit((4 + math.floor(other.level/3))*other.dmg) + other.headbutting = false else self:hit(other.dmg) end HitCircle{group = main.current.effects, x = x, y = y, rs = 6, color = fg[0], duration = 0.1} for i = 1, 2 do HitParticle{group = main.current.effects, x = x, y = y, color = self.color} end @@ -2031,7 +2034,8 @@ function Projectile:update(dt) if self.character == 'psyker' then if self.parent.dead then self.dead = true; self.parent = nil; return end - self:set_position(self.parent.x + self.orbit_distance*math.cos(self.orbit_speed*time + self.orbit_offset), self.parent.y + self.orbit_distance*math.sin(self.orbit_speed*time + self.orbit_offset)) + self:set_position(self.parent.x + self.orbit_distance*math.cos(self.orbit_speed*time + self.orbit_offset), + self.parent.y + self.orbit_distance*math.sin(self.orbit_speed*time + self.orbit_offset)) local dx, dy = self.x - (self.previous_x or 0), self.y - (self.previous_y or 0) self.r = Vector(dx, dy):angle() self:set_angle(self.r) diff --git a/todo b/todo index 3f5359b..9fa7a89 100644 --- a/todo +++ b/todo @@ -27,18 +27,19 @@ Orb Update * Flagellant - Lv.3: 2X flagellant max HP and +12% damage to all allies per cast * Psykeeper - creates a healing orb every time the psykeeper takes 20% of its max HP in damage, Lv.3: deal double the damage taken by the psykeeper to all enemies Balance - Change cursers to add more curse targets as set bonuses - Decrease reroll cost to 5 + * Changed cursers to add more curse targets as set bonuses + * Decreased item reroll cost to 5 * Increased sage's attack speed - Increase spawn marker time - Decrease range and thrown speed for forcers - Decrease damage for blue and white on higher NG - Increase gold rewards at higher NG - Prevent orange from killing multiple units at once - Slightly decrease probability of special spawn at levels above 20 + * Increased spawn marker time by 50% + * Decreased range and throw speed for tanks + * Decreased damage for blue and white enemies + * Increased gold rewards at levels 1-9 + * Prevent orange from killing multiple units at once + * Slightly decrease probability of special spawn at levels above 20 + * Exploder elite spawns mines instead of exploding enemies directly + * Decreased overall enemy damage at higher difficulties QoL - Lowered sound effect for gambler - Show cooldown on elite attack + * Lowered sound effect for gambler * Options menu from buy screen * Add main menu * Title @@ -48,10 +49,14 @@ Orb Update * Quit button * Soundtrack button * Volume slider - https://i.imgur.com/4hOt5uX.png "party 7/9" - https://i.imgur.com/dlGbx0k.png lvl 3 effect on shop card - Add visuals divine intervention, fairy buff - Change text for enchanted to "if you have >= 2 enchanters" and change text for reinforce to "if you have >= 1 enchanter" + * Party x/y + * Lv.3 effect on shop card + * Changed text saying "with at least n enchanters" to "if you have >=n enchanters" for 2 enchanter items + Bug fixes + * Fixed fullscreen button and general resolution issues + * Fixed barbarian stun just slowing and not stunning + * Fixed a bug with Call of the Void that caused its DoT damage bonus to become infinite + Loop Update New items: @@ -83,9 +88,9 @@ Loop Update Selling items Your party + items on end, death and passive screens - https://i.imgur.com/JJUddT3.png Add option for mouse cursor to always be visible + Show cooldown on elite attack + Add visuals divine intervention, fairy buff Bug fixes - * Fixed fullscreen button and general resolution issues - Fix barbarian stun just slowing and not stunning Fixed a series of crashes that happened rarely right before changing from the arena back to the shop https://i.imgur.com/Rk6qbDD.png - merchant doesnt give reroll if dies https://i.imgur.com/1soUUdk.png - 5th position stops shooting when 1-4 die