161 lines
4.2 KiB
Lua
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,
|
|
}
|