forked from github/server
Better error messages for drifting ship.
This commit is contained in:
parent
e97f80ad3c
commit
0bbadf2a66
4 changed files with 67 additions and 13 deletions
|
@ -1161,6 +1161,12 @@ msgid "spyreport_faction"
|
||||||
msgstr "\"$unit($target) gehört der Partei $faction($faction) an.\""
|
msgstr "\"$unit($target) gehört der Partei $faction($faction) an.\""
|
||||||
|
|
||||||
msgid "ship_drift"
|
msgid "ship_drift"
|
||||||
|
msgstr "\"Die $ship($ship) treibt nach $direction($dir).\""
|
||||||
|
|
||||||
|
msgid "ship_drift_overload"
|
||||||
|
msgstr "\"Die $ship($ship) ist überladen und treibt nach $direction($dir).\""
|
||||||
|
|
||||||
|
msgid "ship_drift_nocrew"
|
||||||
msgstr "\"Die $ship($ship) hat zu wenig Segler und treibt nach $direction($dir).\""
|
msgstr "\"Die $ship($ship) hat zu wenig Segler und treibt nach $direction($dir).\""
|
||||||
|
|
||||||
msgid "error_max_magicians"
|
msgid "error_max_magicians"
|
||||||
|
|
|
@ -1161,6 +1161,12 @@ msgid "spyreport_faction"
|
||||||
msgstr "\"$unit($target) belongs to $faction($faction).\""
|
msgstr "\"$unit($target) belongs to $faction($faction).\""
|
||||||
|
|
||||||
msgid "ship_drift"
|
msgid "ship_drift"
|
||||||
|
msgstr "\"The ship $ship($ship) drifts to the $direction($dir).\""
|
||||||
|
|
||||||
|
msgid "ship_drift_overload"
|
||||||
|
msgstr "\"The ship $ship($ship) is too heavily loaded and drifts to the $direction($dir).\""
|
||||||
|
|
||||||
|
msgid "ship_drift_nocrew"
|
||||||
msgstr "\"The ship $ship($ship) needs more sailors and drifts to the $direction($dir).\""
|
msgstr "\"The ship $ship($ship) needs more sailors and drifts to the $direction($dir).\""
|
||||||
|
|
||||||
msgid "error_max_magicians"
|
msgid "error_max_magicians"
|
||||||
|
|
24
src/move.c
24
src/move.c
|
@ -813,12 +813,13 @@ static void drifting_ships(region * r)
|
||||||
if (fval(r->terrain, SEA_REGION)) {
|
if (fval(r->terrain, SEA_REGION)) {
|
||||||
ship **shp = &r->ships;
|
ship **shp = &r->ships;
|
||||||
while (*shp) {
|
while (*shp) {
|
||||||
ship *sh = *shp;
|
ship* sh = *shp;
|
||||||
region *rnext = NULL;
|
region* rnext = NULL;
|
||||||
region_list *route = NULL;
|
region_list* route = NULL;
|
||||||
unit *firstu = r->units, *lastu = NULL;
|
unit* firstu = r->units, * lastu = NULL;
|
||||||
direction_t dir = NODIRECTION;
|
direction_t dir = NODIRECTION;
|
||||||
double ovl;
|
double ovl;
|
||||||
|
const char* reason = "ship_drift";
|
||||||
|
|
||||||
if (sh->type->fishing > 0) {
|
if (sh->type->fishing > 0) {
|
||||||
sh->flags |= SF_FISHING;
|
sh->flags |= SF_FISHING;
|
||||||
|
@ -833,11 +834,21 @@ static void drifting_ships(region * r)
|
||||||
/* Kapitaen da? Beschaedigt? Genuegend Matrosen?
|
/* Kapitaen da? Beschaedigt? Genuegend Matrosen?
|
||||||
* Genuegend leicht? Dann ist alles OK. */
|
* Genuegend leicht? Dann ist alles OK. */
|
||||||
|
|
||||||
if (ship_finished(sh) && ship_crewed(sh, ship_owner(sh)) && cansail(r, sh)) {
|
if (ship_finished(sh)) {
|
||||||
|
if (!ship_crewed(sh, ship_owner(sh))) {
|
||||||
|
reason = "ship_drift_nocrew";
|
||||||
|
}
|
||||||
|
else if (!cansail(r, sh)) {
|
||||||
|
reason = "ship_drift_overload";
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
/* no problems, don't drift */
|
||||||
shp = &sh->next;
|
shp = &sh->next;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fset(sh, SF_DRIFTED);
|
||||||
ovl = overload(r, sh);
|
ovl = overload(r, sh);
|
||||||
if (ovl < overload_start()) {
|
if (ovl < overload_start()) {
|
||||||
/* Auswahl einer Richtung: Zuerst auf Land, dann
|
/* Auswahl einer Richtung: Zuerst auf Land, dann
|
||||||
|
@ -849,11 +860,10 @@ static void drifting_ships(region * r)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rnext && firstu) {
|
if (rnext && firstu) {
|
||||||
message *msg = msg_message("ship_drift", "ship dir", sh, dir);
|
message *msg = msg_message(reason, "ship dir", sh, dir);
|
||||||
msg_to_passengers(sh, &firstu, &lastu, msg);
|
msg_to_passengers(sh, &firstu, &lastu, msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
fset(sh, SF_DRIFTED);
|
|
||||||
if (ovl >= overload_start()) {
|
if (ovl >= overload_start()) {
|
||||||
damage_ship(sh, damage_overload(ovl));
|
damage_ship(sh, damage_overload(ovl));
|
||||||
msg_to_passengers(sh, &firstu, &lastu, msg_message("massive_overload", "ship", sh));
|
msg_to_passengers(sh, &firstu, &lastu, msg_message("massive_overload", "ship", sh));
|
||||||
|
|
|
@ -293,6 +293,10 @@ void setup_drift (struct drift_fixture *fix) {
|
||||||
|
|
||||||
mt_create_va(mt_new("ship_drift", NULL),
|
mt_create_va(mt_new("ship_drift", NULL),
|
||||||
"ship:ship", "dir:int", MT_NEW_END);
|
"ship:ship", "dir:int", MT_NEW_END);
|
||||||
|
mt_create_va(mt_new("ship_drift_nocrew", NULL),
|
||||||
|
"ship:ship", "dir:int", MT_NEW_END);
|
||||||
|
mt_create_va(mt_new("ship_drift_overload", NULL),
|
||||||
|
"ship:ship", "dir:int", MT_NEW_END);
|
||||||
mt_create_va(mt_new("shipsink", NULL),
|
mt_create_va(mt_new("shipsink", NULL),
|
||||||
"ship:ship", MT_NEW_END);
|
"ship:ship", MT_NEW_END);
|
||||||
mt_create_va(mt_new("massive_overload", NULL),
|
mt_create_va(mt_new("massive_overload", NULL),
|
||||||
|
@ -323,8 +327,24 @@ static void test_ship_empty(CuTest *tc) {
|
||||||
|
|
||||||
movement();
|
movement();
|
||||||
CuAssertPtrEquals(tc, fix.sh->region, findregion(0, 0));
|
CuAssertPtrEquals(tc, fix.sh->region, findregion(0, 0));
|
||||||
|
CuAssertIntEquals(tc, SF_DRIFTED, fix.sh->flags & SF_DRIFTED);
|
||||||
CuAssertIntEquals(tc, 2, ship_damage_percent(fix.sh));
|
CuAssertIntEquals(tc, 2, ship_damage_percent(fix.sh));
|
||||||
CuAssertPtrEquals(tc, NULL, test_find_messagetype(fix.f->msgs, "ship_drift"));
|
|
||||||
|
test_teardown();
|
||||||
|
}
|
||||||
|
|
||||||
|
static void test_ship_no_crew(CuTest *tc) {
|
||||||
|
struct drift_fixture fix;
|
||||||
|
|
||||||
|
test_setup();
|
||||||
|
setup_drift(&fix);
|
||||||
|
set_level(fix.u, SK_SAILING, 0);
|
||||||
|
|
||||||
|
movement();
|
||||||
|
CuAssertPtrEquals(tc, fix.sh->region, findregion(0, 0));
|
||||||
|
CuAssertIntEquals(tc, SF_DRIFTED, fix.sh->flags & SF_DRIFTED);
|
||||||
|
CuAssertIntEquals(tc, 2, ship_damage_percent(fix.sh));
|
||||||
|
CuAssertPtrNotNull(tc, test_find_messagetype(fix.f->msgs, "ship_drift_nocrew"));
|
||||||
|
|
||||||
test_teardown();
|
test_teardown();
|
||||||
}
|
}
|
||||||
|
@ -340,6 +360,7 @@ static void test_no_drift_damage(CuTest *tc) {
|
||||||
config_set("rules.ship.damage_drift", "0.0");
|
config_set("rules.ship.damage_drift", "0.0");
|
||||||
movement();
|
movement();
|
||||||
CuAssertPtrEquals(tc, fix.sh->region, findregion(0, 0));
|
CuAssertPtrEquals(tc, fix.sh->region, findregion(0, 0));
|
||||||
|
CuAssertIntEquals(tc, SF_DRIFTED, fix.sh->flags & SF_DRIFTED);
|
||||||
CuAssertIntEquals(tc, 0, ship_damage_percent(fix.sh));
|
CuAssertIntEquals(tc, 0, ship_damage_percent(fix.sh));
|
||||||
CuAssertPtrEquals(tc, NULL, test_find_messagetype(fix.f->msgs, "ship_drift"));
|
CuAssertPtrEquals(tc, NULL, test_find_messagetype(fix.f->msgs, "ship_drift"));
|
||||||
|
|
||||||
|
@ -355,8 +376,9 @@ static void test_ship_normal_overload(CuTest *tc) {
|
||||||
fix.u->number = 21;
|
fix.u->number = 21;
|
||||||
movement();
|
movement();
|
||||||
CuAssertPtrEquals(tc, fix.u->region, findregion(0, 0));
|
CuAssertPtrEquals(tc, fix.u->region, findregion(0, 0));
|
||||||
|
CuAssertIntEquals(tc, SF_DRIFTED, fix.sh->flags & SF_DRIFTED);
|
||||||
CuAssertIntEquals(tc, 2, ship_damage_percent(fix.sh));
|
CuAssertIntEquals(tc, 2, ship_damage_percent(fix.sh));
|
||||||
CuAssertPtrNotNull(tc, test_find_messagetype(fix.f->msgs, "ship_drift"));
|
CuAssertPtrNotNull(tc, test_find_messagetype(fix.f->msgs, "ship_drift_overload"));
|
||||||
|
|
||||||
test_teardown();
|
test_teardown();
|
||||||
}
|
}
|
||||||
|
@ -370,13 +392,16 @@ static void test_ship_big_overload(CuTest *tc) {
|
||||||
fix.u->number = 22;
|
fix.u->number = 22;
|
||||||
movement();
|
movement();
|
||||||
CuAssertPtrEquals(tc, fix.u->region, findregion(-1, 0));
|
CuAssertPtrEquals(tc, fix.u->region, findregion(-1, 0));
|
||||||
|
CuAssertIntEquals(tc, SF_DRIFTED, fix.sh->flags & SF_DRIFTED);
|
||||||
CuAssertIntEquals(tc, 5, ship_damage_percent(fix.sh));
|
CuAssertIntEquals(tc, 5, ship_damage_percent(fix.sh));
|
||||||
|
CuAssertPtrEquals(tc, NULL, test_find_messagetype(fix.f->msgs, "ship_drift_overload"));
|
||||||
|
CuAssertPtrEquals(tc, NULL, test_find_messagetype(fix.f->msgs, "ship_drift"));
|
||||||
CuAssertPtrNotNull(tc, test_find_messagetype(fix.f->msgs, "massive_overload"));
|
CuAssertPtrNotNull(tc, test_find_messagetype(fix.f->msgs, "massive_overload"));
|
||||||
|
|
||||||
test_teardown();
|
test_teardown();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void test_ship_no_real_overload(CuTest *tc) {
|
static void test_ship_small_overload(CuTest *tc) {
|
||||||
struct drift_fixture fix;
|
struct drift_fixture fix;
|
||||||
|
|
||||||
test_setup();
|
test_setup();
|
||||||
|
@ -386,7 +411,9 @@ static void test_ship_no_real_overload(CuTest *tc) {
|
||||||
damage_ship(fix.sh, .80);
|
damage_ship(fix.sh, .80);
|
||||||
movement();
|
movement();
|
||||||
CuAssertPtrEquals(tc, fix.u->region, findregion(0, 0));
|
CuAssertPtrEquals(tc, fix.u->region, findregion(0, 0));
|
||||||
|
CuAssertIntEquals(tc, SF_DRIFTED, fix.sh->flags & SF_DRIFTED);
|
||||||
CuAssertIntEquals(tc, 82, ship_damage_percent(fix.sh));
|
CuAssertIntEquals(tc, 82, ship_damage_percent(fix.sh));
|
||||||
|
CuAssertPtrNotNull(tc, test_find_messagetype(fix.f->msgs, "ship_drift_overload"));
|
||||||
CuAssertPtrEquals(tc, NULL, test_find_messagetype(fix.f->msgs, "massive_overload"));
|
CuAssertPtrEquals(tc, NULL, test_find_messagetype(fix.f->msgs, "massive_overload"));
|
||||||
|
|
||||||
test_teardown();
|
test_teardown();
|
||||||
|
@ -400,7 +427,11 @@ static void test_ship_ridiculous_overload(CuTest *tc) {
|
||||||
|
|
||||||
fix.u->number = 500;
|
fix.u->number = 500;
|
||||||
movement();
|
movement();
|
||||||
|
CuAssertPtrEquals(tc, fix.u->region, findregion(-1, 0));
|
||||||
|
CuAssertIntEquals(tc, SF_DRIFTED, fix.sh->flags & SF_DRIFTED);
|
||||||
CuAssertIntEquals(tc, 37, ship_damage_percent(fix.sh));
|
CuAssertIntEquals(tc, 37, ship_damage_percent(fix.sh));
|
||||||
|
CuAssertPtrEquals(tc, NULL, test_find_messagetype(fix.f->msgs, "ship_drift_overload"));
|
||||||
|
CuAssertPtrEquals(tc, NULL, test_find_messagetype(fix.f->msgs, "ship_drift"));
|
||||||
CuAssertPtrNotNull(tc, test_find_messagetype(fix.f->msgs, "massive_overload"));
|
CuAssertPtrNotNull(tc, test_find_messagetype(fix.f->msgs, "massive_overload"));
|
||||||
|
|
||||||
test_teardown();
|
test_teardown();
|
||||||
|
@ -755,9 +786,10 @@ CuSuite *get_move_suite(void)
|
||||||
SUITE_ADD_TEST(suite, test_age_trails);
|
SUITE_ADD_TEST(suite, test_age_trails);
|
||||||
SUITE_ADD_TEST(suite, test_ship_no_overload);
|
SUITE_ADD_TEST(suite, test_ship_no_overload);
|
||||||
SUITE_ADD_TEST(suite, test_ship_empty);
|
SUITE_ADD_TEST(suite, test_ship_empty);
|
||||||
|
SUITE_ADD_TEST(suite, test_ship_no_crew);
|
||||||
SUITE_ADD_TEST(suite, test_no_drift_damage);
|
SUITE_ADD_TEST(suite, test_no_drift_damage);
|
||||||
SUITE_ADD_TEST(suite, test_ship_normal_overload);
|
SUITE_ADD_TEST(suite, test_ship_normal_overload);
|
||||||
SUITE_ADD_TEST(suite, test_ship_no_real_overload);
|
SUITE_ADD_TEST(suite, test_ship_small_overload);
|
||||||
SUITE_ADD_TEST(suite, test_ship_big_overload);
|
SUITE_ADD_TEST(suite, test_ship_big_overload);
|
||||||
SUITE_ADD_TEST(suite, test_ship_ridiculous_overload);
|
SUITE_ADD_TEST(suite, test_ship_ridiculous_overload);
|
||||||
SUITE_ADD_TEST(suite, test_ship_ridiculous_overload_bad);
|
SUITE_ADD_TEST(suite, test_ship_ridiculous_overload_bad);
|
||||||
|
|
Loading…
Reference in a new issue