Factorio-Paranoidal_mod/RampantFixed/data-final-fixes.lua

263 lines
10 KiB
Lua

local vanillaBuildings = require("prototypes/buildings/UpdatesVanilla")
local immunityUpdates = require("prototypes/utils/UpdateImmunities")
-- if settings.startup["rampantFixed--removeBloodParticles"].value then
-- local explosions = data.raw["explosion"]
-- for k,v in pairs(explosions) do
-- if string.find(k, "blood") then
-- v["created_effect"] = nil
-- end
-- end
-- end
--------- assign flying_layer to projectiles
local function table_contains(table, check)
for k,v in pairs(table) do if v == check then return true end end
return false
end
if not mods["combat-mechanics-overhaul"] then
local collision_mask_util_extended = require("collision-mask-util-extended/data/collision-mask-util-extended")
flying_layer = collision_mask_util_extended.get_make_named_collision_mask("flying-layer")
for _, prototype in pairs(data.raw.projectile) do
if prototype.collision_box then
if not prototype.hit_collision_mask then
prototype.hit_collision_mask = collision_mask_util_extended.get_default_hit_mask("projectile")
else
if not table_contains(prototype.hit_collision_mask, flying_layer) then
table.insert(prototype.hit_collision_mask, flying_layer)
end
end
end
end
else -- rebuild units (CMO broke stream attacks)
log("combat-mechanics-overhaul -> rebuild units")
if settings.startup["rampantFixed--newEnemies"].value then
local swarmUtils = require("prototypes/SwarmUtils")
swarmUtils.processFactions()
end
end
if settings.startup["rampantFixed--newEnemies"].value then
if data.raw["damage-type"]["plasma"] then
immunityUpdates.setPlasmaImmunities()
end
if data.raw["damage-type"]["bob-pierce"] then
immunityUpdates.setPierceImmunities()
end
immunityUpdates.setArmorLaserElectricImmunities()
immunityUpdates.setResistanceToUnknownDamageTypes()
end
if settings.startup["rampantFixed--fireSafety-flamethrower"].value then
local flamethrowerStream = data.raw["stream"]["handheld-flamethrower-fire-stream"]
flamethrowerStream.action[1].action_delivery.target_effects[1].sticker = "safe-fire-sticker-rampant"
local action_delivery = flamethrowerStream.action[1].action_delivery
if action_delivery.target_effects[2] and (action_delivery.target_effects[2].type == "damage") and (action_delivery.target_effects[2].damage.type == "fire") then
action_delivery.target_effects[2].damage.amount = (action_delivery.target_effects[2].damage.amount or 0) + 4
action_delivery.target_effects[2].apply_damage_to_trees = true
else
action_delivery.target_effects[#action_delivery.target_effects+1] = {
type = "damage",
damage = { amount = 6, type = "fire" },
apply_damage_to_trees = true
}
end
if flamethrowerStream.action[2] then
table.remove(flamethrowerStream.action, 2)
end
-- for i, action in pairs (flamethrowerStream.action) do
-- if action.action_delivery and action.action_delivery.target_effects then
-- for u, target_effect in pairs (action.action_delivery.target_effects) do
-- if target_effect.entity_name and (target_effect.entity_name == "fire-flame") then
-- target_effect.type = "damage"
-- target_effect.damage = { amount = 40, type = "fire" }
-- target_effect.apply_damage_to_trees = true
-- target_effect.entity_name = nil --"safe-fire-flame-rampant"
-- end
-- end
-- end
-- end
local napalmStream = data.raw["stream"]["napalm-handheld-stream-rampant-arsenal"]
if napalmStream then
local flameFound = false
for i, action in pairs (napalmStream.action) do
if action.action_delivery and action.action_delivery.target_effects then
for u, target_effect in pairs (action.action_delivery.target_effects) do
if target_effect.entity_name and (target_effect.entity_name == "fire-flame") then
table.remove(action.action_delivery.target_effects, u)
flameFound = true
end
end
end
end
if flameFound then
for i, action in pairs (napalmStream.action) do
if action.action_delivery and action.action_delivery.target_effects then
for u, target_effect in pairs (action.action_delivery.target_effects) do
if (target_effect.type == "damage") and target_effect.damage and (target_effect.damage.type == "fire") then
target_effect.damage.amount = (target_effect.damage.amount or 0) + 8
target_effect.apply_damage_to_trees = true
end
end
end
end
end
local napalmSticker = data.raw["sticker"]["small-fire-sticker-rampant-arsenal"]
if napalmSticker and napalmSticker.spread_fire_entity then
napalmSticker.spread_fire_entity = "safe-fire-flame-on-tree-rampant"
end
end
end
if settings.startup["rampantFixed--flamethrowerTurretsRebalance"].value then
local fireFlameShortLife = table.deepcopy(data.raw["fire"]["fire-flame"])
fireFlameShortLife.name = "fire-flame-shortlife-rampant"
fireFlameShortLife.maximum_damage_multiplier = 7
fireFlameShortLife.damage_multiplier_increase_per_added_fuel = 3
fireFlameShortLife.damage_multiplier_decrease_per_tick = 0.01
fireFlameShortLife.lifetime_increase_by = 150
fireFlameShortLife.maximum_lifetime = 300
fireFlameShortLife.lifetime_increase_cooldown = 12,
data:extend({fireFlameShortLife})
local flamethrowerStream2 = table.deepcopy(data.raw["stream"]["flamethrower-fire-stream"])
local flamethrowerTurret = data.raw["fluid-turret"]["flamethrower-turret"]
flamethrowerStream2.name = "flamethrower-fire-stream2"
flamethrowerStream2.action[1].action_delivery.target_effects[2].damage.amount = 4
flamethrowerStream2.action[2].action_delivery.target_effects[1].entity_name = "fire-flame-shortlife-rampant"
data:extend({flamethrowerStream2})
flamethrowerTurret.attack_parameters.cooldown = 12
flamethrowerTurret.attack_parameters.fluid_consumption = 0.6
flamethrowerTurret.attack_parameters.ammo_type.action.action_delivery.stream = "flamethrower-fire-stream2"
flamethrowerTurret.attack_parameters.gun_barrel_length = 0.6
---------------
if data.raw["stream"]["suppression-cannon-stream-rampant-arsenal"] then
local flamethrowerTurretRA_Stream = data.raw["stream"]["suppression-cannon-stream-rampant-arsenal"]
table.remove(flamethrowerTurretRA_Stream.action[1].action_delivery.target_effects, 2)
flamethrowerTurretRA_Stream.action[2].action_delivery.target_effects[2].damage.amount = flamethrowerTurretRA_Stream.action[2].action_delivery.target_effects[2].damage.amount * 4
local flamethrowerTurretRA = data.raw["fluid-turret"]["suppression-cannon-fluid-turret-rampant-arsenal"]
flamethrowerTurretRA.attack_parameters.cooldown = 30
flamethrowerTurretRA.attack_parameters.fluid_consumption = 15
data:extend({flamethrowerTurretRA})
end
end
-- -- debug
-- local biterTest = table.deepcopy(data.raw["unit"]["small-biter"])
-- biterTest.max_health = 100000
-- biterTest.name = "BiterTest"
-- data:extend({biterTest})
-- ---------------
if settings.startup["rampantFixed--rampantArsenalRebalance"].value then
local damage_interval = 15
for i, sticker in pairs(data.raw["sticker"]) do
if string.find(sticker.name, "arsenal") and string.find(sticker.name, "rampant") then
if (sticker.duration_in_ticks >= 60) and sticker.damage_per_tick and (sticker.damage_per_tick.amount > 0) and ((not sticker.damage_interval) or (sticker.damage_interval < 10)) then
local kf = damage_interval/(sticker.damage_interval or 1)
sticker.damage_interval = damage_interval
sticker.damage_per_tick.amount = sticker.damage_per_tick.amount * kf
end
end
end
end
if settings.startup["rampantFixed--unitSpawnerBreath"].value then
for _, unitSpawner in pairs(data.raw["unit-spawner"]) do
if (string.find(unitSpawner.name, "hive") or string.find(unitSpawner.name, "biter") or
string.find(unitSpawner.name, "spitter")) then
if not unitSpawner.flags then
unitSpawner.flags = {}
end
unitSpawner.flags[#unitSpawner.flags+1] = "breaths-air"
end
end
end
for k, unit in pairs(data.raw["unit"]) do
if (string.find(k, "biter") or string.find(k, "spitter")) and unit.collision_box then
if settings.startup["rampantFixed--enableSwarm"].value then
unit.collision_box = {
{unit.collision_box[1][1] * 0.20, unit.collision_box[1][2] * 0.20},
{unit.collision_box[2][1] * 0.20, unit.collision_box[2][2] * 0.20}
}
end
-- if string.find(k, "-rampant") and (string.find(k, "nuclear-biter") or string.find(k, "suicide-biter") or string.find(k, "fast-biter")) then
-- unit.affected_by_tiles = false
-- else
-- unit.affected_by_tiles = settings.startup["rampantFixed--unitsAffectedByTiles"].value
-- end
unit.ai_settings = {
destroy_when_commands_fail = false,
allow_try_return_to_spawner = true
}
end
end
if settings.startup["rampantFixed--enableShrinkNestsAndWorms"].value then
for k, unit in pairs(data.raw["unit-spawner"]) do
if (string.find(k, "biter") or string.find(k, "spitter") or string.find(k, "hive")) and unit.collision_box then
local minDxDy = math.min(unit.collision_box[2][1] - unit.collision_box[1][1], unit.collision_box[2][2] - unit.collision_box[1][2])
if minDxDy >= 3 then
unit.collision_box = {
{unit.collision_box[1][1] * 0.50, unit.collision_box[1][2] * 0.50},
{unit.collision_box[2][1] * 0.50, unit.collision_box[2][2] * 0.50}
}
else
local k = 1 - (0.5 * minDxDy / 3)
unit.collision_box = {
{unit.collision_box[1][1] * k, unit.collision_box[1][2] * k},
{unit.collision_box[2][1] * k, unit.collision_box[2][2] * k}
}
end
end
end
for k, unit in pairs(data.raw["turret"]) do
if string.find(k, "worm") and unit.collision_box then
unit.collision_box = {
{unit.collision_box[1][1] * 0.70, unit.collision_box[1][2] * 0.70},
{unit.collision_box[2][1] * 0.70, unit.collision_box[2][2] * 0.70}
}
end
end
end
if settings.startup["rampantFixed--enableFadeTime"].value then
for k, corpse in pairs(data.raw["corpse"]) do
if (string.find(k, "biter") or string.find(k, "spitter") or string.find(k, "hive") or
string.find(k, "worm") or string.find(k, "spawner")) then
if string.sub(k, 1, 13) == "spawner-spawn" then
corpse.time_before_removed = 60
else
corpse.time_before_removed = settings.startup["rampantFixed--unitAndSpawnerFadeTime"].value * 60
end
end
end
end
if settings.startup["rampantFixed--addWallResistanceAcid"].value then
vanillaBuildings.addWallResistance()
end