#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "emlen.h"
static char bah[500];
extern char *const dir_rev[];
void
do_drag (CHAR_DATA * ch, char *argy)
{
char arg1[SML_LENGTH];
char buf[500];
SINGLE_OBJECT *obj;
CHAR_DATA *rch;
char arg2[SML_LENGTH];
int dir;
ROOM_DATA *oldroom;
DEFINE_COMMAND ("drag", do_drag, POSITION_STANDING, 0, LOG_NORMAL, "This command allows you to drag a corpse.")
arg1[0] = '\0';
arg2[0] = '\0';
if (strlen (argy) >= 50)
return;
argy = one_argy (argy, arg1);
argy = one_argy (argy, arg2);
if (arg1[0] == '\0')
{
send_to_char ("Drag what?\n\r", ch);
return;
}
if (arg2[0] == '\0')
{
send_to_char ("In which direction?\n\r", ch);
return;
}
if ((obj = get_obj_here (ch, arg1, SEARCH_ROOM_FIRST)) == NULL || obj->carried_by != NULL || obj->in_room == NULL)
{
send_to_char ("I don't see that object here....\n\r", ch);
return;
}
if (obj->pIndexData->item_type != ITEM_CORPSE_PC && obj->pIndexData->item_type != ITEM_CORPSE_NPC &&
!CAN_WEAR (obj, ITEM_TAKE))
{
send_to_char ("You can't drag that object...\n\r", ch);
return;
}
if (ch->move < 10)
{
send_to_char ("You are too exhausted to drag anything...\n\r", ch);
return;
}
dir = -1;
if (arg2[0] == 'n' || arg2[0] == 'N')
dir = DIR_NORTH;
if (arg2[0] == 'w' || arg2[0] == 'W')
dir = DIR_WEST;
if (arg2[0] == 'e' || arg2[0] == 'E')
dir = DIR_EAST;
if (arg2[0] == 's' || arg2[0] == 'S')
dir = DIR_SOUTH;
if (arg2[0] == 'u' || arg2[0] == 'U')
dir = DIR_UP;
if (arg2[0] == 'd' || arg2[0] == 'D')
dir = DIR_DOWN;
if (dir == -1)
{
send_to_char ("Which direction?\n\r", ch);
return;
}
oldroom = ch->in_room;
if (!move_char (ch, dir))
{
send_to_char ("How can you drag something to someplace you can't even go!\n\r", ch);
return;
}
sprintf (buf, "%s drags %s %s.\n\r", NAME (ch),
(obj->short_descr ? obj->short_descr : obj->pIndexData->short_descr),
dir_name[dir]);
if (oldroom->more)
for (rch = oldroom->more->people; rch != NULL; rch = rch->next_in_room)
{
if (rch == ch)
continue;
if (!IS_AWAKE (rch))
continue;
send_to_char (buf, rch);
}
obj_from (obj);
obj_to (obj, ch->in_room);
sprintf (buf, "You drag %s into the room.\n\r",
(obj->short_descr ? obj->short_descr : obj->pIndexData->short_descr));
send_to_char (buf, ch);
sprintf (buf, "%s drags %s in from %s.\n\r", NAME (ch),
(obj->short_descr ? obj->short_descr : obj->pIndexData->short_descr),
dir_rev[rev_dir[dir]]);
for (rch = ch->in_room->more->people; rch != NULL; rch = rch->next_in_room)
{
if (rch == ch)
continue;
if (!IS_AWAKE (rch))
continue;
send_to_char (buf, rch);
}
SUBMOVE(ch, number_range (8, 10));
return;
}
void
do_meditate (CHAR_DATA * ch, char *argy)
{
DEFINE_COMMAND ("meditate", do_meditate, POSITION_RESTING, 0, LOG_NORMAL, "Allows you to meditate, and focus on magical energy regeneration.")
if (RIDING (ch) != NULL)
{
send_to_char ("If you wanted to sit and meditate, you would not be riding!\n\r", ch);
return;
}
if (ch->fgt && ch->fgt->ears > 9)
{
send_to_char ("You are bashed; you can't meditate...\n\r", ch);
return;
}
if (FIGHTING(ch))
{
if (FIGHTING(ch)->in_room != ch->in_room)
{
ch->fgt->fighting = NULL;
NEW_POSITION(ch, POSITION_STANDING);
}
else
{
act ("You must start meditation from a standing or resting position.", ch, NULL, NULL, TO_CHAR);
return;
}
}
if (ch->position != POSITION_STANDING && ch->position != POSITION_RESTING && ch->position != POSITION_MEDITATING)
{
act ("You must start meditation from a standing or resting position.", ch, NULL, NULL, TO_CHAR);
return;
}
if (ch->position == POSITION_MEDITATING)
{
NEW_POSITION(ch, POSITION_STANDING);
act ("You stop meditating, and clamber to your feet.", ch, NULL, NULL, TO_CHAR);
act ("$N stops meditating, and clambers to $s feet.", ch, NULL, ch, TO_ROOM);
return;
}
NEW_POSITION(ch, POSITION_MEDITATING);
act ("You sit down cross-legged and begin meditating.", ch, NULL, NULL, TO_CHAR);
act ("$N sits down, clears $s mind, and begins meditating.", ch, NULL, ch, TO_ROOM);
return;
}
void
get_obj (CHAR_DATA * ch, SINGLE_OBJECT * obj, SINGLE_OBJECT * container, bool opp_align)
{
CHAR_DATA *fch;
CHAR_DATA *fch_next;
if (!CAN_WEAR (obj, ITEM_TAKE))
{
send_to_char ("You can't take that.\n\r", ch);
return;
}
for (fch = ch->in_room->more->people; fch != NULL; fch = fch_next)
{
fch_next = fch->next_in_room;
if (IS_MOB (fch) && IS_SET (fch->pIndexData->act3, ACT3_GUARD_ITEM)
&& obj->pIndexData->vnum == fch->pIndexData->guard)
{
do_say (fch, "Don't touch that!");
multi_hit (fch, ch, TYPE_UNDEFINED);
}
}
if (!opp_align)
{
if (container != NULL)
{
act ("You get $p\x1B[37;0m from $P\x1B[0m.", ch, obj, container, TO_CHAR);
act ("$n gets $p\x1B[37;0m from $P\x1B[0m.", ch, obj, container, TO_ROOM);
}
else
{
act ("You get $p\x1B[37;0m.", ch, obj, container, TO_CHAR);
act ("$n gets $p\x1B[37;0m.", ch, obj, container, TO_ROOM);
}
}
if (obj->pIndexData->vnum > 90000 &&
(obj->pIndexData->item_type == ITEM_FURNITURE ||
obj->pIndexData->item_type == ITEM_TOOL))
{
fprintf (stderr, "FORGECRAP %s gotten by %s at %d.\n",
OOSTR(obj, short_descr), NAME(ch), ch->in_room->vnum);
}
obj_from (obj);
obj->wear_loc = -1;
obj_to (obj, ch);
if (obj->pIndexData->item_type == ITEM_VEHICLE && IS_PLAYER(ch))
{
I_VEHICLE *veh = (I_VEHICLE *) obj->more;
if (veh->sector_use == SECT_WATER_SWIM ||
veh->sector_use == SECT_WATER_NOSWIM)
SET_BIT(ch->act, PLR_HAS_BOAT);
}
return;
}
void
do_take (CHAR_DATA * ch, char *argy)
{
DEFINE_COMMAND ("take", do_get, POSITION_RESTING, 0, LOG_NORMAL, "This command allows you to get an object from an object, or from the ground.")
return;
}
void
do_get (CHAR_DATA * ch, char *argy)
{
char arg1[SML_LENGTH];
char arg2[SML_LENGTH];
char buffy[SML_LENGTH];
SINGLE_OBJECT *obj;
SINGLE_OBJECT *obj_next;
SINGLE_OBJECT *container;
CHAR_DATA *fch;
I_CONTAINER *cnt;
bool found = FALSE;
bool gonnasave = FALSE;
bool opp_align = FALSE;
DEFINE_COMMAND ("get", do_get, POSITION_RESTING, 0, LOG_NORMAL, "This command allows you to get an object from an object, or from the ground.")
check_room_more (ch->in_room);
if(IS_PLAYER(ch))
{
for(fch = ch->in_room->more->people; fch != NULL; fch = fch->next_in_room)
{
if (IS_PLAYER(fch) && DIFF_ALIGN(ch, fch))
{
opp_align = TRUE;
break;
}
}
}
if (!str_cmp (argy, "all corpse"))
{
argy = one_argy (argy, arg1);
argy = one_argy (argy, arg2);
}
else
{
argy = one_argy (argy, arg1);
while (str_prefix ("from", argy) && argy != "" && argy[0] != '\0')
argy = one_argy (argy, arg1);
argy = one_argy (argy, arg2);
while (argy != "" && argy[0] != '\0')
argy = one_argy (argy, arg2);
}
if (arg1[0] == '\0')
{
send_to_char ("Get what?\n\r", ch);
return;
}
if (arg2[0] == '\0')
{
if (str_cmp (arg1, "all") && str_prefix ("all.", arg1))
{
if (!str_cmp (arg1, "coins") || !str_cmp (arg1, "coin"))
{
found = FALSE;
if (ch->in_room->more->gold > 0)
{
found = TRUE;
sprintf(bah, "You pick up \x1b[1;33m%d\x1b[0;37m gold.\n\r", ch->in_room->more->gold);
send_to_char(bah, ch);
ch->gold += ch->in_room->more->gold;
ch->in_room->more->gold = 0;
}
if (ch->in_room->more->copper > 0)
{
found = TRUE;
sprintf(bah, "You pick up \x1b[33m%d\x1b[0;37m copper.\n\r",
ch->in_room->more->copper);
send_to_char(bah, ch);
ch->copper += ch->in_room->more->copper;
ch->in_room->more->copper = 0;
}
if (!found)
send_to_char("There are no coins here to pick up.\n\r", ch);
return;
}
obj = get_obj_list (ch, arg1, ch->in_room->more->contents);
if (obj == NULL || IS_SET (obj->extra_flags, ITEM_UNSEEN))
{
act ("It isn't here.", ch, NULL, NULL, TO_CHAR);
return;
}
get_obj (ch, obj, NULL, opp_align);
if (opp_align)
{
act("You pick up $p.", ch, obj,NULL , TO_CHAR);
act("$n picks up $p.", ch, obj, NULL, TO_ROOM);
}
}
else
{
found = FALSE;
if (ch->in_room->more->gold > 0)
{
found = TRUE;
sprintf(bah, "You pick up \x1b[1;33m%d\x1b[0;37m gold.\n\r", ch->in_room->more->gold);
send_to_char(bah, ch);
ch->gold += ch->in_room->more->gold;
ch->in_room->more->gold = 0;
}
if (ch->in_room->more->copper > 0)
{
found = TRUE;
sprintf(bah, "You pick up \x1b[33m%d\x1b[0;37m copper.\n\r",
ch->in_room->more->copper);
send_to_char(bah, ch);
ch->copper += ch->in_room->more->copper;
ch->in_room->more->copper = 0;
}
for (obj = ch->in_room->more->contents; obj != NULL; obj = obj_next)
{
obj_next = obj->next_content;
if ((arg1[3] == '\0' || is_name (&arg1[4], obj->pIndexData->name))
&& can_see_obj (ch, obj) && !IS_SET (obj->extra_flags, ITEM_UNSEEN))
{
found = TRUE;
get_obj (ch, obj, NULL, opp_align);
}
}
if (!found)
{
if (arg1[3] == '\0')
send_to_char ("I see nothing here.\n\r", ch);
else
act ("I don't see that here.", ch, NULL, NULL, TO_CHAR);
}
else if (opp_align)
{
act("You pick up several items.", ch, NULL,NULL , TO_CHAR);
act("$n gathers up several things off the ground.", ch, NULL, NULL, TO_ROOM);
}
}
}
else
{
if (!str_cmp (arg2, "all") || !str_prefix ("all.", arg2))
{
send_to_char ("You can't do that.\n\r", ch);
return;
}
if ((container = (!str_prefix ("cor", arg2) ? get_obj_here (ch, arg2, SEARCH_ROOM_FIRST) : get_obj_here (ch, arg2, SEARCH_INV_FIRST))) == NULL)
{
send_to_char("That does not appear to be here.\n\r", ch);
return;
}
switch (container->pIndexData->item_type)
{
default:
send_to_char ("You can't look inside that...\n\r", ch);
return;
case ITEM_CONTAINER:
case ITEM_CORPSE_NPC:
{
cnt = (I_CONTAINER *) container->more;
if ((cnt->money > 0 || container->contains) && strlen (NAME (ch)) < 30)
{
if (cnt->looted_by[0] == '\0')
{
strcpy (cnt->looted_by, NAME (ch));
}
else if (cnt->looted_by_two[0] == '\0' && str_cmp (NAME (ch), cnt->looted_by))
{
strcpy (cnt->looted_by_two, NAME (ch));
}
}
}
break;
case ITEM_CORPSE_PC:
{
char name[SML_LENGTH];
char *pd;
if (!pow.get_from_corpse_while_in_combat && FIGHTING (ch))
{
send_to_char ("You don't have time to loot the corpse while you are fighting!\n\r", ch);
return;
}
cnt = (I_CONTAINER *) container->more;
pd = OOSTR (container, short_descr);
pd = one_argy (pd, name);
pd = one_argy (pd, name);
pd = one_argy (pd, name);
pd = one_argy (pd, name);
/*name now equals the name of the person */
if (IS_PLAYER(ch) && LEVEL(ch)<=pow.loot_level && str_cmp(name,NAME(ch)))
{
send_to_char("You cannot loot another person's corpse at that low level.\n\r",ch);
return;
}
if ((container->contains || cnt->money > 0) && str_cmp (NAME (ch), capitalize (name)))
{
if (strlen (NAME (ch)) < 30)
{
if (cnt->looted_by[0] == '\0')
{
strcpy (cnt->looted_by, NAME (ch));
}
else if (cnt->looted_by_two[0] == '\0' && str_cmp (NAME (ch), cnt->looted_by))
{
strcpy (cnt->looted_by_two, NAME (ch));
}
}
fprintf (stderr, "%s just took something from %s's corpse.\n",
NAME (ch), capitalize (name));
}
if (container->contains || cnt->money > 0)
{
sprintf (buffy, "%s%s.cor", PLAYER_DIR_2, capitalize (name));
unlink (buffy);
}
gonnasave = TRUE;
if (IS_PLAYER (ch) && str_cmp (NAME (ch), capitalize (name)))
{
if (ch->pcdata->no_quit_pk < 4);
ch->pcdata->no_quit_pk = 4;/*JRAJRA*/
} /* JRAJRA -noquit stuff */
}
}
cnt = (I_CONTAINER *) container->more;
if (IS_SET (cnt->flags, CONT_CLOSED))
{
act ("The $d is closed.", ch, NULL, container->pIndexData->name, TO_CHAR);
return;
}
if (str_cmp (arg1, "all") && str_prefix ("all.", arg1))
{
cnt = (I_CONTAINER *) container->more;
if (!str_cmp (arg1, "coins"))
{
if (cnt->money < 1)
{
send_to_char ("I see no coins in there.\n\r", ch);
return;
}
sprintf (bah, "You get %d copper from %s\x1B[0;37m.\n\r", cnt->money, OOSTR (container, short_descr));
ch->copper += cnt->money;
cnt->money = 0;
send_to_char (bah, ch);
return;
}
obj = get_obj_list (ch, arg1, container->contains);
if (obj == NULL)
{
act ("There is nothing like that in the $T\x1B[0m.", ch, NULL, arg2, TO_CHAR);
return;
}
get_obj (ch, obj, container, opp_align);
if (opp_align)
{
act("You get $p from $P.", ch, obj, container, TO_CHAR);
act("$n reaches in and gets $p out of $P.", ch, obj, container, TO_ROOM);
}
}
else
{
cnt = (I_CONTAINER *) container->more;
found = FALSE;
if (cnt->money > 0)
{
sprintf (bah, "You get %s from %s.\x1B[0;37m\n\r", name_amount (cnt->money), OOSTR (container, short_descr));
ch->copper += cnt->money;
cnt->money = 0;
send_to_char (bah, ch);
found = TRUE;
}
for (obj = container->contains; obj != NULL; obj = obj_next)
{
obj_next = obj->next_content;
if ((arg1[3] == '\0' || is_name (&arg1[4], obj->pIndexData->name))
&& can_see_obj (ch, obj))
{
found = TRUE;
get_obj (ch, obj, container, opp_align);
}
}
if (!found)
{
if (arg1[3] == '\0')
act ("I see nothing in $T\x1B[0m.", ch, NULL, arg2, TO_CHAR);
else
act ("I see nothing like that in $T\x1B[0m.", ch, NULL, arg2, TO_CHAR);
}
else
{
if (opp_align)
{
if (arg1[3] == '\0')
{
act ("You get some things from $P\x1B[0m.", ch, NULL,container,TO_CHAR);
act ("$n gets some things from $P\x1b[0;37m.", ch, NULL,container,TO_ROOM);
}
else
{
act ("You get some things from $P\x1B[0m.", ch,NULL,container,TO_CHAR);
act ("$n gets some stuff from $P\x1b[0;37m.", ch, NULL,container, TO_ROOM);
}
}
}
}
}
if (IS_PLAYER (ch))
update_weight_num (ch);
check_clear_more (ch->in_room);
return;
}
void
do_put (CHAR_DATA * ch, char *argy)
{
char arg1[SML_LENGTH];
char arg2[SML_LENGTH];
SINGLE_OBJECT *container;
SINGLE_OBJECT *obj;
SINGLE_OBJECT *obj_next;
I_CONTAINER *cnt;
DEFINE_COMMAND ("put", do_put, POSITION_RESTING, 0, LOG_NORMAL, "This command allows you to put an object in something.")
argy = one_argy (argy, arg1);
while (str_prefix ("in", argy) && argy != "" && argy[0] != '\0')
argy = one_argy (argy, arg1);
argy = one_argy (argy, arg2);
while (argy != "" && argy[0] != '\0')
argy = one_argy (argy, arg2);
if (arg1[0] == '\0' || arg2[0] == '\0')
{
send_to_char ("Put what in what?\n\r", ch);
return;
}
if (!str_cmp (arg1, "all.coin") || !str_cmp (arg1, "coin") || !str_cmp (arg1, "all.coins") || !str_cmp (arg1, "coins"))
{
char buffu[500];
if ((container = get_obj_here (ch, arg2, SEARCH_INV_FIRST)) == NULL)
{
act ("I see no $T here.", ch, NULL, arg2, TO_CHAR);
return;
}
if (container->pIndexData->item_type != ITEM_CONTAINER)
{
send_to_char ("You can't put anything inside of that.\n\r", ch);
return;
}
cnt = (I_CONTAINER *) container->more;
cnt->money += ch->copper;
sprintf (buffu, "You put your copper in %s. (Gold pieces can't go inside containers).\n\r", OOSTR (container, short_descr));
act (buffu, ch, NULL, ch, TO_CHAR);
ch->copper = 0;
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, SEARCH_INV_FIRST)) == NULL)
{
act ("I see no $T here.", ch, NULL, arg2, TO_CHAR);
return;
}
if (container->pIndexData->item_type != ITEM_CONTAINER)
{
send_to_char ("That's not a container.\n\r", ch);
return;
}
cnt = (I_CONTAINER *) container->more;
if (IS_SET (cnt->flags, CONT_CLOSED))
{
act ("The $d is closed.", ch, NULL, container->pIndexData->name, TO_CHAR);
return;
}
if (str_cmp (arg1, "all") && str_prefix ("all.", arg1))
{
if ((obj = get_obj_inv (ch, arg1)) == NULL)
{
send_to_char ("You do not have that item.\n\r", ch);
return;
}
if (obj->wear_loc!=WEAR_NONE && IS_SET (obj->extra_flags, ITEM_NOREMOVE)) {
send_to_char("You can't remove that item!\n\r",ch);
return;
}
if (obj == container)
{
send_to_char ("Now that would be a trick, eh?\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 ((cnt->max_weight + container->pIndexData->weight)
< (get_obj_weight (obj) + get_obj_weight (container)))
{
send_to_char ("It won't fit.\n\r", ch);
return;
}
obj_from (obj);
obj_to (obj, container);
if (obj->pIndexData->item_type == ITEM_VEHICLE && IS_PLAYER(ch))
{
I_VEHICLE *veh = (I_VEHICLE *) obj->more;
if (veh->sector_use == SECT_WATER_SWIM ||
veh->sector_use == SECT_WATER_NOSWIM)
REMOVE_BIT(ch->act, PLR_HAS_BOAT);
}
act ("$n puts $p\x1B[0m in $P\x1B[0m.", ch, obj, container, TO_ROOM);
act ("You put $p\x1B[0m in $P\x1B[0m.", ch, obj, container, TO_CHAR);
}
else
{
cnt = (I_CONTAINER *) container->more;
for (obj = ch->carrying; obj != NULL; obj = obj_next)
{
obj_next = obj->next_content;
if ((arg1[3] == '\0' || is_name (&arg1[4], obj->pIndexData->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)
<= cnt->max_weight)
{
obj_from (obj);
obj_to (obj, container);
if (obj->pIndexData->item_type == ITEM_VEHICLE && IS_PLAYER(ch))
{
I_VEHICLE *veh = (I_VEHICLE *) obj->more;
if (veh->sector_use == SECT_WATER_SWIM ||
veh->sector_use == SECT_WATER_NOSWIM)
REMOVE_BIT(ch->act, PLR_HAS_BOAT);
}
act ("$n puts $p\x1B[0m in $P\x1B[0m.", ch, obj, container, TO_ROOM);
act ("You put $p\x1B[0m in $P\x1B[0m.", ch, obj, container, TO_CHAR);
}
}
}
return;
}
void
do_drop (CHAR_DATA * ch, char *argy)
{
char arg[SML_LENGTH];
SINGLE_OBJECT *obj;
char buf[SML_LENGTH];
CHAR_DATA *fch;
bool opp_align = FALSE;
int amount;
SINGLE_OBJECT *obj_next;
bool found = FALSE;
char arg2[SML_LENGTH];
DEFINE_COMMAND ("drop", do_drop, POSITION_RESTING, 0, LOG_NORMAL, "This command allows you to drop an object.")
argy = one_argy (argy, arg);
if (!is_number (arg))
{
while (argy != "" && argy[0] != '\0')
argy = one_argy (argy, arg);
}
argy = one_argy (argy, arg2);
if (!ch->in_room || !ch->in_room->more) return;
if (IS_PLAYER(ch) && ch->pcdata->no_quit_pk >= 6)
{
bool opp_align_in_room = FALSE;
CHAR_DATA *rch;
for (rch = ch->in_room->more->people; rch != NULL; rch =
rch->next_in_room)
{
if (IS_PLAYER(rch) && DIFF_ALIGN(ch, rch))
{
opp_align_in_room = TRUE;
break;
}
}
/* if (!opp_align_in_room)
{
send_to_char("You cannot drop things now! Your heart is racing too much!\n\r", ch);
return;
} */
}
CAN_DROP_ITEMS_IN_BGROUND (no)
CAN_DROP_ITEMS_IN_ARENA (no)
if (IS_PLAYER(ch))
for (fch = ch->in_room->more->people; fch != NULL; fch = fch->next_in_room)
{
if (IS_PLAYER(fch) && DIFF_ALIGN(ch, fch))
{
opp_align = TRUE;
break;
}
}
if (arg[0] == '\0')
{
send_to_char ("Drop what?\n\r", ch);
return;
}
if (!str_cmp (arg, "coin") || !str_cmp (arg, "coins") || !str_cmp (arg, "all.coin") || !str_cmp (arg, "all.coins"))
{
char bufff[500];
if (tally_coins (ch) < 0)
{
send_to_char ("You have no coins in your inventory!\n\r", ch);
return;
}
if (LEVEL (ch) < 100 || IS_REAL_GOD (ch))
{
ch->in_room->more->copper += ch->copper;
ch->in_room->more->gold += ch->gold;
}
sprintf (bufff, "You drop your coins.\n\r");
act("$n drops some coins.", ch, NULL,NULL, TO_ROOM);
send_to_char (bufff, ch);
ch->gold = 0;
ch->copper = 0;
return;
}
if (IS_PLAYER (ch))
{
update_weight_num (ch);
/*save_char_obj(ch); */
}
if ((!str_cmp (arg2, "gold"))
&& (is_number (arg) && atoi (arg) > 0))
{
amount = atoi (arg);
if (amount < 1)
return;
if (ch->gold < amount)
{
send_to_char ("You don't have that many \x1B[1;33mgold\x1B[37;0m coins.\n\r", ch);
return;
}
ch->gold -= amount;
if (ch->in_room->sector_type != SECT_WATER_SWIM && ch->in_room->sector_type != SECT_WATER_NOSWIM &&
((LEVEL (ch) < 100) || IS_REAL_GOD (ch)))
ch->in_room->more->gold += amount;
sprintf (buf, "You drop %d \x1B[1;33mgold\x1B[37;0m coins.\n\r", amount);
send_to_char (buf, ch);
act ("$n drops some \x1B[1;33mgold\x1B[37;0m coins.", ch, NULL, NULL, TO_ROOM);
return;
}
if ((!str_cmp (arg2, "copper"))
&& (is_number (arg) && atoi (arg) > 0))
{
amount = atoi (arg);
if (amount < 1)
return;
if (ch->copper < amount)
{
send_to_char ("You don't have that many \x1B[33mcopper\x1B[37;0m coins.\n\r", ch);
return;
}
ch->copper -= amount;
if (ch->in_room->sector_type != SECT_WATER_SWIM && ch->in_room->sector_type != SECT_WATER_NOSWIM &&
((LEVEL (ch) < 100) || IS_REAL_GOD (ch)))
ch->in_room->more->copper += amount;
sprintf (buf, "You drop %d \x1B[33mcopper\x1B[37;0m coins.\n\r", amount);
send_to_char (buf, ch);
act ("$n drops some \x1B[33mcopper\x1B[37;0m coins.", ch, NULL, NULL, TO_ROOM);
return;
}
if ((str_cmp (arg, "all") && str_prefix ("all.", arg)) || (ch->fgt && ch->fgt->combat_delay_count == 9))
{
if ((obj = get_obj_inv (ch, arg)) == NULL)
{
send_to_char ("You do not have that item.\n\r", ch);
return;
}
else if ((!NOT_WORN (obj)) /*|| (obj->wear_loc==WEAR_HOLD_1) ||
(obj->wear_loc==WEAR_HOLD_2) */ )
{
send_to_char ("You will have to remove it first.\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 (obj->wear_loc == -1 && !IS_SET (obj->extra_flags, ITEM_UNSEEN) &&
(ch->fgt && ch->fgt->combat_delay_count == 9))
{
act ("You hide $p\x1B[0m in the room.", ch, obj, NULL, TO_CHAR);
ch->fgt->combat_delay_count = 0;
obj->extra_flags ^= ITEM_UNSEEN;
obj_from (obj);
if (ch->in_room->sector_type == SECT_WATER_SWIM || ch->in_room->sector_type == SECT_WATER_NOSWIM)
{
act ("The waters cause $p to sink beneath them; lost forever.", ch, obj, NULL, TO_CHAR);
free_it (obj);
return;
}
obj_to (obj, ch->in_room);
if (obj->pIndexData->item_type == ITEM_VEHICLE && IS_PLAYER(ch))
{
I_VEHICLE *veh = (I_VEHICLE *) obj->more;
if (veh->sector_use == SECT_WATER_SWIM ||
veh->sector_use == SECT_WATER_NOSWIM)
REMOVE_BIT(ch->act, PLR_HAS_BOAT);
}
if (number_percent () > ch->pcdata->learned[gsn_hide] + ch->pcdata->plus_hide)
act ("$n hides $p\x1B[0m.", ch, obj, NULL, TO_ROOM);
return;
}
act ("You drop $p\x1B[37;0m.", ch, obj, NULL, TO_CHAR);
act ("$n drops $p\x1B[37;0m.", ch, obj, NULL, TO_ROOM);
obj_from (obj);
if (obj->pIndexData->item_type != ITEM_BOAT && (ch->in_room->sector_type == SECT_WATER_SWIM || ch->in_room->sector_type == SECT_WATER_NOSWIM))
{
act ("The waters cause $p to sink beneath them; lost forever.", ch, obj, NULL, TO_CHAR);
free_it (obj);
}
else
{
obj_to (obj, ch->in_room);
if (obj->pIndexData->item_type == ITEM_VEHICLE && IS_PLAYER(ch))
{
I_VEHICLE *veh = (I_VEHICLE *) obj->more;
if (veh->sector_use == SECT_WATER_SWIM ||
veh->sector_use == SECT_WATER_NOSWIM)
REMOVE_BIT(ch->act, PLR_HAS_BOAT);
}
if (IS_OBJ_STAT(obj, ITEM_DROPSCRIPT))
{
again_8:
/* Dropped item, check for triggers on object! */
{
SINGLE_TRIGGER *tr;
SCRIPT_INFO *s;
for (tr = trigger_list[TDROPPED]; tr != NULL; tr = tr->next)
{
if (obj->pIndexData->vnum == tr->attached_to_obj)
{
if (tr->running_info && !tr->interrupted)
continue; /* Already running, interrupted, but script says not to allow interruptions. */
if (tr->running_info && tr->interrupted != 2)
{
end_script (tr->running_info);
goto again_8;
}
{
char tmp[500];
sprintf(tmp,"%d",ch->in_room->vnum);
if (tr->keywords[0] != '\0' && !one_is_in_list_two (tmp, tr->keywords))
continue;
}
/* ----------------- */
/* Start the script! */
/* ----------------- */
tr->running_info = mem_alloc (sizeof (*tr->running_info));
s = tr->running_info;
bzero (s, sizeof (*s));
s->current = ch;
s->obj = obj;
strcpy (s->code_seg, tr->code_label);
s->current_line = 0;
s->called_by = tr;
s->next = info_list;
info_list = s;
execute_code (s);
/* ----------------- */
}
}
}
}
/* End trigger check! */
if (IS_SET(ch->in_room->room_flags, ROOM_DROPSCRIPT))
{
again_9:
/* Dropped item, check for triggers on room! */
{
SINGLE_TRIGGER *tr;
SCRIPT_INFO *s;
for (tr = trigger_list[TDROPPED]; tr != NULL; tr = tr->next)
{
if (ch->in_room->vnum == tr->attached_to_room)
{
if (tr->running_info && !tr->interrupted)
continue; /* Already running, interrupted, but script says not to allow interruptions. */
if (tr->running_info && tr->interrupted != 2)
{
end_script (tr->running_info);
goto again_9;
}
{
char tmp[50];
sprintf(tmp,"%d",obj->pIndexData->vnum);
if (tr->keywords[0] != '\0' && !one_is_in_list_two (tmp, tr->keywords))
continue;
}
/* ----------------- */
/* Start the script! */
/* ----------------- */
tr->running_info = mem_alloc (sizeof (*tr->running_info));
s = tr->running_info;
bzero (s, sizeof (*s));
s->current = ch;
s->room = ch->in_room;
s->obj = obj;
strcpy (s->code_seg, tr->code_label);
s->current_line = 0;
s->called_by = tr;
s->next = info_list;
info_list = s;
execute_code (s);
/* ----------------- */
}
}
}
}
/* End trigger check! */
}
}
else
{
if (!str_cmp (arg, "all"))
{
found = FALSE;
if (tally_coins (ch) > 0)
{
char bunl[500];
if (ch->in_room->sector_type != SECT_WATER_SWIM && ch->in_room->sector_type != SECT_WATER_NOSWIM &&
(LEVEL (ch) < 100 || IS_REAL_GOD (ch)))
{
ch->in_room->more->gold += ch->gold;
ch->in_room->more->copper += ch->copper;
}
sprintf (bunl, "You drop your coins.\n\r");
send_to_char (bunl, ch);
found = TRUE;
ch->gold = 0;
ch->copper = 0;
}
}
for (obj = ch->carrying; obj != NULL; obj = obj_next)
{
if (!obj->next_content)
obj_next = NULL;
else
obj_next = obj->next_content;
if ((arg[3] == '\0' || is_name (&arg[4], obj->pIndexData->name))
&& can_see_obj (ch, obj)
&& (obj->wear_loc == WEAR_NONE)
&& can_drop_obj (ch, obj))
{
found = TRUE;
if (IS_PLAYER(ch) && !opp_align)
{
act ("$n drops $p\x1B[37;0m.", ch, obj, NULL, TO_ROOM);
act ("You drop $p\x1B[37;0m.", ch, obj, NULL, TO_CHAR);
}
obj_from (obj);
if (obj->pIndexData->item_type != ITEM_BOAT && (ch->in_room->sector_type == SECT_WATER_SWIM || ch->in_room->sector_type == SECT_WATER_NOSWIM))
{
act ("The waters cause $p to sink beneath them; lost forever.", ch, obj, NULL, TO_CHAR);
free_it (obj);
}
else
{
if (IS_OBJ_STAT(obj, ITEM_DROPSCRIPT))
{
again_10:
/* Dropped item, check for triggers on object! */
{
SINGLE_TRIGGER *tr;
SCRIPT_INFO *s;
for (tr = trigger_list[TDROPPED]; tr != NULL; tr = tr->next)
{
if (obj->pIndexData->vnum == tr->attached_to_obj)
{
if (tr->running_info && !tr->interrupted)
continue; /* Already running, interrupted, but script says not to allow interruptions. */
if (tr->running_info && tr->interrupted != 2)
{
end_script (tr->running_info);
goto again_10;
}
{
char tmp[50];
sprintf(tmp,"%d",ch->in_room->vnum);
if (tr->keywords[0] != '\0' && !one_is_in_list_two (tmp, tr->keywords))
continue;
}
/* ----------------- */
/* Start the script! */
/* ----------------- */
tr->running_info = mem_alloc (sizeof (*tr->running_info));
s = tr->running_info;
bzero (s, sizeof (*s));
s->current = ch;
s->obj = obj;
strcpy (s->code_seg, tr->code_label);
s->current_line = 0;
s->called_by = tr;
s->next = info_list;
info_list = s;
execute_code (s);
/* ----------------- */
}
}
}
}
/* End trigger check! */
if (IS_SET(ch->in_room->room_flags, ROOM_DROPSCRIPT))
{
again_11:
/* Dropped item, check for triggers on room! */
{
SINGLE_TRIGGER *tr;
SCRIPT_INFO *s;
for (tr = trigger_list[TDROPPED]; tr != NULL; tr = tr->next)
{
if (ch->in_room->vnum == tr->attached_to_room)
{
if (tr->running_info && !tr->interrupted)
continue; /* Already running, interrupted, but script says not to allow interruptions. */
if (tr->running_info && tr->interrupted != 2)
{
end_script (tr->running_info);
goto again_11;
}
{
char tmp[50];
sprintf(tmp,"%d",obj->pIndexData->vnum);
if (tr->keywords[0] != '\0' && !one_is_in_list_two (tmp, tr->keywords))
continue;
}
/* ----------------- */
/* Start the script! */
/* ----------------- */
tr->running_info = mem_alloc (sizeof (*tr->running_info));
s = tr->running_info;
bzero (s, sizeof (*s));
s->current = ch;
s->room = ch->in_room;
s->obj = obj;
strcpy (s->code_seg, tr->code_label);
s->current_line = 0;
s->called_by = tr;
s->next = info_list;
info_list = s;
execute_code (s);
/* ----------------- */
}
}
}
}
/* End trigger check! */
obj_to (obj, ch->in_room);
if (obj->pIndexData->item_type == ITEM_VEHICLE && IS_PLAYER(ch))
{
I_VEHICLE *veh = (I_VEHICLE *) obj->more;
if (veh->sector_use == SECT_WATER_SWIM ||
veh->sector_use == SECT_WATER_NOSWIM)
REMOVE_BIT(ch->act, PLR_HAS_BOAT);
}
}
}
}
if (!found)
{
if (arg[3] == '\0')
act ("You are not carrying anything.",
ch, NULL, arg, TO_CHAR);
else
act ("You are not carrying $T.",
ch, NULL, &arg[4], TO_CHAR);
}
else if (IS_PLAYER(ch) && opp_align)
{
act("$n drops some stuff.", ch, NULL, NULL, TO_ROOM);
act("You drop some stuff.", ch, NULL, NULL, TO_CHAR);
}
}
return;
}
void
do_give (CHAR_DATA * ch, char *argy)
{
char arg1[SML_LENGTH];
char arg2[SML_LENGTH];
char arg3[SML_LENGTH];
CHAR_DATA *victim;
SINGLE_OBJECT *obj;
int amount;
char buf[STD_LENGTH];
DEFINE_COMMAND ("give", do_give, POSITION_RESTING, 0, LOG_NORMAL, "This command allows you to give something to someone.")
if (FIGHTING (ch) && !pow.give_while_fighting)
{
send_to_char ("You may not give objects while fighting!\n\r", ch);
return;
}
CAN_GIVE_ITEMS_IN_ARENA (no)
CAN_GIVE_ITEMS_IN_BGROUND (no)
argy = one_argy (argy, arg1);
argy = one_argy (argy, arg2);
argy = one_argy (argy, arg3);
if (arg1[0] == '\0' || arg2[0] == '\0')
{
send_to_char ("Give what to whom?\n\r", ch);
return;
}
if ((!str_cmp (arg2, "gold"))
&& (is_number (arg1) && atoi (arg1) > 0))
{
amount = atoi (arg1);
if (amount < 1)
return;
if (ch->gold < amount)
{
send_to_char ("You don't have that many \x1B[1;33mgold\x1B[37;0m coins.\n\r", ch);
return;
}
if ((victim = get_char_room (ch, arg3)) == NULL)
{
send_to_char ("You don't see them here.\n\r", ch);
return;
}
if (IS_PLAYER(victim) && IS_PLAYER(ch) && DIFF_ALIGN(ch, victim))
{
send_to_char("You cannot give anything to enemies!\n\r", ch);
return;
}
if (victim == ch)
return;
ch->gold -= amount;
victim->gold += amount;
sprintf (buf, "You give %d \x1B[1;33mgold\x1B[37;0m coins to %s.\n\r",
amount, NAME (victim));
send_to_char (buf, ch);
act ("$n gives some \x1B[1;33mgold\x1B[37;0m to $N.", ch, NULL, victim, TO_NOTVICT);
sprintf (buf, "%s gives you %d \x1B[1;33mgold\x1B[37;0m coins.\n\r", NAME (ch), amount);
send_to_char (buf, victim);
/* if ( IS_MOB(victim) && victim->npcdata->hire == ch )
{
victim->npcdata->paid += (amount*100);
if ( victim->npcdata->wage > victim->npcdata->paid )
{
sprintf(buf,"%s You still owe me %s.", NAME(ch),
name_amount(victim->npcdata->wage - victim->npcdata->paid ));
}
else
{
sprintf(buf,"%s Thanks.", NAME(ch));
victim->leader = ch;
victim->master = ch;
act("$N joins your group.",ch,NULL,victim,TO_CHAR);
}
do_tell(victim,buf);
} */
return;
}
if ((!str_cmp (arg2, "copper"))
&& (is_number (arg1) && atoi (arg1) > 0))
{
amount = atoi (arg1);
if (amount < 1)
return;
if (ch->copper < amount)
{
send_to_char ("You don't have that many \x1B[33mcopper\x1B[37;0m coins.\n\r", ch);
return;
}
if ((victim = get_char_room (ch, arg3)) == NULL)
{
send_to_char ("You don't see them here.\n\r", ch);
return;
}
if (IS_PLAYER(victim) && IS_PLAYER(ch) && DIFF_ALIGN(ch, victim))
{
send_to_char("You cannot give anything to enemies!\n\r", ch);
return;
}
if (victim == ch)
return;
ch->copper -= amount;
victim->copper += amount;
sprintf (buf, "You give %d \x1B[33mcopper\x1B[37;0m coins to %s.\n\r",
amount, NAME (victim));
send_to_char (buf, ch);
act ("$n gives some \x1B[33mcopper\x1B[37;0m to $N.", ch, NULL, victim, TO_NOTVICT);
sprintf (buf, "%s gives you %d \x1B[33mcopper\x1B[37;0m coins.\n\r", NAME (ch), amount);
send_to_char (buf, victim);
/* if ( IS_MOB(victim) && victim->npcdata->hire == ch )
{
victim->npcdata->paid += (amount);
if ( victim->npcdata->wage > victim->npcdata->paid )
{
sprintf(buf,"%s You still owe me %s.", NAME(ch),
name_amount(victim->npcdata->wage - victim->npcdata->paid ));
}
else
{
sprintf(buf,"%s Thanks.", NAME(ch));
victim->leader = ch;
victim->master = ch;
ch->num_in_group++;
act("$N joins your group.",ch,NULL,victim,TO_CHAR);
}
do_tell(victim,buf);
} */
return;
}
if ((victim = get_char_room (ch, arg2)) == NULL)
{
send_to_char ("They aren't here.\n\r", ch);
return;
}
if (IS_PLAYER(victim) && IS_PLAYER(ch) && DIFF_ALIGN(ch, victim))
{
send_to_char("You cannot give anything to enemies!\n\r", ch);
return;
}
if ((obj = get_obj_inv (ch, arg1)) == NULL)
{
send_to_char ("You do not have that item.\n\r", ch);
return;
}
if (!NOT_WORN (obj))
{
send_to_char ("You must remove it first.\n\r", ch);
return;
}
if ((victim = get_char_room (ch, arg2)) == NULL)
{
send_to_char ("They aren't here.\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 (!can_see_obj (victim, obj))
{
act ("$N can't see it.", ch, NULL, victim, TO_CHAR);
return;
}
if (obj->pIndexData->vnum > 90000 &&
(obj->pIndexData->item_type == ITEM_FURNITURE ||
obj->pIndexData->item_type == ITEM_TOOL))
{
fprintf (stderr, "FORGECRAP %s given by %s to %s at %d.\n",
OOSTR(obj, short_descr), NAME(ch), NAME(victim), ch->in_room->vnum);
}
obj_from (obj);
obj_to (obj, victim);
if (obj->pIndexData->item_type == ITEM_VEHICLE && IS_PLAYER(ch))
{
I_VEHICLE *veh = (I_VEHICLE *) obj->more;
if (veh->sector_use == SECT_WATER_SWIM ||
veh->sector_use == SECT_WATER_NOSWIM)
REMOVE_BIT(ch->act, PLR_HAS_BOAT);
}
if (obj->pIndexData->item_type == ITEM_VEHICLE && IS_PLAYER(victim))
{
I_VEHICLE *veh = (I_VEHICLE *) obj->more;
if (veh->sector_use == SECT_WATER_SWIM ||
veh->sector_use == SECT_WATER_NOSWIM)
REMOVE_BIT(victim->act, PLR_HAS_BOAT);
}
obj->wear_loc = -1;
if (IS_SET (obj->extra_flags, ITEM_INVENTORY))
obj->extra_flags ^= ITEM_INVENTORY;
act ("$n gives $p\x1B[0m to $N.", ch, obj, victim, TO_NOTVICT);
act ("$n gives you $p\x1B[0m.", ch, obj, victim, TO_VICT);
act ("You give $p\x1B[0m to $N.", ch, obj, victim, TO_CHAR);
if (IS_OBJ_STAT(obj, ITEM_GIVESCRIPT))
{
again_12:
/* Given item, check for triggers on mobbie! */
if (IS_MOB (victim))
{
SINGLE_TRIGGER *tr;
SCRIPT_INFO *s;
for (tr = trigger_list[TGIVEN]; tr != NULL; tr = tr->next)
{
if (victim->pIndexData->vnum == tr->attached_to_mob)
{
if (tr->running_info && !tr->interrupted)
continue; /* Already running, interrupted, but script says not to allow interruptions. */
if (tr->running_info && tr->interrupted != 2)
{
end_script (tr->running_info);
goto again_12;
}
{char tmp[50];
sprintf(tmp,"%d",obj->pIndexData->vnum);
if (tr->keywords[0] != '\0' && !one_is_in_list_two (tmp, tr->keywords))
continue;
}
/* ----------------- */
/* Start the script! */
/* ----------------- */
tr->running_info = mem_alloc (sizeof (*tr->running_info));
s = tr->running_info;
bzero (s, sizeof (*s));
s->current = ch;
s->mob = victim;
strcpy (s->code_seg, tr->code_label);
s->current_line = 0;
s->called_by = tr;
s->next = info_list;
info_list = s;
execute_code (s);
/* ----------------- */
}
}
/* End trigger check! */
again_13:
{
SINGLE_TRIGGER *tr;
SCRIPT_INFO *s;
for (tr = trigger_list[TGIVEN]; tr != NULL; tr = tr->next)
{
if (obj->pIndexData->vnum == tr->attached_to_obj)
{
if (tr->running_info && !tr->interrupted)
continue; /* Already running, interrupted, but script says not to allow interruptions. */
if (tr->running_info && tr->interrupted != 2)
{
end_script (tr->running_info);
goto again_13;
}
{char tmp[50];
sprintf(tmp,"%d",victim->pIndexData->vnum);
if (tr->keywords[0] != '\0' && !one_is_in_list_two (tmp , tr->keywords))
continue;
}
/* ----------------- */
/* Start the script! */
/* ----------------- */
tr->running_info = mem_alloc (sizeof (*tr->running_info));
s = tr->running_info;
bzero (s, sizeof (*s));
s->current = ch;
s->obj = obj;
s->mob = victim;
strcpy (s->code_seg, tr->code_label);
s->current_line = 0;
s->called_by = tr;
s->next = info_list;
info_list = s;
execute_code (s);
/* ----------------- */
}
}
}
}
}
/* End trigger check! */
return;
}
void
do_fill (CHAR_DATA * ch, char *argy)
{
char arg[SML_LENGTH];
SINGLE_OBJECT *obj;
SINGLE_OBJECT *fountain;
I_DRINK *dr;
bool found;
DEFINE_COMMAND ("fill", do_fill, POSITION_STANDING, 0, LOG_NORMAL, "This command allows you to fill a container or lamp.")
argy = one_argy (argy, arg);
if (arg[0] == '\0')
{
send_to_char ("Fill what?\n\r", ch);
return;
}
/*held */
if ((obj = get_obj_inv (ch, arg)) == NULL)
{
send_to_char ("You do not have that item.\n\r", ch);
return;
}
if (obj->pIndexData->item_type == ITEM_DRINK_CON)
{
found = FALSE;
dr = (I_DRINK *) obj->more;
for (fountain = ch->in_room->more->contents; fountain != NULL;
fountain = fountain->next_content)
{
if (fountain->pIndexData->item_type == ITEM_FOUNTAIN)
{
found = TRUE;
break;
}
}
if (!found)
{
send_to_char ("There is no fountain here!\n\r", ch);
return;
}
if (dr->liquid_now != 0 && dr->liquid_type != 0)
{
send_to_char ("It already has some other liquid in it.\n\r", ch);
return;
}
if (IS_SET(dr->not_poison, 1))
{
send_to_char("That container cannot be refilled.\n\r", ch);
return;
}
if (dr->liquid_now >= dr->max_liquid)
{
send_to_char ("The container is full.\n\r", ch);
return;
}
act ("You fill $p\x1B[0m.", ch, obj, NULL, TO_CHAR);
dr->liquid_type = 0;
dr->liquid_now = dr->max_liquid;
}
else if (obj->pIndexData->item_type == ITEM_LIGHT)
{
SINGLE_OBJECT *obj2;
I_LIGHT *lg = (I_LIGHT *) obj->more;
I_DRINK *dr;
/*get_item_hold */
if ((obj2 = get_item_held (ch, ITEM_DRINK_CON)) == NULL)
{
send_to_char ("You don't have anything in your hand to fill it with.\n\r", ch);
return;
}
dr = (I_DRINK *) obj2->more;
if (!IS_SET (lg->light_lit, LIGHT_FILLABLE) && !IS_SET (lg->light_fillable, LIGHT_FILLABLE))
{
send_to_char ("It can't be refueled.\n\r", ch);
return;
}
if (dr->liquid_type != -1)
{
send_to_char ("There's no oil in that container.\n\r", ch);
return;
}
if (lg->light_now != 0)
{
send_to_char ("There is already some oil in it.\n\r", ch);
return;
}
CAN_FILL_LIGHT_WHILE_LIT (yes);
if (dr->liquid_now < 1)
{
send_to_char ("There is no liquid left to fill it with.\n\r", ch);
return;
}
if (dr->liquid_now >= lg->max_light)
{
act ("You fill $p\x1B[0m with $P\x1B[0m.", ch, obj, obj2, TO_CHAR);
lg->light_now = lg->max_light;
dr->liquid_now += -(lg->max_light);
}
else
{
act ("You empty $P\x1B[0m into $p\x1B[0m.", ch, obj, obj2, TO_CHAR);
lg->light_now = lg->max_light;
dr->liquid_now = 0;
}
}
else
{
send_to_char ("You can't fill that.\n\r", ch);
return;
}
return;
}
void
do_empty (CHAR_DATA * ch, char *argy)
{
char arg[SML_LENGTH];
SINGLE_OBJECT *obj;
DEFINE_COMMAND ("empty", do_empty, POSITION_RESTING, 0, LOG_NORMAL, "This command allows you to empty a container of liquid.")
argy = one_argy (argy, arg);
if (arg[0] == '\0')
{
send_to_char ("Empty what?\n\r", ch);
return;
}
/*held */
if ((obj = get_obj_inv (ch, arg)) == NULL)
{
send_to_char ("You do not have that item.\n\r", ch);
return;
}
if (obj->pIndexData->item_type == ITEM_DRINK_CON)
{
I_DRINK *dr = (I_DRINK *) obj->more;
if (dr->liquid_now < 1)
{
send_to_char ("Your container is empty.\n\r", ch);
return;
}
act ("You empty $p\x1B[0m.", ch, obj, NULL, TO_CHAR);
dr->liquid_type = 0;
dr->liquid_now = 0;
}
return;
}
void
do_drink (CHAR_DATA * ch, char *argy)
{
char arg[SML_LENGTH];
SINGLE_OBJECT *obj;
int amount;
bool thirsty;
int liquid;
DEFINE_COMMAND ("drink", do_drink, POSITION_RESTING, 0, LOG_NORMAL, "This command allows you to drink from something.")
while (argy != "" && argy[0] != '\0')
argy = one_argy (argy, arg);
if (arg[0] == '\0')
{
for (obj = ch->in_room->more->contents; obj; obj = obj->next_content)
{
if (obj->pIndexData->item_type == ITEM_FOUNTAIN)
break;
}
if (obj == NULL)
{
send_to_char ("Drink what?\n\r", ch);
return;
}
}
else
{
if ((obj = get_obj_here (ch, arg, SEARCH_ROOM_FIRST)) == NULL)
{
send_to_char ("You can't find it.\n\r", ch);
return;
}
}
if (IS_PLAYER (ch) && ch->pcdata->condition[COND_DRUNK] > 10)
{
send_to_char ("You are too drunk, dazed, and confused to drink any more.\n\r", ch);
return;
}
if (IS_PLAYER (ch) && ch->pcdata->condition[COND_THIRST] < 7)
thirsty = TRUE;
else
thirsty = FALSE;
if (IS_PLAYER (ch) && ch->pcdata->condition[COND_THIRST] > 40)
{
send_to_char ("If you drank any more, your bladder would explode.\n\r", ch);
return;
}
switch (obj->pIndexData->item_type)
{
default:
send_to_char ("You can't drink from that.\n\r", ch);
break;
case ITEM_FOUNTAIN:
{
I_FOUNTAIN *fn = (I_FOUNTAIN *) obj->more;
if (IS_PLAYER (ch))
ch->pcdata->condition[COND_THIRST] = 48;
act ("$n drinks from $p\x1B[0m.", ch, obj, NULL, TO_ROOM);
act ("You drink from $p\x1B[0m.", ch, obj, NULL, TO_CHAR);
if (fn->spells[0] > 0)
obj_cast_spell (fn->spells[0], fn->liquid, ch, ch, NULL);
if (fn->spells[1] > 0)
obj_cast_spell (fn->spells[1], fn->liquid, ch, ch, NULL);
if (fn->spells[2] > 0)
obj_cast_spell (fn->spells[2], fn->liquid, ch, ch, NULL);
break;
}
case ITEM_DRINK_CON:
{
I_DRINK *dr = (I_DRINK *) obj->more;
if (dr->liquid_now <= 0)
{
send_to_char ("It is empty.\n\r", ch);
return;
}
if ((liquid = dr->liquid_type) >= LIQ_MAX)
{
bug ("Bad liquid number %d.", liquid);
liquid = dr->liquid_type = 0;
}
if (liquid == -1)
{
act ("$n drinks lamp oil from $p\x1B[0m, and grimaces in pain.",
ch, obj, NULL, TO_ROOM);
act ("You drink oil from $p\x1B[0m. Ugh!",
ch, obj, NULL, TO_CHAR);
amount = 0;
}
else
{
act ("$n drinks $T\x1B[0m from $p\x1B[0m.",
ch, obj, liq_table[liquid].liq_name, TO_ROOM);
act ("You drink $T\x1B[0m from $p\x1B[0m.",
ch, obj, liq_table[liquid].liq_name, TO_CHAR);
amount = number_range (3, 10);
amount = UMIN (amount, dr->liquid_now);
gain_condition (ch, COND_DRUNK,
amount * liq_table[liquid].liq_affect[COND_DRUNK]);
gain_condition (ch, COND_FULL,
amount * liq_table[liquid].liq_affect[COND_FULL]);
gain_condition (ch, COND_THIRST,
amount * liq_table[liquid].liq_affect[COND_THIRST]);
if (IS_PLAYER (ch) && ch->pcdata->condition[COND_DRUNK] > 10)
send_to_char ("You feel drunk.\n\r", ch);
if (IS_PLAYER (ch) && ch->pcdata->condition[COND_FULL] > 40)
send_to_char ("You are full.\n\r", ch);
if (IS_PLAYER (ch) && ch->pcdata->condition[COND_THIRST] > 40)
send_to_char ("You are no longer thirsty.\n\r", ch);
if (dr->not_poison >= 2)
{
AFFECT_DATA af;
bzero (&af, sizeof (af));
act ("$n's face pales.", ch, NULL, NULL, TO_ROOM);
send_to_char ("Your intestines feel like they are on fire!\n\r", ch);
af.type = gsn_poison;
af.duration = 3 * amount;
af.location = APPLY_NONE;
af.modifier = 0;
af.bitvector = AFF_POISON;
affect_join (ch, &af);
}
}
dr->liquid_now -= amount;
if (dr->liquid_now <= 0)
{
dr->not_poison = 0;
dr->liquid_type = 0;
}
break;
}
}
return;
}
void
do_eat (CHAR_DATA * ch, char *argy)
{
char arg[SML_LENGTH];
SINGLE_OBJECT *obj;
DEFINE_COMMAND ("eat", do_eat, POSITION_RESTING, 0, LOG_NORMAL, "This command allows you to eat something.")
argy = one_argy (argy, arg);
if (!str_cmp (arg, "the") || !str_cmp (arg, "some"))
argy = one_argy (argy, arg);
if (arg[0] == '\0')
{
send_to_char ("Eat what?\n\r", ch);
return;
}
if ((obj = get_obj_inv (ch, arg)) == NULL)
{
send_to_char ("You do not have that item.\n\r", ch);
return;
}
if (!IS_IMMORTAL (ch))
{
if (obj->pIndexData->item_type != ITEM_FOOD && obj->pIndexData->item_type != ITEM_PILL)
{
send_to_char ("That's not edible.\n\r", ch);
return;
}
if (IS_PLAYER (ch) && ch->pcdata->condition[COND_FULL] > 40)
{
send_to_char ("You are too full to eat more.\n\r", ch);
return;
}
}
else
{
if (obj->pIndexData->item_type == ITEM_LIGHT && IS_LIT (obj))
--ch->in_room->light;
if (ch->in_room->light < 0) ch->in_room->light = 0;
if (obj->wear_loc != -1)
remove_obj (ch, obj->wear_loc, TRUE);
}
act ("$n eats $p\x1B[0m.", ch, obj, NULL, TO_ROOM);
act ("You eat $p\x1B[0m.", ch, obj, NULL, TO_CHAR);
switch (obj->pIndexData->item_type)
{
case ITEM_FOOD:
{
I_FOOD *fd = (I_FOOD *) obj->more;
if (IS_PLAYER (ch))
{
int conditiona;
conditiona = ch->pcdata->condition[COND_FULL];
gain_condition (ch, COND_FULL, fd->hours);
if (conditiona < 4 && ch->pcdata->condition[COND_FULL] > 4)
send_to_char ("You feel a bit less hungry.\n\r", ch);
else if (ch->pcdata->condition[COND_FULL] > 40)
send_to_char ("You are full.\n\r", ch);
}
if (fd->not_poison != 0)
{
/* The shit was poisoned! */
AFFECT_DATA af;
bzero (&af, sizeof (af));
act ("$n's face pales, and $e clutches $s stomach.", ch, 0, 0, TO_ROOM);
send_to_char ("Ouch! You feel very sick!\n\r", ch);
af.type = gsn_poison;
af.duration = fd->hours / 2;
af.location = APPLY_NONE;
af.modifier = 0;
af.bitvector = AFF_POISON;
affect_join (ch, &af);
}
break;
}
case ITEM_PILL:
{
I_POTION *pl = (I_POTION *) obj->more;
if (pl->spells[0] > 0)
obj_cast_spell (pl->spells[0], pl->spell_level, ch, ch, NULL);
if (pl->spells[1] > 0)
obj_cast_spell (pl->spells[1], pl->spell_level, ch, ch, NULL);
if (pl->spells[2] > 0)
obj_cast_spell (pl->spells[2], pl->spell_level, ch, ch, NULL);
break;
}
}
obj_from (obj);
free_it (obj);
return;
}
bool
draw_obj (CHAR_DATA * ch, SINGLE_OBJECT * obj)
{
if (obj->wear_loc != WEAR_BELT_1
&& obj->wear_loc != WEAR_BELT_2
&& obj->wear_loc != WEAR_BELT_3
&& obj->wear_loc != WEAR_BELT_4
&& obj->wear_loc != WEAR_BELT_5)
return FALSE;
if (hand_empty (ch) == WEAR_NONE)
return FALSE;
obj->wear_loc = -1;
equip_char (ch, obj, hand_empty (ch));
act ("$n draws $p\x1B[0m from $s belt.", ch, obj, NULL, TO_ROOM);
act ("You draw $p\x1B[0m from your belt.", ch, obj, NULL, TO_CHAR);
return TRUE;
}
bool
sheath_obj (CHAR_DATA * ch, SINGLE_OBJECT * obj)
{
if (obj == NULL)
return FALSE;
if (!IS_SET (obj->pIndexData->wear_flags, ITEM_WEAR_BELT))
return FALSE;
if (get_eq_char (ch, WEAR_WAIST) == NULL)
{
send_to_char ("You need a belt to sheath it in.\n\r", ch);
return TRUE;
}
if (
obj->wear_loc != WEAR_HOLD_1
&& obj->wear_loc != WEAR_HOLD_2)
{
send_to_char ("You must be holding the weapon to sheath it!\n\r", ch);
return FALSE;
}
if (IS_OBJ_STAT(obj, ITEM_POLEARM) || IS_OBJ_STAT(obj, ITEM_RANGED))
{
send_to_char("You cannot sheath polearms.\n\r", ch);
return FALSE;
}
if (belt_empty (ch) == WEAR_NONE)
{
send_to_char ("Remove something from your belt first.\n\r", ch);
return TRUE;
}
unequip_char (ch, obj);
obj->wear_loc = belt_empty (ch);
act ("$n sheaths $p\x1B[0m in $s belt.", ch, obj, NULL, TO_ROOM);
act ("You sheath $p\x1B[0m in your belt.", ch, obj, NULL, TO_CHAR);
return TRUE;
}
bool
remove_obj (CHAR_DATA * ch, int iWear, bool fReplace)
{
SINGLE_OBJECT *obj;
if ((obj = get_eq_char (ch, iWear)) == NULL)
return TRUE;
if (!fReplace)
return FALSE;
if (obj->wear_loc == WEAR_NONE)
{
return FALSE;
}
if (IS_SET (obj->extra_flags, ITEM_NOREMOVE) && !IS_IMMORTAL (ch))
{
act ("You can't remove $p\x1B[0m.", ch, obj, NULL, TO_CHAR);
return FALSE;
}
if (obj->wear_loc == WEAR_WAIST)
{
SINGLE_OBJECT *obj2;
bool fFound = FALSE;
int curwear;
for (curwear = WEAR_BELT_1; curwear <= WEAR_BELT_3; curwear++)
{
obj2 = get_eq_char (ch, curwear);
if (obj2 != NULL)
{
fFound = TRUE;
obj2->wear_loc = -1;
}
}
if (fFound)
{
}
}
if (unequip_char (ch, obj))
{
act ("$n stops using $p\x1B[0m.", ch, obj, NULL, TO_ROOM);
act ("You stop using $p\x1B[0m.", ch, obj, NULL, TO_CHAR);
}
else
{
send_to_char ("You've got your hands full.\n\r", ch);
return FALSE;
}
return TRUE;
}
void
wear_obj (CHAR_DATA * ch, SINGLE_OBJECT * obj, bool fReplace, int loc)
{
SHOP_DATA *pShop;
OBJ_PROTOTYPE *pObj = obj->pIndexData;
SINGLE_OBJECT *obj1;
SINGLE_OBJECT *obj2;
SINGLE_OBJECT *obj3;
pShop = NULL;
if (IS_MOB (ch) && (pShop = ch->pIndexData->pShop) != NULL)
return;
else
{
/*OKAY, not a shopkeeper, go ahead and wear stuff */
// Check to see if the person is in a guild that does not allow this item
if(is_member(ch,GUILD_TINKER) && IS_OBJ_GUILD_STAT(obj,ITEM_ANTI_TINKER) ||
is_member(ch,GUILD_WARRIOR) && IS_OBJ_GUILD_STAT(obj,ITEM_ANTI_WARRIOR) ||
is_member(ch,GUILD_THIEFG) && IS_OBJ_GUILD_STAT(obj,ITEM_ANTI_THIEF) ||
is_member(ch,GUILD_HEALER) && IS_OBJ_GUILD_STAT(obj,ITEM_ANTI_HEALER) ||
is_member(ch,GUILD_WIZARD) && IS_OBJ_GUILD_STAT(obj,ITEM_ANTI_WIZARD) ||
is_member(ch,GUILD_RANGER) && IS_OBJ_GUILD_STAT(obj,ITEM_ANTI_RANGER) ||
is_member(ch,GUILD_ROGUE) && IS_OBJ_GUILD_STAT(obj,ITEM_ANTI_ROGUE) ||
is_member(ch,GUILD_CONJURER) && IS_OBJ_GUILD_STAT(obj,ITEM_ANTI_CONJURER) ||
is_member(ch,GUILD_MYSTIC) && IS_OBJ_GUILD_STAT(obj,ITEM_ANTI_MYSTIC) ||
is_member(ch,GUILD_BATTLEMASTER) && IS_OBJ_GUILD_STAT(obj,ITEM_ANTI_BATTLEMASTER) ||
is_member(ch,GUILD_NECROMANCER) && IS_OBJ_GUILD_STAT(obj,ITEM_ANTI_NECROMANCER) ||
is_member(ch,GUILD_MONK) && IS_OBJ_GUILD_STAT(obj,ITEM_ANTI_MONK)){
send_to_char("One of your guilds restricts you from using this item.\n\r",ch);
return;
}
if (pObj != NULL)
{
int i;
if (pObj->value[10] != 0)
for (i = 0; str_cmp(guild_data[i].what_you_type, "end_of_list");i++)
{
if (IS_SET(pObj->value[10], guild_data[i].mob_guildmaster_bit) && !IS_SET(ch->pcdata->guilds, guild_data[i].mob_guildmaster_bit))
{
send_to_char ("You do not have the proper training to wear this item!\n\r", ch);
return;
}
}
}
if (CAN_WEAR (obj, ITEM_WEAR_FINGER))
{
if (loc == 0 || loc == ITEM_WEAR_FINGER)
{
if (get_eq_char (ch, WEAR_FINGER_1) != NULL
&& get_eq_char (ch, WEAR_FINGER_2) != NULL
&& !remove_obj (ch, WEAR_FINGER_1, fReplace)
&& !remove_obj (ch, WEAR_FINGER_2, fReplace))
return;
if (get_eq_char (ch, WEAR_FINGER_1) == NULL)
{
act ("$n slips $p\x1B[0m onto $s left finger.", ch, obj, NULL, TO_ROOM);
act ("You slip $p\x1B[0m onto your left finger.", ch, obj, NULL, TO_CHAR);
equip_char (ch, obj, WEAR_FINGER_1);
return;
}
if (get_eq_char (ch, WEAR_FINGER_2) == NULL)
{
act ("$n slips $p onto $s right finger.", ch, obj, NULL, TO_ROOM);
act ("You slip $p onto your right finger.", ch, obj, NULL, TO_CHAR);
equip_char (ch, obj, WEAR_FINGER_2);
return;
}
bug ("Wear_obj: no free finger.", 0);
send_to_char ("You already wear two rings.\n\r", ch);
return;
}
}
if (CAN_WEAR (obj, ITEM_WEAR_NECK))
{
if (loc == 0 || loc == ITEM_WEAR_NECK)
{
if (get_eq_char (ch, WEAR_NECK_1) != NULL
&& get_eq_char (ch, WEAR_NECK_2) != NULL
&& !remove_obj (ch, WEAR_NECK_1, fReplace)
&& !remove_obj (ch, WEAR_NECK_2, fReplace))
return;
if (get_eq_char (ch, WEAR_NECK_1) == NULL)
{
act ("$n clasps $p\x1B[0m around $s neck.", ch, obj, NULL, TO_ROOM);
act ("You clasp $p\x1B[0m around your neck.", ch, obj, NULL, TO_CHAR);
equip_char (ch, obj, WEAR_NECK_1);
return;
}
if (get_eq_char (ch, WEAR_NECK_2) == NULL)
{
act ("$n clasps $p\x1B[0m around $s neck.", ch, obj, NULL, TO_ROOM);
act ("You clasp $p\x1B[0m around your neck.", ch, obj, NULL, TO_CHAR);
equip_char (ch, obj, WEAR_NECK_2);
return;
}
bug ("Wear_obj: no free neck.", 0);
send_to_char ("You already wear two neck items.\n\r", ch);
return;
}
}
if (CAN_WEAR (obj, ITEM_FLOATING))
{
if (loc == 0 || loc == ITEM_FLOATING)
{
if (get_eq_char (ch, WEAR_FLOATING_1) != NULL
&& get_eq_char (ch, WEAR_FLOATING_2) != NULL
&& !remove_obj (ch, WEAR_FLOATING_1, fReplace)
&& !remove_obj (ch, WEAR_FLOATING_2, fReplace))
return;
if (get_eq_char (ch, WEAR_FLOATING_1) == NULL)
{
act ("$p starts floating around $n's head.", ch, obj, NULL, TO_ROOM);
act ("Your $p starts floating nearby your head.", ch, obj, NULL, TO_CHAR);
equip_char (ch, obj, WEAR_FLOATING_1);
return;
}
if (get_eq_char (ch, WEAR_FLOATING_2) == NULL)
{
act ("$p starts floating around $n's head.", ch, obj, NULL, TO_ROOM);
act ("Your $p starts floating nearby your head.", ch, obj, NULL, TO_CHAR);
equip_char (ch, obj, WEAR_FLOATING_2);
return;
}
bug ("Wear_obj: no free floater.", 0);
send_to_char ("You already have two items floating nearby.\n\r", ch);
return;
}
}
if (CAN_WEAR (obj, ITEM_WEAR_ELBOW))
{
if (loc == 0 || loc == ITEM_WEAR_ELBOW)
{
if (get_eq_char (ch, WEAR_ELBOW_1) != NULL
&& get_eq_char (ch, WEAR_ELBOW_2) != NULL
&& !remove_obj (ch, WEAR_ELBOW_1, fReplace)
&& !remove_obj (ch, WEAR_ELBOW_2, fReplace))
return;
if (get_eq_char (ch, WEAR_ELBOW_1) == NULL)
{
act ("$n straps $p\x1B[0m onto $s elbow.", ch, obj, NULL, TO_ROOM);
act ("You strap $p\x1B[0m onto your elbow.", ch, obj, NULL, TO_CHAR);
equip_char (ch, obj, WEAR_ELBOW_1);
return;
}
if (get_eq_char (ch, WEAR_ELBOW_2) == NULL)
{
act ("$n strap $p\x1B[0m onto $s elbow.", ch, obj, NULL, TO_ROOM);
act ("You strap $p\x1B[0m onto your elbow.", ch, obj, NULL, TO_CHAR);
equip_char (ch, obj, WEAR_ELBOW_2);
return;
}
bug ("Wear_obj: no free elbow.", 0);
send_to_char ("You already wear an item on each elbow.\n\r", ch);
return;
}
}
if (CAN_WEAR (obj, ITEM_WEAR_KNEE))
{
if (loc == 0 || loc == ITEM_WEAR_KNEE)
{
if (get_eq_char (ch, WEAR_KNEE_1) != NULL
&& get_eq_char (ch, WEAR_KNEE_2) != NULL
&& !remove_obj (ch, WEAR_KNEE_1, fReplace)
&& !remove_obj (ch, WEAR_KNEE_2, fReplace))
return;
if (get_eq_char (ch, WEAR_KNEE_1) == NULL)
{
act ("$n straps $p\x1B[0m onto $s knee.", ch, obj, NULL, TO_ROOM);
act ("You strap $p\x1B[0m onto your knee.", ch, obj, NULL, TO_CHAR);
equip_char (ch, obj, WEAR_KNEE_1);
return;
}
if (get_eq_char (ch, WEAR_KNEE_2) == NULL)
{
act ("$n strap $p\x1B[0m onto $s knee.", ch, obj, NULL, TO_ROOM);
act ("You strap $p\x1B[0m onto your knee.", ch, obj, NULL, TO_CHAR);
equip_char (ch, obj, WEAR_KNEE_2);
return;
}
bug ("Wear_obj: no free knee.", 0);
send_to_char ("You already wear an item on each knee.\n\r", ch);
return;
}
}
if (CAN_WEAR (obj, ITEM_WEAR_BODY))
{
if (loc == 0 || loc == ITEM_WEAR_BODY)
{
if (!remove_obj (ch, WEAR_BODY, fReplace))
return;
act ("$n wears $p\x1B[0m on $s body.", ch, obj, NULL, TO_ROOM);
act ("You wear $p\x1B[0m on your body.", ch, obj, NULL, TO_CHAR);
equip_char (ch, obj, WEAR_BODY);
return;
}
}
if (CAN_WEAR (obj, ITEM_WEAR_HEAD))
{
if (loc == 0 || loc == ITEM_WEAR_HEAD)
{
if (!remove_obj (ch, WEAR_HEAD, fReplace))
return;
act ("$n dons $p\x1B[0m on $s head.", ch, obj, NULL, TO_ROOM);
act ("You don $p\x1B[0m on your head.", ch, obj, NULL, TO_CHAR);
equip_char (ch, obj, WEAR_HEAD);
return;
}
}
if (CAN_WEAR (obj, ITEM_WEAR_FACE))
{
if (loc == 0 || loc == ITEM_WEAR_FACE)
{
if (!remove_obj (ch, WEAR_FACE, fReplace))
return;
act ("$n straps $p\x1B[0m onto $s face.", ch, obj, NULL, TO_ROOM);
act ("You strap $p onto your face.", ch, obj, NULL, TO_CHAR);
equip_char (ch, obj, WEAR_FACE);
return;
}
}
if (CAN_WEAR (obj, ITEM_WEAR_LEGS))
{
if (loc == 0 || loc == ITEM_WEAR_LEGS)
{
if (!remove_obj (ch, WEAR_LEGS, fReplace))
return;
act ("$n wears $p\x1B[0m on $s legs.", ch, obj, NULL, TO_ROOM);
act ("You wear $p\x1B[0m on your legs.", ch, obj, NULL, TO_CHAR);
equip_char (ch, obj, WEAR_LEGS);
return;
}
}
if (CAN_WEAR (obj, ITEM_WEAR_FEET))
{
if (loc == 0 || loc == ITEM_WEAR_FEET)
{
if (!remove_obj (ch, WEAR_FEET, fReplace))
return;
act ("$n slips $s feet into $p\x1B[0m.", ch, obj, NULL, TO_ROOM);
act ("You slip your feet into $p\x1B[0m.", ch, obj, NULL, TO_CHAR);
equip_char (ch, obj, WEAR_FEET);
return;
}
}
if (CAN_WEAR (obj, ITEM_WEAR_HANDS))
{
if (loc == 0 || loc == ITEM_WEAR_HANDS)
{
if (!remove_obj (ch, WEAR_HANDS, fReplace))
return;
act ("$n wears $p\x1B[0m on $s hands.", ch, obj, NULL, TO_ROOM);
act ("You wear $p\x1B[0m on your hands.", ch, obj, NULL, TO_CHAR);
equip_char (ch, obj, WEAR_HANDS);
return;
}
}
if (CAN_WEAR (obj, ITEM_WEAR_ARMS))
{
if (loc == 0 || loc == ITEM_WEAR_ARMS)
{
if (!remove_obj (ch, WEAR_ARMS, fReplace))
return;
act ("$n wears $p\x1B[0m on $s arms.", ch, obj, NULL, TO_ROOM);
act ("You wear $p\x1B[0m on your arms.", ch, obj, NULL, TO_CHAR);
equip_char (ch, obj, WEAR_ARMS);
return;
}
}
if (CAN_WEAR (obj, ITEM_WEAR_ABOUT))
{
if (loc == 0 || loc == ITEM_WEAR_ABOUT)
{
if (!remove_obj (ch, WEAR_ABOUT, fReplace))
return;
act ("$n wears $p\x1B[0m about $s body.", ch, obj, NULL, TO_ROOM);
act ("You wear $p\x1B[0m about your body.", ch, obj, NULL, TO_CHAR);
equip_char (ch, obj, WEAR_ABOUT);
return;
}
}
if (CAN_WEAR (obj, ITEM_WEAR_EYES))
{
if (loc == 0 || loc == ITEM_WEAR_EYES)
{
if (!remove_obj (ch, WEAR_EYES, fReplace))
return;
act ("$n wears $p\x1B[0m on $s eyes.", ch, obj, NULL, TO_ROOM);
act ("You wear $p\x1B[0m on your eyes.", ch, obj, NULL, TO_CHAR);
equip_char (ch, obj, WEAR_EYES);
return;
}
}
if (CAN_WEAR (obj, ITEM_WEAR_BACK))
{
if (loc == 0 || loc == ITEM_WEAR_BACK)
{
if (!remove_obj (ch, WEAR_BACK, fReplace))
return;
act ("$n wears $p\x1B[0m on $s back.", ch, obj, NULL, TO_ROOM);
act ("You wear $p\x1B[0m on your back.", ch, obj, NULL, TO_CHAR);
equip_char (ch, obj, WEAR_BACK);
return;
}
}
if (CAN_WEAR (obj, ITEM_WEAR_WAIST))
{
if (loc == 0 || loc == ITEM_WEAR_WAIST)
{
if (!remove_obj (ch, WEAR_WAIST, fReplace))
return;
act ("$n fastens $p\x1B[0m around $s waist.", ch, obj, NULL, TO_ROOM);
act ("You fasten $p\x1B[0m around your waist.", ch, obj, NULL, TO_CHAR);
equip_char (ch, obj, WEAR_WAIST);
return;
}
}
if (CAN_WEAR (obj, ITEM_WEAR_EAR1))
{
if (loc == 0 || loc == ITEM_WEAR_EAR1)
{
if ((get_eq_char (ch, WEAR_EAR_1) != NULL) && (get_eq_char (ch, WEAR_EAR_2) != NULL))
return;
if (get_eq_char (ch, WEAR_EAR_1) == NULL)
{
act ("$n wears $p\x1B[0m in $s right ear.", ch, obj, NULL, TO_ROOM);
act ("You wear $p\x1B[0m in your right ear.", ch, obj, NULL, TO_CHAR);
equip_char (ch, obj, WEAR_EAR_1);
return;
}
if (get_eq_char (ch, WEAR_EAR_2) == NULL)
{
act ("$n wears $p\x1B[0m in $s left ear.", ch, obj, NULL, TO_ROOM);
act ("You wear $p\x1B[0m in your left ear.", ch, obj, NULL, TO_CHAR);
equip_char (ch, obj, WEAR_EAR_2);
return;
}
}
}
if (CAN_WEAR (obj, ITEM_WEAR_ANKLE))
{
if (loc == 0 || loc == ITEM_WEAR_ANKLE)
{
if ((get_eq_char (ch, WEAR_ANKLE_1) != NULL) && (get_eq_char (ch, WEAR_ANKLE_2) != NULL))
return;
if (get_eq_char (ch, WEAR_ANKLE_1) == NULL)
{
act ("$n wears $p\x1B[0m around $s right ankle.", ch, obj, NULL, TO_ROOM);
act ("You wear $p\x1B[0m around your right ankle.", ch, obj, NULL, TO_CHAR);
equip_char (ch, obj, WEAR_ANKLE_1);
return;
}
if (get_eq_char (ch, WEAR_ANKLE_2) == NULL)
{
act ("$n wears $p\x1B[0m around $s left ankle.", ch, obj, NULL, TO_ROOM);
act ("You wear $p\x1B[0m around your left ankle.", ch, obj, NULL, TO_CHAR);
equip_char (ch, obj, WEAR_ANKLE_2);
return;
}
}
}
if (CAN_WEAR (obj, ITEM_WEAR_WRIST))
{
if (loc == 0 || loc == ITEM_WEAR_WRIST)
{
if (get_eq_char (ch, WEAR_WRIST_1) != NULL
&& get_eq_char (ch, WEAR_WRIST_2) != NULL
&& !remove_obj (ch, WEAR_WRIST_1, fReplace)
&& !remove_obj (ch, WEAR_WRIST_2, fReplace))
return;
if (get_eq_char (ch, WEAR_WRIST_1) == NULL)
{
act ("$n wears $p\x1B[0m around $s left wrist.",
ch, obj, NULL, TO_ROOM);
act ("You wear $p\x1B[0m around your left wrist.",
ch, obj, NULL, TO_CHAR);
equip_char (ch, obj, WEAR_WRIST_1);
return;
}
if (get_eq_char (ch, WEAR_WRIST_2) == NULL)
{
act ("$n wears $p\x1B[0m around $s right wrist.",
ch, obj, NULL, TO_ROOM);
act ("You wear $p\x1B[0m around your right wrist.",
ch, obj, NULL, TO_CHAR);
equip_char (ch, obj, WEAR_WRIST_2);
return;
}
bug ("Wear_obj: no free wrist.", 0);
send_to_char ("You already wear two wrist items.\n\r", ch);
return;
}
}
if (CAN_WEAR (obj, ITEM_WEAR_TATTOO))
{
if (loc == 0 || loc == ITEM_WEAR_TATTOO)
{
if (get_eq_char (ch, WEAR_TATTOO) != NULL
&& !remove_obj (ch, WEAR_TATTOO, fReplace))
return;
if (get_eq_char (ch, WEAR_TATTOO) == NULL)
{
act ("$n cuts $p\x1B[0m into $s arm.",
ch, obj, NULL, TO_ROOM);
act ("You cut $p\x1B[0m into your arm.",
ch, obj, NULL, TO_CHAR);
equip_char (ch, obj, WEAR_TATTOO);
return;
}
bug ("Wear_obj: no free tattoo.", 0);
send_to_char ("You already wear a tattoo.\n\r", ch);
return;
}
}
if (CAN_WEAR (obj, ITEM_WEAR_SHOULDER))
{
if (loc == 0 || loc == ITEM_WEAR_SHOULDER)
{
if (get_eq_char (ch, WEAR_SHOULDER_1) != NULL
&& get_eq_char (ch, WEAR_SHOULDER_2) != NULL
&& !remove_obj (ch, WEAR_SHOULDER_1, fReplace)
&& !remove_obj (ch, WEAR_SHOULDER_2, fReplace))
return;
if (get_eq_char (ch, WEAR_SHOULDER_1) == NULL)
{
act ("$n slings $p\x1B[0m over $s left shoulder.",
ch, obj, NULL, TO_ROOM);
act ("You sling $p\x1B[0m over your left shoulder.",
ch, obj, NULL, TO_CHAR);
equip_char (ch, obj, WEAR_SHOULDER_1);
return;
}
if (get_eq_char (ch, WEAR_SHOULDER_2) == NULL)
{
act ("$n slings $p\x1B[0m over $s right shoulder.",
ch, obj, NULL, TO_ROOM);
act ("You sling $p\x1B[0m over your right shoulder.",
ch, obj, NULL, TO_CHAR);
equip_char (ch, obj, WEAR_SHOULDER_2);
return;
}
bug ("Wear_obj: no free shoulder.", 0);
send_to_char ("You already wear two items on your shoulders.\n\r", ch);
return;
}
}
if (CAN_WEAR (obj, ITEM_WEAR_SHIELD))
{
if (IS_PLAYER(ch) && is_member(ch, GUILD_MONK))
{
act ("Monks of the divine order need to keep their arms free.", ch, NULL, NULL, TO_CHAR);
return;
}
if (!remove_obj (ch, WEAR_SHIELD, fReplace))
return;
obj1 = get_eq_char (ch, WEAR_HOLD_1);
obj2 = get_eq_char (ch, WEAR_HOLD_2);
if ((obj2 != NULL && (IS_OBJ_STAT(obj2, ITEM_POLEARM) ||IS_OBJ_STAT(obj2, ITEM_RANGED)))||
(obj1 != NULL && (IS_OBJ_STAT(obj1, ITEM_POLEARM) || IS_OBJ_STAT(obj1, ITEM_RANGED))))
{
send_to_char("You may not wear a shield while you wield a polearm.\n\r", ch);
return;
}
if (obj->pIndexData->item_type == ITEM_ARMOR && (obj1 != NULL && obj1->pIndexData->item_type == ITEM_WEAPON) &&
(obj2 != NULL && obj2->pIndexData->item_type == ITEM_WEAPON))
{
send_to_char ("You can't use a shield while wielding two weapons!\n\r", ch);
return;
}
act ("$n straps $p\x1B[0m to $s arm.", ch, obj, NULL, TO_ROOM);
act ("You strap $p\x1B[0m to your arm.", ch, obj, NULL, TO_CHAR);
equip_char (ch, obj, WEAR_SHIELD);
return;
}
if ((CAN_WEAR (obj, ITEM_HOLD) || CAN_WEAR (obj, ITEM_WIELD))
/*&& hand_empty( ch ) != WEAR_NONE */ )
{
if (IS_PLAYER(ch) && is_member(ch, GUILD_MONK) && obj->pIndexData->item_type == ITEM_WEAPON)
{
act ("Monks of the divine order may not use such brutal objects.", ch, NULL, NULL, TO_CHAR);
return;
}
if (hand_empty (ch) == WEAR_NONE)
{
act ("Your hands are full! Remove something first.", ch, NULL, NULL, TO_CHAR);
return;
}
obj1 = get_eq_char (ch, WEAR_HOLD_1);
obj2 = get_eq_char (ch, WEAR_HOLD_2);
obj3 = get_eq_char (ch, WEAR_SHIELD);
if ((obj2 != NULL && (IS_OBJ_STAT(obj2, ITEM_POLEARM) || IS_OBJ_STAT(obj2, ITEM_RANGED))) ||
(obj1 != NULL && (IS_OBJ_STAT(obj1, ITEM_POLEARM) || IS_OBJ_STAT(obj1, ITEM_RANGED))))
{
send_to_char("You may not hold anything else while you wield a polearm or ranged weapon.\n\r", ch);
return;
}
if ((IS_OBJ_STAT(obj, ITEM_POLEARM) || IS_OBJ_STAT(obj, ITEM_RANGED)) &&
(obj1 != NULL || obj2 != NULL || obj3 != NULL))
{
send_to_char("You may not wield a polearmor ranged weapon while you have anything in either hand, or while you wear a shield.\n\r", ch);
return;
}
if (obj3 && obj->pIndexData->item_type == ITEM_WEAPON &&
((obj1 != NULL && obj1->pIndexData->item_type == ITEM_WEAPON) ||
(obj2 != NULL && obj2->pIndexData->item_type == ITEM_WEAPON)))
{
send_to_char ("You can't wield two weapons while using a shield!\n\r", ch);
return;
}
if (IS_PLAYER(ch))
{
int canwield = (get_curr_str(ch)*2 / 3);
if (IS_AUGMENTED(ch, AUG_ARM_POWER)) canwield +=2;
if (IS_AUGMENTED(ch, AUG_HAND_POWER)) canwield +=1;
if (IS_AUGMENTED(ch, AUG_BODY_POWER)) canwield +=2;
if (obj->pIndexData->weight > canwield*WGT_MULT){
act ("Unfortunately, $p is too heavy for you to use!", ch, obj, NULL, TO_CHAR);
return;
}
}
act ("$n holds $p\x1B[0m in $s hand.", ch, obj, NULL, TO_ROOM);
act ("You hold $p\x1B[0m in your hand.", ch, obj, NULL, TO_CHAR);
equip_char (ch, obj, hand_empty (ch));
return;
}
if (fReplace)
send_to_char ("You can't wear, wield, or hold that there.\n\r", ch);
return;
/*REMOVE this next
}
if you remove the check for shopkeeper thingy */
}
return;
}
void
do_swap (CHAR_DATA * ch, char *argy)
{
DEFINE_COMMAND ("swap", do_exchange, POSITION_RESTING, 0, LOG_NORMAL, "This command exchanges what you have in your primary and secondary hand.")
return;
}
void
do_exchange (CHAR_DATA * ch, char *argy)
{
SINGLE_OBJECT *objh1;
SINGLE_OBJECT *objh2;
bool hone;
bool htwo;
DEFINE_COMMAND ("exchange", do_exchange, POSITION_FIGHTING, 0, LOG_NORMAL, "This command exchanges what you have in your primary and secondary hand.")
hone = FALSE;
htwo = FALSE;
if ((objh1 = ch->hold1) != NULL)
hone = TRUE;
if ((objh2 = ch->hold2) != NULL)
htwo = TRUE;
if ((!hone) && (!htwo))
{
act ("You aren't holding anything in your hands!", ch, NULL, NULL, TO_CHAR);
return;
}
if ((!hone) && (htwo))
{
objh2->wear_loc = WEAR_HOLD_1;
act ("The object in your secondary hand is now in your primary hand.", ch, NULL, NULL, TO_CHAR);
ch->hold2 = NULL;
ch->hold1 = objh2;
return;
}
if ((hone) && (!htwo))
{
objh1->wear_loc = WEAR_HOLD_2;
act ("The object in your primary hand is now in your secondary hand.", ch, NULL, NULL, TO_CHAR);
ch->hold1 = NULL;
ch->hold2 = objh1;
return;
}
if ((hone) && (htwo))
{
objh1->wear_loc = WEAR_HOLD_2;
objh2->wear_loc = WEAR_HOLD_1;
act ("You now hold $p\x1B[0m in your primary hand.", ch, objh2, NULL, TO_CHAR);
act ("You now hold $p\x1B[0m in your secondary hand.", ch, objh1, NULL, TO_CHAR);
ch->hold1 = objh2;
ch->hold2 = objh1;
return;
}
return;
}
void
do_wield (CHAR_DATA * ch, char *argy)
{
DEFINE_COMMAND ("wield", do_wear, POSITION_STANDING, 0, LOG_NORMAL, "Allows you to wear/wield or hold an object.")
return;
}
void
do_hold (CHAR_DATA * ch, char *argy)
{
DEFINE_COMMAND ("hold", do_wear, POSITION_STANDING, 0, LOG_NORMAL, "Allows you to wear/wield or hold an object.")
return;
}
void
do_wear (CHAR_DATA * ch, char *argy)
{
char arg1[SML_LENGTH];
char arg2[SML_LENGTH];
SINGLE_OBJECT *obj;
DEFINE_COMMAND ("wear", do_wear, POSITION_FIGHTING, 0, LOG_NORMAL, "Allows you to wear/wield or hold an object.")
argy = one_argy (argy, arg1);
one_argy (argy, arg2);
if (arg1[0] == '\0')
{
send_to_char ("Please specify what you want to wear/wield/hold.\n\r", ch);
return;
}
if (!str_cmp (arg1, "all"))
{
SINGLE_OBJECT *obj_next;
if (FIGHTING (ch) != NULL && !pow.equip_in_combat)
{
send_to_char ("Not while you're fighting; you'd get creamed!\n\r", ch);
return;
}
for (obj = ch->carrying; obj != NULL; obj = obj_next)
{
obj_next = obj->next_content;
if ((CAN_WEAR (obj, ITEM_HOLD)))
if (hand_empty (ch) == WEAR_NONE)
continue;
if ((obj->wear_loc == -1 || obj->wear_loc == WEAR_NONE /*||
obj->wear_loc == WEAR_HOLD_1 ||
obj->wear_loc == WEAR_HOLD_2 */
) && can_see_obj (ch, obj))
wear_obj (ch, obj, FALSE, 0);
}
return;
}
else
{
/*held */
if ((obj = get_obj_inv (ch, arg1)) == NULL)
{
send_to_char ("You do not have that item.\n\r", ch);
return;
}
if ((CAN_WEAR (obj, ITEM_HOLD)))
if (hand_empty (ch) == WEAR_NONE)
{
send_to_char ("Your hands are already full!\n\r", ch);
return;
}
if (FIGHTING (ch) != NULL && !pow.equip_in_combat && !CAN_WEAR (obj, ITEM_HOLD))
{
send_to_char ("Not while you're fighting; you'd get creamed!\n\r", ch);
return;
}
if (obj->wear_loc == -1)
{
wear_obj (ch, obj, TRUE, wear_name_bit (arg2));
}
}
return;
}
void
do_sheath (CHAR_DATA * ch, char *argy)
{
char arg1[STD_LENGTH];
SINGLE_OBJECT *obj;
DEFINE_COMMAND ("sheath", do_sheath, POSITION_STANDING, 0, LOG_NORMAL, "Allows you to sheath a weapon in your belt.")
argy = one_argy (argy, arg1);
/*get_obj_held */
if ((obj = get_obj_inv (ch, arg1)) == NULL)
{
/*item_held */
if (get_item_held (ch, ITEM_WEAPON) != NULL)
sheath_obj (ch, get_item_held (ch, ITEM_WEAPON));
if (get_item_held (ch, ITEM_WEAPON) != NULL)
sheath_obj (ch, get_item_held (ch, ITEM_WEAPON));
return;
}
if (!sheath_obj (ch, obj))
send_to_char ("You can't do that!\n\r", ch);
return;
}
void
do_draw (CHAR_DATA * ch, char *argy)
{
char arg1[STD_LENGTH];
SINGLE_OBJECT *obj;
SINGLE_OBJECT *obj1;
SINGLE_OBJECT *obj2;
DEFINE_COMMAND ("draw", do_draw, POSITION_FIGHTING, 0, LOG_NORMAL, "Allows you to draw a weapon from your belt.")
obj2 = get_item_held(ch, ITEM_WEAPON);
obj1 = get_eq_char(ch, WEAR_SHIELD);
if ((obj2 != NULL) && (IS_OBJ_STAT(obj2, ITEM_POLEARM) || IS_OBJ_STAT(obj2, ITEM_RANGED)))
{
send_to_char("You cannot draw a weapon while wielding a polearm.\n\r", ch);
return;
}
argy = one_argy (argy, arg1);
if ((obj = get_obj_wear (ch, arg1)) == NULL)
{
send_to_char ("You do not have that item in your belt.\n\r", ch);
return;
}
if (obj->pIndexData->item_type == ITEM_WEAPON && obj2 != NULL && obj1 != NULL)
{
send_to_char("You cannot wear two weapons and a shield!\n\r", ch);
return;
}
if (!draw_obj (ch, obj))
send_to_char ("You can't do that!\n\r", ch);
return;
}
void
do_remove (CHAR_DATA * ch, char *argy)
{
char arg[SML_LENGTH];
SINGLE_OBJECT *obj;
DEFINE_COMMAND ("remove", do_remove, POSITION_FIGHTING, 0, LOG_NORMAL, "This command allows you to remove a weapon/armor/etc... that is worn.")
one_argy (argy, arg);
if (arg[0] == '\0')
{
send_to_char ("Remove what?\n\r", ch);
return;
}
if (!str_cmp (argy, "all"))
{
SINGLE_OBJECT *obj_next;
if (!pow.remove_while_fighting && FIGHTING (ch))
{
send_to_char ("No way; you'd get creamed!\n\r", ch);
return;
}
for (obj = ch->carrying; obj != NULL; obj = obj_next)
{
obj_next = obj->next_content;
/* if ( (obj->wear_loc == -1 || obj->wear_loc == WEAR_NONE ||
obj->wear_loc == WEAR_HOLD_1 ||
obj->wear_loc == WEAR_HOLD_2) && can_see_obj( ch, obj ) )
wear_obj( ch, obj, FALSE, 0 ); */
if (obj->wear_loc != WEAR_NONE && obj->wear_loc != -1)
remove_obj (ch, obj->wear_loc, TRUE);
}
if (ch->move > ch->max_move)
MAXMOVE(ch);
return;
}
if ((obj = get_obj_wear (ch, arg)) == NULL)
{
send_to_char ("You do not have that item.\n\r", ch);
return;
}
if (!pow.remove_while_fighting && obj->wear_loc != WEAR_HOLD_1 &&
obj->wear_loc != WEAR_HOLD_2 && FIGHTING (ch))
{
send_to_char ("No way; you'd get creamed!\n\r", ch);
return;
}
if (obj->wear_loc != -1)
{
remove_obj (ch, obj->wear_loc, TRUE);
}
if (ch->move > ch->max_move)
MAXMOVE(ch);
if (ch->hit > ch->max_hit)
ch->hit = ch->max_hit;
return;
}
void
do_bury (CHAR_DATA * ch, char *argy)
{
DEFINE_COMMAND ("bury", do_sacrifice, POSITION_RESTING, 0, LOG_NORMAL, "Allows you to sacrifice something to the gods... helps clean up the game.")
return;
}
void
do_sacrifice (CHAR_DATA * ch, char *argy)
{
char arg[SML_LENGTH];
SINGLE_OBJECT *obj;
const char *god;
int n_god;
char buf[STD_LENGTH];
DEFINE_COMMAND ("sacrifice", do_sacrifice, POSITION_RESTING, 0, LOG_NORMAL, "Allows you to sacrifice something to the gods... helps clean up the game.")
if (argy == "" || argy[0] == '\0')
return;
one_argy (argy, arg);
if (arg[0] == '\0' || !str_cmp (arg, NAME (ch)))
{
act ("$n offers $mself to the gods, who decline.",
ch, NULL, NULL, TO_ROOM);
send_to_char (
"The gods appreciate your self-sacrifice, but refuse.\n\r", ch);
return;
}
obj = get_obj_list (ch, arg, ch->in_room->more->contents);
if (obj == NULL)
{
if (get_obj_inv (ch, arg) != NULL)
{
send_to_char ("The object must be lying on the ground in order to sacrifice it.\n\r", ch);
return;
}
send_to_char ("You don't see that object here to sacrifice.\n\r", ch);
return;
}
if (!CAN_WEAR (obj, ITEM_TAKE))
{
act ("$p\x1B[0m is not a sacrificable object.", ch, obj, 0, TO_CHAR);
return;
}
if (obj->pIndexData->item_type == ITEM_BOAT)
{
send_to_char ("You cannot sacrifice something that large!\n\r", ch);
return;
}
n_god = number_range (0, 4);
god = pow.god_names[n_god];
//TEMPORARY TO TRY TO LET CASTERS EXP
//Lowered Wisdom Requirement - Sabelis
if (ch->pcdata->no_quit_pk < 5 && get_curr_int(ch) > 19 && get_curr_wis(ch) > 19
&& obj->pIndexData->item_type == ITEM_CORPSE_NPC)
{
int count;
for (count = 0; count < 8; count++)
{
mana_gain(ch, TRUE);
}
}
sprintf (buf, "$n sacrifices $p\x1B[0m to \x1B[1m%s\x1B[0m.", god);
act (buf, ch, obj, NULL, TO_ROOM);
sprintf (buf, "You sacrifice $p\x1B[0m to \x1B[1m%s\x1B[0m.", god);
act (buf, ch, obj, NULL, TO_CHAR);
if (LEVEL (ch) < 9 && obj->pIndexData->item_type == ITEM_CORPSE_NPC)
{
send_to_char ("You recieve a copper coin as a gift from the gods for this sacrifice!\n\r", ch);
ch->copper++;
}
if (obj->carried_by != NULL)
obj_from (obj);
free_it (obj);
return;
}
void
do_quaff (CHAR_DATA * ch, char *argy)
{
char arg[SML_LENGTH];
SINGLE_OBJECT *obj;
I_POTION *pt;
DEFINE_COMMAND ("quaff", do_quaff, POSITION_FIGHTING, 0, LOG_NORMAL, "Allows you to quaff a potion.")
one_argy (argy, arg);
if (arg[0] == '\0')
{
send_to_char ("Quaff what?\n\r", ch);
return;
}
if ((obj = get_obj_inv (ch, arg)) == NULL)
{
send_to_char ("You do not have that potion.\n\r", ch);
return;
}
if (obj->pIndexData->item_type != ITEM_POTION)
{
send_to_char ("You can quaff only potions.\n\r", ch);
return;
}
pt = (I_POTION *) obj->more;
act ("$n quaffs $p\x1B[0m.", ch, obj, NULL, TO_ROOM);
act ("You quaff $p\x1B[0m.", ch, obj, NULL, TO_CHAR);
if (pt->spells[0] > 0)
obj_cast_spell (pt->spells[0], pt->spell_level, ch, ch, NULL);
if (pt->spells[1] > 0)
obj_cast_spell (pt->spells[1], pt->spell_level, ch, ch, NULL);
if (pt->spells[2] > 0)
obj_cast_spell (pt->spells[2], pt->spell_level, ch, ch, NULL);
obj_from (obj);
free_it (obj);
return;
}
void
do_read (CHAR_DATA * ch, char *argy)
{
DEFINE_COMMAND ("read", do_look, POSITION_RESTING, 0, LOG_NORMAL, "Same as look.")
return;
}
void
do_recite (CHAR_DATA * ch, char *argy)
{
char arg1[SML_LENGTH];
char arg2[SML_LENGTH];
CHAR_DATA *victim;
I_POTION *sc;
SINGLE_OBJECT *scroll;
SINGLE_OBJECT *obj;
DEFINE_COMMAND ("recite", do_recite, POSITION_FIGHTING, 0, LOG_NORMAL, "Allows you to recite a scroll.")
argy = one_argy (argy, arg1);
argy = one_argy (argy, arg2);
if ((scroll = get_obj_inv (ch, arg1)) == NULL)
{
send_to_char ("You do not have that scroll.\n\r", ch);
return;
}
if (scroll->pIndexData->item_type != ITEM_SCROLL)
{
send_to_char ("You can recite only scrolls.\n\r", ch);
return;
}
sc = (I_POTION *) scroll->more;
obj = NULL;
if (arg2[0] == '\0')
{
victim = ch;
}
else
{
if ((victim = get_char_room (ch, arg2)) == NULL
&& (obj = get_obj_here (ch, arg2, SEARCH_INV_FIRST)) == NULL)
{
send_to_char ("You can't find it.\n\r", ch);
return;
}
}
act ("$n recites $p\x1B[0m.", ch, scroll, NULL, TO_ROOM);
act ("You recite $p\x1B[0m.", ch, scroll, NULL, TO_CHAR);
if (sc->spells[0] > 0)
obj_cast_spell (sc->spells[0], sc->spell_level, ch, victim, obj);
if (sc->spells[1] > 0)
obj_cast_spell (sc->spells[1], sc->spell_level, ch, victim, obj);
if (sc->spells[2] > 0)
obj_cast_spell (sc->spells[2], sc->spell_level, ch, victim, obj);
free_it (scroll);
return;
}
void
do_brandish (CHAR_DATA * ch, char *argy)
{
CHAR_DATA *vch;
CHAR_DATA *vch_next;
SINGLE_OBJECT *staff;
SPELL_DATA *spell;
I_WAND *stf;
DEFINE_COMMAND ("brandish", do_brandish, POSITION_FIGHTING, 0, LOG_NORMAL, "Allows you to brandish a staff.")
if ((staff = get_item_held (ch, ITEM_STAFF)) == NULL)
{
send_to_char ("You don't have the staff in your hand.\n\r", ch);
return;
}
stf = (I_WAND *) staff->more;
if ((spell = skill_lookup (NULL, stf->spells[0])) == NULL)
{
bug ("Do_brandish: bad sn %d.", 9999);
return;
}
WAIT_STATE (ch, 2 * PULSE_VIOLENCE);
if (stf->current_charges > 0)
{
act ("$n raises $p\x1B[0m into the air and utters some mystical words under $s breath.",
ch, staff, NULL, TO_ROOM);
act ("You brandish $p\x1B[0m.", ch, staff, NULL, TO_CHAR);
for (vch = ch->in_room->more->people; vch; vch = vch_next)
{
vch_next = vch->next_in_room;
switch (spell->spell_type)
{
default:
bug ("Do_brandish: bad target for sn %d.", spell->gsn);
return;
case TAR_IGNORE:
if (vch != ch)
continue;
break;
case TAR_CHAR_OFFENSIVE:
if (IS_MOB (ch) ? IS_MOB (vch) : IS_PLAYER (vch))
continue;
break;
case TAR_CHAR_DEFENSIVE:
if (IS_MOB (ch) ? IS_PLAYER (vch) : IS_MOB (vch))
continue;
break;
case TAR_CHAR_SELF:
if (vch != ch)
continue;
break;
}
if (stf->spells[0] > 0)
obj_cast_spell (stf->spells[0], stf->spell_level, ch, vch, NULL);
}
}
if (--stf->current_charges <= 0)
{
act ("$n's $p\x1B[0m blazes bright and is gone.", ch, staff, NULL, TO_ROOM);
act ("Your $p\x1B[0m blazes bright and is gone.", ch, staff, NULL, TO_CHAR);
free_it (staff);
}
return;
}
void
do_zap (CHAR_DATA * ch, char *argy)
{
char arg[SML_LENGTH];
CHAR_DATA *victim;
SINGLE_OBJECT *wand;
SINGLE_OBJECT *obj;
SPELL_DATA *spell;
I_WAND *wnd;
DEFINE_COMMAND ("zap", do_zap, POSITION_FIGHTING, 0, LOG_NORMAL, "Allows you to zap a wand.")
one_argy (argy, arg);
if (arg[0] == '\0' && FIGHTING (ch) == NULL)
{
send_to_char ("Zap whom or what?\n\r", ch);
return;
}
if ((wand = get_item_held (ch, ITEM_WAND)) == NULL)
{
send_to_char ("You don't have a wand in your hand.\n\r", ch);
return;
}
wnd = (I_WAND *) wand->more;
if ((spell = skill_lookup (NULL, wnd->spells[0])) == NULL)
{
bug ("Do_zap: bad sn %d.", 0);
return;
}
obj = NULL;
if (arg[0] == '\0')
{
if (FIGHTING (ch) != NULL)
{
victim = FIGHTING (ch);
}
else
{
send_to_char ("Zap whom or what?\n\r", ch);
return;
}
}
else
{
if ((victim = get_char_room (ch, arg)) == NULL
&& (obj = get_obj_here (ch, arg, SEARCH_INV_FIRST)) == NULL)
{
send_to_char ("You can't find it.\n\r", ch);
return;
}
}
WAIT_STATE (ch, 2 * PULSE_VIOLENCE);
if (wnd->current_charges > 0)
{
if (victim != NULL)
{
act ("$n zaps $N with $p\x1B[0m.", ch, wand, victim, TO_ROOM);
act ("You zap $N with $p\x1B[0m.", ch, wand, victim, TO_CHAR);
}
else
{
act ("$n zaps $P with $p\x1B[0m.", ch, wand, obj, TO_ROOM);
act ("You zap $P with $p\x1B[0m.", ch, wand, obj, TO_CHAR);
}
if (wnd->spells[0] > 0)
obj_cast_spell (wnd->spells[0], wnd->spell_level, ch, victim, obj);
}
if (--wnd->current_charges <= 0)
{
act ("$n's $p\x1B[0m explodes into fragments.", ch, wand, NULL, TO_ROOM);
act ("Your $p\x1B[0m explodes into fragments.", ch, wand, NULL, TO_CHAR);
free_it (wand);
}
return;
}
void
do_study (CHAR_DATA * ch, char *argy)
{
SINGLE_OBJECT *obj;
SPELL_DATA *spell;
I_BOOK *bk;
DEFINE_COMMAND ("study", do_study, POSITION_RESTING, 0, LOG_NORMAL, "Allows you to study a book.")
if ((obj = get_obj_inv (ch, argy)) == NULL)
{
send_to_char ("You don't have that to study.\n\r", ch);
return;
}
if (obj->pIndexData->item_type != ITEM_BOOK)
{
send_to_char ("That's not a book.. wouldn't want it to BURST into FLAMES! heh.\n\r", ch);
return;
}
bk = (I_BOOK *) obj->more;
if (bk->teaches == 0)
{
send_to_char ("You begin to read... Blah blah blah...\n\rYou soon discover that there is nothing you can learn from this book.\n\r", ch);
return;
}
spell = skill_lookup (NULL, bk->teaches);
if (spell == NULL)
{
send_to_char ("Some LAME builder created this book wrong - it doesn't do SHIT!\n\rHAHAHAHAHA!", ch);
return;
}
/*past this point the book FRIES.. */
if (ch->pcdata->learned[(bk->teaches)] > 25)
{
send_to_char ("You read the book and a knowledge and understanding begins to\n\rmeld into your open mind... Unfortunately the book doesn't seem to\n\rteach you anything you don't already know! DOH!\n\r", ch);
}
else
{
char buf[STD_LENGTH];
send_to_char ("You read the book and a knowledge and understanding begins to\n\rmeld into your open mind...\n\r", ch);
sprintf (buf, "You now understand the very basics of %s!!\n\r", spell->spell_funky_name);
send_to_char (buf, ch);
ch->pcdata->learned[(bk->teaches)] = 26;
}
act ("$n reads $p\x1B[0m, and it bursts into flames!", ch, obj, NULL, TO_ROOM);
act ("After you read $p\x1B[0m, it bursts into flames!", ch, obj, NULL, TO_CHAR);
free_it (obj);
return;
}
void
do_steal (CHAR_DATA * ch, char *argy)
{
char buf[STD_LENGTH];
char arg1[SML_LENGTH];
char arg2[SML_LENGTH];
CHAR_DATA *victim;
SINGLE_OBJECT *obj;
DEFINE_COMMAND ("steal", do_steal, POSITION_RESTING, 0, LOG_NORMAL, "Allows you to steal things from others.")
argy = one_argy (argy, arg1);
argy = one_argy (argy, arg2);
if (ch->pcdata->alignment == 0)
{
send_to_char ("Neutral eq whore? Go join an align!\n\r", ch);
return;
}
if (arg1[0] == '\0' || arg2[0] == '\0')
{
send_to_char ("Steal what from whom?\n\r", ch);
return;
}
if (IS_PLAYER (ch) && (ch->fgt->in_battle || ch->fgt->challenge == 10))
{
send_to_char ("Not in the battleground or arena!\n\r", ch);
return;
}
if ((victim = get_char_room (ch, arg2)) == NULL)
{
send_to_char ("They aren't here.\n\r", ch);
return;
}
if (LEVEL(victim) >= IMM_LEVEL)
{
send_to_char ("Forget it.\n\r", ch);
return;
}
if (victim == ch)
{
send_to_char ("Like a dull sword, that's pointless.\n\r", ch);
return;
}
if (victim->pcdata->alignment == 0)
{
send_to_char ("Stealing from Neuts? Your kit must SUCK!!\n\r", ch);
return;
}
if (ch->pcdata->alignment == victim->pcdata->alignment)
{
send_to_char ("You cannot steal from your own alignment.\n\r", ch);
return;
}
/* ------------------------------------------------------ */
/* Do not allow stealing from the neutral alignment */
/* ------------------------------------------------------ */
if (victim->pcdata->alignment == 0 && ch->pcdata->alignment != 0)
{
act("\x1B[1;32mA moral dilemma rages in your head! Steal from the Protected!? *Tisk Tisk*\x1B[0m",ch,NULL,NULL,TO_CHAR);
return;
}
if (ch->pcdata->alignment == 0 && victim->pcdata->alignment != 0)
{
act("\x1B[1;32mYour code of honor prohibits you from stealing from anyone other than your own kind.\x1B[0m",ch,NULL,NULL,TO_CHAR);
return;
}
WAIT_STATE (ch, 200);
if (is_safe (ch, victim))
{
if (IS_PLAYER (ch))
{
act ("\x1B[1;37mYou feel as if the gods are watching, and a hot pain spreads", ch, NULL, NULL, TO_CHAR);
act ("through your hand. OUCH! Perhaps you should not steal here...\x1B[0m", ch, NULL, NULL, TO_CHAR);
}
return;
}
else
{
if (victim->position == POSITION_FIGHTING
|| !is_member(ch, GUILD_THIEFG)
|| !is_member(ch, GUILD_ROGUE)
|| get_curr_dex(ch) < 28
|| number_range(1,2) == 2
|| (IS_PLAYER (ch) && ch->pcdata->learned[gsn_steal] < 60)
|| (IS_MOB (ch) && (number_range (1, 20) < 19))
|| (IS_MOB (victim)))
{
send_to_char ("Oops.\n\r", ch);
act ("$n tried to steal from you.\n\r", ch, NULL, victim, TO_VICT);
act ("$n tried to steal from $N.\n\r", ch, NULL, victim, TO_NOTVICT);
sprintf (buf, "%s is a bloody thief!", NAME (ch));
send_to_char (buf, victim);
if (IS_PLAYER (ch))
{
if (IS_MOB (victim))
multi_hit (victim, ch, TYPE_UNDEFINED);
else
multi_hit (victim, ch, TYPE_UNDEFINED);
}
return;
}
else
{
if ((obj = get_obj_inv (victim, arg1)) == NULL)
{
send_to_char ("You can't find it.\n\r", ch);
return;
}
if (obj->wear_loc != -1)
{
send_to_char ("You can't steal things people are WEARING or HOLDING!!!\n\r", ch);
return;
}
if (!can_drop_obj (ch, obj)
|| IS_SET (obj->extra_flags, ITEM_INVENTORY))
{
send_to_char ("You can't pry it away.\n\r", ch);
return;
}
if (number_range (1, 5) == 2)
{
act ("$N's suddenly looks your way, and you whistle innocently.", ch, NULL, victim, TO_CHAR);
return;
}
obj_from (obj);
obj_to (obj, ch);
if (obj->pIndexData->item_type == ITEM_VEHICLE && IS_PLAYER(ch))
{
I_VEHICLE *veh = (I_VEHICLE *) obj->more;
if (veh->sector_use == SECT_WATER_SWIM ||
veh->sector_use == SECT_WATER_NOSWIM)
SET_BIT(ch->act, PLR_HAS_BOAT);
}
if (obj->pIndexData->item_type == ITEM_VEHICLE && IS_PLAYER(victim))
{
I_VEHICLE *veh = (I_VEHICLE *) obj->more;
if (veh->sector_use == SECT_WATER_SWIM ||
veh->sector_use == SECT_WATER_NOSWIM)
REMOVE_BIT(victim->act, PLR_HAS_BOAT);
}
obj->wear_loc = -1;
send_to_char ("Stolen.\n\r", ch);
skill_gain (ch, gsn_steal, FALSE);
}
return;
}
return;
}
void
do_light (CHAR_DATA * ch, char *argy)
{
char arg[SML_LENGTH];
SINGLE_OBJECT *obj;
SINGLE_OBJECT *obj2;
I_LIGHT *lt;
I_TOOL *tb;
DEFINE_COMMAND ("light", do_light, POSITION_RESTING, 0, LOG_NORMAL, "Allows you to light a light source.")
argy = one_argy (argy, arg);
if (arg[0] == '\0')
obj = get_item_held (ch, ITEM_LIGHT);
else
obj = get_obj_inv (ch, arg);
obj2 = get_obj_inv (ch, "tinderbox");
if (obj == NULL)
{
send_to_char ("You don't have the light.\n\r", ch);
return;
}
if (obj->pIndexData->item_type != ITEM_LIGHT)
{
send_to_char ("You can't light that!\n\r", ch);
return;
}
lt = (I_LIGHT *) obj->more;
if (IS_LIT (obj))
{
send_to_char ("It's lit already!\n\r", ch);
return;
}
if (lt->light_now <= 0)
{
send_to_char ("It's out of fuel.\n\r", ch);
return;
}
if (obj2 == NULL)
{
send_to_char ("You don't have anything to light it with!\n\r", ch);
return;
}
tb = (I_TOOL *) obj2->more;
if (use_tool (obj2, TOOL_TINDERBOX) && !IS_SET(lt->light_lit, LIGHT_LIT))
{
SET_BIT (lt->light_lit, LIGHT_LIT);
act ("$n lights $p with $P.", ch, obj, obj2, TO_ROOM);
act ("You light $p with $P.", ch, obj, obj2, TO_CHAR);
if (obj->wear_loc != -1)
{
if (ch->in_room->light < 0) ch->in_room->light = 0;
ch->in_room->light++;
if (IS_PLAYER(ch))
ch->pcdata->light++;
}
if (tb->uses == 1)
{
send_to_char ("Your tinderbox is almost out of tinder, and the flint is starting to chip.\n\r", ch);
}
if (tb->uses == 0)
{
send_to_char ("Your tinderbox is out of tinder and the flint is chipped...\n\rTime to buy a new one!\n\r", ch);
obj_from (obj2);
free_it (obj2);
}
return;
}
else
{
send_to_char ("You can't light it with that.\n\r", ch);
return;
}
return;
}
void
do_extinguish (CHAR_DATA * ch, char *argy)
{
char arg[SML_LENGTH];
SINGLE_OBJECT *obj;
I_LIGHT *lt;
DEFINE_COMMAND ("extinguish", do_extinguish, POSITION_RESTING, 0, LOG_NORMAL, "Allows you to extinguish a light source.")
argy = one_argy (argy, arg);
if (arg[0] == '\0')
obj = get_item_held (ch, ITEM_LIGHT);
/*held */
else
obj = get_obj_inv (ch, arg);
if (obj == NULL)
{
send_to_char ("You don't have the light in your hands.\n\r", ch);
return;
}
if (obj->pIndexData->item_type != ITEM_LIGHT)
{
send_to_char ("That's not a light source.\n\r", ch);
return;
}
lt = (I_LIGHT *) obj->more;
if (!IS_LIT (obj))
{
send_to_char ("It's extinguished already!\n\r", ch);
return;
}
REMOVE_BIT (lt->light_lit, LIGHT_LIT);
act ("$n extinguishes $p.", ch, obj, NULL, TO_ROOM);
act ("You extinguish $p.", ch, obj, NULL, TO_CHAR);
if (obj->wear_loc != -1)
{
ch->in_room->light--;
if (ch->in_room->light < 0) ch->in_room->light = 0;
if (IS_PLAYER(ch))
{
ch->pcdata->light--;
if (ch->pcdata->light < 0) ch->pcdata->light = 0;
}
}
return;
}
void
do_butcher (CHAR_DATA * ch, char *argy) /*By Arcane */
{
SINGLE_OBJECT *obj, *weap, *steak;
int count, x;
char buf[80];
DEFINE_COMMAND ("butcher", do_butcher, POSITION_STANDING, 0, LOG_NORMAL, "Allows you to butcher a corpse into steaks. Based on your butcher skill.")
if (argy[0] == '\0')
{
send_to_char ("What do you want to butcher?\n\r", ch);
return;
}
if ((obj = get_obj_here (ch, argy, SEARCH_ROOM_FIRST)) == NULL)
{
send_to_char ("That's not here.\n\r", ch);
return;
}
if (obj->pIndexData->item_type != ITEM_CORPSE_NPC)
{
send_to_char ("You can't butcher that!\n\r", ch);
return;
}
if ((weap = get_item_held (ch, ITEM_WEAPON)) == NULL)
{
send_to_char ("You need something to cut with!\n\r", ch);
return;
}
if (!IS_SET (weap->extra_flags, ITEM_PIERCE)
&& !IS_SET (weap->extra_flags, ITEM_SLASHING)
&& !IS_SET (weap->extra_flags, ITEM_HEAVY_SLASH)
&& !IS_SET (weap->extra_flags, ITEM_LIGHT_SLASH))
{
send_to_char ("You need something sharp to cut with!\n\r", ch);
return;
}
if (number_range (0, 100) > ch->pcdata->learned[gsn_butcher])
{
send_to_char ("Your clumsy hands destroy the corpse.\n\r", ch);
free_it (obj);
return;
}
count = dice (1, 3);
sprintf (buf, "You slice and dice the corpse into %d steak%s.\n\r",
count, (count > 1 ? "s" : ""));
send_to_char (buf, ch);
for (x = 0; x < count; x++)
{
steak = create_object (get_obj_index (110), 0);
steak->timer = number_range (13, 20);
if (dice (1, 100) == 13)
{
/*sprintf(buf,"a greenish steak");
free_string( steak->short_descr );
steak->short_descr = str_dup( buf ); */
((I_FOOD *) steak->more)->not_poison = 1;
}
obj_to (steak, ch->in_room);
}
skill_gain (ch, gsn_butcher, TRUE);
free_it (obj);
return;
}