1
0
mirror of https://github.com/veden/Rampant.git synced 2025-01-05 22:53:24 +02:00
Rampant/prototypes/utils/FireUtils.lua
2019-11-29 16:49:22 -08:00

721 lines
34 KiB
Lua
Executable File

local fireUtils = {}
-- imported
local colorUtils = require("ColorUtils")
local imageUtils = require("ImageUtils")
-- imported functions
local create_burnt_patch_pictures = imageUtils.create_burnt_patch_pictures
local create_fire_pictures = imageUtils.create_fire_pictures
local create_small_tree_flame_animations = imageUtils.create_small_tree_flame_animations
local makeColor = colorUtils.makeColor
-- module code
function fireUtils.makeSpreadEffect(attributes)
local name = attributes.name .. "-spread-rampant"
local smokeName = "the-glow-smoke-rampant"
data:extend({
{
type = "fire",
name = name,
flags = {"placeable-off-grid", "not-on-map"},
damage_per_tick = { amount = attributes.fireDamagePerTick or 45/60, type = attributes.fireDamagePerTickType or "fire" },
spawn_entity = name,
maximum_spread_count = 100,
spread_delay = 300,
spread_delay_deviation = 180,
flame_alpha = 0.35,
flame_alpha_deviation = 0.05,
tree_dying_factor = 0.8,
emissions_per_second = 0.005,
fade_in_duration = 120,
fade_out_duration = 100,
smoke_fade_in_duration = 100,
smoke_fade_out_duration = 130,
delay_between_initial_flames = 20,
small_tree_fire_pictures = create_small_tree_flame_animations({ blend_mode = "additive", animation_speed = 0.5, scale = 0.7 * 0.75, tint2 = attributes.tint2 }),
pictures = create_fire_pictures({ blend_mode = "additive", animation_speed = 1, scale = 0.5 * 1.25, tint2 = attributes.tint2}),
smoke_source_pictures =
{
{
filename = "__base__/graphics/entity/fire-flame/fire-smoke-source-1.png",
line_length = 8,
width = 101,
height = 138,
frame_count = 31,
axially_symmetrical = false,
direction_count = 1,
scale = 0.6,
shift = {-0.109375 * 0.6, -1.1875 * 0.6},
animation_speed = 0.5,
tint = makeColor(0,1,0, 0.75),
},
{
filename = "__base__/graphics/entity/fire-flame/fire-smoke-source-2.png",
line_length = 8,
width = 99,
height = 138,
frame_count = 31,
axially_symmetrical = false,
direction_count = 1,
scale = 0.6,
shift = {-0.203125 * 0.6, -1.21875 * 0.6},
animation_speed = 0.5,
tint = makeColor(0,1,0, 0.75),
},
},
trivial_smoke =
{
{
name = smokeName,
deviation = {0.5, 0.5},
frequency = 0.25 / 2,
position = {0.0, -0.8},
starting_vertical_speed = 0.008,
starting_vertical_speed_deviation = 0.05,
starting_frame_deviation = 60,
height = -0.5,
}
},
light = {intensity = 1, size = 20},
working_sound =
{
sound = { filename = "__base__/sound/furnace.ogg" },
max_sounds_per_type = 3
},
}})
return name
end
function fireUtils.makeFire(attributes)
local name = attributes.name .. "-fire-rampant"
local spawnEntityName = attributes.spawnEntityName
local smokeAddingFuelName = "the-adding-fuel-rampant"
local smokeName = "the-glow-smoke-rampant"
data:extend({{
type = "fire",
name = name,
flags = {"placeable-off-grid", "not-on-map"},
color = attributes.tint2,
damage_per_tick = { amount = attributes.fireDamagePerTick or 45/60, type = attributes.fireDamagePerTickType or "fire" },
maximum_damage_multiplier = attributes.damageMaxMultipler or 6,
damage_multiplier_increase_per_added_fuel = attributes.mutliplerIncrease or 1,
damage_multiplier_decrease_per_tick = attributes.mutliplerDecrease or 0.005,
spawn_entity = spawnEntityName,
spread_delay = 300,
spread_delay_deviation = 180,
maximum_spread_count = 100,
flame_alpha = 0.35,
flame_alpha_deviation = 0.05,
emissions_per_second = 0.005,
add_fuel_cooldown = 10,
fade_in_duration = 30,
fade_out_duration = 30,
initial_lifetime = 120,
lifetime_increase_by = 150,
lifetime_increase_cooldown = 1,
maximum_lifetime = 1800,
delay_between_initial_flames = 10,
--initial_flame_count = 1,
burnt_patch_lifetime = 1800,
on_fuel_added_action =
{
type = "direct",
action_delivery =
{
type = "instant",
target_effects =
{
{
type = "create-trivial-smoke",
smoke_name = smokeAddingFuelName,
-- speed = {-0.03, 0},
-- speed_multiplier = 0.99,
-- speed_multiplier_deviation = 1.1,
offset_deviation = {{-0.5, -0.5}, {0.5, 0.5}},
speed_from_center = 0.01
}
}
}
},
pictures = create_fire_pictures({ blend_mode = "normal", animation_speed = 1, scale = 0.5, tint2 = attributes.tint2}),
smoke_source_pictures =
{
{
filename = "__base__/graphics/entity/fire-flame/fire-smoke-source-1.png",
line_length = 8,
width = 101,
height = 138,
frame_count = 31,
axially_symmetrical = false,
direction_count = 1,
shift = {-0.109375, -1.1875},
animation_speed = 0.5,
},
{
filename = "__base__/graphics/entity/fire-flame/fire-smoke-source-2.png",
line_length = 8,
width = 99,
height = 138,
frame_count = 31,
axially_symmetrical = false,
direction_count = 1,
shift = {-0.203125, -1.21875},
animation_speed = 0.5,
},
},
burnt_patch_pictures = create_burnt_patch_pictures(attributes),
burnt_patch_alpha_default = 0.4,
burnt_patch_alpha_variations = {
-- { tile = "grass", alpha = 0.4 },
-- { tile = "grass-medium", alpha = 0.4 },
-- { tile = "grass-dry", alpha = 0.45 },
-- { tile = "dirt", alpha = 0.3 },
-- { tile = "dirt-dark", alpha = 0.35 },
-- { tile = "sand", alpha = 0.24 },
-- { tile = "sand-dark", alpha = 0.28 },
{ tile = "stone-path", alpha = 0.26 },
{ tile = "concrete", alpha = 0.24 },
},
smoke =
{
{
name = smokeName,
deviation = {0.5, 0.5},
frequency = 0.25 / 2,
position = {0.0, -0.8},
starting_vertical_speed = 0.05,
starting_vertical_speed_deviation = 0.005,
vertical_speed_slowdown = 0.99,
starting_frame_deviation = 60,
height = -0.5,
}
},
light = {intensity = 1, size = 20},
working_sound =
{
sound = { filename = "__base__/sound/furnace.ogg" },
max_sounds_per_type = 3
},
}
}
)
return name
end
function fireUtils.makeAcidSplashFire(attributes, stickerName)
local name = attributes.name .. "-acid-fire-rampant"
local acidFire = {
type = "fire",
name = name,
flags = {"placeable-off-grid", "not-on-map"},
damage_per_tick = {amount = 0, type = "acid"},
maximum_damage_multiplier = 3,
damage_multiplier_increase_per_added_fuel = 1,
damage_multiplier_decrease_per_tick = 0.005,
collision_mask = { "water-tile" },
--spawn_entity = "fire-flame-on-tree",
uses_alternative_behavior = true,
limit_overlapping_particles = true,
initial_render_layer = "object",
render_layer = "lower-object-above-shadow",
secondary_render_layer = "higher-object-above",
secondary_picture_fade_out_start = 30,
secondary_picture_fade_out_duration = 60,
spread_delay = 300,
spread_delay_deviation = 180,
maximum_spread_count = 100,
particle_alpha = 0.6,
particle_alpha_blend_duration = 60*5,
--flame_alpha = 0.35,
--flame_alpha_deviation = 0.05,
emissions_per_second = 0,
add_fuel_cooldown = 10,
fade_in_duration = 1,
fade_out_duration = 30,
initial_lifetime = 60*7,--120,
lifetime_increase_by = 160,
lifetime_increase_cooldown = 4,
maximum_lifetime = 1800,
delay_between_initial_flames = 10,
initial_flame_count = 1,
burnt_patch_lifetime = 0,
working_sound =
{
sound = { filename = "__base__/sound/furnace.ogg" },
max_sounds_per_type = 3
},
on_damage_tick_effect =
{
type = "area",
radius = attributes.radius or 2.5,
force = "enemy",
ignore_collision_condition = true,
-- filter_enabled = true,
action_delivery =
{
type = "instant",
target_effects =
{
{
type = "create-sticker",
sticker = stickerName
},
{
type = "damage",
damage = { amount = attributes.damagePerTick or 0, type = attributes.damageType or "acid" }
}
}
}
},
pictures =
{
{
layers =
{
{
filename = "__base__/graphics/entity/acid-splash/acid-splash-1.png",
line_length = 8,
direction_count = 1,
width = 106,
height = 116,
frame_count = 26,
shift = util.mul_shift(util.by_pixel(-12, -10), (attributes.scale or 1)),
tint = attributes.tint2,
scale = attributes.scale,
hr_version = {
filename = "__base__/graphics/entity/acid-splash/hr-acid-splash-1.png",
line_length = 8,
direction_count = 1,
width = 210,
height = 224,
frame_count = 26,
shift = util.mul_shift(util.by_pixel(-12, -8), (attributes.scale or 1)),
tint = attributes.tint2,
scale = 0.5 * attributes.scale,
}
},
{
filename = "__base__/graphics/entity/acid-splash/acid-splash-1-shadow.png",
line_length = 8,
direction_count = 1,
width = 134,
height = 98,
frame_count = 26,
shift = util.mul_shift(util.by_pixel(2, 0), (attributes.scale or 1)),
draw_as_shadow = true,
scale = attributes.scale,
hr_version = {
filename = "__base__/graphics/entity/acid-splash/hr-acid-splash-1-shadow.png",
line_length = 8,
direction_count = 1,
width = 266,
height = 188,
frame_count = 26,
shift = util.mul_shift(util.by_pixel(2, 2), (attributes.scale or 1)),
draw_as_shadow = true,
scale = 0.5 * attributes.scale,
}
}
},
},
{
layers =
{
{
filename = "__base__/graphics/entity/acid-splash/acid-splash-2.png",
line_length = 8,
direction_count = 1,
width = 88,
height = 76,
frame_count = 29,
shift = util.mul_shift(util.by_pixel(-10, -18), (attributes.scale or 1)),
tint = attributes.tint2,
scale = attributes.scale,
hr_version = {
filename = "__base__/graphics/entity/acid-splash/hr-acid-splash-2.png",
line_length = 8,
direction_count = 1,
width = 174,
height = 150,
frame_count = 29,
shift = util.mul_shift(util.by_pixel(-9, -17), (attributes.scale or 1)),
tint = attributes.tint2,
scale = 0.5 * attributes.scale,
}
},
{
filename = "__base__/graphics/entity/acid-splash/acid-splash-2-shadow.png",
line_length = 8,
direction_count = 1,
width = 120,
height = 136,
frame_count = 29,
shift = util.mul_shift(util.by_pixel(6, 28), (attributes.scale or 1)),
draw_as_shadow = true,
scale = attributes.scale,
hr_version = {
filename = "__base__/graphics/entity/acid-splash/hr-acid-splash-2-shadow.png",
line_length = 8,
direction_count = 1,
width = 238,
height = 266,
frame_count = 29,
shift = util.mul_shift(util.by_pixel(6, 29), (attributes.scale or 1)),
draw_as_shadow = true,
scale = 0.5 * attributes.scale,
}
}
},
},
{
layers =
{
{
filename = "__base__/graphics/entity/acid-splash/acid-splash-3.png",
line_length = 8,
direction_count = 1,
width = 118,
height = 104,
frame_count = 29,
shift = util.mul_shift(util.by_pixel(22, -16), (attributes.scale or 1)),
tint = attributes.tint2,
scale = attributes.scale,
hr_version = {
filename = "__base__/graphics/entity/acid-splash/hr-acid-splash-3.png",
line_length = 8,
direction_count = 1,
width = 236,
height = 208,
frame_count = 29,
shift = util.mul_shift(util.by_pixel(22, -16), (attributes.scale or 1)),
tint = attributes.tint2,
scale = 0.5 * attributes.scale,
}
},
{
filename = "__base__/graphics/entity/acid-splash/acid-splash-3-shadow.png",
line_length = 8,
direction_count = 1,
width = 110,
height = 70,
frame_count = 29,
shift = util.mul_shift(util.by_pixel(16, 2), (attributes.scale or 1)),
draw_as_shadow = true,
scale = attributes.scale,
hr_version = {
filename = "__base__/graphics/entity/acid-splash/hr-acid-splash-3-shadow.png",
line_length = 8,
direction_count = 1,
width = 214,
height = 140,
frame_count = 29,
shift = util.mul_shift(util.by_pixel(17, 2), (attributes.scale or 1)),
draw_as_shadow = true,
scale = 0.5 * attributes.scale,
}
}
},
},
{
layers =
{
{
filename = "__base__/graphics/entity/acid-splash/acid-splash-4.png",
line_length = 8,
direction_count = 1,
width = 128,
height = 80,
frame_count = 24,
shift = util.mul_shift(util.by_pixel(16, -20), (attributes.scale or 1)),
tint = attributes.tint2,
scale = attributes.scale,
hr_version = {
filename = "__base__/graphics/entity/acid-splash/hr-acid-splash-4.png",
line_length = 8,
direction_count = 1,
width = 252,
height = 154,
frame_count = 24,
shift = util.mul_shift(util.by_pixel(17, -19), (attributes.scale or 1)),
tint = attributes.tint2,
scale = 0.5 * attributes.scale,
}
},
{
filename = "__base__/graphics/entity/acid-splash/acid-splash-4-shadow.png",
line_length = 8,
direction_count = 1,
width = 124,
height = 80,
frame_count = 24,
shift = util.mul_shift(util.by_pixel(18, -16), (attributes.scale or 1)),
draw_as_shadow = true,
scale = attributes.scale,
hr_version = {
filename = "__base__/graphics/entity/acid-splash/hr-acid-splash-4-shadow.png",
line_length = 8,
direction_count = 1,
width = 248,
height = 160,
frame_count = 24,
shift = util.mul_shift(util.by_pixel(18, -16), (attributes.scale or 1)),
draw_as_shadow = true,
scale = 0.5 * attributes.scale,
}
}
}
},
},
secondary_pictures =
{
{
layers =
{
{
filename = "__base__/graphics/entity/acid-splash/acid-splash-1.png",
line_length = 8,
direction_count = 1,
width = 106,
height = 116,
frame_count = 26,
shift = util.mul_shift(util.by_pixel(-12, -10), (attributes.scale or 1)),
tint = attributes.tint2,
scale = attributes.ground_patch_scale ,
hr_version = {
filename = "__base__/graphics/entity/acid-splash/hr-acid-splash-1.png",
line_length = 8,
direction_count = 1,
width = 210,
height = 224,
frame_count = 26,
shift = util.mul_shift(util.by_pixel(-12, -8), (attributes.scale or 1)),
tint = attributes.tint2,
scale = 0.5 * (attributes.scale or 1),
}
},
{
filename = "__base__/graphics/entity/acid-splash/acid-splash-1-shadow.png",
line_length = 8,
direction_count = 1,
width = 134,
height = 98,
frame_count = 26,
shift = util.mul_shift(util.by_pixel(2, 0), (attributes.scale or 1)),
draw_as_shadow = true,
scale = (attributes.scale or 1),
hr_version = {
filename = "__base__/graphics/entity/acid-splash/hr-acid-splash-1-shadow.png",
line_length = 8,
direction_count = 1,
width = 266,
height = 188,
frame_count = 26,
shift = util.mul_shift(util.by_pixel(2, 2), (attributes.scale or 1)),
draw_as_shadow = true,
scale = 0.5 * (attributes.scale or 1),
}
}
},
},
{
layers =
{
{
filename = "__base__/graphics/entity/acid-splash/acid-splash-2.png",
line_length = 8,
direction_count = 1,
width = 88,
height = 76,
frame_count = 29,
shift = util.mul_shift(util.by_pixel(-10, -18), (attributes.scale or 1)),
tint = attributes.tint2,
scale = (attributes.scale or 1),
hr_version = {
filename = "__base__/graphics/entity/acid-splash/hr-acid-splash-2.png",
line_length = 8,
direction_count = 1,
width = 174,
height = 150,
frame_count = 29,
shift = util.mul_shift(util.by_pixel(-9, -17), (attributes.scale or 1)),
tint = attributes.tint2,
scale = 0.5 * (attributes.scale or 1),
}
},
{
filename = "__base__/graphics/entity/acid-splash/acid-splash-2-shadow.png",
line_length = 8,
direction_count = 1,
width = 120,
height = 136,
frame_count = 29,
shift = util.mul_shift(util.by_pixel(6, 28), (attributes.scale or 1)),
draw_as_shadow = true,
scale = (attributes.scale or 1),
hr_version = {
filename = "__base__/graphics/entity/acid-splash/hr-acid-splash-2-shadow.png",
line_length = 8,
direction_count = 1,
width = 238,
height = 266,
frame_count = 29,
shift = util.mul_shift(util.by_pixel(6, 29), (attributes.scale or 1)),
draw_as_shadow = true,
scale = 0.5 * (attributes.scale or 1),
}
}
},
},
{
layers =
{
{
filename = "__base__/graphics/entity/acid-splash/acid-splash-3.png",
line_length = 8,
direction_count = 1,
width = 118,
height = 104,
frame_count = 29,
shift = util.mul_shift(util.by_pixel(22, -16), (attributes.scale or 1)),
tint = attributes.tint2,
scale = (attributes.scale or 1),
hr_version = {
filename = "__base__/graphics/entity/acid-splash/hr-acid-splash-3.png",
line_length = 8,
direction_count = 1,
width = 236,
height = 208,
frame_count = 29,
shift = util.mul_shift(util.by_pixel(22, -16), (attributes.scale or 1)),
tint = attributes.tint2,
scale = 0.5 * (attributes.scale or 1),
}
},
{
filename = "__base__/graphics/entity/acid-splash/acid-splash-3-shadow.png",
line_length = 8,
direction_count = 1,
width = 110,
height = 70,
frame_count = 29,
shift = util.mul_shift(util.by_pixel(16, 2), (attributes.scale or 1)),
draw_as_shadow = true,
scale = (attributes.scale or 1),
hr_version = {
filename = "__base__/graphics/entity/acid-splash/hr-acid-splash-3-shadow.png",
line_length = 8,
direction_count = 1,
width = 214,
height = 140,
frame_count = 29,
shift = util.mul_shift(util.by_pixel(17, 2), (attributes.scale or 1)),
draw_as_shadow = true,
scale = 0.5 * (attributes.scale or 1),
}
}
},
},
{
layers =
{
{
filename = "__base__/graphics/entity/acid-splash/acid-splash-4.png",
line_length = 8,
direction_count = 1,
width = 128,
height = 80,
frame_count = 24,
shift = util.mul_shift(util.by_pixel(16, -20), (attributes.scale or 1)),
tint = attributes.tint2,
scale = (attributes.scale or 1),
hr_version = {
filename = "__base__/graphics/entity/acid-splash/hr-acid-splash-4.png",
line_length = 8,
direction_count = 1,
width = 252,
height = 154,
frame_count = 24,
shift = util.mul_shift(util.by_pixel(17, -19), (attributes.scale or 1)),
tint = attributes.tint2,
scale = 0.5 * (attributes.scale or 1),
}
},
{
filename = "__base__/graphics/entity/acid-splash/acid-splash-4-shadow.png",
line_length = 8,
direction_count = 1,
width = 124,
height = 80,
frame_count = 24,
shift = util.mul_shift(util.by_pixel(18, -16), (attributes.scale or 1)),
draw_as_shadow = true,
scale = (attributes.scale or 1),
hr_version = {
filename = "__base__/graphics/entity/acid-splash/hr-acid-splash-4-shadow.png",
line_length = 8,
direction_count = 1,
width = 248,
height = 160,
frame_count = 24,
shift = util.mul_shift(util.by_pixel(18, -16), (attributes.scale or 1)),
draw_as_shadow = true,
scale = 0.5 * (attributes.scale or 1),
}
}
}
}
}
}
data:extend ({
acidFire
})
return name
end
return fireUtils