Orb update 3/4
|
@ -377,7 +377,7 @@ function Arena:update(dt)
|
|||
'defensive_stance', 'offensive_stance', 'kinetic_bomb', 'porcupine_technique', 'last_stand', 'seeping', 'deceleration', 'annihilation', 'malediction', 'hextouch', 'whispers_of_doom',
|
||||
'tremor', 'heavy_impact', 'fracture', 'meat_shield', 'hive', 'baneling_burst', 'blunt_arrow', 'explosive_arrow', 'divine_machine_arrow', 'chronomancy', 'awakening', 'divine_punishment',
|
||||
'assassination', 'flying_daggers', 'ultimatum', 'magnify', 'echo_barrage', 'unleash', 'reinforce', 'payback', 'enchanted', 'freezing_field', 'burning_field', 'gravity_field', 'magnetism',
|
||||
'insurance', 'dividends', 'berserking', 'unwavering_stance', 'unrelenting_stance'
|
||||
'insurance', 'dividends', 'berserking', 'unwavering_stance', 'unrelenting_stance', 'blessing', 'haste', 'divine_barrage', 'orbitism', 'psyker_orbs', 'psychosense', 'rearm', 'taunt', 'summon_instability',
|
||||
}
|
||||
max_units = 7 + current_new_game_plus
|
||||
main:add(BuyScreen'buy_screen')
|
||||
|
@ -798,7 +798,7 @@ function Arena:die()
|
|||
'defensive_stance', 'offensive_stance', 'kinetic_bomb', 'porcupine_technique', 'last_stand', 'seeping', 'deceleration', 'annihilation', 'malediction', 'hextouch', 'whispers_of_doom',
|
||||
'tremor', 'heavy_impact', 'fracture', 'meat_shield', 'hive', 'baneling_burst', 'blunt_arrow', 'explosive_arrow', 'divine_machine_arrow', 'chronomancy', 'awakening', 'divine_punishment',
|
||||
'assassination', 'flying_daggers', 'ultimatum', 'magnify', 'echo_barrage', 'unleash', 'reinforce', 'payback', 'enchanted', 'freezing_field', 'burning_field', 'gravity_field', 'magnetism',
|
||||
'insurance', 'dividends', 'berserking', 'unwavering_stance', 'unrelenting_stance'
|
||||
'insurance', 'dividends', 'berserking', 'unwavering_stance', 'unrelenting_stance', 'blessing', 'haste', 'divine_barrage', 'orbitism', 'psyker_orbs', 'psychosense', 'rearm', 'taunt', 'summon_instability',
|
||||
}
|
||||
max_units = 7 + current_new_game_plus
|
||||
main:add(BuyScreen'buy_screen')
|
||||
|
|
After Width: | Height: | Size: 278 B |
After Width: | Height: | Size: 465 B |
After Width: | Height: | Size: 392 B |
After Width: | Height: | Size: 480 B |
After Width: | Height: | Size: 470 B |
After Width: | Height: | Size: 524 B |
After Width: | Height: | Size: 512 B |
After Width: | Height: | Size: 446 B |
After Width: | Height: | Size: 468 B |
After Width: | Height: | Size: 376 B |
After Width: | Height: | Size: 439 B |
|
@ -144,7 +144,7 @@ function BuyScreen:on_enter(from, level, units, passives, shop_level, shop_xp)
|
|||
'defensive_stance', 'offensive_stance', 'kinetic_bomb', 'porcupine_technique', 'last_stand', 'seeping', 'deceleration', 'annihilation', 'malediction', 'hextouch', 'whispers_of_doom',
|
||||
'tremor', 'heavy_impact', 'fracture', 'meat_shield', 'hive', 'baneling_burst', 'blunt_arrow', 'explosive_arrow', 'divine_machine_arrow', 'chronomancy', 'awakening', 'divine_punishment',
|
||||
'assassination', 'flying_daggers', 'ultimatum', 'magnify', 'echo_barrage', 'unleash', 'reinforce', 'payback', 'enchanted', 'freezing_field', 'burning_field', 'gravity_field', 'magnetism',
|
||||
'insurance', 'dividends', 'berserking', 'unwavering_stance', 'unrelenting_stance'
|
||||
'insurance', 'dividends', 'berserking', 'unwavering_stance', 'unrelenting_stance', 'blessing', 'haste', 'divine_barrage', 'orbitism', 'psyker_orbs', 'psychosense', 'rearm', 'taunt', 'summon_instability',
|
||||
}
|
||||
max_units = 7 + current_new_game_plus
|
||||
main:add(BuyScreen'buy_screen')
|
||||
|
@ -547,7 +547,7 @@ function RestartButton:update(dt)
|
|||
'defensive_stance', 'offensive_stance', 'kinetic_bomb', 'porcupine_technique', 'last_stand', 'seeping', 'deceleration', 'annihilation', 'malediction', 'hextouch', 'whispers_of_doom',
|
||||
'tremor', 'heavy_impact', 'fracture', 'meat_shield', 'hive', 'baneling_burst', 'blunt_arrow', 'explosive_arrow', 'divine_machine_arrow', 'chronomancy', 'awakening', 'divine_punishment',
|
||||
'assassination', 'flying_daggers', 'ultimatum', 'magnify', 'echo_barrage', 'unleash', 'reinforce', 'payback', 'enchanted', 'freezing_field', 'burning_field', 'gravity_field', 'magnetism',
|
||||
'insurance', 'dividends', 'berserking', 'unwavering_stance', 'unrelenting_stance'
|
||||
'insurance', 'dividends', 'berserking', 'unwavering_stance', 'unrelenting_stance', 'blessing', 'haste', 'divine_barrage', 'orbitism', 'psyker_orbs', 'psychosense', 'rearm', 'taunt', 'summon_instability',
|
||||
}
|
||||
system.save_state()
|
||||
main:add(BuyScreen'buy_screen')
|
||||
|
@ -1836,7 +1836,19 @@ function ClassIcon:draw()
|
|||
graphics.rectangle(self.x, self.y, 16, 24, 4, 4, self.highlighted and fg[0] or ((n >= i) and class_colors[self.class] or bg[3]))
|
||||
_G[self.class]:draw(self.x, self.y, 0, 0.3, 0.3, 0, 0, self.highlighted and fg[-5] or ((n >= i) and _G[class_color_strings[self.class]][-5] or bg[10]))
|
||||
graphics.rectangle(self.x, self.y + 26, 16, 16, 3, 3, self.highlighted and fg[0] or bg[3])
|
||||
if i == 2 and not k then
|
||||
if i == 1 then
|
||||
if self.highlighted then
|
||||
graphics.rectangle(self.x, self.y + 26, 3, 9, nil, nil, (n >= 1) and fg[-5] or fg[-10])
|
||||
else
|
||||
graphics.rectangle(self.x, self.y + 26, 3, 9, nil, nil, (n >= 1) and class_colors[self.class] or bg[10])
|
||||
end
|
||||
if next_n then
|
||||
if next_n == 1 then
|
||||
graphics.rectangle(self.x, self.y + 26, 3, 9, nil, nil, self.flash and class_colors[self.class] or bg[10])
|
||||
end
|
||||
end
|
||||
|
||||
elseif i == 2 and not k then
|
||||
if self.highlighted then
|
||||
graphics.line(self.x - 3, self.y + 20, self.x - 3, self.y + 25, (n >= 1) and fg[-5] or fg[-10], 3)
|
||||
graphics.line(self.x - 3, self.y + 27, self.x - 3, self.y + 32, (n >= 2) and fg[-5] or fg[-10], 3)
|
||||
|
|
10
enemies.lua
|
@ -307,11 +307,13 @@ function Seeker:update(dt)
|
|||
self:set_angular_damping(0)
|
||||
end
|
||||
else
|
||||
local target = main.current.player
|
||||
if self.taunted then target = self.taunted end
|
||||
if self.taunted and self.taunted.dead then target = main.current.player; self.taunted = nil end
|
||||
if self.headbutt_charging or self.shooting then
|
||||
self:set_damping(10)
|
||||
self:rotate_towards_object(main.current.player, 0.5)
|
||||
self:rotate_towards_object(target, 0.5)
|
||||
elseif not self.headbutting then
|
||||
local player = main.current.player
|
||||
if self.boss then
|
||||
local enemies = main.current.main:get_objects_by_classes(main.current.enemies)
|
||||
local x, y = 0, 0
|
||||
|
@ -323,12 +325,12 @@ function Seeker:update(dt)
|
|||
x = x/#enemies
|
||||
y = y/#enemies
|
||||
else
|
||||
x, y = player.x, player.y
|
||||
x, y = target.x, target.y
|
||||
end
|
||||
self:seek_point(x, y)
|
||||
self:wander(10, 250, 3)
|
||||
else
|
||||
self:seek_point(player.x, player.y)
|
||||
self:seek_point(target.x, target.y)
|
||||
self:wander(50, 100, 20)
|
||||
end
|
||||
self:steering_separate(16, main.current.enemies)
|
||||
|
|
104
main.lua
|
@ -146,6 +146,7 @@ function init()
|
|||
voider = Image('voider')
|
||||
sorcerer = Image('sorcerer')
|
||||
mercenary = Image('mercenary')
|
||||
explorer = Image('explorer')
|
||||
star = Image('star')
|
||||
arrow = Image('arrow')
|
||||
centipede = Image('centipede')
|
||||
|
@ -202,6 +203,15 @@ function init()
|
|||
berserking = Image('berserking')
|
||||
unwavering_stance = Image('unwavering_stance')
|
||||
unrelenting_stance = Image('unrelenting_stance')
|
||||
blessing = Image('blessing')
|
||||
haste = Image('haste')
|
||||
divine_barrage = Image('divine_barrage')
|
||||
orbitism = Image('orbitism')
|
||||
psyker_orbs = Image('psyker_orbs')
|
||||
psychosense = Image('psychosense')
|
||||
rearm = Image('rearm')
|
||||
taunt = Image('taunt')
|
||||
summon_instability = Image('summon_instability')
|
||||
|
||||
class_colors = {
|
||||
['warrior'] = yellow[0],
|
||||
|
@ -219,6 +229,7 @@ function init()
|
|||
['voider'] = purple[0],
|
||||
['sorcerer'] = blue2[0],
|
||||
['mercenary'] = yellow2[0],
|
||||
['explorer'] = fg[0],
|
||||
}
|
||||
|
||||
class_color_strings = {
|
||||
|
@ -237,6 +248,7 @@ function init()
|
|||
['voider'] = 'purple',
|
||||
['sorcerer'] = 'blue2',
|
||||
['mercenary'] = 'yellow2',
|
||||
['explorer'] = 'fg',
|
||||
}
|
||||
|
||||
character_names = {
|
||||
|
@ -411,7 +423,7 @@ function init()
|
|||
}
|
||||
|
||||
character_classes = {
|
||||
['vagrant'] = {'psyker', 'ranger', 'warrior'},
|
||||
['vagrant'] = {'explorer', 'psyker'},
|
||||
['swordsman'] = {'warrior'},
|
||||
['wizard'] = {'mage', 'nuker'},
|
||||
['magician'] = {'mage'},
|
||||
|
@ -468,7 +480,7 @@ function init()
|
|||
}
|
||||
|
||||
character_class_strings = {
|
||||
['vagrant'] = '[fg]Psyker, [green]Ranger, [yellow]Warrior',
|
||||
['vagrant'] = '[fg]Explorer, Psyker',
|
||||
['swordsman'] = '[yellow]Warrior',
|
||||
['wizard'] = '[blue]Mage, [red]Nuker',
|
||||
['magician'] = '[blue]Mage',
|
||||
|
@ -560,7 +572,7 @@ function init()
|
|||
['hunter'] = function(lvl) return '[fg]shoots an arrow that deals [yellow]' .. get_character_stat('hunter', lvl, 'dmg') .. '[fg] damage and has a [yellow]20%[fg] chance to summon a pet' end,
|
||||
['chronomancer'] = function(lvl) return '[yellow]+20%[fg] attack speed to all allies' end,
|
||||
['spellblade'] = function(lvl) return '[fg]throws knives that deal [yellow]' .. get_character_stat('spellblade', lvl, 'dmg') .. '[fg] damage, pierce and spiral outwards' end,
|
||||
['psykeeper'] = function(lvl) return '[fg]all damage taken is stored up to [yellow]50%[fg] max HP and distributed as healing to all allies' end,
|
||||
['psykeeper'] = function(lvl) return '[fg]creates [yellow]1[fg] healing orb every time the psykeeper takes [yellow]20%[fg] of its max HP in damage' end,
|
||||
['engineer'] = function(lvl) return '[fg]drops sentries that shoot bursts of projectiles, each dealing [yellow]' .. get_character_stat('engineer', lvl, 'dmg') .. '[fg] damage' end,
|
||||
['plague_doctor'] = function(lvl) return '[fg]creates an area that deals [yellow]' .. get_character_stat('plague_doctor', lvl, 'dmg') .. '[fg] damage per second' end,
|
||||
['barbarian'] = function(lvl) return '[fg]deals [yellow]' .. get_character_stat('barbarian', lvl, 'dmg') .. '[fg] AoE damage and stuns enemies hit for [yellow]4[fg] seconds' end,
|
||||
|
@ -599,7 +611,7 @@ function init()
|
|||
}
|
||||
|
||||
character_effect_names = {
|
||||
['vagrant'] = '[fg]Champion',
|
||||
['vagrant'] = '[fg]Experience',
|
||||
['swordsman'] = '[yellow]Cleave',
|
||||
['wizard'] = '[blue]Magic Missile',
|
||||
['magician'] = '[blue]Ethereal Form',
|
||||
|
@ -656,7 +668,7 @@ function init()
|
|||
}
|
||||
|
||||
character_effect_names_gray = {
|
||||
['vagrant'] = '[light_bg]Champion',
|
||||
['vagrant'] = '[light_bg]Experience',
|
||||
['swordsman'] = '[light_bg]Cleave',
|
||||
['wizard'] = '[light_bg]Magic Missile',
|
||||
['magician'] = '[light_bg]Ethereal Form',
|
||||
|
@ -732,7 +744,7 @@ function init()
|
|||
['hunter'] = function() return '[fg]summons [yellow]3[fg] pets and the pets ricochet off walls once' end,
|
||||
['chronomancer'] = function() return '[fg]enemies take damage over time [yellow]50%[fg] faster' end,
|
||||
['spellblade'] = function() return '[fg]faster projectile speed and tighter turns' end,
|
||||
['psykeeper'] = function() return '[fg]also redistributes damage taken as damage to all enemies at [yellow]double[fg] value' end,
|
||||
['psykeeper'] = function() return '[fg]deal [yellow]double[fg] the damage taken by the psykeeper to all enemies' end,
|
||||
['engineer'] = function() return '[fg]drops [yellow]2[fg] additional turrets and grants all turrets [yellow]+50%[fg] damage and attack speed' end,
|
||||
['plague_doctor'] = function() return '[fg]nearby enemies take an additional [yellow]' .. get_character_stat('plague_doctor', 3, 'dmg') .. '[fg] damage per second' end,
|
||||
['barbarian'] = function() return '[fg]stunned enemies also take [yellow]100%[fg] increased damage' end,
|
||||
|
@ -789,7 +801,7 @@ function init()
|
|||
['hunter'] = function() return '[light_bg]summons 3 pets and the pets ricochet off walls once' end,
|
||||
['chronomancer'] = function() return '[light_bg]enemies take damage over time 50% faster' end,
|
||||
['spellblade'] = function() return '[light_bg]faster projectile speed and tighter turns' end,
|
||||
['psykeeper'] = function() return '[light_bg]also redistributes damage taken as damage to all enemies at double value' end,
|
||||
['psykeeper'] = function() return '[light_bg]deal double the damage taken by the psykeeper to all enemies' end,
|
||||
['engineer'] = function() return '[light_bg]drops 2 additional turrets and grants all turrets +50% damage and attack speed' end,
|
||||
['plague_doctor'] = function() return '[light_bg]nearby enemies take an additional ' .. get_character_stat('plague_doctor', 3, 'dmg') .. ' damage per second' end,
|
||||
['barbarian'] = function() return '[light_bg]stunned enemies also take 100% increased damage' end,
|
||||
|
@ -899,6 +911,7 @@ function init()
|
|||
['voider'] = {hp = 0.75, dmg = 1.3, aspd = 1, area_dmg = 0.8, area_size = 0.75, def = 0.6, mvspd = 0.8},
|
||||
['sorcerer'] = {hp = 0.8, dmg = 1.3, aspd = 1, area_dmg = 1.2, area_size = 1, def = 0.8, mvspd = 1},
|
||||
['mercenary'] = {hp = 1, dmg = 1, aspd = 1, area_dmg = 1, area_size = 1, def = 1, mvspd = 1},
|
||||
['explorer'] = {hp = 1, dmg = 1, aspd = 1, area_dmg = 1, area_size = 1, def = 1, mvspd = 1.25},
|
||||
['seeker'] = {hp = 0.5, dmg = 1, aspd = 1, area_dmg = 1, area_size = 1, def = 1, mvspd = 0.3},
|
||||
['mini_boss'] = {hp = 1, dmg = 1, aspd = 1, area_dmg = 1, area_size = 1, def = 1, mvspd = 0.3},
|
||||
['enemy_critter'] = {hp = 1, dmg = 1, aspd = 1, area_dmg = 1, area_size = 1, def = 1, mvspd = 0.5},
|
||||
|
@ -929,7 +942,7 @@ function init()
|
|||
['enchanter'] = function(lvl) return '[' .. ylb1(lvl) .. ']2[light_bg]/[' .. ylb2(lvl) .. ']4 [fg]- [' .. ylb1(lvl) .. ']+15%[light_bg]/[' .. ylb2(lvl) .. ']+25% [fg]damage to all allies' end,
|
||||
['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, it inherits damage from its target' 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,
|
||||
['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,
|
||||
|
@ -939,6 +952,7 @@ function init()
|
|||
ylb1(lvl) .. ']4[light_bg]/[' .. ylb2(lvl) .. ']3[light_bg]/[' .. ylb3(lvl) .. ']2[fg] attacks'
|
||||
end,
|
||||
['mercenary'] = function(lvl) return '[' .. ylb1(lvl) .. ']2[light_bg]/[' .. ylb2(lvl) .. ']4 [fg]- [' .. ylb1(lvl) .. ']+8%[light_bg]/[' .. ylb2(lvl) .. ']+16% [fg]chance for enemies to drop gold on death' end,
|
||||
['explorer'] = function(lvl) return '[yellow]+15%[fg] attack speed and damage per active set to allied explorers' end,
|
||||
}
|
||||
|
||||
tier_to_characters = {
|
||||
|
@ -1030,6 +1044,7 @@ function init()
|
|||
local voiders = 0
|
||||
local sorcerers = 0
|
||||
local mercenaries = 0
|
||||
local explorers = 0
|
||||
for _, unit in ipairs(units) do
|
||||
for _, unit_class in ipairs(character_classes[unit.character]) do
|
||||
if unit_class == 'ranger' then rangers = rangers + 1 end
|
||||
|
@ -1047,10 +1062,11 @@ function init()
|
|||
if unit_class == 'voider' then voiders = voiders + 1 end
|
||||
if unit_class == 'sorcerer' then sorcerers = sorcerers + 1 end
|
||||
if unit_class == 'mercenary' then mercenaries = mercenaries + 1 end
|
||||
if unit_class == 'explorer' then explorers = explorers + 1 end
|
||||
end
|
||||
end
|
||||
return {ranger = rangers, warrior = warriors, healer = healers, mage = mages, nuker = nukers, conjurer = conjurers, rogue = rogues,
|
||||
enchanter = enchanters, psyker = psykers, curser = cursers, forcer = forcers, swarmer = swarmers, voider = voiders, sorcerer = sorcerers, mercenary = mercenaries}
|
||||
enchanter = enchanters, psyker = psykers, curser = cursers, forcer = forcers, swarmer = swarmers, voider = voiders, sorcerer = sorcerers, mercenary = mercenaries, explorer = explorers}
|
||||
end
|
||||
|
||||
get_class_levels = function(units)
|
||||
|
@ -1060,7 +1076,7 @@ function init()
|
|||
if number_of_units >= 6 then return 2
|
||||
elseif number_of_units >= 3 then return 1
|
||||
else return 0 end
|
||||
elseif class == 'healer' or class == 'conjurer' or class == 'enchanter' or class == 'psyker' or class == 'curser' or class == 'forcer' or class == 'swarmer' or class == 'voider' or class == 'mercenary' then
|
||||
elseif class == 'healer' or class == 'conjurer' or class == 'enchanter' or class == 'curser' or class == 'forcer' or class == 'swarmer' or class == 'voider' or class == 'mercenary' then
|
||||
if number_of_units >= 4 then return 2
|
||||
elseif number_of_units >= 2 then return 1
|
||||
else return 0 end
|
||||
|
@ -1069,6 +1085,9 @@ function init()
|
|||
elseif number_of_units >= 4 then return 2
|
||||
elseif number_of_units >= 2 then return 1
|
||||
else return 0 end
|
||||
elseif class == 'explorer' or class == 'psyker' then
|
||||
if number_of_units >= 1 then return 1
|
||||
else return 0 end
|
||||
end
|
||||
end
|
||||
return {
|
||||
|
@ -1087,6 +1106,7 @@ function init()
|
|||
voider = units_to_class_level(units_per_class.voider, 'voider'),
|
||||
sorcerer = units_to_class_level(units_per_class.sorcerer, 'sorcerer'),
|
||||
mercenary = units_to_class_level(units_per_class.mercenary, 'mercenary'),
|
||||
explorer = units_to_class_level(units_per_class.explorer, 'explorer'),
|
||||
}
|
||||
end
|
||||
|
||||
|
@ -1107,13 +1127,14 @@ function init()
|
|||
['healer'] = function(units) return 2, 4, nil, get_number_of_units_per_class(units).healer end,
|
||||
['conjurer'] = function(units) return 2, 4, nil, get_number_of_units_per_class(units).conjurer end,
|
||||
['enchanter'] = function(units) return 2, 4, nil, get_number_of_units_per_class(units).enchanter end,
|
||||
['psyker'] = function(units) return 2, 4, nil, get_number_of_units_per_class(units).psyker end,
|
||||
['psyker'] = function(units) return 1, 1, nil, get_number_of_units_per_class(units).psyker end,
|
||||
['curser'] = function(units) return 2, 4, nil, get_number_of_units_per_class(units).curser end,
|
||||
['forcer'] = function(units) return 2, 4, nil, get_number_of_units_per_class(units).forcer end,
|
||||
['swarmer'] = function(units) return 2, 4, nil, get_number_of_units_per_class(units).swarmer end,
|
||||
['voider'] = function(units) return 2, 4, nil, get_number_of_units_per_class(units).voider end,
|
||||
['sorcerer'] = function(units) return 2, 4, 6, get_number_of_units_per_class(units).sorcerer end,
|
||||
['mercenary'] = function(units) return 2, 4, nil, get_number_of_units_per_class(units).mercenary end,
|
||||
['explorer'] = function(units) return 1, 1, nil, get_number_of_units_per_class(units).explorer end,
|
||||
}
|
||||
|
||||
passive_names = {
|
||||
|
@ -1171,6 +1192,15 @@ function init()
|
|||
['berserking'] = 'Berserking',
|
||||
['unwavering_stance'] = 'Unwavering Stance',
|
||||
['unrelenting_stance'] = 'Unrelenting Stance',
|
||||
['blessing'] = 'Blessing',
|
||||
['haste'] = 'Haste',
|
||||
['divine_barrage'] = 'Divine Barrage',
|
||||
['orbitism'] = 'Orbitism',
|
||||
['psyker_orbs'] = 'Psyker Orbs',
|
||||
['psychosense'] = 'Psychosense',
|
||||
['rearm'] = 'Rearm',
|
||||
['taunt'] = 'Taunt',
|
||||
['summon_instability'] = 'Summon Instability',
|
||||
}
|
||||
|
||||
passive_descriptions = {
|
||||
|
@ -1216,9 +1246,9 @@ 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 with at least one enchanter',
|
||||
['reinforce'] = '[yellow]+10/20/30%[fg] damage, defense and aspd to all allies if you have >=1 enchanter',
|
||||
['payback'] = '[yellow]+2/5/8%[fg] damage to all allies whenever an enchanter is hit',
|
||||
['enchanted'] = '[yellow]+10/20/30%[fg] attack speed to a random unit with at least two enchanters',
|
||||
['enchanted'] = '[yellow]+33/66/99%[fg] attack speed to a random unit if you have >=2 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',
|
||||
|
@ -1228,6 +1258,15 @@ function init()
|
|||
['berserking'] = '[fg]all warriors have up to [yellow]+50/75/100%[fg] attack speed based on missing HP',
|
||||
['unwavering_stance'] = '[fg]all warriors gain [yellow]+4/8/12%[fg] defense every [yellow]5[fg] seconds',
|
||||
['unrelenting_stance'] = '[yellow]+2/5/8%[fg] defense to all allies whenever a warrior is hit',
|
||||
['blessing'] = '[yellow]+10/20/30%[fg] healing effectiveness',
|
||||
['haste'] = '[yellow]+50%[fg] movement speed that decays over [yellow]4[fg] seconds on healing orb pick up',
|
||||
['divine_barrage'] = '[yellow]20/40/60%[fg] chance to release a ricocheting barrage on healing orb pick up',
|
||||
['orbitism'] = '[yellow]+33/66/99%[fg] orb movement speed',
|
||||
['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',
|
||||
['summon_instability'] = '[fg]summons explode when disappearing, dealing [yellow]100/150/200%[fg] damage',
|
||||
}
|
||||
|
||||
local ts = function(lvl, a, b, c) return '[' .. ylb1(lvl) .. ']' .. tostring(a) .. '[light_bg]/[' .. ylb2(lvl) .. ']' .. tostring(b) .. '[light_bg]/[' .. ylb3(lvl) .. ']' .. tostring(c) .. '[fg]' end
|
||||
|
@ -1274,9 +1313,9 @@ 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 with at least one enchanter' end,
|
||||
['reinforce'] = function(lvl) return ts(lvl, '+10%', '20%', '30%') .. ' damage, defense and aspd to all allies if you have >=1 enchanter' 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, '+10%', '20%', '30%') .. ' attack speed to a random unit with at least two enchanters' end,
|
||||
['enchanted'] = function(lvl) return ts(lvl, '+33%', '66%', '99%') .. ' attack speed to a random unit if you have >=2 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,
|
||||
|
@ -1286,6 +1325,15 @@ function init()
|
|||
['berserking'] = function(lvl) return '[fg]all warriors have up to ' .. ts(lvl, '+50%', '75%', '100%') .. ' attack speed based on missing HP' end,
|
||||
['unwavering_stance'] = function(lvl) return '[fg]all warriors gain ' .. ts(lvl, '+4%', '8%', '12%') .. ' defense every [yellow]5[fg] seconds' end,
|
||||
['unrelenting_stance'] = function(lvl) return ts(lvl, '+2%', '5%', '8%') .. ' defense to all allies whenever a warrior is hit' end,
|
||||
['blessing'] = function(lvl) return ts(lvl, '+10%', '20%', '30%') .. ' healing effectiveness' end,
|
||||
['haste'] = function(lvl) return '[yellow]+50%[fg] movement speed that decays over [yellow]4[fg] seconds on healing orb pick up' end,
|
||||
['divine_barrage'] = function(lvl) return ts(lvl, '20%', '40%', '60%') .. ' chance to release a ricocheting barrage on healing orb pick up' end,
|
||||
['orbitism'] = function(lvl) return ts(lvl, '+33%', '66%', '99%') .. ' orb movement speed' end,
|
||||
['psyker_orbs'] = function(lvl) return ts(lvl, '+1', '2', '3') .. ' psyker orbs' end,
|
||||
['psychosense'] = function(lvl) return ts(lvl, '+33%', '66%', '99%') .. ' orb range' end,
|
||||
['rearm'] = function(lvl) return '[fg]summons repeat their attacks once' end,
|
||||
['taunt'] = function(lvl) return ts(lvl, '10%', '20%', '30%') .. ' chance for summons to taunt nearby enemies on attack' end,
|
||||
['summon_instability'] = function(lvl) return '[fg]summons explode when disappearing, dealing [yellow]100/150/200%[fg] damage' end,
|
||||
}
|
||||
|
||||
level_to_tier_weights = {
|
||||
|
@ -1473,7 +1521,7 @@ function init()
|
|||
unlevellable_items = {
|
||||
'speed_3', 'damage_4', 'shoot_5', 'death_6', 'lasting_7', 'kinetic_bomb', 'porcupine_technique', 'last_stand', 'annihilation',
|
||||
'tremor', 'heavy_impact', 'fracture', 'meat_shield', 'divine_punishment', 'unleash', 'freezing_field', 'burning_field', 'gravity_field',
|
||||
'magnetism', 'insurance', 'dividends'
|
||||
'magnetism', 'insurance', 'dividends', 'haste', 'rearm',
|
||||
}
|
||||
|
||||
steam.userStats.requestCurrentStats()
|
||||
|
@ -1486,10 +1534,8 @@ function init()
|
|||
main_song_instance = _G[random:table{'song1', 'song2', 'song3', 'song4', 'song5'}]:play{volume = 0.5}
|
||||
main = Main()
|
||||
|
||||
--[[
|
||||
main:add(MainMenu'mainmenu')
|
||||
main:go_to('mainmenu')
|
||||
]]--
|
||||
|
||||
--[[
|
||||
main:add(BuyScreen'buy_screen')
|
||||
|
@ -1497,18 +1543,16 @@ function init()
|
|||
]]--
|
||||
-- main:go_to('buy_screen', 7, run.units or {}, {'unleash'})
|
||||
|
||||
--[[
|
||||
main:add(Arena'arena')
|
||||
main:go_to('arena', 4, {
|
||||
{character = 'psykeeper', level = 3},
|
||||
{character = 'vagrant', level = 1},
|
||||
{character = 'psychic', level = 1},
|
||||
{character = 'flagellant', level = 1},
|
||||
--[[
|
||||
{character = 'priest', level = 1},
|
||||
{character = 'cleric', level = 1},
|
||||
{character = 'fairy', level = 1},
|
||||
]]--
|
||||
}, {})
|
||||
main:go_to('arena', 10, {
|
||||
{character = 'illusionist', level = 2},
|
||||
-- {character = 'carver', level = 2},
|
||||
{character = 'engineer', level = 2},
|
||||
-- {character = 'saboteur', level = 2},
|
||||
-- {character = 'hunter', level = 2},
|
||||
}, {{passive = 'summon_instability', level = 3}})
|
||||
]]--
|
||||
|
||||
--[[
|
||||
main:add(Media'media')
|
||||
|
@ -1678,7 +1722,7 @@ function open_options(self)
|
|||
'defensive_stance', 'offensive_stance', 'kinetic_bomb', 'porcupine_technique', 'last_stand', 'seeping', 'deceleration', 'annihilation', 'malediction', 'hextouch', 'whispers_of_doom',
|
||||
'tremor', 'heavy_impact', 'fracture', 'meat_shield', 'hive', 'baneling_burst', 'blunt_arrow', 'explosive_arrow', 'divine_machine_arrow', 'chronomancy', 'awakening', 'divine_punishment',
|
||||
'assassination', 'flying_daggers', 'ultimatum', 'magnify', 'echo_barrage', 'unleash', 'reinforce', 'payback', 'enchanted', 'freezing_field', 'burning_field', 'gravity_field', 'magnetism',
|
||||
'insurance', 'dividends', 'berserking', 'unwavering_stance', 'unrelenting_stance'
|
||||
'insurance', 'dividends', 'berserking', 'unwavering_stance', 'unrelenting_stance', 'blessing', 'haste', 'divine_barrage', 'orbitism', 'psyker_orbs', 'psychosense', 'rearm', 'taunt', 'summon_instability',
|
||||
}
|
||||
max_units = 7 + current_new_game_plus
|
||||
main:add(BuyScreen'buy_screen')
|
||||
|
|
221
player.lua
|
@ -1002,7 +1002,7 @@ function Player:init(args)
|
|||
|
||||
if enchanter_amount >= 2 then
|
||||
local unit = random:table(units)
|
||||
unit.enchanted_aspd_m = (self.enchanted == 1 and 1.1) or (self.enchanted == 2 and 1.2) or (self.enchanted == 3 and 1.3)
|
||||
unit.enchanted_aspd_m = (self.enchanted == 1 and 1.33) or (self.enchanted == 2 and 1.66) or (self.enchanted == 3 and 1.99)
|
||||
end
|
||||
|
||||
end)
|
||||
|
@ -1076,7 +1076,14 @@ function Player:init(args)
|
|||
self.t:after(0.5, function()
|
||||
local units = self:get_all_units()
|
||||
for _, unit in ipairs(units) do
|
||||
if table.any(self.classes, function(v) return v == 'psyker' end) then
|
||||
if table.any(unit.classes, function(v) return v == 'psyker' end) then
|
||||
Projectile{group = main.current.main, x = unit.x + 24*math.cos(unit.r), y = unit.y + 24*math.sin(unit.r), color = fg[0], v = 200, dmg = unit.dmg, character = 'psyker', parent = unit}
|
||||
end
|
||||
end
|
||||
|
||||
if self.psyker_orbs then
|
||||
for i = 1, self.psyker_orbs do
|
||||
local unit = random:table(units)
|
||||
Projectile{group = main.current.main, x = unit.x + 24*math.cos(unit.r), y = unit.y + 24*math.sin(unit.r), color = fg[0], v = 200, dmg = unit.dmg, character = 'psyker', parent = unit}
|
||||
end
|
||||
end
|
||||
|
@ -1132,6 +1139,7 @@ function Player:update(dt)
|
|||
if class_levels.voider >= 1 then number_of_active_sets = number_of_active_sets + 1 end
|
||||
if class_levels.sorcerer >= 1 then number_of_active_sets = number_of_active_sets + 1 end
|
||||
if class_levels.mercenary >= 1 then number_of_active_sets = number_of_active_sets + 1 end
|
||||
if class_levels.explorer >= 1 then number_of_active_sets = number_of_active_sets + 1 end
|
||||
self.vagrant_dmg_m = 1 + 0.1*number_of_active_sets
|
||||
self.vagrant_aspd_m = 1 + 0.1*number_of_active_sets
|
||||
end
|
||||
|
@ -1156,10 +1164,8 @@ function Player:update(dt)
|
|||
elseif main.current.warrior_level == 0 then self.warrior_def_a = 0 end
|
||||
end
|
||||
|
||||
if main.current.healer_level == 2 then self.heal_effect_m = 1.3
|
||||
elseif main.current.healer_level == 1 then self.heal_effect_m = 1.15
|
||||
else self.heal_effect_m = 1 end
|
||||
if self.blessing then self.heal_effect_m = self.heal_effect_m*1.2 end
|
||||
self.heal_effect_m = 1
|
||||
if self.blessing then self.heal_effect_m = self.heal_effect_m*((self.blessing == 1 and 1.1) or (self.blessing == 2 and 1.2) or (self.blessing == 3 and 1.3)) end
|
||||
|
||||
if table.any(self.classes, function(v) return v == 'nuker' end) then
|
||||
if main.current.nuker_level == 2 then self.nuker_area_size_m = 1.25; self.nuker_area_dmg_m = 1.25
|
||||
|
@ -1181,8 +1187,7 @@ function Player:update(dt)
|
|||
elseif main.current.enchanter_level == 1 then self.enchanter_dmg_m = 1.15
|
||||
else self.enchanter_dmg_m = 1 end
|
||||
|
||||
--[[
|
||||
if table.any(self.classes, function(v) return v == 'psyker' end) then
|
||||
if table.any(self.classes, function(v) return v == 'explorer' end) then
|
||||
local class_levels = get_class_levels(self:get_all_units())
|
||||
local number_of_active_sets = 0
|
||||
if class_levels.ranger >= 1 then number_of_active_sets = number_of_active_sets + 1 end
|
||||
|
@ -1200,18 +1205,10 @@ function Player:update(dt)
|
|||
if class_levels.voider >= 1 then number_of_active_sets = number_of_active_sets + 1 end
|
||||
if class_levels.sorcerer >= 1 then number_of_active_sets = number_of_active_sets + 1 end
|
||||
if class_levels.mercenary >= 1 then number_of_active_sets = number_of_active_sets + 1 end
|
||||
if main.current.psyker_level == 2 then
|
||||
self.psyker_dmg_m = 1 + 0.2*number_of_active_sets
|
||||
self.psyker_aspd_m = 1 + 0.2*number_of_active_sets
|
||||
elseif main.current.psyker_level == 1 then
|
||||
self.psyker_dmg_m = 1 + 0.10*number_of_active_sets
|
||||
self.psyker_aspd_m = 1 + 0.10*number_of_active_sets
|
||||
else
|
||||
self.psyker_dmg_m = 1
|
||||
self.psyker_aspd_m = 1
|
||||
end
|
||||
if class_levels.explorer >= 1 then number_of_active_sets = number_of_active_sets + 1 end
|
||||
self.explorer_dmg_m = 1 + 0.15*number_of_active_sets
|
||||
self.explorer_aspd_m = 1 + 0.15*number_of_active_sets
|
||||
end
|
||||
]]--
|
||||
|
||||
if main.current.forcer_level == 2 then self.knockback_m = 1.5
|
||||
elseif main.current.forcer_level == 1 then self.knockback_m = 1.25
|
||||
|
@ -1283,13 +1280,19 @@ function Player:update(dt)
|
|||
self.flagellant_hp_m = 2
|
||||
end
|
||||
|
||||
if self.haste then
|
||||
if self.hasted then
|
||||
self.haste_mvspd_m = math.remap(love.timer.getTime() - self.hasted, 0, 4, 1.5, 1)
|
||||
else self.haste_mvspd_m = 1 end
|
||||
end
|
||||
|
||||
self.buff_def_a = (self.warrior_def_a or 0)
|
||||
self.buff_aspd_m = (self.chronomancer_aspd_m or 1)*(self.vagrant_aspd_m or 1)*(self.outlaw_aspd_m or 1)*(self.fairy_aspd_m or 1)*(self.psyker_aspd_m or 1)*(self.chronomancy_aspd_m or 1)*(self.awakening_aspd_m or 1)*(self.berserking_aspd_m or 1)*(self.reinforce_aspd_m or 1)*(self.squire_aspd_m or 1)*(self.speed_3_aspd_m or 1)*(self.last_stand_aspd_m or 1)*(self.enchanted_aspd_m or 1)
|
||||
self.buff_dmg_m = (self.squire_dmg_m or 1)*(self.vagrant_dmg_m or 1)*(self.enchanter_dmg_m or 1)*(self.swordsman_dmg_m or 1)*(self.flagellant_dmg_m or 1)*(self.psyker_dmg_m or 1)*(self.ballista_dmg_m or 1)*(self.awakening_dmg_m or 1)*(self.reinforce_dmg_m or 1)*(self.payback_dmg_m or 1)*(self.immolation_dmg_m or 1)*(self.damage_4_dmg_m or 1)*(self.offensive_stance_dmg_m or 1)*(self.last_stand_dmg_m or 1)*(self.dividends_dmg_m or 1)
|
||||
self.buff_aspd_m = (self.chronomancer_aspd_m or 1)*(self.vagrant_aspd_m or 1)*(self.outlaw_aspd_m or 1)*(self.fairy_aspd_m or 1)*(self.psyker_aspd_m or 1)*(self.chronomancy_aspd_m or 1)*(self.awakening_aspd_m or 1)*(self.berserking_aspd_m or 1)*(self.reinforce_aspd_m or 1)*(self.squire_aspd_m or 1)*(self.speed_3_aspd_m or 1)*(self.last_stand_aspd_m or 1)*(self.enchanted_aspd_m or 1)*(self.explorer_aspd_m or 1)
|
||||
self.buff_dmg_m = (self.squire_dmg_m or 1)*(self.vagrant_dmg_m or 1)*(self.enchanter_dmg_m or 1)*(self.swordsman_dmg_m or 1)*(self.flagellant_dmg_m or 1)*(self.psyker_dmg_m or 1)*(self.ballista_dmg_m or 1)*(self.awakening_dmg_m or 1)*(self.reinforce_dmg_m or 1)*(self.payback_dmg_m or 1)*(self.immolation_dmg_m or 1)*(self.damage_4_dmg_m or 1)*(self.offensive_stance_dmg_m or 1)*(self.last_stand_dmg_m or 1)*(self.dividends_dmg_m or 1)*(self.explorer_dmg_m or 1)
|
||||
self.buff_def_m = (self.squire_def_m or 1)*(self.ouroboros_def_m or 1)*(self.unwavering_stance_def_m or 1)*(self.reinforce_def_m or 1)*(self.defensive_stance_def_m or 1)*(self.last_stand_def_m or 1)*(self.unrelenting_stance_def_m or 1)
|
||||
self.buff_area_size_m = (self.nuker_area_size_m or 1)*(self.magnify_area_size_m or 1)*(self.unleash_area_size_m or 1)*(self.last_stand_area_size_m or 1)
|
||||
self.buff_area_dmg_m = (self.nuker_area_dmg_m or 1)*(self.amplify_area_dmg_m or 1)*(self.unleash_area_dmg_m or 1)*(self.last_stand_area_dmg_m or 1)
|
||||
self.buff_mvspd_m = (self.wall_rider_mvspd_m or 1)*(self.centipede_mvspd_m or 1)*(self.squire_mvspd_m or 1)*(self.last_stand_mvspd_m or 1)
|
||||
self.buff_mvspd_m = (self.wall_rider_mvspd_m or 1)*(self.centipede_mvspd_m or 1)*(self.squire_mvspd_m or 1)*(self.last_stand_mvspd_m or 1)*(self.haste_mvspd_m or 1)
|
||||
self.buff_hp_m = (self.flagellant_hp_m or 1)
|
||||
self:calculate_stats()
|
||||
|
||||
|
@ -1879,14 +1882,14 @@ function Player:dot_attack(area, mods)
|
|||
end
|
||||
|
||||
|
||||
function Player:barrage(r, n, pierce)
|
||||
function Player:barrage(r, n, pierce, ricochet)
|
||||
n = n or 8
|
||||
for i = 1, n do
|
||||
self.t:after((i-1)*0.075, function()
|
||||
archer1:play{pitch = random:float(0.95, 1.05), volume = 0.35}
|
||||
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 + random:float(-math.pi/16, math.pi/16), color = self.color, dmg = self.dmg,
|
||||
parent = self, character = 'barrage', level = self.level, pierce = pierce or 0}
|
||||
parent = self, character = 'barrage', level = self.level, pierce = pierce or 0, ricochet = ricochet or 0}
|
||||
Projectile(table.merge(t, mods or {}))
|
||||
end)
|
||||
end
|
||||
|
@ -1956,8 +1959,8 @@ function Projectile:init(args)
|
|||
|
||||
elseif self.character == 'psyker' then
|
||||
self.pierce = 10000
|
||||
self.orbit_distance = random:float(28, 36)
|
||||
self.orbit_speed = random:float(4, 6)
|
||||
self.orbit_distance = random:float(32, 40)*((self.parent.psychosense == 1 and 1.33) or (self.parent.psychosense == 2 and 1.66) or (self.parent.psychosense == 3 and 1.99) or 1)
|
||||
self.orbit_speed = random:float(4, 6)*((self.parent.orbitism == 1 and 1.33) or (self.parent.orbitism == 2 and 1.66) or (self.parent.orbitism == 3 and 1.99) or 1)
|
||||
self.orbit_offset = random:float(0, 2*math.pi)
|
||||
|
||||
elseif self.character == 'lich' then
|
||||
|
@ -2751,16 +2754,73 @@ function Tree:init(args)
|
|||
LightningLine{group = main.current.effects, src = self, dst = unit_2, color = green[0]}
|
||||
end
|
||||
HitCircle{group = main.current.effects, x = self.x, y = self.y, rs = 6, color = green[0], duration = 0.1}
|
||||
|
||||
if self.parent.rearm then
|
||||
self.t:after(1, function()
|
||||
heal1:play{pitch = random:float(0.95, 1.05), volume = 0.5}
|
||||
local unit_1 = random:table_remove(units)
|
||||
local unit_2 = random:table_remove(units)
|
||||
if unit_1 then
|
||||
unit_1:heal(0.2*unit_1.max_hp*(self.heal_effect_m or 1))
|
||||
LightningLine{group = main.current.effects, src = self, dst = unit_1, color = green[0]}
|
||||
end
|
||||
if unit_2 then
|
||||
unit_2:heal(0.2*unit_2.max_hp*(self.heal_effect_m or 1))
|
||||
LightningLine{group = main.current.effects, src = self, dst = unit_2, color = green[0]}
|
||||
end
|
||||
HitCircle{group = main.current.effects, x = self.x, y = self.y, rs = 6, color = green[0], duration = 0.1}
|
||||
end)
|
||||
end
|
||||
|
||||
if self.parent.taunt and random:bool((self.parent.taunt == 1 and 10) or (self.parent.taunt == 2 and 20) or (self.parent.taunt == 3 and 30)) then
|
||||
local enemies = self:get_objects_in_shape(Circle(self.x, self.y, 96), main.current.enemies)
|
||||
if #enemies > 0 then
|
||||
for _, enemy in ipairs(enemies) do
|
||||
enemy.taunted = self
|
||||
enemy.t:after(4, function() enemy.taunted = false end, 'taunt')
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
else
|
||||
local unit = random:table(units)
|
||||
unit:heal(0.2*unit.max_hp*(self.heal_effect_m or 1))
|
||||
HitCircle{group = main.current.effects, x = self.x, y = self.y, rs = 6, color = green[0], duration = 0.1}
|
||||
LightningLine{group = main.current.effects, src = self, dst = unit, color = green[0]}
|
||||
|
||||
if self.parent.rearm then
|
||||
self.t:after(1, function()
|
||||
heal1:play{pitch = random:float(0.95, 1.05), volume = 0.5}
|
||||
local unit = random:table(units)
|
||||
unit:heal(0.2*unit.max_hp*(self.heal_effect_m or 1))
|
||||
HitCircle{group = main.current.effects, x = self.x, y = self.y, rs = 6, color = green[0], duration = 0.1}
|
||||
LightningLine{group = main.current.effects, src = self, dst = unit, color = green[0]}
|
||||
end)
|
||||
end
|
||||
|
||||
if self.parent.taunt and random:bool((self.parent.taunt == 1 and 10) or (self.parent.taunt == 2 and 20) or (self.parent.taunt == 3 and 30)) then
|
||||
local enemies = self:get_objects_in_shape(Circle(self.x, self.y, 96), main.current.enemies)
|
||||
if #enemies > 0 then
|
||||
for _, enemy in ipairs(enemies) do
|
||||
enemy.taunted = self
|
||||
enemy.t:after(4, function() enemy.taunted = false end, 'taunt')
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end)
|
||||
|
||||
self.t:after(10*(self.parent.conjurer_buff_m or 1), function()
|
||||
self.t:every_immediate(0.05, function() self.hidden = not self.hidden end, 7, function() self.dead = true end)
|
||||
self.t:every_immediate(0.05, function() self.hidden = not self.hidden end, 7, function()
|
||||
self.dead = true
|
||||
|
||||
if self.parent.summon_instability then
|
||||
camera:shake(2, 0.5)
|
||||
local n = (self.parent.summon_instability == 1 and 1) or (self.parent.summon_instability == 2 and 1.5) or (self.parent.summon_instability == 3 and 2) or 1
|
||||
Area{group = main.current.effects, x = self.x, y = self.y, r = self.r, w = self.parent.area_size_m*48, color = self.color, dmg = n*self.parent.dmg*self.parent.area_dmg_m, parent = self.parent}
|
||||
_G[random:table{'cannoneer1', 'cannoneer2'}]:play{pitch = random:float(0.95, 1.05), volume = 0.5}
|
||||
end
|
||||
end)
|
||||
end)
|
||||
end
|
||||
|
||||
|
@ -2930,6 +2990,40 @@ function Turret:init(args)
|
|||
turret1:play{pitch = random:float(0.95, 1.05), volume = 0.35}
|
||||
turret2:play{pitch = random:float(0.95, 1.05), volume = 0.35}
|
||||
end, 3)
|
||||
|
||||
if self.parent.taunt and random:bool((self.parent.taunt == 1 and 10) or (self.parent.taunt == 2 and 20) or (self.parent.taunt == 3 and 30)) then
|
||||
local enemies = self:get_objects_in_shape(Circle(self.x, self.y, 96), main.current.enemies)
|
||||
if #enemies > 0 then
|
||||
for _, enemy in ipairs(enemies) do
|
||||
enemy.taunted = self
|
||||
enemy.t:after(4, function() enemy.taunted = false end, 'taunt')
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if self.parent.rearm then
|
||||
self.t:after(1, function()
|
||||
self.t:every({0.1, 0.2}, function()
|
||||
self.hfx:use('hit', 0.25, 200, 10)
|
||||
HitCircle{group = main.current.effects, x = self.x + 0.8*self.shape.w*math.cos(self.r), y = self.y + 0.8*self.shape.w*math.sin(self.r), rs = 6}
|
||||
local t = {group = main.current.main, x = self.x + 1.6*self.shape.w*math.cos(self.r), y = self.y + 1.6*self.shape.w*math.sin(self.r), v = 200, r = self.r, color = self.color,
|
||||
dmg = self.parent.dmg*(self.parent.conjurer_buff_m or 1)*self.upgrade_dmg_m, character = self.parent.character, parent = self.parent}
|
||||
Projectile(table.merge(t, mods or {}))
|
||||
turret1:play{pitch = random:float(0.95, 1.05), volume = 0.35}
|
||||
turret2:play{pitch = random:float(0.95, 1.05), volume = 0.35}
|
||||
end, 3)
|
||||
|
||||
if self.parent.taunt and random:bool((self.parent.taunt == 1 and 10) or (self.parent.taunt == 2 and 20) or (self.parent.taunt == 3 and 30)) then
|
||||
local enemies = self:get_objects_in_shape(Circle(self.x, self.y, 96), main.current.enemies)
|
||||
if #enemies > 0 then
|
||||
for _, enemy in ipairs(enemies) do
|
||||
enemy.taunted = self
|
||||
enemy.t:after(4, function() enemy.taunted = false end, 'taunt')
|
||||
end
|
||||
end
|
||||
end
|
||||
end)
|
||||
end
|
||||
end, nil, nil, 'shoot')
|
||||
|
||||
self.t:after(24*(self.parent.conjurer_buff_m or 1), function()
|
||||
|
@ -2937,6 +3031,13 @@ function Turret:init(args)
|
|||
for i = 1, n do HitParticle{group = main.current.effects, x = self.x, y = self.y, r = random:float(0, 2*math.pi), color = self.color} end
|
||||
HitCircle{group = main.current.effects, x = self.x, y = self.y}:scale_down()
|
||||
self.dead = true
|
||||
|
||||
if self.parent.summon_instability then
|
||||
camera:shake(2, 0.5)
|
||||
local n = (self.parent.summon_instability == 1 and 1) or (self.parent.summon_instability == 2 and 1.5) or (self.parent.summon_instability == 3 and 2) or 1
|
||||
Area{group = main.current.effects, x = self.x, y = self.y, r = self.r, w = self.parent.area_size_m*48, color = self.color, dmg = n*self.parent.dmg*self.parent.area_dmg_m, parent = self.parent}
|
||||
_G[random:table{'cannoneer1', 'cannoneer2'}]:play{pitch = random:float(0.95, 1.05), volume = 0.5}
|
||||
end
|
||||
end)
|
||||
|
||||
self.upgrade_dmg_m = 1
|
||||
|
@ -3027,6 +3128,13 @@ function Pet:on_collision_enter(other, contact)
|
|||
self.ricochet = self.ricochet - 1
|
||||
else
|
||||
self.dead = true
|
||||
|
||||
if self.parent.summon_instability then
|
||||
camera:shake(2, 0.5)
|
||||
local n = (self.parent.summon_instability == 1 and 1) or (self.parent.summon_instability == 2 and 1.5) or (self.parent.summon_instability == 3 and 2) or 1
|
||||
Area{group = main.current.effects, x = self.x, y = self.y, r = self.r, w = self.parent.area_size_m*48, color = self.color, dmg = n*self.parent.dmg*self.parent.area_dmg_m, parent = self.parent}
|
||||
_G[random:table{'cannoneer1', 'cannoneer2'}]:play{pitch = random:float(0.95, 1.05), volume = 0.5}
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
@ -3117,7 +3225,18 @@ function Saboteur:on_collision_enter(other, contact)
|
|||
local t = {group = main.current.effects, x = self.x, y = self.y, r = self.r, w = (self.crit and 1.5 or 1)*self.area_size_m*64, color = self.color,
|
||||
dmg = (self.crit and 2 or 1)*self.area_dmg_m*self.actual_dmg*(self.conjurer_buff_m or 1), character = self.character, parent = self.parent}
|
||||
Area(table.merge(t, mods or {}))
|
||||
self.dead = true
|
||||
|
||||
if self.parent.summon_instability then
|
||||
self.t:after(0.25, function()
|
||||
camera:shake(2, 0.5)
|
||||
local n = (self.parent.summon_instability == 1 and 1) or (self.parent.summon_instability == 2 and 1.5) or (self.parent.summon_instability == 3 and 2) or 1
|
||||
Area{group = main.current.effects, x = self.x, y = self.y, r = self.r, w = self.parent.area_size_m*48, color = self.color, dmg = n*self.parent.dmg*self.parent.area_dmg_m, parent = self.parent}
|
||||
_G[random:table{'cannoneer1', 'cannoneer2'}]:play{pitch = random:float(0.95, 1.05), volume = 0.5}
|
||||
self.dead = true
|
||||
end)
|
||||
else
|
||||
self.dead = true
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -3150,6 +3269,30 @@ function Illusion:init(args)
|
|||
parent = self.parent, level = self.parent.level}
|
||||
Projectile(table.merge(t, mods or {}))
|
||||
end
|
||||
|
||||
if self.parent.rearm then
|
||||
self.t:after(0.25, function()
|
||||
local closest_enemy = self:get_closest_object_in_shape(self.attack_sensor, main.current.enemies)
|
||||
if closest_enemy then
|
||||
wizard1:play{pitch = random:float(0.95, 1.05), volume = 0.05}
|
||||
local r = self:angle_to_object(closest_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.parent.color, dmg = self.parent.dmg, character = 'illusionist',
|
||||
parent = self.parent, level = self.parent.level}
|
||||
Projectile(table.merge(t, mods or {}))
|
||||
end
|
||||
end)
|
||||
end
|
||||
|
||||
if self.parent.taunt and random:bool((self.parent.taunt == 1 and 10) or (self.parent.taunt == 2 and 20) or (self.parent.taunt == 3 and 30)) then
|
||||
local enemies = self:get_objects_in_shape(Circle(self.x, self.y, 96), main.current.enemies)
|
||||
if #enemies > 0 then
|
||||
for _, enemy in ipairs(enemies) do
|
||||
enemy.taunted = self
|
||||
enemy.t:after(4, function() enemy.taunted = false end, 'taunt')
|
||||
end
|
||||
end
|
||||
end
|
||||
end, nil, nil, 'shoot')
|
||||
|
||||
self.t:after(12*(self.parent.conjurer_buff_m or 1), function()
|
||||
|
@ -3165,6 +3308,13 @@ function Illusion:init(args)
|
|||
parent = self.parent, level = self.parent.level, pierce = 1, ricochet = 1}
|
||||
end
|
||||
end
|
||||
|
||||
if self.parent.summon_instability then
|
||||
camera:shake(2, 0.5)
|
||||
local n = (self.parent.summon_instability == 1 and 1) or (self.parent.summon_instability == 2 and 1.5) or (self.parent.summon_instability == 3 and 2) or 1
|
||||
Area{group = main.current.effects, x = self.x, y = self.y, r = self.r, w = self.parent.area_size_m*48, color = self.color, dmg = n*self.parent.dmg*self.parent.area_dmg_m, parent = self.parent}
|
||||
_G[random:table{'cannoneer1', 'cannoneer2'}]:play{pitch = random:float(0.95, 1.05), volume = 0.5}
|
||||
end
|
||||
end)
|
||||
end
|
||||
|
||||
|
@ -3381,8 +3531,21 @@ function HealingOrb:on_trigger_enter(other, contact)
|
|||
end
|
||||
if lowest_unit then
|
||||
lowest_unit:heal(0.1*lowest_unit.max_hp*(lowest_unit.heal_effect_m or 1))
|
||||
else
|
||||
end
|
||||
|
||||
if main.current.player.haste then
|
||||
local units = other:get_all_units()
|
||||
for _, unit in ipairs(units) do
|
||||
unit.hasted = love.timer.getTime()
|
||||
unit.t:after(4, function() unit.hasted = false end, 'haste')
|
||||
end
|
||||
end
|
||||
|
||||
if main.current.player.divine_barrage and random:bool((main.current.player.divine_barrage == 1 and 20) or (main.current.player.divine_barrage == 2 and 40) or (main.current.player.divine_barrage == 3 and 60)) then
|
||||
trigger:after(0.01, function()
|
||||
if not main.current.main.world then return end
|
||||
main.current.player:barrage(main.current.player.r, 5, nil, 3)
|
||||
end)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
110
todo
|
@ -1,4 +1,59 @@
|
|||
Healer & Psyker Update
|
||||
Orb Update
|
||||
New items:
|
||||
Healer:
|
||||
* Blessing - +10/20/30% healing effectiveness
|
||||
* Haste - +50% movement speed that decays over 4 seconds on healing orb pick up
|
||||
* Divine Barrage - 10/20/30% chance to release a ricocheting barrage when picking up a healing orb
|
||||
Psyker:
|
||||
* Orbitism - 33/66/99% faster orb speed
|
||||
* Psyker Orbs - +1/2/3 psyker orbs
|
||||
* Psychosense - 33/66/99% increased orb range
|
||||
Conjurer:
|
||||
* Rearm - summons repeat their attacks once
|
||||
* Taunt - 10/20/30% chance for summons to taunt nearby enemies on attack
|
||||
* Summon Instability - summons explode when disappearing, dealing 100/150/200% damage
|
||||
Changes:
|
||||
* Magnetism - also attracts healing orbs
|
||||
* Enchanted - 33/66/99%
|
||||
Explorer:
|
||||
* +15% attack speed and damage per active set to allied explorers
|
||||
Healer rework:
|
||||
* Enemies have a 8/16% chance to spawn healing orbs on death, orbs prioritize healing low health allies
|
||||
* Cleric: creates 1 healing orb, Lv.3: creates 4 healing orbs
|
||||
* Priest: creates 5 healing orbs
|
||||
* Fairy: grants a random unit 100% attack speed for 6 seconds and creates 1 healing orb
|
||||
Psyker rework:
|
||||
* Create a piercing, damaging orb around each psyker, it inherits damage from its target
|
||||
* 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
|
||||
* 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
|
||||
QoL
|
||||
Lowered sound effect for gambler
|
||||
Show cooldown on elite attack
|
||||
* Options menu from buy screen
|
||||
* Add main menu
|
||||
* Title
|
||||
* Snake DVD
|
||||
* Arena run button
|
||||
* Options button
|
||||
* 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"
|
||||
|
||||
Loop Update
|
||||
New items:
|
||||
General:
|
||||
Intimidation - enemies spawn with -10/20/30% max HP
|
||||
|
@ -17,67 +72,20 @@ Healer & Psyker Update
|
|||
Warping Shots - X/Y/Z% chance for projectiles to ignore wall collisions and warp around the screen 1/2/3 times
|
||||
Culling Strike - instantly kill elites below 10/20/30% max HP
|
||||
Lightning Strike - X/Y/Z% chance for attacks to create chain lightning, dealing 60/80/100% damage and hitting 2/3/4 enemies
|
||||
Healer:
|
||||
Blessing - +10/20/30% healing effectiveness
|
||||
Divine Favor - healing over maximum HP provides a shield that prevents damage once
|
||||
Divine Barrage - 10/20/30% chance to release a homing barrage when picking up a healing orb
|
||||
Psyker:
|
||||
Orbitism - 33/66/99% faster orb speed
|
||||
Psychosink - orbs move faster based on the amount of damage all psykers have taken recently
|
||||
Psychosense - 20/40/60% increased orb range
|
||||
Conjurer:
|
||||
Rearm - summons repeat their attacks once
|
||||
Taunt - 10/20/30% chance for summons to taunt nearby enemies on attack
|
||||
Summon Instability - summons explode when disappearing, dealing 100/150/200% damage
|
||||
https://i.imgur.com/yzCVMah.png
|
||||
Changes:
|
||||
* Magnetism - also attracts healing orbs
|
||||
Enchanted - 33/66/99%
|
||||
Healer rework:
|
||||
* Enemies have a 8/16% chance to spawn healing orbs on death, orbs prioritize healing low health allies
|
||||
* Cleric: creates 1 healing orb, Lv.3: creates 4 healing orbs
|
||||
* Priest: creates 5 healing orbs
|
||||
* Fairy: grants a random unit 100% attack speed for 6 seconds and creates 1 healing orb
|
||||
Psyker rework:
|
||||
* Create a piercing, damaging orb around each psyker, it inherits damage from its target
|
||||
* Flagellant - Lv.3: 4X 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
|
||||
Looping
|
||||
Change end screen
|
||||
Loop button on end screen
|
||||
Looping lets you continue with the current snake until you die
|
||||
Difficulty is increased according to the formula for levels 25+
|
||||
Snake size goes up by 1 every loop, up to 12
|
||||
Balance
|
||||
Change cursers to add more curse targets as set bonuses
|
||||
Decrease 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
|
||||
Conjurer rework:
|
||||
QoL
|
||||
Lowered sound effect for gambler
|
||||
Selling items
|
||||
Show cooldown on elite attack
|
||||
* Options menu from buy screen
|
||||
* Add main menu
|
||||
* Title
|
||||
* Snake DVD
|
||||
* Arena run button
|
||||
* Options button
|
||||
* Quit button
|
||||
* Soundtrack button
|
||||
https://i.imgur.com/4hOt5uX.png "party 7/9"
|
||||
https://i.imgur.com/dlGbx0k.png lvl 3 effect on shop card
|
||||
* Volume slider
|
||||
Your party + items on end, death and passive screens - https://i.imgur.com/JJUddT3.png
|
||||
Add option for mouse cursor to always be visible
|
||||
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"
|
||||
Bug fixes
|
||||
Fix barbarian stun just slowing and not stunning
|
||||
* 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
|
||||
|
@ -85,7 +93,6 @@ Healer & Psyker Update
|
|||
https://i.imgur.com/8he1WDm.png - infinite money
|
||||
https://i.imgur.com/0wZ5wma.png - max unit bugged when changing ng mid run, https://i.imgur.com/qrExpq5.png
|
||||
|
||||
|
||||
---
|
||||
|
||||
30 refresh rate makes enemies faster?!?!
|
||||
|
@ -132,6 +139,7 @@ Draft mode
|
|||
Enemy ideas - https://steamcommunity.com/app/915310/discussions/0/3069747783691890511/
|
||||
Unit ideas - https://i.imgur.com/VNMS2YV.png
|
||||
Unit ideas - https://steamcommunity.com/app/915310/discussions/0/3069747783693969554/
|
||||
Unit ideas - https://steamcommunity.com/app/915310/discussions/0/3046104336668792953/
|
||||
|
||||
|
||||
--
|
||||
|
|