BUG 2505: make build code more comlpicated, and fix multi-stage buildings.

This commit is contained in:
Enno Rehling 2018-10-29 19:35:49 +01:00
parent f8040e2d9f
commit e8ca81bc1a

View file

@ -527,28 +527,19 @@ int build_skill(unit *u, int basesk, int skill_mod) {
* of the first object have already been finished. return the * of the first object have already been finished. return the
* actual size that could be built. * actual size that could be built.
*/ */
int build(unit * u, const construction * ctype, int completed, int want, int skill_mod) static int build_limited(unit * u, const construction * con, int completed, int want, int basesk, int *skill_total) {
{ int skills = *skill_total;
const construction *con = ctype;
int skills = INT_MAX; /* number of skill points remainig */
int basesk = 0;
int made = 0; int made = 0;
if (want <= 0) if (want <= 0) {
return 0; return 0;
}
if (con == NULL) { if (con == NULL) {
return ENOMATERIALS; return ENOMATERIALS;
} }
if (completed == con->maxsize) { if (completed == con->maxsize) {
return ECOMPLETE; return ECOMPLETE;
} }
if (con->skill != NOSKILL) {
basesk = effskill(u, con->skill, 0);
if (basesk == 0)
return ENEEDSKILL;
skills = build_skill(u, basesk, skill_mod);
}
for (; want > 0 && skills > 0;) { for (; want > 0 && skills > 0;) {
int err, n; int err, n;
@ -615,9 +606,27 @@ int build(unit * u, const construction * ctype, int completed, int want, int ski
want -= n; want -= n;
completed = completed + n; completed = completed + n;
} }
/* Nur soviel PRODUCEEXP wie auch tatsaechlich gemacht wurde */ *skill_total = skills;
produceexp(u, ctype->skill, (made < u->number) ? made : u->number); return made;
}
int build(unit * u, const construction * con, int completed, int want, int skill_mod)
{
int skills = INT_MAX; /* number of skill points remainig */
int made, basesk = 0;
assert(con->skill != NOSKILL);
basesk = effskill(u, con->skill, 0);
if (basesk == 0) {
return ENEEDSKILL;
}
skills = build_skill(u, basesk, skill_mod);
made = build_limited(u, con, completed, want, basesk, &skills);
/* Nur soviel PRODUCEEXP wie auch tatsaechlich gemacht wurde */
if (made > 0) {
produceexp(u, con->skill, (made < u->number) ? made : u->number);
}
return made; return made;
} }
@ -686,7 +695,7 @@ static int build_failure(unit *u, order *ord, const building_type *btype, int wa
return err; return err;
} }
static int build_stages(unit *u, const building_type *btype, int built, int n) { static int build_stages(unit *u, const building_type *btype, int built, int n, int basesk, int *skill_total) {
const building_stage *stage; const building_stage *stage;
int made = 0; int made = 0;
@ -706,7 +715,7 @@ static int build_stages(unit *u, const building_type *btype, int built, int n) {
want = todo; want = todo;
} }
} }
err = build(u, con, built, want, 0); err = build_limited(u, con, built, want, basesk, skill_total);
if (err < 0) { if (err < 0) {
if (made == 0) { if (made == 0) {
/* could not make any part at all */ /* could not make any part at all */
@ -744,10 +753,14 @@ build_building(unit * u, const building_type * btype, int id, int want, order *
const char *btname; const char *btname;
order *new_order = NULL; order *new_order = NULL;
const struct locale *lang = u->faction->locale; const struct locale *lang = u->faction->locale;
int skills, basesk; /* number of skill points remainig */
assert(u->number); assert(u->number);
assert(btype->stages && btype->stages->construction); assert(btype->stages && btype->stages->construction);
if (effskill(u, SK_BUILDING, 0) == 0) {
basesk = effskill(u, SK_BUILDING, 0);
skills = build_skill(u, basesk, 0);
if (skills == 0) {
cmistake(u, ord, 101, MSG_PRODUCE); cmistake(u, ord, 101, MSG_PRODUCE);
return 0; return 0;
} }
@ -837,7 +850,7 @@ build_building(unit * u, const building_type * btype, int id, int want, order *
} }
} }
built = build_stages(u, btype, built, n); built = build_stages(u, btype, built, n, basesk, &skills);
if (built < 0) { if (built < 0) {
return build_failure(u, ord, btype, want, built); return build_failure(u, ord, btype, want, built);