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