TARNE PARTEI NUMMER <NR> auch wenn man die Partei nicht sieht
This commit is contained in:
Enno Rehling 2004-12-03 19:08:00 +00:00
parent a436127625
commit 3691f8c9ca
5 changed files with 1155 additions and 1226 deletions

View File

@ -665,8 +665,6 @@ horses(region * r)
assert(rhorses(r) >= 0); assert(rhorses(r) >= 0);
} }
#if GROWING_TREES
static int static int
count_race(const region *r, const race *rc) count_race(const region *r, const race *rc)
{ {
@ -811,95 +809,6 @@ trees(region * r, const int current_season, const int last_weeks_season)
} }
} }
} }
#else
static void
trees(region * r)
{
int i, maxtrees;
int tree = rtrees(r);
direction_t d;
/* Bäume vermehren sich. m ist die Anzahl Bäume, für die es Land
* gibt. Der Wald besiedelt keine bebauten Gebiete, wird den Pferden
* aber Land wegnehmen. Gibt es zuviele Bauern, werden sie den Wald
* nicht fällen, sondern verhungern. Der Wald kann nur von Spielern gefällt
* werden! Der Wald wandert nicht. Auch bei magischen Terrainveränderungen
* darf m nicht negativ werden! */
if(production(r) <= 0) return;
maxtrees = production(r) - rpeasants(r)/MAXPEASANTS_PER_AREA;
maxtrees = max(0, maxtrees);
/* Solange es noch freie Plätze gibt, darf jeder Baum versuchen, sich
* fortzupflanzen. Da Bäume nicht sofort eingehen, wenn es keinen
* Platz gibt (wie zB. die Pferde), darf nicht einfach drauflos vermehrt
* werden und dann ein min () gemacht werden, sondern es muß auf diese
* Weise vermehrt werden. */
if(is_cursed(r->attribs, C_CURSED_BY_THE_GODS, 0)) {
tree = (int)(tree*0.9);
} else if(maxtrees > 0) {
int growth = (int)((FORESTGROWTH * 200 * ((maxtrees*1.2)-tree))/maxtrees);
growth = max(FORESTGROWTH*50, growth);
growth = min(FORESTGROWTH*400, growth);
/* printf("Trees: <%d> %d -> ", growth, tree); */
for(i=0;i<tree;i++) {
if(rand()%10000 < growth) tree++;
}
/* printf("%d (max: %d)\n", tree, maxtrees); */
}
/* Bäume breiten sich in Nachbarregionen aus.
* warnung: früher kamen bäume aus nachbarregionen, heute
* gehen sie von der aktuellen in die benachbarten.
* Die Chance, das ein Baum in eine Region r2 einwandert, ist
* (production-rtrees(r2))/10000.
* Die Richtung, in der sich ein Baum vermehrt, ist zufällig.
* Es ibt also genausoviel Versuche, in einen Geltscher zu
* wandern, wie in eine ebene - nur halt weniger Erfolge.
* Die Summe der Versuche ist rtrees(r), jeder Baum
* versucht es also einmal pro Woche, mit maximal 10% chance
* (wenn ein voller wald von lauter leeren ebenen umgeben ist)
*/
for (d=0;d!=MAXDIRECTIONS;++d) {
region * r2 = rconnect(r, d);
if (r2
&& (terrain[r2->terrain].flags & WALK_INTO)
&& fval(r2, RF_MALLORN) == fval(r, RF_MALLORN)) {
/* Da hier rtrees(r2) abgefragt wird, macht es einen Unterschied,
* ob das wachstum in r2 schon stattgefunden hat, oder nicht.
* leider nicht einfach zu verhindern */
int pt = (production(r2)-rtrees(r2));
pt = tree*max(0, pt) /
(MAXDIRECTIONS*terrain[T_PLAIN].production_max*10);
if (fval(r2, RF_MIGRATION))
rsettrees(r2, rtrees(r2) + pt);
else {
migration * nb;
/* haben wir die Migration schonmal benutzt?
* wenn nicht, müssen wir sie suchen.
* Wandernde Pferde vermehren sich nicht.
*/
nb = get_migrants(r2);
nb->trees += pt;
}
}
}
rsettrees(r, tree);
assert(tree >= 0);
/* Jetzt die Kräutervermehrung. Vermehrt wird logistisch:
*
* Jedes Kraut hat eine Wahrscheinlichkeit von (100-(vorhandene
* Kräuter))% sich zu vermehren. */
for(i = rherbs(r); i > 0; i--) {
if (rand()%100 < (100-rherbs(r))) rsetherbs(r, (short)(rherbs(r)+1));
}
}
#endif
#if NEW_RESOURCEGROWTH == 0 #if NEW_RESOURCEGROWTH == 0
extern attrib_type at_laen; extern attrib_type at_laen;

View File

@ -225,16 +225,36 @@ setstealth_cmd(unit * u, struct order * ord)
a_removeall(&u->attribs, &at_otherfaction); a_removeall(&u->attribs, &at_otherfaction);
} else { } else {
struct faction * f = findfaction(nr); struct faction * f = findfaction(nr);
/* TODO: Prüfung ob Partei sichtbar */
if(f==NULL) { if(f==NULL) {
cmistake(u, ord, 66, MSG_EVENT); cmistake(u, ord, 66, MSG_EVENT);
} else { } else {
attrib *a; region * lastr = NULL;
a = a_find(u->attribs, &at_otherfaction); /* for all units mu of our faction, check all the units in the region
* they are in, if their visible faction is f, it's ok. use lastr to
* avoid testing the same region twice in a row. */
unit * mu = u->faction->units;
while (mu!=NULL) {
unit * ru = mu->region->units;
if (mu->region==lastr) continue;
while (ru!=NULL) {
attrib *a = a_find(ru->attribs, &at_otherfaction);
if (a) {
faction *fv = get_otherfaction(a);
if (fv==f) break;
}
ru = ru->next;
}
if (ru!=NULL) break;
lastr = mu->region;
mu = mu->nextF;
}
if (mu!=NULL) {
attrib * a = a_find(u->attribs, &at_otherfaction);
if (!a) a = a_add(&u->attribs, make_otherfaction(f)); if (!a) a = a_add(&u->attribs, make_otherfaction(f));
else a->data.v = f; else a->data.v = f;
} }
} }
}
} else { } else {
cmistake(u, ord, 289, MSG_EVENT); cmistake(u, ord, 289, MSG_EVENT);
} }

View File

@ -33,7 +33,7 @@ extern int setwere_cmd(struct unit * u, struct order * ord);
extern int setstealth_cmd(struct unit * u, struct order * ord); extern int setstealth_cmd(struct unit * u, struct order * ord);
extern int spy_cmd(struct unit * u, struct order * ord); extern int spy_cmd(struct unit * u, struct order * ord);
extern int sabotage_cmd(struct unit * u, struct order * ord); extern int sabotage_cmd(struct unit * u, struct order * ord);
void spy_message(int spy, struct unit *u, struct unit *target); extern void spy_message(int spy, struct unit *u, struct unit *target);
#define OCEAN_SWIMMER_CHANCE 0.1 #define OCEAN_SWIMMER_CHANCE 0.1
#define CANAL_SWIMMER_CHANCE 0.9 #define CANAL_SWIMMER_CHANCE 0.9