/*************************************************************************** * 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. * * * * 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. * ***************************************************************************/ /*************************************************************************** * God Wars Mud copyright (C) 1994, 1995, 1996 by Richard Woolcock * * * * Legend of Chrystancia copyright (C) 1999, 2000, 2001 by Matthew Little * * This mud is NOT to be copied in whole or in part, or to be run without * * the permission of Matthew Little. Nobody else has permission to * * authorise the use of this code. * ***************************************************************************/ #if defined(macintosh) #include <types.h> #else #include <sys/types.h> #endif #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include "merc.h" void quest_clone args ((CHAR_DATA * ch, OBJ_DATA * obj)); 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; ch->damcap[DAM_CAP] = 1000; ch->itemaffect = 0; ch->specxtype = 0; save_char_obj (ch); return; } 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) > 3) { 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, 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) > 3) { 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) > 3) { 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, 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) > 3) { 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; } if ((ch->sex == SEX_MALE && victim->sex == SEX_FEMALE) || (ch->sex == SEX_FEMALE && victim->sex == SEX_MALE)) { 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); sprintf (buf, "%s and %s are now engaged!", ch->name, victim->name); do_info (ch, buf); return; } send_to_char ("I don't think that would be a very good idea...\n\r", ch); 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) > 3) { 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, 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) > 3) { 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); sprintf (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 (!IS_IMMORTAL(ch)) { send_to_char("You can't marry people!\n\r",ch); return; } if (arg1[0] == '\0' || arg2[0] == '\0') { send_to_char ("Syntax: marry <person> <person>\n\r", ch); return; } if ((victim1 = get_char_room (ch, arg1)) == NULL) { send_to_char ("They are not here.\n\r", ch); return; } if ((victim2 = get_char_room (ch, 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 (IS_SET (victim1->act, PLR_GODLESS) && ch->level < NO_GODLESS) { send_to_char ("You failed.\n\r", ch); return; } if (IS_SET (victim2->act, PLR_GODLESS) && ch->level < NO_GODLESS) { send_to_char ("You failed.\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); sprintf (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_clearmarriage(CHAR_DATA *ch, char *argument) { char buf[MAX_INPUT_LENGTH]; CHAR_DATA *victim; if (argument[0] == '\0') { send_to_char("Clear whos marriage?\n\r#rNOTE: ONLY USE THIS FOR PEOPLE WHO'S MARRIED TO DELETED OR BANNED CHARS.\n\r",ch); return; } if ((victim = get_char_room(ch, argument)) == NULL) { send_to_char("They are not here.\n\r",ch); return; } if (IS_NPC(victim)) { send_to_char("Use on players only.\n\r", ch); return; } if (!str_cmp(victim->pcdata->marriage, "") || !IS_SET(victim->extra, EXTRA_MARRIED)) { send_to_char("But they are not married!\n\r",ch); return; } REMOVE_BIT (victim->extra, EXTRA_MARRIED); free_string (victim->pcdata->marriage); victim->pcdata->marriage = str_dup (""); save_char_obj (victim); sprintf (buf, "%ss marriage has gotten an anullment and are now divorced!", victim->name); do_info (ch, buf); 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, arg1)) == NULL) { send_to_char ("They are not here.\n\r", ch); return; } if ((victim2 = get_char_room (ch, 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 (IS_SET (victim1->act, PLR_GODLESS) && ch->level < NO_GODLESS) { send_to_char ("You failed.\n\r", ch); return; } if (IS_SET (victim2->act, PLR_GODLESS) && ch->level < NO_GODLESS) { send_to_char ("You failed.\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); sprintf (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 remove; bool can_give = TRUE; bool no_card = TRUE; bool low_card = FALSE; bool many_cards = FALSE; int card_level = 0; 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); if (arg1[0] != '\0' && !str_cmp (arg1, "trust") && !IS_EXTRA (ch, EXTRA_TRUSTED)) { if (ch->max_hit < 2000) { sprintf (buf, "Your total hit points are %d. (2000 required)\n\r", ch->max_hit); can_give = FALSE; } if (ch->max_mana < 1500) { sprintf (buf, "Your total mana is %d. (1500 required)\n\r", ch->max_mana); can_give = FALSE; } for (obj = object_list; obj != NULL; obj = obj->next) { if (obj->item_type != ITEM_QUESTCARD) continue; if (obj->carried_by == NULL) continue; if (obj->carried_by != ch) continue; if (obj->questowner == NULL) continue; if (str_cmp (ch->name, obj->questowner)) continue; if (obj->level < 50) { low_card = TRUE; if (card_level > 0) many_cards = TRUE; if (obj->level > card_level) card_level = obj->level; continue; } no_card = FALSE; } if (!no_card) { if (low_card) { if (many_cards) sprintf (buf, "Your highest quest card is worth %d. (50 required)\n\r", card_level); else sprintf (buf, "Your quest card is only worth %d. (50 required)\n\r", card_level); can_give = FALSE; } } else { sprintf (buf, "You have no quest card. (50 point card required)\n\r"); can_give = FALSE; } if (ch->pcdata->score[SCORE_QUEST] < 500) { sprintf (buf, "Your total earned quest points are %lli. (500 required)\n\r", ch->pcdata->score[SCORE_QUEST]); can_give = FALSE; } if (!can_give) stc (buf, ch); if (!can_give) return; SET_BIT (ch->extra, EXTRA_TRUSTED); logsf (ch, "%s Q_Trusted", ch->name); stc ("You are now quest trusted.\n\r", ch); return; } strcpy (arg3, argument); if (arg1[0] != '\0' && !str_cmp (arg1, "create")) { if (!IS_EXTRA (ch, EXTRA_TRUSTED)) { send_to_char ("You are not allowed to create new objects.\n\r", ch); return; } if (ch->pcdata->quest == 0) { send_to_char ("You must first earn some quest points.\n\r", ch); return; } else if (arg2[0] == '\0') { send_to_char ("Syntax: quest create <object> <field>\n\rObject being one of: Light (10 QP), Weapon <type> (50 QP), Armor (30 QP),\n\rContainer (10 QP), Boat (10 QP), Fountain <type> (10 QP), Stake (10 QP).\n\r", ch); return; } if (!str_cmp (arg2, "light")) { add = ITEM_LIGHT; value = 10; } else if (!str_cmp (arg2, "weapon")) { add = ITEM_WEAPON; value = 50; } else if (!str_cmp (arg2, "armor")) { add = ITEM_ARMOR; value = 20; } else if (!str_cmp (arg2, "armour")) { add = ITEM_ARMOR; value = 20; } else if (!str_cmp (arg2, "container")) { add = ITEM_CONTAINER; value = 10; } else if (!str_cmp (arg2, "boat")) { add = ITEM_BOAT; value = 10; } else if (!str_cmp (arg2, "fountain")) { add = ITEM_FOUNTAIN; value = 10; } else if (!str_cmp (arg2, "stake")) { add = ITEM_STAKE; value = 10; } else { send_to_char ("Syntax: quest create <object> <field>\n\rObject being one of: Light (10 QP), Weapon <type> (50 QP), Armor (10 QP),\n\rContainer (10 QP), Boat (10 QP), Fountain <type> (10 QP), Stake (10 QP).\n\r", ch); return; } if (ch->pcdata->quest < value) { sprintf (buf, "You don't have the required %d quest points.\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 GWAdmin.\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,\n\rCrush, Grep, Bite, 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, "grep")) obj->value[3] = 9; else if (!str_cmp (arg3, "bite")) obj->value[3] = 10; 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,\n\rCrush, Grep, Bite, Pierce, or Suck.\n\r", ch); if (obj != NULL) extract_obj (obj); return; } obj->value[1] = 10; obj->value[2] = 20; obj->level = 50; } else if (add == ITEM_FOUNTAIN) { if (arg3[0] == '\0') { send_to_char ("Please specify fountain contents: Water, Beer, Wine, Ale, Darkale, Whisky,\n\rFirebreather, 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,\n\rFirebreather, 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->pcdata->quest -= 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->name); if (obj->questowner != NULL) free_string (obj->questowner); obj->questowner = str_dup (ch->name); 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; } /* send_to_char( "Clone: Clones the object for original's cost (minimum of 5 QP).\n\r",ch ); */ if (arg1[0] == '\0' || arg2[0] == '\0') { send_to_char ("#R---------------------------#e=#w[ #yQuest Item Costs #w]#e=#R---------------------------\n\r", ch); if (!IS_EXTRA (ch, EXTRA_TRUSTED)) send_to_char ("#CTrust: Quest Trust yourself.\n\r", ch); send_to_char ("#CLimit: Check an item for QP limits.\n\r", ch); send_to_char ("#CCreate: Creates a new personalized object, costing between 10 and 50 QP.\n\r", ch); send_to_char ("#CName/Short/Long: Rename the object. 1 QP for all three.\n\r", ch); send_to_char ("#CProtection: Sets AC on armour at 1 QP per point.\n\r", ch); send_to_char ("#CMin/Max: Sets min/max damage on weapon at 1 QP per point.\n\r", ch); send_to_char ("#CWeapon: Sets weapon type for 10 QP.\n\r", ch); send_to_char ("#CExtra (add/remove): Glow(1/1), Hum(1/1), Invis(1/1), Anti-Good(1/10),\n\r Anti-Neutral(1/10), Anti-Evil(1/10), Loyal(10/1).\n\r", ch); send_to_char ("#CWear: Select location, costs 20 QP's. Type 'quest <obj> wear' to see locations.\n\r", ch); send_to_char ("#CPower: Spell power for spell weapons. Costs 1 QP per power point.\n\r", ch); send_to_char ("#CSpell: Spell weapons or affect. Costs 50 QP.\n\r", ch); send_to_char ("#CTransporter: Future transportation to that room. Costs 50 QP.\n\r", ch); send_to_char ("#CSpecial: Set activate/twist/press/pull flags.\n\r", ch); send_to_char ("#CYou-in/You-out/Other-in/Other-out: Renames for transporter actions.\n\r", ch); send_to_char ("#CYou-wear/You-remove/You-use: What you see when you wear/remove/use.\n\r", ch); send_to_char ("#COther-wear/Other-remove/Other-use: What others see when you wear/remove/use.\n\r", ch); send_to_char ("#CWeight: Set objects weight to 1. Costs 10 QP.\n\r", ch); send_to_char ("#CStr, Dex, Int, Wis, Con... max = 3 each, at 20 quest points per +1 stat.\n\r", ch); send_to_char ("#CHp, Mana, Move............ max = 25 each, at 5 quest points per point.\n\r", ch); send_to_char ("#CHitroll, Damroll.......... max = 5 each, at 30 quest points per point.\n\r", ch); send_to_char ("#CAc........................ max = -25, at 10 points per point.\n\r", ch); send_to_char ("#R----------------------------------------------------------------------------\n\r", ch); return; } if ((obj = get_obj_carry (ch, arg1)) == 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_AQUEST || obj->item_type == ITEM_TOOL || obj->item_type == ITEM_SYMBOL || obj->item_type == ITEM_PAGE || IS_SET (obj->quest, QUEST_ARTIFACT) || obj->item_type == ITEM_ETOKEN) { send_to_char ("You cannot quest-change that item.\n\r", ch); return; } if (!IS_IMMORTAL (ch) && (obj->questowner == NULL || str_cmp (ch->name, 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, "limit")) { oset_affect (ch, obj, TRUE, APPLY_NONE, TRUE); return; } 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) sprintf (buf, "The armor class can be increased by %d.\n\r", (15 - obj->value[0])); else sprintf (buf, "The armor class cannot be increased any further.\n\r"); send_to_char (buf, ch); return; } else if (value > ch->pcdata->quest) { send_to_char ("You don't have enough quest points.\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->pcdata->quest -= value; if (obj->questmaker != NULL) free_string (obj->questmaker); obj->questmaker = str_dup (ch->name); 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]) > 10) { if (obj->value[1] < 10) sprintf (buf, "The minimum damage can be increased by %d.\n\r", (10 - obj->value[1])); else sprintf (buf, "The minimum damage cannot be increased any further.\n\r"); send_to_char (buf, ch); return; } else if (value > ch->pcdata->quest) { send_to_char ("You don't have enough quest points.\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->pcdata->quest -= value; if (obj->questmaker != NULL) free_string (obj->questmaker); obj->questmaker = str_dup (ch->name); 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]) > 20) { if (obj->value[2] < 20) sprintf (buf, "The maximum damage can be increased by %d.\n\r", (20 - obj->value[2])); else sprintf (buf, "The maximum damage cannot be increased any further.\n\r"); send_to_char (buf, ch); return; } else if (value > ch->pcdata->quest) { send_to_char ("You don't have enough quest points.\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->pcdata->quest -= value; if (obj->questmaker != NULL) free_string (obj->questmaker); obj->questmaker = str_dup (ch->name); 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 (ch->pcdata->quest < 10) { send_to_char ("You don't have enough quest points.\n\r", ch); return; } if (arg3[0] == '\0') { send_to_char ("Please specify weapon type: Slice, Stab, Slash, Whip, Claw, Blast, Pound,\n\rCrush, Pierce, 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,\n\rCrush, Pierce, 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; ch->pcdata->quest -= 10; send_to_char ("Ok.\n\r", ch); if (obj->questmaker != NULL) free_string (obj->questmaker); obj->questmaker = str_dup (ch->name); } else { send_to_char ("That item is not a weapon.\n\r", ch); return; } return; } if (!str_cmp (arg2, "extra")) { if (IS_SET (obj->quest, QUEST_RELIC)) { send_to_char ("Not on a relic.\n\r", ch); return; } 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 (!str_cmp (arg3, "glow")) { value = ITEM_GLOW; add = 1; remove = 1; } else if (!str_cmp (arg3, "hum")) { value = ITEM_HUM; add = 1; remove = 1; } else if (!str_cmp (arg3, "invis")) { value = ITEM_INVIS; add = 1; remove = 1; } else if (!str_cmp (arg3, "anti-good")) { value = ITEM_ANTI_GOOD; add = 1; remove = 10; } else if (!str_cmp (arg3, "anti-evil")) { value = ITEM_ANTI_EVIL; add = 1; remove = 10; } else if (!str_cmp (arg3, "anti-neutral")) { value = ITEM_ANTI_NEUTRAL; add = 1; remove = 10; } else if (!str_cmp (arg3, "loyal")) { value = ITEM_LOYAL; add = 10; remove = 1; } else if (!str_cmp (arg3, "silver")) { value = SITEM_SILVER; add = 100; remove = 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->pcdata->quest < add) { sprintf (buf, "Sorry, you need %d quest points to set that flag.\n\r", add); send_to_char (buf, ch); return; } ch->pcdata->quest -= add; SET_BIT (obj->spectype, SITEM_SILVER); } else if (IS_SET (obj->extra_flags, value)) { if (ch->pcdata->quest < remove) { sprintf (buf, "Sorry, you need %d quest points to remove that flag.\n\r", remove); send_to_char (buf, ch); return; } ch->pcdata->quest -= remove; REMOVE_BIT (obj->extra_flags, value); } else { if (ch->pcdata->quest < add) { sprintf (buf, "Sorry, you need %d quest points to set that flag.\n\r", add); send_to_char (buf, ch); return; } ch->pcdata->quest -= 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->name); 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 (obj->item_ver > IV_NORMAL) { send_to_char ("It resists your attempts to reshape it.\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, Feet, 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, Feet, Face.\n\r", ch); return; } if (IS_SET (obj->wear_flags, ITEM_TAKE)) value += 1; 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->pcdata->quest < 20 && !(obj->pIndexData->vnum == 30037 && obj->wear_flags == 1)) { send_to_char ("It costs 20 quest points to change a location.\n\r", ch); return; } if (!(obj->pIndexData->vnum == 30037 && obj->wear_flags == 1)) ch->pcdata->quest -= 20; obj->wear_flags = value; 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, "replacespell")) { int weapon = 0; int affect = 0; if (IS_SET (obj->quest, QUEST_RELIC)) { if (!IS_CLASS (ch, CLASS_DROW) && !IS_CLASS (ch, CLASS_MONK) && !IS_CLASS (ch, CLASS_DRAGON) && !IS_CLASS (ch, CLASS_NINJA) && !IS_CLASS (ch, CLASS_FAE)) { if (!IS_SET (obj->spectype, SITEM_DEMONIC)) { send_to_char ("Not on a relic.\n\r", ch); return; } if (obj->specpower < 1) { send_to_char ("You are unable to infuse any further powers within this demonic 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 ("Spell weapons: Acid, Dark, Holy, Vampiric, Flaming, Electrified, Poisonous.\n\r", ch); send_to_char ("Spell affects: Blind, Seeinvis, Fly,Infravision, Invis, Passdoor, Protection,\n\rSanct, Sneak, Shockshield,Fireshield, Iceshield, Acidshield, Seehidden.\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")) affect = 7; 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 if (!str_cmp (arg3, "seehidden")) affect = 60; 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,\n\rSanct, Sneak, Shockshield, Fireshield, Iceshield, Acidshield, Seehidden.\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->pcdata->quest < 50) { send_to_char ("It costs 50 quest points 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->pcdata->quest -= 50; 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, "spell")) { int weapon = 0; int affect = 0; if (IS_SET (obj->quest, QUEST_RELIC)) { if (!IS_CLASS (ch, CLASS_DROW) && !IS_CLASS (ch, CLASS_MONK) && !IS_CLASS (ch, CLASS_DRAGON) && !IS_CLASS (ch, CLASS_NINJA) && !IS_CLASS (ch, CLASS_FAE)) { if (!IS_SET (obj->spectype, SITEM_DEMONIC)) { send_to_char ("Not on a relic.\n\r", ch); return; } if (obj->specpower < 1) { send_to_char ("You are unable to infuse any further powers within this demonic 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 ("Spell weapons: Acid, Dark, Holy, Vampiric, Flaming, Electrified, Poisonous.\n\r", ch); send_to_char ("Spell affects: Blind, Seeinvis, Fly, Infravision, Invis, Passdoor, Protection,\n\rSanct, Sneak, Shockshield, Fireshield, Iceshield, Acidshield, Seehidden.\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")) affect = 7; 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 if (!str_cmp (arg3, "seehidden")) affect = 60; 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,\n\rSanct, Sneak, Shockshield, Fireshield, Iceshield, Acidshield, Seehidden.\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->pcdata->quest < 50) { send_to_char ("It costs 50 quest points 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->pcdata->quest -= 50; 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, "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) { sprintf (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 < 1) { send_to_char ("Keep to Positive values.\n\r", ch); return; } else if (value > ch->pcdata->quest) { send_to_char ("You don't have enough quest points to increase the spell power.\n\r", ch); return; } obj->level += value; if (obj->level < 0) obj->level = 0; if (value < 1) value = 1; ch->pcdata->quest -= value; 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, "weight")) { int oldweight = 0; if (obj->weight < 2) { send_to_char ("You cannot reduce the weight of this item any further.\n\r", ch); return; } else if (ch->pcdata->quest < 10) { send_to_char ("It costs 10 quest point to remove the weight of an object.\n\r", ch); return; } oldweight = obj->weight; ch->carry_weight -= (oldweight -1); obj->weight = 1; ch->pcdata->quest -= 10; 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, "transporter")) { if (IS_SET (obj->quest, QUEST_RELIC)) { send_to_char ("Not on a relic.\n\r", ch); return; } 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->pcdata->quest < 50) { send_to_char ("It costs 50 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->pcdata->quest -= 50; send_to_char ("Ok.\n\r", ch); if (obj->questmaker != NULL) free_string (obj->questmaker); obj->questmaker = str_dup (ch->name); 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 (IS_SET (obj->quest, QUEST_RELIC)) { send_to_char ("Not on a relic.\n\r", ch); return; } 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_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->pcdata->quest < 50) { send_to_char ("It costs 50 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->pcdata->quest -= 50; 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, "indest")) { value = 500; if (ch->level < LEVEL_OWNER && (ch->lstatus < 9)) { send_to_char ("You need Almightly Legend to make an item indestructable.\n\r", ch); return; } if (IS_SET (obj->quest2, QUEST2_INDEST)) { send_to_char ("This item is already indestructable.\n\r", ch); return; } if (ch->pcdata->quest < value) { send_to_char ("You don't have enough quest points.\n\r", ch); return; } ch->pcdata->quest -= value; if (!IS_SET (obj->quest, QUEST_SPELLPROOF)) SET_BIT (obj->quest, QUEST_SPELLPROOF); SET_BIT (obj->quest2, QUEST2_INDEST); send_to_char ("The item is now INDESTRUCTABLE !\n\r", ch); if (obj->questmaker != NULL) free_string (obj->questmaker); obj->questmaker = str_dup (ch->name); return; } if (!str_cmp (arg2, "ownership")) { value = 250; if (ch->level < LEVEL_OWNER && (ch->lstatus < 4)) { send_to_char ("You need Legend level 4 to claim ownership of an item.\n\r",ch); return; } if (IS_SET (obj->quest2, QUEST2_OWNERSHIP)) { send_to_char ("You have already claimed ownership of this item.\n\r", ch); return; } if (ch->pcdata->quest < value) { send_to_char ("You don't have enough quest points.\n\r", ch); return; } ch->pcdata->quest -= value; SET_BIT (obj->quest2, QUEST2_OWNERSHIP); send_to_char ("You have claimed full ownership of that item!\n\r", ch); if (obj->questmaker != NULL) free_string (obj->questmaker); obj->questmaker = str_dup (ch->name); return; } /* if ( !str_cmp( arg2, "clone" ) ) { if (IS_SET(obj->quest, QUEST_RELIC)) { send_to_char("Not on a relic.\n\r",ch); return; } if (obj->item_type == ITEM_BOOK) { send_to_char("Not on a book.\n\r",ch); return; } value = obj->points; if (value < 5 || obj->item_type == ITEM_PAGE) value = 5; if (obj->item_type == ITEM_QUEST || obj->item_type == ITEM_QUESTCARD) { send_to_char("I think not...\n\r",ch); return; } else if (obj->questowner == NULL || str_cmp(obj->questowner,ch->name)) { send_to_char("You can only clone something you own.\n\r",ch); return; } else if (ch->pcdata->quest < value) { sprintf(buf,"It will cost you %d quest points to clone %s.\n\r", value,obj->short_descr); send_to_char(buf,ch); return; } ch->pcdata->quest -= value; quest_clone(ch,obj); 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); return; } else if (!str_cmp (arg2, "damroll") || !str_cmp (arg2, "dam")) { oset_affect (ch, obj, value, APPLY_DAMROLL, TRUE); return; } else if (!str_cmp (arg2, "armor") || !str_cmp (arg2, "ac")) { oset_affect (ch, obj, value, APPLY_AC, TRUE); return; } else if (!str_cmp (arg2, "hitpoints") || !str_cmp (arg2, "hp")) { oset_affect (ch, obj, value, APPLY_HIT, TRUE); return; } else if (!str_cmp (arg2, "mana")) { oset_affect (ch, obj, value, APPLY_MANA, TRUE); return; } else if (!str_cmp (arg2, "move") || !str_cmp (arg2, "movement")) { oset_affect (ch, obj, value, APPLY_MOVE, TRUE); 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); return; } else if (!str_cmp (arg2, "int") || !str_cmp (arg2, "intelligence")) { oset_affect (ch, obj, value, APPLY_INT, TRUE); return; } else if (!str_cmp (arg2, "wis") || !str_cmp (arg2, "wisdom")) { oset_affect (ch, obj, value, APPLY_WIS, TRUE); return; } else if (!str_cmp (arg2, "con") || !str_cmp (arg2, "constitution")) { oset_affect (ch, obj, value, APPLY_CON, TRUE); return; } } if (!str_cmp (arg2, "name")) { value = 1; if (!IS_EXTRA (ch, EXTRA_TRUSTED)) { send_to_char ("You are not allowed to rename objects.\n\r", ch); return; } if (!str_cmp (arg3, "Tijer")) { send_to_char ("You failed!\r\n", ch); return; } if (IS_SET (obj->quest, QUEST_RELIC)) { send_to_char ("Not on a relic.\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->pcdata->quest < value) { send_to_char ("It costs 1 quest point to rename an object.\n\r", ch); return; } if (strlen (arg3) < 3) { send_to_char ("Name should be at least 3 characters long.\n\r", ch); return; } ch->pcdata->quest -= 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 = 1; if (!IS_EXTRA (ch, EXTRA_TRUSTED)) { send_to_char ("You are not allowed to rename objects.\n\r", ch); return; } if (!str_cmp (arg3, "Tijer")) { send_to_char ("You failed!\r\n", ch); return; } if (IS_SET (obj->quest, QUEST_RELIC)) { send_to_char ("Not on a relic.\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->pcdata->quest < value) { send_to_char ("It costs 1 quest point to rename an object.\n\r", ch); return; } if (strlen (arg3) < 3) { send_to_char ("Name should be at least 3 characters long.\n\r", ch); return; } ch->pcdata->quest -= value; /* 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->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 = 1; if (!IS_EXTRA (ch, EXTRA_TRUSTED)) { send_to_char ("You are not allowed to rename objects.\n\r", ch); return; } if (!str_cmp (arg3, "Tijer")) { send_to_char ("You failed!\r\n", ch); return; } if (IS_SET (obj->quest, QUEST_RELIC)) { send_to_char ("Not on a relic.\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->pcdata->quest < value) { send_to_char ("It costs 1 quest point to rename an object.\n\r", ch); return; } if (strlen (arg3) < 3) { send_to_char ("Name should be at least 3 characters long.\n\r", ch); return; } ch->pcdata->quest -= 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, "ed")) { EXTRA_DESCR_DATA *ed; argument = one_argument (argument, arg3); 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_RELIC)) { send_to_char ("Not on a relic.\n\r", ch); return; } if (argument == NULL) { send_to_char ("Syntax: quest <object> ed <keyword> <string>\n\r", ch); return; } if (extra_descr_free == NULL) { ed = alloc_perm (sizeof (*ed)); } else { ed = extra_descr_free; extra_descr_free = ed; } strcpy (buf, argument); strcat (buf, "\n\r"); buf[0] = UPPER (buf[0]); ed->keyword = str_dup (arg3); ed->description = str_dup (buf); ed->next = obj->extra_descr; obj->extra_descr = ed; 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->quest, QUEST_RELIC)) { send_to_char ("Not on a relic.\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]); sprintf (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 (IS_SET (obj->quest, QUEST_RELIC)) { send_to_char ("Not on a relic.\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_STRING_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 (IS_SET (obj->quest, QUEST_RELIC)) { send_to_char ("Not on a relic.\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 (IS_SET (obj->quest, QUEST_RELIC)) { send_to_char ("Not on a relic.\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_STRING_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 (IS_SET (obj->quest, QUEST_RELIC)) { send_to_char ("Not on a relic.\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_STRING_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 (IS_SET (obj->quest, QUEST_RELIC)) { send_to_char ("Not on a relic.\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_STRING_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 (IS_SET (obj->quest, QUEST_RELIC)) { send_to_char ("Not on a relic.\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_STRING_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 quest_clone (CHAR_DATA * ch, OBJ_DATA * obj) { OBJ_INDEX_DATA *pObjIndex; OBJ_DATA *obj2; AFFECT_DATA *paf; AFFECT_DATA *paf2; pObjIndex = get_obj_index (obj->pIndexData->vnum); obj2 = create_object (pObjIndex, obj->level); /* Copy any changed parts of the object. */ free_string (obj2->name); obj2->name = str_dup (obj->name); free_string (obj2->short_descr); obj2->short_descr = str_dup (obj->short_descr); free_string (obj2->description); obj2->description = str_dup (obj->description); if (obj2->questmaker != NULL) free_string (obj2->questmaker); obj2->questmaker = str_dup (ch->name); if (obj->chpoweron != NULL && obj->points >= 50) { free_string (obj2->chpoweron); obj2->chpoweron = str_dup (obj->chpoweron); } if (obj->chpoweroff != NULL && obj->points >= 50) { free_string (obj2->chpoweroff); obj2->chpoweroff = str_dup (obj->chpoweroff); } if (obj->chpoweruse != NULL && obj->points >= 50) { free_string (obj2->chpoweruse); obj2->chpoweruse = str_dup (obj->chpoweruse); } if (obj->victpoweron != NULL && obj->points >= 50) { free_string (obj2->victpoweron); obj2->victpoweron = str_dup (obj->victpoweron); } if (obj->victpoweroff != NULL && obj->points >= 50) { free_string (obj2->victpoweroff); obj2->victpoweroff = str_dup (obj->victpoweroff); } if (obj->victpoweruse != NULL && obj->points >= 50) { free_string (obj2->victpoweruse); obj2->victpoweruse = str_dup (obj->victpoweruse); } if (obj->points >= 50) { obj2->spectype = obj->spectype; obj2->specpower = obj->specpower; } obj2->item_type = obj->item_type; obj2->extra_flags = obj->extra_flags; obj2->wear_flags = obj->wear_flags; obj2->weight = obj->weight; obj2->condition = obj->condition; obj2->toughness = obj->toughness; obj2->resistance = obj->resistance; obj2->quest = obj->quest; obj2->points = obj->points; obj2->cost = obj->cost; obj2->value[0] = obj->value[0]; obj2->value[1] = obj->value[1]; obj2->value[2] = obj->value[2]; obj2->value[3] = obj->value[3]; /*****************************************/ obj_to_char (obj2, ch); if (obj->affected != NULL) { for (paf = obj->affected; paf != NULL; paf = paf->next) { if (affect_free == NULL) paf2 = alloc_perm (sizeof (*paf)); else { paf2 = affect_free; affect_free = affect_free->next; } paf2->type = 0; paf2->duration = paf->duration; paf2->location = paf->location; paf2->modifier = paf->modifier; paf2->bitvector = 0; paf2->next = obj2->affected; obj2->affected = paf2; } } act ("$p splits into two identical objects.", ch, obj, NULL, TO_CHAR); 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_JUDGE (ch) && (obj->questmaker == NULL || str_cmp (ch->name, obj->questmaker)) && !is_quest) { send_to_char ("That item has already been oset by someone else.\n\r", ch); return; } if (affect == APPLY_NONE) { range = 0; cost = 0; quest = 0; } else if (affect == APPLY_STR) { range = 3; cost = 20; quest = QUEST_STR; } else if (affect == APPLY_DEX) { range = 3; cost = 20; quest = QUEST_DEX; } else if (affect == APPLY_INT) { range = 3; cost = 20; quest = QUEST_INT; } else if (affect == APPLY_WIS) { range = 3; cost = 20; quest = QUEST_WIS; } else if (affect == APPLY_CON) { range = 3; cost = 20; quest = QUEST_CON; } else if (affect == APPLY_HIT) { range = 25; cost = 5; quest = QUEST_HIT; } else if (affect == APPLY_MANA) { range = 25; cost = 5; quest = QUEST_MANA; } else if (affect == APPLY_MOVE) { range = 25; cost = 5; quest = QUEST_MOVE; } else if (affect == APPLY_HITROLL) { range = 5; cost = 30; quest = QUEST_HITROLL; } else if (affect == APPLY_DAMROLL) { range = 5; cost = 30; quest = QUEST_DAMROLL; } else if (affect == APPLY_AC) { range = 25; cost = 10; quest = QUEST_AC; } else return; if (IS_SET (obj->quest, QUEST_IMPROVED)) max = 1250 + (ch->race * 20); else if (obj->pIndexData->vnum == OBJ_VNUM_PROTOPLASM) { range *= 2; max = 750 + (ch->race * 10); } else max = 400 + (ch->race * 10); if (obj->item_type == ITEM_WEAPON) { max *= 2; range *= 2; } if (IS_SET (obj->spectype, SITEM_DEMONIC)) { if (obj->specpower == ARM_BLACK) max = 0; if (obj->specpower == ARM_GREY) max += 100; if (obj->specpower == ARM_PURPLE) max += 250; if (obj->specpower == ARM_RED) max += 750; if (obj->specpower == ARM_BRASS) max += 1500; } if (IS_SET(obj->spectype, SITEM_DRAGON) && IS_SET(obj->quest,QUEST_IMPROVED) ) max +=1500; if (affect == APPLY_NONE) { sprintf (buf, "%s is limited to a total of %d quest points, with %d more available.\n\r", capitalize(obj->short_descr), max, (max - obj->points)); send_to_char (buf, ch); return; } if (!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 20 quest points per +1 stat.\n\r", ch); send_to_char ("Hp, Mana, Move............ max = 25 each, at 5 quest point per point.\n\r", ch); send_to_char ("Hitroll, Damroll.......... max = 5 each, at 30 quest points per point.\n\r", ch); send_to_char ("Ac........................ max = -25, at 10 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_HITROLL && value < 0) cost *= (value - (value * 2)); else cost *= value; if (cost < 0) cost = 0; if (!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_JUDGE (ch) && (obj->points + cost > max)) { if (IS_SET (obj->spectype, SITEM_DEMONIC) && obj->specpower == ARM_BLACK) { stc ("You are unable to quest black demonic!\n\r", ch); return; } else { sprintf (buf, "You are limited to %d quest points per item.\n\r", max); send_to_char (buf, ch); return; } } if (is_quest && ch->pcdata->quest < cost) { sprintf (buf, "That costs %d quest points, while you only have %d.\n\r", cost, ch->pcdata->quest); send_to_char (buf, ch); return; } if (!IS_SET (obj->quest, quest)) SET_BIT (obj->quest, quest); if (is_quest) ch->pcdata->quest -= 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; send_to_char ("Ok.\n\r", ch); return; } /* Following is Code From Shimian, Cset, and Unclass use to see how to make your own, or just leave it in, leaving shimians credit there :) Generation is Code from tijer :)*/ /* */ /* Online Master Class Creation added by Shimian */ /* Also set's highlander's (-: woo woo :-) */ /* */ void do_classset (CHAR_DATA * ch, char *argument) { char arg1[MAX_INPUT_LENGTH]; char arg2[MAX_INPUT_LENGTH]; char arg3[MAX_INPUT_LENGTH]; char buf[MAX_STRING_LENGTH]; CHAR_DATA *victim; argument = one_argument (argument, arg1); argument = one_argument (argument, arg2); argument = one_argument (argument, arg3); if (IS_NPC (ch)) return; /* */ /* Thou shall not create classes unless you are an Imp */ /* */ /* KaVir suggestion: 28-11-97. Replace your 'if' with: if ( get_trust(ch) < LEVEL_IMPLEMENTOR ) */ if ((ch->trust < MAX_LEVEL) && (ch->level < MAX_LEVEL)) { send_to_char ("Huh?\n\r", ch); return; } /* */ /* Yeah right, an NPC Demon Lord ;) */ /* */ if (arg1[0] == '\0' || arg2[0] == '\0') { send_to_char ("Syntax: cset <victim> <class>\n\r", ch); send_to_char ("or: cset <victim> mage <colour>\n\r", ch); send_to_char ("\n\r", ch); send_to_char ("Class being one of:\n\r", ch); send_to_char (" vampire werewolf demon mage\n\r", ch); send_to_char ("\n\r", ch); send_to_char ("Colour being one of:\n\r", ch); send_to_char (" purple red blue green yellow\n\r", ch); return; } if ((victim = get_char_world (ch, arg1)) == NULL) { send_to_char ("They aren't here.\n\r", ch); return; } if (IS_NPC (victim)) { send_to_char ("Not on NPC's", ch); return; } /* */ /* Make sure they are Avatar */ /* */ if (victim->level < 3) { send_to_char ("They need to become an Avatar first!", ch); return; } /* */ /* Make sure they don't already have a class */ /* */ /* KaVir suggestion: 28-11-97. Replace your 'if' with: if ( victim->class != 0 || IS_SET(victim->special,SPC_CHAMPION ) */ if ((IS_SET (victim->class, CLASS_VAMPIRE)) || (IS_SET (victim->class, CLASS_WEREWOLF)) || (IS_SET (victim->class, CLASS_MAGE)) || (IS_SET (victim->class, CLASS_HIGHLANDER)) || (IS_SET (victim->class, CLASS_DEMON)) || (IS_SET (victim->special, SPC_CHAMPION))) { send_to_char ("They need to be cleared of their current class first!", ch); return; } /* */ /* Do you wanna make 'em the Master Vampire */ /* */ if (!str_cmp (arg2, "vampire")) { victim->class = CLASS_VAMPIRE; free_string (victim->lord); victim->lord = str_dup (""); victim->pcdata->stats[UNI_GEN] = 1; victim->beast = 0; SET_BIT (victim->immune, IMM_SUNLIGHT); sprintf (buf, "%s is now Master Vampire.", victim->name); do_info (ch, buf); sprintf (log_buf, "%s has been made Master Vampire by %s", victim->name, ch->name); log_string (log_buf, ch); send_to_char ("You are now the Master Vampire!\n\r", victim); if (ch != victim) { send_to_char ("You make them Master Vampire\n\r", ch); do_mclear (victim, victim->name); return; } do_mclear (victim, victim->name); return; } /* */ /* Do you wanna make 'em the Master Werewolf */ /* */ if (!str_cmp (arg2, "werewolf")) { victim->class = CLASS_WEREWOLF; free_string (victim->lord); victim->lord = str_dup (""); victim->pcdata->stats[UNI_GEN] = 1; sprintf (buf, "%s is now Master Werewolf.", victim->name); do_info (ch, buf); sprintf (log_buf, "%s has been made Master Werewolf by %s", victim->name, ch->name); log_string (log_buf, ch); send_to_char ("You are now the Master Werewolf!\n\r", victim); if (ch != victim) { send_to_char ("You make them Master Werewolf\n\r", ch); do_mclear (victim, victim->name); return; } do_mclear (victim, victim->name); return; } /* */ /* Check if you wanna make 'em Demon Lord */ /* */ if (!str_cmp (arg2, "demon")) { victim->class = CLASS_DEMON; free_string (victim->lord); victim->lord = str_dup (""); victim->special = SPC_DEMON_LORD; sprintf (buf, "%s is now Demon Lord.", victim->name); do_info (ch, buf); sprintf (log_buf, "%s has been made Demon Lord by %s", victim->name, ch->name); log_string (log_buf, ch); send_to_char ("You are now the Demon Lord!\n\r", victim); if (ch != victim) { send_to_char ("You make them Demon Lord\n\r", ch); do_mclear (victim, victim->name); return; } do_mclear (victim, victim->name); return; } /* */ /* Check if you wanna make 'em a Highlander */ /* */ /* if ( !str_cmp( arg2, "highlander") ) { victim->class = CLASS_HIGHLANDER; free_string(victim->lord); victim->lord = str_dup( "" ); victim->pcdata->powers[0] = 1; victim->pcdata->stats[0] = 1; sprintf( log_buf, "%s has been made a Highlander by %s",victim->name, ch->name); log_string( log_buf, ch); send_to_char("You are a Highlander!\n\r",victim); if ( ch != victim ) { send_to_char("You make them a Highlander!\n\r",ch); send_to_char("Don't forget their Katana! [29695]\n\r",ch); do_mclear(victim,victim->name); return; } do_mclear(victim,victim->name); return; } */ /* if ( ( !str_cmp( arg2, "dragon" ) ) ) { victim->class = CLASS_DRAGON; victim->pcdata->disc_a[DRAGON_COLOR] = number_range(1,9); victim->pcdata->disc_a[DRAGON_AGE] = 1; return; } */ /* */ /* Check if you want to make 'em an Archmage */ /* */ if ((!str_cmp (arg2, "mage"))) { if ((!str_cmp (arg3, "purple")) || (!str_cmp (arg3, "red")) || (!str_cmp (arg3, "blue")) || (!str_cmp (arg3, "green")) || (!str_cmp (arg3, "yellow"))) { victim->class = CLASS_MAGE; victim->level = 6; victim->trust = 6; free_string (victim->lord); victim->lord = str_dup (""); /* */ /* Give Archmages all Runes, Sigils and Glyphs */ /* */ victim->pcdata->powers[1] = 2047; victim->pcdata->powers[2] = 1023; victim->pcdata->powers[3] = 15; /* */ /* Check for colour of Archmage */ /* */ if (!str_cmp (arg3, "purple")) victim->pcdata->powers[0] = 0; if (!str_cmp (arg3, "red")) victim->pcdata->powers[0] = 1; if (!str_cmp (arg3, "blue")) victim->pcdata->powers[0] = 2; if (!str_cmp (arg3, "green")) victim->pcdata->powers[0] = 3; if (!str_cmp (arg3, "yellow")) victim->pcdata->powers[0] = 4; sprintf (buf, "%s is now the %s Archmage.", victim->name, arg3); do_info (ch, buf); sprintf (log_buf, "%s has been made the %s Archmage by %s", victim->name, arg3, ch->name); log_string (log_buf, ch); send_to_char ("You are now an Archmage!\n\r", victim); if (ch != victim) { send_to_char ("You make them an Archmage!\n\r", ch); do_mclear (victim, victim->name); return; } do_mclear (victim, victim->name); return; } else { send_to_char ("Syntax : cset <victim> mage <colour>\n\r", ch); send_to_char ("\n\r", ch); send_to_char ("Colour being one of:\n\r", ch); send_to_char (" purple red blue green yellow\n\r", ch); return; } } send_to_char ("Syntax: cset <victim> <class>\n\r", ch); send_to_char ("or: cset <victim> mage <colour>\n\r", ch); send_to_char ("\n\r", ch); send_to_char ("Class being one of:\n\r", ch); send_to_char (" vampire werewolf highlander demon mage\n\r", ch); send_to_char ("\n\r", ch); send_to_char ("Colour being one of:\n\r", ch); send_to_char (" purple red blue green yellow\n\r", ch); return; } /* End of Class Creation */ /* void do_generation(CHAR_DATA *ch, char *argument) { CHAR_DATA *victim; char buf[MAX_STRING_LENGTH]; int value; char arg1[MAX_INPUT_LENGTH]; char arg2[MAX_INPUT_LENGTH]; argument=one_argument(argument,arg1); argument=one_argument(argument,arg2); if (IS_NPC(ch)) return; if (arg1[0] == '\0') { send_to_char("Syntax: generation <victim> <value>.\n\r",ch); return; } if ((victim=get_char_world(ch,arg1)) == NULL) { send_to_char("They aren't here.\n\r",ch); return; } if (!IS_CLASS(victim,CLASS_WEREWOLF)) { if (!IS_CLASS(victim,CLASS_VAMPIRE)) { if (!IS_IMMORTAL(victim)) { send_to_char("They need to be either Werewolf of Vampire.\n\r",ch); return; } } } value = is_number(arg2) ? atoi (arg2): -1; if (value <1 || value >7) { send_to_char("Invalid Generation.\n\r",ch); return; } else { victim->pcdata->stats[UNI_GEN] = value; sprintf(buf,"You are now generation %d.\n\r",value); send_to_char(buf,ch); } return; } */ void do_unclas (CHAR_DATA * ch, char *argument) { if ((ch->trust < (MAX_LEVEL - 2)) && (ch->level < (MAX_LEVEL - 2))) send_to_char ("Huh?\n\r", ch); else send_to_char ("If you want to UNCLASS, spell it out.\n\r", ch); return; } void do_unclass (CHAR_DATA * ch, char *argument) { CHAR_DATA *victim; char arg[MAX_INPUT_LENGTH]; one_argument (argument, arg); if (IS_NPC (ch)) return; if (arg[0] == '\0' || is_number (arg)) { send_to_char ("Unclass whom?\n\r", ch); return; } if ((victim = get_char_world (ch, arg)) == NULL) { send_to_char ("They aren't here.\n\r", ch); return; } if (IS_NPC (victim)) { send_to_char ("Not on NPC's.\n\r", ch); return; } if ((victim->level == MAX_LEVEL && ch != victim)) { send_to_char ("Not om Imps.\n\r", ch); return; } if (IS_SET (victim->act, PLR_GODLESS) && get_trust (ch) < NO_GODLESS && !IS_SET (ch->extra, EXTRA_ANTI_GODLESS)) { send_to_char ("You failed.\n\r", ch); return; } if (IS_CLASS (victim, CLASS_VAMPIRE)) do_mortalvamp (victim, ""); if (IS_CLASS (victim, CLASS_WEREWOLF)) do_unwerewolf (victim, ""); free_string (victim->lord); victim->lord = str_dup (""); free_string (victim->clan); victim->clan = str_dup (""); free_string (victim->morph); victim->pcdata->stats[UNI_GEN] = 0; victim->pcdata->stats[UNI_AFF] = 0; victim->pcdata->stats[UNI_CURRENT] = -1; /* Remove Mage Magic level's */ if (victim->spl[PURPLE_MAGIC] > 200) victim->spl[PURPLE_MAGIC] = 200; if (victim->spl[RED_MAGIC] > 200) victim->spl[RED_MAGIC] = 200; if (victim->spl[BLUE_MAGIC] > 200) victim->spl[BLUE_MAGIC] = 200; if (victim->spl[GREEN_MAGIC] > 200) victim->spl[GREEN_MAGIC] = 200; if (victim->spl[YELLOW_MAGIC] > 200) victim->spl[YELLOW_MAGIC] = 200; /* Remove Highlander weapon skill's */ if (victim->wpn[0] > 200) victim->wpn[0] = 200; if (victim->wpn[1] > 200) victim->wpn[1] = 200; if (victim->wpn[2] > 200) victim->wpn[2] = 200; if (victim->wpn[3] > 200) victim->wpn[3] = 200; if (victim->wpn[4] > 200) victim->wpn[4] = 200; if (victim->wpn[5] > 200) victim->wpn[5] = 200; if (victim->wpn[6] > 200) victim->wpn[6] = 200; if (victim->wpn[7] > 200) victim->wpn[7] = 200; if (victim->wpn[8] > 200) victim->wpn[8] = 200; if (victim->wpn[9] > 200) victim->wpn[9] = 200; if (victim->wpn[10] > 200) victim->wpn[10] = 200; if (victim->wpn[11] > 200) victim->wpn[11] = 200; if (victim->wpn[12] > 200) victim->wpn[12] = 200; REMOVE_BIT (victim->special, SPC_SIRE); REMOVE_BIT (victim->special, SPC_PRINCE); REMOVE_BIT (victim->special, SPC_ANARCH); REMOVE_BIT (victim->special, SPC_CHAMPION); REMOVE_BIT (victim->special, SPC_DEMON_LORD); REMOVE_BIT (victim->special, SPC_INCONNU); REMOVE_BIT (victim->special, SPC_WOLFMAN); victim->pcdata->stats[UNI_RAGE] = 0; victim->pcdata->rank = AGE_CHILDE; victim->pcdata->powers[WPOWER_MANTIS] = 0; victim->pcdata->powers[WPOWER_BEAR] = 0; victim->pcdata->powers[WPOWER_LYNX] = 0; victim->pcdata->powers[WPOWER_BOAR] = 0; victim->pcdata->powers[WPOWER_OWL] = 0; victim->pcdata->powers[WPOWER_SPIDER] = 0; victim->pcdata->powers[WPOWER_WOLF] = 0; victim->pcdata->powers[WPOWER_HAWK] = 0; victim->pcdata->powers[WPOWER_SILVER] = 0; victim->pcdata->powers[DPOWER_FLAGS] = 0; victim->pcdata->powers[DPOWER_CURRENT] = 0; victim->pcdata->powers[DPOWER_HEAD] = 0; victim->pcdata->powers[DPOWER_TAIL] = 0; victim->pcdata->powers[DPOWER_OBJ_VNUM] = 0; victim->pcdata->stats[UNI_FORM0] = 0; victim->pcdata->stats[UNI_FORM1] = 0; victim->pcdata->stats[WOLF_POLYAFF] = 0; victim->pcdata->stats[DEMON_CURRENT] = 0; victim->pcdata->stats[DEMON_TOTAL] = 0; victim->pcdata->stats[DEMON_POWER] = 0; victim->polyaff = 0; victim->class = 0; victim->home = 3001; victim->level = 2; send_to_char ("Unclass complete.\n\r", ch); return; }