z_mirror/Krastorio2

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

Caleb HeuerAdd protections to crash site entities to prevent soft-locking5f478042

santichu95/patch-1
4.5 KiB175 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 = "crash-site-generator",
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 = "crash-site-lab",
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 = "crash-site-assembling-machine-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 = "crash-site-assembling-machine-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  end
126end
127
128--- @param e EventData.on_research_finished
129local function on_research_finished(e)
130  for _, effect in pairs(e.research.prototype.effects) do
131    if effect.type ~= "unlock-recipe" then
132      goto continue
133    end
134
135    local recipe_name = effect.recipe
136    if recipe_name == "assembling-machine-1" then
137      set_minable("crash-site-assembling-machine-1", true)
138      set_minable("crash-site-assembling-machine-2", true)
139    elseif recipe_name == "lab" then
140      set_minable("crash-site-lab", true)
141    elseif recipe_name == "steam-engine" then
142      set_minable("crash-site-generator", true)
143    end
144
145    ::continue::
146  end
147end
148
149local function on_player_created()
150  if not remote.interfaces.freeplay then
151    return
152  end
153  if storage.crash_site_init_ran then
154    return
155  end
156  storage.crash_site_init_ran = true
157
158  local recipes = game.forces.player.recipes
159  set_minable("crash-site-assembling-machine-1", recipes["assembling-machine-1"].enabled)
160  set_minable("crash-site-assembling-machine-2", recipes["assembling-machine-1"].enabled)
161  set_minable("crash-site-lab", recipes["lab"].enabled)
162  set_minable("crash-site-generator", recipes["steam-engine"].enabled)
163end
164
165local freeplay = {}
166
167freeplay.on_init = run
168freeplay.on_configuration_changed = run
169
170freeplay.events = {
171  [defines.events.on_research_finished] = on_research_finished,
172  [defines.events.on_player_created] = on_player_created,
173}
174
175return freeplay