From: Ferris@FootPrints.net
void do_push_drag( CHAR_DATA *ch, char *argument, char *verb )
{
char arg1[MAX_INPUT_LENGTH];
char arg2[MAX_INPUT_LENGTH];
char buf[MAX_STRING_LENGTH];
ROOM_INDEX_DATA *in_room;
ROOM_INDEX_DATA *to_room;
CHAR_DATA *victim;
EXIT_DATA *pexit;
OBJ_DATA *obj;
int door;
argument = one_argument( argument, arg1 );
argument = one_argument( argument, arg2 );
victim = get_char_room(ch,arg1);
obj = get_obj_list( ch, arg1, ch->in_room->contents );
if ( arg1[0] == '\0' || arg2[0] == '\0' )
{
sprintf( buf, "%s whom or what where?\n\r", capitalize(verb));
send_to_char( buf, ch );
return;
}
if ( (!victim || !can_see(ch,victim))
&& (!obj || !can_see_obj(ch,obj)) )
{
sprintf(buf,"%s whom or what where?\n\r", capitalize(verb));
send_to_char( buf, ch );
return;
}
if ( !str_cmp( arg2, "n" ) || !str_cmp( arg2, "north" ) ) door = 0;
else if ( !str_cmp( arg2, "e" ) || !str_cmp( arg2, "east" ) ) door = 1;
else if ( !str_cmp( arg2, "s" ) || !str_cmp( arg2, "south" ) ) door = 2;
else if ( !str_cmp( arg2, "w" ) || !str_cmp( arg2, "west" ) ) door = 3;
else if ( !str_cmp( arg2, "u" ) || !str_cmp( arg2, "up" ) ) door = 4;
else if ( !str_cmp( arg2, "d" ) || !str_cmp( arg2, "down" ) ) door = 5;
else
{
sprintf( buf, "Alas, you cannot %s in that direction.\n\r", verb );
send_to_char( buf, ch );
return;
}
if ( obj )
{
in_room = obj->in_room;
if ( ( pexit = in_room->exit[door] ) == NULL
|| ( to_room = pexit->u1.to_room ) == NULL
|| !can_see_room(ch,pexit->u1.to_room))
{
sprintf( buf, "Alas, you cannot %s in that direction.\n\r", verb );
send_to_char( buf, ch );
return;
}
if ( !IS_SET(obj->wear_flags, ITEM_TAKE) || !can_loot(ch,obj) )
{
send_to_char( "It won't budge.\n\r", ch );
return;
}
if ( IS_SET(pexit->exit_info, EX_CLOSED)
|| IS_SET(pexit->exit_info,EX_NOPASS) )
{
act( "You cannot $t it through the $d.", ch, verb, pexit->keyword, TO_CHAR );
act( "$n decides to $t $P around!", ch, verb, obj, TO_ROOM );
return;
}
act( "You attempt to $T $p out of the room.", ch, obj, verb, TO_CHAR );
act( "$n is attempting to $T $p out of the room.", ch, obj, verb, TO_ROOM );
if ( obj->weight > (2 * can_carry_w (ch)) )
{
act( "$p is too heavy to $T.\n\r", ch, obj, verb, TO_CHAR);
act( "$n attempts to $T $p, but it is too heavy.\n\r", ch, obj, verb, TO_ROOM);
return;
}
if ( !IS_IMMORTAL(ch)
|| IS_SET(ch->in_room->room_flags, ROOM_SAFE)
|| IS_SET(ch->in_room->room_flags, ROOM_PRIVATE)
|| IS_SET(ch->in_room->room_flags, ROOM_SOLITARY)
|| IS_SET(ch->in_room->room_flags, ROOM_NO_RECALL)
|| IS_SET(ch->in_room->room_flags, ROOM_NO_RECALL)
|| (number_percent() > 75) )
{
send_to_char( "It won't budge.\n\r", ch );
return;
}
if ( ch->move > 10 )
{
ch->move -= 10;
send_to_char( "You succeed!\n\r", ch );
act( "$n succeeds!", ch, NULL, NULL, TO_ROOM );
obj_from_room( obj );
obj_to_room( obj, to_room );
if (!str_cmp( verb, "drag" ))
move_char( ch, door, FALSE );
}
else
{
sprintf( buf, "You are too tired to %s anything around!\n\r", verb );
send_to_char( buf, ch );
}
}
else
{
if ( ch == victim )
{
act( "You $t yourself about the room and look very silly.", ch, verb, NULL, TO_CHAR );
act( "$n decides to be silly and $t $mself about the room.", ch, verb, NULL, TO_ROOM );
return;
}
in_room = victim->in_room;
if ( ( pexit = in_room->exit[door] ) == NULL
|| ( to_room = pexit->u1.to_room ) == NULL
|| !can_see_room(victim,pexit->u1.to_room))
{
sprintf( buf, "Alas, you cannot %s them that way.\n\r", verb );
send_to_char( buf, ch );
return;
}
if (IS_SET(pexit->exit_info, EX_CLOSED)
&& (!IS_AFFECTED(victim, AFF_PASS_DOOR) || IS_SET(pexit->exit_info,EX_NOPASS)))
{
act( "You try to $t them through the $d.", ch, verb, pexit->keyword, TO_CHAR );
act( "$n decides to $t you around!", ch, verb, victim, TO_VICT );
act( "$n decides to $t $N around!", ch, verb, victim, TO_NOTVICT );
return;
}
act( "You attempt to $t $N out of the room.", ch, verb, victim, TO_CHAR );
act( "$n is attempting to $t you out of the room!", ch, verb, victim, TO_VICT );
act( "$n is attempting to $t $N out of the room.", ch, verb, victim, TO_NOTVICT );
if ( !IS_IMMORTAL(ch)
|| (IS_NPC(victim)
&& (IS_SET(victim->act,ACT_TRAIN)
|| IS_SET(victim->act,ACT_PRACTICE)
|| IS_SET(victim->act,ACT_IS_HEALER)
|| IS_SET(victim->act,ACT_IS_CHANGER)
|| IS_SET(victim->imm_flags,IMM_SUMMON)
|| victim->pIndexData->pShop ))
|| victim->in_room == NULL
|| IS_SET(victim->in_room->room_flags, ROOM_SAFE)
|| IS_SET(victim->in_room->room_flags, ROOM_PRIVATE)
|| IS_SET(victim->in_room->room_flags, ROOM_SOLITARY)
|| IS_SET(victim->in_room->room_flags, ROOM_NO_RECALL)
|| IS_SET(ch->in_room->room_flags, ROOM_NO_RECALL)
|| (!str_cmp( verb, "drag" ) && victim->position >= POS_STANDING)
|| (!str_cmp( verb, "push" ) && victim->position != POS_STANDING)
|| is_safe(ch,victim)
|| (number_percent() > 75)
|| victim->level >= ch->level + 5
|| (!IS_NPC(victim) && victim->level >= LEVEL_HERO) )
{
send_to_char( "They won't budge.\n\r", ch );
return;
}
if ( ch->move > 10 )
{
ch->move -= 10;
send_to_char( "You succeed!\n\r", ch );
act( "$n succeeds!", ch, NULL, NULL, TO_ROOM );
if (!str_cmp( verb, "drag" ))
move_char( ch, door, FALSE );
move_char( victim, door, FALSE );
}
else
{
sprintf( buf, "You are too tired to %s anybody around!\n\r", verb );
send_to_char( buf, ch );
}
}
return;
}
void do_push( CHAR_DATA *ch, char *argument )
{
do_push_drag( ch, argument, "push" );
return;
}
void do_drag( CHAR_DATA *ch, char *argument )
{
do_push_drag( ch, argument, "drag" );
return;
}