diff --git a/src/common/gamecode/laws.c b/src/common/gamecode/laws.c index 9a6ce501b..5cf85bd76 100644 --- a/src/common/gamecode/laws.c +++ b/src/common/gamecode/laws.c @@ -120,6 +120,7 @@ restart_race(unit *u, const race * rc) unit * nu = addplayer(u->region, f); order ** ordp = &u->orders; f->subscription = u->faction->subscription; + f->age = u->faction->age; fset(f, FFL_RESTART); if (f->subscription) { sql_print(("UPDATE subscriptions set faction='%s', race='%s' where id=%u;\n", @@ -975,7 +976,7 @@ transfer_faction(faction *f, faction *f2) } static int -restart(unit * u, struct order * ord) +restart_cmd(unit * u, struct order * ord) { init_tokens(ord); skip_token(); /* skip keyword */ @@ -1091,7 +1092,7 @@ parse_quit(void) break; case K_RESTART: if (u->number > 0) { - if (restart(u, ord)!=0) ord = NULL; + if (restart_cmd(u, ord)!=0) ord = NULL; } break; } @@ -2211,35 +2212,42 @@ display_item(faction *f, unit *u, const item_type * itype) char t[NAMESIZE + 1]; char filename[MAX_PATH]; const char *name; + const char *info; + const char *key; if (u && *i_find(&u->items, itype) == NULL) return false; name = resourcename(itype->rtype, 0); - sprintf(filename, "%s/%s/items/%s", resourcepath(), locale_name(f->locale), name); - fp = fopen(filename, "r"); - if (!fp) { - name = locale_string(f->locale, resourcename(itype->rtype, 0)); + key = mkname("iteminfo", name); + info = locale_string(f->locale, key); + + if (info==key) { sprintf(filename, "%s/%s/items/%s", resourcepath(), locale_name(f->locale), name); fp = fopen(filename, "r"); - } - if (!fp) { - name = resourcename(itype->rtype, 0); - sprintf(filename, "%s/%s/items/%s", resourcepath(), locale_name(default_locale), name); - fp = fopen(filename, "r"); - } - if (!fp) return false; - - buf[0]='\0'; - while (fgets(t, NAMESIZE, fp) != NULL) { - if (t[strlen(t) - 1] == '\n') { - t[strlen(t) - 1] = 0; + if (!fp) { + name = locale_string(f->locale, resourcename(itype->rtype, 0)); + sprintf(filename, "%s/%s/items/%s", resourcepath(), locale_name(f->locale), name); + fp = fopen(filename, "r"); } - strcat(buf, t); + if (!fp) { + name = resourcename(itype->rtype, 0); + sprintf(filename, "%s/%s/items/%s", resourcepath(), locale_name(default_locale), name); + fp = fopen(filename, "r"); + } + if (!fp) return false; + + buf[0]='\0'; + while (fgets(t, NAMESIZE, fp) != NULL) { + if (t[strlen(t) - 1] == '\n') { + t[strlen(t) - 1] = 0; + } + strcat(buf, t); + } + fclose(fp); + info = buf; } - fclose(fp); - name = buf; ADDMSG(&f->msgs, msg_message("displayitem", "weight item description", - itype->weight/1000, itype->rtype, strdup(name))); + itype->weight/1000, itype->rtype, strdup(info))); return true; } diff --git a/src/common/items/items.c b/src/common/items/items.c index 740125e05..e1c90bc94 100644 --- a/src/common/items/items.c +++ b/src/common/items/items.c @@ -19,6 +19,7 @@ #include "xerewards.h" #include "artrewards.h" #include "weapons.h" +#include "speedsail.h" #include "racespoils.h" #if GROWING_TREES # include "seed.h" @@ -42,6 +43,7 @@ register_items(void) register_catapultammo(); register_racespoils(); register_artrewards(); + register_speedsail(); } void diff --git a/src/common/items/items.vcproj b/src/common/items/items.vcproj index 51d357868..093c178dc 100644 --- a/src/common/items/items.vcproj +++ b/src/common/items/items.vcproj @@ -175,6 +175,12 @@ + + + + diff --git a/src/common/items/speedsail.c b/src/common/items/speedsail.c new file mode 100644 index 000000000..08afc0fc0 --- /dev/null +++ b/src/common/items/speedsail.c @@ -0,0 +1,84 @@ +/* vi: set ts=2: + * + * + * Eressea PB(E)M host Copyright (C) 1998-2003 + * Christian Schlittchen (corwin@amber.kn-bremen.de) + * Katja Zedel (katze@felidae.kn-bremen.de) + * Henning Peters (faroul@beyond.kn-bremen.de) + * Enno Rehling (enno@eressea-pbem.de) + * Ingo Wilken (Ingo.Wilken@informatik.uni-oldenburg.de) + * + * This program may not be used, modified or distributed without + * prior permission by the authors of Eressea. + */ + +#include +#include +#include "speedsail.h" + +/* kernel includes */ +#include +#include +#include +#include +#include +#include +#include +#include + +/* util includes */ +#include + +/* libc includes */ +#include + +static int +use_speedsail(struct unit * u, const struct item_type * itype, int amount, struct order * ord) +{ + struct plane * p = rplane(u->region); + unused(amount); + unused(itype); + if (p!=NULL) { + ADDMSG(&u->faction->msgs, msg_feedback(u, ord, "use_realworld_only", "")); + return EUNUSABLE; + } else { + if (u->ship) { + attrib * a = a_find(u->ship->attribs, &at_speedup); + if (a!=NULL) { + a = a_add(&u->ship->attribs, a_new(&at_speedup)); + a->data.sa[0] = 50; /* speed */ + a->data.sa[1] = 50; /* decay */ + ADDMSG(&u->faction->msgs, msg_message("use_speedsail", "unit", u)); + return 0; + } else { + cmistake(u, ord, 211, MSG_EVENT); + } + } else { + cmistake(u, ord, 144, MSG_EVENT); + } + return EUNUSABLE; + } +} + +static resource_type rt_speedsail = { + { "speedsail", "speedsail_p" }, + { "speedsail", "speedsail_p" }, + RTF_ITEM, + &res_changeitem +}; + + +item_type it_speedsail = { + &rt_speedsail, /* resourcetype */ + 0, 0, 0, /* flags, weight, capacity */ + NULL, /* construction */ + &use_speedsail, + NULL, + NULL +}; + +void +register_speedsail(void) +{ + it_register(&it_speedsail); +} diff --git a/src/common/items/speedsail.h b/src/common/items/speedsail.h new file mode 100644 index 000000000..0c9da1758 --- /dev/null +++ b/src/common/items/speedsail.h @@ -0,0 +1,26 @@ +/* vi: set ts=2: + * + * + * Eressea PB(E)M host Copyright (C) 1998-2003 + * Christian Schlittchen (corwin@amber.kn-bremen.de) + * Katja Zedel (katze@felidae.kn-bremen.de) + * Henning Peters (faroul@beyond.kn-bremen.de) + * Enno Rehling (enno@eressea-pbem.de) + * Ingo Wilken (Ingo.Wilken@informatik.uni-oldenburg.de) + * + * This program may not be used, modified or distributed without + * prior permission by the authors of Eressea. + */ + +#ifndef H_ITM_SPEEDVIAL +#define H_ITM_SPEEDVIAL +#ifdef __cplusplus +extern "C" { +#endif + +extern void register_speedsail(void); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/src/common/kernel/eressea.c b/src/common/kernel/eressea.c index 694ad372e..312914649 100644 --- a/src/common/kernel/eressea.c +++ b/src/common/kernel/eressea.c @@ -587,7 +587,7 @@ shipspeed (const ship * sh, const unit * u) a = a_find(sh->attribs, &at_speedup); while (a != NULL) { - k += a->data.i; + k += a->data.sa[0]; a = a->nexttype; } diff --git a/src/common/kernel/movement.c b/src/common/kernel/movement.c index 2a3c520c5..776eae61e 100644 --- a/src/common/kernel/movement.c +++ b/src/common/kernel/movement.c @@ -159,10 +159,10 @@ attrib_type at_shiptrail = { static int age_speedup(attrib *a) { - if(a->data.i > 0) { - --a->data.i; + if (a->data.sa[0] > 0) { + a->data.sa[0] = a->data.sa[0] - a->data.sa[1]; } - return a->data.i; + return a->data.sa[0]>0; } attrib_type at_speedup = { diff --git a/src/res/de/strings.xml b/src/res/de/strings.xml index 6ac40b431..146a16243 100644 --- a/src/res/de/strings.xml +++ b/src/res/de/strings.xml @@ -7,6 +7,19 @@ _a: including article (ein Troll, a troll) --> + + + + Setzt eine Einheit dieses Segel auf einem Schiff, so erhöht + sich dessen Reichweite kurzfristig um 50 Regionen. + + + A unit setting this sail on a ship temporarily increases the + ship's range by 50 regions. + + + + Kein Magiegebiet @@ -575,6 +588,14 @@ Katapultmunition ammunition + + Sonnensegel + solar sail + + + Sonnensegel + solar sails + Elfenohr @@ -3947,33 +3968,23 @@ - Wenn einem der Alchemist nicht weiterhelfen kann, geht - man zu dem - gelehrten Tybiedmagier. Seine Tränke und Tinkturen - helfen gegen alles, - was man sonst nicht bekommen kann. Ob nun die kryptische - Formel unter dem - Holzschuh des untreuen Ehemannes wirklich geholfen hat - - nun, der des - Lesens nicht mächtige Bauer wird es nie wissen. Dem - Magier hilft es - auf jeden Fall... beim Füllen seines Geldbeutels. 50 - Silber pro Stufe - lassen sich so in einer Woche verdienen. + Wenn einem der Alchemist nicht weiterhelfen kann, geht man zu dem + gelehrten Tybiedmagier. Seine Tränke und Tinkturen helfen gegen + alles, was man sonst nicht bekommen kann. Ob nun die kryptische + Formel unter dem Holzschuh des untreuen Ehemannes wirklich geholfen + hat - nun, der des Lesens nicht mächtige Bauer wird es nie wissen. + Dem Magier hilft es auf jeden Fall... beim Füllen seines + Geldbeutels. 50 Silber pro Stufe lassen sich so in einer Woche + verdienen. - If the local alchemist could not help you, you should - visit a - scholar of Tybied. His potions and tinctures may help - when nothing - else does. If the cryptic formula under the wooden shoes - of the - unfaithful husband really helped? - well, the peasant, - who isn't - capable of reading, will never know. At least it helped - the mage... - to fill his purse. In one week he can earn 50 silver per - level that way. + If the local alchemist could not help you, you should visit a + scholar of Tybied. His potions and tinctures may help when nothing + else does. If the cryptic formula under the wooden shoes of the + unfaithful husband really helped? - well, the peasant, who isn't + capable of reading, will never know. At least it helped the mage... + to fill his purse. In one week he can earn 50 silver per level that + way. @@ -5783,63 +5794,63 @@ Unbekannte Partei unknown faction - + Das Schiff des Elfen hat ein rotes Segel - + Der Zwerg hat eine Nuss dabei - + Die Katze führt eine Hellebarde - + Das Schiff mit dem grünen Segel liegt links neben dem mit einem weissen Segel - + Auf dem Schiff mit grünen Segeln kam der Speerkämpfer - + Der Krieger mit dem Kreis im Wappen hat einen Keks - + Der Krieger des mittleren Schiffs hat ein Schwert - + Auf dem gelben Segel prankt ein Kreuz als Wappen - + Der Mensch kam mit dem ersten Schiff - + Das Schiff mit dem Stern im Wappen liegt neben dem der einen Mandelkern hat - + Das Schiff des Kriegers, der ein Apfel hat, liegt neben dem, der ein Kreuz als Wappen hat - + Der Krieger mit dem Turm im Wappen trägt eine Axt - + Das Schiff des Menschen liegt neben dem blauen Schiff - + Das Insekt trägt einen Baum als Wappen - + Das Schiff mit dem Stern im Wappen liegt neben dem des Kriegers, der einen Zweihänder führt diff --git a/src/res/messages.xml b/src/res/messages.xml index 25d81f1b6..c00b0d662 100644 --- a/src/res/messages.xml +++ b/src/res/messages.xml @@ -202,6 +202,14 @@ "heavy fog makes it impossible to leave the region. ($int36($id))" "heavy fog makes it impossible to leave the region. ($int36($id))" + + + + + "$unit($unit) setzt ein Sonnensegel. Die Geschwindigkeit des Schiffes erhöht sich dramatisch." + "$unit($unit) sets a solar sail. The ship's speed is greatly increased." + "$unit($unit) sets a solar sail. The ship's speed is greatly increased." + diff --git a/src/scripts/samples.lua b/src/scripts/samples.lua index df539be66..d1e463c43 100644 --- a/src/scripts/samples.lua +++ b/src/scripts/samples.lua @@ -1,3 +1,23 @@ +function test_sail() + r0 = terraform(0, 0, "plain") + + orcs = add_faction("enno@eressea.de", "orc", "de") + orcs.age = 20 + + orc = add_unit(orcs, r0) + orc.number = 1 + orc:add_item("speedsail", orc.number) + + orc:clear_orders() + orc:add_order("NUMMER PARTEI orcs") + orc:add_order("NUMMER EINHEIT orc") + orc:add_order("BENENNE EINHEIT Orks") + orc:add_order("ZEIGEN \"Sonnensegel\"") + + process_orders() + write_reports() +end + function test_movement() west = direction("west") east = direction("east") @@ -302,7 +322,8 @@ function test_fail() print(f) end -test_movement() +test_sail() +-- test_movement() -- test_fail() -- test_handler() -- test_parser()