ACT_OBJ.C
上传用户:kesirui
上传日期:2007-01-07
资源大小:263k
文件大小:48k
源码类别:

Internet/网络编程

开发平台:

WINDOWS

  1. /***************************************************************************
  2.  *  Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer,        *
  3.  *  Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe.   *
  4.  *                                                                         *
  5.  *  Merc Diku Mud improvments copyright (C) 1992, 1993 by Michael          *
  6.  *  Chastain, Michael Quan, and Mitchell Tse.                              *
  7.  *                                                                         *
  8.  *  In order to use any part of this Merc Diku Mud, you must comply with   *
  9.  *  both the original Diku license in 'license.doc' as well the Merc       *
  10.  *  license in 'license.txt'.  In particular, you may not remove either of *
  11.  *  these copyright notices.                                               *
  12.  *                                                                         *
  13.  *  Much time and thought has gone into this software and you are          *
  14.  *  benefitting.  We hope that you share your changes too.  What goes      *
  15.  *  around, comes around.                                                  *
  16.  ***************************************************************************/
  17. #if defined(macintosh)
  18. #include <types.h>
  19. #else
  20. #include <sys/types.h>
  21. #endif
  22. #include <stdio.h>
  23. #include <stdlib.h>
  24. #include <string.h>
  25. #include <time.h>
  26. #include "merc.h"
  27. /*
  28.  * Local functions.
  29.  */
  30. #define CD CHAR_DATA
  31. void get_obj args( ( CHAR_DATA *ch, OBJ_DATA *obj,
  32.     OBJ_DATA *container ) );
  33. bool remove_obj args( ( CHAR_DATA *ch, int iWear, bool fReplace ) );
  34. void wear_obj args( ( CHAR_DATA *ch, OBJ_DATA *obj, bool fReplace ) );
  35. CD * find_keeper args( ( CHAR_DATA *ch ) );
  36. int get_cost args( ( CHAR_DATA *keeper, OBJ_DATA *obj, bool fBuy ) );
  37. #undef CD
  38. void get_obj( CHAR_DATA *ch, OBJ_DATA *obj, OBJ_DATA *container )
  39. {
  40.     if ( !CAN_WEAR(obj, ITEM_TAKE) )
  41.     {
  42. send_to_char( "You can't take that.nr", ch );
  43. return;
  44.     }
  45.     if ( ch->carry_number + get_obj_number( obj ) > can_carry_n( ch ) )
  46.     {
  47. act( "$d: you can't carry that many items.",
  48.     ch, NULL, obj->name, TO_CHAR );
  49. return;
  50.     }
  51.     if ( ch->carry_weight + get_obj_weight( obj ) > can_carry_w( ch ) )
  52.     {
  53. act( "$d: you can't carry that much weight.",
  54.     ch, NULL, obj->name, TO_CHAR );
  55. return;
  56.     }
  57.     if ( container != NULL )
  58.     {
  59. act( "You get $p from $P.", ch, obj, container, TO_CHAR );
  60. act( "$n gets $p from $P.", ch, obj, container, TO_ROOM );
  61. obj_from_obj( obj );
  62.     }
  63.     else
  64.     {
  65. act( "You get $p.", ch, obj, container, TO_CHAR );
  66. act( "$n gets $p.", ch, obj, container, TO_ROOM );
  67. obj_from_room( obj );
  68.     }
  69.     if ( obj->item_type == ITEM_MONEY )
  70.     {
  71. ch->gold += obj->value[0];
  72. extract_obj( obj );
  73.     }
  74.     else
  75.     {
  76. obj_to_char( obj, ch );
  77.     }
  78.     return;
  79. }
  80. void do_get( CHAR_DATA *ch, char *argument )
  81. {
  82.     char arg1[MAX_INPUT_LENGTH];
  83.     char arg2[MAX_INPUT_LENGTH];
  84.     OBJ_DATA *obj;
  85.     OBJ_DATA *obj_next;
  86.     OBJ_DATA *container;
  87.     bool found;
  88.     argument = one_argument( argument, arg1 );
  89.     argument = one_argument( argument, arg2 );
  90.     /* Get type. */
  91.     if ( arg1[0] == '' )
  92.     {
  93. send_to_char( "Get what?nr", ch );
  94. return;
  95.     }
  96.     if ( arg2[0] == '' )
  97.     {
  98. if ( str_cmp( arg1, "all" ) && str_prefix( "all.", arg1 ) )
  99. {
  100.     /* 'get obj' */
  101.     obj = get_obj_list( ch, arg1, ch->in_room->contents );
  102.     if ( obj == NULL )
  103.     {
  104. act( "I see no $T here.", ch, NULL, arg1, TO_CHAR );
  105. return;
  106.     }
  107.     get_obj( ch, obj, NULL );
  108. }
  109. else
  110. {
  111.     /* 'get all' or 'get all.obj' */
  112.     found = FALSE;
  113.     for ( obj = ch->in_room->contents; obj != NULL; obj = obj_next )
  114.     {
  115. obj_next = obj->next_content;
  116. if ( ( arg1[3] == '' || is_name( &arg1[4], obj->name ) )
  117. &&   can_see_obj( ch, obj ) )
  118. {
  119.     found = TRUE;
  120.     get_obj( ch, obj, NULL );
  121. }
  122.     }
  123.     if ( !found ) 
  124.     {
  125. if ( arg1[3] == '' )
  126.     send_to_char( "I see nothing here.nr", ch );
  127. else
  128.     act( "I see no $T here.", ch, NULL, &arg1[4], TO_CHAR );
  129.     }
  130. }
  131.     }
  132.     else
  133.     {
  134. /* 'get ... container' */
  135. if ( !str_cmp( arg2, "all" ) || !str_prefix( "all.", arg2 ) )
  136. {
  137.     send_to_char( "You can't do that.nr", ch );
  138.     return;
  139. }
  140. if ( ( container = get_obj_here( ch, arg2 ) ) == NULL )
  141. {
  142.     act( "I see no $T here.", ch, NULL, arg2, TO_CHAR );
  143.     return;
  144. }
  145. switch ( container->item_type )
  146. {
  147. default:
  148.     send_to_char( "That's not a container.nr", ch );
  149.     return;
  150. case ITEM_CONTAINER:
  151. case ITEM_CORPSE_NPC:
  152.     break;
  153. case ITEM_CORPSE_PC:
  154.     {
  155. char name[MAX_INPUT_LENGTH];
  156. CHAR_DATA *gch;
  157. char *pd;
  158. if ( IS_NPC(ch) )
  159. {
  160.     send_to_char( "You can't do that.nr", ch );
  161.     return;
  162. }
  163. pd = container->short_descr;
  164. pd = one_argument( pd, name );
  165. pd = one_argument( pd, name );
  166. pd = one_argument( pd, name );
  167. if ( str_cmp( name, ch->name ) && !IS_IMMORTAL(ch) )
  168. {
  169.     bool fGroup;
  170.     fGroup = FALSE;
  171.     for ( gch = char_list; gch != NULL; gch = gch->next )
  172.     {
  173. if ( !IS_NPC(gch)
  174. &&   is_same_group( ch, gch )
  175. &&   !str_cmp( name, gch->name ) )
  176. {
  177.     fGroup = TRUE;
  178.     break;
  179. }
  180.     }
  181.     if ( !fGroup )
  182.     {
  183. send_to_char( "You can't do that.nr", ch );
  184. return;
  185.     }
  186. }
  187.     }
  188. }
  189. if ( IS_SET(container->value[1], CONT_CLOSED) )
  190. {
  191.     act( "The $d is closed.", ch, NULL, container->name, TO_CHAR );
  192.     return;
  193. }
  194. if ( str_cmp( arg1, "all" ) && str_prefix( "all.", arg1 ) )
  195. {
  196.     /* 'get obj container' */
  197.     obj = get_obj_list( ch, arg1, container->contains );
  198.     if ( obj == NULL )
  199.     {
  200. act( "I see nothing like that in the $T.",
  201.     ch, NULL, arg2, TO_CHAR );
  202. return;
  203.     }
  204.     get_obj( ch, obj, container );
  205. }
  206. else
  207. {
  208.     /* 'get all container' or 'get all.obj container' */
  209.     found = FALSE;
  210.     for ( obj = container->contains; obj != NULL; obj = obj_next )
  211.     {
  212. obj_next = obj->next_content;
  213. if ( ( arg1[3] == '' || is_name( &arg1[4], obj->name ) )
  214. &&   can_see_obj( ch, obj ) )
  215. {
  216.     found = TRUE;
  217.     get_obj( ch, obj, container );
  218. }
  219.     }
  220.     if ( !found )
  221.     {
  222. if ( arg1[3] == '' )
  223.     act( "I see nothing in the $T.",
  224. ch, NULL, arg2, TO_CHAR );
  225. else
  226.     act( "I see nothing like that in the $T.",
  227. ch, NULL, arg2, TO_CHAR );
  228.     }
  229. }
  230.     }
  231.     return;
  232. }
  233. void do_put( CHAR_DATA *ch, char *argument )
  234. {
  235.     char arg1[MAX_INPUT_LENGTH];
  236.     char arg2[MAX_INPUT_LENGTH];
  237.     OBJ_DATA *container;
  238.     OBJ_DATA *obj;
  239.     OBJ_DATA *obj_next;
  240.     argument = one_argument( argument, arg1 );
  241.     argument = one_argument( argument, arg2 );
  242.     if ( arg1[0] == '' || arg2[0] == '' )
  243.     {
  244. send_to_char( "Put what in what?nr", ch );
  245. return;
  246.     }
  247.     if ( !str_cmp( arg2, "all" ) || !str_prefix( "all.", arg2 ) )
  248.     {
  249. send_to_char( "You can't do that.nr", ch );
  250. return;
  251.     }
  252.     if ( ( container = get_obj_here( ch, arg2 ) ) == NULL )
  253.     {
  254. act( "I see no $T here.", ch, NULL, arg2, TO_CHAR );
  255. return;
  256.     }
  257.     if ( container->item_type != ITEM_CONTAINER )
  258.     {
  259. send_to_char( "That's not a container.nr", ch );
  260. return;
  261.     }
  262.     if ( IS_SET(container->value[1], CONT_CLOSED) )
  263.     {
  264. act( "The $d is closed.", ch, NULL, container->name, TO_CHAR );
  265. return;
  266.     }
  267.     if ( str_cmp( arg1, "all" ) && str_prefix( "all.", arg1 ) )
  268.     {
  269. /* 'put obj container' */
  270. if ( ( obj = get_obj_carry( ch, arg1 ) ) == NULL )
  271. {
  272.     send_to_char( "You do not have that item.nr", ch );
  273.     return;
  274. }
  275. if ( obj == container )
  276. {
  277.     send_to_char( "You can't fold it into itself.nr", ch );
  278.     return;
  279. }
  280. if ( !can_drop_obj( ch, obj ) )
  281. {
  282.     send_to_char( "You can't let go of it.nr", ch );
  283.     return;
  284. }
  285. if ( get_obj_weight( obj ) + get_obj_weight( container )
  286.      > container->value[0] )
  287. {
  288.     send_to_char( "It won't fit.nr", ch );
  289.     return;
  290. }
  291. obj_from_char( obj );
  292. obj_to_obj( obj, container );
  293. act( "$n puts $p in $P.", ch, obj, container, TO_ROOM );
  294. act( "You put $p in $P.", ch, obj, container, TO_CHAR );
  295.     }
  296.     else
  297.     {
  298. /* 'put all container' or 'put all.obj container' */
  299. for ( obj = ch->carrying; obj != NULL; obj = obj_next )
  300. {
  301.     obj_next = obj->next_content;
  302.     if ( ( arg1[3] == '' || is_name( &arg1[4], obj->name ) )
  303.     &&   can_see_obj( ch, obj )
  304.     &&   obj->wear_loc == WEAR_NONE
  305.     &&   obj != container
  306.     &&   can_drop_obj( ch, obj )
  307.     &&   get_obj_weight( obj ) + get_obj_weight( container )
  308.  <= container->value[0] )
  309.     {
  310. obj_from_char( obj );
  311. obj_to_obj( obj, container );
  312. act( "$n puts $p in $P.", ch, obj, container, TO_ROOM );
  313. act( "You put $p in $P.", ch, obj, container, TO_CHAR );
  314.     }
  315. }
  316.     }
  317.     return;
  318. }
  319. void do_drop( CHAR_DATA *ch, char *argument )
  320. {
  321.     char arg[MAX_INPUT_LENGTH];
  322.     OBJ_DATA *obj;
  323.     OBJ_DATA *obj_next;
  324.     bool found;
  325.     argument = one_argument( argument, arg );
  326.     if ( arg[0] == '' )
  327.     {
  328. send_to_char( "Drop what?nr", ch );
  329. return;
  330.     }
  331.     if ( is_number( arg ) )
  332.     {
  333. /* 'drop NNNN coins' */
  334. int amount;
  335. amount   = atoi(arg);
  336. argument = one_argument( argument, arg );
  337. if ( amount <= 0
  338. || ( str_cmp( arg, "coins" ) && str_cmp( arg, "coin" ) ) )
  339. {
  340.     send_to_char( "Sorry, you can't do that.nr", ch );
  341.     return;
  342. }
  343. if ( ch->gold < amount )
  344. {
  345.     send_to_char( "You haven't got that many coins.nr", ch );
  346.     return;
  347. }
  348. ch->gold -= amount;
  349. for ( obj = ch->in_room->contents; obj != NULL; obj = obj_next )
  350. {
  351.     obj_next = obj->next_content;
  352.     switch ( obj->pIndexData->vnum )
  353.     {
  354.     case OBJ_VNUM_MONEY_ONE:
  355. amount += 1;
  356. extract_obj( obj );
  357. break;
  358.     case OBJ_VNUM_MONEY_SOME:
  359. amount += obj->value[0];
  360. extract_obj( obj );
  361. break;
  362.     }
  363. }
  364. obj_to_room( create_money( amount ), ch->in_room );
  365. act( "$n drops some gold.", ch, NULL, NULL, TO_ROOM );
  366. send_to_char( "OK.nr", ch );
  367. return;
  368.     }
  369.     if ( str_cmp( arg, "all" ) && str_prefix( "all.", arg ) )
  370.     {
  371. /* 'drop obj' */
  372. if ( ( obj = get_obj_carry( ch, arg ) ) == NULL )
  373. {
  374.     send_to_char( "You do not have that item.nr", ch );
  375.     return;
  376. }
  377. if ( !can_drop_obj( ch, obj ) )
  378. {
  379.     send_to_char( "You can't let go of it.nr", ch );
  380.     return;
  381. }
  382. obj_from_char( obj );
  383. obj_to_room( obj, ch->in_room );
  384. act( "$n drops $p.", ch, obj, NULL, TO_ROOM );
  385. act( "You drop $p.", ch, obj, NULL, TO_CHAR );
  386.     }
  387.     else
  388.     {
  389. /* 'drop all' or 'drop all.obj' */
  390. found = FALSE;
  391. for ( obj = ch->carrying; obj != NULL; obj = obj_next )
  392. {
  393.     obj_next = obj->next_content;
  394.     if ( ( arg[3] == '' || is_name( &arg[4], obj->name ) )
  395.     &&   can_see_obj( ch, obj )
  396.     &&   obj->wear_loc == WEAR_NONE
  397.     &&   can_drop_obj( ch, obj ) )
  398.     {
  399. found = TRUE;
  400. obj_from_char( obj );
  401. obj_to_room( obj, ch->in_room );
  402. act( "$n drops $p.", ch, obj, NULL, TO_ROOM );
  403. act( "You drop $p.", ch, obj, NULL, TO_CHAR );
  404.     }
  405. }
  406. if ( !found )
  407. {
  408.     if ( arg[3] == '' )
  409. act( "You are not carrying anything.",
  410.     ch, NULL, arg, TO_CHAR );
  411.     else
  412. act( "You are not carrying any $T.",
  413.     ch, NULL, &arg[4], TO_CHAR );
  414. }
  415.     }
  416.     return;
  417. }
  418. void do_give( CHAR_DATA *ch, char *argument )
  419. {
  420.     char arg1 [MAX_INPUT_LENGTH];
  421.     char arg2 [MAX_INPUT_LENGTH];
  422.     CHAR_DATA *victim;
  423.     OBJ_DATA  *obj;
  424.     argument = one_argument( argument, arg1 );
  425.     argument = one_argument( argument, arg2 );
  426.     if ( arg1[0] == '' || arg2[0] == '' )
  427.     {
  428. send_to_char( "Give what to whom?nr", ch );
  429. return;
  430.     }
  431.     if ( is_number( arg1 ) )
  432.     {
  433. /* 'give NNNN coins victim' */
  434. int amount;
  435. amount   = atoi(arg1);
  436. if ( amount <= 0
  437. || ( str_cmp( arg2, "coins" ) && str_cmp( arg2, "coin" ) ) )
  438. {
  439.     send_to_char( "Sorry, you can't do that.nr", ch );
  440.     return;
  441. }
  442. argument = one_argument( argument, arg2 );
  443. if ( arg2[0] == '' )
  444. {
  445.     send_to_char( "Give what to whom?nr", ch );
  446.     return;
  447. }
  448. if ( ( victim = get_char_room( ch, arg2 ) ) == NULL )
  449. {
  450.     send_to_char( "They aren't here.nr", ch );
  451.     return;
  452. }
  453. if ( ch->gold < amount )
  454. {
  455.     send_to_char( "You haven't got that much gold.nr", ch );
  456.     return;
  457. }
  458. ch->gold     -= amount;
  459. victim->gold += amount;
  460. act( "$n gives you some gold.", ch, NULL, victim, TO_VICT    );
  461. act( "$n gives $N some gold.",  ch, NULL, victim, TO_NOTVICT );
  462. act( "You give $N some gold.",  ch, NULL, victim, TO_CHAR    );
  463. send_to_char( "OK.nr", ch );
  464. mprog_bribe_trigger(victim,ch,amount);
  465. return;
  466.     }
  467.     if ( ( obj = get_obj_carry( ch, arg1 ) ) == NULL )
  468.     {
  469. send_to_char( "You do not have that item.nr", ch );
  470. return;
  471.     }
  472.     if ( obj->wear_loc != WEAR_NONE )
  473.     {
  474. send_to_char( "You must remove it first.nr", ch );
  475. return;
  476.     }
  477.     if ( ( victim = get_char_room( ch, arg2 ) ) == NULL )
  478.     {
  479. send_to_char( "They aren't here.nr", ch );
  480. return;
  481.     }
  482.     if ( !can_drop_obj( ch, obj ) )
  483.     {
  484. send_to_char( "You can't let go of it.nr", ch );
  485. return;
  486.     }
  487.     if ( victim->carry_number + get_obj_number( obj ) > can_carry_n( victim ) )
  488.     {
  489. act( "$N has $S hands full.", ch, NULL, victim, TO_CHAR );
  490. return;
  491.     }
  492.     if ( victim->carry_weight + get_obj_weight( obj ) > can_carry_w( victim ) )
  493.     {
  494. act( "$N can't carry that much weight.", ch, NULL, victim, TO_CHAR );
  495. return;
  496.     }
  497.     if ( !can_see_obj( victim, obj ) )
  498.     {
  499. act( "$N can't see it.", ch, NULL, victim, TO_CHAR );
  500. return;
  501.     }
  502.     obj_from_char( obj );
  503.     obj_to_char( obj, victim );
  504.     MOBtrigger = FALSE;
  505.     act( "$n gives $p to $N.", ch, obj, victim, TO_NOTVICT );
  506.     act( "$n gives you $p.",   ch, obj, victim, TO_VICT    );
  507.     act( "You give $p to $N.", ch, obj, victim, TO_CHAR    );
  508.     mprog_give_trigger(victim,ch,obj);
  509.     return;
  510. }
  511. void do_fill( CHAR_DATA *ch, char *argument )
  512. {
  513.     char arg[MAX_INPUT_LENGTH];
  514.     OBJ_DATA *obj;
  515.     OBJ_DATA *fountain;
  516.     bool found;
  517.     one_argument( argument, arg );
  518.     if ( arg[0] == '' )
  519.     {
  520. send_to_char( "Fill what?nr", ch );
  521. return;
  522.     }
  523.     if ( ( obj = get_obj_carry( ch, arg ) ) == NULL )
  524.     {
  525. send_to_char( "You do not have that item.nr", ch );
  526. return;
  527.     }
  528.     found = FALSE;
  529.     for ( fountain = ch->in_room->contents; fountain != NULL;
  530. fountain = fountain->next_content )
  531.     {
  532. if ( fountain->item_type == ITEM_FOUNTAIN )
  533. {
  534.     found = TRUE;
  535.     break;
  536. }
  537.     }
  538.     if ( !found )
  539.     {
  540. send_to_char( "There is no fountain here!nr", ch );
  541. return;
  542.     }
  543.     if ( obj->item_type != ITEM_DRINK_CON )
  544.     {
  545. send_to_char( "You can't fill that.nr", ch );
  546. return;
  547.     }
  548.     if ( obj->value[1] != 0 && obj->value[2] != 0 )
  549.     {
  550. send_to_char( "There is already another liquid in it.nr", ch );
  551. return;
  552.     }
  553.     if ( obj->value[1] >= obj->value[0] )
  554.     {
  555. send_to_char( "Your container is full.nr", ch );
  556. return;
  557.     }
  558.     act( "You fill $p.", ch, obj, NULL, TO_CHAR );
  559.     obj->value[2] = 0;
  560.     obj->value[1] = obj->value[0];
  561.     return;
  562. }
  563. void do_drink( CHAR_DATA *ch, char *argument )
  564. {
  565.     char arg[MAX_INPUT_LENGTH];
  566.     OBJ_DATA *obj;
  567.     int amount;
  568.     int liquid;
  569.     one_argument( argument, arg );
  570.     if ( arg[0] == '' )
  571.     {
  572. for ( obj = ch->in_room->contents; obj; obj = obj->next_content )
  573. {
  574.     if ( obj->item_type == ITEM_FOUNTAIN )
  575. break;
  576. }
  577. if ( obj == NULL )
  578. {
  579.     send_to_char( "Drink what?nr", ch );
  580.     return;
  581. }
  582.     }
  583.     else
  584.     {
  585. if ( ( obj = get_obj_here( ch, arg ) ) == NULL )
  586. {
  587.     send_to_char( "You can't find it.nr", ch );
  588.     return;
  589. }
  590.     }
  591.     if ( !IS_NPC(ch) && ch->pcdata->condition[COND_DRUNK] > 10 )
  592.     {
  593. send_to_char( "You fail to reach your mouth.  *Hic*nr", ch );
  594. return;
  595.     }
  596.     switch ( obj->item_type )
  597.     {
  598.     default:
  599. send_to_char( "You can't drink from that.nr", ch );
  600. break;
  601.     case ITEM_FOUNTAIN:
  602. if ( !IS_NPC(ch) )
  603.     ch->pcdata->condition[COND_THIRST] = 48;
  604. act( "$n drinks from $p.", ch, obj, NULL, TO_ROOM ); // @@@
  605. // act( "$n drinks from the fountain.", ch, NULL, NULL, TO_ROOM ); // @@@
  606. send_to_char( "You are not thirsty.nr", ch );
  607. break;
  608.     case ITEM_DRINK_CON:
  609. if ( obj->value[1] <= 0 )
  610. {
  611.     send_to_char( "It is already empty.nr", ch );
  612.     return;
  613. }
  614. if ( ( liquid = obj->value[2] ) >= LIQ_MAX )
  615. {
  616.     bug( "Do_drink: bad liquid number %d.", liquid );
  617.     liquid = obj->value[2] = 0;
  618. }
  619. act( "$n drinks $T from $p.",
  620.     ch, obj, liq_table[liquid].liq_name, TO_ROOM );
  621. act( "You drink $T from $p.",
  622.     ch, obj, liq_table[liquid].liq_name, TO_CHAR );
  623. amount = number_range(3, 10);
  624. amount = UMIN(amount, obj->value[1]);
  625. gain_condition( ch, COND_DRUNK,
  626.     amount * liq_table[liquid].liq_affect[COND_DRUNK  ] );
  627. gain_condition( ch, COND_FULL,
  628.     amount * liq_table[liquid].liq_affect[COND_FULL   ] );
  629. gain_condition( ch, COND_THIRST,
  630.     amount * liq_table[liquid].liq_affect[COND_THIRST ] );
  631. if ( !IS_NPC(ch) && ch->pcdata->condition[COND_DRUNK]  > 10 )
  632.     send_to_char( "You feel drunk.nr", ch );
  633. if ( !IS_NPC(ch) && ch->pcdata->condition[COND_FULL]   > 40 )
  634.     send_to_char( "You are full.nr", ch );
  635. if ( !IS_NPC(ch) && ch->pcdata->condition[COND_THIRST] > 40 )
  636.     send_to_char( "You do not feel thirsty.nr", ch );
  637. if ( obj->value[3] != 0 )
  638. {
  639.     /* The shit was poisoned ! */
  640.     AFFECT_DATA af;
  641.     act( "$n chokes and gags.", ch, NULL, NULL, TO_ROOM );
  642.     send_to_char( "You choke and gag.nr", ch );
  643.     af.type      = gsn_poison;
  644.     af.duration  = 3 * amount;
  645.     af.location  = APPLY_NONE;
  646.     af.modifier  = 0;
  647.     af.bitvector = AFF_POISON;
  648.     affect_join( ch, &af );
  649. }
  650. obj->value[1] -= amount;
  651. if ( obj->value[1] <= 0 )
  652. {
  653.     send_to_char( "The empty container vanishes.nr", ch );
  654.     extract_obj( obj );
  655. }
  656. break;
  657.     }
  658.     return;
  659. }
  660. void do_eat( CHAR_DATA *ch, char *argument )
  661. {
  662.     char arg[MAX_INPUT_LENGTH];
  663.     OBJ_DATA *obj;
  664.     one_argument( argument, arg );
  665.     if ( arg[0] == '' )
  666.     {
  667. send_to_char( "Eat what?nr", ch );
  668. return;
  669.     }
  670.     if ( ( obj = get_obj_carry( ch, arg ) ) == NULL )
  671.     {
  672. send_to_char( "You do not have that item.nr", ch );
  673. return;
  674.     }
  675.     if ( !IS_IMMORTAL(ch) )
  676.     {
  677. if ( obj->item_type != ITEM_FOOD && obj->item_type != ITEM_PILL )
  678. {
  679.     send_to_char( "That's not edible.nr", ch );
  680.     return;
  681. }
  682. if ( !IS_NPC(ch) && ch->pcdata->condition[COND_FULL] > 40 )
  683. {   
  684.     send_to_char( "You are too full to eat more.nr", ch );
  685.     return;
  686. }
  687.     }
  688.     act( "$n eats $p.",  ch, obj, NULL, TO_ROOM );
  689.     act( "You eat $p.", ch, obj, NULL, TO_CHAR );
  690.     switch ( obj->item_type )
  691.     {
  692.     case ITEM_FOOD:
  693. if ( !IS_NPC(ch) )
  694. {
  695.     int condition;
  696.     condition = ch->pcdata->condition[COND_FULL];
  697.     gain_condition( ch, COND_FULL, obj->value[0] );
  698.     if ( condition == 0 && ch->pcdata->condition[COND_FULL] > 0 )
  699. send_to_char( "You are no longer hungry.nr", ch );
  700.     else if ( ch->pcdata->condition[COND_FULL] > 40 )
  701. send_to_char( "You are full.nr", ch );
  702. }
  703. if ( obj->value[3] != 0 )
  704. {
  705.     /* The shit was poisoned! */
  706.     AFFECT_DATA af;
  707.     act( "$n chokes and gags.", ch, 0, 0, TO_ROOM );
  708.     send_to_char( "You choke and gag.nr", ch );
  709.     af.type      = gsn_poison;
  710.     af.duration  = 2 * obj->value[0];
  711.     af.location  = APPLY_NONE;
  712.     af.modifier  = 0;
  713.     af.bitvector = AFF_POISON;
  714.     affect_join( ch, &af );
  715. }
  716. break;
  717.     case ITEM_PILL:
  718. obj_cast_spell( obj->value[1], obj->value[0], ch, ch, NULL );
  719. obj_cast_spell( obj->value[2], obj->value[0], ch, ch, NULL );
  720. obj_cast_spell( obj->value[3], obj->value[0], ch, ch, NULL );
  721. break;
  722.     }
  723.     extract_obj( obj );
  724.     return;
  725. }
  726. /*
  727.  * Remove an object.
  728.  */
  729. bool remove_obj( CHAR_DATA *ch, int iWear, bool fReplace )
  730. {
  731.     OBJ_DATA *obj;
  732.     if ( ( obj = get_eq_char( ch, iWear ) ) == NULL )
  733. return TRUE;
  734.     if ( !fReplace )
  735. return FALSE;
  736.     if ( IS_SET(obj->extra_flags, ITEM_NOREMOVE) )
  737.     {
  738. act( "You can't remove $p.", ch, obj, NULL, TO_CHAR );
  739. return FALSE;
  740.     }
  741.     unequip_char( ch, obj );
  742.     act( "$n stops using $p.", ch, obj, NULL, TO_ROOM );
  743.     act( "You stop using $p.", ch, obj, NULL, TO_CHAR );
  744.     return TRUE;
  745. }
  746. /*
  747.  * Wear one object.
  748.  * Optional replacement of existing objects.
  749.  * Big repetitive code, ick.
  750.  */
  751. void wear_obj( CHAR_DATA *ch, OBJ_DATA *obj, bool fReplace )
  752. {
  753.     char buf[MAX_STRING_LENGTH];
  754.     if ( ch->level < obj->level )
  755.     {
  756. sprintf( buf, "You must be level %d to use this object.nr",
  757.     obj->level );
  758. send_to_char( buf, ch );
  759. act( "$n tries to use $p, but is too inexperienced.",
  760.     ch, obj, NULL, TO_ROOM );
  761. return;
  762.     }
  763.     if ( obj->item_type == ITEM_LIGHT )
  764.     {
  765. if ( !remove_obj( ch, WEAR_LIGHT, fReplace ) )
  766.     return;
  767. act( "$n lights $p and holds it.", ch, obj, NULL, TO_ROOM );
  768. act( "You light $p and hold it.",  ch, obj, NULL, TO_CHAR );
  769. equip_char( ch, obj, WEAR_LIGHT );
  770. return;
  771.     }
  772.     if ( CAN_WEAR( obj, ITEM_WEAR_FINGER ) )
  773.     {
  774. if ( get_eq_char( ch, WEAR_FINGER_L ) != NULL
  775. &&   get_eq_char( ch, WEAR_FINGER_R ) != NULL
  776. &&   !remove_obj( ch, WEAR_FINGER_L, fReplace )
  777. &&   !remove_obj( ch, WEAR_FINGER_R, fReplace ) )
  778.     return;
  779. if ( get_eq_char( ch, WEAR_FINGER_L ) == NULL )
  780. {
  781.     act( "$n wears $p on $s left finger.",    ch, obj, NULL, TO_ROOM );
  782.     act( "You wear $p on your left finger.",  ch, obj, NULL, TO_CHAR );
  783.     equip_char( ch, obj, WEAR_FINGER_L );
  784.     return;
  785. }
  786. if ( get_eq_char( ch, WEAR_FINGER_R ) == NULL )
  787. {
  788.     act( "$n wears $p on $s right finger.",   ch, obj, NULL, TO_ROOM );
  789.     act( "You wear $p on your right finger.", ch, obj, NULL, TO_CHAR );
  790.     equip_char( ch, obj, WEAR_FINGER_R );
  791.     return;
  792. }
  793. bug( "Wear_obj: no free finger.", 0 );
  794. send_to_char( "You already wear two rings.nr", ch );
  795. return;
  796.     }
  797.     if ( CAN_WEAR( obj, ITEM_WEAR_NECK ) )
  798.     {
  799. if ( get_eq_char( ch, WEAR_NECK_1 ) != NULL
  800. &&   get_eq_char( ch, WEAR_NECK_2 ) != NULL
  801. &&   !remove_obj( ch, WEAR_NECK_1, fReplace )
  802. &&   !remove_obj( ch, WEAR_NECK_2, fReplace ) )
  803.     return;
  804. if ( get_eq_char( ch, WEAR_NECK_1 ) == NULL )
  805. {
  806.     act( "$n wears $p around $s neck.",   ch, obj, NULL, TO_ROOM );
  807.     act( "You wear $p around your neck.", ch, obj, NULL, TO_CHAR );
  808.     equip_char( ch, obj, WEAR_NECK_1 );
  809.     return;
  810. }
  811. if ( get_eq_char( ch, WEAR_NECK_2 ) == NULL )
  812. {
  813.     act( "$n wears $p around $s neck.",   ch, obj, NULL, TO_ROOM );
  814.     act( "You wear $p around your neck.", ch, obj, NULL, TO_CHAR );
  815.     equip_char( ch, obj, WEAR_NECK_2 );
  816.     return;
  817. }
  818. bug( "Wear_obj: no free neck.", 0 );
  819. send_to_char( "You already wear two neck items.nr", ch );
  820. return;
  821.     }
  822.     if ( CAN_WEAR( obj, ITEM_WEAR_BODY ) )
  823.     {
  824. if ( !remove_obj( ch, WEAR_BODY, fReplace ) )
  825.     return;
  826. act( "$n wears $p on $s body.",   ch, obj, NULL, TO_ROOM );
  827. act( "You wear $p on your body.", ch, obj, NULL, TO_CHAR );
  828. equip_char( ch, obj, WEAR_BODY );
  829. return;
  830.     }
  831.     if ( CAN_WEAR( obj, ITEM_WEAR_HEAD ) )
  832.     {
  833. if ( !remove_obj( ch, WEAR_HEAD, fReplace ) )
  834.     return;
  835. act( "$n wears $p on $s head.",   ch, obj, NULL, TO_ROOM );
  836. act( "You wear $p on your head.", ch, obj, NULL, TO_CHAR );
  837. equip_char( ch, obj, WEAR_HEAD );
  838. return;
  839.     }
  840.     if ( CAN_WEAR( obj, ITEM_WEAR_LEGS ) )
  841.     {
  842. if ( !remove_obj( ch, WEAR_LEGS, fReplace ) )
  843.     return;
  844. act( "$n wears $p on $s legs.",   ch, obj, NULL, TO_ROOM );
  845. act( "You wear $p on your legs.", ch, obj, NULL, TO_CHAR );
  846. equip_char( ch, obj, WEAR_LEGS );
  847. return;
  848.     }
  849.     if ( CAN_WEAR( obj, ITEM_WEAR_FEET ) )
  850.     {
  851. if ( !remove_obj( ch, WEAR_FEET, fReplace ) )
  852.     return;
  853. act( "$n wears $p on $s feet.",   ch, obj, NULL, TO_ROOM );
  854. act( "You wear $p on your feet.", ch, obj, NULL, TO_CHAR );
  855. equip_char( ch, obj, WEAR_FEET );
  856. return;
  857.     }
  858.     if ( CAN_WEAR( obj, ITEM_WEAR_HANDS ) )
  859.     {
  860. if ( !remove_obj( ch, WEAR_HANDS, fReplace ) )
  861.     return;
  862. act( "$n wears $p on $s hands.",   ch, obj, NULL, TO_ROOM );
  863. act( "You wear $p on your hands.", ch, obj, NULL, TO_CHAR );
  864. equip_char( ch, obj, WEAR_HANDS );
  865. return;
  866.     }
  867.     if ( CAN_WEAR( obj, ITEM_WEAR_ARMS ) )
  868.     {
  869. if ( !remove_obj( ch, WEAR_ARMS, fReplace ) )
  870.     return;
  871. act( "$n wears $p on $s arms.",   ch, obj, NULL, TO_ROOM );
  872. act( "You wear $p on your arms.", ch, obj, NULL, TO_CHAR );
  873. equip_char( ch, obj, WEAR_ARMS );
  874. return;
  875.     }
  876.     if ( CAN_WEAR( obj, ITEM_WEAR_ABOUT ) )
  877.     {
  878. if ( !remove_obj( ch, WEAR_ABOUT, fReplace ) )
  879.     return;
  880. act( "$n wears $p about $s body.",   ch, obj, NULL, TO_ROOM );
  881. act( "You wear $p about your body.", ch, obj, NULL, TO_CHAR );
  882. equip_char( ch, obj, WEAR_ABOUT );
  883. return;
  884.     }
  885.     if ( CAN_WEAR( obj, ITEM_WEAR_WAIST ) )
  886.     {
  887. if ( !remove_obj( ch, WEAR_WAIST, fReplace ) )
  888.     return;
  889. act( "$n wears $p about $s waist.",   ch, obj, NULL, TO_ROOM );
  890. act( "You wear $p about your waist.", ch, obj, NULL, TO_CHAR );
  891. equip_char( ch, obj, WEAR_WAIST );
  892. return;
  893.     }
  894.     if ( CAN_WEAR( obj, ITEM_WEAR_WRIST ) )
  895.     {
  896. if ( get_eq_char( ch, WEAR_WRIST_L ) != NULL
  897. &&   get_eq_char( ch, WEAR_WRIST_R ) != NULL
  898. &&   !remove_obj( ch, WEAR_WRIST_L, fReplace )
  899. &&   !remove_obj( ch, WEAR_WRIST_R, fReplace ) )
  900.     return;
  901. if ( get_eq_char( ch, WEAR_WRIST_L ) == NULL )
  902. {
  903.     act( "$n wears $p around $s left wrist.",
  904. ch, obj, NULL, TO_ROOM );
  905.     act( "You wear $p around your left wrist.",
  906. ch, obj, NULL, TO_CHAR );
  907.     equip_char( ch, obj, WEAR_WRIST_L );
  908.     return;
  909. }
  910. if ( get_eq_char( ch, WEAR_WRIST_R ) == NULL )
  911. {
  912.     act( "$n wears $p around $s right wrist.",
  913. ch, obj, NULL, TO_ROOM );
  914.     act( "You wear $p around your right wrist.",
  915. ch, obj, NULL, TO_CHAR );
  916.     equip_char( ch, obj, WEAR_WRIST_R );
  917.     return;
  918. }
  919. bug( "Wear_obj: no free wrist.", 0 );
  920. send_to_char( "You already wear two wrist items.nr", ch );
  921. return;
  922.     }
  923.     if ( CAN_WEAR( obj, ITEM_WEAR_SHIELD ) )
  924.     {
  925. if ( !remove_obj( ch, WEAR_SHIELD, fReplace ) )
  926.     return;
  927. act( "$n wears $p as a shield.", ch, obj, NULL, TO_ROOM );
  928. act( "You wear $p as a shield.", ch, obj, NULL, TO_CHAR );
  929. equip_char( ch, obj, WEAR_SHIELD );
  930. return;
  931.     }
  932.     if ( CAN_WEAR( obj, ITEM_WIELD ) )
  933.     {
  934. if ( !remove_obj( ch, WEAR_WIELD, fReplace ) )
  935.     return;
  936. if ( get_obj_weight( obj ) > str_app[get_curr_str(ch)].wield )
  937. {
  938.     send_to_char( "It is too heavy for you to wield.nr", ch );
  939.     return;
  940. }
  941. act( "$n wields $p.", ch, obj, NULL, TO_ROOM );
  942. act( "You wield $p.", ch, obj, NULL, TO_CHAR );
  943. equip_char( ch, obj, WEAR_WIELD );
  944. return;
  945.     }
  946.     if ( CAN_WEAR( obj, ITEM_HOLD ) )
  947.     {
  948. if ( !remove_obj( ch, WEAR_HOLD, fReplace ) )
  949.     return;
  950. act( "$n holds $p in $s hands.",   ch, obj, NULL, TO_ROOM );
  951. act( "You hold $p in your hands.", ch, obj, NULL, TO_CHAR );
  952. equip_char( ch, obj, WEAR_HOLD );
  953. return;
  954.     }
  955.     if ( fReplace )
  956. send_to_char( "You can't wear, wield, or hold that.nr", ch );
  957.     return;
  958. }
  959. void do_wear( CHAR_DATA *ch, char *argument )
  960. {
  961.     char arg[MAX_INPUT_LENGTH];
  962.     OBJ_DATA *obj;
  963.     one_argument( argument, arg );
  964.     if ( arg[0] == '' )
  965.     {
  966. send_to_char( "Wear, wield, or hold what?nr", ch );
  967. return;
  968.     }
  969.     if ( !str_cmp( arg, "all" ) )
  970.     {
  971. OBJ_DATA *obj_next;
  972. for ( obj = ch->carrying; obj != NULL; obj = obj_next )
  973. {
  974.     obj_next = obj->next_content;
  975.     if ( obj->wear_loc == WEAR_NONE && can_see_obj( ch, obj ) )
  976. wear_obj( ch, obj, FALSE );
  977. }
  978. return;
  979.     }
  980.     else
  981.     {
  982. if ( ( obj = get_obj_carry( ch, arg ) ) == NULL )
  983. {
  984.     send_to_char( "You do not have that item.nr", ch );
  985.     return;
  986. }
  987. wear_obj( ch, obj, TRUE );
  988.     }
  989.     return;
  990. }
  991. void do_remove( CHAR_DATA *ch, char *argument )
  992. {
  993.     char arg[MAX_INPUT_LENGTH];
  994.     OBJ_DATA *obj;
  995.     OBJ_DATA *obj_next;
  996.     one_argument( argument, arg );
  997.     if ( arg[0] == '' )
  998.     {
  999. send_to_char( "Remove what?nr", ch );
  1000. return;
  1001.     }
  1002.     if(!str_cmp(arg,"all"))
  1003.        {
  1004.         for ( obj = ch->carrying; obj != NULL; obj = obj_next )
  1005.           {
  1006.             obj_next=obj->next_content;
  1007.             if( obj->wear_loc != WEAR_NONE) remove_obj(ch,obj->wear_loc,TRUE);
  1008.           }
  1009.         }
  1010.    else 
  1011.     {
  1012.     if ( ( obj = get_obj_wear( ch, arg ) ) == NULL )
  1013.     {
  1014. send_to_char( "You do not have that item.nr", ch );
  1015. return;
  1016.     }
  1017.     remove_obj( ch, obj->wear_loc, TRUE );
  1018.     }
  1019.     return;
  1020. }
  1021. void do_sacrifice( CHAR_DATA *ch, char *argument )
  1022. {
  1023.     char arg[MAX_INPUT_LENGTH];
  1024.     OBJ_DATA *obj;
  1025.     one_argument( argument, arg );
  1026.     if ( arg[0] == '' || !str_cmp( arg, ch->name ) )
  1027.     {
  1028. act( "$n offers $mself to God, who graciously declines.",
  1029.     ch, NULL, NULL, TO_ROOM );
  1030. send_to_char(
  1031.     "God appreciates your offer and may accept it later.", ch );
  1032. return;
  1033.     }
  1034.     obj = get_obj_list( ch, arg, ch->in_room->contents );
  1035.     if ( obj == NULL )
  1036.     {
  1037. send_to_char( "You can't find it.nr", ch );
  1038. return;
  1039.     }
  1040.     if ( !CAN_WEAR(obj, ITEM_TAKE) )
  1041.     {
  1042. act( "$p is not an acceptable sacrifice.", ch, obj, 0, TO_CHAR );
  1043. return;
  1044.     }
  1045.     send_to_char( "God gives you one gold coin for your sacrifice.nr", ch );
  1046.     ch->gold += 1;
  1047.     act( "$n sacrifices $p to God.", ch, obj, NULL, TO_ROOM );
  1048.     extract_obj( obj );
  1049.     return;
  1050. }
  1051. void do_quaff( CHAR_DATA *ch, char *argument )
  1052. {
  1053.     char arg[MAX_INPUT_LENGTH];
  1054.     OBJ_DATA *obj;
  1055.     one_argument( argument, arg );
  1056.     if ( arg[0] == '' )
  1057.     {
  1058. send_to_char( "Quaff what?nr", ch );
  1059. return;
  1060.     }
  1061.     if ( ( obj = get_obj_carry( ch, arg ) ) == NULL )
  1062.     {
  1063. send_to_char( "You do not have that potion.nr", ch );
  1064. return;
  1065.     }
  1066.     if ( obj->item_type != ITEM_POTION )
  1067.     {
  1068. send_to_char( "You can quaff only potions.nr", ch );
  1069. return;
  1070.     }
  1071.     act( "$n quaffs $p.", ch, obj, NULL, TO_ROOM );
  1072.     act( "You quaff $p.", ch, obj, NULL ,TO_CHAR );
  1073.     obj_cast_spell( obj->value[1], obj->value[0], ch, ch, NULL );
  1074.     obj_cast_spell( obj->value[2], obj->value[0], ch, ch, NULL );
  1075.     obj_cast_spell( obj->value[3], obj->value[0], ch, ch, NULL );
  1076.     extract_obj( obj );
  1077.     return;
  1078. }
  1079. void do_recite( CHAR_DATA *ch, char *argument )
  1080. {
  1081.     char arg1[MAX_INPUT_LENGTH];
  1082.     char arg2[MAX_INPUT_LENGTH];
  1083.     CHAR_DATA *victim;
  1084.     OBJ_DATA *scroll;
  1085.     OBJ_DATA *obj;
  1086.     argument = one_argument( argument, arg1 );
  1087.     argument = one_argument( argument, arg2 );
  1088.     if ( ( scroll = get_obj_carry( ch, arg1 ) ) == NULL )
  1089.     {
  1090. send_to_char( "You do not have that scroll.nr", ch );
  1091. return;
  1092.     }
  1093.     if ( scroll->item_type != ITEM_SCROLL )
  1094.     {
  1095. send_to_char( "You can recite only scrolls.nr", ch );
  1096. return;
  1097.     }
  1098.     obj = NULL;
  1099.     if ( arg2[0] == '' )
  1100.     {
  1101. victim = ch;
  1102.     }
  1103.     else
  1104.     {
  1105. if ( ( victim = get_char_room ( ch, arg2 ) ) == NULL
  1106. &&   ( obj    = get_obj_here  ( ch, arg2 ) ) == NULL )
  1107. {
  1108.     send_to_char( "You can't find it.nr", ch );
  1109.     return;
  1110. }
  1111.     }
  1112.     act( "$n recites $p.", ch, scroll, NULL, TO_ROOM );
  1113.     act( "You recite $p.", ch, scroll, NULL, TO_CHAR );
  1114.     obj_cast_spell( scroll->value[1], scroll->value[0], ch, victim, obj );
  1115.     obj_cast_spell( scroll->value[2], scroll->value[0], ch, victim, obj );
  1116.     obj_cast_spell( scroll->value[3], scroll->value[0], ch, victim, obj );
  1117.     extract_obj( scroll );
  1118.     return;
  1119. }
  1120. void do_brandish( CHAR_DATA *ch, char *argument )
  1121. {
  1122.     CHAR_DATA *vch;
  1123.     CHAR_DATA *vch_next;
  1124.     OBJ_DATA *staff;
  1125.     int sn;
  1126.     if ( ( staff = get_eq_char( ch, WEAR_HOLD ) ) == NULL )
  1127.     {
  1128. send_to_char( "You hold nothing in your hand.nr", ch );
  1129. return;
  1130.     }
  1131.     if ( staff->item_type != ITEM_STAFF )
  1132.     {
  1133. send_to_char( "You can brandish only with a staff.nr", ch );
  1134. return;
  1135.     }
  1136.     if ( ( sn = staff->value[3] ) < 0
  1137.     ||   sn >= MAX_SKILL
  1138.     ||   skill_table[sn].spell_fun == 0 )
  1139.     {
  1140. bug( "Do_brandish: bad sn %d.", sn );
  1141. return;
  1142.     }
  1143.     WAIT_STATE( ch, 2 * PULSE_VIOLENCE );
  1144.     if ( staff->value[2] > 0 )
  1145.     {
  1146. act( "$n brandishes $p.", ch, staff, NULL, TO_ROOM );
  1147. act( "You brandish $p.",  ch, staff, NULL, TO_CHAR );
  1148. for ( vch = ch->in_room->people; vch; vch = vch_next )
  1149. {
  1150.     vch_next = vch->next_in_room;
  1151.     switch ( skill_table[sn].target )
  1152.     {
  1153.     default:
  1154. bug( "Do_brandish: bad target for sn %d.", sn );
  1155. return;
  1156.     case TAR_IGNORE:
  1157. if ( vch != ch )
  1158.     continue;
  1159. break;
  1160.     case TAR_CHAR_OFFENSIVE:
  1161. if ( IS_NPC(ch) ? IS_NPC(vch) : !IS_NPC(vch) )
  1162.     continue;
  1163. break;
  1164.     case TAR_CHAR_DEFENSIVE:
  1165. if ( IS_NPC(ch) ? !IS_NPC(vch) : IS_NPC(vch) )
  1166.     continue;
  1167. break;
  1168.     case TAR_CHAR_SELF:
  1169. if ( vch != ch )
  1170.     continue;
  1171. break;
  1172.     }
  1173.     obj_cast_spell( staff->value[3], staff->value[0], ch, vch, NULL );
  1174. }
  1175.     }
  1176.     if ( --staff->value[2] <= 0 )
  1177.     {
  1178. act( "$n's $p blazes bright and is gone.", ch, staff, NULL, TO_ROOM );
  1179. act( "Your $p blazes bright and is gone.", ch, staff, NULL, TO_CHAR );
  1180. extract_obj( staff );
  1181.     }
  1182.     return;
  1183. }
  1184. void do_zap( CHAR_DATA *ch, char *argument )
  1185. {
  1186.     char arg[MAX_INPUT_LENGTH];
  1187.     CHAR_DATA *victim;
  1188.     OBJ_DATA *wand;
  1189.     OBJ_DATA *obj;
  1190.     one_argument( argument, arg );
  1191.     if ( arg[0] == '' && ch->fighting == NULL )
  1192.     {
  1193. send_to_char( "Zap whom or what?nr", ch );
  1194. return;
  1195.     }
  1196.     if ( ( wand = get_eq_char( ch, WEAR_HOLD ) ) == NULL )
  1197.     {
  1198. send_to_char( "You hold nothing in your hand.nr", ch );
  1199. return;
  1200.     }
  1201.     if ( wand->item_type != ITEM_WAND )
  1202.     {
  1203. send_to_char( "You can zap only with a wand.nr", ch );
  1204. return;
  1205.     }
  1206.     obj = NULL;
  1207.     if ( arg[0] == '' )
  1208.     {
  1209. if ( ch->fighting != NULL )
  1210. {
  1211.     victim = ch->fighting;
  1212. }
  1213. else
  1214. {
  1215.     send_to_char( "Zap whom or what?nr", ch );
  1216.     return;
  1217. }
  1218.     }
  1219.     else
  1220.     {
  1221. if ( ( victim = get_char_room ( ch, arg ) ) == NULL
  1222. &&   ( obj    = get_obj_here  ( ch, arg ) ) == NULL )
  1223. {
  1224.     send_to_char( "You can't find it.nr", ch );
  1225.     return;
  1226. }
  1227.     }
  1228.     WAIT_STATE( ch, 2 * PULSE_VIOLENCE );
  1229.     if ( wand->value[2] > 0 )
  1230.     {
  1231. if ( victim != NULL )
  1232. {
  1233.     act( "$n zaps $N with $p.", ch, wand, victim, TO_ROOM );
  1234.     act( "You zap $N with $p.", ch, wand, victim, TO_CHAR );
  1235. }
  1236. else
  1237. {
  1238.     act( "$n zaps $P with $p.", ch, wand, obj, TO_ROOM );
  1239.     act( "You zap $P with $p.", ch, wand, obj, TO_CHAR );
  1240. }
  1241. obj_cast_spell( wand->value[3], wand->value[0], ch, victim, obj );
  1242.     }
  1243.     if ( --wand->value[2] <= 0 )
  1244.     {
  1245. act( "$n's $p explodes into fragments.", ch, wand, NULL, TO_ROOM );
  1246. act( "Your $p explodes into fragments.", ch, wand, NULL, TO_CHAR );
  1247. extract_obj( wand );
  1248.     }
  1249.     return;
  1250. }
  1251. void do_steal( CHAR_DATA *ch, char *argument )
  1252. {
  1253.     char buf  [MAX_STRING_LENGTH];
  1254.     char arg1 [MAX_INPUT_LENGTH];
  1255.     char arg2 [MAX_INPUT_LENGTH];
  1256.     CHAR_DATA *victim;
  1257.     OBJ_DATA *obj;
  1258.     int percent;
  1259.     argument = one_argument( argument, arg1 );
  1260.     argument = one_argument( argument, arg2 );
  1261.     if ( arg1[0] == '' || arg2[0] == '' )
  1262.     {
  1263. send_to_char( "Steal what from whom?nr", ch );
  1264. return;
  1265.     }
  1266.     if ( ( victim = get_char_room( ch, arg2 ) ) == NULL )
  1267.     {
  1268. send_to_char( "They aren't here.nr", ch );
  1269. return;
  1270.     }
  1271.     if ( victim == ch )
  1272.     {
  1273. send_to_char( "That's pointless.nr", ch );
  1274. return;
  1275.     }
  1276.     WAIT_STATE( ch, skill_table[gsn_steal].beats );
  1277.     percent  = number_percent( ) + ( IS_AWAKE(victim) ? 10 : -50 );
  1278.     if ( ch->level + 5 < victim->level
  1279.     ||   victim->position == POS_FIGHTING
  1280.     ||   !IS_NPC(victim)
  1281.     || ( !IS_NPC(ch) && percent > ch->pcdata->learned[gsn_steal] ) )
  1282.     {
  1283. /*
  1284.  * Failure.
  1285.  */
  1286. send_to_char( "Oops.nr", ch );
  1287. act( "$n tried to steal from you.nr", ch, NULL, victim, TO_VICT    );
  1288. act( "$n tried to steal from $N.nr",  ch, NULL, victim, TO_NOTVICT );
  1289. sprintf( buf, "%s is a bloody thief!", ch->name );
  1290. do_shout( victim, buf );
  1291. if ( !IS_NPC(ch) )
  1292. {
  1293.     if ( IS_NPC(victim) )
  1294.     {
  1295. multi_hit( victim, ch, TYPE_UNDEFINED );
  1296.     }
  1297.     else
  1298.     {
  1299. log_string( buf );
  1300. if ( !IS_SET(ch->act, PLR_THIEF) )
  1301. {
  1302.     SET_BIT(ch->act, PLR_THIEF);
  1303.     send_to_char( "*** You are now a THIEF!! ***nr", ch );
  1304.     save_char_obj( ch );
  1305. }
  1306.     }
  1307. }
  1308. return;
  1309.     }
  1310.     if ( !str_cmp( arg1, "coin"  )
  1311.     ||   !str_cmp( arg1, "coins" )
  1312.     ||   !str_cmp( arg1, "gold"  ) )
  1313.     {
  1314. int amount;
  1315. amount = victim->gold * number_range(1, 10) / 100;
  1316. if ( amount <= 0 )
  1317. {
  1318.     send_to_char( "You couldn't get any gold.nr", ch );
  1319.     return;
  1320. }
  1321. ch->gold     += amount;
  1322. victim->gold -= amount;
  1323. sprintf( buf, "Bingo!  You got %d gold coins.nr", amount );
  1324. send_to_char( buf, ch );
  1325. return;
  1326.     }
  1327.     if ( ( obj = get_obj_carry( victim, arg1 ) ) == NULL )
  1328.     {
  1329. send_to_char( "You can't find it.nr", ch );
  1330. return;
  1331.     }
  1332.     if ( !can_drop_obj( ch, obj )
  1333.     ||   IS_SET(obj->extra_flags, ITEM_INVENTORY)
  1334.     ||   obj->level > ch->level )
  1335.     {
  1336. send_to_char( "You can't pry it away.nr", ch );
  1337. return;
  1338.     }
  1339.     if ( ch->carry_number + get_obj_number( obj ) > can_carry_n( ch ) )
  1340.     {
  1341. send_to_char( "You have your hands full.nr", ch );
  1342. return;
  1343.     }
  1344.     if ( ch->carry_weight + get_obj_weight( obj ) > can_carry_w( ch ) )
  1345.     {
  1346. send_to_char( "You can't carry that much weight.nr", ch );
  1347. return;
  1348.     }
  1349.     obj_from_char( obj );
  1350.     obj_to_char( obj, ch );
  1351.     send_to_char( "Ok.nr", ch );
  1352.     return;
  1353. }
  1354. /*
  1355.  * Shopping commands.
  1356.  */
  1357. CHAR_DATA *find_keeper( CHAR_DATA *ch )
  1358. {
  1359.     char buf[MAX_STRING_LENGTH];
  1360.     CHAR_DATA *keeper;
  1361.     SHOP_DATA *pShop;
  1362.     pShop = NULL;
  1363.     for ( keeper = ch->in_room->people; keeper; keeper = keeper->next_in_room )
  1364.     {
  1365. if ( IS_NPC(keeper) && (pShop = keeper->pIndexData->pShop) != NULL )
  1366.     break;
  1367.     }
  1368.     if ( pShop == NULL )
  1369.     {
  1370. send_to_char( "You can't do that here.nr", ch );
  1371. return NULL;
  1372.     }
  1373.     /*
  1374.      * Undesirables.
  1375.      */
  1376.     if ( !IS_NPC(ch) && IS_SET(ch->act, PLR_KILLER) )
  1377.     {
  1378. do_say( keeper, "Killers are not welcome!" );
  1379. sprintf( buf, "%s the KILLER is over here!nr", ch->name );
  1380. do_shout( keeper, buf );
  1381. return NULL;
  1382.     }
  1383.     if ( !IS_NPC(ch) && IS_SET(ch->act, PLR_THIEF) )
  1384.     {
  1385. do_say( keeper, "Thieves are not welcome!" );
  1386. sprintf( buf, "%s the THIEF is over here!nr", ch->name );
  1387. do_shout( keeper, buf );
  1388. return NULL;
  1389.     }
  1390.     /*
  1391.      * Shop hours.
  1392.      */
  1393.     if ( time_info.hour < pShop->open_hour )
  1394.     {
  1395. do_say( keeper, "Sorry, come back later." );
  1396. return NULL;
  1397.     }
  1398.     
  1399.     if ( time_info.hour > pShop->close_hour )
  1400.     {
  1401. do_say( keeper, "Sorry, come back tomorrow." );
  1402. return NULL;
  1403.     }
  1404.     /*
  1405.      * Invisible or hidden people.
  1406.      */
  1407.     if ( !can_see( keeper, ch ) )
  1408.     {
  1409. do_say( keeper, "I don't trade with folks I can't see." );
  1410. return NULL;
  1411.     }
  1412.     return keeper;
  1413. }
  1414. int get_cost( CHAR_DATA *keeper, OBJ_DATA *obj, bool fBuy )
  1415. {
  1416.     SHOP_DATA *pShop;
  1417.     int cost;
  1418.     if ( obj == NULL || ( pShop = keeper->pIndexData->pShop ) == NULL )
  1419. return 0;
  1420.     if ( fBuy )
  1421.     {
  1422. cost = obj->cost * pShop->profit_buy  / 100;
  1423.     }
  1424.     else
  1425.     {
  1426. OBJ_DATA *obj2;
  1427. int itype;
  1428. cost = 0;
  1429. for ( itype = 0; itype < MAX_TRADE; itype++ )
  1430. {
  1431.     if ( obj->item_type == pShop->buy_type[itype] )
  1432.     {
  1433. cost = obj->cost * pShop->profit_sell / 100;
  1434. break;
  1435.     }
  1436. }
  1437. for ( obj2 = keeper->carrying; obj2; obj2 = obj2->next_content )
  1438. {
  1439.     if ( obj->pIndexData == obj2->pIndexData )
  1440. cost /= 2;
  1441. }
  1442.     }
  1443.     if ( obj->item_type == ITEM_STAFF || obj->item_type == ITEM_WAND )
  1444. cost = cost * obj->value[2] / obj->value[1];
  1445.     return cost;
  1446. }
  1447. void do_buy( CHAR_DATA *ch, char *argument )
  1448. {
  1449.     char arg[MAX_INPUT_LENGTH];
  1450.     argument = one_argument( argument, arg );
  1451.     if ( arg[0] == '' )
  1452.     {
  1453. send_to_char( "Buy what?nr", ch );
  1454. return;
  1455.     }
  1456.     if ( IS_SET(ch->in_room->room_flags, ROOM_PET_SHOP) )
  1457.     {
  1458. char buf[MAX_STRING_LENGTH];
  1459. CHAR_DATA *pet;
  1460. ROOM_INDEX_DATA *pRoomIndexNext;
  1461. ROOM_INDEX_DATA *in_room;
  1462. if ( IS_NPC(ch) )
  1463.     return;
  1464. pRoomIndexNext = get_room_index( ch->in_room->vnum + 1 );
  1465. if ( pRoomIndexNext == NULL )
  1466. {
  1467.     bug( "Do_buy: bad pet shop at vnum %d.", ch->in_room->vnum );
  1468.     send_to_char( "Sorry, you can't buy that here.nr", ch );
  1469.     return;
  1470. }
  1471. in_room     = ch->in_room;
  1472. ch->in_room = pRoomIndexNext;
  1473. pet         = get_char_room( ch, arg );
  1474. ch->in_room = in_room;
  1475. if ( pet == NULL || !IS_SET(pet->act, ACT_PET) )
  1476. {
  1477.     send_to_char( "Sorry, you can't buy that here.nr", ch );
  1478.     return;
  1479. }
  1480. #if 0
  1481. if ( IS_SET(ch->act, PLR_BOUGHT_PET) )
  1482. {
  1483.     send_to_char( "You already bought one pet this level.nr", ch );
  1484.     return;
  1485. }
  1486. #endif
  1487. if ( ch->gold < 10 * pet->level * pet->level )
  1488. {
  1489.     send_to_char( "You can't afford it.nr", ch );
  1490.     return;
  1491. }
  1492. if ( ch->level < pet->level )
  1493. {
  1494. //     send_to_char( "You're not ready for this pet.nr", ch );
  1495.     send_to_char( "This slave would probably murder you in your sleep.nr",
  1496.           ch );
  1497.     return;
  1498. }
  1499. ch->gold -= 10 * pet->level * pet->level;
  1500. pet = create_mobile( pet->pIndexData );
  1501. SET_BIT(ch->act, PLR_BOUGHT_PET);
  1502. SET_BIT(pet->act, ACT_PET);
  1503. SET_BIT(pet->affected_by, AFF_CHARM);
  1504. argument = one_argument( argument, arg );
  1505. if ( arg[0] != '' )
  1506. {
  1507.     sprintf( buf, "%s %s", pet->name, arg );
  1508.     free_string( pet->name );
  1509.     pet->name = str_dup( buf );
  1510. }
  1511. sprintf( buf, "%sThis slave bears the brand of %s.nr",
  1512.     pet->description, ch->name );
  1513. free_string( pet->description );
  1514. pet->description = str_dup( buf );
  1515. char_to_room( pet, ch->in_room );
  1516. add_follower( pet, ch );
  1517. send_to_char( "Enjoy your slave.  Please consider buying a lash.nr", ch );
  1518. act( "$N is branded with the mark of $n.", ch, NULL, pet, TO_ROOM );
  1519. return;
  1520.     }
  1521.     else
  1522.     {
  1523. CHAR_DATA *keeper;
  1524. OBJ_DATA *obj;
  1525. int cost;
  1526. if ( ( keeper = find_keeper( ch ) ) == NULL )
  1527.     return;
  1528. obj  = get_obj_carry( keeper, arg );
  1529. cost = get_cost( keeper, obj, TRUE );
  1530. if ( cost <= 0 || !can_see_obj( ch, obj ) )
  1531. {
  1532.     act( "$n tells you 'I don't sell that -- try 'list''.",
  1533. keeper, NULL, ch, TO_VICT );
  1534.     ch->reply = keeper;
  1535.     return;
  1536. }
  1537. if ( ch->gold < cost )
  1538. {
  1539.     act( "$n tells you 'You can't afford to buy $p'.",
  1540. keeper, obj, ch, TO_VICT );
  1541.     ch->reply = keeper;
  1542.     return;
  1543. }
  1544. if ( obj->level > ch->level )
  1545. {
  1546.     act( "$n tells you 'You can't use $p yet'.",
  1547. keeper, obj, ch, TO_VICT );
  1548.     ch->reply = keeper;
  1549.     return;
  1550. }
  1551. if ( ch->carry_number + get_obj_number( obj ) > can_carry_n( ch ) )
  1552. {
  1553.     send_to_char( "You can't carry that many items.nr", ch );
  1554.     return;
  1555. }
  1556. if ( ch->carry_weight + get_obj_weight( obj ) > can_carry_w( ch ) )
  1557. {
  1558.     send_to_char( "You can't carry that much weight.nr", ch );
  1559.     return;
  1560. }
  1561. act( "$n buys $p.", ch, obj, NULL, TO_ROOM );
  1562. act( "You buy $p.", ch, obj, NULL, TO_CHAR );
  1563. ch->gold     -= cost;
  1564. keeper->gold += cost;
  1565. if ( IS_SET( obj->extra_flags, ITEM_INVENTORY ) )
  1566.     obj = create_object( obj->pIndexData, obj->level );
  1567. else
  1568.     obj_from_char( obj );
  1569. obj_to_char( obj, ch );
  1570. return;
  1571.     }
  1572. }
  1573. void do_list( CHAR_DATA *ch, char *argument )
  1574. {
  1575.     char buf[MAX_STRING_LENGTH];
  1576.     char buf1[MAX_STRING_LENGTH];
  1577.     buf1[0] = '';
  1578.     if ( IS_SET(ch->in_room->room_flags, ROOM_PET_SHOP) )
  1579.     {
  1580. ROOM_INDEX_DATA *pRoomIndexNext;
  1581. CHAR_DATA *pet;
  1582. bool found;
  1583. pRoomIndexNext = get_room_index( ch->in_room->vnum + 1 );
  1584. if ( pRoomIndexNext == NULL )
  1585. {
  1586.     bug( "Do_list: bad pet shop at vnum %d.", ch->in_room->vnum );
  1587.     send_to_char( "You can't do that here.nr", ch );
  1588.     return;
  1589. }
  1590. found = FALSE;
  1591. for ( pet = pRoomIndexNext->people; pet; pet = pet->next_in_room )
  1592. {
  1593.     if ( IS_SET(pet->act, ACT_PET) )
  1594.     {
  1595. if ( !found )
  1596. {
  1597.     found = TRUE;
  1598.     strcat( buf1, "Slaves for sale:nr" );
  1599. }
  1600. sprintf( buf, "[%2d] %8d - %snr",
  1601.     pet->level,
  1602.     10 * pet->level * pet->level,
  1603.     pet->short_descr );
  1604. strcat( buf1, buf );
  1605.     }
  1606. }
  1607. if ( !found )
  1608.     send_to_char( "Sorry, there is only one left and it is dying of"
  1609.           " pnemonia.nr", ch );
  1610. send_to_char( buf1, ch );
  1611. return;
  1612.     }
  1613.     else
  1614.     {
  1615. char arg[MAX_INPUT_LENGTH];
  1616. CHAR_DATA *keeper;
  1617. OBJ_DATA *obj;
  1618. int cost;
  1619. bool found;
  1620. one_argument( argument, arg );
  1621. if ( ( keeper = find_keeper( ch ) ) == NULL )
  1622.     return;
  1623. found = FALSE;
  1624. for ( obj = keeper->carrying; obj; obj = obj->next_content )
  1625. {
  1626.     if ( obj->wear_loc == WEAR_NONE
  1627.     &&   can_see_obj( ch, obj )
  1628.     && ( cost = get_cost( keeper, obj, TRUE ) ) > 0
  1629.     && ( arg[0] == '' || is_name( arg, obj->name ) ) )
  1630.     {
  1631. if ( !found )
  1632. {
  1633.     found = TRUE;
  1634.     strcat( buf1, "[Lv Price] Itemnr" );
  1635. }
  1636. sprintf( buf, "[%2d %5d] %s.nr",
  1637.     obj->level, cost, capitalize( obj->short_descr ) );
  1638. strcat( buf1, buf );
  1639.     }
  1640. }
  1641. if ( !found )
  1642. {
  1643.     if ( arg[0] == '' )
  1644. send_to_char( "You can't buy anything here.nr", ch );
  1645.     else
  1646. send_to_char( "You can't buy that here.nr", ch );
  1647.     return;
  1648. }
  1649. send_to_char( buf1, ch );
  1650. return;
  1651.     }
  1652. }
  1653. void do_sell( CHAR_DATA *ch, char *argument )
  1654. {
  1655.     char buf[MAX_STRING_LENGTH];
  1656.     char arg[MAX_INPUT_LENGTH];
  1657.     CHAR_DATA *keeper;
  1658.     OBJ_DATA *obj;
  1659.     int cost;
  1660.     one_argument( argument, arg );
  1661.     if ( arg[0] == '' )
  1662.     {
  1663. send_to_char( "Sell what?nr", ch );
  1664. return;
  1665.     }
  1666.     if ( ( keeper = find_keeper( ch ) ) == NULL )
  1667. return;
  1668.     if ( ( obj = get_obj_carry( ch, arg ) ) == NULL )
  1669.     {
  1670. act( "$n tells you 'You don't have that item'.",
  1671.     keeper, NULL, ch, TO_VICT );
  1672. ch->reply = keeper;
  1673. return;
  1674.     }
  1675.     if ( !can_drop_obj( ch, obj ) )
  1676.     {
  1677. send_to_char( "You can't let go of it.nr", ch );
  1678. return;
  1679.     }
  1680.     if ( ( cost = get_cost( keeper, obj, FALSE ) ) <= 0 )
  1681.     {
  1682. act( "$n looks uninterested in $p.", keeper, obj, ch, TO_VICT );
  1683. return;
  1684.     }
  1685.     act( "$n sells $p.", ch, obj, NULL, TO_ROOM );
  1686.     sprintf( buf, "You sell $p for %d gold piece%s.",
  1687. cost, cost == 1 ? "" : "s" );
  1688.     act( buf, ch, obj, NULL, TO_CHAR );
  1689.     ch->gold     += cost;
  1690.     keeper->gold -= cost;
  1691.     if ( keeper->gold < 0 )
  1692. keeper->gold = 0;
  1693.     if ( obj->item_type == ITEM_TRASH )
  1694.     {
  1695. extract_obj( obj );
  1696.     }
  1697.     else
  1698.     {
  1699. obj_from_char( obj );
  1700. obj_to_char( obj, keeper );
  1701.     }
  1702.     return;
  1703. }
  1704. void do_value( CHAR_DATA *ch, char *argument )
  1705. {
  1706.     char buf[MAX_STRING_LENGTH];
  1707.     char arg[MAX_INPUT_LENGTH];
  1708.     CHAR_DATA *keeper;
  1709.     OBJ_DATA *obj;
  1710.     int cost;
  1711.     one_argument( argument, arg );
  1712.     if ( arg[0] == '' )
  1713.     {
  1714. send_to_char( "Value what?nr", ch );
  1715. return;
  1716.     }
  1717.     if ( ( keeper = find_keeper( ch ) ) == NULL )
  1718. return;
  1719.     if ( ( obj = get_obj_carry( ch, arg ) ) == NULL )
  1720.     {
  1721. act( "$n tells you 'You don't have that item'.",
  1722.     keeper, NULL, ch, TO_VICT );
  1723. ch->reply = keeper;
  1724. return;
  1725.     }
  1726.     if ( !can_drop_obj( ch, obj ) )
  1727.     {
  1728. send_to_char( "You can't let go of it.nr", ch );
  1729. return;
  1730.     }
  1731.     if ( ( cost = get_cost( keeper, obj, FALSE ) ) <= 0 )
  1732.     {
  1733. act( "$n looks uninterested in $p.", keeper, obj, ch, TO_VICT );
  1734. return;
  1735.     }
  1736.     sprintf( buf, "$n tells you 'I'll give you %d gold coins for $p'.", cost );
  1737.     act( buf, keeper, obj, ch, TO_VICT );
  1738.     ch->reply = keeper;
  1739.     return;
  1740. }