From ec0af70374c81c3bbce95c69c248819689488d73 Mon Sep 17 00:00:00 2001 From: a327ex Date: Tue, 23 Feb 2021 00:47:57 -0300 Subject: [PATCH] Day 6 --- arena.lua | 4 +- assets/sounds/Wind Bolt 18.ogg | Bin 0 -> 60535 bytes devlog.md | 98 ++++++++++++++++++++++++ main.lua | 2 + objects.lua | 23 +++--- player.lua | 135 ++++++++++++++++++++++++++++++--- todo | 75 +++++++++++++----- 7 files changed, 299 insertions(+), 38 deletions(-) create mode 100644 assets/sounds/Wind Bolt 18.ogg diff --git a/arena.lua b/arena.lua index f1302a1..46c677d 100644 --- a/arena.lua +++ b/arena.lua @@ -50,12 +50,14 @@ function Arena:on_enter(from, level) WallCover{group = self.post_main, vertices = math.to_rectangle_vertices(self.x1, -40, self.x2, self.y1), color = bg[-1]} WallCover{group = self.post_main, vertices = math.to_rectangle_vertices(self.x1, self.y2, self.x2, gh + 40), color = bg[-1]} - self.player = Player{group = self.main, x = gw/2, y = gh/2, leader = true, character = 'swordsman'} + self.player = Player{group = self.main, x = gw/2, y = gh/2, leader = true, character = 'elementor'} + --[[ self.player:add_follower(Player{group = self.main, character = 'archer'}) self.player:add_follower(Player{group = self.main, character = 'vagrant'}) self.player:add_follower(Player{group = self.main, character = 'cleric'}) self.player:add_follower(Player{group = self.main, character = 'scout'}) self.player:add_follower(Player{group = self.main, character = 'wizard'}) + ]]-- self.win_condition = random:table{'time', 'enemy_kill', 'wave'} if self.win_condition == 'wave' then diff --git a/assets/sounds/Wind Bolt 18.ogg b/assets/sounds/Wind Bolt 18.ogg new file mode 100644 index 0000000000000000000000000000000000000000..22a08ab66199cdba2b9299495a92bfb0e6202a59 GIT binary patch literal 60535 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

