From 72878c57884ed2c27dcbea1b660461d634d16cba Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Thu, 4 Jun 2009 20:52:42 +0000 Subject: [PATCH] - per-race morale improvements - data-driven peasant multiplier - lower cavalry bonus against trolls - armor-limitations (goblins&pp) --- src/common/gamecode/economy.c | 12 +++--- src/common/gamecode/laws.c | 27 +++++++++---- src/common/gamecode/report.c | 17 ++++---- src/common/kernel/battle.c | 36 ++++++++++------- src/common/kernel/eressea.c | 10 +++++ src/common/kernel/eressea.h | 1 + src/common/kernel/race.h | 1 + src/common/kernel/region.c | 1 + src/common/kernel/region.h | 4 +- src/common/kernel/save.c | 2 + src/common/kernel/xmlreader.c | 1 + src/res/common/armor.xml | 69 ++++--------------------------- src/res/common/resources.xml | 76 ++++------------------------------- src/res/e2k9.xml | 16 ++++---- src/res/e2k9/items.xml | 13 ------ src/res/e2k9/races.xml | 25 +++++++----- src/res/e2k9/strings.xml | 4 ++ src/res/races.xml | 1 + src/scripts/e2k9/items.lua | 6 +++ 19 files changed, 123 insertions(+), 199 deletions(-) diff --git a/src/common/gamecode/economy.c b/src/common/gamecode/economy.c index 334c00d77..0a7a3b97d 100644 --- a/src/common/gamecode/economy.c +++ b/src/common/gamecode/economy.c @@ -377,11 +377,10 @@ do_recruiting(recruitment * recruits, int available) for (req=rec->requests;req;req=req->next) { unit * u = req->unit; const race * rc = u->faction->race; - int number, multi = 2; + int number, dec; + float multi = 2.0F * rc->recruit_multi; - if (rc==new_race[RC_URUK]) multi = 1; - - number = MIN(req->qty, get / multi); + number = MIN(req->qty, (int)(get / multi)); if (rc->recruitcost) { int afford = get_pooled(u, oldresourcetype[R_SILVER], GET_DEFAULT, number*rc->recruitcost) / rc->recruitcost; number = MIN(number, afford); @@ -393,11 +392,12 @@ do_recruiting(recruitment * recruits, int available) assert(number>=0); } add_recruits(u, number, req->qty); + dec = (int)(number * multi); if ((rc->ec_flags & ECF_REC_ETHEREAL)==0) { - recruited += number * multi; + recruited += dec; } - get -= number * multi; + get -= dec; } } return recruited; diff --git a/src/common/gamecode/laws.c b/src/common/gamecode/laws.c index 998057b57..8e9f88e56 100644 --- a/src/common/gamecode/laws.c +++ b/src/common/gamecode/laws.c @@ -2934,19 +2934,30 @@ age_building(building * b) return b; } +static double rc_popularity(const struct race * rc) +{ + int pop = get_param_int(rc->parameters, "morale", 10); + return 1.0/(pop-MORALE_COOLDOWN); /* 10 turns average */ +} + static void age_region(region * r) { a_age(&r->attribs); handle_event(r->attribs, "timer", r); - if (r->land && r->land->ownership) { - int stability = r->land->ownership->since_turn; - int morale = MORALE_TAKEOVER + stability/10; - if (r->land->ownership->owner && r->land->moraleland->morale = (short)MIN(morale, MORALE_MAX); - } - if (!r->land->ownership->owner && r->land->moraleland->morale = (short)MIN(morale, MORALE_DEFAULT); + if (r->land && r->land->ownership && r->land->ownership->owner) { + int stability = turn - r->land->ownership->morale_turn; + if (stability>MORALE_COOLDOWN) { + if (r->land->ownership->owner && r->land->moraleland->ownership->owner->race); + if (chance(ch)) { + ++r->land->morale; + r->land->ownership->morale_turn = turn; + } + } + if (!r->land->ownership->owner && r->land->moraleland->morale = (short)MIN(r->land->morale, MORALE_DEFAULT); + } } } } diff --git a/src/common/gamecode/report.c b/src/common/gamecode/report.c index 8aaf4338d..e3d086516 100644 --- a/src/common/gamecode/report.c +++ b/src/common/gamecode/report.c @@ -671,19 +671,18 @@ nr_unit(FILE * F, const faction * f, const unit * u, int indent, int mode) if (u->faction == f) { marker = '*'; + } else if (u->faction->alliance == f->alliance && f->alliance) { + marker = 'o'; + } else if (a_otherfaction && f != u->faction && get_otherfaction(a_otherfaction) == f + && !fval(u, UFL_PARTEITARNUNG)) { + marker = '!'; } else { - if (a_otherfaction && f != u->faction && get_otherfaction(a_otherfaction) == f - && !fval(u, UFL_PARTEITARNUNG)) { - marker = '!'; + if (dh && !fval(u, UFL_PARTEITARNUNG)) { + marker = '+'; } else { - if (dh && !fval(u, UFL_PARTEITARNUNG)) { - marker = '+'; - } else { - marker = '-'; - } + marker = '-'; } } - rparagraph(F, buf, indent, 0, marker); if (!isbattle) { diff --git a/src/common/kernel/battle.c b/src/common/kernel/battle.c index 42f7d3bd0..544f71d4b 100644 --- a/src/common/kernel/battle.c +++ b/src/common/kernel/battle.c @@ -636,10 +636,11 @@ select_weapon(const troop t, boolean attacking, boolean ismissile) return preferred_weapon(t, attacking); } -static boolean can_use(const unit * u, const weapon_type * wtype) +static boolean +i_canuse(const unit * u, const item_type * itype) { - if (wtype->itype->canuse) { - return wtype->itype->canuse(u, wtype->itype); + if (itype->canuse) { + return itype->canuse(u, itype); } return true; } @@ -688,7 +689,7 @@ weapon_skill(const weapon_type * wtype, const unit * u, boolean attacking) } } else { /* changed: if we own a weapon, we have at least a skill of 0 */ - if (!can_use(u, wtype)) return -1; + if (!i_canuse(u, wtype->itype)) return -1; skill = effskill(u, wtype->skill); if (skill < wtype->minskill) skill = 0; if (skill > 0) { @@ -719,7 +720,7 @@ static int CavalrySkill(void) } static int -CavalryBonus(const unit * u) +CavalryBonus(const unit * u, troop enemy) { static int mode = -1; if (mode<0) { @@ -731,7 +732,12 @@ CavalryBonus(const unit * u) } else { /* new rule, chargers in Eressea 1.1 */ int skl = effskill(u, SK_RIDING); - skl = skl*3/2-3; + /* only half against trolls */ + if (enemy.fighter->unit->race==new_race[RC_TROLL]) { + skl = (skl-2)*3/4; + } else { + skl = (skl-2)*3/2; + } return MAX(skl, 0); } } @@ -784,7 +790,7 @@ weapon_effskill(troop t, troop enemy, const weapon * w, boolean attacking, boole /* Burgenbonus, Pferdebonus */ if (is_riding(t) && (wtype==NULL || (fval(wtype, WTF_HORSEBONUS) && !fval(wtype, WTF_MISSILE)))) { - skill += CavalryBonus(tu); + skill += CavalryBonus(tu, enemy); if (wtype) skill = skillmod(urace(tu)->attribs, tu, tu->region, wtype->skill, skill, SMF_RIDING); } @@ -3307,14 +3313,16 @@ make_fighter(battle * b, unit * u, side * s1, boolean attack) if (u->race->battle_flags & BF_EQUIPMENT) { for (itm=u->items; itm; itm=itm->next) { if (itm->type->rtype->atype) { - struct armor * adata = malloc(sizeof(armor)), **aptr; - adata->atype = itm->type->rtype->atype; - adata->count = itm->number; - for (aptr=&fig->armors;*aptr;aptr=&(*aptr)->next) { - if (adata->atype->prot > (*aptr)->atype->prot) break; + if (i_canuse(u, itm->type)) { + struct armor * adata = malloc(sizeof(armor)), **aptr; + adata->atype = itm->type->rtype->atype; + adata->count = itm->number; + for (aptr=&fig->armors;*aptr;aptr=&(*aptr)->next) { + if (adata->atype->prot > (*aptr)->atype->prot) break; + } + adata->next = *aptr; + *aptr = adata; } - adata->next = *aptr; - *aptr = adata; } } } diff --git a/src/common/kernel/eressea.c b/src/common/kernel/eressea.c index 77aa35b6c..1e6374a27 100644 --- a/src/common/kernel/eressea.c +++ b/src/common/kernel/eressea.c @@ -2165,6 +2165,16 @@ get_param_int(const struct param * p, const char * key, int def) return def; } +float +get_param_flt(const struct param * p, const char * key, float def) +{ + while (p!=NULL) { + if (strcmp(p->name, key)==0) return (float)atof(p->data); + p = p->next; + } + return def; +} + void set_param(struct param ** p, const char * key, const char * data) { diff --git a/src/common/kernel/eressea.h b/src/common/kernel/eressea.h index 347ebca98..5b5be1615 100644 --- a/src/common/kernel/eressea.h +++ b/src/common/kernel/eressea.h @@ -394,6 +394,7 @@ extern const char * dbrace(const struct race * rc); extern void set_param(struct param ** p, const char * name, const char * data); extern const char* get_param(const struct param * p, const char * name); extern int get_param_int(const struct param * p, const char * name, int def); +extern float get_param_flt(const struct param * p, const char * name, float def); extern boolean ExpensiveMigrants(void); extern int NMRTimeout(void); diff --git a/src/common/kernel/race.h b/src/common/kernel/race.h index bc1e1b101..e67486eb4 100644 --- a/src/common/kernel/race.h +++ b/src/common/kernel/race.h @@ -58,6 +58,7 @@ typedef struct race { float magres; float maxaura; /* Faktor auf Maximale Aura */ float regaura; /* Faktor auf Regeneration */ + float recruit_multi; /* Faktor für Bauernverbrauch */ int recruitcost; int maintenance; int splitsize; diff --git a/src/common/kernel/region.c b/src/common/kernel/region.c index 72038127f..95d20796a 100644 --- a/src/common/kernel/region.c +++ b/src/common/kernel/region.c @@ -1356,6 +1356,7 @@ region_set_owner(struct region * r, struct faction * owner, int turn) } r->land->ownership->owner = owner; r->land->ownership->since_turn = turn; + r->land->ownership->morale_turn = turn; } } diff --git a/src/common/kernel/region.h b/src/common/kernel/region.h index 9a4bccbca..da852fae7 100644 --- a/src/common/kernel/region.h +++ b/src/common/kernel/region.h @@ -65,10 +65,12 @@ struct item; #define MORALE_MAX 4 /* Maximum morale allowed */ #define MORALE_DEFAULT 2 /* Morale of peasants when they are conquered for the first time */ #define MORALE_TAKEOVER 0 /* Morale of peasants after they lose their lord */ +#define MORALE_COOLDOWN 2 /* minimum cooldown before a morale change occurs */ typedef struct region_owner { struct faction * owner; - int since_turn; + int since_turn; /* turn the region changed owners */ + int morale_turn; /* turn when morale has changed most recently */ } region_owner; typedef struct demand { diff --git a/src/common/kernel/save.c b/src/common/kernel/save.c index 17b1e40fc..165916329 100644 --- a/src/common/kernel/save.c +++ b/src/common/kernel/save.c @@ -601,6 +601,7 @@ write_owner(struct storage * store, region_owner *owner) { if (owner) { store->w_int(store, owner->since_turn); + store->w_int(store, owner->morale_turn); write_faction_reference(owner->owner, store); } else { store->w_int(store, -1); @@ -614,6 +615,7 @@ read_owner(struct storage * store, region_owner **powner) if (since_turn>=0) { region_owner * owner = malloc(sizeof(region_owner)); owner->since_turn = since_turn; + owner->morale_turn = store->r_int(store); read_reference(&owner->owner, store, read_faction_reference, resolve_faction); *powner = owner; } else { diff --git a/src/common/kernel/xmlreader.c b/src/common/kernel/xmlreader.c index ca8120419..92e71a83f 100644 --- a/src/common/kernel/xmlreader.c +++ b/src/common/kernel/xmlreader.c @@ -1623,6 +1623,7 @@ parse_races(xmlDocPtr doc) parse_param(&rc->parameters, child); } } + rc->recruit_multi = get_param_flt(rc->parameters, "recruit_multi", 1.0); /* reading eressea/races/race/skill */ xpath->node = node; diff --git a/src/res/common/armor.xml b/src/res/common/armor.xml index dbf673144..75691106e 100644 --- a/src/res/common/armor.xml +++ b/src/res/common/armor.xml @@ -2,67 +2,12 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + diff --git a/src/res/common/resources.xml b/src/res/common/resources.xml index 434ee5210..3f9ab8ad3 100644 --- a/src/res/common/resources.xml +++ b/src/res/common/resources.xml @@ -1,74 +1,12 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + diff --git a/src/res/e2k9.xml b/src/res/e2k9.xml index 09bf97bae..88a20cb93 100644 --- a/src/res/e2k9.xml +++ b/src/res/e2k9.xml @@ -7,30 +7,32 @@ - - - + + + - + - - - + + + + + diff --git a/src/res/e2k9/items.xml b/src/res/e2k9/items.xml index 48bea9a87..c2351510a 100644 --- a/src/res/e2k9/items.xml +++ b/src/res/e2k9/items.xml @@ -1,19 +1,6 @@ - - - - - - - - - - - - - diff --git a/src/res/e2k9/races.xml b/src/res/e2k9/races.xml index dfbacfdb0..44fbfdf59 100644 --- a/src/res/e2k9/races.xml +++ b/src/res/e2k9/races.xml @@ -3,12 +3,13 @@ - + - - - + + + + @@ -58,12 +59,14 @@ - - + + - - + + + + @@ -73,8 +76,9 @@ - - + + + @@ -88,6 +92,7 @@ + diff --git a/src/res/e2k9/strings.xml b/src/res/e2k9/strings.xml index 866e305e5..9870cb085 100644 --- a/src/res/e2k9/strings.xml +++ b/src/res/e2k9/strings.xml @@ -7,6 +7,10 @@ _a: including article (ein Troll, a troll) --> + + des dritten Zeitalters + the third age + Wachstube guard house diff --git a/src/res/races.xml b/src/res/races.xml index 8235c8307..93ed7cb3f 100644 --- a/src/res/races.xml +++ b/src/res/races.xml @@ -1293,6 +1293,7 @@ + diff --git a/src/scripts/e2k9/items.lua b/src/scripts/e2k9/items.lua index 3b42d3d39..924472580 100644 --- a/src/scripts/e2k9/items.lua +++ b/src/scripts/e2k9/items.lua @@ -1,10 +1,16 @@ -- used internally to check greatbow and towershield function item_canuse(u, iname) if iname=="towershield" then + -- only dwarves allowed to use towershield return u.race=="dwarf" end if iname=="greatbow" then + -- only elves use greatbow return u.race=="elf" end + if iname=="plate" then + -- goblins cannot use plate + return u.race~="goblin" + end return true end