Esempio n. 1
0
void randomevents(void)
{
    region *r;
    faction *monsters = get_monsters();

    icebergs();
    godcurse();
    orc_growth();
    demon_skillchanges();
    volcano_update();
    /* Monumente zerfallen, Schiffe verfaulen */

    for (r = regions; r; r = r->next) {
        building **blist = &r->buildings;
        while (*blist) {
            building *b = *blist;
            if (fval(b->type, BTF_DECAY) && !building_owner(b)) {
                b->size -= _max(1, (b->size * 20) / 100);
                if (b->size == 0) {
                    remove_building(blist, r->buildings);
                }
            }
            if (*blist == b)
                blist = &b->next;
        }
    }

    /* monster-einheiten desertieren */
    if (monsters) {
        for (r = regions; r; r = r->next) {
            unit *u;

            for (u = r->units; u; u = u->next) {
                if (u->faction && !is_monsters(u->faction)
                        && (u_race(u)->flags & RCF_DESERT)) {
                    if (fval(u, UFL_ISNEW))
                        continue;
                    if (rng_int() % 100 < 5) {
                        ADDMSG(&u->faction->msgs, msg_message("desertion",
                                                              "unit region", u, r));
                        u_setfaction(u, monsters);
                    }
                }
            }
        }
    }

    chaos_update();
#ifdef HERBS_ROT
    rotting_herbs();
#endif

    dissolve_units();
}
Esempio n. 2
0
void randomevents(void)
{
    region *r;
    faction *monsters = get_monsters();

    icebergs();
    godcurse();
    orc_growth();
    demon_skillchanges();

    /* Orkifizierte Regionen mutieren und mutieren zurück */

    for (r = regions; r; r = r->next) {
        if (fval(r, RF_ORCIFIED)) {
            direction_t dir;
            double probability = 0.0;
            for (dir = 0; dir < MAXDIRECTIONS; dir++) {
                region *rc = rconnect(r, dir);
                if (rc && rpeasants(rc) > 0 && !fval(rc, RF_ORCIFIED))
                    probability += 0.02;
            }
            if (chance(probability)) {
                ADDMSG(&r->msgs, msg_message("deorcified", "region", r));
                freset(r, RF_ORCIFIED);
            }
        }
        else {
            attrib *a = a_find(r->attribs, &at_orcification);
            if (a != NULL) {
                double probability = 0.0;
                if (rpeasants(r) <= 0)
                    continue;
                probability = a->data.i / (double)rpeasants(r);
                if (chance(probability)) {
                    fset(r, RF_ORCIFIED);
                    a_remove(&r->attribs, a);
                    ADDMSG(&r->msgs, msg_message("orcified", "region", r));
                }
                else {
                    a->data.i -= _max(10, a->data.i / 10);
                    if (a->data.i <= 0)
                        a_remove(&r->attribs, a);
                }
            }
        }
    }

    /* Vulkane qualmen, brechen aus ... */
    for (r = regions; r; r = r->next) {
        if (r->terrain == newterrain(T_VOLCANO_SMOKING)) {
            if (a_find(r->attribs, &at_reduceproduction)) {
                ADDMSG(&r->msgs, msg_message("volcanostopsmoke", "region", r));
                rsetterrain(r, T_VOLCANO);
            }
            else {
                if (rng_int() % 100 < 12) {
                    ADDMSG(&r->msgs, msg_message("volcanostopsmoke", "region", r));
                    rsetterrain(r, T_VOLCANO);
                }
                else if (r->age > 20 && rng_int() % 100 < 8) {
                    volcano_outbreak(r);
                    rsetterrain(r, T_VOLCANO);
                }
            }
        }
        else if (r->terrain == newterrain(T_VOLCANO)) {
            if (rng_int() % 100 < 4) {
                ADDMSG(&r->msgs, msg_message("volcanostartsmoke", "region", r));
                rsetterrain(r, T_VOLCANO_SMOKING);
            }
        }
    }

    /* Monumente zerfallen, Schiffe verfaulen */

    for (r = regions; r; r = r->next) {
        building **blist = &r->buildings;
        while (*blist) {
            building *b = *blist;
            if (fval(b->type, BTF_DECAY) && !building_owner(b)) {
                b->size -= _max(1, (b->size * 20) / 100);
                if (b->size == 0) {
                    remove_building(blist, r->buildings);
                }
            }
            if (*blist == b)
                blist = &b->next;
        }
    }

    /* monster-einheiten desertieren */
    if (monsters) {
        for (r = regions; r; r = r->next) {
            unit *u;

            for (u = r->units; u; u = u->next) {
                if (u->faction && !is_monsters(u->faction)
                    && (u_race(u)->flags & RCF_DESERT)) {
                    if (fval(u, UFL_ISNEW))
                        continue;
                    if (rng_int() % 100 < 5) {
                        ADDMSG(&u->faction->msgs, msg_message("desertion",
                            "unit region", u, r));
                        u_setfaction(u, monsters);
                    }
                }
            }
        }
    }

    chaos_update();
#ifdef HERBS_ROT
    rotting_herbs();
#endif

    dissolve_units();
}