forked from github/server
BUG 2505: make build code more comlpicated, and fix multi-stage buildings.
This commit is contained in:
parent
f8040e2d9f
commit
e8ca81bc1a
1 changed files with 32 additions and 19 deletions
|
@ -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);
|
||||||
|
|
Loading…
Reference in a new issue