z_mirror/Krastorio2

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

Caleb HeuerChange to four-space indentation07409ca6

four-space-indentation
5.1 KiB179 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
168--- @class FreeplayHandler : event_handler
169local freeplay = {}
170
171freeplay.on_init = run
172freeplay.on_configuration_changed = run
173
174freeplay.events = {
175    [defines.events.on_research_finished] = on_research_finished,
176    [defines.events.on_player_created] = on_player_created,
177}
178
179return freeplay