z_mirror/Krastorio2

git clone https://git.raiguard.me/z_mirror/Krastorio2

Caleb HeuerFixed that you could open the spaceship reactor GUI5ef973db

real-fusion-reactor
4.7 KiB178 linesraw
1local function add_starting_items()
2  local items = remote.call("freeplay", "get_created_items")
3  -- Shelter
4  items["kr-shelter"] = 1
5  -- Electric poles
6  if script.active_mods["aai-industry"] and prototypes.item["medium-electric-pole"] then
7    items["medium-electric-pole"] = 10
8  end
9  remote.call("freeplay", "set_created_items", items)
10end
11
12local new_ship_parts = {
13  {
14    name = "kr-spaceship-reactor",
15    angle_deviation = 0.2,
16    max_distance = 25,
17    min_separation = 10,
18    fire_count = 3,
19    explosion_count = 1,
20    force = "player",
21  },
22  {
23    name = "kr-spaceship-research-computer",
24    angle_deviation = 0.05,
25    max_distance = 30,
26    min_separation = 10,
27    fire_count = 3,
28    explosion_count = 1,
29    force = "player",
30  },
31  {
32    name = "kr-spaceship-material-fabricator-1",
33    repeat_count = 2,
34    angle_deviation = 0.3,
35    max_distance = 20,
36    min_separation = 5,
37    fire_count = 1,
38    force = "player",
39  },
40  {
41    name = "kr-spaceship-material-fabricator-2",
42    repeat_count = 2,
43    angle_deviation = 0.3,
44    max_distance = 20,
45    min_separation = 5,
46    fire_count = 1,
47    force = "player",
48  },
49  {
50    name = "crash-site-chest-1",
51    repeat_count = 3,
52    angle_deviation = 0.1,
53    max_distance = 20,
54    min_separation = 3,
55    fire_count = 1,
56  },
57  {
58    name = "crash-site-chest-2",
59    repeat_count = 3,
60    angle_deviation = 0.1,
61    max_distance = 20,
62    min_separation = 2,
63    fire_count = 1,
64  },
65}
66
67local function add_to_crash_site()
68  if
69    not remote.interfaces.freeplay.get_disable_crashsite
70    or remote.call("freeplay", "get_disable_crashsite")
71    or remote.call("freeplay", "get_init_ran")
72  then
73    return
74  end
75
76  local ship_parts = remote.call("freeplay", "get_ship_parts")
77  for _, part in pairs(new_ship_parts) do
78    ship_parts[#ship_parts + 1] = part
79  end
80  remote.call("freeplay", "set_ship_parts", ship_parts)
81
82  -- If playing a treeless game, add wood to the spaceship
83  local nauvis = game.get_surface("nauvis")
84  if nauvis then
85    local tree_setting = nauvis.map_gen_settings.autoplace_controls.trees
86    if not tree_setting or tree_setting.size == 0 then
87      -- Add wood to the ship inventory
88      local items = remote.call("freeplay", "get_ship_items")
89      -- This is overkill for base K2, but should provide for plenty of margin of error
90      items["wood"] = 400
91      remote.call("freeplay", "set_ship_items", items)
92    end
93  end
94end
95
96local function set_custom_intro()
97  if not remote.interfaces.freeplay.set_custom_intro_message then
98    return
99  end
100  remote.call("freeplay", "set_custom_intro_message", { "message.kr-intro" })
101end
102
103local function disable_rocket_victory()
104  if remote.interfaces.silo_script then
105    remote.call("silo_script", "set_no_victory", true)
106  end
107end
108
109local function run()
110  if not remote.interfaces.freeplay then
111    return
112  end
113  add_starting_items()
114  add_to_crash_site()
115  set_custom_intro()
116  disable_rocket_victory()
117end
118
119--- @param entity_name EntityID
120--- @param value boolean
121local function set_minable(entity_name, value)
122  for _, entity in pairs(game.surfaces.nauvis.find_entities_filtered({ name = entity_name })) do
123    entity.minable = value
124    entity.destructible = value
125    if entity_name == "kr-spaceship-reactor" then
126      entity.operable = false
127    end
128  end
129end
130
131--- @param e EventData.on_research_finished
132local function on_research_finished(e)
133  for _, effect in pairs(e.research.prototype.effects) do
134    if effect.type ~= "unlock-recipe" then
135      goto continue
136    end
137
138    local recipe_name = effect.recipe
139    if recipe_name == "assembling-machine-1" then
140      set_minable("kr-spaceship-material-fabricator-1", true)
141      set_minable("kr-spaceship-material-fabricator-2", true)
142    elseif recipe_name == "lab" then
143      set_minable("kr-spaceship-research-computer", true)
144    elseif recipe_name == "steam-engine" then
145      set_minable("kr-spaceship-reactor", true)
146    end
147
148    ::continue::
149  end
150end
151
152local function on_player_created()
153  if not remote.interfaces.freeplay then
154    return
155  end
156  if storage.crash_site_init_ran then
157    return
158  end
159  storage.crash_site_init_ran = true
160
161  local recipes = game.forces.player.recipes
162  set_minable("kr-spaceship-material-fabricator-1", recipes["assembling-machine-1"].enabled)
163  set_minable("kr-spaceship-material-fabricator-2", recipes["assembling-machine-1"].enabled)
164  set_minable("kr-spaceship-research-computer", recipes["lab"].enabled)
165  set_minable("kr-spaceship-reactor", recipes["steam-engine"].enabled)
166end
167
168local freeplay = {}
169
170freeplay.on_init = run
171freeplay.on_configuration_changed = run
172
173freeplay.events = {
174  [defines.events.on_research_finished] = on_research_finished,
175  [defines.events.on_player_created] = on_player_created,
176}
177
178return freeplay