1
0
mirror of https://github.com/Refactorio/RedMew.git synced 2024-12-14 10:13:13 +02:00
RedMew/map_gen/presets/dino_island.lua
2018-11-06 13:09:21 +01:00

174 lines
4.9 KiB
Lua

local b = require 'map_gen.shared.builders'
local Event = require 'utils.event'
local Random = require 'map_gen.shared.random'
local degrees = require "utils.math".degrees
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
local random = Random.new(seed, seed * 2)
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