/***************************************************************************
* STAR WARS REALITY 1.0 *
*--------------------------------------------------------------------------*
* Star Wars Reality Code Additions and changes from the Smaug Code *
* copyright (c) 1997 by Sean Cooper *
* -------------------------------------------------------------------------*
* Starwars and Starwars Names copyright(c) Lucas Film Ltd. *
*--------------------------------------------------------------------------*
* SMAUG 1.0 (C) 1994, 1995, 1996 by Derek Snider *
* SMAUG code team: Thoric, Altrag, Blodkai, Narn, Haus, *
* Scryn, Rennard, Swordbearer, Gorog, Grishnakh and Tricops *
* ------------------------------------------------------------------------ *
* Merc 2.1 Diku Mud improvments copyright (C) 1992, 1993 by Michael *
* Chastain, Michael Quan, and Mitchell Tse. *
* Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer, *
* Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe. *
* ------------------------------------------------------------------------ *
* Bounty Hunter Module *
* ( and area capturing as well ) *
****************************************************************************/
#include <sys/types.h>
#include <ctype.h>
#include <stdio.h>
#include <string.h>
/* #include <stdlib.h> */
#include <time.h>
#include "mud.h"
BOUNTY_DATA *first_bounty;
BOUNTY_DATA *last_bounty;
BOUNTY_DATA *first_disintigration;
BOUNTY_DATA *last_disintigration;
void disintigration args( ( CHAR_DATA * ch, CHAR_DATA * victim, long amount ) );
void nodisintigration args( ( CHAR_DATA * ch, CHAR_DATA * victim, long amount ) );
int xp_compute( CHAR_DATA * ch, CHAR_DATA * victim );
void save_disintigrations( )
{
BOUNTY_DATA *tbounty;
FILE *fpout;
char filename[256];
sprintf( filename, "%s%s", SYSTEM_DIR, DISINTIGRATION_LIST );
fpout = fopen( filename, "w" );
if( !fpout )
{
bug( "FATAL: cannot open disintigration.lst for writing!\r\n", 0 );
return;
}
for( tbounty = first_disintigration; tbounty; tbounty = tbounty->next )
{
fprintf( fpout, "%s\n", tbounty->target );
fprintf( fpout, "%ld\n", tbounty->amount );
}
fprintf( fpout, "$\n" );
fclose( fpout );
}
bool is_disintigration( CHAR_DATA * victim )
{
BOUNTY_DATA *bounty;
for( bounty = first_disintigration; bounty; bounty = bounty->next )
if( !str_cmp( victim->name, bounty->target ) )
return TRUE;
return FALSE;
}
BOUNTY_DATA *get_disintigration( char *target )
{
BOUNTY_DATA *bounty;
for( bounty = first_disintigration; bounty; bounty = bounty->next )
if( !str_cmp( target, bounty->target ) )
return bounty;
return NULL;
}
void load_bounties( )
{
FILE *fpList;
char *target;
char bountylist[256];
BOUNTY_DATA *bounty;
long int amount;
first_disintigration = NULL;
last_disintigration = NULL;
log_string( "Loading disintigrations..." );
sprintf( bountylist, "%s%s", SYSTEM_DIR, DISINTIGRATION_LIST );
if( ( fpList = fopen( bountylist, "r" ) ) == NULL )
{
perror( bountylist );
exit( 1 );
}
for( ;; )
{
target = feof( fpList ) ? "$" : fread_word( fpList );
if( target[0] == '$' )
break;
CREATE( bounty, BOUNTY_DATA, 1 );
LINK( bounty, first_disintigration, last_disintigration, next, prev );
bounty->target = STRALLOC( target );
amount = fread_number( fpList );
bounty->amount = amount;
}
fclose( fpList );
log_string( " Done bounties " );
return;
}
void do_bounties( CHAR_DATA * ch, char *argument )
{
BOUNTY_DATA *bounty;
int count = 0;
set_char_color( AT_WHITE, ch );
send_to_char( "\r\nBounty Amount\r\n", ch );
for( bounty = first_disintigration; bounty; bounty = bounty->next )
{
set_char_color( AT_RED, ch );
ch_printf( ch, "%-26s %-14ld\r\n", bounty->target, bounty->amount );
count++;
}
if( !count )
{
set_char_color( AT_GREY, ch );
send_to_char( "There are no bounties set at this time.\r\n", ch );
return;
}
}
void disintigration( CHAR_DATA * ch, CHAR_DATA * victim, long amount )
{
BOUNTY_DATA *bounty;
bool found;
char buf[MAX_STRING_LENGTH];
found = FALSE;
for( bounty = first_disintigration; bounty; bounty = bounty->next )
{
if( !str_cmp( bounty->target, victim->name ) )
{
found = TRUE;
break;
}
}
if( !found )
{
CREATE( bounty, BOUNTY_DATA, 1 );
LINK( bounty, first_disintigration, last_disintigration, next, prev );
bounty->target = STRALLOC( victim->name );
bounty->amount = 0;
}
bounty->amount = bounty->amount + amount;
save_disintigrations( );
sprintf( buf, "%s has added %ld credits to the bounty on %s.", ch->name, amount, victim->name );
echo_to_all( AT_RED, buf, 0 );
}
void do_addbounty( CHAR_DATA * ch, char *argument )
{
char arg[MAX_STRING_LENGTH];
long int amount;
CHAR_DATA *victim;
if( !argument || argument[0] == '\0' )
{
do_bounties( ch, argument );
return;
}
argument = one_argument( argument, arg );
if( argument[0] == '\0' )
{
send_to_char( "Usage: Addbounty <target> <amount>\r\n", ch );
return;
}
if( ch->pcdata && ch->pcdata->clan && !str_cmp( ch->pcdata->clan->name, "the hunters guild" ) )
{
send_to_char( "Your job is to collect bounties not post them.", ch );
return;
}
if( !ch->in_room || ch->in_room->vnum != 6604 )
{
send_to_char( "You will have to go to the Hunters Guild on Tatooine to add a new bounty.", ch );
return;
}
if( argument[0] == '\0' )
amount = 0;
else
amount = atoi( argument );
if( amount < 5000 )
{
send_to_char( "A bounty should be at least 5000 credits.\r\n", ch );
return;
}
if( !( victim = get_char_world( ch, arg ) ) )
{
send_to_char( "They don't appear to be here .. wait til they log in.\r\n", ch );
return;
}
if( IS_NPC( victim ) )
{
send_to_char( "You can only set bounties on other players .. not mobs!\r\n", ch );
return;
}
if( amount <= 0 )
{
send_to_char( "Nice try! How about 1 or more credits instead...\r\n", ch );
return;
}
if( ch->gold < amount )
{
send_to_char( "You don't have that many credits!\r\n", ch );
return;
}
ch->gold = ch->gold - amount;
disintigration( ch, victim, amount );
}
void remove_disintigration( BOUNTY_DATA * bounty )
{
UNLINK( bounty, first_disintigration, last_disintigration, next, prev );
STRFREE( bounty->target );
DISPOSE( bounty );
save_disintigrations( );
}
void claim_disintigration( CHAR_DATA * ch, CHAR_DATA * victim )
{
BOUNTY_DATA *bounty;
long int gexp;
char buf[MAX_STRING_LENGTH];
if( IS_NPC( victim ) )
return;
bounty = get_disintigration( victim->name );
if( ch == victim )
{
if( bounty != NULL )
remove_disintigration( bounty );
return;
}
if( bounty && ( !ch->pcdata || !ch->pcdata->clan || str_cmp( ch->pcdata->clan->name, "the hunters guild" ) ) )
{
remove_disintigration( bounty );
bounty = NULL;
}
if( bounty == NULL )
{
if( IS_SET( victim->act, PLR_KILLER ) && !IS_NPC( ch ) )
{
gexp =
URANGE( 1, xp_compute( ch, victim ),
( exp_level( ch->skill_level[HUNTING_ABILITY] + 1 ) - exp_level( ch->skill_level[HUNTING_ABILITY] ) ) );
gain_exp( ch, gexp, HUNTING_ABILITY );
set_char_color( AT_BLOOD, ch );
ch_printf( ch, "You receive %ld hunting experience for executing a wanted killer.\r\n", gexp );
}
else if( !IS_NPC( ch ) )
{
SET_BIT( ch->act, PLR_KILLER );
ch_printf( ch, "You are now wanted for the murder of %s.\r\n", victim->name );
}
sprintf( buf, "%s is Dead!", victim->name );
echo_to_all( AT_RED, buf, 0 );
return;
}
ch->gold += bounty->amount;
gexp =
URANGE( 1, bounty->amount + xp_compute( ch, victim ),
( exp_level( ch->skill_level[HUNTING_ABILITY] + 1 ) - exp_level( ch->skill_level[HUNTING_ABILITY] ) ) );
gain_exp( ch, gexp, HUNTING_ABILITY );
set_char_color( AT_BLOOD, ch );
ch_printf( ch, "You receive %ld experience and %ld credits,\r\n from the bounty on %s\r\n", gexp, bounty->amount,
bounty->target );
sprintf( buf, "%s has claimed the disintigration bounty on %s!", ch->name, victim->name );
echo_to_all( AT_RED, buf, 0 );
sprintf( buf, "%s is Dead!", victim->name );
echo_to_all( AT_RED, buf, 0 );
if( !IS_SET( victim->act, PLR_KILLER ) )
SET_BIT( ch->act, PLR_KILLER );
remove_disintigration( bounty );
}