1
0
mirror of https://github.com/ComfyFactory/ComfyFactorio.git synced 2025-01-06 00:23:49 +02:00
ComfyFactorio/modules/landmine_effects.lua

103 lines
3.2 KiB
Lua

local Event = require 'utils.event'
local Global = require 'utils.global'
local Public = {}
--by hanakocz
--module to alternate what happens when landmine gets detonated
--nuke module: there is 1 in nuke_chance chance that the landmine was hidden nuclear device
--vehicle module: landmine causes affected vehicles to lose part of speed
--vehicle_slowdown should be <0, 1>, where 1 is no effect and 0 is full loss of speed
--can also add bonus damage to hit vehicles, as landmines should be counterplay to tanks,
-- while just buffing their damage causes players being oneshot and that's not fun.
local this = {
nuke_landmines = false,
nuke_chance = 512,
vehicle_effects = true,
bonus_damage_to_vehicles = 100,
vehicle_slowdown = 0.4
}
Global.register(
this,
function(tbl)
this = tbl
end
)
local function detonate_nuke(entity)
local surface = entity.surface
surface.create_entity({name = 'atomic-rocket', position = entity.position, force = entity.force, speed = 1, max_range = 800, target = entity, source = entity})
end
local function hit_car(car, hitting_force)
if not car or not car.valid then return end
car.speed = car.speed * this.vehicle_slowdown
if this.bonus_damage_to_vehicles > 0 then
--cars do have no resistance to explosions and 450 hp
--tanks do have 15/70% resistance to explosions and 2000 hp, so get (damage - 15) * (1 - 0.70) actual damage
car.damage(this.bonus_damage_to_vehicles, hitting_force or 'enemy', 'explosion')
end
end
local function on_entity_died(event)
local entity = event.entity
if not entity.valid then
return
end
if entity.type == 'land-mine' and entity.armed then
if this.vehicle_effects then
local surface = entity.surface
local cars = surface.find_entities_filtered{type = 'car', position = entity.position, radius = 6}
for _, car in pairs(cars) do
if car.force.is_enemy(entity.force) then
hit_car(car, entity.force)
end
end
end
if this.nuke_landmines then
if math.random(1, this.nuke_chance) == 1 then
detonate_nuke(entity)
end
end
end
end
--- Forces a value of nuke_landmines
---@param boolean
function Public.enable_nuke_landmines(boolean)
this.nuke_landmines = boolean or false
return this.nuke_landmines
end
--- Forces a value of vehicle_effects
---@param boolean
function Public.enable_vehicle_effects(boolean)
this.vehicle_effects = boolean or false
return this.vehicle_effects
end
--- Forces a number for bonus_damage_to_vehicles
---@param number
function Public.set_bonus_damage_to_vehicles(number)
if number and type(number) == 'number' then
this.bonus_damage_to_vehicles = number or 0
end
return this.bonus_damage_to_vehicles
end
--- Forces a number for vehicle_slowdown
---@param number
function Public.set_vehicle_slowdown(number)
if number and type(number) == 'number' then
this.vehicle_slowdown = number or 1
end
return this.vehicle_slowdown
end
Event.add(defines.events.on_entity_died, on_entity_died)
return Public