forked from github/server
Merge remote-tracking branch 'upstream/develop' into develop
This commit is contained in:
commit
6a66d8e4eb
26
src/move.c
26
src/move.c
|
@ -1702,14 +1702,14 @@ static const region_list *travel_route(unit * u,
|
||||||
return iroute;
|
return iroute;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool ship_ready(const region * r, unit * u)
|
static bool ship_ready(const region * r, unit * u, order * ord)
|
||||||
{
|
{
|
||||||
if (!u->ship || u != ship_owner(u->ship)) {
|
if (!u->ship || u != ship_owner(u->ship)) {
|
||||||
cmistake(u, u->thisorder, 146, MSG_MOVE);
|
cmistake(u, ord, 146, MSG_MOVE);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (effskill(u, SK_SAILING, r) < u->ship->type->cptskill) {
|
if (effskill(u, SK_SAILING, r) < u->ship->type->cptskill) {
|
||||||
ADDMSG(&u->faction->msgs, msg_feedback(u, u->thisorder,
|
ADDMSG(&u->faction->msgs, msg_feedback(u, ord,
|
||||||
"error_captain_skill_low", "value ship", u->ship->type->cptskill,
|
"error_captain_skill_low", "value ship", u->ship->type->cptskill,
|
||||||
u->ship));
|
u->ship));
|
||||||
return false;
|
return false;
|
||||||
|
@ -1717,16 +1717,16 @@ static bool ship_ready(const region * r, unit * u)
|
||||||
if (u->ship->type->construction) {
|
if (u->ship->type->construction) {
|
||||||
assert(!u->ship->type->construction->improvement); /* sonst ist construction::size nicht ship_type::maxsize */
|
assert(!u->ship->type->construction->improvement); /* sonst ist construction::size nicht ship_type::maxsize */
|
||||||
if (u->ship->size != u->ship->type->construction->maxsize) {
|
if (u->ship->size != u->ship->type->construction->maxsize) {
|
||||||
cmistake(u, u->thisorder, 15, MSG_MOVE);
|
cmistake(u, ord, 15, MSG_MOVE);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!enoughsailors(u->ship, crew_skill(u->ship))) {
|
if (!enoughsailors(u->ship, crew_skill(u->ship))) {
|
||||||
cmistake(u, u->thisorder, 1, MSG_MOVE);
|
cmistake(u, ord, 1, MSG_MOVE);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (!cansail(r, u->ship)) {
|
if (!cansail(r, u->ship)) {
|
||||||
cmistake(u, u->thisorder, 18, MSG_MOVE);
|
cmistake(u, ord, 18, MSG_MOVE);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
|
@ -1808,7 +1808,7 @@ sail(unit * u, order * ord, bool move_on_land, region_list ** routep)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!ship_ready(starting_point, u))
|
if (!ship_ready(starting_point, u, ord))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* Wir suchen so lange nach neuen Richtungen, wie es geht. Diese werden
|
/* Wir suchen so lange nach neuen Richtungen, wie es geht. Diese werden
|
||||||
|
@ -2265,13 +2265,13 @@ static void travel(unit * u, region_list ** routep)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void move_cmd(unit * u, bool move_on_land)
|
void move_cmd(unit * u, order * ord, bool move_on_land)
|
||||||
{
|
{
|
||||||
region_list *route = NULL;
|
region_list *route = NULL;
|
||||||
|
|
||||||
assert(u->number);
|
assert(u->number);
|
||||||
if (u->ship && u == ship_owner(u->ship)) {
|
if (u->ship && u == ship_owner(u->ship)) {
|
||||||
sail(u, u->thisorder, move_on_land, &route);
|
sail(u, ord, move_on_land, &route);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
travel(u, &route);
|
travel(u, &route);
|
||||||
|
@ -2315,7 +2315,7 @@ static direction_t hunted_dir(attrib * at, int id)
|
||||||
return d;
|
return d;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int follow_ship(unit * u, order * ord)
|
int follow_ship(unit * u, order * ord)
|
||||||
{
|
{
|
||||||
region *rc = u->region;
|
region *rc = u->region;
|
||||||
size_t bytes;
|
size_t bytes;
|
||||||
|
@ -2389,7 +2389,7 @@ static int follow_ship(unit * u, order * ord)
|
||||||
init_tokens_str(command);
|
init_tokens_str(command);
|
||||||
getstrtoken();
|
getstrtoken();
|
||||||
/* NACH ausführen */
|
/* NACH ausführen */
|
||||||
move_cmd(u, false);
|
move_cmd(u, ord, false);
|
||||||
return 1; /* true -> Einheitenliste von vorne durchgehen */
|
return 1; /* true -> Einheitenliste von vorne durchgehen */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2556,13 +2556,13 @@ void movement(void)
|
||||||
if (ships) {
|
if (ships) {
|
||||||
if (u->ship && ship_owner(u->ship) == u) {
|
if (u->ship && ship_owner(u->ship) == u) {
|
||||||
init_order(u->thisorder);
|
init_order(u->thisorder);
|
||||||
move_cmd(u, false);
|
move_cmd(u, u->thisorder, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (!u->ship || ship_owner(u->ship) != u) {
|
if (!u->ship || ship_owner(u->ship) != u) {
|
||||||
init_order(u->thisorder);
|
init_order(u->thisorder);
|
||||||
move_cmd(u, false);
|
move_cmd(u, u->thisorder, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,6 +30,7 @@ extern "C" {
|
||||||
struct region_list;
|
struct region_list;
|
||||||
struct ship;
|
struct ship;
|
||||||
struct building_type;
|
struct building_type;
|
||||||
|
struct order;
|
||||||
|
|
||||||
extern struct attrib_type at_shiptrail;
|
extern struct attrib_type at_shiptrail;
|
||||||
|
|
||||||
|
@ -75,7 +76,8 @@ extern "C" {
|
||||||
bool move_blocked(const struct unit *u, const struct region *src,
|
bool move_blocked(const struct unit *u, const struct region *src,
|
||||||
const struct region *dest);
|
const struct region *dest);
|
||||||
bool can_takeoff(const struct ship * sh, const struct region * from, const struct region * to);
|
bool can_takeoff(const struct ship * sh, const struct region * from, const struct region * to);
|
||||||
void move_cmd(struct unit * u, bool move_on_land);
|
void move_cmd(struct unit * u, struct order * ord, bool move_on_land);
|
||||||
|
int follow_ship(struct unit * u, struct order * ord);
|
||||||
|
|
||||||
#define SA_HARBOUR 2
|
#define SA_HARBOUR 2
|
||||||
#define SA_COAST 1
|
#define SA_COAST 1
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
#include "move.h"
|
#include "move.h"
|
||||||
|
|
||||||
#include "guard.h"
|
#include "guard.h"
|
||||||
|
#include "keyword.h"
|
||||||
|
|
||||||
#include <kernel/config.h>
|
#include <kernel/config.h>
|
||||||
#include <kernel/ally.h>
|
#include <kernel/ally.h>
|
||||||
|
@ -14,9 +15,13 @@
|
||||||
#include <kernel/item.h>
|
#include <kernel/item.h>
|
||||||
#include <kernel/unit.h>
|
#include <kernel/unit.h>
|
||||||
#include <kernel/race.h>
|
#include <kernel/race.h>
|
||||||
|
#include <kernel/order.h>
|
||||||
|
|
||||||
#include <util/attrib.h>
|
#include <util/attrib.h>
|
||||||
#include <util/language.h>
|
#include <util/language.h>
|
||||||
|
#include <util/message.h>
|
||||||
|
#include <util/base36.h>
|
||||||
|
#include <util/parser.h>
|
||||||
|
|
||||||
#include <CuTest.h>
|
#include <CuTest.h>
|
||||||
#include <tests.h>
|
#include <tests.h>
|
||||||
|
@ -295,6 +300,69 @@ static void test_age_trails(CuTest *tc) {
|
||||||
test_cleanup();
|
test_cleanup();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
typedef struct traveldir {
|
||||||
|
int no;
|
||||||
|
direction_t dir;
|
||||||
|
int age;
|
||||||
|
} traveldir;
|
||||||
|
|
||||||
|
static void test_follow_ship_msg(CuTest * tc) {
|
||||||
|
region *r;
|
||||||
|
ship * sh;
|
||||||
|
faction *f;
|
||||||
|
unit *u;
|
||||||
|
const ship_type *stype;
|
||||||
|
message *msg;
|
||||||
|
order *ord;
|
||||||
|
item_type *silver;
|
||||||
|
|
||||||
|
traveldir *td = NULL;
|
||||||
|
attrib *a;
|
||||||
|
|
||||||
|
test_cleanup();
|
||||||
|
test_create_world();
|
||||||
|
f = test_create_faction(0);
|
||||||
|
r = findregion(0, 0);
|
||||||
|
|
||||||
|
stype = st_find("boat");
|
||||||
|
sh = test_create_ship(r, stype);
|
||||||
|
u = test_create_unit(f, r);
|
||||||
|
u->ship = sh;
|
||||||
|
ship_set_owner(u);
|
||||||
|
set_level(u, SK_SAILING, 10);
|
||||||
|
|
||||||
|
ord = create_order(K_FOLLOW, f->locale, "SHIP 2");
|
||||||
|
assert(ord);
|
||||||
|
unit_addorder(u, ord);
|
||||||
|
|
||||||
|
silver = get_resourcetype(R_SILVER)->itype;
|
||||||
|
i_change(&u->items, silver, 999999);
|
||||||
|
|
||||||
|
a = a_add(&(r->attribs), a_new(&at_shiptrail));
|
||||||
|
td = (traveldir *)a->data.v;
|
||||||
|
td->no = 2;
|
||||||
|
td->dir = D_NORTHWEST;
|
||||||
|
td->age = 2;
|
||||||
|
|
||||||
|
locale_setstring(default_locale, "northwest", "Nordwesten");
|
||||||
|
locale_setstring(default_locale, "keyword::move", "NACH");
|
||||||
|
init_locale(default_locale);
|
||||||
|
|
||||||
|
mt_register(mt_new_va("error18", "unit:unit", "region:region", "command:order", 0));
|
||||||
|
|
||||||
|
init_order(ord);
|
||||||
|
getstrtoken();
|
||||||
|
|
||||||
|
follow_ship(u, ord);
|
||||||
|
|
||||||
|
CuAssertPtrNotNull(tc, msg = test_find_messagetype(u->faction->msgs, "error18"));
|
||||||
|
void *p = msg->parameters[2].v;
|
||||||
|
CuAssertPtrNotNull(tc, p);
|
||||||
|
CuAssertIntEquals(tc, K_FOLLOW, getkeyword((order *)p));
|
||||||
|
|
||||||
|
test_cleanup();
|
||||||
|
}
|
||||||
|
|
||||||
CuSuite *get_move_suite(void)
|
CuSuite *get_move_suite(void)
|
||||||
{
|
{
|
||||||
CuSuite *suite = CuSuiteNew();
|
CuSuite *suite = CuSuiteNew();
|
||||||
|
@ -309,5 +377,6 @@ CuSuite *get_move_suite(void)
|
||||||
SUITE_ADD_TEST(suite, test_is_guarded);
|
SUITE_ADD_TEST(suite, test_is_guarded);
|
||||||
SUITE_ADD_TEST(suite, test_ship_trails);
|
SUITE_ADD_TEST(suite, test_ship_trails);
|
||||||
SUITE_ADD_TEST(suite, test_age_trails);
|
SUITE_ADD_TEST(suite, test_age_trails);
|
||||||
|
SUITE_ADD_TEST(suite, test_follow_ship_msg);
|
||||||
return suite;
|
return suite;
|
||||||
}
|
}
|
||||||
|
|
|
@ -198,7 +198,7 @@ void piracy_cmd(unit * u, order *ord)
|
||||||
|
|
||||||
/* Bewegung ausführen */
|
/* Bewegung ausführen */
|
||||||
init_order(u->thisorder);
|
init_order(u->thisorder);
|
||||||
move_cmd(u, true);
|
move_cmd(u, ord, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void age_piracy(region *r) {
|
void age_piracy(region *r) {
|
||||||
|
|
Loading…
Reference in New Issue