/**
* This is the method for fining someone in am. This handles keeping
* track fo the fines and the setup of fines. This punihshment needs to
* be inherited to work correctly.
* @author Pinkfish
* @started Thu Sep 21 14:35:32 PDT 2000
*/
#include <money.h>
#include <nomic_system.h>
#include <player_handler.h>
inherit "/std/room/inherit/punishment_inherit";
// 4 weeks timeout
#define TIMEOUT (4 * 7 * 24 * 60 * 60)
private mapping _fines;
private nosave string _money_area;
private nosave string _save_file;
class fine_type {
int paid;
int fines;
int last_touched;
}
void load_me();
void setup() {
_fines = ([ ]);
set_short("fine");
set_description_file(NOMIC_PUNISHMENT_DOCS_DIR + "fine");
seteuid(getuid());
load_me();
} /* setup() */
/** @ignore yes */
void load_me() {
if (_save_file) {
unguarded((: restore_object( _save_file ) :));
call_out("remove_old_fines", 2);
}
} /* load_me() */
/** @ignore yes */
void save_me() {
unguarded((: save_object( _save_file ) :));
} /* save_me() */
/**
* This method nips through the list of fines and removes any fines that
* are either for people that do not exist any more, or totals that are
* old.
*/
void remove_old_fines() {
class fine_type fine;
string player;
int changed;
foreach (player, fine in _fines) {
if (!PLAYER_HANDLER->test_user(player)) {
map_delete(_fines, player);
changed = 1;
}
if (sizeof(fine) == 2) {
fine = new(class fine_type, paid : fine->paid, fines : fine->fines,
last_touched : time());
_fines[player] = fine;
changed = 1;
}
if (fine->fines <= 0 && fine->last_touched + TIMEOUT < time()) {
map_delete(_fines, player);
changed = 1;
}
}
if (changed) {
save_me();
}
}
/**
* This method sets the money area of the fine.
* @param area the money area
*/
void set_money_area(string area) {
_money_area = area;
} /* set_money_area() */
/**
* This method returns the money area of the fine.
* @return the money area
*/
string query_money_area() {
return _money_area;
} /* query_money_area() */
/**
* This method sets the save file of the fines.
* @param fname the save file name
*/
void set_save_file(string fname) {
_save_file = fname;
} /* set_save_file() */
/**
* This method returns the save file of the fines.
* @return the save file name
*/
string query_save_file() {
return _save_file;
} /* query_save_file() */
//
// The punishment handle area
//
/**
* @ignore yes
*/
void start_punishment(string area,
class nomic_case the_case,
string type,
function finish) {
write("How much do you wish to fine " +
query_multiple_short(the_case->people) + "? ");
input_to("fine_amount", 0, area, the_case, type, finish);
} /* start_punishment() */
/** @ignore yes */
string query_short(string area,
class nomic_case the_case,
string type,
mixed data) {
return "fined " +
MONEY_HAND->money_value_string(data, _money_area);
} /* query_short() */
/**
* @ignore yes
*/
void fine_amount(string amt, string area, class nomic_case the_case,
string type, function finish) {
int value;
amt = lower_case(amt);
if (!strlen(amt) || amt[0] == 'q') {
write("Aborting the fine.\n");
return ;
}
//
// See if it has a value.
//
value = MONEY_HAND->value_from_string(amt, _money_area);
if (value <= 0) {
write("You did not specify a positive money value.\n");
write("How much do you wish to fine " +
query_multiple_short(the_case->people) + "? ");
input_to("fine_amount", 0, area, the_case, type, finish);
return ;
}
evaluate(finish, the_case, type, value);
} /* fine_amount() */
/**
* @ignore yes
*/
void complete_punishment(string area,
class nomic_case the_case,
string type,
mixed data) {
string person;
foreach (person in the_case->people) {
if (!_fines[person]) {
_fines[person] = new(class fine_type);
}
_fines[person]->fines += data;
_fines[person]->last_touched = time();
}
save_me();
return ;
} /* complete_punishment() */
/**
* @ignore yes
*/
void suspend_punishment(string area,
class nomic_case the_case,
string type,
mixed data) {
string person;
foreach (person in the_case->people) {
if (!_fines[person]) {
_fines[person] = new(class fine_type);
}
_fines[person]->fines -= data;
_fines[person]->last_touched = time();
}
save_me();
return ;
} /* suspend_punishment() */
//
// The fine control area.
//
/**
* This method pays a fine.
* @param person the person doing the payment
* @param amount the amount being paid
* @return 1 on success, 0 on failure
*/
int pay_fine(string person, int amount) {
if (_fines[person]) {
_fines[person]->paid += amount;
_fines[person]->last_touched = time();
save_me();
return 1;
}
return 0;
} /* pay_fine() */
/**
* This method figures out the current fine for the person.
* @param person the person to get the fine for
* @return the currently outstanding fines
*/
int query_current_fine(string person) {
if (_fines[person]) {
return _fines[person]->fines - _fines[person]->paid;
}
return 0;
} /* query_current_fine() */
/**
* This method figures out the current total fine for the person.
* @param person the person to get the fine for
* @return the currently outstanding fines
*/
int query_total_fine(string person) {
if (_fines[person]) {
return _fines[person]->fines;
}
return 0;
} /* query_total_fine() */
/**
* This method figures out the current total fine for the person.
* @param person the person to get the fine for
* @return the currently outstanding fines
*/
int query_total_payments(string person) {
if (_fines[person]) {
return _fines[person]->paid;
}
return 0;
} /* query_total_payments() */
/**
* This method returns the list of players that have outstanding fines
* in the fine handler.
* @return the list of players
*/
string* query_people_with_fines() {
return keys(_fines);
} /* query_people_with_fines() */