must have one captain per ship.

This commit is contained in:
Enno Rehling 2019-10-06 20:22:19 +02:00
parent 178f7c2e19
commit 5cf417d16d
4 changed files with 34 additions and 25 deletions

View File

@ -100,7 +100,6 @@ function test_ship_convoy_capacity()
u:add_order('NACH W') u:add_order('NACH W')
u:add_item('jewel', 39) u:add_item('jewel', 39)
u.name = 'Xolgrim'
u.ship.number = 2 u.ship.number = 2
u.number = 2 u.number = 2
u:set_skill('sailing', 2, true) u:set_skill('sailing', 2, true)
@ -155,9 +154,9 @@ function test_ship_convoy_skill()
assert_equal(r2, u.region) assert_equal(r2, u.region)
u.ship.number = 2 u.ship.number = 2
u:set_skill('sailing', 2, true) u:set_skill('sailing', 4, true)
process_orders() process_orders()
assert_equal(r2, u.region) assert_equal(r2, u.region) -- not enough captains
u.number = 2 u.number = 2
u:set_skill('sailing', 2, true) u:set_skill('sailing', 2, true)

View File

@ -332,7 +332,7 @@ int shipspeed(const ship * sh, const unit * u)
bonus = ShipSpeedBonus(u); bonus = ShipSpeedBonus(u);
if (bonus > 0 && sh->type->range_max > sh->type->range) { if (bonus > 0 && sh->type->range_max > sh->type->range) {
int crew = crew_skill(sh, NULL); int crew = crew_skill(sh);
int crew_bonus = (crew / sh->type->sumskill / 2) - 1; int crew_bonus = (crew / sh->type->sumskill / 2) - 1;
if (crew_bonus > 0) { if (crew_bonus > 0) {
int sbonus = sh->type->range_max - sh->type->range; int sbonus = sh->type->range_max - sh->type->range;
@ -387,31 +387,41 @@ int enoughsailors(const ship * sh, int crew_skill)
return crew_skill >= sh->type->sumskill * sh->number; return crew_skill >= sh->type->sumskill * sh->number;
} }
int crew_skill(const ship *sh, int *o_captains) { int crew_skill(const ship *sh) {
int n = 0, captains = 0; int n = 0;
unit *u; unit *u;
for (u = sh->region->units; u; u = u->next) { for (u = sh->region->units; u; u = u->next) {
if (u->ship == sh) { if (u->ship == sh) {
int es = effskill(u, SK_SAILING, NULL); int es = effskill(u, SK_SAILING, NULL);
if (es >= sh->type->cptskill) {
captains += u->number;
}
if (es >= sh->type->minskill) { if (es >= sh->type->minskill) {
n += es * u->number; n += es * u->number;
} }
} }
} }
if (o_captains) {
*o_captains = captains;
}
return n; return n;
} }
bool ship_crewed(const ship *sh) bool ship_crewed(const ship *sh) {
{ unit *u;
int num_caps, crew = crew_skill(sh, &num_caps); int capskill = -1, sumskill = 0;
return num_caps >= sh->number && enoughsailors(sh, crew); for (u = sh->region->units; u; u = u->next) {
if (u->ship == sh) {
int es = effskill(u, SK_SAILING, NULL);
if (capskill < 0) {
if (u->number >= sh->number) {
capskill = es;
}
else {
capskill = 0;
}
}
if (es >= sh->type->minskill) {
sumskill += es * u->number;
}
}
}
return (capskill >= ship_captain_minskill(sh)) && (sumskill >= sh->type->sumskill * sh->number);
} }
int ship_capacity(const ship * sh) int ship_capacity(const ship * sh)

View File

@ -118,7 +118,7 @@ extern "C" {
int shipspeed(const struct ship *sh, const struct unit *u); int shipspeed(const struct ship *sh, const struct unit *u);
bool ship_crewed(const struct ship *sh); bool ship_crewed(const struct ship *sh);
int crew_skill(const struct ship *sh, int *num_captains); int crew_skill(const struct ship *sh);
int ship_captain_minskill(const struct ship *sh); int ship_captain_minskill(const struct ship *sh);
int ship_damage_percent(const struct ship *sh); int ship_damage_percent(const struct ship *sh);

View File

@ -641,21 +641,21 @@ static void test_crew_skill(CuTest *tc) {
CuAssertIntEquals(tc, 1, stype->minskill); CuAssertIntEquals(tc, 1, stype->minskill);
r = test_create_ocean(0, 0); r = test_create_ocean(0, 0);
sh = test_create_ship(r, stype); sh = test_create_ship(r, stype);
CuAssertIntEquals(tc, 0, crew_skill(sh, NULL)); CuAssertIntEquals(tc, 0, crew_skill(sh));
u = test_create_unit(test_create_faction(NULL), r); u = test_create_unit(test_create_faction(NULL), r);
set_level(u, SK_SAILING, 1); set_level(u, SK_SAILING, 1);
CuAssertIntEquals(tc, 0, crew_skill(sh, NULL)); CuAssertIntEquals(tc, 0, crew_skill(sh));
u_set_ship(u, sh); u_set_ship(u, sh);
set_level(u, SK_SAILING, 1); set_level(u, SK_SAILING, 1);
CuAssertIntEquals(tc, 1, crew_skill(sh, NULL)); CuAssertIntEquals(tc, 1, crew_skill(sh));
set_number(u, 10); set_number(u, 10);
CuAssertIntEquals(tc, 10, crew_skill(sh, NULL)); CuAssertIntEquals(tc, 10, crew_skill(sh));
stype->minskill = 2; stype->minskill = 2;
CuAssertIntEquals(tc, 0, crew_skill(sh, NULL)); CuAssertIntEquals(tc, 0, crew_skill(sh));
set_level(u, SK_SAILING, 2); set_level(u, SK_SAILING, 2);
CuAssertIntEquals(tc, 20, crew_skill(sh, NULL)); CuAssertIntEquals(tc, 20, crew_skill(sh));
set_level(u, SK_SAILING, 3); set_level(u, SK_SAILING, 3);
CuAssertIntEquals(tc, 30, crew_skill(sh, NULL)); CuAssertIntEquals(tc, 30, crew_skill(sh));
test_teardown(); test_teardown();
} }