CLO5METZJ4WBV3KWGW3WJ4WY5NYWCOHCGEIMJU4NYWKECWQ536QAC
LE5U6CTXEIETQN5GOVYF2K2VCISRXR3ULORXDKIKWYDVBG5GS3WAC
OYTCBRC7LE44EUVRZVYTOOVKQWJ6P6YE3FXTOGUTNKEMLNWPHKSQC
ED62QWGKBPORWVKDFOQRKJXEIWZVNGR3O4KWQBDSRNPT36AYOQYAC
RPOZZWKG5GLPHVZZ7ZKMKS64ZMV2LDCQSARBJFJ6FZOTOKCQO7FAC
FQ7XALBL6NZAGBKKYIFHYQ7MUWIHR4TEU4TCS33EG4I3JTND5SQAC
W52PCSHX72WAMWKG6L4BPUBVMO6E72KYYBNKAA7554KNOTY6V7WQC
NVSFIV2ZKP44XHCSCXG6OZVGL67OIFINC34J2EMKTA4KULCERUEAC
RZHJQU3Y6KKMNJKGL6P4IXBJTKWFO4YARAQSWYCETXXNSZG4BN7QC
JT672SIJK4BOIUAGL2WQ6NR2NF4PSWP3BT6Q4HMNRF25UN6JQ2MAC
JUCA26S3JSQFMZTBL7566ITHCOXXEFTFT7KDOWSUXA5JLZK5QJWAC
IVVTHLTTLOP5TSULXJWUSSXHOKYWVU3OWKYVK45A7RIB6V34MYQAC
JQFQX7IWSJ4TYWVUVXAFMCPSAN67PRMNECDQI5WMON2JFMQVVUEQC
2ZZD6EYMSPVCXZTICL4VGYGGQRRWDLZ24KBCDBVIYC54OZ4C6GGAC
GQL5SIGBHLU3FMCE54XVGLRY5AZHRM6DUEB722REA2DPLGJSN6EQC
AUXHSGS4EFOPZ6TVZYWNVOUDO7NYKUKE3HBKGQQWTALSVFOE3HAAC
CPBVQFT7NWEYLYD34D5VYZIEOZ32YADXYTSFMS635YNXX4OFIZVAC
TPO6FNMPNUSWH4NCKO3VLYNAADEPSAXLUITCCACLZZSY53PKA62QC
K2CS6TCX2NDVL2ASEHGP4J4K4IJ6FP3ANNKTSIWVG43HPYSBX6ZQC
WUCXHWMF2FL5KCC6E6KNKMYL2NBXXC3WVRY2AUPWSBAPWJFGS34QC
SDLKLUNFGVKDS55DDJZCBAVIB7NL3RRYPTACAY65SCUQKV6APFSAC
};
typedef std::pair<int, int> map_weighted_fprop;
class map_fprop_list : public std::vector<map_weighted_fprop>
{
public:
bool parse(const std::string &fp, int weight);
};
class fprop_spec
{
public:
fprop_spec(int _key, bool _fix, const map_fprop_list &flist)
: key(_key), fix(_fix), fixed_prop(FPROP_NONE), fprops(flist)
{
}
int get_property();
public:
int key;
bool fix;
int fixed_prop;
map_fprop_list fprops;
bool map_fprop_list::parse(const std::string &fp, int weight)
{
const int fprop = fp == "none" ? FPROP_NONE : str_to_fprop(fp);
if (fprop == -1)
return false;
push_back(map_weighted_fprop(fprop, weight));
return true;
}
std::string map_lines::add_fproperty(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 = mapdef_split_key_item(sub, &key, &sep, &substitute);
if (!err.empty())
return (err);
map_fprop_list fprops;
err = parse_weighted_str<map_fprop_list>(substitute, fprops);
if (!err.empty())
return (err);
fprop_spec spec(key[0], sep == ':', fprops);
overlay_fprops(spec);
return ("");
}
// fprop_spec
int fprop_spec::get_property()
{
if (fixed_prop != FPROP_NONE)
return (fixed_prop);
int chosen = FPROP_NONE;
int cweight = 0;
for (int i = 0, size = fprops.size(); i < size; ++i)
if (x_chance_in_y(fprops[i].second, cweight += fprops[i].second))
chosen = fprops[i].first;
if (fix)
fixed_prop = chosen;
return (chosen);
}
//////////////////////////////////////////////////////////////////////////