313 lines
15 KiB
Lua
313 lines
15 KiB
Lua
--- Quickstart script.
|
|
-- Creates a quickstart world for testing mods.
|
|
-- <p>config settings should be a created in a table retured from `config-quickstart.lua`
|
|
-- @script quickstart
|
|
-- @usage
|
|
-- -- For use with STDLIB Events
|
|
-- if DEBUG then
|
|
-- require('stdlib/utils/scripts/quickstart').register_events()
|
|
-- end
|
|
-- @usage
|
|
-- --If not using stdlibs event system
|
|
-- local quickstart = require('stdlib/utils/scripts/quickstart')
|
|
-- script.on_event(defines.events.on_player_created, function()
|
|
-- quickstart.on_player_created() -- can be wrapped in an if DEBUG type check
|
|
-- end)
|
|
|
|
local Event = require('stdlib/event/event')
|
|
local Area = require('stdlib/area/area')
|
|
|
|
if not remote.interfaces['quickstart-script'] then
|
|
local qs_interface = {}
|
|
qs_interface.registered_to = function()
|
|
if game then
|
|
game.print(script.mod_name)
|
|
end
|
|
return script.mod_name
|
|
end
|
|
qs_interface.creative_mode_quickstart_registerd_to = qs_interface.registered_to
|
|
remote.add_interface('quickstart-script', qs_interface)
|
|
else
|
|
-- quickstart-script has already been registered, lets not clobber things
|
|
return
|
|
end
|
|
|
|
local QS = require('stdlib/config/config').new(prequire('config-quickstart') or {})
|
|
local quickstart = {}
|
|
|
|
function quickstart.on_player_created(event)
|
|
if #game.players == 1 and event.player_index == 1 then
|
|
local player = game.players[event.player_index]
|
|
local surface = player.surface
|
|
local force = player.force
|
|
|
|
local area = Area(QS.get('area_box', {{-100, -100}, {100, 100}})):shrink_to_surface_size(surface)
|
|
|
|
player.force.chart(surface, area)
|
|
|
|
player.surface.always_day = QS.get('always_day', false)
|
|
|
|
if QS.get('cheat_mode', false) then
|
|
player.cheat_mode = true
|
|
player.force.research_all_technologies()
|
|
if player.character then
|
|
player.character_running_speed_modifier = 2
|
|
player.character_reach_distance_bonus = 100
|
|
player.character_build_distance_bonus = 100
|
|
end
|
|
end
|
|
|
|
if QS.get('clear_items', false) then
|
|
player.clear_items_inside()
|
|
end
|
|
|
|
local simple_stacks = QS.get('stacks', {})
|
|
local qb_stacks = QS.get('quickbar', {})
|
|
local inv = player.get_main_inventory()
|
|
local qb = player.get_quickbar()
|
|
|
|
if inv then
|
|
for _, item in pairs(simple_stacks) do
|
|
if game.item_prototypes[item] then
|
|
inv.insert(item)
|
|
end
|
|
end
|
|
for _, item in pairs(qb_stacks) do
|
|
if game.item_prototypes[item] then
|
|
qb.insert(item)
|
|
end
|
|
end
|
|
end
|
|
|
|
local tool_inv = player.get_inventory(defines.inventory.player_tools)
|
|
if tool_inv then
|
|
local tool = QS.get('tool', 'steel-axe')
|
|
if not game.item_prototypes[tool] then
|
|
tool = 'steel-axe'
|
|
if not game.item_prototypes[tool] then
|
|
tool = nil
|
|
end
|
|
end
|
|
if tool then
|
|
tool_inv.insert(tool)
|
|
end
|
|
end
|
|
|
|
local power_armor = QS.get('power_armor', 'fake')
|
|
if player.character and game.item_prototypes[power_armor] then
|
|
--Put on power armor, install equipment
|
|
player.get_inventory(defines.inventory.player_armor).insert(power_armor)
|
|
local grid = player.character.grid
|
|
if grid then
|
|
for _, eq in pairs(QS.get('equipment', {'fusion-reactor-equipment'})) do
|
|
if game.equipment_prototypes[eq] then
|
|
grid.put {name = eq}
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
if remote.interfaces['RSO'] then
|
|
if QS.get('disable_rso_starting', false) and remote.interfaces['RSO']['disableStartingArea'] then
|
|
remote.call('RSO', 'disableStartingArea')
|
|
end
|
|
if QS.get('disable_rso_chunk', false) and remote.interfaces['RSO']['disableChunkHandler'] then
|
|
remote.call('RSO', 'disableChunkHandler')
|
|
end
|
|
end
|
|
|
|
if QS.get('destroy_everything', false) then
|
|
for _, entity in pairs(surface.find_entities(area)) do
|
|
-- destroying cliffs can invalidate other cliffs so .valid is needed here
|
|
if entity.valid and entity.name ~= 'player' then
|
|
entity.destroy()
|
|
end
|
|
end
|
|
end
|
|
|
|
if QS.get('floor_tile', false) then
|
|
local tiles = {}
|
|
local floor_tile = QS.get('floor_tile')
|
|
local floor_tile_alt = QS.get('floor_tile_alt', floor_tile)
|
|
for x, y in Area.spiral_iterate(area) do
|
|
if y % 2 == 0 then
|
|
if x % 2 == 0 then
|
|
tiles[#tiles + 1] = {name = floor_tile, position = {x = x, y = y}}
|
|
else
|
|
tiles[#tiles + 1] = {name = floor_tile_alt, position = {x = x, y = y}}
|
|
end
|
|
else
|
|
if x % 2 ~= 0 then
|
|
tiles[#tiles + 1] = {name = floor_tile, position = {x = x, y = y}}
|
|
else
|
|
tiles[#tiles + 1] = {name = floor_tile_alt, position = {x = x, y = y}}
|
|
end
|
|
end
|
|
end
|
|
surface.set_tiles(tiles, true)
|
|
surface.destroy_decoratives(area)
|
|
end
|
|
|
|
if QS.get('ore_patches', true) then
|
|
--Top left
|
|
for x, y in Area.iterate({{-37.5, -27.5}, {-33.5, -3.5}}) do
|
|
surface.create_entity {name = 'coal', position = {x, y}, amount = 2500}
|
|
end
|
|
--Top Right
|
|
for x, y in Area.iterate({{33.5, -27.5}, {37.5, -3.5}}) do
|
|
surface.create_entity {name = 'iron-ore', position = {x, y}, amount = 2500}
|
|
end
|
|
--Bottom Right
|
|
for x, y in Area.iterate({{33.5, 3.5}, {37.5, 27.5}}) do
|
|
surface.create_entity {name = 'copper-ore', position = {x, y}, amount = 2500}
|
|
end
|
|
--Bottom Left
|
|
for x, y in Area.iterate({{-37.5, 3.5}, {-33.5, 27.5}}) do
|
|
surface.create_entity {name = 'stone', position = {x, y}, amount = 2500}
|
|
end
|
|
surface.create_entity {name = 'crude-oil', position = {-35.5, 1.5}, amount = 32000}
|
|
surface.create_entity {name = 'crude-oil', position = {-35.5, -1.5}, amount = 32000}
|
|
surface.create_entity {name = 'crude-oil', position = {35.5, 1.5}, amount = 32000}
|
|
surface.create_entity {name = 'crude-oil', position = {35.5, -1.5}, amount = 32000}
|
|
|
|
local water_tiles = {}
|
|
for x = 27.5, -27.5, -1 do
|
|
for y = 45.5, 50.5, 1 do
|
|
if x < -4 or x > 4 then
|
|
water_tiles[#water_tiles + 1] = {
|
|
name = 'water',
|
|
position = {x = x, y = y}
|
|
}
|
|
end
|
|
end
|
|
end
|
|
surface.set_tiles(water_tiles, false)
|
|
surface.create_entity {name = 'offshore-pump', position = {4.5, 44.5}, force = force, direction = defines.direction.south}
|
|
surface.create_entity {name = 'offshore-pump', position = {-4.5, 44.5}, force = force, direction = defines.direction.south}
|
|
surface.create_entity {name = 'offshore-pump', position = {27.5, 44.5}, force = force, direction = defines.direction.south}
|
|
surface.create_entity {name = 'offshore-pump', position = {-27.5, 44.5}, force = force, direction = defines.direction.south}
|
|
end
|
|
|
|
if QS.get('chunk_bounds', false) then
|
|
if game.entity_prototypes['debug-chunk-marker'] then
|
|
local a = surface.create_entity {name = 'debug-chunk-marker', position = {0, 0}}
|
|
a.graphics_variation = 1
|
|
for i = 1, 31, 2 do
|
|
a = surface.create_entity {name = 'debug-chunk-marker', position = {i, 0}}
|
|
a.graphics_variation = 2
|
|
a = surface.create_entity {name = 'debug-chunk-marker', position = {-i, 0}}
|
|
a.graphics_variation = 2
|
|
a = surface.create_entity {name = 'debug-chunk-marker', position = {0, i}}
|
|
a.graphics_variation = 3
|
|
a = surface.create_entity {name = 'debug-chunk-marker', position = {0, -i}}
|
|
a.graphics_variation = 3
|
|
end
|
|
end
|
|
local tiles = {}
|
|
for i = .5, 32.5, 1 do
|
|
tiles[#tiles + 1] = {name = 'hazard-concrete-left', position = {i, 32.5}}
|
|
tiles[#tiles + 1] = {name = 'hazard-concrete-right', position = {-i, 32.5}}
|
|
tiles[#tiles + 1] = {name = 'hazard-concrete-left', position = {i, -32.5}}
|
|
tiles[#tiles + 1] = {name = 'hazard-concrete-right', position = {-i, -32.5}}
|
|
|
|
tiles[#tiles + 1] = {name = 'hazard-concrete-left', position = {32.5, i}}
|
|
tiles[#tiles + 1] = {name = 'hazard-concrete-left', position = {32.5, -i}}
|
|
tiles[#tiles + 1] = {name = 'hazard-concrete-right', position = {-32.5, i}}
|
|
tiles[#tiles + 1] = {name = 'hazard-concrete-right', position = {-32.5, -i}}
|
|
end
|
|
surface.set_tiles(tiles)
|
|
end
|
|
|
|
if QS.get('starter_tracks', false) then
|
|
-- Create proxy blueprint from string, read in the entities and remove it.
|
|
local bp = surface.create_entity {name = 'item-on-ground', position = {0, 0}, force = force, stack = 'blueprint'}
|
|
bp.stack.import_stack(quickstart.trackstring)
|
|
local tracks = bp.stack.get_blueprint_entities()
|
|
bp.destroy()
|
|
|
|
for _, track in pairs(tracks) do
|
|
local pos = {track.position.x + 1, track.position.y + 1}
|
|
local ent = surface.create_entity {name = track.name, position = pos, direction = track.direction, force = force}
|
|
if ent.name == 'train-stop' then
|
|
if ent.position.x > 0 and ent.position.y > 0 then
|
|
ent.backer_name = '#SOUTH'
|
|
elseif ent.position.x < 0 and ent.position.y > 0 then
|
|
ent.backer_name = '#WEST'
|
|
elseif ent.position.x > 0 and ent.position.y < 0 then
|
|
ent.backer_name = '#EAST'
|
|
else
|
|
ent.backer_name = '#NORTH'
|
|
end
|
|
end
|
|
end
|
|
|
|
if QS.get('make_train', false) then
|
|
local loco = surface.create_entity {name = 'locomotive', position = {20, 39}, orientation = 0.25, direction = 2, force = force}
|
|
loco.orientation = .25
|
|
--Setting the burner this way rather than using insert allows us to not inflate the production statistics
|
|
loco.burner.currently_burning = 'rocket-fuel'
|
|
loco.burner.remaining_burning_fuel = 222222222
|
|
local cwag = surface.create_entity {name = 'cargo-wagon', position = {13, 39}, orientation = 0.25, direction = 2, force = force}
|
|
cwag.orientation = .25
|
|
local fwag = surface.create_entity {name = 'fluid-wagon', position = {7, 39}, orientation = 0.25, direction = 2, force = force}
|
|
fwag.orientation = .25
|
|
local awag = surface.create_entity {name = 'artillery-wagon', position = {0, 39}, orientation = 0.25, direction = 2, force = force}
|
|
awag.orientation = .25
|
|
|
|
local train = loco and loco.train
|
|
if train then
|
|
local records = {}
|
|
for _, name in pairs({'#SOUTH', '#EAST', '#NORTH', '#WEST'}) do
|
|
records[#records + 1] = {station = name, wait_conditions = {{type = 'time', ticks = 0, compare_type = 'and'}}}
|
|
end
|
|
records[1].wait_conditions = {{type = 'full', compare_type = 'and'}}
|
|
train.schedule = {current = 1, records = records}
|
|
train.manual_mode = false
|
|
end
|
|
end
|
|
end
|
|
|
|
if QS.get('setup_power', false) then
|
|
if game.entity_prototypes['debug-energy-interface'] then
|
|
local es = surface.create_entity {name = 'debug-energy-interface', position = {0, 0}, force = force}
|
|
es.destructible = false
|
|
script.raise_event(defines.events.on_built_entity, {created_entity = es, player_index = player.index})
|
|
end
|
|
if game.entity_prototypes['debug-substation'] then
|
|
local sb = surface.create_entity {name = 'debug-substation', position = {0, 0}, force = force}
|
|
sb.destructible = false
|
|
script.raise_event(defines.events.on_built_entity, {created_entity = sb, player_index = player.index})
|
|
end
|
|
end
|
|
|
|
if QS.get('setup_creative_mode', false) and game.active_mods['creative-mode'] then
|
|
local radar = surface.create_entity {name = 'creative-mode_super-radar', position = {3.5, -34.5}, force = force}
|
|
script.raise_event(defines.events.on_built_entity, {created_entity = radar, player_index = player.index})
|
|
local rb = surface.create_entity {name = 'creative-mode_super-roboport', position = {-4, -35}, force = force}
|
|
script.raise_event(defines.events.on_built_entity, {created_entity = rb, player_index = player.index})
|
|
end
|
|
end
|
|
end
|
|
Event.register(defines.events.on_player_created, quickstart.on_player_created)
|
|
|
|
quickstart.trackstring =
|
|
[[
|
|
0eNqdmt1u2kAUhF+l2muIvLveP677BL2tqgoSK7VEDAITNYry7rUDRYWMy0zuAOHPZ33m7O7Z8atZrQ/Ndtd2vVm8mvZ+0+3N4vur2beP3XI9/ta/bBuzMG3fP
|
|
JmZ6ZZP47fdsl2bt5lpu4fmt1nYtx8z03R927fN8fr3Ly8/u8PTqtkNf7i4cn6iz8x2sx+u2XTjjQbO3KW7MDMvw6fa3oXhBg/trrk//sO9zT5w3ZnbD+Buvu8
|
|
3W4SNJ6i7REaA9Gfk/WH33DzM38f6ken9kenLbWZ9Zu7HOB9/9VNUl0+RVrcHH3hq5KmRp9Y8NfFUx1MzT614aqGpVsiWrXiskC5reayQL+t4rJAw63mskDHLF
|
|
5iSMb7AlITxBabkSygwgUoXmJIsur6ESB1dXcJDdXRtCfl3dGUJUnV0XSll5eiyUuYAR5eVMmE5uqyU2dXRZaUsBY4uK2XZcnxdCdnydGEp2wFPV5aydfGO27u
|
|
Nd0dbN4+Y/IrlT6H6eIlNCEuXlq8x1SJqYDev5QT1BDSSTzWdmYjCL1D1SfQuQxBdPD7/l1O4nsSXvy3J2JxcPq4a7fUrfaARBVhbeaCYwzVJN4Lx+qhqCKrlU
|
|
WFO0ANyEBTlgDDnEwKvIEgXOOYUOSALKyVUakATHKsHBMUYnBwQ5uiitlCMQRb1BEcXtYViDLKoJzi6qC0UY5BFPcHRRQ21GGVNY4wuaajEKCsaY3RBQx1GWc8
|
|
Y84k5GnL0KRpiZDFDCUZVypgiCxmOKak6xhRZxjDfSVUxpsgihrWQVA1jiixhOE8kVcGYIgsYT6JJVfAERpYwXmSyquEJjCxivAhnVcUTGFnGeJOSVR1PYGQh4
|
|
01cVpU8gZGljDe5WZXyBEafjaEGizwdY4zlfK36eJAzdEg329Li5BFCWRevjhBjatIRHH3AIycM3TciycLGHW5RhT2BSdoRjLdE7rJ0AnONDAhZ1GMtX9+m2qr
|
|
S3FOfbh+V2cpKx3rXTGzGOfH87Xr4HlK9avT6zARbq04vhw2q1ctho+r1ctikmr0cNqtuL4ctqttLYRUTWUiZYiILKVNMZCFlgoksZEzwkJWEBdHt5ahRdHs5a
|
|
tLcXg6aNbeXgxbN7aWgvIUs5J+3kAWp8hayUlaChyykSvCQlVwF0e3lqFF0ezlqEt1ejppFt5ejFtHtpaiChyxky3NN0ilQ7u0kx3UlYy9yDLRcW4JxfBXy/WX
|
|
JxT/vVs7Merlq1sNvX5vV4fHLt4G+H359bnb742U52VKnmOqhIfwDr9+U4w==
|
|
]]
|
|
|
|
function quickstart.register_events()
|
|
Event.register(defines.events.on_player_created, quickstart.on_player_created)
|
|
return quickstart
|
|
end
|
|
return quickstart
|