diff --git a/src/common/gamecode/economy.c b/src/common/gamecode/economy.c
index dcc65c68c..6f6325397 100644
--- a/src/common/gamecode/economy.c
+++ b/src/common/gamecode/economy.c
@@ -563,6 +563,7 @@ give_cmd(unit * u, order * ord)
int i, n;
const item_type * itype;
int notfound_error = 63;
+ param_t p;
init_tokens(ord);
skip_token();
@@ -591,8 +592,9 @@ give_cmd(unit * u, order * ord)
}
s = getstrtoken();
+ p = findparam(s, u->faction->locale);
- if (findparam(s, u->faction->locale) == P_CONTROL) {
+ if (p == P_CONTROL) {
if (!u2) {
cmistake(u, ord, notfound_error, MSG_EVENT);
return;
@@ -629,19 +631,20 @@ give_cmd(unit * u, order * ord)
}
return;
}
- if (u2 && u2->race == new_race[RC_SPELL]) {
+
+ else if (u2 && u2->race == new_race[RC_SPELL]) {
cmistake(u, ord, notfound_error, MSG_COMMERCE);
return;
}
/* if ((u->race->ec_flags & NOGIVE) || fval(u,UFL_LOCKED)) {*/
- if (u->race->ec_flags & NOGIVE && u2!=NULL) {
+ else if (u->race->ec_flags & NOGIVE && u2!=NULL) {
ADDMSG(&u->faction->msgs,
msg_feedback(u, ord, "race_nogive", "race", u->race));
return;
}
/* sperrt hier auch personenübergaben!
- if (u2 && !(u2->race->ec_flags & GETITEM)) {
+ else if (u2 && !(u2->race->ec_flags & GETITEM)) {
ADDMSG(&u->faction->msgs,
msg_feedback(u, ord, "race_notake", "race", u2->race));
return;
@@ -649,7 +652,7 @@ give_cmd(unit * u, order * ord)
*/
/* Übergabe aller Kräuter */
- if (findparam(s, u->faction->locale) == P_HERBS) {
+ else if (p == P_HERBS) {
boolean given = false;
if (!(u->race->ec_flags & GIVEITEM) && u2!=NULL) {
ADDMSG(&u->faction->msgs,
@@ -685,12 +688,14 @@ give_cmd(unit * u, order * ord)
if (!given) cmistake(u, ord, 38, MSG_COMMERCE);
return;
}
- if (findparam(s, u->faction->locale) == P_ZAUBER) {
+
+ else if (p == P_ZAUBER) {
cmistake(u, ord, 7, MSG_COMMERCE);
/* geht nimmer */
return;
}
- if (findparam(s, u->faction->locale) == P_UNIT) { /* Einheiten uebergeben */
+
+ else if (p == P_UNIT) { /* Einheiten uebergeben */
if (!(u->race->ec_flags & GIVEUNIT)) {
cmistake(u, ord, 167, MSG_COMMERCE);
return;
@@ -703,15 +708,18 @@ give_cmd(unit * u, order * ord)
give_unit(u, u2, ord);
return;
}
- if (findparam(s, u->faction->locale) == P_ANY) { /* Alle Gegenstände übergeben */
+
+ else if (p==P_ANY) {
const char * s = getstrtoken();
- if (u2 && !alliedunit(u2, u->faction, HELP_GIVE) && !ucontact(u2, u)) {
- cmistake(u, ord, 40, MSG_COMMERCE);
- return;
- }
+ if (*s == 0) { /* Alle Gegenstände übergeben */
- if (*s == 0) {
+ if (u2 && !alliedunit(u2, u->faction, HELP_GIVE) && !ucontact(u2, u)) {
+ cmistake(u, ord, 40, MSG_COMMERCE);
+ return;
+ }
+
+ /* do these checks once, not for each item we have: */
if (!(u->race->ec_flags & GIVEITEM) && u2!=NULL) {
ADDMSG(&u->faction->msgs,
msg_feedback(u, ord, "race_nogive", "race", u->race));
@@ -724,7 +732,7 @@ give_cmd(unit * u, order * ord)
}
/* für alle items einmal prüfen, ob wir mehr als von diesem Typ
- * reserviert ist besitzen und diesen Teil dann übergeben */
+ * reserviert ist besitzen und diesen Teil dann übergeben */
if (u->items) {
item **itmp=&u->items;
while (*itmp) {
@@ -739,41 +747,54 @@ give_cmd(unit * u, order * ord)
}
return;
}
- i = findparam(s, u->faction->locale);
- if (i == P_PERSON) {
- if (!(u->race->ec_flags & GIVEPERSON)) {
+ else {
+ param_t p2 = findparam(s, u->faction->locale);
+
+ if (p2 == P_PERSON) {
+ if (!(u->race->ec_flags & GIVEPERSON)) {
+ ADDMSG(&u->faction->msgs,
+ msg_feedback(u, ord, "race_noregroup", "race", u->race));
+ return;
+ }
+ n = u->number;
+ give_men(n, u, u2, ord);
+ return;
+ }
+
+ if (!(u->race->ec_flags & GIVEITEM) && u2!=NULL) {
ADDMSG(&u->faction->msgs,
- msg_feedback(u, ord, "race_noregroup", "race", u->race));
+ msg_feedback(u, ord, "race_nogive", "race", u->race));
return;
}
- n = u->number;
- give_men(n, u, u2, ord);
- return;
- }
-
- if (!(u->race->ec_flags & GIVEITEM) && u2!=NULL) {
- ADDMSG(&u->faction->msgs,
- msg_feedback(u, ord, "race_nogive", "race", u->race));
- return;
- }
- if (u2 && !(u2->race->ec_flags & GETITEM)) {
- ADDMSG(&u->faction->msgs,
- msg_feedback(u, ord, "race_notake", "race", u2->race));
- return;
- }
-
- itype = finditemtype(s, u->faction->locale);
- if (itype!=NULL) {
- item * i = *i_find(&u->items, itype);
- if (i!=NULL) {
- n = i->number - get_reservation(u, itype->rtype);
- give_item(n, itype, u, u2, ord);
+ if (u2 && !(u2->race->ec_flags & GETITEM)) {
+ ADDMSG(&u->faction->msgs,
+ msg_feedback(u, ord, "race_notake", "race", u2->race));
return;
}
+
+ itype = finditemtype(s, u->faction->locale);
+ if (itype!=NULL) {
+ item * i = *i_find(&u->items, itype);
+ if (i!=NULL) {
+ n = i->number - get_reservation(u, itype->rtype);
+ give_item(n, itype, u, u2, ord);
+ return;
+ }
+ }
}
+ } else if (p==P_EACH) {
+ if (u2==NULL) {
+ ADDMSG(&u->faction->msgs,
+ msg_feedback(u, ord, "peasants_give_invalid", ""));
+ return;
+ }
+ s = getstrtoken(); /* skip one ahead to get the amount. */
}
n = atoip(s); /* n: anzahl */
+ if (p==P_EACH) {
+ n *= u2->number;
+ }
s = getstrtoken();
if (s == NULL) {
diff --git a/src/common/kernel/eressea.c b/src/common/kernel/eressea.c
index 862c0fa88..5a322ee55 100644
--- a/src/common/kernel/eressea.c
+++ b/src/common/kernel/eressea.c
@@ -280,6 +280,7 @@ const char *parameters[MAXPARAMS] =
{
"LOCALE",
"ALLES",
+ "JEDEM",
"BAUERN",
"BURG",
"EINHEIT",
diff --git a/src/common/kernel/eressea.h b/src/common/kernel/eressea.h
index f8c2d8d20..caa86fbfd 100644
--- a/src/common/kernel/eressea.h
+++ b/src/common/kernel/eressea.h
@@ -450,7 +450,8 @@ enum {
typedef unsigned char param_t;
enum {
P_LOCALE,
- P_ANY,
+ P_ANY,
+ P_EACH,
P_PEASANT,
P_BUILDING,
P_UNIT,
diff --git a/src/res/de/strings.xml b/src/res/de/strings.xml
index 71c17d544..4214764a3 100644
--- a/src/res/de/strings.xml
+++ b/src/res/de/strings.xml
@@ -1825,6 +1825,9 @@
AGGRESSIV
+
+ JEDEM
+
ALLES
diff --git a/src/res/en/strings.xml b/src/res/en/strings.xml
index bd87e76d5..638eab4cc 100644
--- a/src/res/en/strings.xml
+++ b/src/res/en/strings.xml
@@ -1157,6 +1157,9 @@
ALL
+
+ EACH
+
NUMBER