/* Minetest Copyright (C) 2014-2016 kwolekr, Ryan Kwolek Copyright (C) 2014-2017 paramat 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. */ #include "mg_biome.h" #include "mg_decoration.h" #include "emerge.h" #include "server.h" #include "nodedef.h" #include "map.h" //for MMVManip #include "util/numeric.h" #include "porting.h" #include "settings.h" /////////////////////////////////////////////////////////////////////////////// BiomeManager::BiomeManager(Server *server) : ObjDefManager(server, OBJDEF_BIOME) { m_server = server; // Create default biome to be used in case none exist Biome *b = new Biome; b->name = "Default"; b->flags = 0; b->depth_top = 0; b->depth_filler = -MAX_MAP_GENERATION_LIMIT; b->depth_water_top = 0; b->depth_riverbed = 0; b->y_min = -MAX_MAP_GENERATION_LIMIT; b->y_max = MAX_MAP_GENERATION_LIMIT; b->heat_point = 0.0; b->humidity_point = 0.0; b->m_nodenames.emplace_back("mapgen_stone"); b->m_nodenames.emplace_back("mapgen_stone"); b->m_nodenames.emplace_back("mapgen_stone"); b->m_nodenames.emplace_back("mapgen_water_source"); b->m_nodenames.emplace_back("mapgen_water_source"); b->m_nodenames.emplace_back("mapgen_river_water_source"); b->m_nodenames.emplace_back("mapgen_stone"); b->m_nodenames.emplace_back("ignore"); m_ndef->pendNodeResolve(b); add(b); } void BiomeManager::clear() { EmergeManager *emerge = m_server->getEmergeManager(); // Remove all dangling references in Decorations DecorationManager *decomgr = emerge->decomgr; for (size_t i = 0; i != decomgr->getNumObjects(); i++) { Decoration *deco = (Decoration *)decomgr->getRaw(i); deco->biomes.clear(); } // Don't delete the first biome for (size_t i = 1; i < m_objects.size(); i++) delete (Biome *)m_objects[i]; m_objects.resize(1); } //////////////////////////////////////////////////////////////////////////////// void BiomeParamsOriginal::readParams(const Settings *settings) { settings->getNoiseParams("mg_biome_np_heat", np_heat); settings->getNoiseParams("mg_biome_np_heat_blend", np_heat_blend); settings->getNoiseParams("mg_biome_np_humidity", np_humidity); settings->getNoiseParams("mg_biome_np_humidity_blend", np_humidity_blend); } void BiomeParamsOriginal::writeParams(Settings *settings) const { settings->setNoiseParams("mg_biome_np_heat", np_heat); settings->setNoiseParams("mg_biome_np_heat_blend", np_heat_blend); settings->setNoiseParams("mg_biome_np_humidity", np_humidity); settings->setNoiseParams("mg_biome_np_humidity_blend", np_humidity_blend); } //////////////////////////////////////////////////////////////////////////////// BiomeGenOriginal::BiomeGenOriginal(BiomeManager *biomemgr, BiomeParamsOriginal *params, v3s16 chunksize) { m_bmgr = biomemgr; m_params = params; m_csize = chunksize; noise_heat = new Noise(¶ms->np_heat, params->seed, m_csize.X, m_csize.Z); noise_humidity = new Noise(¶ms->np_humidity, params->seed, m_csize.X, m_csize.Z); noise_heat_blend = new Noise(¶ms->np_heat_blend, params->seed, m_csize.X, m_csize.Z); noise_humidity_blend = new Noise(¶ms->np_humidity_blend, params->seed, m_csize.X, m_csize.Z); heatmap = noise_heat->result; humidmap = noise_humidity->result; biomemap = new biome_t[m_csize.X * m_csize.Z]; } BiomeGenOriginal::~BiomeGenOriginal() { delete []biomemap; delete noise_heat; delete noise_humidity; delete noise_heat_blend; delete noise_humidity_blend; } Biome *BiomeGenOriginal::calcBiomeAtPoint(v3s16 pos) const { float heat = NoisePerlin2D(&m_params->np_heat, pos.X, pos.Z, m_params->seed) + NoisePerlin2D(&m_params->np_heat_blend, pos.X, pos.Z, m_params->seed); float humidity = NoisePerlin2D(&m_params->np_humidity, pos.X, pos.Z, m_params->seed) + NoisePerlin2D(&m_params->np_humidity_blend, pos.X, pos.Z, m_params->seed); return calcBiomeFro/* ** $Id: ltm.h,v 2.6.1.1 2007/12/27 13:02:25 roberto Exp $ ** Tag methods ** See Copyright Notice in lua.h */ #ifndef ltm_h #define ltm_h #include "lobject.h" /* * WARNING: if you change the order of this enumeration, * grep "ORDER TM" */ typedef enum { TM_INDEX, TM_NEWINDEX, TM_GC, TM_MODE, TM_EQ, /* last tag method with `fast' access */ TM_ADD, TM_SUB, TM_MUL, TM_DIV, TM_MOD, TM_POW, TM_UNM, TM_LEN, TM_LT, TM_LE, TM_CONCAT, TM_CALL, TM_N /* number of elements in the enum */ } TMS; #define gfasttm(g,et,e) ((et) == NULL ? NULL : \ ((et)->flags & (1u<<(e))) ? NULL : luaT_gettm(et, e, (g)->tmname[e])) #define fasttm(l,et,e) gfasttm(G(l), et, e) LUAI_DATA const char *const luaT_typenames[]; LUAI_FUNC const TValue *luaT_gettm (Table *events, TMS event, TString *ename); LUAI_FUNC const TValue