Move quest objects to the module that uses them (museum portals).

This commit is contained in:
Enno Rehling 2014-07-21 11:34:57 +02:00
parent d7803eb318
commit 13165f2354
3 changed files with 330 additions and 323 deletions

View File

@ -2769,7 +2769,6 @@ void attrib_init(void)
register_bordertype(&bt_wall);
register_bordertype(&bt_illusionwall);
register_bordertype(&bt_road);
register_bordertype(&bt_questportal);
register_function((pf_generic) & minimum_wage, "minimum_wage");

View File

@ -458,58 +458,6 @@ border_type bt_illusionwall = {
b_uvisible, /* uvisible */
};
/***
* special quest door
***/
bool b_blockquestportal(const connection * b, const unit * u,
const region * r)
{
if (b->data.i > 0)
return true;
return false;
}
static const char *b_namequestportal(const connection * b, const region * r,
const struct faction *f, int gflags)
{
const char *bname;
int lock = b->data.i;
unused_arg(b);
unused_arg(r);
if (gflags & GF_ARTICLE) {
if (lock > 0) {
bname = "a_gate_locked";
} else {
bname = "a_gate_open";
}
} else {
if (lock > 0) {
bname = "gate_locked";
} else {
bname = "gate_open";
}
}
if (gflags & GF_PURE)
return bname;
return LOC(f->locale, mkname("border", bname));
}
border_type bt_questportal = {
"questportal", VAR_INT,
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
***/

View File

@ -1,7 +1,7 @@
/*
Copyright (c) 1998-2010, Enno Rehling <enno@eressea.de>
Katja Zedel <katze@felidae.kn-bremen.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
purpose with or without fee is hereby granted, provided that the above
@ -25,6 +25,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
/* kernel includes */
#include <kernel/building.h>
#include <kernel/connection.h>
#include <kernel/faction.h>
#include <kernel/item.h>
#include <kernel/move.h>
@ -42,6 +43,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
#include <util/base36.h>
#include <util/functions.h>
#include <util/goodies.h>
#include <util/language.h>
#include <storage.h>
@ -53,359 +55,417 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
#define PFL_MUSEUM PFL_NOMONSTERS | PFL_NORECRUITS | PFL_NOGIVE | PFL_NOATTACK | PFL_NOTERRAIN | PFL_NOMAGIC | PFL_NOSTEALTH | PFL_NOTEACH | PFL_NOBUILD | PFL_NOFEED
attrib_type at_museumexit = {
"museumexit", NULL, NULL, NULL, a_writeshorts, a_readshorts
"museumexit", NULL, NULL, NULL, a_writeshorts, a_readshorts
};
static void a_initmuseumgivebackcookie(attrib * a)
{
a->data.v = calloc(1, sizeof(museumgivebackcookie));
a->data.v = calloc(1, sizeof(museumgivebackcookie));
}
static void a_finalizemuseumgivebackcookie(attrib * a)
{
free(a->data.v);
free(a->data.v);
}
static void
a_writemuseumgivebackcookie(const attrib * a, const void *owner,
struct storage *store)
struct storage *store)
{
museumgivebackcookie *gbc = (museumgivebackcookie *) a->data.v;
WRITE_INT(store, gbc->warden_no);
WRITE_INT(store, gbc->cookie);
museumgivebackcookie *gbc = (museumgivebackcookie *)a->data.v;
WRITE_INT(store, gbc->warden_no);
WRITE_INT(store, gbc->cookie);
}
static int
a_readmuseumgivebackcookie(attrib * a, void *owner, struct storage *store)
{
museumgivebackcookie *gbc = (museumgivebackcookie *) a->data.v;
READ_INT(store, &gbc->warden_no);
READ_INT(store, &gbc->cookie);
return AT_READ_OK;
museumgivebackcookie *gbc = (museumgivebackcookie *)a->data.v;
READ_INT(store, &gbc->warden_no);
READ_INT(store, &gbc->cookie);
return AT_READ_OK;
}
attrib_type at_museumgivebackcookie = {
"museumgivebackcookie",
a_initmuseumgivebackcookie,
a_finalizemuseumgivebackcookie,
NULL,
a_writemuseumgivebackcookie,
a_readmuseumgivebackcookie
"museumgivebackcookie",
a_initmuseumgivebackcookie,
a_finalizemuseumgivebackcookie,
NULL,
a_writemuseumgivebackcookie,
a_readmuseumgivebackcookie
};
attrib_type at_warden = {
"itemwarden", NULL, NULL, NULL, a_writeint, a_readint
"itemwarden", NULL, NULL, NULL, a_writeint, a_readint
};
static void a_initmuseumgiveback(attrib * a)
{
a->data.v = calloc(1, sizeof(museumgiveback));
a->data.v = calloc(1, sizeof(museumgiveback));
}
static void a_finalizemuseumgiveback(attrib * a)
{
museumgiveback *gb = (museumgiveback *) a->data.v;
i_freeall(&gb->items);
free(a->data.v);
museumgiveback *gb = (museumgiveback *)a->data.v;
i_freeall(&gb->items);
free(a->data.v);
}
static void
a_writemuseumgiveback(const attrib * a, const void *owner,
struct storage *store)
struct storage *store)
{
museumgiveback *gb = (museumgiveback *) a->data.v;
WRITE_INT(store, gb->cookie);
write_items(store, gb->items);
museumgiveback *gb = (museumgiveback *)a->data.v;
WRITE_INT(store, gb->cookie);
write_items(store, gb->items);
}
static int a_readmuseumgiveback(attrib * a, void *owner, struct storage *store)
{
museumgiveback *gb = (museumgiveback *) a->data.v;
READ_INT(store, &gb->cookie);
read_items(store, &gb->items);
return AT_READ_OK;
museumgiveback *gb = (museumgiveback *)a->data.v;
READ_INT(store, &gb->cookie);
read_items(store, &gb->items);
return AT_READ_OK;
}
attrib_type at_museumgiveback = {
"museumgiveback",
a_initmuseumgiveback,
a_finalizemuseumgiveback,
NULL,
a_writemuseumgiveback,
a_readmuseumgiveback
"museumgiveback",
a_initmuseumgiveback,
a_finalizemuseumgiveback,
NULL,
a_writemuseumgiveback,
a_readmuseumgiveback
};
void warden_add_give(unit * src, unit * u, const item_type * itype, int n)
{
attrib *aw = a_find(u->attribs, &at_warden);
museumgiveback *gb = NULL;
museumgivebackcookie *gbc;
attrib *a;
attrib *aw = a_find(u->attribs, &at_warden);
museumgiveback *gb = NULL;
museumgivebackcookie *gbc;
attrib *a;
/* has the giver a cookie corresponding to the warden */
for (a = a_find(src->attribs, &at_museumgivebackcookie);
a && a->type == &at_museumgivebackcookie; a = a->next) {
if (((museumgivebackcookie *) (a->data.v))->warden_no == u->no)
break;
}
/* if not give it one */
if (a == NULL || a->type != &at_museumgivebackcookie) {
a = a_add(&src->attribs, a_new(&at_museumgivebackcookie));
gbc = (museumgivebackcookie *) a->data.v;
gbc->warden_no = u->no;
gbc->cookie = aw->data.i;
assert(aw->data.i < INT_MAX);
aw->data.i++;
} else {
gbc = (museumgivebackcookie *) (a->data.v);
}
/* now we search for the warden's corresponding item list */
for (a = a_find(u->attribs, &at_museumgiveback);
a && a->type == &at_museumgiveback; a = a->next) {
gb = (museumgiveback *) a->data.v;
if (gb->cookie == gbc->cookie) {
break;
/* has the giver a cookie corresponding to the warden */
for (a = a_find(src->attribs, &at_museumgivebackcookie);
a && a->type == &at_museumgivebackcookie; a = a->next) {
if (((museumgivebackcookie *)(a->data.v))->warden_no == u->no)
break;
}
}
/* if there's none, give it one */
if (!gb) {
a = a_add(&u->attribs, a_new(&at_museumgiveback));
gb = (museumgiveback *) a->data.v;
gb->cookie = gbc->cookie;
}
/* if not give it one */
if (a == NULL || a->type != &at_museumgivebackcookie) {
a = a_add(&src->attribs, a_new(&at_museumgivebackcookie));
gbc = (museumgivebackcookie *)a->data.v;
gbc->warden_no = u->no;
gbc->cookie = aw->data.i;
assert(aw->data.i < INT_MAX);
aw->data.i++;
}
else {
gbc = (museumgivebackcookie *)(a->data.v);
}
/* now register the items */
i_change(&gb->items, itype, n);
/* now we search for the warden's corresponding item list */
for (a = a_find(u->attribs, &at_museumgiveback);
a && a->type == &at_museumgiveback; a = a->next) {
gb = (museumgiveback *)a->data.v;
if (gb->cookie == gbc->cookie) {
break;
}
}
/* done */
/* if there's none, give it one */
if (!gb) {
a = a_add(&u->attribs, a_new(&at_museumgiveback));
gb = (museumgiveback *)a->data.v;
gb->cookie = gbc->cookie;
}
/* this has a caveat: If the src-unit is destroyed while inside
* the museum, the corresponding itemlist of the warden will never
* be removed. to circumvent that in a generic way will be extremly
* difficult. */
/* now register the items */
i_change(&gb->items, itype, n);
/* done */
/* this has a caveat: If the src-unit is destroyed while inside
* the museum, the corresponding itemlist of the warden will never
* be removed. to circumvent that in a generic way will be extremly
* difficult. */
}
void create_museum(void)
{
#if 0 /* TODO: move this to LUA. It should be possible. */
unsigned int museum_id = hashstring("museum");
plane *museum = getplanebyid(museum_id);
region *r;
building *b;
const terrain_type *terrain_hall = get_terrain("hall1");
const terrain_type *terrain_corridor = get_terrain("corridor1");
unsigned int museum_id = hashstring("museum");
plane *museum = getplanebyid(museum_id);
region *r;
building *b;
const terrain_type *terrain_hall = get_terrain("hall1");
const terrain_type *terrain_corridor = get_terrain("corridor1");
assert(terrain_corridor && terrain_hall);
assert(terrain_corridor && terrain_hall);
if (!museum) {
museum = create_new_plane(museum_id, "Museum", 9500, 9550,
9500, 9550, PFL_MUSEUM);
}
if (findregion(9525, 9525) == NULL) {
/* Eingangshalle */
r = new_region(9525, 9525, 0);
terraform_region(r, terrain_hall);
r->planep = museum;
rsetname(r, "Eingangshalle");
rsethorses(r, 0);
rsetmoney(r, 0);
rsetpeasants(r, 0);
set_string(&r->display,
"Die Eingangshalle des Großen Museum der 1. Welt ist bereits jetzt ein beeindruckender Anblick. Obwohl das Museum noch nicht eröffnet ist, vermittelt sie bereits einen Flair exotischer Welten. In den Boden ist ein großer Kompass eingelassen, der den Besuchern bei Orientierung helfen soll.");
}
r = findregion(9526, 9525);
if (!r) {
/* Lounge */
r = new_region(9526, 9525, 0);
terraform_region(r, terrain_hall);
r->planep = museum;
rsetname(r, "Lounge");
rsethorses(r, 0);
rsetmoney(r, 0);
rsetpeasants(r, 0);
set_string(&r->display,
"Die Lounge des großen Museums ist ein Platz, in dem sich die Besucher treffen, um die Eindrücke, die sie gewonnen haben, zu verarbeiten. Gemütliche Sitzgruppen laden zum Verweilen ein.");
}
r = findregion(9526, 9525);
if (!r->buildings) {
const building_type *bt_generic = bt_find("generic");
b = new_building(bt_generic, r, NULL);
set_string(&b->name, "Séparée im dämonischen Stil");
set_string(&b->display,
"Diese ganz im dämonischen Stil gehaltene Sitzgruppe ist ganz in dunklen Schwarztönen gehalten. Muster fremdartiger Runen bedecken das merkwürdig geformte Mobiliar, das unangenehm lebendig wirkt.");
b = new_building(bt_generic, r, NULL);
set_string(&b->name, "Séparée im elfischen Stil");
set_string(&b->display,
"Ganz in Grün- und Brauntönen gehalten wirkt die Sitzgruppe fast lebendig. Bei näherer Betrachtung erschließt sich dem Betrachter, daß sie tatsächlich aus lebenden Pflanzen erstellt ist. So ist der Tisch aus einem eizigen Baum gewachsen, und die Polster bestehen aus weichen Grassoden. Ein wunderschön gemusterter Webteppich mit tausenden naturgetreu eingestickter Blumensarten bedeckt den Boden.");
b = new_building(bt_generic, r, NULL);
set_string(&b->name, "Séparée im halblingschen Stil");
set_string(&b->display,
"Dieses rustikale Mobiliar ist aus einem einzigen, gewaltigen Baum hergestellt worden. Den Stamm haben fleißige Halblinge der Länge nach gevierteilt und aus den vier langen Viertelstämmen die Sitzbänke geschnitzt, während der verbleibende Stumpf als Tisch dient. Schon von weitem steigen dem Besucher die Gerüche der Köstlichkeiten entgegen, die auf dem Tisch stapeln.");
b = new_building(bt_generic, r, NULL);
set_string(&b->name, "Séparée im orkischen Stil");
set_string(&b->display,
"Grobgeschreinerte, elfenhautbespannte Stühle und ein Tisch aus Knochen, über deren Herkunft man sich lieber keine Gedanken macht, bilden die Sitzgruppe im orkischen Stil. Überall haben Orks ihre Namen, und anderes wenig zitierenswertes in das Holz und Gebein geritzt.");
b = new_building(bt_generic, r, NULL);
set_string(&b->name, "Séparée im Meermenschenstil");
set_string(&b->display,
"Ganz in Blau- und Grüntönen gehalten, mit Algen und Muscheln verziert wirken die aus altem Meerholz geschnitzten Stühle immer ein wenig feucht. Seltsammerweise hat der schwere aus alten Planken gezimmerte Tisch einen Mast mit kompletten Segel in der Mitte.");
b = new_building(bt_generic, r, NULL);
set_string(&b->name, "Séparée im Katzenstil");
set_string(&b->display,
"Die Wände dieses Séparée sind aus dunklem Holz. Was aus der Ferne wie ein chaotisch durchbrochenes Flechtwerk wirkt, entpuppt sich bei näherer Betrachtung als eine bis in winzige Details gestaltete dschungelartige Landschaft, in die eine Vielzahl von kleinen Bildergeschichten eingewoben sind. Wie es scheint hat sich der Künstler Mühe gegeben wirklich jedes Katzenvolk Eresseas zu porträtieren. Das schummrige Innere wird von einem Kamin dominiert, vor dem einige Sessel und weiche Kissen zu einem gemütlichen Nickerchen einladen. Feiner Anduner Sisal bezieht die Lehnen der Sessel und verlockt dazu, seine Krallen hinein zu versenken. Auf einem kleinen Ecktisch steht ein großer Korb mit roten Wollknäulen und grauen und braunen Spielmäusen.");
} else {
for (b = r->buildings; b; b = b->next) {
b->size = b->type->maxsize;
if (!museum) {
museum = create_new_plane(museum_id, "Museum", 9500, 9550,
9500, 9550, PFL_MUSEUM);
}
}
r = findregion(9524, 9526);
if (!r) {
r = new_region(9524, 9526, 0);
terraform_region(r, terrain_corridor);
r->planep = museum;
rsetname(r, "Nördliche Promenade");
rsethorses(r, 0);
rsetmoney(r, 0);
rsetpeasants(r, 0);
set_string(&r->display,
"Die Nördliche Promenade führt direkt in den naturgeschichtlichen Teil des Museums.");
}
r = findregion(9525, 9524);
if (!r) {
r = new_region(9525, 9524, 0);
terraform_region(r, terrain_corridor);
r->planep = museum;
rsetname(r, "Südliche Promenade");
rsethorses(r, 0);
rsetmoney(r, 0);
rsetpeasants(r, 0);
set_string(&r->display,
"Die Südliche Promenade führt den Besucher in den kulturgeschichtlichen Teil des Museums.");
}
if (findregion(9525, 9525) == NULL) {
/* Eingangshalle */
r = new_region(9525, 9525, 0);
terraform_region(r, terrain_hall);
r->planep = museum;
rsetname(r, "Eingangshalle");
rsethorses(r, 0);
rsetmoney(r, 0);
rsetpeasants(r, 0);
set_string(&r->display,
"Die Eingangshalle des Großen Museum der 1. Welt ist bereits jetzt ein beeindruckender Anblick. Obwohl das Museum noch nicht eröffnet ist, vermittelt sie bereits einen Flair exotischer Welten. In den Boden ist ein großer Kompass eingelassen, der den Besuchern bei Orientierung helfen soll.");
}
r = findregion(9526, 9525);
if (!r) {
/* Lounge */
r = new_region(9526, 9525, 0);
terraform_region(r, terrain_hall);
r->planep = museum;
rsetname(r, "Lounge");
rsethorses(r, 0);
rsetmoney(r, 0);
rsetpeasants(r, 0);
set_string(&r->display,
"Die Lounge des großen Museums ist ein Platz, in dem sich die Besucher treffen, um die Eindrücke, die sie gewonnen haben, zu verarbeiten. Gemütliche Sitzgruppen laden zum Verweilen ein.");
}
r = findregion(9526, 9525);
if (!r->buildings) {
const building_type *bt_generic = bt_find("generic");
b = new_building(bt_generic, r, NULL);
set_string(&b->name, "Séparée im dämonischen Stil");
set_string(&b->display,
"Diese ganz im dämonischen Stil gehaltene Sitzgruppe ist ganz in dunklen Schwarztönen gehalten. Muster fremdartiger Runen bedecken das merkwürdig geformte Mobiliar, das unangenehm lebendig wirkt.");
b = new_building(bt_generic, r, NULL);
set_string(&b->name, "Séparée im elfischen Stil");
set_string(&b->display,
"Ganz in Grün- und Brauntönen gehalten wirkt die Sitzgruppe fast lebendig. Bei näherer Betrachtung erschließt sich dem Betrachter, daß sie tatsächlich aus lebenden Pflanzen erstellt ist. So ist der Tisch aus einem eizigen Baum gewachsen, und die Polster bestehen aus weichen Grassoden. Ein wunderschön gemusterter Webteppich mit tausenden naturgetreu eingestickter Blumensarten bedeckt den Boden.");
b = new_building(bt_generic, r, NULL);
set_string(&b->name, "Séparée im halblingschen Stil");
set_string(&b->display,
"Dieses rustikale Mobiliar ist aus einem einzigen, gewaltigen Baum hergestellt worden. Den Stamm haben fleißige Halblinge der Länge nach gevierteilt und aus den vier langen Viertelstämmen die Sitzbänke geschnitzt, während der verbleibende Stumpf als Tisch dient. Schon von weitem steigen dem Besucher die Gerüche der Köstlichkeiten entgegen, die auf dem Tisch stapeln.");
b = new_building(bt_generic, r, NULL);
set_string(&b->name, "Séparée im orkischen Stil");
set_string(&b->display,
"Grobgeschreinerte, elfenhautbespannte Stühle und ein Tisch aus Knochen, über deren Herkunft man sich lieber keine Gedanken macht, bilden die Sitzgruppe im orkischen Stil. Überall haben Orks ihre Namen, und anderes wenig zitierenswertes in das Holz und Gebein geritzt.");
b = new_building(bt_generic, r, NULL);
set_string(&b->name, "Séparée im Meermenschenstil");
set_string(&b->display,
"Ganz in Blau- und Grüntönen gehalten, mit Algen und Muscheln verziert wirken die aus altem Meerholz geschnitzten Stühle immer ein wenig feucht. Seltsammerweise hat der schwere aus alten Planken gezimmerte Tisch einen Mast mit kompletten Segel in der Mitte.");
b = new_building(bt_generic, r, NULL);
set_string(&b->name, "Séparée im Katzenstil");
set_string(&b->display,
"Die Wände dieses Séparée sind aus dunklem Holz. Was aus der Ferne wie ein chaotisch durchbrochenes Flechtwerk wirkt, entpuppt sich bei näherer Betrachtung als eine bis in winzige Details gestaltete dschungelartige Landschaft, in die eine Vielzahl von kleinen Bildergeschichten eingewoben sind. Wie es scheint hat sich der Künstler Mühe gegeben wirklich jedes Katzenvolk Eresseas zu porträtieren. Das schummrige Innere wird von einem Kamin dominiert, vor dem einige Sessel und weiche Kissen zu einem gemütlichen Nickerchen einladen. Feiner Anduner Sisal bezieht die Lehnen der Sessel und verlockt dazu, seine Krallen hinein zu versenken. Auf einem kleinen Ecktisch steht ein großer Korb mit roten Wollknäulen und grauen und braunen Spielmäusen.");
} else {
for (b = r->buildings; b; b = b->next) {
b->size = b->type->maxsize;
}
}
r = findregion(9524, 9526);
if (!r) {
r = new_region(9524, 9526, 0);
terraform_region(r, terrain_corridor);
r->planep = museum;
rsetname(r, "Nördliche Promenade");
rsethorses(r, 0);
rsetmoney(r, 0);
rsetpeasants(r, 0);
set_string(&r->display,
"Die Nördliche Promenade führt direkt in den naturgeschichtlichen Teil des Museums.");
}
r = findregion(9525, 9524);
if (!r) {
r = new_region(9525, 9524, 0);
terraform_region(r, terrain_corridor);
r->planep = museum;
rsetname(r, "Südliche Promenade");
rsethorses(r, 0);
rsetmoney(r, 0);
rsetpeasants(r, 0);
set_string(&r->display,
"Die Südliche Promenade führt den Besucher in den kulturgeschichtlichen Teil des Museums.");
}
#endif
}
static int
use_museumexitticket(unit * u, const struct item_type *itype, int amount,
order * ord)
order * ord)
{
attrib *a;
region *r;
unit *warden = findunit(atoi36("mwar"));
int unit_cookie;
attrib *a;
region *r;
unit *warden = findunit(atoi36("mwar"));
int unit_cookie;
unused_arg(amount);
unused_arg(amount);
/* Prüfen ob in Eingangshalle */
if (u->region->x != 9525 || u->region->y != 9525) {
cmistake(u, ord, 266, MSG_MAGIC);
return 0;
}
a = a_find(u->attribs, &at_museumexit);
assert(a);
r = findregion(a->data.sa[0], a->data.sa[1]);
assert(r);
a_remove(&u->attribs, a);
/* Übergebene Gegenstände zurückgeben */
a = a_find(u->attribs, &at_museumgivebackcookie);
unit_cookie = a->data.i;
a_remove(&u->attribs, a);
if (a) {
for (a = a_find(warden->attribs, &at_museumgiveback);
a && a->type == &at_museumgiveback; a = a->next) {
if (((museumgiveback *)(a->data.v))->cookie == unit_cookie)
break;
}
if (a && a->type == &at_museumgiveback) {
museumgiveback *gb = (museumgiveback *)(a->data.v);
item *it;
for (it = gb->items; it; it = it->next) {
i_change(&u->items, it->type, it->number);
}
ADDMSG(&u->faction->msgs, msg_message("museumgiveback",
"region unit sender items", r, u, warden, gb->items));
a_remove(&warden->attribs, a);
}
}
/* Benutzer zurück teleportieren */
move_unit(u, r, NULL);
/* Exitticket abziehen */
i_change(&u->items, itype, -1);
/* Prüfen ob in Eingangshalle */
if (u->region->x != 9525 || u->region->y != 9525) {
cmistake(u, ord, 266, MSG_MAGIC);
return 0;
}
a = a_find(u->attribs, &at_museumexit);
assert(a);
r = findregion(a->data.sa[0], a->data.sa[1]);
assert(r);
a_remove(&u->attribs, a);
/* Übergebene Gegenstände zurückgeben */
a = a_find(u->attribs, &at_museumgivebackcookie);
unit_cookie = a->data.i;
a_remove(&u->attribs, a);
if (a) {
for (a = a_find(warden->attribs, &at_museumgiveback);
a && a->type == &at_museumgiveback; a = a->next) {
if (((museumgiveback *) (a->data.v))->cookie == unit_cookie)
break;
}
if (a && a->type == &at_museumgiveback) {
museumgiveback *gb = (museumgiveback *) (a->data.v);
item *it;
for (it = gb->items; it; it = it->next) {
i_change(&u->items, it->type, it->number);
}
ADDMSG(&u->faction->msgs, msg_message("museumgiveback",
"region unit sender items", r, u, warden, gb->items));
a_remove(&warden->attribs, a);
}
}
/* Benutzer zurück teleportieren */
move_unit(u, r, NULL);
/* Exitticket abziehen */
i_change(&u->items, itype, -1);
return 0;
}
static int
use_museumticket(unit * u, const struct item_type *itype, int amount,
order * ord)
order * ord)
{
attrib *a;
region *r = u->region;
plane *pl = rplane(r);
attrib *a;
region *r = u->region;
plane *pl = rplane(r);
unused_arg(amount);
unused_arg(amount);
/* Pruefen ob in normaler Plane und nur eine Person */
if (pl != get_homeplane()) {
cmistake(u, ord, 265, MSG_MAGIC);
return 0;
}
if (u->number != 1) {
cmistake(u, ord, 267, MSG_MAGIC);
return 0;
}
if (has_horses(u)) {
cmistake(u, ord, 272, MSG_MAGIC);
return 0;
}
/* In diesem Attribut merken wir uns, wohin die Einheit zurückgesetzt
* wird, wenn sie das Museum verläßt. */
a = a_add(&u->attribs, a_new(&at_museumexit));
a->data.sa[0] = (short)r->x;
a->data.sa[1] = (short)r->y;
/* Benutzer in die Halle teleportieren */
move_unit(u, findregion(9525, 9525), NULL);
/* Ticket abziehen */
i_change(&u->items, itype, -1);
/* Benutzer ein Exitticket geben */
i_change(&u->items, itype, 1);
/* Pruefen ob in normaler Plane und nur eine Person */
if (pl != get_homeplane()) {
cmistake(u, ord, 265, MSG_MAGIC);
return 0;
}
if (u->number != 1) {
cmistake(u, ord, 267, MSG_MAGIC);
return 0;
}
if (has_horses(u)) {
cmistake(u, ord, 272, MSG_MAGIC);
return 0;
}
/* In diesem Attribut merken wir uns, wohin die Einheit zurückgesetzt
* wird, wenn sie das Museum verläßt. */
a = a_add(&u->attribs, a_new(&at_museumexit));
a->data.sa[0] = (short)r->x;
a->data.sa[1] = (short)r->y;
/* Benutzer in die Halle teleportieren */
move_unit(u, findregion(9525, 9525), NULL);
/* Ticket abziehen */
i_change(&u->items, itype, -1);
/* Benutzer ein Exitticket geben */
i_change(&u->items, itype, 1);
return 0;
}
/***
* special quest door
***/
bool b_blockquestportal(const connection * b, const unit * u,
const region * r)
{
if (b->data.i > 0)
return true;
return false;
}
static const char *b_namequestportal(const connection * b, const region * r,
const struct faction *f, int gflags)
{
const char *bname;
int lock = b->data.i;
unused_arg(b);
unused_arg(r);
if (gflags & GF_ARTICLE) {
if (lock > 0) {
bname = "a_gate_locked";
}
else {
bname = "a_gate_open";
}
}
else {
if (lock > 0) {
bname = "gate_locked";
}
else {
bname = "gate_open";
}
}
if (gflags & GF_PURE)
return bname;
return LOC(f->locale, mkname("border", bname));
}
border_type bt_questportal = {
"questportal", VAR_INT,
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 */
};
void register_museum(void)
{
at_register(&at_warden);
at_register(&at_museumexit);
at_register(&at_museumgivebackcookie);
at_register(&at_museumgiveback);
register_bordertype(&bt_questportal);
register_item_use(use_museumticket, "use_museumticket");
register_item_use(use_museumexitticket, "use_museumexitticket");
at_register(&at_warden);
at_register(&at_museumexit);
at_register(&at_museumgivebackcookie);
at_register(&at_museumgiveback);
register_item_use(use_museumticket, "use_museumticket");
register_item_use(use_museumexitticket, "use_museumexitticket");
}
#endif