/**************************************************************************** * 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. * ***************************************************************************/ /**************************************************************************** * ROM 2.4 is copyright 1993-1998 Russ Taylor * * ROM has been brought to you by the ROM consortium * * Russ Taylor (rtaylor@hypercube.org) * * Gabrielle Taylor (gtaylor@hypercube.org) * * Brian Moore (zump@rom.org) * * By using this code, you have agreed to follow the terms of the * * ROM license, in the file Rom24/doc/rom.license * ***************************************************************************/ /************************************************************* * Based on As the Wheel Weaves's Publshed smithing snippet * * Modded by Stan of Demons Dance * *************************************************************/ /**************************************************************************** * Demon's Dance MUD, and source code are property of Eric Goetschalckx * * By compiling this code, you agree to include the following in your * * login screen: * * Derivative of Demon's Dance, by Enzo/Stan * ***************************************************************************/ #if defined(macintosh) #include <types.h> #elif defined(WIN32) #include <sys/types.h> #include <time.h> #define NOCRYPT #else #include <sys/types.h> #include <sys/time.h> #endif #include <stdio.h> #include <string.h> #include <stdlib.h> #include <ctype.h> #include <time.h> #include "merc.h" #include "interp.h" #include "magic.h" #include "recycle.h" #include "tables.h" #include "lookup.h" #include "arena.h" #include "olc.h" #include "skill_tree.h" int clan_lookup args(( const char *name )); int smith_item_lookup( const char *name ) { int item; for ( item = 0; item < MAX_SMITH_ITEMS; item++ ) { if (LOWER(name[0]) == LOWER(smith_items_table[item].name[0]) && !str_prefix(name,smith_items_table[item].name)) return item; } return 0; } void do_smith( CHAR_DATA *ch, char *argument ) { OBJ_DATA *ore,*item,*furnace,*anvil,*hammer,*barrel,*grinder; AFFECT_DATA *pAf; char arg1[MIL],arg2[MIL],arg3[MIL],arg5[MIL],name_buf[128]; char short_buf[128],long_buf[128],buf[MSL],adj[16],help_buf[MSL]; bool infusing = FALSE, itm = FALSE, hasore = FALSE; bool has_furnace = FALSE, has_anvil = FALSE, has_hammer = FALSE; bool has_barrel = FALSE, has_grinder = FALSE; int i = 0, x = 0, skill = 0, difficulty = 0, y = 0,z = 1; int ya = 0, yb = 0, yc = 0,talent_bonus = 0; int v2_mod = 0; SMITH_ITEM sItem; SMITH_ORE sOre; name_buf[0] = '\0'; short_buf[0] = '\0'; long_buf[0] = '\0'; argument = one_argument( argument, arg1 ); argument = one_argument( argument, arg2 ); argument = one_argument( argument, arg3 ); argument = one_argument( argument, arg5 ); if ( IS_NPC(ch) || ch->desc == NULL ) return; sprintf(help_buf,"None of the arguments can be null, and the syntax must be exact.\n\r\n\r"); strcat(help_buf,"Syntax: smith <material> into <item>\n\r"); strcat(help_buf,"Example: smith steel into dagger\n\r"); if ( arg1[0] == '\0' ) { stc(help_buf,ch); return; } if ( !str_cmp( arg1, "list" ) ) { stc("Item\t\t\tDifficulty Item\t\t\tDifficulty Item\t\t\tDifficulty\n\r",ch); while ( y < (MAX_SMITH_ITEMS - 1)) { if (smith_items_table[y].name != NULL) { skill = get_skill( ch, gsn_forging ); talent_bonus = return_bonus_str(ch,"combat.offense"); debug(ch,"do_smith: skill=%d talent_bonus=%d sum=%d\n\r",skill,talent_bonus,skill+talent_bonus); skill += talent_bonus; if(smith_items_table[y].difficulty <= skill) ptc(ch, "%-21.21s {W%7s{x%s", smith_items_table[y].name,diff(smith_items_table[y].difficulty), z >= 3 ? "\n\r" : " "); } y++; if(z >= 3) z = 1; else z++; } stc("\n\rDifficulty on a scale of 1 through 7 stars, 1 being easiest, 7 being hardest.\n\r",ch); return; } if ( arg2[0] == '\0' || arg3[0] == '\0' ) { stc(help_buf,ch); return; } if ( str_cmp( arg2, "into" ) ) { stc(help_buf,ch); return; } if ( ( ore = get_obj_carry( ch, arg1, ch ) ) != NULL ) { if ( ore->item_type != ITEM_SMITH_ORE ) { sprintf(buf,"%s is not a workable piece of ore.\n\r", ore->name ); stc(buf,ch); return; } for ( x = 0; x < MAX_ORE_ITEMS-1; x++ ) { if ( !str_prefix( smith_ores_table[x].name, ore->name ) ) { hasore = TRUE; break; } } if ( !hasore ) { stc( "That ore isnt on the list!\n\r", ch ); return; } for ( i = 0; i < MAX_SMITH_ITEMS-1; i++ ) { if ( !str_cmp( arg3, smith_items_table[i].name ) ) { //ptc(ch,"You prepare to make %s from %s.\n\r",smith_items_table[i].name, smith_ores_table[x].name ); itm = TRUE; break; } } sItem = smith_items_table[i]; sOre = smith_ores_table[x]; if ( itm == FALSE ) { ptc(ch,"%s is not on the forgeable item list",arg3); return; } if ( skill < difficulty ) { ptc(ch,"Your altered skill is only %d, whereas you would need about %d to forge %s %s.\n\r", get_skill( ch, gsn_forging ), sItem.difficulty, sItem.prefix, sItem.name); return; } /*change it so this works on difference between altered skill and difficulty*/ if ( skill >= 200) sprintf(adj,"flawlessly"); else if ( skill >=166 ) sprintf(adj,"perfectly"); else if ( skill >= 133 ) sprintf(adj,"skillfully"); else if ( skill >= 100 ) sprintf(adj,"masterfully"); else if ( skill >= 90 ) sprintf(adj,"finely"); else if ( skill >= 75 ) sprintf(adj,"well"); else if ( skill >= 50 ) sprintf(adj,"properly"); else if ( skill >= 25 ) sprintf(adj,"simply"); else if ( skill >= 10 ) sprintf(adj,"plainly"); else sprintf(adj,"poorly"); if ( ore->weight < ( sItem.quantity + sItem.weight ) / 2 ) { stc( "You do not have adaquete material.\n\r", ch ); return; } act("$n settles at the smithy.", ch, NULL,NULL,TO_ROOM ); WAIT_STATE( ch, sItem.beats ); difficulty = sItem.difficulty; if ( difficulty > skill ) { act("$n was unable to properly perform the work. Fortunately, the material was spared.", ch, NULL,NULL,TO_ROOM ); act("You were unable to properly perform the work. Fortunately, the material was spared.", ch, NULL,NULL,TO_CHAR ); return; } ptc(ch,"Your are making %s %s from %s.\n\r", sItem.prefix,sItem.name,sOre.name); ptc(ch,"Smithing Summary: {D({W%d{D,{W%d{D,{%c%d{D){x", difficulty,skill,skill - difficulty < 3 ? 'R':'W',skill-difficulty); stc(" (difficulty,skill,excess)\n\r",ch); for ( furnace = ch->in_room->contents; furnace; furnace = furnace->next_content ) { if ( furnace == NULL ) { stc("There is no anvil here for you to work upon.\n\r",ch); return; } if ( furnace->item_type == ITEM_SMITH_FURNACE ) { break; } } /* * Little check to make sure its really ore * -Enzo */ if ( ore->value[0] == 0 ) { act("$n prepares the ore by placing it in the furnace.", ch,NULL,NULL,TO_ROOM); act("You prepare the ore by placing it in the furnace.", ch,NULL,NULL,TO_CHAR); } else { stc("{R->{xThis ore has been tainted somehow. Please give to Enzo for a full refund of non-tainted ore.\n\r",ch); return; } for ( anvil = ch->in_room->contents; anvil; anvil = anvil->next_content ) { if ( anvil == NULL ) { stc("There is no anvil here for you to work upon.\n\r",ch); return; } if ( anvil->item_type == ITEM_SMITH_ANVIL ) { break; } } for ( hammer = ch->in_room->contents; hammer; anvil = hammer->next_content ) { if ( hammer == NULL ) { stc("There is no hammer here for you to work with\n\r",ch); return; } if ( anvil->item_type == ITEM_SMITH_ANVIL ) { ore->value[0] += 1; break; } } act("$n places the heated ore on the anvil and begins to shape it with $t.",ch,hammer->short_descr,NULL,TO_ROOM); act("You place the heated ore on the anvil and begin to shape it with $t.",ch,hammer->short_descr,NULL,TO_CHAR); for ( barrel = ch->in_room->contents; barrel; barrel = barrel->next_content ) { if ( barrel == NULL ) { stc("There is no barrel of water here for you to quench your work in.\n\r",ch); return; } if ( barrel->item_type == ITEM_SMITH_BARREL ) { ore->value[0] += 1; break; } } act("$n places the cooling material in a barrel of water to quench it.",ch,NULL,NULL,TO_ROOM); act("You place the cooling material in a barrel of water to quench it.",ch,NULL,NULL,TO_CHAR); for ( grinder = ch->in_room->contents; grinder; grinder = grinder->next_content ) { if ( grinder == NULL ) { stc("There is no grinder here for you to finish your work on.\n\r",ch); return; } if ( grinder->item_type == ITEM_SMITH_GRINDER ) { ore->value[0] += 1; break; } } act("$n spins the grinding wheel to smooth the rough edges of $s work.",ch,NULL,NULL,TO_ROOM); act("You spin the grinding wheel to smooth the rough edges of your work.",ch,NULL,NULL,TO_CHAR); check_improve( ch, gsn_forging, TRUE, 1 ); debug(ch,"do_smith: (i,x)=(%d,%d)\n\r",i,x); switch (i) { case 26: item = create_object( get_obj_index( 10011 ), 1 ); break; case 27: item = create_object( get_obj_index( 10012 ), 1 ); break; default: item = create_object( get_obj_index( SMITH_PRODUCT ), 1 ); break; } sprintf( name_buf, "%s %s", sOre.name, sItem.name ); sprintf( short_buf, "%s %s{x, %s forged from %s %s{x", sItem.prefix, sItem.display, adj, sOre.color, sOre.display ); sprintf( long_buf, "Here lies %s %s{x, %s forged from %s %s{x.", sItem.prefix, sItem.display, adj, sOre.color, sOre.display ); item->level = ch->level; item->name = str_dup( name_buf ); item->short_descr = str_dup( short_buf ); item->orig_short = str_dup( short_buf ); item->description = str_dup( long_buf ); item->item_type = sItem.item_type; item->wear_flags += sItem.wear_flags; item->weight = 1; item->condition = 100; item->cost = sItem.weight; item->material = str_dup( sOre.name ); item->level = ch->level - (skill/10); if(item->level < sItem.min_level) item->level = sItem.min_level; if ( item->item_type == ITEM_WEAPON ) { item->value[0] = sItem.base_v0; item->value[1] = sItem.base_v1; item->value[2] = sItem.base_v2; item->value[3] = attack_lookup( sItem.dam_noun ); } if ( item->item_type == ITEM_ARMOR ) { item->value[0] = sItem.base_pierce; item->value[0] += sOre.armor_mod; item->value[0] += (skill / 4); item->value[1] = sItem.base_bash; item->value[1] += sOre.armor_mod; item->value[1] += (skill / 4); item->value[2] = sItem.base_slash; item->value[2] += sOre.armor_mod; item->value[2] += (skill / 4); item->value[3] = sItem.base_exotic; item->value[3] += sOre.armor_mod; item->value[3] += (skill / 4); } if ( item->item_type == ITEM_QUIVER ) { item->value[0] = sOre.arrow_vnum; item->value[1] = sOre.arrow_mod * 100 + (skill * 100); } /*add the affects*/ /*first hitroll*/ if (sOre.hit_mod > 0) { pAf = new_affect(); pAf->location = APPLY_HITROLL; pAf->modifier = sOre.hit_mod; pAf->where = TO_AFFECTS; pAf->type = 0; pAf->duration = -1; pAf->bitvector = 0; pAf->level = item->level; pAf->next = item->affected; affect_to_obj(item,pAf); } /*then damroll*/ if (sOre.dam_mod > 0) { pAf = new_affect(); pAf->location = APPLY_DAMROLL; pAf->modifier = sOre.dam_mod; pAf->where = TO_AFFECTS; pAf->type = 0; pAf->duration = -1; pAf->bitvector = 0; pAf->level = item->level; pAf->next = item->affected; affect_to_obj(item,pAf); } /*done adding affects*/ extract_obj( ore ); obj_to_char( item, ch ); ptc(ch,"Finally done with your labour, you hold %s brand new %s in your hands.\n\r", sItem.prefix,sItem.name); sprintf(buf,"%s finishes %s %s, a %s forged piece of work, and slips it easily into his trusty ol' inv.\n\r", ch->short_descr, ch->sex < 2 ? "his":"her", item->short_descr, adj); check_improve(ch,gsn_forging,TRUE,1); } else { stc(help_buf,ch); return; } tail_chain(); } void do_smelt( CHAR_DATA *ch, char *argument ) { OBJ_DATA *ore; OBJ_DATA *ore_next; OBJ_DATA *item; char arg1[MIL]; char name_buf[MSL]; char short_buf[MSL]; char long_buf[MSL]; int ore_weight = 0; bool hasore = FALSE; int x; int ore_num; char take[MIL]; int value; name_buf[0] = '\0'; short_buf[0] = '\0'; long_buf[0] = '\0'; argument = one_argument( argument, arg1 ); if ( arg1[0] == '\0' ) { stc("Syntax: smelt <ore>\n\r", ch ); stc("Example: smith steel\n\r", ch ); return; } for ( x = 0; x < MAX_ORE_ITEMS-1; x++ ) { if ( !str_prefix( smith_ores_table[x].name, arg1 ) ) { hasore = TRUE; ore_num = x; break; } } if ( !hasore ) { stc( "That ore isnt on the list!\n\r", ch ); return; } hasore = FALSE; for ( ore = ch->carrying; ore != NULL; ore = ore_next ) { ore_next = ore->next_content; if (( ore->item_type == ITEM_SMITH_ORE ) && ( !str_prefix( smith_ores_table[x].name, ore->name))) { hasore = TRUE; ore_weight += ore->weight; obj_from_char( ore ); } } if ( !hasore ) { stc( "That ore isnt on the list!\n\r", ch ); return; } sprintf(take,"take"); item = create_object( get_obj_index( SMITH_PRODUCT ), 1 ); item->weight = ore_weight; if ( ( value = flag_value( wear_flags, take ) ) != NO_FLAG ) { TOGGLE_BIT(item->wear_flags, value); } sprintf(name_buf,"%s block %d",smith_ores_table[ore_num].name,ore_weight); sprintf(short_buf,"a %d lb block of %s",ore_weight,smith_ores_table[ore_num].name); sprintf(long_buf,"a %d lb block of %s lies here",ore_weight,smith_ores_table[ore_num].name); item->item_type = ITEM_SMITH_ORE; item->level = ch->level; free_string(item->name); free_string(item->short_descr); free_string(item->description); item->name = str_dup( name_buf ); item->short_descr = str_dup( short_buf ); item->description = str_dup( long_buf ); obj_to_char( item, ch ); ptc(ch,"You have smelted your %s into a %d lb block.\n\r",smith_ores_table[x].name,ore->weight); } void do_refine( CHAR_DATA *ch, char *argument ) { OBJ_DATA *ore; OBJ_DATA *ore_next; OBJ_DATA *item; char arg1[MIL],name_buf[64],short_buf[128],long_buf[256],buf[MSL]; int ore_weight = 0; char search_for[MSL]; bool hasore = FALSE,hasore_new = FALSE; int x; int ore_num; char take[MIL]; int value; name_buf[0] = '\0'; short_buf[0] = '\0'; long_buf[0] = '\0'; argument = one_argument( argument, arg1 ); if ( arg1[0] == '\0' ) { stc("Syntax: refine <ore>\n\r", ch ); stc("Example: refine steel\n\r", ch ); return; } for ( x = 0; x < MAX_ORE_ITEMS-1; x++ ) { if ( !str_prefix( smith_ores_table[x].name, arg1 ) ) { sprintf( buf, "You heat the furnace, preparing to refine %s.\n\r", smith_ores_table[x].name ); stc(buf,ch); hasore = TRUE; break; } } if(!hasore) { ptc(ch,"%s isn't a valid ore.\n\r",arg1); return; } hasore = FALSE; for ( ore = ch->carrying; ore != NULL; ore = ore_next ) { ore_next = ore->next_content; if (( ore->item_type == ITEM_SMITH_ORE ) && ( !str_prefix( smith_ores_table[x].name, ore->name))) { hasore = TRUE; ore_weight += ore->weight; obj_from_char( ore ); } } if ( !hasore ) { ptc(ch,"You don't seem to have any %s",smith_ores_table[x].name); return; } sprintf(search_for,"refined %s",smith_ores_table[x].name); for ( ore_num = 0; ore_num < MAX_ORE_ITEMS-1; ore_num++ ) { if ( !str_prefix( smith_ores_table[ore_num].name, search_for ) ) { ptc(ch,"{WHaving researched this procedure in your travels, you expertly prepare to refine the ore into %s{x\n\r", smith_ores_table[ore_num].name ); hasore_new = TRUE; break; } } if ( !hasore_new ) { stc( "That refined ore isnt on the list!\n\r", ch ); return; } hasore = FALSE; hasore_new = FALSE; sprintf(take,"take"); item = create_object( get_obj_index( SMITH_PRODUCT ), 1 ); item->weight = ore_weight/10; if ( ( value = flag_value( wear_flags, take ) ) != NO_FLAG ) { TOGGLE_BIT(item->wear_flags, value); } sprintf(name_buf,"%s block %d", smith_ores_table[ore_num].name, ore_weight); sprintf(short_buf,"a %d lb block of %s %s{x", ore_weight/10, smith_ores_table[ore_num].color, smith_ores_table[ore_num].display); sprintf(long_buf,"a %d lb block of %s %s{x lies here.", ore_weight/10, smith_ores_table[ore_num].color, smith_ores_table[ore_num].display); item->item_type = ITEM_SMITH_ORE; item->level = ch->level; free_string(item->name); free_string(item->short_descr); free_string(item->description); item->name = str_dup( name_buf ); item->short_descr = str_dup( short_buf ); item->description = str_dup( long_buf ); obj_to_char( item, ch ); ptc(ch,"You have refined your %s into a %d lb block of %s.\n\r", smith_ores_table[x].name,item->weight,smith_ores_table[ore_num].name); } char* diff(int x) { char* str; int i; x = x/28; if((str = malloc(x * sizeof(char))) == NULL) { bug("difficulty: str malloc failed.",0); return NULL; } if(x < 1) x=1; sprintf(str,""); for(i=0;i<x;i++) str[i] = '*'; str[i] = '\0'; return str; } const struct smith_items_type smith_items_table [MAX_SMITH_ITEMS] = { /* name, prefix,display,min_level, * item_type, wear_flags, * difficulty, weight, beats, quantity, * base_v0, base_v1, base_v2,"dam_noun", * base_pierce, base_bash, base_slash, base_exotic */ { "sword","a","sword",5, ITEM_WEAPON, ITEM_TAKE|ITEM_WIELD, 25, 5, 1, 1, 1, 1, 4, "slash", 0,0,0,0,WEAPON_OFF_HAND }, { "mace","a","mace",5, ITEM_WEAPON, ITEM_TAKE|ITEM_WIELD, 25, 5, 1, 1, 4, 1, 4, "crush", 0,0,0,0,WEAPON_OFF_HAND }, { "flail","a","flail",5, ITEM_WEAPON, ITEM_TAKE|ITEM_WIELD, 25, 5, 1, 1, 6, 1, 4, "smash", 0,0,0,0,WEAPON_OFF_HAND }, { "dagger","a","dagger",5, ITEM_WEAPON, ITEM_TAKE|ITEM_WIELD, 25, 5, 1, 1, 2, 1, 4, "pierce", 0,0,0,0,WEAPON_OFF_HAND }, { "axe","a","axe",5, ITEM_WEAPON, ITEM_TAKE|ITEM_WIELD, 25, 5, 1, 1, 5, 1, 4, "chop", 0,0,0,0,WEAPON_OFF_HAND }, { "whip","a","whip",5, ITEM_WEAPON, ITEM_TAKE|ITEM_WIELD, 25, 5, 1, 1, 7, 1, 4, "whip", 0,0,0,0,WEAPON_OFF_HAND }, { "bardiche","a","bardiche",5, ITEM_WEAPON, ITEM_TAKE|ITEM_WIELD, 25, 5, 1, 1, 8, 1, 4, "cleave", 0,0,0,0,WEAPON_OFF_HAND }, { "spear","a","spear",5, ITEM_WEAPON, ITEM_TAKE|ITEM_WIELD, 25, 5, 1, 1, 0, 1, 4, "thrust", 0,0,0,0,WEAPON_OFF_HAND }, { "battle lance","a","battle lance",70, ITEM_WEAPON, ITEM_TAKE|ITEM_WIELD, 80, 40, 1, 1, 3, 3, 8, "charge", 0,0,0,0,WEAPON_DOMINANT_HAND }, { "greatsword","a","greatsword",70, ITEM_WEAPON, ITEM_TAKE|ITEM_WIELD, 80, 40, 1, 1, 1, 3, 8, "slice", 0,0,0,0,WEAPON_DOMINANT_HAND }, { "morning star","a","morning star",70, ITEM_WEAPON, ITEM_TAKE|ITEM_WIELD, 80, 40, 1, 1, 6, 3, 8, "crush", 0,0,0,0,WEAPON_DOMINANT_HAND }, { "great maul","a","great maul",70, ITEM_WEAPON, ITEM_TAKE|ITEM_WIELD, 80, 40, 1, 1, 4, 3, 8, "pound", 0,0,0,0,WEAPON_DOMINANT_HAND }, { "misericord","a","misericord",70, ITEM_WEAPON, ITEM_TAKE|ITEM_WIELD, 80, 40, 1, 1, 2, 3, 8, "stab", 0,0,0,0,WEAPON_DOMINANT_HAND }, { "great helm","a","great helm",50, ITEM_ARMOR, ITEM_TAKE|ITEM_WEAR_HEAD, 25, 5, 1, 1, 0, 0, 0, 0, 5, 5, 5, 5, 0 }, { "greaves","a pair of","greaves",50, ITEM_ARMOR, ITEM_TAKE|ITEM_WEAR_LEGS, 50, 5, 1, 1, 0, 0, 0, 0, 5, 5, 5, 5, 0 }, { "gauntlets","a pair of","gauntlets",50, ITEM_ARMOR, ITEM_TAKE|ITEM_WEAR_HANDS, 50, 5, 1, 1, 0, 0, 0, 0, 5, 5, 5, 5, 0 }, { "arm guards","a set of","arm guards",50, ITEM_ARMOR, ITEM_TAKE|ITEM_WEAR_ARMS, 50, 5, 1, 1, 0, 0, 0, 0, 5, 5, 5, 5, 0 }, { "boots","some","boots",50, ITEM_ARMOR, ITEM_TAKE|ITEM_WEAR_FEET, 25, 5, 1, 1, 0, 0, 0, 0, 5, 5, 5, 5, 0 }, { "vambrace","a","vambrace",50, ITEM_ARMOR, ITEM_TAKE|ITEM_WEAR_WRIST, 50, 5, 1, 1, 0, 0, 0, 0, 5, 5, 5, 5, 0 }, { "grand crown","a","grand crown",80, ITEM_ARMOR, ITEM_TAKE|ITEM_WEAR_HEAD, 90, 25, 5, 1, 0, 0, 0, 0, 30, 30, 30, 30, 0 }, { "spiked vambrace","a","spiked vambrace",80, ITEM_ARMOR, ITEM_TAKE|ITEM_WEAR_WRIST, 90, 20, 1, 1, 0, 0, 0, 0, 35, 35, 35, 35, 0 }, { "war boots","some","war boots",80, ITEM_ARMOR, ITEM_TAKE|ITEM_WEAR_FEET, 90, 25, 1, 1, 0, 0, 0, 0, 30, 30, 30, 30, 0 }, { "plated arm guards","a set of","plated arm guards",80, ITEM_ARMOR, ITEM_TAKE|ITEM_WEAR_ARMS, 90, 35, 1, 1, 0, 0, 0, 0, 50, 50, 50, 50, 0 }, { "leafmail greaves","a pair of","leafmail greaves",80, ITEM_ARMOR, ITEM_TAKE|ITEM_WEAR_LEGS, 90, 40, 1, 1, 0, 0, 0, 0, 50, 50, 50, 50, 0 }, { "chainmail","a shirt of","chainmail",50, ITEM_ARMOR, ITEM_TAKE|ITEM_WEAR_BODY, 65, 90, 1, 1, 0, 0, 0, 0, 30, 30, 30, 30, 0 }, { "platemail","a set of","platemail",80, ITEM_ARMOR, ITEM_TAKE|ITEM_WEAR_BODY, 95, 200, 1, 1, 0, 0, 0, 0, 300, 300, 300, 300, 0 }, { "elite harness","an","elite harness",80, ITEM_SHEATH, ITEM_TAKE|ITEM_WEAR_ABOUT, 80, 20, 1, 1, 0, 0, 0, 0, 3, 0, 0, 0, 0 }, { "battle rig","a","battle rig",40, ITEM_SHEATH, ITEM_TAKE|ITEM_WEAR_ABOUT, 40, 20, 1, 1, 0, 0, 0, 0, 2, 0, 0, 0, 0 }, { "leather quiver","a","leather quiver",20, ITEM_QUIVER, ITEM_TAKE|ITEM_WEAR_WAIST, 40, 20, 1, 1, 0, 0, 0, 0, 50, 50, 50, 50, 0 }, { "serrated broadsword","a","{rs{Der{rra{Dte{rd {rb{Droa{rds{Dwor{rd",95, ITEM_WEAPON, ITEM_TAKE|ITEM_WIELD, 200, 200, 1, 1, 1, 14, 16, "scythe", 0, 0, 0, WEAPON_DOMINANT_HAND}, { NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }; const struct smith_ores_type smith_ores_table [MAX_ORE_ITEMS] = { /*{ name, display, color, armor_mod,workability, hit_mod,dam_mod,arrow_mod, arrow_vnum }*/ { "steel","steel","polished", 5,2, 0, 1, 50, 10013 }, { "bronze","bronze", "burnished", 10,1, 1, 1, 90, 10014 }, { "silver","silver", "gleaming", 15,4, 2, 2, 130, 10015 }, { "gold","gold","tawny", 20,5, 3, 3, 170, 10016 }, { "platinum","platinum", "the purest", 30,10, 4, 4, 210, 10017 }, { "starfire","{cst{Ca{Yrf{Ci{cre{x","shimmering", 300,75, 20, 20, 250, 10018 }, { "refined steel","steel","refined{D", 40,100, 5, 5, 90, 10019 }, { "refined bronze","bronze", "refined{y", 50,100, 6, 6, 130, 10020 }, { "refined silver","silver", "refined{w", 60,100, 7, 7, 170, 10021 }, { "refined gold","gold","refined{Y", 70,100, 8, 8, 210, 10022 }, { "refined platinum","platinum", "refined{W", 90,100, 10, 10, 250, 10023 }, { "refined starfire","{cst{Ca{Yrf{Ci{cre{x","refined", 600,100, 40, 40, 300, 10024 }, { NULL,NULL,0,0 } };