/* ************************************************************************ * File: act.god.c EmpireMUD AD 1.0 * * Usage: Player-level God commands * * * * All rights reserved. See license.doc for complete information. * * * * Code base by Paul Clarke. EmpireMUD Project, a tbgMUD Production. * * Based upon CircleMUD 3.0, beta patch level 17, by Jeremy Elson. * * * * Copyright (C) 1993, 94 by the Trustees of the Johns Hopkins University * * CircleMUD is based on DikuMUD, Copyright (C) 1990, 1991. * ************************************************************************ */ #include "conf.h" #include "sysdep.h" #include "structs.h" #include "utils.h" #include "comm.h" #include "vnums.h" #include "interpreter.h" #include "handler.h" #include "db.h" #include "skills.h" #include "empire.h" #define GOD_LINE_BREAK { "\t", NOTHING, { 0, 0, 0, 0, 0, 0, 0, 0, 0 } } struct create_data { char *name; obj_vnum vnum; int res[NUM_ITEM_MATS]; } resource[] = { /* W R I S G F C F G */ /* o o r l o l l l l */ /* o c o v l n a s a */ /* d k n r d t y h s */ /* Wood */ { "stick", o_STICK, { 1, 0, 0, 0, 0, 0, 0, 0, 0 } }, { "handle", o_HANDLE, { 1, 0, 0, 0, 0, 0, 0, 0, 0 } }, { "tree", o_TREE, { 15, 0, 0, 0, 0, 0, 0, 0, 0 } }, { "log", o_LOG, { 10, 0, 0, 0, 0, 0, 0, 0, 0 } }, { "torch", o_TORCH, { 1, 0, 0, 0, 0, 0, 0, 0, 0 } }, { "canoe", o_CANOE, { 10, 0, 0, 0, 0, 0, 0, 0, 0 } }, { "chair", o_CHAIR, { 22, 0, 1, 0, 0, 0, 0, 0, 0 } }, { "bench", o_BENCH, { 42, 0, 3, 0, 0, 0, 0, 0, 0 } }, { "table", o_TABLE, { 42, 0, 3, 0, 0, 0, 0, 0, 0 } }, { "stool", o_STOOL, { 12, 0, 1, 0, 0, 0, 0, 0, 0 } }, { "beehive", o_BEEHIVE, { 35, 0, 8, 0, 0, 0, 0, 0, 0 } }, { "arrow", o_ARROW, { 1, 0, 0, 0, 0, 0, 0, 0, 0 } }, { "shortbow", o_SHORTBOW, { 2, 0, 0, 0, 0, 0, 0, 20, 0 } }, { "longbow", o_LONGBOW, { 3, 0, 0, 0, 0, 0, 0, 20, 0 } }, { "lyre", o_LYRE, { 10, 0, 0, 0, 0, 0, 0, 0, 0 } }, { "flute", o_FLUTE, { 1, 0, 0, 0, 0, 0, 0, 0, 0 } }, { "walkingstick",o_WALKING_STICK, { 1, 0, 0, 0, 0, 0, 0, 0, 0 } }, { "stake", o_STAKE, { 1, 0, 0, 0, 0, 0, 0, 0, 0 } }, GOD_LINE_BREAK, /* Food */ { "apple", o_APPLES, { 1, 0, 0, 0, 0, 0, 0, 1, 0 } }, { "corn", o_CORN, { 0, 0, 0, 0, 0, 1, 0, 1, 0 } }, { "wheat", o_WHEAT, { 0, 1, 0, 0, 0, 0, 0, 1, 0 } }, { "flour", o_FLOUR, { 0, 1, 0, 0, 0, 0, 0, 1, 0 } }, { "bread", o_BREAD, { 0, 1, 0, 0, 0, 0, 0, 1, 0 } }, { "flower", o_FLOWER, { 0, 0, 0, 0, 0, 0, 0, 1, 0 } }, GOD_LINE_BREAK, /* Rocks */ { "rock", o_ROCK, { 0, 1, 0, 0, 0, 0, 0, 0, 0 } }, { "chippedrock", o_CHIPPED, { 0, 1, 0, 0, 0, 0, 0, 0, 0 } }, { "handaxe", o_HANDAXE, { 0, 1, 0, 0, 0, 0, 0, 0, 0 } }, { "axe", o_AXE, { 1, 1, 0, 0, 0, 0, 0, 0, 0 } }, { "spear", o_SPEAR, { 1, 1, 0, 0, 0, 0, 0, 0, 0 } }, { "spearhead", o_SPEARHEAD,{ 0, 1, 0, 0, 0, 0, 0, 0, 0 } }, GOD_LINE_BREAK, /* Flints */ { "flint", o_FLINT, { 0, 0, 0, 0, 0, 1, 0, 0, 0 } }, { "flintset", o_FLINT_SET,{ 0, 1, 0, 0, 0, 1, 0, 0, 0 } }, GOD_LINE_BREAK, /* Flesh */ { "rope", o_ROPE, { 0, 0, 0, 0, 0, 0, 0, 20, 0 } }, { "gloves", o_GLOVES, { 0, 0, 0, 0, 0, 0, 0, 25, 0 } }, { "shawl", o_SHAWL, { 0, 0, 0, 0, 0, 0, 0,200, 0 } }, { "hood", o_HOOD, { 0, 0, 0, 0, 0, 0, 0, 25, 0 } }, { "cloak", o_CLOAK, { 0, 0, 0, 0, 0, 0, 0,220, 0 } }, { "shoes", o_SHOES, { 0, 0, 0, 0, 0, 0, 0, 50, 0 } }, { "cape", o_CAPE, { 0, 0, 0, 0, 0, 0, 0,170, 0 } }, { "pants", o_PANTS, { 0, 0, 0, 0, 0, 0, 0,180, 0 } }, { "tunic", o_TUNIC, { 0, 0, 0, 0, 0, 0, 0,150, 0 } }, { "shirt", o_SHIRT, { 0, 0, 0, 0, 0, 0, 0,130, 0 } }, { "blouse", o_BLOUSE, { 0, 0, 0, 0, 0, 0, 0,130, 0 } }, { "toga", o_TOGA, { 0, 0, 0, 0, 0, 0, 0,130, 0 } }, { "gauntlets", o_GAUNTLETS,{ 0, 0, 0, 0, 0, 0, 0, 75, 0 } }, { "boots", o_BOOTS, { 0, 0, 0, 0, 0, 0, 0, 80, 0 } }, { "canteen", o_CANTEEN, { 0, 0, 0, 0, 0, 0, 0,100, 0 } }, { "wineskin", o_WINESKIN, { 0, 0, 0, 0, 0, 0, 0,120, 0 } }, { "sack", o_SACK, { 0, 0, 0, 0, 0, 0, 0, 80, 0 } }, { "pack", o_PACK, { 0, 0, 0, 0, 0, 0, 0,120, 0 } }, { "jacket", o_JACKET, { 0, 0, 0, 0, 0, 0, 0,150, 0 } }, { "dress", o_DRESS, { 0, 0, 0, 0, 0, 0, 0,220, 0 } }, { "hat", o_HAT, { 0, 0, 0, 0, 0, 0, 0, 30, 0 } }, { "bracers", o_BRACERS, { 0, 0, 0, 0, 0, 0, 0, 60, 0 } }, { "shield", o_SHIELD, { 0, 0, 0, 0, 0, 0, 0, 90, 0 } }, { "whip", o_WHIP, { 0, 0, 0, 0, 0, 0, 0,120, 0 } }, { "ridingboots",o_RIDINGBOOTS,{0, 0, 0, 0, 0, 0, 0, 80, 0 } }, { "quiver", o_QUIVER, { 0, 0, 0, 0, 0, 0, 0,100, 0 } }, { "sheath", o_SHEATH, { 0, 0, 0, 0, 0, 0, 0, 40, 0 } }, { "scabbard", o_SCABBARD, { 0, 0, 0, 0, 0, 0, 0, 40, 0 } }, { "belt", o_BELT, { 0, 0, 0, 0, 0, 0, 0, 25, 0 } }, { "sash", o_SASH, { 0, 0, 0, 0, 0, 0, 0, 25, 0 } }, { "beltloop", o_BELTLOOP, { 0, 0, 0, 0, 0, 0, 0, 10, 0 } }, GOD_LINE_BREAK, /* Clay */ { "clay", o_CLAY, { 0, 0, 0, 0, 0, 0, 1, 0, 0 } }, GOD_LINE_BREAK, /* Precious Metal */ { "silvernugget",o_SILVER, { 0, 0, 0, 2, 0, 0, 0, 0, 0 } }, { "silverdisc", o_SILVER_DISC,{0, 0, 0, 4, 0, 0, 0, 0, 0 } }, { "silverbar", o_SILVER_BAR,{ 0, 0, 0, 8, 0, 0, 0, 0, 0 } }, { "goldflake", o_GOLD_SMALL,{ 0, 0, 0, 0, 1, 0, 0, 0, 0 } }, { "golddust", o_GOLD, { 0, 0, 0, 0, 2, 0, 0, 0, 0 } }, { "golddisc", o_GOLD_DISC,{ 0, 0, 0, 0, 4, 0, 0, 0, 0 } }, { "goldbar", o_GOLD_BAR, { 0, 0, 0, 0, 8, 0, 0, 0, 0 } }, GOD_LINE_BREAK, /* Glass */ { "flask", o_FLASK, { 0, 0, 0, 0, 0, 0, 0, 0, 5 } }, { "jar", o_JAR, { 0, 0, 0, 0, 0, 0, 0, 0, 5 } }, { "smallpane", o_PANE_SMALL,{ 0, 0, 0, 0, 0, 0, 0, 0, 5 } }, { "mirror", o_MIRROR, { 0, 0, 1, 0, 0, 0, 0, 0, 5 } }, { "silvermirror",o_MIRROR_SILVER, { 0, 0, 0, 6, 0, 0, 0, 0, 5 } }, { "goldmirror", o_MIRROR_GOLD, { 0, 0, 0, 2, 4, 0, 0, 0, 5 } }, { "lantern", o_LANTERN, { 0, 0, 5, 0, 0, 0, 0, 2, 10 } }, { "litlantern", o_LANTERN_LIT, { 0, 0, 5, 0, 0, 0, 0, 2, 10 } }, GOD_LINE_BREAK, /* Wax */ { "beeswax", o_WAX, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 } }, { "candle", o_CANDLE, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 } }, { "litcandle", o_CANDLE_LIT,{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 } }, GOD_LINE_BREAK, /* Iron */ { "iron", o_IRON, { 0, 0, 1, 0, 0, 0, 0, 0, 0 } }, { "waraxe", f_AXE, { 1, 0, 2, 0, 0, 0, 0, 0, 0 } }, { "hammer", f_HAMMER, { 1, 0, 2, 0, 0, 0, 0, 0, 0 } }, { "pick", f_PICK, { 1, 0, 2, 0, 0, 0, 0, 0, 0 } }, { "helm", f_HELM, { 0, 0, 3, 0, 0, 0, 0, 0, 0 } }, { "dagger", f_DAGGER, { 0, 0, 2, 0, 0, 0, 0, 0, 0 } }, { "breastplate",f_BREASTPLATE,{0, 0, 6, 0, 0, 0, 0, 0, 0 } }, { "sword", f_SWORD, { 0, 0, 4, 0, 0, 0, 0, 0, 0 } }, { "ringarmor", f_RING, { 0, 0, 8, 0, 0, 0, 0, 0, 0 } }, { "chainarmor", f_CHAIN, { 0, 0, 7, 0, 0, 0, 0, 0, 0 } }, { "platearmor", f_PLATE, { 0, 0, 12, 0, 0, 0, 0, 0, 0 } }, { "shovel", f_SHOVEL, { 1, 0, 2, 0, 0, 0, 0, 0, 0 } }, { "scythe", f_SCYTHE, { 1, 0, 3, 0, 0, 0, 0, 0, 0 } }, { "ironshield", f_SHIELD, { 0, 0, 4, 0, 0, 0, 0, 0, 0 } }, { "mace", f_MACE, { 1, 0, 3, 0, 0, 0, 0, 0, 0 } }, { "shortsword", f_SHORTSWORD,{ 0, 0, 2, 0, 0, 0, 0, 0, 0 } }, { "pike", f_PIKE, { 1, 0, 2, 0, 0, 0, 0, 0, 0 } }, { "halbert", f_HALBERT, { 1, 0, 2, 0, 0, 0, 0, 0, 0 } }, { "dirk", f_DIRK, { 0, 0, 2, 0, 0, 0, 0, 0, 0 } }, { "pan", f_PAN, { 0, 0, 2, 0, 0, 0, 0, 0, 0 } }, GOD_LINE_BREAK, { "broadsword", f_BROADSWORD, { 0, 0, 4, 0, 0, 0, 0, 0, 0 } }, { "poleaxe", f_POLEAXE, { 1, 0, 2, 0, 0, 0, 0, 0, 0 } }, { "rapier", f_RAPIER, { 0, 0, 2, 0, 0, 0, 0, 0, 0 } }, { "scimitar", f_SCIMITAR, { 0, 0, 3, 0, 0, 0, 0, 0, 0 } }, { "claymore", f_CLAYMORE, { 1, 0, 3, 0, 0, 0, 0, 0, 0 } }, { "flamberge", f_FLAMBERGE, { 1, 0, 4, 0, 0, 0, 0, 0, 0 } }, { "platedbelt", f_BELT, { 0, 0, 2, 0, 0, 0, 0, 0, 0 } }, { "clip", f_BELTCLIP, { 0, 0, 1, 0, 0, 0, 0, 0, 0 } }, { "greathelm", f_GREAT_HELM, { 0, 0, 3, 0, 0, 0, 0, 0, 0 } }, { "fullplate", f_FULL_PLATE, { 0, 0, 16, 0, 0, 0, 0, 0, 0 } }, GOD_LINE_BREAK, { "silverring", f_RING_SILVER,{ 0, 0, 0, 2, 0, 0, 0, 0, 0 } }, { "silverearring",f_EARRING_SILVER,{ 0, 0, 0, 4, 0, 0, 0, 0, 0 } }, { "goldring", f_RING_GOLD,{ 0, 0, 0, 0, 2, 0, 0, 0, 0 } }, { "goldearring",f_EARRING_GOLD,{ 0, 0, 0, 0, 4, 0, 0, 0, 0 } }, { "engagementring",f_RING_ENGAGEMENT,{ 0, 0, 0, 0, 2, 0, 0, 0, 0 } }, { "weddingring",f_RING_WEDDING,{ 0, 0, 0, 0, 2, 0, 0, 0, 0 } }, { "crown", f_CROWN, { 0, 0, 0, 0, 8, 0, 0, 0, 0 } }, GOD_LINE_BREAK, { "maul", f_MAUL, { 1, 12, 2, 0, 0, 0, 0, 0, 12 } }, { "kiteshield", f_KITE, { 2, 16, 8, 0, 0, 0, 0, 6, 6 } }, { "towershield",f_TOWER, { 4, 20, 12, 0, 0, 0, 0, 6, 6 } }, GOD_LINE_BREAK, { "woodblock", WOOD_BLOCK, { 1000, 0, 0, 0, 0, 0, 0, 0, 0 } }, { "rockblock", ROCK_BLOCK, { 0, 1000, 0, 0, 0, 0, 0, 0, 0 } }, { "ironblock", IRON_BLOCK, { 0, 0, 500, 0, 0, 0, 0, 0, 0 } }, { "silverblock",SILVER_BLOCK, { 0, 0, 0, 10, 0, 0, 0, 0, 0 } }, { "goldblock", GOLD_BLOCK, { 0, 0, 0, 0, 10, 0, 0, 0, 0 } }, { "flintblock", FLINT_BLOCK, { 0, 0, 0, 0, 0, 1000, 0, 0, 0 } }, { "clayblock", CLAY_BLOCK, { 0, 0, 0, 0, 0, 0, 50, 0, 0 } }, { "fleshblock", FLESH_BLOCK, { 0, 0, 0, 0, 0, 0, 0, 1000, 0 } }, { "glassblock", GLASS_BLOCK, { 0, 0, 0, 0, 0, 0, 0, 0, 100 } }, { "totalblock", TOTAL_BLOCK, { 1000, 1000, 500, 10, 10, 1000, 50, 1000, 100 } }, /* This must go last */ { "\n", NOTHING, { 0, 0, 0, 0, 0, 0, 0, 0, 0 } } }; ACMD(do_create) { Object obj = NULL; int i = 0, j = 0, count = 0, num = 1, done = 0; bool ok, low_res = FALSE; *buf = '\0'; two_arguments(argument, arg, buf); if (!*buf) strcpy(buf, arg); else { num = atoi(arg); if (num < 1) { msg_to_char(ch, "You need to create at LEAST one.\r\n"); return; } } if (!*buf) { msg_to_char(ch, "You can create:\r\n"); *buf = '\0'; for (i = 0, ok = 1; str_cmp(resource[i].name, "\n"); i++, ok = 1) { for (j = 0; j < NUM_ITEM_MATS; j++) if (GET_RESOURCE(ch, j) < resource[i].res[j]) ok = 0; if (!ok) continue; if (!str_cmp(resource[i].name, "\t")) { if (count > 0) strcat(buf, "\r\n"); count = 0; continue; } if (count + strlen(resource[i].name) + 1 > 78) { strcat(buf, "\r\n"); count = 0; } sprintf(buf + strlen(buf), " %s", resource[i].name); count += strlen(resource[i].name) + 1; } if (*buf) msg_to_char(ch, "%s\r\n", buf); else msg_to_char(ch, " nothing\r\n"); return; } for (i = 0, ok = 1; str_cmp(resource[i].name, "\n"); i++, ok = 1) { if (!is_abbrev(buf, resource[i].name)) continue; for (j = 0; j < NUM_ITEM_MATS; j++) if (GET_RESOURCE(ch, j) < resource[i].res[j]) ok = 0; if (ok) break; } if (!str_cmp(resource[i].name, "\n")) { msg_to_char(ch, "You can't create that.\r\n"); return; } /* We KNOW we can create at least one. We'll check after that. */ for (done = 0; done < num; done++) { for (j = 0; j < NUM_ITEM_MATS; j++) if (GET_RESOURCE(ch, j) < resource[i].res[j]) low_res = 1; if (low_res) break; for (j = 0; j < NUM_ITEM_MATS; j++) GET_RESOURCE(ch, j) -= resource[i].res[j]; obj = read_object(resource[i].vnum, VIRTUAL); if (IS_CARRYING_N(ch) >= CAN_CARRY_N(ch) || GET_OBJ_WEIGHT(obj) + IS_CARRYING_W(ch) > CAN_CARRY_W(ch)) obj_to_room(obj, ch->in_room); else obj_to_char(obj, ch); SET_BIT(obj->obj_flags.extra_flags, ITEM_CREATED); } if (!done) { msg_to_char(ch, "You fail to create it.\r\n"); if (obj) extract_obj(obj); } else if (done == 1) { act("You create $p!", FALSE, ch, obj, 0, TO_CHAR); act("$n creates $p from thin air!", TRUE, ch, obj, 0, TO_ROOM); } else { sprintf(buf, "You create $p (x%d)!", done); sprintf(buf1, "$n creates $p (x%d) from thin air!", done); act(buf, FALSE, ch, obj, 0, TO_CHAR); act(buf1, TRUE, ch, obj, 0, TO_ROOM); } if (low_res) msg_to_char(ch, "You have insufficient resources to create more.\r\n"); } int perform_sacrifice(Creature ch, Creature god, Object obj, bool mode) { int i, j, amt; float bonus = 1; /* Determine monument bonus */ if (world[ch->in_room].spare == GET_IDNUM(god)) { if (CLOSED_MONUMENT_TYPE(ch->in_room) == MONUMENT_C_SHRINE) bonus = 1.25; else if (CLOSED_MONUMENT_TYPE(ch->in_room) == MONUMENT_C_TEMPLE_UL) bonus = 1.50; else if (CLOSED_MONUMENT_TYPE(ch->in_room) == MONUMENT_C_HIGHTEMPLE_UC) bonus = 1.75; } /* Oops, it was created */ if (IS_OBJ_STAT(obj, ITEM_CREATED)) bonus = 1; /* Find it in the list. If it's not there, they still get 1 point for it */ for (i = 0; str_cmp(resource[i].name, "\n") && resource[i].vnum != GET_OBJ_VNUM(obj); i++); for (j = 0; j < NUM_ITEM_MATS; j++) GET_RESOURCE(god, j) += resource[i].res[j] * bonus; if (!str_cmp(resource[i].name, "\n")) { if (GET_OBJ_VNUM(obj) == o_CORPSE) { amt = GET_OBJ_VAL(obj, 1); if (IS_SET(GET_OBJ_VAL(obj, 2), CORPSE_EATEN)) amt /= 2; if (IS_SET(GET_OBJ_VAL(obj, 2), CORPSE_SKINNED)) amt /= 2; GET_RESOURCE(god, ITEM_MAT_FLESH) += amt; } else if (GET_OBJ_VNUM(obj) == o_SKIN) GET_RESOURCE(god, ITEM_MAT_FLESH) += GET_OBJ_VAL(obj, 0); else GET_RESOURCE(god, GET_OBJ_MATERIAL(obj)) += 1 + bonus; } if (mode) { *buf2 = '\0'; if (ch == god) { sprintf(buf, "You sacrifice $p to yourself!"); sprintf(buf1, "$n sacrifices $p to $mself!"); } else { sprintf(buf, "You sacrifice $p to %s!", PERS(god, god, 1)); sprintf(buf1, "$n sacrifices $p to %s!", PERS(god, god, 1)); sprintf(buf2, "$n sacrifices $p to you!"); } act(buf, TRUE, ch, obj, god, TO_CHAR); act(buf1, TRUE, ch, obj, god, TO_NOTVICT); if (ch->in_room == god->in_room && ch != god) act(buf2, TRUE, ch, obj, god, TO_VICT); } while (obj->contains) perform_sacrifice(ch, god, obj->contains, 0); extract_obj(obj); return 1; } ACMD(do_sacrifice) { extern FILE *player_fl; Object obj, next_obj; Creature god = NULL, cbuf = NULL; Descr d; int amount = 0, dotmode, player_i = 0; bool file = FALSE; struct char_file_u tmp_store; two_arguments(argument, arg, buf); if (!*arg || !*buf) { msg_to_char(ch, "What do you wish to sacrifice, and to whom?\r\n"); return; } /* Do this in-file */ for (d = descriptor_list; d; d = d->next) { if (STATE(d) != CON_PLAYING || !d->character) continue; if (!isname(buf, GET_NAME(d->character))) continue; god = d->character; break; } if (!god) { CREATE(cbuf, struct char_data, 1); clear_char(cbuf); if ((player_i = load_char(buf, &tmp_store)) > NOBODY) { store_to_char(&tmp_store, cbuf); god = cbuf; file = TRUE; } else { free(cbuf); send_to_char("There is no such god.\r\n", ch); return; } } if (!IS_GOD(god) && !IS_IMMORTAL(god)) { msg_to_char(ch, "You can only sacrifice to gods.\r\n"); if (file) free_char(cbuf); return; } dotmode = find_all_dots(arg); if (dotmode == FIND_ALL) { if (!ch->carrying && (!world[ch->in_room].contents || !CAN_USE_ROOM(ch, ch->in_room, 0))) msg_to_char(ch, "You don't seem to have anything to sacrifice.\r\n"); else { for (obj = ch->carrying; obj; obj = next_obj) { next_obj = obj->next_content; amount += perform_sacrifice(ch, god, obj, 1); } for (obj = world[ch->in_room].contents; obj; obj = next_obj) { next_obj = obj->next_content; if (!CAN_USE_ROOM(ch, ch->in_room, 0)) continue; if (!CAN_WEAR(obj, ITEM_WEAR_TAKE)) continue; amount += perform_sacrifice(ch, god, obj, 1); } } } else if (dotmode == FIND_ALLDOT) { if (!*arg) { msg_to_char(ch, "What do you want to sacrifice all of?\r\n"); return; } if (!(obj = get_obj_in_list_vis(ch, arg, ch->carrying))) if (!CAN_USE_ROOM(ch, ch->in_room, 0) || !(obj = get_obj_in_list_vis(ch, arg, world[ch->in_room].contents))) msg_to_char(ch, "You don't seem to have any %ss to sacrifice.\r\n", arg); while (obj) { next_obj = get_obj_in_list_vis(ch, arg, obj->next_content); if (!next_obj && CAN_USE_ROOM(ch, ch->in_room, 0) && obj->in_room == NOWHERE) next_obj = get_obj_in_list_vis(ch, arg, world[ch->in_room].contents); amount += perform_sacrifice(ch, god, obj, 1); obj = next_obj; } } else { if (!(obj = get_obj_in_list_vis(ch, arg, ch->carrying)) && (!CAN_USE_ROOM(ch, ch->in_room, 0) || !(obj = get_obj_in_list_vis(ch, arg, world[ch->in_room].contents)))) msg_to_char(ch, "You don't seem to have any %ss to sacrifice.\r\n", arg); else amount += perform_sacrifice(ch, god, obj, 1); } if (!file) SAVE_CHAR(god); if (file) { char_to_store(god, &tmp_store); fseek(player_fl, (player_i) * sizeof(struct char_file_u), SEEK_SET); fwrite(&tmp_store, sizeof(struct char_file_u), 1, player_fl); } if (file) free_char(cbuf); }