#include <sys/types.h> #include <ctype.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include "emlen.h" char *check_mob_name(char *nm, CHAR_DATA *ch) { char *t; t=nm; nm[0]=LOWER(nm[0]); if (UPPER(*t)=='A' && *(t+1)==' ') { send_to_char("WARNING! Mob name field should only contain KEYWORDS to access the mob.\n\r",ch); send_to_char("For instance: dwarf dwarven king stocky\n\r",ch); return nm; } for (t=nm; *t!='\0'; t++) { if (*t==' ' && *(t+1)!='\0' && *(t+1)=='a' && *(t+2)==' ') { send_to_char("WARNING! Mob name field should only contain KEYWORDS to access the mob.\n\r",ch); send_to_char("For instance: dwarf dwarven king stocky\n\r",ch); return nm; } } return nm; } char *check_mob_short(char *nm,CHAR_DATA *ch) { char *t; bool warn=FALSE; if (nm[0]=='\0') return nm; for (t=nm;*t!='\0';t++) { if (!warn && *t<='Z' && *t>='A') { send_to_char("WARNING: Capitalized letters found in the mob short description.\n\r",ch); send_to_char("A mob's short description should be something like: a dwarven adventurer\n\r",ch); send_to_char("If you are specifying a name like 'king Ralysuzki', ignore this warning,\n\r",ch); send_to_char("otherwise, please redo the short without using capitals.\n\r",ch); warn=TRUE; } } t--; if (*t=='.') *t='\0'; if (strlen(nm)>17) { send_to_char("You should try to keep mob 'short's down below 18 or so characters.\n\r",ch); send_to_char("Longer shorts may cause wordwraps at bad places and unnecessary spam.\n\r",ch); send_to_char("(Please keep this in mind and shorten the mob's short, if possible).\n\r",ch); } return nm; } char *check_mob_long(char *nm, CHAR_DATA *ch) { char *t; bool warn=FALSE; if (nm[0]=='\0') return nm; nm[0]=UPPER(nm[0]); for (t=nm+1;*t!='\0';t++) { if (!warn && *t<='Z' && *t>='A') { send_to_char("WARNING: Capitalized letters found in the mob long description.\n\r",ch); send_to_char("A mob's long description should be something like:\n\r",ch); send_to_char("A massive dwarven gateguard stands here, guarding the gates of the city.\n\r",ch); send_to_char("If you are specifying a name like:\n\r",ch); send_to_char("King Ralysuzki stands here, talking with Fred the baker. then ignore this\n\r",ch); send_to_char("warning. Otherwise, please redo the long desc without using capitals.\n\r",ch); warn=TRUE; } } t-=3; if (*t!='.' && *t!='!') { send_to_char("\x1B[1;33mWARNING!!!!!!!! Your mob long descriptions MUST be a sentence.\n\r",ch); send_to_char("This means you should have a noun, verb, etc, and end it with a period.\n\r",ch); send_to_char("Here is a proper example:\n\r",ch); send_to_char("A timid-looking dwarven explorer forages for food here.\n\r",ch); send_to_char("PLEASE redo the long description so that it adheres to these rules.. thanks :)\x1B[37;0m\n\r",ch); } return nm; } void medit (CHAR_DATA * ch, char *argy) { AREA_DATA *pArea; MOB_PROTOTYPE *pMob; char arg[STD_LENGTH]; char arg1[STD_LENGTH]; char arg2[STD_LENGTH]; char buf[STD_LENGTH]; int value; int nextfree; int iHash; strcpy (arg, argy); smash_tilde (argy); argy = one_argy (argy, arg1); strcpy (arg2, argy); value = atoi (arg2); pMob = (MOB_PROTOTYPE *) ch->desc->pEdit; pArea = pMob->area; hugebuf_o[0]='\0'; if (!str_cmp (arg1, "show") || arg1[0] == '\0') { sprintf (buf, "%d", pMob->vnum); mindex_window (ch, pMob, -1); return; } if (get_direction_number (arg1) == DIR_MAX) { switch (UPPER(arg1[0])) { case 'A': if (!str_cmp (arg1, "avenger")) { if (LEVEL(ch) < MAX_LEVEL) return; if (arg2[0] == '\0') { send_to_char ("Syntax: avenger <vnum of avenger mob>\n\r", ch); return; } if (!IS_SET(pMob->act, ACT_AVENGED)) { send_to_char ("This mob is not avenged when it dies.\n\r", ch); return; } if (!pMob->opt) pMob->opt = new_optional(); pMob->opt->avenger = atoi (arg2); mindex_window (ch, pMob, 6); SET_BIT (pArea->area_flags, AREA_CHANGED); send_to_char ("Avenger set.\n\r", ch); return; } if (!str_cmp (arg1, "armor")) { if (value != 0) { pMob->armcls = value; mindex_window (ch, pMob, 2); if (value != 101) { send_to_char ("Armor Class of Mob Set.\n\r", ch); return; } else { send_to_char ("Mob's armor class will now be computed automatically.\n\r", ch); return; } } } if (!str_cmp (arg1, "alignment")) { if (arg2[0] == '\0' || (!is_number (arg2) && atoi (arg2) == 0)) { send_to_char ("Syntax: alignment [number]\n\r", ch); return; } pMob->alignment = atoi (arg2); if (pMob->alignment > NUM_ALIGN) pMob->alignment = 2; if (pMob->alignment < 0) pMob->alignment = 1; mindex_window (ch, pMob, 2); SET_BIT (pArea->area_flags, AREA_CHANGED); send_to_char ("Alignment set.\n\r", ch); return; } if (!str_cmp (arg1, "alter")) { if (arg2[0] == '\0' || (!is_number (arg2) && atoi (arg2) > -1)) { send_to_char ("Syntax: alter [vnum]\n\r", ch); return; } if (get_mob_index (atoi (arg2)) == NULL && (atoi (arg2) != 0)) { send_to_char ("No mob with that vnum.\n\r", ch); return; } pMob->alt_vnum = atoi (arg2); mindex_window (ch, pMob, 3); SET_BIT (pArea->area_flags, AREA_CHANGED); send_to_char ("Alter set.\n\r", ch); return; } if (!str_cmp (arg1, "attackname")) { if (LEVEL (ch) < MAX_LEVEL) { send_to_char ("Please ask a GOD to set this for you. It should be used very rarely.\n\r", ch); return; } argy = one_argy (argy, arg1); if (arg1[0] == '\0' || arg1[0] == ' ') { if (!str_cmp ("N/A", pMob->attackname) || !pMob->attackname) { send_to_char ("Syntax: attackname NAME\n\r", ch); return; } if (pMob->attackname) free_string (pMob->attackname); pMob->attackname = str_dup ("N/A"); mindex_window (ch, pMob, 6); send_to_char ("Attack name cleared.\n\r", ch); return; } if (strlen (arg1) > 15) { send_to_char ("Attacks can't be that LONG. Please ask for help.\n\r", ch); return; } if (pMob->attackname) free_string (pMob->attackname); pMob->attackname = str_dup (arg1); mindex_window (ch, pMob, 6); send_to_char ("Attack name set. Please playtest this to see if it is what you like\n\rbefore you continue with building more mobs :)\n\r", ch); return; } /*if ( !str_cmp( arg1, "attack" ) ) { int i; int iType; if (LEVEL(ch)<MAX_LEVEL) { send_to_char("If you REALLY need to set this powerful option, ask a GOD.\n\r",ch); return; } argy = one_argy( argy, arg1 ); strcpy( arg2, argy ); if ( !is_number( arg1 ) ) { send_to_char( "Syntax: attack [num] [weapon type] [min dam] [max dam]\n\r", ch ); send_to_char( " attack [num] delete\n\r", ch ); return; } i = URANGE( 0, atoi( arg1 ), MAX_ATTACK_DATA-1 ); argy = one_argy( argy, arg1 ); strcpy( arg2, argy ); if ( !str_cmp( arg1, "delete" ) ) { if ( pMob->attacks[i] != NULL ) { free_attack( pMob->attacks[i] ); pMob->attacks[i] = NULL; send_to_char( "Attack deleted.\n\r", ch ); return; } else { send_to_char( "Attack does not exist already.\n\r", ch ); return; } } for ( iType = 0; iType < MAX_ATTACK; iType++ ) { if ( !str_cmp( arg1, attack_table[iType].name ) ) break; } if ( iType >= MAX_ATTACK ) { send_to_char( "Invalid weapon type (see IREF WEAPONS).\n\r", ch ); return; } if ( pMob->attacks[i] == NULL ) { send_to_char( "Attack added.\n\r", ch ); pMob->attacks[i] = new_attack( ); } else { send_to_char( "Attack modified.\n\r", ch ); } pMob->attacks[i]->next = NULL; pMob->attacks[i]->idx = iType; argy = one_argy( argy, arg1 ); argy = one_argy( argy, arg2 ); pMob->attacks[i]->dam1 = atoi( arg1 ); pMob->attacks[i]->dam2 = atoi( arg2 ); return; } */ break; case 'C': if (!str_cmp (arg1, "create")) { value = atoi (argy); if (argy[0] == '\0' || value == 0) { send_to_char ("Syntax: medit create [vnum]\n\r", ch); return; } pArea = get_vnum_area (value); if (pArea == NULL) { send_to_char ("That vnum is not assigned an area.\n\r", ch); return; } if (!IS_BUILDER (ch, pArea)) { send_to_char ("Vnum in an area you can't build in.\n\r", ch); return; } if (get_mob_index (value) != NULL) { send_to_char ("Mob vnum already exists.\n\r", ch); return; } pMob = new_mob_index (); pMob->vnum = value; pMob->area = pArea; if (value > top_vnum_mob) top_vnum_mob = value; iHash = value % HASH_MAX; pMob->next = mob_index_hash[iHash]; mob_index_hash[iHash] = pMob; ch->desc->pEdit = (void *) pMob; SET_BIT (pArea->area_flags, AREA_CHANGED); send_to_char ("Mobile Created.\n\r", ch); pArea->mob_count++; return; } if (!str_cmp (arg1, "casts") && LEVEL (ch) > 109) { int i = 0; int j; if (arg2[0] == '\0') return; if (!pMob->opt) pMob->opt = new_optional (); for (j = 0; j < 10; j++) { if (pMob->opt->cast_spells[j] != NULL && !str_cmp (arg2, pMob->opt->cast_spells[j])) { free_string (pMob->opt->cast_spells[j]); pMob->opt->cast_spells[j] = NULL; send_to_char ("Spell removed.\n\r", ch); return; } } while (pMob->opt->cast_spells[i] != NULL) i++; if (i > 9) { send_to_char ("All full!!\n\r", ch); return; } pMob->opt->cast_spells[i] = str_dup (arg2); send_to_char ("Spell set.\n\r", ch); SET_BIT (pArea->area_flags, AREA_CHANGED); return; } if (!str_prefix ("cast_p", arg1) && LEVEL (ch) > 109) { if (!pMob->opt) pMob->opt = new_optional (); if (value >= 0) pMob->opt->cast_percent = value; send_to_char ("Cast Percentage set.\n\r", ch); SET_BIT (pArea->area_flags, AREA_CHANGED); return; } if (!str_cmp (arg1, "clan_guard")) { if (value > -1) { pMob->clan_guard_1 = value; send_to_char ("Set clanguard.\n\r", ch); } SET_BIT (pArea->area_flags, AREA_CHANGED); return; } if (!str_cmp (arg1, "sect_guard")) { if (value > -1) { pMob->clan_guard_2 = value; send_to_char ("Set clan2guard.\n\r", ch); } SET_BIT (pArea->area_flags, AREA_CHANGED); return; } break; case 'D': if (!str_cmp (arg1, "done")) { char minibuf[200]; ch->desc->pEdit = NULL; sprintf (minibuf, "\x1B[1;%dr\x1B[2JDone.\n\r", ch->pcdata->pagelen); send_to_char (minibuf, ch); ch->desc->connected = CON_PLAYING; return; } if (!str_cmp (arg1, "damroll")) { bool neg = FALSE; char *a2 = arg2; int ii; if (arg2[0] == '\0') { send_to_char ("Damroll value cleared.\n\r", ch); pMob->damroll = 0; } if (arg2[0] == '-') { neg = TRUE; a2++; } ii = atoi (a2); if (neg) ii = 0 - ii; value = ii; if (value != 0) { send_to_char ("Damroll value set.\n\r", ch); pMob->damroll = value; } else { send_to_char ("Damroll value cleared.\n\r", ch); pMob->damroll = 0; } SET_BIT (pArea->area_flags, AREA_CHANGED); return; } if (!str_cmp (arg1, "desc") || !str_cmp (arg1, "description")) { char *s; if (pMob->description != NULL && pMob->description[0] == 1) { s = str_dup (decompress (pMob->description)); free_string (pMob->description); pMob->description = s; } if (arg2[0] == '\0') { string_append (ch, &pMob->description); SET_BIT (pArea->area_flags, AREA_CHANGED); return; } if (arg2[0] == '+') { string_append (ch, &pMob->description); SET_BIT (pArea->area_flags, AREA_CHANGED); return; } send_to_char ("Syntax: desc - line edit\n\r", ch); send_to_char (" desc + - line append\n\r", ch); return; } if (!str_cmp (arg1, "dodge")) { if (value > 0) { send_to_char ("Dodge value set.\n\r", ch); pMob->dodge = value; } else { send_to_char ("Dodge value cleared.\n\r", ch); pMob->dodge = 0; } SET_BIT (pArea->area_flags, AREA_CHANGED); return; } break; case 'E': if (!str_cmp (arg1, "exp")) { if (arg2[0] == '\0' || !is_number (arg2)) { send_to_char ("Syntax: exp [multiplier * 10]\n\r", ch); send_to_char ("...so 1.5 times exp would be set by 'exp 15'.\n\r", ch); return; } if (atoi (arg2) < 2) { send_to_char ("Multiplier can't be less than two.\n\r", ch); return; } pMob->hpmult=pMob->hpmult%1000; if (atoi(arg2)!=10) { pMob->hpmult+=(atoi(arg2))*1000; } mindex_window (ch, pMob, 1); send_to_char ("Exp multiplier set.\n\r", ch); return; } break; case 'F': if (!str_cmp(arg1, "female")) { pMob->sex = SEX_FEMALE; SET_BIT (pArea->area_flags, AREA_CHANGED); mindex_window (ch, pMob, 1); send_to_char ("Sex set.\n\r", ch); return; } if (!str_cmp (arg1, "fdesc") || !str_cmp (arg1, "fdescription")) { char *s; if (pMob->description != NULL && pMob->description[0] == 1) { s = str_dup (decompress (pMob->description)); free_string (pMob->description); pMob->description = s; } fullscreen_editor (ch, &pMob->description); SET_BIT (pArea->area_flags, AREA_CHANGED); return; } break; case 'G': if (!str_cmp (arg1, "guarding")) { if (arg2[0] == '\0') { send_to_char ("Syntax: guarding [vnum/dir]\n\r", ch); return; } if (!IS_SET (pMob->act3, ACT3_GUARD_ITEM) && !IS_SET (pMob->act3, ACT3_GUARD_DOOR) && !IS_SET (pMob->act3, ACT3_GUARD_MOB) && pMob->clan_guard_1 == 0 && pMob->clan_guard_2 == 0 && !IS_SET (pMob->act3, ACT3_GUARD_DOOR_ALIGN)) { send_to_char ("This mob is not set to guard.\n\r", ch); return; } if (!IS_SET (pMob->act3, ACT3_GUARD_ITEM) && !IS_SET (pMob->act3, ACT3_GUARD_MOB)) { int door; if (str_cmp (arg2, "none")) door = get_direction_number (arg2); else door = -1; if (door < -1 || door > 5) { send_to_char ("Door number out of range.\n\r", ch); return; } else pMob->guard = door; } else pMob->guard = atoi (arg2); mindex_window (ch, pMob, 6); SET_BIT (pArea->area_flags, AREA_CHANGED); send_to_char ("Guard set.\n\r", ch); return; } break; case 'H': if (!str_cmp (arg1, "hp")) { int tmp=0; if (arg2[0] == '\0' || !is_number (arg2)) { send_to_char ("Syntax: hp [multiplier * 10]\n\r", ch); send_to_char ("...so 1.5 times hp would be set by 'hp 15'.\n\r", ch); return; } if (atoi (arg2) < 0) { send_to_char ("Multiplier can't be less than zero.\n\r", ch); return; } if (pMob->hpmult>1000 && (atoi(arg2))<1000) { tmp=pMob->hpmult/1000; } pMob->hpmult = atoi (arg2); if (tmp!=0) { pMob->hpmult+=(tmp*1000); } mindex_window (ch, pMob, 1); send_to_char ("Hp multiplier set.\n\r", ch); return; } if (!str_cmp (arg1, "height")) { if (value == -1 || value == 0) { pMob->height = -1; send_to_char ("Height set to default for mobtype.\n\r", ch); SET_BIT (pArea->area_flags, AREA_CHANGED); mindex_window (ch, pMob, 4); return; } pMob->height = value; send_to_char ("Height set.\n\r", ch); mindex_window (ch, pMob, 4); SET_BIT (pArea->area_flags, AREA_CHANGED); return; } if (!str_cmp (arg1, "hitroll")) { if (value > 0) { send_to_char ("Hitroll value set.\n\r", ch); pMob->hitroll = value; } else { send_to_char ("Hitroll value cleared.\n\r", ch); pMob->hitroll = 0; } SET_BIT (pArea->area_flags, AREA_CHANGED); return; } break; case 'L': if (!str_cmp (arg1, "long")) { /* int value; */ if (arg2[0] == '\0') { send_to_char ("Syntax: long [string]\n\r", ch); return; } free_string (pMob->long_descr); strcat (arg2, "\n\r"); pMob->long_descr = str_dup (check_mob_long(arg2,ch)); mindex_window (ch, pMob, 7); /* if ( (value=mob_name_type( pMob->long_descr )) >= 0 ) pMob->mobtype = value; */ SET_BIT (pArea->area_flags, AREA_CHANGED); send_to_char ("Long description set.\n\r", ch); return; } if (!str_cmp (arg1, "level")) { if (arg2[0] == '\0' || !is_number (arg2)) { send_to_char ("Syntax: level [number]\n\r", ch); return; } pMob->level = atoi (arg2); mindex_window (ch, pMob, 1); SET_BIT (pArea->area_flags, AREA_CHANGED); send_to_char ("Level set.\n\r", ch); return; } break; case 'M': if (!str_cmp (arg1, "money")) { if (arg2[0] == '\0' || !is_number (arg2)) { send_to_char ("Syntax: money [amount in copper]\n\r", ch); return; } pMob->money = atoi (arg2); mindex_window (ch, pMob, 1); SET_BIT (pArea->area_flags, AREA_CHANGED); send_to_char ("Monetary amount set.\n\r", ch); return; } if ((!str_cmp (arg1, "miw") || !str_cmp (arg1, "max")) && value > 0) { pMob->max_in_world = value; send_to_char ("Max in world set.\n\r", ch); SET_BIT (pArea->area_flags, AREA_CHANGED); mindex_window (ch, pMob, 4); return; } if (!str_cmp(arg1, "male")) { pMob->sex = SEX_MALE; SET_BIT (pArea->area_flags, AREA_CHANGED); mindex_window (ch, pMob, 1); send_to_char ("Sex set.\n\r", ch); return; } break; case 'N': if (!str_cmp (arg1, "name")) { bool ffund; /* int k; int value; */ if (arg2[0] == '\0') { send_to_char ("Syntax: name [string]\n\r", ch); return; } ffund = FALSE; /* for (k=0;k<MAX_PLAYERS;k++) { if (!infix(playerbase.player_name[k],argy)) { ffund=TRUE; break; } } if (ffund) { send_to_char("Someone has a name with one of those words in it.\n\r",ch); return; }*/ free_string (pMob->name); pMob->name = str_dup (check_mob_name(arg2,ch)); mindex_window (ch, pMob, 2); /* if ( (value=mob_name_type( pMob->name )) >= 0 ) pMob->mobtype = value; */ SET_BIT (pArea->area_flags, AREA_CHANGED); send_to_char ("Name set.\n\r", ch); return; } if (!str_cmp(arg1, "neutral") || !str_cmp(arg1, "neuter")) { pMob->sex = SEX_NEUTRAL; SET_BIT (pArea->area_flags, AREA_CHANGED); mindex_window (ch, pMob, 1); send_to_char ("Sex set.\n\r", ch); return; } if (!str_cmp (arg, "none")) { pMob->spec_fun = NULL; free_string (pMob->spec_name); pMob->spec_name = str_dup (""); mindex_window (ch, pMob, 3); SET_BIT (pArea->area_flags, AREA_CHANGED); send_to_char ("Spec removed.\n\r", ch); return; } break; case 'P': if (!str_cmp (arg1, "parry")) { if (value > 0) { send_to_char ("Parry value set.\n\r", ch); pMob->parry = value; } else { send_to_char ("Parry value cleared.\n\r", ch); pMob->parry = 0; } SET_BIT (pArea->area_flags, AREA_CHANGED); return; } if (!str_cmp (arg1, "points")) { if (value > 0) { send_to_char ("Points value set.\n\r", ch); pMob->points = value; } else { send_to_char ("Points value cleared.\n\r", ch); pMob->points = 0; } SET_BIT (pArea->area_flags, AREA_CHANGED); return; } break; case 'S': if (!str_cmp (arg1, "short")) { /* int value; */ if (arg2[0] == '\0') { send_to_char ("Syntax: short [string]\n\r", ch); return; } free_string (pMob->short_descr); pMob->short_descr = str_dup (check_mob_short(arg2,ch)); mindex_window (ch, pMob, 3); /* if ( (value=mob_name_type( pMob->short_descr )) >= 0 ) pMob->mobtype = value; */ SET_BIT (pArea->area_flags, AREA_CHANGED); send_to_char ("Short description set.\n\r", ch); return; } if (!str_cmp (arg1, "summons")) { if (LEVEL(ch) < MAX_LEVEL) return; if (arg2[0] == '\0') { send_to_char ("Syntax: summons <mob vnum>", ch); return; } if (!IS_SET(pMob->act4, ACT4_SUMMONER)) { send_to_char ("This mob is not set as a summoner, try 4summoner first.\n\r", ch); return; } if (!pMob->opt) pMob->opt = new_optional(); pMob->opt->summons = atoi (arg2); mindex_window (ch, pMob, 6); SET_BIT (pArea->area_flags, AREA_CHANGED); send_to_char ("Summons set.\n\r", ch); return; } if (!str_cmp (arg1, "shop")) { argy = one_argy (argy, arg1); strcpy (arg2, argy); if (arg1[0] == '\0') { send_to_char ("Syntax: shop hours [#opening] [#closing]\n\r", ch); send_to_char (" shop profit [#buying%] [#selling%]\n\r", ch); send_to_char (" shop decrease [Decrease %]\n\r", ch); send_to_char (" shop items [# until decrease %]\n\r", ch); send_to_char (" shop type [#1-5] [item type]\n\r", ch); send_to_char (" shop creates [#vnum#]\n\r", ch); send_to_char (" shop creates_hours [#hours#]\n\r", ch); send_to_char (" shop message <create_message>\n\r", ch); send_to_char (" shop delete\n\r", ch); return; } if (!str_cmp (arg1, "hours")) { argy = one_argy (argy, arg1); strcpy (arg2, argy); if (arg1[0] == '\0' || !is_number (arg1) || arg2[0] == '\0' || !is_number (arg2)) { send_to_char ("Syntax: shop hours [#opening] [#closing]\n\r", ch); return; } if (pMob->pShop == NULL) { new_shop (pMob); /*pMob->pShop->keeper = pMob->vnum; if (shop_last) shop_last->next = pMob->pShop; else { shop_first=pMob->pShop; shop_last=pMob->pShop; }*/ } pMob->pShop->open_hour = atoi (arg1); pMob->pShop->close_hour = atoi (arg2); SET_BIT (pArea->area_flags, AREA_CHANGED); send_to_char ("Shop hours set.\n\r", ch); return; } if (!str_cmp (arg1, "decrease")) { int joeman; argy = one_argy (argy, arg1); if (arg1[0] == '\0' || !is_number (arg1)) { send_to_char ("Syntax: shop decrease [#decrease percent#]\n\r", ch); return; } joeman = atoi (arg1); if (joeman < 1 || joeman > 100) { send_to_char ("Must be between 1 and 100!\n\r", ch); return; } if (pMob->pShop == NULL) { new_shop (pMob); } pMob->pShop->decrease = joeman; SET_BIT (pArea->area_flags, AREA_CHANGED); send_to_char ("Shop decrease percent set.\n\r", ch); } if (!str_cmp (arg1, "creates")) { int joeman; argy = one_argy (argy, arg1); if (arg1[0] == '\0' || !is_number (arg1)) { send_to_char ("Syntax: shop creates [#vnum#]\n\r", ch); return; } joeman = atoi (arg1); if (joeman != 0 && (joeman < 1 || (get_obj_index (joeman) == NULL))) { send_to_char ("Invalid object!\n\r", ch); return; } if (pMob->pShop == NULL) { new_shop (pMob); } pMob->pShop->creates_vnum = joeman; SET_BIT (pArea->area_flags, AREA_CHANGED); send_to_char ("Shop creates vnum set.\n\r", ch); return; } if (!str_cmp (arg1, "createhours") || !str_cmp (arg1, "create_hour") || !str_cmp (arg1, "create_hours") || !str_cmp (arg1, "creates_hours")) { int joeman; argy = one_argy (argy, arg1); if (arg1[0] == '\0' || !is_number (arg1)) { send_to_char ("Syntax: shop creates_hours [#game_ticks#]\n\r", ch); return; } joeman = atoi (arg1); if (joeman < 1 || joeman > 30000) { send_to_char ("Invalid creates_hours!\n\r", ch); return; } if (pMob->pShop == NULL) { new_shop (pMob); } pMob->pShop->creates_hours = joeman; SET_BIT (pArea->area_flags, AREA_CHANGED); send_to_char ("Shop creates_hours set.\n\r", ch); return; } if (!str_cmp (arg1, "item") || !str_cmp (arg1, "items")) { int joeman; argy = one_argy (argy, arg1); if (arg1[0] == '\0' || !is_number (arg1)) { send_to_char ("Syntax: shop items [#items before decrease#]\n\r", ch); return; } joeman = atoi (arg1); if (joeman < 1 || joeman > 100) { send_to_char ("Must be between 1 and 100!\n\r", ch); return; } if (pMob->pShop == NULL) { new_shop (pMob); } pMob->pShop->items_until_decrease = joeman; SET_BIT (pArea->area_flags, AREA_CHANGED); send_to_char ("Shop items until decrease set.\n\r", ch); } if (!str_cmp (arg1, "profit")) { argy = one_argy (argy, arg1); strcpy (arg2, argy); if (arg1[0] == '\0' || !is_number (arg1) || arg2[0] == '\0' || !is_number (arg2)) { send_to_char ("Syntax: shop profit [#buying%] [#selling%]\n\r", ch); return; } if (pMob->pShop == NULL) { new_shop (pMob); } pMob->pShop->profit_buy = atoi (arg1); pMob->pShop->profit_sell = atoi (arg2); SET_BIT (pArea->area_flags, AREA_CHANGED); send_to_char ("Shop profit set.\n\r", ch); return; } if (!str_cmp (arg1, "message")) { if (arg2[0] == '\0') { send_to_char ("Syntax: shop message [string] or shop message clear.\n\r", ch); return; } if (pMob->pShop == NULL) { new_shop (pMob); } if (pMob->pShop->creates_message != NULL) free_string (pMob->pShop->creates_message); if (!str_cmp (arg2, "clear")) { pMob->pShop->creates_message = NULL; send_to_char ("String cleared.\n\r", ch); return; } pMob->pShop->creates_message = str_dup (arg2); SET_BIT (pArea->area_flags, AREA_CHANGED); send_to_char ("Shop create message set.\n\r", ch); return; } if (!str_cmp (arg1, "type")) { argy = one_argy (argy, arg1); strcpy (arg2, argy); if (arg1[0] == '\0' || !is_number (arg1) || arg2[0] == '\0') { send_to_char ("Syntax: shop type [#] [item type]\n\r", ch); return; } if (atoi (arg1) > MAX_TRADE) { sprintf (buf, "%d", MAX_TRADE); send_to_char ("REdit: Shop keepers may only sell ", ch); send_to_char (buf, ch); send_to_char (" items max.\n\r", ch); return; } if ((value = item_name_type (arg2)) == ITEM_NONE) { send_to_char ("REdit: That type of item is not known.\n\r", ch); return; } if (pMob->pShop == NULL) { new_shop (pMob); } pMob->pShop->buy_type[atoi (arg1)] = item_name_type (arg2); SET_BIT (pArea->area_flags, AREA_CHANGED); send_to_char ("Shop type set.\n\r", ch); return; } if (!str_cmp (arg1, "delete")) { if (pMob->pShop == NULL) { send_to_char ("REdit: Can't delete a shop that is non-existant.\n\r", ch); return; } free_shop (pMob->pShop); pMob->pShop = NULL; SET_BIT (pArea->area_flags, AREA_CHANGED); send_to_char ("Shop deleted.\n\r", ch); return; } send_to_char ("Syntax: shop hours [#opening] [#closing]\n\r", ch); send_to_char (" shop profit [#buying%] [#selling%]\n\r", ch); send_to_char (" shop decrease [Decrease %]\n\r", ch); send_to_char (" shop items [# until decrease %]\n\r", ch); send_to_char (" shop type [#] [item type]\n\r", ch); send_to_char (" shop creates_hours [#hours#]\n\r", ch); send_to_char (" shop creates [#vnum#]\n\r", ch); send_to_char (" shop message <create_message>\n\r", ch); send_to_char (" shop delete\n\r", ch); return; } break; case 'T': if (!str_cmp (arg1, "teach")) { if (LEVEL (ch) < MAX_LEVEL) { send_to_char ("If you need to use a mob that uses this, get a god to set it.\n\r", ch); return; } if (value > 0 && value <= SKILL_COUNT) { nextfree = 0; if (!pMob->opt) pMob->opt = new_optional (); while (nextfree <= 28) { if (pMob->opt->skltaught[nextfree] == value) { int tmp; tmp = 0; while (tmp <= 27) { if (tmp >= nextfree) { pMob->opt->skltaught[tmp] = pMob->opt->skltaught[tmp + 1]; } tmp++; } pMob->opt->skltaught[28] = 0; send_to_char ("Skill Removed.\n\r", ch); nextfree = 29; return; /*REMOVE SKILL ABOVE */ } nextfree++; } nextfree = 0; while (nextfree <= 28) { if (pMob->opt->skltaught[nextfree] == 0) { pMob->opt->skltaught[nextfree] = value; send_to_char ("Skill Set.\n\r", ch); nextfree = 29; return; } nextfree++; } if (nextfree == 30) send_to_char ("Out of slots.\n\r", ch); } SET_BIT (pArea->area_flags, AREA_CHANGED); return; } if (!str_cmp (arg1, "timer")) { if (arg2[0] == '\0' || !is_number (arg2)) { send_to_char ("Syntax: timer [ticks]\n\r", ch); return; } pMob->timer = atoi (arg2); SET_BIT (pArea->area_flags, AREA_CHANGED); send_to_char ("Timer set.\n\r", ch); return; } break; case 'W': if (!str_cmp (arg1, "willhelp")) { char bufff[500]; if (value < 0 || value >= 127) { send_to_char ("Syntax is help <number>, where number is a 1 in <number> chance\n\rthe mob will come assist the yeller.\n\r", ch); return; } pMob->will_help = value; mindex_window (ch, pMob, 6); if (pMob->will_help == 0) { send_to_char ("Mob will no longer hunt out yellers with a similar yeller_num.\n\r", ch); pMob->will_help = 0; return; } sprintf (bufff, "Mob will now help out a yeller at 1 in %d chance.\n\r", pMob->will_help); send_to_char (bufff, ch); SET_BIT (pArea->area_flags, AREA_CHANGED); return; } if (!str_prefix ("warrior_p", arg1) && LEVEL (ch) > 109) { if (!pMob->opt) pMob->opt = new_optional (); if (value >= 0) pMob->opt->warrior_percent = value; send_to_char ("Warrior Percentage set.\n\r", ch); SET_BIT (pArea->area_flags, AREA_CHANGED); return; } break; case 'Y': if (!str_cmp (arg1, "yeller")) { if (value >= 0) { pMob->yeller_number = value; mindex_window (ch, pMob, 6); if (value == 0) send_to_char ("Mob is no longer a yeller.\n\r", ch); else send_to_char ("Yeller number set.\n\r", ch); } else send_to_char ("Syntax is yeller <yell_number>.\n\r", ch); return; } break; } if ((value = affect_name_bit (arg1)) != AFFECT_NONE) { pMob->affected_by ^= value; SET_BIT (pArea->area_flags, AREA_CHANGED); mindex_window (ch, pMob, 5); send_to_char ("Affect flag toggled.\n\r", ch); return; } if ((value = affect_name_bit_two (arg1)) != AFFECT_NONE) { pMob->more_affected_by ^= value; mindex_window (ch, pMob, 5); SET_BIT (pArea->area_flags, AREA_CHANGED); send_to_char ("Affect flag toggled.\n\r", ch); return; } if ((value = mob_name_type (arg1)) >= 0) { pMob->mobtype = value; mindex_window (ch, pMob, 6); SET_BIT (pArea->area_flags, AREA_CHANGED); send_to_char ("Mob type set to \x1B[1;31m", ch); send_to_char (mob_type_name (value), ch); send_to_char ("\x1B[0m.\n\r", ch); return; } if ((value = race_name_bit (arg1)) != 0) { pMob->race_hate ^= value; mindex_window (ch, pMob, 4); SET_BIT (pArea->area_flags, AREA_CHANGED); send_to_char ("Race_hate flag toggled.\n\r", ch); return; } if ((value = act_name_bit (arg1)) != ACT_NONE) { if (arg1[0] == '3') pMob->act3 ^= value; else if (arg1[0] == '4') pMob->act4 ^= value; else pMob->act ^= value; mindex_window (ch, pMob, 4); SET_BIT (pArea->area_flags, AREA_CHANGED); send_to_char ("Act flag toggled.\n\r", ch); return; } if (get_mob_spec (arg) != NULL) { pMob->spec_fun = get_mob_spec (arg); if (pMob->spec_name) free_string (pMob->spec_name); sprintf (buf, "spec_%s", arg); pMob->spec_name = str_dup (buf); mindex_window (ch, pMob, 3); SET_BIT (pArea->area_flags, AREA_CHANGED); send_to_char ("Spec set.\n\r", ch); return; } } if (!str_suffix ("edit", arg)) { char minibuf[200]; sprintf (minibuf, "\x1B[1;%dr\x1B[2JDone.\n\r", ch->pcdata->pagelen); send_to_char (minibuf, ch); } if (hugebuf_o[0]!='\0') { page_to_char(hugebuf_o,ch); return; } interpret (ch, arg); return; }