From 0faa820456245fa9db06902e3085bf2f093687a6 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Mon, 11 Mar 2002 00:06:14 +0000 Subject: [PATCH] =?UTF-8?q?Peniblere=20skillchecks.=20Bugfix=20f=C3=BCr=20?= =?UTF-8?q?die=20D=C3=A4monen.=20Retro-Fix=20f=C3=BCr=20die=20Auswertung?= =?UTF-8?q?=20fehlt=20noch,=20kommt=20morgen.=20Bugfix=200-hp=20Personen?= =?UTF-8?q?=20in=20Vulkaneruptionen.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/common/gamecode/laws.c | 2 +- src/common/gamecode/randenc.c | 13 ++++--------- src/common/kernel/skill.c | 1 + src/common/kernel/unit.c | 29 +++++++++++++++++++++++++---- src/common/kernel/unit.h | 1 + src/eressea/korrektur.c | 3 +++ 6 files changed, 35 insertions(+), 14 deletions(-) diff --git a/src/common/gamecode/laws.c b/src/common/gamecode/laws.c index 3349f0fe9..a096269a2 100644 --- a/src/common/gamecode/laws.c +++ b/src/common/gamecode/laws.c @@ -2168,7 +2168,7 @@ display_item(faction *f, unit *u, const item_type * itype) FILE *fp; char t[NAMESIZE + 1]; char filename[MAX_PATH]; - const char *name, *info; + const char *name; if (u && *i_find(&u->items, itype) == NULL) return false; /* diff --git a/src/common/gamecode/randenc.c b/src/common/gamecode/randenc.c index 415cacda9..f7dffa1a5 100644 --- a/src/common/gamecode/randenc.c +++ b/src/common/gamecode/randenc.c @@ -728,7 +728,6 @@ volcano_outbreak(region *r) attrib *a; region *rn; unit *u, **up; - int dead; faction *f; for (u=r->units; u; u=u->next) { @@ -759,7 +758,7 @@ volcano_outbreak(region *r) for (up=&r->units; *up;) { unit * u = *up; - dead = damage_unit(u, "4d10", true, false); + int dead = damage_unit(u, "4d10", true, false); if (dead) { ADDMSG(&u->faction->msgs, new_message(u->faction, "volcano_dead%u:unit%r:region%i:dead", u, r, dead)); @@ -802,7 +801,7 @@ volcano_outbreak(region *r) /* Personen bekommen 3W10 Punkte Schaden. */ for (up=&rn->units; *up;) { unit * u = *up; - dead = damage_unit(u, "3d10", true, false); + int dead = damage_unit(u, "3d10", true, false); if (dead) { ADDMSG(&u->faction->msgs, new_message(u->faction, "volcano_dead%u:unit%r:region%i:dead", u, rn, dead)); @@ -1136,11 +1135,7 @@ randomevents(void) * Es ist auch deshalb fast egal, weil es ja im Grunde nicht dem Dämon, * sondern der Region zu gute kommt - und da ist der anwender schnuppe */ -#if SKILLPOINTS - skill_t sk; -#else skill * sv; -#endif int dc; if (!bfind) { unit * ud = u; @@ -1178,8 +1173,8 @@ randomevents(void) dc = max(0, dc); sv = u->skills; while (sv!=u->skills+u->skill_size) { - if (rand() % 100 < 25) { - int weeks = 0+rand()%3; + if (sv->level>0 && rand() % 100 < 25) { + int weeks = 1+rand()%3; if (rand() % 100 < 40) reduce_skill(u, sv, weeks); else while (weeks--) learn_skill(u, sv->id, 1.0); } diff --git a/src/common/kernel/skill.c b/src/common/kernel/skill.c index cdca83adb..f37b7b098 100644 --- a/src/common/kernel/skill.c +++ b/src/common/kernel/skill.c @@ -307,6 +307,7 @@ sk_set(skill * sv, int level) void sk_set(skill * sv, int level) { + assert(level!=0); sv->weeks = (unsigned char)skill_weeks(level); sv->level = (unsigned char)level; } diff --git a/src/common/kernel/unit.c b/src/common/kernel/unit.c index 774e29f2f..affc46cd4 100644 --- a/src/common/kernel/unit.c +++ b/src/common/kernel/unit.c @@ -507,17 +507,21 @@ get_level(const unit * u, skill_t id) } void -set_level(unit * u, skill_t id, int value) +set_level(unit * u, skill_t sk, int value) { skill * sv = u->skills; + if (value==0) { + remove_skill(u, sk); + return; + } while (sv != u->skills + u->skill_size) { - if (sv->id == id) { + if (sv->id == sk) { sk_set(sv, value); return; } ++sv; } - sk_set(add_skill(u, id), value); + sk_set(add_skill(u, sk), value); } static attrib_type at_leftship = { @@ -698,7 +702,8 @@ transfermen(unit * u, unit * u2, int n) sn->weeks = (unsigned char)weeks; assert(sn->weeks>0 && sn->weeks<=sn->level*2+1); } else if (sn) { - sk_set(sn, 0); + remove_skill(u2, sk); + sn = NULL; } } a = a_find(u->attribs, &at_effect); @@ -840,6 +845,22 @@ learn_skill(unit * u, skill_t sk, double chance) return true; } +void +remove_skill(unit *u, skill_t sk) +{ + skill * sv = u->skills; + for (sv = u->skills; sv != u->skills + u->skill_size; ++sv) { + if (sv->id==sk) { + skill * sl = u->skills + u->skill_size - 1; + if (sl!=sv) { + *sv = *sl; + } + --u->skill_size; + return; + } + } +} + skill * add_skill(unit * u, skill_t id) { diff --git a/src/common/kernel/unit.h b/src/common/kernel/unit.h index b48e9d261..729681a1b 100644 --- a/src/common/kernel/unit.h +++ b/src/common/kernel/unit.h @@ -111,6 +111,7 @@ extern const struct unit u_unknown; extern struct unit * udestroy; extern struct skill * add_skill(struct unit * u, skill_t id); +extern void remove_skill(struct unit *u, skill_t sk); extern struct skill * get_skill(const struct unit * u, skill_t id); extern boolean has_skill(const unit* u, skill_t sk); diff --git a/src/eressea/korrektur.c b/src/eressea/korrektur.c index 823104f7f..f88ed0701 100644 --- a/src/eressea/korrektur.c +++ b/src/eressea/korrektur.c @@ -1203,6 +1203,9 @@ stats(void) for (u=r->units;u;u=u->next) { for (itm=u->items;itm;itm=itm->next) { + if (itm->number>10000000) { + itm->number=1; + } i_change(&items, itm->type, itm->number); } }