Example #1
0
static void rotting_herbs(void)
{
    static int rule_rot = -1;
    region *r;

    if (rule_rot < 0) {
        rule_rot =
            get_param_int(global.parameters, "rules.economy.herbrot", HERBROTCHANCE);
    }
    if (rule_rot == 0) return;

    for (r = regions; r; r = r->next) {
        unit *u;
        for (u = r->units; u; u = u->next) {
            const struct item_type *it_bag = it_find("magicherbbag");
            item **itmp = &u->items;
            int rot_chance = rule_rot;

            if (it_bag && *i_find(itmp, it_bag)) {
                rot_chance = (rot_chance * 2) / 5;
            }
            while (*itmp) {
                item *itm = *itmp;
                int n = itm->number;
                double k = n * rot_chance / 100.0;
                if (fval(itm->type, ITF_HERB)) {
                    double nv = normalvariate(k, k / 4);
                    int inv = (int)nv;
                    int delta = _min(n, inv);
                    if (!i_change(itmp, itm->type, -delta)) {
                        continue;
                    }
                }
                itmp = &itm->next;
            }
        }
    }
}
Example #2
0
static bool has_ao_healing(const unit *u) {
    item *const* iter = i_findc(&u->items, it_find("ao_healing"));
    return (*iter && (*iter)->number > 0);
}