#include <sys/types.h>
#include <stdio.h>
#include "define.h"
#include "struct.h"
bool can_hide ( char_data*, bool );
void do_gouge( char_data* ch, char* argument )
{
/*
char_data* victim;
int delay;
if( is_confused_pet( ch ) )
return;
if( is_mob( ch ) )
return;
if( is_set( ch->pcdata->pfile->flags, PLR_PARRY ) ) {
send( ch, "You can not gouge with parry on.\n\r" );
return;
}
if( ch->get_skill( SKILL_EYE_GOUGE ) < 1 ) {
send( ch, "You do not know how to gouge eyes.\n\r" );
return;
}
if( victim == ch ) {
send( ch, "Gouging your own eyes is not very productive.\n\r" );
return;
}
if( ( victim = get_victim( ch, argument, "Gouge whose eyes?\n\r" ) ) ==
NULL )
return;
if( victim->species != NULL
&& !is_set( &victim->species->act_flags, ACT_HAS_EYES ) ) {
send( ch, "This creature has no eyes and cannot be blinded.\n\r" );
return;
}
if( victim->fighting != ch && ch->fighting != victim ) {
if( !can_kill( ch, victim ) )
return;
check_killer( ch, victim );
}
delay = gouge_attack( ch, victim );
start_fight( ch, victim );
set_attack( ch, victim, delay );
remove_bit( &ch->status, STAT_LEAPING );
remove_bit( &ch->status, STAT_WIMPY );
ch->improve_skill( SKILL_EYE_GOUGE );
*/
return;
}
int gouge_attack( char_data* ch, char_data* victim )
{
int roll;
roll = number_range( 0, 20 )+
+ch->get_skill( SKILL_EYE_GOUGE )/2
+(ch->shdata->dexterity-victim->shdata->dexterity)/2
+( ( ch->shdata->level-victim->shdata->level )/4);
if( roll < 6 ) {
send( ch, "You attempt to gouge %s but are unsuccessful.\n\r", victim );
send( victim, "%s attempts to gouge you but is unsuccessful.\n\r", ch );
send( *ch->array,
"%s attempts to gouge %s but is unsuccessful.\n\r",
ch, victim );
return 32;
}
if( roll > 20 ) {
send( ch, "You gouge %s in the eye!!\n\r", victim );
send( victim, "%s gouges you in the eye!!\n\r", ch );
send( *ch->array, "%s gouges %s in the eye!!\n\r", ch, victim );
set_bit( victim->affected_by, AFF_BLIND );
disrupt_spell( victim );
set_delay( victim, 32 );
return 20;
}
send( ch, "You attempt to gouge %s but fail.\n\r", victim );
send( victim, "%s attempts to gouge you but fails.\n\r", ch );
send( *ch->array,
"%s attempts to gouge %s but fails.\n\r", ch, victim );
return 20;
}
void do_disguise( char_data*, char* )
{
return;
}
void do_garrote( char_data* ch, char* argument )
{
/*
char_data* victim;
int level = ch->get_skill( SKILL_GARROTE );
obj_data* garrote;
for( garrote = ch->contents; garrote != NULL; garrote->next_content )
if( garrote->pIndexData->item_type == ITEM_GARROTE )
break;
if( garrote == NULL ) {
send( ch, "You don't have a garrote.\n\r" );
return;
}
if( *argument == '\0' ) {
send( ch, "You have no target for your garrote.\n\b");
return;
}
if( level == 0 ) {
send( "Garrote is not part of your repertoire\n\r", ch );
return;
}
if( !can_kill( ch, victim ) )
return;
set_bit( victim->affected_by, AFF_CHOKING );
send( victim, "A garotte begins to tighten around your neck.\n\r" );
send( *victim->array, "The garrote tightens around %s neck.\n\r", victim );
start_fight( ch, victim );
set_attack( ch, victim, 20 );
remove_bit( &ch->status, STAT_WIMPY );
remove_bit( &ch->status, STAT_LEAPING );
set_delay( victim, 32 );
ch->improve_skill( SKILL_GARROTE );
attack( ch, victim, "garrote", garrote, -1, 0 );
*/
return;
}
/*
* BACKSTAB FUNCTIONS
*/
void do_backstab( char_data* ch, char* argument )
{
/*
char_data* victim;
obj_data* obj;
int skill = ch->get_skill( SKILL_BACKSTAB );
if( ch->mount != NULL ) {
send( ch, "Backstabbing while mounted is beyond your skill.\n\r" );
return;
}
if( *argument == '\0' ) {
send( ch, "Backstab whom?\n\r" );
return;
}
if( ( victim = get_char_room( ch, argument, TRUE ) ) == NULL )
return;
if( opponent( ch ) != NULL ) {
send( "You are already fighting someone.\n\r", ch );
return;
}
if( victim == ch ) {
send( "How can you sneak up on yourself?\n\r", ch );
return;
}
if( skill == 0 ) {
send( "Backstabbing is not part of your repertoire.\n\r", ch );
return;
}
if( ( obj = get_eq_char( ch, WEAR_HELD_R ) ) == NULL ) {
send( "You need to be wielding a weapon to backstab.\n\r", ch );
return;
}
if( !is_set( obj->pIndexData->extra_flags, OFLAG_BACKSTAB ) ) {
send( ch, "It isn't possible to use %s to backstab.\n\r", obj );
return;
}
if( opponent( ch ) != NULL ) {
send( ch, "You are unable to backstab while fighting someone.\n\r" );
return;
}
if( ch->Seen( victim ) && includes( victim->aggressive, ch ) ) {
send( ch, "%s is too wary of you for backstab to succeed.\n\r", victim );
return;
}
if( !can_kill( ch, victim ) )
return;
check_killer( ch, victim );
start_fight( ch, victim );
set_attack( ch, victim, 20 );
remove_bit( &ch->status, STAT_WIMPY );
remove_bit( &ch->status, STAT_LEAPING );
attack( ch, victim, "backstab", obj, -1, 0 );
*/
return;
}
/*
* STEAL ROUTINES
*/
void do_steal( char_data* ch, char* argument )
{
/*
char buf [ MAX_INPUT_LENGTH ];
char arg [ MAX_INPUT_LENGTH ];
char_data* victim;
obj_data* obj;
if( is_confused_pet( ch ) )
return;
if( is_mob( ch ) )
return;
if( is_set( ch->pcdata->pfile->flags, PLR_PARRY ) ) {
send( ch, "You can not steal with parry on.\n\r" );
return;
}
argument = one_argument( argument, arg );
for( ; ; ) {
argument = one_argument( argument, buf );
if( buf[ 0 ] == '\0' || !strcasecmp( buf, "from" ) )
break;
sprintf( arg+strlen( arg ), " %s", buf );
}
if( arg[0] == '\0' || argument[0] == '\0' ) {
send( "Syntax: steal <object> from <character>\n\r", ch );
return;
}
if( ( victim = get_char_room( ch, argument, TRUE ) ) == NULL )
return;
if( victim == ch ) {
send( "That's pointless.\n\r", ch );
return;
}
if( !can_kill( ch, victim ) ) {
send( "You can't steal from them.\n\r", ch );
return;
}
remove_bit( ch->pcdata->pfile->flags, PLR_PARRY );
if( !ch->check_skill( SKILL_STEAL )
|| number_range( 3, 35 ) < victim->Intelligence( ) ) {
leave_shadows( ch );
start_fight( ch, victim );
set_attack( ch, victim, number_range( 5, 20 ) );
set_delay( ch, 32 );
remove_bit( &ch->status, STAT_LEAPING );
remove_bit( &ch->status, STAT_WIMPY );
send( victim, "%s tried to steal from you.\n\r", ch );
send( *ch->array, "%s tried to steal from %s.\n\r", ch, victim );
modify_reputation( ch, victim, REP_STOLE_FROM );
if( victim->pShop != NULL ) {
sprintf( buf, "Guards! %s is a thief.", ch->Name( victim ) );
do_yell( victim, buf );
summon_help( victim, ch );
}
return;
}
if( ( obj = get_obj_inv( victim, arg ) ) == NULL ) {
send( "You can't find it.\n\r", ch );
return;
}
if( !obj->droppable( ) ) {
send( ch, "You can't pry it away.\n\r" );
return;
}
if( ch->num_ins >= ch->can_carry_n( ) ) {
send( "You have your hands full.\n\r", ch );
return;
}
if( ch->wght_ins+weight( obj ) > ch->can_carry_w( ) ) {
send( "You can't carry that much weight.\n\r", ch );
return;
}
obj = remove( obj, 1 );
put_obj( obj, ch );
send( ch, "You succeeded in stealing %s.\n\r", obj );
ch->improve_skill( SKILL_STEAL );
*/
return;
}
void do_heist( char_data* ch, char* argument )
{
/*
char buf [ MAX_INPUT_LENGTH ];
char arg [ MAX_INPUT_LENGTH ];
char_data* victim;
obj_data* obj;
if( is_confused_pet( ch ) )
return;
if( is_mob( ch ) )
return;
if( is_set( ch->pcdata->pfile->flags, PLR_PARRY ) ) {
send( ch, "You can not steal with parry on.\n\r" );
return;
}
argument = one_argument( argument, arg );
for( ; ; ) {
argument = one_argument( argument, buf );
if( buf[ 0 ] == '\0' || !strcasecmp( buf, "from" ) )
break;
sprintf( arg+strlen( arg ), " %s", buf );
}
if( arg[0] == '\0' || argument[0] == '\0' ) {
send( "Syntax: steal <object> from <character>\n\r", ch );
return;
}
if( ( victim = get_char_room( ch, argument, TRUE ) ) == NULL )
return;
if( victim == ch ) {
send( "That's pointless.\n\r", ch );
return;
}
if( !can_kill( ch, victim ) ) {
send( "You can't steal from them.\n\r", ch );
return;
}
remove_bit( ch->pcdata->pfile->flags, PLR_PARRY );
if( !ch->check_skill( SKILL_STEAL )
|| number_range( 3, 35 ) < victim->Intelligence( ) ) {
leave_shadows( ch );
start_fight( ch, victim );
set_attack( ch, victim, number_range( 5, 20 ) );
set_delay( ch, 32 );
remove_bit( &ch->status, STAT_LEAPING );
remove_bit( &ch->status, STAT_WIMPY );
send( victim, "%s tried to steal from you.\n\r", ch );
send( *ch->array, "%s tried to steal from %s.\n\r", ch, victim );
modify_reputation( ch, victim, REP_STOLE_FROM );
if( victim->pShop != NULL ) {
sprintf( buf, "Guards! %s is a thief.", ch->Name( victim ) );
do_yell( victim, buf );
summon_help( victim, ch );
}
return;
}
if( ( obj = get_obj_inv( victim, arg ) ) == NULL ) {
send( "You can't find it.\n\r", ch );
return;
}
if( !obj->droppable( ) ) {
send( ch, "You can't pry it away.\n\r" );
return;
}
if( ch->num_ins >= ch->can_carry_n( ) ) {
send( "You have your hands full.\n\r", ch );
return;
}
if( ch->wght_ins+weight( obj ) > ch->can_carry_w( ) ) {
send( "You can't carry that much weight.\n\r", ch );
return;
}
obj = remove( obj, 1 );
put_obj( obj, ch );
send( ch, "You succeeded in stealing %s.\n\r", obj );
ch->improve_skill( SKILL_STEAL );
*/
return;
}
/*
* SNEAK FUNCTIONS
*/
void do_sneak( char_data* ch, char* argument )
{
if( not_player( ch ) )
return;
if( ch->shdata->skill[ SKILL_SNEAK ] == 0 ) {
send( ch, "Sneaking is not something you are adept at.\n\r" );
return;
}
if( is_set( ch->pcdata->pfile->flags, PLR_SNEAK ) ) {
remove_bit( ch->pcdata->pfile->flags, PLR_SNEAK );
send( ch, "You stop sneaking.\n\r" );
return;
}
if( !can_hide( ch, TRUE ) )
return;
set_bit( ch->pcdata->pfile->flags, PLR_SNEAK );
send( ch, "You start sneaking.\n\r" );
send( ch, "[Sneak increases movement point cost by 2 per move.]\n\r" );
}
/*
* HIDE ROUTINES
*/
bool can_hide( char_data* ch, bool msg )
{
room_data* room = ch->in_room;
if( ch->mount != NULL ) {
if( msg )
send( ch, "Hiding while mounted is impossible.\n\r" );
return FALSE;
}
if( ch->fighting != NULL ) {
if( msg )
send( ch, "Hiding while fighting someone is difficult.\n\r" );
return FALSE;
}
if( is_set( ch->affected_by, AFF_FIRE_SHIELD )
|| is_set( ch->affected_by, AFF_FAERIE_FIRE ) ) {
if( msg )
send( ch, "Your fiery glow rathers spoils that.\n\r" );
return FALSE;
}
if( water_logged( room ) ) {
if( msg )
send( ch, "Hiding is unsoluble.\n\r" );
return FALSE;
}
return TRUE;
}
void do_camouflage( char_data* ch, char* )
{
/*
char_data* rch;
if( not_player( ch ) )
return;
if( ch->shdata->skill[ SKILL_CAMOUFLAGE ] == 0 ) {
send( ch, "Camouflage is not something you are adept at.\n\r" );
return;
}
if( leave_camouflage( ch ) )
return;
if( !can_hide( ch, TRUE ) )
return;
for( rch = ch->in_room->people; rch != NULL; rch = rch->next_in_room )
if( rch != ch && ch->Seen( rch ) )
add( ch->seen_by, rch );
send( ch, "You camouflage yourself and disappear from plain view.\n\r" );
fsend_seen( ch, "%s tries to blend in with %s surroundings.\n\r", ch,
ch->His_Her( ) );
set_bit( &ch->status, STAT_CAMOUFLAGED );
set_bit( ch->affected_by, AFF_CAMOUFLAGE );
ch->improve_skill( SKILL_CAMOUFLAGE );
*/
return;
}
void do_hide( char_data* ch, char* )
{
char_data* rch;
if( not_player( ch ) )
return;
if( ch->shdata->skill[ SKILL_HIDE ] == 0 ) {
send( ch, "Hiding is not something you are adept at.\n\r" );
return;
}
if( leave_shadows( ch ) )
return;
if( !can_hide( ch, TRUE ) )
return;
for( int i = 0; i < *ch->array; i++ )
if( ( rch = character( ch->array->list[i] ) ) != NULL
&& rch != ch && ch->Seen( rch ) )
ch->seen_by += rch;
send( ch, "You step into the shadows.\n\r" );
fsend_seen( ch, "%s steps into the shadows attempting to hide.\n\r", ch );
set_bit( &ch->status, STAT_HIDING );
ch->improve_skill( SKILL_HIDE );
}
bool leave_camouflage( char_data* ch )
{
if( !is_set( &ch->status, STAT_CAMOUFLAGED )
&& !is_set( ch->affected_by, AFF_CAMOUFLAGE ) )
return FALSE;
remove_bit( &ch->status, STAT_CAMOUFLAGED );
remove_bit( ch->affected_by, AFF_CAMOUFLAGE );
clear( ch->seen_by );
send( ch, "You stop camouflaging yourself.\n\r" );
send_seen( ch, "%s suddenly appears from nowhere.\n\r", ch );
return TRUE;
}
bool leave_shadows( char_data* ch )
{
if( !is_set( &ch->status, STAT_HIDING ) )
return FALSE;
remove_bit( &ch->status, STAT_HIDING );
clear( ch->seen_by );
send( ch, "You stop hiding.\n\r" );
send_seen( ch, "%s steps from the shadows.\n\r", ch );
return TRUE;
}
/*
* DIP ROUTINE
*/
void do_dip( char_data* ch, char* argument )
{
char arg [ MAX_INPUT_LENGTH ];
obj_data* container;
obj_data* obj;
int value;
affect_data affect;
int spell;
if( !two_argument( argument, "from", arg ) ) {
send( ch, "Syntax: Dip <object> [into] <object>\n\r" );
return;
}
if( ( obj = one_object( ch, arg, "dip",
&ch->contents, ch->array ) ) == NULL )
return;
if( ( container = one_object( ch, argument, "dip into",
&ch->contents, ch->array ) ) == NULL )
return;
if( container->pIndexData->item_type != ITEM_DRINK_CON
&& container->pIndexData->item_type != ITEM_FOUNTAIN ) {
send( ch, "%s isn't something you can dip things into.\n\r", container );
return;
}
if( container == obj ) {
send( ch, "You can't dip %s into itself.\n\r", obj );
return;
}
value = container->value[1];
container->value[1] = -2;
if( value == 0 ) {
send( ch, "%s is empty.\n\r", container );
container->value[1] = value;
return;
}
if( strip_affect( obj, AFF_BURNING ) ) {
fsend( ch, "You extinguish %s by quickly dipping it into %s.",
obj, container );
fsend( *ch->array,
"%s extinguishes %s by quickly dipping it into %s.",
ch, obj, container );
return;
}
send( ch, "You dip %s into %s.\n\r", obj, container );
send_seen( ch, "%s dips %s into %s.\n\r", ch, obj, container );
container->value[1] = ( value == -1 ? -1 : max( 0, value-5 ) );
if( ( spell = liquid_table[container->value[2]].spell ) == -1 )
return;
if( spell < SPELL_FIRST || spell >= WEAPON_FIRST ) {
bug( "Do_dip: Liquid with non-spell skill." );
return;
}
( *spell_table[spell-SPELL_FIRST].function )( ch, NULL, obj, 10, -3 );
return;
}