voxelands/src/mapgen.h

145 lines
4.8 KiB
C++

/************************************************************************
* Minetest-c55
* Copyright (C) 2010-2011 celeron55, Perttu Ahola <celeron55@gmail.com>
*
* mapgen.h
* voxelands - 3d voxel world sandbox game
* Copyright (C) Lisa 'darkrose' Milne 2014 <lisa@ltmnet.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>
*
* License updated from GPLv2 or later to GPLv3 or later by Lisa Milne
* for Voxelands.
************************************************************************/
#ifndef MAPGEN_HEADER
#define MAPGEN_HEADER
#include "common_irrlicht.h"
#include "utility.h" // UniqueQueue
#include "mapnode.h"
class MapBlock;
class ManualMapVoxelManipulator;
class VoxelManipulator;
struct NoiseParams;
enum MapGenType {
MGT_FLAT = 0,
MGT_DEFAULT
};
#define SURBIOME_X_MINUS 0
#define SURBIOME_X_PLUS 1
#define SURBIOME_Z_MINUS 2
#define SURBIOME_Z_PLUS 3
#define SURBIOME_XZ_MINUS 4
#define SURBIOME_XZ_PLUS 5
#define SURBIOME_X_MINUS_Z 6
#define SURBIOME_Z_MINUS_X 7
#define VMANIP_FLAG_DUNGEON_INSIDE VOXELFLAG_CHECKED1
#define VMANIP_FLAG_DUNGEON_PRESERVE VOXELFLAG_CHECKED2
#define VMANIP_FLAG_DUNGEON_UNTOUCHABLE (VMANIP_FLAG_DUNGEON_INSIDE|VMANIP_FLAG_DUNGEON_PRESERVE)
/*
Scaling the output of the noise function affects the overdrive of the
contour function, which affects the shape of the output considerably.
*/
#define CAVE_NOISE_SCALE 12.0
#define CAVE_NOISE_THRESHOLD (1.5/CAVE_NOISE_SCALE)
namespace mapgen
{
struct BlockMakeData
{
bool no_op;
ManualMapVoxelManipulator *vmanip;
uint64_t seed;
MapGenType type;
uint8_t biome;
uint8_t surrounding_biomes[8];
v3s16 blockpos;
UniqueQueue<v3s16> transforming_liquid;
BlockMakeData();
~BlockMakeData();
};
// Finds precise ground level at any position
s16 find_ground_level_from_noise(BlockMakeData *data, v2s16 p2d, s16 precision);
// Find out if block is completely underground
bool block_is_underground(BlockMakeData *data, v3s16 blockpos);
// Main map generation routine
void make_block(BlockMakeData *data);
/* defined in mapgen_plants.cpp */
void make_papyrus(VoxelManipulator &vmanip, v3s16 p0);
void make_cactus(VoxelManipulator &vmanip, v3s16 p0);
/* defined in mapgen_trees.cpp */
void make_tree(ManualMapVoxelManipulator &vmanip, v3s16 p0);
void make_appletree(ManualMapVoxelManipulator &vmanip, v3s16 p0);
void make_conifertree(ManualMapVoxelManipulator &vmanip, v3s16 p0);
void make_largetree(ManualMapVoxelManipulator &vmanip, v3s16 p0);
void make_jungletree(ManualMapVoxelManipulator &vmanip, v3s16 p0);
/* defined in mapgen_rocks.cpp */
void make_boulder(ManualMapVoxelManipulator &vmanip, v3s16 pos, uint16_t size, content_t inner, content_t outer, content_t replace);
/* defined in mapgen_dungeon.cpp */
void make_dungeon(BlockMakeData *data, uint32_t blockseed);
/* defined in mapgen_util.cpp */
NoiseParams get_cave_noise1_params(uint64_t seed);
NoiseParams get_cave_noise2_params(uint64_t seed);
NoiseParams get_ground_noise1_params(uint64_t seed);
NoiseParams get_ground_crumbleness_params(uint64_t seed);
NoiseParams get_ground_wetness_params(uint64_t seed);
float get_humidity(uint64_t seed, v2s16 p);
int16_t get_ground_height(uint64_t seed, v2s16 p);
uint32_t get_tree_density(BlockMakeData *data, v2s16 p);
uint32_t get_grass_density(BlockMakeData *data, v2s16 p);
uint32_t get_boulder_density(BlockMakeData *data, v2s16 p);
bool is_cave(uint64_t seed, v3s16 p);
double debris_amount_2d(uint64_t seed, v2s16 p);
s16 find_ground_level_from_noise(BlockMakeData *data, v2s16 p2d, s16 precision);
double get_sector_average_ground_level(BlockMakeData *data, v2s16 sectorpos);
double get_sector_maximum_ground_level(BlockMakeData *data, v2s16 sectorpos);
double get_sector_minimum_ground_level(BlockMakeData *data, v2s16 sectorpos);
bool block_is_underground(BlockMakeData *data, v3s16 blockpos);
bool get_have_sand(uint64_t seed, v2s16 p2d);
uint8_t get_block_biome(BlockMakeData *data, v3s16 blockpos);
void calc_biome(BlockMakeData *data);
/* defined in mapgen_space.cpp */
void make_space(BlockMakeData *data);
/* defined in mapgen_sky.cpp */
void make_sky(BlockMakeData *data);
/* defined in mapgen_thedeep.cpp */
void make_thedeep(BlockMakeData *data);
/* defined in mapgen_flat.cpp */
void make_flat(BlockMakeData *data);
}; // namespace mapgen
#endif