/
area/city/
area/crypts/
area/guilds/
area/psuedowild/
area/religion/
data/documents/MPDocs/
data/html/
data/mobprogs/
data/quest/
data/world/
data/world/_utilities/
data/world/images/
design/html/
notes/
player/
#include <sys/types.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include "merc.h"
#include "interp.h"
#include "tables.h"
#include "rig_tables.h"
#include "rig.h"

/*
 * create_weapon()
 *
 * Generates a weapon!
 *
 * force_type       - If set to random, will generate a random weapon
 * force_material   - If set, will force that material
 * quaility         - If previous unset, determine quaility (poor = iron/steel, decent = steel/sivler, etc)
 * is_for_shop      - Flags ITEM_INVENTORY Flag
 */
OBJ_DATA * create_weapon(OBJ_DATA * obj, int force_type, int force_material, int quaility, bool is_for_shop)
{
    char name_set[MSL];     /* Used for naming purposes */
    char shor_set[MSL];
    char long_set[MSL];
    char mate_set[MSL];
    char temp[MSL];
    int obj_type = -1;      /* Used for generation type */
    int material_type = -1;

    free_string(obj->name);
    free_string(obj->short_descr);
    free_string(obj->description);
    free_string(obj->material);

    /* Ok determine if forced, if not random */
    if (force_type == RIG_RANDOM)
        obj_type = number_range(0, rig_weapon_max());
    else
        obj_type = force_type;

    /* Also make sure we dont get armor only materials.. */
    
    if (force_material == RIG_RANDOM)
        material_type = number_range(0, rig_material_max() - 1);
    else
        material_type = force_material;
    
    /* Ok, so we got an armor only, lets default to uh, Iron! */
    if (rig_material_table[material_type].armor_only == material_type)
        material_type = material_lookup("iron");
        
 
    sprintf(name_set, rig_weapons_table[obj_type].name, rig_material_table[material_type].name);
    sprintf(temp, "%s %s", rig_material_table[material_type].prefix, rig_material_table[material_type].name); 
    sprintf(shor_set, rig_weapons_table[obj_type].short_descr, temp);
    sprintf(long_set, rig_weapons_table[obj_type].long_descr, temp);
    sprintf(mate_set, rig_material_table[material_type].name);
    obj->name               = str_dup (name_set);
    obj->short_descr        = str_dup (shor_set);
    obj->description        = str_dup (long_set);
    obj->material           = str_dup (mate_set);
    obj->item_type          = ITEM_WEAPON;
    obj->wear_flags         = ITEM_TAKE | ITEM_WIELD;
    obj->value[0]           = rig_weapons_table[obj_type].value[0];
    obj->value[1]           = rig_weapons_table[obj_type].value[1];
    obj->value[2]           = rig_weapons_table[obj_type].value[2];
    obj->value[3]           = rig_weapons_table[obj_type].value[3];
    obj->cost               = 1 + rig_weapons_table[obj_type].cost * rig_material_table[material_type].cost_multi / 100;
    obj->weight             = 1 + rig_weapons_table[obj_type].weight * rig_material_table[material_type].weight_multi / 100;
    
    /* Add the material bonuses to the weapon */
    fix_material_bonus(obj, material_type);
    
    /* Cant be too careful*/
    name_set[0] = '\0';
    shor_set[0] = '\0';
    long_set[0] = '\0';
    mate_set[0] = '\0';
    temp[0] = '\0';
    return obj;
}

 
/*
 * fix_material_bonus()
 *
 * Tidies up hit/dam bonus for weapon based on material
 */
OBJ_DATA * fix_material_bonus(OBJ_DATA * obj, int material_type)
{
    obj->value[1]   += rig_material_table[material_type].weapon_damage;
    obj->value[2]   += rig_material_table[material_type].weapon_damage;
    item_hit_dam_bonus2(obj, rig_material_table[material_type].weapon_damage);
    return obj;
}

/*
 * item_hit_dam_bonus()
 *
 * adds an affect data for bonus hit/dam
 */
OBJ_DATA * item_hit_dam_bonus2(OBJ_DATA * obj, int value)
{
    AFFECT_DATA af;

    af.where        = TO_OBJECT;
    af.location     = APPLY_HITROLL;
    af.modifier     = value;
    af.level        = obj->level;
    af.type         = 13;
    af.duration     = -1;
    af.bitvector    = 0;
    affect_to_obj (obj, &af);
    af.location     = APPLY_DAMROLL;
    affect_to_obj (obj, &af);

    return (obj);
}