Added COLOUR: directive to maps to allow custom colouring of features by glyph, and tweaked the strawberry fields variants to use it.
git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@2227 c06c8d41-db1a-0410-9941-cceddc491573
JT672SIJK4BOIUAGL2WQ6NR2NF4PSWP3BT6Q4HMNRF25UN6JQ2MAC
ED62QWGKBPORWVKDFOQRKJXEIWZVNGR3O4KWQBDSRNPT36AYOQYAC
IVVTHLTTLOP5TSULXJWUSSXHOKYWVU3OWKYVK45A7RIB6V34MYQAC
RPOZZWKG5GLPHVZZ7ZKMKS64ZMV2LDCQSARBJFJ6FZOTOKCQO7FAC
JDM27QE4HR52AYFSQE763BFF57ANOTF5MXKMO377PP5EXMN7SAOAC
2ZZD6EYMSPVCXZTICL4VGYGGQRRWDLZ24KBCDBVIYC54OZ4C6GGAC
WKTZHLOJ65WSK6FR5MF7RWGSMZ22T2D6LHB66FV3IPGXIBLYHHNAC
ANBVGN4RZOMY5LI4QSHOV2477FN55H353ZYLSVCPTXC7AWWSQZBAC
W52PCSHX72WAMWKG6L4BPUBVMO6E72KYYBNKAA7554KNOTY6V7WQC
KFJEFN377VIZ7OH2XCYOGCELNEGO4CIOOP7DNXEMX3LFKIKWXVTAC
JQFQX7IWSJ4TYWVUVXAFMCPSAN67PRMNECDQI5WMON2JFMQVVUEQC
MSQI3TH6T62JAXQGLL52QZCWAMC372TGB6ZNNRDGUGMJKBNNV2VAC
7Y5HSDFKA5TPLS2TWTRFMQVX6UXUDHXU5MUMXQSDFAIY4THQ3BIQC
NCDWWDJQLAU5ORSAQGZKJJ5E22VTDGGPJMVVBWQFHQ2B3U3UFHDQC
34C4U6EQWERY75GZJKUCM5KVGU2OUICETS5LGZF6RMKMZT4R5SQAC
AAAUQAV76BL63J4HPATVE67LJD4L6OES4A2XODS2OGISOFYQY3XQC
GQL5SIGBHLU3FMCE54XVGLRY5AZHRM6DUEB722REA2DPLGJSN6EQC
AUXHSGS4EFOPZ6TVZYWNVOUDO7NYKUKE3HBKGQQWTALSVFOE3HAAC
K2CS6TCX2NDVL2ASEHGP4J4K4IJ6FP3ANNKTSIWVG43HPYSBX6ZQC
A3CO4KBFTFU3ZSHWRY2OPPX3MMTFV7OUCZGL7Q4Y2FU7JO4AP7MAC
K6ELQ4HEZYDROC7CJFLPJS64AAJQ4G6RVLL4GBRUG6FJMKSBDDIQC
FSD7GIK3YLZXWLEH37BU6KV3IUCFGXPQL6IZ7H65YWNRBEKDBX5AC
LDGIQP4A5BWVFQWQ2MGZRM5OY45ZXNNARH4WZPLUTBJVS4CVHISQC
56C44YMFHZ62GXAAOLYSLLGBVGRWXB53W2VI37Q26ZECEK2XG5SQC
3PY3L3A4QRW3Z5Y7SHO4TMVOOP2VNCO27X2MX4DTOP2SADLBQUOAC
VCISXSXE6WGRO6PQN7Y6IFZ7C4VFUMKQK6KGAXA6YZ5RCZIB64WAC
H3552BCIAVBLKAYKE4DHFLBLFW5RGRMYBMRRYHYEB5IPIJRUVU5QC
U3KGUJJQWQORJIIFH3ADVNIEEX5HOX6KEOXO7DJSL7L3Z6GG3PAQC
KW43PGXTTM57DXUGGBQXJ5G5OYYIY3WB76TXIKL2ZCIJGH7GH4LAC
typedef std::pair<int, int> map_weighted_colour;
typedef std::vector<map_weighted_colour> map_colour_list;
struct colour_spec : public map_transformer
{
public:
colour_spec(int _key, bool _fix, const map_colour_list &clist)
: key(_key), fix(_fix), fixed_colour(BLACK), colours(clist)
{
}
std::string apply_transform(map_lines &map);
transform_type type() const { return TT_COLOUR; }
std::string describe() const;
int get_colour();
: transforms(), markers(), lines(), map_width(0),
solid_north(false), solid_east(false), solid_south(false),
solid_west(false), solid_checked(false)
: transforms(), markers(), lines(), colour_overlay(),
map_width(0), solid_north(false), solid_east(false),
solid_south(false), solid_west(false), solid_checked(false)
}
void map_lines::apply_colours(const coord_def &c)
{
if (!colour_overlay.get())
return;
const Matrix<int> &overlay = *colour_overlay;
for (int y = height() - 1; y >= 0; --y)
for (int x = width() - 1; x >= 0; --x)
{
const int colour = overlay(x, y);
if (colour)
env.grid_colours(c + coord_def(x, y)) = colour;
}
}
void map_lines::apply_overlays(const coord_def &c)
{
apply_markers(c);
apply_colours(c);
std::string map_lines::parse_weighted_colours(const std::string &cspec,
map_colour_list &colours) const
{
std::vector<std::string> cspeclist = split_string("/", cspec);
for (int i = 0, size = cspeclist.size(); i < size; ++i)
{
std::string col = cspeclist[i];
lowercase(col);
int weight = find_weight(col);
if (weight == TAG_UNFOUND)
{
// :number suffix?
std::string::size_type cpos = col.find(':');
if (cpos != std::string::npos)
{
weight = atoi(col.substr(cpos + 1).c_str());
if (weight <= 0)
weight = 10;
col.erase(cpos);
trim_string(col);
}
}
const int colour = col == "none"? BLACK : str_to_colour(col, -1);
if (colour != -1)
colours.push_back(map_weighted_colour(colour, weight));
else
return make_stringf("bad colour spec: '%s' in '%s'",
col.c_str(), cspec.c_str());
}
return ("");
}
std::string map_lines::add_colour(const std::string &sub)
{
std::string s = trimmed_string(sub);
if (s.empty())
return ("");
int sep = 0;
std::string key;
std::string substitute;
std::string err = split_key_item(sub, &key, &sep, &substitute);
if (!err.empty())
return (err);
map_colour_list colours;
err = parse_weighted_colours(substitute, colours);
if (!err.empty())
return (err);
transforms.push_back( new colour_spec( key[0], sep == ':', colours ) );
return ("");
}
void map_lines::overlay_colours(colour_spec &spec)
{
if (!colour_overlay.get())
colour_overlay.reset( new Matrix<int>(width(), height(), BLACK) );
for (int y = 0, ysize = lines.size(); y < ysize; ++y)
{
std::string::size_type pos = 0;
while ((pos = lines[y].find(spec.key, pos)) != std::string::npos)
{
(*colour_overlay)(pos, y) = spec.get_colour();
++pos;
}
}
}
std::string nsubst_spec::describe() const
//////////////////////////////////////////////////////////////////////////
// colour_spec
std::string colour_spec::apply_transform(map_lines &map)
{
map.overlay_colours(*this);
return ("");
}
std::string colour_spec::describe() const
syn keyword desDeclarator NAME: ORIENT: DEPTH: PLACE: MONS: FLAGS: default-depth: TAGS: CHANCE: WEIGHT: ITEM: KFEAT: KMONS: KITEM:
syn keyword desDeclarator NAME: ORIENT: DEPTH: PLACE: MONS: FLAGS: default-depth: TAGS: CHANCE: WEIGHT: ITEM: KFEAT: KMONS: KITEM: COLOUR:
void init(const Z &initial);
Z &operator () (int x, int y)
{
return data[x + y * width];
}
const Z &operator () (int x, int y) const
{
return data[x + y * width];
}
private:
Z *data;
int width, height, size;
};
template <typename Z>
Matrix<Z>::Matrix(int _width, int _height, const Z &initial)
: data(NULL), width(_width), height(_height), size(_width * _height)
{
data = new Z [ size ];
init(initial);
}
template <typename Z>
Matrix<Z>::Matrix(int _width, int _height)
: data(NULL), width(_width), height(_height), size(_width * _height)
{
data = new Z [ size ];
}
template <typename Z>
Matrix<Z>::~Matrix()
{
delete [] data;
}
template <typename Z>
void Matrix<Z>::init(const Z &initial)
{
for (int i = 0; i < size; ++i)
data[i] = initial;
}