6bWg zA-JHMvs=Ucg?vY%^~y^Yw@P0%_nkU><2Um~zu{|cJI00p!x)Q?b;RM6*#6w%GB)wk zm`?paXT5%c3cWE*r`Z(8UHX%{crOSxs44n+|JvNHmVN6V_S@RV$4bkT6jVL*LI!JTb19y7IkLBpx)31^j#w#aBx&O4wRYLeZ6aQUG3rZg*%q5M6$*n% z9UNzB4w!a`wFs7}J+4o}p}8_FzU)?$Zzi&3bl(_%cv)JJ{3nK0cfp|8_#WZCQjs|T z>n20KCReX%b2l~b5)u*rAnK~QCp68rVWI2gqj@y*-bpe>i=RWQXu5GN!Su5-y9Fa@ zXDsSZ-_I_hr&r@ii;lT?O0Nh!YEAqk+%cEF>v37mZ3V?OHZb4CJ&D9|s3uxT`yKD{ z0!vg&x&>b*QzpLva~J(?OrM!*&=VU_*%u$Aiu}d(8wldl5|=~&)>^eHJAk%kEVU{1 zi?r3%{E(7VkFzvK-WcANa-4U0=(Fx{u*YvblmPG}hVoOJEtsNwB~p5W9$>iAy0G{% z?DXH-Gg0$MzerUwozxvUV<&Eliu4w2x&jzq8F z;AmX50mrC+65?=tI>{p?GS|P|(z;EZb=0y1Zj8maZW0eHN;=wC5VaOVQTVXjzfRjK zDhDjtLNY}1#uf+mN$bIKL#uM=U@~W?^OU8pvbBey9Onp|@vHrJ&zb))tp=KvGo8tf zvpLOr3ZU)wW%uSvmK*DfhTz;Mm+X6!dSE3Xji3gm*%J~~wQYARwX@r;!(}4Hxhnpt z)vd4n9E=dAF39Nx8b6XqtT=i}8g)elY&q9)EVVC}Hj3`|uk`=$u0M%PZ}R2q-pvJq zBJKo5*S7WqFIcTRY=wkBmF;M~dl;g5YLeM#4;t{mbFVJ)Yf0OlzZ-Y8o8z4PnCmE? z+`he#g0Sr9wHiKScT-*fe*moc=5LCm>}3JU_Jfu8A~o^wZ~`v)0CM%R4)%pb@K|oS z2$w4wWGw#h zx|;2!FxCrZfC9I%m778<=7uFtlt@_$#i%2~g!tXNoiBsAb12kA#I$Bn)rSAdw!{-C zI>*neP|En-zjyFdO$s=iw&rzo6Vo9>iEb7Bp%q9R?l^fgrE?s)fhnMgb`chfjuv&R z%C7L|UqeAxt3+A9xXn(1eg$sqgFrj2xY_zJi}B99sN<{Rp@O$5sFaV6?Uh5&S@|GH zEvmHSkY+5by{KvMr&ZhOQWI4z!+^G=6Pc;*e4J6D$PE4-y{l1kFHE_al30Ss+#LpVP2V{>{r`vi1)?aIa=q6DO-J++1(oQ%mwB*%XyF1S)PSM$)4hjc^ zV=bv;T{>RJ?%8t19eE5BRltGU =`b)Q|fq`6b_fJwlG_ZLDacK>;C#uz*}1CTIe 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 W-&rg#k?`k#7Z+QfV6^_f=zjo`&*rrN literal 0 HcmV?d00001 diff --git a/devlog.md b/devlog.md index c2d706e..ff436f1 100644 --- a/devlog.md +++ b/devlog.md @@ -97,3 +97,101 @@ Sounds done for everything. Surprising to me how much sounds added to the game a I should probably make it a habit to add sounds earlier rather than later from now on. Tomorrow I should probably ideaguy the full set of characters and classes that I'll need so that the game is playable and start on implementing those additional characters as well as some class bonuses. + +# Day 6 - 22/02/21 + +Ideaguyed the entire roster for the demo and implemented a few of them. + +### Classes + +| Class | Color | Set Effect | +| --- | --- | --- | +| Ranger | yellow | chance to release a barrage | +| Warrior | orange | increased defense | +| Healer | green | increased healing effectiveness | +| Mage | blue | decreased enemy defense | +| Nuker | purple | increased area damage and size | +| Conjurer | orange | increased construct damage and duration | +| Rogue | red | chance to crit dealing 4x damage | +| Enchanter | pink | increased damage to all allies | +| Psy | white | returns damage taken based on number of active psy units | + +### Characters + +| Character | Description | Trigger Range | Effect Range | +| --- | --- | --- | --- | +| Vagrant | shoots a projectile | medium | nil | +| Scout | throws a knife that chains 3 times | small | nil | +| Cleric | heals every unit when any one drops below 50% HP | nil | nil | +| Swordsman | deals physical damage in an area around the unit | small | medium | +| Archer | shoots an arrow that pierces | very long | nil | +| Wizard | shoots a projectile that deals AoE damage | long | very small | +| Outlaw | throws a fan of 5 knives | medium | nil | +| Blade | shoots multiple blades that deal AoE damage on contact | small | small | +| Elementor | deals massive AoE damage to a random target | long | medium | +| Ninja | creates clones that roam and shoot shurikens | nil | very small | +| Linker | links nearby enemies together making them share damage taken | medium | small | +| Sage | shoots a slow projectile that draws enemies in | medium | medium | +| Squire | improves damage and defense for adjacent units as well as healing them periodically | nil | nil | +| Cannoneer | shoots a projectile that deals massive AoE damage | long | medium | +| Dual Gunner | shoots two parallel projectiles | medium | nil | +| Hunter | shoots an arrow with a chance to summon a pet | long | small | +| Chronomancer | dramatically improves attack speed for adjacent units | nil | nil | +| Spellblade | knives orbit you and hoam towards nearby enemies | small | small | +| Psykeeper | all damage taken is stored and distributed as healing | nil | nil | +| Gambler | drops a sentry that uses random attacks | nil | medium | + +### Character Classes + +| Character | Classes | +| --- | --- | +| Vagrant | warrior, ranger, psy | +| Scout | rogue | +| Cleric | healer | +| Swordsman | warrior | +| Archer | ranger | +| Wizard | mage | +| Outlaw | rogue, warrior | +| Blade | warrior, nuker | +| Elementor | mage, nuker | +| Ninja | rogue, conjurer | +| Linker | enchanter, nuker | +| Sage | mage, nuker | +| Squire | warrior, healer, enchanter | +| Cannoneer | ranger, nuker | +| Dual | unner [ranger, rogue | +| Hunter | ranger, conjurer | +| Chronomancer | mage, enchanter | +| Spellblade | mage, rogue | +| Psykeeper | healer, psy | +| Gambler | conjurer | + +### Class Numbers + +| Class | Set Levels | Total Units | +| --- | --- | --- | +| Ranger | 2, 4 | 5 | +| Warrior | 2, 4 | 5 | +| Healer | 3 | 3 | +| Mage | 2, 4 | 5 | +| Nuker | 2, 4 | 5 | +| Conjurer | 2 | 3 | +| Rogue | 2, 4 | 5 | +| Enchanter | 3 | 3 | +| Psy | n | 2 | + +### Class Stat Multipliers + +| Class | HP | DMG | ASPD | Area DMG | Area Size | DEF | MVSPD | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Warrior | 1.4 | 1.1 | 0.9 | 1.0 | 1.0 | 1.25 | 0.9 | +| Ranger | 1.0 | 1.2 | 1.5 | 1.0 | 1.0 | 0.9 | 1.2 | +| Healer | 1.2 | 1.0 | 0.5 | 1.0 | 1.0 | 1.2 | 1.0 | +| Mage | 0.6 | 1.4 | 1.0 | 1.25 | 1.25 | 0.75 | 1.0 | +| Rogue | 0.8 | 1.3 | 1.1 | 0.6 | 0.6 | 0.8 | 1.4 | +| Nuker | 0.9 | 1.4 | 0.75 | 1.5 | 1.3 | 1.0 | 1.0 | +| Conjurer | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | +| Enchanter | 1.2 | 1.0 | 1.0 | 1.0 | 1.0 | 1.2 | 1.2 | +| Psy | 1.5 | 1.0 | 1.0 | 1.0 | 1.0 | 0.5 | 1.0 | + +I've implemented up to Elementor today and ATM in the process of doing Ninja, but today seems like a particularly low energy day so I'm just going to play some games instead. diff --git a/main.lua b/main.lua index 05b63b9..8d3411d 100644 --- a/main.lua +++ b/main.lua @@ -34,6 +34,7 @@ function init() magic_hit1 = Sound('Shadow Punch 1.ogg', s) magic_die1 = Sound('Magical Impact 27.ogg', s) knife_hit_wall1 = Sound('Shield Impacts Sword 1.ogg', s) + blade_hit1 = Sound('Sword impact (Flesh) 2.ogg', s) player_hit1 = Sound('Body Fall 2.ogg', s) player_hit2 = Sound('Body Fall 18.ogg', s) player_hit_wall1 = Sound('Wood Heavy 5.ogg', s) @@ -41,6 +42,7 @@ function init() heal1 = Sound('Buff 3.ogg', s) spawn1 = Sound('Buff 13.ogg', s) alert1 = Sound('Alert sounds 3.ogg', s) + elementor1 = Sound('Wind Bolt 18.ogg', s) main = Main() main:add(Arena'arena') diff --git a/objects.lua b/objects.lua index 8d53d0e..f4645db 100644 --- a/objects.lua +++ b/objects.lua @@ -110,7 +110,7 @@ function Unit:calculate_stats(first_run) self.base_aspd_m = 1 self.base_area_dmg_m = 1 self.base_area_size_m = 1 - self.base_def = 0 + self.base_def = 25 self.base_mvspd = 75 self.class_hp_a = 0 self.class_dmg_a = 0 @@ -138,9 +138,11 @@ function Unit:calculate_stats(first_run) for _, class in ipairs(self.classes) do if class == 'warrior' then self.class_hp_m = self.class_hp_m*1.4 elseif class == 'mage' then self.class_hp_m = self.class_hp_m*0.6 - elseif class == 'healer' then self.class_hp_m = self.class_hp_m*1.1 - elseif class == 'void' then self.class_hp_m = self.class_hp_m*0.9 + elseif class == 'healer' then self.class_hp_m = self.class_hp_m*1.2 + elseif class == 'nuker' then self.class_hp_m = self.class_hp_m*0.9 elseif class == 'rogue' then self.class_hp_m = self.class_hp_m*0.8 + elseif class == 'enchanter' then self.class_hp_m = self.class_hp_m*1.2 + elseif class == 'psy' then self.class_hp_m = self.class_hp_m*1.5 elseif class == 'seeker' then self.class_hp_m = self.class_hp_m*0.5 end end self.max_hp = (self.base_hp + self.class_hp_a + self.buff_hp_a)*self.class_hp_m*self.buff_hp_m @@ -149,7 +151,7 @@ function Unit:calculate_stats(first_run) for _, class in ipairs(self.classes) do if class == 'warrior' then self.class_dmg_m = self.class_dmg_m*1.1 elseif class == 'ranger' then self.class_dmg_m = self.class_dmg_m*1.2 - elseif class == 'rogue' then self.class_dmg_m = self.class_dmg_m*1.2 + elseif class == 'rogue' then self.class_dmg_m = self.class_dmg_m*1.3 elseif class == 'mage' then self.class_dmg_m = self.class_dmg_m*1.4 end end self.dmg = (self.base_dmg + self.class_dmg_a + self.buff_dmg_a)*self.class_dmg_m*self.buff_dmg_m @@ -159,29 +161,31 @@ function Unit:calculate_stats(first_run) elseif class == 'ranger' then self.class_aspd_m = self.class_aspd_m*1.5 elseif class == 'healer' then self.class_aspd_m = self.class_aspd_m*0.5 elseif class == 'rogue' then self.class_aspd_m = self.class_aspd_m*1.1 - elseif class == 'void' then self.class_aspd_m = self.class_aspd_m*0.75 end + elseif class == 'nuker' then self.class_aspd_m = self.class_aspd_m*0.75 end end self.aspd_m = 1/(self.base_aspd_m*self.class_aspd_m*self.buff_aspd_m) for _, class in ipairs(self.classes) do if class == 'mage' then self.class_area_dmg_m = self.class_area_dmg_m*1.25 - elseif class == 'void' then self.class_area_dmg_m = self.class_area_dmg_m*1.5 + elseif class == 'nuker' then self.class_area_dmg_m = self.class_area_dmg_m*1.5 elseif class == 'rogue' then self.class_area_dmg_m = self.class_area_dmg_m*0.6 end end self.area_dmg_m = self.base_area_dmg_m*self.class_area_dmg_m*self.buff_area_dmg_m for _, class in ipairs(self.classes) do if class == 'mage' then self.class_area_size_m = self.class_area_size_m*1.2 - elseif class == 'void' then self.class_area_size_m = self.class_area_size_m*1.3 + elseif class == 'nuker' then self.class_area_size_m = self.class_area_size_m*1.3 elseif class == 'rogue' then self.class_area_size_m = self.class_area_size_m*0.6 end end self.area_size_m = self.base_area_size_m*self.class_area_size_m*self.buff_area_size_m for _, class in ipairs(self.classes) do if class == 'warrior' then self.class_def_m = self.class_def_m*1.25 - elseif class == 'ranger' then self.class_def_m = self.class_def_m*1.1 - elseif class == 'mage' then self.class_def_m = self.class_def_m*0.8 + elseif class == 'ranger' then self.class_def_m = self.class_def_m*0.9 + elseif class == 'mage' then self.class_def_m = self.class_def_m*0.75 elseif class == 'rogue' then self.class_def_m = self.class_def_m*0.8 + elseif class == 'enchanter' then self.class_def_m = self.class_def_m*1.2 + elseif class == 'psy' then self.class_def_m = self.class_def_m*0.5 elseif class == 'healer' then self.class_def_m = self.class_def_m*1.2 end end self.def = (self.base_def + self.class_def_a + self.buff_def_a)*self.class_def_m*self.buff_def_m @@ -190,6 +194,7 @@ function Unit:calculate_stats(first_run) if class == 'warrior' then self.class_mvspd_m = self.class_mvspd_m*0.9 elseif class == 'ranger' then self.class_mvspd_m = self.class_mvspd_m*1.2 elseif class == 'rogue' then self.class_mvspd_m = self.class_mvspd_m*1.4 + elseif class == 'enchanter' then self.class_mvspd_m = self.class_mvspd_m*1.2 elseif class == 'seeker' then self.class_mvspd_m = self.class_mvspd_m*0.3 end end self.v = (self.base_mvspd + self.class_mvspd_a + self.buff_mvspd_a)*self.class_mvspd_m*self.buff_mvspd_m diff --git a/player.lua b/player.lua index 474b971..1fe3543 100644 --- a/player.lua +++ b/player.lua @@ -10,7 +10,7 @@ function Player:init(args) self.color = fg[0] self:set_as_rectangle(9, 9, 'dynamic', 'player') self.visual_shape = 'rectangle' - self.classes = {'ranger', 'warrior', 'mage'} + self.classes = {'ranger', 'warrior', 'psy'} self.attack_sensor = Circle(self.x, self.y, 96) self.t:every(2, function() @@ -94,6 +94,62 @@ function Player:init(args) heal1:play{pitch = random:float(0.95, 1.05), volume = 0.5} end end) + + elseif self.character == 'outlaw' then + self.color = red[0] + self:set_as_rectangle(9, 9, 'dynamic', 'player') + self.visual_shape = 'rectangle' + self.classes = {'warrior', 'rogue'} + + self.attack_sensor = Circle(self.x, self.y, 96) + self.t:every(3, function() + local closest_enemy = self:get_closest_object_in_shape(self.attack_sensor, main.current.enemies) + if closest_enemy then + self:shoot(self:angle_to_object(closest_enemy)) + end + end, nil, nil, 'shoot') + + elseif self.character == 'blade' then + self.color = orange[0] + self:set_as_rectangle(9, 9, 'dynamic', 'player') + self.visual_shape = 'rectangle' + self.classes = {'warrior', 'rogue'} + + self.attack_sensor = Circle(self.x, self.y, 64) + self.t:every(4, function() + local enemies = self:get_objects_in_shape(self.attack_sensor, main.current.enemies) + if enemies and #enemies > 0 then + self:shoot() + end + end, nil, nil, 'shoot') + + elseif self.character == 'elementor' then + self.color = blue[0] + self:set_as_rectangle(9, 9, 'dynamic', 'player') + self.visual_shape = 'rectangle' + self.classes = {'mage', 'nuker'} + + self.attack_sensor = Circle(self.x, self.y, 128) + self.t:every(12, function() + local enemy = self:get_random_object_in_shape(self.attack_sensor, main.current.enemies) + if enemy then + self:attack(128, {x = enemy.x, y = enemy.y}) + end + end, nil, nil, 'attack') + + elseif self.character == 'ninja' then + self.color = red[0] + self:set_as_rectangle(9, 9, 'dynamic', 'player') + self.visual_shape = 'rectangle' + self.classes = {'rogue', 'conjurer'} + + self.t:every(8, function() + self.t:every(0.25, function() + SpawnEffect{group = self.effects, x = self.x, y = self.y, action = function(x, y) + NinjaClone{group = self.main, x = x, y = y, parent = self} + end} + end, 3) + end) end self:calculate_stats(true) @@ -247,9 +303,30 @@ end function Player:shoot(r, mods) camera:spring_shake(2, r) self.hfx:use('shoot', 0.25) - 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} - local t = {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), v = 250, r = r, color = self.color, dmg = self.dmg, character = self.character} - Projectile(table.merge(t, mods or {})) + + if self.character == 'outlaw' then + 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} + r = r - 2*math.pi/8 + for i = 1, 5 do + local t = {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), v = 250, r = r, color = self.color, dmg = self.dmg, character = self.character, parent = self} + Projectile(table.merge(t, mods or {})) + r = r + math.pi/8 + end + elseif self.character == 'blade' then + local enemies = self:get_objects_in_shape(self.attack_sensor, main.current.enemies) + if enemies and #enemies > 0 then + for _, enemy in ipairs(enemies) do + local r = self:angle_to_object(enemy) + 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} + local t = {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), v = 250, r = r, color = self.color, dmg = self.dmg, character = self.character, parent = self} + Projectile(table.merge(t, mods or {})) + end + end + else + 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} + local t = {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), v = 250, r = r, color = self.color, dmg = self.dmg, character = self.character, parent = self} + Projectile(table.merge(t, mods or {})) + end if self.character == 'vagrant' then shoot1:play{pitch = random:float(0.95, 1.05), volume = 0.3} @@ -257,7 +334,7 @@ function Player:shoot(r, mods) archer1:play{pitch = random:float(0.95, 1.05), volume = 0.5} elseif self.character == 'wizard' then wizard1:play{pitch = random:float(0.95, 1.05), volume = 0.15} - elseif self.character == 'scout' then + elseif self.character == 'scout' or self.character == 'outlaw' or self.character == 'blade' then _G[random:table{'scout1', 'scout2'}]:play{pitch = random:float(0.95, 1.05), volume = 0.5} end end @@ -266,11 +343,13 @@ end function Player:attack(area, mods) camera:shake(2, 0.5) self.hfx:use('shoot', 0.25) - local t = {group = main.current.effects, x = self.x, y = self.y, r = self.r, w = self.area_size_m*(area or 64), color = self.color, dmg = self.area_dmg_m*self.dmg, character = self.character} + local t = {group = main.current.effects, x = mods.x or self.x, y = mods.y or self.y, r = self.r, w = self.area_size_m*(area or 64), color = self.color, dmg = self.area_dmg_m*self.dmg, character = self.character} Area(table.merge(t, mods or {})) if self.character == 'swordsman' then _G[random:table{'swordsman1', 'swordsman2'}]:play{pitch = random:float(0.9, 1.1), volume = 0.75} + elseif self.character == 'elementor' then + elementor1:play{pitch = random:float(0.9, 1.1), volume = 0.5} end end @@ -314,7 +393,9 @@ 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.wizard.area_size_m*32, color = self.color, dmg = self.wizard.area_dmg_m*self.dmg, character = self.character} + 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} + 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} end end @@ -333,7 +414,7 @@ function Projectile:on_collision_enter(other, contact) self:die(x, y, r, 0) _G[random:table{'arrow_hit_wall1', 'arrow_hit_wall2'}]:play{pitch = random:float(0.9, 1.1), volume = 0.2} WallArrow{group = main.current.main, x = x, y = y, r = self.r, color = self.color} - elseif self.character == 'scout' then + elseif self.character == 'scout' or self.character == 'outlaw' or self.character == 'blade' then self:die(x, y, r, 0) knife_hit_wall1:play{pitch = random:float(0.9, 1.1), volume = 0.2} local r = Unit.bounce(self, nx, ny) @@ -373,7 +454,7 @@ function Projectile:on_trigger_enter(other, contact) HitParticle{group = main.current.effects, x = self.x, y = self.y, color = other.color} end - if self.character == 'archer' or self.character == 'scout' then + if self.character == 'archer' or self.character == 'scout' or self.character == 'outlaw' or self.character == 'blade' then hit2:play{pitch = random:float(0.95, 1.05), volume = 0.35} elseif self.character == 'wizard' then magic_area1:play{pitch = random:float(0.95, 1.05), volume = 0.15} @@ -398,10 +479,13 @@ function Area:init(args) HitCircle{group = main.current.effects, x = enemy.x, y = enemy.y, rs = 6, color = fg[0], duration = 0.1} for i = 1, 2 do HitParticle{group = main.current.effects, x = enemy.x, y = enemy.y, color = self.color} end for i = 1, 2 do HitParticle{group = main.current.effects, x = enemy.x, y = enemy.y, color = enemy.color} end - if self.character == 'wizard' then + if self.character == 'wizard' or self.character == 'elementor' then magic_hit1:play{pitch = random:float(0.95, 1.05), volume = 0.5} elseif self.character == 'swordsman' then hit2:play{pitch = random:float(0.95, 1.05), volume = 0.35} + elseif self.character == 'blade' then + blade_hit1:play{pitch = random:float(0.9, 1.1), volume = 0.35} + hit2:play{pitch = random:float(0.95, 1.05), volume = 0.2} end end @@ -436,3 +520,34 @@ function Area:draw() graphics.rectangle((x1+x2)/2, (y1+y2)/2, x2-x1, y2-y1, nil, nil, self.color_transparent) graphics.pop() end + + + + +NinjaClone = Object:extend() +NinjaClone:implement(GameObject) +NinjaClone:implement(Physics) +function NinjaClone:init(args) + self:init_game_object(args) + self:init_unit() + self:set_as_rectangle(8, 8, 'dynamic', 'enemy') + self:set_restitution(0.5) + + self.color = red[0] + self.classes = {'ninja_clone'} + self:calculate_stats(true) + self:set_as_steerable(self.v, 2000, 4*math.pi, 4) +end + + +function NinjaClone:update(dt) + self:update_game_object(dt) + self:calculate_stats() +end + + +function NinjaClone:draw() + graphics.push(self.x, self.y, self.r, self.hfx.hit.x, self.hfx.hit.x) + graphics.rectangle(self.x, self.y, self.shape.w, self.shape.h, 3, 3, self.hfx.hit.f and fg[0] or self.color) + graphics.pop() +end diff --git a/todo b/todo index b0c8ee5..6fba923 100644 --- a/todo +++ b/todo @@ -1,19 +1,66 @@ -Vagrant: shoots an ethereal projectile at any nearby enemy that deals physical and magical damage, medium range +Vagrant: shoots a projectile at any nearby enemy, medium range Scout: throws a knife that chains 3 times at any nearby enemy, small range Cleric: heals every unit when any one drops below 50% HP -Swordsman: deals physical damage in a medium area around the unit, small range +Swordsman: deals physical damage in a medium area around the unit, small range, AoE has medium range Archer: shoots an arrow that pierces at any nearby enemy, very long range -Wizard: shoots a projectile at any nearby enemy and deals AoE magical damage on contact, long range, AoE has very small range +Wizard: shoots a projectile at any nearby enemy and deals AoE damage on contact, long range, AoE has very small range +Outlaw: throws a leque of knives at nearby enemies, medium range +Blade: shoots multiple blades at nearby enemies, each dealing AoE damage on contact, small range, AoE has small range +Elementor: deals massive AoE damage to a random target, long range, AoE has medium range -Engineer: drops a turret that shoots secondary projectiles very fast, medium range +Ninja: creates clones that roam and shoot projectiles at nearby enemies, very small range +Linker: links nearby enemies together making them share damage taken, medium range +Sage: shoots a slow projectile that draws enemies in, medium range, AoE has medium range +Squire: improves damage and defense for adjacent units, as well as healing them periodically +Cannoneer: shoots a projectile at any nearby enemy and deals massive AoE damage on contact, long range, AoE has medium range +Dual Gunner: shoots two parallel projectiles at any nearby enemy, medium range +Hunter: shoots an arrow at any nearby enemy with a chance to summon a pet that will trample through enemies knocking them away, arrow has long range, pet has small range +Chronomancer: dramatically improves attack speed for adjacent units +Spellblade: knives orbit you and hoam towards nearby enemies, small range +Psykeeper: all damage taken is stored and distributed as healing +Gambler: drops a sentry that uses random attacks, medium range -Ranger: yellow, buff attack speed -Warrior: orange, buff attack damage -Healer: green, buff healing effectiveness -Mage: blue, debuff enemy defense -Void: purple, buff area damage and size -Builder: orange, buffs construct damage, attack speed and duration +Ranger: yellow, chance to release a barrage +Warrior: orange, increased defense +Healer: green, increased healing effectiveness +Mage: blue, decreased enemy defense +Nuker: purple, increased area damage and size +Conjurer: orange, increased construct damage and duration Rogue: red, chance to crit dealing 4x damage +Enchanter: pink, increased damage to all allies +Psy: white, returns damage taken based on number of active psy units + +Vagrant [warrior, ranger, psy] +Scout [rogue] +Cleric [healer] +Swordsman [warrior] +Archer [ranger] +Wizard [mage] +Outlaw [rogue, warrior] +Blade [warrior, nuker] +Elementor [mage, nuker] + +Ninja [rogue, conjurer] +Linker [enchanter, nuker] +Sage [mage, nuker] +Squire [warrior, healer, enchanter] +Cannoneer [ranger, nuker] +Dual Gunner [ranger, rogue] +Hunter [ranger, conjurer] +Chronomancer [mage, enchanter] +Spellblade [mage, rogue] +Psykeeper [healer, psy] +Gambler [conjurer] + +Ranger [2, 4] (5) +Warrior [2, 4] (5) +Healer [3] +Mage [2, 4] (5) +Nuker [2, 4] (5) +Conjurer [2] (3) +Rogue [2, 4] (5) +Enchanter [3] (3) +Psy [n] (2) HP Damage @@ -21,11 +68,3 @@ Area damage Area of effect Attack speed Defense -> if defense >= 0 then dmg_m = 100/(100+defense) else dmg_m = 2-100/(100-defense) - -* HP bar should be drawn on top of all player units -* Projectiles -* Areas -* Stats: attack speed, damage, area -* One or a few of the characters -* Port over enemy spawn logic from SHOOTRX -* Sounds