forked from Mirrors/openclonk
171 lines
8.9 KiB
C
171 lines
8.9 KiB
C
/**
|
|
Acid Gold Mine
|
|
An acid lake with a cliff leading to a volcanic gold mine.
|
|
|
|
@author Sven2, Maikel
|
|
*/
|
|
|
|
#include Library_Map
|
|
|
|
|
|
// Called be the engine: draw the complete map here.
|
|
protected func InitializeMap(proplist map)
|
|
{
|
|
// Retrieve the settings according to the MapSize setting.
|
|
// TODO: Change map size and rescale algorithms accordingly.
|
|
var map_size;
|
|
if (SCENPAR_MapSize == 1)
|
|
map_size = [90, 240];
|
|
if (SCENPAR_MapSize == 2)
|
|
map_size = [90, 240];
|
|
if (SCENPAR_MapSize == 3)
|
|
map_size = [90, 240];
|
|
|
|
// Set the map size and define different areas on the vertical axes.
|
|
// The horizontal size is fixed for all map sizes.
|
|
map->Resize(map_size[0], map_size[1]);
|
|
var wdt = map.Wdt;
|
|
var hgt = map.Hgt;
|
|
var acid_level = 32; // Top of the acid lake.
|
|
var acid_hills = 75; // Top of the hills in the acid lake.
|
|
var acid_bottom = 106; // Bottom of the acid lake.
|
|
var ground_middle = 160; // Middle of the solid ground.
|
|
var ground_bottom = 180; // Bottom of the solid ground.
|
|
|
|
// Acid lake: draw first and let rest overwrite this layer.
|
|
var acid_lake = {Algo = MAPALGO_Rect, X = 0, Y = acid_level, Wdt = wdt, Hgt = hgt};
|
|
map->Draw("Acid", acid_lake);
|
|
|
|
// Draw the basic shape of the earth and add different earth types.
|
|
var ground = GetGroundShape(map, acid_level, acid_hills, acid_bottom);
|
|
map->Draw("Earth", ground);
|
|
map->DrawMaterial("Earth-earth", ground, 4, 30);
|
|
map->DrawMaterial("Earth-earth", ground, 4, 30);
|
|
map->DrawMaterial("Earth-earth_root", ground, 4, 30);
|
|
map->DrawMaterial("Earth-earth_spongy", ground, 4, 30);
|
|
var ground_border = {Algo = MAPALGO_Border, Left = [1, -1], Right = [1, -1], Top = -1, Op = ground};
|
|
map->DrawMaterial("Rock-rock", ground_border, 4, 40);
|
|
map->DrawMaterial("Rock-rock", ground_border, 4, 40);
|
|
|
|
// Fill the basic shape with materials.
|
|
var ground_toplayer = {Algo = MAPALGO_Rect, X = 0, Y = acid_level, Wdt = wdt, Hgt = acid_hills - acid_level};
|
|
ground_toplayer = {Algo = MAPALGO_Turbulence, Amplitude = 12, Scale = 8, Iterations = 4, Seed = Random(65536), Op = ground_toplayer};
|
|
ground_toplayer = {Algo = MAPALGO_And, Op = [ground, ground_toplayer]};
|
|
var ground_middle1layer = {Algo = MAPALGO_Rect, X = 0, Y = acid_hills, Wdt = wdt, Hgt = acid_bottom - acid_hills};
|
|
ground_middle1layer = {Algo = MAPALGO_Turbulence, Amplitude = 12, Scale = 8, Iterations = 4, Seed = Random(65536), Op = ground_middle1layer};
|
|
ground_middle1layer = {Algo = MAPALGO_And, Op = [ground, ground_middle1layer]};
|
|
var ground_middle2layer = {Algo = MAPALGO_Rect, X = 0, Y = acid_bottom, Wdt = wdt, Hgt = ground_middle - acid_bottom};
|
|
ground_middle2layer = {Algo = MAPALGO_Turbulence, Amplitude = 12, Scale = 8, Iterations = 4, Seed = Random(65536), Op = ground_middle2layer};
|
|
ground_middle2layer = {Algo = MAPALGO_And, Op = [ground, ground_middle2layer]};
|
|
var ground_bottomlayer = {Algo = MAPALGO_Rect, X = 0, Y = ground_middle, Wdt = wdt, Hgt = ground_bottom - ground_middle};
|
|
ground_bottomlayer = {Algo = MAPALGO_Turbulence, Amplitude = 12, Scale = 8, Iterations = 4, Seed = Random(65536), Op = ground_bottomlayer};
|
|
ground_bottomlayer = {Algo = MAPALGO_And, Op = [ground, ground_bottomlayer]};
|
|
// Fill the top layer with rock.
|
|
map->DrawMaterial("Rock", ground_toplayer, [6, 2], 6);
|
|
map->DrawMaterial("Rock", ground_toplayer, [6, 2], 6);
|
|
// Fill the first middle layer with materials and rock.
|
|
map->DrawMaterial("Rock", ground_toplayer, [6, 2], 6);
|
|
map->DrawMaterial("Rock", ground_toplayer, [12, 3], 6);
|
|
map->DrawMaterial("Rock", ground_middle1layer, [12, 3], 6);
|
|
map->DrawMaterial("Ore", ground_middle1layer, [12, 3], 8);
|
|
map->DrawMaterial("Coal", ground_middle1layer, [12, 3], 8);
|
|
map->DrawMaterial("Firestone", ground_middle1layer, [12, 3], 8);
|
|
// Fill the second middle layer with materials and acid.
|
|
map->DrawMaterial("Granite", ground_middle2layer, [12, 2], 10);
|
|
map->DrawMaterial("Rock", ground_middle2layer, [12, 2], 8);
|
|
map->DrawMaterial("Tunnel", ground_middle2layer, [10, 4], 10);
|
|
map->DrawMaterial("Ore", ground_middle2layer, [12, 3], 5);
|
|
map->DrawMaterial("Coal", ground_middle2layer, [12, 3], 5);
|
|
map->DrawMaterial("Firestone", ground_middle2layer, [12, 3], 5);
|
|
map->DrawMaterial("Acid", ground_middle2layer, [6, 3], 10);
|
|
// Fill the bottom layer with acid and granite.
|
|
map->DrawMaterial("Granite", ground_bottomlayer, [12, 2], 10);
|
|
map->DrawMaterial("Rock", ground_bottomlayer, [12, 2], 6);
|
|
map->DrawMaterial(["Water", "Acid", "DuroLava"][SCENPAR_Difficulty - 1], ground_bottomlayer, [8, 3], 10);
|
|
map->DrawMaterial("Acid", ground_bottomlayer, [6, 3], 10);
|
|
|
|
// Reinforce the lower parts of the acid lake, height depends on difficulty.
|
|
var lake_pit = {Algo = MAPALGO_Rect, X = 48, Y = acid_bottom - 12, Wdt = 20, Hgt = 22 - SCENPAR_Difficulty};
|
|
lake_pit = {Algo = MAPALGO_Turbulence, Amplitude = 8, Scale = 6, Iterations = 2, Seed = Random(65536), Op = lake_pit};
|
|
lake_pit = {Algo = MAPALGO_And, Op = [ground, lake_pit]};
|
|
map->Draw("Granite", lake_pit);
|
|
map->DrawMaterial("Rock", lake_pit, 2, 15);
|
|
map->DrawMaterial("Rock", lake_pit, 2, 15);
|
|
|
|
// Draw the map sides and the upper part of the volcano out of granite.
|
|
var granite = GetGraniteShape(map, ground_bottom);
|
|
map->Draw("Granite", granite);
|
|
map->DrawMaterial("Rock", granite, 5, 25);
|
|
map->DrawMaterial("Rock", granite, 5, 25);
|
|
map->DrawMaterial("DuroLava", granite, 5, 25);
|
|
map->DrawMaterial("DuroLava", granite, 2, 15);
|
|
map->Draw("Granite", {Algo = MAPALGO_Border, Wdt = 2, Op = granite});
|
|
|
|
// Draw the volcano using lava, granite and gold.
|
|
var lava = GetLavaShape(map, granite, ground_bottom);
|
|
var lava_gold = {Algo = MAPALGO_And, Op = [lava, {Algo = MAPALGO_Rect, X = 0, Y = ground_bottom + 8 * SCENPAR_Difficulty, Wdt = wdt, Hgt = hgt}]};
|
|
map->Draw("DuroLava", lava);
|
|
map->DrawMaterial("Granite", lava, 5, 25);
|
|
map->DrawMaterial("Gold", lava_gold, 5, 25);
|
|
var lava_bottom = {Algo = MAPALGO_Rect, X = 0, Y = hgt - 8, Wdt = wdt, Hgt = hgt};
|
|
var lava_bottom_rnd = {Algo = MAPALGO_Turbulence, Amplitude = 12, Scale = 8, Iterations = 4, Seed = Random(65536), Op = lava_bottom};
|
|
lava_bottom = {Algo = MAPALGO_And, Op = [lava_bottom, lava_bottom_rnd]};
|
|
map->Draw("DuroLava", lava_bottom);
|
|
|
|
// Create an underground spot where wind is available.
|
|
var wind_spot = {Algo = MAPALGO_Rect, X = 38, Y = acid_bottom - 4, Wdt = 8 - SCENPAR_Difficulty, Hgt = 8 - SCENPAR_Difficulty};
|
|
wind_spot = {Algo = MAPALGO_Turbulence, Amplitude = 4, Scale = 4, Iterations = 1, Seed = Random(65536), Op = wind_spot};
|
|
map->Draw("Sky", wind_spot);
|
|
var wind_spot_border = {Algo = MAPALGO_Border, Wdt = 1, Op = wind_spot};
|
|
wind_spot_border = {Algo = MAPALGO_Turbulence, Amplitude = 4, Scale = 4, Iterations = 1, Seed = Random(65536), Op = wind_spot_border};
|
|
map->Draw("Tunnel", wind_spot_border);
|
|
|
|
// Place some additional gold at the bottom of the acid lake.
|
|
var acid_gold = {Algo = MAPALGO_Rect, X = 82, Y = acid_hills + 4, Wdt = 5 - SCENPAR_Difficulty, Hgt = 5 - SCENPAR_Difficulty};
|
|
acid_gold = {Algo = MAPALGO_Turbulence, Amplitude = 4, Scale = 4, Iterations = 1, Seed = Random(65536), Op = acid_gold};
|
|
map->Draw("Gold", acid_gold);
|
|
var acid_gold_border = {Algo = MAPALGO_Border, Wdt = -1, Op = acid_gold};
|
|
map->Draw("Granite", acid_gold_border);
|
|
|
|
// Fix the liquid borders of the water and acid in the ground.
|
|
FixLiquidBorders();
|
|
|
|
// Return true to tell the engine a map has been successfully created.
|
|
return true;
|
|
}
|
|
|
|
public func GetGroundShape(proplist map, int acid_level, int acid_hills, int acid_bottom)
|
|
{
|
|
var wdt = map.Wdt;
|
|
var hgt = map.Hgt;
|
|
var ground_x = [0, 18, 23, 45, 54, 68, 77, 90, 90, 0];
|
|
var ground_y = [acid_hills, acid_hills, acid_level - 10, acid_level - 10, acid_bottom, acid_bottom, acid_hills, acid_hills, hgt, hgt];
|
|
var ground = {Algo = MAPALGO_Polygon, X = ground_x, Y = ground_y};
|
|
var ground_rnd = {Algo = MAPALGO_Turbulence, Amplitude = 10, Scale = 10, Iterations = 4, Seed = Random(65536), Op = ground};
|
|
ground = {Algo = MAPALGO_Or, Op = [ground, ground_rnd]};
|
|
return ground;
|
|
}
|
|
|
|
public func GetGraniteShape(proplist map, int ground_bottom)
|
|
{
|
|
var wdt = map.Wdt;
|
|
var hgt = map.Hgt;
|
|
var granite_layer = {Algo = MAPALGO_Rect, X = 0, Y = ground_bottom, Wdt = wdt, Hgt = 5};
|
|
var granite_x = [ 0, 4, 8, 24, 24, wdt-24, wdt-24, wdt-8, wdt-4, wdt, wdt, 0];
|
|
var granite_y = [128, 128, 170, 229, hgt, hgt, 229, 170, 128, 128, hgt+20, hgt+20];
|
|
var granite_side = {Algo = MAPALGO_Polygon, X = granite_x, Y = granite_y};
|
|
var granite = {Algo = MAPALGO_Or, Op = [granite_side, granite_layer]};
|
|
var granite_rnd = {Algo = MAPALGO_Turbulence, Amplitude = 12, Scale = 8, Iterations = 4, Seed = Random(65536), Op = granite};
|
|
granite = {Algo = MAPALGO_Or, Op = [granite, granite_rnd]};
|
|
return granite;
|
|
}
|
|
|
|
public func GetLavaShape(proplist map, proplist granite, int ground_bottom)
|
|
{
|
|
var wdt = map.Wdt;
|
|
var hgt = map.Hgt;
|
|
var lava = {Algo = MAPALGO_Rect, X = 0, Y = ground_bottom, Wdt = wdt, Hgt = hgt};
|
|
lava = {Algo = MAPALGO_And, Op = [lava, {Algo = MAPALGO_Not, Op = granite}, {Algo = MAPALGO_Not, Op = granite}]};
|
|
return lava;
|
|
}
|