openclonk/planet/Worlds.ocf/RapidRefining.ocs/Map.c

250 lines
11 KiB
C

/**
Rapid Refining
Use the oil from an underground well to power your settlement.
@author Maikel
*/
#include Library_Map
// Called be the engine: draw the complete map here.
protected func InitializeMap(proplist map)
{
// Map settings.
var overground_wdt = 40;
var overground_hgt = 20;
// Retrieve the settings according to the MapSize setting.
var map_size;
if (SCENPAR_MapSize == 1)
map_size = [250, 150];
if (SCENPAR_MapSize == 2)
map_size = [275, 150];
if (SCENPAR_MapSize == 3)
map_size = [300, 150];
// Set the map size.
map->Resize(map_size[0], map_size[1]);
// The overground area is in the top left corner, the underground are thereby the remainder.
var underground = {Algo = MAPALGO_Not, Op = {Algo = MAPALGO_Rect, X = 0, Y = 0, Wdt = overground_wdt, Hgt = overground_hgt}};
Draw("Earth", underground);
// Draw materials in the underground area and then overlay the rest of the map.
DrawMaterial("Earth-earth_root", underground, 2, 12);
DrawMaterial("Earth-earth_spongy", underground, 2, 12);
DrawMaterial("Granite", underground, 3, 6);
DrawMaterial("Tunnel", underground, 5, 8);
DrawMaterial("Rock-rock", underground, 3, 4);
DrawMaterial("Rock", underground, 3, 4);
DrawMaterial("Ore", underground, 6, 6);
DrawMaterial("Firestone", underground, 5, 4);
DrawMaterial("Coal", underground, 6, 4);
// Draw some underground water lakes.
var underground_water = {Algo = MAPALGO_And, Op = [underground, {Algo = MAPALGO_Rect, X = 0, Y = map.Hgt / 2, Wdt = map.Wdt - 20, Hgt = map.Hgt / 2}]};
DrawMaterial("Water", underground_water, [4, 10], 6);
// The entrance border is out of granite.
var entrance_border = {Algo = MAPALGO_Border, Left = 3, Op = underground};
entrance_border = {Algo = MAPALGO_Or, Op = [entrance_border, {Algo = MAPALGO_Turbulence, Iterations = 2, Amplitude = [6, 8], Scale = [6, 8], Seed = Random(65536), Op = entrance_border}]};
DrawRock(entrance_border);
// The entrance floor is out of earth and brick.
var entrance_floor = {Algo = MAPALGO_Border, Top = 3, Op = underground};
Draw("Brick", entrance_floor);
var entrance_floor_earth = {Algo = MAPALGO_Border, Top = 2, Op = underground};
var entrance_floor_earth = {Algo = MAPALGO_And, Op = [entrance_floor_earth, {Algo = MAPALGO_Rect, X = 4, Y = 0, Wdt = 17, Hgt = map.Hgt}]};
Draw("Earth", entrance_floor_earth);
// There are borders on the full underground area of the map.
var wdt = 3;
var underground_border = {Algo = MAPALGO_Not, Op = {Algo = MAPALGO_Rect, X = wdt, Y = wdt, Wdt = map.Wdt - 2 * wdt, Hgt = map.Hgt - 2 * wdt}};
underground_border = {Algo = MAPALGO_And, Op = [underground_border, underground]};
underground_border = {Algo = MAPALGO_Or, Op = [underground_border, {Algo = MAPALGO_Turbulence, Iterations = 6, Amplitude = 12, Scale = 16, Seed = Random(65536), Op = underground_border}]};
underground_border = {Algo = MAPALGO_And, Op = [underground_border, underground, {Algo = MAPALGO_Not, Op = entrance_floor}]};
DrawRock(underground_border);
// Draw a tunnel to the oil well.
DrawMainTunnel(map, overground_wdt, overground_hgt);
// Some slabs of granite/rock which block the path to the oil.
DrawRockSlabs(map);
// There is a smaller oil field below the entrance.
DrawOilLakes(map);
// The main oil well is in the bottom right of the map.
DrawOilWell(map, underground_border);
// A large water lake at the bottom of the map.
DrawWaterLake(map, underground_border);
// Some liquid veins above the oil well.
DrawLiquidVeins(map, underground_border);
// Fix liquid borders.
FixLiquidBorders();
// Return true to tell the engine a map has been successfully created.
return true;
}
public func DrawMainTunnel(proplist map, int overground_wdt, int overground_hgt)
{
var sx = overground_wdt;
var sy = overground_hgt - 3;
var ex = map.Wdt - 20;
var ey = map.Hgt - 30;
var nr_steps = 10;
var tunnel_x = [], tunnel_y = [];
for (var index = 0; index <= nr_steps; index++)
{
var dev = 4 * Min(index, nr_steps - index);
tunnel_x[index] = sx + (ex - sx) * index / nr_steps + RandomX(-dev, dev);
tunnel_y[index] = sy + (ey - sy) * index / nr_steps + RandomX(-dev, dev);
}
// Draw main tunnel.
var tunnel = {Algo = MAPALGO_Polygon, X = tunnel_x, Y = tunnel_y, Wdt = 3, Empty = true, Open = true};
tunnel = {Algo = MAPALGO_Or, Op = [tunnel, {Algo = MAPALGO_Turbulence, Iterations = 2, Amplitude = [6, 8], Scale = [6, 8], Seed = Random(65536), Op = tunnel}]};
Draw("Tunnel", tunnel);
// Draw branches.
for (var index = 2; index <= nr_steps - 2; index++)
{
var x = tunnel_x[index];
var y = tunnel_y[index];
var to_x = x + RandomX(-5, 5);
var to_y = y + (2 * Random(2) - 1) * RandomX(16, 22);
var tunnel_branch = {Algo = MAPALGO_Polygon, X = [x, to_x], Y = [y, to_y], Wdt = 2, Empty = true, Open = true};
tunnel_branch = {Algo = MAPALGO_Turbulence, Iterations = 4, Amplitude = 12, Scale = 8, Seed = Random(65536), Op = tunnel_branch};
Draw("Tunnel", tunnel_branch);
}
return;
}
public func DrawRockSlabs(proplist map)
{
var slabs = {Algo = MAPALGO_Lines, X = 6, Y = 1, Distance = 32};
slabs = {Algo = MAPALGO_And, Op = [slabs, {Algo = MAPALGO_RndChecker, Ratio = 75, Seed = Random(65536)}]};
slabs = {Algo = MAPALGO_Turbulence, Iterations = 2, Amplitude = [6, 8], Scale = [6, 8], Seed = Random(65536), Op = slabs};
slabs = {Algo = MAPALGO_And, Op = [slabs, {Algo = MAPALGO_Rect, X = map.Wdt / 3, Y = 0, Wdt = 2 * map.Wdt / 3, Hgt = map.Hgt}]};
DrawRock(slabs);
return;
}
public func DrawWaterLake(proplist map, proplist underground_border)
{
var lake_height = 20;
var lake_width = 80;
var waterfall_height = 62;
var tunnel_height = 6;
// Draw a large lake with tunnel above.
underground_border = {Algo = MAPALGO_And, Op = [underground_border, {Algo = MAPALGO_Not, Op = {Algo = MAPALGO_Rect, X = 0, Y = map.Hgt - lake_height - 2, Wdt = lake_width, Hgt = 6}}]};
var lake_floor_rock = {Algo = MAPALGO_And, Op = [{Algo = MAPALGO_Lines, X = 3, Y = 0, Distance = 10}, {Algo = MAPALGO_Rect, X = 0, Y = map.Hgt - 7, Wdt = lake_width, Hgt = 7}]};
var lake_floor_rock = {Algo = MAPALGO_Turbulence, Iterations = 4, Amplitude = 16, Scale = 8, Seed = Random(65536), Op = lake_floor_rock};
underground_border = {Algo = MAPALGO_Or, Op = [underground_border, lake_floor_rock]};
DrawRock(lake_floor_rock);
var tunnel = {Algo = MAPALGO_Rect, X = 0, Y = map.Hgt - lake_height - tunnel_height, Wdt = lake_width, Hgt = tunnel_height};
tunnel = {Algo = MAPALGO_Or, Op = [tunnel, {Algo = MAPALGO_Turbulence, Iterations = 4, Amplitude = 16, Scale = 8, Seed = Random(65536), Op = tunnel}]};
tunnel = {Algo = MAPALGO_And, Op = [tunnel, {Algo = MAPALGO_Not, Op = underground_border}]};
Draw("Tunnel", tunnel);
var lake = {Algo = MAPALGO_Rect, X = 0, Y = map.Hgt - lake_height, Wdt = lake_width, Hgt = lake_height};
lake = {Algo = MAPALGO_And, Op = [lake, {Algo = MAPALGO_Not, Op = underground_border}]};
Draw("Water:Water", lake);
var lake_floor = {Algo = MAPALGO_Border, Bottom = 2, Op = lake};
Draw("Sand", lake_floor);
var lake_boundary = {Algo = MAPALGO_Rect, X = lake_width - 1, Y = map.Hgt - lake_height, Wdt = 2, Hgt = lake_height};
lake_boundary = {Algo = MAPALGO_Or, Op = [lake_boundary, {Algo = MAPALGO_Turbulence, Iterations = 3, Amplitude = 12, Scale = 12, Seed = Random(65536), Op = lake_boundary}]};
Draw("Everrock", lake_boundary);
var lake_boundary_rock = {Algo = MAPALGO_Border, Wdt = -2, Op = lake_boundary};
DrawRock(lake_boundary_rock);
// Draw a waterfall pooring into the lake.
var waterfall = {Algo = MAPALGO_Rect, X = 3, Y = map.Hgt - lake_height - waterfall_height, Wdt = 9, Hgt = waterfall_height};
waterfall = {Algo = MAPALGO_Or, Op = [waterfall, {Algo = MAPALGO_Turbulence, Iterations = 3, Amplitude = 12, Scale = 12, Seed = Random(65536), Op = waterfall}]};
waterfall = {Algo = MAPALGO_And, Op = [waterfall, {Algo = MAPALGO_Not, Op = underground_border}, {Algo = MAPALGO_Not, Op = lake}]};
Draw("Tunnel", waterfall);
return;
}
public func DrawOilLakes(proplist map)
{
for (var cnt = 0; cnt < 3; cnt++)
{
var oil_lake_x = RandomX(map.Wdt / 10, 3 * map.Wdt / 10);
var oil_lake_y = RandomX(2 * map.Hgt / 7, 5 * map.Hgt / 7);
var oil_lake = {Algo = MAPALGO_Rect, X = oil_lake_x, Y = oil_lake_y, Wdt = 13, Hgt = 15};
oil_lake = {Algo = MAPALGO_Turbulence, Iterations = 4, Amplitude = 10, Scale = 10, Seed = Random(65536), Op = oil_lake};
var oil_lake_filled = {Algo = MAPALGO_And, Op = [oil_lake, {Algo = MAPALGO_Rect, X = 0, Y = oil_lake_y - 3, Wdt = map.Wdt, Hgt = map.Hgt}]};
Draw("Tunnel", oil_lake);
Draw("Oil", oil_lake_filled);
var oil_lake_border = {Algo = MAPALGO_Border, Left = 2, Right = 2, Bottom = 3, Top = 1, Op = oil_lake};
DrawRock(oil_lake_border);
}
return;
}
public func DrawOilWell(proplist map, proplist underground_border)
{
var oil_field = {Algo = MAPALGO_Polygon,
X = [map.Wdt, map.Wdt - 16, map.Wdt - 14, map.Wdt - 10, map.Wdt - 17, map.Wdt - 22, map.Wdt - 22, map.Wdt - 27, map.Wdt - 29],
Y = [map.Hgt - 5, map.Hgt - 5, map.Hgt - 12, map.Hgt - 18, map.Hgt - 23, map.Hgt - 20, map.Hgt - 12, map.Hgt - 12, map.Hgt - 16],
Wdt = 3, Empty = true, Open = true};
var oil_field_oil = {Algo = MAPALGO_And, Op = [oil_field, {Algo = MAPALGO_Rect, X = 0, Y = map.Hgt - 8, Wdt = map.Wdt, Hgt = 8}]};
var oil_field_water = {Algo = MAPALGO_And, Op = [oil_field, {Algo = MAPALGO_Rect, X = 0, Y = 0, Wdt = map.Wdt, Hgt = map.Hgt - 8}]};
Draw("Oil:Oil", oil_field_oil);
Draw("Water", oil_field_water);
var oil_field_border = {Algo = MAPALGO_Border, Left = -3, Right = -3, Top = -3, Bottom = -5, Op = oil_field};
Draw("Everrock", oil_field_border);
var oil_field_entrance = {Algo = MAPALGO_Rect, X = map.Wdt - 31, Y = map.Hgt - 22, Wdt = 5, Hgt = 5};
Draw("Tunnel", oil_field_entrance);
return;
}
public func DrawLiquidVeins(proplist map, proplist underground_border)
{
// Draw some gold as a source of wealth.
var gold = {Algo = MAPALGO_Rect, X = map.Wdt - 60, Y = 10, Wdt = 50, Hgt = 36};
gold = {Algo = MAPALGO_And, Op = [gold, {Algo = MAPALGO_Turbulence, Iterations = 4, Amplitude = 12, Scale = 12, Seed = Random(65536), Op = gold}]};
DrawMaterial("Gold", gold, 4, 30);
// Draw the veins.
var vein_material = "Water";
if (SCENPAR_Difficulty == 2)
vein_material = "Acid";
if (SCENPAR_Difficulty == 3)
vein_material = "DuroLava";
var vein_area = {Algo = MAPALGO_Polygon, X = [map.Wdt - 96, map.Wdt, map.Wdt, map.Wdt - 44], Y = [0, 0, 108, 82]};
vein_area = {Algo = MAPALGO_And, Op = [vein_area, {Algo = MAPALGO_Not, Op = underground_border}]};
var veins = {Algo = MAPALGO_Or, Op = [
{Algo = MAPALGO_Lines, X = 2, Y = -1, Distance = 12},
{Algo = MAPALGO_Lines, X = 2, Y = 1, Distance = 12},
{Algo = MAPALGO_Lines, X = 0, Y = 1, Distance = 16}
]};
veins = {Algo = MAPALGO_And, Op = [veins, vein_area]};
veins = {Algo = MAPALGO_Turbulence, Iterations = 4, Amplitude = 12, Scale = 12, Seed = Random(65536), Op = veins};
Draw(vein_material, veins);
return;
}
/*-- Helper Functions --*/
public func DrawRock(proplist layer)
{
Draw("Granite", layer);
DrawMaterial("Rock-rock", layer, 4, 18);
DrawMaterial("Rock", layer, 4, 18);
return;
}