summaryrefslogtreecommitdiffstats
path: root/crawl-ref/source/rltiles/tool/tile_list_processor.cc
diff options
context:
space:
mode:
Diffstat (limited to 'crawl-ref/source/rltiles/tool/tile_list_processor.cc')
-rw-r--r--crawl-ref/source/rltiles/tool/tile_list_processor.cc105
1 files changed, 73 insertions, 32 deletions
diff --git a/crawl-ref/source/rltiles/tool/tile_list_processor.cc b/crawl-ref/source/rltiles/tool/tile_list_processor.cc
index e1cf1191ad..80d17bcc11 100644
--- a/crawl-ref/source/rltiles/tool/tile_list_processor.cc
+++ b/crawl-ref/source/rltiles/tool/tile_list_processor.cc
@@ -10,7 +10,8 @@ tile_list_processor::tile_list_processor() :
m_corpsify(false),
m_composing(false),
m_shrink(true),
- m_prefix("TILE")
+ m_prefix("TILE"),
+ m_start_value("0")
{
}
@@ -192,8 +193,8 @@ bool tile_list_processor::process_line(char *read_line, const char *list_file,
return false; \
}
- #define CHECK_ARG1 \
- if (m_args.size() <= 1) \
+ #define CHECK_ARG(x) \
+ if (m_args.size() <= x) \
{ \
fprintf(stderr, "Error (%s:%d): " \
"missing arg following '%s'.\n", \
@@ -203,7 +204,7 @@ bool tile_list_processor::process_line(char *read_line, const char *list_file,
if (strcmp(arg, "back") == 0)
{
- CHECK_ARG1;
+ CHECK_ARG(1);
for (unsigned int i = 0; i < m_back.size(); i++)
{
@@ -231,7 +232,7 @@ bool tile_list_processor::process_line(char *read_line, const char *list_file,
}
else if (strcmp(arg, "compose") == 0)
{
- CHECK_ARG1;
+ CHECK_ARG(1);
if (!m_composing)
{
fprintf(stderr, "Error (%s:%d): not composing yet.\n",
@@ -271,7 +272,7 @@ bool tile_list_processor::process_line(char *read_line, const char *list_file,
}
else if (strcmp(arg, "corpse") == 0)
{
- CHECK_ARG1;
+ CHECK_ARG(1);
m_corpsify = (bool)atoi(m_args[1]);
}
else if (strcmp(arg, "end") == 0)
@@ -325,7 +326,7 @@ bool tile_list_processor::process_line(char *read_line, const char *list_file,
}
else if (strcmp(arg, "include") == 0)
{
- CHECK_ARG1;
+ CHECK_ARG(1);
if (!process_list(m_args[1]))
{
fprintf(stderr, "Error (%s:%d): include failed.\n",
@@ -335,7 +336,7 @@ bool tile_list_processor::process_line(char *read_line, const char *list_file,
}
else if (strcmp(arg, "name") == 0)
{
- CHECK_ARG1;
+ CHECK_ARG(1);
if (m_name != "")
{
@@ -349,7 +350,7 @@ bool tile_list_processor::process_line(char *read_line, const char *list_file,
}
else if (strcmp(arg, "parts_ctg") == 0)
{
- CHECK_ARG1;
+ CHECK_ARG(1);
for (unsigned int i = 0; i < m_categories.size(); i++)
{
@@ -368,22 +369,22 @@ bool tile_list_processor::process_line(char *read_line, const char *list_file,
}
else if (strcmp(arg, "prefix") == 0)
{
- CHECK_ARG1;
+ CHECK_ARG(1);
m_prefix = m_args[1];
}
else if (strcmp(arg, "rim") == 0)
{
- CHECK_ARG1;
+ CHECK_ARG(1);
m_rim = (bool)atoi(m_args[1]);
}
else if (strcmp(arg, "sdir") == 0)
{
- CHECK_ARG1;
+ CHECK_ARG(1);
m_sdir = m_args[1];
}
else if (strcmp(arg, "shrink") == 0)
{
- CHECK_ARG1;
+ CHECK_ARG(1);
m_shrink = (bool)atoi(m_args[1]);
}
else if (strcmp(arg, "start") == 0)
@@ -399,6 +400,14 @@ bool tile_list_processor::process_line(char *read_line, const char *list_file,
m_composing = true;
m_compose.unload();
}
+ else if (strcmp(arg, "startvalue") == 0)
+ {
+ CHECK_ARG(2);
+ CHECK_NO_ARG(3);
+
+ m_start_value = m_args[1];
+ m_include = m_args[2];
+ }
else
{
fprintf(stderr, "Error (%s:%d): unknown command '%%%s'\n",
@@ -542,28 +551,38 @@ bool tile_list_processor::write_data()
ucname.c_str(), ucname.c_str());
fprintf(fp, "#include \"tiledef_defines.h\"\n\n");
+ if (!m_include.empty())
+ {
+ fprintf(fp, "#include \"%s\"\n\n", m_include.c_str());
+ }
+
fprintf(fp, "enum tile_%s_type\n{\n", lcname.c_str());
+ std::string start_val = " = ";
+ start_val += m_start_value;
+
for (unsigned int i = 0; i < m_page.m_tiles.size(); i++)
{
const std::string &enumname = m_page.m_tiles[i]->enumname();
const std::string &parts_ctg = m_page.m_tiles[i]->parts_ctg();
if (enumname.empty())
{
- fprintf(fp, " %s_%s_FILLER_%d,\n", m_prefix.c_str(),
- ucname.c_str(), i);
+ fprintf(fp, " %s_%s_FILLER_%d%s,\n", m_prefix.c_str(),
+ ucname.c_str(), i, start_val.c_str());
}
else if (parts_ctg.empty())
{
- fprintf(fp, " %s_%s,\n", m_prefix.c_str(),
- enumname.c_str());
+ fprintf(fp, " %s_%s%s,\n", m_prefix.c_str(),
+ enumname.c_str(), start_val.c_str());
}
else
{
- fprintf(fp, " %s_%s_%s,\n", m_prefix.c_str(),
- parts_ctg.c_str(), enumname.c_str());
+ fprintf(fp, " %s_%s_%s%s,\n", m_prefix.c_str(),
+ parts_ctg.c_str(), enumname.c_str(), start_val.c_str());
}
+ start_val = "";
+
if (!parts_ctg.empty())
{
int idx;
@@ -580,12 +599,11 @@ bool tile_list_processor::write_data()
fprintf(fp, " %s_%s_MAX\n};\n\n", m_prefix.c_str(), ucname.c_str());
- fprintf(fp, "extern int tile_%s_count[%s];\n",
- lcname.c_str(), max.c_str());
- fprintf(fp, "extern const char *tile_%s_name[%s];\n",
- lcname.c_str(), max.c_str());
- fprintf(fp, "extern tile_info tile_%s_info[%s];\n",
- lcname.c_str(), max.c_str());
+ fprintf(fp, "int tile_%s_count(unsigned int idx);\n", lcname.c_str());
+ fprintf(fp, "const char *tile_%s_name(unsigned int idx);\n",
+ lcname.c_str());
+ fprintf(fp, "tile_info &tile_%s_info(unsigned int idx);\n",
+ lcname.c_str());
if (m_categories.size() > 0)
{
@@ -624,14 +642,21 @@ bool tile_list_processor::write_data()
fprintf(fp, "// This file has been automatically generated.\n\n");
fprintf(fp, "#include \"tiledef-%s.h\"\n\n", lcname.c_str());
- fprintf(fp, "int tile_%s_count[%s] =\n{\n",
- lcname.c_str(), max.c_str());
+ fprintf(fp, "int _tile_%s_count[%s - %s] =\n{\n",
+ lcname.c_str(), max.c_str(), m_start_value.c_str());
for (unsigned int i = 0; i < m_page.m_counts.size(); i++)
fprintf(fp, " %d,\n", m_page.m_counts[i]);
fprintf(fp, "};\n\n");
- fprintf(fp, "const char *tile_%s_name[%s] =\n{\n",
- lcname.c_str(), max.c_str());
+ fprintf(fp, "int tile_%s_count(unsigned int idx)\n{\n", lcname.c_str());
+ fprintf(fp, " assert(idx >= %s && idx < %s);\n",
+ m_start_value.c_str(), max.c_str());
+ fprintf(fp, " return _tile_%s_count[idx - %s];\n",
+ lcname.c_str(), m_start_value.c_str());
+ fprintf(fp, "}\n\n");
+
+ fprintf(fp, "const char *_tile_%s_name[%s - %s] =\n{\n",
+ lcname.c_str(), max.c_str(), m_start_value.c_str());
for (unsigned int i = 0; i < m_page.m_tiles.size(); i++)
{
const std::string &enumname = m_page.m_tiles[i]->enumname();
@@ -642,8 +667,16 @@ bool tile_list_processor::write_data()
}
fprintf(fp, "};\n\n");
- fprintf(fp, "tile_info tile_%s_info[%s] =\n{\n",
- lcname.c_str(), max.c_str());
+ fprintf(fp, "const char *tile_%s_name(unsigned int idx)\n{\n",
+ lcname.c_str());
+ fprintf(fp, " assert(idx >= %s && idx < %s);\n",
+ m_start_value.c_str(), max.c_str());
+ fprintf(fp, " return _tile_%s_name[idx - %s];\n",
+ lcname.c_str(), m_start_value.c_str());
+ fprintf(fp, "}\n\n");
+
+ fprintf(fp, "tile_info _tile_%s_info[%s - %s] =\n{\n",
+ lcname.c_str(), max.c_str(), m_start_value.c_str());
for (unsigned int i = 0; i < m_page.m_offsets.size(); i+=4)
{
fprintf(fp, " tile_info(%d, %d, %d, %d, %d, %d, %d, %d),\n",
@@ -654,6 +687,14 @@ bool tile_list_processor::write_data()
}
fprintf(fp, "};\n\n");
+ fprintf(fp, "tile_info &tile_%s_info(unsigned int idx)\n{\n",
+ lcname.c_str());
+ fprintf(fp, " assert(idx >= %s && idx < %s);\n",
+ m_start_value.c_str(), max.c_str());
+ fprintf(fp, " return _tile_%s_info[idx - %s];\n",
+ lcname.c_str(), m_start_value.c_str());
+ fprintf(fp, "}\n\n");
+
if (m_categories.size() > 0)
{
fprintf(fp, "int tile_%s_part_count[%s] =\n{\n",
@@ -671,7 +712,7 @@ bool tile_list_processor::write_data()
for (int i = 0; i < m_categories.size(); i++)
{
- fprintf(fp, " %d,\n", part_min[i]);
+ fprintf(fp, " %d+%s,\n", part_min[i], m_start_value.c_str());
}
fprintf(fp, "};\n\n");