/**************************************************************************/
// offmoot.cpp - Offline mooting, Jarren
/***************************************************************************
* The Dawn of Time v1.69r (c)1997-2004 Michael Garratt *
* >> A number of people have contributed to the Dawn codebase, with the *
* majority of code written by Michael Garratt - www.dawnoftime.org *
* >> To use this source code, you must fully comply with the dawn license *
* in licenses.txt... In particular, you may not remove this copyright *
* notice. *
**************************************************************************/
#include "include.h"
#include "offmoot.h"
/**************************************************************************/
// semilocalized globals
OFFMOOT_DATA *offmoot_list;
sh_int OFFMOOT_TABLE_FLAGS;
/**************************************************************************/
// create offmoot GIO lookup table
GIO_START(OFFMOOT_DATA)
GIO_STRH(name, "Name ")
GIO_INTH(amount, "Amount ")
GIO_FINISH_STRDUP_EMPTY
/**************************************************************************/
// loads in the offmoot database
void load_offmoot_db(void)
{
logf("===Loading offmoot database from %s...", OFFMOOT_FILE);
GIOLOAD_LIST(offmoot_list, OFFMOOT_DATA, OFFMOOT_FILE);
log_string ("load_offmoot_db(): finished");
}
/**************************************************************************/
// saves the offmoot database
void save_offmoot_db( void)
{
logf("===save_offmoot_db(): saving offmoot database to %s", OFFMOOT_FILE);
GIOSAVE_LIST(offmoot_list, OFFMOOT_DATA, OFFMOOT_FILE, true);
}
/**************************************************************************/
// lists offmoots
void do_listmoot( char_data *ch, char *)
{
OFFMOOT_DATA *node;
int count;
ch->titlebar("-=PENDING MOOTS=-");
count=0;
for (node = offmoot_list; node; node= node->next)
{
ch->printlnf("`s%d> `MPlayer: `m%-16s `YAmount: `y%d",
++count, node->name, node->amount);
}
ch->println("\r\n`xAdmin type delmoot <moot_number> do dequeue a pending moot.");
ch->println(" or addmoot <player_name> <amount> to requeue a pending moot.");
}
/**************************************************************************************/
void do_delmoot( char_data *ch, char *argument )
{
OFFMOOT_DATA *node;
OFFMOOT_DATA *prevnode=NULL;
int target, count=1;
if(offmoot_list==NULL){
ch->println("There are no pending moots.");
return;
}
if(IS_NULLSTR(argument)){
ch->println("syntax: delmoot <moot_number>");
return;
};
if(!is_number(argument)){
ch->print("Argument to delmoot must be a number.");
return;
}
target=atoi(argument);
for (node=offmoot_list;node;node=node->next, ++count){
if(count==target)
break;
prevnode = node;
}
if(node==NULL){
ch->printf(0, "Pending moot not found.");
return;
}
ch->printf(0, "Moot #%d against %s for %d exp has been dequeued.\r\n",
target, node->name, node->amount);
free_string(node->name);
if(!prevnode){ // delete the head
offmoot_list = offmoot_list->next;
}else{
prevnode->next=node->next;
}
delete node;
save_offmoot_db();
}
/**************************************************************************************/
void do_addmoot(char_data *ch, char *argument)
{
char arg1[MIL], arg2[MIL];
int amount;
argument = one_argument(argument, arg1);
one_argument(argument, arg2);
if(!is_number(arg2)){
ch->print("syntax: addmoot <player_name> <amount>.");
return;
}
amount=atoi(arg2);
queue_moot(arg1, amount);
ch->printf(0, "Moot against %s for %d has been queued.", arg1, amount);
}
/**************************************************************************************/
void queue_moot(char * name, int amount){
OFFMOOT_DATA *node = new OFFMOOT_DATA;
node->name=str_dup(name);
node->amount = amount;
node->next=offmoot_list;
offmoot_list=node;
save_offmoot_db();
}
/**************************************************************************************/
void check_pending_moot(char_data *ch){
OFFMOOT_DATA *node=offmoot_list, *prevnode=NULL;
bool matched=false;
while(node){
//only award the moot if there is no moot currently in progress
if(!str_cmp(node->name, ch->name) && moot->moot_type<1){
//setup the moot
//special note: called_by and moot_victim are intentionally
//set to be the same as a flag so resolve_moot will know only
//to reward the player and not mess with noble's diplomacy.
moot->called_by=TRUE_CH(ch);
moot->moot_victim=TRUE_CH(ch);
moot->moot_victim_name=str_dup(node->name);
moot->moot_type=1;
moot->scope=node->amount;
moot->votes_for=1;
//use exsisting code to resolve it
resolve_moot();
moot->called_by=NULL;
moot->moot_victim=NULL;
free_string(moot->moot_victim_name);
moot->moot_type=0;
moot->scope=0;
moot->votes_for=0;
//get rid of the moot once it has been called...
free_string(node->name);
if(!prevnode){ // delete the head
offmoot_list = offmoot_list->next;
}else{
prevnode->next=node->next;
}
delete node;
matched=true;
if(!prevnode){
node=offmoot_list;
}else{
node=prevnode;
}
continue;
}
prevnode=node;
node=node->next;
}
if(matched){
save_offmoot_db();
}
}
/**************************************************************************************/