/* ************************************************************************ * file: act.obj1.c , Implementation of commands. Part of DIKUMUD * * Usage : Commands mainly moving around objects. * * Copyright (C) 1990, 1991 - see 'license.doc' for complete information. * ************************************************************************* */ #include <stdio.h> #include <string.h> #include "structs.h" #include "utils.h" #include "comm.h" #include "interpreter.h" #include "handler.h" #include "db.h" #include "spells.h" /* extern variables */ extern struct str_app_type str_app[]; extern struct room_data *world; extern struct descriptor_data *descriptor_list; /* extern functions */ char *fname(char *namelist); int isname(char *arg, char *arg2); struct obj_data *create_money( int amount ); ACMD(do_put); /* procedures related to get */ void get(struct char_data *ch, struct obj_data *obj_object, struct obj_data *sub_object) { char buffer[MAX_STRING_LENGTH]; if (sub_object) { obj_from_obj(obj_object); obj_to_char(obj_object, ch); if (sub_object->carried_by == ch) { act("You get $p from $P.", 0, ch, obj_object, sub_object, TO_CHAR); act("$n gets $p from $s $P.", 1, ch, obj_object, sub_object, TO_ROOM); } else { act("You get $p from $P.", 0, ch, obj_object, sub_object, TO_CHAR); act("$n gets $p from $P.", 1, ch, obj_object, sub_object, TO_ROOM); } } else { obj_from_room(obj_object); obj_to_char(obj_object, ch); act("You get $p.", 0, ch, obj_object, 0, TO_CHAR); act("$n gets $p.", 1, ch, obj_object, 0, TO_ROOM); } if ((obj_object->obj_flags.type_flag == ITEM_MONEY) && (obj_object->obj_flags.value[0] >= 1)) { obj_from_char(obj_object); sprintf(buffer, "There were %d coins.\n\r", obj_object->obj_flags.value[0]); send_to_char(buffer, ch); GET_GOLD(ch) += obj_object->obj_flags.value[0]; extract_obj(obj_object); } } ACMD(do_get) { char arg1[MAX_STRING_LENGTH]; char arg2[MAX_STRING_LENGTH]; struct obj_data *sub_object; struct obj_data *obj_object; struct obj_data *next_obj; bool found = FALSE; bool fail = FALSE; int type = 3; bool alldot = FALSE; argument_interpreter(argument, arg1, arg2); /* get type */ if (!*arg1) { type = 0; } if (*arg1 && !*arg2) { alldot = FALSE; buf2[0] = '\0'; if ((str_cmp(arg1, "all") != 0) && (sscanf(arg1, "all.%s", buf2) != 0)) { strcpy(arg1, "all"); alldot = TRUE; } if (!str_cmp(arg1, "all")) { type = 1; } else { type = 2; } } if (*arg1 && *arg2) { alldot = FALSE; buf2[0] = '\0'; if ((str_cmp(arg1, "all") != 0) && (sscanf(arg1, "all.%s", buf2) != 0)) { strcpy(arg1, "all"); alldot = TRUE; } if (!str_cmp(arg1, "all")) { if (!str_cmp(arg2, "all")) { type = 3; } else { type = 4; } } else { if (!str_cmp(arg2, "all")) { type = 5; } else { type = 6; } } } switch (type) { /* get */ case 0: send_to_char("Get what?\n\r", ch); break; /* get all */ case 1: sub_object = 0; found = FALSE; fail = FALSE; for (obj_object = world[ch->in_room].contents; obj_object; obj_object = next_obj) { next_obj = obj_object->next_content; /* IF all.obj, only get those named "obj" */ if (alldot && !isname(buf2, obj_object->name)) { continue; } /* if */ if (CAN_SEE_OBJ(ch, obj_object)) { if ((IS_CARRYING_N(ch) + 1) <= CAN_CARRY_N(ch)) { if ((IS_CARRYING_W(ch) + obj_object->obj_flags.weight) <= CAN_CARRY_W(ch)) { if (CAN_WEAR(obj_object, ITEM_TAKE)) { get(ch, obj_object, sub_object); found = TRUE; } else { send_to_char("You can't take that!\n\r", ch); fail = TRUE; } } else { sprintf(buf, "%s : You can't carry that much weight.\n\r", (obj_object->short_description)); send_to_char(buf, ch); fail = TRUE; } } else { sprintf(buf, "%s : You can't carry that many items.\n\r", (obj_object->short_description)); send_to_char(buf, ch); fail = TRUE; } } } if (found) { send_to_char("OK.\n\r", ch); } else { if (!fail) send_to_char("You see nothing here.\n\r", ch); } break; /* get ??? */ case 2: sub_object = 0; found = FALSE; fail = FALSE; obj_object = get_obj_in_list_vis(ch, arg1, world[ch->in_room].contents); if (obj_object) { if ((IS_CARRYING_N(ch) + 1 < CAN_CARRY_N(ch))) { if ((IS_CARRYING_W(ch) + obj_object->obj_flags.weight) < CAN_CARRY_W(ch)) { if (CAN_WEAR(obj_object, ITEM_TAKE)) { get(ch, obj_object, sub_object); found = TRUE; } else { send_to_char("You can't take that!\n\r", ch); fail = TRUE; } } else { sprintf(buf, "%s : You can't carry that much weight.\n\r", (obj_object->short_description)); send_to_char(buf, ch); fail = TRUE; } } else { sprintf(buf, "%s : You can't carry that many items.\n\r", (obj_object->short_description)); send_to_char(buf, ch); fail = TRUE; } } else { sprintf(buf, "You do not see a %s here.\n\r", arg1); send_to_char(buf, ch); fail = TRUE; } break; /* get all all */ case 3: send_to_char("You must be joking?!\n\r", ch); break; /* get all ??? */ case 4: found = FALSE; fail = FALSE; sub_object = get_obj_in_list_vis(ch, arg2, world[ch->in_room].contents); if (!sub_object) { sub_object = get_obj_in_list_vis(ch, arg2, ch->carrying); } if (sub_object) { if (GET_ITEM_TYPE(sub_object) == ITEM_CONTAINER) { if (IS_SET(sub_object->obj_flags.value[1], CONT_CLOSED)) { sprintf(buf, "The %s is closed.\n\r", fname(sub_object->name)); send_to_char(buf, ch); return; } /* if */ for (obj_object = sub_object->contains; obj_object; obj_object = next_obj) { next_obj = obj_object->next_content; /* IF all.obj, only get those named "obj" */ if (alldot && !isname(buf2, obj_object->name) ) { continue; } /* if */ if (CAN_SEE_OBJ(ch, obj_object)) { if ((IS_CARRYING_N(ch) + 1 < CAN_CARRY_N(ch))) { if ((IS_CARRYING_W(ch) + obj_object->obj_flags.weight) < CAN_CARRY_W(ch)) { if (CAN_WEAR(obj_object, ITEM_TAKE)) { get(ch, obj_object, sub_object); found = TRUE; } else { send_to_char("You can't take that!\n\r", ch); fail = TRUE; } } else { sprintf(buf, "%s : You can't carry that much weight.\n\r", (obj_object->short_description)); send_to_char(buf, ch); fail = TRUE; } } else { sprintf(buf, "%s : You can't carry that many items.\n\r", (obj_object->short_description)); send_to_char(buf, ch); fail = TRUE; } } } if (!found && !fail) { sprintf(buf, "You do not see anything in the %s.\n\r", fname(sub_object->name)); send_to_char(buf, ch); fail = TRUE; } } else { sprintf(buf, "The %s is not a container.\n\r", fname(sub_object->name)); send_to_char(buf, ch); fail = TRUE; } } else { sprintf(buf, "You do not see or have the %s.\n\r", arg2); send_to_char(buf, ch); fail = TRUE; } break; case 5: send_to_char("You can't take a thing from more than one container.\n\r", ch); break; case 6: found = FALSE; fail = FALSE; sub_object = get_obj_in_list_vis(ch, arg2, world[ch->in_room].contents); if (!sub_object) { sub_object = get_obj_in_list_vis(ch, arg2, ch->carrying); } if (sub_object) { if (GET_ITEM_TYPE(sub_object) == ITEM_CONTAINER) { if (IS_SET(sub_object->obj_flags.value[1], CONT_CLOSED)) { sprintf(buf, "The %s is closed.\n\r", fname(sub_object->name)); send_to_char(buf, ch); return; } /* if */ obj_object = get_obj_in_list_vis(ch, arg1, sub_object->contains); if (obj_object) { if ((IS_CARRYING_N(ch) + 1 < CAN_CARRY_N(ch))) { if ((IS_CARRYING_W(ch) + obj_object->obj_flags.weight) < CAN_CARRY_W(ch)) { if (CAN_WEAR(obj_object, ITEM_TAKE)) { get(ch, obj_object, sub_object); found = TRUE; } else { send_to_char("You can't take that!\n\r", ch); fail = TRUE; } } else { sprintf(buf, "%s : You can't carry that much weight.\n\r", (obj_object->short_description)); send_to_char(buf, ch); fail = TRUE; } } else { sprintf(buf, "%s: You can't carry that many items.\n\r", (obj_object->short_description)); send_to_char(buf, ch); fail = TRUE; } } else { sprintf(buf, "The %s does not contain the %s.\n\r", fname(sub_object->name), arg1); send_to_char(buf, ch); fail = TRUE; } } else { sprintf(buf, "The %s is not a container.\n\r", fname(sub_object->name)); send_to_char(buf, ch); fail = TRUE; } } else { sprintf(buf, "You do not see or have the %s.\n\r", arg2); send_to_char(buf, ch); fail = TRUE; } break; } } #define DONATION_ROOM_1 3063 #define DONATION_ROOM_2 0 #define DONATION_ROOM_3 0 ACMD(do_drop) { char sname[100]; int amount; struct obj_data *tmp_object; struct obj_data *next_obj; int test = FALSE; int value = 0; int junk = 0, donate = 0, RDR = 0; switch (subcmd) { case SCMD_JUNK: strcpy(sname, "junk"); junk = 1; break; case SCMD_DONATE: strcpy(sname, "donate"); donate = 1; switch (number(0, 2)) { case 0: donate = 0; junk = 1; break; case 1: case 2: RDR = real_room(DONATION_ROOM_1); break; /* case 3: RDR = real_room(DONATION_ROOM_2); break; case 4: RDR = real_room(DONATION_ROOM_3); break; */ } if (RDR == NOWHERE) { send_to_char("Sorry, you can't donate anything right now.\n\r", ch); return; } break; default: strcpy(sname, "drop"); break; } argument = one_argument(argument, arg); if (is_number(arg)) { amount = atoi(arg); argument = one_argument(argument, arg); if (str_cmp("coins", arg) && str_cmp("coin", arg)) { send_to_char("Sorry, you can't do that...\n\r", ch); return; } if (amount <= 0) { send_to_char("Sorry, you can't do that!\n\r", ch); return; } if (GET_GOLD(ch) < amount) { send_to_char("You haven't that many coins!\n\r", ch); return; } if (!junk) { tmp_object = create_money(amount); if (donate) { send_to_char("You throw some gold into the air where it disappears in a puff of smoke!\n\r", ch); act("$n throws some gold into the air where it disappears in a puff of smoke!", FALSE, ch, 0, 0, TO_ROOM); send_to_room("Some gold suddenly appears in mid-air, then drops to the ground!\n\r", RDR); obj_to_room(tmp_object, RDR); } else { send_to_char("You drop some gold.\n\r", ch); act("$n drops some gold.", FALSE, ch, 0, 0, TO_ROOM); obj_to_room(tmp_object, ch->in_room); } } else { act("$n drops some gold which disappears in a puff of smoke!", FALSE, ch, 0, 0, TO_ROOM); send_to_char( "You drop some gold which disappears in a puff of smoke!\n\r", ch); } GET_GOLD(ch) -= amount; return; } if (!*arg) { sprintf(buf, "What do you want to %s?\n\r", sname); send_to_char(buf, ch); return; } /* Can't junk or donate all */ if ((donate || junk) && !str_cmp(arg, "all")) { if (junk) send_to_char("Go to the dump if you want to junk EVERYTHING!\n\r", ch); else send_to_char("Go do the donation room if you want to donate EVERYTHING!\n\r", ch); return; } /* If it is "all" or "all." */ if (!str_cmp(arg, "all") || !strn_cmp(arg, "all.", 4)) { for (tmp_object = ch->carrying; tmp_object; tmp_object = next_obj) { next_obj = tmp_object->next_content; if (*(arg + 3) == '.') if (!isname(arg + 4, tmp_object->name)) continue; if (IS_SET(tmp_object->obj_flags.extra_flags, ITEM_NODROP)) { sprintf(buf, "You can't %s %s, it must be CURSED!\n\r", sname, OBJS(tmp_object, ch)); send_to_char(buf, ch); test = TRUE; continue; } /* CHECK FOR DONATE FLAG - SPG 4/4/93*/ if (IS_SET(tmp_object->obj_flags.extra_flags, ITEM_NODONATE) && donate) { sprintf(buf, "You can't donate %s.\n\r", OBJS(tmp_object, ch)); send_to_char(buf, ch); test = TRUE; continue; } sprintf(buf, "You %s %s.%s\n\r", sname, OBJS(tmp_object, ch), (junk || donate) ? " It vanishes in a puff of smoke!" : ""); send_to_char(buf, ch); sprintf(buf, "$n %ss $p.%s", sname, (junk || donate) ? " It vanishes in a puff of smoke!" : ""); act(buf, TRUE, ch, tmp_object, 0, TO_ROOM); if (junk) { test = TRUE; value += MAX(1, MIN(200, tmp_object->obj_flags.cost >> 4)); extract_obj(tmp_object); } else { test = TRUE; obj_from_char(tmp_object); if (donate) { obj_to_room(tmp_object, RDR); send_to_room("Something suddenly appears in a puff a smoke!\n\r", RDR); } else obj_to_room(tmp_object, ch->in_room); } } } else { /* It is not "all" or "all." */ tmp_object = get_obj_in_list_vis(ch, arg, ch->carrying); if (tmp_object) { test = 1; if (IS_SET(tmp_object->obj_flags.extra_flags, ITEM_NODROP)) { sprintf(buf, "You can't %s it, it must be CURSED!\n\r", sname); send_to_char(buf, ch); return; } /* CHECK FOR DONATE FLAG - SPG 4/4/93*/ if (IS_SET(tmp_object->obj_flags.extra_flags, ITEM_NODONATE) && donate) { sprintf(buf, "You can't %s it.\n\r", sname); send_to_char(buf, ch); return; } sprintf(buf, "You %s %s.%s\n\r", sname, OBJS(tmp_object, ch), (junk || donate) ? " It vanishes in a puff of smoke!" : ""); send_to_char(buf, ch); sprintf(buf, "$n %ss $p.%s", sname, (junk || donate) ? " It vanishes in a puff of smoke!" : ""); act(buf, TRUE, ch, tmp_object, 0, TO_ROOM); if (junk) { value = MAX(1, MIN(200, tmp_object->obj_flags.cost >> 4)); extract_obj(tmp_object); } else { obj_from_char(tmp_object); if (donate) { obj_to_room(tmp_object, RDR); send_to_room("Something suddenly appears in a puff of smoke!\n\r", RDR); } else obj_to_room(tmp_object, ch->in_room); } } } if (!test) send_to_char("You do not seem to have anything like that.\n\r", ch); if (value && subcmd == SCMD_JUNK) { send_to_char("You have been rewarded by the gods!\n\r", ch); act("$n has been rewarded by the gods!", TRUE, ch, 0, 0, TO_ROOM); GET_GOLD(ch) += value; } } void do_putalldot(struct char_data *ch, char *name, char *target, int cmd) { struct obj_data *tmp_object; struct obj_data *next_object; bool found = FALSE; char buf[100]; /* If "put all.object bag", get all carried items * named "object", and put each into the bag. */ for (tmp_object = ch->carrying; tmp_object; tmp_object = next_object) { next_object = tmp_object->next_content; if (isname(name, tmp_object->name) ) { sprintf(buf, "%s %s", name, target); found = TRUE; do_put(ch, buf, cmd, 0); } } if (!found) { send_to_char("You don't have one.", ch); } /* if */ } ACMD(do_put) { char arg1[MAX_STRING_LENGTH]; char arg2[MAX_STRING_LENGTH]; struct obj_data *obj_object; struct obj_data *sub_object; struct char_data *tmp_char; int bits; argument_interpreter(argument, arg1, arg2); if (*arg1) { if (*arg2) { buf2[0] = '\0'; if (sscanf(arg1, "all.%s", buf2) != 0) { do_putalldot(ch, buf2, arg2, cmd); return; } obj_object = get_obj_in_list_vis(ch, arg1, ch->carrying); if (obj_object) { bits = generic_find(arg2, FIND_OBJ_INV | FIND_OBJ_ROOM, ch, &tmp_char, &sub_object); if (sub_object) { if (GET_ITEM_TYPE(sub_object) == ITEM_CONTAINER) { if (!IS_SET(sub_object->obj_flags.value[1], CONT_CLOSED)) { if (obj_object == sub_object) { send_to_char("You attempt to fold it into itself, but fail.\n\r", ch); return; } if (((sub_object->obj_flags.weight) + (obj_object->obj_flags.weight)) < (sub_object->obj_flags.value[0])) { send_to_char("Ok.\n\r", ch); if (bits == FIND_OBJ_INV) { obj_from_char(obj_object); /* make up for above line */ IS_CARRYING_W(ch) += GET_OBJ_WEIGHT(obj_object); /* obj_from_char(sub_object); do not rearrange order... */ obj_to_obj(obj_object, sub_object); /* obj_to_char(sub_object,ch);do not rearrange order... */ } else { obj_from_char(obj_object); /* Do we need obj_from_room???(sub_object,....); */ obj_to_obj(obj_object, sub_object); /* Dow we need obj_to_room???(sub_object,ch); */ } act("$n puts $p in $P.", TRUE, ch, obj_object, sub_object, TO_ROOM); } else { send_to_char("It won't fit.\n\r", ch); } } else send_to_char("It seems to be closed.\n\r", ch); } else { sprintf(buf, "The %s is not a container.\n\r", fname(sub_object->name)); send_to_char(buf, ch); } } else { sprintf(buf, "You dont have the %s.\n\r", arg2); send_to_char(buf, ch); } } else { sprintf(buf, "You dont have the %s.\n\r", arg1); send_to_char(buf, ch); } } else { sprintf(buf, "Put %s in what?\n\r", arg1); send_to_char(buf, ch); } } else { send_to_char("Put what in what?\n\r", ch); } } ACMD(do_give) { char obj_name[80], vict_name[80]; int amount; struct char_data *vict; struct obj_data *obj; argument = one_argument(argument, obj_name); if (is_number(obj_name)) { amount = atoi(obj_name); argument = one_argument(argument, arg); if (str_cmp("coins", arg) && str_cmp("coin", arg)) { send_to_char("Sorry, you can't do that (yet)...\n\r", ch); return; } if (amount < 0) { send_to_char("Sorry, you can't do that!\n\r", ch); return; } if ((GET_GOLD(ch) < amount) && (IS_NPC(ch) || (GET_LEVEL(ch) < LEVEL_GOD))) { send_to_char("You haven't got that many coins!\n\r", ch); return; } argument = one_argument(argument, vict_name); if (!*vict_name) { send_to_char("To who?\n\r", ch); return; } if (!(vict = get_char_room_vis(ch, vict_name))) { send_to_char("To who?\n\r", ch); return; } send_to_char("Ok.\n\r", ch); sprintf(buf, "%s gives you %d gold coins.\n\r", PERS(ch, vict), amount); send_to_char(buf, vict); act("$n gives some gold to $N.", 1, ch, 0, vict, TO_NOTVICT); if (IS_NPC(ch) || (GET_LEVEL(ch) < LEVEL_GOD)) GET_GOLD(ch) -= amount; GET_GOLD(vict) += amount; return; } argument = one_argument(argument, vict_name); if (!*obj_name || !*vict_name) { send_to_char("Give what to who?\n\r", ch); return; } if (!(obj = get_obj_in_list_vis(ch, obj_name, ch->carrying))) { send_to_char("You do not seem to have anything like that.\n\r", ch); return; } if (IS_SET(obj->obj_flags.extra_flags, ITEM_NODROP)) { send_to_char("You can't let go of it! Yeech!!\n\r", ch); return; } if (!(vict = get_char_room_vis(ch, vict_name))) { send_to_char("No one by that name around here.\n\r", ch); return; } if ((1 + IS_CARRYING_N(vict)) > CAN_CARRY_N(vict)) { act("$N seems to have $S hands full.", 0, ch, 0, vict, TO_CHAR); return; } if (obj->obj_flags.weight + IS_CARRYING_W(vict) > CAN_CARRY_W(vict)) { act("$E can't carry that much weight.", 0, ch, 0, vict, TO_CHAR); return; } obj_from_char(obj); obj_to_char(obj, vict); act("$n gives $p to $N.", 1, ch, obj, vict, TO_NOTVICT); act("$n gives you $p.", 0, ch, obj, vict, TO_VICT); send_to_char("Ok.\n\r", ch); } ACMD(do_split) { int amount, num, share; struct char_data *k; struct follow_type *f; if (IS_NPC(ch)) return; one_argument(argument, buf); if (is_number(buf)) { amount = atoi(buf); if (amount <= 0) { send_to_char("Sorry, you can't do that.\n\r", ch); return; } if (amount > GET_GOLD(ch)) { send_to_char("You don't seem to have that much gold to split.\n\r", ch); return; } if (ch->master) k = ch->master; else k = ch; if (IS_AFFECTED(k, AFF_GROUP) && (k->in_room == ch->in_room)) num = 1; else num = 0; for (f = k->followers; f; f = f->next) if (IS_AFFECTED(f->follower, AFF_GROUP) && (!IS_NPC(f->follower)) && (f->follower->in_room == ch->in_room)) num++; if (num && IS_AFFECTED(ch, AFF_GROUP)) share = amount / num; else { send_to_char("With whom do you wish to share your gold?\n\r", ch); return; } GET_GOLD(ch) -= share * (num - 1); if (IS_AFFECTED(k, AFF_GROUP) && (k->in_room == ch->in_room) && !(IS_NPC(k)) && k != ch) { GET_GOLD(k) += share; sprintf(buf, "%s splits %d coins; you receive %d.\n\r", GET_NAME(ch), amount, share); send_to_char(buf, k); } for (f = k->followers; f; f = f->next) { if (IS_AFFECTED(f->follower, AFF_GROUP) && (!IS_NPC(f->follower)) && (f->follower->in_room == ch->in_room) && f->follower != ch) { GET_GOLD(f->follower) += share; sprintf(buf, "%s splits %d coins; you receive %d.\n\r", GET_NAME(ch), amount, share); send_to_char(buf, f->follower); } } sprintf(buf, "You split %d coins among %d members; %d coins each.\n\r", amount, num, share); send_to_char(buf, ch); } else { send_to_char("How many coins do you wish to split with your group??\n\r", ch); return; } }