Day 58-59
89
arena.lua
|
@ -249,6 +249,8 @@ function Arena:on_enter(from, level, units)
|
|||
self.healer_level = class_levels.healer
|
||||
self.psyker_level = class_levels.psyker
|
||||
self.conjurer_level = class_levels.conjurer
|
||||
|
||||
self.can_quit = true
|
||||
end
|
||||
|
||||
|
||||
|
@ -326,9 +328,6 @@ function Arena:update(dt)
|
|||
self:update_game_object(dt*slow_amount)
|
||||
-- cascade_instance.pitch = math.clamp(slow_amount*self.main_slow_amount, 0.05, 1)
|
||||
|
||||
if self.enchanter_level == 1 then self.enchanter_dmg_m = 1.25
|
||||
else self.enchanter_dmg_m = 1 end
|
||||
|
||||
self.floor:update(dt*slow_amount)
|
||||
self.main:update(dt*slow_amount*self.main_slow_amount)
|
||||
self.post_main:update(dt*slow_amount)
|
||||
|
@ -360,39 +359,56 @@ function Arena:update(dt)
|
|||
else
|
||||
if not self.arena_clear_text then self.arena_clear_text = Text2{group = self.ui, x = gw/2, y = gh/2 - 48, lines = {{text = '[wavy_mid, cbyc]arena clear!', font = fat_font, alignment = 'center'}}} end
|
||||
self.t:after(3, function()
|
||||
ui_transition2:play{pitch = random:float(0.95, 1.05), volume = 0.5}
|
||||
TransitionEffect{group = main.transitions, x = self.player.x, y = self.player.y, color = self.color, transition_action = function(t)
|
||||
main:add(BuyScreen'buy_screen')
|
||||
main:go_to('buy_screen', self.level, self.units)
|
||||
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},
|
||||
{text = '[wavy_lower, bg]damage taken: 0', font = pixul_font, alignment = 'center', height_multiplier = 1.5},
|
||||
{text = '[wavy_lower, bg]damage dealt: 0', font = pixul_font, alignment = 'center'}
|
||||
})
|
||||
_G[random:table{'coins1', 'coins2', 'coins3'}]:play{pitch = random:float(0.95, 1.05), volume = 0.5}
|
||||
t.t:after(0.2, function()
|
||||
if self.level % 3 == 0 then
|
||||
self.arena_clear_text.dead = true
|
||||
trigger:tween(1, _G, {slow_amount = 0}, math.linear, function() slow_amount = 0 end)
|
||||
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)
|
||||
local card_w, card_h = 100, 100
|
||||
local w = 3*card_w + 2*20
|
||||
self.choosing_passives = true
|
||||
self.cards = {}
|
||||
local passive_1 = random:table(tier_to_passives[random:weighted_pick(unpack(level_to_passive_tier_weights[level or self.level]))])
|
||||
local passive_2 = random:table(tier_to_passives[random:weighted_pick(unpack(level_to_passive_tier_weights[level or self.level]))])
|
||||
local passive_3 = random:table(tier_to_passives[random:weighted_pick(unpack(level_to_passive_tier_weights[level or self.level]))])
|
||||
table.insert(self.cards, PassiveCard{group = main.current.ui, x = gw/2 - w/2 + 0*(card_w + 20) + card_w/2, y = gh/2, w = card_w, h = card_h, arena = self, passive = passive_1, force_update = true})
|
||||
table.insert(self.cards, PassiveCard{group = main.current.ui, x = gw/2 - w/2 + 1*(card_w + 20) + card_w/2, y = gh/2, w = card_w, h = card_h, arena = self, passive = passive_2, force_update = true})
|
||||
table.insert(self.cards, PassiveCard{group = main.current.ui, x = gw/2 - w/2 + 2*(card_w + 20) + card_w/2, y = gh/2, w = card_w, h = card_h, arena = self, passive = passive_3, force_update = true})
|
||||
self.passive_text = Text2{group = self.ui, x = gw/2, y = gh/2 - 65, lines = {{text = '[fg, wavy]choose one', font = fat_font, alignment = 'center'}}}
|
||||
else
|
||||
ui_transition2:play{pitch = random:float(0.95, 1.05), volume = 0.5}
|
||||
TransitionEffect{group = main.transitions, x = self.player.x, y = self.player.y, color = self.color, transition_action = function(t)
|
||||
main:add(BuyScreen'buy_screen')
|
||||
main:go_to('buy_screen', self.level, self.units)
|
||||
t.t:after(0.1, function()
|
||||
t.text:set_text({
|
||||
{text = '[wavy_lower, bg]gold gained: ' .. tostring(gold_gained), font = pixul_font, alignment = 'center', height_multiplier = 1.5},
|
||||
{text = '[nudge_down, bg]damage taken: ' .. tostring(math.round(self.damage_taken, 0)), font = pixul_font, alignment = 'center', height_multiplier = 1.5},
|
||||
{text = '[nudge_down, bg]gold gained: ' .. tostring(gold_gained), font = pixul_font, alignment = 'center', height_multiplier = 1.5},
|
||||
{text = '[wavy_lower, bg]damage taken: 0', font = pixul_font, alignment = 'center', height_multiplier = 1.5},
|
||||
{text = '[wavy_lower, bg]damage dealt: 0', font = pixul_font, alignment = 'center'}
|
||||
})
|
||||
_G[random:table{'coins1', 'coins2', 'coins3'}]:play{pitch = random:float(0.95, 1.05), volume = 0.5}
|
||||
t.t:after(0.2, function()
|
||||
t.text:set_text({
|
||||
{text = '[wavy_lower, bg]gold gained: ' .. tostring(gold_gained), font = pixul_font, alignment = 'center', height_multiplier = 1.5},
|
||||
{text = '[wavy_lower, bg]damage taken: ' .. tostring(math.round(self.damage_taken, 0)), font = pixul_font, alignment = 'center', height_multiplier = 1.5},
|
||||
{text = '[nudge_down, bg]damage dealt: ' .. tostring(math.round(self.damage_dealt, 0)), font = pixul_font, alignment = 'center'}
|
||||
{text = '[nudge_down, bg]damage taken: ' .. tostring(math.round(self.damage_taken, 0)), font = pixul_font, alignment = 'center', height_multiplier = 1.5},
|
||||
{text = '[wavy_lower, bg]damage dealt: 0', font = pixul_font, alignment = 'center'}
|
||||
})
|
||||
_G[random:table{'coins1', 'coins2', 'coins3'}]:play{pitch = random:float(0.95, 1.05), volume = 0.5}
|
||||
t.t:after(0.2, function()
|
||||
t.text:set_text({
|
||||
{text = '[wavy_lower, bg]gold gained: ' .. tostring(gold_gained), font = pixul_font, alignment = 'center', height_multiplier = 1.5},
|
||||
{text = '[wavy_lower, bg]damage taken: ' .. tostring(math.round(self.damage_taken, 0)), font = pixul_font, alignment = 'center', height_multiplier = 1.5},
|
||||
{text = '[nudge_down, bg]damage dealt: ' .. tostring(math.round(self.damage_dealt, 0)), font = pixul_font, alignment = 'center'}
|
||||
})
|
||||
_G[random:table{'coins1', 'coins2', 'coins3'}]:play{pitch = random:float(0.95, 1.05), volume = 0.5}
|
||||
end)
|
||||
end)
|
||||
end)
|
||||
end)
|
||||
end, text = Text({
|
||||
{text = '[wavy_lower, bg]gold gained: 0', font = pixul_font, alignment = 'center', height_multiplier = 1.5},
|
||||
{text = '[wavy_lower, bg]damage taken: 0', font = pixul_font, alignment = 'center', height_multiplier = 1.5},
|
||||
{text = '[wavy_lower, bg]damage dealt: 0', font = pixul_font, alignment = 'center'}
|
||||
}, global_text_tags)}
|
||||
end, text = Text({
|
||||
{text = '[wavy_lower, bg]gold gained: 0', font = pixul_font, alignment = 'center', height_multiplier = 1.5},
|
||||
{text = '[wavy_lower, bg]damage taken: 0', font = pixul_font, alignment = 'center', height_multiplier = 1.5},
|
||||
{text = '[wavy_lower, bg]damage dealt: 0', font = pixul_font, alignment = 'center'}
|
||||
}, global_text_tags)}
|
||||
end
|
||||
end, 'transition')
|
||||
end
|
||||
end
|
||||
|
@ -405,10 +421,11 @@ function Arena:draw()
|
|||
self.post_main:draw()
|
||||
self.effects:draw()
|
||||
if self.level == 18 and self.trailer then graphics.rectangle(gw/2, gh/2, 2*gw, 2*gh, nil, nil, modal_transparent) end
|
||||
if self.choosing_passives then graphics.rectangle(gw/2, gh/2, 2*gw, 2*gh, nil, nil, modal_transparent) end
|
||||
self.ui:draw()
|
||||
|
||||
camera:attach()
|
||||
if self.start_time and self.start_time > 0 then
|
||||
if self.start_time and self.start_time > 0 and not self.choosing_passives then
|
||||
graphics.push(gw/2, gh/2 - 48, 0, self.hfx.condition1.x, self.hfx.condition1.x)
|
||||
graphics.print_centered(tostring(self.start_time), fat_font, gw/2, gh/2 - 48, 0, 1, 1, nil, nil, self.hfx.condition1.f and fg[0] or red[0])
|
||||
graphics.pop()
|
||||
|
@ -568,3 +585,23 @@ function Arena:spawn_n_enemies(p, j, n)
|
|||
end}
|
||||
end, n, nil, 'spawn_enemies_' .. j)
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
Passives = Object:extend()
|
||||
Passives:implement(GameObject)
|
||||
function Passives:init(args)
|
||||
self:init_game_object(args)
|
||||
|
||||
end
|
||||
|
||||
|
||||
function Passives:update(dt)
|
||||
self:update_game_object(dt)
|
||||
end
|
||||
|
||||
|
||||
function Passives:draw()
|
||||
|
||||
end
|
||||
|
|
After Width: | Height: | Size: 400 B |
After Width: | Height: | Size: 405 B |
After Width: | Height: | Size: 278 B |
After Width: | Height: | Size: 355 B |
After Width: | Height: | Size: 440 B |
After Width: | Height: | Size: 463 B |
After Width: | Height: | Size: 451 B |
After Width: | Height: | Size: 245 B |
After Width: | Height: | Size: 230 B |
After Width: | Height: | Size: 324 B |
After Width: | Height: | Size: 298 B |
After Width: | Height: | Size: 362 B |
After Width: | Height: | Size: 369 B |
After Width: | Height: | Size: 417 B |
After Width: | Height: | Size: 448 B |
After Width: | Height: | Size: 356 B |
After Width: | Height: | Size: 326 B |
After Width: | Height: | Size: 335 B |
After Width: | Height: | Size: 351 B |
After Width: | Height: | Size: 241 B |
After Width: | Height: | Size: 361 B |
After Width: | Height: | Size: 436 B |
After Width: | Height: | Size: 322 B |
After Width: | Height: | Size: 369 B |
After Width: | Height: | Size: 276 B |
After Width: | Height: | Size: 338 B |
After Width: | Height: | Size: 391 B |
After Width: | Height: | Size: 388 B |
After Width: | Height: | Size: 401 B |
After Width: | Height: | Size: 279 B |
After Width: | Height: | Size: 379 B |
After Width: | Height: | Size: 414 B |
After Width: | Height: | Size: 335 B |
After Width: | Height: | Size: 343 B |
After Width: | Height: | Size: 325 B |
After Width: | Height: | Size: 372 B |
After Width: | Height: | Size: 356 B |
After Width: | Height: | Size: 431 B |
After Width: | Height: | Size: 427 B |
After Width: | Height: | Size: 337 B |
After Width: | Height: | Size: 425 B |
After Width: | Height: | Size: 345 B |
|
@ -484,6 +484,51 @@ end
|
|||
|
||||
|
||||
|
||||
PassiveCard = Object:extend()
|
||||
PassiveCard:implement(GameObject)
|
||||
function PassiveCard:init(args)
|
||||
self:init_game_object(args)
|
||||
self.shape = Rectangle(self.x, self.y, self.w, self.h)
|
||||
self.interact_with_mouse = true
|
||||
self.passive_name = Text({{text = '[fg, wavy_mid]' .. passive_names[self.passive], font = pixul_font, alignment = 'center'}}, global_text_tags)
|
||||
self.passive_description = passive_descriptions[self.passive]
|
||||
end
|
||||
|
||||
|
||||
function PassiveCard:update(dt)
|
||||
self:update_game_object(dt)
|
||||
self.passive_name:update(dt)
|
||||
print(dt)
|
||||
end
|
||||
|
||||
|
||||
function PassiveCard:draw()
|
||||
graphics.push(self.x, self.y, 0, self.sx*self.spring.x, self.sy*self.spring.x)
|
||||
self.passive_name:draw(self.x, self.y - 20)
|
||||
_G[self.passive]:draw(self.x, self.y + 24, 0, 1, 1, 0, 0, fg[0])
|
||||
graphics.pop()
|
||||
end
|
||||
|
||||
|
||||
function PassiveCard:on_mouse_enter()
|
||||
ui_hover1:play{pitch = random:float(1.3, 1.5), volume = 0.5}
|
||||
self.spring:pull(0.2, 200, 10)
|
||||
self.info_text = InfoText{group = main.current.ui, force_update = true}
|
||||
self.info_text:activate({
|
||||
{text = self.passive_description, font = pixul_font, alignment = 'center', height_multiplier = 1.25},
|
||||
}, nil, nil, nil, nil, 16, 4, nil, 2)
|
||||
self.info_text.x, self.info_text.y = gw/2, gh/2 + gh/4 + 12
|
||||
end
|
||||
|
||||
|
||||
function PassiveCard:on_mouse_exit()
|
||||
self.info_text:deactivate()
|
||||
self.info_text.dead = true
|
||||
self.info_text = nil
|
||||
end
|
||||
|
||||
|
||||
|
||||
ShopCard = Object:extend()
|
||||
ShopCard:implement(GameObject)
|
||||
function ShopCard:init(args)
|
||||
|
|
|
@ -959,3 +959,8 @@ Finished remaining 5 characters and revised all class bonuses. So 40/40 characte
|
|||
| Forcer | yellow | 2/4 | 5 | +25/50% knockback force to all allies |
|
||||
| Swarmer | orange | 2/4 | 4 | +1/3 health to critters |
|
||||
| Voider | purple | 2/4 | 5 | +15/25% DoT to allied voiders |
|
||||
|
||||
# Day 58-59 - 15-16/04/21
|
||||
|
||||
Had to ideaguy all 40 passives. Managed to do it and also get the passive selection screen working partly. Tomorrow I should finish it and start working through the 40 passives, which should go significantly faster
|
||||
than the characters since I made sure to pick types of passives that were already implemented one way or another in the game.
|
||||
|
|
|
@ -51,7 +51,13 @@ end
|
|||
|
||||
function Group:update(dt)
|
||||
self.t:update(dt)
|
||||
for _, object in ipairs(self.objects) do object:update(dt) end
|
||||
for _, object in ipairs(self.objects) do
|
||||
if object.force_update then
|
||||
object:update(1/refresh_rate)
|
||||
else
|
||||
object:update(dt)
|
||||
end
|
||||
end
|
||||
if self.world then self.world:update(dt) end
|
||||
|
||||
self.cells = {}
|
||||
|
|
267
main.lua
|
@ -114,6 +114,48 @@ function init()
|
|||
forcer = Image('forcer')
|
||||
swarmer = Image('swarmer')
|
||||
voider = Image('voider')
|
||||
ouroboros_technique_r = Image('ouroboros_technique_r')
|
||||
ouroboros_technique_l = Image('ouroboros_technique_l')
|
||||
wall_echo = Image('wall_echo')
|
||||
wall_rider = Image('wall_rider')
|
||||
centipede = Image('centipede')
|
||||
intimidation = Image('intimidation')
|
||||
vulnerability = Image('vulnerability')
|
||||
temporal_chains = Image('temporal_chains')
|
||||
amplify = Image('amplify')
|
||||
amplify_x = Image('amplify_x')
|
||||
resonance = Image('resonance')
|
||||
ballista = Image('ballista')
|
||||
ballista_x = Image('ballista_x')
|
||||
point_blank = Image('point_blank')
|
||||
longshot = Image('longshot')
|
||||
blunt_arrow = Image('blunt_arrow')
|
||||
explosive_arrow = Image('explosive_arrow')
|
||||
divine_machine_arrow = Image('divine_machine_arrow')
|
||||
chronomancy = Image('chronomancy')
|
||||
awakening = Image('awakening')
|
||||
divine_punishment = Image('divine_punishment')
|
||||
berserking = Image('berserking')
|
||||
unwavering_stance = Image('unwavering_stance')
|
||||
ultimatum = Image('ultimatum')
|
||||
flying_daggers = Image('flying_daggers')
|
||||
assassination = Image('assassination')
|
||||
magnify = Image('magnify')
|
||||
concentrated_fire = Image('concentrated_fire')
|
||||
unleash = Image('unleash')
|
||||
reinforce = Image('reinforce')
|
||||
payback = Image('payback')
|
||||
blessing = Image('blessing')
|
||||
hex_master = Image('hex_master')
|
||||
whispers_of_doom = Image('whispers_of_doom')
|
||||
force_push = Image('force_push')
|
||||
heavy_impact = Image('heavy_impact')
|
||||
crucio = Image('crucio')
|
||||
immolation = Image('immolation')
|
||||
call_of_the_void = Image('call_of_the_void')
|
||||
spawning_pool = Image('spawning_pool')
|
||||
hive = Image('hive')
|
||||
void_rift = Image('void_rift')
|
||||
|
||||
class_colors = {
|
||||
['warrior'] = yellow[0],
|
||||
|
@ -147,6 +189,50 @@ function init()
|
|||
['voider'] = 'purple',
|
||||
}
|
||||
|
||||
character_names = {
|
||||
['vagrant'] = 'Vagrant',
|
||||
['swordsman'] = 'Swordsman',
|
||||
['wizard'] = 'Wizard',
|
||||
['archer'] = 'Archer',
|
||||
['scout'] = 'Scout',
|
||||
['cleric'] = 'Cleric',
|
||||
['outlaw'] = 'Outlaw',
|
||||
['blade'] = 'Blade',
|
||||
['elementor'] = 'Elementor',
|
||||
['saboteur'] = 'Saboteur',
|
||||
['stormweaver'] = 'Stormweaver',
|
||||
['sage'] = 'Sage',
|
||||
['squire'] = 'Squire',
|
||||
['cannoneer'] = 'Cannoneer',
|
||||
['dual_gunner'] = 'Dual Gunner',
|
||||
['hunter'] = 'Hunter',
|
||||
['chronomancer'] = 'Chronomancer',
|
||||
['spellblade'] = 'Spellblade',
|
||||
['psykeeper'] = 'Psykeeper',
|
||||
['engineer'] = 'Engineer',
|
||||
['plague_doctor'] = 'Plague Doctor',
|
||||
['barbarian'] = 'Barbarian',
|
||||
['juggernaut'] = 'Juggernaut',
|
||||
['lich'] = 'Lich',
|
||||
['cryomancer'] = 'Cryomancer',
|
||||
['pyromancer'] = 'Pyromancer',
|
||||
['corruptor'] = 'Corruptor',
|
||||
['beastmaster'] = 'Beastmaster',
|
||||
['launcher'] = 'Launcher',
|
||||
['bard'] = 'Bard',
|
||||
['assassin'] = 'Assassin',
|
||||
['host'] = 'Host',
|
||||
['carver'] = 'Carver',
|
||||
['bane'] = 'Bane',
|
||||
['psykino'] = 'Psykino',
|
||||
['barrager'] = 'Barrager',
|
||||
['highlander'] = 'Highlander',
|
||||
['fairy'] = 'Fairy',
|
||||
['priest'] = 'Priest',
|
||||
['infestor'] = 'Infestor',
|
||||
['flagellant'] = 'Flagellant',
|
||||
}
|
||||
|
||||
character_colors = {
|
||||
['vagrant'] = fg[0],
|
||||
['swordsman'] = yellow[0],
|
||||
|
@ -800,32 +886,183 @@ function init()
|
|||
[6] = 'speed_booster',
|
||||
[12] = 'exploder',
|
||||
[18] = 'swarmer',
|
||||
[24] = 'bouncer',
|
||||
[24] = 'forcer',
|
||||
[25] = 'randomizer',
|
||||
}
|
||||
|
||||
passive_names = {
|
||||
['ouroboros_technique_r'] = 'Ouroboros Technique R',
|
||||
['ouroboros_technique_l'] = 'Ouroboros Technique L',
|
||||
['wall_echo'] = 'Wall Echo',
|
||||
['wall_rider'] = 'Wall Rider',
|
||||
['centipede'] = 'Centipede',
|
||||
['intimidation'] = 'Intimidation',
|
||||
['vulnerability'] = 'Vulnerability',
|
||||
['temporal_chains'] = 'Temporal Chains',
|
||||
['amplify'] = 'Amplify',
|
||||
['amplify_x'] = 'Amplify X',
|
||||
['resonance'] = 'Resonance',
|
||||
['ballista'] = 'Ballista',
|
||||
['ballista_x'] = 'Ballista X',
|
||||
['point_blank'] = 'Point Blank',
|
||||
['longshot'] = 'Longshot',
|
||||
['blunt_arrow'] = 'Blunt Arrow',
|
||||
['explosive_arrow'] = 'Explosive Arrow',
|
||||
['divine_machine_arrow'] = 'Divine Machine Arrow',
|
||||
['chronomancy'] = 'Chronomancy',
|
||||
['awakening'] = 'Awakening',
|
||||
['divine_punishment'] = 'Divine Punishment',
|
||||
['berserking'] = 'Berserking',
|
||||
['unwavering_stance'] = 'Unwavering Stance',
|
||||
['ultimatum'] = 'Ultimatum',
|
||||
['flying_daggers'] = 'Flying Daggers',
|
||||
['assassination'] = 'Assassination',
|
||||
['magnify'] = 'Magnify',
|
||||
['concentrated_fire'] = 'Concentrated Fire',
|
||||
['unleash'] = 'Unleash',
|
||||
['reinforce'] = 'Reinforce',
|
||||
['payback'] = 'Payback',
|
||||
['blessing'] = 'Blessing',
|
||||
['hex_master'] = 'Hex Master',
|
||||
['whispers_of_doom'] = 'Whispers of Doom',
|
||||
['force_push'] = 'Force Push',
|
||||
['heavy_impact'] = 'Heavy Impact',
|
||||
['crucio'] = 'Crucio',
|
||||
['immolation'] = 'Immolation',
|
||||
['call_of_the_void'] = 'Call of the Void',
|
||||
['spawning_pool'] = 'Spawning Pool',
|
||||
['hive'] = 'Hive',
|
||||
['void_rift'] = 'Void Rift',
|
||||
}
|
||||
|
||||
passive_descriptions = {
|
||||
['ouroboros_technique_r'] = '[fg]rotating around yourself to the right makes every unit periodically release projectiles',
|
||||
['ouroboros_technique_l'] = '[fg]rotating around yourself to the left grants +25% defense to all units',
|
||||
['wall_echo'] = '[fg]hitting walls has a [yellow]25%[fg] chance of releasing [yellow]2[fg] projectiles',
|
||||
['wall_rider'] = '[fg]hitting walls grants a [yellow]25%[fg] movement speed buff to your snake for [yellow]1[fg] second',
|
||||
['centipede'] = '[yellow]+20%[fg] movement speed',
|
||||
['intimidation'] = '[fg]enemies spawn with [yellow]-20%[fg] max HP',
|
||||
['vulnerability'] = '[fg]all enemies take [yellow]+20%[fg] damage',
|
||||
['temporal_chains'] = '[fg]all enemies move [yellow]20%[fg] slower',
|
||||
['amplify'] = '[fg]all units that deal AoE damage gain [yellow]+25%[fg] AoE damage',
|
||||
['amplify_x'] = '[yellow]+25%[fg] AoE damage if all your units only deal AoE damage',
|
||||
['resonance'] = '[fg]all AoE attacks deal [yellow]+5%[fg] damage per unit hit',
|
||||
['ballista'] = "[fg]all units that release projectiles and don't deal AoE damage gain [yellow]+25%[fg] damage",
|
||||
['ballista_x'] = "[yellow]+25%[fg] damage if all your units only release projectiles and don't deal AoE damage",
|
||||
['point_blank'] = '[fg]projectiles deal up to [yellow]+100%[fg] damage up close and down to [yellow]-50%[fg] damage far away',
|
||||
['longshot'] = '[fg]projectiles deal up to [yellow]+100%[fg] damage far away and down to [yellow]-50%[fg] up close',
|
||||
['blunt_arrow'] = '[fg]all arrows fired by rangers have a [yellow]20%[fg] chance to knockback',
|
||||
['explosive_arrow'] = '[fg]all arrows fired by rangers have a [yellow]20%[fg] chance to explode, dealing [yellow]+20%[fg] damage in a small area',
|
||||
['divine_machine_arrow'] = '[fg]all arrows fired by rangers have a [yellow]20%[fg] chance to seek enemies and pierce [yellow]5[fg] times',
|
||||
['chronomancy'] = '[fg]all mages cast their spells [yellow]25%[fg] faster',
|
||||
['awakening'] = '[fg]at the start of the round [yellow]1[fg] mage is chosen at random and is granted [yellow]+100%[fg] attack speed and damage for that round',
|
||||
['divine_punishment'] = '[fg]periodically deal [yellow]10X[fg] damage to all enemies, where [yellow]X[fg] is the number of mages you have',
|
||||
['berserking'] = '[fg]all warriors have up to [yellow]+50%[fg]attack speed based on missing HP',
|
||||
['unwavering_stance'] = '[fg]all warriors gain [yellow]+5%[fg] defense every [yellow]5[fg] seconds, up to [yellow]+50%[fg]',
|
||||
['ultimatum'] = '[fg]projectiles that chain gain [yellow]+25%[fg] damage with each chain',
|
||||
['flying_daggers'] = '[fg]all knives thrown by rogues chain [yellow]+2[fg] times',
|
||||
['assassination'] = '[fg]your crits deal [yellow]8x[fg] damage (up from [yellow]4x[fg]) but normal attacks deal [yellow]half[fg] damage',
|
||||
['magnify'] = '[yellow]+25%[fg] area size',
|
||||
['concentrated_fire'] = '[yellow]-50%[fg] area size and [yellow]+50%[fg] area damage',
|
||||
['unleash'] = '[fg]gain [yellow]+5%[fg] area size and damage per second, this resets when an AoE attack happens',
|
||||
['reinforce'] = '[yellow]+10%[fg] damage, defense and attack speed to all allies if you have at least one enchanter',
|
||||
['payback'] = '[yellow]+5%[fg] damage to all allies whenever an enchanter is hit',
|
||||
['blessing'] = '[yellow]+20%[fg] healing effectiveness',
|
||||
['hex_master'] = '[yellow]+25%[fg] curse duration',
|
||||
['whispers_of_doom'] = '[fg]curses apply doom, when [yellow]3[fg] doom instances are applied they are consumed, dealing [yellow]100[fg] damage',
|
||||
['force_push'] = '[yellow]+25%[fg] knockback force',
|
||||
['heavy_impact'] = '[fg]if knockbacked enemies hit walls they take damage according to the knockback force',
|
||||
['crucio'] = '[fg]taking damage shares [yellow]2X[fg] the amount across all enemies',
|
||||
['immolation'] = '[yellow]3[fg] units chosen at random will periodically take damage, all your allies gain [yellow]+8%[fg] damage per tick',
|
||||
['call_of_the_void'] = '[yellow]+25%[fg] damage over time',
|
||||
['spawning_pool'] = '[yellow]+1[fg] critter health',
|
||||
['hive'] = '[yellow]+2[fg] critter health',
|
||||
['void_rift'] = '[fg]all AoE attacks by mages, nukers or voiders have a [yellow]20%[fg] chance to create an area that deals [yellow]50%[fg] damage per second for [yellow]2[fg] seconds',
|
||||
}
|
||||
|
||||
passive_tiers = {
|
||||
['ouroboros_technique_r'] = 2,
|
||||
['ouroboros_technique_l'] = 2,
|
||||
['wall_echo'] = 1,
|
||||
['wall_rider'] = 1,
|
||||
['centipede'] = 1,
|
||||
['intimidation'] = 2,
|
||||
['vulnerability'] = 2,
|
||||
['temporal_chains'] = 1,
|
||||
['amplify'] = 1,
|
||||
['amplify_x'] = 1,
|
||||
['resonance'] = 2,
|
||||
['ballista'] = 1,
|
||||
['ballista_x'] = 1,
|
||||
['point_blank'] = 2,
|
||||
['longshot'] = 2,
|
||||
['blunt_arrow'] = 1,
|
||||
['explosive_arrow'] = 2,
|
||||
['divine_machine_arrow'] = 3,
|
||||
['chronomancy'] = 2,
|
||||
['awakening'] = 2,
|
||||
['divine_punishment'] = 3,
|
||||
['berserking'] = 1,
|
||||
['unwavering_stance'] = 1,
|
||||
['ultimatum'] = 2,
|
||||
['flying_daggers'] = 3,
|
||||
['assassination'] = 1,
|
||||
['magnify'] = 1,
|
||||
['concentrated_fire'] = 2,
|
||||
['unleash'] = 1,
|
||||
['reinforce'] = 2,
|
||||
['payback'] = 2,
|
||||
['blessing'] = 1,
|
||||
['hex_master'] = 1,
|
||||
['whispers_of_doom'] = 2,
|
||||
['force_push'] = 1,
|
||||
['heavy_impact'] = 2,
|
||||
['crucio'] = 3,
|
||||
['immolation'] = 2,
|
||||
['call_of_the_void'] = 2,
|
||||
['spawning_pool'] = 1,
|
||||
['hive'] = 3,
|
||||
['void_rift'] = 3,
|
||||
}
|
||||
|
||||
tier_to_passives = {
|
||||
[1] = {'wall_echo', 'wall_rider', 'centipede', 'temporal_chains', 'amplify', 'amplify_x', 'ballista', 'ballista_x', 'blunt_arrow', 'berserking', 'unwavering_stance', 'assassination', 'unleash', 'blessing',
|
||||
'hex_master', 'force_push', 'spawning_pool'},
|
||||
[2] = {'ouroboros_technique_r', 'ouroboros_technique_l', 'intimidation', 'vulnerability', 'resonance', 'point_blank', 'longshot', 'explosive_arrow', 'chronomancy', 'awakening', 'ultimatum', 'concentrated_fire',
|
||||
'reinforce', 'payback', 'whispers_of_doom', 'heavy_impact', 'immolation', 'call_of_the_void'},
|
||||
[3] = {'divine_machine_arrow', 'divine_punishment', 'flying_daggers', 'crucio', 'hive', 'void_rift'},
|
||||
}
|
||||
|
||||
level_to_passive_tier_weights = {
|
||||
[3] = {70, 20, 10},
|
||||
[6] = {60, 25, 15},
|
||||
[9] = {50, 30, 20},
|
||||
[12] = {40, 40, 20},
|
||||
[15] = {30, 45, 25},
|
||||
[18] = {20, 50, 30},
|
||||
[21] = {20, 40, 40},
|
||||
[24] = {20, 30, 50},
|
||||
}
|
||||
|
||||
gold = 2
|
||||
|
||||
main = Main()
|
||||
main:add(BuyScreen'buy_screen')
|
||||
main:go_to('buy_screen', 22, {
|
||||
{character = 'flagellant', level = 3},
|
||||
{character = 'scout', level = 3},
|
||||
{character = 'archer', level = 3},
|
||||
})
|
||||
--[[
|
||||
main:add(Arena'arena')
|
||||
main:go_to('arena', 18, {
|
||||
{character = 'scout', level = 3},
|
||||
{character = 'engineer', level = 3},
|
||||
{character = 'wizard', level = 3},
|
||||
main:add(BuyScreen'buy_screen')
|
||||
main:go_to('buy_screen', 3, {
|
||||
{character = 'swordsman', level = 3},
|
||||
{character = 'outlaw', level = 3},
|
||||
{character = 'wizard', level = 3},
|
||||
{character = 'scout', level = 3},
|
||||
{character = 'archer', level = 3},
|
||||
{character = 'cannoneer', level = 3},
|
||||
{character = 'spellblade', level = 3},
|
||||
})
|
||||
]]--
|
||||
main:add(Arena'arena')
|
||||
main:go_to('arena', 3, {
|
||||
{character = 'swordsman', level = 3},
|
||||
{character = 'wizard', level = 3},
|
||||
{character = 'scout', level = 3},
|
||||
{character = 'archer', level = 3},
|
||||
})
|
||||
end
|
||||
|
||||
|
||||
|
|
|
@ -572,7 +572,7 @@ function Player:update(dt)
|
|||
if input.move_right.down then self.r = self.r + 1.66*math.pi*dt end
|
||||
self:set_velocity(self.v*math.cos(self.r), self.v*math.sin(self.r))
|
||||
|
||||
if not main.current.won then
|
||||
if not main.current.won and not main.current.choosing_passives then
|
||||
local vx, vy = self:get_velocity()
|
||||
local hd = math.remap(math.abs(self.x - gw/2), 0, 192, 1, 0)
|
||||
local vd = math.remap(math.abs(self.y - gh/2), 0, 108, 1, 0)
|
||||
|
|
28
todo
|
@ -82,19 +82,19 @@
|
|||
* Infestor [curser, swarmer]: curses nearby enemies for 6 seconds, they will release multiple critters on death - Lv.3: Infestation - triples the number of critters released
|
||||
* Flagellant [psyker, enchanter]: periodically deals damage to self and grants a damage buff to all allies - Lv.3: Zealotry - deals damage to all allies instead and also grants a massive damage buff
|
||||
* Sets
|
||||
Ranger = 8/8
|
||||
Warrior = 8/8
|
||||
Mage = 8/8
|
||||
Rogue = 8/8
|
||||
Nuker = 7/7
|
||||
Conjurer = 5/5
|
||||
Forcer = 5/5
|
||||
Voider = 5/5
|
||||
Psyker = 4/4
|
||||
Healer = 5/5
|
||||
Enchanter = 5/5
|
||||
Curser = 5/5
|
||||
Swarmer = 4/4
|
||||
* Ranger = 7/7
|
||||
* Warrior = 8/8
|
||||
* Mage = 8/8
|
||||
* Rogue = 8/8
|
||||
* Nuker = 7/7
|
||||
* Conjurer = 5/5
|
||||
* Forcer = 5/5
|
||||
* Voider = 5/5
|
||||
* Psyker = 4/4
|
||||
* Healer = 5/5
|
||||
* Enchanter = 5/5
|
||||
* Curser = 5/5
|
||||
* Swarmer = 4/4
|
||||
|
||||
10. Items
|
||||
Ouroboros Technique R: rotating around yourself to the right makes every unit periodically release projectiles
|
||||
|
@ -122,7 +122,7 @@
|
|||
11. Steam integration: achievements, etc
|
||||
12. Hovering over a party member should show which set they belong to and vice-versa
|
||||
13. Show a unit DPS list like Underlord's to the right side of the screen
|
||||
14. Warriors that deal AoE damage should deal extra damage based on number of enemies hit
|
||||
* 14. Warriors that deal AoE damage should deal extra damage based on number of enemies hit
|
||||
15. GO button is grayed out and thus doesn't say it's meant to be clicked on
|
||||
16. 28/20 enemies or 4/3 wave confuses players and makes them think the level goals are bugged
|
||||
17. Music for first 9-15 levels should be calm rather than upbeat
|
||||
|
|