772 lines
18 KiB
Lua

local util = require("tf_util/tf_util")
data:extend({
{
type = "item",
name = "mirv-rocket",
icon = "__MIRV__/mirv_rocket.png",
icon_size = 32,
flags = {},
subgroup = "defensive-structure",
order = "z[MIRV]",
stack_size = 1,
},
{
type = "recipe",
name = "mirv-rocket",
energy_required = 10,
enabled = false,
category = "crafting",
ingredients =
{
{"atomic-bomb", 20},
{"rocket-fuel", 50},
{"rocket-control-unit", 10}
},
result= "mirv-rocket",
order = "z[MIRV]"
},
{
type = "arrow",
name = "mirv-entity",
render_layer = "object",
icon = "__MIRV__/mirv_item.png",
icon_size = 32,
flags = {"placeable-neutral", "player-creation", "placeable-off-grid"},
selectable_in_game = false,
order = "z[MIRV]",
max_health = 1,
collision_box = {{0, 0}, {0, 0}},
selection_box = {{-0.5, -0.5}, {0.5, 0.5}},
drawing_box = {{-32, -32},{32,32}},
circle_picture =
{
filename = "__MIRV__/mirv_template.png",
priority = "extra-high",
width = 768,
height = 548,
scale = 3,
shift = util.by_pixel(0,-32)
},
arrow_picture =
{
filename = "__core__/graphics/empty.png",
priority = "extra-high",
width = 1,
height = 1,
}
},
{
type = "trivial-smoke",
name = "mirv-smoke",
flags = {"not-on-map"},
show_when_smoke_off = true,
duration = 440,
fade_in_duration = 0,
fade_away_duration = 0,
spread_duration = 380,
start_scale = 3,
end_scale = 1,
cyclic = true,
affected_by_wind = false,
movement_slow_down_factor = 0,
color = {r = 1, g = 1, b = 1},
render_layer = "lower-object",
animation =
{
width = 624,
height = 440,
line_length = 3,
frame_count = 12,
axially_symmetrical = false,
direction_count = 1,
priority = "high",
animation_speed = 0.25,
filename = "__MIRV__/mirv_anim.png"
}
},
{
type = "trivial-smoke",
name = "mirv-smoke-2",
flags = {"not-on-map"},
show_when_smoke_off = true,
duration = 440,
fade_in_duration = 0,
fade_away_duration = 0,
spread_duration = 380,
start_scale = 3,
end_scale = 1,
cyclic = true,
affected_by_wind = false,
movement_slow_down_factor = 0,
color = {r = 1, g = 1, b = 1},
render_layer = "lower-object",
animation =
{
width = 800,
height = 565,
line_length = 1,
frame_count = 1,
axially_symmetrical = false,
direction_count = 1,
priority = "high",
animation_speed = 0.25,
filename = "__MIRV__/mirv_static.png"
}
},
{
type = "simple-entity-with-owner",
name = "mirv-target",
render_layer = "object",
icon = "__MIRV__/mirv-target.png",
icon_size = 32,
flags = {},
order = "z[MIRV]",
max_health = 1,
selectable_in_game = false,
collision_box = {{0, 0}, {0, 0}},
selection_box = {{0, 0}, {0, 0}},
picture =
{
filename = "__core__/graphics/empty.png",
priority = "extra-high",
width = 1,
height = 1
},
build_sound =
{
filename = "__MIRV__/launch-sound.ogg",
volume = 1
}
},
{
type = "technology",
name = "mirv-technology",
icon = "__MIRV__/mirv-technology.png",
icon_size = 128,
effects =
{
{
type = "unlock-recipe",
recipe = "mirv-rocket"
},
{
type = "unlock-recipe",
recipe = "mirv-targeting-remote"
},
},
prerequisites = {"rocket-silo", "atomic-bomb"},
unit =
{
count = 10000,
ingredients =
{
{"automation-science-pack", 1},
{"logistic-science-pack", 1},
{"chemical-science-pack", 1},
{"military-science-pack", 1},
{"production-science-pack", 1},
{"utility-science-pack", 1}
},
time = 45
},
order = "e-a-c"
}
})
local turret =
{
type = "artillery-turret",
name = "mirv-launcher",
localised_name = {"item-name.mirv-rocket"},
icon = "__MIRV__/mirv_rocket.png",
icon_size = 32,
flags = {"placeable-neutral", "placeable-player", "player-creation"},
--collision_box = {{-1.45, -1.45}, {1.45, 1.45}},
--selection_box = {{-1.5, -1.5}, {1.5, 1.5}},
collision_mask = {},
inventory_size = 1,
ammo_stack_limit = 5,
automated_ammo_count = 1,
gun = "mirv-launcher-gun",
turret_rotation_speed = 1,
manual_range_modifier = 1000000,
disable_automatic_firing = not settings.startup["mirv-auto-launch"].value,
base_picture = util.empty_sprite(),
cannon_barrel_pictures = util.empty_sprite(),
cannon_base_pictures = util.empty_sprite(),
order = "lol",
alert_when_attacking = false
}
local gun =
{
type = "gun",
name = "mirv-launcher-gun",
localised_name = {"item-name.mirv-rocket"},
icon = "__base__/graphics/icons/tank-cannon.png",
icon_size = 64, icon_mipmaps = 4,
flags = {"hidden"},
subgroup = "gun",
order = "z[artillery]-a[cannon]",
attack_parameters =
{
type = "projectile",
ammo_category = util.ammo_category("mirv-launcher"),
cooldown = 15 * 60,
movement_slow_down_factor = 0,
range = 1000
},
stack_size = 1
}
local ammo =
{
type = "ammo",
name = "mirv-ammo",
icon = "__base__/graphics/icons/atomic-bomb.png",
icon_size = 1, icon_mipmaps = 1,
ammo_type =
{
target_type = "position",
category = util.ammo_category("mirv-launcher"),
action =
{
type = "direct",
action_delivery =
{
type = "instant",
target_effects =
{
{
type = "script",
effect_id = "mirv-launch"
},
{
type = "nested-result",
action =
{
type = "area",
radius = 120,
target_entities = false,
action_delivery =
{
type = "instant",
target_effects =
{
{
type = "damage",
damage = {amount = 0 , type = "physical"}
}
}
}
}
}
}
}
}
},
subgroup = "ammo",
order = "d[rocket-launcher]-c[atomic-bomb]",
stack_size = 10
}
local nuke_target_effects =
{
{
type = "nested-result",
action =
{
type = "area",
target_entities = false,
trigger_from_target = true,
repeat_count = 50,
radius = 10,
action_delivery =
{
type = "instant",
target_effects =
{
{
type = "create-entity",
entity_name = "nuke-explosion"
}
}
}
}
}
}
if settings.startup["mirv-pollution-on-detonation"].value then
table.insert(nuke_target_effects,
{
type = "script",
effect_id = "mirv-pollute"
})
end
local do_whacka_do = function()
local watra = 1 + ((math.random() - 0.5))
return
{
filename = "__base__/graphics/entity/bigass-explosion/hr-bigass-explosion-36f.png",
flags = { "compressed" },
animation_speed = 0.5 * watra,
width = 324,
height = 416,
frame_count = 36,
shift = util.by_pixel(0, -48),
scale = 1 / watra,
stripes =
{
{
filename = "__base__/graphics/entity/bigass-explosion/hr-bigass-explosion-36f-1.png",
width_in_frames = 6,
height_in_frames = 3
},
{
filename = "__base__/graphics/entity/bigass-explosion/hr-bigass-explosion-36f-2.png",
width_in_frames = 6,
height_in_frames = 3
}
}
}
end
local nuke_explosion =
{
type = "explosion",
name = "nuke-explosion",
flags = {"not-on-map"},
animations =
{
do_whacka_do(), do_whacka_do(), do_whacka_do(),
do_whacka_do(), do_whacka_do(), do_whacka_do(),
do_whacka_do(), do_whacka_do(), do_whacka_do(),
do_whacka_do(), do_whacka_do(), do_whacka_do(),
do_whacka_do(), do_whacka_do(), do_whacka_do(),
do_whacka_do(), do_whacka_do(), do_whacka_do(),
do_whacka_do(), do_whacka_do(), do_whacka_do(),
do_whacka_do(), do_whacka_do(), do_whacka_do(),
do_whacka_do(), do_whacka_do(), do_whacka_do(),
do_whacka_do(), do_whacka_do(), do_whacka_do(),
do_whacka_do(), do_whacka_do(), do_whacka_do(),
do_whacka_do(), do_whacka_do(), do_whacka_do(),
do_whacka_do(), do_whacka_do(), do_whacka_do(),
do_whacka_do(), do_whacka_do(), do_whacka_do(),
do_whacka_do(), do_whacka_do(), do_whacka_do(),
do_whacka_do(), do_whacka_do(), do_whacka_do(),
do_whacka_do(), do_whacka_do(), do_whacka_do(),
do_whacka_do(), do_whacka_do(), do_whacka_do(),
},
light = {intensity = 1, size = 50, color = {r=1.0, g=1.0, b=1.0}},
sound =
{
aggregation =
{
max_count = 2,
remove = true
},
variations =
{
{
filename = "__base__/sound/fight/large-explosion-1.ogg",
volume = 1.0
},
{
filename = "__base__/sound/fight/large-explosion-2.ogg",
volume = 1.0
}
}
}
}
local fire_util = require("tf_util/tf_fire_util")
local fiery_particle =
{
type = "optimized-particle",
name = "fiery-particle",
life_time = 100,
movement_modifier = 0,
pictures = fire_util.create_fire_pictures{scale = 2}
}
data:extend{fiery_particle}
local make_scorchmark = function(name)
local scale = math.random(50, 250) / 100
data:extend
{
{
type = "corpse",
name = name,
icon = "__base__/graphics/icons/small-scorchmark.png",
icon_size = 64, icon_mipmaps = 4,
flags = {"placeable-neutral", "not-on-map", "placeable-off-grid"},
collision_box = {{-1.5, -1.5}, {1.5, 1.5}},
collision_mask = {"doodad-layer", "not-colliding-with-itself"},
selection_box = {{-1, -1}, {1, 1}},
selectable_in_game = false,
time_before_removed = 60 * 60 * (scale + 2),
final_render_layer = "ground-patch-higher2",
subgroup = "remnants",
order="d[remnants]-b[scorchmark]-a[small]",
remove_on_entity_placement = false,
remove_on_tile_placement = true,
ground_patch =
{
sheet =
{
filename = "__base__/graphics/entity/scorchmark/small-scorchmark.png",
width = 128,
height = 92,
line_length = 4,
shift = util.by_pixel(0, 2),
variation_count = 4,
scale = scale,
hr_version =
{
filename = "__base__/graphics/entity/scorchmark/hr-small-scorchmark.png",
width = 256,
height = 182,
line_length = 4,
shift = util.by_pixel(0, 2),
variation_count = 4,
scale = scale / 2,
}
}
},
ground_patch_higher =
{
sheet =
{
filename = "__base__/graphics/entity/scorchmark/small-scorchmark-top.png",
width = 34,
height = 28,
line_length = 4,
variation_count = 4,
shift = util.by_pixel(0, -2),
scale = scale,
hr_version =
{
filename = "__base__/graphics/entity/scorchmark/hr-small-scorchmark-top.png",
width = 68,
height = 54,
line_length = 4,
shift = util.by_pixel(0, -2),
variation_count = 4,
scale = 0.5 * scale,
}
}
}
}
}
return name
end
local pictures = fire_util.create_fire_pictures({scale = 3, shift = {0, 3}})
local make_fire = function(name)
local fire = util.copy(data.raw.fire["fire-flame"])
fire.name = name
fire.initial_lifetime = math.random(5, 20) * 60
fire.collision_box = {{-1.5, -1.5}, {1.5, 1.5}}
fire.collision_mask = {"doodad-layer", "not-colliding-with-itself"}
data:extend{fire}
return name
end
local total = #pictures
local proj_count = math.ceil(2000 / total)
for k, picture in pairs (pictures) do
local effect =
{
type = "nested-result",
action =
{
{
type = "area",
target_entities = false,
trigger_from_target = true,
repeat_count = proj_count,
radius = 100,
action_delivery =
{
type = "artillery",
projectile = "mirv-nuke-projectile"..k,
starting_speed = 0.75,
starting_speed_deviation = 0.2,
direction_deviation = 0,
range_deviation = 0.5
}
}
}
}
table.insert(nuke_target_effects, effect)
local nested_projectile =
{
type = "artillery-projectile",
name = "mirv-nuke-projectile"..k,
flags = {"not-on-map"},
map_color = {1, 1, 1},
reveal_map = true,
picture = picture,
chart_picture =
{
filename = "__base__/graphics/entity/artillery-projectile/artillery-shoot-map-visualization.png",
flags = { "icon" },
frame_count = 1,
width = 64,
height = 64,
priority = "high",
scale = math.random(20, 30) / 100
},
action =
{
type = "direct",
action_delivery =
{
type = "instant",
target_effects =
{
{
type = "nested-result",
action =
{
type = "area",
radius = 5.0,
action_delivery =
{
type = "instant",
target_effects =
{
{
type = "create-fire",
entity_name = make_fire("nuke-fire"..k),
initial_ground_flame_count = math.random(10, 20),
check_buildability = true,
probability = 0.1
},
{
type = "damage",
damage = {amount = 2000 , type = "physical"}
},
}
}
}
},
{
type = "create-particle",
repeat_count = 3,
particle_name = "fiery-particle",
initial_height = 0.1,
--speed_from_center = 0.08,
--speed_from_center_deviation = 0.1,
offset_deviation = {{-3, -3}, {3,3}}
--initial_vertical_speed = 0.18,
--initial_vertical_speed_deviation = 0.15,
},
{
type = "show-explosion-on-chart",
scale = math.random(6, 12)/32
},
{
type = "create-entity",
entity_name = "nuke-explosion"
},
{
type = "create-entity",
entity_name = make_scorchmark("nuke-scorchmark"..k.."1"),
check_buildability = true,
offset_deviation = {{-4, -4},{4, 4}}
},
{
type = "create-entity",
entity_name = make_scorchmark("nuke-scorchmark"..k.."2"),
check_buildability = true,
offset_deviation = {{-4, -4},{4, 4}}
}
}
}
}
}
data:extend{nested_projectile}
end
local projectile =
{
type = "artillery-projectile",
name = "mirv-projectile",
flags = {"not-on-map"},
acceleration = 0.01,
reveal_map = false,
map_color = {r = 0, g = 1, b = 0},
action =
{
type = "direct",
action_delivery =
{
type = "instant",
target_effects = nuke_target_effects
}
},
chart_picture =
{
layers =
{
{
filename = "__base__/graphics/entity/artillery-projectile/artillery-shoot-map-visualization.png",
flags = { "icon" },
frame_count = 1,
width = 64,
height = 64,
priority = "high",
scale = 1,
shift = {0.05, -0.5}
},
{
filename = "__base__/graphics/entity/artillery-projectile/artillery-shoot-map-visualization.png",
flags = { "icon" },
frame_count = 1,
width = 64,
height = 64,
priority = "high",
scale = 0.5,
shift = {0.05, -0.8}
},
{
filename = "__MIRV__/mirv_projectile.png",
width = 64,
height = 64,
scale = 0.5,
frame_count = 1
}
}
},
light = {intensity = 0.8, size = 15},
picture =
{
filename = "__base__/graphics/entity/rocket-silo/02-rocket.png",
width = 154,
height = 300,
scale = 0.5,
shift = util.by_pixel(-4, -28),
hr_version =
{
filename = "__base__/graphics/entity/rocket-silo/hr-02-rocket.png",
width = 310,
height = 596,
shift = util.by_pixel(-5, -27),
scale = 0.25
}
},
shadow =
{
filename = "__base__/graphics/entity/rocket/rocket-shadow.png",
frame_count = 1,
width = 1,
height = 1,
priority = "high",
shift = {0, 0}
}
}
local remote =
{
type = "capsule",
name = "mirv-targeting-remote",
icon = "__MIRV__/mirv-targeting-remote.png",
icon_size = 64,
capsule_action =
{
type = "artillery-remote",
flare = "mirv-flare"
},
subgroup = "capsule",
order = "zz",
stack_size = 1
}
local flare =
{
type = "artillery-flare",
name = "mirv-flare",
icon = "__base__/graphics/icons/artillery-targeting-remote.png",
icon_size = 64, icon_mipmaps = 4,
flags = {"placeable-off-grid", "not-on-map"},
map_color = {r=1, g=0.5, b=0},
life_time = 60 * 60,
initial_height = 0,
initial_vertical_speed = 0,
initial_frame_speed = 1,
shots_per_flare = 1,
early_death_ticks = 3 * 60,
shot_category = util.ammo_category("mirv-launcher"),
pictures =
{
{
filename = "__core__/graphics/shoot-cursor-red.png",
priority = "low",
width = 258,
height = 183,
frame_count = 1,
scale = 1,
flags = {"icon"}
},
--{
-- filename = "__base__/graphics/entity/sparks/sparks-02.png",
-- width = 36,
-- height = 32,
-- frame_count = 19,
-- line_length = 19,
-- shift = {0.03125, 0.125},
-- tint = { r = 1.0, g = 0.9, b = 0.0, a = 1.0 },
-- animation_speed = 0.3,
--}
}
}
local remote_recipe =
{
type = "recipe",
name = "mirv-targeting-remote",
enabled = false,
ingredients =
{
{"processing-unit", 1},
{"radar", 1}
},
result = "mirv-targeting-remote"
}
data:extend
{
turret,
gun,
ammo,
projectile,
remote,
flare,
remote_recipe,
nuke_explosion
}
local artillery_flare = data.raw["artillery-flare"]["artillery-flare"]
if artillery_flare then
artillery_flare.shot_category = artillery_flare.shot_category or "artillery-shell"
end