fusion-lab/data.lua

changeset 10
101603241531
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/fusion-lab/data.lua	Wed Jul 02 14:28:57 2025 +0300
@@ -0,0 +1,301 @@
+local fluoro_heat_exchanger_icons = {
+	{icon = data.raw.boiler['heat-exchanger'].icon},
+	{
+		icon = data.raw.fluid['fluoroketone-cold'].icon,
+		scale = 0.3,
+		shift = {-8, -8},
+	},
+}
+
+data:extend{
+	{
+		type = "item",
+		name = "fusion-lab",
+		icon = "__fusion-lab__/graphics/icons/photometric-lab-icon.png",
+		subgroup = "production-machine",
+		order = "z[lab]b[fusion-lab]",
+		inventory_move_sound = data.raw.lab.lab.inventory_move_sound,
+		pick_sound = data.raw.item["fusion-reactor"].pick_sound,
+		drop_sound = data.raw.item["fusion-reactor"].drop_sound,
+		place_result = "fusion-lab",
+		weight = 200 * kg,
+		stack_size = 5,
+		default_import_location = "aquilo"
+	},
+	{
+		type = "recipe",
+		name = "fusion-lab",
+		category = data.raw.recipe['fusion-reactor'].category,
+		subgroup = data.raw.recipe.lab.subgroup,
+		order = "x[fusion-lab]",
+		enabled = false,
+		energy_required = data.raw.recipe.biolab.energy_required,
+		ingredients =
+		{
+			{type = "item", name = "lab", amount = 1},
+			{type = "item", name = "refined-concrete", amount = 25},
+			{type = "item", name = "tungsten-plate", amount = 50},
+			{type = "item", name = "holmium-plate", amount = 50},
+			{type = "item", name = "quantum-processor", amount = 50},
+		},
+		results = {
+			{type = "item", name = "fusion-lab", amount = 1},
+		},
+		surface_conditions = table.deepcopy(data.raw.recipe['fusion-reactor'].surface_conditions),
+		allow_productivity = false,
+	},
+	{
+		type = "lab",
+		name = "fusion-lab",
+		selection_priority = 100,
+		icon = "__fusion-lab__/graphics/icons/photometric-lab-icon.png",
+		flags = {"placeable-player", "player-creation"},
+		minable = {mining_time = 0.2, result = "fusion-lab"},
+		max_health = 350,
+		corpse = "cargo-bay-remnants",
+		dying_explosion = "lab-explosion",
+		collision_box = data.raw.lab.biolab.collision_box, -- 5×5
+		selection_box = data.raw.lab.biolab.selection_box, -- 5×5
+		damaged_trigger_effect = data.raw.lab.lab.damaged_trigger_effect,
+		surface_conditions = table.deepcopy(data.raw.container['steel-chest'].surface_conditions),
+		on_animation =
+		{
+			layers =
+			{
+				util.sprite_load("__fusion-lab__/graphics/entity/fusion-lab/photometric-lab-hr-shadow", {
+					frame_count = 1,
+					scale = 0.5,
+					repeat_count = 80,
+					animation_speed = 0.4,
+					draw_as_shadow = true,
+				}),
+				util.sprite_load("__fusion-lab__/graphics/entity/fusion-lab/photometric-lab-hr-animation", {
+					frame_count = 80,
+					animation_speed = 0.4,
+					scale = 0.5
+				}),
+				util.sprite_load("__fusion-lab__/graphics/entity/fusion-lab/photometric-lab-hr-emission", {
+					frame_count = 80,
+					animation_speed = 0.4,
+					scale = 0.5,
+					blend_mode = "additive",
+					draw_as_glow = true,
+				}),
+			}
+		},
+		off_animation =
+		{
+			layers =
+			{
+				util.sprite_load("__fusion-lab__/graphics/entity/fusion-lab/photometric-lab-hr-shadow", {
+					frame_count = 1,
+					scale = 0.5,
+					repeat_count = 80,
+					animation_speed = 0.4,
+					draw_as_shadow = true,
+				}),
+				util.sprite_load("__fusion-lab__/graphics/entity/fusion-lab/photometric-lab-hr-animation", {
+					frame_count = 80,
+					animation_speed = 0.4,
+					scale = 0.5
+				}),
+			}
+		},
+		working_sound =
+		{
+			-- it's a space age ensemble!
+			sound =
+			{
+				-- filename = "__space-age__/sound/entity/fusion/fusion-reactor.ogg",
+				filename = "__space-age__/sound/entity/tesla-turret/tesla-turret-rotation-loop.ogg",
+				volume = 0.65,
+				max_sounds_per_prototype = 2,
+			},
+			fade_in_ticks = 4,
+			fade_out_ticks = 20,
+			sound_accents =
+			{
+				{sound = {filename = "__space-age__/sound/entity/foundry/foundry-slide-open.ogg", volume = 0.65, audible_distance_modifier = 0.3}, frame = 3},
+				{sound = {filename = "__space-age__/sound/entity/foundry/foundry-slide-close.ogg", volume = 0.65, audible_distance_modifier = 0.3}, frame = 34},
+				{sound = {variations = sound_variations("__quality__/sound/recycler/recycler-mechanic", 3, 0.85), audible_distance_modifier = 0.3}, frame = 16},
+				{sound = {variations = sound_variations("__quality__/sound/recycler/recycler-mechanic", 3, 0.85), audible_distance_modifier = 0.3}, frame = 41},
+				{sound = {variations = sound_variations("__quality__/sound/recycler/recycler-jaw-shut", 3, 0.35), audible_distance_modifier = 0.3}, frame = 24},
+				{sound = {variations = sound_variations("__quality__/sound/recycler/recycler-jaw-shut", 3, 0.45), audible_distance_modifier = 0.3}, frame = 64},
+				{sound = {variations = sound_variations("__space-age__/sound/entity/electromagnetic-plant/emp-electric", 5, 0.5), audible_distance_modifier = 0.4, }, frame = 6 - 5},
+				{sound = {variations = sound_variations("__space-age__/sound/entity/electromagnetic-plant/emp-electric", 5, 0.5), audible_distance_modifier = 0.4, }, frame = 56 - 5},
+				{sound = {filename = "__space-age__/sound/entity/tesla-turret/tesla-turret-rotation-stop.ogg", volume = 0.8, audible_distance_modifier = 0.6}, frame = 8},
+				{sound = {filename = "__space-age__/sound/entity/tesla-turret/tesla-turret-rotation-stop.ogg", volume = 0.8, audible_distance_modifier = 0.6}, frame = 44},
+				{sound = {variations = sound_variations("__space-age__/sound/entity/biolab/biolab-beaker", 7, 0.95), audible_distance_modifier = 0.6}, frame = 20},
+			},
+			max_sounds_per_prototype = 2
+		},
+		impact_category = "glass",
+		open_sound = { filename = "__base__/sound/open-close/lab-open.ogg", volume = 0.6 },
+		close_sound = { filename = "__base__/sound/open-close/lab-close.ogg", volume = 0.6 },
+		energy_source = table.deepcopy(data.raw['fusion-reactor']['fusion-reactor'].burner),
+		energy_usage = "1MW",
+		researching_speed = settings.startup["fusion-lab-researching-speed"].value,
+		module_slots = settings.startup["fusion-lab-module-slots"].value,
+		inputs = table.deepcopy(data.raw.lab.biolab.inputs),
+		science_pack_drain_rate_percent = settings.startup["fusion-lab-drain-rate-percent"].value,
+		icons_positioning = data.raw.lab.biolab.icons_positioning,
+	},
+	{
+		type = "heat-interface",
+		name = "fusion-lab-heat-interface",
+		icon = "__base__/graphics/icons/heat-interface.png",
+		flags = {"placeable-player", "not-on-map", "not-flammable", "not-blueprintable", "not-deconstructable"},
+		placeable_by = {item = "fusion-lab", count = 1},
+		collision_mask = {layers={}},
+		selection_priority = 150,
+		hidden = true,
+		factoriopedia_alternative = "fusion-lab",
+		max_health = 200,
+		corpse = "small-remnants",
+		collision_box = data.raw.lab.biolab.collision_box, -- 5×5
+		selection_box = data.raw.lab.lab.selection_box, -- 3×3
+		gui_mode = "none", -- all, none, admins
+		open_sound = data.raw["fusion-reactor"]["fusion-reactor"].open_sound,
+		close_sound = data.raw["fusion-reactor"]["fusion-reactor"].close_sound,
+		heat_buffer =
+		{
+			max_temperature = 1000,
+			specific_heat = "1MJ",
+			max_transfer = "1GW",
+			default_temperature = 15,
+			min_working_temperature = 15,
+			pipe_covers = data.raw.boiler["heat-exchanger"].energy_source.pipe_covers,
+			heat_pipe_covers = data.raw.boiler["heat-exchanger"].energy_source.heat_pipe_covers,
+			connections =
+			{
+				{position = { 2, -2}, direction = defines.direction.north},
+				{position = {-2, -2}, direction = defines.direction.north},
+				{position = { 2,	2}, direction = defines.direction.south},
+				{position = {-2,	2}, direction = defines.direction.south},
+				{position = { 2, -2}, direction = defines.direction.east},
+				{position = { 2,	2}, direction = defines.direction.east},
+				{position = {-2, -2}, direction = defines.direction.west},
+				{position = {-2,	2}, direction = defines.direction.west},
+			}
+		},
+		picture =
+		{
+			filename = "__base__/graphics/entity/nuclear-reactor/reactor-pipes.png",
+			height = 316,
+			width = 320,
+			scale = 0.5,
+			flags = {"no-crop"},
+			shift = util.by_pixel(-1, -5)
+		}
+	},
+	{
+		type = "item",
+		name = "fluoro-heat-exchanger",
+		icons = fluoro_heat_exchanger_icons,
+		subgroup = "energy",
+		order = "f[nuclear-energy]-d[fluoro-heat-exchanger]",
+		inventory_move_sound = data.raw.item["heat-exchanger"].inventory_move_sound,
+		pick_sound = data.raw.item["heat-exchanger"].pick_sound,
+		drop_sound = data.raw.item["heat-exchanger"].drop_sound,
+		place_result = "fluoro-heat-exchanger",
+		stack_size = 50,
+		weight = 40*kg,
+		random_tint_color = data.raw.item["heat-exchanger"].random_tint_color,
+	},
+	{
+		type = "technology",
+		name = "fusion-lab",
+		icon = "__fusion-lab__/graphics/technology/fusion-lab.png",
+		icon_size = 256,
+		effects =
+		{
+			{
+				type = "unlock-recipe",
+				recipe = "fusion-lab"
+			},
+			{
+				type = "unlock-recipe",
+				recipe = "fluoro-heat-exchanger"
+			},
+		},
+		prerequisites = {"fusion-reactor"},
+		unit =
+		{
+			count_formula = "1000",
+			ingredients = table.deepcopy(data.raw.technology["fusion-reactor"].unit.ingredients),
+			time = 60
+		}
+	},
+	{
+		type = "recipe",
+		name = "fluoro-heat-exchanger",
+		category = "crafting",
+		subgroup = data.raw.recipe["heat-exchanger"].subgroup,
+		order = "zzz[fluoro-heat-exchanger]",
+		enabled = false,
+		energy_required = data.raw.recipe["heat-exchanger"].energy_required,
+		ingredients = data.raw.recipe["heat-exchanger"].ingredients,
+		results = {
+			{type = "item", name = "fluoro-heat-exchanger", amount = 1},
+		},
+		allow_productivity = false,
+	},
+}
+
+local fluoro_heat_exchanger = table.deepcopy(data.raw.boiler["heat-exchanger"])
+fluoro_heat_exchanger.name = "fluoro-heat-exchanger"
+fluoro_heat_exchanger.icon = nil
+fluoro_heat_exchanger.icons = fluoro_heat_exchanger_icons
+fluoro_heat_exchanger.fluid_box.filter = "fluoroketone-cold"
+fluoro_heat_exchanger.output_fluid_box.filter = "fluoroketone-hot"
+fluoro_heat_exchanger.minable.result = "fluoro-heat-exchanger"
+fluoro_heat_exchanger.energy_source.min_working_temperature = 180
+fluoro_heat_exchanger.target_temperature = 180
+data:extend{fluoro_heat_exchanger}
+
+local smoke_source = table.deepcopy(data.raw["particle-source"]["nuclear-smouldering-smoke-source"])
+smoke_source.name = "fusion-lab-smoke-source"
+smoke_source.time_before_start = 0
+smoke_source.time_before_start_deviation = 0
+smoke_source.time_to_live = 31
+smoke_source.time_to_live_deviation = 0
+smoke_source.height = 0.8
+smoke_source.smoke[1].frequency = 0.5
+data:extend{smoke_source}
+
+-- TODO: replace the fusion-lab-heat-interface with this, once I figure out how
+-- to change its "consumption" (i.e. power output) during runtime...
+--[[
+local void_reactor = table.deepcopy(data.raw.reactor['nuclear-reactor'])
+void_reactor.name = "void-reactor"
+void_reactor.energy_source = {type = "void"}
+void_reactor.minable = nil
+void_reactor.consumption = "660kW"
+void_reactor.neighbour_bonus = 0
+void_reactor.surface_conditions = nil
+void_reactor.picture = nil
+void_reactor.light = nil
+void_reactor.working_light_picture = nil
+data:extend{void_reactor}
+]]--
+
+local fusion_lab_menu_simulation = {
+    checkboard = false,
+    save = '__fusion-lab__/menu-simulations/menu-simulation-fusion-lab.zip',
+    length = 60 * 14,
+    init =
+    [[
+      local sim_planet = game.surfaces.fulgora
+      local logo = sim_planet.find_entities_filtered{name = "factorio-logo-11tiles", limit = 1}[1]
+      logo.destructible = false
+      local center = {logo.position.x, logo.position.y+9.75}
+      game.simulation.camera_surface_index = sim_planet.index
+      game.simulation.camera_position = center
+      game.simulation.camera_zoom = 1
+      game.tick_paused = false
+      require("__fusion-lab__.menu-simulations.menu-simulation-fusion-lab")
+    ]]
+  }
+
+-- data.raw["utility-constants"]["default"].main_menu_simulations = {}
+data.raw["utility-constants"]["default"].main_menu_simulations["fusion-lab"] = fusion_lab_menu_simulation

mercurial