forked from Mirrors/openclonk
195 lines
7.1 KiB
C
195 lines
7.1 KiB
C
/**
|
|
Krakatoa's Krach
|
|
A Volcano with one main chasm and a few side chasms.
|
|
|
|
@author Maikel
|
|
*/
|
|
|
|
#include Library_Map
|
|
|
|
|
|
// Variable to store the chasm exit points.
|
|
static chasm_exits;
|
|
|
|
// Called be the engine: draw the complete map here.
|
|
protected func InitializeMap(proplist map)
|
|
{
|
|
// Set chasm exits to be an array.
|
|
chasm_exits = [];
|
|
|
|
// Retrieve the settings according to the MapSize setting.
|
|
var map_size;
|
|
if (SCENPAR_MapSize == 1)
|
|
map_size = [200, 150];
|
|
if (SCENPAR_MapSize == 2)
|
|
map_size = [240, 180];
|
|
if (SCENPAR_MapSize == 3)
|
|
map_size = [280, 210];
|
|
|
|
// Set the map size.
|
|
map->Resize(map_size[0], map_size[1]);
|
|
|
|
// Get the volcano main shape.
|
|
var volcano = CreateVolcano(map);
|
|
|
|
// Get the main chasm shape.
|
|
var main_chasm = CreateChasm(map, volcano);
|
|
|
|
// Draw the various parts of the map.
|
|
DrawVolcano(map, volcano, SCENPAR_Difficulty);
|
|
DrawChasm(map, volcano, main_chasm);
|
|
|
|
// Return true to tell the engine a map has been successfully created.
|
|
return true;
|
|
}
|
|
|
|
// Creates the main volcano shape.
|
|
public func CreateVolcano(proplist map)
|
|
{
|
|
var wdt = map.Wdt;
|
|
var hgt = map.Hgt;
|
|
|
|
// Use the polygon algorithm to construct the main size of the volcano, and rescale according to map size.
|
|
var x_points = [ 0, 0, 32, 51, 67, 83, 88, 90, 92, 94, 106, 108, 110, 112, 117, 133, 149, 168, 200, 200];
|
|
var y_points = [150, 100, 86, 75, 60, 38, 46, 48, 50, 51, 51, 50, 48, 46, 38, 60, 75, 86, 100, 150];
|
|
for (var i = 0; i < GetLength(x_points); i++)
|
|
{
|
|
x_points[i] = x_points[i] * wdt / 200;
|
|
y_points[i] = y_points[i] * hgt / 150;
|
|
}
|
|
// Create the volcano layer.
|
|
var volcano = {Algo = MAPALGO_Polygon, X = x_points, Y = y_points};
|
|
volcano = {Algo = MAPALGO_Or, Op = [volcano, {Algo = MAPALGO_Turbulence, Amplitude = 6, Scale = 6, Iterations = 2, Seed = Random(65536), Op = volcano}]};
|
|
return volcano;
|
|
}
|
|
|
|
// Creates the chasm structure.
|
|
public func CreateChasm(proplist map, proplist volcano)
|
|
{
|
|
var wdt = map.Wdt;
|
|
var hgt = map.Hgt;
|
|
|
|
// The main chasm ends in the crater and is a larger reservoir of lava at the bottom.
|
|
var main_chasm = {Algo = MAPALGO_Rect, X = wdt / 2 - wdt / 40, Y = hgt / 3, Wdt = wdt / 20, Hgt = 2 * hgt / 3};
|
|
|
|
// Complete the chasm layer, rescale for larger map sizes.
|
|
var x_points = [ 73, 82, 94, 106, 118, 127];
|
|
var y_points = [150, 125, 113, 113, 125, 150];
|
|
for (var i = 0; i < GetLength(x_points); i++)
|
|
{
|
|
x_points[i] = x_points[i] * wdt / 200;
|
|
y_points[i] = y_points[i] * hgt / 150;
|
|
}
|
|
var chasm_bottom = {Algo = MAPALGO_Polygon, X = x_points, Y = y_points};
|
|
main_chasm = {Algo = MAPALGO_Or, Op = [main_chasm, chasm_bottom]};
|
|
main_chasm = {Algo = MAPALGO_Or, Op = [main_chasm, {Algo = MAPALGO_Turbulence, Amplitude = 8, Scale = 8, Iterations = 2, Seed = Random(65536), Op = main_chasm}]};
|
|
|
|
// Draw the four side chasms, rescale for larger map sizes.
|
|
var chasm_points = [
|
|
[[100, 53], [122, 70]],
|
|
[[100, 71], [92, 52]],
|
|
[[100, 129], [92, 52]],
|
|
[[100, 147], [122, 70]]
|
|
];
|
|
for (var i = 0; i < GetLength(chasm_points); i++)
|
|
{
|
|
chasm_points[i][0][0] = chasm_points[i][0][0] * wdt / 200;
|
|
chasm_points[i][0][1] = chasm_points[i][0][1] * wdt / 200;
|
|
chasm_points[i][1][0] = chasm_points[i][1][0] * hgt / 150;
|
|
chasm_points[i][1][1] = chasm_points[i][1][1] * hgt / 150;
|
|
}
|
|
for (var i = 0; i < 4; i++)
|
|
{
|
|
var points = chasm_points[i];
|
|
var side_chasm = {Algo = MAPALGO_Polygon, X = points[0], Y = points[1], Wdt = 3, Open = 1, Empty = 1};
|
|
side_chasm = {Algo = MAPALGO_Turbulence, Amplitude = 6, Scale = 6, Iterations = 2, Seed = Random(65536), Op = side_chasm};
|
|
side_chasm = {Algo = MAPALGO_And, Op = [side_chasm, volcano]};
|
|
main_chasm = {Algo = MAPALGO_Or, Op = [main_chasm, side_chasm]};
|
|
}
|
|
|
|
// Store chasm exits.
|
|
chasm_exits[0] = [wdt / 2, hgt / 3];
|
|
for (var i = 1; i <= 4; i++)
|
|
chasm_exits[i] = [chasm_points[i - 1][0][1], chasm_points[i - 1][1][1]];
|
|
|
|
return main_chasm;
|
|
}
|
|
|
|
// Draws the main volcano shape.
|
|
public func DrawVolcano(proplist map, proplist volcano, int difficulty)
|
|
{
|
|
// The main material for the volcano is earth.
|
|
map->Draw("Earth", volcano);
|
|
|
|
// Also add other materials to the volcano.
|
|
map->DrawMaterial("Earth-earth_root", volcano, 2, 18);
|
|
map->DrawMaterial("Earth-earth_spongy", volcano, 2, 18);
|
|
map->DrawMaterial("Earth-earth", volcano, 4, 16);
|
|
map->DrawMaterial("Ashes", volcano, 3, 8);
|
|
map->DrawMaterial("Tunnel", volcano, 7, 16);
|
|
map->DrawMaterial("Tunnel", volcano, 8, 10);
|
|
map->DrawMaterial("Rock", volcano, 3, 6);
|
|
map->DrawMaterial("Rock-rock_smooth", volcano, 3, 6);
|
|
map->DrawMaterial("Ore", volcano, 5, 12);
|
|
map->DrawMaterial("Firestone", volcano, 5, 12);
|
|
map->DrawMaterial("Coal", volcano, 5, 12);
|
|
map->DrawMaterial(["Water", "Water", "DuroLava"][difficulty - 1], volcano, 6, 2);
|
|
map->DrawMaterial(["Water", "DuroLava", "DuroLava"][difficulty - 1], volcano, 6, 2);
|
|
|
|
// Draw ashes borders around the lava parts.
|
|
var lava = this->Duplicate("DuroLava");
|
|
var lava_borders = {Algo = MAPALGO_Border, Op = lava, Wdt = -1, Top = 0};
|
|
map->Draw("Ashes", lava_borders);
|
|
|
|
// Ashes are scattered around the surface.
|
|
var surface = {Algo = MAPALGO_Border, Top = 1, Op = volcano};
|
|
map->DrawMaterial("Ashes", surface, 4, 80);
|
|
var surface = {Algo = MAPALGO_Border, Top = 3, Op = volcano};
|
|
map->DrawMaterial("Ashes", surface, 4, 40);
|
|
|
|
FixLiquidBorders("Earth", "Ashes");
|
|
return;
|
|
}
|
|
|
|
// Draws the main chasm.
|
|
public func DrawChasm(proplist map, proplist volcano, proplist chasm)
|
|
{
|
|
var wdt = map.Wdt;
|
|
var hgt = map.Hgt;
|
|
|
|
// Add part of the crater with to the chasm.
|
|
var sky = map->Duplicate("*");
|
|
sky = {Algo = MAPALGO_Not, Op = {Algo = MAPALGO_Layer, Layer = sky}};
|
|
var crater = {Algo = MAPALGO_And, Op = [sky, {Algo = MAPALGO_Rect, X = wdt / 2 - 3 * wdt / 40, Y = 43 * hgt / 150, Wdt = 6 * wdt / 40, Hgt = 20}]};
|
|
var full_chasm = {Algo = MAPALGO_Or, Op = [chasm, crater]};
|
|
|
|
// First draw the chasm with tunnel and then make sure the side chasms have a flat surface.
|
|
map->Draw("Tunnel", full_chasm);
|
|
for (var i = 1; i <= 4; i++)
|
|
{
|
|
var exit = chasm_exits[i];
|
|
var flat = {Algo = MAPALGO_Rect, X = exit[0] - 5, Y = exit[1] - 3, Wdt = 10, Hgt = 5};
|
|
full_chasm = {Algo = MAPALGO_And, Op = [full_chasm, {Algo = MAPALGO_Not, Op = flat}]};
|
|
}
|
|
// Then fill the chasm with durolava.
|
|
map->Draw("DuroLava", full_chasm);
|
|
|
|
// The border of the chasm is out of rock, granite and ashes.
|
|
var chasm_crust = {Algo = MAPALGO_Border, Left = -5, Right = -5, Op = full_chasm};
|
|
chasm_crust = {Algo = MAPALGO_And, Op = [chasm_crust, volcano]};
|
|
map->Draw("Everrock", chasm_crust);
|
|
chasm_crust = {Algo = MAPALGO_Border, Left = -1, Right = -1, Op = full_chasm};
|
|
map->Draw("Rock", chasm_crust);
|
|
map->DrawMaterial("Rock-rock_smooth", chasm_crust, 3, 30);
|
|
map->DrawMaterial("Granite", chasm_crust, 3, 30);
|
|
|
|
// Draw the gold area in the volcano's core.
|
|
var core = {Algo = MAPALGO_Ellipsis, X = wdt / 2, Y = hgt, Wdt = wdt / 10, Hgt = hgt / 7};
|
|
core = {Algo = MAPALGO_Turbulence, Amplitude = 6, Scale = 6, Iterations = 2, Seed = Random(65536), Op = core};
|
|
var lines = {Algo = MAPALGO_Lines, X = 4, Y = 0, Distance = 8};
|
|
lines = {Algo = MAPALGO_Turbulence, Amplitude = 12, Scale = 12, Iterations = 4, Seed = Random(65536), Op = lines};
|
|
core = {Algo = MAPALGO_And, Op = [core, lines]};
|
|
map->Draw("Gold", core);
|
|
return;
|
|
}
|