2001-01-27 12:32:32 +01:00
/* vi: set ts=2:
*
2001-04-14 13:39:14 +02:00
*
2003-07-29 11:48:03 +02:00
* Eressea PB ( E ) M host Copyright ( C ) 1998 - 2003
2001-01-27 12:32:32 +01:00
* 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 .
*/
/* TODO:
* - Zweite Ausf <EFBFBD> hrung des Benutzes in Zielregion verhindern ( Befehl
* l <EFBFBD> schen )
* - Meldungen
*/
# include <config.h>
# include <eressea.h>
2003-12-14 13:27:09 +01:00
# ifdef MUSEUM_MODULE
2001-01-27 12:32:32 +01:00
# include "museum.h"
/* kernel includes */
2004-06-21 18:45:27 +02:00
# include <kernel/building.h>
2005-07-26 23:03:08 +02:00
# include <kernel/faction.h>
2004-06-21 18:45:27 +02:00
# include <kernel/item.h>
# include <kernel/movement.h>
# include <kernel/message.h>
# include <kernel/order.h>
# include <kernel/plane.h>
# include <kernel/region.h>
# include <kernel/save.h>
# include <kernel/terrain.h>
# include <kernel/unit.h>
2005-07-26 18:37:07 +02:00
# include <kernel/faction.h>
2001-01-27 12:32:32 +01:00
/* util includes */
# include <attrib.h>
2001-12-10 01:13:39 +01:00
# include <functions.h>
2001-01-27 12:32:32 +01:00
# include <goodies.h>
/* libc includes */
# include <limits.h>
# include <stdlib.h>
2002-09-02 22:36:12 +02:00
# define PFL_MUSEUM PFL_NOMONSTERS | PFL_NOCOORDS | PFL_NORECRUITS | PFL_NOGIVE | PFL_NOATTACK | PFL_NOTERRAIN | PFL_NOMAGIC | PFL_NOSTEALTH | PFL_NOTEACH | PFL_NOBUILD | PFL_NOFEED
2001-01-27 12:32:32 +01:00
attrib_type at_museumexit = {
" museumexit " , NULL , NULL , NULL , a_writedefault , a_readdefault
} ;
static void
a_initmuseumgivebackcookie ( attrib * a )
{
a - > data . v = calloc ( 1 , sizeof ( museumgivebackcookie ) ) ;
}
static void
a_finalizemuseumgivebackcookie ( attrib * a )
{
free ( a - > data . v ) ;
}
static void
a_writemuseumgivebackcookie ( const attrib * a , FILE * f )
{
museumgivebackcookie * gbc = ( museumgivebackcookie * ) a - > data . v ;
fprintf ( f , " %d %d " , gbc - > warden_no , gbc - > cookie ) ;
}
static int
a_readmuseumgivebackcookie ( attrib * a , FILE * f )
{
museumgivebackcookie * gbc = ( museumgivebackcookie * ) a - > data . v ;
fscanf ( f , " %d %d " , & gbc - > warden_no , & gbc - > cookie ) ;
2002-04-07 02:44:01 +02:00
return AT_READ_OK ;
2001-01-27 12:32:32 +01:00
}
attrib_type at_museumgivebackcookie = {
" museumgivebackcookie " ,
a_initmuseumgivebackcookie ,
a_finalizemuseumgivebackcookie ,
NULL ,
a_writemuseumgivebackcookie ,
a_readmuseumgivebackcookie
} ;
attrib_type at_warden = {
" itemwarden " , NULL , NULL , NULL , a_writedefault , a_readdefault
} ;
static void
a_initmuseumgiveback ( attrib * a )
{
a - > data . v = calloc ( 1 , sizeof ( museumgiveback ) ) ;
}
static void
a_finalizemuseumgiveback ( attrib * a )
{
i_freeall ( ( ( museumgiveback * ) ( a - > data . v ) ) - > items ) ;
free ( a - > data . v ) ;
}
static void
a_writemuseumgiveback ( const attrib * a , FILE * f )
{
museumgiveback * gb = ( museumgiveback * ) a - > data . v ;
fprintf ( f , " %d " , gb - > cookie ) ;
write_items ( f , gb - > items ) ;
}
static int
a_readmuseumgiveback ( attrib * a , FILE * f )
{
museumgiveback * gb = ( museumgiveback * ) a - > data . v ;
fscanf ( f , " %d " , & gb - > cookie ) ;
read_items ( f , & gb - > items ) ;
2002-04-07 02:44:01 +02:00
return AT_READ_OK ;
2001-01-27 12:32:32 +01:00
}
attrib_type at_museumgiveback = {
" 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 ;
/* has the giver a cookie corresponding to the warden */
for ( a = a_find ( src - > attribs , & at_museumgivebackcookie ) ; a ; a = a - > nexttype ) {
if ( ( ( museumgivebackcookie * ) ( a - > data . v ) ) - > warden_no = = u - > no ) break ;
}
/* if not give it one */
if ( ! a ) {
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 = a - > nexttype ) {
gb = ( museumgiveback * ) a - > data . v ;
if ( gb - > cookie = = gbc - > cookie ) {
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 ;
}
/* 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 )
{
2001-02-11 21:56:20 +01:00
unsigned int museum_id = hashstring ( " museum " ) ;
2001-01-27 12:32:32 +01:00
plane * museum = getplanebyid ( museum_id ) ;
region * r ;
building * b ;
2005-10-25 14:38:01 +02:00
const terrain_type * terrain_hall = get_terrain ( " hall1 " ) ;
const terrain_type * terrain_corridor = get_terrain ( " corridor1 " ) ;
2005-10-25 14:46:25 +02:00
assert ( terrain_corridor & & terrain_hall ) ;
2001-01-27 12:32:32 +01:00
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 ) ;
2005-10-25 14:38:01 +02:00
terraform_region ( r , terrain_hall ) ;
2001-01-27 12:32:32 +01:00
r - > planep = museum ;
rsetname ( r , " Eingangshalle " ) ;
rsethorses ( r , 0 ) ;
rsetmoney ( r , 0 ) ;
rsetpeasants ( r , 0 ) ;
set_string ( & r - > display , " Die Eingangshalle des Gro<72> en Museum der 1. Welt ist bereits jetzt ein beeindruckender Anblick. Obwohl das Museum noch nicht er<65> ffnet ist, vermittelt sie bereits einen Flair exotischer Welten. In den Boden ist ein gro<72> er Kompass eingelassen, der den Besuchern bei Orientierung helfen soll. " ) ;
}
r = findregion ( 9526 , 9525 ) ;
if ( ! r ) {
/* Lounge */
r = new_region ( 9526 , 9525 ) ;
2005-10-25 14:38:01 +02:00
terraform_region ( r , terrain_hall ) ;
2001-01-27 12:32:32 +01:00
r - > planep = museum ;
rsetname ( r , " Lounge " ) ;
rsethorses ( r , 0 ) ;
rsetmoney ( r , 0 ) ;
rsetpeasants ( r , 0 ) ;
set_string ( & r - > display , " Die Lounge des gro<72> en Museums ist ein Platz, in dem sich die Besucher treffen, um die Eindr<64> cke, die sie gewonnen haben, zu verarbeiten. Gem<65> tliche Sitzgruppen laden zum Verweilen ein. " ) ;
}
r = findregion ( 9526 , 9525 ) ;
if ( ! r - > buildings ) {
2002-03-27 22:49:27 +01:00
const building_type * bt_generic = bt_find ( " generic " ) ;
b = new_building ( bt_generic , r , NULL ) ;
2001-01-27 12:32:32 +01:00
set_string ( & b - > name , " S<EFBFBD> par<EFBFBD> e im d<> monischen Stil " ) ;
set_string ( & b - > display , " Diese ganz im d<> monischen Stil gehaltene Sitzgruppe ist ganz in dunklen Schwarzt<7A> nen gehalten. Muster fremdartiger Runen bedecken das merkw<6B> rdig geformte Mobiliar, das unangenehm lebendig wirkt. " ) ;
2002-03-27 22:49:27 +01:00
b = new_building ( bt_generic , r , NULL ) ;
2001-01-27 12:32:32 +01:00
set_string ( & b - > name , " S<EFBFBD> par<EFBFBD> e im elfischen Stil " ) ;
set_string ( & b - > display , " Ganz in Gr<47> n- und Braunt<6E> nen gehalten wirkt die Sitzgruppe fast lebendig. Bei n<> herer Betrachtung erschlie<69> t sich dem Betrachter, da<64> sie tats<74> chlich aus lebenden Pflanzen erstellt ist. So ist der Tisch aus einem eizigen Baum gewachsen, und die Polster bestehen aus weichen Grassoden. Ein wundersch<63> n gemusterter Webteppich mit tausenden naturgetreu eingestickter Blumensarten bedeckt den Boden. " ) ;
2002-03-27 22:49:27 +01:00
b = new_building ( bt_generic , r , NULL ) ;
2001-01-27 12:32:32 +01:00
set_string ( & b - > name , " S<EFBFBD> par<EFBFBD> e im halblingschen Stil " ) ;
set_string ( & b - > display , " Dieses rustikale Mobiliar ist aus einem einzigen, gewaltigen Baum hergestellt worden. Den Stamm haben flei<65> ige Halblinge der L<> nge nach gevierteilt und aus den vier langen Viertelst<73> mmen die Sitzb<7A> nke geschnitzt, w<> hrend der verbleibende Stumpf als Tisch dient. Schon von weitem steigen dem Besucher die Ger<65> che der K<> stlichkeiten entgegen, die auf dem Tisch stapeln. " ) ;
2002-03-27 22:49:27 +01:00
b = new_building ( bt_generic , r , NULL ) ;
2001-01-27 12:32:32 +01:00
set_string ( & b - > name , " S<EFBFBD> par<EFBFBD> e im orkischen Stil " ) ;
set_string ( & b - > display , " Grobgeschreinerte, elfenhautbespannte St<53> hle und ein Tisch aus Knochen, <20> ber deren Herkunft man sich lieber keine Gedanken macht, bilden die Sitzgruppe im orkischen Stil. <20> berall haben Orks ihre Namen, und anderes wenig zitierenswertes in das Holz und Gebein geritzt. " ) ;
2002-03-27 22:49:27 +01:00
b = new_building ( bt_generic , r , NULL ) ;
2001-01-27 12:32:32 +01:00
set_string ( & b - > name , " S<EFBFBD> par<EFBFBD> e im Meermenschenstil " ) ;
set_string ( & b - > display , " Ganz in Blau- und Gr<47> nt<6E> nen gehalten, mit Algen und Muscheln verziert wirken die aus altem Meerholz geschnitzten St<53> hle immer ein wenig feucht. Seltsammerweise hat der schwere aus alten Planken gezimmerte Tisch einen Mast mit kompletten Segel in der Mitte. " ) ;
2002-03-27 22:49:27 +01:00
b = new_building ( bt_generic , r , NULL ) ;
2001-01-27 12:32:32 +01:00
set_string ( & b - > name , " S<EFBFBD> par<EFBFBD> e im Katzenstil " ) ;
set_string ( & b - > display , " Die W<> nde dieses S<> par<61> 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<74> tieren. Das schummrige Innere wird von einem Kamin dominiert, vor dem einige Sessel und weiche Kissen zu einem gem<65> 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<72> er Korb mit roten Wollkn<6B> ulen und grauen und braunen Spielm<6C> 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 ) ;
2005-10-25 14:38:01 +02:00
terraform_region ( r , terrain_corridor ) ;
2001-01-27 12:32:32 +01:00
r - > planep = museum ;
rsetname ( r , " N<EFBFBD> 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 ) ;
2005-10-25 14:38:01 +02:00
terraform_region ( r , terrain_corridor ) ;
2001-01-27 12:32:32 +01:00
r - > planep = museum ;
rsetname ( r , " S<EFBFBD> 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. " ) ;
}
}
2002-09-02 22:36:12 +02:00
static int
2004-06-21 18:45:27 +02:00
use_museumexitticket ( unit * u , const struct item_type * itype , int amount , order * ord )
2001-01-27 12:32:32 +01:00
{
attrib * a ;
region * r ;
unit * warden = findunit ( atoi36 ( " mwar " ) ) ;
int unit_cookie ;
2002-03-16 18:30:48 +01:00
unused ( amount ) ;
2001-01-27 12:32:32 +01:00
/* Pr<50> fen ob in Eingangshalle */
if ( u - > region - > x ! = 9525 | | u - > region - > y ! = 9525 ) {
2004-06-21 18:45:27 +02:00
cmistake ( u , ord , 266 , MSG_MAGIC ) ;
2001-01-27 12:32:32 +01:00
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 ) ;
/* <20> bergebene Gegenst<73> nde zur<75> 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 = a - > nexttype ) {
if ( ( ( museumgiveback * ) ( a - > data . v ) ) - > cookie = = unit_cookie ) break ;
}
if ( a ) {
museumgiveback * gb = ( museumgiveback * ) ( a - > data . v ) ;
item * it ;
for ( it = gb - > items ; it ; it = it - > next ) {
i_change ( & u - > items , it - > type , it - > number ) ;
}
2005-07-25 21:56:44 +02:00
ADDMSG ( & u - > faction - > msgs , msg_message ( " unitmessage " , " region unit sender string " , r , u , warden , buf ) ) ;
2001-01-27 12:32:32 +01:00
a_remove ( & warden - > attribs , a ) ;
}
}
/* Benutzer zur<75> ck teleportieren */
move_unit ( u , r , NULL ) ;
/* Exitticket abziehen */
2004-06-21 18:45:27 +02:00
i_change ( & u - > items , itype , - 1 ) ;
2001-01-27 12:32:32 +01:00
2005-01-19 21:33:13 +01:00
return 0 ;
2001-01-27 12:32:32 +01:00
}
2003-07-29 11:48:03 +02:00
2004-06-21 18:45:27 +02:00
static int
use_museumticket ( unit * u , const struct item_type * itype , int amount , order * ord )
{
attrib * a ;
region * r = u - > region ;
unused ( amount ) ;
/* Pr<50> fen ob in normaler Plane und nur eine Person */
if ( r - > planep ! = NULL ) {
cmistake ( u , ord , 265 , MSG_MAGIC ) ;
return 0 ;
}
if ( u - > number ! = 1 ) {
cmistake ( u , ord , 267 , MSG_MAGIC ) ;
return 0 ;
}
if ( get_item ( u , I_HORSE ) ) {
cmistake ( u , ord , 272 , MSG_MAGIC ) ;
return 0 ;
}
/* In diesem Attribut merken wir uns, wohin die Einheit zur<75> ckgesetzt
* wird , wenn sie das Museum verl <EFBFBD> <EFBFBD> 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 */
2005-10-29 16:48:37 +02:00
i_change ( & u - > items , itype , 1 ) ;
2004-06-21 18:45:27 +02:00
2005-01-19 21:33:13 +01:00
return 0 ;
2004-06-21 18:45:27 +02:00
}
2003-07-29 11:48:03 +02:00
void
register_museum ( void )
{
at_register ( & at_warden ) ;
at_register ( & at_museumexit ) ;
at_register ( & at_museumgivebackcookie ) ;
at_register ( & at_museumgiveback ) ;
2005-10-29 16:48:37 +02:00
register_function ( ( pf_generic ) use_museumticket , " use_museumticket " ) ;
register_function ( ( pf_generic ) use_museumexitticket , " use_museumexitticket " ) ;
2003-07-29 11:48:03 +02:00
}
2003-12-14 13:27:09 +01:00
# endif