forked from github/server
Bug 1610 FOLGE SCHIFF und andere lange Befehle
FOLGE SCHIFF ist genau wie FOLGE EINHEIT jetzt ein Halblanger Befehl. Das ist konsequent und entfernt an einigen Stellen Spezialbehandlungen.
This commit is contained in:
parent
46ab9e7bb6
commit
c49c3af1d9
|
@ -2390,15 +2390,12 @@ static int hunt(unit * u, order * ord)
|
|||
return 0;
|
||||
} else if (!u->ship) {
|
||||
cmistake(u, ord, 144, MSG_MOVE);
|
||||
fset(u, UFL_LONGACTION | UFL_NOTMOVING); /* FOLGE SCHIFF ist immer lang */
|
||||
return 0;
|
||||
} else if (u!=ship_owner(u->ship)) {
|
||||
cmistake(u, ord, 146, MSG_MOVE);
|
||||
fset(u, UFL_LONGACTION | UFL_NOTMOVING); /* FOLGE SCHIFF ist immer lang */
|
||||
return 0;
|
||||
} else if (!can_move(u)) {
|
||||
cmistake(u, ord, 55, MSG_MOVE);
|
||||
fset(u, UFL_LONGACTION | UFL_NOTMOVING); /* FOLGE SCHIFF ist immer lang */
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -2406,7 +2403,6 @@ static int hunt(unit * u, order * ord)
|
|||
|
||||
if (id <= 0) {
|
||||
cmistake(u, ord, 20, MSG_MOVE);
|
||||
fset(u, UFL_LONGACTION | UFL_NOTMOVING); /* FOLGE SCHIFF ist immer lang */
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -2417,7 +2413,6 @@ static int hunt(unit * u, order * ord)
|
|||
if (sh == NULL || sh->region != rc) {
|
||||
cmistake(u, ord, 20, MSG_MOVE);
|
||||
}
|
||||
fset(u, UFL_LONGACTION | UFL_NOTMOVING); /* FOLGE SCHIFF ist immer lang */
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -2517,7 +2512,7 @@ static void move_hunters(void)
|
|||
break;
|
||||
}
|
||||
|
||||
if (!fval(u, UFL_NOTMOVING) && !LongHunger(u) && hunt(u, ord)) {
|
||||
if (!fval(u, UFL_LONGACTION) && !LongHunger(u) && hunt(u, ord)) {
|
||||
up = &r->units;
|
||||
break;
|
||||
}
|
||||
|
@ -2657,7 +2652,6 @@ void movement(void)
|
|||
}
|
||||
|
||||
/** Overrides long orders with a FOLLOW order if the target is moving.
|
||||
* FOLLOW SHIP is a long order, and doesn't need to be treated in here.
|
||||
* BUGS: http://bugs.eressea.de/view.php?id=1444 (A folgt B folgt C)
|
||||
*/
|
||||
void follow_unit(unit * u)
|
||||
|
@ -2665,18 +2659,22 @@ void follow_unit(unit * u)
|
|||
region *r = u->region;
|
||||
attrib *a = NULL;
|
||||
order *ord;
|
||||
unit *u2 = NULL;
|
||||
int followship = false;
|
||||
|
||||
if (fval(u, UFL_NOTMOVING) || LongHunger(u))
|
||||
return;
|
||||
|
||||
for (ord = u->orders; ord; ord = ord->next) {
|
||||
for (ord = u->orders; ord; ord = ord->next) {
|
||||
const struct locale *lang = u->faction->locale;
|
||||
|
||||
if (getkeyword(ord) == K_FOLLOW) {
|
||||
init_tokens(ord);
|
||||
skip_token();
|
||||
if (getparam(lang) == P_UNIT) {
|
||||
int id = read_unitid(u->faction, r);
|
||||
int id;
|
||||
param_t p = getparam(lang);
|
||||
if (p == P_UNIT) {
|
||||
id = read_unitid(u->faction, r);
|
||||
|
||||
if (a != NULL) {
|
||||
a = a_find(u->attribs, &at_follow);
|
||||
|
@ -2693,32 +2691,71 @@ void follow_unit(unit * u)
|
|||
a_remove(&u->attribs, a);
|
||||
a = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (p == P_SHIP) {
|
||||
id = getshipid();
|
||||
if (id <= 0) {
|
||||
/* cmistake(u, ord, 20, MSG_MOVE); */
|
||||
}
|
||||
else {
|
||||
ship *sh = findship(id);
|
||||
if (sh == NULL || (sh->region != r && hunted_dir(r->attribs, id) == NODIRECTION)) {
|
||||
cmistake(u, ord, 20, MSG_MOVE);
|
||||
}
|
||||
else if (!u->ship) {
|
||||
/* cmistake(u, ord, 144, MSG_MOVE); */
|
||||
}
|
||||
else if (u != ship_owner(u->ship)) {
|
||||
/* cmistake(u, ord, 146, MSG_MOVE); */
|
||||
}
|
||||
else if (!can_move(u)) {
|
||||
/* cmistake(u, ord, 55, MSG_MOVE); */
|
||||
}
|
||||
else {
|
||||
u2 = ship_owner(sh);
|
||||
followship = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (a && !fval(u, UFL_MOVED | UFL_NOTMOVING)) {
|
||||
unit *u2 = a->data.v;
|
||||
if ((a || followship )&& !fval(u, UFL_MOVED | UFL_NOTMOVING)) {
|
||||
if (!followship) {
|
||||
u2 = a->data.v;
|
||||
}
|
||||
bool follow = false;
|
||||
|
||||
if (!u2 || u2->region != r || !cansee(u->faction, r, u2, 0)) {
|
||||
if (!u2 || (u2->region != r || !cansee(u->faction, r, u2, 0)) && !followship) {
|
||||
return;
|
||||
}
|
||||
|
||||
switch (getkeyword(u2->thisorder)) {
|
||||
case K_MOVE:
|
||||
case K_ROUTE:
|
||||
follow = true;
|
||||
break;
|
||||
case K_DRIVE:
|
||||
follow = true;
|
||||
if (!followship) {
|
||||
follow = true;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
for (ord = u2->orders; ord; ord = ord->next) {
|
||||
switch (getkeyword(ord)) {
|
||||
case K_FOLLOW:
|
||||
follow = true;
|
||||
break;
|
||||
case K_PIRACY:
|
||||
follow = true;
|
||||
if (followship) {
|
||||
follow = true;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
if (followship && u2->region != r) {
|
||||
follow = true;
|
||||
break;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
|
|
|
@ -406,16 +406,6 @@ bool is_repeated(const order * ord)
|
|||
result = 1;
|
||||
break;
|
||||
|
||||
case K_FOLLOW:
|
||||
/* FOLLOW is only a long order if we are following a ship. */
|
||||
parser_pushstate();
|
||||
init_tokens(ord);
|
||||
skip_token();
|
||||
s = getstrtoken();
|
||||
result = isparam(s, lang, P_SHIP);
|
||||
parser_popstate();
|
||||
break;
|
||||
|
||||
case K_MAKE:
|
||||
/* Falls wir MACHE TEMP haben, ignorieren wir es. Alle anderen
|
||||
* Arten von MACHE zaehlen aber als neue defaults und werden
|
||||
|
@ -469,15 +459,6 @@ bool is_exclusive(const order * ord)
|
|||
result = 1;
|
||||
break;
|
||||
|
||||
case K_FOLLOW:
|
||||
/* FOLLOW is only a long order if we are following a ship. */
|
||||
parser_pushstate();
|
||||
init_tokens(ord);
|
||||
skip_token();
|
||||
result = isparam(getstrtoken(), lang, P_SHIP);
|
||||
parser_popstate();
|
||||
break;
|
||||
|
||||
case K_MAKE:
|
||||
/* Falls wir MACHE TEMP haben, ignorieren wir es. Alle anderen
|
||||
* Arten von MACHE zaehlen aber als neue defaults und werden
|
||||
|
@ -532,15 +513,6 @@ bool is_long(const order * ord)
|
|||
case K_PLANT:
|
||||
return true;
|
||||
|
||||
case K_FOLLOW:
|
||||
/* FOLLOW is only a long order if we are following a ship. */
|
||||
parser_pushstate();
|
||||
init_tokens(ord);
|
||||
skip_token();
|
||||
result = isparam(getstrtoken(), lang, P_SHIP);
|
||||
parser_popstate();
|
||||
break;
|
||||
|
||||
case K_MAKE:
|
||||
/* Falls wir MACHE TEMP haben, ignorieren wir es. Alle anderen
|
||||
* Arten von MACHE zaehlen aber als neue defaults und werden
|
||||
|
|
Loading…
Reference in New Issue