2018-07-14 14:23:24 +02:00
|
|
|
local b = require 'map_gen.shared.builders'
|
|
|
|
local Event = require 'utils.event'
|
2018-11-06 14:08:33 +02:00
|
|
|
local Random = require 'map_gen.shared.random'
|
|
|
|
local degrees = require "utils.math".degrees
|
2018-07-14 14:23:24 +02:00
|
|
|
|
|
|
|
local seed = 1000
|
|
|
|
|
|
|
|
Event.on_init(
|
|
|
|
function()
|
|
|
|
local rs = game.forces.player.recipes
|
|
|
|
|
|
|
|
rs['electric-mining-drill'].enabled = false
|
|
|
|
rs['inserter'].enabled = false
|
|
|
|
end
|
|
|
|
)
|
|
|
|
|
|
|
|
Event.add(
|
|
|
|
defines.events.on_research_finished,
|
|
|
|
function(event)
|
|
|
|
local effects = event.research.effects
|
|
|
|
local f = game.forces.player
|
|
|
|
local rs = f.recipes
|
|
|
|
|
|
|
|
for _, e in ipairs(effects) do
|
|
|
|
local t = e.type
|
|
|
|
if t == 'unlock-recipe' then
|
|
|
|
local rn = e.recipe
|
|
|
|
if rn:find('inserter') then
|
|
|
|
rs[rn].enabled = false
|
|
|
|
end
|
|
|
|
elseif t == 'stack-inserter-capacity-bonus' then
|
|
|
|
f.inserter_stack_size_bonus = f.inserter_stack_size_bonus + e.modifier
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
)
|
|
|
|
|
|
|
|
local dino1 = b.picture(require 'map_gen.data.presets.dino1')
|
|
|
|
local dino2 = b.picture(require 'map_gen.data.presets.dino2')
|
|
|
|
local dino4 = b.picture(require 'map_gen.data.presets.dino4')
|
|
|
|
local dino7 = b.picture(require 'map_gen.data.presets.dino7')
|
|
|
|
local dino9 = b.picture(require 'map_gen.data.presets.dino9')
|
|
|
|
local dino13 = b.picture(require 'map_gen.data.presets.dino13')
|
|
|
|
local dino14 = b.picture(require 'map_gen.data.presets.dino14')
|
|
|
|
local dino16 = b.picture(require 'map_gen.data.presets.dino16')
|
|
|
|
|
|
|
|
local dino17 = b.picture(require 'map_gen.data.presets.dino17')
|
|
|
|
local dino18 = b.picture(require 'map_gen.data.presets.dino18')
|
|
|
|
local dino19 = b.picture(require 'map_gen.data.presets.dino19')
|
|
|
|
local dino20 = b.picture(require 'map_gen.data.presets.dino20')
|
|
|
|
local dino21 = b.picture(require 'map_gen.data.presets.dino21')
|
|
|
|
local dino22 = b.picture(require 'map_gen.data.presets.dino22')
|
|
|
|
|
|
|
|
local dinos = {
|
|
|
|
dino1,
|
|
|
|
dino2,
|
|
|
|
dino4,
|
|
|
|
dino7,
|
|
|
|
dino9,
|
|
|
|
dino13,
|
|
|
|
dino14,
|
|
|
|
dino16,
|
|
|
|
dino17,
|
|
|
|
dino18,
|
|
|
|
dino19,
|
|
|
|
dino20,
|
|
|
|
dino21,
|
|
|
|
dino22
|
|
|
|
}
|
|
|
|
local land_dino_count = 8
|
|
|
|
local ore_dino_start = 9
|
|
|
|
local ore_dino_end = #dinos
|
|
|
|
|
2018-11-06 14:08:33 +02:00
|
|
|
local random = Random.new(seed, seed * 2)
|
2018-07-14 14:23:24 +02:00
|
|
|
|
|
|
|
local land_pattern = {}
|
|
|
|
for r = 1, 50 do
|
|
|
|
local row = {}
|
|
|
|
land_pattern[r] = row
|
|
|
|
for c = 1, 50 do
|
|
|
|
local x = random:next_int(-256, 256)
|
|
|
|
local y = random:next_int(-256, 256)
|
|
|
|
local d = random:next_int(0, 360)
|
|
|
|
local i = random:next_int(1, land_dino_count)
|
|
|
|
|
|
|
|
local shape = dinos[i]
|
|
|
|
shape = b.rotate(shape, degrees(d))
|
|
|
|
shape = b.translate(shape, x, y)
|
|
|
|
|
|
|
|
row[c] = shape
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
local function value(base, mult, pow)
|
|
|
|
return function(x, y)
|
|
|
|
local d = math.sqrt(x * x + y * y)
|
|
|
|
return base + mult * d ^ pow
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
local function non_transform(shape)
|
|
|
|
return b.scale(shape, 0.5)
|
|
|
|
end
|
|
|
|
|
|
|
|
local function uranium_transform(shape)
|
|
|
|
return b.scale(shape, 0.25)
|
|
|
|
end
|
|
|
|
|
|
|
|
local function oil_transform(shape)
|
|
|
|
shape = b.scale(shape, 0.25)
|
|
|
|
return b.throttle_world_xy(shape, 1, 4, 1, 4)
|
|
|
|
end
|
|
|
|
|
|
|
|
local function empty_transform()
|
|
|
|
return b.empty_shape
|
|
|
|
end
|
|
|
|
|
|
|
|
local ores = {
|
|
|
|
{transform = non_transform, resource = 'iron-ore', value = value(500, 0.75, 1.1), weight = 16},
|
|
|
|
{transform = non_transform, resource = 'copper-ore', value = value(400, 0.75, 1.1), weight = 10},
|
|
|
|
{transform = non_transform, resource = 'stone', value = value(250, 0.3, 1.05), weight = 6},
|
|
|
|
{transform = non_transform, resource = 'coal', value = value(400, 0.8, 1.075), weight = 16},
|
|
|
|
{transform = uranium_transform, resource = 'uranium-ore', value = value(200, 0.3, 1.025), weight = 3},
|
|
|
|
{transform = oil_transform, resource = 'crude-oil', value = value(100000, 50, 1.025), weight = 10},
|
|
|
|
{transform = empty_transform, weight = 10}
|
|
|
|
}
|
|
|
|
|
|
|
|
local total_ore_weights = {}
|
|
|
|
local ore_t = 0
|
|
|
|
for _, v in ipairs(ores) do
|
|
|
|
ore_t = ore_t + v.weight
|
|
|
|
table.insert(total_ore_weights, ore_t)
|
|
|
|
end
|
|
|
|
|
|
|
|
local ore_pattern = {}
|
|
|
|
|
|
|
|
for r = 1, 50 do
|
|
|
|
local row = {}
|
|
|
|
ore_pattern[r] = row
|
|
|
|
for c = 1, 50 do
|
|
|
|
local x = random:next_int(-32, 32)
|
|
|
|
local y = random:next_int(-32, 32)
|
|
|
|
local d = random:next_int(0, 360)
|
|
|
|
local i = random:next_int(ore_dino_start, ore_dino_end)
|
|
|
|
local shape = dinos[i]
|
|
|
|
|
|
|
|
local ore_data
|
|
|
|
i = random:next_int(1, ore_t)
|
|
|
|
index = table.binary_search(total_ore_weights, i)
|
|
|
|
if (index < 0) then
|
|
|
|
index = bit32.bnot(index)
|
|
|
|
end
|
|
|
|
ore_data = ores[index]
|
|
|
|
|
|
|
|
shape = ore_data.transform(shape)
|
|
|
|
shape = b.rotate(shape, degrees(d))
|
|
|
|
shape = b.translate(shape, x, y)
|
|
|
|
local ore = b.resource(shape, ore_data.resource, ore_data.value)
|
|
|
|
|
|
|
|
row[c] = ore
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
local map = b.grid_pattern_full_overlap(land_pattern, 50, 50, 640, 640)
|
|
|
|
map = b.change_tile(map, false, 'deepwater')
|
|
|
|
map = b.fish(map, 0.0025)
|
|
|
|
|
|
|
|
local ores = b.grid_pattern_full_overlap(ore_pattern, 50, 50, 128, 128)
|
|
|
|
map = b.apply_entity(map, ores)
|
|
|
|
|
|
|
|
map = b.translate(map, -50, -160)
|
|
|
|
|
|
|
|
return map
|