/*********************************************************************************** * * * _______.____ __ ____ _______ _______ * * / |\ \ / \ / / _ | ____| __ | ____| * * | (----` \ \/ \/ / (_) | |__ ____ _/ |_ | |__ * * \ \ \ / _ | __| / _ \ \ __\ | __| * * .----) | \ /\ / (_) | | ( <_> ) | | | |____ * * |_______/ \__/ \__/ |__| \____/ |__| |_______| * * * * SWFotE v2.0 (FotE v1.1 cleaned up and considerably modded) by: * * Greg (Keberus) Mosley * * Roman (Trelar) Arnold * * * * SWFotE v1 & v1.1 copyright (c) 2002 was created by * * Chris 'Tawnos' Dary (cadary@uwm.edu), * * Korey 'Eleven' King (no email), * * Matt 'Trillen' White (mwhite17@ureach.com), * * Daniel 'Danimal' Berrill (danimal924@yahoo.com), * * Richard 'Bambua' Berrill (email unknown), * * Stuart 'Ackbar' Unknown (email unknown) * * * * SWR 1.0 copyright (c) 1997, 1998 was created by Sean Cooper * * based on a concept and ideas from the original SWR immortals: * * Himself (Durga), Mark Matt (Merth), Jp Coldarone (Exar), Greg Baily (Thrawn), * * Ackbar, Satin, Streen and Bib as well as much input from our other builders * * and players. * * * * Original SMAUG 1.4a written by Thoric (Derek Snider) with Altrag, * * Blodkai, Haus, Narn, Scryn, Swordbearer, Tricops, Gorog, Rennard, * * Grishnakh, Fireblade, and Nivek. * * * * Original MERC 2.1 code by Hatchet, Furey, and Kahn. * * * * Original DikuMUD code by: Hans Staerfeldt, Katja Nyboe, Tom Madsen, * * Michael Seifert, and Sebastian Hammer. * * * ***********************************************************************************/ #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_disintegration; BOUNTY_DATA * last_disintegration; void disintegration args ( ( CHAR_DATA *ch , CHAR_DATA *victim , long amount ) ); void nodisintegration args ( ( CHAR_DATA *ch , CHAR_DATA *victim , long amount ) ); int xp_compute( CHAR_DATA *ch , CHAR_DATA *victim); void save_disintegrations() { BOUNTY_DATA *tbounty; FILE *fpout; char filename[256]; sprintf( filename, "%s%s", SYSTEM_DIR, disintegration_LIST ); fpout = fopen( filename, "w" ); if ( !fpout ) { bug( "FATAL: cannot open disintegration.lst for writing!\n\r", 0 ); return; } for ( tbounty = first_disintegration; tbounty; tbounty = tbounty->next ) { fprintf( fpout, "%s\n", tbounty->target ); fprintf( fpout, "%ld\n", tbounty->amount ); } fprintf( fpout, "$\n" ); fclose( fpout ); } bool is_disintegration( CHAR_DATA *victim ) { BOUNTY_DATA *bounty; for ( bounty = first_disintegration; bounty; bounty = bounty->next ) if ( !str_cmp( victim->name , bounty->target ) ) return TRUE; return FALSE; } BOUNTY_DATA *get_disintegration( char *target ) { BOUNTY_DATA *bounty; for ( bounty = first_disintegration; 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_disintegration = NULL; last_disintegration = NULL; log_string( "Loading disintegrations..." ); sprintf( bountylist, "%s%s", SYSTEM_DIR, disintegration_LIST ); fclose( fpReserve ); 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_disintegration, last_disintegration, next, prev ); bounty->target = STRALLOC(target); amount = fread_number( fpList ); bounty->amount = amount; } fclose( fpList ); log_string(" Done bounties " ); fpReserve = fopen( NULL_FILE, "r" ); return; } void do_bounties( CHAR_DATA *ch, char *argument ) { BOUNTY_DATA *bounty; int count = 0; set_char_color( AT_WHITE, ch ); send_to_char( "\n\rBounty Amount\n\r", ch ); for ( bounty = first_disintegration; bounty; bounty = bounty->next ) { set_char_color( AT_RED, ch ); ch_printf( ch, "%-27s %-14ld\n\r", bounty->target, bounty->amount ); count++; } if ( !count ) { set_char_color( AT_GREY, ch ); send_to_char( "There are no bounties set at this time.\n\r", ch ); return; } } void do_rembounty( CHAR_DATA *ch, char *argument ){ BOUNTY_DATA *bounty; char buf[MAX_INPUT_LENGTH]; bounty = get_disintegration(argument); if (bounty) remove_disintegration(bounty); else{ send_to_char("This bounty does not exist!\n\r", ch); return; } sprintf(buf, "The bounty on %s has been removed!", argument); echo_to_all(AT_RED, buf, ECHOTAR_ALL); } void disintegration ( CHAR_DATA *ch , CHAR_DATA *victim , long amount ) { BOUNTY_DATA *bounty; bool found; char buf[MAX_STRING_LENGTH]; found = FALSE; for ( bounty = first_disintegration; bounty; bounty = bounty->next ) { if ( !str_cmp( bounty->target , victim->name )) { found = TRUE; break; } } if (! found) { CREATE( bounty, BOUNTY_DATA, 1 ); LINK( bounty, first_disintegration, last_disintegration, next, prev ); bounty->target = STRALLOC( victim->name ); bounty->amount = 0; } bounty->amount = bounty->amount + amount; save_disintegrations(); sprintf( buf, "Someone has added %ld credits to the bounty on %s.", 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>\n\r", 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.\n\r", ch ); return; } if ( !(victim = get_char_world_ooc( ch, arg )) ) { send_to_char( "They don't appear to be here .. wait til they log in.\n\r", ch ); return; } if ( IS_NPC(victim) ) { send_to_char( "You can only set bounties on other players .. not mobs!\n\r", ch ); return; } if (amount <= 0) { send_to_char( "Nice try! How about 1 or more credits instead...\n\r", ch ); return; } if (ch->gold < amount) { send_to_char( "You don't have that many credits!\n\r", ch ); return; } ch->gold = ch->gold - amount; disintegration( ch, victim, amount); } void remove_disintegration( BOUNTY_DATA *bounty ) { UNLINK( bounty, first_disintegration, last_disintegration, next, prev ); STRFREE( bounty->target ); DISPOSE( bounty ); save_disintegrations(); } void claim_disintegration( CHAR_DATA *ch , CHAR_DATA *victim ) { BOUNTY_DATA *bounty; long int exp; char buf[MAX_STRING_LENGTH]; CLAN_DATA *clan; if ( IS_NPC(victim) ) return; bounty = get_disintegration( victim->name ); if ( ch == victim ) { if ( bounty != NULL ) remove_disintegration(bounty); return; } if (bounty && !ch->pcdata) { remove_disintegration(bounty); bounty = NULL; } /* Assassin Experience for Clan Leaders added by Tawnos */ if(victim->pcdata && victim->pcdata->clan) { clan = victim->pcdata->clan; if (victim->pcdata->clan && (!str_cmp(victim->name, clan->leader) || !str_cmp(victim->name, clan->number1) || !str_cmp(victim->name, clan->number2))) { if ( !str_cmp(victim->name, clan->leader)) { exp = (exp_level( ch->skill_level[ASSASSIN_ABILITY]+1) - exp_level( ch->skill_level[ASSASSIN_ABILITY])) ; gain_exp(ch, exp, ASSASSIN_ABILITY); set_char_color( AT_BLOOD, ch); ch_printf( ch, "You receive %ld assassin experience for executing a clan leader.\n\r", exp); } else if( !str_cmp(victim->name, clan->number1) || !str_cmp(victim->name, clan->number2) ) { exp = (exp_level( ch->skill_level[ASSASSIN_ABILITY]+1) - exp_level( ch->skill_level[ASSASSIN_ABILITY])) ; gain_exp(ch, exp, ASSASSIN_ABILITY); set_char_color( AT_BLOOD, ch); ch_printf( ch, "You receive %ld assassin experience for executing a prominent clan member.\n\r", exp); } } } if (bounty == NULL) { if ( IS_SET(victim->act , PLR_KILLER ) && !IS_NPC(ch) ) { exp = URANGE(1, xp_compute(ch, victim) , ( exp_level(ch->skill_level[HUNTING_ABILITY]+1) - exp_level(ch->skill_level[HUNTING_ABILITY]) )); gain_exp( ch , exp , HUNTING_ABILITY ); set_char_color( AT_BLOOD, ch ); ch_printf( ch, "You receive %ld hunting experience for executing a wanted killer.\n\r", exp ); } else if ( !IS_NPC(ch) ) { SET_BIT(ch->act, PLR_KILLER ); ch_printf( ch, "You are now wanted for the murder of %s.\n\r", victim->name ); } sprintf( buf, "%s is Dead!", victim->name ); echo_to_all ( AT_RED , buf, 0 ); return; } ch->gold += bounty->amount; exp = 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 , exp , HUNTING_ABILITY ); set_char_color( AT_BLOOD, ch ); ch_printf( ch, "You receive %ld experience and %ld credits,\n\r from the bounty on %s\n\r", exp, bounty->amount, bounty->target ); sprintf( buf, "The disintegration bounty on %s has been claimed!", 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_disintegration(bounty); }