/*
*
*$Id: newspaper_box.c,v 1.5 2003/03/21 01:44:16 ceres Exp $
*
*/
/**
* Newspaper box furniture object.
* This object has to be set to a specific paper and only works for a certain
* number of issues. It only works for the owner of the house it is placed in,
* and only when it is actually placed.
* It checks for a new release every hour until it's depleted.
* @author Wirble
* @started August 2001
*/
inherit "/std/room/furniture/storage";
/* includes */
#include <room/newspaper.h>
#include <move_failures.h>
#include <housing.h>
#include <player_handler.h>
/* functions */
void check_for_new_papers();
void set_paper( string _paper );
void set_issues_left( int _issues );
void set_international( int value );
void set_last_issue( int _issue );
mapping query_dynamic_auto_load();
varargs void init_dynamic_arg( mapping map, object thing );
int query_last_issue();
int query_international();
int query_issues_left();
string query_paper();
/* variables */
private string _paper = "a given newspaper";
private int _last_issue = 0;
private int _issues_left = 1;
private int _international = 0;
/** @ignore */
void setup() {
set_name( "box" );
set_short( "newspaper box" );
add_adjective( "newspaper" );
set_long( "It's a large box impregnated with an oil designed to attract "
"delivery-imps.\n" );
set_allowed_positions( ({ "hanging", "standing" }) );
set_allowed_room_verbs( ([ "standing": "stands", "hanging": "hangs" ]) );
add_extra_look( this_object() );
set_weight( 100 );
set_max_weight( 300 );
set_value( 10000 );
set_open();
set_stuck( 1 );
call_out( "check_for_new_papers", 5 );
} /* void setup() */
/** @ignore */
string extra_look() {
if( !_paper || _paper == "a given newspaper" ) {
return "The variables of this newspaper box are broken. Please ask a "
"creator to re-set them.\n";
};
return "This particular one works for " + _paper + ".\n";
} /* string query_box_long() */
/**
* This function is called after the box loads and then again every hour.
* If any new issues of the newspaper are available while the box is placed,
* the necessary property is added to the house's owner and the
* newspaper-object is put into the box.
* Once all issues are delivered, the call-out won't reoccur.
*/
void check_for_new_papers() {
object newspaper;
object room = environment( this_object() );
int i, x, latest_issue;
int* editions_bought;
string name;
if( !is_placed() && _issues_left > 0 ) {
call_out( "check_for_new_papers", 3600 );
return;
};
/* If the box isn't international and the is placed within the newspaper's
* area OR
* if it is international and the newspaper exists... */
if( ( _international == 0 &&
member_array( _paper, NEWSPAPER_HANDLER->query_papers_in_area(
HOUSING->query_region( file_name( room ) ) ) ) != -1 ) ||
( _international == 1 &&
member_array( _paper, NEWSPAPER_HANDLER->query_all_papers() ) != -1 ) ){
latest_issue = NEWSPAPER_HANDLER->query_last_edition_num( _paper );
name = environment( this_object() )->query_owner();
if( latest_issue > _last_issue ) {
tell_room( room,
"A " + ({"red", "green", "purple", "blue", "yellow",
"drunk", "smelly", "large", "tiny"})[random(9)] +
" imp rushes in with some newpapers in its hands and "
"disappears in the box.\n" );
x = latest_issue - _last_issue;
/* ...all undelivered issues are created and moved to the box... */
for( i = 0; i < x; i++ ) {
newspaper = clone_object( NEWSPAPER_OB );
newspaper->set_paper( _paper );
newspaper->set_edition( _last_issue + 1 );
if( !newspaper->move( this_object() ) == MOVE_OK ) {
tell_room( room,
"Something in the box curses and a newspaper is "
"thrown to the floor from inside it.\n" );
newspaper->move( room );
};
_last_issue++;
_issues_left--;
editions_bought = PLAYER_HANDLER->test_property( name, "Paper " +
_paper );
if( !editions_bought ) {
editions_bought = ({ });
};
/* ... and the paper-bought property is added to the player so
* the web-newspaper-pages become available.
* Also the newspaper gets paid. */
if( member_array( _last_issue + 1, editions_bought ) == -1 ) {
editions_bought += ({ _last_issue });
PLAYER_HANDLER->special_add_property( name,
"Paper " + _paper, editions_bought );
NEWSPAPER_HANDLER->add_edition_paper_sold( _paper,
_last_issue + 1,
NEWSPAPER_HANDLER->query_paper_cost( _paper ) );
} else {
NEWSPAPER_HANDLER->add_edition_revenue( _paper, _last_issue + 1,
NEWSPAPER_HANDLER->query_paper_cost( _paper ) );
};
tell_room( room,
"You hear some " + ({"giggling", "ranting", "quacking",
"thumping", "cursing", "swearing",
"snickering"})[random(7)] +
" emerging, the imp jumps out and runs off again.\n" );
};
};
};
if( _issues_left == 0 ) {
set_long( query_long() +
"It appears the imp-bait is no longer working.\n" );
} else {
call_out( "check_for_new_papers", 3600 );
};
} /* void check_for_new_papers() */
/**
* This sets the newspaper the box is dedicated to.
* @param new_paper The newspaper
*/
void set_paper( string new_paper ) {
_paper = new_paper;
} /* void set_paper() */
/**
* This sets the number of issues the box will handle. This shouldn't be
* used after the initial creation of the box.
* @param _issues The new number of issues
*/
void set_issues_left( int _issues ) {
_issues_left = _issues;
} /* void set_issues_left() */
/**
* This sets the last issue that was delivered. Since it should only be called
* when the box is created, it makes sure that the player doesn't get issues
* that have been published before the box was purchased.
* @param _issue The latest issue at the time of purchase
*/
void set_last_issue( int _issue ) {
_last_issue = _issue;
} /* void set_last_issue() */
/** @ignore */
mapping query_dynamic_auto_load() {
return ([
"::": ::query_dynamic_auto_load(),
"_paper": _paper,
"_issues_left": _issues_left,
"_last_issue": _last_issue,
"_international": _international
]);
} /* mapping query_dynamic_auto_load() */
/** @ignore */
varargs void init_dynamic_arg( mapping map, object thing ) {
if( map[ "::" ] && thing ) {
::init_dynamic_arg( map[ "::" ], thing );
} else if( map[ "::" ] ) {
::init_dynamic_arg( map[ "::" ] );
};
if( map[ "_paper" ] ) {
set_paper( map[ "_paper" ] );
};
if( map[ "_issues_left" ] ) {
set_issues_left( map[ "_issues_left" ] );
};
if( map[ "_last_issue" ] ) {
set_last_issue( map[ "_last_issue" ] );
};
if( map[ "_international" ] ) {
set_international( map[ "_international" ] );
};
} /* varargs void init_dynamic_arg() */
/**
* This queries the last issue of the paper.
* @return the number of the last delivered issue
*/
int query_last_issue() {
return _last_issue;
} /* int query_last_issue() */
/**
* This queries how many issues are left before the box is used up.
* @return the number of issues left
*/
int query_issues_left() {
return _issues_left;
} /* int query_issues_left() */
/**
* This queries if the box will work if it's in a house outside the newspaper's
* region.
* @return 1 if international, 0 if not
*/
int query_international() {
return _international;
} /* int query_international() */
/**
* This queries what paper the box is set to.
* @return the name of the paper
*/
string query_paper() {
return _paper;
} /* string query_paper() */
/**
* This sets the box to international or not.
* @param i 1 for international, 0 for not.
*/
void set_international( int i ) {
_international = i;
} /* void set_international() */