forked from github/server
indentation + whitespace changes
This commit is contained in:
parent
bf4bda36a2
commit
1918f56990
271
src/economy.c
271
src/economy.c
|
@ -1,7 +1,8 @@
|
||||||
/*
|
/*
|
||||||
Copyright (c) 1998-2010, Enno Rehling <enno@eressea.de>
|
Copyright (c) 1998-2014,
|
||||||
Katja Zedel <katze@felidae.kn-bremen.de
|
Enno Rehling <enno@eressea.de>
|
||||||
Christian Schlittchen <corwin@amber.kn-bremen.de>
|
Katja Zedel <katze@felidae.kn-bremen.de
|
||||||
|
Christian Schlittchen <corwin@amber.kn-bremen.de>
|
||||||
|
|
||||||
Permission to use, copy, modify, and/or distribute this software for any
|
Permission to use, copy, modify, and/or distribute this software for any
|
||||||
purpose with or without fee is hereby granted, provided that the above
|
purpose with or without fee is hereby granted, provided that the above
|
||||||
|
@ -158,7 +159,7 @@ static void expandorders(region * r, request * requests)
|
||||||
|
|
||||||
if (norders > 0) {
|
if (norders > 0) {
|
||||||
int i = 0;
|
int i = 0;
|
||||||
oa = (request *) calloc(norders, sizeof(request));
|
oa = (request *)calloc(norders, sizeof(request));
|
||||||
for (o = requests; o; o = o->next) {
|
for (o = requests; o; o = o->next) {
|
||||||
if (o->qty > 0) {
|
if (o->qty > 0) {
|
||||||
int j;
|
int j;
|
||||||
|
@ -170,7 +171,8 @@ static void expandorders(region * r, request * requests)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
scramble(oa, norders, sizeof(request));
|
scramble(oa, norders, sizeof(request));
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
oa = NULL;
|
oa = NULL;
|
||||||
}
|
}
|
||||||
while (requests) {
|
while (requests) {
|
||||||
|
@ -203,7 +205,7 @@ typedef struct recruitment {
|
||||||
* to the faction's struct and to total.
|
* to the faction's struct and to total.
|
||||||
*/
|
*/
|
||||||
static recruitment *select_recruitment(request ** rop,
|
static recruitment *select_recruitment(request ** rop,
|
||||||
int (*quantify) (const struct race *, int), int *total)
|
int(*quantify) (const struct race *, int), int *total)
|
||||||
{
|
{
|
||||||
recruitment *recruits = NULL;
|
recruitment *recruits = NULL;
|
||||||
|
|
||||||
|
@ -216,7 +218,8 @@ static recruitment *select_recruitment(request ** rop,
|
||||||
|
|
||||||
if (qty < 0) {
|
if (qty < 0) {
|
||||||
rop = &ro->next; /* skip this one */
|
rop = &ro->next; /* skip this one */
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
*rop = ro->next; /* remove this one */
|
*rop = ro->next; /* remove this one */
|
||||||
while (rec && rec->f != u->faction)
|
while (rec && rec->f != u->faction)
|
||||||
rec = rec->next;
|
rec = rec->next;
|
||||||
|
@ -250,7 +253,8 @@ static void add_recruits(unit * u, int number, int wanted)
|
||||||
set_number(u, number);
|
set_number(u, number);
|
||||||
u->hp = number * unit_max_hp(u);
|
u->hp = number * unit_max_hp(u);
|
||||||
unew = u;
|
unew = u;
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
unew = create_unit(r, u->faction, number, u_race(u), 0, NULL, u);
|
unew = create_unit(r, u->faction, number, u_race(u), 0, NULL, u);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -281,11 +285,11 @@ static int any_recruiters(const struct race *rc, int qty)
|
||||||
|
|
||||||
/*static int peasant_recruiters(const struct race *rc, int qty)
|
/*static int peasant_recruiters(const struct race *rc, int qty)
|
||||||
{
|
{
|
||||||
if (rc->ec_flags & ECF_REC_ETHEREAL)
|
if (rc->ec_flags & ECF_REC_ETHEREAL)
|
||||||
return -1;
|
return -1;
|
||||||
if (rc->ec_flags & ECF_REC_HORSES)
|
if (rc->ec_flags & ECF_REC_HORSES)
|
||||||
return -1;
|
return -1;
|
||||||
return (int)(qty * 2 * rc->recruit_multi);
|
return (int)(qty * 2 * rc->recruit_multi);
|
||||||
}*/
|
}*/
|
||||||
|
|
||||||
static int horse_recruiters(const struct race *rc, int qty)
|
static int horse_recruiters(const struct race *rc, int qty)
|
||||||
|
@ -408,7 +412,8 @@ static bool can_give(const unit * u, const unit * u2, const item_type * itype, i
|
||||||
}
|
}
|
||||||
return (rule & mask) != 0;
|
return (rule & mask) != 0;
|
||||||
}
|
}
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
int rule = rule_give();
|
int rule = rule_give();
|
||||||
return (rule & GIVE_PEASANTS) != 0;
|
return (rule & GIVE_PEASANTS) != 0;
|
||||||
}
|
}
|
||||||
|
@ -478,9 +483,10 @@ static int recruit_cost(const faction * f, const race * rc)
|
||||||
{
|
{
|
||||||
if (is_monsters(f) || f->race == rc) {
|
if (is_monsters(f) || f->race == rc) {
|
||||||
return rc->recruitcost;
|
return rc->recruitcost;
|
||||||
} else if (valid_race(f, rc)) {
|
}
|
||||||
|
else if (valid_race(f, rc)) {
|
||||||
return rc->recruitcost;
|
return rc->recruitcost;
|
||||||
/* return get_param_int(f->race->parameters, "other_cost", -1); */
|
/* return get_param_int(f->race->parameters, "other_cost", -1); */
|
||||||
}
|
}
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -613,7 +619,7 @@ static void recruit(unit * u, struct order *ord, request ** recruitorders)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
o = (request *) calloc(1, sizeof(request));
|
o = (request *)calloc(1, sizeof(request));
|
||||||
o->qty = n;
|
o->qty = n;
|
||||||
o->unit = u;
|
o->unit = u;
|
||||||
o->ord = copy_order(ord);
|
o->ord = copy_order(ord);
|
||||||
|
@ -637,7 +643,7 @@ void give_control(unit * u, unit * u2)
|
||||||
region *r = u->region;
|
region *r = u->region;
|
||||||
faction *f = region_get_owner(r);
|
faction *f = region_get_owner(r);
|
||||||
|
|
||||||
assert(u->building==u2->building);
|
assert(u->building == u2->building);
|
||||||
if (f == u->faction) {
|
if (f == u->faction) {
|
||||||
building *b = largestbuilding(r, &cmp_current_owner, false);
|
building *b = largestbuilding(r, &cmp_current_owner, false);
|
||||||
if (b == u->building) {
|
if (b == u->building) {
|
||||||
|
@ -648,7 +654,7 @@ void give_control(unit * u, unit * u2)
|
||||||
building_set_owner(u2);
|
building_set_owner(u2);
|
||||||
}
|
}
|
||||||
if (u->ship) {
|
if (u->ship) {
|
||||||
assert(u->ship==u2->ship);
|
assert(u->ship == u2->ship);
|
||||||
ship_set_owner(u2);
|
ship_set_owner(u2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -673,18 +679,23 @@ int give_control_cmd(unit * u, order * ord)
|
||||||
if (!u2 || u2->number == 0) {
|
if (!u2 || u2->number == 0) {
|
||||||
msg = msg_feedback(u, ord, "feedback_unit_not_found", "");
|
msg = msg_feedback(u, ord, "feedback_unit_not_found", "");
|
||||||
ADDMSG(&u->faction->msgs, msg);
|
ADDMSG(&u->faction->msgs, msg);
|
||||||
} else if (!u->building && !u->ship) {
|
}
|
||||||
|
else if (!u->building && !u->ship) {
|
||||||
msg = cmistake(u, ord, 140, MSG_EVENT);
|
msg = cmistake(u, ord, 140, MSG_EVENT);
|
||||||
} else if (u->building) {
|
}
|
||||||
if (u!=building_owner(u->building)) {
|
else if (u->building) {
|
||||||
|
if (u != building_owner(u->building)) {
|
||||||
msg = cmistake(u, ord, 49, MSG_EVENT);
|
msg = cmistake(u, ord, 49, MSG_EVENT);
|
||||||
} else if (u2->building != u->building) {
|
}
|
||||||
|
else if (u2->building != u->building) {
|
||||||
msg = cmistake(u, ord, 33, MSG_EVENT);
|
msg = cmistake(u, ord, 33, MSG_EVENT);
|
||||||
}
|
}
|
||||||
} else if (u->ship) {
|
}
|
||||||
if (u!=ship_owner(u->ship)) {
|
else if (u->ship) {
|
||||||
|
if (u != ship_owner(u->ship)) {
|
||||||
msg = cmistake(u, ord, 49, MSG_EVENT);
|
msg = cmistake(u, ord, 49, MSG_EVENT);
|
||||||
} else if (u2->ship != u->ship) {
|
}
|
||||||
|
else if (u2->ship != u->ship) {
|
||||||
msg = cmistake(u, ord, 32, MSG_EVENT);
|
msg = cmistake(u, ord, 32, MSG_EVENT);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -724,7 +735,7 @@ static void give_cmd(unit * u, order * ord)
|
||||||
u2 = getunit(r, u->faction);
|
u2 = getunit(r, u->faction);
|
||||||
s = getstrtoken();
|
s = getstrtoken();
|
||||||
n = atoip(s);
|
n = atoip(s);
|
||||||
p = (n>0) ? NOPARAM : findparam(s, u->faction->locale);
|
p = (n > 0) ? NOPARAM : findparam(s, u->faction->locale);
|
||||||
|
|
||||||
/* first, do all the ones that do not require HELP_GIVE or CONTACT */
|
/* first, do all the ones that do not require HELP_GIVE or CONTACT */
|
||||||
if (p == P_CONTROL) {
|
if (p == P_CONTROL) {
|
||||||
|
@ -878,22 +889,27 @@ static void give_cmd(unit * u, order * ord)
|
||||||
itmp = &itm->next;
|
itmp = &itm->next;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
if (isparam(s, u->faction->locale, P_PERSON)) {
|
if (isparam(s, u->faction->locale, P_PERSON)) {
|
||||||
if (!(u_race(u)->ec_flags & GIVEPERSON)) {
|
if (!(u_race(u)->ec_flags & GIVEPERSON)) {
|
||||||
ADDMSG(&u->faction->msgs,
|
ADDMSG(&u->faction->msgs,
|
||||||
msg_feedback(u, ord, "race_noregroup", "race", u_race(u)));
|
msg_feedback(u, ord, "race_noregroup", "race", u_race(u)));
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
n = u->number;
|
n = u->number;
|
||||||
give_men(n, u, u2, ord);
|
give_men(n, u, u2, ord);
|
||||||
}
|
}
|
||||||
} else if (!(u_race(u)->ec_flags & GIVEITEM) && u2 != NULL) {
|
}
|
||||||
|
else if (!(u_race(u)->ec_flags & GIVEITEM) && u2 != NULL) {
|
||||||
ADDMSG(&u->faction->msgs,
|
ADDMSG(&u->faction->msgs,
|
||||||
msg_feedback(u, ord, "race_nogive", "race", u_race(u)));
|
msg_feedback(u, ord, "race_nogive", "race", u_race(u)));
|
||||||
} else if (u2 && !(u_race(u2)->ec_flags & GETITEM)) {
|
}
|
||||||
|
else if (u2 && !(u_race(u2)->ec_flags & GETITEM)) {
|
||||||
ADDMSG(&u->faction->msgs,
|
ADDMSG(&u->faction->msgs,
|
||||||
msg_feedback(u, ord, "race_notake", "race", u_race(u2)));
|
msg_feedback(u, ord, "race_notake", "race", u_race(u2)));
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
itype = finditemtype(s, u->faction->locale);
|
itype = finditemtype(s, u->faction->locale);
|
||||||
if (itype != NULL) {
|
if (itype != NULL) {
|
||||||
item *i = *i_find(&u->items, itype);
|
item *i = *i_find(&u->items, itype);
|
||||||
|
@ -901,7 +917,8 @@ static void give_cmd(unit * u, order * ord)
|
||||||
if (can_give(u, u2, itype, 0)) {
|
if (can_give(u, u2, itype, 0)) {
|
||||||
n = i->number - get_reservation(u, itype->rtype);
|
n = i->number - get_reservation(u, itype->rtype);
|
||||||
give_item(n, itype, u, u2, ord);
|
give_item(n, itype, u, u2, ord);
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
feedback_give_not_allowed(u, ord);
|
feedback_give_not_allowed(u, ord);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -909,7 +926,8 @@ static void give_cmd(unit * u, order * ord)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
} else if (p == P_EACH) {
|
}
|
||||||
|
else if (p == P_EACH) {
|
||||||
if (u2 == NULL) {
|
if (u2 == NULL) {
|
||||||
ADDMSG(&u->faction->msgs,
|
ADDMSG(&u->faction->msgs,
|
||||||
msg_feedback(u, ord, "peasants_give_invalid", ""));
|
msg_feedback(u, ord, "peasants_give_invalid", ""));
|
||||||
|
@ -953,7 +971,8 @@ static void give_cmd(unit * u, order * ord)
|
||||||
if (itype != NULL) {
|
if (itype != NULL) {
|
||||||
if (can_give(u, u2, itype, 0)) {
|
if (can_give(u, u2, itype, 0)) {
|
||||||
give_item(n, itype, u, u2, ord);
|
give_item(n, itype, u, u2, ord);
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
feedback_give_not_allowed(u, ord);
|
feedback_give_not_allowed(u, ord);
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
|
@ -1118,7 +1137,8 @@ static bool maintain(building * b, bool first)
|
||||||
}
|
}
|
||||||
assert(cost == 0);
|
assert(cost == 0);
|
||||||
}
|
}
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
ADDMSG(&u->faction->msgs, msg_message("maintenancefail", "unit building", u, b));
|
ADDMSG(&u->faction->msgs, msg_message("maintenancefail", "unit building", u, b));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -1143,7 +1163,8 @@ void maintain_buildings(region * r, bool crash)
|
||||||
if (u) {
|
if (u) {
|
||||||
add_message(&u->faction->msgs, msg);
|
add_message(&u->faction->msgs, msg);
|
||||||
r_addmessage(r, u->faction, msg);
|
r_addmessage(r, u->faction, msg);
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
add_message(&r->msgs, msg);
|
add_message(&r->msgs, msg);
|
||||||
}
|
}
|
||||||
msg_release(msg);
|
msg_release(msg);
|
||||||
|
@ -1169,7 +1190,8 @@ void economics(region * r)
|
||||||
keyword_t kwd = getkeyword(ord);
|
keyword_t kwd = getkeyword(ord);
|
||||||
if (kwd == K_GIVE) {
|
if (kwd == K_GIVE) {
|
||||||
give_cmd(u, ord);
|
give_cmd(u, ord);
|
||||||
} else if (kwd == K_FORGET) {
|
}
|
||||||
|
else if (kwd == K_FORGET) {
|
||||||
forget_cmd(u, ord);
|
forget_cmd(u, ord);
|
||||||
}
|
}
|
||||||
if (u->orders == NULL) {
|
if (u->orders == NULL) {
|
||||||
|
@ -1272,7 +1294,8 @@ static void manufacture(unit * u, const item_type * itype, int want)
|
||||||
ADDMSG(&u->faction->msgs, msg_message("manufacture",
|
ADDMSG(&u->faction->msgs, msg_message("manufacture",
|
||||||
"unit region amount wanted resource", u, u->region, n, want,
|
"unit region amount wanted resource", u, u->region, n, want,
|
||||||
itype->rtype));
|
itype->rtype));
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
ADDMSG(&u->faction->msgs, msg_feedback(u, u->thisorder, "error_cannotmake",
|
ADDMSG(&u->faction->msgs, msg_feedback(u, u->thisorder, "error_cannotmake",
|
||||||
""));
|
""));
|
||||||
}
|
}
|
||||||
|
@ -1322,7 +1345,7 @@ static void allocate_resource(unit * u, const resource_type * rtype, int want)
|
||||||
allocation_list *alist;
|
allocation_list *alist;
|
||||||
allocation *al;
|
allocation *al;
|
||||||
attrib *a = a_find(rtype->attribs, &at_resourcelimit);
|
attrib *a = a_find(rtype->attribs, &at_resourcelimit);
|
||||||
resource_limit *rdata = (resource_limit *) a->data.v;
|
resource_limit *rdata = (resource_limit *)a->data.v;
|
||||||
const resource_type *rring;
|
const resource_type *rring;
|
||||||
int amount, skill;
|
int amount, skill;
|
||||||
|
|
||||||
|
@ -1374,7 +1397,7 @@ static void allocate_resource(unit * u, const resource_type * rtype, int want)
|
||||||
* Als magische Wesen 'sehen' Bergwächter alles und werden durch
|
* Als magische Wesen 'sehen' Bergwächter alles und werden durch
|
||||||
* Belagerung nicht aufgehalten. (Ansonsten wie oben bei Elfen anpassen).
|
* Belagerung nicht aufgehalten. (Ansonsten wie oben bei Elfen anpassen).
|
||||||
*/
|
*/
|
||||||
if (itype->rtype && (itype->rtype==get_resourcetype(R_IRON) || itype->rtype==rt_find("laen"))) {
|
if (itype->rtype && (itype->rtype == get_resourcetype(R_IRON) || itype->rtype == rt_find("laen"))) {
|
||||||
unit *u2;
|
unit *u2;
|
||||||
for (u2 = r->units; u2; u2 = u2->next) {
|
for (u2 = r->units; u2; u2 = u2->next) {
|
||||||
if (is_guard(u, GUARD_MINING)
|
if (is_guard(u, GUARD_MINING)
|
||||||
|
@ -1403,7 +1426,8 @@ static void allocate_resource(unit * u, const resource_type * rtype, int want)
|
||||||
"skill minskill product", sk, itype->construction->minskill,
|
"skill minskill product", sk, itype->construction->minskill,
|
||||||
itype->rtype));
|
itype->rtype));
|
||||||
return;
|
return;
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
struct building *b = inside_building(u);
|
struct building *b = inside_building(u);
|
||||||
const struct building_type *btype = b ? b->type : NULL;
|
const struct building_type *btype = b ? b->type : NULL;
|
||||||
|
|
||||||
|
@ -1515,10 +1539,12 @@ leveled_allocation(const resource_type * rtype, region * r, allocation * alist)
|
||||||
>= rm->level + itype->construction->minskill - 1) {
|
>= rm->level + itype->construction->minskill - 1) {
|
||||||
if (req) {
|
if (req) {
|
||||||
norders += req;
|
norders += req;
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
fset(al, AFL_DONE);
|
fset(al, AFL_DONE);
|
||||||
}
|
}
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
fset(al, AFL_DONE);
|
fset(al, AFL_DONE);
|
||||||
if (first)
|
if (first)
|
||||||
fset(al, AFL_LOWSKILL);
|
fset(al, AFL_LOWSKILL);
|
||||||
|
@ -1561,7 +1587,7 @@ attrib_allocation(const resource_type * rtype, region * r, allocation * alist)
|
||||||
allocation *al;
|
allocation *al;
|
||||||
int norders = 0;
|
int norders = 0;
|
||||||
attrib *a = a_find(rtype->attribs, &at_resourcelimit);
|
attrib *a = a_find(rtype->attribs, &at_resourcelimit);
|
||||||
resource_limit *rdata = (resource_limit *) a->data.v;
|
resource_limit *rdata = (resource_limit *)a->data.v;
|
||||||
int avail = rdata->value;
|
int avail = rdata->value;
|
||||||
|
|
||||||
for (al = alist; al; al = al->next) {
|
for (al = alist; al; al = al->next) {
|
||||||
|
@ -1595,15 +1621,15 @@ attrib_allocation(const resource_type * rtype, region * r, allocation * alist)
|
||||||
assert(avail == 0 || norders == 0);
|
assert(avail == 0 || norders == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef void (*allocate_function) (const resource_type *, struct region *,
|
typedef void(*allocate_function) (const resource_type *, struct region *,
|
||||||
struct allocation *);
|
struct allocation *);
|
||||||
|
|
||||||
static allocate_function get_allocator(const struct resource_type *rtype)
|
static allocate_function get_allocator(const struct resource_type *rtype)
|
||||||
{
|
{
|
||||||
attrib *a = a_find(rtype->attribs, &at_resourcelimit);
|
attrib *a = a_find(rtype->attribs, &at_resourcelimit);
|
||||||
|
|
||||||
if (a != NULL) {
|
if (a != NULL) {
|
||||||
resource_limit *rdata = (resource_limit *) a->data.v;
|
resource_limit *rdata = (resource_limit *)a->data.v;
|
||||||
if (rdata->value > 0 || rdata->limit != NULL) {
|
if (rdata->value > 0 || rdata->limit != NULL) {
|
||||||
return attrib_allocation;
|
return attrib_allocation;
|
||||||
}
|
}
|
||||||
|
@ -1697,7 +1723,8 @@ static void create_item(unit * u, const item_type * itype, int want)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
allocate_resource(u, itype->rtype, want);
|
allocate_resource(u, itype->rtype, want);
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
const potion_type *ptype = resource2potion(itype->rtype);
|
const potion_type *ptype = resource2potion(itype->rtype);
|
||||||
if (ptype != NULL)
|
if (ptype != NULL)
|
||||||
create_potion(u, ptype, want);
|
create_potion(u, ptype, want);
|
||||||
|
@ -1731,7 +1758,8 @@ int make_cmd(unit * u, struct order *ord)
|
||||||
if (!strcmp(ibuf, (const char *)s)) {
|
if (!strcmp(ibuf, (const char *)s)) {
|
||||||
/* first came a want-paramter */
|
/* first came a want-paramter */
|
||||||
s = getstrtoken();
|
s = getstrtoken();
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
m = INT_MAX;
|
m = INT_MAX;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1745,25 +1773,30 @@ int make_cmd(unit * u, struct order *ord)
|
||||||
plane *pl = rplane(r);
|
plane *pl = rplane(r);
|
||||||
if (pl && fval(pl, PFL_NOBUILD)) {
|
if (pl && fval(pl, PFL_NOBUILD)) {
|
||||||
cmistake(u, ord, 275, MSG_PRODUCE);
|
cmistake(u, ord, 275, MSG_PRODUCE);
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
direction_t d = get_direction(getstrtoken(), u->faction->locale);
|
direction_t d = get_direction(getstrtoken(), u->faction->locale);
|
||||||
if (d != NODIRECTION) {
|
if (d != NODIRECTION) {
|
||||||
build_road(r, u, m, d);
|
build_road(r, u, m, d);
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
/* Die Richtung wurde nicht erkannt */
|
/* Die Richtung wurde nicht erkannt */
|
||||||
cmistake(u, ord, 71, MSG_PRODUCE);
|
cmistake(u, ord, 71, MSG_PRODUCE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
} else if (p == P_SHIP) {
|
}
|
||||||
|
else if (p == P_SHIP) {
|
||||||
plane *pl = rplane(r);
|
plane *pl = rplane(r);
|
||||||
if (pl && fval(pl, PFL_NOBUILD)) {
|
if (pl && fval(pl, PFL_NOBUILD)) {
|
||||||
cmistake(u, ord, 276, MSG_PRODUCE);
|
cmistake(u, ord, 276, MSG_PRODUCE);
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
continue_ship(r, u, m);
|
continue_ship(r, u, m);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
} else if (p == P_HERBS) {
|
}
|
||||||
|
else if (p == P_HERBS) {
|
||||||
herbsearch(r, u, m);
|
herbsearch(r, u, m);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -1780,14 +1813,16 @@ int make_cmd(unit * u, struct order *ord)
|
||||||
if (itype->construction == NULL) {
|
if (itype->construction == NULL) {
|
||||||
/* if the item cannot be made, we probably didn't mean to make it */
|
/* if the item cannot be made, we probably didn't mean to make it */
|
||||||
itype = NULL;
|
itype = NULL;
|
||||||
} else if (stype != NULL) {
|
}
|
||||||
|
else if (stype != NULL) {
|
||||||
const char *sname = LOC(lang, stype->_name);
|
const char *sname = LOC(lang, stype->_name);
|
||||||
const char *iname = LOC(lang, resourcename(itype->rtype, 0));
|
const char *iname = LOC(lang, resourcename(itype->rtype, 0));
|
||||||
if (strlen(iname) < strlen(sname))
|
if (strlen(iname) < strlen(sname))
|
||||||
stype = NULL;
|
stype = NULL;
|
||||||
else
|
else
|
||||||
itype = NULL;
|
itype = NULL;
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
const char *bname = LOC(lang, btype->_name);
|
const char *bname = LOC(lang, btype->_name);
|
||||||
const char *iname = LOC(lang, resourcename(itype->rtype, 0));
|
const char *iname = LOC(lang, resourcename(itype->rtype, 0));
|
||||||
if (strlen(iname) < strlen(bname))
|
if (strlen(iname) < strlen(bname))
|
||||||
|
@ -1810,20 +1845,25 @@ int make_cmd(unit * u, struct order *ord)
|
||||||
plane *pl = rplane(r);
|
plane *pl = rplane(r);
|
||||||
if (pl && fval(pl, PFL_NOBUILD)) {
|
if (pl && fval(pl, PFL_NOBUILD)) {
|
||||||
cmistake(u, ord, 276, MSG_PRODUCE);
|
cmistake(u, ord, 276, MSG_PRODUCE);
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
create_ship(r, u, stype, m, ord);
|
create_ship(r, u, stype, m, ord);
|
||||||
}
|
}
|
||||||
} else if (btype != NOBUILDING) {
|
}
|
||||||
|
else if (btype != NOBUILDING) {
|
||||||
plane *pl = rplane(r);
|
plane *pl = rplane(r);
|
||||||
if (pl && fval(pl, PFL_NOBUILD)) {
|
if (pl && fval(pl, PFL_NOBUILD)) {
|
||||||
cmistake(u, ord, 94, MSG_PRODUCE);
|
cmistake(u, ord, 94, MSG_PRODUCE);
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
int id = getid();
|
int id = getid();
|
||||||
build_building(u, btype, id, m, ord);
|
build_building(u, btype, id, m, ord);
|
||||||
}
|
}
|
||||||
} else if (itype != NULL) {
|
}
|
||||||
|
else if (itype != NULL) {
|
||||||
create_item(u, itype, m);
|
create_item(u, itype, m);
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
ADDMSG(&u->faction->msgs, msg_feedback(u, ord, "error_cannotmake", ""));
|
ADDMSG(&u->faction->msgs, msg_feedback(u, ord, "error_cannotmake", ""));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1834,7 +1874,7 @@ int make_cmd(unit * u, struct order *ord)
|
||||||
|
|
||||||
static void free_luxuries(struct attrib *a)
|
static void free_luxuries(struct attrib *a)
|
||||||
{
|
{
|
||||||
item *itm = (item *) a->data.v;
|
item *itm = (item *)a->data.v;
|
||||||
a->data.v = NULL;
|
a->data.v = NULL;
|
||||||
i_freeall(&itm);
|
i_freeall(&itm);
|
||||||
}
|
}
|
||||||
|
@ -1941,7 +1981,7 @@ static void expandbuying(region * r, request * buyorders)
|
||||||
if (a == NULL)
|
if (a == NULL)
|
||||||
continue;
|
continue;
|
||||||
ADDMSG(&u->faction->msgs, msg_message("buy", "unit money", u, u->n));
|
ADDMSG(&u->faction->msgs, msg_message("buy", "unit money", u, u->n));
|
||||||
for (itm = (item *) a->data.v; itm; itm = itm->next) {
|
for (itm = (item *)a->data.v; itm; itm = itm->next) {
|
||||||
if (itm->number) {
|
if (itm->number) {
|
||||||
ADDMSG(&u->faction->msgs, msg_message("buyamount",
|
ADDMSG(&u->faction->msgs, msg_message("buyamount",
|
||||||
"unit amount resource", u, itm->number, itm->type->rtype));
|
"unit amount resource", u, itm->number, itm->type->rtype));
|
||||||
|
@ -2000,7 +2040,8 @@ static void buy(unit * u, request ** buyorders, struct order *ord)
|
||||||
cmistake(u, ord, 119, MSG_COMMERCE);
|
cmistake(u, ord, 119, MSG_COMMERCE);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
/* ...oder in der Region muß es eine Burg geben. */
|
/* ...oder in der Region muß es eine Burg geben. */
|
||||||
building *b = 0;
|
building *b = 0;
|
||||||
if (r->buildings) {
|
if (r->buildings) {
|
||||||
|
@ -2026,7 +2067,8 @@ static void buy(unit * u, request ** buyorders, struct order *ord)
|
||||||
a = a_find(u->attribs, &at_trades);
|
a = a_find(u->attribs, &at_trades);
|
||||||
if (!a) {
|
if (!a) {
|
||||||
a = a_add(&u->attribs, a_new(&at_trades));
|
a = a_add(&u->attribs, a_new(&at_trades));
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
k -= a->data.i;
|
k -= a->data.i;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2053,7 +2095,7 @@ static void buy(unit * u, request ** buyorders, struct order *ord)
|
||||||
ADDMSG(&u->faction->msgs, msg_feedback(u, ord, "luxury_notsold", ""));
|
ADDMSG(&u->faction->msgs, msg_feedback(u, ord, "luxury_notsold", ""));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
o = (request *) calloc(1, sizeof(request));
|
o = (request *)calloc(1, sizeof(request));
|
||||||
o->type.ltype = ltype; /* sollte immer gleich sein */
|
o->type.ltype = ltype; /* sollte immer gleich sein */
|
||||||
|
|
||||||
o->unit = u;
|
o->unit = u;
|
||||||
|
@ -2073,8 +2115,8 @@ static void expandselling(region * r, request * sellorders, int limit)
|
||||||
int maxsize = 0, maxeffsize = 0;
|
int maxsize = 0, maxeffsize = 0;
|
||||||
int taxcollected = 0;
|
int taxcollected = 0;
|
||||||
int hafencollected = 0;
|
int hafencollected = 0;
|
||||||
unit *maxowner = (unit *) NULL;
|
unit *maxowner = (unit *)NULL;
|
||||||
building *maxb = (building *) NULL;
|
building *maxb = (building *)NULL;
|
||||||
building *b;
|
building *b;
|
||||||
unit *u;
|
unit *u;
|
||||||
unit *hafenowner;
|
unit *hafenowner;
|
||||||
|
@ -2086,7 +2128,8 @@ static void expandselling(region * r, request * sellorders, int limit)
|
||||||
for (ltype = luxurytypes; ltype; ltype = ltype->next)
|
for (ltype = luxurytypes; ltype; ltype = ltype->next)
|
||||||
++ncounter;
|
++ncounter;
|
||||||
counter = (int *)gc_add(calloc(sizeof(int), ncounter));
|
counter = (int *)gc_add(calloc(sizeof(int), ncounter));
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
memset(counter, 0, sizeof(int) * ncounter);
|
memset(counter, 0, sizeof(int) * ncounter);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2102,19 +2145,20 @@ static void expandselling(region * r, request * sellorders, int limit)
|
||||||
maxb = b;
|
maxb = b;
|
||||||
maxsize = b->size;
|
maxsize = b->size;
|
||||||
maxowner = building_owner(b);
|
maxowner = building_owner(b);
|
||||||
} else if (b->size == maxsize && b->type == bt_find("castle")) {
|
}
|
||||||
maxb = (building *) NULL;
|
else if (b->size == maxsize && b->type == bt_find("castle")) {
|
||||||
maxowner = (unit *) NULL;
|
maxb = (building *)NULL;
|
||||||
|
maxowner = (unit *)NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
hafenowner = owner_buildingtyp(r, bt_find("harbour"));
|
hafenowner = owner_buildingtyp(r, bt_find("harbour"));
|
||||||
|
|
||||||
if (maxb != (building *) NULL && maxowner != (unit *) NULL) {
|
if (maxb != (building *)NULL && maxowner != (unit *)NULL) {
|
||||||
maxeffsize = buildingeffsize(maxb, false);
|
maxeffsize = buildingeffsize(maxb, false);
|
||||||
if (maxeffsize == 0) {
|
if (maxeffsize == 0) {
|
||||||
maxb = (building *) NULL;
|
maxb = (building *)NULL;
|
||||||
maxowner = (unit *) NULL;
|
maxowner = (unit *)NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* Die Region muss genug Geld haben, um die Produkte kaufen zu können. */
|
/* Die Region muss genug Geld haben, um die Produkte kaufen zu können. */
|
||||||
|
@ -2146,7 +2190,7 @@ static void expandselling(region * r, request * sellorders, int limit)
|
||||||
int multi = r_demand(r, ltype);
|
int multi = r_demand(r, ltype);
|
||||||
int i;
|
int i;
|
||||||
int use = 0;
|
int use = 0;
|
||||||
for (i=0,search=luxurytypes; search!=ltype; search=search->next) {
|
for (i = 0, search = luxurytypes; search != ltype; search = search->next) {
|
||||||
++i;
|
++i;
|
||||||
}
|
}
|
||||||
if (counter[i] >= limit)
|
if (counter[i] >= limit)
|
||||||
|
@ -2163,7 +2207,7 @@ static void expandselling(region * r, request * sellorders, int limit)
|
||||||
attrib *a = a_find(u->attribs, &at_luxuries);
|
attrib *a = a_find(u->attribs, &at_luxuries);
|
||||||
if (a == NULL)
|
if (a == NULL)
|
||||||
a = a_add(&u->attribs, a_new(&at_luxuries));
|
a = a_add(&u->attribs, a_new(&at_luxuries));
|
||||||
itm = (item *) a->data.v;
|
itm = (item *)a->data.v;
|
||||||
i_change(&itm, ltype->itype, 1);
|
i_change(&itm, ltype->itype, 1);
|
||||||
a->data.v = itm;
|
a->data.v = itm;
|
||||||
++use;
|
++use;
|
||||||
|
@ -2241,7 +2285,7 @@ static void expandselling(region * r, request * sellorders, int limit)
|
||||||
item *itm;
|
item *itm;
|
||||||
if (a == NULL)
|
if (a == NULL)
|
||||||
continue;
|
continue;
|
||||||
for (itm = (item *) a->data.v; itm; itm = itm->next) {
|
for (itm = (item *)a->data.v; itm; itm = itm->next) {
|
||||||
if (itm->number) {
|
if (itm->number) {
|
||||||
ADDMSG(&u->faction->msgs, msg_message("sellamount",
|
ADDMSG(&u->faction->msgs, msg_message("sellamount",
|
||||||
"unit amount resource", u, itm->number, itm->type->rtype));
|
"unit amount resource", u, itm->number, itm->type->rtype));
|
||||||
|
@ -2250,7 +2294,7 @@ static void expandselling(region * r, request * sellorders, int limit)
|
||||||
a_remove(&u->attribs, a);
|
a_remove(&u->attribs, a);
|
||||||
add_income(u, IC_TRADE, u->n, u->n);
|
add_income(u, IC_TRADE, u->n, u->n);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool sell(unit * u, request ** sellorders, struct order *ord)
|
static bool sell(unit * u, request ** sellorders, struct order *ord)
|
||||||
{
|
{
|
||||||
|
@ -2282,7 +2326,8 @@ static bool sell(unit * u, request ** sellorders, struct order *ord)
|
||||||
cmistake(u, ord, 303, MSG_COMMERCE);
|
cmistake(u, ord, 303, MSG_COMMERCE);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
n = atoi((const char *)s);
|
n = atoi((const char *)s);
|
||||||
if (n == 0) {
|
if (n == 0) {
|
||||||
cmistake(u, ord, 27, MSG_COMMERCE);
|
cmistake(u, ord, 27, MSG_COMMERCE);
|
||||||
|
@ -2303,7 +2348,8 @@ static bool sell(unit * u, request ** sellorders, struct order *ord)
|
||||||
cmistake(u, ord, 119, MSG_COMMERCE);
|
cmistake(u, ord, 119, MSG_COMMERCE);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
/* ...oder in der Region muß es eine Burg geben. */
|
/* ...oder in der Region muß es eine Burg geben. */
|
||||||
building *b = 0;
|
building *b = 0;
|
||||||
if (r->buildings) {
|
if (r->buildings) {
|
||||||
|
@ -2333,7 +2379,8 @@ static bool sell(unit * u, request ** sellorders, struct order *ord)
|
||||||
if (ltype == NULL) {
|
if (ltype == NULL) {
|
||||||
cmistake(u, ord, 126, MSG_COMMERCE);
|
cmistake(u, ord, 126, MSG_COMMERCE);
|
||||||
return false;
|
return false;
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
attrib *a;
|
attrib *a;
|
||||||
request *o;
|
request *o;
|
||||||
int k, available;
|
int k, available;
|
||||||
|
@ -2374,7 +2421,8 @@ static bool sell(unit * u, request ** sellorders, struct order *ord)
|
||||||
a = a_find(u->attribs, &at_trades);
|
a = a_find(u->attribs, &at_trades);
|
||||||
if (!a) {
|
if (!a) {
|
||||||
a = a_add(&u->attribs, a_new(&at_trades));
|
a = a_add(&u->attribs, a_new(&at_trades));
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
k -= a->data.i;
|
k -= a->data.i;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2382,7 +2430,7 @@ static bool sell(unit * u, request ** sellorders, struct order *ord)
|
||||||
assert(n >= 0);
|
assert(n >= 0);
|
||||||
/* die Menge der verkauften Güter merken */
|
/* die Menge der verkauften Güter merken */
|
||||||
a->data.i += n;
|
a->data.i += n;
|
||||||
o = (request *) calloc(1, sizeof(request));
|
o = (request *)calloc(1, sizeof(request));
|
||||||
o->unit = u;
|
o->unit = u;
|
||||||
o->qty = n;
|
o->qty = n;
|
||||||
o->type.ltype = ltype;
|
o->type.ltype = ltype;
|
||||||
|
@ -2426,9 +2474,9 @@ static void expandstealing(region * r, request * stealorders)
|
||||||
if (u2->faction == u->faction) {
|
if (u2->faction == u->faction) {
|
||||||
uct += maintenance_cost(u2);
|
uct += maintenance_cost(u2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
n -= uct * 2;
|
n -= uct * 2;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
if (n > 10 && rplane(r) && (rplane(r)->flags & PFL_NOALLIANCES)) {
|
if (n > 10 && rplane(r) && (rplane(r)->flags & PFL_NOALLIANCES)) {
|
||||||
/* In Questen nur reduziertes Klauen */
|
/* In Questen nur reduziertes Klauen */
|
||||||
|
@ -2673,13 +2721,15 @@ static void breed_cmd(unit * u, struct order *ord)
|
||||||
if (m != 0) {
|
if (m != 0) {
|
||||||
/* first came a want-paramter */
|
/* first came a want-paramter */
|
||||||
s = getstrtoken();
|
s = getstrtoken();
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
m = INT_MAX;
|
m = INT_MAX;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!s[0]) {
|
if (!s[0]) {
|
||||||
p = P_ANY;
|
p = P_ANY;
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
p = findparam(s, u->faction->locale);
|
p = findparam(s, u->faction->locale);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2696,7 +2746,8 @@ static void breed_cmd(unit * u, struct order *ord)
|
||||||
if (rtype == get_resourcetype(R_SEED) || rtype == get_resourcetype(R_MALLORNSEED)) {
|
if (rtype == get_resourcetype(R_SEED) || rtype == get_resourcetype(R_MALLORNSEED)) {
|
||||||
breedtrees(r, u, m);
|
breedtrees(r, u, m);
|
||||||
break;
|
break;
|
||||||
} else if (rtype != get_resourcetype(R_HORSE)) {
|
}
|
||||||
|
else if (rtype != get_resourcetype(R_HORSE)) {
|
||||||
ADDMSG(&u->faction->msgs, msg_feedback(u, ord, "error_cannotmake", ""));
|
ADDMSG(&u->faction->msgs, msg_feedback(u, ord, "error_cannotmake", ""));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -2712,11 +2763,14 @@ static const char *rough_amount(int a, int m)
|
||||||
|
|
||||||
if (p < 10) {
|
if (p < 10) {
|
||||||
return "sehr wenige";
|
return "sehr wenige";
|
||||||
} else if (p < 30) {
|
}
|
||||||
|
else if (p < 30) {
|
||||||
return "wenige";
|
return "wenige";
|
||||||
} else if (p < 60) {
|
}
|
||||||
|
else if (p < 60) {
|
||||||
return "relativ viele";
|
return "relativ viele";
|
||||||
} else if (p < 90) {
|
}
|
||||||
|
else if (p < 90) {
|
||||||
return "viele";
|
return "viele";
|
||||||
}
|
}
|
||||||
return "sehr viele";
|
return "sehr viele";
|
||||||
|
@ -2747,11 +2801,13 @@ static void research_cmd(unit * u, struct order *ord)
|
||||||
ADDMSG(&u->faction->msgs, msg_message("researchherb",
|
ADDMSG(&u->faction->msgs, msg_message("researchherb",
|
||||||
"unit region amount herb",
|
"unit region amount herb",
|
||||||
u, r, rough_amount(rherbs(r), 100), itype->rtype));
|
u, r, rough_amount(rherbs(r), 100), itype->rtype));
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
ADDMSG(&u->faction->msgs, msg_message("researchherb_none",
|
ADDMSG(&u->faction->msgs, msg_message("researchherb_none",
|
||||||
"unit region", u, r));
|
"unit region", u, r));
|
||||||
}
|
}
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
ADDMSG(&u->faction->msgs, msg_message("researchherb_none",
|
ADDMSG(&u->faction->msgs, msg_message("researchherb_none",
|
||||||
"unit region", u, r));
|
"unit region", u, r));
|
||||||
}
|
}
|
||||||
|
@ -2816,7 +2872,8 @@ static void steal_cmd(unit * u, struct order *ord, request ** stealorders)
|
||||||
|
|
||||||
if (u2 && u2->region == u->region) {
|
if (u2 && u2->region == u->region) {
|
||||||
f = u2->faction;
|
f = u2->faction;
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
f = dfindhash(id);
|
f = dfindhash(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2856,12 +2913,14 @@ static void steal_cmd(unit * u, struct order *ord, request ** stealorders)
|
||||||
ADDMSG(&u->faction->msgs, msg_message("stealfail", "unit target", u, u2));
|
ADDMSG(&u->faction->msgs, msg_message("stealfail", "unit target", u, u2));
|
||||||
if (n == 0) {
|
if (n == 0) {
|
||||||
ADDMSG(&u2->faction->msgs, msg_message("stealdetect", "unit", u2));
|
ADDMSG(&u2->faction->msgs, msg_message("stealdetect", "unit", u2));
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
ADDMSG(&u2->faction->msgs, msg_message("thiefdiscover", "unit target",
|
ADDMSG(&u2->faction->msgs, msg_message("thiefdiscover", "unit target",
|
||||||
u, u2));
|
u, u2));
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
ADDMSG(&u->faction->msgs, msg_message("stealfatal", "unit target", u,
|
ADDMSG(&u->faction->msgs, msg_message("stealfatal", "unit target", u,
|
||||||
u2));
|
u2));
|
||||||
ADDMSG(&u2->faction->msgs, msg_message("thiefdiscover", "unit target", u,
|
ADDMSG(&u2->faction->msgs, msg_message("thiefdiscover", "unit target", u,
|
||||||
|
@ -2874,7 +2933,8 @@ static void steal_cmd(unit * u, struct order *ord, request ** stealorders)
|
||||||
i = _min(u->number, i_get(u->items, rring->itype));
|
i = _min(u->number, i_get(u->items, rring->itype));
|
||||||
if (i > 0) {
|
if (i > 0) {
|
||||||
n *= STEALINCOME * (u->number + i * (roqf_factor() - 1));
|
n *= STEALINCOME * (u->number + i * (roqf_factor() - 1));
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
n *= u->number * STEALINCOME;
|
n *= u->number * STEALINCOME;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2883,7 +2943,7 @@ static void steal_cmd(unit * u, struct order *ord, request ** stealorders)
|
||||||
/* wer dank unsichtbarkeitsringen klauen kann, muss nicht unbedingt ein
|
/* wer dank unsichtbarkeitsringen klauen kann, muss nicht unbedingt ein
|
||||||
* guter dieb sein, schliesslich macht man immer noch sehr viel laerm */
|
* guter dieb sein, schliesslich macht man immer noch sehr viel laerm */
|
||||||
|
|
||||||
o = (request *) calloc(1, sizeof(request));
|
o = (request *)calloc(1, sizeof(request));
|
||||||
o->unit = u;
|
o->unit = u;
|
||||||
o->qty = 1; /* Betrag steht in u->wants */
|
o->qty = 1; /* Betrag steht in u->wants */
|
||||||
o->no = u2->no;
|
o->no = u2->no;
|
||||||
|
@ -3063,7 +3123,8 @@ static int do_work(unit * u, order * ord, request * o)
|
||||||
o->qty = u->number * w;
|
o->qty = u->number * w;
|
||||||
working += u->number;
|
working += u->number;
|
||||||
return 0;
|
return 0;
|
||||||
} else if (ord && !is_monsters(u->faction)) {
|
}
|
||||||
|
else if (ord && !is_monsters(u->faction)) {
|
||||||
ADDMSG(&u->faction->msgs,
|
ADDMSG(&u->faction->msgs,
|
||||||
msg_feedback(u, ord, "race_cantwork", "race", u_race(u)));
|
msg_feedback(u, ord, "race_cantwork", "race", u_race(u)));
|
||||||
}
|
}
|
||||||
|
@ -3132,7 +3193,8 @@ void tax_cmd(unit * u, struct order *ord, request ** taxorders)
|
||||||
max = INT_MAX;
|
max = INT_MAX;
|
||||||
if (!playerrace(u_race(u))) {
|
if (!playerrace(u_race(u))) {
|
||||||
u->wants = _min(income(u), max);
|
u->wants = _min(income(u), max);
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
u->wants = _min(n * eff_skill(u, SK_TAXING, r) * 20, max);
|
u->wants = _min(n * eff_skill(u, SK_TAXING, r) * 20, max);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3147,7 +3209,7 @@ void tax_cmd(unit * u, struct order *ord, request ** taxorders)
|
||||||
* fraktionen werden dann bei eintreiben unter allen eintreibenden
|
* fraktionen werden dann bei eintreiben unter allen eintreibenden
|
||||||
* einheiten aufgeteilt. */
|
* einheiten aufgeteilt. */
|
||||||
|
|
||||||
o = (request *) calloc(1, sizeof(request));
|
o = (request *)calloc(1, sizeof(request));
|
||||||
o->qty = u->wants / TAXFRACTION;
|
o->qty = u->wants / TAXFRACTION;
|
||||||
o->unit = u;
|
o->unit = u;
|
||||||
addlist(taxorders, o);
|
addlist(taxorders, o);
|
||||||
|
@ -3278,7 +3340,8 @@ void produce(struct region *r)
|
||||||
if (kwd == K_BUY) {
|
if (kwd == K_BUY) {
|
||||||
buy(u, &buyorders, ord);
|
buy(u, &buyorders, ord);
|
||||||
trader = true;
|
trader = true;
|
||||||
} else if (kwd == K_SELL) {
|
}
|
||||||
|
else if (kwd == K_SELL) {
|
||||||
/* sell returns true if the sale is not limited
|
/* sell returns true if the sale is not limited
|
||||||
* by the region limit */
|
* by the region limit */
|
||||||
limited &= !sell(u, &sellorders, ord);
|
limited &= !sell(u, &sellorders, ord);
|
||||||
|
|
93
src/give.c
93
src/give.c
|
@ -2,7 +2,7 @@
|
||||||
+-------------------+ Christian Schlittchen <corwin@amber.kn-bremen.de>
|
+-------------------+ Christian Schlittchen <corwin@amber.kn-bremen.de>
|
||||||
| | Enno Rehling <enno@eressea.de>
|
| | Enno Rehling <enno@eressea.de>
|
||||||
| Eressea PBEM host | Katja Zedel <katze@felidae.kn-bremen.de>
|
| Eressea PBEM host | Katja Zedel <katze@felidae.kn-bremen.de>
|
||||||
| (c) 1998 - 2003 | Henning Peters <faroul@beyond.kn-bremen.de>
|
| (c) 1998 - 2014 | Henning Peters <faroul@beyond.kn-bremen.de>
|
||||||
| | Ingo Wilken <Ingo.Wilken@informatik.uni-oldenburg.de>
|
| | Ingo Wilken <Ingo.Wilken@informatik.uni-oldenburg.de>
|
||||||
+-------------------+ Stefan Reich <reich@halbling.de>
|
+-------------------+ Stefan Reich <reich@halbling.de>
|
||||||
|
|
||||||
|
@ -63,14 +63,16 @@ static int GiveRestriction(void)
|
||||||
|
|
||||||
static void
|
static void
|
||||||
add_give(unit * u, unit * u2, int given, int received,
|
add_give(unit * u, unit * u2, int given, int received,
|
||||||
const resource_type * rtype, struct order *ord, int error)
|
const resource_type * rtype, struct order *ord, int error)
|
||||||
{
|
{
|
||||||
if (error) {
|
if (error) {
|
||||||
cmistake(u, ord, error, MSG_COMMERCE);
|
cmistake(u, ord, error, MSG_COMMERCE);
|
||||||
} else if (u2 == NULL) {
|
}
|
||||||
|
else if (u2 == NULL) {
|
||||||
ADDMSG(&u->faction->msgs,
|
ADDMSG(&u->faction->msgs,
|
||||||
msg_message("give_peasants", "unit resource amount", u, rtype, given));
|
msg_message("give_peasants", "unit resource amount", u, rtype, given));
|
||||||
} else if (u2->faction != u->faction) {
|
}
|
||||||
|
else if (u2->faction != u->faction) {
|
||||||
message *msg;
|
message *msg;
|
||||||
|
|
||||||
msg =
|
msg =
|
||||||
|
@ -114,7 +116,7 @@ int give_quota(const unit * src, const unit * dst, const item_type * type,
|
||||||
|
|
||||||
int
|
int
|
||||||
give_item(int want, const item_type * itype, unit * src, unit * dest,
|
give_item(int want, const item_type * itype, unit * src, unit * dest,
|
||||||
struct order *ord)
|
struct order *ord)
|
||||||
{
|
{
|
||||||
short error = 0;
|
short error = 0;
|
||||||
int n, r;
|
int n, r;
|
||||||
|
@ -130,7 +132,8 @@ give_item(int want, const item_type * itype, unit * src, unit * dest,
|
||||||
"turns", GiveRestriction()));
|
"turns", GiveRestriction()));
|
||||||
}
|
}
|
||||||
return -1;
|
return -1;
|
||||||
} else if (n == 0) {
|
}
|
||||||
|
else if (n == 0) {
|
||||||
int reserve = get_reservation(src, itype->rtype);
|
int reserve = get_reservation(src, itype->rtype);
|
||||||
if (reserve) {
|
if (reserve) {
|
||||||
msg_feedback(src, ord, "nogive_reserved", "resource reservation",
|
msg_feedback(src, ord, "nogive_reserved", "resource reservation",
|
||||||
|
@ -138,9 +141,11 @@ give_item(int want, const item_type * itype, unit * src, unit * dest,
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
error = 36;
|
error = 36;
|
||||||
} else if (itype->flags & ITF_CURSED) {
|
}
|
||||||
|
else if (itype->flags & ITF_CURSED) {
|
||||||
error = 25;
|
error = 25;
|
||||||
} else if (itype->give == NULL || itype->give(src, dest, itype, n, ord) != 0) {
|
}
|
||||||
|
else if (itype->give == NULL || itype->give(src, dest, itype, n, ord) != 0) {
|
||||||
int use = use_pooled(src, item2resource(itype), GET_SLACK, n);
|
int use = use_pooled(src, item2resource(itype), GET_SLACK, n);
|
||||||
if (use < n)
|
if (use < n)
|
||||||
use +=
|
use +=
|
||||||
|
@ -184,43 +189,56 @@ void give_men(int n, unit * u, unit * u2, struct order *ord)
|
||||||
ADDMSG(&u->faction->msgs, msg_feedback(u, ord, "giverestriction",
|
ADDMSG(&u->faction->msgs, msg_feedback(u, ord, "giverestriction",
|
||||||
"turns", GiveRestriction()));
|
"turns", GiveRestriction()));
|
||||||
return;
|
return;
|
||||||
} else if (u == u2) {
|
}
|
||||||
|
else if (u == u2) {
|
||||||
error = 10;
|
error = 10;
|
||||||
}
|
}
|
||||||
else if (!u2 && u_race(u) == get_race(RC_SNOTLING)) {
|
else if (!u2 && u_race(u) == get_race(RC_SNOTLING)) {
|
||||||
/* snotlings may not be given to the peasants. */
|
/* snotlings may not be given to the peasants. */
|
||||||
error = 307;
|
error = 307;
|
||||||
} else if (u2 && u2->number && (fval(u, UFL_HERO) != fval(u2, UFL_HERO))) {
|
}
|
||||||
|
else if (u2 && u2->number && (fval(u, UFL_HERO) != fval(u2, UFL_HERO))) {
|
||||||
/* heroes may not be given to non-heroes and vice versa */
|
/* heroes may not be given to non-heroes and vice versa */
|
||||||
error = 75;
|
error = 75;
|
||||||
} else if (unit_has_cursed_item(u) || (u2 && unit_has_cursed_item(u2))) {
|
}
|
||||||
|
else if (unit_has_cursed_item(u) || (u2 && unit_has_cursed_item(u2))) {
|
||||||
error = 78;
|
error = 78;
|
||||||
} else if (fval(u, UFL_LOCKED) || is_cursed(u->attribs, C_SLAVE, 0)) {
|
}
|
||||||
|
else if (fval(u, UFL_LOCKED) || is_cursed(u->attribs, C_SLAVE, 0)) {
|
||||||
error = 74;
|
error = 74;
|
||||||
} else if (u2 && fval(u, UFL_HUNGER)) {
|
}
|
||||||
|
else if (u2 && fval(u, UFL_HUNGER)) {
|
||||||
/* hungry people cannot be given away */
|
/* hungry people cannot be given away */
|
||||||
error = 73;
|
error = 73;
|
||||||
} else if (u2 && (fval(u2, UFL_LOCKED) || is_cursed(u2->attribs, C_SLAVE, 0))) {
|
}
|
||||||
|
else if (u2 && (fval(u2, UFL_LOCKED) || is_cursed(u2->attribs, C_SLAVE, 0))) {
|
||||||
error = 75;
|
error = 75;
|
||||||
} else if (u2 && !ucontact(u2, u)) {
|
}
|
||||||
|
else if (u2 && !ucontact(u2, u)) {
|
||||||
ADDMSG(&u->faction->msgs, msg_feedback(u, ord, "feedback_no_contact",
|
ADDMSG(&u->faction->msgs, msg_feedback(u, ord, "feedback_no_contact",
|
||||||
"target", u2));
|
"target", u2));
|
||||||
error = -1;
|
error = -1;
|
||||||
} else if (u2 && (has_skill(u, SK_MAGIC) || has_skill(u2, SK_MAGIC))) {
|
}
|
||||||
|
else if (u2 && (has_skill(u, SK_MAGIC) || has_skill(u2, SK_MAGIC))) {
|
||||||
/* cannot give units to and from magicians */
|
/* cannot give units to and from magicians */
|
||||||
error = 158;
|
error = 158;
|
||||||
} else if (u2 && (fval(u, UFL_WERE) != fval(u2, UFL_WERE))) {
|
}
|
||||||
|
else if (u2 && (fval(u, UFL_WERE) != fval(u2, UFL_WERE))) {
|
||||||
/* werewolves can't be given to non-werewolves and vice-versa */
|
/* werewolves can't be given to non-werewolves and vice-versa */
|
||||||
error = 312;
|
error = 312;
|
||||||
} else if (u2 && u2->number != 0 && u_race(u2) != u_race(u)) {
|
}
|
||||||
|
else if (u2 && u2->number != 0 && u_race(u2) != u_race(u)) {
|
||||||
log_warning("faction %s attempts to give %s to %s.\n", itoa36(u->faction->no), u_race(u)->_name[0], u_race(u2)->_name[1]);
|
log_warning("faction %s attempts to give %s to %s.\n", itoa36(u->faction->no), u_race(u)->_name[0], u_race(u2)->_name[1]);
|
||||||
error = 139;
|
error = 139;
|
||||||
} else if (u2 != NULL && (get_racename(u2->attribs)
|
}
|
||||||
|
else if (u2 != NULL && (get_racename(u2->attribs)
|
||||||
|| get_racename(u->attribs))) {
|
|| get_racename(u->attribs))) {
|
||||||
error = 139;
|
error = 139;
|
||||||
} else if (u2 && u2->faction != u->faction && !rule_transfermen()) {
|
}
|
||||||
|
else if (u2 && u2->faction != u->faction && !rule_transfermen()) {
|
||||||
error = 74;
|
error = 74;
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
if (n > u->number)
|
if (n > u->number)
|
||||||
n = u->number;
|
n = u->number;
|
||||||
if (u2 && n + u2->number > UNIT_MAXSIZE) {
|
if (u2 && n + u2->number > UNIT_MAXSIZE) {
|
||||||
|
@ -231,18 +249,23 @@ void give_men(int n, unit * u, unit * u2, struct order *ord)
|
||||||
}
|
}
|
||||||
if (n == 0) {
|
if (n == 0) {
|
||||||
error = 96;
|
error = 96;
|
||||||
} else if (u2 && u->faction != u2->faction) {
|
}
|
||||||
|
else if (u2 && u->faction != u2->faction) {
|
||||||
if (u2->faction->newbies + n > MAXNEWBIES) {
|
if (u2->faction->newbies + n > MAXNEWBIES) {
|
||||||
error = 129;
|
error = 129;
|
||||||
} else if (u_race(u) != u2->faction->race) {
|
}
|
||||||
|
else if (u_race(u) != u2->faction->race) {
|
||||||
if (u2->faction->race != get_race(RC_HUMAN)) {
|
if (u2->faction->race != get_race(RC_HUMAN)) {
|
||||||
error = 120;
|
error = 120;
|
||||||
} else if (count_migrants(u2->faction) + n >
|
}
|
||||||
|
else if (count_migrants(u2->faction) + n >
|
||||||
count_maxmigrants(u2->faction)) {
|
count_maxmigrants(u2->faction)) {
|
||||||
error = 128;
|
error = 128;
|
||||||
} else if (has_limited_skills(u) || has_limited_skills(u2)) {
|
}
|
||||||
|
else if (has_limited_skills(u) || has_limited_skills(u2)) {
|
||||||
error = 154;
|
error = 154;
|
||||||
} else if (u2->number != 0) {
|
}
|
||||||
|
else if (u2->number != 0) {
|
||||||
error = 139;
|
error = 139;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -294,7 +317,8 @@ void give_men(int n, unit * u, unit * u2, struct order *ord)
|
||||||
if (u->faction != u2->faction) {
|
if (u->faction != u2->faction) {
|
||||||
u2->faction->newbies += n;
|
u2->faction->newbies += n;
|
||||||
}
|
}
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
if (getunitpeasants) {
|
if (getunitpeasants) {
|
||||||
#ifdef ORCIFICATION
|
#ifdef ORCIFICATION
|
||||||
if (u_race(u) == get_race(RC_SNOTLING) && !fval(u->region, RF_ORCIFIED)) {
|
if (u_race(u) == get_race(RC_SNOTLING) && !fval(u->region, RF_ORCIFIED)) {
|
||||||
|
@ -305,17 +329,20 @@ void give_men(int n, unit * u, unit * u2, struct order *ord)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
transfermen(u, NULL, n);
|
transfermen(u, NULL, n);
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
error = 159;
|
error = 159;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (error > 0) {
|
if (error > 0) {
|
||||||
cmistake(u, ord, error, MSG_COMMERCE);
|
cmistake(u, ord, error, MSG_COMMERCE);
|
||||||
} else if (!u2) {
|
}
|
||||||
|
else if (!u2) {
|
||||||
ADDMSG(&u->faction->msgs,
|
ADDMSG(&u->faction->msgs,
|
||||||
msg_message("give_person_peasants", "unit amount", u, n));
|
msg_message("give_person_peasants", "unit amount", u, n));
|
||||||
} else if (u2->faction != u->faction) {
|
}
|
||||||
|
else if (u2->faction != u->faction) {
|
||||||
message *msg = msg_message("give_person", "unit target amount", u, u2, n);
|
message *msg = msg_message("give_person", "unit target amount", u, u2, n);
|
||||||
add_message(&u->faction->msgs, msg);
|
add_message(&u->faction->msgs, msg);
|
||||||
add_message(&u2->faction->msgs, msg);
|
add_message(&u2->faction->msgs, msg);
|
||||||
|
@ -350,7 +377,8 @@ void give_unit(unit * u, unit * u2, order * ord)
|
||||||
if (u2 == NULL) {
|
if (u2 == NULL) {
|
||||||
if (fval(r->terrain, SEA_REGION)) {
|
if (fval(r->terrain, SEA_REGION)) {
|
||||||
cmistake(u, ord, 152, MSG_COMMERCE);
|
cmistake(u, ord, 152, MSG_COMMERCE);
|
||||||
} else if (getunitpeasants) {
|
}
|
||||||
|
else if (getunitpeasants) {
|
||||||
unit *u3;
|
unit *u3;
|
||||||
|
|
||||||
for (u3 = r->units; u3; u3 = u3->next)
|
for (u3 = r->units; u3; u3 = u3->next)
|
||||||
|
@ -371,7 +399,8 @@ void give_unit(unit * u, unit * u2, order * ord)
|
||||||
}
|
}
|
||||||
give_men(u->number, u, NULL, ord);
|
give_men(u->number, u, NULL, ord);
|
||||||
cmistake(u, ord, 153, MSG_COMMERCE);
|
cmistake(u, ord, 153, MSG_COMMERCE);
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
ADDMSG(&u->faction->msgs, msg_feedback(u, ord, "feedback_unit_not_found",
|
ADDMSG(&u->faction->msgs, msg_feedback(u, ord, "feedback_unit_not_found",
|
||||||
""));
|
""));
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
/*
|
/*
|
||||||
Copyright (c) 1998-2010, Enno Rehling <enno@eressea.de>
|
Copyright (c) 1998-2014,
|
||||||
Katja Zedel <katze@felidae.kn-bremen.de
|
Enno Rehling <enno@eressea.de>
|
||||||
Christian Schlittchen <corwin@amber.kn-bremen.de>
|
Katja Zedel <katze@felidae.kn-bremen.de
|
||||||
|
Christian Schlittchen <corwin@amber.kn-bremen.de>
|
||||||
|
|
||||||
Permission to use, copy, modify, and/or distribute this software for any
|
Permission to use, copy, modify, and/or distribute this software for any
|
||||||
purpose with or without fee is hereby granted, provided that the above
|
purpose with or without fee is hereby granted, provided that the above
|
||||||
|
@ -127,7 +128,7 @@ float MagicPower(void)
|
||||||
|
|
||||||
static int a_readicastle(attrib * a, void *owner, struct storage *store)
|
static int a_readicastle(attrib * a, void *owner, struct storage *store)
|
||||||
{
|
{
|
||||||
icastle_data *data = (icastle_data *) a->data.v;
|
icastle_data *data = (icastle_data *)a->data.v;
|
||||||
variant bno;
|
variant bno;
|
||||||
char token[32];
|
char token[32];
|
||||||
READ_TOK(store, token, sizeof(token));
|
READ_TOK(store, token, sizeof(token));
|
||||||
|
@ -145,7 +146,7 @@ static int a_readicastle(attrib * a, void *owner, struct storage *store)
|
||||||
static void
|
static void
|
||||||
a_writeicastle(const attrib * a, const void *owner, struct storage *store)
|
a_writeicastle(const attrib * a, const void *owner, struct storage *store)
|
||||||
{
|
{
|
||||||
icastle_data *data = (icastle_data *) a->data.v;
|
icastle_data *data = (icastle_data *)a->data.v;
|
||||||
WRITE_TOK(store, data->type->_name);
|
WRITE_TOK(store, data->type->_name);
|
||||||
WRITE_INT(store, data->building->no);
|
WRITE_INT(store, data->building->no);
|
||||||
WRITE_INT(store, data->time);
|
WRITE_INT(store, data->time);
|
||||||
|
@ -153,7 +154,7 @@ a_writeicastle(const attrib * a, const void *owner, struct storage *store)
|
||||||
|
|
||||||
static int a_ageicastle(struct attrib *a)
|
static int a_ageicastle(struct attrib *a)
|
||||||
{
|
{
|
||||||
icastle_data *data = (icastle_data *) a->data.v;
|
icastle_data *data = (icastle_data *)a->data.v;
|
||||||
if (data->time <= 0) {
|
if (data->time <= 0) {
|
||||||
building *b = data->building;
|
building *b = data->building;
|
||||||
region *r = b->region;
|
region *r = b->region;
|
||||||
|
@ -161,7 +162,8 @@ static int a_ageicastle(struct attrib *a)
|
||||||
/* remove_building lets units leave the building */
|
/* remove_building lets units leave the building */
|
||||||
remove_building(&r->buildings, b);
|
remove_building(&r->buildings, b);
|
||||||
return AT_AGE_REMOVE;
|
return AT_AGE_REMOVE;
|
||||||
} else
|
}
|
||||||
|
else
|
||||||
data->time--;
|
data->time--;
|
||||||
return AT_AGE_KEEP;
|
return AT_AGE_KEEP;
|
||||||
}
|
}
|
||||||
|
@ -201,7 +203,7 @@ static void init_mage(attrib * a)
|
||||||
|
|
||||||
static void free_mage(attrib * a)
|
static void free_mage(attrib * a)
|
||||||
{
|
{
|
||||||
sc_mage *mage = (sc_mage *) a->data.v;
|
sc_mage *mage = (sc_mage *)a->data.v;
|
||||||
if (mage->spellbook) {
|
if (mage->spellbook) {
|
||||||
spellbook_clear(mage->spellbook);
|
spellbook_clear(mage->spellbook);
|
||||||
free(mage->spellbook);
|
free(mage->spellbook);
|
||||||
|
@ -220,7 +222,7 @@ int FactionSpells(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
void read_spells(struct quicklist **slistp, magic_t mtype,
|
void read_spells(struct quicklist **slistp, magic_t mtype,
|
||||||
struct storage *store)
|
struct storage *store)
|
||||||
{
|
{
|
||||||
for (;;) {
|
for (;;) {
|
||||||
spell *sp;
|
spell *sp;
|
||||||
|
@ -231,8 +233,9 @@ void read_spells(struct quicklist **slistp, magic_t mtype,
|
||||||
READ_INT(store, &i);
|
READ_INT(store, &i);
|
||||||
if (i < 0)
|
if (i < 0)
|
||||||
break;
|
break;
|
||||||
sp = find_spellbyid((unsigned int) i);
|
sp = find_spellbyid((unsigned int)i);
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
READ_TOK(store, spname, sizeof(spname));
|
READ_TOK(store, spname, sizeof(spname));
|
||||||
if (strcmp(spname, "end") == 0)
|
if (strcmp(spname, "end") == 0)
|
||||||
break;
|
break;
|
||||||
|
@ -258,7 +261,7 @@ int get_spell_level_mage(const spell * sp, void * cbdata)
|
||||||
static int read_mage(attrib * a, void *owner, struct storage *store)
|
static int read_mage(attrib * a, void *owner, struct storage *store)
|
||||||
{
|
{
|
||||||
int i, mtype;
|
int i, mtype;
|
||||||
sc_mage *mage = (sc_mage *) a->data.v;
|
sc_mage *mage = (sc_mage *)a->data.v;
|
||||||
char spname[64];
|
char spname[64];
|
||||||
|
|
||||||
READ_INT(store, &mtype);
|
READ_INT(store, &mtype);
|
||||||
|
@ -273,9 +276,10 @@ static int read_mage(attrib * a, void *owner, struct storage *store)
|
||||||
READ_INT(store, &spid);
|
READ_INT(store, &spid);
|
||||||
READ_INT(store, &level);
|
READ_INT(store, &level);
|
||||||
if (spid >= 0) {
|
if (spid >= 0) {
|
||||||
sp = find_spellbyid((unsigned int) spid);
|
sp = find_spellbyid((unsigned int)spid);
|
||||||
}
|
}
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
READ_TOK(store, spname, sizeof(spname));
|
READ_TOK(store, spname, sizeof(spname));
|
||||||
READ_INT(store, &level);
|
READ_INT(store, &level);
|
||||||
|
|
||||||
|
@ -300,9 +304,10 @@ static int read_mage(attrib * a, void *owner, struct storage *store)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (mage->magietyp==M_GRAY) {
|
if (mage->magietyp == M_GRAY) {
|
||||||
read_spellbook(&mage->spellbook, store, get_spell_level_mage, mage);
|
read_spellbook(&mage->spellbook, store, get_spell_level_mage, mage);
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
read_spellbook(0, store, 0, mage);
|
read_spellbook(0, store, 0, mage);
|
||||||
}
|
}
|
||||||
return AT_READ_OK;
|
return AT_READ_OK;
|
||||||
|
@ -314,7 +319,7 @@ void write_spells(struct quicklist *slist, struct storage *store)
|
||||||
int qi;
|
int qi;
|
||||||
|
|
||||||
for (ql = slist, qi = 0; ql; ql_advance(&ql, &qi, 1)) {
|
for (ql = slist, qi = 0; ql; ql_advance(&ql, &qi, 1)) {
|
||||||
spell *sp = (spell *) ql_get(ql, qi);
|
spell *sp = (spell *)ql_get(ql, qi);
|
||||||
WRITE_TOK(store, sp->sname);
|
WRITE_TOK(store, sp->sname);
|
||||||
}
|
}
|
||||||
WRITE_TOK(store, "end");
|
WRITE_TOK(store, "end");
|
||||||
|
@ -324,7 +329,7 @@ static void
|
||||||
write_mage(const attrib * a, const void *owner, struct storage *store)
|
write_mage(const attrib * a, const void *owner, struct storage *store)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
sc_mage *mage = (sc_mage *) a->data.v;
|
sc_mage *mage = (sc_mage *)a->data.v;
|
||||||
|
|
||||||
WRITE_INT(store, mage->magietyp);
|
WRITE_INT(store, mage->magietyp);
|
||||||
WRITE_INT(store, mage->spellpoints);
|
WRITE_INT(store, mage->spellpoints);
|
||||||
|
@ -359,7 +364,7 @@ sc_mage *get_mage(const unit * u)
|
||||||
if (a)
|
if (a)
|
||||||
return a->data.v;
|
return a->data.v;
|
||||||
}
|
}
|
||||||
return (sc_mage *) NULL;
|
return (sc_mage *)NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ------------------------------------------------------------- */
|
/* ------------------------------------------------------------- */
|
||||||
|
@ -379,9 +384,10 @@ static int read_seenspell(attrib * a, void *owner, struct storage *store)
|
||||||
READ_TOK(store, token, sizeof(token));
|
READ_TOK(store, token, sizeof(token));
|
||||||
i = atoi(token);
|
i = atoi(token);
|
||||||
if (i != 0) {
|
if (i != 0) {
|
||||||
sp = find_spellbyid((unsigned int) i);
|
sp = find_spellbyid((unsigned int)i);
|
||||||
} else {
|
}
|
||||||
if (global.data_version<UNIQUE_SPELLS_VERSION) {
|
else {
|
||||||
|
if (global.data_version < UNIQUE_SPELLS_VERSION) {
|
||||||
READ_INT(store, 0); /* ignore mtype */
|
READ_INT(store, 0); /* ignore mtype */
|
||||||
}
|
}
|
||||||
sp = find_spell(token);
|
sp = find_spell(token);
|
||||||
|
@ -428,7 +434,7 @@ void show_new_spells(faction * f, int level, const spellbook *book)
|
||||||
int qi;
|
int qi;
|
||||||
|
|
||||||
for (qi = 0; ql; ql_advance(&ql, &qi, 1)) {
|
for (qi = 0; ql; ql_advance(&ql, &qi, 1)) {
|
||||||
spellbook_entry *sbe = (spellbook_entry *) ql_get(ql, qi);
|
spellbook_entry *sbe = (spellbook_entry *)ql_get(ql, qi);
|
||||||
if (sbe->level <= level) {
|
if (sbe->level <= level) {
|
||||||
|
|
||||||
if (!already_seen(f, sbe->sp)) {
|
if (!already_seen(f, sbe->sp)) {
|
||||||
|
@ -458,7 +464,7 @@ void pick_random_spells(faction * f, int level, spellbook * book, int num_spells
|
||||||
}
|
}
|
||||||
|
|
||||||
for (qi = 0, ql = book->spells; ql; ql_advance(&ql, &qi, 1)) {
|
for (qi = 0, ql = book->spells; ql; ql_advance(&ql, &qi, 1)) {
|
||||||
spellbook_entry * sbe = (spellbook_entry *) ql_get(ql, qi);
|
spellbook_entry * sbe = (spellbook_entry *)ql_get(ql, qi);
|
||||||
if (sbe->level <= level) {
|
if (sbe->level <= level) {
|
||||||
commonspells[numspells++] = sbe;
|
commonspells[numspells++] = sbe;
|
||||||
}
|
}
|
||||||
|
@ -475,20 +481,21 @@ void pick_random_spells(faction * f, int level, spellbook * book, int num_spells
|
||||||
while (!sbe && maxspell>0) {
|
while (!sbe && maxspell>0) {
|
||||||
spellno = rng_int() % maxspell;
|
spellno = rng_int() % maxspell;
|
||||||
sbe = commonspells[spellno];
|
sbe = commonspells[spellno];
|
||||||
if (sbe->level>f->max_spelllevel) {
|
if (sbe->level > f->max_spelllevel) {
|
||||||
commonspells[spellno] = commonspells[--maxspell];
|
commonspells[spellno] = commonspells[--maxspell];
|
||||||
commonspells[maxspell] = sbe;
|
commonspells[maxspell] = sbe;
|
||||||
sbe = 0;
|
sbe = 0;
|
||||||
} else if (f->spellbook && spellbook_get(f->spellbook, sbe->sp)) {
|
}
|
||||||
|
else if (f->spellbook && spellbook_get(f->spellbook, sbe->sp)) {
|
||||||
commonspells[spellno] = commonspells[--numspells];
|
commonspells[spellno] = commonspells[--numspells];
|
||||||
if (maxspell>numspells) {
|
if (maxspell > numspells) {
|
||||||
maxspell = numspells;
|
maxspell = numspells;
|
||||||
}
|
}
|
||||||
sbe = 0;
|
sbe = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (spellno<maxspell) {
|
if (spellno < maxspell) {
|
||||||
if (!f->spellbook) {
|
if (!f->spellbook) {
|
||||||
f->spellbook = create_spellbook(0);
|
f->spellbook = create_spellbook(0);
|
||||||
}
|
}
|
||||||
|
@ -525,7 +532,7 @@ int u_hasspell(const unit *u, const struct spell *sp)
|
||||||
spellbook * book = unit_get_spellbook(u);
|
spellbook * book = unit_get_spellbook(u);
|
||||||
spellbook_entry * sbe = book ? spellbook_get(book, sp) : 0;
|
spellbook_entry * sbe = book ? spellbook_get(book, sp) : 0;
|
||||||
if (sbe) {
|
if (sbe) {
|
||||||
return sbe->level<=effskill(u, SK_MAGIC);
|
return sbe->level <= effskill(u, SK_MAGIC);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -556,7 +563,8 @@ const spell *get_combatspell(const unit * u, int nr)
|
||||||
m = get_mage(u);
|
m = get_mage(u);
|
||||||
if (m) {
|
if (m) {
|
||||||
return m->combatspells[nr].sp;
|
return m->combatspells[nr].sp;
|
||||||
} else if (u_race(u)->precombatspell != NULL) {
|
}
|
||||||
|
else if (u_race(u)->precombatspell != NULL) {
|
||||||
return u_race(u)->precombatspell;
|
return u_race(u)->precombatspell;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -613,15 +621,18 @@ void unset_combatspell(unit * u, spell * sp)
|
||||||
for (i = 0; i < MAXCOMBATSPELLS; i++) {
|
for (i = 0; i < MAXCOMBATSPELLS; i++) {
|
||||||
m->combatspells[i].sp = NULL;
|
m->combatspells[i].sp = NULL;
|
||||||
}
|
}
|
||||||
} else if (sp->sptyp & PRECOMBATSPELL) {
|
}
|
||||||
|
else if (sp->sptyp & PRECOMBATSPELL) {
|
||||||
if (sp != get_combatspell(u, 0))
|
if (sp != get_combatspell(u, 0))
|
||||||
return;
|
return;
|
||||||
} else if (sp->sptyp & COMBATSPELL) {
|
}
|
||||||
|
else if (sp->sptyp & COMBATSPELL) {
|
||||||
if (sp != get_combatspell(u, 1)) {
|
if (sp != get_combatspell(u, 1)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
nr = 1;
|
nr = 1;
|
||||||
} else if (sp->sptyp & POSTCOMBATSPELL) {
|
}
|
||||||
|
else if (sp->sptyp & POSTCOMBATSPELL) {
|
||||||
if (sp != get_combatspell(u, 2)) {
|
if (sp != get_combatspell(u, 2)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -842,7 +853,8 @@ int eff_spelllevel(unit * u, const spell * sp, int cast_level, int range)
|
||||||
* gezauberten Sprüche abhängig */
|
* gezauberten Sprüche abhängig */
|
||||||
if (sp->components[k].type == r_aura) {
|
if (sp->components[k].type == r_aura) {
|
||||||
needplevel = spellcost(u, sp) * range;
|
needplevel = spellcost(u, sp) * range;
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
needplevel = sp->components[k].amount * range;
|
needplevel = sp->components[k].amount * range;
|
||||||
}
|
}
|
||||||
maxlevel =
|
maxlevel =
|
||||||
|
@ -856,12 +868,14 @@ int eff_spelllevel(unit * u, const spell * sp, int cast_level, int range)
|
||||||
cast_level = 0;
|
cast_level = 0;
|
||||||
/* ansonsten wird das Minimum aus maximal möglicher Stufe und der
|
/* ansonsten wird das Minimum aus maximal möglicher Stufe und der
|
||||||
* gewünschten gebildet */
|
* gewünschten gebildet */
|
||||||
} else if (sp->components[k].cost == SPC_LEVEL) {
|
}
|
||||||
|
else if (sp->components[k].cost == SPC_LEVEL) {
|
||||||
costtyp = SPC_LEVEL;
|
costtyp = SPC_LEVEL;
|
||||||
cast_level = _min(cast_level, maxlevel);
|
cast_level = _min(cast_level, maxlevel);
|
||||||
/* bei Typ Linear müssen die Kosten in Höhe der Stufe vorhanden
|
/* bei Typ Linear müssen die Kosten in Höhe der Stufe vorhanden
|
||||||
* sein, ansonsten schlägt der Spruch fehl */
|
* sein, ansonsten schlägt der Spruch fehl */
|
||||||
} else if (sp->components[k].cost == SPC_LINEAR) {
|
}
|
||||||
|
else if (sp->components[k].cost == SPC_LINEAR) {
|
||||||
costtyp = SPC_LINEAR;
|
costtyp = SPC_LINEAR;
|
||||||
if (maxlevel < cast_level)
|
if (maxlevel < cast_level)
|
||||||
cast_level = 0;
|
cast_level = 0;
|
||||||
|
@ -896,11 +910,12 @@ void pay_spell(unit * u, const spell * sp, int cast_level, int range)
|
||||||
int k;
|
int k;
|
||||||
int resuse;
|
int resuse;
|
||||||
|
|
||||||
assert(cast_level>0);
|
assert(cast_level > 0);
|
||||||
for (k = 0; sp->components[k].type; k++) {
|
for (k = 0; sp->components[k].type; k++) {
|
||||||
if (sp->components[k].type == r_aura) {
|
if (sp->components[k].type == r_aura) {
|
||||||
resuse = spellcost(u, sp) * range;
|
resuse = spellcost(u, sp) * range;
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
resuse = sp->components[k].amount * range;
|
resuse = sp->components[k].amount * range;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -926,7 +941,7 @@ bool knowsspell(const region * r, const unit * u, const spell * sp)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
/* steht der Spruch in der Spruchliste? */
|
/* steht der Spruch in der Spruchliste? */
|
||||||
return u_hasspell(u, sp)!=0;
|
return u_hasspell(u, sp) != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Um einen Spruch zu beherrschen, muss der Magier die Stufe des
|
/* Um einen Spruch zu beherrschen, muss der Magier die Stufe des
|
||||||
|
@ -965,7 +980,8 @@ cancast(unit * u, const spell * sp, int level, int range, struct order * ord)
|
||||||
* gezauberten Sprüche abhängig */
|
* gezauberten Sprüche abhängig */
|
||||||
if (rtype == r_aura) {
|
if (rtype == r_aura) {
|
||||||
itemanz = spellcost(u, sp) * range;
|
itemanz = spellcost(u, sp) * range;
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
itemanz = sp->components[k].amount * range;
|
itemanz = sp->components[k].amount * range;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1020,7 +1036,8 @@ spellpower(region * r, unit * u, const spell * sp, int cast_level, struct order
|
||||||
|
|
||||||
if (sp == NULL) {
|
if (sp == NULL) {
|
||||||
return 0;
|
return 0;
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
/* Bonus durch Magieturm und gesegneten Steinkreis */
|
/* Bonus durch Magieturm und gesegneten Steinkreis */
|
||||||
struct building *b = inside_building(u);
|
struct building *b = inside_building(u);
|
||||||
const struct building_type *btype = b ? b->type : NULL;
|
const struct building_type *btype = b ? b->type : NULL;
|
||||||
|
@ -1048,7 +1065,8 @@ spellpower(region * r, unit * u, const spell * sp, int cast_level, struct order
|
||||||
if (force > 0) {
|
if (force > 0) {
|
||||||
ADDMSG(&mage->faction->msgs, msg_message("reduce_spell",
|
ADDMSG(&mage->faction->msgs, msg_message("reduce_spell",
|
||||||
"self mage region", mage, u, r));
|
"self mage region", mage, u, r));
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
ADDMSG(&mage->faction->msgs, msg_message("block_spell",
|
ADDMSG(&mage->faction->msgs, msg_message("block_spell",
|
||||||
"self mage region", mage, u, r));
|
"self mage region", mage, u, r));
|
||||||
}
|
}
|
||||||
|
@ -1066,7 +1084,8 @@ spellpower(region * r, unit * u, const spell * sp, int cast_level, struct order
|
||||||
if (force > 0) {
|
if (force > 0) {
|
||||||
ADDMSG(&mage->faction->msgs, msg_message("reduce_spell",
|
ADDMSG(&mage->faction->msgs, msg_message("reduce_spell",
|
||||||
"self mage region", mage, u, r));
|
"self mage region", mage, u, r));
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
ADDMSG(&mage->faction->msgs, msg_message("block_spell",
|
ADDMSG(&mage->faction->msgs, msg_message("block_spell",
|
||||||
"self mage region", mage, u, r));
|
"self mage region", mage, u, r));
|
||||||
}
|
}
|
||||||
|
@ -1115,7 +1134,7 @@ double magic_resistance(unit * target)
|
||||||
attrib *a;
|
attrib *a;
|
||||||
curse *c;
|
curse *c;
|
||||||
int n;
|
int n;
|
||||||
const curse_type * ct_goodresist = 0, * ct_badresist = 0;
|
const curse_type * ct_goodresist = 0, *ct_badresist = 0;
|
||||||
const resource_type *rtype;
|
const resource_type *rtype;
|
||||||
double probability = u_race(target)->magres;
|
double probability = u_race(target)->magres;
|
||||||
|
|
||||||
|
@ -1143,7 +1162,7 @@ double magic_resistance(unit * target)
|
||||||
ct_goodresist = ct_find("goodmagicresistancezone");
|
ct_goodresist = ct_find("goodmagicresistancezone");
|
||||||
}
|
}
|
||||||
while (a && a->type == &at_curse) {
|
while (a && a->type == &at_curse) {
|
||||||
curse *c = (curse *) a->data.v;
|
curse *c = (curse *)a->data.v;
|
||||||
unit *mage = c->magician;
|
unit *mage = c->magician;
|
||||||
|
|
||||||
if (mage != NULL) {
|
if (mage != NULL) {
|
||||||
|
@ -1152,7 +1171,8 @@ double magic_resistance(unit * target)
|
||||||
probability += curse_geteffect(c) * 0.01;
|
probability += curse_geteffect(c) * 0.01;
|
||||||
ct_goodresist = 0; /* only one effect per region */
|
ct_goodresist = 0; /* only one effect per region */
|
||||||
}
|
}
|
||||||
} else if (ct_badresist && c->type == ct_badresist) {
|
}
|
||||||
|
else if (ct_badresist && c->type == ct_badresist) {
|
||||||
if (!alliedunit(mage, target->faction, HELP_GUARD)) {
|
if (!alliedunit(mage, target->faction, HELP_GUARD)) {
|
||||||
probability -= curse_geteffect(c) * 0.01;
|
probability -= curse_geteffect(c) * 0.01;
|
||||||
ct_badresist = 0; /* only one effect per region */
|
ct_badresist = 0; /* only one effect per region */
|
||||||
|
@ -1202,7 +1222,7 @@ target_resists_magic(unit * magician, void *obj, int objtyp, int t_bonus)
|
||||||
{
|
{
|
||||||
int at, pa = 0;
|
int at, pa = 0;
|
||||||
skill *sv;
|
skill *sv;
|
||||||
unit *u = (unit *) obj;
|
unit *u = (unit *)obj;
|
||||||
|
|
||||||
at = effskill(magician, SK_MAGIC);
|
at = effskill(magician, SK_MAGIC);
|
||||||
|
|
||||||
|
@ -1215,30 +1235,30 @@ target_resists_magic(unit * magician, void *obj, int objtyp, int t_bonus)
|
||||||
/* Contest */
|
/* Contest */
|
||||||
probability = 0.05 * (10 + pa - at);
|
probability = 0.05 * (10 + pa - at);
|
||||||
|
|
||||||
probability += magic_resistance((unit *) obj);
|
probability += magic_resistance((unit *)obj);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case TYP_REGION:
|
case TYP_REGION:
|
||||||
/* Bonus durch Zauber */
|
/* Bonus durch Zauber */
|
||||||
probability +=
|
probability +=
|
||||||
0.01 * get_curseeffect(((region *) obj)->attribs, C_RESIST_MAGIC, 0);
|
0.01 * get_curseeffect(((region *)obj)->attribs, C_RESIST_MAGIC, 0);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TYP_BUILDING:
|
case TYP_BUILDING:
|
||||||
/* Bonus durch Zauber */
|
/* Bonus durch Zauber */
|
||||||
probability +=
|
probability +=
|
||||||
0.01 * get_curseeffect(((building *) obj)->attribs, C_RESIST_MAGIC, 0);
|
0.01 * get_curseeffect(((building *)obj)->attribs, C_RESIST_MAGIC, 0);
|
||||||
|
|
||||||
/* Bonus durch Typ */
|
/* Bonus durch Typ */
|
||||||
probability += 0.01 * ((building *) obj)->type->magres;
|
probability += 0.01 * ((building *)obj)->type->magres;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TYP_SHIP:
|
case TYP_SHIP:
|
||||||
/* Bonus durch Zauber */
|
/* Bonus durch Zauber */
|
||||||
probability +=
|
probability +=
|
||||||
0.01 * get_curseeffect(((ship *) obj)->attribs, C_RESIST_MAGIC, 0);
|
0.01 * get_curseeffect(((ship *)obj)->attribs, C_RESIST_MAGIC, 0);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1255,7 +1275,7 @@ target_resists_magic(unit * magician, void *obj, int objtyp, int t_bonus)
|
||||||
|
|
||||||
bool is_magic_resistant(unit * magician, unit * target, int resist_bonus)
|
bool is_magic_resistant(unit * magician, unit * target, int resist_bonus)
|
||||||
{
|
{
|
||||||
return (bool) target_resists_magic(magician, target, TYP_UNIT,
|
return (bool)target_resists_magic(magician, target, TYP_UNIT,
|
||||||
resist_bonus);
|
resist_bonus);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1272,7 +1292,7 @@ bool is_magic_resistant(unit * magician, unit * target, int resist_bonus)
|
||||||
|
|
||||||
bool fumble(region * r, unit * u, const spell * sp, int cast_grade)
|
bool fumble(region * r, unit * u, const spell * sp, int cast_grade)
|
||||||
{
|
{
|
||||||
/* X ergibt Zahl zwischen 1 und 0, je kleiner, desto besser der Magier.
|
/* X ergibt Zahl zwischen 1 und 0, je kleiner, desto besser der Magier.
|
||||||
* 0,5*40-20=0, dh wenn der Magier doppelt so gut ist, wie der Spruch
|
* 0,5*40-20=0, dh wenn der Magier doppelt so gut ist, wie der Spruch
|
||||||
* benötigt, gelingt er immer, ist er gleich gut, gelingt der Spruch mit
|
* benötigt, gelingt er immer, ist er gleich gut, gelingt der Spruch mit
|
||||||
* 20% Warscheinlichkeit nicht
|
* 20% Warscheinlichkeit nicht
|
||||||
|
@ -1380,7 +1400,7 @@ static void do_fumble(castorder * co)
|
||||||
case 2:
|
case 2:
|
||||||
/* temporary skill loss */
|
/* temporary skill loss */
|
||||||
duration = _max(rng_int() % level / 2, 2);
|
duration = _max(rng_int() % level / 2, 2);
|
||||||
effect = -(float)level/2;
|
effect = -(float)level / 2;
|
||||||
c = create_curse(u, &u->attribs, ct_find("skillmod"), (float)level,
|
c = create_curse(u, &u->attribs, ct_find("skillmod"), (float)level,
|
||||||
duration, effect, 1);
|
duration, effect, 1);
|
||||||
c->data.i = SK_MAGIC;
|
c->data.i = SK_MAGIC;
|
||||||
|
@ -1502,7 +1522,7 @@ void regenerate_aura(void)
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
verify_ship(region * r, unit * mage, const spell * sp, spllprm * spobj,
|
verify_ship(region * r, unit * mage, const spell * sp, spllprm * spobj,
|
||||||
order * ord)
|
order * ord)
|
||||||
{
|
{
|
||||||
ship *sh = findship(spobj->data.i);
|
ship *sh = findship(spobj->data.i);
|
||||||
|
|
||||||
|
@ -1525,7 +1545,7 @@ verify_ship(region * r, unit * mage, const spell * sp, spllprm * spobj,
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
verify_building(region * r, unit * mage, const spell * sp, spllprm * spobj,
|
verify_building(region * r, unit * mage, const spell * sp, spllprm * spobj,
|
||||||
order * ord)
|
order * ord)
|
||||||
{
|
{
|
||||||
building *b = findbuilding(spobj->data.i);
|
building *b = findbuilding(spobj->data.i);
|
||||||
|
|
||||||
|
@ -1555,7 +1575,8 @@ message *msg_unitnotfound(const struct unit * mage, struct order * ord,
|
||||||
|
|
||||||
if (spobj->typ == SPP_UNIT) {
|
if (spobj->typ == SPP_UNIT) {
|
||||||
uid = itoa36(spobj->data.i);
|
uid = itoa36(spobj->data.i);
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
sprintf(tbuf, "%s %s", LOC(mage->faction->locale,
|
sprintf(tbuf, "%s %s", LOC(mage->faction->locale,
|
||||||
parameters[P_TEMP]), itoa36(spobj->data.i));
|
parameters[P_TEMP]), itoa36(spobj->data.i));
|
||||||
uid = tbuf;
|
uid = tbuf;
|
||||||
|
@ -1566,7 +1587,7 @@ message *msg_unitnotfound(const struct unit * mage, struct order * ord,
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
verify_unit(region * r, unit * mage, const spell * sp, spllprm * spobj,
|
verify_unit(region * r, unit * mage, const spell * sp, spllprm * spobj,
|
||||||
order * ord)
|
order * ord)
|
||||||
{
|
{
|
||||||
unit *u = NULL;
|
unit *u = NULL;
|
||||||
switch (spobj->typ) {
|
switch (spobj->typ) {
|
||||||
|
@ -1737,7 +1758,8 @@ verify_targets(castorder * co, int *invalid, int *resist, int *success)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
/* der Zauber hat keine expliziten Parameter/Ziele, es kann sich
|
/* der Zauber hat keine expliziten Parameter/Ziele, es kann sich
|
||||||
* aber um einen Regionszauber handeln. Wenn notwendig hier die
|
* aber um einen Regionszauber handeln. Wenn notwendig hier die
|
||||||
* Magieresistenz der Region prüfen. */
|
* Magieresistenz der Region prüfen. */
|
||||||
|
@ -1761,13 +1783,16 @@ verify_targets(castorder * co, int *invalid, int *resist, int *success)
|
||||||
"unit region command", mage, mage->region, co->order));
|
"unit region command", mage, mage->region, co->order));
|
||||||
spobj->flag = TARGET_RESISTS;
|
spobj->flag = TARGET_RESISTS;
|
||||||
++*resist;
|
++*resist;
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
++*success;
|
++*success;
|
||||||
}
|
}
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
++*success;
|
++*success;
|
||||||
}
|
}
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
++*success;
|
++*success;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1846,14 +1871,15 @@ static int addparam_building(const char *const param[], spllprm ** spobjp)
|
||||||
|
|
||||||
static int
|
static int
|
||||||
addparam_region(const char *const param[], spllprm ** spobjp, const unit * u,
|
addparam_region(const char *const param[], spllprm ** spobjp, const unit * u,
|
||||||
order * ord, plane * pl)
|
order * ord, plane * pl)
|
||||||
{
|
{
|
||||||
assert(param[0]);
|
assert(param[0]);
|
||||||
if (param[1] == 0) {
|
if (param[1] == 0) {
|
||||||
/* Fehler: Zielregion vergessen */
|
/* Fehler: Zielregion vergessen */
|
||||||
cmistake(u, ord, 194, MSG_MAGIC);
|
cmistake(u, ord, 194, MSG_MAGIC);
|
||||||
return -1;
|
return -1;
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
int tx = atoi((const char *)param[0]), ty = atoi((const char *)param[1]);
|
int tx = atoi((const char *)param[0]), ty = atoi((const char *)param[1]);
|
||||||
int x = rel_to_abs(pl, u->faction, tx, 0);
|
int x = rel_to_abs(pl, u->faction, tx, 0);
|
||||||
int y = rel_to_abs(pl, u->faction, ty, 1);
|
int y = rel_to_abs(pl, u->faction, ty, 1);
|
||||||
|
@ -1868,7 +1894,8 @@ addparam_region(const char *const param[], spllprm ** spobjp, const unit * u,
|
||||||
spobj->flag = 0;
|
spobj->flag = 0;
|
||||||
spobj->typ = SPP_REGION;
|
spobj->typ = SPP_REGION;
|
||||||
spobj->data.r = rt;
|
spobj->data.r = rt;
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
/* Fehler: Zielregion vergessen */
|
/* Fehler: Zielregion vergessen */
|
||||||
cmistake(u, ord, 194, MSG_MAGIC);
|
cmistake(u, ord, 194, MSG_MAGIC);
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -1879,7 +1906,7 @@ addparam_region(const char *const param[], spllprm ** spobjp, const unit * u,
|
||||||
|
|
||||||
static int
|
static int
|
||||||
addparam_unit(const char *const param[], spllprm ** spobjp, const unit * u,
|
addparam_unit(const char *const param[], spllprm ** spobjp, const unit * u,
|
||||||
order * ord)
|
order * ord)
|
||||||
{
|
{
|
||||||
spllprm *spobj;
|
spllprm *spobj;
|
||||||
int i = 0;
|
int i = 0;
|
||||||
|
@ -2125,7 +2152,7 @@ bool is_familiar(const unit * u)
|
||||||
static void
|
static void
|
||||||
a_write_unit(const attrib * a, const void *owner, struct storage *store)
|
a_write_unit(const attrib * a, const void *owner, struct storage *store)
|
||||||
{
|
{
|
||||||
unit *u = (unit *) a->data.v;
|
unit *u = (unit *)a->data.v;
|
||||||
write_unit_reference(u, store);
|
write_unit_reference(u, store);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2153,14 +2180,14 @@ static void set_familiar(unit * mage, unit * familiar)
|
||||||
/* if the skill modifier for the mage does not yet exist, add it */
|
/* if the skill modifier for the mage does not yet exist, add it */
|
||||||
attrib *a = a_find(mage->attribs, &at_skillmod);
|
attrib *a = a_find(mage->attribs, &at_skillmod);
|
||||||
while (a && a->type == &at_skillmod) {
|
while (a && a->type == &at_skillmod) {
|
||||||
skillmod_data *smd = (skillmod_data *) a->data.v;
|
skillmod_data *smd = (skillmod_data *)a->data.v;
|
||||||
if (smd->special == sm_familiar)
|
if (smd->special == sm_familiar)
|
||||||
break;
|
break;
|
||||||
a = a->next;
|
a = a->next;
|
||||||
}
|
}
|
||||||
if (a == NULL) {
|
if (a == NULL) {
|
||||||
attrib *an = a_add(&mage->attribs, a_new(&at_skillmod));
|
attrib *an = a_add(&mage->attribs, a_new(&at_skillmod));
|
||||||
skillmod_data *smd = (skillmod_data *) an->data.v;
|
skillmod_data *smd = (skillmod_data *)an->data.v;
|
||||||
smd->special = sm_familiar;
|
smd->special = sm_familiar;
|
||||||
smd->skill = NOSKILL;
|
smd->skill = NOSKILL;
|
||||||
}
|
}
|
||||||
|
@ -2169,7 +2196,8 @@ static void set_familiar(unit * mage, unit * familiar)
|
||||||
if (a == NULL) {
|
if (a == NULL) {
|
||||||
a = a_add(&mage->attribs, a_new(&at_familiar));
|
a = a_add(&mage->attribs, a_new(&at_familiar));
|
||||||
a->data.v = familiar;
|
a->data.v = familiar;
|
||||||
} else
|
}
|
||||||
|
else
|
||||||
assert(!a->data.v || a->data.v == familiar);
|
assert(!a->data.v || a->data.v == familiar);
|
||||||
/* TODO: Diese Attribute beim Tod des Familiars entfernen: */
|
/* TODO: Diese Attribute beim Tod des Familiars entfernen: */
|
||||||
|
|
||||||
|
@ -2177,7 +2205,8 @@ static void set_familiar(unit * mage, unit * familiar)
|
||||||
if (a == NULL) {
|
if (a == NULL) {
|
||||||
a = a_add(&familiar->attribs, a_new(&at_familiarmage));
|
a = a_add(&familiar->attribs, a_new(&at_familiarmage));
|
||||||
a->data.v = mage;
|
a->data.v = mage;
|
||||||
} else
|
}
|
||||||
|
else
|
||||||
assert(!a->data.v || a->data.v == mage);
|
assert(!a->data.v || a->data.v == mage);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2193,7 +2222,7 @@ void remove_familiar(unit * mage)
|
||||||
a = a_find(mage->attribs, &at_skillmod);
|
a = a_find(mage->attribs, &at_skillmod);
|
||||||
while (a && a->type == &at_skillmod) {
|
while (a && a->type == &at_skillmod) {
|
||||||
an = a->next;
|
an = a->next;
|
||||||
smd = (skillmod_data *) a->data.v;
|
smd = (skillmod_data *)a->data.v;
|
||||||
if (smd->special == sm_familiar)
|
if (smd->special == sm_familiar)
|
||||||
a_remove(&mage->attribs, a);
|
a_remove(&mage->attribs, a);
|
||||||
a = an;
|
a = an;
|
||||||
|
@ -2224,14 +2253,14 @@ bool create_newfamiliar(unit * mage, unit * familiar)
|
||||||
|
|
||||||
a = a_find(mage->attribs, &at_skillmod);
|
a = a_find(mage->attribs, &at_skillmod);
|
||||||
while (a && a->type == &at_skillmod) {
|
while (a && a->type == &at_skillmod) {
|
||||||
skillmod_data *smd = (skillmod_data *) a->data.v;
|
skillmod_data *smd = (skillmod_data *)a->data.v;
|
||||||
if (smd->special == sm_familiar)
|
if (smd->special == sm_familiar)
|
||||||
break;
|
break;
|
||||||
a = a->next;
|
a = a->next;
|
||||||
}
|
}
|
||||||
if (a == NULL) {
|
if (a == NULL) {
|
||||||
attrib *an = a_add(&mage->attribs, a_new(&at_skillmod));
|
attrib *an = a_add(&mage->attribs, a_new(&at_skillmod));
|
||||||
skillmod_data *smd = (skillmod_data *) an->data.v;
|
skillmod_data *smd = (skillmod_data *)an->data.v;
|
||||||
smd->special = sm_familiar;
|
smd->special = sm_familiar;
|
||||||
smd->skill = NOSKILL;
|
smd->skill = NOSKILL;
|
||||||
}
|
}
|
||||||
|
@ -2245,11 +2274,11 @@ static int resolve_familiar(variant data, void *addr)
|
||||||
if (result == 0 && familiar) {
|
if (result == 0 && familiar) {
|
||||||
attrib *a = a_find(familiar->attribs, &at_familiarmage);
|
attrib *a = a_find(familiar->attribs, &at_familiarmage);
|
||||||
if (a != NULL && a->data.v) {
|
if (a != NULL && a->data.v) {
|
||||||
unit *mage = (unit *) a->data.v;
|
unit *mage = (unit *)a->data.v;
|
||||||
set_familiar(mage, familiar);
|
set_familiar(mage, familiar);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
*(unit **) addr = familiar;
|
*(unit **)addr = familiar;
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2273,7 +2302,8 @@ void create_newclone(unit * mage, unit * clone)
|
||||||
if (a == NULL) {
|
if (a == NULL) {
|
||||||
a = a_add(&mage->attribs, a_new(&at_clone));
|
a = a_add(&mage->attribs, a_new(&at_clone));
|
||||||
a->data.v = clone;
|
a->data.v = clone;
|
||||||
} else
|
}
|
||||||
|
else
|
||||||
assert(!a->data.v || a->data.v == clone);
|
assert(!a->data.v || a->data.v == clone);
|
||||||
/* TODO: Diese Attribute beim Tod des Klons entfernen: */
|
/* TODO: Diese Attribute beim Tod des Klons entfernen: */
|
||||||
|
|
||||||
|
@ -2281,7 +2311,8 @@ void create_newclone(unit * mage, unit * clone)
|
||||||
if (a == NULL) {
|
if (a == NULL) {
|
||||||
a = a_add(&clone->attribs, a_new(&at_clonemage));
|
a = a_add(&clone->attribs, a_new(&at_clonemage));
|
||||||
a->data.v = mage;
|
a->data.v = mage;
|
||||||
} else
|
}
|
||||||
|
else
|
||||||
assert(!a->data.v || a->data.v == mage);
|
assert(!a->data.v || a->data.v == mage);
|
||||||
|
|
||||||
/* Wenn der Magier stirbt, wird das in destroy_unit abgefangen.
|
/* Wenn der Magier stirbt, wird das in destroy_unit abgefangen.
|
||||||
|
@ -2299,14 +2330,16 @@ static void set_clone(unit * mage, unit * clone)
|
||||||
if (a == NULL) {
|
if (a == NULL) {
|
||||||
a = a_add(&mage->attribs, a_new(&at_clone));
|
a = a_add(&mage->attribs, a_new(&at_clone));
|
||||||
a->data.v = clone;
|
a->data.v = clone;
|
||||||
} else
|
}
|
||||||
|
else
|
||||||
assert(!a->data.v || a->data.v == clone);
|
assert(!a->data.v || a->data.v == clone);
|
||||||
|
|
||||||
a = a_find(clone->attribs, &at_clonemage);
|
a = a_find(clone->attribs, &at_clonemage);
|
||||||
if (a == NULL) {
|
if (a == NULL) {
|
||||||
a = a_add(&clone->attribs, a_new(&at_clonemage));
|
a = a_add(&clone->attribs, a_new(&at_clonemage));
|
||||||
a->data.v = mage;
|
a->data.v = mage;
|
||||||
} else
|
}
|
||||||
|
else
|
||||||
assert(!a->data.v || a->data.v == mage);
|
assert(!a->data.v || a->data.v == mage);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2314,7 +2347,7 @@ unit *has_clone(unit * mage)
|
||||||
{
|
{
|
||||||
attrib *a = a_find(mage->attribs, &at_clone);
|
attrib *a = a_find(mage->attribs, &at_clone);
|
||||||
if (a)
|
if (a)
|
||||||
return (unit *) a->data.v;
|
return (unit *)a->data.v;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2325,11 +2358,11 @@ static int resolve_clone(variant data, void *addr)
|
||||||
if (result == 0 && clone) {
|
if (result == 0 && clone) {
|
||||||
attrib *a = a_find(clone->attribs, &at_clonemage);
|
attrib *a = a_find(clone->attribs, &at_clonemage);
|
||||||
if (a != NULL && a->data.v) {
|
if (a != NULL && a->data.v) {
|
||||||
unit *mage = (unit *) a->data.v;
|
unit *mage = (unit *)a->data.v;
|
||||||
set_clone(mage, clone);
|
set_clone(mage, clone);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
*(unit **) addr = clone;
|
*(unit **)addr = clone;
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2352,11 +2385,11 @@ static int resolve_mage(variant data, void *addr)
|
||||||
if (result == 0 && mage) {
|
if (result == 0 && mage) {
|
||||||
attrib *a = a_find(mage->attribs, &at_familiar);
|
attrib *a = a_find(mage->attribs, &at_familiar);
|
||||||
if (a != NULL && a->data.v) {
|
if (a != NULL && a->data.v) {
|
||||||
unit *familiar = (unit *) a->data.v;
|
unit *familiar = (unit *)a->data.v;
|
||||||
set_familiar(mage, familiar);
|
set_familiar(mage, familiar);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
*(unit **) addr = mage;
|
*(unit **)addr = mage;
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2373,7 +2406,7 @@ static int read_magician(attrib * a, void *owner, struct storage *store)
|
||||||
static int age_unit(attrib * a)
|
static int age_unit(attrib * a)
|
||||||
/* if unit is gone or dead, remove the attribute */
|
/* if unit is gone or dead, remove the attribute */
|
||||||
{
|
{
|
||||||
unit *u = (unit *) a->data.v;
|
unit *u = (unit *)a->data.v;
|
||||||
return (u != NULL && u->number > 0) ? AT_AGE_KEEP : AT_AGE_REMOVE;
|
return (u != NULL && u->number > 0) ? AT_AGE_KEEP : AT_AGE_REMOVE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2421,7 +2454,7 @@ unit *get_familiar(const unit * u)
|
||||||
{
|
{
|
||||||
attrib *a = a_find(u->attribs, &at_familiar);
|
attrib *a = a_find(u->attribs, &at_familiar);
|
||||||
if (a != NULL) {
|
if (a != NULL) {
|
||||||
unit *u = (unit *) a->data.v;
|
unit *u = (unit *)a->data.v;
|
||||||
if (u->number > 0)
|
if (u->number > 0)
|
||||||
return u;
|
return u;
|
||||||
}
|
}
|
||||||
|
@ -2432,7 +2465,7 @@ unit *get_familiar_mage(const unit * u)
|
||||||
{
|
{
|
||||||
attrib *a = a_find(u->attribs, &at_familiarmage);
|
attrib *a = a_find(u->attribs, &at_familiarmage);
|
||||||
if (a != NULL) {
|
if (a != NULL) {
|
||||||
unit *u = (unit *) a->data.v;
|
unit *u = (unit *)a->data.v;
|
||||||
if (u->number > 0)
|
if (u->number > 0)
|
||||||
return u;
|
return u;
|
||||||
}
|
}
|
||||||
|
@ -2443,7 +2476,7 @@ unit *get_clone(const unit * u)
|
||||||
{
|
{
|
||||||
attrib *a = a_find(u->attribs, &at_clone);
|
attrib *a = a_find(u->attribs, &at_clone);
|
||||||
if (a != NULL) {
|
if (a != NULL) {
|
||||||
unit *u = (unit *) a->data.v;
|
unit *u = (unit *)a->data.v;
|
||||||
if (u->number > 0)
|
if (u->number > 0)
|
||||||
return u;
|
return u;
|
||||||
}
|
}
|
||||||
|
@ -2454,7 +2487,7 @@ unit *get_clone_mage(const unit * u)
|
||||||
{
|
{
|
||||||
attrib *a = a_find(u->attribs, &at_clonemage);
|
attrib *a = a_find(u->attribs, &at_clonemage);
|
||||||
if (a != NULL) {
|
if (a != NULL) {
|
||||||
unit *u = (unit *) a->data.v;
|
unit *u = (unit *)a->data.v;
|
||||||
if (u->number > 0)
|
if (u->number > 0)
|
||||||
return u;
|
return u;
|
||||||
}
|
}
|
||||||
|
@ -2562,7 +2595,8 @@ static castorder *cast_cmd(unit * u, order * ord)
|
||||||
if (caster) {
|
if (caster) {
|
||||||
familiar = u;
|
familiar = u;
|
||||||
sp = unit_getspell(caster, s, caster->faction->locale);
|
sp = unit_getspell(caster, s, caster->faction->locale);
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
/* somehow, this familiar has no mage! */
|
/* somehow, this familiar has no mage! */
|
||||||
log_error("cast_cmd: familiar %s is without a mage?\n", unitname(u));
|
log_error("cast_cmd: familiar %s is without a mage?\n", unitname(u));
|
||||||
caster = u;
|
caster = u;
|
||||||
|
@ -2604,7 +2638,8 @@ static castorder *cast_cmd(unit * u, order * ord)
|
||||||
}
|
}
|
||||||
/* Auf bewegenden Schiffen kann man nur explizit als
|
/* Auf bewegenden Schiffen kann man nur explizit als
|
||||||
* ONSHIPCAST deklarierte Zauber sprechen */
|
* ONSHIPCAST deklarierte Zauber sprechen */
|
||||||
} else if (u->ship) {
|
}
|
||||||
|
else if (u->ship) {
|
||||||
if (is_moving_ship(r, u->ship)) {
|
if (is_moving_ship(r, u->ship)) {
|
||||||
if (!(sp->sptyp & ONSHIPCAST)) {
|
if (!(sp->sptyp & ONSHIPCAST)) {
|
||||||
/* Fehler: "Diesen Spruch kann man nicht auf einem sich
|
/* Fehler: "Diesen Spruch kann man nicht auf einem sich
|
||||||
|
@ -2817,7 +2852,8 @@ void magic(void)
|
||||||
/* kein Ziel gefunden, Fehlermeldungen sind in verify_targets */
|
/* kein Ziel gefunden, Fehlermeldungen sind in verify_targets */
|
||||||
/* keine kosten für den zauber */
|
/* keine kosten für den zauber */
|
||||||
continue; /* äußere Schleife, nächster Zauberer */
|
continue; /* äußere Schleife, nächster Zauberer */
|
||||||
} else if (co->force > 0 && resist > 0) {
|
}
|
||||||
|
else if (co->force > 0 && resist > 0) {
|
||||||
/* einige oder alle Ziele waren magieresistent */
|
/* einige oder alle Ziele waren magieresistent */
|
||||||
if (success == 0) {
|
if (success == 0) {
|
||||||
co->force = 0;
|
co->force = 0;
|
||||||
|
@ -2834,7 +2870,8 @@ void magic(void)
|
||||||
if (fumble(target_r, u, sp, co->level)) {
|
if (fumble(target_r, u, sp, co->level)) {
|
||||||
/* zuerst bezahlen, dann evt in do_fumble alle Aura verlieren */
|
/* zuerst bezahlen, dann evt in do_fumble alle Aura verlieren */
|
||||||
fumbled = true;
|
fumbled = true;
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
co->level = sp->cast(co);
|
co->level = sp->cast(co);
|
||||||
if (co->level <= 0) {
|
if (co->level <= 0) {
|
||||||
/* Kosten nur für real benötige Stufe berechnen */
|
/* Kosten nur für real benötige Stufe berechnen */
|
||||||
|
@ -2843,7 +2880,7 @@ void magic(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* erst bezahlen, dann Kostenzähler erhöhen */
|
/* erst bezahlen, dann Kostenzähler erhöhen */
|
||||||
if (co->level>0) {
|
if (co->level > 0) {
|
||||||
pay_spell(u, sp, co->level, co->distance);
|
pay_spell(u, sp, co->level, co->distance);
|
||||||
}
|
}
|
||||||
if (fumbled) {
|
if (fumbled) {
|
||||||
|
@ -2902,7 +2939,8 @@ spell *unit_getspell(struct unit *u, const char *name, const struct locale * lan
|
||||||
const char *n = spell_name(sp, lang);
|
const char *n = spell_name(sp, lang);
|
||||||
if (!n) {
|
if (!n) {
|
||||||
log_error("no translation in locale %s for spell %s\n", locale_name(lang), sp->sname);
|
log_error("no translation in locale %s for spell %s\n", locale_name(lang), sp->sname);
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
token.v = sp;
|
token.v = sp;
|
||||||
addtoken(&tokens, n, token);
|
addtoken(&tokens, n, token);
|
||||||
}
|
}
|
||||||
|
@ -2912,7 +2950,7 @@ spell *unit_getspell(struct unit *u, const char *name, const struct locale * lan
|
||||||
if (tokens) {
|
if (tokens) {
|
||||||
if (findtoken(tokens, name, &token) != E_TOK_NOMATCH) {
|
if (findtoken(tokens, name, &token) != E_TOK_NOMATCH) {
|
||||||
freetokens(tokens);
|
freetokens(tokens);
|
||||||
return (spell *) token.v;
|
return (spell *)token.v;
|
||||||
}
|
}
|
||||||
freetokens(tokens);
|
freetokens(tokens);
|
||||||
}
|
}
|
||||||
|
@ -2930,10 +2968,11 @@ spellbook * get_spellbook(const char * name)
|
||||||
|
|
||||||
if (cb_find_prefix(&cb_spellbooks, name, strlen(name), &match, 1, 0)) {
|
if (cb_find_prefix(&cb_spellbooks, name, strlen(name), &match, 1, 0)) {
|
||||||
cb_get_kv(match, &result, sizeof(result));
|
cb_get_kv(match, &result, sizeof(result));
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
size_t len = strlen(name);
|
size_t len = strlen(name);
|
||||||
result = create_spellbook(name);
|
result = create_spellbook(name);
|
||||||
assert(strlen(name)+sizeof(result)<sizeof(buffer));
|
assert(strlen(name) + sizeof(result) < sizeof(buffer));
|
||||||
len = cb_new_kv(name, len, &result, sizeof(result), buffer);
|
len = cb_new_kv(name, len, &result, sizeof(result), buffer);
|
||||||
cb_insert(&cb_spellbooks, buffer, len);
|
cb_insert(&cb_spellbooks, buffer, len);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
Copyright (c) 1998-2010, Enno Rehling <enno@eressea.de>
|
Copyright (c) 1998-2010, Enno Rehling <enno@eressea.de>
|
||||||
Katja Zedel <katze@felidae.kn-bremen.de
|
Katja Zedel <katze@felidae.kn-bremen.de
|
||||||
Christian Schlittchen <corwin@amber.kn-bremen.de>
|
Christian Schlittchen <corwin@amber.kn-bremen.de>
|
||||||
|
|
||||||
Permission to use, copy, modify, and/or distribute this software for any
|
Permission to use, copy, modify, and/or distribute this software for any
|
||||||
purpose with or without fee is hereby granted, provided that the above
|
purpose with or without fee is hereby granted, provided that the above
|
||||||
|
@ -97,7 +97,7 @@ typedef struct follower {
|
||||||
|
|
||||||
static void
|
static void
|
||||||
get_followers(unit * target, region * r, const region_list * route_end,
|
get_followers(unit * target, region * r, const region_list * route_end,
|
||||||
follower ** followers)
|
follower ** followers)
|
||||||
{
|
{
|
||||||
unit *uf;
|
unit *uf;
|
||||||
for (uf = r->units; uf; uf = uf->next) {
|
for (uf = r->units; uf; uf = uf->next) {
|
||||||
|
@ -127,7 +127,7 @@ static void shiptrail_finalize(attrib * a)
|
||||||
|
|
||||||
static int shiptrail_age(attrib * a)
|
static int shiptrail_age(attrib * a)
|
||||||
{
|
{
|
||||||
traveldir *t = (traveldir *) (a->data.v);
|
traveldir *t = (traveldir *)(a->data.v);
|
||||||
|
|
||||||
t->age--;
|
t->age--;
|
||||||
return (t->age > 0) ? AT_AGE_KEEP : AT_AGE_REMOVE;
|
return (t->age > 0) ? AT_AGE_KEEP : AT_AGE_REMOVE;
|
||||||
|
@ -136,7 +136,7 @@ static int shiptrail_age(attrib * a)
|
||||||
static int shiptrail_read(attrib * a, void *owner, struct storage *store)
|
static int shiptrail_read(attrib * a, void *owner, struct storage *store)
|
||||||
{
|
{
|
||||||
int n;
|
int n;
|
||||||
traveldir *t = (traveldir *) (a->data.v);
|
traveldir *t = (traveldir *)(a->data.v);
|
||||||
|
|
||||||
READ_INT(store, &t->no);
|
READ_INT(store, &t->no);
|
||||||
READ_INT(store, &n);
|
READ_INT(store, &n);
|
||||||
|
@ -148,7 +148,7 @@ static int shiptrail_read(attrib * a, void *owner, struct storage *store)
|
||||||
static void
|
static void
|
||||||
shiptrail_write(const attrib * a, const void *owner, struct storage *store)
|
shiptrail_write(const attrib * a, const void *owner, struct storage *store)
|
||||||
{
|
{
|
||||||
traveldir *t = (traveldir *) (a->data.v);
|
traveldir *t = (traveldir *)(a->data.v);
|
||||||
WRITE_INT(store, t->no);
|
WRITE_INT(store, t->no);
|
||||||
WRITE_INT(store, t->dir);
|
WRITE_INT(store, t->dir);
|
||||||
WRITE_INT(store, t->age);
|
WRITE_INT(store, t->age);
|
||||||
|
@ -217,7 +217,7 @@ static int eff_weight(const unit * u)
|
||||||
|
|
||||||
static void
|
static void
|
||||||
get_transporters(const item * itm, int *p_animals, int *p_acap, int *p_vehicles,
|
get_transporters(const item * itm, int *p_animals, int *p_acap, int *p_vehicles,
|
||||||
int *p_vcap)
|
int *p_vcap)
|
||||||
{
|
{
|
||||||
int vehicles = 0, vcap = 0;
|
int vehicles = 0, vcap = 0;
|
||||||
int animals = 0, acap = 0;
|
int animals = 0, acap = 0;
|
||||||
|
@ -286,7 +286,8 @@ int walkingcapacity(const struct unit *u)
|
||||||
if (fval(u_race(u), RCF_HORSE)) {
|
if (fval(u_race(u), RCF_HORSE)) {
|
||||||
animals += u->number;
|
animals += u->number;
|
||||||
people = 0;
|
people = 0;
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
people = u->number;
|
people = u->number;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -425,7 +426,8 @@ static int canride(unit * u)
|
||||||
for (itm = u->items; itm; itm = itm->next) {
|
for (itm = u->items; itm; itm = itm->next) {
|
||||||
if (itm->type == it_horse || itm->type == it_charger) {
|
if (itm->type == it_horse || itm->type == it_charger) {
|
||||||
horses += itm->number;
|
horses += itm->number;
|
||||||
} else if (itm->type == it_elvenhorse) {
|
}
|
||||||
|
else if (itm->type == it_elvenhorse) {
|
||||||
unicorns += itm->number;
|
unicorns += itm->number;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -457,7 +459,8 @@ static bool cansail(const region * r, ship * sh)
|
||||||
|
|
||||||
if (sh->type->construction && sh->size != sh->type->construction->maxsize) {
|
if (sh->type->construction && sh->size != sh->type->construction->maxsize) {
|
||||||
return false;
|
return false;
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
int n = 0, p = 0;
|
int n = 0, p = 0;
|
||||||
int mweight = shipcapacity(sh);
|
int mweight = shipcapacity(sh);
|
||||||
int mcabins = sh->type->cabins;
|
int mcabins = sh->type->cabins;
|
||||||
|
@ -550,7 +553,7 @@ static void leave_trail(ship * sh, region * from, region_list * route)
|
||||||
attrib *a = a_find(r->attribs, &at_shiptrail);
|
attrib *a = a_find(r->attribs, &at_shiptrail);
|
||||||
|
|
||||||
while (a != NULL && a->type == &at_shiptrail) {
|
while (a != NULL && a->type == &at_shiptrail) {
|
||||||
td = (traveldir *) a->data.v;
|
td = (traveldir *)a->data.v;
|
||||||
if (td->no == sh->no)
|
if (td->no == sh->no)
|
||||||
break;
|
break;
|
||||||
a = a->next;
|
a = a->next;
|
||||||
|
@ -558,7 +561,7 @@ static void leave_trail(ship * sh, region * from, region_list * route)
|
||||||
|
|
||||||
if (a == NULL || a->type != &at_shiptrail) {
|
if (a == NULL || a->type != &at_shiptrail) {
|
||||||
a = a_add(&(r->attribs), a_new(&at_shiptrail));
|
a = a_add(&(r->attribs), a_new(&at_shiptrail));
|
||||||
td = (traveldir *) a->data.v;
|
td = (traveldir *)a->data.v;
|
||||||
td->no = sh->no;
|
td->no = sh->no;
|
||||||
}
|
}
|
||||||
td->dir = dir;
|
td->dir = dir;
|
||||||
|
@ -571,7 +574,7 @@ static void leave_trail(ship * sh, region * from, region_list * route)
|
||||||
|
|
||||||
static void
|
static void
|
||||||
mark_travelthru(const unit * u, region * r, const region_list * route,
|
mark_travelthru(const unit * u, region * r, const region_list * route,
|
||||||
const region_list * route_end)
|
const region_list * route_end)
|
||||||
{
|
{
|
||||||
/* kein travelthru in der letzten region! */
|
/* kein travelthru in der letzten region! */
|
||||||
while (route != route_end) {
|
while (route != route_end) {
|
||||||
|
@ -685,10 +688,12 @@ static void set_coast(ship * sh, region * r, region * rnext)
|
||||||
{
|
{
|
||||||
if (sh->type->flags & SFL_NOCOAST) {
|
if (sh->type->flags & SFL_NOCOAST) {
|
||||||
sh->coast = NODIRECTION;
|
sh->coast = NODIRECTION;
|
||||||
} else if (!fval(rnext->terrain, SEA_REGION) && !flying_ship(sh)) {
|
}
|
||||||
|
else if (!fval(rnext->terrain, SEA_REGION) && !flying_ship(sh)) {
|
||||||
sh->coast = reldirection(rnext, r);
|
sh->coast = reldirection(rnext, r);
|
||||||
assert(fval(r->terrain, SEA_REGION));
|
assert(fval(r->terrain, SEA_REGION));
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
sh->coast = NODIRECTION;
|
sh->coast = NODIRECTION;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -705,7 +710,7 @@ static float damage_drift(void)
|
||||||
static void drifting_ships(region * r)
|
static void drifting_ships(region * r)
|
||||||
{
|
{
|
||||||
direction_t d;
|
direction_t d;
|
||||||
bool drift = get_param_int(global.parameters, "rules.ship.drifting", 1)!=0;
|
bool drift = get_param_int(global.parameters, "rules.ship.drifting", 1) != 0;
|
||||||
|
|
||||||
if (fval(r->terrain, SEA_REGION)) {
|
if (fval(r->terrain, SEA_REGION)) {
|
||||||
ship **shp = &r->ships;
|
ship **shp = &r->ships;
|
||||||
|
@ -752,7 +757,7 @@ static void drifting_ships(region * r)
|
||||||
d_offset = rng_int() % MAXDIRECTIONS;
|
d_offset = rng_int() % MAXDIRECTIONS;
|
||||||
for (d = 0; d != MAXDIRECTIONS; ++d) {
|
for (d = 0; d != MAXDIRECTIONS; ++d) {
|
||||||
region *rn;
|
region *rn;
|
||||||
dir = (direction_t) ((d + d_offset) % MAXDIRECTIONS);
|
dir = (direction_t)((d + d_offset) % MAXDIRECTIONS);
|
||||||
rn = rconnect(r, dir);
|
rn = rconnect(r, dir);
|
||||||
if (rn != NULL && fval(rn->terrain, SAIL_INTO) && check_ship_allowed(sh, rn) > 0) {
|
if (rn != NULL && fval(rn->terrain, SAIL_INTO) && check_ship_allowed(sh, rn) > 0) {
|
||||||
rnext = rn;
|
rnext = rn;
|
||||||
|
@ -807,7 +812,7 @@ static void drifting_ships(region * r)
|
||||||
|
|
||||||
static bool present(region * r, unit * u)
|
static bool present(region * r, unit * u)
|
||||||
{
|
{
|
||||||
return (bool) (u && u->region == r);
|
return (bool)(u && u->region == r);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void caught_target(region * r, unit * u)
|
static void caught_target(region * r, unit * u)
|
||||||
|
@ -819,12 +824,13 @@ static void caught_target(region * r, unit * u)
|
||||||
* Umstaenden eine Warnung. */
|
* Umstaenden eine Warnung. */
|
||||||
|
|
||||||
if (a) {
|
if (a) {
|
||||||
unit *target = (unit *) a->data.v;
|
unit *target = (unit *)a->data.v;
|
||||||
|
|
||||||
if (!present(r, target)) {
|
if (!present(r, target)) {
|
||||||
ADDMSG(&u->faction->msgs, msg_message("followfail", "unit follower",
|
ADDMSG(&u->faction->msgs, msg_message("followfail", "unit follower",
|
||||||
target, u));
|
target, u));
|
||||||
} else if (!alliedunit(target, u->faction, HELP_ALL)
|
}
|
||||||
|
else if (!alliedunit(target, u->faction, HELP_ALL)
|
||||||
&& cansee(target->faction, r, u, 0)) {
|
&& cansee(target->faction, r, u, 0)) {
|
||||||
ADDMSG(&target->faction->msgs, msg_message("followdetect",
|
ADDMSG(&target->faction->msgs, msg_message("followdetect",
|
||||||
"unit follower", target, u));
|
"unit follower", target, u));
|
||||||
|
@ -873,7 +879,7 @@ static unit *bewegung_blockiert_von(unit * reisender, region * r)
|
||||||
else if (sk >= stealth) {
|
else if (sk >= stealth) {
|
||||||
double prob_u = (sk - stealth) * skill_prob;
|
double prob_u = (sk - stealth) * skill_prob;
|
||||||
/* amulet counts at most once */
|
/* amulet counts at most once */
|
||||||
prob_u += _min (1, _min(u->number, i_get(u->items, ramulet->itype))) * amulet_prob;
|
prob_u += _min(1, _min(u->number, i_get(u->items, ramulet->itype))) * amulet_prob;
|
||||||
if (prob_u >= prob) {
|
if (prob_u >= prob) {
|
||||||
prob = prob_u;
|
prob = prob_u;
|
||||||
guard = u;
|
guard = u;
|
||||||
|
@ -915,7 +921,7 @@ static bool is_guardian_r(const unit * guard)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
/* if region_owners exist then they may be guardians: */
|
/* if region_owners exist then they may be guardians: */
|
||||||
if (guard->building && rule_region_owners() && guard==building_owner(guard->building)) {
|
if (guard->building && rule_region_owners() && guard == building_owner(guard->building)) {
|
||||||
faction *owner = region_get_owner(guard->region);
|
faction *owner = region_get_owner(guard->region);
|
||||||
if (owner == guard->faction) {
|
if (owner == guard->faction) {
|
||||||
building *bowner = largestbuilding(guard->region, &cmp_taxes, false);
|
building *bowner = largestbuilding(guard->region, &cmp_taxes, false);
|
||||||
|
@ -979,7 +985,8 @@ unit *is_guarded(region * r, unit * u, unsigned int mask)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
u2 = guard;
|
u2 = guard;
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
/* exhausted all the guards in the cache, but maybe we'll find one later? */
|
/* exhausted all the guards in the cache, but maybe we'll find one later? */
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1052,10 +1059,12 @@ static void cycle_route(order * ord, unit * u, int gereist)
|
||||||
d = get_direction(token, lang);
|
d = get_direction(token, lang);
|
||||||
if (d == D_PAUSE) {
|
if (d == D_PAUSE) {
|
||||||
pause = true;
|
pause = true;
|
||||||
} else if (d == NODIRECTION) {
|
}
|
||||||
|
else if (d == NODIRECTION) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (cm < gereist) {
|
if (cm < gereist) {
|
||||||
|
@ -1072,7 +1081,8 @@ static void cycle_route(order * ord, unit * u, int gereist)
|
||||||
if (wrptr(&bufp, &size, bytes) != 0)
|
if (wrptr(&bufp, &size, bytes) != 0)
|
||||||
WARN_STATIC_BUFFER();
|
WARN_STATIC_BUFFER();
|
||||||
}
|
}
|
||||||
} else if (strlen(neworder) > sizeof(neworder) / 2)
|
}
|
||||||
|
else if (strlen(neworder) > sizeof(neworder) / 2)
|
||||||
break;
|
break;
|
||||||
else if (cm == gereist && !paused && pause) {
|
else if (cm == gereist && !paused && pause) {
|
||||||
const char *loc = LOC(lang, parameters[P_PAUSE]);
|
const char *loc = LOC(lang, parameters[P_PAUSE]);
|
||||||
|
@ -1083,14 +1093,16 @@ static void cycle_route(order * ord, unit * u, int gereist)
|
||||||
if (wrptr(&bufp, &size, bytes) != 0)
|
if (wrptr(&bufp, &size, bytes) != 0)
|
||||||
WARN_STATIC_BUFFER();
|
WARN_STATIC_BUFFER();
|
||||||
paused = true;
|
paused = true;
|
||||||
} else if (pause) {
|
}
|
||||||
|
else if (pause) {
|
||||||
/* da PAUSE nicht in ein shortdirections[d] umgesetzt wird (ist
|
/* da PAUSE nicht in ein shortdirections[d] umgesetzt wird (ist
|
||||||
* hier keine normale direction), muss jede PAUSE einzeln
|
* hier keine normale direction), muss jede PAUSE einzeln
|
||||||
* herausgefiltert und explizit gesetzt werden */
|
* herausgefiltert und explizit gesetzt werden */
|
||||||
if (neworder[0])
|
if (neworder[0])
|
||||||
strcat(neworder, " ");
|
strcat(neworder, " ");
|
||||||
strcat(neworder, LOC(lang, parameters[P_PAUSE]));
|
strcat(neworder, LOC(lang, parameters[P_PAUSE]));
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
if (neworder[0])
|
if (neworder[0])
|
||||||
strcat(neworder, " ");
|
strcat(neworder, " ");
|
||||||
strcat(neworder, LOC(lang, shortdirections[d]));
|
strcat(neworder, LOC(lang, shortdirections[d]));
|
||||||
|
@ -1099,7 +1111,8 @@ static void cycle_route(order * ord, unit * u, int gereist)
|
||||||
|
|
||||||
if (neworder[0]) {
|
if (neworder[0]) {
|
||||||
norder = create_order(K_ROUTE, u->faction->locale, "%s %s", neworder, tail);
|
norder = create_order(K_ROUTE, u->faction->locale, "%s %s", neworder, tail);
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
norder = create_order(K_ROUTE, u->faction->locale, "%s", tail);
|
norder = create_order(K_ROUTE, u->faction->locale, "%s", tail);
|
||||||
}
|
}
|
||||||
replace_order(&u->orders, ord, norder);
|
replace_order(&u->orders, ord, norder);
|
||||||
|
@ -1161,7 +1174,8 @@ static void init_transportation(void)
|
||||||
if (!transport(ut, u)) {
|
if (!transport(ut, u)) {
|
||||||
if (cansee(u->faction, r, ut, 0)) {
|
if (cansee(u->faction, r, ut, 0)) {
|
||||||
cmistake(u, u->thisorder, 286, MSG_MOVE);
|
cmistake(u, u->thisorder, 286, MSG_MOVE);
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
ADDMSG(&u->faction->msgs, msg_feedback(u, u->thisorder,
|
ADDMSG(&u->faction->msgs, msg_feedback(u, u->thisorder,
|
||||||
"feedback_unit_not_found", ""));
|
"feedback_unit_not_found", ""));
|
||||||
}
|
}
|
||||||
|
@ -1429,9 +1443,9 @@ static arg_regions *var_copy_regions(const region_list * begin, int size)
|
||||||
if (size > 0) {
|
if (size > 0) {
|
||||||
int i = 0;
|
int i = 0;
|
||||||
arg_regions *dst =
|
arg_regions *dst =
|
||||||
(arg_regions *) malloc(sizeof(arg_regions) + sizeof(region *) * size);
|
(arg_regions *)malloc(sizeof(arg_regions) + sizeof(region *) * size);
|
||||||
dst->nregions = size;
|
dst->nregions = size;
|
||||||
dst->regions = (region **) (dst + 1);
|
dst->regions = (region **)(dst + 1);
|
||||||
for (rsrc = begin; i != size; rsrc = rsrc->next) {
|
for (rsrc = begin; i != size; rsrc = rsrc->next) {
|
||||||
dst->regions[i++] = rsrc->data;
|
dst->regions[i++] = rsrc->data;
|
||||||
}
|
}
|
||||||
|
@ -1481,18 +1495,21 @@ static const region_list *travel_route(unit * u,
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
landing = true;
|
landing = true;
|
||||||
} else if ((u_race(u)->flags & RCF_WALK) == 0) {
|
}
|
||||||
|
else if ((u_race(u)->flags & RCF_WALK) == 0) {
|
||||||
/* Spezialeinheiten, die nicht laufen können. */
|
/* Spezialeinheiten, die nicht laufen können. */
|
||||||
ADDMSG(&u->faction->msgs, msg_message("detectocean",
|
ADDMSG(&u->faction->msgs, msg_message("detectocean",
|
||||||
"unit region", u, next));
|
"unit region", u, next));
|
||||||
break;
|
break;
|
||||||
} else if (landing) {
|
}
|
||||||
|
else if (landing) {
|
||||||
/* wir sind diese woche angelandet */
|
/* wir sind diese woche angelandet */
|
||||||
ADDMSG(&u->faction->msgs, msg_message("detectocean",
|
ADDMSG(&u->faction->msgs, msg_message("detectocean",
|
||||||
"unit region", u, next));
|
"unit region", u, next));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
/* Ozeanfelder können nur von Einheiten mit Schwimmen und ohne
|
/* Ozeanfelder können nur von Einheiten mit Schwimmen und ohne
|
||||||
* Pferde betreten werden. */
|
* Pferde betreten werden. */
|
||||||
if (!(canswim(u) || canfly(u))) {
|
if (!(canswim(u) || canfly(u))) {
|
||||||
|
@ -1583,7 +1600,8 @@ static const region_list *travel_route(unit * u,
|
||||||
if (canride(u)) {
|
if (canride(u)) {
|
||||||
walkmode = 1;
|
walkmode = 1;
|
||||||
produceexp(u, SK_RIDING, u->number);
|
produceexp(u, SK_RIDING, u->number);
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
walkmode = 2;
|
walkmode = 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1608,7 +1626,7 @@ static const region_list *travel_route(unit * u,
|
||||||
|
|
||||||
static bool ship_ready(const region * r, unit * u)
|
static bool ship_ready(const region * r, unit * u)
|
||||||
{
|
{
|
||||||
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, u->thisorder, 146, MSG_MOVE);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -1625,7 +1643,7 @@ static bool ship_ready(const region * r, unit * u)
|
||||||
}
|
}
|
||||||
if (!enoughsailors(u->ship, r)) {
|
if (!enoughsailors(u->ship, r)) {
|
||||||
cmistake(u, u->thisorder, 1, MSG_MOVE);
|
cmistake(u, u->thisorder, 1, MSG_MOVE);
|
||||||
/* mistake(u, u->thisorder,
|
/* mistake(u, u->thisorder,
|
||||||
"Auf dem Schiff befinden sich zuwenig erfahrene Seeleute.", MSG_MOVE); */
|
"Auf dem Schiff befinden sich zuwenig erfahrene Seeleute.", MSG_MOVE); */
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -1673,9 +1691,9 @@ static bool check_takeoff(ship * sh, region * from, region * to)
|
||||||
if (!fval(from->terrain, SEA_REGION) && sh->coast != NODIRECTION) {
|
if (!fval(from->terrain, SEA_REGION) && sh->coast != NODIRECTION) {
|
||||||
direction_t coast = sh->coast;
|
direction_t coast = sh->coast;
|
||||||
direction_t dir = reldirection(from, to);
|
direction_t dir = reldirection(from, to);
|
||||||
direction_t coastr = (direction_t) ((coast + 1) % MAXDIRECTIONS);
|
direction_t coastr = (direction_t)((coast + 1) % MAXDIRECTIONS);
|
||||||
direction_t coastl =
|
direction_t coastl =
|
||||||
(direction_t) ((coast + MAXDIRECTIONS - 1) % MAXDIRECTIONS);
|
(direction_t)((coast + MAXDIRECTIONS - 1) % MAXDIRECTIONS);
|
||||||
|
|
||||||
if (dir != coast && dir != coastl && dir != coastr
|
if (dir != coast && dir != coastl && dir != coastr
|
||||||
&& !buildingtype_exists(from, bt_find("harbour"), true)) {
|
&& !buildingtype_exists(from, bt_find("harbour"), true)) {
|
||||||
|
@ -1739,7 +1757,7 @@ sail(unit * u, order * ord, bool move_on_land, region_list ** routep)
|
||||||
|
|
||||||
assert(sh == u->ship || !"ship has sunk, but we didn't notice it");
|
assert(sh == u->ship || !"ship has sunk, but we didn't notice it");
|
||||||
|
|
||||||
if (fval(next_point->terrain, FORBIDDEN_REGION)||fval(next_point,RF_BLOCKED)) {
|
if (fval(next_point->terrain, FORBIDDEN_REGION) || fval(next_point, RF_BLOCKED)) {
|
||||||
ADDMSG(&f->msgs, msg_message("sailforbidden",
|
ADDMSG(&f->msgs, msg_message("sailforbidden",
|
||||||
"ship region", sh, next_point));
|
"ship region", sh, next_point));
|
||||||
break;
|
break;
|
||||||
|
@ -1752,7 +1770,7 @@ sail(unit * u, order * ord, bool move_on_land, region_list ** routep)
|
||||||
int reason;
|
int reason;
|
||||||
|
|
||||||
if (gamecookie != global.cookie) {
|
if (gamecookie != global.cookie) {
|
||||||
bool storms_enabled = get_param_int(global.parameters, "rules.ship.storms", 1)!=0;
|
bool storms_enabled = get_param_int(global.parameters, "rules.ship.storms", 1) != 0;
|
||||||
if (storms_enabled) {
|
if (storms_enabled) {
|
||||||
gamedate date;
|
gamedate date;
|
||||||
get_gamedate(turn, &date);
|
get_gamedate(turn, &date);
|
||||||
|
@ -1781,7 +1799,7 @@ sail(unit * u, order * ord, bool move_on_land, region_list ** routep)
|
||||||
direction_t d;
|
direction_t d;
|
||||||
/* Sturm nur, wenn nächste Region Hochsee ist. */
|
/* Sturm nur, wenn nächste Region Hochsee ist. */
|
||||||
for (d = 0; d != MAXDIRECTIONS; ++d) {
|
for (d = 0; d != MAXDIRECTIONS; ++d) {
|
||||||
direction_t dnext = (direction_t) ((d + d_offset) % MAXDIRECTIONS);
|
direction_t dnext = (direction_t)((d + d_offset) % MAXDIRECTIONS);
|
||||||
region *rn = rconnect(current_point, dnext);
|
region *rn = rconnect(current_point, dnext);
|
||||||
|
|
||||||
if (rn != NULL) {
|
if (rn != NULL) {
|
||||||
|
@ -1819,14 +1837,16 @@ sail(unit * u, order * ord, bool move_on_land, region_list ** routep)
|
||||||
"ship region", sh, next_point));
|
"ship region", sh, next_point));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
if (!check_takeoff(sh, current_point, next_point)) {
|
if (!check_takeoff(sh, current_point, next_point)) {
|
||||||
/* Schiff kann nicht ablegen */
|
/* Schiff kann nicht ablegen */
|
||||||
cmistake(u, ord, 182, MSG_MOVE);
|
cmistake(u, ord, 182, MSG_MOVE);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (fval(tnext, SEA_REGION)) {
|
}
|
||||||
|
else if (fval(tnext, SEA_REGION)) {
|
||||||
/* target region is an ocean, and we're not leaving a shore */
|
/* target region is an ocean, and we're not leaving a shore */
|
||||||
if (!(sh->type->flags & SFL_OPENSEA)) {
|
if (!(sh->type->flags & SFL_OPENSEA)) {
|
||||||
/* ship can only stay close to shore */
|
/* ship can only stay close to shore */
|
||||||
|
@ -1846,11 +1866,12 @@ sail(unit * u, order * ord, bool move_on_land, region_list ** routep)
|
||||||
}
|
}
|
||||||
|
|
||||||
reason = check_ship_allowed(sh, next_point);
|
reason = check_ship_allowed(sh, next_point);
|
||||||
if (reason<0) {
|
if (reason < 0) {
|
||||||
/* for some reason or another, we aren't allowed in there.. */
|
/* for some reason or another, we aren't allowed in there.. */
|
||||||
if (check_leuchtturm(current_point, NULL) || reason == SA_NO_INSECT) {
|
if (check_leuchtturm(current_point, NULL) || reason == SA_NO_INSECT) {
|
||||||
ADDMSG(&f->msgs, msg_message("sailnolandingstorm", "ship region", sh, next_point));
|
ADDMSG(&f->msgs, msg_message("sailnolandingstorm", "ship region", sh, next_point));
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
float dmg =
|
float dmg =
|
||||||
get_param_flt(global.parameters, "rules.ship.damage.nolanding",
|
get_param_flt(global.parameters, "rules.ship.damage.nolanding",
|
||||||
0.10F);
|
0.10F);
|
||||||
|
@ -1931,7 +1952,8 @@ sail(unit * u, order * ord, bool move_on_land, region_list ** routep)
|
||||||
if (is_cursed(sh->attribs, C_SHIP_FLYING, 0)) {
|
if (is_cursed(sh->attribs, C_SHIP_FLYING, 0)) {
|
||||||
ADDMSG(&f->msgs, msg_message("shipfly", "ship from to", sh,
|
ADDMSG(&f->msgs, msg_message("shipfly", "ship from to", sh,
|
||||||
starting_point, current_point));
|
starting_point, current_point));
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
ADDMSG(&f->msgs, msg_message("shipsail", "ship from to", sh,
|
ADDMSG(&f->msgs, msg_message("shipsail", "ship from to", sh,
|
||||||
starting_point, current_point));
|
starting_point, current_point));
|
||||||
}
|
}
|
||||||
|
@ -2061,9 +2083,11 @@ static const region_list *travel_i(unit * u, const region_list * route_begin,
|
||||||
if (ut->building && !can_leave(ut)) {
|
if (ut->building && !can_leave(ut)) {
|
||||||
cmistake(ut, ut->thisorder, 150, MSG_MOVE);
|
cmistake(ut, ut->thisorder, 150, MSG_MOVE);
|
||||||
cmistake(u, ord, 99, MSG_MOVE);
|
cmistake(u, ord, 99, MSG_MOVE);
|
||||||
} else if (!can_move(ut)) {
|
}
|
||||||
|
else if (!can_move(ut)) {
|
||||||
cmistake(u, ord, 99, MSG_MOVE);
|
cmistake(u, ord, 99, MSG_MOVE);
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
bool found = false;
|
bool found = false;
|
||||||
|
|
||||||
if (!fval(ut, UFL_NOTMOVING) && !LongHunger(ut)) {
|
if (!fval(ut, UFL_NOTMOVING) && !LongHunger(ut)) {
|
||||||
|
@ -2085,14 +2109,16 @@ static const region_list *travel_i(unit * u, const region_list * route_begin,
|
||||||
if (!found) {
|
if (!found) {
|
||||||
if (cansee(u->faction, u->region, ut, 0)) {
|
if (cansee(u->faction, u->region, ut, 0)) {
|
||||||
cmistake(u, ord, 90, MSG_MOVE);
|
cmistake(u, ord, 90, MSG_MOVE);
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
ADDMSG(&u->faction->msgs, msg_feedback(u, ord,
|
ADDMSG(&u->faction->msgs, msg_feedback(u, ord,
|
||||||
"feedback_unit_not_found", ""));
|
"feedback_unit_not_found", ""));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
ADDMSG(&u->faction->msgs, msg_feedback(u, ord, "feedback_unit_not_found",
|
ADDMSG(&u->faction->msgs, msg_feedback(u, ord, "feedback_unit_not_found",
|
||||||
""));
|
""));
|
||||||
}
|
}
|
||||||
|
@ -2139,7 +2165,8 @@ static void travel(unit * u, region_list ** routep)
|
||||||
cmistake(u, u->thisorder, 143, MSG_MOVE);
|
cmistake(u, u->thisorder, 143, MSG_MOVE);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
} else if (u->ship && fval(u->ship, SF_MOVED)) {
|
}
|
||||||
|
else if (u->ship && fval(u->ship, SF_MOVED)) {
|
||||||
/* die Einheit ist auf einem Schiff, das sich bereits bewegt hat */
|
/* die Einheit ist auf einem Schiff, das sich bereits bewegt hat */
|
||||||
cmistake(u, u->thisorder, 13, MSG_MOVE);
|
cmistake(u, u->thisorder, 13, MSG_MOVE);
|
||||||
return;
|
return;
|
||||||
|
@ -2184,9 +2211,10 @@ static void move(unit * u, 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, u->thisorder, move_on_land, &route);
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
travel(u, &route);
|
travel(u, &route);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2252,7 +2280,7 @@ static void piracy_cmd(unit * u, struct order *ord)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!u->ship || u!=ship_owner(u->ship)) {
|
if (!u->ship || u != ship_owner(u->ship)) {
|
||||||
cmistake(u, ord, 146, MSG_MOVE);
|
cmistake(u, ord, 146, MSG_MOVE);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -2373,7 +2401,7 @@ static direction_t hunted_dir(attrib * at, int id)
|
||||||
direction_t d = NODIRECTION;
|
direction_t d = NODIRECTION;
|
||||||
|
|
||||||
while (a != NULL && a->type == &at_shiptrail) {
|
while (a != NULL && a->type == &at_shiptrail) {
|
||||||
traveldir *t = (traveldir *) (a->data.v);
|
traveldir *t = (traveldir *)(a->data.v);
|
||||||
if (t->no == id) {
|
if (t->no == id) {
|
||||||
d = t->dir;
|
d = t->dir;
|
||||||
/* do not break, because we want the last one for this ship */
|
/* do not break, because we want the last one for this ship */
|
||||||
|
@ -2394,13 +2422,16 @@ static int hunt(unit * u, order * ord)
|
||||||
|
|
||||||
if (fval(u, UFL_NOTMOVING)) {
|
if (fval(u, UFL_NOTMOVING)) {
|
||||||
return 0;
|
return 0;
|
||||||
} else if (!u->ship) {
|
}
|
||||||
|
else if (!u->ship) {
|
||||||
cmistake(u, ord, 144, MSG_MOVE);
|
cmistake(u, ord, 144, MSG_MOVE);
|
||||||
return 0;
|
return 0;
|
||||||
} else if (u!=ship_owner(u->ship)) {
|
}
|
||||||
|
else if (u != ship_owner(u->ship)) {
|
||||||
cmistake(u, ord, 146, MSG_MOVE);
|
cmistake(u, ord, 146, MSG_MOVE);
|
||||||
return 0;
|
return 0;
|
||||||
} else if (!can_move(u)) {
|
}
|
||||||
|
else if (!can_move(u)) {
|
||||||
cmistake(u, ord, 55, MSG_MOVE);
|
cmistake(u, ord, 55, MSG_MOVE);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -2432,7 +2463,8 @@ static int hunt(unit * u, order * ord)
|
||||||
speed = getuint();
|
speed = getuint();
|
||||||
if (speed == 0) {
|
if (speed == 0) {
|
||||||
speed = shipspeed(u->ship, u);
|
speed = shipspeed(u->ship, u);
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
int maxspeed = shipspeed(u->ship, u);
|
int maxspeed = shipspeed(u->ship, u);
|
||||||
if (maxspeed < speed)
|
if (maxspeed < speed)
|
||||||
speed = maxspeed;
|
speed = maxspeed;
|
||||||
|
@ -2513,7 +2545,8 @@ static void move_hunters(void)
|
||||||
if (fval(u, UFL_NOTMOVING)) {
|
if (fval(u, UFL_NOTMOVING)) {
|
||||||
cmistake(u, ord, 52, MSG_MOVE);
|
cmistake(u, ord, 52, MSG_MOVE);
|
||||||
break;
|
break;
|
||||||
} else if (!can_move(u)) {
|
}
|
||||||
|
else if (!can_move(u)) {
|
||||||
cmistake(u, ord, 55, MSG_MOVE);
|
cmistake(u, ord, 55, MSG_MOVE);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -2552,7 +2585,8 @@ static void move_pirates(void)
|
||||||
if (*up == u) {
|
if (*up == u) {
|
||||||
/* not moved, use next unit */
|
/* not moved, use next unit */
|
||||||
up = &u->next;
|
up = &u->next;
|
||||||
} else if (*up && (*up)->region != r) {
|
}
|
||||||
|
else if (*up && (*up)->region != r) {
|
||||||
/* moved the previous unit along with u (units on same ship)
|
/* moved the previous unit along with u (units on same ship)
|
||||||
* must start from the beginning again */
|
* must start from the beginning again */
|
||||||
up = &r->units;
|
up = &r->units;
|
||||||
|
@ -2602,25 +2636,30 @@ void movement(void)
|
||||||
if (fval(u, UFL_LONGACTION)) {
|
if (fval(u, UFL_LONGACTION)) {
|
||||||
cmistake(u, u->thisorder, 52, MSG_MOVE);
|
cmistake(u, u->thisorder, 52, MSG_MOVE);
|
||||||
set_order(&u->thisorder, NULL);
|
set_order(&u->thisorder, NULL);
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
cmistake(u, u->thisorder, 319, MSG_MOVE);
|
cmistake(u, u->thisorder, 319, MSG_MOVE);
|
||||||
set_order(&u->thisorder, NULL);
|
set_order(&u->thisorder, NULL);
|
||||||
}
|
}
|
||||||
} else if (fval(u, UFL_MOVED)) {
|
}
|
||||||
|
else if (fval(u, UFL_MOVED)) {
|
||||||
cmistake(u, u->thisorder, 187, MSG_MOVE);
|
cmistake(u, u->thisorder, 187, MSG_MOVE);
|
||||||
set_order(&u->thisorder, NULL);
|
set_order(&u->thisorder, NULL);
|
||||||
} else if (!can_move(u)) {
|
}
|
||||||
|
else if (!can_move(u)) {
|
||||||
cmistake(u, u->thisorder, 55, MSG_MOVE);
|
cmistake(u, u->thisorder, 55, MSG_MOVE);
|
||||||
set_order(&u->thisorder, NULL);
|
set_order(&u->thisorder, NULL);
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
if (ships) {
|
if (ships) {
|
||||||
if (u->ship && ship_owner(u->ship)==u) {
|
if (u->ship && ship_owner(u->ship) == u) {
|
||||||
init_tokens(u->thisorder);
|
init_tokens(u->thisorder);
|
||||||
skip_token();
|
skip_token();
|
||||||
move(u, false);
|
move(u, false);
|
||||||
}
|
}
|
||||||
} else {
|
}
|
||||||
if (!u->ship || ship_owner(u->ship)!=u) {
|
else {
|
||||||
|
if (!u->ship || ship_owner(u->ship) != u) {
|
||||||
init_tokens(u->thisorder);
|
init_tokens(u->thisorder);
|
||||||
skip_token();
|
skip_token();
|
||||||
move(u, false);
|
move(u, false);
|
||||||
|
@ -2631,13 +2670,15 @@ void movement(void)
|
||||||
if (u->region == r) {
|
if (u->region == r) {
|
||||||
/* not moved, use next unit */
|
/* not moved, use next unit */
|
||||||
up = &u->next;
|
up = &u->next;
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
if (*up && (*up)->region != r) {
|
if (*up && (*up)->region != r) {
|
||||||
/* moved the upcoming unit along with u (units on ships or followers,
|
/* moved the upcoming unit along with u (units on ships or followers,
|
||||||
* for example). must start from the beginning again immediately */
|
* for example). must start from the beginning again immediately */
|
||||||
up = &r->units;
|
up = &r->units;
|
||||||
repeat = false;
|
repeat = false;
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
repeat = true;
|
repeat = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2690,10 +2731,12 @@ void follow_unit(unit * u)
|
||||||
unit *uf = findunit(id);
|
unit *uf = findunit(id);
|
||||||
if (!a) {
|
if (!a) {
|
||||||
a = a_add(&u->attribs, make_follow(uf));
|
a = a_add(&u->attribs, make_follow(uf));
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
a->data.v = uf;
|
a->data.v = uf;
|
||||||
}
|
}
|
||||||
} else if (a) {
|
}
|
||||||
|
else if (a) {
|
||||||
a_remove(&u->attribs, a);
|
a_remove(&u->attribs, a);
|
||||||
a = NULL;
|
a = NULL;
|
||||||
}
|
}
|
||||||
|
@ -2726,7 +2769,7 @@ void follow_unit(unit * u)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((a || followship )&& !fval(u, UFL_MOVED | UFL_NOTMOVING)) {
|
if ((a || followship) && !fval(u, UFL_MOVED | UFL_NOTMOVING)) {
|
||||||
if (!followship) {
|
if (!followship) {
|
||||||
u2 = a->data.v;
|
u2 = a->data.v;
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
|
|
||||||
This program may not be used, modified or distributed
|
This program may not be used, modified or distributed
|
||||||
without prior permission by the authors of Eressea.
|
without prior permission by the authors of Eressea.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <platform.h>
|
#include <platform.h>
|
||||||
#include <kernel/config.h>
|
#include <kernel/config.h>
|
||||||
|
@ -103,7 +103,8 @@ static char* get_command(const order *ord, char *sbuffer, size_t size) {
|
||||||
if (size > 0) {
|
if (size > 0) {
|
||||||
*bufp++ = '@';
|
*bufp++ = '@';
|
||||||
--size;
|
--size;
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
WARN_STATIC_BUFFER();
|
WARN_STATIC_BUFFER();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -116,7 +117,8 @@ static char* get_command(const order *ord, char *sbuffer, size_t size) {
|
||||||
bytes = (int)strlcpy(bufp, str, size);
|
bytes = (int)strlcpy(bufp, str, size);
|
||||||
if (wrptr(&bufp, &size, bytes) != 0) WARN_STATIC_BUFFER();
|
if (wrptr(&bufp, &size, bytes) != 0) WARN_STATIC_BUFFER();
|
||||||
if (text) *bufp++ = ' ';
|
if (text) *bufp++ = ' ';
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
WARN_STATIC_BUFFER();
|
WARN_STATIC_BUFFER();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -158,7 +160,7 @@ void free_order(order * ord)
|
||||||
order *copy_order(const order * src)
|
order *copy_order(const order * src)
|
||||||
{
|
{
|
||||||
if (src != NULL) {
|
if (src != NULL) {
|
||||||
order *ord = (order *) malloc(sizeof(order));
|
order *ord = (order *)malloc(sizeof(order));
|
||||||
ord->next = NULL;
|
ord->next = NULL;
|
||||||
ord->_persistent = src->_persistent;
|
ord->_persistent = src->_persistent;
|
||||||
ord->data = src->data;
|
ord->data = src->data;
|
||||||
|
@ -208,11 +210,11 @@ static order_data *create_data(keyword_t kwd, const char *sptr, int lindex)
|
||||||
data = locale_array[lindex]->study_orders[sk];
|
data = locale_array[lindex]->study_orders[sk];
|
||||||
if (data == NULL) {
|
if (data == NULL) {
|
||||||
const char *skname = skillname(sk, lang);
|
const char *skname = skillname(sk, lang);
|
||||||
data = (order_data *) malloc(sizeof(order_data));
|
data = (order_data *)malloc(sizeof(order_data));
|
||||||
locale_array[lindex]->study_orders[sk] = data;
|
locale_array[lindex]->study_orders[sk] = data;
|
||||||
data->_keyword = kwd;
|
data->_keyword = kwd;
|
||||||
data->_lindex = lindex;
|
data->_lindex = lindex;
|
||||||
assert(data->_lindex>=0);
|
assert(data->_lindex >= 0);
|
||||||
if (strchr(skname, ' ') != NULL) {
|
if (strchr(skname, ' ') != NULL) {
|
||||||
size_t len = strlen(skname);
|
size_t len = strlen(skname);
|
||||||
data->_str = malloc(len + 3);
|
data->_str = malloc(len + 3);
|
||||||
|
@ -220,7 +222,8 @@ static order_data *create_data(keyword_t kwd, const char *sptr, int lindex)
|
||||||
memcpy(data->_str + 1, skname, len);
|
memcpy(data->_str + 1, skname, len);
|
||||||
data->_str[len + 1] = '\"';
|
data->_str[len + 1] = '\"';
|
||||||
data->_str[len + 2] = '\0';
|
data->_str[len + 2] = '\0';
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
data->_str = _strdup(skname);
|
data->_str = _strdup(skname);
|
||||||
}
|
}
|
||||||
data->_refcount = 1;
|
data->_refcount = 1;
|
||||||
|
@ -234,21 +237,21 @@ static order_data *create_data(keyword_t kwd, const char *sptr, int lindex)
|
||||||
else if (kwd != NOKEYWORD && *sptr == 0) {
|
else if (kwd != NOKEYWORD && *sptr == 0) {
|
||||||
data = locale_array[lindex]->short_orders[kwd];
|
data = locale_array[lindex]->short_orders[kwd];
|
||||||
if (data == NULL) {
|
if (data == NULL) {
|
||||||
data = (order_data *) malloc(sizeof(order_data));
|
data = (order_data *)malloc(sizeof(order_data));
|
||||||
locale_array[lindex]->short_orders[kwd] = data;
|
locale_array[lindex]->short_orders[kwd] = data;
|
||||||
data->_keyword = kwd;
|
data->_keyword = kwd;
|
||||||
data->_lindex = lindex;
|
data->_lindex = lindex;
|
||||||
assert(data->_lindex>=0);
|
assert(data->_lindex >= 0);
|
||||||
data->_str = NULL;
|
data->_str = NULL;
|
||||||
data->_refcount = 1;
|
data->_refcount = 1;
|
||||||
}
|
}
|
||||||
++data->_refcount;
|
++data->_refcount;
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
data = (order_data *) malloc(sizeof(order_data));
|
data = (order_data *)malloc(sizeof(order_data));
|
||||||
data->_keyword = kwd;
|
data->_keyword = kwd;
|
||||||
data->_lindex = lindex;
|
data->_lindex = lindex;
|
||||||
assert(data->_lindex>=0);
|
assert(data->_lindex >= 0);
|
||||||
data->_str = s ? _strdup(s) : NULL;
|
data->_str = s ? _strdup(s) : NULL;
|
||||||
data->_refcount = 1;
|
data->_refcount = 1;
|
||||||
return data;
|
return data;
|
||||||
|
@ -276,12 +279,12 @@ static order *create_order_i(keyword_t kwd, const char *sptr, int persistent,
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (lindex == nlocales) {
|
if (lindex == nlocales) {
|
||||||
locale_array[nlocales] = (locale_data *) calloc(1, sizeof(locale_data));
|
locale_array[nlocales] = (locale_data *)calloc(1, sizeof(locale_data));
|
||||||
locale_array[nlocales]->lang = lang;
|
locale_array[nlocales]->lang = lang;
|
||||||
++nlocales;
|
++nlocales;
|
||||||
}
|
}
|
||||||
|
|
||||||
ord = (order *) malloc(sizeof(order));
|
ord = (order *)malloc(sizeof(order));
|
||||||
ord->_persistent = persistent;
|
ord->_persistent = persistent;
|
||||||
ord->next = NULL;
|
ord->next = NULL;
|
||||||
|
|
||||||
|
@ -328,7 +331,8 @@ order *create_order(keyword_t kwd, const struct locale * lang,
|
||||||
default:
|
default:
|
||||||
assert(!"unknown format-character in create_order");
|
assert(!"unknown format-character in create_order");
|
||||||
}
|
}
|
||||||
} else if (size > 0) {
|
}
|
||||||
|
else if (size > 0) {
|
||||||
*bufp++ = *params;
|
*bufp++ = *params;
|
||||||
--size;
|
--size;
|
||||||
}
|
}
|
||||||
|
@ -336,7 +340,8 @@ order *create_order(keyword_t kwd, const struct locale * lang,
|
||||||
}
|
}
|
||||||
va_end(marker);
|
va_end(marker);
|
||||||
*bufp = 0;
|
*bufp = 0;
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
zBuffer[0] = 0;
|
zBuffer[0] = 0;
|
||||||
}
|
}
|
||||||
return create_order_i(kwd, zBuffer, 0, lang);
|
return create_order_i(kwd, zBuffer, 0, lang);
|
||||||
|
@ -563,12 +568,14 @@ char *write_order(const order * ord, char *buffer, size_t size)
|
||||||
{
|
{
|
||||||
if (ord == 0) {
|
if (ord == 0) {
|
||||||
buffer[0] = 0;
|
buffer[0] = 0;
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
keyword_t kwd = ORD_KEYWORD(ord);
|
keyword_t kwd = ORD_KEYWORD(ord);
|
||||||
if (kwd == NOKEYWORD) {
|
if (kwd == NOKEYWORD) {
|
||||||
const char *text = ORD_STRING(ord);
|
const char *text = ORD_STRING(ord);
|
||||||
strlcpy(buffer, (const char *)text, size);
|
strlcpy(buffer, (const char *)text, size);
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
get_command(ord, buffer, size);
|
get_command(ord, buffer, size);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
/*
|
/*
|
||||||
Copyright (c) 1998-2010, Enno Rehling <enno@eressea.de>
|
Copyright (c) 1998-2014,
|
||||||
|
Enno Rehling <enno@eressea.de>
|
||||||
Katja Zedel <katze@felidae.kn-bremen.de
|
Katja Zedel <katze@felidae.kn-bremen.de
|
||||||
Christian Schlittchen <corwin@amber.kn-bremen.de>
|
Christian Schlittchen <corwin@amber.kn-bremen.de>
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue