forked from Mirrors/openclonk
250 lines
11 KiB
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;
|
|
} |