#include <ctype.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include "mud.h" #ifndef WINDOWS #include <sys/errno.h> #include <netinet/in.h> #include <signal.h> #include <sys/types.h> #include <sys/time.h> #include <dirent.h> #endif int aan(int i) { if (materials[i].name[0] == 'a' || materials[i].name[0] == 'e' || materials[i].name[0] == 'i' || materials[i].name[0] == 'o' || materials[i].name[0] == 'u') return 1; return 0; } const struct weapon_damage wdt[] = { {1,3}, {1,4}, {3,1}, {2,2}, {1,5}, {1,6}, {4,1}, {2,3}, {1,7}, {3,2}, {1,8}, {5,1}, {2,4}, {1,9}, {1,10}, {6,1}, {3,3}, {2,5}, {1,11}, {1,12}, {7,1}, {2,6}, {1,13}, {5,2}, {3,4}, {1,14}, {8,1}, {4,3}, {2,7}, {9,1}, {6,2}, {3,5}, {2,8}, {10,1}, {5,3}, {4,4}, {2,9}, {7,2}, {3,6}, {2,10}, {8,2}, {6,3}, {4,5}, {3,7}, {2,11}, {5,4}, {9,2}, {7,3}, {10,2}, }; void create_standards(CHAR_DATA *ch, char *argy) { int mat=0; int loc=0; AREA_DATA *pArea; char buf[STD_LENGTH]; int iHash; bool firstraw = FALSE; char strr[STD_LENGTH]; DEFINE_COMMAND("standards", create_standards, POSITION_STANDING, MAX_LEVEL, LOG_ALWAYS, "This creates the standard items for forging 90000-90999 area.") if (IS_MOB(ch)) return; if (LEVEL(ch) != MAX_LEVEL) return; if (!ch->in_room) return; if (ch->in_room->vnum != 90000) { send_to_char("You must be in room 90000 to use this command with a 2000 room area set up.\n\r", ch); return; } pArea = ch->in_room->area; if (str_cmp(NAME(ch), "Mephistos")) { send_to_char("Only Mephistos can do this cuz if you do this more than once it REALLY screws things up.\n\r", ch); return; } /* This loop makes the forged equipment. */ for (mat = 0; str_cmp(materials[mat].name,"END"); mat++) { for (loc = 0; str_cmp(forged[loc].name, "end_of_list"); loc++) { OBJ_PROTOTYPE *pObj; pObj = new_obj_index (); /* set up general information These are special items..be careful */ pObj->item_type = forged[loc].item_type; pObj->made_of = mat+1; pObj->max_in_room = 0; pObj->timer = 0; pObj->weight = materials[mat].weight/forged[loc].weight_divisor; pObj->cost = materials[mat].cost/forged[loc].cost_divisor; pObj->wear_flags = (ITEM_TAKE | forged[loc].wear_loc); pObj->vnum = 90000 + 40*mat + loc; pObj->extra_flags = materials[mat].initflags; pObj->affected = NULL; if (materials[mat].bigbonus != 0) pObj->extra_flags |= ITEM_NOSTORE; pObj->area = pArea; if (pObj->vnum > top_vnum_obj) top_vnum_obj = pObj->vnum; iHash = pObj->vnum % HASH_MAX; pObj->next = obj_index_hash[iHash]; obj_index_hash[iHash] = pObj; pArea->obj_count++; /* Set up the name */ free_string(pObj->name); sprintf(buf, "%s %s %s", materials[mat].name, forged[loc].name, (!str_infix(forged[loc].name, "bow") ? "bow" : "")); pObj->name = str_dup (buf); /* Set up the short descr If it is a wpn or armor use name, otherwise use name and name2 as descriptive name. */ free_string(pObj->short_descr); strr[0] = '\0'; buf[0] = '\0'; sprintf(buf, materials[mat].colorname); strcpy(strr, anseval (str_dup(buf), ch)); sprintf(buf, "%s %s %s", forged[loc].name2, strr, forged[loc].name); pObj->short_descr = str_dup(buf); /* Set up the desc you see in the room. */ free_string(pObj->long_descr); sprintf(buf, "%s %s %s %s\n\r", forged[loc].name2, materials[mat].name, forged[loc].name, (number_range(1,3) == 2 ? "has been left here." : (number_range(1,2) == 2 ? "lies here gathering dust." : "is here."))); buf[0] = UPPER(buf[0]); pObj->long_descr = str_dup(buf); switch(pObj->item_type) { case ITEM_ARMOR: { pObj->value[6] = materials[mat].strength; pObj->value[7] = materials[mat].strength; pObj->value[9] = (mat+4)/4; switch(forged[loc].armor_location) { case 0: case 1: case 2: case 3: { pObj->value[forged[loc].armor_location] = materials[mat].armor + forged[loc].adjust; } break; case 4: { int i; for (i = 0; i < 4; i++) { pObj->value[i] = UMAX(1, (materials[mat].armor + forged[loc].adjust)*2/3); } } } /* Now set up extra affects */ if (materials[mat].bigbonus > 0 && (forged[loc].location != 2 || forged[loc].num_wear_slots != 2)) { AFFECT_DATA *pAf; pAf = new_affect (); pAf->modifier = 1; pAf->type = 1; pAf->next = pObj->affected; pObj->affected = pAf; switch (forged[loc].location) { case 0: pAf->location = (forged[loc].num_wear_slots == 1 ? APPLY_INT : APPLY_WIS); break; case 1: pAf->location = APPLY_DAMROLL; break; case 2: pAf->location = APPLY_DEX; break; } } if (materials[mat].kickbonus/forged[loc].num_wear_slots > 0 && forged[loc].location == 2) { AFFECT_DATA *pAf; pAf = new_affect (); pAf->modifier = materials[mat].kickbonus/forged[loc].num_wear_slots; pAf->type = 1; pAf->next = pObj->affected; pObj->affected = pAf; pAf->location = APPLY_KICK_DAMAGE; } if (materials[mat].bigbonus > 0 && (loc == 0 || loc == 6)) { AFFECT_DATA *pAf; pAf = new_affect (); pAf->modifier = 1; pAf->type = 1; pAf->next = pObj->affected; pObj->affected = pAf; pAf->location = APPLY_STR; } if ((materials[mat].bonushit)/forged[loc].num_wear_slots > 0) { AFFECT_DATA *pAf; pAf = new_affect (); pAf->modifier = (materials[mat].bonushit)/forged[loc].num_wear_slots; pAf->type = 1; pAf->next = pObj->affected; pObj->affected = pAf; pAf->location = APPLY_HITROLL; } if ((materials[mat].bonushp)/forged[loc].num_wear_slots> 0) { AFFECT_DATA *pAf; pAf = new_affect (); pAf->modifier = (materials[mat].bonushp)/forged[loc].num_wear_slots; pAf->type = 1; pAf->next = pObj->affected; pObj->affected = pAf; pAf->location = APPLY_HIT; } if ((materials[mat].bonusmove)/forged[loc].num_wear_slots > 0) { AFFECT_DATA *pAf; pAf = new_affect (); pAf->modifier = (materials[mat].bonusmove)/forged[loc].num_wear_slots; pAf->type = 1; pAf->next = pObj->affected; pObj->affected = pAf; pAf->location = APPLY_MOVE; } if ((materials[mat].bonushit)/forged[loc].num_wear_slots > 0 && forged[loc].location == 0) { AFFECT_DATA *pAf; pAf = new_affect (); pAf->modifier = (materials[mat].bonushit)/forged[loc].num_wear_slots; pAf->type = 1; pAf->next = pObj->affected; pObj->affected = pAf; pAf->location = APPLY_SAVING_THROW; } } break; case ITEM_AMMO: /* Ammo has no affects on it. */ { pObj->value[7] = wdt[UMAX(0, 3*mat+forged[loc].adjust)].firstdice; pObj->value[8] = wdt[UMAX(0, 3*mat+forged[loc].adjust)].seconddice; pObj->value[4] = (loc > 28 ? (loc-29) %3 +1 : 0); pObj->value[0] = 10; pObj->value[1] = 10; } break; case ITEM_MISSILE: { pObj->value[1] = materials[mat].strength; pObj->value[2] = 15; pObj->value[3] = 1 + loc % 3; pObj->value[4] = (loc > 25 ? (loc-26) %3 +1 : 0); pObj->value[5] = 1 + mat/6; } break; case ITEM_WEAPON: { pObj->value[3] = forged[loc].armor_location; pObj->extra_flags |= forged[loc].location; pObj->value[1] = materials[mat].strength; pObj->value[7] = wdt[UMAX(0, 3*mat+forged[loc].adjust)].firstdice; pObj->value[8] = wdt[UMAX(0, 3*mat+forged[loc].adjust)].seconddice; pObj->value[4] = (loc > 28 ? (loc-29) % 3 +1 : 0); /* Only ranged wpns and ammo get item types... */ if (mat > 12) pObj->extra_flags |= ITEM_POWER; if (mat > 10) pObj->extra_flags |= ITEM_WOUND; if (mat == 9 || mat == 10) pObj->extra_flags |= ITEM_ELEMENTAL; if (loc <= 28) { if (materials[mat].bonushit + UMIN(2,(26-loc)) != 0) { AFFECT_DATA *pAf; pAf = new_affect (); pAf->modifier = materials[mat].bonushit + UMIN(2,(26-loc)); pAf->type = 1; pAf->next = pObj->affected; pObj->affected = pAf; pAf->location = APPLY_HITROLL; } if (mat/7+loc-22 > 0) { AFFECT_DATA *pAf; pAf = new_affect (); pAf->modifier = URANGE(1, mat/7+loc-24, 3); pAf->type = 1; pAf->next = pObj->affected; pObj->affected = pAf; pAf->location = APPLY_DAMROLL; } } } break; case ITEM_TOOL: case ITEM_FURNITURE: { pObj->value[0] = forged[loc].adjust; } break; case ITEM_CONTAINER: { pObj->value[1] = forged[loc].adjust; pObj->value[0] = 100; } break; case ITEM_RAW: { pObj->value[0] = RAW_MINERAL; pObj->value[1] = mat+1; pObj->weight = 2; } break; } } } for (mat = 0; str_cmp(hide_types[mat].name,"end_of_list"); mat++) { firstraw = FALSE; for (loc = 0; str_cmp(textiles[loc].name, "end_of_list"); loc++) { OBJ_PROTOTYPE *pObj; pObj = new_obj_index (); /* set up general information These are special items..be careful */ pObj->item_type = textiles[loc].item_type; pObj->made_of = mat+1; pObj->max_in_room = 0; pObj->timer = 0; pObj->weight = hide_types[mat].weight/textiles[loc].weight_divisor; pObj->cost = hide_types[mat].cost/textiles[loc].cost_divisor; pObj->wear_flags = (ITEM_TAKE | textiles[loc].wear_loc); pObj->vnum = 90700 + 20*mat + loc; pObj->extra_flags = hide_types[mat].initflags; pObj->affected = NULL; if (hide_types[mat].bigbonus != 0) pObj->extra_flags |= ITEM_NOSTORE; pObj->area = pArea; if (pObj->vnum > top_vnum_obj) top_vnum_obj = pObj->vnum; iHash = pObj->vnum % HASH_MAX; pObj->next = obj_index_hash[iHash]; obj_index_hash[iHash] = pObj; pArea->obj_count++; /* Set up the name */ free_string(pObj->name); sprintf(buf, "%s %s leather", hide_types[mat].name, textiles[loc].name); pObj->name = str_dup (buf); /* Set up the short descr If it is a wpn or armor use name, otherwise use name and name2 as descriptive name. */ free_string(pObj->short_descr); strr[0] = '\0'; buf[0] = '\0'; sprintf(buf, hide_types[mat].colorname); strcpy(strr, anseval (str_dup(buf), ch)); /* Set up the short desc of the object. */ sprintf(buf, "%s %s %s", textiles[loc].name2, strr, textiles[loc].name); pObj->short_descr = str_dup(buf); /* Set up the desc you see in the room. */ free_string(pObj->long_descr); sprintf(buf, "A %sskin %s %s\n\r", hide_types[mat].name, textiles[loc].name, (number_range(1,3) == 2 ? "has been left here." : (number_range(1,2) == 2 ? "lies here gathering dust." : "is here."))); buf[0] = UPPER(buf[0]); pObj->long_descr = str_dup(buf); switch(pObj->item_type) { default: break; case ITEM_ARMOR: { pObj->value[6] = hide_types[mat].strength; pObj->value[7] = hide_types[mat].strength; pObj->value[9] = (mat+4)/4; switch(textiles[loc].armor_location) { case 0: case 1: case 2: case 3: { pObj->value[textiles[loc].armor_location] = hide_types[mat].armor + textiles[loc].adjust; } break; case 4: { int i; for (i = 0; i < 4; i++) { pObj->value[i] = UMAX(1, (hide_types[mat].armor + textiles[loc].adjust)*2/3); } } } /* Now set up extra affects */ if (hide_types[mat].bigbonus > 0 && (textiles[loc].location != 2 || textiles[loc].num_wear_slots != 2)) { AFFECT_DATA *pAf; pAf = new_affect (); pAf->modifier = 1; pAf->type = 1; pAf->next = pObj->affected; pObj->affected = pAf; switch (textiles[loc].location) { case 0: pAf->location = (textiles[loc].num_wear_slots == 1 ? APPLY_INT : APPLY_WIS); break; case 1: pAf->location = APPLY_DAMROLL; break; case 2: pAf->location = APPLY_DEX; break; } } if (hide_types[mat].kickbonus/textiles[loc].num_wear_slots > 0 && textiles[loc].location == 2) { AFFECT_DATA *pAf; pAf = new_affect (); pAf->modifier = hide_types[mat].kickbonus/textiles[loc].num_wear_slots; pAf->type = 1; pAf->next = pObj->affected; pObj->affected = pAf; pAf->location = APPLY_KICK_DAMAGE; } if (hide_types[mat].bigbonus > 0 && (loc == 0 || loc == 6)) { AFFECT_DATA *pAf; pAf = new_affect (); pAf->modifier = 1; pAf->type = 1; pAf->next = pObj->affected; pObj->affected = pAf; pAf->location = APPLY_STR; } if ((hide_types[mat].bonushit)/textiles[loc].num_wear_slots > 0) { AFFECT_DATA *pAf; pAf = new_affect (); pAf->modifier = (hide_types[mat].bonushit)/textiles[loc].num_wear_slots; pAf->type = 1; pAf->next = pObj->affected; pObj->affected = pAf; pAf->location = APPLY_HITROLL; } if ((hide_types[mat].bonushp)/textiles[loc].num_wear_slots> 0) { AFFECT_DATA *pAf; pAf = new_affect (); pAf->modifier = (hide_types[mat].bonushp)/textiles[loc].num_wear_slots; pAf->type = 1; pAf->next = pObj->affected; pObj->affected = pAf; pAf->location = APPLY_HIT; } if ((hide_types[mat].bonusmove)/textiles[loc].num_wear_slots > 0) { AFFECT_DATA *pAf; pAf = new_affect (); pAf->modifier = (hide_types[mat].bonusmove)/textiles[loc].num_wear_slots; pAf->type = 1; pAf->next = pObj->affected; pObj->affected = pAf; pAf->location = APPLY_MOVE; } if ((hide_types[mat].bonushit)/textiles[loc].num_wear_slots > 0 && textiles[loc].location == 0) { AFFECT_DATA *pAf; pAf = new_affect (); pAf->modifier = (hide_types[mat].bonushit)/textiles[loc].num_wear_slots; pAf->type = 1; pAf->next = pObj->affected; pObj->affected = pAf; pAf->location = APPLY_SAVING_THROW; } } break; case ITEM_RAW: { firstraw = TRUE; free_string(pObj->name); sprintf(buf, "%s %s hide skin", hide_types[mat].name, textiles[loc].name); pObj->name = str_dup (buf); free_string(pObj->short_descr); sprintf(buf, hide_types[mat].colorname); strcpy(strr, anseval (str_dup(buf), ch)); sprintf(buf, "a %s %s", strr, textiles[loc].name ); pObj->short_descr = str_dup(buf); free_string(pObj->long_descr); sprintf(buf, "A %sskin %s %s\n\r", hide_types[mat].name, textiles[loc].name, (number_range(1,3) == 2 ? "has been left here." : (number_range(1,2) == 2 ? "lies here gathering dust." : "is here."))); buf[0] = UPPER(buf[0]); pObj->long_descr = str_dup(buf); pObj->value[0] = RAW_HIDE + firstraw; firstraw = TRUE; pObj->value[1] = mat+1; pObj->weight = 2; } break; } } } for (mat = 0; str_cmp(cloth_types[mat].name,"end_of_list"); mat++) { firstraw = FALSE; for (loc = 0; str_cmp(textiles[loc].name, "end_of_list"); loc++) { OBJ_PROTOTYPE *pObj; pObj = new_obj_index (); /* set up general information These are special items..be careful */ pObj->item_type = textiles[loc].item_type; pObj->made_of = mat+1; pObj->max_in_room = 0; pObj->timer = 0; pObj->weight = cloth_types[mat].weight/textiles[loc].weight_divisor; pObj->cost = cloth_types[mat].cost/textiles[loc].cost_divisor; pObj->wear_flags = (ITEM_TAKE | textiles[loc].wear_loc); pObj->vnum = 91200 + 20*mat + loc; pObj->extra_flags = cloth_types[mat].initflags; pObj->affected = NULL; if (cloth_types[mat].bigbonus != 0) pObj->extra_flags |= ITEM_NOSTORE; pObj->area = pArea; if (pObj->vnum > top_vnum_obj) top_vnum_obj = pObj->vnum; iHash = pObj->vnum % HASH_MAX; pObj->next = obj_index_hash[iHash]; obj_index_hash[iHash] = pObj; pArea->obj_count++; /* Set up the name */ switch(pObj->item_type) { default: break; case ITEM_ARMOR: { free_string(pObj->name); sprintf(buf, "%s %s textile", cloth_types[mat].name, textiles[loc].name); pObj->name = str_dup (buf); free_string(pObj->short_descr); sprintf(buf, cloth_types[mat].colorname); strcpy(strr, anseval (str_dup(buf), ch)); sprintf(buf, "%s %s %s", textiles[loc].name2, strr, textiles[loc].name); pObj->short_descr = str_dup(buf); free_string(pObj->long_descr); sprintf(buf, "%s %s %s %s\n\r", textiles[loc].name2, cloth_types[mat].name, textiles[loc].name, (number_range(1,3) == 2 ? "has been left here." : (number_range(1,2) == 2 ? "is here gathering dust." : "is here."))); buf[0] = UPPER(buf[0]); pObj->long_descr = str_dup(buf); pObj->value[6] = cloth_types[mat].strength; pObj->value[7] = cloth_types[mat].strength; pObj->value[9] = (mat+4)/4; switch(textiles[loc].armor_location) { case 0: case 1: case 2: case 3: { pObj->value[textiles[loc].armor_location] = cloth_types[mat].armor + textiles[loc].adjust; } break; case 4: { int i; for (i = 0; i < 4; i++) { pObj->value[i] = UMAX(1, (cloth_types[mat].armor + textiles[loc].adjust)*2/3); } } } /* Now set up extra affects */ if (cloth_types[mat].bigbonus > 0 && (textiles[loc].location != 2 || textiles[loc].num_wear_slots != 2)) { AFFECT_DATA *pAf; pAf = new_affect (); pAf->modifier = 1; pAf->type = 1; pAf->next = pObj->affected; pObj->affected = pAf; switch (textiles[loc].location) { case 0: pAf->location = (textiles[loc].num_wear_slots == 1 ? APPLY_INT : APPLY_WIS); break; case 1: pAf->location = APPLY_DAMROLL; break; case 2: pAf->location = APPLY_DEX; break; } } if (cloth_types[mat].kickbonus/textiles[loc].num_wear_slots > 0 && textiles[loc].location == 2) { AFFECT_DATA *pAf; pAf = new_affect (); pAf->modifier = cloth_types[mat].kickbonus/textiles[loc].num_wear_slots; pAf->type = 1; pAf->next = pObj->affected; pObj->affected = pAf; pAf->location = APPLY_KICK_DAMAGE; } if (cloth_types[mat].bigbonus > 0 && (loc == 0 || loc == 6)) { AFFECT_DATA *pAf; pAf = new_affect (); pAf->modifier = 1; pAf->type = 1; pAf->next = pObj->affected; pObj->affected = pAf; pAf->location = APPLY_STR; } if ((cloth_types[mat].bonushit)/textiles[loc].num_wear_slots > 0) { AFFECT_DATA *pAf; pAf = new_affect (); pAf->modifier = (cloth_types[mat].bonushit)/textiles[loc].num_wear_slots; pAf->type = 1; pAf->next = pObj->affected; pObj->affected = pAf; pAf->location = APPLY_HITROLL; } if ((cloth_types[mat].bonushp)/textiles[loc].num_wear_slots> 0) { AFFECT_DATA *pAf; pAf = new_affect (); pAf->modifier = (cloth_types[mat].bonushp)/textiles[loc].num_wear_slots; pAf->type = 1; pAf->next = pObj->affected; pObj->affected = pAf; pAf->location = APPLY_HIT; } if ((cloth_types[mat].bonusmove)/textiles[loc].num_wear_slots > 0) { AFFECT_DATA *pAf; pAf = new_affect (); pAf->modifier = (cloth_types[mat].bonusmove)/textiles[loc].num_wear_slots; pAf->type = 1; pAf->next = pObj->affected; pObj->affected = pAf; pAf->location = APPLY_MOVE; } if ((cloth_types[mat].bonushit)/textiles[loc].num_wear_slots > 0 && textiles[loc].location == 0) { AFFECT_DATA *pAf; pAf = new_affect (); pAf->modifier = (cloth_types[mat].bonushit)/textiles[loc].num_wear_slots; pAf->type = 1; pAf->next = pObj->affected; pObj->affected = pAf; pAf->location = APPLY_SAVING_THROW; } } break; case ITEM_RAW: { firstraw = TRUE; free_string(pObj->name); sprintf(buf, "%s %s", cloth_types[mat].name, textiles[loc].name2); pObj->name = str_dup (buf); free_string(pObj->short_descr); sprintf(buf, cloth_types[mat].colorname); strcpy(strr, anseval (str_dup(buf), ch)); sprintf(buf, "some %s %s", cloth_types[mat].name, textiles[loc].name2); pObj->short_descr = str_dup(buf); free_string(pObj->long_descr); sprintf(buf, "Some %s %s %s\n\r", cloth_types[mat].name, textiles[loc].name2, (number_range(1,3) == 2 ? "has been left here." : (number_range(1,2) == 2 ? "lies here gathering dust." : "is here."))); buf[0] = UPPER(buf[0]); pObj->long_descr = str_dup(buf); pObj->value[0] = RAW_FIBER + firstraw; firstraw = TRUE; pObj->value[1] = mat+1; pObj->weight = 2; } } } } return; }