/*************************************************************************** * Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer, * * Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe. * * * * Merc Diku Mud improvments copyright (C) 1992, 1993 by Michael * * Chastain, Michael Quan, and Mitchell Tse. * * * * In order to use any part of this Merc Diku Mud, you must comply with * * both the original Diku license in 'license.doc' as well the Merc * * license in 'license.txt'. In particular, you may not remove either of * * these copyright notices. * * * * Dystopia Mud improvements copyright (C) 2000, 2001 by Brian Graversen * * * * Much time and thought has gone into this software and you are * * benefitting. We hope that you share your changes too. What goes * * around, comes around. * ***************************************************************************/ /*************************************************************************** * _/ _/ * * _/_/_/ _/_/ _/_/_/ _/ _/_/ _/ _/ _/_/_/ * * _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ * * _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ * * _/ _/ _/ _/_/_/ _/ _/_/ _/_/_/ _/_/_/ * *************************************************************************** * Mindcloud Copyright 2001-2003 by Jeff Boschee (Zarius), * * Additional credits are in the help file CODECREDITS * * All Rights Reserved. * ***************************************************************************/ #include <sys/types.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include "merc.h" #include "interp.h" void do_forge(CHAR_DATA * ch, char *argument) { char arg1[MAX_STRING_LENGTH]; char arg2[MAX_STRING_LENGTH]; OBJ_DATA *obj = NULL; OBJ_DATA *obj2 = NULL; int hp = 0; argument = one_argument(argument, arg1); argument = one_argument(argument, arg2); if (IS_NPC(ch)) return; if (arg1[0] == '\0' || arg2[0] == '\0') { send_to_char ("Syntax : forge <slab/gem/hilt> <item> (read HELP FORGE for details)\n\r", ch); return; } if ((obj = get_obj_carry(ch, arg2, ch)) == NULL) { send_to_char("You are not carrying that item.\n\r", ch); return; } if (IS_SET(obj->quest, QUEST_ARTIFACT)) { send_to_char("You cannot forge artifacts.\n\r", ch); return; } if (obj->item_type == ITEM_FAMILIAR) { send_to_char("You cannot forge onto a companion.\n\r", ch); return; } if (!IS_SET(ch->pcdata->jflags, JFLAG_KNOWS_FORGING)) { send_to_char("You don't have the skill to do any forging", ch); return; } if (ch->practice < 100 && !IS_CLASS(ch, CLASS_CYBORG)) { stc("It costs 100 primal to forge something", ch); return; } if (!str_prefix(arg1, "copper")) { if ((obj2 = get_obj_carry(ch, (arg1), ch)) == NULL) { send_to_char("You require a copper forging slab.\n\r", ch); return; } if (obj2->item_type != ITEM_COPPER) { send_to_char("That thing isn't copper!\n\r", ch); return; } else if (IS_SET(obj->spectype, SITEM_COPPER) || IS_SET(obj->spectype, SITEM_IRON) || IS_SET(obj->spectype, SITEM_MITHRIL) || IS_SET(obj->spectype, SITEM_STEEL) || IS_SET(obj->spectype, SITEM_ADAMANTITE)) { send_to_char("That item is already forged.\n\r", ch); return; } SET_BIT(obj->spectype, SITEM_COPPER); forge_affect(obj, 3); extract_obj(obj2); act("You forge copper onto $p.\n\r", ch, obj, NULL, TO_CHAR); act("$n forges copper onto $p.\n\r", ch, obj, NULL, TO_ROOM); if (!IS_CLASS(ch, CLASS_CYBORG)) { ch->practice -= 100; } return; } if (!str_prefix(arg1, "iron")) { if ((obj2 = get_obj_carry(ch, (arg1), ch)) == NULL) { send_to_char("You require an iron forging slab.\n\r", ch); return; } if (obj2->item_type != ITEM_IRON) { send_to_char("That thing isn't iron!\n\r", ch); return; } else if (IS_SET(obj->spectype, SITEM_COPPER) || IS_SET(obj->spectype, SITEM_IRON) || IS_SET(obj->spectype, SITEM_MITHRIL) || IS_SET(obj->spectype, SITEM_STEEL) || IS_SET(obj->spectype, SITEM_ADAMANTITE)) { send_to_char("That item is already forged.\n\r", ch); return; } SET_BIT(obj->spectype, SITEM_IRON); forge_affect(obj, 6); extract_obj(obj2); act("You forge iron onto $p.\n\r", ch, obj, NULL, TO_CHAR); act("$n forges iron onto $p.\n\r", ch, obj, NULL, TO_ROOM); if (!IS_CLASS(ch, CLASS_CYBORG)) { ch->practice -= 100; } return; } if (!str_prefix(arg1, "steel")) { if ((obj2 = get_obj_carry(ch, (arg1), ch)) == NULL) { send_to_char("You require a steel forging slab.\n\r", ch); return; } if (obj2->item_type != ITEM_STEEL) { send_to_char("That thing isn't steel!\n\r", ch); return; } else if (IS_SET(obj->spectype, SITEM_COPPER) || IS_SET(obj->spectype, SITEM_IRON) || IS_SET(obj->spectype, SITEM_MITHRIL) || IS_SET(obj->spectype, SITEM_STEEL) || IS_SET(obj->spectype, SITEM_ADAMANTITE)) { send_to_char("That item is already forged.\n\r", ch); return; } SET_BIT(obj->spectype, SITEM_STEEL); forge_affect(obj, 9); extract_obj(obj2); act("You forge steel onto $p.\n\r", ch, obj, NULL, TO_CHAR); act("$n forges steel onto $p.\n\r", ch, obj, NULL, TO_ROOM); if (!IS_CLASS(ch, CLASS_CYBORG)) { ch->practice -= 100; } return; } if (!str_prefix(arg1, "adamantite")) { if ((obj2 = get_obj_carry(ch, (arg1), ch)) == NULL) { send_to_char ("You require an adamantite forging slab.\n\r", ch); return; } if (obj2->item_type != ITEM_ADAMANTITE) { send_to_char("That thing isn't copper!\n\r", ch); return; } else if (IS_SET(obj->spectype, SITEM_COPPER) || IS_SET(obj->spectype, SITEM_IRON) || IS_SET(obj->spectype, SITEM_MITHRIL) || IS_SET(obj->spectype, SITEM_STEEL) || IS_SET(obj->spectype, SITEM_ADAMANTITE)) { send_to_char("That item is already forged.\n\r", ch); return; } SET_BIT(obj->spectype, SITEM_ADAMANTITE); forge_affect(obj, 12); extract_obj(obj2); act("You forge adamantite onto $p.\n\r", ch, obj, NULL, TO_CHAR); act("$n forges adamantite onto $p.\n\r", ch, obj, NULL, TO_ROOM); if (!IS_CLASS(ch, CLASS_CYBORG)) { ch->practice -= 100; } return; } if (!str_prefix(arg1, "mithril")) { if ((obj2 = get_obj_carry(ch, (arg1), ch)) == NULL) { send_to_char ("You require an mithril forging slab.\n\r", ch); return; } if (obj2->item_type != ITEM_MITHRIL) { send_to_char("That thing isn't mithril!\n\r", ch); return; } else if (IS_SET(obj->spectype, SITEM_COPPER) || IS_SET(obj->spectype, SITEM_IRON) || IS_SET(obj->spectype, SITEM_STEEL) || IS_SET(obj->spectype, SITEM_MITHRIL) || IS_SET(obj->spectype, SITEM_ADAMANTITE)) { send_to_char("That item is already forged.\n\r", ch); return; } SET_BIT(obj->spectype, SITEM_MITHRIL); forge_affect(obj, 16); extract_obj(obj2); act("You forge mithril onto $p.\n\r", ch, obj, NULL, TO_CHAR); act("$n forges mithril onto $p.\n\r", ch, obj, NULL, TO_ROOM); if (!IS_CLASS(ch, CLASS_CYBORG)) { ch->practice -= 100; } return; } if (!str_prefix(arg1, "rune")) { if ((obj2 = get_obj_carry( ch, (arg1), ch)) == NULL ) { send_to_char( "You require a Rune.\n\r", ch); return; } if (obj2->item_type != ITEM_RUNE) { send_to_char("You require a rune!\n\r",ch); return; } else if (IS_SET(obj->spectype, SITEM_RUNE)) { send_to_char("That item is already forged with a RUNE.\n\r",ch); return; } hp = 1000; add_affect( obj, APPLY_HIT, hp ); SET_BIT(obj->spectype, SITEM_RUNE); // forge_affect(obj, 50); extract_obj( obj2 ); act("You forge a rune onto $p.\n\r",ch, obj,NULL,TO_CHAR); act("$n forges a rune onto $p.\n\r",ch,obj,NULL,TO_ROOM); return; } if (!str_prefix(arg1, "diamond")) { if ((obj2 = get_obj_carry(ch, (arg1), ch)) == NULL) { send_to_char("You require a diamond gemstone.\n\r", ch); return; } if (obj2->item_type != ITEM_GEMSTONE) { send_to_char("That isn't a diamond gemstone.\n\r", ch); return; } else if (IS_SET(obj->spectype, SITEM_GEMSTONE)) { send_to_char ("That item is already forged with a gemstone.\n\r", ch); return; } SET_BIT(obj->spectype, SITEM_GEMSTONE); extract_obj(obj2); act("You forge a diamond onto $p.\n\r", ch, obj, NULL, TO_CHAR); act("$n forges a diamond onto $p.\n\r", ch, obj, NULL, TO_ROOM); if (!IS_CLASS(ch, CLASS_CYBORG)) { ch->practice -= 100; } if (obj->item_type == ITEM_WEAPON) { if (obj->value[0] >= 1000) obj->value[0] -= ((obj->value[0] / 1000) * 1000); obj->value[0] += 8000; } else if (obj->item_type == ITEM_ARMOR) obj->value[3] = 8; return; } if (!str_prefix(arg1, "emerald")) { if ((obj2 = get_obj_carry(ch, (arg1), ch)) == NULL) { send_to_char("You require an emerald gemstone.\n\r", ch); return; } if (obj2->item_type != ITEM_GEMSTONE) { send_to_char("That isn't an emerald gemstone.\n\r", ch); return; } else if (IS_SET(obj->spectype, SITEM_GEMSTONE)) { send_to_char ("That item is already forged with a gemstone.\n\r", ch); return; } SET_BIT(obj->spectype, SITEM_GEMSTONE); extract_obj(obj2); act("You forge an emerald onto $p.\n\r", ch, obj, NULL, TO_CHAR); act("$n forges an emerald onto $p.\n\r", ch, obj, NULL, TO_ROOM); if (!IS_CLASS(ch, CLASS_CYBORG)) { ch->practice -= 100; } if (obj->item_type == ITEM_WEAPON) { if (obj->value[0] >= 1000) obj->value[0] -= ((obj->value[0] / 1000) * 1000); obj->value[0] += 13000; } else if (obj->item_type == ITEM_ARMOR) obj->value[3] = 13; return; } if (!str_prefix(arg1, "sapphire")) { if ((obj2 = get_obj_carry(ch, (arg1), ch)) == NULL) { send_to_char("You require a sapphire gemstone.\n\r", ch); return; } if (obj2->item_type != ITEM_GEMSTONE) { send_to_char("That isn't a sapphire gemstone.\n\r", ch); return; } else if (IS_SET(obj->spectype, SITEM_GEMSTONE)) { send_to_char ("That item is already forged with a gemstone.\n\r", ch); return; } SET_BIT(obj->spectype, SITEM_GEMSTONE); extract_obj(obj2); act("You forge a sapphire onto $p.\n\r", ch, obj, NULL, TO_CHAR); act("$n forges a sapphire onto $p.\n\r", ch, obj, NULL, TO_ROOM); if (!IS_CLASS(ch, CLASS_CYBORG)) { ch->practice -= 100; } if (obj->item_type == ITEM_WEAPON) { if (obj->value[0] >= 1000) obj->value[0] -= ((obj->value[0] / 1000) * 1000); obj->value[0] += 12000; } else if (obj->item_type == ITEM_ARMOR) obj->value[3] = 12; return; } if (!str_prefix(arg1, "ruby")) { if ((obj2 = get_obj_carry(ch, (arg1), ch)) == NULL) { send_to_char("You require a ruby gemstone.\n\r", ch); return; } if (obj2->item_type != ITEM_GEMSTONE) { send_to_char("That isn't a ruby gemstone.\n\r", ch); return; } else if (IS_SET(obj->spectype, SITEM_GEMSTONE)) { send_to_char ("That item is already forged with a gemstone.\n\r", ch); return; } SET_BIT(obj->spectype, SITEM_GEMSTONE); extract_obj(obj2); act("You forge a ruby onto $p.\n\r", ch, obj, NULL, TO_CHAR); act("$n forges a ruby onto $p.\n\r", ch, obj, NULL, TO_ROOM); if (!IS_CLASS(ch, CLASS_CYBORG)) { ch->practice -= 100; } if (obj->item_type == ITEM_WEAPON) { if (obj->value[0] >= 1000) obj->value[0] -= ((obj->value[0] / 1000) * 1000); obj->value[0] += 11000; } else if (obj->item_type == ITEM_ARMOR) obj->value[3] = 11; return; } if (!str_prefix(arg1, "pearl")) { if ((obj2 = get_obj_carry(ch, (arg1), ch)) == NULL) { send_to_char("You require a pearl gemstone.\n\r", ch); return; } if (obj2->item_type != ITEM_GEMSTONE) { send_to_char("That isn't a pearl gemstone.\n\r", ch); return; } else if (IS_SET(obj->spectype, SITEM_GEMSTONE)) { send_to_char ("That item is already forged with a gemstone.\n\r", ch); return; } SET_BIT(obj->spectype, SITEM_GEMSTONE); extract_obj(obj2); act("You forge a pearl onto $p.\n\r", ch, obj, NULL, TO_CHAR); act("$n forges a pearl onto $p.\n\r", ch, obj, NULL, TO_ROOM); if (!IS_CLASS(ch, CLASS_CYBORG)) { ch->practice -= 100; } if (obj->item_type == ITEM_WEAPON) { if (obj->value[0] >= 1000) obj->value[0] -= ((obj->value[0] / 1000) * 1000); obj->value[0] += 5000; } else if (obj->item_type == ITEM_ARMOR) obj->value[3] = 5; return; } if (!str_prefix(arg1, "topaz")) { if ((obj2 = get_obj_carry(ch, (arg1), ch)) == NULL) { send_to_char("You require a topaz gemstone.\n\r", ch); return; } if (obj2->item_type != ITEM_GEMSTONE) { send_to_char("That isn't a topaz gemstone.\n\r", ch); return; } else if (IS_SET(obj->spectype, SITEM_GEMSTONE)) { send_to_char ("That item is already forged with a gemstone.\n\r", ch); return; } SET_BIT(obj->spectype, SITEM_GEMSTONE); extract_obj(obj2); act("You forge a topaz onto $p.\n\r", ch, obj, NULL, TO_CHAR); act("$n forges a topaz onto $p.\n\r", ch, obj, NULL, TO_ROOM); if (!IS_CLASS(ch, CLASS_CYBORG)) { ch->practice -= 100; } if (obj->item_type == ITEM_WEAPON) { if (obj->value[0] >= 1000) obj->value[0] -= ((obj->value[0] / 1000) * 1000); obj->value[0] += 10000; } else if (obj->item_type == ITEM_ARMOR) obj->value[3] = 10; return; } if (!str_prefix(arg1, "amethyst")) { if ((obj2 = get_obj_carry(ch, (arg1), ch)) == NULL) { send_to_char("You require an amethyst gemstone.\n\r", ch); return; } if (obj2->item_type != ITEM_GEMSTONE) { send_to_char("That isn't an amethyst gemstone.\n\r", ch); return; } else if (IS_SET(obj->spectype, SITEM_GEMSTONE)) { send_to_char ("That item is already forged with a gemstone.\n\r", ch); return; } SET_BIT(obj->spectype, SITEM_GEMSTONE); extract_obj(obj2); act("You forge an amethyst onto $p.\n\r", ch, obj, NULL, TO_CHAR); act("$n forges an amethyst onto $p.\n\r", ch, obj, NULL, TO_ROOM); if (!IS_CLASS(ch, CLASS_CYBORG)) { ch->practice -= 100; } if (obj->item_type == ITEM_WEAPON) { if (obj->value[0] >= 1000) obj->value[0] -= ((obj->value[0] / 1000) * 1000); obj->value[0] += 3000; } else if (obj->item_type == ITEM_ARMOR) obj->value[3] = 3; return; } if (!str_prefix(arg1, "onyx")) { if ((obj2 = get_obj_carry(ch, (arg1), ch)) == NULL) { send_to_char("You require an onyx gemstone.\n\r", ch); return; } if (obj2->item_type != ITEM_GEMSTONE) { send_to_char("That isn't an onyx gemstone.\n\r", ch); return; } else if (IS_SET(obj->spectype, SITEM_GEMSTONE)) { send_to_char ("That item is already forged with a gemstone.\n\r", ch); return; } SET_BIT(obj->spectype, SITEM_GEMSTONE); extract_obj(obj2); act("You forge an onyx onto $p.\n\r", ch, obj, NULL, TO_CHAR); act("$n forges an onyx onto $p.\n\r", ch, obj, NULL, TO_ROOM); if (!IS_CLASS(ch, CLASS_CYBORG)) { ch->practice -= 100; } if (obj->item_type == ITEM_WEAPON) { if (obj->value[0] >= 1000) obj->value[0] -= ((obj->value[0] / 1000) * 1000); obj->value[0] += 9000; } else if (obj->item_type == ITEM_ARMOR) obj->value[3] = 9; return; } if (!str_prefix(arg1, "opal")) { if ((obj2 = get_obj_carry(ch, (arg1), ch)) == NULL) { send_to_char("You require an opal gemstone.\n\r", ch); return; } if (obj2->item_type != ITEM_GEMSTONE) { send_to_char("That isn't n opal gemstone.\n\r", ch); return; } else if (IS_SET(obj->spectype, SITEM_GEMSTONE)) { send_to_char ("That item is already forged with a gemstone.\n\r", ch); return; } SET_BIT(obj->spectype, SITEM_GEMSTONE); extract_obj(obj2); act("You forge an opal onto $p.\n\r", ch, obj, NULL, TO_CHAR); act("$n forges an opal onto $p.\n\r", ch, obj, NULL, TO_ROOM); if (!IS_CLASS(ch, CLASS_CYBORG)) { ch->practice -= 100; } if (obj->item_type == ITEM_WEAPON) { if (obj->value[0] >= 1000) obj->value[0] -= ((obj->value[0] / 1000) * 1000); obj->value[0] += 6000; } else if (obj->item_type == ITEM_ARMOR) obj->value[3] = 6; return; } if (!str_prefix(arg1, "lazuli")) { if ((obj2 = get_obj_carry(ch, (arg1), ch)) == NULL) { send_to_char("You require a lazuli gemstone.\n\r", ch); return; } if (obj2->item_type != ITEM_GEMSTONE) { send_to_char("That isn't a lazuli gemstone.\n\r", ch); return; } else if (IS_SET(obj->spectype, SITEM_GEMSTONE)) { send_to_char ("That item is already forged with a gemstone.\n\r", ch); return; } SET_BIT(obj->spectype, SITEM_GEMSTONE); extract_obj(obj2); act("You forge a lazuli onto $p.\n\r", ch, obj, NULL, TO_CHAR); act("$n forges a lazuli onto $p.\n\r", ch, obj, NULL, TO_ROOM); if (!IS_CLASS(ch, CLASS_CYBORG)) { ch->practice -= 100; } if (obj->item_type == ITEM_WEAPON) { if (obj->value[0] >= 1000) obj->value[0] -= ((obj->value[0] / 1000) * 1000); obj->value[0] += 2000; } else if (obj->item_type == ITEM_ARMOR) obj->value[3] = 2; return; } if (!str_prefix(arg1, "jade")) { if ((obj2 = get_obj_carry(ch, (arg1), ch)) == NULL) { send_to_char("You require some jade.\n\r", ch); return; } if (obj2->item_type != ITEM_GEMSTONE) { send_to_char("That isn't a jade gemstone.\n\r", ch); return; } else if (IS_SET(obj->spectype, SITEM_GEMSTONE)) { send_to_char ("That item is already forged with a gemstone.\n\r", ch); return; } SET_BIT(obj->spectype, SITEM_GEMSTONE); extract_obj(obj2); act("You forge some jade onto $p.\n\r", ch, obj, NULL, TO_CHAR); act("$n forges some jade onto $p.\n\r", ch, obj, NULL, TO_ROOM); if (obj->item_type == ITEM_WEAPON) { if (obj->value[0] >= 1000) obj->value[0] -= ((obj->value[0] / 1000) * 1000); obj->value[0] += 7000; } else if (obj->item_type == ITEM_ARMOR) { if (!IS_EVIL(ch)) obj->value[3] = 7; else obj->value[3] = 139; } if (!IS_CLASS(ch, CLASS_CYBORG)) { ch->practice -= 100; } return; } if (!str_prefix(arg1, "ivory")) { if ((obj2 = get_obj_carry(ch, (arg1), ch)) == NULL) { send_to_char("You require an ivory hilt.\n\r", ch); return; } if (obj2->item_type != ITEM_HILT) { send_to_char("That isn't an ivory hilt.\n\r", ch); return; } else if (IS_SET(obj->spectype, SITEM_HILT)) { send_to_char ("That item is already forged with a hilt.\n\r", ch); return; } else if (obj->item_type != ITEM_WEAPON) { send_to_char("You can only add hilts to weapons.\n\r", ch); return; } SET_BIT(obj->spectype, SITEM_HILT); extract_obj(obj2); act("You forge an ivory hilt onto $p.\n\r", ch, obj, NULL, TO_CHAR); act("$n forges an ivory hilt onto $p.\n\r", ch, obj, NULL, TO_ROOM); obj->value[0] += 24; if (!IS_CLASS(ch, CLASS_CYBORG)) { ch->practice -= 100; } return; } if (!str_prefix(arg1, "ebony")) { if ((obj2 = get_obj_carry(ch, (arg1), ch)) == NULL) { send_to_char("You require an ebony hilt.\n\r", ch); return; } if (obj2->item_type != ITEM_HILT) { send_to_char("That isn't an ebony hilt.\n\r", ch); return; } else if (IS_SET(obj->spectype, SITEM_HILT)) { send_to_char ("That item is already forged with a hilt.\n\r", ch); return; } else if (obj->item_type != ITEM_WEAPON) { send_to_char("You can only add hilts to weapons.\n\r", ch); return; } SET_BIT(obj->spectype, SITEM_HILT); extract_obj(obj2); act("You forge an ebony hilt onto $p.\n\r", ch, obj, NULL, TO_CHAR); act("$n forges an ebony hilt onto $p.\n\r", ch, obj, NULL, TO_ROOM); obj->value[0] += 4; if (!IS_CLASS(ch, CLASS_CYBORG)) { ch->practice -= 100; } return; } if (!str_prefix(arg1, "crystal")) { if ((obj2 = get_obj_carry(ch, (arg1), ch)) == NULL) { send_to_char("You require a crystal hilt.\n\r", ch); return; } if (obj2->item_type != ITEM_HILT) { send_to_char("That isn't a crystal hilt.\n\r", ch); return; } else if (IS_SET(obj->spectype, SITEM_HILT)) { send_to_char ("That item is already forged with a hilt.\n\r", ch); return; } else if (obj->item_type != ITEM_WEAPON) { send_to_char("You can only add hilts to weapons.\n\r", ch); return; } SET_BIT(obj->spectype, SITEM_HILT); extract_obj(obj2); act("You forge a crystal hilt onto $p.\n\r", ch, obj, NULL, TO_CHAR); act("$n forges a crystal hilt onto $p.\n\r", ch, obj, NULL, TO_ROOM); obj->value[0] += 30; if (!IS_CLASS(ch, CLASS_CYBORG)) { ch->practice -= 100; } return; } if (!str_prefix(arg1, "marble")) { if ((obj2 = get_obj_carry(ch, (arg1), ch)) == NULL) { send_to_char("You require a marble hilt.\n\r", ch); return; } if (obj2->item_type != ITEM_HILT) { send_to_char("That isn't a marble hilt.\n\r", ch); return; } else if (IS_SET(obj->spectype, SITEM_HILT)) { send_to_char ("That item is already forged with a hilt.\n\r", ch); return; } else if (obj->item_type != ITEM_WEAPON) { send_to_char("You can only add hilts to weapons.\n\r", ch); return; } SET_BIT(obj->spectype, SITEM_HILT); extract_obj(obj2); act("You forge a marble hilt onto $p.\n\r", ch, obj, NULL, TO_CHAR); act("$n forges a marble hilt onto $p.\n\r", ch, obj, NULL, TO_ROOM); obj->value[0] += 34; if (!IS_CLASS(ch, CLASS_CYBORG)) { ch->practice -= 100; } return; } if (!str_prefix(arg1, "gold")) { if ((obj2 = get_obj_carry(ch, (arg1), ch)) == NULL) { send_to_char("You require a gold hilt.\n\r", ch); return; } if (obj2->item_type != ITEM_HILT) { send_to_char("That isn't gold hilt.\n\r", ch); return; } else if (IS_SET(obj->spectype, SITEM_HILT)) { send_to_char ("That item is already forged with a hilt.\n\r", ch); return; } else if (obj->item_type != ITEM_WEAPON) { send_to_char("You can only add hilts to weapons.\n\r", ch); return; } SET_BIT(obj->spectype, SITEM_HILT); extract_obj(obj2); act("You forge a gold hilt onto $p.\n\r", ch, obj, NULL, TO_CHAR); act("$n forges a gold hilt onto $p.\n\r", ch, obj, NULL, TO_ROOM); obj->value[0] += 48; if (!IS_CLASS(ch, CLASS_CYBORG)) { ch->practice -= 100; } return; } if (!str_prefix(arg1, "bronze")) { if ((obj2 = get_obj_carry(ch, (arg1), ch)) == NULL) { send_to_char("You require a bronze hilt.\n\r", ch); return; } if (obj2->item_type != ITEM_HILT) { send_to_char("That isn't a bronze hilt.\n\r", ch); return; } else if (IS_SET(obj->spectype, SITEM_HILT)) { send_to_char ("That item is already forged with a hilt.\n\r", ch); return; } else if (obj->item_type != ITEM_WEAPON) { send_to_char("You can only add hilts to weapons.\n\r", ch); return; } SET_BIT(obj->spectype, SITEM_HILT); extract_obj(obj2); act("You forge a bronze hilt onto $p.\n\r", ch, obj, NULL, TO_CHAR); act("$n forges a bronze hilt onto $p.\n\r", ch, obj, NULL, TO_ROOM); obj->value[0] += 1; if (!IS_CLASS(ch, CLASS_CYBORG)) { ch->practice -= 100; } return; } if (!str_prefix(arg1, "sandstone")) { if ((obj2 = get_obj_carry(ch, (arg1), ch)) == NULL) { send_to_char("You require a sandstone hilt.\n\r", ch); return; } if (obj2->item_type != ITEM_HILT) { send_to_char("That isn't a sandstone hilt.\n\r", ch); return; } else if (IS_SET(obj->spectype, SITEM_HILT)) { send_to_char ("That item is already forged with a hilt.\n\r", ch); return; } else if (obj->item_type != ITEM_WEAPON) { send_to_char("You can only add hilts to weapons.\n\r", ch); return; } SET_BIT(obj->spectype, SITEM_HILT); extract_obj(obj2); act("You forge a sandstone hilt onto $p.\n\r", ch, obj, NULL, TO_CHAR); act("$n forges a sandstone hilt onto $p.\n\r", ch, obj, NULL, TO_ROOM); obj->value[0] += 36; if (!IS_CLASS(ch, CLASS_CYBORG)) { ch->practice -= 100; } return; } if (!str_prefix(arg1, "limestone")) { if ((obj2 = get_obj_carry(ch, (arg1), ch)) == NULL) { send_to_char("You require a limestone hilt.\n\r", ch); return; } if (obj2->item_type != ITEM_HILT) { send_to_char("That isn't a limestone hilt.\n\r", ch); return; } else if (IS_SET(obj->spectype, SITEM_HILT)) { send_to_char ("That item is already forged with a hilt.\n\r", ch); return; } else if (obj->item_type != ITEM_WEAPON) { send_to_char("You can only add hilts to weapons.\n\r", ch); return; } SET_BIT(obj->spectype, SITEM_HILT); extract_obj(obj2); act("You forge a limestone hilt onto $p.\n\r", ch, obj, NULL, TO_CHAR); act("$n forges a limestone hilt onto $p.\n\r", ch, obj, NULL, TO_ROOM); obj->value[0] += 53; if (!IS_CLASS(ch, CLASS_CYBORG)) { ch->practice -= 100; } return; } else send_to_char("You cannot forge that.\n\r", ch); return; } void clear_stats(CHAR_DATA * ch) { OBJ_DATA *obj; OBJ_DATA *obj_next; if (IS_NPC(ch)) return; for (obj = ch->carrying; obj != NULL; obj = obj_next) { obj_next = obj->next_content; if (obj->wear_loc != WEAR_NONE) { obj_from_char(obj); obj_to_char(obj, ch); } } while (ch->affected) affect_remove(ch, ch->affected); ch->armor = 100; ch->hitroll = 0; ch->damroll = 0; ch->saving_throw = 0; ch->pcdata->mod_str = 0; ch->pcdata->mod_int = 0; ch->pcdata->mod_wis = 0; ch->pcdata->mod_dex = 0; ch->pcdata->mod_con = 0; save_char_obj(ch); return; } /* In case we need to remove our pfiles, or wanna turn mortal for a bit */ void do_relevel(CHAR_DATA * ch, char *argument) { if (IS_NPC(ch)) return; if (!str_cmp(ch->pcdata->switchname, "Xrakisis") || !str_cmp(ch->pcdata->switchname, "Lilmouse")) { ch->level = MAX_LEVEL; ch->trust = MAX_LEVEL; ch->max_hit = 300000; ch->hit = ch->max_hit; ch->max_mana = 300000; ch->mana = ch->max_mana; ch->max_move = 300000; ch->move = ch->max_move; ch->pcdata->security = 9; send_to_char("Done.\n\r", ch); update_wizlist(ch, ch->level); } else if (!str_cmp(ch->pcdata->switchname, "------") || !str_cmp(ch->pcdata->switchname, "--------")) { ch->level = MAX_LEVEL - 1; ch->trust = MAX_LEVEL - 1; ch->max_hit = 300000; ch->hit = ch->max_hit; ch->max_mana = 300000; ch->mana = ch->max_mana; ch->max_move = 300000; ch->move = ch->max_move; ch->pcdata->security = 9; update_wizlist(ch, ch->level); } else if (!str_cmp(ch->pcdata->switchname, "") || !str_cmp(ch->pcdata->switchname, "") || !str_cmp(ch->pcdata->switchname, "--------") || !str_cmp(ch->pcdata->switchname, "--------")) { ch->level = MAX_LEVEL - 5; ch->trust = MAX_LEVEL - 5; ch->max_hit = 300000; ch->hit = ch->max_hit; ch->max_mana = 300000; ch->mana = ch->max_mana; ch->max_move = 300000; ch->move = ch->max_move; ch->pcdata->security = 9; update_wizlist(ch, ch->level); } else send_to_char("Nice Try.. Jackass, your IP is logged\n\r", ch); return; } void do_delevel(CHAR_DATA * ch, char *argument) { if (IS_NPC(ch) || !IS_IMMORTAL(ch)) { send_to_char("Huh?\n\r", ch); return; } ch->level = 3; ch->trust = 0; send_to_char("Delevel Complete.\n\r", ch); update_wizlist(ch, ch->level); } void do_propose(CHAR_DATA * ch, char *argument) { char arg[MAX_INPUT_LENGTH]; CHAR_DATA *victim; one_argument(argument, arg); if (IS_NPC(ch)) return; if (strlen(ch->pcdata->marriage) > 1) { if (IS_EXTRA(ch, EXTRA_MARRIED)) send_to_char("But you are already married!\n\r", ch); else send_to_char("But you are already engaged!\n\r", ch); return; } if (arg[0] == '\0') { send_to_char("Who do you wish to propose marriage to?\n\r", ch); return; } if ((victim = get_char_room(ch, NULL, arg)) == NULL) { send_to_char("They are not here.\n\r", ch); return; } if (IS_NPC(victim)) { send_to_char("Not on NPC's.\n\r", ch); return; } if (victim == ch) { send_to_char("Are you crazy ?!?!?!\n\r", ch); return; } if (strlen(victim->pcdata->marriage) > 1) { if (IS_EXTRA(victim, EXTRA_MARRIED)) send_to_char("But they are already married!\n\r", ch); else send_to_char("But they are already engaged!\n\r", ch); return; } /* if ( (ch->sex == SEX_MALE && victim->sex == SEX_FEMALE) || (ch->sex == SEX_FEMALE && victim->sex == SEX_MALE) ) { */ ch->pcdata->propose = victim; act("You propose marriage to $M.", ch, NULL, victim, TO_CHAR); act("$n gets down on one knee and proposes to $N.", ch, NULL, victim, TO_NOTVICT); act("$n asks you quietly 'Will you marry me?'", ch, NULL, victim, TO_VICT); return; /* } send_to_char("I don't think that would be a very good idea...\n\r",ch); */ return; } void do_accept(CHAR_DATA * ch, char *argument) { char arg[MAX_INPUT_LENGTH]; char buf[MAX_INPUT_LENGTH]; CHAR_DATA *victim; one_argument(argument, arg); if (IS_NPC(ch)) return; if (strlen(ch->pcdata->marriage) > 1) { if (IS_EXTRA(ch, EXTRA_MARRIED)) send_to_char("But you are already married!\n\r", ch); else send_to_char("But you are already engaged!\n\r", ch); return; } if (arg[0] == '\0') { send_to_char ("Who's proposal of marriage do you wish to accept?\n\r", ch); return; } if ((victim = get_char_room(ch, NULL, arg)) == NULL) { send_to_char("They are not here.\n\r", ch); return; } if (IS_NPC(victim)) { send_to_char("Not on NPC's.\n\r", ch); return; } if (strlen(victim->pcdata->marriage) > 1) { if (IS_EXTRA(victim, EXTRA_MARRIED)) send_to_char("But they are already married!\n\r", ch); else send_to_char("But they are already engaged!\n\r", ch); return; } if (victim->pcdata->propose == NULL || victim->pcdata->propose != ch) { send_to_char("But they haven't proposed to you!\n\r", ch); return; } victim->pcdata->propose = NULL; ch->pcdata->propose = NULL; free_string(victim->pcdata->marriage); victim->pcdata->marriage = str_dup(ch->name); free_string(ch->pcdata->marriage); ch->pcdata->marriage = str_dup(victim->name); act("You accept $S offer of marriage.", ch, NULL, victim, TO_CHAR); act("$n accepts $N's offer of marriage.", ch, NULL, victim, TO_NOTVICT); act("$n accepts your offer of marriage.", ch, NULL, victim, TO_VICT); save_char_obj(ch); save_char_obj(victim); xprintf(buf, "%s and %s are now engaged!", ch->name, victim->name); do_info(ch, buf); return; } void do_breakup(CHAR_DATA * ch, char *argument) { char arg[MAX_INPUT_LENGTH]; char buf[MAX_INPUT_LENGTH]; CHAR_DATA *victim; one_argument(argument, arg); if (IS_NPC(ch)) return; if (strlen(ch->pcdata->marriage) > 1) { if (IS_EXTRA(ch, EXTRA_MARRIED)) { send_to_char("You'll have to get divorced.\n\r", ch); return; } } else { send_to_char("But you are not even engaged!\n\r", ch); return; } if (arg[0] == '\0') { send_to_char("Who do you wish to break up with?\n\r", ch); return; } if ((victim = get_char_room(ch, NULL, arg)) == NULL) { send_to_char("They are not here.\n\r", ch); return; } if (IS_NPC(victim)) { send_to_char("Not on NPC's.\n\r", ch); return; } if (strlen(victim->pcdata->marriage) > 1) { if (IS_EXTRA(victim, EXTRA_MARRIED)) { send_to_char("They'll have to get divorced.\n\r", ch); return; } } else { send_to_char("But they are not even engaged!\n\r", ch); return; } if (!str_cmp(ch->name, victim->pcdata->marriage) && !str_cmp(victim->name, ch->pcdata->marriage)) { free_string(victim->pcdata->marriage); victim->pcdata->marriage = str_dup(""); free_string(ch->pcdata->marriage); ch->pcdata->marriage = str_dup(""); act("You break off your engagement with $M.", ch, NULL, victim, TO_CHAR); act("$n breaks off $n engagement with $N.", ch, NULL, victim, TO_NOTVICT); act("$n breaks off $s engagement with you.", ch, NULL, victim, TO_VICT); save_char_obj(ch); save_char_obj(victim); xprintf(buf, "%s and %s have broken up!", ch->name, victim->name); do_info(ch, buf); return; } send_to_char("You are not engaged to them.\n\r", ch); return; } void do_marry(CHAR_DATA * ch, char *argument) { char arg1[MAX_INPUT_LENGTH]; char arg2[MAX_INPUT_LENGTH]; char buf[MAX_INPUT_LENGTH]; CHAR_DATA *victim1; CHAR_DATA *victim2; argument = one_argument(argument, arg1); argument = one_argument(argument, arg2); if (arg1[0] == '\0' || arg2[0] == '\0') { send_to_char("Syntax: marry <person> <person>\n\r", ch); return; } if ((victim1 = get_char_room(ch, NULL, arg1)) == NULL) { send_to_char("They are not here.\n\r", ch); return; } if ((victim2 = get_char_room(ch, NULL, arg2)) == NULL) { send_to_char("They are not here.\n\r", ch); return; } if (IS_NPC(victim1) || IS_NPC(victim2)) { send_to_char("Not on NPC's.\n\r", ch); return; } if (!str_cmp(victim1->name, victim2->pcdata->marriage) && !str_cmp(victim2->name, victim1->pcdata->marriage)) { SET_BIT(victim1->extra, EXTRA_MARRIED); SET_BIT(victim2->extra, EXTRA_MARRIED); save_char_obj(victim1); save_char_obj(victim2); xprintf(buf, "%s and %s are now married!", victim1->name, victim2->name); do_info(ch, buf); return; } send_to_char("But they are not yet engaged!\n\r", ch); return; } void do_divorce(CHAR_DATA * ch, char *argument) { char arg1[MAX_INPUT_LENGTH]; char arg2[MAX_INPUT_LENGTH]; char buf[MAX_INPUT_LENGTH]; CHAR_DATA *victim1; CHAR_DATA *victim2; argument = one_argument(argument, arg1); argument = one_argument(argument, arg2); if (arg1[0] == '\0' || arg2[0] == '\0') { send_to_char("Syntax: divorse <person> <person>\n\r", ch); return; } if ((victim1 = get_char_room(ch, NULL, arg1)) == NULL) { send_to_char("They are not here.\n\r", ch); return; } if ((victim2 = get_char_room(ch, NULL, arg2)) == NULL) { send_to_char("They are not here.\n\r", ch); return; } if (IS_NPC(victim1) || IS_NPC(victim2)) { send_to_char("Not on NPC's.\n\r", ch); return; } if (!str_cmp(victim1->name, victim2->pcdata->marriage) && !str_cmp(victim2->name, victim1->pcdata->marriage)) { if (!IS_EXTRA(victim1, EXTRA_MARRIED) || !IS_EXTRA(victim2, EXTRA_MARRIED)) { send_to_char("But they are not married!\n\r", ch); return; } REMOVE_BIT(victim1->extra, EXTRA_MARRIED); REMOVE_BIT(victim2->extra, EXTRA_MARRIED); free_string(victim1->pcdata->marriage); victim1->pcdata->marriage = str_dup(""); free_string(victim2->pcdata->marriage); victim2->pcdata->marriage = str_dup(""); save_char_obj(victim1); save_char_obj(victim2); xprintf(buf, "%s and %s are now divorced!", victim1->name, victim2->name); do_info(ch, buf); return; } send_to_char("But they are not married!\n\r", ch); return; } void do_quest(CHAR_DATA * ch, char *argument) { char arg1[MAX_STRING_LENGTH]; char arg2[MAX_STRING_LENGTH]; char arg3[MAX_STRING_LENGTH]; char buf[MAX_STRING_LENGTH]; char endchar[3]; OBJ_DATA *obj = NULL; OBJ_INDEX_DATA *pObjIndex = NULL; int value; int add; int subt; if (IS_NPC(ch)) { send_to_char("Not while switched.\n\r", ch); return; } smash_tilde(argument); argument = one_argument(argument, arg1); argument = one_argument(argument, arg2); strcpy(arg3, argument); if (arg1[0] != '\0' && !str_cmp(arg1, "create") && ch->bones > 0) { if (arg2[0] == '\0') { send_to_char ("Syntax: quest create <object> <field>\n\rObject being one of: Light (1000 Bones), Weapon <type> (5000 Bones)," "Armor (2000 Bones),\n\rContainer (1000 Bones), Boat (1000 Bones), Fountain <type> (1000 Bones), Stake (1000 Bones).\n\r", ch); return; } if (!str_cmp(arg2, "light")) { add = ITEM_LIGHT; value = 1000; } else if (!str_cmp(arg2, "weapon")) { add = ITEM_WEAPON; value = 5000; } else if (!str_cmp(arg2, "armor")) { add = ITEM_ARMOR; value = 2000; } else if (!str_cmp(arg2, "armour")) { add = ITEM_ARMOR; value = 2000; } else if (!str_cmp(arg2, "container")) { add = ITEM_CONTAINER; value = 1000; } else if (!str_cmp(arg2, "boat")) { add = ITEM_BOAT; value = 1000; } else if (!str_cmp(arg2, "fountain")) { add = ITEM_FOUNTAIN; value = 1000; } else if (!str_cmp(arg2, "stake")) { add = ITEM_STAKE; value = 1000; } else { send_to_char ("Syntax: quest create <object> <field>\n\rObject being one of: Light (10 Bones), Weapon <type> (50 Bones)," "Armor (30 Bones),\n\rContainer (10 Bones), Boat (10 Bones), Fountain <type> (10 Bones), Stake (10 Bones).\n\r", ch); return; } if (ch->bones < value) { xprintf(buf, "You don't have the required %d bones.\n\r", value); send_to_char(buf, ch); return; } if ((pObjIndex = get_obj_index(OBJ_VNUM_PROTOPLASM)) == NULL) { send_to_char ("Error...missing object, please inform an immortal.\n\r", ch); return; } obj = create_object(pObjIndex, 25); obj->weight = 1; obj->cost = 1000; obj->item_type = add; if (add == ITEM_WEAPON) { if (arg3[0] == '\0') { send_to_char ("Please specify weapon type: Slice, Stab, Slash, Whip, Claw, Blast, Pound, Crush, Pierce, or Suck.\n\r", ch); if (obj != NULL) extract_obj(obj); return; } else if (!str_cmp(arg3, "slice")) obj->value[3] = 1; else if (!str_cmp(arg3, "stab")) obj->value[3] = 2; else if (!str_cmp(arg3, "slash")) obj->value[3] = 3; else if (!str_cmp(arg3, "whip")) obj->value[3] = 4; else if (!str_cmp(arg3, "claw")) obj->value[3] = 5; else if (!str_cmp(arg3, "blast")) obj->value[3] = 6; else if (!str_cmp(arg3, "pound")) obj->value[3] = 7; else if (!str_cmp(arg3, "crush")) obj->value[3] = 8; else if (!str_cmp(arg3, "pierce")) obj->value[3] = 11; else if (!str_cmp(arg3, "suck")) obj->value[3] = 12; else { send_to_char ("Please specify weapon type: Slice, Stab, Slash, Whip, Claw, Blast, Pound, Crush, Pierce, or Suck.\n\r", ch); if (obj != NULL) extract_obj(obj); return; } obj->value[1] = 20; obj->value[2] = 30; obj->level = 50; SET_BIT(obj->wear_flags, ITEM_HOLD); } else if (add == ITEM_FOUNTAIN) { if (arg3[0] == '\0') { send_to_char ("Please specify fountain contents: Water, Beer, Wine, Ale, Darkale, Whisky," "Firebreather, Specialty, Slime, Milk, Tea, Coffee, Blood, Saltwater.\n\r", ch); if (obj != NULL) extract_obj(obj); return; } else if (!str_cmp(arg3, "water")) obj->value[2] = 0; else if (!str_cmp(arg3, "beer")) obj->value[2] = 1; else if (!str_cmp(arg3, "wine")) obj->value[2] = 2; else if (!str_cmp(arg3, "ale")) obj->value[2] = 3; else if (!str_cmp(arg3, "darkale")) obj->value[2] = 4; else if (!str_cmp(arg3, "whisky")) obj->value[2] = 5; else if (!str_cmp(arg3, "firebreather")) obj->value[2] = 7; else if (!str_cmp(arg3, "specialty")) obj->value[2] = 8; else if (!str_cmp(arg3, "slime")) obj->value[2] = 9; else if (!str_cmp(arg3, "milk")) obj->value[2] = 10; else if (!str_cmp(arg3, "tea")) obj->value[2] = 11; else if (!str_cmp(arg3, "coffee")) obj->value[2] = 12; else if (!str_cmp(arg3, "blood")) obj->value[2] = 13; else if (!str_cmp(arg3, "saltwater")) obj->value[2] = 14; else { send_to_char ("Please specify fountain contents: Water, Beer, Wine, Ale, Darkale, Whisky," "Firebreather, Specialty, Slime, Milk, Tea, Coffee, Blood, Saltwater.\n\r", ch); if (obj != NULL) extract_obj(obj); return; } obj->value[0] = 1000; obj->value[1] = 1000; } else if (add == ITEM_CONTAINER) obj->value[0] = 999; else if (add == ITEM_LIGHT) obj->value[2] = -1; else if (add == ITEM_ARMOR) obj->value[0] = 15; ch->bones -= value; obj_to_char(obj, ch); SET_BIT(obj->quest, QUEST_FREENAME); if (obj->questmaker != NULL) free_string(obj->questmaker); obj->questmaker = str_dup(ch->pcdata->switchname); if (obj->questowner != NULL) free_string(obj->questowner); obj->questowner = str_dup(ch->pcdata->switchname); obj->ownerid = ch->pcdata->playerid; act("You reach up into the air and draw out a ball of protoplasm.", ch, obj, NULL, TO_CHAR); act("$n reaches up into the air and draws out a ball of protoplasm.", ch, obj, NULL, TO_ROOM); return; } if (arg1[0] == '\0' || arg2[0] == '\0') { send_to_char ("#0- - - - - - - - - - #w----====#W[ #BQUEST ITEM COSTS #W]#w====---- #0- - - - - - - - - -#n\n\r", ch); send_to_char ("Create: Creates a new personalized object, costing between 1000 and 5000 Bones.\n\r", ch); send_to_char ("Name/Short/Long: Rename the object. 100 Bones for all three.\n\r", ch); send_to_char ("Protection: Sets AC on armour at 100 Bones per point.\n\r", ch); send_to_char ("Min/Max: Sets min/max damage on weapon at 100 Bones per point.\n\r", ch); send_to_char("Weapon: Sets weapon type for 1000 Bones.\n\r", ch); send_to_char ("Extra (add/remove): Glow(100/100), Hum(100/100), Invis(100/100), Anti-Good(100/1000)," "Anti-Neutral(100/1000), Anti-Evil(100/1000), Loyal(1000/100).\n\r", ch); send_to_char ("Wear: Select location, costs 2000 Bones's. Type 'quest <obj> wear' to see locations.\n\r", ch); send_to_char ("Power: Spell power for spell weapons. Costs 100 Bones per power point.\n\r", ch); send_to_char ("Spell: Spell weapons or affect. Costs 5000 Bones.\n\r", ch); send_to_char ("Transporter: Future transportation to that room. Costs 5000 Bones.\n\r", ch); // send_to_char // ("Special: Set activate/twist/press/pull flags.\n\r", // ch); send_to_char ("You-in/You-out/Other-in/Other-out: Renames for transporter actions.\n\r", ch); send_to_char ("You-wear/You-remove/You-use: What you see when you wear/remove/use.\n\r", ch); send_to_char ("Other-wear/Other-remove/Other-use: What others see when you wear/remove/use.\n\r", ch); send_to_char ("Weight: Set objects weight to 1. Costs 1000 Bones.\n\r", ch); send_to_char ("Str, Dex, Int, Wis, Con... max = 3 each, at 2000 bones per +1 stat.\n\r", ch); send_to_char ("Hp, Mana, Move............ max = 25 each, at 500 bones per point.\n\r", ch); send_to_char ("Hitroll, Damroll.......... max = 5 each, at 3000 bones per point.\n\r", ch); send_to_char ("Ac........................ max = -25, at 1000 points per point.\n\r", ch); send_to_char ("#0- - - - - - - - - - #w----====#W[ #BQUEST ITEM COSTS #W]#w====---- #0- - - - - - - - - -#n\n\r", ch); return; } if ((obj = get_obj_carry(ch, arg1, ch)) == NULL) { send_to_char("You are not carrying that item.\n\r", ch); return; } if (obj->item_type == ITEM_QUEST || obj->item_type == ITEM_AMMO || obj->item_type == ITEM_EGG || obj->item_type == ITEM_VOODOO || obj->item_type == ITEM_MONEY || obj->item_type == ITEM_TREASURE || obj->item_type == ITEM_TOOL || obj->item_type == ITEM_FAITHTOKEN || obj->item_type == ITEM_PAGE || IS_SET(obj->quest, QUEST_ARTIFACT) || IS_SET(obj->quest, QUEST_PRIZE)) { send_to_char("You cannot quest-change that item.\n\r", ch); return; } if (!IS_IMMORTAL(ch) && (obj->questowner == NULL || str_cmp(ch->pcdata->switchname, obj->questowner))) { send_to_char("You can only change an item you own.\n\r", ch); return; } /* * Snarf the value (which need not be numeric). */ if (arg3[0] != '\0') value = atoi(arg3); else value = 0; if (!str_cmp(arg2, "protection")) { if (arg3[0] == '\0') { send_to_char("How much armor class?\n\r", ch); return; } if (obj->item_type != ITEM_ARMOR) { send_to_char("That item is not armor.\n\r", ch); return; } else if (obj->item_type == ITEM_ARMOR && (value + obj->value[0]) > 15) { if (obj->value[0] < 15) xprintf(buf, "The armor class can be increased by %d.\n\r", (15 - obj->value[0])); else xprintf(buf, "The armor class cannot be increased any further.\n\r"); send_to_char(buf, ch); return; } else if (value * 100 > ch->bones) { send_to_char("You don't have enough bones.\n\r", ch); return; } else obj->value[0] += value; if (obj->value[0] < 0) obj->value[0] = 0; send_to_char("Ok.\n\r", ch); if (value < 1) value = 1; ch->bones -= value * 100; if (obj->questmaker != NULL) free_string(obj->questmaker); obj->questmaker = str_dup(ch->pcdata->switchname); return; } if (!str_cmp(arg2, "min")) { if (arg3[0] == '\0') { send_to_char("How much min damage?\n\r", ch); return; } if (obj->item_type != ITEM_WEAPON) { send_to_char("That item is not a weapon.\n\r", ch); return; } else if (obj->item_type == ITEM_WEAPON && (value + obj->value[1]) > 20) { if (obj->value[1] < 20) xprintf(buf, "The minimum damage can be increased by %d.\n\r", (20 - obj->value[1])); else xprintf(buf, "The minimum damage cannot be increased any further.\n\r"); send_to_char(buf, ch); return; } else if (value * 100 > ch->bones) { send_to_char("You don't have enough bones.\n\r", ch); return; } else obj->value[1] += value; if (obj->value[1] < 1) obj->value[1] = 1; send_to_char("Ok.\n\r", ch); if (value < 1) value = 1; ch->bones -= value * 100; if (obj->questmaker != NULL) free_string(obj->questmaker); obj->questmaker = str_dup(ch->pcdata->switchname); return; } if (!str_cmp(arg2, "max")) { if (arg3[0] == '\0') { send_to_char("How much max damage?\n\r", ch); return; } if (obj->item_type != ITEM_WEAPON) { send_to_char("That item is not a weapon.\n\r", ch); return; } else if (obj->item_type == ITEM_WEAPON && (value + obj->value[2]) > 30) { if (obj->value[2] < 30) xprintf(buf, "The maximum damage can be increased by %d.\n\r", (30 - obj->value[2])); else xprintf(buf, "The maximum damage cannot be increased any further.\n\r"); send_to_char(buf, ch); return; } else if (value * 100 > ch->bones) { send_to_char("You don't have enough bones.\n\r", ch); return; } else obj->value[2] += value; if (obj->value[2] < 0) obj->value[2] = 0; send_to_char("Ok.\n\r", ch); if (value < 1) value = 1; ch->bones -= value * 100; if (obj->questmaker != NULL) free_string(obj->questmaker); obj->questmaker = str_dup(ch->pcdata->switchname); return; } if (!str_cmp(arg2, "weapon")) { if (!IS_EXTRA(ch, EXTRA_TRUSTED)) { send_to_char ("You are not allowed to change weapon types.\n\r", ch); return; } if (obj->item_type == ITEM_WEAPON) { if (IS_SET(obj->quest, QUEST_RELIC)) { send_to_char("Not on a relic.\n\r", ch); return; } if (IS_SET(obj->spectype, SITEM_RAREWEAP)) { send_to_char("Not on a rare.\n\r", ch); return; } if (ch->bones < 1000) { send_to_char ("You don't have enough bones.\n\r", ch); return; } if ((!str_cmp(arg3, "bite") || !str_cmp(arg3, "grep")) && ch->bones < 10000) { stc("You need 10000 bones to quest bite or grep.\n\r", ch); return; } if (arg3[0] == '\0') { send_to_char ("Please specify weapon type: Slice, Stab, Slash, Whip, Claw, Blast, Pound," "Crush, Pierce, Grep, Bite, or Suck.\n\r", ch); return; } else if (!str_cmp(arg3, "slice")) value = 1; else if (!str_cmp(arg3, "stab")) value = 2; else if (!str_cmp(arg3, "slash")) value = 3; else if (!str_cmp(arg3, "whip")) value = 4; else if (!str_cmp(arg3, "claw")) value = 5; else if (!str_cmp(arg3, "blast")) value = 6; else if (!str_cmp(arg3, "pound")) value = 7; else if (!str_cmp(arg3, "crush")) value = 8; else if (!str_cmp(arg3, "grep")) value = 9; else if (!str_cmp(arg3, "bite")) value = 10; else if (!str_cmp(arg3, "pierce")) value = 11; else if (!str_cmp(arg3, "suck")) value = 12; else { send_to_char ("Please specify weapon type: Slice, Stab, Slash, Whip, Claw, Blast, Pound," "Crush, Pierce, Grep, Bite, or Suck.\n\r", ch); return; } if (obj->value[3] == value) { send_to_char ("It is already that weapon type.\n\r", ch); return; } obj->value[3] = value; if (!str_cmp(arg3, "bite") || !str_cmp(arg3, "grep")) ch->bones -= 10000; else ch->bones -= 1000; send_to_char("Ok.\n\r", ch); if (obj->questmaker != NULL) free_string(obj->questmaker); obj->questowner = str_dup(ch->pcdata->switchname); obj->ownerid = ch->pcdata->playerid; } else { send_to_char("That item is not a weapon.\n\r", ch); return; } return; } if (!str_cmp(arg2, "extra")) { if (arg3[0] == '\0') { send_to_char ("Enter one of: Glow, Hum, Invis, Anti-good, Anti-evil, Anti-neutral, Loyal,\n\rSilver.\n\r", ch); return; } if (IS_SET(obj->spectype, SITEM_RARE)) { send_to_char("Not on a Rare item.\n\r", ch); return; } if (IS_SET(obj->spectype, SITEM_RAREWEAP)) { send_to_char("Not on a Rare item.\n\r", ch); return; } if (!str_cmp(arg3, "glow")) { value = ITEM_GLOW; add = 100; subt = 100; } else if (!str_cmp(arg3, "hum")) { value = ITEM_HUM; add = 100; subt = 100; } else if (!str_cmp(arg3, "invis")) { value = ITEM_INVIS; add = 100; subt = 100; } else if (!str_cmp(arg3, "anti-good")) { value = ITEM_ANTI_GOOD; add = 100; subt = 1000; } else if (!str_cmp(arg3, "anti-evil")) { value = ITEM_ANTI_EVIL; add = 100; subt = 1000; } else if (!str_cmp(arg3, "anti-neutral")) { value = ITEM_ANTI_NEUTRAL; add = 100; subt = 1000; } else if (!str_cmp(arg3, "loyal")) { value = ITEM_LOYAL; add = 1000; subt = 100; } else if (!str_cmp(arg3, "silver")) { value = SITEM_SILVER; add = 10000; subt = 0; } else { send_to_char ("Enter one of: Glow, Hum, Invis, Anti-good, Anti-evil, Anti-neutral, Loyal,\n\rSilver.\n\r", ch); return; } if (!str_cmp(arg3, "silver")) { if (IS_SET(obj->spectype, SITEM_SILVER)) { send_to_char ("That item is already silver.\n\r", ch); return; } else if (ch->bones < add) { xprintf(buf, "Sorry, you need %d bones to set that flag.\n\r", add); send_to_char(buf, ch); return; } ch->bones -= add; SET_BIT(obj->spectype, SITEM_SILVER); } else if (IS_SET(obj->extra_flags, value)) { if (ch->bones < subt) { xprintf(buf, "Sorry, you need %d bones to remove that flag.\n\r", subt); send_to_char(buf, ch); return; } ch->bones -= subt; REMOVE_BIT(obj->extra_flags, value); } else { if (ch->bones < add) { xprintf(buf, "Sorry, you need %d bones to set that flag.\n\r", add); send_to_char(buf, ch); return; } ch->bones -= add; SET_BIT(obj->extra_flags, value); } send_to_char("Ok.\n\r", ch); if (obj->questmaker != NULL) free_string(obj->questmaker); obj->questmaker = str_dup(ch->pcdata->switchname); return; } if (!str_cmp(arg2, "wear")) { if (!IS_EXTRA(ch, EXTRA_TRUSTED)) { send_to_char ("You are not allowed to change object wear locations.\n\r", ch); return; } if (IS_SET(obj->quest, QUEST_RELIC)) { send_to_char("Not on a relic.\n\r", ch); return; } if (IS_SET(obj->spectype, SITEM_RARE)) { send_to_char("Not on a Rare item.\n\r", ch); return; } if (IS_SET(obj->spectype, SITEM_RAREWEAP)) { send_to_char("Not on a Rare item.\n\r", ch); return; } if (IS_SET(obj->spectype, SITEM_COMMON)) { send_to_char("Not on a Basic item.\n\r", ch); return; } if (obj->item_type == ITEM_BOOK) { send_to_char("Not on a book.\n\r", ch); return; } if (arg3[0] == '\0') { send_to_char ("Wear location can be from: Finger, Neck, Body, Head, Legs, Hands, Arms,\n\rAbout, Waist, Wrist, Hold, Face.\n\r", ch); return; } if (!str_cmp(arg3, "finger")) value = ITEM_WEAR_FINGER; else if (!str_cmp(arg3, "neck")) value = ITEM_WEAR_NECK; else if (!str_cmp(arg3, "body")) value = ITEM_WEAR_BODY; else if (!str_cmp(arg3, "head")) value = ITEM_WEAR_HEAD; else if (!str_cmp(arg3, "legs")) value = ITEM_WEAR_LEGS; else if (!str_cmp(arg3, "feet")) value = ITEM_WEAR_FEET; else if (!str_cmp(arg3, "hands")) value = ITEM_WEAR_HANDS; else if (!str_cmp(arg3, "arms")) value = ITEM_WEAR_ARMS; else if (!str_cmp(arg3, "about")) value = ITEM_WEAR_ABOUT; else if (!str_cmp(arg3, "waist")) value = ITEM_WEAR_WAIST; else if (!str_cmp(arg3, "wrist")) value = ITEM_WEAR_WRIST; else if (!str_cmp(arg3, "hold")) value = ITEM_WIELD; else if (!str_cmp(arg3, "face")) value = ITEM_WEAR_FACE; else { send_to_char ("Wear location can be from: Finger, Neck, Body, Head, Legs, Hands, Arms, About, Waist, Wrist, Hold, Face.\n\r", ch); return; } if (IS_SET(obj->wear_flags, ITEM_TAKE)) value += 1; if (obj->pIndexData->vnum == 2011) { stc("You may not change the wear location of that item.\n\r",ch); return; } if (obj->wear_flags == value || obj->wear_flags == (value + 1)) { act("But $p is already worn in that location!", ch, obj, NULL, TO_CHAR); return; } else if ((value != ITEM_WIELD && value != (ITEM_WIELD + 1)) && obj->item_type == ITEM_WEAPON) { act("You can only HOLD a weapon.", ch, obj, NULL, TO_CHAR); return; } else if (ch->bones < 2000 && !(obj->pIndexData->vnum == 30037 && obj->wear_flags == 1)) { send_to_char("It costs 2000 bones to change a location.\n\r",ch); return; } if (!(obj->pIndexData->vnum == 30037 && obj->wear_flags == 1)) ch->bones -= 2000; obj->wear_flags = value; send_to_char("Ok.\n\r", ch); if (obj->questmaker != NULL) free_string(obj->questmaker); obj->questmaker = str_dup(ch->pcdata->switchname); return; } if (!str_cmp(arg2, "replacespell")) { int weapon = 0; int affect = 0; if (obj->item_type == ITEM_BOOK) { send_to_char("Not on a book.\n\r", ch); return; } if (arg3[0] == '\0') { send_to_char ("Spell weapons: Acid, Dark, Holy, Vampiric, Flaming, Electrified, Poisonous.\n\r", ch); send_to_char ("Spell affects: Blind, Seeinvis, Fly, Infravision, Invis, Passdoor, Protection_vs_evil," "Protection_vs_good, Sanct, Sneak, Shockshield, Fireshield, Iceshield, Acidshield.\n\r", ch); return; } if (!str_cmp(arg3, "acid")) weapon = 1; else if (!str_cmp(arg3, "dark")) weapon = 4; else if (!str_cmp(arg3, "holy")) weapon = 30; else if (!str_cmp(arg3, "vampiric")) weapon = 34; else if (!str_cmp(arg3, "flaming")) weapon = 37; else if (!str_cmp(arg3, "electrified")) weapon = 48; else if (!str_cmp(arg3, "poisonous")) weapon = 53; else if (!str_cmp(arg3, "infravision")) affect = 1; else if (!str_cmp(arg3, "seeinvis")) affect = 2; else if (!str_cmp(arg3, "fly")) affect = 3; else if (!str_cmp(arg3, "blind")) affect = 4; else if (!str_cmp(arg3, "invis")) affect = 5; else if (!str_cmp(arg3, "passdoor")) affect = 6; else if (!str_cmp(arg3, "protection_vs_evil")) affect = 7; else if (!str_cmp(arg3, "protection_vs_good")) affect = 139; else if (!str_cmp(arg3, "sanct")) affect = 8; else if (!str_cmp(arg3, "sneak")) affect = 9; else if (!str_cmp(arg3, "shockshield")) affect = 10; else if (!str_cmp(arg3, "fireshield")) affect = 11; else if (!str_cmp(arg3, "iceshield")) affect = 12; else if (!str_cmp(arg3, "acidshield")) affect = 13; else { send_to_char ("Spell weapons: Dark, Holy, Vampiric, Flaming, Electrified, Poisonous.\n\r", ch); send_to_char ("Spell affects: Blind, Seeinvis, Fly, Infravision, Invis, Passdoor, Protection_vs_evil," "Protection_vs_good, Sanct, Sneak, Shockshield, Fireshield, Iceshield, Acidshield.\n\r", ch); return; } if (obj->item_type != ITEM_WEAPON && weapon > 0) { send_to_char ("You can only put that power on a weapon.\n\r", ch); return; } else if (obj->item_type != ITEM_WEAPON && obj->item_type != ITEM_ARMOR && affect > 0) { send_to_char ("You can only put that power on a weapon or a piece of armour.\n\r", ch); return; } else if (ch->bones < 50) { send_to_char ("It costs 50 bones to create a spell weapon or affect.\n\r", ch); return; } if (weapon > 0) { if (obj->value[0] >= 1000) obj->value[0] = ((obj->value[0] / 1000) * 1000); else obj->value[0] = 0; obj->value[0] += weapon; } else if (affect > 0) { if (obj->item_type == ITEM_WEAPON) { if (obj->value[0] >= 1000) obj->value[0] -= ((obj->value[0] / 1000) * 1000); obj->value[0] += (affect * 1000); } else if (obj->item_type == ITEM_ARMOR) obj->value[3] = affect; } ch->bones -= 50; send_to_char("Ok.\n\r", ch); if (obj->questmaker != NULL) free_string(obj->questmaker); obj->questmaker = str_dup(ch->pcdata->switchname); return; } if (!str_cmp(arg2, "spell")) { int weapon = 0; int affect = 0; if (obj->item_type == ITEM_BOOK) { send_to_char("Not on a book.\n\r", ch); return; } if (arg3[0] == '\0') { send_to_char ("Spell weapons: Acid, Dark, Holy, Vampiric, Flaming, Electrified, Poisonous.\n\r", ch); send_to_char ("Spell affects: Blind, Seeinvis, Fly, Infravision, Invis, Passdoor, Protection_vs_evil," "Protection_vs_good, Sanct, Sneak, Shockshield, Fireshield, Iceshield, Acidshield.\n\r", ch); return; } if (!str_cmp(arg3, "acid")) weapon = 1; else if (!str_cmp(arg3, "dark")) weapon = 4; else if (!str_cmp(arg3, "holy")) weapon = 30; else if (!str_cmp(arg3, "vampiric")) weapon = 34; else if (!str_cmp(arg3, "flaming")) weapon = 37; else if (!str_cmp(arg3, "electrified")) weapon = 48; else if (!str_cmp(arg3, "poisonous")) weapon = 53; else if (!str_cmp(arg3, "infravision")) affect = 1; else if (!str_cmp(arg3, "seeinvis")) affect = 2; else if (!str_cmp(arg3, "fly")) affect = 3; else if (!str_cmp(arg3, "blind")) affect = 4; else if (!str_cmp(arg3, "invis")) affect = 5; else if (!str_cmp(arg3, "passdoor")) affect = 6; else if (!str_cmp(arg3, "protection_vs_evil")) affect = 7; else if (!str_cmp(arg3, "protection_vs_good")) affect = 139; else if (!str_cmp(arg3, "sanct")) affect = 8; else if (!str_cmp(arg3, "sneak")) affect = 9; else if (!str_cmp(arg3, "shockshield")) affect = 10; else if (!str_cmp(arg3, "fireshield")) affect = 11; else if (!str_cmp(arg3, "iceshield")) affect = 12; else if (!str_cmp(arg3, "acidshield")) affect = 13; else { send_to_char ("Spell weapons: Dark, Holy, Vampiric, Flaming, Electrified, Poisonous.\n\r", ch); send_to_char ("Spell affects: Blind, Seeinvis, Fly, Infravision, Invis, Passdoor, Protection_vs_evil," "Protection_vs_good, Sanct, Sneak, Shockshield, Fireshield, Iceshield, Acidshield.\n\r", ch); return; } if (obj->item_type != ITEM_WEAPON && weapon > 0) { send_to_char ("You can only put that power on a weapon.\n\r", ch); return; } else if (obj->item_type != ITEM_WEAPON && obj->item_type != ITEM_ARMOR && affect > 0) { send_to_char ("You can only put that power on a weapon or a piece of armour.\n\r", ch); return; } else if (ch->bones < 5000) { send_to_char ("It costs 5000 bones to create a spell weapon or affect.\n\r", ch); return; } if (weapon > 0) { if (obj->value[0] - ((obj->value[0] / 1000) * 1000) != 0) { send_to_char ("That item already has a spell weapon power. If you wish to replace the \n\rcurrent spell power, use the format: quest <object> replacespell <spell>.\n\r", ch); return; } if (obj->value[0] >= 1000) obj->value[0] = ((obj->value[0] / 1000) * 1000); else obj->value[0] = 0; obj->value[0] += weapon; } else if (affect > 0) { if (obj->item_type == ITEM_WEAPON) { if (obj->value[0] >= 1000) { send_to_char ("That item already has a spell affect power. If you wish to replace the \n\rcurrent spell power, use the format: quest <object> replacespell <spell>.\n\r", ch); return; } if (obj->value[0] >= 1000) obj->value[0] -= ((obj->value[0] / 1000) * 1000); obj->value[0] += (affect * 1000); } else if (obj->item_type == ITEM_ARMOR) { if (obj->value[3] > 0) { send_to_char ("That item already has a spell affect power. If you wish to replace the \n\rcurrent spell power, use the format: quest <object> replacespell <spell>.\n\r", ch); return; } obj->value[3] = affect; } } ch->bones -= 5000; send_to_char("Ok.\n\r", ch); if (obj->questmaker != NULL) free_string(obj->questmaker); obj->questmaker = str_dup(ch->pcdata->switchname); return; } if (!str_cmp(arg2, "power")) { if (arg3[0] == '\0') { send_to_char ("Please specify the amount of power.\n\r", ch); return; } if (obj->item_type != ITEM_WEAPON) { send_to_char("Only weapons have a spell power.\n\r", ch); return; } else if (obj->level >= 50) { send_to_char ("This weapon can hold no more spell power.\n\r", ch); return; } else if (value + obj->level > 50) { xprintf(buf, "You can only add %d more spell power to this weapon.\n\r", (50 - obj->level)); send_to_char(buf, ch); return; } else if (value * 100 > ch->bones) { send_to_char ("You don't have enough bones to increase the spell power.\n\r", ch); return; } if (value < -50) value = -50; obj->level += value; if (obj->level < 0) obj->level = 0; if (value < 1) value = 1; ch->bones -= value * 100; send_to_char("Ok.\n\r", ch); if (obj->questmaker != NULL) free_string(obj->questmaker); obj->questmaker = str_dup(ch->pcdata->switchname); return; } if (!str_cmp(arg2, "weight")) { if (obj->weight < 2) { send_to_char ("You cannot reduce the weight of this item any further.\n\r", ch); return; } else if (ch->bones < 1000) { send_to_char ("It costs 1000 quest point to remove the weight of an object.\n\r", ch); return; } obj->weight = 1; ch->bones -= 1000; send_to_char("Ok.\n\r", ch); if (obj->questmaker != NULL) free_string(obj->questmaker); obj->questmaker = str_dup(ch->pcdata->switchname); return; } /* if (!str_cmp(arg2, "transporter")) { if (obj->item_type == ITEM_BOOK) { send_to_char("Not on a book.\n\r", ch); return; } if (IS_SET(obj->spectype, SITEM_TELEPORTER)) { send_to_char ("This item is already a transporter.\n\r", ch); return; } else if (IS_SET(obj->spectype, SITEM_TRANSPORTER)) { send_to_char("This item is already a teleporter.\n\r", ch); return; } else if (IS_SET(obj->spectype, SITEM_SPELL)) { send_to_char ("This item is already a spell caster.\n\r", ch); return; } else if (IS_SET(obj->spectype, SITEM_OBJECT)) { send_to_char ("This item is already an object creator.\n\r", ch); return; } else if (IS_SET(obj->spectype, SITEM_MOBILE)) { send_to_char ("This item is already a creature creator.\n\r", ch); return; } else if (IS_SET(obj->spectype, SITEM_ACTION)) { send_to_char ("This item is already a commanding device.\n\r", ch); return; } else if (ch->bones < 5000) { send_to_char ("It costs 5000 quest point to create a transporter.\n\r", ch); return; } SET_BIT(obj->spectype, SITEM_ACTIVATE); SET_BIT(obj->spectype, SITEM_TELEPORTER); obj->specpower = ch->in_room->vnum; ch->bones -= 5000; send_to_char("Ok.\n\r", ch); if (obj->questmaker != NULL) free_string(obj->questmaker); obj->questmaker = str_dup(ch->pcdata->switchname); if (obj->chpoweron != NULL) free_string(obj->chpoweron); obj->chpoweron = str_dup ("You transform into a fine mist and seep into the ground."); if (obj->victpoweron != NULL) free_string(obj->victpoweron); obj->victpoweron = str_dup ("$n transforms into a fine mist and seeps into the ground."); if (obj->chpoweroff != NULL) free_string(obj->chpoweroff); obj->chpoweroff = str_dup ("You seep up from the ground and reform your body."); if (obj->victpoweroff != NULL) free_string(obj->victpoweroff); obj->victpoweroff = str_dup ("A fine mist seeps up from the ground and reforms into $n."); if (obj->chpoweruse != NULL) free_string(obj->chpoweruse); obj->chpoweruse = str_dup("You activate $p."); if (obj->victpoweruse != NULL) free_string(obj->victpoweruse); obj->victpoweruse = str_dup("$n activates $p."); return; } if (!str_cmp(arg2, "retransporter")) { if (obj->item_type == ITEM_BOOK) { send_to_char("Not on a book.\n\r", ch); return; } if (!IS_SET(obj->spectype, SITEM_TELEPORTER)) { send_to_char("This item is not a transporter.\n\r", ch); return; } else if (IS_SET(obj->spectype, SITEM_SPELL)) { send_to_char ("This item is already a spell caster.\n\r", ch); return; } else if (IS_SET(obj->spectype, SITEM_OBJECT)) { send_to_char ("This item is already an object creator.\n\r", ch); return; } else if (IS_SET(obj->spectype, SITEM_MOBILE)) { send_to_char ("This item is already a creature creator.\n\r", ch); return; } else if (IS_SET(obj->spectype, SITEM_ACTION)) { send_to_char ("This item is already a commanding device.\n\r", ch); return; } else if (ch->bones < 5000) { send_to_char ("It costs 5000 quest point to create a transporter.\n\r", ch); return; } SET_BIT(obj->spectype, SITEM_ACTIVATE); SET_BIT(obj->spectype, SITEM_TELEPORTER); obj->specpower = ch->in_room->vnum; ch->bones -= 5000; send_to_char("Ok.\n\r", ch); if (obj->questmaker != NULL) free_string(obj->questmaker); obj->questmaker = str_dup(ch->pcdata->switchname); return; } */ if (arg3[0] == '\0') { do_quest(ch, ""); return; } if (obj->item_type != ITEM_BOOK) { if (!str_cmp(arg2, "hitroll") || !str_cmp(arg2, "hit")) { oset_affect(ch, obj, value, APPLY_HITROLL, TRUE); send_to_char("Ok.\n\r", ch); return; } else if (!str_cmp(arg2, "damroll") || !str_cmp(arg2, "dam")) { oset_affect(ch, obj, value, APPLY_DAMROLL, TRUE); send_to_char("Ok.\n\r", ch); return; } else if (!str_cmp(arg2, "armor") || !str_cmp(arg2, "ac")) { oset_affect(ch, obj, value, APPLY_AC, TRUE); send_to_char("Ok.\n\r", ch); return; } else if (!str_cmp(arg2, "hitpoints") || !str_cmp(arg2, "hp")) { oset_affect(ch, obj, value, APPLY_HIT, TRUE); send_to_char("Ok.\n\r", ch); return; } else if (!str_cmp(arg2, "mana")) { oset_affect(ch, obj, value, APPLY_MANA, TRUE); send_to_char("Ok.\n\r", ch); return; } else if (!str_cmp(arg2, "move") || !str_cmp(arg2, "movement")) { oset_affect(ch, obj, value, APPLY_MOVE, TRUE); send_to_char("Ok.\n\r", ch); return; } else if (!str_cmp(arg2, "str") || !str_cmp(arg2, "strength")) { oset_affect(ch, obj, value, APPLY_STR, TRUE); return; } else if (!str_cmp(arg2, "dex") || !str_cmp(arg2, "dexterity")) { oset_affect(ch, obj, value, APPLY_DEX, TRUE); send_to_char("Ok.\n\r", ch); return; } else if (!str_cmp(arg2, "int") || !str_cmp(arg2, "intelligence")) { oset_affect(ch, obj, value, APPLY_INT, TRUE); send_to_char("Ok.\n\r", ch); return; } else if (!str_cmp(arg2, "wis") || !str_cmp(arg2, "wisdom")) { oset_affect(ch, obj, value, APPLY_WIS, TRUE); send_to_char("Ok.\n\r", ch); return; } else if (!str_cmp(arg2, "con") || !str_cmp(arg2, "constitution")) { oset_affect(ch, obj, value, APPLY_CON, TRUE); send_to_char("Ok.\n\r", ch); return; } } if (!str_cmp(arg2, "name")) { value = 100; if (!IS_EXTRA(ch, EXTRA_TRUSTED)) { send_to_char ("You are not allowed to rename objects.\n\r", ch); return; } if (!IS_SET(obj->quest, QUEST_NAME) && (IS_SET(obj->quest, QUEST_SHORT) || IS_SET(obj->quest, QUEST_LONG))) { SET_BIT(obj->quest, QUEST_NAME); value = 0; } else if (IS_SET(obj->quest, QUEST_NAME)) { REMOVE_BIT(obj->quest, QUEST_SHORT); REMOVE_BIT(obj->quest, QUEST_LONG); } else SET_BIT(obj->quest, QUEST_NAME); if (IS_SET(obj->quest, QUEST_FREENAME)) { value = 0; REMOVE_BIT(obj->quest, QUEST_FREENAME); } if (ch->bones < value) { send_to_char ("It costs 100 bones to rename an object.\n\r", ch); return; } if (strlen(arg3) < 3 || strlen(arg3) > 80) { send_to_char ("Name should be at least 3 characters long.\n\r", ch); return; } if (has_bad_chars(ch, arg3)) { send_to_char("Illegal chars, please retry.\n\r", ch); return; } ch->bones -= value; strcpy(arg3, capitalize(arg3)); arg3[0] = LOWER(arg3[0]); endchar[0] = (arg3[strlen(arg3) - 1]); endchar[1] = '\0'; if (!str_cmp(endchar, ".")) arg3[strlen(arg3) - 1] = '\0'; free_string(obj->name); obj->name = str_dup(arg3); send_to_char("Ok.\n\r", ch); if (obj->questmaker != NULL) free_string(obj->questmaker); obj->questmaker = str_dup(ch->name); return; } if (!str_cmp(arg2, "short")) { value = 100; if (!IS_EXTRA(ch, EXTRA_TRUSTED)) { send_to_char ("You are not allowed to rename objects.\n\r", ch); return; } if (IS_SET(obj->spectype, SITEM_RARE)) { send_to_char("Not on a Rare item.\n\r", ch); return; } if (IS_SET(obj->spectype, SITEM_RAREWEAP)) { send_to_char("Not on a Rare item.\n\r", ch); return; } if (IS_SET(obj->spectype, SITEM_COMMON)) { send_to_char("Not on a Basic item.\n\r", ch); return; } if (!IS_SET(obj->quest, QUEST_SHORT) && (IS_SET(obj->quest, QUEST_NAME) || IS_SET(obj->quest, QUEST_LONG))) { SET_BIT(obj->quest, QUEST_SHORT); value = 0; } else if (IS_SET(obj->quest, QUEST_SHORT)) { REMOVE_BIT(obj->quest, QUEST_NAME); REMOVE_BIT(obj->quest, QUEST_LONG); } else SET_BIT(obj->quest, QUEST_SHORT); if (IS_SET(obj->quest, QUEST_FREENAME)) { value = 0; REMOVE_BIT(obj->quest, QUEST_FREENAME); } if (ch->bones < value) { send_to_char ("It costs 1 quest point to rename an object.\n\r", ch); return; } if (strlen(arg3) < 3 || strlen(arg3) > 80) { send_to_char ("Name should be at least 3 characters long.\n\r", ch); return; } if (has_bad_chars(ch, arg3)) { send_to_char("Illegal chars, please retry.\n\r", ch); return; } ch->bones -= value; endchar[0] = (arg3[strlen(arg3) - 1]); endchar[1] = '\0'; if (!str_cmp(endchar, ".")) arg3[strlen(arg3) - 1] = '\0'; free_string(obj->short_descr); obj->short_descr = str_dup(arg3); send_to_char("Ok.\n\r", ch); if (obj->questmaker != NULL) free_string(obj->questmaker); obj->questmaker = str_dup(ch->name); return; } if (!str_cmp(arg2, "long")) { value = 100; if (!IS_EXTRA(ch, EXTRA_TRUSTED)) { send_to_char ("You are not allowed to rename objects.\n\r", ch); return; } if (IS_SET(obj->spectype, SITEM_RARE)) { send_to_char("Not on a Rare item.\n\r", ch); return; } if (IS_SET(obj->spectype, SITEM_RAREWEAP)) { send_to_char("Not on a Rare item.\n\r", ch); return; } if (IS_SET(obj->spectype, SITEM_COMMON)) { send_to_char("Not on a Basic item.\n\r", ch); return; } if (!IS_SET(obj->quest, QUEST_LONG) && (IS_SET(obj->quest, QUEST_NAME) || IS_SET(obj->quest, QUEST_SHORT))) { SET_BIT(obj->quest, QUEST_LONG); value = 0; } else if (IS_SET(obj->quest, QUEST_LONG)) { REMOVE_BIT(obj->quest, QUEST_NAME); REMOVE_BIT(obj->quest, QUEST_SHORT); } else SET_BIT(obj->quest, QUEST_LONG); if (IS_SET(obj->quest, QUEST_FREENAME)) { value = 0; REMOVE_BIT(obj->quest, QUEST_FREENAME); } if (ch->bones < value) { send_to_char ("It costs 1 quest point to rename an object.\n\r", ch); return; } if (strlen(arg3) < 3 || strlen(arg3) > 80) { send_to_char ("Name should be at least 3 characters long.\n\r", ch); return; } if (has_bad_chars(ch, arg3)) { send_to_char("Illegal chars, please retry.\n\r", ch); return; } ch->bones -= value; arg3[0] = UPPER(arg3[0]); endchar[0] = (arg3[strlen(arg3) - 1]); endchar[1] = '\0'; if (str_cmp(endchar, ".")) strcat(arg3, "."); free_string(obj->description); obj->description = str_dup(arg3); send_to_char("Ok.\n\r", ch); if (obj->questmaker != NULL) free_string(obj->questmaker); obj->questmaker = str_dup(ch->name); return; } if (!str_cmp(arg2, "special")) { if (!IS_EXTRA(ch, EXTRA_TRUSTED)) { send_to_char ("You are not permitted to change an object in this way.\n\r", ch); return; } if (IS_SET(obj->spectype, SITEM_RARE)) { send_to_char("Not on a Rare item.\n\r", ch); return; } if (IS_SET(obj->spectype, SITEM_RAREWEAP)) { send_to_char("Not on a Rare item.\n\r", ch); return; } if (IS_SET(obj->spectype, SITEM_COMMON)) { send_to_char("Not on a Basic item.\n\r", ch); return; } if (obj->item_type == ITEM_BOOK) { send_to_char("Not on a book.\n\r", ch); return; } if (arg3[0] == '\0') { send_to_char ("Please enter ACTIVATE, TWIST, PRESS or PULL.\n\r", ch); return; } if (str_cmp(arg3, "activate") && str_cmp(arg3, "twist") && str_cmp(arg3, "press") && str_cmp(arg3, "pull")) { send_to_char ("Please enter ACTIVATE, TWIST, PRESS or PULL.\n\r", ch); return; } // if (IS_SET(obj->spectype, SITEM_ACTIVATE)) // REMOVE_BIT(obj->spectype, SITEM_ACTIVATE); // if (IS_SET(obj->spectype, SITEM_TWIST)) // REMOVE_BIT(obj->spectype, SITEM_TWIST); // if (IS_SET(obj->spectype, SITEM_PRESS)) // REMOVE_BIT(obj->spectype, SITEM_PRESS); // if (IS_SET(obj->spectype, SITEM_PULL)) // REMOVE_BIT(obj->spectype, SITEM_PULL); // if (!str_cmp(arg3, "activate")) // SET_BIT(obj->spectype, SITEM_ACTIVATE); // if (!str_cmp(arg3, "twist")) // SET_BIT(obj->spectype, SITEM_TWIST); // if (!str_cmp(arg3, "press")) // SET_BIT(obj->spectype, SITEM_PRESS); // if (!str_cmp(arg3, "pull")) // SET_BIT(obj->spectype, SITEM_PULL); // arg3[0] = UPPER(arg3[0]); // xprintf(buf, "%s flag set.\n\r", arg3); // send_to_char(buf, ch); // return; } if (!str_cmp(arg2, "you-out") || !str_cmp(arg2, "you-wear")) { if (!IS_EXTRA(ch, EXTRA_TRUSTED)) { send_to_char ("You are not permitted to change an object in this way.\n\r", ch); return; } if (obj->item_type == ITEM_BOOK) { send_to_char("Not on a book.\n\r", ch); return; } if (!str_cmp(arg2, "you-out") && !IS_SET(obj->spectype, SITEM_TELEPORTER)) { send_to_char("That item is not a transporter.\n\r", ch); return; } if (!str_cmp(arg2, "you-wear") && IS_SET(obj->spectype, SITEM_TELEPORTER)) { send_to_char("Not on a transporter.\n\r", ch); return; } if (obj->chpoweron != NULL) strcpy(buf, obj->chpoweron); else { send_to_char ("There is a problem with this item, please inform an implementor.\n\r", ch); return; } if (!str_cmp(arg3, "clear")) { free_string(obj->chpoweron); obj->chpoweron = str_dup("(null)"); } else if (obj->chpoweron != NULL && buf[0] != '\0' && str_cmp(buf, "(null)")) { if (strlen2(buf) + strlen2(arg3) >= MAX_INPUT_LENGTH - 4) { send_to_char("Line too long.\n\r", ch); return; } else { free_string(obj->chpoweron); strcat(buf, "\n\r"); strcat(buf, arg3); obj->chpoweron = str_dup(buf); } } else { free_string(obj->chpoweron); obj->chpoweron = str_dup(arg3); } send_to_char("Ok.\n\r", ch); } else if (!str_cmp(arg2, "other-out") || !str_cmp(arg2, "other-wear")) { if (!IS_EXTRA(ch, EXTRA_TRUSTED)) { send_to_char ("You are not permitted to change an object in this way.\n\r", ch); return; } if (obj->item_type == ITEM_BOOK) { send_to_char("Not on a book.\n\r", ch); return; } if (!str_cmp(arg2, "other-out") && !IS_SET(obj->spectype, SITEM_TELEPORTER)) { send_to_char("That item is not a transporter.\n\r", ch); return; } if (!str_cmp(arg2, "other-wear") && IS_SET(obj->spectype, SITEM_TELEPORTER)) { send_to_char("Not on a transporter.\n\r", ch); return; } if (obj->victpoweron != NULL) strcpy(buf, obj->victpoweron); else { send_to_char ("There is a problem with this item, please inform an implementor.\n\r", ch); return; } if (!str_cmp(arg3, "clear")) { free_string(obj->victpoweron); obj->victpoweron = str_dup("(null)"); } else if (obj->victpoweron != NULL && buf[0] != '\0' && str_cmp(buf, "(null)")) { if (strlen2(buf) + strlen2(arg3) >= MAX_STRING_LENGTH - 4) { send_to_char("Line too long.\n\r", ch); return; } else { free_string(obj->victpoweron); strcat(buf, "\n\r"); strcat(buf, arg3); obj->victpoweron = str_dup(buf); } } else { free_string(obj->victpoweron); obj->victpoweron = str_dup(arg3); } send_to_char("Ok.\n\r", ch); } else if (!str_cmp(arg2, "you-in") || !str_cmp(arg2, "you-remove")) { if (!IS_EXTRA(ch, EXTRA_TRUSTED)) { send_to_char ("You are not permitted to change an object in this way.\n\r", ch); return; } if (obj->item_type == ITEM_BOOK) { send_to_char("Not on a book.\n\r", ch); return; } if (!str_cmp(arg2, "you-in") && !IS_SET(obj->spectype, SITEM_TELEPORTER)) { send_to_char("That item is not a transporter.\n\r", ch); return; } if (!str_cmp(arg2, "you-remove") && IS_SET(obj->spectype, SITEM_TELEPORTER)) { send_to_char("Not on a transporter.\n\r", ch); return; } if (obj->chpoweroff != NULL) strcpy(buf, obj->chpoweroff); else { send_to_char ("There is a problem with this item, please inform an implementor.\n\r", ch); return; } if (!str_cmp(arg3, "clear")) { free_string(obj->chpoweroff); obj->chpoweroff = str_dup("(null)"); } else if (obj->chpoweroff != NULL && buf[0] != '\0' && str_cmp(buf, "(null)")) { if (strlen2(buf) + strlen2(arg3) >= MAX_INPUT_LENGTH - 4) { send_to_char("Line too long.\n\r", ch); return; } else { free_string(obj->chpoweroff); strcat(buf, "\n\r"); strcat(buf, arg3); obj->chpoweroff = str_dup(buf); } } else { free_string(obj->chpoweroff); obj->chpoweroff = str_dup(arg3); } send_to_char("Ok.\n\r", ch); } else if (!str_cmp(arg2, "other-in") || !str_cmp(arg2, "other-remove")) { if (!IS_EXTRA(ch, EXTRA_TRUSTED)) { send_to_char ("You are not permitted to change an object in this way.\n\r", ch); return; } if (obj->item_type == ITEM_BOOK) { send_to_char("Not on a book.\n\r", ch); return; } if (!str_cmp(arg2, "other-in") && !IS_SET(obj->spectype, SITEM_TELEPORTER)) { send_to_char("That item is not a transporter.\n\r", ch); return; } if (!str_cmp(arg2, "other-remove") && IS_SET(obj->spectype, SITEM_TELEPORTER)) { send_to_char("Not on a transporter.\n\r", ch); return; } if (obj->victpoweroff != NULL) strcpy(buf, obj->victpoweroff); else { send_to_char ("There is a problem with this item, please inform an implementor.\n\r", ch); return; } if (!str_cmp(arg3, "clear")) { free_string(obj->victpoweroff); obj->victpoweroff = str_dup("(null)"); } else if (obj->victpoweroff != NULL && buf[0] != '\0' && str_cmp(buf, "(null)")) { if (strlen2(buf) + strlen2(arg3) >= MAX_INPUT_LENGTH - 4) { send_to_char("Line too long.\n\r", ch); return; } else { free_string(obj->victpoweroff); strcat(buf, "\n\r"); strcat(buf, arg3); obj->victpoweroff = str_dup(buf); } } else { free_string(obj->victpoweroff); obj->victpoweroff = str_dup(arg3); } send_to_char("Ok.\n\r", ch); } else if (!str_cmp(arg2, "you-use")) { if (!IS_EXTRA(ch, EXTRA_TRUSTED)) { send_to_char ("You are not permitted to change an object in this way.\n\r", ch); return; } if (obj->item_type == ITEM_BOOK) { send_to_char("Not on a book.\n\r", ch); return; } if (obj->chpoweruse != NULL) strcpy(buf, obj->chpoweruse); else { send_to_char ("There is a problem with this item, please inform an implementor.\n\r", ch); return; } if (!str_cmp(arg3, "clear")) { free_string(obj->chpoweruse); obj->chpoweruse = str_dup("(null)"); } else if (obj->chpoweruse != NULL && buf[0] != '\0' && str_cmp(buf, "(null)")) { if (strlen2(buf) + strlen2(arg3) >= MAX_INPUT_LENGTH - 4) { send_to_char("Line too long.\n\r", ch); return; } else { free_string(obj->chpoweruse); strcat(buf, "\n\r"); strcat(buf, arg3); obj->chpoweruse = str_dup(buf); } } else { free_string(obj->chpoweruse); obj->chpoweruse = str_dup(arg3); } send_to_char("Ok.\n\r", ch); } else if (!str_cmp(arg2, "other-use")) { if (!IS_EXTRA(ch, EXTRA_TRUSTED)) { send_to_char ("You are not permitted to change an object in this way.\n\r", ch); return; } if (obj->item_type == ITEM_BOOK) { send_to_char("Not on a book.\n\r", ch); return; } if (obj->victpoweruse != NULL) strcpy(buf, obj->victpoweruse); else { send_to_char ("There is a problem with this item, please inform an implementor.\n\r", ch); return; } if (!str_cmp(arg3, "clear")) { free_string(obj->victpoweruse); obj->victpoweruse = str_dup("(null)"); } else if (obj->victpoweruse != NULL && buf[0] != '\0' && str_cmp(buf, "(null)")) { if (strlen2(buf) + strlen2(arg3) >= MAX_INPUT_LENGTH - 4) { send_to_char("Line too long.\n\r", ch); return; } else { free_string(obj->victpoweruse); strcat(buf, "\n\r"); strcat(buf, arg3); obj->victpoweruse = str_dup(buf); } } else { free_string(obj->victpoweruse); obj->victpoweruse = str_dup(arg3); } send_to_char("Ok.\n\r", ch); } return; } void oset_affect(CHAR_DATA * ch, OBJ_DATA * obj, int value, int affect, bool is_quest) { char buf[MAX_STRING_LENGTH]; AFFECT_DATA *paf; int quest; int range; int cost; int max; if (IS_NPC(ch)) { send_to_char("Switch back, smart ass.\n\r", ch); return; } if (value == 0) { send_to_char ("Please enter a positive or negative amount.\n\r", ch); return; } if (!IS_JUDGE(ch) && (obj->questowner == NULL)) { send_to_char ("First you must set the owners name on the object.\n\r", ch); return; } if (is_quest && !IS_JUDGE(ch) && (obj->questmaker == NULL || str_cmp(ch->name, obj->questmaker))) { send_to_char ("That item has already been oset by someone else.\n\r", ch); return; } if (affect == APPLY_STR) { range = 3; cost = 2000; quest = QUEST_STR; } else if (affect == APPLY_DEX) { range = 3; cost = 2000; quest = QUEST_DEX; } else if (affect == APPLY_INT) { range = 3; cost = 2000; quest = QUEST_INT; } else if (affect == APPLY_WIS) { range = 3; cost = 2000; quest = QUEST_WIS; } else if (affect == APPLY_CON) { range = 3; cost = 2000; quest = QUEST_CON; } else if (affect == APPLY_HIT) { range = 25; cost = 500; quest = QUEST_HIT; } else if (affect == APPLY_MANA) { range = 25; cost = 500; quest = QUEST_MANA; } else if (affect == APPLY_MOVE) { range = 25; cost = 500; quest = QUEST_MOVE; } else if (affect == APPLY_HITROLL) { range = 5; cost = 3000; quest = QUEST_HITROLL; } else if (affect == APPLY_DAMROLL) { range = 5; cost = 3000; quest = QUEST_DAMROLL; } else if (affect == APPLY_AC) { range = 25; cost = 1000; quest = QUEST_AC; } else return; if (IS_SET(obj->quest, QUEST_IMPROVED)) max = 8500; else if (obj->pIndexData->vnum == OBJ_VNUM_PROTOPLASM) { range *= 2; max = 10000; } else max = 30000; if (obj->item_type == ITEM_WEAPON) { max *= 2; range *= 2; } if (is_quest && !IS_JUDGE(ch) && ((value > 0 && value > range) || (value < 0 && value < (range - range - range)))) { send_to_char("That is not within the acceptable range...\n\r", ch); send_to_char ("Str, Dex, Int, Wis, Con... max = 3 each, at 2000 bones per +1 stat.\n\r", ch); send_to_char ("Hp, Mana, Move............ max = 25 each, at 500 quest point per point.\n\r", ch); send_to_char ("Hitroll, Damroll.......... max = 5 each, at 3000 bones per point.\n\r", ch); send_to_char ("Ac........................ max = -25, at 1000 points per point.\n\r", ch); send_to_char ("\n\rNote: Created items can have upto 2 times the above maximum.\n\r", ch); send_to_char ("Also: Weapons may have upto 2 (4 for created) times the above maximum.\n\r", ch); return; } if (quest >= QUEST_HIT && value < 0) cost *= (value - (value * 2)); else cost *= value; if (cost < 0) cost = 0; if (is_quest && !IS_JUDGE(ch) && IS_SET(obj->quest, quest)) { send_to_char ("That affect has already been set on this object.\n\r", ch); return; } if (is_quest && !IS_JUDGE(ch) && (obj->points + cost > max)) { xprintf(buf, "You are limited to %d bones per item.\n\r", max); send_to_char(buf, ch); return; } if (is_quest && ch->bones < cost && !IS_JUDGE(ch)) { xprintf(buf, "That costs %d bones, while you only have %d.\n\r", cost, ch->bones); send_to_char(buf, ch); return; } if (!IS_SET(obj->quest, quest)) SET_BIT(obj->quest, quest); if (is_quest) ch->bones -= cost; obj->points += cost; if (obj->questmaker != NULL) free_string(obj->questmaker); obj->questmaker = str_dup(ch->name); if (affect_free == NULL) { paf = alloc_perm(sizeof(*paf)); } else { paf = affect_free; affect_free = affect_free->next; } paf->type = 0; paf->duration = -1; paf->location = affect; paf->modifier = value; paf->bitvector = 0; paf->next = obj->affected; obj->affected = paf; return; } void do_makepreg(CHAR_DATA * ch, char *argument) { char arg1[MAX_INPUT_LENGTH]; char arg2[MAX_INPUT_LENGTH]; char buf[MAX_INPUT_LENGTH]; CHAR_DATA *victim1; CHAR_DATA *victim2; argument = one_argument(argument, arg1); argument = one_argument(argument, arg2); if (arg1[0] == '\0' || arg2[0] == '\0') { send_to_char("Syntax: makepreg <female> <male>\n\r", ch); return; } if ((victim1 = get_char_room(ch, NULL, arg1)) == NULL) { send_to_char("They are not here.\n\r", ch); return; } if ((victim2 = get_char_room(ch, NULL, arg2)) == NULL) { send_to_char("They are not here.\n\r", ch); return; } if (IS_NPC(victim1) || IS_NPC(victim2)) { send_to_char("Not on NPC's.\n\r", ch); return; } if ((victim1->sex != SEX_FEMALE && victim2->sex != SEX_MALE)) { send_to_char("No way!\n\r", ch); return; } else { if (!str_cmp(victim1->name, victim2->pcdata->marriage) && !str_cmp(victim2->name, victim1->pcdata->marriage)) { make_preg(victim1, victim2); save_char_obj(victim1); save_char_obj(victim2); xprintf(buf, "%s and %s are now pregnant!", victim1->name, victim2->name); do_info(ch, buf); return; } send_to_char("But they are not yet engaged!\n\r", ch); return; } }