/* -*- LPC -*- */
/*
* $Locker: pinkfish $
* $Id: newspaper_office.c,v 1.52 2003/05/23 22:26:02 wirble Exp pinkfish $
*
*
*/
/**
* An office from which a player run newspaper can be run.
* @author Obilix
* @changed Pinkfish Fri Apr 27 12:08:29 PDT 2001
* Turned into an inherit and made to use a newspaper handler for
* distributing the actual text.
*/
#include <mail.h>
#include <money.h>
#include <move_failures.h>
#include <player_handler.h>
#include <room/newspaper.h>
#include <nroff.h>
#include <board.h>
#include <housing.h>
#define NEWSPAPER_POSTPONE_FLAG 1
#define NEWSPAPER_LOCK_FLAG 2
class our_article {
class article art;
int flags;
int length;
int suggested_payment;
}
class reporter {
int date_added;
int num_articles;
int total_payed;
}
class category_data {
int cost_per_add;
int cost_per_ten_chars;
int open;
}
class payee_data {
int paid;
string message;
}
private mapping _reporters;
private string* _editors;
private string* _setters;
private string* _sponsors;
private string _owner;
private mapping _payees;
private int _published_time;
private class our_article* _articles;
private class advert* _adverts;
private int _next_article_num;
private int _edition_number;
private int _locked;
private int _owner_extra_cash;
private mapping _category;
private nosave string _save_dir;
private nosave string _paper_name;
private string _bank_branch;
private nosave string _proxy;
int show_article(class our_article art, int source);
string* query_all_reporters();
string* query_all_setters();
string* query_all_editors();
string* query_all_sponsors();
mapping query_all_payees();
int is_reporter(string word);
int is_setter(string word);
int is_editor(string word);
int is_sponsor(string word);
void add_reporter(string word);
void add_setter(string word);
void add_editor(string word);
void add_sponsor(string word);
void remove_reporter(string word);
void remove_setter(string word);
void remove_editor(string word);
void remove_sponsor(string word);
void update_commands(string word);
string query_log_file_name();
string query_article_log_file_name();
int query_current_edition();
string query_paper_name();
string query_next_article_file_name();
string query_bank_branch();
mixed query_property(string);
string query_owner();
int is_owner(string word);
void create()
{
_reporters = ([ ]);
_editors = ({ });
_payees = ([ ]);
_articles = ({ });
_category = ([ ]);
_adverts = ({ });
_setters = ({ });
_sponsors = ({ });
_next_article_num = 2;
} /* setup() */
/**
* Saves the data in the file.
*/
protected void save_me()
{
if (_save_dir && !_proxy) {
unguarded( (: save_object(_save_dir + "main") :) );
}
} /* save_me() */
/**
* Loads the data in the file.
*/
protected void load_me()
{
class article fluff;
int i;
printf("%O %O\n", _save_dir, _proxy);
if (_save_dir && !_proxy) {
unguarded( (: restore_object(_save_dir + "main", 1) :) );
printf("%O %O\n", _save_dir, _proxy);
if (!_articles) {
_articles = ({ });
}
if (!_setters) {
_setters = ({ });
}
if (!_sponsors) {
_sponsors = ({ });
}
if (!_adverts) {
_adverts = ({ });
}
for (i = 0; i < sizeof(_articles); i++) {
if (sizeof(_articles[i]->art) == 6) {
fluff = new(class article);
fluff->file_name = _articles[i]->art->file_name;
fluff->title = _articles[i]->art->title;
fluff->author = _articles[i]->art->author;
fluff->date_written = _articles[i]->art->date_written;
fluff->type = _articles[i]->art->type;
fluff->shown_name = _articles[i]->art->shown_name;
fluff->colour = 0;
_articles[i]->art = fluff;
}
}
}
} /* save_me() */
private int a_type(int data) {
return data & NEWSPAPER_ARTICLE_TYPE_MASK;
}
private int a_flags(int data) {
return data & ~NEWSPAPER_ARTICLE_TYPE_MASK;
}
/**
* This method sets the directory we are to use for all the
* temporary files and data. The actual pubished data will be stored
* by the newspaper handler.
* @param dir the directory to put stuff in
*/
void set_save_directory(string dir) {
if (dir[<1] != '/') {
dir += "/";
}
_save_dir = dir;
load_me();
} /* set_save_directory() */
/**
* This method saves an article.
*/
void save_article_text(class our_article art, string text) {
if (a_type(art->art->type) != NEWSPAPER_ARTICLE_TYPE_HTML &&
a_type(art->art->type) != NEWSPAPER_ARTICLE_TYPE_PLAIN) {
return ;
}
unguarded( (:
write_file(_save_dir + $(art->art->file_name), save_variable(({ $(art), $(text) })), 1) :) );
unguarded( (: rm(_save_dir + $(art->art->file_name) + ".proc" ) :) );
unguarded( (: rm(_save_dir + $(art->art->file_name) + ".nroff.o" ) :) );
} /* save_article_text() */
/**
* THis method updates any information about the article if needed.
*/
private void update_article_info(class our_article art, string text) {
int fsize;
fsize = strlen(text);
art->length = fsize;
if (fsize < 0) {
fsize = 0;
}
if (fsize > 4000) {
fsize = 4000;
}
fsize = fsize / 100;
art->suggested_payment = fsize;
} /* update_article_info() */
/**
* This method loads the text of an article.
*/
string load_article_text(class our_article art) {
mixed* bits;
string str;
str = unguarded( (: read_file(_save_dir + $(art->art->file_name)) :) );
if (str) {
bits = restore_variable(str);
return bits[1];
}
return "Error loading the article.";
} /* load_article_text() */
/**
* This method is used by the web, it loads the article by the file name.
*/
string load_article_text_by_file(string fname) {
int i;
for (i = 0; i < sizeof(_articles); i++) {
if (_articles[i]->art->file_name == fname) {
return load_article_text(_articles[i]);
}
}
return "Lost the article.\n";
} /* load_article_text_by_file() */
/**
* This method is used by the web, it loads the article by the file name.
*/
void save_article_text_by_file(string fname, string text) {
int i;
for (i = 0; i < sizeof(_articles); i++) {
if (_articles[i]->art->file_name == fname) {
//_articles[i]->art->length = strlen(text);
update_article_info(_articles[i], text);
return save_article_text(_articles[i], text);
}
}
return ;
} /* load_article_text_by_file() */
/**
* This method is used by the web, it loads the article by the file name.
*/
void set_article_title_by_file(string fname, string title) {
int i;
for (i = 0; i < sizeof(_articles); i++) {
if (_articles[i]->art->file_name == fname) {
_articles[i]->art->title = title;
save_me();
return ;
}
}
return ;
} /* load_article_text_by_file() */
/**
* This method deletes any bitsof the article off the disk.
* @param article the article to delete
*/
void delete_article(class our_article article) {
unguarded( (: rm(_save_dir + $(article->art->file_name)) :) );
unguarded( (: rm(_save_dir + $(article->art->file_name) + ".proc" ) :) );
unguarded( (: rm(_save_dir + $(article->art->file_name) + ".nroff.o" ) :) );
} /* delete_article() */
/**
* This method returns the index of the article in the article array.
* @return the article index
*/
int query_article_index(string match) {
int index;
match = lower_case(match);
if (strlen(match) && (match[0] >= '0' && match[0] <= '9')) {
sscanf(match, "%d", index);
index--;
if (index < 0 || index >= sizeof(_articles)) {
return -1;
}
return index;
}
if (strlen(match) == 1) {
index = match[0] - 'a';
if (index < 0 || index >= sizeof(_articles)) {
return -1;
}
return index;
}
return -1;
} /* query_article_index() */
class our_article* query_articles() {
return _articles;
}
/**
* This method finds an article based on a string.
* @return the article
*/
class our_article query_article(string match) {
int index;
index = query_article_index(match);
if (index == -1) {
return 0;
}
return _articles[index];
} /* query_article() */
/**
* This method tries to find a category based on some fuzzy matching.
* @param category the category to lookup
* @return the fixed up category name
*/
string query_category(string category) {
string name;
category = lower_case(category);
foreach (name in keys(_category)) {
if (lower_case(name) == category ||
lower_case(name)[0..strlen(category) - 1] == category) {
return name;
}
}
return 0;
} /* query_category() */
/**
* The file name of the log file for events.
* @return the log file name
*/
string query_log_file_name() {
return _save_dir + "event.log";
} /* query_log_file_name() */
/**
* The file name of the log file for article events.
* @return the article log file name
*/
string query_article_log_file_name() {
return _save_dir + "aritcle.log";
} /* query_article_log_file_name() */
/**
* This method returns the current edition of the newspaper./
* @return the current edition of the newspaper
*/
int query_current_edition()
{
return NEWSPAPER_HANDLER->query_current_edition_num(query_paper_name());
}
/**
* This method returns the name of the paper.
* @return the name of the paper
*/
string query_paper_name()
{
return _paper_name;
}
/**
* This method returns the name of the paper with a 'the' in front.
* @return the name of the paper
*/
string query_the_paper_name()
{
if (lower_case(_paper_name[0..3]) == "the") {
return _paper_name;
}
return "the " + _paper_name;
}
/**
* This method sets the name of the paper.
* @param name the new name of the paper
*/
string set_paper_name(string name)
{
_paper_name = name;
}
/**
* This returns the next number to use for an article.
* @return the next article number
*/
string query_next_article_file_name()
{
while (file_size(_save_dir + _next_article_num + ".txt") != -1) {
_next_article_num++;
}
return (_next_article_num++) + ".txt";
}
/**
* This method returns the bank branch to use for depositing money for
* editions.
* @return the bank branch to use
*/
string query_bank_branch()
{
return _bank_branch;
}
/**
* This method sets the bank branch to use for depositing money when
* editions are made.
* @param bank the bank branch to use
*/
void set_bank_branch(string bank) {
_bank_branch = bank;
} /* set_bank_branch() */
/** @ignore yes */
int do_apply()
{
if (_proxy) {
return _proxy->do_apply();
}
tell_object(this_player(), "To apply for a job at " + query_the_paper_name() + ", please write "
"us a letter outlining your areas of interest and what you think you "
"would be able to contribute to the newspaper. It will be sent to the "
"editors of " + query_the_paper_name() +
", who will get back to you with an answer "
"within a few days.\n");
this_player()->do_edit(0, "mail_application");
add_succeeded_mess(({ "", "$N start$s writing an application.\n" }));
return 1;
} /* do_apply */
/** @ignore yes */
int mail_application(string text)
{
string word;
string *eds;
if (!text) {
tell_object(this_player(), "You decide not to apply just yet.\n");
return 0;
}
eds = ({ });
foreach(word in query_all_editors()) {
if (PLAYER_HANDLER->test_user(word)) {
eds += ({ word });
}
}
if (!sizeof(eds)) {
eds = ({ "pinkfish" });
}
AUTO_MAILER->auto_mail(implode(eds, ","), this_player()->query_name(),
"" + query_paper_name() + " application", "", text, 0, 0);
log_file(query_log_file_name(),
"On " + ctime(time()) + " " + this_player()->query_short() +
" applied for a job at " + query_the_paper_name() + ".\n");
tell_object(this_player(), "Your application has been submitted. Thanks!\n");
tell_room(this_object(),
this_player()->the_short() + " finishes " + this_player()->query_possessive() +
" application for a job at " + query_the_paper_name() + ".\n", this_player());
return 1;
} /* mail_application */
/** @ignore yes */
int part_two(string str, string author, int html)
{
if (!sizeof(str)) {
tell_object(this_player(), "The article must have a name!\n");
tell_room(this_object(), this_player()->the_short() +
" stops writing to think of a name.\n",
this_player());
return 0;
}
if (!html) {
tell_object(this_player(), "Please enter the text of your story. It will make "
"everyone's life much easier if it is less than 75 characters per "
"line!\n\n"
"%^BOLD%^<--------+10-------+20-------+30-------+40-------+50-------+60-"
"------+70-->%^RESET%^\n");
}
this_player()->do_edit(0, "write_it", this_object(), 0, ({ str, author, html }));
return 1;
} /* part_two() */
/** @ignore yes */
int do_submit(string str, string author, int html)
{
if (_proxy) {
return _proxy->do_submit(str, author, html);
}
if (_locked) {
add_failed_mess("The newspaper office is currently locked for "
"submissions.\n");
return 0;
}
if (!str) {
add_failed_mess("Please enter the name of the article you wish "
"to submit. A short but descriptive name would be good, and it will "
"automagically have your name appended to the end of it.\n");
return 0;
}
if (!author) {
author = this_player()->query_cap_name();
}
add_succeeded_mess(({ "", "$N start$s writing an article.\n" }));
part_two(str, author, html);
return 1;
} /* do_submit */
/** @ignore yes */
varargs int write_it(string article,
mixed *stuff,
class our_article cur_art)
{
int fsize;
string person;
string title;
string author;
int html;
title = stuff[0];
author = stuff[1];
html = stuff[2];
if (!article) {
tell_object(this_player(), "You decide not to submit your story after all.\n");
tell_room(this_object(), this_player()->the_short() +
" stops writing the article.\n", this_player());
return 0;
}
person = this_player()->query_cap_name();
if (!cur_art) {
cur_art = new(class our_article);
cur_art->art = new(class article);
cur_art->art->title = title;
cur_art->art->shown_name = author;
cur_art->art->file_name = query_next_article_file_name();
cur_art->art->author = person;
cur_art->art->date_written = time();
if (html) {
cur_art->art->type = NEWSPAPER_ARTICLE_TYPE_HTML;
} else {
cur_art->art->type = NEWSPAPER_ARTICLE_TYPE_PLAIN;
}
update_article_info(cur_art, article);
cur_art->flags = 0;
}
_articles += ({ cur_art });
save_article_text(cur_art, article);
save_me();
log_file(query_article_log_file_name(),
"On " + ctime(time()) + " " + person +
" submitted the story " + title + ".\n");
log_file(query_article_log_file_name(), "Recommended payment for above "
"article: $" + fsize + ".\n");
tell_object(this_player(), "Article submitted!\n");
tell_room(this_object(), this_player()->the_short() +
" submits an article to the newspaper.\n",
this_player());
} /* write_it() */
/** @ignore yes */
int do_retrieve(string edn, int source)
{
class our_article article;
if (_proxy) {
return _proxy->do_retrieve(edn, source);
}
add_succeeded_mess("");
if (!sizeof(_articles)) {
add_failed_mess("There do not seem to have be any articles "
"submitted for this edition yet.\n");
return 0;
}
article = query_article(edn);
if (!article) {
add_failed_mess("Sorry, " + edn + " is an incorrect article "
"reference.\n");
return 0;
}
if (!is_editor(this_player()->query_name()) &&
!is_setter(this_player()->query_name()) &&
lower_case(article->art->author) != this_player()->query_name()) {
add_failed_mess("You can only read your own articles.\n");
return 0;
}
show_article(article, source);
return 1;
} /* do_retrieve */
/** @ignore yes */
int show_article(class our_article article, int source)
{
string text;
mixed* bits;
int i;
mixed* stuff;
class advert data;
switch (a_type(article->art->type)) {
case NEWSPAPER_ARTICLE_TYPE_SECTION :
text = "%^BOLD%^" + article->art->title + "%^RESET%^\n\n";
for (i = 0; i < sizeof(_articles); i++) {
if (_articles[i] == article) {
i++;
break;
}
}
for (; i < sizeof(_articles); i++) {
if (a_type(_articles[i]->art->type) != NEWSPAPER_ARTICLE_TYPE_SECTION) {
text += sprintf("%2d .... %70-=s\n", i + 1,
_articles[i]->art->title);
}
}
break;
case NEWSPAPER_ARTICLE_TYPE_ADVERTS :
text = "%^BOLD%^" + article->art->title + "%^RESET%^\n";
stuff = unique_array(_adverts, (: $1->category :));
foreach (bits in stuff) {
text += "\n$I$0=" + bits[0]->category + "\n$I$3= ";
foreach (data in bits) {
text += data->text + "\n-- " + data->author + "\n\n";
}
}
break;
case NEWSPAPER_ARTICLE_TYPE_HTML :
if (!source) {
// Do evil banana things.
text = unguarded( (: NROFF_HAND->cat_file(_save_dir +
$(article->art->file_name) + ".nroff", 1) :) );
if (!text) {
// Make the html output.
text = unguarded( (: read_file(_save_dir +
$(article->art->file_name)) :) );
if (text) {
bits = restore_variable(text);
bits[1] = NEWSPAPER_HANDLER->convert_html(bits[1]);
unguarded( (: write_file(_save_dir + $(article->art->file_name) +
".proc", $(bits[1]), 1) :) );
if (unguarded( (: NROFF_HAND->create_nroff(_save_dir +
$(article->art->file_name) + ".proc",
_save_dir + $(article->art->file_name) + ".nroff") :) )) {
text = unguarded( (: NROFF_HAND->cat_file(_save_dir +
$(article->art->file_name) + ".nroff") :) );
} else {
text = "Unable to make nroff file.\n";
}
} else {
text = "Unable to read the article. Opps.\n";
}
}
break;
}
case NEWSPAPER_ARTICLE_TYPE_PLAIN :
text = load_article_text(article);
break;
}
this_player()->more_string("The article you requested reads as follows:\n" +
text + "\n");
return 1;
} /* show_article */
/** @ignore yes */
int do_logs(int article_log)
{
string logfile;
if (_proxy) {
return _proxy->do_logs(article_log);
}
if (article_log) {
logfile = read_file(query_article_log_file_name());
} else {
logfile = read_file(query_log_file_name());
}
if (!logfile) {
add_failed_mess("There don't appear to be any logs.\n");
return 0;
}
this_player()->more_string("The log contains:\n" + logfile + "\n");
add_succeeded_mess("");
return 1;
} /* do_logs() */
/** @ignore yes */
int do_articles(int scroll)
{
string str;
class our_article article;
int pos;
int editor;
if (_proxy) {
return _proxy->do_articles(scroll);
}
str = "";
editor = is_editor(this_player()->query_name());
if (sizeof(_articles)) {
str = "The articles for edition " + query_current_edition() + " are:\n";
pos = 1;
foreach(article in _articles) {
if (article->art->colour) {
str += "%^" + article->art->colour + "%^";
}
switch (a_type(article->art->type)) {
case NEWSPAPER_ARTICLE_TYPE_HTML :
case NEWSPAPER_ARTICLE_TYPE_PLAIN :
str += sprintf("$I$5=Page %2d) %s by %s (shown author %s) submitted at %s; length %d%s%s%s\n",
pos, article->art->title,
(editor || article->art->author == this_player()->query_name()?article->art->author:article->art->shown_name),
article->art->shown_name,
ctime(article->art->date_written),
article->length,
(editor?" suggested payment $" + article->suggested_payment:""),
(article->flags & NEWSPAPER_POSTPONE_FLAG?" (postponed)":""),
(article->flags & NEWSPAPER_LOCK_FLAG?" (locked)":""),
(a_flags(article->art->type) & NEWSPAPER_ARTICLE_NO_XP_FLAG?" (no xp)":"") );
break;
case NEWSPAPER_ARTICLE_TYPE_SECTION :
str += sprintf("$I$5=Page %2d) Section Header '%s'\n",
pos,
article->art->title);
break;
case NEWSPAPER_ARTICLE_TYPE_ADVERTS :
str += sprintf("$I$5=Page %2d) Adverts\n", pos);
break;
}
if (article->art->colour) {
str += "%^RESET%^";
}
pos++;
}
} else {
str = "There are no articles in this edition yet.\n";
}
if (!scroll) {
write("$P$Articles$P$" + str);
} else {
write(str);
}
return 1;
} /* do_logs() */
/** @ignore yes */
int do_resign()
{
object *inv;
object ob;
string person;
if (_proxy) {
return _proxy->do_resign();
}
person = this_player()->query_name();
remove_reporter(person);
if (is_editor(person)) {
remove_editor(person);
}
if (is_setter(person)) {
remove_setter(person);
}
log_file(query_log_file_name(),
"On " + ctime(time()) + " " + this_player()->query_short() +
" resigned from " + query_the_paper_name() + ".\n");
inv = match_objects_for_existence("press credentials", ({ this_player() }),
this_player());
foreach (ob in inv) {
if (ob->query_paper_name() == query_paper_name()) {
ob->dest_me();
}
}
add_succeeded_mess(({ "You hand in your badge, and tender your "
"resignation from " + query_the_paper_name() +
". You can't help but feel a little "
"saddened as a result.\n",
"$N $V from " + query_the_paper_name() + ".\n" }));
return 1;
} /* do_resign() */
/** @ignore yes */
int do_delete(string str)
{
class our_article article;
int i;
if (_proxy) {
return _proxy->do_delete(str);
}
article = query_article(str);
if (!article) {
add_failed_mess("There is no article referenced by " + str + ".\n");
return 0;
}
if (!is_editor(this_player()->query_name()) &&
this_player()->query_name() != lower_case(article->art->author)) {
add_failed_mess("You cannot delete this article.\n");
return 0;
}
delete_article(article);
for (i = 0; i < sizeof(_articles); i++) {
if (_articles[i] == article) {
_articles = _articles[0..i - 1] + _articles[i+1..];
}
}
save_me();
log_file(query_article_log_file_name(),
"On " + ctime(time()) + " " + this_player()->query_short() +
" deleted the article " + article->art->title + ".\n");
add_succeeded_mess(({ "Article deleted!\n",
"$N $V an article from "
"the current edition.\n" }));
return 1;
} /* do_delete */
/** @ignore yes */
int do_hire(string person, int setter)
{
string bing;
object thatguy;
if (_proxy) {
return _proxy->do_hire(person, setter);
}
person = lower_case(person);
if (setter) {
if (is_setter(person)) {
add_failed_mess("That person is already employed as a setter by " +
query_the_paper_name() + "!\n");
return 0;
}
bing = "setter";
} else {
if (is_reporter(person)) {
add_failed_mess("That person is already employed by " +
query_the_paper_name() + "!\n");
return 0;
}
bing = "reporter";
}
if (!PLAYER_HANDLER->test_user(person)) {
add_failed_mess("There is nobody called " + capitalize(person) + "!\n");
return 0;
}
thatguy = find_player(person);
if (thatguy) {
tell_object(thatguy, "You have "
"just been hired by " + this_player()->the_short() +
" as a " + bing + " for " +
query_the_paper_name() + ".\n");
}
if (setter) {
add_setter(person);
} else {
add_reporter(person);
}
log_file(query_log_file_name(),
"On " + ctime(time()) + " " + this_player()->query_short() +
" employed " + capitalize(person) + " as a " + bing + ".\n");
add_succeeded_mess(capitalize(person) +
" is now employed by " +
query_the_paper_name() + " as a " + bing + ".\n");
return 1;
} /* do_hire() */
/** @ignore yes */
int do_dismiss(string person)
{
object thatguy;
if (_proxy) {
return _proxy->do_dismiss(person);
}
if (!is_reporter(person)) {
add_failed_mess("That person is not employed by " +
query_the_paper_name() + "!\n");
return 0;
}
remove_reporter(person);
remove_editor(person);
remove_setter(person);
thatguy = find_player(person);
if (thatguy) {
tell_object(thatguy, "You have "
"been fired from " + query_the_paper_name() + " by " + this_player()->the_short() +
"!\n");
}
log_file(query_log_file_name(),
"On " + ctime(time()) + " " + this_player()->query_short() +
" fired " + capitalize(person) + ".\n");
add_succeeded_mess(capitalize(person) +
" is no longer employed by " +
query_the_paper_name() + ".\n");
return 1;
} /* do_dismiss() */
/** @ignore yes */
int do_sponsor_add(string person)
{
if (_proxy) {
return _proxy->do_sponsor_add(person);
}
person = lower_case(person);
if (is_sponsor(person)) {
add_failed_mess(person + " is already a sponsor of " +
query_the_paper_name() + "!\n");
return 0;
}
if (!PLAYER_HANDLER->test_user(person)) {
add_failed_mess("I am sorry, but " + person + " does not exist.\n");
return 0;
}
add_sponsor(person);
add_succeeded_mess(capitalize(person) +
" is now a sponsor of " + query_the_paper_name() + ".\n");
return 1;
} /* do_sponsor_add() */
/** @ignore yes */
int do_sponsor_remove(string person)
{
if (_proxy) {
return _proxy->do_sponsor_remove(person);
}
person = lower_case(person);
if (!is_sponsor(person)) {
add_failed_mess(person + " is not a sponsor of " +
query_the_paper_name() + "!\n");
return 0;
}
remove_sponsor(person);
add_succeeded_mess(capitalize(person) +
" is not a sponsor of " +
query_the_paper_name() + " anymore.\n");
return 1;
} /* do_sponsor_remove() */
/** @ignore yes */
int do_promote(string person)
{
object thatguy;
if (_proxy) {
return _proxy->do_promote(person);
}
person = lower_case(person);
if (!is_reporter(person)) {
add_failed_mess("There is nobody by that name currently employed at " +
query_the_paper_name() + "!\n");
return 0;
}
if (is_editor(person)) {
add_failed_mess(capitalize(person) + " is already an editor!\n");
return 0;
}
add_editor(person);
thatguy = find_player(person);
if (thatguy) {
tell_object(thatguy, "You have "
"been promoted to editor of " + query_the_paper_name() + " by " +
this_player()->the_short() + "!\n");
}
log_file(query_log_file_name(),
"On " + ctime(time()) + " " + this_player()->query_short() +
" promoted " + capitalize(person) + " to " +
"editor.\n");
add_succeeded_mess(capitalize(person) +
" is now an editor of " + query_the_paper_name() + ".\n");
return 1;
} /* do_promote() */
/** @ignore yes */
int do_demote(string person, int editor)
{
object thatguy;
if (_proxy) {
return _proxy->do_demote(person, editor);
}
person = lower_case(person);
if (editor) {
if (!is_editor(person)) {
add_failed_mess
("There is nobody by that name currently employed as an "
"editor at " + query_the_paper_name() + "!\n");
return 0;
}
remove_editor(person);
} else {
if (!is_setter(person)) {
add_failed_mess
("There is nobody by that name currently employed as a "
"setter at " + query_the_paper_name() + "!\n");
return 0;
}
remove_setter(person);
}
add_reporter(person);
thatguy = find_player(person);
if (thatguy) {
tell_object(thatguy,
this_player()->the_short() +
" just demoted you as an editor of " + query_the_paper_name() + "!\n");
}
log_file(query_log_file_name(),
"On " + ctime(time()) + " " + this_player()->query_short() +
" demoted " + capitalize(person) +
" to reporter.\n");
add_succeeded_mess(capitalize(person) +
" is no longer an editor of " + query_the_paper_name() + ".\n");
return 1;
} /* do_demote */
/**
* This is the status that everyone can see, not just the employees.
*/
int do_everyone_status() {
string ret;
if (_proxy) {
return _proxy->do_everyone_status();
}
ret = query_the_paper_name() + " has the following employees:\n";
ret += "$I$3=Owner: " +
query_owner() +
"\n";
ret += "$I$3=Reporters: " +
query_multiple_short(sort_array(query_all_reporters(), 0)) +
"\n";
ret += "$I$3=Setters : " +
(sizeof(query_all_setters())?
query_multiple_short(sort_array(query_all_setters(), 0)):"no one") +
"\n";
ret += "$I$3=Editors : " +
(sizeof(query_all_setters())?
query_multiple_short(sort_array(query_all_editors() - ({ query_owner() }), 0)):"no one") +
"\n";
write("$P$Status$P$" + ret);
return 1;
} /* do_everyone_status() */
/** @ignore yes */
int do_status()
{
string ret;
int i;
int last_num;
if (_proxy) {
return _proxy->do_status();
}
ret = query_the_paper_name() + " has the following employees:\n";
ret += "$I$3=Owner: " +
query_owner() +
"\n";
ret += "$I$3=Reporters: " +
query_multiple_short(sort_array(query_all_reporters(), 0)) +
"\n";
ret += "$I$3=Setters : " +
(sizeof(query_all_setters())?
query_multiple_short(sort_array(query_all_setters(), 0)):"no one") +
"\n";
ret += "$I$3=Editors : " +
(sizeof(query_all_setters())?
query_multiple_short(sort_array(query_all_editors() - ({ query_owner() }), 0)):"no one") +
"\n";
ret += "$I$3=Sponsors : " +
(sizeof(query_all_setters())?
query_multiple_short(sort_array(query_all_sponsors(), 0)):"no one") +
"\n";
ret += "\n$I$0=Sale Statistics:\n";
// Show the sale stats.
last_num = NEWSPAPER_HANDLER->query_last_edition_num(_paper_name);
for (i = last_num - 5; i <= last_num; i++) {
if (i >= 1) {
ret += "Edition " + i + " sold to " +
NEWSPAPER_HANDLER->query_edition_num_sold(_paper_name, i) +
" people.\n";
}
}
ret += "\n";
ret += "Using Bank : " + _bank_branch + "\n";
write("$P$Status$P$" + ret);
return 1;
} /* do_reporters() */
/** @ignore yes */
int do_claim()
{
object badge;
object *deepinv;
object *inv;
if (_proxy) {
return _proxy->do_claim();
}
deepinv = deep_inventory(this_player()) + ({ this_player() });
inv = filter(deepinv, (: $1->query_paper_name() == query_paper_name() :));
if (sizeof(inv)) {
add_failed_mess
("You already have a set of credentials! Why would you "
"want another?\n");
return 0;
}
badge = clone_object(NEWSPAPER_PRESS_CREDITIALS);
badge->set_drop();
badge->set_paper_name(query_paper_name());
if (badge->move(this_player()) != MOVE_OK) {
badge->move(this_object());
tell_object(this_player(),
"The credentials are too heavy for you, so they fall "
"to the floor.\n");
}
badge->reset_drop();
log_file(query_log_file_name(),
"On " + ctime(time()) + " " + this_player()->query_short() +
" claimed some new credentials.\n");
add_succeeded_mess(({ "A new set of credentials appear from thin air, as "
"if by magic!\n",
"$N $V a set of credentials.\n" }));
return 1;
}
/** @ignore yes */
int do_publish(string headline)
{
class our_article* bing;
if (_proxy) {
return _proxy->do_publish(headline);
}
bing = filter(_articles, (: !$1->flags & NEWSPAPER_POSTPONE_FLAG :));
if (!sizeof(bing)) {
add_failed_mess("You cannot publish with no articles!\n");
return 0;
}
write("Do you wish to publish this edition with a headline of:\n" +
headline + "\nResponse [y/n]? ");
add_succeeded_mess("");
input_to("really_publish", 0, headline);
return 1;
} /* do_publish() */
/**
* This method figures out the total profit from the paper.
*/
int query_total_profit(int num_articles) {
int last_pub;
int amount;
int edition;
int adds;
class advert data;
class our_article bing;
string text;
if (num_articles == -1) {
num_articles = 0;
foreach (bing in _articles) {
if (!(bing->flags & NEWSPAPER_POSTPONE_FLAG)) {
text = load_article_text(bing);
if (strlen(text) > 500) {
num_articles++;
}
}
}
}
foreach (data in _adverts) {
adds += data->value;
}
edition = NEWSPAPER_HANDLER->query_last_edition_num(_paper_name);
last_pub = NEWSPAPER_HANDLER->query_edition_date(_paper_name, edition);
// Work out the amount based on how many much money they were sold for.
amount = NEWSPAPER_HANDLER->query_edition_num_sold(_paper_name, edition) * 100;
// First we scale it based on the number of articles. Ignore number of
// articles.
//amount = (amount * num_articles * 400) / 14;
amount = amount * 400 + adds;
// Next we decrease it based on the time since the last edition.
if ((time() - last_pub) < 42 * 24 * 60 * 60) {
return amount;
}
last_pub = (time() - last_pub) - 42 * 24 * 60 * 60;
last_pub = last_pub / (24 * 60 * 60);
amount = ( amount / 150 ) * (150 - last_pub);
return amount + _owner_extra_cash;
} /* query_total_profit() */
/** @ignore yes */
void really_publish(string char, string headline)
{
int article_count;
int amount;
int total;
string *things;
string temp;
class article* to_publish;
string* text;
class our_article bing;
class payee_data data;
string stuff;
string place;
int i;
int editor_bonus;
int num_editors;
place = query_property("place");
char = lower_case(char);
things = ({ });
if (strlen(char) && char[0] == 'y') {
tell_object(this_player(),
"Okay, warm up the frogs, let's see if everything is "
"sorted out.\n");
} else {
tell_object(this_player(), "Okay, publishing aborted.\n");
return 0;
}
to_publish = ({ });
text = ({ });
foreach (bing in _articles) {
if (!(bing->flags & NEWSPAPER_POSTPONE_FLAG)) {
to_publish += ({ copy(bing->art) });
text += ({ load_article_text(bing) });
if (strlen(text[<1]) > 500) {
article_count++;
}
}
}
amount = query_total_profit(article_count);
foreach (temp, data in _payees) {
total += data->paid;
}
num_editors = sizeof(query_all_editors() - ({ query_owner() }));
editor_bonus = (amount * 5 / 100) / num_editors;
total += (amount * 5 / 100) * num_editors;
//total += sizeof(query_all_editors() - ({ query_owner() })) *
// amount * 5 / 100;
if (amount < total) {
add_failed_mess("You have allocated paying your reporters " + total +
" when you only have " + amount + " total profit.\n");
return 0;
}
if (!NEWSPAPER_HANDLER->publish_paper(query_paper_name(),
headline,
to_publish,
text,
_adverts,
query_all_editors())) {
tell_object(this_player(), "There was an error making the new issue!\n");
return ;
}
_adverts = ({ });
_owner_extra_cash = 0;
stuff = "Edition summary.\nArticles posted:\n";
foreach (bing in _articles) {
if (!(bing->flags & NEWSPAPER_POSTPONE_FLAG)) {
stuff += bing->art->title + " by " + bing->art->shown_name + "\n";
// Delete it!
delete_article(bing);
}
}
_articles = filter(_articles, (: $1->flags & NEWSPAPER_POSTPONE_FLAG :));
stuff += "\nTotal profit " +
MONEY_HAND->money_value_string(amount, place) +
".\n";
// Split it up.
BANK_HANDLER->adjust_account(query_owner(), query_bank_branch(),
(amount - total));
amount = editor_bonus;
if (sizeof(query_all_editors() - ({ query_owner() })) > 0) {
stuff += "\nEditors bonus " +
query_multiple_short(query_all_editors() - ({ query_owner() })) +
" paid " +
MONEY_HAND->money_value_string(amount, place) + "each.\n";
foreach (temp in query_all_editors()) {
if (temp != query_owner()) {
BANK_HANDLER->adjust_account(temp, query_bank_branch(),
(amount));
_reporters[temp]->total_payed += amount;
}
}
}
stuff += "\nReporters paid:\n";
foreach (temp, data in _payees) {
BANK_HANDLER->adjust_account(temp, query_bank_branch(), data->paid);
if (is_reporter(temp)) {
_reporters[temp]->total_payed += data->paid;
stuff += temp + " " +
MONEY_HAND->money_value_string(data->paid, place) + ".\n";
i++;
call_out((: AUTO_MAILER->auto_mail($1, $2, $3, $4, $5) :), i * 4,
temp,
this_object()->query_short(),
"Payment for new edition.",
"",
"A new edition has been released and "
"you have been paid!\n\n"
"For your work on the newspaper you "
"have been paid " +
MONEY_HAND->money_value_string(data->paid, place) +
".\n\n" +
(data->message?data->message:"") );
}
}
// Send this mail to the editors and the owner.
call_out((: AUTO_MAILER->auto_mail($1, $2, $3, $4, $5) :), i * 4,
implode(query_all_editors(), ","),
this_object()->query_short(),
"Published new edition.",
implode(query_all_editors(), ","),
stuff);
log_file(query_log_file_name(),
"On " + ctime(time()) + " " + this_player()->query_short() +
" published an edition of " + query_the_paper_name() + ".\n");
_published_time = time();
_payees = ([ ]);
rename(query_article_log_file_name(),
_save_dir + "article" + query_current_edition() + ".log");
save_me();
write("$P$Summary$P$" +
"The pages have been sent to the printery, and another "
"edition of " + query_the_paper_name() +
" is about to hit the streets! You feel rather "
"impressed with your efforts.\n\n" + stuff);
return;
} /* really_publish() */
/** @ignore yes */
int do_summary() {
int amount;
int adds;
string person;
int total;
class our_article bing;
class payee_data payee_data;
string text;
string ret;
int article_count;
string place;
class advert data;
int i;
int last_num;
int num_editors;
int editor_bonus;
if (_proxy) {
return _proxy->do_summary();
}
ret = "";
// Show the sale stats.
last_num = NEWSPAPER_HANDLER->query_last_edition_num(_paper_name);
for (i = last_num - 5; i <= last_num; i++) {
if (i >= 1) {
ret += "Edition " + i + " sold to " +
NEWSPAPER_HANDLER->query_edition_num_sold(_paper_name, i) +
" people.\n";
}
}
ret += "\n";
place = query_property("place");
foreach (bing in _articles) {
if (!(bing->flags & NEWSPAPER_POSTPONE_FLAG)) {
text = load_article_text(bing);
if (strlen(text) > 500) {
article_count++;
}
}
}
ret += "Article count of " + article_count + "\n";
if (!_adverts) {
_adverts = ({ });
}
foreach (data in _adverts) {
adds += data->value;
}
amount = query_total_profit(article_count);
foreach (person, payee_data in _payees) {
total += payee_data->paid;
}
num_editors = sizeof(query_all_editors() - ({ query_owner() }));
editor_bonus = (amount * 5 / 100) / num_editors;
total += editor_bonus * num_editors;
ret += "Using Bank : " + _bank_branch + "\n";
ret += "Total Profit: " +
MONEY_HAND->money_value_string(amount, place) +
", total editor bonus " +
MONEY_HAND->money_value_string(editor_bonus * num_editors, place) +
", total paid to reporters " +
MONEY_HAND->money_value_string(total, place) +
", profit from adverts " +
MONEY_HAND->money_value_string(adds, place) +
(_owner_extra_cash > 0 ?
", " + MONEY_HAND->money_value_string(_owner_extra_cash, place) +
" extra added by the owner":"") +
".\n\n";
ret += "Owner/Editors:\n";
ret += " " + query_owner() + " " +
MONEY_HAND->money_value_string((amount - total), place) +
" (owner)\n";
ret += "Reporters:\n";
foreach (person, payee_data in _payees) {
if (!is_editor(person)) {
ret += "$I$6= " + person + " " +
MONEY_HAND->money_value_string(payee_data->paid, place) +
(payee_data->message?" " + payee_data->message:"") + ".\n";
}
}
ret += "$I$0=Editor Bonuses:\n";
foreach (person in query_all_editors()) {
if (person != query_owner()) {
if (!_payees[person]) {
_payees[person] = new(class payee_data);
}
ret += " " + person + " " +
MONEY_HAND->money_value_string(editor_bonus, place) +
" Total " +
MONEY_HAND->money_value_string((editor_bonus + _payees[person]->paid), place) +
"\n";
}
}
write("$P$Profits$P$" + ret);
return 1;
} /* do_summary() */
/** @ignore yes */
int do_deposit(string amt) {
int amt_int;
string place;
if (_proxy) {
return _proxy->do_deposit(amt);
}
if (this_player()->query_name() != query_owner()) {
add_failed_mess("Only the owner can do this.\n");
return 0;
}
place = query_property("place");
amt_int = MONEY_HAND->value_from_string(amt, place);
if (amt_int <= 0) {
add_failed_mess("The amount " + amt + " is invalid.\n");
return 0;
}
// See if the owner has the right amount in the bank.
if (BANK_HANDLER->query_account(this_player()->query_name(), query_bank_branch()) <
amt_int) {
add_failed_mess("You do not have " +
MONEY_HAND->money_value_string(amt_int, place) +
" in " + query_bank_branch() + ".\n");
return 0;
}
_owner_extra_cash += amt_int;
save_me();
BANK_HANDLER->adjust_account(this_player()->query_name(), _bank_branch, -amt_int);
add_succeeded_mess(({ "$N deposit " +
MONEY_HAND->money_value_string(amt_int, place) +
" for extra cash to pay reporters.\n",
"$N deposits some extra cash for reporters.\n" }));
return 1;
} /* do_deposit() */
/** @ignore yes */
int do_set_bank_branch(string branch)
{
string* accounts;
if (_proxy) {
return _proxy->do_set_bank_branch(branch);
}
accounts = BANK_HANDLER->query_accounts(this_player()->query_name());
if (member_array(branch, accounts) == -1) {
add_failed_mess("You need to specify a bank you have an account "
"with: " + query_multiple_short(accounts) +
".\n");
return 0;
}
_bank_branch = branch;
save_me();
add_succeeded_mess("$N set$s the bank branch to " + branch + ".\n");
return 1;
} /* do_set_bank_branch() */
/** @ignore yes */
int do_pay(string person,
string amt)
{
string place;
string fluff;
int amount;
int profit;
int total;
class payee_data data;
if (_proxy) {
return _proxy->do_pay(person, amt);
}
place = query_property("place");
if (amt == "none" || amt == "0") {
amount = 0;
} else {
amount = MONEY_HAND->value_from_string(amt, place);
if (amount <= 0) {
add_failed_mess("Sorry, you must pay reporters a "
"positive amount.\n");
return 0;
}
}
if (!is_reporter(person)) {
add_failed_mess("There is nobody by that name currently employed at " +
query_the_paper_name() + "!\n");
return 0;
}
if (person == query_owner()) {
add_failed_mess("The owner gets paid anyway.\n");
return 0;
}
profit = query_total_profit(-1);
profit = profit * 95 / 100;
foreach (fluff, data in _payees) {
total += data->paid;
}
if (profit - total - amount < 0) {
add_failed_mess("You are not making enough money to pay " +
person + " " +
MONEY_HAND->money_value_string(amount, place) +
".\n");
return 0;
}
if (!_payees[person]) {
_payees[person] = new(class payee_data);
}
_payees[person]->paid = amount;
if (_payees[person]->paid < 0) {
add_succeeded_mess(({ "You can't pay anybody less than nothing! "
"Amount owing reset to nothing.\n", "" }));
map_delete(_payees, person);
save_me();
return 1;
}
if (!_payees[person]->paid) {
add_succeeded_mess(({ "Ok, amount owing set to nothing.\n", "" }));
map_delete(_payees, person);
save_me();
return 1;
}
add_succeeded_mess(({ "Ok, " + capitalize(person) + " will be paid a "
"total of " +
MONEY_HAND->money_value_string(_payees[person]->paid, place) +
" for this edition.\n", "" }));
// Do the payment when the issue is done.
save_me();
return 1;
} /* do_pay() */
/** @ignore yes */
int do_pay_tag(string person,
string tag)
{
if (_proxy) {
return _proxy->do_pay_tag(person, tag);
}
if (tag == "none") {
tag = 0;
}
if (!is_reporter(person)) {
add_failed_mess("There is nobody by that name currently employed at " +
query_the_paper_name() + "!\n");
return 0;
}
if (person == query_owner()) {
add_failed_mess("The owner gets paid anyway.\n");
return 0;
}
if (!_payees[person]) {
add_failed_mess("You can only set a reason for someone who is "
"being paid.\n");
return 0;
}
_payees[person]->message = tag;
if (!tag) {
add_succeeded_mess(({ "You remove the message from " +
capitalize(person) + ".\n", "" }));
} else {
add_succeeded_mess(({ "You set a message to " + capitalize(person) +
" of " + tag + ".\n", "" }));
}
// Do the payment when the issue is done.
save_me();
return 1;
} /* do_pay() */
/** @ignore yes */
int do_title(string id, string title)
{
class our_article art;
if (_proxy) {
return _proxy->do_title(id, title);
}
art = query_article(id);
if (!art) {
add_failed_mess("The article you wish to edit doesn't exist!\n");
return 0;
}
if (!is_editor(this_player()->query_name()) &&
!is_setter(this_player()->query_name()) &&
lower_case(art->art->author) != this_player()->query_name()) {
add_failed_mess("You can only edit your own articles.\n");
return 0;
}
art->art->title = title;
save_me();
add_succeeded_mess(({ "You set the title to " + title + ".\n",
"$N sets the title of an article.\n" }));
return 1;
} /* do_title() */
/** @ignore yes */
int do_author(string id, string author)
{
class our_article art;
if (_proxy) {
return _proxy->do_author(id, author);
}
art = query_article(id);
if (!art) {
add_failed_mess("The article you wish to edit doesn't exist!\n");
return 0;
}
if (!is_editor(this_player()->query_name()) &&
!is_setter(this_player()->query_name()) &&
lower_case(art->art->author) != this_player()->query_name()) {
add_failed_mess("You can only edit your own articles.\n");
return 0;
}
art->art->shown_name = author;
save_me();
add_succeeded_mess(({ "You set the author to " + author + ".\n",
"$N sets the author of an article.\n" }));
return 1;
} /* do_author() */
/** @ignore yes */
int do_change(string id, string type)
{
class our_article art;
if (_proxy) {
return _proxy->do_change(id, type);
}
art = query_article(id);
if (!art) {
add_failed_mess("The article you wish to edit doesn't exist!\n");
return 0;
}
if (!is_editor(this_player()->query_name()) &&
!is_setter(this_player()->query_name()) &&
lower_case(art->art->author) != this_player()->query_name()) {
add_failed_mess("You can only edit your own articles.\n");
return 0;
}
if (type == "html") {
art->art->type = NEWSPAPER_ARTICLE_TYPE_HTML | a_flags(art->art->type);
} else {
art->art->type = NEWSPAPER_ARTICLE_TYPE_PLAIN | a_flags(art->art->type);
}
save_me();
unguarded( (: rm(_save_dir + $(art->art->file_name) + ".proc" ) :) );
unguarded( (: rm(_save_dir + $(art->art->file_name) + ".nroff.o" ) :) );
add_succeeded_mess(({ "You set the article type to " + type + ".\n",
"$N sets the type of an article.\n" }));
return 1;
} /* do_author() */
/** @ignore yes */
int do_change_xp(string id, string type)
{
class our_article art;
if (_proxy) {
return _proxy->do_change_xp(id, type);
}
art = query_article(id);
if (!art) {
add_failed_mess("The article you wish to edit doesn't exist!\n");
return 0;
}
if (!is_editor(this_player()->query_name())) {
add_failed_mess("Only the editors can do this.\n");
return 0;
}
if (type == "none") {
art->art->type |= NEWSPAPER_ARTICLE_NO_XP_FLAG;
} else {
art->art->type &= ~NEWSPAPER_ARTICLE_NO_XP_FLAG;
}
save_me();
add_succeeded_mess(({ "You set the article xp return to " + type + ".\n",
"$N sets the xp return of an article.\n" }));
return 1;
} /* do_author() */
/** @ignore yes */
int do_change_colour(string id, string colour)
{
class our_article art;
if (_proxy) {
return _proxy->do_change_colour(id, colour);
}
art = query_article(id);
if (!art) {
add_failed_mess("The article you wish to edit doesn't exist!\n");
return 0;
}
if (!is_editor(this_player()->query_name()) &&
!is_setter(this_player()->query_name()) &&
lower_case(art->art->author) != this_player()->query_name()) {
add_failed_mess("You can only edit your own articles.\n");
return 0;
}
if (colour != "none") {
art->art->colour = upper_case(colour);
} else {
art->art->colour = 0;
}
save_me();
add_succeeded_mess(({ "You set the article colour to " + colour + ".\n",
"$N sets the colour of an article.\n" }));
return 1;
} /* do_author() */
/** @ignore yes */
int do_editing(string id)
{
class our_article art;
string contents;
if (_proxy) {
return _proxy->do_editing(id);
}
if (_locked) {
add_failed_mess("The newspaper office is currently locked for "
"submissions.\n");
return 0;
}
art = query_article(id);
if (!art) {
add_failed_mess("The article you wish to edit doesn't exist!\n");
return 0;
}
if (!is_editor(this_player()->query_name()) &&
lower_case(art->art->author) != this_player()->query_name()) {
add_failed_mess("You can only edit your own articles.\n");
return 0;
}
if (art->flags & NEWSPAPER_LOCK_FLAG) {
add_failed_mess("This article is locked.\n");
return 0;
}
contents = load_article_text(art);
add_succeeded_mess("");
this_player()->do_edit(contents, "finish_editing", this_object(), 0, art);
return 1;
} /* do_editing() */
/**
* This method moves an article up or down in the current article list.
* @param index the index of the article to move
* @param up_down move it up or down
*/
int move_article(int index, string up_down) {
class our_article womble;
if (index == -1) {
return 0;
}
womble = _articles[index];
if (up_down == "up") {
if (index > 0) {
_articles = _articles[0..index - 1] + _articles[index+1..];
_articles = _articles[0..index - 2] + ({ womble }) +
_articles[index - 1..];
save_me();
} else {
return 0;
}
} else {
if (index < sizeof(_articles) - 1) {
_articles = _articles[0..index - 1] + _articles[index+1..];
_articles = _articles[0..index] + ({ womble }) +
_articles[index + 1..];
save_me();
} else {
return 0;
}
}
return 1;
}
/** @ignore yes */
int do_move(string article, string up_down) {
int index;
class our_article womble;
if (_proxy) {
return _proxy->do_move(article, up_down);
}
index = query_article_index(article);
if (index == -1) {
add_failed_mess("Article reference " + index + " is out of bounds.\n");
return 0;
}
womble = _articles[index];
if (!move_article(index, up_down)) {
add_failed_mess("Unable to move the article.\n");
return 0;
}
add_succeeded_mess(({ "You moved the article " + womble->art->title + " " +
up_down + ".\n", "" }));
return 1;
}
/** @ignore yes */
int do_move_pos(string article, string pos) {
int index;
int to_index;
class our_article womble;
if (_proxy) {
return _proxy->do_move_pos(article, pos);
}
index = query_article_index(article);
if (index == -1) {
add_failed_mess("Article reference " + index + " is out of bounds.\n");
return 0;
}
to_index = query_article_index(pos);
if (to_index == -1) {
add_failed_mess("Article reference " + pos + " is out of bounds.\n");
return 0;
}
if (to_index == index) {
add_failed_mess("You cannot move the article there, it is already "
"there.\n");
return 0;
}
womble = _articles[index];
if (index < to_index) {
_articles = _articles[0..index - 1] + _articles[index + 1..to_index] +
({ _articles[index] }) + _articles[to_index+1..];
} else {
_articles = _articles[0..to_index - 1] +
({ _articles[index] }) +
_articles[to_index..index - 1] +
_articles[index+1..];
}
save_me();
add_succeeded_mess(({ "You moved the article " + womble->art->title +
" to " + pos + ".\n", "" }));
return 1;
}
/** @ignore yes */
int do_postpone(string id, string on_off) {
class our_article art;
if (_proxy) {
return _proxy->do_postpone(id, on_off);
}
art = query_article(id);
if (!art) {
add_failed_mess("The article reference " + id + " does not exist.\n");
return 0;
}
if (on_off == "on") {
art->flags |= NEWSPAPER_POSTPONE_FLAG;
add_succeeded_mess(({ "You postpone the article " + art->art->title +
" to a later issue.\n",
"" }));
} else {
art->flags &= ~NEWSPAPER_POSTPONE_FLAG;
add_succeeded_mess(({ "You unpostpone the article " + art->art->title +
" so it will be in this issue.\n",
"" }));
}
save_me();
return 1;
} /* do_postpone() */
/** @ignore yes */
int do_lock_article(string id, string on_off) {
class our_article art;
if (_proxy) {
return _proxy->do_lock_article(id, on_off);
}
art = query_article(id);
if (!art) {
add_failed_mess("The article reference " + id + " does not exist.\n");
return 0;
}
if (on_off == "on") {
art->flags |= NEWSPAPER_LOCK_FLAG;
add_succeeded_mess(({ "You lock the article " + art->art->title +
".\n",
"" }));
} else {
art->flags &= ~NEWSPAPER_LOCK_FLAG;
add_succeeded_mess(({ "You unlock the article " + art->art->title +
".\n",
"" }));
}
save_me();
return 1;
} /* do_lock() */
/** @Ignore yes */
int do_category_list() {
string ret;
string place;
string name;
class category_data data;
if (_proxy) {
return _proxy->do_category_list();
}
if (!sizeof(_category)) {
add_failed_mess("There are no categories.\n");
return 0;
}
ret = "";
place = query_property("place");
foreach (name, data in _category) {
ret += "$I$5=" + name + " costs ";
if (data->cost_per_add) {
ret += MONEY_HAND->money_value_string(data->cost_per_add, place);
} else {
ret += "nothing";
}
ret += " per add and ";
if (data->cost_per_ten_chars) {
ret += MONEY_HAND->money_value_string(data->cost_per_ten_chars,
place);
} else {
ret += "nothing";
}
ret += " for every ten characters.";
if (!data->open) {
ret += " The category is currently closed.\n";
} else {
ret += "\n";
}
}
write("$P$Category$P$" + ret);
return 1;
} /* do_category_list() */
/** @Ignore yes */
int do_advert_list() {
string ret;
string place;
class advert data;
int editor;
int found;
int pos;
if (_proxy) {
return _proxy->do_advert_list();
}
if (!sizeof(_adverts)) {
add_failed_mess("There are no adverts.\n");
return 0;
}
ret = "";
place = query_property("place");
editor = is_editor(this_player()->query_name());
pos = 1;
foreach (data in _adverts) {
if (editor ||
lower_case(data->author) == this_player()->query_name()) {
if (editor) {
ret += "$I$5=" + pos + ") ";
} else {
ret += "$I$5=";
}
ret += data->author + " cost " +
MONEY_HAND->money_value_string(data->value, place) +
" written at " + ctime(data->date_written) + ":\n" +
data->text + "\n";
found = 1;
}
pos++;
}
if (!found) {
add_failed_mess("There are no adverts.\n");
return 0;
}
write("$P$Category$P$" + ret);
return 1;
} /* do_advert_list() */
/** @ignore yes */
int do_advert_remove(int id) {
class advert fluff;
if (_proxy) {
return _proxy->do_advert_remove(id);
}
if (!sizeof(_adverts)) {
add_failed_mess("There are no adverts.\n");
return 0;
}
if (!is_editor(this_player()->query_name())) {
add_failed_mess("You must be an editor to remove adverts.\n");
return 0;
}
if (id < 1 || id > sizeof(_adverts)) {
add_failed_mess("The id " + id + " is invalid.\n");
return 0;
}
fluff = _adverts[id - 1];
_adverts = _adverts[0..id-2] + _adverts[id..];
add_succeeded_mess("$N remove$s an advert by " + fluff->author + ".\n");
return 1;
} /* do_advert_remove() */
/** @Ignore yes */
int do_category_remove(string category) {
if (_proxy) {
return _proxy->do_category_remove(category);
}
category = query_category(category);
if (!category) {
add_failed_mess("You must have a category to delete it.\n");
return 0;
}
if (sizeof(filter(_adverts, (: $1->category == $2 :), category))) {
add_failed_mess("You have adverts in that category, you cannot "
"remove it.\n");
return 0;
}
map_delete(_category, category);
save_me();
add_succeeded_mess(({ "You delete the category " + category + ".\n",
"" }));
return 1;
} /* do_category_remove() */
/** @Ignore yes */
int do_category_add(string category) {
string new_category;
if (_proxy) {
return _proxy->do_category_add(category);
}
new_category = query_category(category);
if (new_category) {
add_failed_mess("You must have a category to delete it.\n");
return 0;
}
_category[category] = new(class category_data,
open : 0,
cost_per_add : 40,
cost_per_ten_chars : 40);
save_me();
add_succeeded_mess(({ "You add the category " + category + ".\n",
"" }));
return 1;
} /* do_category_add() */
/** @Ignore yes */
int do_category_open(string category, string open) {
if (_proxy) {
return _proxy->do_category_open(category, open);
}
category = query_category(category);
if (!category) {
add_failed_mess("You must have a category to delete it.\n");
return 0;
}
_category[category]->open = open == "open";
save_me();
add_succeeded_mess(({ "You " + open + " the category " + category + ".\n",
"" }));
return 1;
} /* do_category_open() */
/** @Ignore yes */
int do_category_cost(string category, string cost) {
int value;
string place;
if (_proxy) {
return _proxy->do_category_cost(category, cost);
}
category = query_category(category);
if (!category) {
add_failed_mess("You must change a cost for a category.\n");
return 0;
}
place = query_property("place");
if (lower_case(cost) == "none") {
value = 0;
} else {
value = MONEY_HAND->value_from_string(cost, place);
if (!value) {
add_failed_mess("The value " + cost + " is not a valid money "
"value.\n");
return 0;
}
}
_category[category]->cost_per_add = value;
save_me();
add_succeeded_mess(({ "You set the cost per add in category " +
category + " to " +
MONEY_HAND->money_value_string(value, place) +
".\n",
"" }));
return 1;
} /* do_category_cost() */
/** @Ignore yes */
int do_category_cost_per_ten_chars(string category, string cost) {
int value;
string place;
if (_proxy) {
return _proxy->do_category_cost_per_ten_chars(category, cost);
}
category = query_category(category);
if (!category) {
add_failed_mess("You must change a cost for a category.\n");
return 0;
}
place = query_property("place");
if (lower_case(cost) == "none") {
value = 0;
} else {
value = MONEY_HAND->value_from_string(cost, place);
if (!value) {
add_failed_mess("The value " + cost + " is not a valid money "
"value.\n");
return 0;
}
}
_category[category]->cost_per_ten_chars = value;
save_me();
add_succeeded_mess(({ "You set the cost per ten characters in category " +
category + " to " +
MONEY_HAND->money_value_string(value, place) +
".\n",
"" }));
return 1;
} /* do_category_cost_per_ten_chars() */
/** @ignore yes */
int do_submit_section(string name) {
class our_article cur_art;
if (_proxy) {
return _proxy->do_submit_section(name);
}
if (_locked) {
add_failed_mess("The newspaper office is currently locked.\n");
return 0;
}
cur_art = new(class our_article);
cur_art->art = new(class article);
cur_art->art->title = name;
cur_art->art->shown_name = this_player()->query_name();
cur_art->art->author = this_player()->query_name();
cur_art->art->date_written = time();
cur_art->art->type = NEWSPAPER_ARTICLE_TYPE_SECTION;
_articles += ({ cur_art });
save_me();
add_succeeded_mess("$N $V a section.\n");
return 1;
} /* do_submit_section() */
/** @Ignore yes */
int do_submit_add(string category) {
if (_proxy) {
return _proxy->do_submit_add(category);
}
if (_locked) {
add_failed_mess("The newspaper office is currently locked.\n");
return 0;
}
category = query_category(category);
if (!category) {
add_failed_mess("You must specify an existing category to "
"submit an add in.\n");
return 0;
}
if (!_category[category]->open) {
add_failed_mess("The category must be open to submit an add "
"for it.\n");
return 0;
}
add_succeeded_mess(({ "", "$N starts submiting an add to " +
this_object()->the_short() +
".\n" }));
write("Please submit the text of your add:\n");
this_player()->do_edit(0, "finish_add", this_object(), 0, category);
//input_to("finish_add", 0, category)category;
return 1;
} /* do_submit_add() */
/** @Ignore yes */
int do_lock(int locked) {
if (_proxy) {
return _proxy->do_lock(locked);
}
_locked = locked;
if (_locked) {
add_succeeded_mess("$N lock$s " + this_object()->the_short() + ".\n");
} else {
add_succeeded_mess("$N unlock$s " + this_object()->the_short() + ".\n");
}
return 1;
} /* do_lock() */
/** @ignore yes */
void finish_add(string str, string category) {
int value;
string place;
if (!str || !strlen(str)) {
write("Ok, Aborted writing an add.\n");
return ;
}
if (is_sponsor(this_player()->query_name())) {
write("You add in the category " + category + " with a text of:\n" +
str + "\n\nThis will cost you nothing since you are a sponsor.\n"
", do you want to do this? ");
input_to("confirm_add", 0, str, category, 0);
} else {
place = query_property("place");
value = _category[category]->cost_per_add +
_category[category]->cost_per_ten_chars * strlen(str) / 10;
if (this_player()->query_value_in(place) < value) {
write("You add in the category " + category + " with a text of:\n" +
str + "\n\nThis will cost you " +
MONEY_HAND->money_value_string(value, place) +
", but you do not have enough money! Sorry.\n");
} else {
write("You add in the category " + category + " with a text of:\n" +
str + "\n\nThis will cost you " +
MONEY_HAND->money_value_string(value, place) +
", do you want to do this? ");
input_to("confirm_add", 0, str, category, value);
}
}
} /* finish_add() */
/** @ignore yes */
void confirm_add(string str, string text, string category, int value) {
class advert add;
string place;
int found;
class our_article bing;
if (!str || !strlen(str)) {
return 0;
}
if (lower_case(str)[0] != 'y') {
write("Ok, aborting.\n");
return ;
}
if (!is_sponsor(this_player()->query_name())) {
place = query_property("place");
if (this_player()->query_value_in(place) < value) {
add_failed_mess("You do not have " +
MONEY_HAND->money_value_string(value, place) +
" to pay for the add.\n");
return ;
}
this_player()->pay_money(MONEY_HAND->create_money_array(value, place),
place);
}
add = new(class advert);
add->author = this_player()->query_cap_name();
add->text = text;
add->category = category;
add->value = value;
add->date_written = time();
_adverts += ({ add });
foreach (bing in _articles) {
if (a_type(bing->art->type) == NEWSPAPER_ARTICLE_TYPE_ADVERTS) {
found = 1;
break;
}
}
if (!found) {
_articles += ({ new(class our_article,
art : new(class article,
title : "Adverts",
author : query_owner(),
shown_name : query_owner(),
date_written : time(),
type : NEWSPAPER_ARTICLE_TYPE_ADVERTS
)
) });
}
save_me();
write("Ok, your advertisement is added.\n");
} /* confirm_add() */
/** @ignore yes */
int finish_editing(string story, class our_article art)
{
if (!story) {
tell_object(this_player(), "Ok, no editing saved.\n");
return 0;
}
save_article_text(art, story);
log_file(query_article_log_file_name(),
"On " + ctime(time()) + " " + this_player()->query_short() +
" edited the story " + art->art->title + ".\n");
} /* finish_editing() */
/** @ignore yes */
int do_transfer_ownership(string new_owner) {
int value;
string place;
if (!is_owner(this_player()->query_name())) {
add_failed_mess("You must be the owner to transfer the ownership.\n");
return 0;
}
if (_proxy) {
add_failed_mess("You must be in the main office to transfer ownership.\n");
return 0;
}
if (!PLAYER_HANDLER->test_user(new_owner)) {
add_failed_mess("You must transfer ownership to someone that exists.\n");
return 0;
}
//
// Find out how much the paper cost inthe first place to demand that as
// a fee.
//
place = query_property("place");
value = HOUSING->query_value(base_name(this_object()));
if (this_player()->query_value_in(place) < value &&
BANK_HANDLER->query_account(this_player()->query_name(), query_bank_branch()) <
value) {
add_failed_mess("You need at least " +
MONEY_HAND->money_value_string(value, place) +
" to transfer the ownership, in hand or in the bank.\n");
return 0;
}
write("It will cost you " + MONEY_HAND->money_value_string(value, place) +
" in fees to transfer ownership to " +
new_owner + ".\nDo you want to do this? ");
input_to("check_transfer", 0, new_owner, value);
add_succeeded_mess("");
return 1;
}
/** @ignore yes */
void check_transfer(string test, string new_owner, int value) {
string place;
test = lower_case(test);
if (!strlen(test) || test[0] != 'y') {
write("Aborted.\n");
return 0;
}
// Check the money again.
place = query_property("place");
if (this_player()->query_value_in(place) < value &&
BANK_HANDLER->query_account(this_player()->query_name(), query_bank_branch()) <
value) {
write("You need at least " +
MONEY_HAND->money_value_string(value, place) +
" to transfer the ownership.\n");
return 0;
}
// Do it.
if (this_player()->query_value_in(place) >= value ) {
this_player()->pay_money(MONEY_HAND->create_money_array(value, place), place);
} else {
BANK_HANDLER->adjust_account(this_player()->query_name(), query_bank_branch(), -value);
}
write("Transfering the ownership from " +
query_owner() + " to " + new_owner + ".\n");
HOUSING->set_owner(base_name(this_object()), new_owner);
}
/**
* This method returns all the current reporters of the magazine.
* @return all the current reporters
*/
string* query_all_reporters()
{
return keys(_reporters);
}
/**
* This method returns all the current setters of the magazine.
* @return all the current setters
*/
string* query_all_setters()
{
return copy(_setters);
}
/**
* This method returns all the current sponsors of the magazine.
* @return all the current sponsors
*/
string* query_all_sponsors()
{
return copy(_sponsors);
}
/**
* This method returns all the current editors of the magazine.
* @return all the current editors
*/
string* query_all_editors()
{
return _editors + ({ query_owner() });
}
/**
* This method returns all the current payees of the magazine.
* @return who is to be payed and how much
*/
mapping query_all_payees()
{
return copy(_payees);
}
/**
* This method returns the 'article' class bits of the articles.
* @return all the articles.\
*/
class article* query_all_articles() {
return map(_articles, (: copy($1->art) :) );
} /* query_all_articles() */
/**
* This method checks to see if the specified article is postponed
* or not.
* @param art the article to check
* @return 1 if it is postponed, 0 if not
*/
int is_postponed(class article art) {
class our_article rabbit;
foreach (rabbit in _articles) {
if (rabbit->art->file_name == art->file_name) {
return rabbit->flags & NEWSPAPER_POSTPONE_FLAG;
}
}
return 0;
} /* is_postponned() */
/**
* This method checks to see if the specified article is locked
* or not.
* @param art the article to check
* @return 1 if it is locked, 0 if not
*/
int is_locked(class article art) {
class our_article rabbit;
foreach (rabbit in _articles) {
if (rabbit->art->file_name == art->file_name) {
return rabbit->flags & NEWSPAPER_LOCK_FLAG;
}
}
return 0;
} /* is_locked() */
/**
* This method checks to see if the specified person is an reporter for
* the paper or not.
* @param word the person to check
* @return 1 if they are a reporter
*/
int is_reporter(string word)
{
if (_proxy) {
return _proxy->is_reporter(word);
}
return classp(_reporters[word]);
}
/**
* This method checks to see if the specified person is an setter for
* the paper or not.
* @param word the person to check
* @return 1 if they are a setter
*/
int is_setter(string word)
{
if (_proxy) {
return _proxy->is_setter(word);
}
return member_array(word, _setters) != -1;
}
/**
* This method checks to see if the specified person is a sponsor for
* the paper or not.
* @param word the person to check
* @return 1 if they are a sponsor
*/
int is_sponsor(string word)
{
if (_proxy) {
return _proxy->is_sponsor(word);
}
return member_array(word, _sponsors) != -1;
}
/**
* This method checks to see if the specified person is an editor for
* the paper or not.
* @param word the person to check
* @return 1 if they are a editor
*/
int is_editor(string word)
{
if (_proxy) {
return _proxy->is_editor(word);
}
if (master()->query_administrator(word)) {
return 1;
}
if (word == query_owner()) {
return 1;
}
return member_array(word, _editors) != -1;
}
/**
* This method checks to see if the specified person is an owner of
* the paper or not.
* @param word the person to check
* @return 1 if they are a owner
*/
int is_owner(string word)
{
if (_proxy) {
return _proxy->is_owner(word);
}
if (master()->query_administrator(word)) {
return 1;
}
if (word == query_owner()) {
return 1;
}
return 0;
}
/**
* This method adds a new reporter to the paper.
* @param word the new reporter to add
*/
void add_reporter(string word)
{
if (!_reporters[word]) {
_reporters[word] = new(class reporter);
_reporters[word]->date_added = time();
update_commands(word);
save_me();
}
} /* add_reporter() */
/**
* This method adds a new sponsor to the paper.
* @param word the new sponsor to add
*/
void add_sponsor(string word)
{
if (!is_sponsor(word)) {
_sponsors += ({ word });
update_commands(word);
save_me();
}
} /* add_sponsor() */
/**
* This method adds a new setter to the paper.
* @param word the new setter to add
*/
void add_setter(string word)
{
if (!is_setter(word)) {
if (!is_reporter(word)) {
add_reporter(word);
}
_setters += ({ word });
update_commands(word);
save_me();
}
} /* add_setter() */
/**
* This method adds a new editor to the paper.
* @param word the new editor to add
*/
void add_editor(string word)
{
if (!is_editor(word)) {
if (!is_reporter(word)) {
add_reporter(word);
}
_editors += ({ word });
update_commands(word);
save_me();
}
} /* add_editor() */
/**
* This method removes a reporter from the paper.
* @param word the reporter to remove
*/
void remove_reporter(string word)
{
if (!is_reporter(word)) {
return;
}
map_delete(_reporters, word);
update_commands(word);
save_me();
} /* remove_reporter() */
/**
* This method removes a editor from the paper.
* @param word the editor to remove
*/
void remove_editor(string word)
{
if (!is_editor(word)) {
return;
}
_editors -= ({ word });
update_commands(word);
save_me();
} /* remove_editor() */
/**
* This method removes a setter from the paper.
* @param word the setter to remove
*/
void remove_setter(string word)
{
if (!is_setter(word)) {
return;
}
_setters -= ({ word });
update_commands(word);
save_me();
} /* remove_setter() */
/*
* This method removes a sponsor from the paper.
* @param word the sponsor to remove
*/
void remove_sponsor(string word)
{
if (!is_sponsor(word)) {
return;
}
_sponsors -= ({ word });
save_me();
} /* remove_editor() */
/**
* This method moves the player in and out of the room to fix up their
* commands.
* @param word the player to move
*/
void update_commands(string word)
{
object player;
player = find_player(word);
if (player && environment(player) == this_object()) {
player->move("/room/void");
player->move(file_name(this_object()));
}
} /* update_commands() */
/**
* This method returns the current owner of the paper.
* @return the owner of the paper
*/
string query_owner() {
if (_proxy) {
return _proxy->query_owner();
}
return _owner;
} /* query_owner() */
/**
* This method sets the current owner of the paper.
* @param person the new owner
*/
void set_owner(string person) {
_owner = person;
save_me();
} /* set_owner() */
/**
* This method is called by the housing system when the ownership changes.
* @param old_owner the old owner
* @param new_owner the newowner
*/
void ownership_change(string old_owner, string new_owner) {
set_owner(new_owner);
}
/**
* This method sets up a proxy for the room. A proxy means all the commands
* are mirrored to the real location, so save files do not get messed up.
* You set this if you have any extra rooms you want to be able to control
* the paper.
* @param proxy the proxy to set
*/
void set_proxy(string proxy) {
_proxy = proxy;
} /* set_proxy() */
/**
* This method returns the proxy for this room.
* @return the proxy for the room
*/
string query_proxy() {
return _proxy;
} /* query_proxy() */
/**
* This method is here to control access to a board if one is requested.
* It allows only reporters to be able to see or write to it and it
* allows editors to be able to eat messages from it.
*/
int board_access_check(int type, string board, object previous, string name) {
switch (type) {
case B_ACCESS_READ :
return is_reporter(lower_case(name));
case B_ACCESS_WRITE :
return is_reporter(lower_case(name));
case B_ACCESS_DELETE :
// Players can always delete their own notes, do not need to code
// for that.
return is_editor(name);
}
} /* board_access_check() */
void init()
{
string person;
person = this_player()->query_name();
add_command("advert", "categories", (: do_category_list() :));
add_command("advert", "list", (: do_advert_list() :));
add_command("category", "list", (: do_category_list() :));
add_command("submit", "advert {in|to|into} <string'category'>",
(: do_submit_add($4[1]) :));
add_command("submit", "advert <string'category'>",
(: do_submit_add($4[0]) :));
if (!is_editor(person) && !is_reporter(person) && !is_setter(person)) {
add_command("apply", "", (: do_apply() :));
add_command("status", "", (: do_everyone_status() :));
return;
}
add_command("submit", "text <string:quoted'article name'> as <string'author'>",
(: do_submit($4[0], $4[1], 0) :));
add_command("submit", "html <string:quoted'article name'> as <string'author'>",
(: do_submit($4[0], $4[1], 1) :));
add_command("submit", "text <string'article name'>",
(: do_submit($4[0], 0, 0) :));
add_command("submit", "html <string'article name'>",
(: do_submit($4[0], 0, 1) :));
add_command("retrieve", "<string'article'>", (: do_retrieve($4[0], 0) :));
add_command("retrieve", "source <string'article'>",
(: do_retrieve($4[0], 1) :));
add_command("resign", "", (: do_resign() :));
add_command("status", "", (: do_status() :));
add_command("status", "room", (: do_status() :));
add_command("claim", "", (: do_claim() :));
add_command("articles", "", (: do_articles(0) :));
add_command("articles", "scroll", (: do_articles(1) :));
add_command("edit", "<string'article'>", (: do_editing($4[0]) :));
add_command("delete", "<string'article'>", (: do_delete($4[0]) :));
add_command("title", "<string'article'> <string'new title'>",
(: do_title($4[0], $4[1]) :));
add_command("author", "<string'article'> <string'new author name'>",
(: do_author($4[0], $4[1]) :));
add_command("change", "type of <string'article'> to {html|plain}",
(: do_change($4[0], $4[1]) :));
if (!is_setter(person) && !is_editor(person)) {
return;
}
add_command("change", "colour of <string'article'> to {red|blue|green|cyan|magenta|yellow|brown|none}",
(: do_change_colour($4[0], $4[1]) :));
add_command("move", "<string'article'> {up|down}",
(: do_move($4[0], $4[1]) :));
add_command("move", "<string'article'> to <string'position'>",
(: do_move_pos($4[0], $4[1]) :));
if (!is_editor(person)) {
return;
}
add_command("change", "xp [return] of <string'article'> to {none|normal}",
(: do_change_xp($4[0], $4[1]) :));
add_command("submit", "section <string'section name'>",
(: do_submit_section($4[0]) :));
add_command("add", "reporter <string'person'>", (: do_hire($4[0], 0) :));
add_command("add", "setter <string'person'>", (: do_hire($4[0], 1) :));
add_command("add", "editor <string'person'>", (: do_promote($4[0]) :));
add_command("add", "sponsor <string'person'>", (: do_sponsor_add($4[0]) :));
//add_command("promote", "<string'person'>", (: do_promote($4[0]) :));
add_command("remove", "editor <string'person'>", (: do_demote($4[0], 1) :));
add_command("remove", "setter <string'person'>", (: do_demote($4[0], 0) :));
add_command("remove", "reporter <string'person'>", (: do_dismiss($4[0]) :));
add_command("remove", "sponsor <string'person'>", (: do_sponsor_remove($4[0]) :));
add_command("log", "", (: do_logs(0) :));
add_command("log", "article", (: do_logs(1) :));
//add_command("unmark", "<string'article'>", (: do_unmark($4[0]) :));
add_command("pay", "bank branch <string'bank name'>",
(: do_set_bank_branch($4[0]) :));
add_command("pay", "<word'person'> <string'amount|none'>",
(: do_pay($4[0], $4[1]) :));
add_command("pay", "<word'person'> message <string'message|none'>",
(: do_pay_tag($4[0], $4[1]) :));
add_command("profit", "", (: do_summary() :));
add_command("profit", "deposit extra <string'cash'>",
(: do_deposit($4[0]) :));
add_command("postpone", "<string'article'> {on|off}",
(: do_postpone($4[0], $4[1]) :));
add_command("lock", "articles {on|off}", (: do_lock($4[0] == "on") :));
add_command("lock", "article <string'article'> {on|off}",
(: do_lock_article($4[0], $4[1]) :));
add_command("publish", "with headline <string'headline'>",
(: do_publish($4[0]) :));
add_command("category", "{open|close} <string'catgory'>",
(: do_category_open($4[1], $4[0]) :));
add_command("category", "add <string'catgory'>",
(: do_category_add($4[0]) :));
add_command("category", "remove <string'catgory'>",
(: do_category_remove($4[0]) :));
add_command("category", "cost <string'category'> per add <string'cost|none'>",
(: do_category_cost($4[0], $4[1]) :));
add_command("category", "cost <string'category'> per ten characters <string'cost|none'>",
(: do_category_cost_per_ten_chars($4[0], $4[1]) :));
add_command("advert", "remove <number'id'>", (: do_advert_remove($4[0]) :));
if (!is_owner(this_player()->query_name())) {
return ;
}
add_command("transfer", "paper ownership to <string'name'>",
(: do_transfer_ownership($4[0]) :));
} /* init() */
class advert* query_ads() { return _adverts; }