UnrealisticReactors/scripts/fx.lua
2024-07-14 22:14:25 +03:00

161 lines
4.2 KiB
Lua

local rpath = (...):match("(.-)[^%.]+$")
local Setting = require(rpath .. "setting")
-- TODO merge geiger into geiger-counter
-- FIXME use damage type resistances for radiation via data
local function periodic_pollution(entity,mult) --on_tick
entity.surface.pollute(entity.position, math.floor(20000*mult)) --0.002% evo
end
-- radiation damage function
local function radio_damage(entity,force,tick)
if entity.type == "character" then
--sound
if entity.player then
if global.geigers[entity.player.index] == nil
or global.geigers[entity.player.index]+3 < tick then
local index = math.floor(global.random()*1.99)
global.geigers[entity.player.index] = tick
entity.player.play_sound{
path = "RR-geiger-" .. index,
volume_modifier =0.7,
}
end
end
--damage
local resist = 1 --resistances
if entity.grid then
if entity.grid.max_shield > 0 then
resist = 1 - math.min(35,entity.grid.shield)/35
entity.damage(math.min(entity.grid.shield, 35)+0.0001,game.forces.neutral,"electric")
else
entity.damage(0.0001,game.forces.neutral,"electric")
end
if entity.grid.shield > 0 then return end
if entity.grid.prototype.name == "radiation-suit-grid" then
resist = resist*0.1
elseif entity.grid.prototype.name == "small-equipment-grid" then
resist = resist*0.85
elseif entity.grid.prototype.name == "medium-equipment-grid" then
resist = resist*0.7
else
resist = resist*0.55
end
else
entity.damage(0.0001,game.forces.neutral,"electric")
end
if force == "radioactivity" then
entity.health = entity.health -0.25*resist
entity.damage(0.13*resist,game.forces.neutral,"electric")
else
entity.health = entity.health -0.4*resist
entity.damage(0.2*resist,game.forces.neutral,"electric")
end
if entity.health < 1 then
entity.die(force)
end
else
if force == "radioactivity" then
entity.health = entity.health -0.4
else
entity.health = entity.health -0.6
end
if entity.health < 1 then
entity.die(force)
end
end
end
-- radiation damage (event)
local function on_script_trigger_effect(effect_id, entity, force, tick)
if (effect_id == "radiation-damage" or effect_id == "radiation-damage-strong") and entity then
if effect_id == "radiation-damage" then
force = "radioactivity"
else
force = "radioactivity-strong"
end
if entity.type == "car" then
local passenger = entity.get_passenger() --passenger
if passenger and passenger.type == "character" and passenger.has_flag("breaths-air") then
radio_damage(passenger, force, tick)
end
local passenger = entity.get_driver() --driver
if passenger and passenger.name == "character" and passenger.has_flag("breaths-air") then
radio_damage(passenger, force, tick)
end
elseif entity.type == "character" and entity.has_flag("breaths-air") then
radio_damage(entity, force, tick)
elseif entity.has_flag("breaths-air") then
radio_damage(entity, force, tick)
end
end
end
--fallout stuff...
local function circular_radiation(surface,position,min_radius,size)
local step = 3.2
if min_radius == 0 then
surface.create_entity{
name = "permanent-radiation",
position = position,
force = "radioactivity",
}
surface.create_entity{
name = "permanent-radiation",
position = position,
force = "radioactivity",
}
min_radius = min_radius + 1
end
for spread = min_radius, size do --each run adds another layer
local x = position.x-step/2*spread
local y = position.y-step/2*spread
for i=1, spread*4 do
surface.create_entity{
name = "permanent-radiation",
position = {x,y},
force = "radioactivity",
}
if i <= spread then
x=x+step
y=y-step*0.7*(1- i / ((spread+1)/2)) --almost perfect circle
elseif i <= spread * 2 then
y=y+step
x=x+step*0.7*(1- (i-spread) / ((spread+1)/2))
elseif i <= spread * 3 then
x=x-step
y=y+step*0.7* (1- (i-spread*2) / ((spread+1)/2))
elseif i <= spread * 4 then
y=y-step
x=x-step*0.7*(1- (i-spread*3) / ((spread+1)/2))
end
end
end
end
return { -- exports
effect = on_script_trigger_effect,
periodic_pollution = periodic_pollution,
circular_radiation = circular_radiation,
}