From b246812455737b2d0337dec905ba0256adefd105 Mon Sep 17 00:00:00 2001 From: kwolekr Date: Thu, 7 May 2015 02:54:30 -0400 Subject: [PATCH] Schematics: Add indent-with-space option for schematic Lua table serialization --- doc/lua_api.txt | 4 +++- src/mg_schematic.cpp | 23 ++++++++++++++--------- src/mg_schematic.h | 2 +- src/script/lua_api/l_mapgen.cpp | 6 ++++-- 4 files changed, 22 insertions(+), 13 deletions(-) diff --git a/doc/lua_api.txt b/doc/lua_api.txt index 6d1e7e70..cb8b8848 100644 --- a/doc/lua_api.txt +++ b/doc/lua_api.txt @@ -2178,8 +2178,10 @@ These functions return the leftover itemstack. * "mts" - a string containing the binary MTS data used in the MTS file format * "lua" - a string containing Lua code representing the schematic in table format * `options` is a table containing the following optional parameters: - * If `use_comments` is true and `format` is "lua", the Lua code generated will have (X, Z) + * If `lua_use_comments` is true and `format` is "lua", the Lua code generated will have (X, Z) * position comments for every X row generated in the schematic data for easier reading. + * If `lua_num_indent_spaces` is a nonzero number and `format` is "lua", the Lua code generated + * will use that number of spaces as indentation instead of a tab character. ### Misc. * `minetest.get_connected_players()`: returns list of `ObjectRefs` diff --git a/src/mg_schematic.cpp b/src/mg_schematic.cpp index 3100637a..bea08ef1 100644 --- a/src/mg_schematic.cpp +++ b/src/mg_schematic.cpp @@ -309,14 +309,18 @@ bool Schematic::serializeToMts(std::ostream *os, bool Schematic::serializeToLua(std::ostream *os, - const std::vector &names, bool use_comments) + const std::vector &names, bool use_comments, u32 indent_spaces) { std::ostream &ss = *os; + std::string indent("\t"); + if (indent_spaces > 0) + indent.assign(indent_spaces, ' '); + //// Write header { ss << "schematic = {" << std::endl; - ss << "\tsize = " + ss << indent << "size = " << "{x=" << size.X << ", y=" << size.Y << ", z=" << size.Z @@ -325,33 +329,34 @@ bool Schematic::serializeToLua(std::ostream *os, //// Write y-slice probabilities { - ss << "\tyslice_prob = {" << std::endl; + ss << indent << "yslice_prob = {" << std::endl; for (u16 y = 0; y != size.Y; y++) { - ss << "\t\t{" + ss << indent << indent << "{" << "ypos=" << y << ", prob=" << (u16)slice_probs[y] << "}," << std::endl; } - ss << "\t}," << std::endl; + ss << indent << "}," << std::endl; } //// Write node data { - ss << "\tdata = {" << std::endl; + ss << indent << "data = {" << std::endl; u32 i = 0; for (u16 z = 0; z != size.Z; z++) for (u16 y = 0; y != size.Y; y++) { if (use_comments) { ss << std::endl - << "\t\t-- z=" << z + << indent << indent + << "-- z=" << z << ", y=" << y << std::endl; } for (u16 x = 0; x != size.X; x++, i++) { - ss << "\t\t{" + ss << indent << indent << "{" << "name=\"" << names[schemdata[i].getContent()] << "\", param1=" << (u16)schemdata[i].param1 << ", param2=" << (u16)schemdata[i].param2 @@ -359,7 +364,7 @@ bool Schematic::serializeToLua(std::ostream *os, } } - ss << "\t}," << std::endl; + ss << indent << "}," << std::endl; } ss << "}" << std::endl; diff --git a/src/mg_schematic.h b/src/mg_schematic.h index 3f253ad9..5b546f87 100644 --- a/src/mg_schematic.h +++ b/src/mg_schematic.h @@ -110,7 +110,7 @@ class Schematic : public ObjDef, public NodeResolver { bool deserializeFromMts(std::istream *is, std::vector *names); bool serializeToMts(std::ostream *os, const std::vector &names); bool serializeToLua(std::ostream *os, const std::vector &names, - bool use_comments); + bool use_comments, u32 indent_spaces); void placeStructure(Map *map, v3s16 p, u32 flags, Rotation rot, bool force_placement); diff --git a/src/script/lua_api/l_mapgen.cpp b/src/script/lua_api/l_mapgen.cpp index d99f40cc..7e9c0793 100644 --- a/src/script/lua_api/l_mapgen.cpp +++ b/src/script/lua_api/l_mapgen.cpp @@ -1134,7 +1134,8 @@ int ModApiMapgen::l_serialize_schematic(lua_State *L) SchematicManager *schemmgr = getServer(L)->getEmergeManager()->schemmgr; //// Read options - bool use_comments = getboolfield_default(L, 3, "use_lua_comments", false); + bool use_comments = getboolfield_default(L, 3, "lua_use_comments", false); + u32 indent_spaces = getintfield_default(L, 3, "lua_num_indent_spaces", 0); //// Get schematic bool was_loaded = false; @@ -1161,7 +1162,8 @@ int ModApiMapgen::l_serialize_schematic(lua_State *L) schem->serializeToMts(&os, schem->m_nodenames); break; case SCHEM_FMT_LUA: - schem->serializeToLua(&os, schem->m_nodenames, use_comments); + schem->serializeToLua(&os, schem->m_nodenames, + use_comments, indent_spaces); break; default: return 0;