Skip to content

Commit

Permalink
Schematics: Add indent-with-space option for schematic Lua table seri…
Browse files Browse the repository at this point in the history
…alization
  • Loading branch information
kwolekr committed May 7, 2015
1 parent 656575b commit b246812
Show file tree
Hide file tree
Showing 4 changed files with 22 additions and 13 deletions.
4 changes: 3 additions & 1 deletion doc/lua_api.txt
Expand Up @@ -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`
Expand Down
23 changes: 14 additions & 9 deletions src/mg_schematic.cpp
Expand Up @@ -309,14 +309,18 @@ bool Schematic::serializeToMts(std::ostream *os,


bool Schematic::serializeToLua(std::ostream *os,
const std::vector<std::string> &names, bool use_comments)
const std::vector<std::string> &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
Expand All @@ -325,41 +329,42 @@ 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
<< "}," << std::endl;
}
}

ss << "\t}," << std::endl;
ss << indent << "}," << std::endl;
}

ss << "}" << std::endl;
Expand Down
2 changes: 1 addition & 1 deletion src/mg_schematic.h
Expand Up @@ -110,7 +110,7 @@ class Schematic : public ObjDef, public NodeResolver {
bool deserializeFromMts(std::istream *is, std::vector<std::string> *names);
bool serializeToMts(std::ostream *os, const std::vector<std::string> &names);
bool serializeToLua(std::ostream *os, const std::vector<std::string> &names,
bool use_comments);
bool use_comments, u32 indent_spaces);

void placeStructure(Map *map, v3s16 p, u32 flags,
Rotation rot, bool force_placement);
Expand Down
6 changes: 4 additions & 2 deletions src/script/lua_api/l_mapgen.cpp
Expand Up @@ -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;
Expand All @@ -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;
Expand Down

2 comments on commit b246812

@est31
Copy link
Contributor

@est31 est31 commented on b246812 May 7, 2015

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Minetest very consistently uses tabs for identation. Why make an exception here?

@est31
Copy link
Contributor

@est31 est31 commented on b246812 May 7, 2015

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah I see, its only to replace default tab identation. Then its ok.

Please sign in to comment.