/*********************************************************************************** * * * _______.____ __ ____ _______ _______ * * / |\ \ / \ / / _ | ____| __ | ____| * * | (----` \ \/ \/ / (_) | |__ ____ _/ |_ | |__ * * \ \ \ / _ | __| / _ \ \ __\ | __| * * .----) | \ /\ / (_) | | ( <_> ) | | | |____ * * |_______/ \__/ \__/ |__| \____/ |__| |_______| * * * * 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 <stdio.h> #include <string.h> #include <time.h> #include "mud.h" void do_plantbug( CHAR_DATA *ch, char *argument ) { CHAR_DATA *victim; BUG_DATA *bug; BUG_DATA *cbug; OBJ_DATA *obj; bool checkbug = FALSE; int chance; if(IS_NPC(ch)) return; if ((victim = get_char_room(ch, argument)) == NULL){ send_to_char("They aren't here.\n\r", ch); return; } if (IS_NPC(victim)) { send_to_char("You can't bug NPC's!\n\r", ch); return; } if (IS_IMMORTAL(victim)) { send_to_char("Don't try to plant bugs on immortals.\n\r", ch); return; } if(in_arena(ch)) { send_to_char("You're here to FIGHT, not spy.\n\r", ch); return; } if( ch == victim) { send_to_char("You can't bug yourself!\n\r", ch); return; } for(obj = ch->last_carrying; obj; obj = obj->prev_content) if(obj->item_type == ITEM_BUG) checkbug = TRUE; if(checkbug == FALSE) { send_to_char("You don't have any bugs to plant.\n\r", ch); return; } for(cbug=victim->first_bug;cbug;cbug=cbug->next_in_bug) if(!str_cmp(ch->name, cbug->name)){ send_to_char("You have already planted a bug on this person.\n\r", ch); return; } chance = number_percent( ) - UMIN(0,(get_curr_lck(ch) - 14)) + UMIN(0,(get_curr_lck(victim) - 13)); if (chance < ch->pcdata->learned[gsn_plantbug]){ act(AT_WHITE, "You carefully reach into $N's pocket and place a bug.", ch, NULL, victim, TO_CHAR); CREATE(bug, BUG_DATA, 1); bug->name = ch->name; LINK(bug, victim->first_bug, victim->last_bug, next_in_bug, prev_in_bug); learn_from_success(ch, gsn_plantbug); for(obj = ch->last_carrying; obj; obj = obj->prev_content) { if(obj->item_type == ITEM_BUG) { separate_obj(obj); obj_from_char(obj); extract_obj(obj); break; } } return; } else { send_to_char("&RYou try to find a pocket to plant the bug in but fail!\n\r", ch); learn_from_failure(ch, gsn_plantbug); if(number_bits(0) == 0) ch_printf(victim, "You feel a slight brush against your pocket to find %s's hand there.\n\r", PERS(ch, victim)); return; } } void do_showbugs( CHAR_DATA *ch, char *argument ){ DESCRIPTOR_DATA *d; CHAR_DATA *victim; int chance; char buf2[MAX_STRING_LENGTH]; SHIP_DATA *ship; BUG_DATA *bug; char buf[MAX_STRING_LENGTH]; chance = number_percent() - 20; if (chance > ch->pcdata->learned[gsn_showbugs]) { send_to_char("You can't figure out what to do.\n\r", ch); learn_from_failure(ch,gsn_showbugs); return; } send_to_char("Player Planet/Ship Room Name\n\r", ch); send_to_char("------ ----------- ---------\n\r", ch); for ( d = first_descriptor; d; d = d->next ) if ( (d->connected == CON_PLAYING || d->connected == CON_EDITING ) && ( victim = d->character ) != NULL){ for(bug=victim->first_bug;bug;bug=bug->next_in_bug) if(!str_cmp(bug->name, ch->name)){ if(victim->in_room->area && victim->in_room->area->planet) sprintf(buf2, "%s", victim->in_room->area->planet->name); else if((ship = ship_from_room(victim->in_room->vnum)) != NULL) sprintf(buf2, "%s", ship->name); else sprintf(buf2, "Unknown"); sprintf(buf, "%-21.21s %-18.18s %s\n\r", PERS(victim, ch), buf2, victim->in_room->name); send_to_char(buf, ch); break; } } learn_from_success(ch,gsn_showbugs); } void do_bind( CHAR_DATA *ch, char *argument ) { OBJ_DATA *obj; OBJ_DATA *tobj; int chance; CHAR_DATA *victim; bool checkbinders=FALSE; if (argument[0] == '\0') { send_to_char("Syntax: Bind <victim>\n\r", ch); return; } if ((victim = get_char_room(ch, argument)) == NULL) { send_to_char("They are not here.\n\r", ch); return; } if (victim == ch) { send_to_char("You can not bind yourself!\n\r", ch); return; } if (IS_NPC(victim)) { send_to_char("You can only bind players.\n\r", ch); return; } if (IS_SET(victim->pcdata->act2, ACT_BOUND)) { send_to_char("They've already been bound!\n\r", ch); return; } for(obj = ch->last_carrying; obj; obj = obj->prev_content) if(obj->item_type == ITEM_BINDERS) { checkbinders = TRUE; break; } if(checkbinders == FALSE) { send_to_char("You don't have any binders to bind them with.\n\r", ch); return; } if (victim->position != POS_STUNNED && victim->position != POS_SLEEPING) { send_to_char("They need to be stunned or asleep.\n\r", ch); return; } chance = (int) (ch->pcdata->learned[gsn_bind]); if( number_percent() < chance) { separate_obj(obj); obj_from_char(obj); obj_to_char(obj,victim); act(AT_WHITE, "You quickly bind $N's wrists.", ch, NULL, victim, TO_CHAR); act(AT_WHITE, "$n quickly binds your wrists.", ch, NULL, victim, TO_VICT); act(AT_WHITE, "$n quickly binds $N's wrists.", ch, NULL, victim, TO_NOTVICT); tobj = get_eq_char( ch, WEAR_BOTH_WRISTS ); if(tobj) unequip_char(ch, tobj); equip_char(victim, obj, WEAR_BOTH_WRISTS); SET_BIT(victim->pcdata->act2, ACT_BOUND); learn_from_success(ch, gsn_bind); } else { send_to_char("You peer at the binders, curious upon how to use them.\n\r", ch); learn_from_failure(ch, gsn_bind); } return; } void do_unbind( CHAR_DATA *ch, char *argument ) { OBJ_DATA *obj; bool checkbinders=FALSE; char buf[MAX_STRING_LENGTH]; CHAR_DATA *victim; if (IS_NPC(ch)) { send_to_char("You're a mob.\n\r", ch); return; } if (argument[0] == '\0') { send_to_char("Syntax: Unbind <victim>\n\r", ch); return; } if ((victim = get_char_room(ch, argument)) == NULL){ send_to_char("They aren't here.\n\r", ch); return; } if (victim == ch){ send_to_char("You can not unbind yourself!\n\r", ch); return; } if (IS_NPC(victim)) { send_to_char("You can only unbind players.\n\r", ch); return; } if (IS_SET(ch->pcdata->act2, ACT_BOUND)) { send_to_char("Nice try. You're bound yourself!\n\r", ch); return; } if (!IS_SET(victim->pcdata->act2, ACT_BOUND)) { send_to_char("But they're not bound.\n\r", ch); return; } obj = get_eq_char( victim, WEAR_BOTH_WRISTS ); if(obj) unequip_char(victim, obj); else { send_to_char("Something went wrong. get an imm.\n\r", ch); sprintf(buf, "%s unbinding %s: has no bothwrists object!", ch->name, victim->name); bug(buf); return; } for(obj = victim->last_carrying; obj; obj = obj->prev_content) if(obj->item_type == ITEM_BINDERS) { checkbinders = TRUE; break; } if(checkbinders == FALSE) { bug("Unbind: no binders in victims inventory."); send_to_char("Something went wrong. get an imm.\n\r", ch); return; } separate_obj(obj); obj_from_char(obj); obj_to_char(obj, ch); act(AT_WHITE, "You quickly unbind $N's wrists.", ch, NULL, victim, TO_CHAR); act(AT_WHITE, "$n quickly unbinds your wrists.", ch, NULL, victim, TO_VICT); act(AT_WHITE, "$n quickly unbinds $N's wrists.", ch, NULL, victim, TO_NOTVICT); REMOVE_BIT(victim->pcdata->act2, ACT_BOUND); } void do_gag( CHAR_DATA *ch, char *argument ) { CHAR_DATA *victim; int chance; if (argument[0] == '\0') { send_to_char("Syntax: Gag <victim>\n\r", ch); return; } if ((victim = get_char_room(ch, argument)) == NULL) { send_to_char("They are not here.\n\r", ch); return; } if (victim == ch) { send_to_char("You can not gag yourself!\n\r", ch); return; } if (IS_NPC(victim)) { send_to_char("You can only gag players.\n\r", ch); return; } if ((victim->position != POS_STUNNED) && (victim->position != POS_SLEEPING) && !IS_SET(victim->pcdata->act2, ACT_BOUND)) { send_to_char("They need to be stunned, asleep, or bound.\n\r", ch); return; } chance = (int) (ch->pcdata->learned[gsn_gag]); if( number_percent() < chance) { act(AT_WHITE, "You quickly place a gag over $N's mouth.", ch, NULL, victim, TO_CHAR); act(AT_WHITE, "$n roughly puts a gag over your mouth.", ch, NULL, victim, TO_VICT); act(AT_WHITE, "$n roughly places a gag on $N's mouth.", ch, NULL, victim, TO_NOTVICT); SET_BIT(victim->pcdata->act2, ACT_GAGGED); learn_from_success(ch, gsn_gag); } else { send_to_char("You look puzzled as you wonder how to put on such a contraption.\n\r",ch); learn_from_failure(ch, gsn_gag); } return; } void do_ungag( CHAR_DATA *ch, char *argument ) { CHAR_DATA *victim; if (argument[0] == '\0') { send_to_char("Syntax: Ungag <victim>\n\r", ch); return; } if ((victim = get_char_room(ch, argument)) == NULL) { send_to_char("They aren't here.\n\r", ch); return; } if (victim == ch && IS_SET(victim->pcdata->act2, ACT_BOUND)) { send_to_char("You can not ungag yourself when you're bound!\n\r", ch); return; } if (IS_NPC(victim)) { send_to_char("You can only ungag players.\n\r", ch); return; } if (!IS_SET(victim->pcdata->act2, ACT_GAGGED)){ send_to_char("But they're not gagged.\n\r", ch); return; } if( victim != ch) { act(AT_WHITE, "You quickly rip off $N's gag.", ch, NULL, victim, TO_CHAR); act(AT_WHITE, "$n quickly rips off your gag.", ch, NULL, victim, TO_VICT); act(AT_WHITE, "$n quickly rips off $N's gag.", ch, NULL, victim, TO_NOTVICT); } else { act(AT_WHITE, "You quickly rip off your gag.", ch, NULL, victim, TO_CHAR); act(AT_WHITE, "$n quickly rips off his gag.", ch, NULL, victim, TO_NOTVICT); } REMOVE_BIT(victim->pcdata->act2, ACT_GAGGED); } void do_ambush( CHAR_DATA *ch, char *argument ){ CHAR_DATA *victim; int percent; if (argument[0] == '\0'){ send_to_char("Syntax: Ambush <victim>\n\r", ch); return; } if (IS_NPC(ch)){ send_to_char("Only players may use this ability.\n\r", ch); return; } if ((victim = get_char_room(ch, argument)) == NULL){ send_to_char("How can you ambush someone who's not even here.\n\r", ch); return; } if (ch == victim){ send_to_char("How can you possibly ambush yourself?\n\r", ch); return; } if (ch->position == POS_FIGHTING){ send_to_char("You are already fighting someone!\n\r", ch); return; } if (victim->position == POS_FIGHTING){ send_to_char("They are already fighting someone!\n\r", ch); return; } if ( victim->position <= POS_STUNNED ) { send_to_char( "Come now, there's no honor in that!\n\r", ch); return; } if (!IS_SET(ch->affected_by, AFF_SNEAK)){ send_to_char("You are moving far too loudly to ambush someone!\n\r", ch); return; } percent = number_percent( ) - (get_curr_lck(ch) - 14) + (get_curr_lck(victim) - 13); affect_strip ( ch, gsn_sneak ); affect_strip ( ch, gsn_silent ); REMOVE_BIT ( ch->affected_by, AFF_HIDE ); if (ch->race != RACE_DEFEL) /* Defel has perm invis */ REMOVE_BIT ( ch->affected_by, AFF_INVISIBLE ); if (ch->race != RACE_NOGHRI) /* Noghri has perm sneak */ REMOVE_BIT ( ch->affected_by, AFF_SNEAK ); act(AT_RED, "You jump out from behind $N and attack $M!", ch, NULL, victim, TO_CHAR); act(AT_RED, "$n jumps out from behind you and attacks you!", ch, NULL, victim, TO_VICT); act(AT_RED, "$n jumps out from behind $N and attacks $M!", ch, NULL, victim, TO_NOTVICT); if ( !IS_AWAKE(victim) || percent < ch->pcdata->learned[gsn_ambush] ){ multi_hit(ch, victim, gsn_ambush); learn_from_success( ch, gsn_ambush ); } else { learn_from_failure( ch, gsn_ambush ); global_retcode = damage( ch, victim, 0, gsn_ambush ); } } //Contract System by Tawnos. void do_contract( CHAR_DATA *ch, char *argument ) { CHAR_DATA *victim; CHAR_DATA *target; char arg1[MAX_INPUT_LENGTH]; char arg2[MAX_INPUT_LENGTH]; char arg3[MAX_INPUT_LENGTH]; long amount = 0; CONTRACT_DATA *ccontract; CONTRACT_DATA *contract; argument = one_argument( argument , arg1 ); argument = one_argument( argument , arg2 ); argument = one_argument( argument , arg3 ); if(IS_NPC(ch)) return; if(arg1[0] =='\0' || arg2[0] == '\0' || arg3[0] == '\0') { send_to_char("&RSyntax: contract <person> <target> <amount>\n\r", ch); return; } if ((victim = get_char_room(ch, arg1)) == NULL) { send_to_char("They aren't here.\n\r", ch); return; } if ((target = get_char_world_ooc(ch, arg2)) == NULL) { send_to_char("Your target is currently not online.\n\r", ch); return; } if ( ch == victim) { send_to_char("You can't contract yourself!\n\r", ch); return; } if (IS_NPC(victim) || IS_NPC(target) ) { send_to_char("You can't contract NPC's.\n\r", ch); return; } if ( ch == target) { send_to_char("You can't contract against yourself!\n\r", ch); return; } if ( target == victim) { send_to_char("You can't contract them to kill themself!\n\r", ch); return; } amount = atoi(arg3); if(amount < 5000) { send_to_char("&RYour contract must be for at least 5000 credits.\n\r", ch); return; } if( ch->gold < amount) { send_to_char("&RYou don't have enough credits!\n\r", ch); return; } for(ccontract=victim->first_contract;ccontract;ccontract=ccontract->next_in_contract) { if(!str_cmp(ccontract->target, target->name)) { ch->gold -= amount; ccontract->amount += amount; ch_printf(ch, "&GYou have contracted %s to kill %s for an amount of %d credits.\n\r", PERS(victim, ch), target->name, amount); ch_printf(victim, "&G%s has contracted you to kill %s, raising your contract reward by %d credits.\n\r",PERS(ch, victim), target->name, amount); return; } } CREATE(contract, CONTRACT_DATA, 1); contract->target = target->name; contract->amount = amount; LINK(contract, victim->first_contract, victim->last_contract,next_in_contract, prev_in_contract); ch->gold -= amount; ch_printf(ch, "&GYou have contracted %s to kill %s for an amount of %d credits.\n\r", PERS(victim, ch), target->name, amount); ch_printf(victim, "&G%s has contracted you to kill %s for an amount of %d credits.\n\r", PERS(ch, victim), target->name, amount); } void do_showcontracts(CHAR_DATA *ch, char *argument) { CONTRACT_DATA *contract; send_to_char("&R Target &W|&R Amount\n\r", ch); send_to_char("&W------------|----------\n\r", ch); for(contract=ch->first_contract;contract;contract=contract->next_in_contract) { ch_printf(ch, "&R%-12s&W|&R %d&W\n\r", contract->target, contract->amount); } } void do_remcontract(CHAR_DATA *ch, char *argument) { CONTRACT_DATA *contract; CONTRACT_DATA *scontract=NULL; if(argument[0] == '\0') { send_to_char("&RSyntax: remcontract <target name>\n\r", ch); return; } for(contract=ch->first_contract;contract;contract=contract->next_in_contract) { if(!str_cmp(contract->target, argument)) { scontract = contract; break; } } if(!scontract || scontract == NULL) { send_to_char("No such target.\n\r", ch); return; } STRFREE(scontract->target); UNLINK(scontract, ch->first_contract, ch->last_contract, next_in_contract, prev_in_contract); DISPOSE(scontract); send_to_char("Contract removed.\n\r", ch); return; }