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));elsereturn 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_specstd::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;}