1
0
mirror of https://github.com/Refactorio/RedMew.git synced 2024-12-12 10:04:40 +02:00
RedMew/map_gen/maps/dino_island.lua
2024-10-26 11:30:22 +02:00

219 lines
6.8 KiB
Lua

local b = require 'map_gen.shared.builders'
local Event = require 'utils.event'
local Random = require 'map_gen.shared.random'
local table = require 'utils.table'
local RS = require 'map_gen.shared.redmew_surface'
local MGSP = require 'resources.map_gen_settings'
local RestrictEntities = require 'map_gen.shared.entity_placement_restriction'
local Popup = require 'features.gui.popup'
local config = storage.config
local degrees = require 'utils.math'.degrees
local groundhog_mode = false -- Toggle to enable groundhogs
local seed = 210
RS.set_map_gen_settings(
{
MGSP.ore_oil_none,
MGSP.cliff_none
}
)
local ScenarioInfo = require 'features.gui.info'
-- Comment out this block if you're getting scenario info from another source.
ScenarioInfo.set_map_name('RedMew - Prehistoric Islands')
ScenarioInfo.set_map_description('Burner tech only!')
ScenarioInfo.add_map_extra_info(
'OGG!\n OGG SMASH!\n OGG MAKE FIRE!\n(The tech for electric miners and inserters has been lost to the mists of time.) \n(You must rub sticks together, burn dinosaur guano and extract pit tar in order to launch your prehistoric rocket!)'
)
RestrictEntities.add_banned(
{
'inserter',
'long-handed-inserter',
'fast-inserter',
'bulk-inserter',
'electric-mining-drill'
}
)
-- config changes
config.hail_hydra.enabled = true
config.autodeconstruct.enabled = false
config.redmew_qol.loaders = false
Event.add(
defines.events.on_research_finished,
function(event)
local effects = event.research.prototype.effects
local f = game.forces.player
for _, e in pairs(effects) do
local t = e.type
if t == 'bulk-inserter-capacity-bonus' then
f.inserter_stack_size_bonus = f.inserter_stack_size_bonus + e.modifier
end
end
end
)
Event.add(
RestrictEntities.events.on_restricted_entity_destroyed,
function(event)
local p = event.player
if not p or not p.valid then
return
end
if not event.ghost then
Popup.player(p, [[
You don't know how to operate this item!
Advice: Only burner inserters and burner mining drills work in this prehistoric land
]], nil, nil, 'prehistoric_entity_warning')
end
end
)
-- Map
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 land_dino_count = 8
local ore_dino_start = 9
local dinos = {dino1, dino2, dino4, dino7, dino9, dino13, dino14, dino16}
if groundhog_mode then
local groundhog1 = b.picture(b.decompress(require 'map_gen.data.presets.groundhog1'))
local groundhog2 = b.picture(b.decompress(require 'map_gen.data.presets.groundhog2'))
local groundhog3 = b.picture(b.decompress(require 'map_gen.data.presets.groundhog3'))
local groundhog4 = b.picture(b.decompress(require 'map_gen.data.presets.groundhog4'))
local groundhog5 = b.picture(b.decompress(require 'map_gen.data.presets.groundhog5'))
table.add_all(dinos, {groundhog1, groundhog2, groundhog3, groundhog4, groundhog5})
land_dino_count = 13
ore_dino_start = 14
end
table.add_all(dinos, {dino17, dino18, dino19, dino20, dino21, dino22})
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(300, 0.425, 1.1), weight = 16},
{transform = non_transform, resource = 'copper-ore', value = value(250, 0.425, 1.1), weight = 10},
{transform = non_transform, resource = 'stone', value = value(150, 0.2, 1.05), weight = 6},
{transform = non_transform, resource = 'coal', value = value(250, 0.25, 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(50000, 50, 1.025), weight = 10},
{transform = empty_transform, weight = 65}
}
local total_ore_weights = {}
local ore_t = 0
for _, v in pairs(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)
local 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)
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