diff --git a/src/common/items/items.c b/src/common/items/items.c index 76e608913..bdf51c014 100644 --- a/src/common/items/items.c +++ b/src/common/items/items.c @@ -23,6 +23,7 @@ # include "seed.h" #endif #include "birthday_firework.h" +#include "questkeys.h" void register_items(void) @@ -38,6 +39,7 @@ register_items(void) register_birthday_firework(); register_lebkuchenherz(); register_catapultammo(); + register_questkeys(); } void diff --git a/src/common/items/questkeys.c b/src/common/items/questkeys.c new file mode 100644 index 000000000..8910150f2 --- /dev/null +++ b/src/common/items/questkeys.c @@ -0,0 +1,136 @@ +/* vi: set ts=2: + * + * + * Eressea PB(E)M host Copyright (C) 1998-2000 + * 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 "questkeys.h" + +/* kernel includes */ +#include +#include +#include +#include +#include +#include +#include + +/* util includes */ +#include + +/* libc includes */ +#include +#include + +extern border *borders[]; + +static int +use_questkey(struct unit * u, const struct item_type * itype, int amount, const char * cmd) +{ + border *bo; + int key, key1, key2; + region *r1, *r2; + int lock, k; + message *m; + unit *u2; + + if(u->region->x != 43 || u->region->y != -39) { + ADDMSG(&u->faction->msgs, msg_error(u, cmd, "use_questkey_wrongregion", "")); + return EUNUSABLE; + } + + r1 = findregion(43,-39); + r2 = findregion(44,-39); + key1 = region_hashkey(r1); + key2 = region_hashkey(r2); + + key = min(key2, key) % BMAXHASH; + + bo = borders[key]; + + while (bo && !((bo->from==r1 && bo->to==r2) || (bo->from==r2 && bo->to==r1))) { + if(bo->type == &bt_questportal) { + break; + } + bo = bo->nexthash; + } + + assert(bo != NULL); + + lock = (int)bo->data; + if(itype == &it_questkey1) k = 1; + if(itype == &it_questkey2) k = 2; + + if(lock & k) { + m = msg_message("questportal_unlock","region unit key", u->region, u, k); + lock = lock & ~k; + } else { + m = msg_message("questportal_lock","region unit key", u->region, u, k); + lock = lock | k; + } + + bo->data = (void *)lock; + + for(u2 = u->region->units; u2; u2=u2->next) { + freset(u2->faction, FL_DH); + } + for(u2 = u->region->units; u2; u2=u2->next) { + if(!fval(u2->faction, FL_DH)) { + add_message(&u2->faction->msgs, m); + fset(u2->faction, FL_DH); + } + } + + return 0; +} + +static resource_type rt_questkey1 = { + { "questkey1", "questkey1_p" }, + { "questkey1", "questkey1_p" }, + RTF_ITEM, + &res_changeitem +}; + +static resource_type rt_questkey2 = { + { "questkey2", "questkey2_p" }, + { "questkey2", "questkey2_p" }, + RTF_ITEM, + &res_changeitem +}; + +item_type it_questkey1 = { + &rt_questkey1, /* resourcetype */ + ITF_NOTLOST, 1, 0, /* flags, weight, capacity */ + NULL, /* construction */ + &use_questkey, + NULL, + NULL +}; + +item_type it_questkey2 = { + &rt_questkey2, /* resourcetype */ + ITF_NOTLOST, 1, 0, /* flags, weight, capacity */ + NULL, /* construction */ + &use_questkey, + NULL, + NULL +}; + +void +register_questkeys(void) +{ + it_register(&it_questkey1); + it_register(&it_questkey2); + register_function((pf_generic)use_questkey, "usequestkey"); +} + diff --git a/src/common/items/questkeys.h b/src/common/items/questkeys.h new file mode 100644 index 000000000..d76848f9e --- /dev/null +++ b/src/common/items/questkeys.h @@ -0,0 +1,18 @@ +/* vi: set ts=2: + * + * + * Eressea PB(E)M host Copyright (C) 1998-2000 + * 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. + */ + +extern struct item_type it_questkey1; +extern struct item_type it_questkey2; +extern void register_questkeys(void); + diff --git a/src/common/kernel/border.c b/src/common/kernel/border.c index d6c6ae786..306a8fc29 100644 --- a/src/common/kernel/border.c +++ b/src/common/kernel/border.c @@ -24,8 +24,6 @@ #include #include -#define BMAXHASH 8191 - unsigned int nextborder = 0; border * borders[BMAXHASH]; @@ -383,6 +381,54 @@ border_type bt_illusionwall = { b_uvisible, /* uvisible */ }; +/*** + * special quest door + ***/ + +boolean b_blockquestportal(const border * b, const unit * u, const region * r) { + if((int)b->data > 0) return true; + return false; +} + +static const char * +b_namequestportal(const border * b, const region * r, const struct faction * f, int gflags) +{ + /* TODO: f->locale bestimmt die Sprache */ + int lock = (int)b->data; + unused(b); + unused(r); + + if (gflags & GF_ARTICLE) { + if(lock > 0) { + return "ein gewaltiges verschlossenes Tor"; + } else { + return "ein gewaltiges offenes Tor"; + } + } else { + if(lock > 0) { + return "gewaltiges verschlossenes Tor"; + } else { + return "gewaltiges offenes Tor"; + } + } + + return ""; +} + +border_type bt_questportal = { + "questportal", + b_opaque, + NULL, /* init */ + NULL, /* destroy */ + b_read, /* read */ + b_write, /* write */ + b_blockquestportal, /* block */ + b_namequestportal, /* name */ + b_rvisible, /* rvisible */ + b_fvisible, /* fvisible */ + b_uvisible, /* uvisible */ +}; + /*** * roads. meant to replace the old at_road or r->road attribute ***/ diff --git a/src/common/kernel/border.h b/src/common/kernel/border.h index b46ba4830..4c296709f 100644 --- a/src/common/kernel/border.h +++ b/src/common/kernel/border.h @@ -15,6 +15,8 @@ #ifndef BORDER_H #define BORDER_H +#define BMAXHASH 8191 + extern unsigned int nextborder; typedef struct border { @@ -110,6 +112,7 @@ extern border_type bt_noway; extern border_type bt_wall; extern border_type bt_illusionwall; extern border_type bt_road; +extern border_type bt_questportal; extern attrib_type at_countdown; diff --git a/src/common/kernel/eressea.c b/src/common/kernel/eressea.c index c86de647c..f04b6359b 100644 --- a/src/common/kernel/eressea.c +++ b/src/common/kernel/eressea.c @@ -2258,6 +2258,7 @@ attrib_init(void) register_bordertype(&bt_firewall); register_bordertype(&bt_wisps); register_bordertype(&bt_road); + register_bordertype(&bt_questportal); at_register(&at_jihad); at_register(&at_skillmod); diff --git a/src/common/kernel/eressea.h b/src/common/kernel/eressea.h index 2205a4973..457605774 100644 --- a/src/common/kernel/eressea.h +++ b/src/common/kernel/eressea.h @@ -673,12 +673,12 @@ enum { RC_GHOUL, RC_GHOUL_LORD, - RC_MUS_SPIRIT, /* 59 */ - RC_GNOME, /* 60 */ - RC_TEMPLATE, /* 61 */ - RC_CLONE, /* 62 */ + RC_MUS_SPIRIT, /* 60 */ + RC_GNOME, /* 61 */ + RC_TEMPLATE, /* 62 */ + RC_CLONE, /* 63 */ - RC_SHADOWDRAGON, + RC_SHADOWDRAGON, /* 64 */ RC_SHADOWBAT, RC_NIGHTMARE, RC_VAMPUNICORN, diff --git a/src/common/kernel/terrain.c b/src/common/kernel/terrain.c index 239083458..504fa7390 100644 --- a/src/common/kernel/terrain.c +++ b/src/common/kernel/terrain.c @@ -277,7 +277,7 @@ const terraindata_t terrain[] = { { "hall1", '%', NULL, - "in eine Halle", + NULL, 0, /* Steine pro Runde */ 0, /* Steine fuer Strasse */ 0, /* bewirtschaftbare Parzellen */ @@ -288,7 +288,7 @@ const terraindata_t terrain[] = { { "corridor1", '%', NULL, - "in einen Gang", + NULL, 0, /* Steine pro Runde */ 0, /* Steine fuer Strasse */ 0, /* bewirtschaftbare Parzellen */ @@ -306,6 +306,17 @@ const terraindata_t terrain[] = { FORBIDDEN_LAND, /* Flags */ NULL }, + /* T_WALL1 */ + { + "wall1", '#', + NULL, + NULL, + 0, /* Steine pro Runde */ + 0, /* Steine fuer Strasse */ + 0, /* bewirtschaftbare Parzellen */ + FORBIDDEN_LAND, /* Flags */ + NULL + }, /*** sentinel - must be last ***/ { NULL, 'X', diff --git a/src/common/kernel/terrain.h b/src/common/kernel/terrain.h index d4f35610c..26347d6b0 100644 --- a/src/common/kernel/terrain.h +++ b/src/common/kernel/terrain.h @@ -43,6 +43,7 @@ enum { T_HALL1, T_CORRIDOR1, T_MAGICSTORM, + T_WALL1, MAXTERRAINS, NOTERRAIN = (terrain_t) - 1 }; diff --git a/src/eressea/korrektur.c b/src/eressea/korrektur.c index 16d3f3eb4..4b9d2165b 100644 --- a/src/eressea/korrektur.c +++ b/src/eressea/korrektur.c @@ -26,6 +26,7 @@ #include #include #include +#include /* gamecode includes */ #include @@ -2725,6 +2726,26 @@ guard_conversion(void) return 0; } +static int +questportal_init(void) +{ + region *r1 = findregion(43,-39); + region *r2 = findregion(44,-39); + border *bo; + unit *u; + + if(r1 == NULL || r2 == NULL) return 0; + bo = new_border(&bt_questportal, r1, r2); + bo->data = (void *)3; + + u = findunit(atoi36("L0sc")); + if(u) i_change(&u->items, &it_questkey1, 1); + + u = findunit(atoi36("xi7m")); + if(u) i_change(&u->items, &it_questkey2, 1); + return 0; +} + void korrektur(void) { @@ -2775,6 +2796,7 @@ korrektur(void) do_once("orc2", orc_conversion2()); do_once("witm", warn_items()); do_once("guac", guard_conversion()); + do_once("qpoi", questportal_init()); warn_password(); /* seems something fishy is going on, do this just diff --git a/src/res/de/messages.xml b/src/res/de/messages.xml index 3f9621f95..fd7b18d90 100644 --- a/src/res/de/messages.xml +++ b/src/res/de/messages.xml @@ -7466,5 +7466,34 @@ "$unit($unit) in $region($region) becomes a lycantrope." + + + + + + + "$unit($unit) verschließt eines der Schlösser in $region($region) mit $if($eq($key,1),"dem Achatenen Schlüssel","dem Saphirnen Schlüssel")." + "$unit($unit) locks one of the locks in $region($region) with $if($eq($key,1),"the Agate Key","the Sapphire Key")." + + + + + + + + + "$unit($unit) öffnet eines der Schlösser in $region($region) mit $if($eq($key,1),"dem Achatenen Schlüssel","dem Saphirnen Schlüssel")." + "$unit($unit) unlocks one of the locks in $region($region) with $if($eq($key,1),"the Agate Key","the Sapphire Key")." + + + + + + + + + "$unit($unit) in $region($region): '$command' - Hier ist kein passendes Schloss." + "$unit($unit) in $region($region): '$command' - No fitting lock can be found here." + diff --git a/src/res/de/strings.xml b/src/res/de/strings.xml index 5f1bf200e..744c45772 100644 --- a/src/res/de/strings.xml +++ b/src/res/de/strings.xml @@ -344,6 +344,9 @@ Gang + + Wand + Magischer Sturm @@ -405,6 +408,9 @@ die %s + + eine mächtige Mauer + ein %s @@ -1171,6 +1177,22 @@ Lebkuchenherzen mit der Aufschrift 'Erz und Stein, das ist fein' + + Achatener Schlüssel + agate key + + + Achatene Schlüssel + agate keys + + + Saphirner Schlüssel + sapphire key + + + Saphirne Schlüssel + sapphire keys + herb singular