aboutsummaryrefslogtreecommitdiff
path: root/src/script/lua_api/l_mapgen.h
blob: 0bdc56fc54e6ac9359a37279f2a50b3bceebf4c3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
/*
Minetest
Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com>

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/

#pragma once

#include "lua_api/l_base.h"

typedef u16 biome_t;  // copy from mg_biome.h to avoid an unnecessary include

class ModApiMapgen : public ModApiBase
{
private:
	// get_biome_id(biomename)
	// returns the biome id as used in biomemap and returned by 'get_biome_data()'
	static int l_get_biome_id(lua_State *L);

	// get_biome_name(biome_id)
	// returns the biome name string
	static int l_get_biome_name(lua_State *L);

	// get_heat(pos)
	// returns the heat at the position
	static int l_get_heat(lua_State *L);

	// get_humidity(pos)
	// returns the humidity at the position
	static int l_get_humidity(lua_State *L);

	// get_biome_data(pos)
	// returns a table containing the biome id, heat and humidity at the position
	static int l_get_biome_data(lua_State *L);

	// get_mapgen_object(objectname)
	// returns the requested object used during map generation
	static int l_get_mapgen_object(lua_State *L);

	// get_spawn_level(x = num, z = num)
	static int l_get_spawn_level(lua_State *L);

	// get_mapgen_params()
	// returns the currently active map generation parameter set
	static int l_get_mapgen_params(lua_State *L);

	// set_mapgen_params(params)
	// set mapgen parameters
	static int l_set_mapgen_params(lua_State *L);

	// get_mapgen_setting(name)
	static int l_get_mapgen_setting(lua_State *L);

	// set_mapgen_setting(name, value, override_meta)
	static int l_set_mapgen_setting(lua_State *L);

	// get_mapgen_setting_noiseparams(name)
	static int l_get_mapgen_setting_noiseparams(lua_State *L);

	// set_mapgen_setting_noiseparams(name, value, override_meta)
	static int l_set_mapgen_setting_noiseparams(lua_State *L);

	// set_noiseparam_defaults(name, noiseparams, set_default)
	static int l_set_noiseparams(lua_State *L);

	// get_noiseparam_defaults(name)
	static int l_get_noiseparams(lua_State *L);

	// set_gen_notify(flags, {deco_id_table})
	static int l_set_gen_notify(lua_State *L);

	// get_gen_notify()
	static int l_get_gen_notify(lua_State *L);

	// get_decoration_id(decoration_name)
	// returns the decoration ID as used in gennotify
	static int l_get_decoration_id(lua_State *L);

	// register_biome({lots of stuff})
	static int l_register_biome(lua_State *L);

	// register_decoration({lots of stuff})
	static int l_register_decoration(lua_State *L);

	// register_ore({lots of stuff})
	static int l_register_ore(lua_State *L);

	// register_schematic({schematic}, replacements={})
	static int l_register_schematic(lua_State *L);

	// clear_registered_biomes()
	static int l_clear_registered_biomes(lua_State *L);

	// clear_registered_decorations()
	static int l_clear_registered_decorations(lua_State *L);

	// clear_registered_schematics()
	static int l_clear_registered_schematics(lua_State *L);

	// generate_ores(vm, p1, p2)
	static int l_generate_ores(lua_State *L);

	// generate_decorations(vm, p1, p2)
	static int l_generate_decorations(lua_State *L);

	// clear_registered_ores
	static int l_clear_registered_ores(lua_State *L);

	// create_schematic(p1, p2, probability_list, filename)
	static int l_create_schematic(lua_State *L);

	// place_schematic(p, schematic, rotation,
	//     replacements, force_placement, flagstring)
	static int l_place_schematic(lua_State *L);

	// place_schematic_on_vmanip(vm, p, schematic, rotation,
	//     replacements, force_placement, flagstring)
	static int l_place_schematic_on_vmanip(lua_State *L);

	// serialize_schematic(schematic, format, options={...})
	static int l_serialize_schematic(lua_State *L);

	// read_schematic(schematic, options={...})
	static int l_read_schematic(lua_State *L);

public:
	static void Initialize(lua_State *L, int top);

	static struct EnumString es_BiomeTerrainType[];
	static struct EnumString es_DecorationType[];
	static struct EnumString es_MapgenObject[];
	static struct EnumString es_OreType[];
	static struct EnumString es_Rotation[];
	static struct EnumString es_SchematicFormatType[];
	static struct EnumString es_NodeResolveMethod[];
};
((ALIGNOF(y) - ((uintptr_t)(x) & (ALIGNOF(y) - 1))) & (ALIGNOF(y) - 1)) #if defined(__APPLE__) #include <mach-o/dyld.h> #include <CoreFoundation/CoreFoundation.h> #endif #ifndef _WIN32 // Posix #include <sys/time.h> #include <time.h> #if defined(__MACH__) && defined(__APPLE__) #include <mach/clock.h> #include <mach/mach.h> #endif #endif namespace porting { /* Signal handler (grabs Ctrl-C on POSIX systems) */ void signal_handler_init(void); // Returns a pointer to a bool. // When the bool is true, program should quit. bool * signal_handler_killstatus(void); /* Path of static data directory. */ extern std::string path_share; /* Directory for storing user data. Examples: Windows: "C:\Documents and Settings\user\Application Data\<PROJECT_NAME>" Linux: "~/.<PROJECT_NAME>" Mac: "~/Library/Application Support/<PROJECT_NAME>" */ extern std::string path_user; /* Path to gettext locale files */ extern std::string path_locale; /* Path to directory for storing caches. */ extern std::string path_cache; /* Get full path of stuff in data directory. Example: "stone.png" -> "../data/stone.png" */ std::string getDataPath(const char *subpath); /* Move cache folder from path_user to the system cache location if possible. */ void migrateCachePath(); /* Initialize path_*. */ void initializePaths(); /* Return system information e.g. "Linux/3.12.7 x86_64" */ std::string get_sysinfo(); // Monotonic counter getters. #ifdef _WIN32 // Windows extern double perf_freq; inline u64 os_get_time(double mult) { LARGE_INTEGER t; QueryPerformanceCounter(&t); return static_cast<double>(t.QuadPart) / (perf_freq / mult); } // Resolution is <1us. inline u64 getTimeS() { return os_get_time(1); } inline u64 getTimeMs() { return os_get_time(1000); } inline u64 getTimeUs() { return os_get_time(1000*1000); } inline u64 getTimeNs() { return os_get_time(1000*1000*1000); } #else // Posix inline void os_get_clock(struct timespec *ts) { #if defined(__MACH__) && defined(__APPLE__) // From http://stackoverflow.com/questions/5167269/clock-gettime-alternative-in-mac-os-x // OS X does not have clock_gettime, use clock_get_time clock_serv_t cclock; mach_timespec_t mts; host_get_clock_service(mach_host_self(), CALENDAR_CLOCK, &cclock); clock_get_time(cclock, &mts); mach_port_deallocate(mach_task_self(), cclock); ts->tv_sec = mts.tv_sec; ts->tv_nsec = mts.tv_nsec; #elif defined(CLOCK_MONOTONIC_RAW) clock_gettime(CLOCK_MONOTONIC_RAW, ts); #elif defined(_POSIX_MONOTONIC_CLOCK) clock_gettime(CLOCK_MONOTONIC, ts); #else struct timeval tv; gettimeofday(&tv, NULL); TIMEVAL_TO_TIMESPEC(&tv, ts); #endif } inline u64 getTimeS() { struct timespec ts; os_get_clock(&ts); return ts.tv_sec; } inline u64 getTimeMs() { struct timespec ts; os_get_clock(&ts); return ts.tv_sec * 1000 + ts.tv_nsec / 1000000; } inline u64 getTimeUs() { struct timespec ts; os_get_clock(&ts); return ts.tv_sec * 1000000 + ts.tv_nsec / 1000; } inline u64 getTimeNs() { struct timespec ts; os_get_clock(&ts); return ts.tv_sec * 1000000000 + ts.tv_nsec; } #endif inline u64 getTime(TimePrecision prec) { switch (prec) { case PRECISION_SECONDS: return getTimeS(); case PRECISION_MILLI: return getTimeMs(); case PRECISION_MICRO: return getTimeUs(); case PRECISION_NANO: return getTimeNs(); } FATAL_ERROR("Called getTime with invalid time precision"); } /** * Delta calculation function arguments. * @param old_time_ms old time for delta calculation * @param new_time_ms new time for delta calculation * @return positive delta value */ inline u64 getDeltaMs(u64 old_time_ms, u64 new_time_ms) { if (new_time_ms >= old_time_ms) { return (new_time_ms - old_time_ms); } else { return (old_time_ms - new_time_ms); } }