/***************************************************************************
* 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) Lucasfilm 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. *
* ------------------------------------------------------------------------ *
* New Star Wars Skills Unit *
****************************************************************************/
#include <math.h>
#include <sys/types.h>
#include <ctype.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include "mud.h"
int xp_compute ( CHAR_DATA *ch , CHAR_DATA *victim );
extern int top_affect;
extern bool check_blind args( ( CHAR_DATA *ch ) );
extern void show_condition args( ( CHAR_DATA *ch, CHAR_DATA *victim ) );
void get_obj_palm args( ( CHAR_DATA *ch, OBJ_DATA *obj, OBJ_DATA *container ) );
void do_disguise( CHAR_DATA *ch, char *argument )
{
int chance;
char arg1[MAX_INPUT_LENGTH];
if ( IS_NPC(ch) )
return;
argument = one_argument(argument, arg1);
if ( IS_SET( ch->pcdata->flags, PCFLAG_NOTITLE ))
{
send_to_char( "You try but the Force resists you.\n\r", ch );
return;
}
if ( arg1[0] == '\0' )
{
send_to_char( "Change your name to what?\n\r", ch );
return;
}
if(!str_cmp(arg1, "off"))
{
if(IS_SET(ch->pcdata->flags, PCFLAG_DISGUISED))
{
send_to_char( "You remove your disguise.\n\r", ch);
REMOVE_BIT(ch->pcdata->flags, PCFLAG_DISGUISED);
set_title(ch, ch->name);
return;
}
else
{
send_to_char("You aren't disguised.\n\r", ch);
return;
}
}
if(argument[0] == '\0')
{
send_to_char("Change your title to what?\n\r", ch);
return;
}
if ((get_trust(ch) <= LEVEL_IMMORTAL) && (!nifty_is_name(arg1, stripclr( argument ) ) ) )
{
send_to_char("You must include your name/disguise name somewhere in your title!", ch);
return;
}
chance = (int) (ch->pcdata->learned[gsn_disguise]);
if ( number_percent( ) > chance )
{
send_to_char( "You try to disguise yourself but fail.\n\r", ch );
learn_from_failure(ch, gsn_disguise);
return;
}
learn_from_success(ch, gsn_disguise);
if ( strlen(argument) > 50 )
argument[50] = '\0';
if(!IS_SET(ch->pcdata->flags, PCFLAG_DISGUISED))
SET_BIT(ch->pcdata->flags, PCFLAG_DISGUISED);
else
STRFREE(ch->pcdata->disguisename);
smash_tilde( argument );
smash_tilde( arg1 );
bookcap(arg1);
ch->pcdata->disguisename = STRALLOC(arg1);
set_title( ch, argument );
send_to_char( "Ok.\n\r", ch );
act( AT_PLAIN, "$n changes $s appearance!", ch, NULL, argument, TO_ROOM );
learn_from_success( ch, gsn_disguise );
}
void do_beg( CHAR_DATA *ch, char *argument )
{
char buf [MAX_STRING_LENGTH];
char arg1 [MAX_INPUT_LENGTH];
CHAR_DATA *victim;
int percent, xp;
int amount;
if ( IS_NPC (ch) ) return;
argument = one_argument( argument, arg1 );
if ( ch->mount )
{
send_to_char( "You can't do that while mounted.\n\r", ch );
return;
}
if ( arg1[0] == '\0' )
{
send_to_char( "Beg for money from whom?\n\r", ch );
return;
}
if ( ms_find_obj(ch) )
return;
if ( ( victim = get_char_room( ch, arg1 ) ) == NULL )
{
send_to_char( "They aren't here.\n\r", ch );
return;
}
if ( victim == ch )
{
send_to_char( "That's pointless.\n\r", ch );
return;
}
if ( IS_SET( ch->in_room->room_flags, ROOM_SAFE ) )
{
set_char_color( AT_MAGIC, ch );
send_to_char( "This isn't a good place to do that.\n\r", ch );
return;
}
if ( ch->position == POS_FIGHTING )
{
send_to_char( "Interesting combat technique.\n\r" , ch );
return;
}
if ( victim->position == POS_FIGHTING )
{
send_to_char( "They're a little busy right now.\n\r" , ch );
return;
}
if ( ch->position <= POS_SLEEPING )
{
send_to_char( "In your dreams or what?\n\r" , ch );
return;
}
if ( victim->position <= POS_SLEEPING )
{
send_to_char( "You might want to wake them first...\n\r" , ch );
return;
}
if ( !IS_NPC( victim ) )
{
send_to_char( "You beg them for money.\n\r", ch );
act( AT_ACTION, "$n begs you to give $s some change.\n\r", ch, NULL, victim, TO_VICT );
act( AT_ACTION, "$n begs $N for change.\n\r", ch, NULL, victim, TO_NOTVICT );
return;
}
WAIT_STATE( ch, skill_table[gsn_beg]->beats );
percent = number_percent( ) - ch->skill_level[SMUGGLING_ABILITY] + victim->top_level;
if ( percent > ch->pcdata->learned[gsn_beg] )
{
/*
* Failure.
*/
send_to_char( "You beg them for money but don't get any!\n\r", ch );
act( AT_ACTION, "$n is really getting on your nerves with all this begging!\n\r", ch, NULL, victim, TO_VICT );
act( AT_ACTION, "$n begs $N for money.\n\r", ch, NULL, victim, TO_NOTVICT );
if ( victim->alignment < 0 && victim->top_level >= ch->top_level+5 )
{
sprintf( buf, "%s is an annoying beggar and needs to be taught a lesson!", ch->name );
do_yell( victim, buf );
global_retcode = multi_hit( victim, ch, TYPE_UNDEFINED );
}
learn_from_failure( ch, gsn_beg );
return;
}
act( AT_ACTION, "$n begs $N for money.\n\r", ch, NULL, victim, TO_NOTVICT );
act( AT_ACTION, "$n begs you for money!\n\r", ch, NULL, victim, TO_VICT );
amount = UMIN( victim->gold , number_range(1, 10) );
if ( amount <= 0 )
{
do_look( victim , ch->name );
do_say( victim , "Sorry I have nothing to spare.\n\r" );
learn_from_failure( ch, gsn_beg );
return;
}
ch->gold += amount;
victim->gold -= amount;
ch_printf( ch, "%s gives you %d credits.\n\r", victim->short_descr , amount );
learn_from_success( ch, gsn_beg );
xp = UMIN( amount*10 , ( exp_level( ch->skill_level[SMUGGLING_ABILITY]+1) - exp_level( ch->skill_level[SMUGGLING_ABILITY]) ) );
xp = UMIN( xp , xp_compute( ch, victim ) );
gain_exp( ch, xp, SMUGGLING_ABILITY );
ch_printf( ch, "&WYou gain %ld smuggling experience points!\n\r", xp );
act( AT_ACTION, "$N gives $n some money.\n\r", ch, NULL, victim, TO_NOTVICT );
act( AT_ACTION, "You give $n some money.\n\r", ch, NULL, victim, TO_VICT );
return;
}
void do_pickshiplock( CHAR_DATA *ch, char *argument )
{
do_pick( ch, argument );
}
void do_hijack( CHAR_DATA *ch, char *argument )
{
int chance;
SHIP_DATA *ship, *onship;
char buf[MAX_STRING_LENGTH];
char logbuf[MAX_STRING_LENGTH];
if ( (ship = ship_from_cockpit(ch->in_room->vnum)) == NULL )
{
send_to_char("&RYou must be in the cockpit of a ship to do that!\n\r",ch);
return;
}
if ( ship->class > SHIP_PLATFORM )
{
send_to_char("&RThis isn't a spacecraft!\n\r",ch);
return;
}
if ( (ship = ship_from_pilotseat(ch->in_room->vnum)) == NULL )
{
send_to_char("&RYou don't seem to be in the pilot seat!\n\r",ch);
return;
}
if ( check_pilot( ch , ship ) )
{
send_to_char("&RWhat would be the point of that!\n\r",ch);
return;
}
if ( ship->type == MOB_SHIP && get_trust(ch) < 102 )
{
send_to_char("&RThis ship isn't pilotable by mortals at this point in time...\n\r",ch);
return;
}
if ( ship->class == SHIP_PLATFORM )
{
send_to_char( "You can't do that here.\n\r" , ch );
return;
}
if ( ship->lastdoc != ship->location )
{
send_to_char("&rYou don't seem to be docked right now.\n\r",ch);
return;
}
if ( ship->shipstate != SHIP_DOCKED && ship->shipstate != SHIP_DISABLED )
{
send_to_char("The ship is not docked right now.\n\r",ch);
return;
}
if ( (( onship = ship_from_hanger( ship->location ) ) != NULL )
&& !(IS_SET(ship->flags, SHIPFLAG_SIMULATOR) ? 1
: onship->bayopen) )
{
send_to_char("&RThe hangar is closed!\n\r",ch);
return;
}
if ( ship->shipstate == SHIP_DISABLED )
{
send_to_char("The ships drive is disabled .\n\r",ch);
return;
}
chance = IS_NPC(ch) ? ch->top_level
: (int) (ch->pcdata->learned[gsn_hijack]) ;
if ( number_percent( ) > chance )
{
send_to_char("You fail to figure out the correct launch code.\n\r",ch);
learn_from_failure( ch, gsn_hijack );
return;
}
if ( ship->class == FIGHTER_SHIP )
chance = IS_NPC(ch) ? ch->top_level
: (int) (ch->pcdata->learned[gsn_starfighters]) ;
if ( ship->class == MIDSIZE_SHIP )
chance = IS_NPC(ch) ? ch->top_level
: (int) (ch->pcdata->learned[gsn_midships]) ;
if ( ship->class == CAPITAL_SHIP )
chance = IS_NPC(ch) ? ch->top_level
: (int) (ch->pcdata->learned[gsn_capitalships]);
if ( number_percent( ) < chance )
{
if (ship->hatchopen)
{
ship->hatchopen = FALSE;
sprintf( buf , "The hatch on %s closes." , ship->name);
echo_to_room( AT_YELLOW , get_room_index(ship->location) , buf );
echo_to_room( AT_YELLOW , get_room_index(ship->entrance) , "The hatch slides shut." );
}
set_char_color( AT_GREEN, ch );
send_to_char( "Launch sequence initiated.\n\r", ch);
act( AT_PLAIN, "$n starts up the ship and begins the launch sequence.", ch,
NULL, argument , TO_ROOM );
echo_to_ship( AT_YELLOW , ship , "The ship hums as it lifts off the ground.");
sprintf( buf, "%s begins to launch.", ship->name );
echo_to_room( AT_YELLOW , get_room_index(ship->location) , buf );
ship->shipstate = SHIP_LAUNCH;
ship->currspeed = ship->realspeed;
if ( ship->class == FIGHTER_SHIP )
learn_from_success( ch, gsn_starfighters );
if ( ship->class == MIDSIZE_SHIP )
learn_from_success( ch, gsn_midships );
if ( ship->class == CAPITAL_SHIP )
learn_from_success( ch, gsn_capitalships );
learn_from_success( ch, gsn_hijack );
/* sprintf( buf, "%s has been hijacked!", ship->name );
echo_to_all( AT_RED , buf, 0 ); */
sprintf( logbuf, "%s has been hijacked by %s.", ship->name, ch->name);
log_string( logbuf );
return;
}
set_char_color( AT_RED, ch );
send_to_char("You fail to work the controls properly!\n\r",ch);
if ( ship->class == FIGHTER_SHIP )
learn_from_failure( ch, gsn_starfighters );
if ( ship->class == MIDSIZE_SHIP )
learn_from_failure( ch, gsn_midships );
if ( ship->class == CAPITAL_SHIP )
learn_from_failure( ch, gsn_capitalships );
return;
}
void do_besiege( CHAR_DATA *ch, char *argument )
{
int chance;
SHIP_DATA *ship;
char logbuf[MAX_STRING_LENGTH];
char buf[MAX_STRING_LENGTH];
if ( (ship = ship_from_cockpit(ch->in_room->vnum)) == NULL )
{
send_to_char("&RYou must be in the cockpit of a ship to do that!\n\r",ch);
return;
}
if ( ship->class > SHIP_PLATFORM )
{
send_to_char("&RThis isn't a spacecraft!\n\r",ch);
return;
}
if ( (ship = ship_from_pilotseat(ch->in_room->vnum)) == NULL )
{
send_to_char("&RYou don't seem to be in the pilot seat!\n\r",ch);
return;
}
if ( check_pilot( ch , ship ) )
{
send_to_char("&RWhat would be the point of that!?\n\r",ch);
return;
}
if ( ship->type == MOB_SHIP )
{
send_to_char("&RThis ship isn't pilotable at this point in time...\n\r",ch);
return;
}
if ( ship->class == SHIP_PLATFORM )
{
send_to_char( "You can't do that here.\n\r" , ch );
return;
}
if ( ship->autopilot==FALSE )
{
send_to_char( "This ship's autopilot is already off.\n\r", ch);
return;
}
chance = IS_NPC(ch) ? ch->top_level
: (int) (ch->pcdata->learned[gsn_besiege]) ;
if ( number_percent( ) > chance )
{
send_to_char("You fail to disable the autopilot.\n\r",ch);
learn_from_failure( ch, gsn_besiege );
return;
}
if ( ship->class == FIGHTER_SHIP )
chance = IS_NPC(ch) ? ch->top_level
: (int) (ch->pcdata->learned[gsn_starfighters]) ;
if ( ship->class == MIDSIZE_SHIP )
chance = IS_NPC(ch) ? ch->top_level
: (int) (ch->pcdata->learned[gsn_midships]) ;
if ( ship->class == CAPITAL_SHIP )
chance = IS_NPC(ch) ? ch->top_level
: (int) (ch->pcdata->learned[gsn_capitalships]);
if ( number_percent( ) < chance )
{
set_char_color( AT_GREEN, ch );
send_to_char( "Autopilot disabled.\n\r", ch);
act( AT_PLAIN, "$n starts up the ship and begins the launch sequence.", ch,
NULL, argument , TO_ROOM );
echo_to_ship( AT_YELLOW , ship , "The ship's autopilot has been overridden.");
sprintf( buf, "%s disables the autopilot.", ship->name );
echo_to_room( AT_YELLOW , get_room_index(ship->location) , buf );
ship->currspeed = ship->realspeed;
ship->autopilot = FALSE;
if ( ship->class == FIGHTER_SHIP )
learn_from_success( ch, gsn_starfighters );
if ( ship->class == MIDSIZE_SHIP )
learn_from_success( ch, gsn_midships );
if ( ship->class == CAPITAL_SHIP )
learn_from_success( ch, gsn_capitalships );
learn_from_success( ch, gsn_besiege );
sprintf( buf, "%s has been sieged!!", ship->name );
echo_to_all( AT_RED , buf, 0 );
sprintf( logbuf, "%s has been sieged by %s!", ship->name, ch->name);
log_string( logbuf );
return;
}
set_char_color( AT_RED, ch );
send_to_char("You fail to work the controls properly!\n\r",ch);
if ( ship->class == FIGHTER_SHIP )
learn_from_failure( ch, gsn_starfighters );
if ( ship->class == MIDSIZE_SHIP )
learn_from_failure( ch, gsn_midships );
if ( ship->class == CAPITAL_SHIP )
learn_from_failure( ch, gsn_capitalships );
return;
}
void do_peek(CHAR_DATA *ch, char *argument )
{
char arg1 [MAX_INPUT_LENGTH];
CHAR_DATA *victim;
int chance;
OBJ_DATA *obj;
int iWear;
bool found;
if ( !ch->desc )
return;
if ( ch->position < POS_SLEEPING )
{
send_to_char( "You can't see anything but stars!\n\r", ch );
return;
}
if ( ch->position == POS_SLEEPING )
{
send_to_char( "You can't see anything, you're sleeping!\n\r", ch );
return;
}
if ( !check_blind( ch ) )
return;
argument = one_argument( argument, arg1 );
if ( arg1[0] == '\0' )
{
send_to_char("Peek at who?\n\r", ch);
return;
}
if ( ( victim = get_char_room( ch, arg1 ) ) == NULL )
{
send_to_char( "They're not here.", ch );
return;
}
else
{
chance = IS_NPC(ch) ? ch->top_level
: (int) (ch->pcdata->learned[gsn_peek]);
if(number_percent() > chance)
{
act( AT_ACTION, "$n looks at you.", ch, NULL, victim, TO_VICT );
act( AT_ACTION, "$n looks at $N.", ch, NULL, victim, TO_NOTVICT );
}
ch_printf(ch, "You peek at %s.\n\r", NAME(victim) );
if ( victim->description[0] != '\0' )
{
send_to_char( victim->description, ch );
}
else
{
act( AT_PLAIN, "You see nothing special about $M.", ch, NULL, victim, TO_CHAR );
}
show_condition( ch, victim );
found = FALSE;
for ( iWear = 0; iWear < MAX_WEAR; iWear++ )
{
if ( ( obj = get_eq_char( victim, iWear ) ) != NULL
&& can_see_obj( ch, obj ) )
{
if ( !found )
{
send_to_char( "\n\r", ch );
act( AT_PLAIN, "$N is using:", ch, NULL, victim, TO_CHAR );
found = TRUE;
}
send_to_char( "&g", ch );
send_to_char( where_name[iWear], ch );
send_to_char( format_obj_to_char( obj, ch, TRUE ), ch );
send_to_char( "\n\r", ch );
}
}
/*
* Crash fix here by Thoric
*/
if ( IS_NPC(ch) || victim == ch )
return;
if ( number_percent( ) < ch->pcdata->learned[gsn_peek] )
{
send_to_char( "\n\rYou peek at the inventory:\n\r", ch );
show_list_to_char( victim->first_carrying, ch, TRUE, TRUE );
learn_from_success( ch, gsn_peek );
}
else
if ( ch->pcdata->learned[gsn_peek] )
learn_from_failure( ch, gsn_peek );
return;
}
}
/* The command used to attempt a masked get- Arcturus */
void do_palm( CHAR_DATA *ch, char *argument )
{
char arg1[MAX_INPUT_LENGTH];
char arg2[MAX_INPUT_LENGTH];
OBJ_DATA *obj;
OBJ_DATA *obj_next;
OBJ_DATA *container;
sh_int number;
bool found;
argument = one_argument( argument, arg1 );
if ( is_number(arg1) )
{
number = atoi(arg1);
if ( number < 1 )
{
send_to_char( "That was easy...\n\r", ch );
return;
}
if ( (ch->carry_number + number) > can_carry_n(ch) )
{
send_to_char( "You can't carry that many.\n\r", ch );
return;
}
argument = one_argument( argument, arg1 );
}
else
number = 0;
argument = one_argument( argument, arg2 );
/* munch optional words */
if ( !str_cmp( arg2, "from" ) && argument[0] != '\0' )
argument = one_argument( argument, arg2 );
/* Get type. */
if ( arg1[0] == '\0' )
{
send_to_char( "Palm what?\n\r", ch );
return;
}
if ( ms_find_obj(ch) )
return;
if ( arg2[0] == '\0' )
{
if ( number <= 1 && str_cmp( arg1, "all" ) && str_prefix( "all.", arg1 ) )
{
/* 'get obj' */
obj = get_obj_list( ch, arg1, ch->in_room->first_content );
if ( !obj )
{
act( AT_PLAIN, "I see no $T here.", ch, NULL, arg1, TO_CHAR );
return;
}
separate_obj(obj);
get_obj_palm( ch, obj, NULL );
if ( char_died(ch) )
return;
if ( IS_SET( sysdata.save_flags, SV_GET ) )
save_char_obj( ch );
}
else
{
sh_int cnt = 0;
bool fAll;
char *chk;
if ( IS_SET( ch->in_room->room_flags, ROOM_DONATION ) )
{
send_to_char( "The gods frown upon such a display of greed!\n\r", ch );
return;
}
if ( !str_cmp(arg1, "all") )
fAll = TRUE;
else
fAll = FALSE;
if ( number > 1 )
chk = arg1;
else
chk = &arg1[4];
/* 'get all' or 'get all.obj' */
found = FALSE;
for ( obj = ch->in_room->first_content; obj; obj = obj_next )
{
obj_next = obj->next_content;
if ( ( fAll || nifty_is_name( chk, obj->name ) )
&& can_see_obj( ch, obj ) )
{
found = TRUE;
if ( number && (cnt + obj->count) > number )
split_obj( obj, number - cnt );
cnt += obj->count;
get_obj_palm( ch, obj, NULL );
if ( char_died(ch)
|| ch->carry_number >= can_carry_n( ch )
|| ch->carry_weight >= can_carry_w( ch )
|| (number && cnt >= number) )
{
if ( IS_SET(sysdata.save_flags, SV_GET)
&& !char_died(ch) )
save_char_obj(ch);
return;
}
}
}
if ( !found )
{
if ( fAll )
send_to_char( "I see nothing here.\n\r", ch );
else
act( AT_PLAIN, "I see no $T here.", ch, NULL, chk, TO_CHAR );
}
else
if ( IS_SET( sysdata.save_flags, SV_GET ) )
save_char_obj( ch );
}
}
else
{
/* 'get ... container' */
if ( !str_cmp( arg2, "all" ) || !str_prefix( "all.", arg2 ) )
{
send_to_char( "You can't do that.\n\r", ch );
return;
}
if ( ( container = get_obj_here( ch, arg2 ) ) == NULL )
{
act( AT_PLAIN, "I see no $T here.", ch, NULL, arg2, TO_CHAR );
return;
}
switch ( container->item_type )
{
default:
if ( !IS_OBJ_STAT( container, ITEM_COVERING ) )
{
send_to_char( "That's not a container.\n\r", ch );
return;
}
if ( ch->carry_weight + container->weight > can_carry_w( ch ) )
{
send_to_char( "It's too heavy for you to lift.\n\r", ch );
return;
}
break;
case ITEM_CONTAINER:
case ITEM_DROID_CORPSE:
case ITEM_CORPSE_PC:
case ITEM_CORPSE_NPC:
break;
}
if ( !IS_OBJ_STAT(container, ITEM_COVERING )
&& IS_SET(container->value[1], CONT_CLOSED) )
{
act( AT_PLAIN, "The $d is closed.", ch, NULL, container->name, TO_CHAR );
return;
}
if ( number <= 1 && str_cmp( arg1, "all" ) && str_prefix( "all.", arg1 ) )
{
/* 'get obj container' */
obj = get_obj_list( ch, arg1, container->first_content );
if ( !obj )
{
act( AT_PLAIN, IS_OBJ_STAT(container, ITEM_COVERING) ?
"I see nothing like that beneath the $T." :
"I see nothing like that in the $T.",
ch, NULL, arg2, TO_CHAR );
return;
}
separate_obj(obj);
get_obj_palm( ch, obj, container );
check_for_trap( ch, container, TRAP_GET );
if ( char_died(ch) )
return;
if ( IS_SET( sysdata.save_flags, SV_GET ) )
save_char_obj( ch );
}
else
{
int cnt = 0;
bool fAll;
char *chk;
/* 'get all container' or 'get all.obj container' */
/* if ( IS_OBJ_STAT( container, ITEM_DONATION ) )
{
send_to_char( "The gods frown upon such an act of greed!\n\r", ch );
return;
}*/
if ( !str_cmp(arg1, "all") )
fAll = TRUE;
else
fAll = FALSE;
if ( number > 1 )
chk = arg1;
else
chk = &arg1[4];
found = FALSE;
for ( obj = container->first_content; obj; obj = obj_next )
{
obj_next = obj->next_content;
if ( ( fAll || nifty_is_name( chk, obj->name ) )
&& can_see_obj( ch, obj ) )
{
found = TRUE;
if ( number && (cnt + obj->count) > number )
split_obj( obj, number - cnt );
cnt += obj->count;
get_obj_palm( ch, obj, container );
if ( char_died(ch)
|| ch->carry_number >= can_carry_n( ch )
|| ch->carry_weight >= can_carry_w( ch )
|| (number && cnt >= number) )
return;
}
}
if ( !found )
{
if ( fAll )
act( AT_PLAIN, IS_OBJ_STAT(container, ITEM_COVERING) ?
"I see nothing beneath the $T." :
"I see nothing in the $T.",
ch, NULL, arg2, TO_CHAR );
else
act( AT_PLAIN, IS_OBJ_STAT(container, ITEM_COVERING) ?
"I see nothing like that beneath the $T." :
"I see nothing like that in the $T.",
ch, NULL, arg2, TO_CHAR );
}
else
check_for_trap( ch, container, TRAP_GET );
if ( char_died(ch) )
return;
if ( found && IS_SET( sysdata.save_flags, SV_GET ) )
save_char_obj( ch );
}
}
return;
}
/* Palming it anyone? Masked Get */
void get_obj_palm( CHAR_DATA *ch, OBJ_DATA *obj, OBJ_DATA *container )
{
CLAN_DATA *clan;
int weight;
int chance, percent;
CHAR_DATA *rch;
chance = IS_NPC(ch) ? 50
: ch->pcdata->learned[gsn_palm]*.75+ch->mod_dex/2;
if ( !CAN_WEAR(obj, ITEM_TAKE)
&& (ch->top_level < sysdata.level_getobjnotake ) )
{
send_to_char( "You can't take that.\n\r", ch );
return;
}
if ( IS_OBJ_STAT( obj, ITEM_PROTOTYPE )
&& !can_take_proto( ch ) )
{
send_to_char( "A godly force prevents you from getting close to it.\n\r", ch );
return;
}
if ( ch->carry_number + get_obj_number( obj ) > can_carry_n( ch ) )
{
act( AT_PLAIN, "$d: you can't carry that many items.",
ch, NULL, obj->name, TO_CHAR );
return;
}
if ( IS_OBJ_STAT( obj, ITEM_COVERING ) )
weight = obj->weight;
else
weight = get_obj_weight( obj );
if ( ch->carry_weight + weight > can_carry_w( ch ) )
{
act( AT_PLAIN, "$d: you can't carry that much weight.",
ch, NULL, obj->name, TO_CHAR );
return;
}
if ( container )
{
act( AT_ACTION, IS_OBJ_STAT(container, ITEM_COVERING) ?
"You palm $p from beneath $P." : "You palm $p from $P",
ch, obj, container, TO_CHAR );
/* Not everyone can always catch a failed palm attempt, we'll limit it. */
for ( rch = ch->in_room->first_person; rch; rch = rch->next_in_room )
{
percent = number_percent();
if ( !can_see( rch, ch ) )
percent -= 25; /* Kinda hard to detect someone you can't see. */
if( rch == ch ) /* blah that I forgot this. */
continue;
if(IS_AWAKE(rch))
{
if(IS_AFFECTED(rch, AFF_SIT_AWARE))
{
percent += 15;
}
}
else /* How are you going to see someone get something when you are asleep? */
{
percent = 0;
}
if(IS_IMMORTAL(rch) && IS_AWAKE(rch)) /* You aren't sneaking anything by an immortal. */
percent += 100;
if(percent > chance)
{
set_char_color(AT_ACTION, rch);
if(IS_OBJ_STAT(container, ITEM_COVERING) )
ch_printf(rch, "%s gets %s from beneath %s.\n\r", NAME(ch), obj->short_descr, container->short_descr);
else
ch_printf(rch, "%s gets %s from %s.\n\r", NAME(ch), obj->short_descr, container->short_descr);
learn_from_failure(ch, gsn_palm);
}
else
learn_from_success(ch, gsn_palm);
}
obj_from_obj( obj );
}
else
{
act( AT_ACTION, "You palm $p.", ch, obj, container, TO_CHAR );
/* Not everyone can always catch a failed palm attempt, we'll limit it. */
for ( rch = ch->in_room->first_person; rch; rch = rch->next_in_room )
{
percent = number_percent();
if ( !can_see( rch, ch ) )
percent -= 25; /* Kinda hard to detect someone you can't see. */
if( rch == ch ) /* Damn me for forgetting this again. */
continue;
if(IS_AWAKE(rch))
{
if(IS_AFFECTED(rch, AFF_SIT_AWARE))
{
percent += 15;
}
}
else /* How are you going to see someone get something when you are asleep? */
{
percent = 0;
}
if(IS_IMMORTAL(rch) && IS_AWAKE(rch)) /* You aren't sneaking anything by an immortal. */
percent += 100;
if(percent > chance)
{
set_char_color(AT_ACTION, rch);
ch_printf(rch, "%s gets %s.", NAME(ch), obj->short_descr);
learn_from_failure(ch, gsn_palm);
}
else
learn_from_success(ch, gsn_palm);
}
obj_from_room( obj );
}
/* Clan storeroom checks */
if ( IS_SET(ch->in_room->room_flags, ROOM_CLANSTOREROOM)
&& (!container || container->carried_by == NULL) )
for ( clan = first_clan; clan; clan = clan->next )
if ( clan->storeroom == ch->in_room->vnum )
save_clan_storeroom(ch, clan);
if ( obj->item_type != ITEM_CONTAINER )
check_for_trap( ch, obj, TRAP_GET );
if ( char_died(ch) )
return;
if ( obj->item_type == ITEM_MONEY )
{
ch->gold += obj->value[0];
extract_obj( obj );
}
else
{
obj = obj_to_char( obj, ch );
}
if ( char_died(ch) || obj_extracted(obj) )
return;
oprog_get_trigger(ch, obj);
return;
}
/* Tuck it away, without being seen. Redone put with mask chance. -Arcturus */
void do_tuck( CHAR_DATA *ch, char *argument )
{
char arg1[MAX_INPUT_LENGTH];
char arg2[MAX_INPUT_LENGTH];
OBJ_DATA *container;
OBJ_DATA *obj;
OBJ_DATA *obj_next;
CLAN_DATA *clan;
sh_int count;
int number;
bool save_char = FALSE;
int percent, chance;
CHAR_DATA *rch;
chance = IS_NPC(ch) ? 50
: ch->pcdata->learned[gsn_tuck]*.75+ch->mod_dex/2;
argument = one_argument( argument, arg1 );
if ( is_number(arg1) )
{
number = atoi(arg1);
if ( number < 1 )
{
send_to_char( "That was easy...\n\r", ch );
return;
}
argument = one_argument( argument, arg1 );
}
else
number = 0;
argument = one_argument( argument, arg2 );
/* munch optional words */
if ( (!str_cmp(arg2, "into") || !str_cmp(arg2, "inside") || !str_cmp(arg2, "in"))
&& argument[0] != '\0' )
argument = one_argument( argument, arg2 );
if ( arg1[0] == '\0' || arg2[0] == '\0' )
{
send_to_char( "Tuck what in what?\n\r", ch );
return;
}
if ( ms_find_obj(ch) )
return;
if ( !str_cmp( arg2, "all" ) || !str_prefix( "all.", arg2 ) )
{
send_to_char( "You can't do that.\n\r", ch );
return;
}
if ( ( container = get_obj_here( ch, arg2 ) ) == NULL )
{
act( AT_PLAIN, "I see no $T here.", ch, NULL, arg2, TO_CHAR );
return;
}
if ( !container->carried_by && IS_SET( sysdata.save_flags, SV_PUT ) )
save_char = TRUE;
if ( IS_OBJ_STAT(container, ITEM_COVERING) )
{
if ( ch->carry_weight + container->weight > can_carry_w( ch ) )
{
send_to_char( "It's too heavy for you to lift.\n\r", ch );
return;
}
}
else
{
if ( container->item_type != ITEM_CONTAINER )
{
send_to_char( "That's not a container.\n\r", ch );
return;
}
if ( IS_SET(container->value[1], CONT_CLOSED) )
{
act( AT_PLAIN, "The $d is closed.", ch, NULL, container->name, TO_CHAR );
return;
}
}
if ( number <= 1 && str_cmp( arg1, "all" ) && str_prefix( "all.", arg1 ) )
{
/* 'put obj container' */
if ( ( obj = get_obj_carry( ch, arg1 ) ) == NULL )
{
send_to_char( "You do not have that item.\n\r", ch );
return;
}
if ( obj == container )
{
send_to_char( "You can't fold it into itself.\n\r", ch );
return;
}
if ( !can_drop_obj( ch, obj ) )
{
send_to_char( "You can't let go of it.\n\r", ch );
return;
}
if ( (IS_OBJ_STAT(container, ITEM_COVERING)
&& (get_obj_weight( obj ) / obj->count)
> ((get_obj_weight( container ) / container->count)
- container->weight)) )
{
send_to_char( "It won't fit under there.\n\r", ch );
return;
}
if ( (get_obj_weight( obj ) / obj->count)
+ (get_obj_weight( container ) / container->count)
> container->value[0] )
{
send_to_char( "It won't fit.\n\r", ch );
return;
}
separate_obj(obj);
separate_obj(container);
obj_from_char( obj );
obj = obj_to_obj( obj, container );
check_for_trap ( ch, container, TRAP_PUT );
if ( char_died(ch) )
return;
count = obj->count;
obj->count = 1;
act( AT_ACTION, IS_OBJ_STAT( container, ITEM_COVERING )
? "You tuck $p beneath $P." : "You tuck $p in $P.",
ch, obj, container, TO_CHAR );
for ( rch = ch->in_room->first_person; rch; rch = rch->next_in_room )
{
percent = number_percent();
if ( !can_see( rch, ch ) )
percent -= 25; /* Kinda hard to detect someone you can't see. */
if( rch == ch ) /* Damn me for forgetting this again. */
continue;
if(IS_AWAKE(rch))
{
if(IS_AFFECTED(rch, AFF_SIT_AWARE))
{
percent += 15;
}
}
else /* How are you going to see someone get something when you are asleep? */
{
percent = 0;
}
if(IS_IMMORTAL(rch) && IS_AWAKE(rch)) /* You aren't sneaking anything by an immortal. */
percent += 100;
if(percent > chance)
{
set_char_color(AT_ACTION, rch);
if(IS_OBJ_STAT( container, ITEM_COVERING ) )
ch_printf(rch, "%s hides %s beneath %s.\n\r", NAME(ch), obj->short_descr, container->short_descr);
else
ch_printf(rch, "%s puts %s in %s.\n\r", NAME(ch), obj->short_descr, container->short_descr);
learn_from_failure(ch, gsn_tuck);
}
else
learn_from_success(ch, gsn_tuck);
}
obj->count = count;
if ( save_char )
save_char_obj(ch);
/* Clan storeroom check */
if ( IS_SET(ch->in_room->room_flags, ROOM_CLANSTOREROOM)
&& container->carried_by == NULL)
for ( clan = first_clan; clan; clan = clan->next )
if ( clan->storeroom == ch->in_room->vnum )
save_clan_storeroom(ch, clan);
}
else
{
bool found = FALSE;
int cnt = 0;
bool fAll;
char *chk;
if ( !str_cmp(arg1, "all") )
fAll = TRUE;
else
fAll = FALSE;
if ( number > 1 )
chk = arg1;
else
chk = &arg1[4];
separate_obj(container);
/* 'put all container' or 'put all.obj container' */
for ( obj = ch->first_carrying; obj; obj = obj_next )
{
obj_next = obj->next_content;
if ( ( fAll || nifty_is_name( chk, obj->name ) )
&& can_see_obj( ch, obj )
&& obj->wear_loc == WEAR_NONE
&& obj != container
&& can_drop_obj( ch, obj )
&& get_obj_weight( obj ) + get_obj_weight( container )
<= container->value[0] )
{
if ( number && (cnt + obj->count) > number )
split_obj( obj, number - cnt );
cnt += obj->count;
obj_from_char( obj );
act( AT_ACTION, "You tuck $p in $P.", ch, obj, container, TO_CHAR );
for ( rch = ch->in_room->first_person; rch; rch = rch->next_in_room )
{
percent = number_percent();
if ( !can_see( rch, ch ) )
percent -= 25; /* Kinda hard to detect someone you can't see. */
if( rch == ch ) /* Damn me for forgetting this again. */
continue;
if(IS_AWAKE(rch))
{
if(IS_AFFECTED(rch, AFF_SIT_AWARE))
{
percent += 15;
}
}
else /* How are you going to see someone get something when you are asleep? */
{
percent = 0;
}
if(IS_IMMORTAL(rch) && IS_AWAKE(rch)) /* You aren't sneaking anything by an immortal. */
percent += 100;
if(percent > chance)
{
set_char_color(AT_ACTION, rch);
ch_printf(rch, "%s puts %s in %s.\n\r", NAME(ch), obj->short_descr, container->short_descr);
learn_from_failure(ch, gsn_tuck);
}
else
learn_from_success(ch, gsn_tuck);
}
obj = obj_to_obj( obj, container );
found = TRUE;
check_for_trap( ch, container, TRAP_PUT );
if ( char_died(ch) )
return;
if ( number && cnt >= number )
break;
}
}
/*
* Don't bother to save anything if nothing was dropped -Thoric
*/
if ( !found )
{
if ( fAll )
act( AT_PLAIN, "You are not carrying anything.",
ch, NULL, NULL, TO_CHAR );
else
act( AT_PLAIN, "You are not carrying any $T.",
ch, NULL, chk, TO_CHAR );
return;
}
if ( save_char )
save_char_obj(ch);
/* Clan storeroom check */
if ( IS_SET(ch->in_room->room_flags, ROOM_CLANSTOREROOM)
&& container->carried_by == NULL )
for ( clan = first_clan; clan; clan = clan->next )
if ( clan->storeroom == ch->in_room->vnum )
save_clan_storeroom(ch, clan);
}
return;
}