mirror of
https://github.com/ComfyFactory/ComfyFactorio.git
synced 2025-01-06 00:23:49 +02:00
116 lines
4.8 KiB
Lua
116 lines
4.8 KiB
Lua
-- improves the damage of the railgun and adds visual effects -- by mewmew
|
|
-- laser turret research will increase it´s damage even further --
|
|
|
|
local Event = require 'utils.event'
|
|
local damage_min = 400
|
|
local damage_max = 800
|
|
local math_random = math.random
|
|
local additional_visual_effects = true
|
|
local do_splash_damage = true
|
|
|
|
local biological_target_types = {
|
|
['unit'] = true,
|
|
['player'] = true,
|
|
['turret'] = true,
|
|
['unit-spawner'] = true
|
|
}
|
|
|
|
local function create_visuals(_, target_entity)
|
|
if not additional_visual_effects then
|
|
return
|
|
end
|
|
local surface = target_entity.surface
|
|
surface.create_entity({name = 'water-splash', position = target_entity.position})
|
|
if biological_target_types[target_entity.type] then
|
|
surface.create_entity({name = 'blood-explosion-big', position = target_entity.position})
|
|
for x = -8, 8, 1 do
|
|
for y = -8, 8, 1 do
|
|
if math_random(1, 16) == 1 then
|
|
surface.create_entity({name = 'blood-fountain', position = {target_entity.position.x + (x * 0.1), target_entity.position.y + (y * 0.1)}})
|
|
surface.create_entity({name = 'blood-fountain-big', position = {target_entity.position.x + (x * 0.1), target_entity.position.y + (y * 0.1)}})
|
|
end
|
|
end
|
|
end
|
|
else
|
|
if math_random(1, 3) ~= 1 then
|
|
surface.create_entity({name = 'fire-flame', position = target_entity.position})
|
|
end
|
|
for x = -3, 3, 1 do
|
|
for y = -3, 3, 1 do
|
|
if math_random(1, 3) == 1 then
|
|
surface.create_trivial_smoke({name = 'smoke-fast', position = {target_entity.position.x + (x * 0.35), target_entity.position.y + (y * 0.35)}})
|
|
end
|
|
if math_random(1, 5) == 1 then
|
|
surface.create_trivial_smoke({name = 'train-smoke', position = {target_entity.position.x + (x * 0.35), target_entity.position.y + (y * 0.35)}})
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
local function do_splash_damage_around_entity(source_entity, player)
|
|
if not do_splash_damage then
|
|
return
|
|
end
|
|
local research_damage_bonus = player.force.get_ammo_damage_modifier('laser-turret') + 1
|
|
local research_splash_radius_bonus = player.force.get_ammo_damage_modifier('laser-turret') * 0.5
|
|
local splash_area = {
|
|
{source_entity.position.x - (2.5 + research_splash_radius_bonus), source_entity.position.y - (2.5 + research_splash_radius_bonus)},
|
|
{source_entity.position.x + (2.5 + research_splash_radius_bonus), source_entity.position.y + (2.5 + research_splash_radius_bonus)}
|
|
}
|
|
local entities = source_entity.surface.find_entities_filtered({area = splash_area})
|
|
for _, entity in pairs(entities) do
|
|
if entity.valid and entity.health and entity ~= source_entity and entity ~= player then
|
|
if additional_visual_effects then
|
|
local surface = entity.surface
|
|
surface.create_entity({name = 'railgun-beam', position = source_entity.position, source = source_entity.position, target = entity.position})
|
|
surface.create_entity({name = 'water-splash', position = entity.position})
|
|
if biological_target_types[entity.type] then
|
|
surface.create_entity({name = 'blood-fountain', position = entity.position})
|
|
end
|
|
end
|
|
local damage = math_random(math.ceil((damage_min * research_damage_bonus) / 16), math.ceil((damage_max * research_damage_bonus) / 16))
|
|
entity.damage(damage, player.force, 'physical')
|
|
end
|
|
end
|
|
end
|
|
|
|
local function on_entity_damaged(event)
|
|
if not event.cause then
|
|
return
|
|
end
|
|
if event.cause.name ~= 'character' then
|
|
return
|
|
end
|
|
if event.damage_type.name ~= 'physical' then
|
|
return
|
|
end
|
|
if event.original_damage_amount ~= 100 then
|
|
return
|
|
end
|
|
|
|
local player = event.cause
|
|
if player.shooting_state.state == defines.shooting.not_shooting then
|
|
return
|
|
end
|
|
local selected_weapon = player.get_inventory(defines.inventory.character_guns)[player.selected_gun_index]
|
|
if not selected_weapon.valid_for_read then
|
|
return
|
|
end
|
|
if selected_weapon.name ~= 'railgun' then
|
|
return
|
|
end
|
|
|
|
create_visuals(event.cause, event.entity)
|
|
|
|
do_splash_damage_around_entity(event.entity, player)
|
|
|
|
event.entity.health = event.entity.health + event.final_damage_amount
|
|
|
|
local research_damage_bonus = player.force.get_ammo_damage_modifier('laser-turret') + 1
|
|
local damage = math_random(math.ceil(damage_min * research_damage_bonus), math.ceil(damage_max * research_damage_bonus))
|
|
event.entity.damage(damage, player.force, 'physical')
|
|
end
|
|
|
|
Event.add(defines.events.on_entity_damaged, on_entity_damaged)
|