mirror of
https://github.com/ComfyFactory/ComfyFactorio.git
synced 2025-01-06 00:23:49 +02:00
103 lines
3.2 KiB
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
|