From 32bc84c970396ee36bf4126247d46817b085414f Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Wed, 6 Feb 2002 08:06:02 +0000 Subject: [PATCH] =?UTF-8?q?*=20Prefix=20im=20CR=20repariert.=20*=20RACE=5F?= =?UTF-8?q?ADJUSTMENT=20korrekt=20deaktiviert.=20*=20Schiffe=20werden=20nu?= =?UTF-8?q?r=20noch=20besch=C3=A4digt,=20wenn=20der=20Kampf=20f=C3=BCr=20s?= =?UTF-8?q?ie=20relevant=20war.=20*=20Erneute=20Reparatur=20f=C3=BCr=20Reg?= =?UTF-8?q?ionen=20ohne=20demand.=20*=20K=C3=84MPFE=20HELFE=20NICHT=20repa?= =?UTF-8?q?riert.=20*=20Setzen=20des=20Kampfzaubers=20ohne=20Stufenangabe?= =?UTF-8?q?=20setzt=20die=20Stufe=20auf=200=20(=3Dmax)=20*=20=C3=9Cbersetz?= =?UTF-8?q?ung=20des=20HP-Status=20im=20Report=20*=20Teil=C3=BCbersetzung?= =?UTF-8?q?=20der=20Spionage-Reports.=20*=20locale=5Fstring()=20liefert=20?= =?UTF-8?q?auf=20NULL=20wieder=20NULL=20zur=C3=BCck=20(statt=20crash).?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/common/gamecode/creport.c | 15 +-- src/common/gamecode/economy.c | 65 ++++++------ src/common/gamecode/laws.c | 10 +- src/common/gamecode/randenc.c | 185 ++++++++++++++++++---------------- src/common/kernel/battle.c | 24 ++--- src/common/kernel/eressea.c | 2 +- src/common/kernel/eressea.h | 13 +-- src/common/kernel/movement.c | 20 ++-- src/common/kernel/reports.c | 31 +++--- src/common/kernel/ship.h | 8 +- src/common/util/language.c | 49 ++++----- src/eressea/korrektur.c | 6 +- src/res/de/messages.xml | 18 ++-- src/res/de/strings.xml | 21 ++++ 14 files changed, 253 insertions(+), 214 deletions(-) diff --git a/src/common/gamecode/creport.c b/src/common/gamecode/creport.c index 69db4dde6..928d05f31 100644 --- a/src/common/gamecode/creport.c +++ b/src/common/gamecode/creport.c @@ -547,14 +547,17 @@ cr_output_unit(FILE * F, const region * r, const attrib *a_otherfaction = a_find(u->attribs, &at_otherfaction); /* my own faction, full info */ const attrib * a = a_find(u->attribs, &at_group); + const attrib * ap = 0; if (a) { const group * g = (const group*)a->data.v; - const attrib *a = a_find(g->attribs, &at_raceprefix); + ap = a_find(g->attribs, &at_raceprefix); fprintf(F, "%d;gruppe\n", g->gid); - if (a) { - const char * name = (const char*)a->data.v; - fprintf(F, "\"%s\";typprefix\n", add_translation(name, LOC(f->locale, name))); - } + } else { + ap = a_find(u->faction->attribs, &at_raceprefix); + } + if (ap) { + const char * name = (const char*)a->data.v; + fprintf(F, "\"%s\";typprefix\n", add_translation(name, LOC(f->locale, name))); } fprintf(F, "%d;Partei\n", u->faction->no); if (sf!=u->faction) fprintf(F, "%d;Verkleidung\n", sf->no); @@ -642,7 +645,7 @@ cr_output_unit(FILE * F, const region * r, fprintf(F, "\"%s\";privat\n", c); c = hp_status(u); if (c && *c && (u->faction == f || omniscient(f))) - fprintf(F, "\"%s\";hp\n", c); + fprintf(F, "\"%s\";hp\n", add_translation(c, locale_string(u->faction->locale, c))); if (fval(u, FL_HUNGER) && (u->faction == f)) fputs("1;hunger\n", F); if (is_mage(u)) { diff --git a/src/common/gamecode/economy.c b/src/common/gamecode/economy.c index f196547c7..68d77cdf5 100644 --- a/src/common/gamecode/economy.c +++ b/src/common/gamecode/economy.c @@ -121,7 +121,6 @@ static struct scramble { int rnd; } * vec; - int scramblecmp(const void *p1, const void *p2) { @@ -297,26 +296,27 @@ expandrecruit(region * r, request * recruitorders) if (u->number) u->hp += u->n * unit_max_hp(u); if (u->race == new_race[RC_ORC]) { - change_skill(u, SK_SWORD, 30 * u->n); - change_skill(u, SK_SPEAR, 30 * u->n); + change_skill(u, SK_SWORD, skill_level(1) * u->n); + change_skill(u, SK_SPEAR, skill_level(1) * u->n); } if (u->race->ec_flags & ECF_REC_HORSES) { - change_skill(u, SK_RIDING, 30 * u->n); + change_skill(u, SK_RIDING, skill_level(1) * u->n); } i = fspecial(u->faction, FS_MILITIA); if (i > 0) { - if (u->race->bonus[SK_SPEAR] >= 0) change_skill(u, SK_SPEAR, - u->n * level_days(i)); - if (u->race->bonus[SK_SWORD] >= 0) change_skill(u, SK_SWORD, - u->n * level_days(i)); - if (u->race->bonus[SK_LONGBOW] >= 0) change_skill(u, SK_LONGBOW, - u->n * level_days(i)); - if (u->race->bonus[SK_CROSSBOW] >= 0) change_skill(u, SK_CROSSBOW, - u->n * level_days(i)); - if (u->race->bonus[SK_RIDING] >= 0) change_skill(u, SK_RIDING, - u->n * level_days(i)); - if (u->race->bonus[SK_AUSDAUER] >= 0) change_skill(u, SK_AUSDAUER, - u->n * level_days(i)); + int ld = skill_level(i); + if (u->race->bonus[SK_SPEAR] >= 0) + change_skill(u, SK_SPEAR, u->n * ld); + if (u->race->bonus[SK_SWORD] >= 0) + change_skill(u, SK_SWORD, u->n * ld); + if (u->race->bonus[SK_LONGBOW] >= 0) + change_skill(u, SK_LONGBOW, u->n * ld); + if (u->race->bonus[SK_CROSSBOW] >= 0) + change_skill(u, SK_CROSSBOW, u->n * ld); + if (u->race->bonus[SK_RIDING] >= 0) + change_skill(u, SK_RIDING, u->n * ld); + if (u->race->bonus[SK_AUSDAUER] >= 0) + change_skill(u, SK_AUSDAUER, u->n * ld); } if (u->n < u->wants) { add_message(&u->faction->msgs, @@ -547,7 +547,7 @@ givemen(int n, unit * u, unit * u2, const char * cmd) && u2->faction != u->faction && ucontact(u2, u) == 0) { error = 73; - } else if (u2 && (get_skill(u, SK_MAGIC) > 0 || get_skill(u2, SK_MAGIC) > 0)) { + } else if (u2 && (get_skill(u, SK_MAGIC) || get_skill(u2, SK_MAGIC))) { error = 158; } else { if (n > u->number) n = u->number; @@ -570,7 +570,7 @@ givemen(int n, unit * u, unit * u2, const char * cmd) } } } - if (u2 && (get_skill(u, SK_ALCHEMY) > 0 || get_skill(u2, SK_ALCHEMY) > 0)) { + if (u2 && (get_skill(u, SK_ALCHEMY) || get_skill(u2, SK_ALCHEMY))) { k = count_skill(u2->faction, SK_ALCHEMY); @@ -580,7 +580,7 @@ givemen(int n, unit * u, unit * u2, const char * cmd) k += u2->number; /* Wenn in eine Alchemisteneinheit Personen verschoben werden */ - if (get_skill(u2, SK_ALCHEMY) > 0 && !get_skill(u, SK_ALCHEMY)) + if (get_skill(u2, SK_ALCHEMY) && !get_skill(u, SK_ALCHEMY)) k += n; /* Wenn Parteigrenzen überschritten werden */ @@ -1546,7 +1546,7 @@ allocate_resource(unit * u, const resource_type * rtype, int want) if (btype==&bt_mine) al->save *= 0.5; if (u->race == new_race[RC_DWARF]) -#ifdef RACE_ADJUSTMENTS +#if RACE_ADJUSTMENTS al->save *= 0.75; #else al->save *= 0.5; @@ -1556,7 +1556,7 @@ allocate_resource(unit * u, const resource_type * rtype, int want) const struct building_type * btype = b?b->type:NULL; if (btype==&bt_quarry) al->save = al->save*0.5; -#ifdef RACE_ADJUSTMENTS +#if RACE_ADJUSTMENTS if (u->race == new_race[RC_TROLL]) al->save = al->save*0.75; #endif @@ -1740,8 +1740,7 @@ split_allocations(region * r) if (al->get) { assert(itype || !"not implemented for non-items"); i_change(&al->unit->items, itype, al->get); - change_skill(al->unit, itype->construction->skill, - al->unit->number * PRODUCEEXP); + produceexp(al->unit, itype->construction->skill, al->unit->number); #if NEW_RESOURCEGROWTH fset(r, RF_DH); #endif @@ -2502,7 +2501,7 @@ plant(region *r, unit *u, int raw) for(i = n; i>0; i--) { if (rand()%10 < skill) planted++; } - change_skill(u, SK_HERBALISM, PRODUCEEXP * u->number); + produceexp(u, SK_HERBALISM, u->number); /* Alles ok. Abziehen. */ new_use_pooled(u, oldresourcetype[R_TREES], GET_DEFAULT, 1); @@ -2556,7 +2555,7 @@ planttrees(region *r, unit *u, int raw) rsettrees(r, 0, rtrees(r, 0)+planted); /* Alles ok. Abziehen. */ - change_skill(u, SK_HERBALISM, PRODUCEEXP * u->number); + produceexp(u, SK_HERBALISM, u->number); new_use_pooled(u, itype->rtype, GET_DEFAULT, n); add_message(&u->faction->msgs, new_message(u->faction, @@ -2661,7 +2660,7 @@ breedtrees(region *r, unit *u, int raw) rsettrees(r, 1, rtrees(r, 1)+planted); /* Alles ok. Abziehen. */ - change_skill(u, SK_HERBALISM, PRODUCEEXP * u->number); + produceexp(u, SK_HERBALISM, u->number); new_use_pooled(u, itype->rtype, GET_DEFAULT, n); add_message(&u->faction->msgs, new_message(u->faction, @@ -2695,8 +2694,9 @@ breedhorses(region *r, unit *u) } } - if (gezuechtet > 0) - change_skill(u, SK_HORSE_TRAINING, PRODUCEEXP * u->number); + if (gezuechtet > 0) { + produceexp(u, SK_HORSE_TRAINING, u->number); + } add_message(&u->faction->msgs, new_message(u->faction, "raised%u:unit%i:amount", u, gezuechtet)); @@ -2773,7 +2773,7 @@ research(region *r, unit *u) return; } - change_skill(u, SK_HERBALISM, PRODUCEEXP * u->number); + produceexp(u, SK_HERBALISM, u->number); if (rherbs(r) > 0) { const herb_type *rht = rherbtype(r); @@ -2917,7 +2917,7 @@ steal(region * r, unit * u, request ** stealorders) /* Nur soviel PRODUCEEXP wie auch tatsaechlich gemacht wurde */ - change_skill(u, SK_STEALTH, min(n, u->number) * PRODUCEEXP); + produceexp(u, SK_STEALTH, min(n, u->number)); } /* ------------------------------------------------------------- */ @@ -2960,8 +2960,7 @@ expandentertainment(region * r) entertaining -= u->n; /* Nur soviel PRODUCEEXP wie auch tatsächlich gemacht wurde */ - - change_skill(u, SK_ENTERTAINMENT, PRODUCEEXP * min(u->n, u->number)); + produceexp(u, SK_ENTERTAINMENT, min(u->n, u->number)); add_income(u, IC_ENTERTAIN, o->qty, u->n); } } @@ -3215,7 +3214,7 @@ produce(void) if (fval(u, FL_TRADER)) { attrib * a = a_find(u->attribs, &at_trades); if (a && a->data.i) { - change_skill(u, SK_TRADE, u->number * PRODUCEEXP); + produceexp(u, SK_TRADE, u->number); } u->thisorder[0]=0; continue; diff --git a/src/common/gamecode/laws.c b/src/common/gamecode/laws.c index d2c76b0fa..b52e4cc33 100644 --- a/src/common/gamecode/laws.c +++ b/src/common/gamecode/laws.c @@ -2350,16 +2350,15 @@ instant_orders(void) case P_VORNE: u->status = ST_FIGHT; break; -#ifdef NOAID + case P_HELP: param = getstrtoken(); - if(findparam(param, u->faction->locale) == P_NOT) { - freset(u, FL_NOAID); - } else { + if( findparam(param, u->faction->locale) == P_NOT) { fset(u, FL_NOAID); + } else { + freset(u, FL_NOAID); } break; -#endif default: if (strlen(param)) { @@ -2391,6 +2390,7 @@ instant_orders(void) level = max(0, level); s = getstrtoken(); } + else level = 0; spell = find_spellbyname(u, s); diff --git a/src/common/gamecode/randenc.c b/src/common/gamecode/randenc.c index fffb54a4b..7509f37fb 100644 --- a/src/common/gamecode/randenc.c +++ b/src/common/gamecode/randenc.c @@ -167,8 +167,8 @@ dissolve_units(void) remove_empty_units(); } -int -improve_all(faction * f, skill_t s, int g) +static int +improve_all(faction * f, skill_t sk, int days) { region *r; unit *u; @@ -177,9 +177,15 @@ improve_all(faction * f, skill_t s, int g) for (r = firstregion(f); r != last; r = r->next) { for (u = r->units; u; u = u->next) { - if (u->faction == f && get_skill(u, s) > 0) { + if (u->faction == f && get_skill(u, sk)) { +#if SKILLPOINTS + change_skill(u, sk, u->number * days); n += u->number; - change_skill(u, s, u->number * g); +#else + if (learn_skill(u, sk, days * u->number)) { + change_skill(u, sk, 1); + } +#endif } } } @@ -293,11 +299,15 @@ find_manual(region * r, unit * u) addmessage(r, u->faction, buf, MSG_EVENT, ML_IMPORTANT); if (improve_all(u->faction, skill, 90) == 0) { +#if SKILLPOINTS change_skill(u, skill, 270); +#else + change_skill(u, skill, 1); +#endif } } -void +static void get_unit(region * r, unit * u) { unit *newunit; @@ -315,23 +325,23 @@ get_unit(region * r, unit * u) if (fval(u, FL_PARTEITARNUNG)) fset(newunit, FL_PARTEITARNUNG); switch (rand() % 4) { case 0: - set_skill(newunit, SK_MINING, 30 * newunit->number); + set_skill(newunit, SK_MINING, skill_level(1) * newunit->number); break; case 1: - set_skill(newunit, SK_LUMBERJACK, 30 * newunit->number); + set_skill(newunit, SK_LUMBERJACK, skill_level(1) * newunit->number); break; case 2: - set_skill(newunit, SK_CARTMAKER, 30 * newunit->number); + set_skill(newunit, SK_CARTMAKER, skill_level(1) * newunit->number); break; case 3: - set_skill(newunit, SK_QUARRYING, 30 * newunit->number); + set_skill(newunit, SK_QUARRYING, skill_level(1) * newunit->number); break; } set_item(newunit, I_WAGON, rand() % 2); set_item(newunit, I_HORSE, min(get_item(newunit, I_WAGON) * 2, rand() % 5)); } -void +static void get_allies(region * r, unit * u) { unit *newunit = NULL; @@ -348,19 +358,19 @@ get_allies(region * r, unit * u) switch (rand() % 4) { case 0: - set_skill(newunit, SK_SWORD, (30 + rand() % 120) * newunit->number); + set_skill(newunit, SK_SWORD, skill_level(1+rand()%3) * newunit->number); set_item(newunit, I_SWORD, newunit->number); break; case 1: - set_skill(newunit, SK_SPEAR, (30 + rand() % 120) * newunit->number); + set_skill(newunit, SK_SPEAR, skill_level(1+rand()%3) * newunit->number); set_item(newunit, I_SPEAR, newunit->number); break; case 2: - set_skill(newunit, SK_CROSSBOW, (30 + rand() % 120) * newunit->number); + set_skill(newunit, SK_CROSSBOW, skill_level(1+rand()%3) * newunit->number); set_item(newunit, I_CROSSBOW, newunit->number); break; case 3: - set_skill(newunit, SK_LONGBOW, (30 + rand() % 120) * newunit->number); + set_skill(newunit, SK_LONGBOW, skill_level(1+rand()%3) * newunit->number); set_item(newunit, I_LONGBOW, newunit->number); break; } @@ -369,7 +379,7 @@ get_allies(region * r, unit * u) } if (rand() % 100 < 30) { set_item(newunit, I_HORSE, newunit->number); - set_skill(newunit, SK_RIDING, (30 + rand() % 120) * newunit->number); + set_skill(newunit, SK_RIDING, skill_level(1+rand()%3) * newunit->number); } break; } else { @@ -381,12 +391,12 @@ get_allies(region * r, unit * u) newunit = createunit(r, u->faction, rand() % 6 + 2, u->faction->race); set_string(&newunit->name, "Waldbewohner"); set_money(newunit, (rand() % 20 + 10) * newunit->number); - set_skill(newunit, SK_LONGBOW, (90 + rand() % 210) * newunit->number); + set_skill(newunit, SK_LONGBOW, skill_level(2+rand()%3) * newunit->number); set_item(newunit, I_LONGBOW, newunit->number); - set_skill(newunit, SK_OBSERVATION, (90 + rand() % 110) * newunit->number); - set_skill(newunit, SK_STEALTH, (30 + rand() % 80) * newunit->number); + set_skill(newunit, SK_OBSERVATION, skill_level(2+rand()%2) * newunit->number); + set_skill(newunit, SK_STEALTH, skill_level(1+rand()%2) * newunit->number); if (rand() % 100 < 20) { - set_skill(newunit, SK_HERBALISM, (30 + rand() % 10) * newunit->number); + set_skill(newunit, SK_HERBALISM, skill_level(1+rand()%2) * newunit->number); } } break; @@ -398,9 +408,9 @@ get_allies(region * r, unit * u) newunit = createunit(r, u->faction, rand() % 6 + 2, u->faction->race); set_string(&newunit->name, "Sumpfbewohner"); set_money(newunit, (rand() % 20 + 10) * newunit->number); - set_skill(newunit, SK_SPEAR, (90 + rand() % 210) * newunit->number); + set_skill(newunit, SK_SPEAR, skill_level(2+rand()%3) * newunit->number); set_item(newunit, I_SPEAR, newunit->number); - set_skill(newunit, SK_STEALTH, (90 + rand() % 120) * newunit->number); + set_skill(newunit, SK_STEALTH, skill_level(2+rand()%3) * newunit->number); break; case T_DESERT: @@ -410,12 +420,12 @@ get_allies(region * r, unit * u) newunit = createunit(r, u->faction, rand() % 12 + 2, u->faction->race); set_string(&newunit->name, "Berber"); set_money(newunit, (rand() % 30 + 20) * newunit->number); - set_skill(newunit, SK_SWORD, (30 + rand() % 60) * newunit->number); + set_skill(newunit, SK_SWORD, skill_level(1+rand()%2) * newunit->number); set_item(newunit, I_SWORD, newunit->number); - set_skill(newunit, SK_TRADE, (30 + rand() % 60) * newunit->number); - set_skill(newunit, SK_RIDING, (90 + rand() % 60) * newunit->number); + set_skill(newunit, SK_TRADE, skill_level(1+rand()%3) * newunit->number); + set_skill(newunit, SK_RIDING, skill_level(2+rand()%2) * newunit->number); set_item(newunit, I_HORSE, newunit->number); - set_skill(newunit, SK_HORSE_TRAINING, (90 + rand() % 120) * newunit->number); + set_skill(newunit, SK_HORSE_TRAINING, skill_level(2+rand()%2) * newunit->number); break; case T_HIGHLAND: @@ -425,7 +435,7 @@ get_allies(region * r, unit * u) newunit = createunit(r, u->faction, rand() % 8 + 2, u->faction->race); set_string(&newunit->name, "Hochlandbarbaren"); set_money(newunit, (rand() % 10 + 20) * newunit->number); - set_skill(newunit, SK_SWORD, (60 + rand() % 60) * newunit->number); + set_skill(newunit, SK_SWORD, skill_level(1+rand()%2) * newunit->number); set_item(newunit, I_SWORD, newunit->number); break; @@ -437,10 +447,10 @@ get_allies(region * r, unit * u) newunit = createunit(r, u->faction, rand() % 6 + 2, u->faction->race); set_string(&newunit->name, "Bergbewohner"); set_money(newunit, (rand() % 40 + 60) * newunit->number); - set_skill(newunit, SK_SWORD, (90 + rand() % 60) * newunit->number); + set_skill(newunit, SK_SWORD, skill_level(2+rand()%2) * newunit->number); set_item(newunit, I_SWORD, newunit->number); - set_skill(newunit, SK_ARMORER, (90 + rand() % 60) * newunit->number); - set_skill(newunit, SK_TRADE, (30 + rand() % 120) * newunit->number); + set_skill(newunit, SK_ARMORER, skill_level(2+rand()%2) * newunit->number); + set_skill(newunit, SK_TRADE, skill_level(1+rand()%3) * newunit->number); if (rand() % 100 < 60) { set_item(newunit, I_PLATE_ARMOR, newunit->number); } @@ -454,9 +464,9 @@ get_allies(region * r, unit * u) newunit = createunit(r, u->faction, rand() % 4 + 2, u->faction->race); set_string(&newunit->name, "Eisleute"); set_money(newunit, (rand() % 20 + 20) * newunit->number); - set_skill(newunit, SK_SWORD, (90 + rand() % 60) * newunit->number); + set_skill(newunit, SK_SWORD, skill_level(2+rand()%2) * newunit->number); set_item(newunit, I_SWORD, newunit->number); - set_skill(newunit, SK_ARMORER, (90 + rand() % 60) * newunit->number); + set_skill(newunit, SK_ARMORER, skill_level(2+rand()%2) * newunit->number); break; } @@ -475,7 +485,7 @@ get_allies(region * r, unit * u) addmessage(r, u->faction, buf, MSG_EVENT, ML_IMPORTANT); } -void +static void encounter(region * r, unit * u) { if (!fval(r, RF_ENCOUNTER)) return; @@ -1018,8 +1028,12 @@ godcurse(void) for(u=r->units; u; u=u->next) { for(sk=0; sk < MAXSKILLS; sk++) { int s = get_skill(u, sk); - if(s > 0) { + if (s > 0) { +#if SKILLPOINTS change_skill(u, sk, -min(s, (30+rand()%90)*u->number)); +#else + change_skill(u, sk, -min(s, u->number)); +#endif } } } @@ -1070,8 +1084,8 @@ randomevents(void) if (p && (p->flags & PFL_NOORCGROWTH)) continue; for (u = r->units; u; u = u->next) { if ( (u->race == new_race[RC_ORC] || is_cursed(u->attribs, C_ORC, 0)) - && get_skill(u, SK_MAGIC) == 0 - && get_skill(u, SK_ALCHEMY) == 0) { + && !get_skill(u, SK_MAGIC) + && !get_skill(u, SK_ALCHEMY)) { int increase = 0; int num, prob; @@ -1090,28 +1104,20 @@ randomevents(void) } if (increase) { if (u->race == new_race[RC_ORC]) { - int s; - s = get_skill(u, SK_SWORD) / (u->number * 2); - change_skill(u, SK_SWORD, - increase * max(30, s)); - s = get_skill(u, SK_SPEAR) / (u->number * 2); - change_skill(u, SK_SPEAR, - increase * max(30, s)); - s = get_skill(u, SK_TACTICS) / (u->number * 2); - change_skill(u, SK_TACTICS, - increase * s); - s = get_skill(u, SK_LONGBOW) / (u->number * 2); - change_skill(u, SK_LONGBOW, - increase * s); - s = get_skill(u, SK_CROSSBOW) / (u->number * 2); - change_skill(u, SK_CROSSBOW, - increase * s); - s = get_skill(u, SK_CATAPULT) / (u->number * 2); - change_skill(u, SK_CATAPULT, - increase * s); - s = get_skill(u, SK_AUSDAUER) / (u->number * 2); - change_skill(u, SK_AUSDAUER, - increase * s); + int i; + struct orcskills { + skill_t skill; + int level; + } skills [] = { + { SK_SWORD, 1 }, { SK_SPEAR, 1 }, { SK_TACTICS, 0 }, + { SK_LONGBOW, 0 }, { SK_CROSSBOW, 0 }, { SK_CATAPULT, 0 }, + { SK_AUSDAUER, 0 }, { NOSKILL, 0 } + }; + for (i=0;skills[i].skill!=NOSKILL;++i) { + int s = get_skill(u, skills[i].skill) / (u->number * 2); + int k = skill_level(skills[i].level); + change_skill(u, skills[i].skill, increase * max(k, s)); + } } set_number(u, u->number + increase); @@ -1176,20 +1182,25 @@ randomevents(void) dc = max(0, dc); rsetpeasants(r, dc); for (sk = 0; sk != MAXSKILLS; sk++) { - if (get_skill(u, sk) > 0 && rand() % 100 < 25) { + if (get_skill(u, sk) && rand() % 100 < 25) { + int change = rand() % 90 + 1; if (rand() % 100 < 60) { - change_skill(u, sk, u->number * (rand() % 90 + 1)); +#if SKILLPOINTS + change_skill(u, sk, u->number * change); +#else + if (learn_skill(u, sk, change * u->number)) { + change_skill(u, sk, u->number); + } +#endif } else { int s = get_skill(u, sk); - int r = u->number * (rand() % 90 + 1); - r = min(s, r); - change_skill(u, sk, -r); -#if 0 -/* ist kaputt. weiß nicht, wieso. */ - if (r==s) { - sprintf(buf, "Durch Konzentrationsmangel vergißt %s das Talent %s vollständig", - unitname(u), skillname(u->faction->local, sk)); - addmessage(0, u->faction, buf, MSG_EVENT, ML_IMPORTANT); +#ifdef SKILLPOINTS + s = min(s, u->number * change); + change_skill(u, sk, -s); +#else + s = min(s, u->number); + if (learn_skill(u, sk, change * u->number)) { + change_skill(u, sk, -s); } #endif } @@ -1200,13 +1211,11 @@ randomevents(void) } for (r = regions; r; r = r->next) { -#if (RACE_ADJUSTMENTS==0) - /* Elfen generieren Wald, Personen in Steinkreisen können Einhörner - * bekommen. */ - +#if !RACE_ADJUSTMENTS + /* Elfen generieren Wald */ if (r->land && !fval(r, RF_MALLORN)) { #if GROWING_TREES - int trees = rtrees(r,2); + int trees = rtrees(r, 2); #else int trees = rtrees(r); #endif @@ -1225,8 +1234,8 @@ randomevents(void) rsettrees(r, 2, trees); #else rsettrees(r, trees); -#endif - } +#endif /* GROWING_TREES */ + } /* !RACE_ADJUSTMENTS */ #endif for (u=r->units; u; u=u->next) { @@ -1324,10 +1333,10 @@ randomevents(void) unit * u; if (rterrain(r) == T_OCEAN && rand()%10000 < 1) { u = createunit(r, findfaction(MONSTER_FACTION), 1, new_race[RC_SEASERPENT]); - set_skill(u, SK_MAGIC, u->number * 300); - set_skill(u, SK_OBSERVATION, u->number * 180); - set_skill(u, SK_STEALTH, u->number * 90); - set_skill(u, SK_AUSDAUER, u->number * 30); + set_skill(u, SK_MAGIC, u->number * skill_level(4)); + set_skill(u, SK_OBSERVATION, u->number * skill_level(3)); + set_skill(u, SK_STEALTH, u->number * skill_level(2)); + set_skill(u, SK_AUSDAUER, u->number * skill_level(1)); set_string(&u->name, "Seeschlange"); } @@ -1352,10 +1361,10 @@ randomevents(void) } set_money(u, u->number * (rand() % 500 + 100)); - set_skill(u, SK_MAGIC, u->number * 300); - set_skill(u, SK_OBSERVATION, u->number * (rand() % 180)); - set_skill(u, SK_AUSDAUER, u->number * 30); - set_skill(u, SK_STEALTH, u->number * 30); + set_skill(u, SK_MAGIC, u->number * skill_level(4)); + set_skill(u, SK_OBSERVATION, u->number * skill_level(1+rand()%3)); + set_skill(u, SK_AUSDAUER, u->number * skill_level(1)); + set_skill(u, SK_STEALTH, u->number * skill_level(1)); log_printf("%d %s in %s.\n", u->number, LOC(default_locale, rc_name(u->race, u->number!=1)), regionname(r, NULL)); @@ -1428,7 +1437,7 @@ randomevents(void) for (i=0;i < MAXSKILLS;i++) { if (rc->bonus[i] >= 1) { - set_skill(u, i, 30 * u->number); + set_skill(u, i, skill_level(1) * u->number); } } u->hp = unit_max_hp(u) * u->number; @@ -1498,7 +1507,13 @@ randomevents(void) u = createunit(r, findfaction(MONSTER_FACTION),treemen, new_race[RC_TREEMAN]); set_string(&u->lastorder, "WARTEN"); /* guard(u, GUARD_ALL); kein auto-guard! erst in monster.c! */ - change_skill(u,SK_OBSERVATION,180*u->number); +#if SKILLPOINTS + change_skill(u, SK_OBSERVATION, u->number * 180); +#else + if (learn_skill(u, SK_OBSERVATION, u->number * 180)) { + change_skill(u, SK_OBSERVATION, u->number); + } +#endif if (u->number == 1) set_string(&u->name, "Ein wütender Ent"); else diff --git a/src/common/kernel/battle.c b/src/common/kernel/battle.c index 3b3f2a20b..797774f9d 100644 --- a/src/common/kernel/battle.c +++ b/src/common/kernel/battle.c @@ -2329,9 +2329,12 @@ aftermath(battle * b) int sum_hp = 0; int n; if (relevant && df->action_counter >= du->number) { + ship * sh = du->ship?du->ship:leftship(du); + + if (sh) fset(sh, SF_DAMAGED); fset(du, FL_LONGACTION); /* TODO: das sollte hier weg sobald anderswo üb - * erall HADBATTLE getestet wird. */ + * erall FL_LONGACTION getestet wird. */ set_string(&du->thisorder, ""); } for (n = 0; n != df->alive; ++n) { @@ -2441,8 +2444,6 @@ aftermath(battle * b) * schonmal Schaden genommen hat. (moved und drifted * sollten in flags überführt werden */ - for (sh=r->ships; sh; sh=sh->next) sh->drifted = false; - for (fi = fighters->begin; fi != fighters->end; ++fi) { fighter *df = *fi; unit *du = df->unit; @@ -2462,9 +2463,9 @@ aftermath(battle * b) if (du->ship) sh = du->ship; else sh = leftship(du); - if (sh && sh->drifted == false && b->turn+(b->has_tactics_turn?1:0)>2) { + if (sh && fval(sh, SF_DAMAGED) && b->turn+(b->has_tactics_turn?1:0)>2) { damage_ship(sh, 0.20); - sh->drifted = true; + freset(sh, SF_DAMAGED); } } @@ -2472,7 +2473,7 @@ aftermath(battle * b) ship **sp = &r->ships; while (*sp) { ship * sh = *sp; - sh->drifted = false; + freset(sh, SF_DAMAGED); if (sh->damage >= sh->size * DAMAGE_SCALE) { destroy_ship(sh, r); } @@ -3225,10 +3226,8 @@ join_allies(battle * b) for (si = 0; si != size; ++si) { int se; side *s = b->sides.begin[si]; -#ifdef NOAID /* Wenn alle attackierten noch FL_NOAIDF haben, dann kämpfe nicht mit. */ if (fval(s->bf->faction, FL_NOAIDF)) continue; -#endif if (s->bf->faction!=f) { /* Wenn wir attackiert haben, kommt niemand mehr hinzu: */ if (s->bf->attacker) continue; @@ -3361,14 +3360,13 @@ do_battle(void) battle *b = NULL; int sides = 0; side *s; + ship * sh; void **fi; building *bu; -#ifdef NOAID for (u = r->units; u != NULL; u = u->next) { fset(u->faction, FL_NOAIDF); } -#endif /* list_foreach geht nicht, wegen flucht */ for (u = r->units; u != NULL; u = u->next) { @@ -3515,12 +3513,11 @@ do_battle(void) c1 = join_battle(b, u, true); c2 = join_battle(b, u2, false); -#ifdef NOAID /* Hat die attackierte Einheit keinen Noaid-Status, * wird das Flag von der Faction genommen, andere * Einheiten greifen ein. */ if (!fval(u2, FL_NOAID)) freset(u2->faction, FL_NOAIDF); -#endif + if (c1 && c2) { /* Merken, wer Angreifer ist, für die Rückzahlung der * Präcombataura bei kurzem Kampf. */ @@ -3568,6 +3565,9 @@ do_battle(void) } list_next(bu); + /* make sure no ships are damaged initially */ + for (sh=r->ships; sh; sh=sh->next) freset(sh, SF_DAMAGED); + /* Gibt es eine Taktikrunde ? */ b->turn = 1; #ifndef NEW_TACTICS diff --git a/src/common/kernel/eressea.c b/src/common/kernel/eressea.c index 4eda39604..a1d787af8 100644 --- a/src/common/kernel/eressea.c +++ b/src/common/kernel/eressea.c @@ -1684,7 +1684,7 @@ create_unit(region * r, faction * f, int number, const struct race *urace, int i f->no_units++; } - if (creator){ + if (creator) { attrib * a; /* erbt Kampfstatus */ diff --git a/src/common/kernel/eressea.h b/src/common/kernel/eressea.h index c9e7ccb3b..67dadcd76 100644 --- a/src/common/kernel/eressea.h +++ b/src/common/kernel/eressea.h @@ -84,9 +84,6 @@ struct xml_stack; #include #define AT_PERSISTENT -#undef RANDOMIZED_LEARNING -#undef NOVISIBLESKILLPOINTS -#undef SKILLMODIFIESLEARNING /* eressea-defined attribute-type flags */ #define ATF_CURSE ATF_USER_DEFINED @@ -105,7 +102,6 @@ struct xml_stack; #define NEW_TAVERN #define GOBLINKILL #undef HELFE_WAHRNEHMUNG -#define NOAID #define USE_FIREWALL 1 #undef COMPATIBILITY @@ -880,10 +876,8 @@ typedef struct skillvalue { #define MAX_UNIT_NR (36*36*36*36-1) #define MAX_CONTAINER_NR (36*36*36*36-1) -#ifdef NOAID #define FL_NOAIDF (1<<21) /* Hilfsflag Kampf */ #define FL_NOAID (1<<22) /* Einheit hat Noaid-Status */ -#endif #define FL_MARK (1<<23) /* für markierende algorithmen, die das hinterher auch wieder löschen müssen! (Ist dafür nicht eigentlich FL_DH gedacht?) */ @@ -892,13 +886,8 @@ typedef struct skillvalue { #define FL_UNNAMED (1<<26) /* Partei/Einheit/Gebäude/Schiff ist unbenannt */ #define FL_RESTARTED (1<<27) /* Partei hat schon einen Neustart gemacht */ /* no longer used, may contain old data! */ - /* Flags, die gespeichert werden sollen: */ -#ifdef NOAID #define FL_SAVEMASK (FL_NOAID | FL_RESTARTED | FL_OWNER | FL_PARTEITARNUNG | FL_LOCKED | FL_HUNGER | FL_NOIDLEOUT | FL_TAKEALL | FL_UNNAMED) -#else -#define FL_SAVEMASK (FL_RESTARTED | FL_OWNER | FL_PARTEITARNUNG | FL_LOCKED | FL_HUNGER | FL_NOIDLEOUT | FL_TAKEALL | FL_UNNAMED) -#endif #define fval(u, i) ((u)->flags & (i)) #define fset(u, i) ((u)->flags |= (i)) @@ -1191,4 +1180,6 @@ typedef struct settings { extern settings global; extern FILE * updatelog; +extern int produceexp(struct unit * u, skill_t sk, int n); + #endif diff --git a/src/common/kernel/movement.c b/src/common/kernel/movement.c index b96d05d5d..425dc65f4 100644 --- a/src/common/kernel/movement.c +++ b/src/common/kernel/movement.c @@ -148,7 +148,7 @@ personcapacity(const unit *u) if (old_race(u->race) == RC_TROLL) cap += 540; -#ifdef RACE_ADJUSTMENTS +#if RACE_ADJUSTMENTS else if(old_race(u->race) == RC_GOBLIN) cap -= 100; #endif @@ -465,7 +465,7 @@ move_ship(ship * sh, region * from, region * to, region ** route) ulist = &u->next; u->ship = sh; if (route && eff_skill(u, SK_SAILING, from) >= 1) { - change_skill(u, SK_SAILING, PRODUCEEXP * u->number); + produceexp(u, SK_SAILING, u->number); } } u = nu; @@ -486,7 +486,7 @@ drifting_ships(region * r) sh2 = sh->next; /* Schiff schon abgetrieben oder durch Zauber geschützt? */ - if (sh->drifted == 1 || is_cursed(sh->attribs, C_SHIP_NODRIFT, 0)) { + if (fval(sh, SF_DRIFTED) || is_cursed(sh->attribs, C_SHIP_NODRIFT, 0)) { sh = sh2; continue; } @@ -549,7 +549,7 @@ drifting_ships(region * r) for (f = factions; f; f = f->next) freset(f, FL_DH); #endif - if (sh->drifted) { + if (fval(sh, SF_DRIFTED)) { /* wenn schon einmal abgetrieben, dann durchreise eintragen */ route[0] = r; sh = move_ship(sh, r, rconnect(r, d), route); @@ -559,7 +559,7 @@ drifting_ships(region * r) continue; } - sh->drifted = 1; + fset(sh, SF_DRIFTED); if (rterrain(rconnect(r, d)) != T_OCEAN) { /* Alle Attribute @@ -928,7 +928,7 @@ travel(region * first, unit * u, region * next, int flucht) cmistake(u, findorder(u, u->thisorder), 143, MSG_MOVE); return NULL; } - } else if (rterrain(next) == T_OCEAN && u->ship && u->ship->moved == 1) { + } else if (rterrain(next) == T_OCEAN && u->ship && fval(u->ship, FL_MOVED)) { cmistake(u, findorder(u, u->thisorder), 13, MSG_MOVE); return NULL; } @@ -1119,7 +1119,7 @@ travel(region * first, unit * u, region * next, int flucht) mode = 0; else if (canride(u)) { mode = 1; - change_skill(u, SK_RIDING, u->number * PRODUCEEXP); + produceexp(u, SK_RIDING, u->number); } else mode = 2; @@ -1506,7 +1506,7 @@ sail(region * starting_point, unit * u, region * next_point, boolean move_on_lan /* Falls kein Problem, eines weiter ziehen */ route[step] = dir; tt[step] = current_point; /* travelthrough */ - u->ship->moved = 1; + fset(u->ship, FL_MOVED); step++; m++; @@ -1533,7 +1533,7 @@ sail(region * starting_point, unit * u, region * next_point, boolean move_on_lan * gekommen ist. Das ist nicht der Fall, wenn er von der Küste ins * Inland zu segeln versuchte */ - if (u->ship->moved) { + if (fval(u->ship, FL_MOVED)) { ship * sh = u->ship; /* nachdem alle Richtungen abgearbeitet wurden, und alle Einheiten * transferiert wurden, kann der aktuelle Befehl gelöscht werden. */ @@ -1544,7 +1544,7 @@ sail(region * starting_point, unit * u, region * next_point, boolean move_on_lan } else { sh->coast = NODIRECTION; } - sh->moved = 1; + fset(sh, FL_MOVED); sprintf(buf, "Die %s ", shipname(sh)); if( is_cursed(sh->attribs, C_SHIP_FLYING, 0) ) scat("fliegt"); diff --git a/src/common/kernel/reports.c b/src/common/kernel/reports.c index f0013ffb2..aba143b8b 100644 --- a/src/common/kernel/reports.c +++ b/src/common/kernel/reports.c @@ -28,6 +28,7 @@ #include "item.h" #include "karma.h" #include "magic.h" +#include "message.h" #include "race.h" #include "region.h" #include "ship.h" @@ -103,12 +104,10 @@ report_kampfstatus(const unit * u, const struct locale * lang) "status_avoid", "status_flee" }; strcpy(fsbuf, LOC(lang, azstatus[u->status])); -#ifdef NOAID - if(fval(u, FL_NOAID)) { + if (fval(u, FL_NOAID)) { strcat(fsbuf, ", "); strcat(fsbuf, LOC(lang, "status_noaid")); } -#endif return fsbuf; } @@ -119,15 +118,15 @@ hp_status(const unit * u) double p = (double) ((double) u->hp / (double) (u->number * unit_max_hp(u))); if (p > 2.00) - return "sehr stark"; + return "dmg_critical"; if (p > 1.50) - return "stark"; + return "dmg_heavily"; if (p < 0.50) - return "schwer verwundet"; + return "dmg_badly"; if (p < 0.75) - return "verwundet"; + return "dmg_wounded"; if (p < 0.99) - return "erschöpft"; + return "dmg_exhausted"; return NULL; } @@ -265,7 +264,7 @@ bufunit(const faction * f, const unit * u, int indent, int mode) /* status */ if (u->number && (u->faction == f || telepath_see || isbattle)) { - const char * c = hp_status(u); + const char * c = locale_string(f->locale, hp_status(u)); scat(", "); scat(report_kampfstatus(u, f->locale)); if (c || fval(u, FL_HUNGER)) { @@ -634,7 +633,7 @@ spskill(const struct locale * lang, const struct unit * u, skill_t sk, int *dh, } sbuf += sprintf(sbuf, "%d", effskill(u, sk)); -#ifndef NOVISIBLESKILLPOINTS +#if SKILLPOINTS if (days) { assert(u->number); sbuf += sprintf(sbuf, " [%d]", d / u->number); @@ -689,11 +688,7 @@ spy_message(int spy, unit *u, unit *target) { const char *c; - change_skill(u, SK_SPY, PRODUCEEXP); - - sprintf(buf, "%s gelang es, Informationen über ", unitname(u)); - scat(unitname(target)); - scat(" herauszubekommen: "); + produceexp(u, SK_SPY, u->number); /* Infos: * - Kampfstatus @@ -705,6 +700,7 @@ spy_message(int spy, unit *u, unit *target) */ /* mit spy=100 (magische Spionage) soll alles herausgefunden werden */ + buf[0]='\0'; if (spy > 99){ /* magische Spionage */ /* Zauberwirkungen */ @@ -822,13 +818,14 @@ spy_message(int spy, unit *u, unit *target) { /* immer */ scat("Kampfstatus: "); scat(report_kampfstatus(target, u->faction->locale)); - c = hp_status(target); + c = locale_string(u->faction->locale, hp_status(target)); if (c && strlen(c)) sprintf(buf, "%s (%s)", buf, c); scat("."); } - addmessage(0, u->faction, buf, MSG_EVENT, ML_IMPORTANT); + ADDMSG(&u->faction->msgs, msg_message("spyreport", + "spy target report", u, target, strdup(buf))); } const struct unit * diff --git a/src/common/kernel/ship.h b/src/common/kernel/ship.h index 659d39951..0e57f1184 100644 --- a/src/common/kernel/ship.h +++ b/src/common/kernel/ship.h @@ -68,6 +68,10 @@ extern void st_register(const ship_type * type); #define NOSHIP NULL +#define SF_DRIFTED 1<<0 +#define SF_MOVED 1<<1 +#define SF_DAMAGED 1<<2 /* for use in combat */ + typedef struct ship { struct ship *next; struct ship *nexthash; @@ -78,11 +82,9 @@ typedef struct ship { struct attrib * attribs; int size; int damage; /* damage in 100th of a point of size */ - int flags; + unsigned int flags; const struct ship_type * type; direction_t coast; - boolean moved; - boolean drifted; } ship; extern void damage_ship(ship *sh, double percent); diff --git a/src/common/util/language.c b/src/common/util/language.c index 266056eb3..2e789190b 100644 --- a/src/common/util/language.c +++ b/src/common/util/language.c @@ -103,31 +103,32 @@ locale_getstring(const locale * lang, const char * key) const char * locale_string(const locale * lang, const char * key) { - unsigned int hkey = hashstring(key); - unsigned int id = hkey % SMAXHASH; - struct locale_string * find; - - if (key == NULL || *key==0) return NULL; - if (lang == NULL) return key; - find = lang->strings[id]; - while (find) { - if (find->hashkey == hkey && !strcmp(key, find->key)) break; - find = find->nexthash; - } - if (!find) { - const char * s = key; - log_warning(("missing translation for \"%s\" in locale %s\n", key, lang->name)); - if (lang!=default_locale) { - s = locale_string(default_locale, key); - } - if (s_debug) { - fprintf(s_debug, "%s;%s;%s\n", key, lang->name, s); - fflush(s_debug); - locale_setstring((struct locale*)lang, key, s); - } - return s; - } + if (key==NULL) return NULL; else { + unsigned int hkey = hashstring(key); + unsigned int id = hkey % SMAXHASH; + struct locale_string * find; + + if (key == NULL || *key==0) return NULL; + if (lang == NULL) return key; + find = lang->strings[id]; + while (find) { + if (find->hashkey == hkey && !strcmp(key, find->key)) break; + find = find->nexthash; + } + if (!find) { + const char * s = key; + log_warning(("missing translation for \"%s\" in locale %s\n", key, lang->name)); + if (lang!=default_locale) { + s = locale_string(default_locale, key); + } + if (s_debug) { + fprintf(s_debug, "%s;%s;%s\n", key, lang->name, s); + fflush(s_debug); + locale_setstring((struct locale*)lang, key, s); + } + return s; + } return find->str; } } diff --git a/src/eressea/korrektur.c b/src/eressea/korrektur.c index f754c9c5b..7edb9ab6b 100644 --- a/src/eressea/korrektur.c +++ b/src/eressea/korrektur.c @@ -1043,6 +1043,7 @@ fix_demand_region(region *r) } for (rl=rlist;rl;rl=rl->next) { region * r = rl->region; + log_warning(("fixing demand in %s\n", regionname(r, NULL))); setluxuries(r, mlux[rand() % maxlux]); } while (rlist) { @@ -2707,7 +2708,6 @@ korrektur(void) #endif do_once("grat", fix_ratfamiliar()); - do_once("fdmd", fix_demand()); do_once("fgms", fix_gms()); #if NEW_RESOURCEGROWTH do_once("rndr", randomized_resources()); @@ -2716,6 +2716,10 @@ korrektur(void) do_once("szip", set_zip()); do_once("heal", heal_all()); + /* seems something fishy is going on, do this just + * to be on the safe side: + */ + fix_demand(); /* trade_orders(); */ if (global.data_version < NEWROAD_VERSION) { newroads(); diff --git a/src/res/de/messages.xml b/src/res/de/messages.xml index 95271c682..0bfb2a3e2 100644 --- a/src/res/de/messages.xml +++ b/src/res/de/messages.xml @@ -4543,16 +4543,22 @@ - + + + + + + + "$unit($spy) gelang es Informationen über $unit(target) herauszubekommen: ${report}." + "$unit($spy) managed to gather Information about $unit(target): ${report}." + + + - - - "$unit($spy) gelang es nicht, etwas über $unit($target) herauszufinden." - - + "$unit($spy) gelang es nicht, etwas über $unit($target) herauszufinden." diff --git a/src/res/de/strings.xml b/src/res/de/strings.xml index 2d61f7054..4f157487b 100644 --- a/src/res/de/strings.xml +++ b/src/res/de/strings.xml @@ -3153,5 +3153,26 @@ dwarf + + sehr stark + critically wounded + + + stark + heavily wounded + + + schwer verwundet + badly wounded + + + verwundet + wounded + + + erschöpft + exhausted + +