/**************************************************************************
* # # # ## # # ### ## ## ### http://www.lyonesse.it *
* # # # # # ## # # # # # *
* # # # # # ## ## # # ## ## ## # # ## *
* # # # # # ## # # # # # # # # # # # *
* ### # ## # # ### ## ## ### # # #### ## Ver. 1.0 *
* *
* -Based on CircleMud & Smaug- Copyright (c) 2001-2002 by Mithrandir *
* *
* ********************************************************************** *
* *
* File: objrandom.c *
* *
* Random object creation *
* *
************************************************************************ */
#include "conf.h"
#include "sysdep.h"
#include "structs.h"
#include "db.h"
#include "utils.h"
#include "comm.h"
#include "handler.h"
#include "interpreter.h"
#include "spells.h"
#include "objrandom.h"
#define TABLESIZE(a) (sizeof(a)/sizeof(a)[0])
const QUALITY_DATA quality_table[] =
{
{ "bad", -1},
{ "poor", 0 },
{ "minor", 1 },
{ "good", 2 },
{ "very good", 3 },
{ "supreme", 5 }
};
const RAND_ARMOR_DATA rand_helm_table[] =
{
{ "metal helmet", 5, 0, ITEM_WEAR_HEAD},
{ "iron helmet", 4, 0, ITEM_WEAR_HEAD},
{ "steel helmet", 5, 1, ITEM_WEAR_HEAD},
{ "leather cap", 2, 2, ITEM_WEAR_HEAD},
{ "mithril helm", 6, 2, ITEM_WEAR_HEAD},
{ "black visor", 4, 1, ITEM_WEAR_HEAD},
{ "ivory helm", 4, 2, ITEM_WEAR_HEAD},
{ "war helm", 7, -1, ITEM_WEAR_HEAD},
{ "hat", 1, 2, ITEM_WEAR_HEAD},
{ "golden crown", 1, 3, ITEM_WEAR_HEAD}
};
const RAND_ARMOR_DATA rand_belt_table[] =
{
{ "leather belt", 2, 1, ITEM_WEAR_WAIST},
{ "golden girth", 2, 2, ITEM_WEAR_WAIST},
{ "mithril belt", 5, 2, ITEM_WEAR_WAIST},
{ "chain mail", 5, -1, ITEM_WEAR_WAIST},
{ "feather belt", 3, 0, ITEM_WEAR_WAIST},
{ "silver girth", 2, 0, ITEM_WEAR_WAIST}
};
const RAND_ARMOR_DATA rand_arms_table[] =
{
{ "metal sleeves", 3, 0, ITEM_WEAR_ARMS},
{ "iron vambrances", 4, 0, ITEM_WEAR_ARMS},
{ "mithril sleeves", 3, 2, ITEM_WEAR_ARMS},
{ "opal sleeves", 2, 1, ITEM_WEAR_ARMS}
};
const RAND_ARMOR_DATA rand_legs_table[] =
{
{ "leather pants", 3, 0, ITEM_WEAR_LEGS},
{ "metal greaves", 6, 0, ITEM_WEAR_LEGS},
{ "metal leggings", 3, 1, ITEM_WEAR_LEGS}
};
const RAND_ARMOR_DATA rand_hands_table[] =
{
{ "leather gloves", 3, 1, ITEM_WEAR_HANDS},
{ "iron gauntlets", 4, 0, ITEM_WEAR_HANDS},
{ "silk gloves", 2, 2, ITEM_WEAR_HANDS},
{ "white gloves", 3, 0, ITEM_WEAR_HANDS},
{ "steel gauntlets", 4, -1, ITEM_WEAR_HANDS}
};
const RAND_ARMOR_DATA rand_feets_table[] =
{
{ "leather boots", 4, 1, ITEM_WEAR_FEET},
{ "elven boots", 5, 2, ITEM_WEAR_FEET},
{ "sturdy boots", 3, 0, ITEM_WEAR_FEET},
{ "white sandals", 1, 1, ITEM_WEAR_FEET},
{ "leather shoes", 2, 0, ITEM_WEAR_FEET}
};
const RAND_ARMOR_DATA rand_shield_table[] =
{
{ "large shield", 5, 0, ITEM_WEAR_SHIELD},
{ "black shield", 4, 1, ITEM_WEAR_SHIELD},
{ "iron shield", 4, 0, ITEM_WEAR_SHIELD},
{ "tower shield", 6, -1, ITEM_WEAR_SHIELD}
};
const RAND_ARMOR_DATA rand_armor_table[] =
{
{ "silk cloak", 3, 1, ITEM_WEAR_ABOUT},
{ "wool cape", 3, 0, ITEM_WEAR_ABOUT},
{ "platinum cloak", 4, 1, ITEM_WEAR_ABOUT},
{ "diamond plate", 10, 0, ITEM_WEAR_BODY},
{ "green shirt", 2, 3, ITEM_WEAR_BODY},
{ "iron breastplate", 8, 1, ITEM_WEAR_BODY},
{ "white vest", 4, 2, ITEM_WEAR_BODY},
{ "steel platemail", 8, 1, ITEM_WEAR_BODY},
{ "iron scalemail", 7, 0, ITEM_WEAR_BODY},
{ "chainmail", 7, 0, ITEM_WEAR_BODY},
{ "battlesuit", 9, -1, ITEM_WEAR_BODY},
{ "suit armor", 5, 1, ITEM_WEAR_BODY},
{ "black robe", 2, 4, ITEM_WEAR_BODY},
{ "breastplate", 7, 1, ITEM_WEAR_BODY},
{ "mithril plate", 16, 5, ITEM_WEAR_BODY},
};
const RAND_WEAPON_DATA rand_weapon_table[] =
{
{ "iron sword", 1, 1, TYPE_SLASH },
{ "green sword", 2, 1, TYPE_SLASH },
{ "long sword", 1, 2, TYPE_SLASH },
{ "long sword", 3, 1, TYPE_SLASH },
{ "black sword", 1, 3, TYPE_SLASH },
{ "steel sword", 2, 1, TYPE_SLASH },
{ "wooden sword", 1, 4, TYPE_SLASH },
{ "black sword", 2, 3, TYPE_SLASH },
{ "ivory sword", 0, 5, TYPE_SLASH },
{ "diamond sword", 3, 3, TYPE_SLASH },
{ "mithril sword", 2, 6, TYPE_SLASH },
{ "longsword", 2, 2, TYPE_SLASH },
{ "longsword", 3, 3, TYPE_SLASH },
{ "longsword", 3, 4, TYPE_SLASH },
{ "broadsword", 3, 5, TYPE_SLASH },
{ "broadsword", 2, 6, TYPE_SLASH },
{ "short dagger", 1, 2, TYPE_PIERCE },
{ "venom dagger", 2, 6, TYPE_PIERCE },
{ "black dagger", 1, 4, TYPE_PIERCE },
{ "iron dagger", 2, 3, TYPE_PIERCE },
{ "steel dagger", 3, 4, TYPE_PIERCE },
{ "large mace", 1, 1, TYPE_POUND },
{ "iron mace", 2, 2, TYPE_POUND },
{ "black mace", 3, 2, TYPE_POUND },
{ "spiked mace", 2, 1, TYPE_POUND },
{ "morningstar", 3, 2, TYPE_POUND },
{ "mithril morningstar", 3, 9, TYPE_POUND },
{ "large spear", 2, 3, TYPE_PIERCE },
{ "dwarven axe", 1, 4, TYPE_SLASH },
{ "large flail", 2, 3, TYPE_POUND },
{ "black whip", 1, 4, TYPE_SLASH },
{ "long halberd", 0, 5, TYPE_SLASH },
{ "iron spear", 3, 3, TYPE_PIERCE },
{ "ebony trident", 1, 2, TYPE_PIERCE },
{ "steel axe", 0, 5, TYPE_SLASH },
{ "dwarven battleaxe", 0, 6, TYPE_SLASH },
{ "iron flail", 3, 3, TYPE_POUND },
{ "fire whip", 2, 4, TYPE_SLASH },
{ "mithril halberd", 1, 6, TYPE_SLASH }
};
const RAND_WORN_DATA rand_worn_table[] =
{
{ "glowing ring", 2, ITEM_WEAR_FINGER, ITEM_GLOW},
{ "red ring", 3, ITEM_WEAR_FINGER, ITEM_HUM},
{ "rilliphar bracelet", 5, ITEM_WEAR_WRIST, 0},
{ "spectral necklace", 1, ITEM_WEAR_NECK, ITEM_INVISIBLE},
{ "platinum pendant", 2, ITEM_WEAR_NECK, ITEM_BLESS}
};
/* =============================================================== */
/* F U N Z I O N I */
/* =============================================================== */
OBJ_DATA *load_rand_obj(int type, int level)
{
OBJ_DATA *obj = NULL;
bool is_magic = FALSE;
if (type == 0)
type = ITEM_WEAPON;
if (type > 100)
{
type -= 100;
is_magic = TRUE;
}
if (level < 1 || level >= LVL_IMMORT)
level = LVL_IMMORT - 1;
switch (type)
{
case ITEM_ARMOR:
obj = create_rand_armor(level, is_magic);
break;
case ITEM_ARMOR_SHIELD:
obj = create_rand_shield(level, is_magic);
break;
case ITEM_ARMOR_HELM:
obj = create_rand_helm(level, is_magic);
break;
case ITEM_ARMOR_ARMS:
obj = create_rand_arms(level, is_magic);
break;
case ITEM_ARMOR_LEGS:
obj = create_rand_legs(level, is_magic);
break;
case ITEM_ARMOR_HANDS:
obj = create_rand_hands(level, is_magic);
break;
case ITEM_ARMOR_FEETS:
obj = create_rand_hands(level, is_magic);
break;
case ITEM_ARMOR_BELT:
obj = create_rand_belt(level, is_magic);
break;
case ITEM_WEAPON:
obj = create_rand_weapon(level, is_magic);
break;
case ITEM_WORN:
obj = create_rand_worn(level, is_magic);
break;
case ITEM_SCROLL:
case ITEM_WAND:
case ITEM_STAFF:
case ITEM_POTION:
case ITEM_CONTAINER:
/* not yet dude.. */
break;
default:
break;
}
return (obj);
}
/* ======================================================== */
OBJ_DATA *base_rand_obj( int level, int qlty )
{
OBJ_DATA *obj = create_obj();
int j;
SET_BIT(GET_OBJ_EXTRA(obj), ITEM_UNIQUE);
GET_OBJ_LEVEL(obj) = number(MAX(0, level - 3), MIN(LVL_IMMORT, level + 3));
/* rivedere */
GET_OBJ_COST(obj) = 100 * (qlty + 1);
GET_OBJ_RENT(obj) = 100 * (qlty + 1);
GET_OBJ_WEIGHT(obj) = 3 * (qlty + 1);
for (j = 0; j < MAX_OBJ_AFF; j++)
{
obj->affected[j].location = APPLY_NONE;
obj->affected[j].modifier = 0;
}
return (obj);
}
OBJ_DATA *create_rand_armor(int level, bool magic)
{
OBJ_DATA *obj = NULL;
char buf[MAX_STRING_LENGTH], buf2[MAX_STRING_LENGTH];
int qlty = 0, type = 0;
qlty = number(0, MAX_QLTY);
type = number(0, TABLESIZE(rand_armor_table) - 1);
obj = base_rand_obj(level, qlty);
sprintf(buf, "%s", rand_armor_table[type].name);
obj->name = str_dup(buf);
sprintf(buf2, "%s", AN(rand_armor_table[type].name));
CAP(buf2);
CREATE(obj->ex_description, EXTRA_DESCR, 1);
obj->ex_description->next = NULL;
obj->ex_description->keyword = str_dup(buf);
sprintf(buf, "%s %s quality %s created by the god of casuality.", buf2,
quality_table[qlty].descr, rand_armor_table[type].name);
obj->ex_description->description = str_dup(buf);
sprintf(buf, "%s %s", AN(rand_armor_table[type].name), rand_armor_table[type].name);
obj->short_description = str_dup(buf);
switch (number(1, 3))
{
case 1:
sprintf(buf, "%s %s lies here.", buf2, rand_armor_table[type].name);
break;
case 2:
sprintf(buf, "%s %s is resting here.", buf2, rand_armor_table[type].name);
break;
case 3:
sprintf(buf, "%s %s has been dropped here.", buf2, rand_armor_table[type].name);
break;
}
obj->description = str_dup(buf);
GET_OBJ_TYPE(obj) = ITEM_ARMOR;
GET_OBJ_VAL(obj, 0) = (quality_table[qlty].bonus + rand_armor_table[type].protect_mod + (level / 2)) / 2;
SET_BIT(GET_OBJ_WEAR(obj), rand_armor_table[type].wear_loc | ITEM_WEAR_TAKE);
if (magic)
{
static int attrib_types[] = {APPLY_STR, APPLY_STR, APPLY_DEX, APPLY_INT, APPLY_INT, APPLY_WIS, APPLY_DEX, APPLY_CON, APPLY_CON };
static int combat_types[] = {APPLY_HITROLL, APPLY_HITROLL, APPLY_DAMROLL, APPLY_SAVING_SPELL, APPLY_DAMROLL };
static int power_types[] = {APPLY_MANA, APPLY_HIT, APPLY_MOVE, APPLY_AC, APPLY_HIT };
switch (number(1, 3))
{
case 1:
obj->affected[0].location = attrib_types[number(0, TABLESIZE(attrib_types) - 1)];
obj->affected[0].modifier = number(1,3);
break;
case 2:
obj->affected[0].location = combat_types[number(0, TABLESIZE(combat_types) - 1)];
obj->affected[0].modifier = number(1, 1 + (level / 6));
break;
case 3:
obj->affected[0].location = power_types[number(0, TABLESIZE(power_types) - 1)];
obj->affected[0].modifier = MAX(1, number(level / 2, level + 1)) + (quality_table[qlty].bonus / 2);
break;
}
if (obj->affected[0].location == APPLY_AC || obj->affected[0].location == APPLY_SAVING_SPELL )
obj->affected[0].modifier *= -1;
SET_BIT(GET_OBJ_EXTRA(obj), ITEM_MAGIC);
}
return (obj);
}
OBJ_DATA *create_rand_shield(int level, bool magic)
{
OBJ_DATA *obj = NULL;
char buf[MAX_STRING_LENGTH], buf2[MAX_STRING_LENGTH];
int qlty = 0, type = 0;
qlty = number(0, MAX_QLTY);
type = number(0, TABLESIZE(rand_shield_table) -1);
obj = base_rand_obj(level, qlty);
sprintf(buf, "%s", rand_shield_table[type].name);
obj->name = str_dup(buf);
sprintf(buf2, "%s", AN(rand_shield_table[type].name));
CAP(buf2);
CREATE(obj->ex_description, EXTRA_DESCR, 1);
obj->ex_description->next = NULL;
obj->ex_description->keyword = str_dup(buf);
sprintf(buf, "%s %s quality %s created by the god of casuality.", buf2,
quality_table[qlty].descr, rand_shield_table[type].name);
obj->ex_description->description = str_dup(buf);
sprintf(buf, "%s %s", AN(rand_shield_table[type].name), rand_shield_table[type].name);
obj->short_description = str_dup(buf);
switch (number(1, 3))
{
case 1:
sprintf(buf, "%s %s lies here.", buf2, rand_shield_table[type].name);
break;
case 2:
sprintf(buf, "%s %s is resting here.", buf2, rand_shield_table[type].name);
break;
case 3:
sprintf(buf, "%s %s has been dropped here.", buf2, rand_shield_table[type].name);
break;
}
obj->description = str_dup(buf);
GET_OBJ_TYPE(obj) = ITEM_ARMOR;
GET_OBJ_VAL(obj, 0) = (quality_table[qlty].bonus + rand_shield_table[type].protect_mod + (level / 2)) / 2;
SET_BIT(GET_OBJ_WEAR(obj), rand_shield_table[type].wear_loc | ITEM_WEAR_TAKE);
if (magic)
{
static int attrib_types[] = {APPLY_STR, APPLY_STR, APPLY_DEX, APPLY_INT, APPLY_INT, APPLY_WIS, APPLY_DEX, APPLY_CON, APPLY_CON };
static int combat_types[] = {APPLY_HITROLL, APPLY_HITROLL, APPLY_DAMROLL, APPLY_SAVING_SPELL, APPLY_DAMROLL };
static int power_types[] = {APPLY_MANA, APPLY_HIT, APPLY_MOVE, APPLY_AC, APPLY_HIT };
switch (number(1, 3))
{
case 1:
obj->affected[0].location = attrib_types[number(0, TABLESIZE(attrib_types) - 1)];
obj->affected[0].modifier = number(1,2);
break;
case 2:
obj->affected[0].location = combat_types[number(0, TABLESIZE(combat_types) - 1)];
obj->affected[0].modifier = number(1, 1 + (level / 6));
break;
case 3:
obj->affected[0].location = power_types[number(0, TABLESIZE(power_types) - 1)];
obj->affected[0].modifier = MAX(1, number(level / 2, level + 1)) + (quality_table[qlty].bonus / 2);
break;
}
if (obj->affected[0].location == APPLY_AC || obj->affected[0].location == APPLY_SAVING_SPELL )
obj->affected[0].modifier *= -1;
SET_BIT(GET_OBJ_EXTRA(obj), ITEM_MAGIC);
}
return (obj);
}
OBJ_DATA *create_rand_arms(int level, bool magic)
{
OBJ_DATA *obj = NULL;
char buf[MAX_STRING_LENGTH];
int qlty = 0, type = 0;
qlty = number(0, MAX_QLTY);
type = number(0, TABLESIZE(rand_arms_table) -1);
obj = base_rand_obj(level, qlty);
sprintf(buf, "%s", rand_arms_table[type].name);
obj->name = str_dup(buf);
CREATE(obj->ex_description, EXTRA_DESCR, 1);
obj->ex_description->next = NULL;
obj->ex_description->keyword = str_dup(buf);
sprintf(buf, "Some %s quality %s created by the god of casuality.",
quality_table[qlty].descr, rand_arms_table[type].name);
obj->ex_description->description = str_dup(buf);
sprintf(buf, "some %s", rand_arms_table[type].name);
obj->short_description = str_dup(buf);
switch (number(1, 3))
{
case 1:
sprintf(buf, "Some %s lies here.", rand_arms_table[type].name);
break;
case 2:
sprintf(buf, "Some %s is resting here.", rand_arms_table[type].name);
break;
case 3:
sprintf(buf, "Some %s has been dropped here.", rand_arms_table[type].name);
break;
}
obj->description = str_dup(buf);
GET_OBJ_TYPE(obj) = ITEM_ARMOR;
GET_OBJ_VAL(obj, 0) = (quality_table[qlty].bonus + rand_arms_table[type].protect_mod + (level / 2)) / 2;
SET_BIT(GET_OBJ_WEAR(obj), rand_arms_table[type].wear_loc | ITEM_WEAR_TAKE);
if (magic)
{
static int attrib_types[] = {APPLY_STR, APPLY_STR, APPLY_DEX, APPLY_INT, APPLY_INT, APPLY_WIS, APPLY_DEX, APPLY_CON, APPLY_CON };
static int combat_types[] = {APPLY_HITROLL, APPLY_HITROLL, APPLY_DAMROLL, APPLY_SAVING_SPELL, APPLY_DAMROLL };
static int power_types[] = {APPLY_MANA, APPLY_HIT, APPLY_MOVE, APPLY_AC, APPLY_HIT };
switch (number(1, 3))
{
case 1:
obj->affected[0].location = attrib_types[number(0, TABLESIZE(attrib_types) - 1)];
obj->affected[0].modifier = number(1,2);
break;
case 2:
obj->affected[0].location = combat_types[number(0, TABLESIZE(combat_types) - 1)];
obj->affected[0].modifier = number(1, 1 + (level / 6));
break;
case 3:
obj->affected[0].location = power_types[number(0, TABLESIZE(power_types) - 1)];
obj->affected[0].modifier = MAX(1, number(level / 2, level + 1)) + (quality_table[qlty].bonus / 2);
break;
}
if (obj->affected[0].location == APPLY_AC || obj->affected[0].location == APPLY_SAVING_SPELL )
obj->affected[0].modifier *= -1;
SET_BIT(GET_OBJ_EXTRA(obj), ITEM_MAGIC);
}
return (obj);
}
OBJ_DATA *create_rand_legs(int level, bool magic)
{
OBJ_DATA *obj = NULL;
char buf[MAX_STRING_LENGTH];
int qlty = 0, type = 0;
qlty = number(0, MAX_QLTY);
type = number(0, TABLESIZE(rand_legs_table) -1);
obj = base_rand_obj(level, qlty);
sprintf(buf, "%s", rand_legs_table[type].name);
obj->name = str_dup(buf);
CREATE(obj->ex_description, EXTRA_DESCR, 1);
obj->ex_description->next = NULL;
obj->ex_description->keyword = str_dup(buf);
sprintf(buf, "Some %s quality %s created by the god of casuality.",
quality_table[qlty].descr, rand_legs_table[type].name);
obj->ex_description->description = str_dup(buf);
sprintf(buf, "some %s", rand_legs_table[type].name);
obj->short_description = str_dup(buf);
switch (number(1, 3))
{
case 1:
sprintf(buf, "Some %s lies here.", rand_legs_table[type].name);
break;
case 2:
sprintf(buf, "Some %s is resting here.", rand_legs_table[type].name);
break;
case 3:
sprintf(buf, "Some %s has been dropped here.", rand_legs_table[type].name);
break;
}
obj->description = str_dup(buf);
GET_OBJ_TYPE(obj) = ITEM_ARMOR;
GET_OBJ_VAL(obj, 0) = (quality_table[qlty].bonus + rand_legs_table[type].protect_mod + (level / 2)) / 2;
SET_BIT(GET_OBJ_WEAR(obj), rand_legs_table[type].wear_loc | ITEM_WEAR_TAKE);
if (magic)
{
static int attrib_types[] = {APPLY_STR, APPLY_STR, APPLY_DEX, APPLY_INT, APPLY_INT, APPLY_WIS, APPLY_DEX, APPLY_CON, APPLY_CON };
static int combat_types[] = {APPLY_HITROLL, APPLY_HITROLL, APPLY_DAMROLL, APPLY_SAVING_SPELL, APPLY_DAMROLL };
static int power_types[] = {APPLY_MANA, APPLY_HIT, APPLY_MOVE, APPLY_AC, APPLY_HIT };
switch (number(1, 3))
{
case 1:
obj->affected[0].location = attrib_types[number(0, TABLESIZE(attrib_types) - 1)];
obj->affected[0].modifier = number(1,2);
break;
case 2:
obj->affected[0].location = combat_types[number(0, TABLESIZE(combat_types) - 1)];
obj->affected[0].modifier = number(1, 1 + (level / 6));
break;
case 3:
obj->affected[0].location = power_types[number(0, TABLESIZE(power_types) - 1)];
obj->affected[0].modifier = MAX(1, number(level / 2, level + 1)) + (quality_table[qlty].bonus / 2);
break;
}
if (obj->affected[0].location == APPLY_AC || obj->affected[0].location == APPLY_SAVING_SPELL )
obj->affected[0].modifier *= -1;
SET_BIT(GET_OBJ_EXTRA(obj), ITEM_MAGIC);
}
return (obj);
}
OBJ_DATA *create_rand_hands(int level, bool magic)
{
OBJ_DATA *obj = NULL;
char buf[MAX_STRING_LENGTH];
int qlty = 0, type = 0;
qlty = number(0, MAX_QLTY);
type = number(0, TABLESIZE(rand_hands_table) -1);
obj = base_rand_obj(level, qlty);
sprintf(buf, "%s", rand_hands_table[type].name);
obj->name = str_dup(buf);
CREATE(obj->ex_description, EXTRA_DESCR, 1);
obj->ex_description->next = NULL;
obj->ex_description->keyword = str_dup(buf);
sprintf(buf, "Some %s quality %s created by the god of casuality.",
quality_table[qlty].descr, rand_hands_table[type].name);
obj->ex_description->description = str_dup(buf);
sprintf(buf, "some %s", rand_hands_table[type].name);
obj->short_description = str_dup(buf);
switch (number(1, 3))
{
case 1:
sprintf(buf, "Some %s lies here.", rand_hands_table[type].name);
break;
case 2:
sprintf(buf, "Some %s is resting here.", rand_hands_table[type].name);
break;
case 3:
sprintf(buf, "Some %s has been dropped here.", rand_hands_table[type].name);
break;
}
obj->description = str_dup(buf);
GET_OBJ_TYPE(obj) = ITEM_ARMOR;
GET_OBJ_VAL(obj, 0) = (quality_table[qlty].bonus + rand_hands_table[type].protect_mod + (level / 2)) / 2;
SET_BIT(GET_OBJ_WEAR(obj), rand_hands_table[type].wear_loc | ITEM_WEAR_TAKE);
if (magic)
{
static int attrib_types[] = {APPLY_STR, APPLY_STR, APPLY_DEX, APPLY_INT, APPLY_INT, APPLY_WIS, APPLY_DEX, APPLY_CON, APPLY_CON };
static int combat_types[] = {APPLY_HITROLL, APPLY_HITROLL, APPLY_DAMROLL, APPLY_SAVING_SPELL, APPLY_DAMROLL };
static int power_types[] = {APPLY_MANA, APPLY_HIT, APPLY_MOVE, APPLY_AC, APPLY_HIT };
switch (number(1, 3))
{
case 1:
obj->affected[0].location = attrib_types[number(0, TABLESIZE(attrib_types) - 1)];
obj->affected[0].modifier = number(1,4);
break;
case 2:
obj->affected[0].location = combat_types[number(0, TABLESIZE(combat_types) - 1)];
obj->affected[0].modifier = number(1, 1 + (level / 6));
break;
case 3:
obj->affected[0].location = power_types[number(0, TABLESIZE(power_types) - 1)];
obj->affected[0].modifier = MAX(1, number(level / 2, level + 1)) + (quality_table[qlty].bonus / 2);
break;
}
if (obj->affected[0].location == APPLY_AC || obj->affected[0].location == APPLY_SAVING_SPELL )
obj->affected[0].modifier *= -1;
SET_BIT(GET_OBJ_EXTRA(obj), ITEM_MAGIC);
}
return (obj);
}
OBJ_DATA *create_rand_feets(int level, bool magic)
{
OBJ_DATA *obj = NULL;
char buf[MAX_STRING_LENGTH];
int qlty = 0, type = 0;
qlty = number(0, MAX_QLTY);
type = number(0, TABLESIZE(rand_feets_table) -1);
obj = base_rand_obj(level, qlty);
sprintf(buf, "%s", rand_feets_table[type].name);
obj->name = str_dup(buf);
CREATE(obj->ex_description, EXTRA_DESCR, 1);
obj->ex_description->next = NULL;
obj->ex_description->keyword = str_dup(buf);
sprintf(buf, "Some %s quality %s created by the god of casuality.",
quality_table[qlty].descr, rand_feets_table[type].name);
obj->ex_description->description = str_dup(buf);
sprintf(buf, "some %s", rand_feets_table[type].name);
obj->short_description = str_dup(buf);
switch (number(1, 3))
{
case 1:
sprintf(buf, "Some %s lies here.", rand_feets_table[type].name);
break;
case 2:
sprintf(buf, "Some %s is resting here.", rand_feets_table[type].name);
break;
case 3:
sprintf(buf, "Some %s has been dropped here.", rand_feets_table[type].name);
break;
}
obj->description = str_dup(buf);
GET_OBJ_TYPE(obj) = ITEM_ARMOR;
GET_OBJ_VAL(obj, 0) = (quality_table[qlty].bonus + rand_feets_table[type].protect_mod + (level / 2)) / 2;
SET_BIT(GET_OBJ_WEAR(obj), rand_feets_table[type].wear_loc | ITEM_WEAR_TAKE);
if (magic)
{
static int attrib_types[] = {APPLY_STR, APPLY_STR, APPLY_DEX, APPLY_INT, APPLY_INT, APPLY_WIS, APPLY_DEX, APPLY_CON, APPLY_CON };
static int combat_types[] = {APPLY_HITROLL, APPLY_HITROLL, APPLY_DAMROLL, APPLY_SAVING_SPELL, APPLY_DAMROLL };
static int power_types[] = {APPLY_MANA, APPLY_HIT, APPLY_MOVE, APPLY_AC, APPLY_HIT };
switch (number(1, 3))
{
case 1:
obj->affected[0].location = attrib_types[number(0, TABLESIZE(attrib_types) - 1)];
obj->affected[0].modifier = number(1,2);
break;
case 2:
obj->affected[0].location = combat_types[number(0, TABLESIZE(combat_types) - 1)];
obj->affected[0].modifier = number(1, 1 + (level / 6));
break;
case 3:
obj->affected[0].location = power_types[number(0, TABLESIZE(power_types) - 1)];
obj->affected[0].modifier = MAX(1, number(level / 2, level + 1)) + (quality_table[qlty].bonus / 2);
break;
}
if (obj->affected[0].location == APPLY_AC || obj->affected[0].location == APPLY_SAVING_SPELL )
obj->affected[0].modifier *= -1;
SET_BIT(GET_OBJ_EXTRA(obj), ITEM_MAGIC);
}
return (obj);
}
OBJ_DATA *create_rand_belt(int level, bool magic)
{
OBJ_DATA *obj = NULL;
char buf[MAX_STRING_LENGTH], buf2[MAX_STRING_LENGTH];
int qlty = 0, type = 0;
qlty = number(0, MAX_QLTY);
type = number(0, TABLESIZE(rand_belt_table) -1);
obj = base_rand_obj(level, qlty);
sprintf(buf, "%s", rand_belt_table[type].name);
obj->name = str_dup(buf);
sprintf(buf2, "%s", AN(rand_belt_table[type].name));
CAP(buf2);
CREATE(obj->ex_description, EXTRA_DESCR, 1);
obj->ex_description->next = NULL;
obj->ex_description->keyword = str_dup(buf);
sprintf(buf, "%s %s quality %s created by the god of casuality.", buf2,
quality_table[qlty].descr, rand_belt_table[type].name);
obj->ex_description->description = str_dup(buf);
sprintf(buf, "%s %s", AN(rand_belt_table[type].name), rand_belt_table[type].name);
obj->short_description = str_dup(buf);
switch (number(1, 3)) {
case 1:
sprintf(buf, "%s %s lies here.", buf2, rand_belt_table[type].name);
break;
case 2:
sprintf(buf, "%s %s is resting here.", buf2, rand_belt_table[type].name);
break;
case 3:
sprintf(buf, "%s %s has been dropped here.", buf2, rand_belt_table[type].name);
break;
}
obj->description = str_dup(buf);
GET_OBJ_TYPE(obj) = ITEM_ARMOR;
GET_OBJ_VAL(obj, 0) = (quality_table[qlty].bonus + rand_belt_table[type].protect_mod + (level / 2)) / 2;
SET_BIT(GET_OBJ_WEAR(obj), rand_belt_table[type].wear_loc | ITEM_WEAR_TAKE);
if (magic)
{
static int attrib_types[] = {APPLY_STR, APPLY_STR, APPLY_DEX, APPLY_INT, APPLY_INT, APPLY_WIS, APPLY_DEX, APPLY_CON, APPLY_CON };
static int combat_types[] = {APPLY_HITROLL, APPLY_HITROLL, APPLY_DAMROLL, APPLY_SAVING_SPELL, APPLY_DAMROLL };
static int power_types[] = {APPLY_MANA, APPLY_HIT, APPLY_MOVE, APPLY_AC, APPLY_HIT };
switch (number(1, 3))
{
case 1:
obj->affected[0].location = attrib_types[number(0, TABLESIZE(attrib_types) - 1)];
obj->affected[0].modifier = number(1,2);
break;
case 2:
obj->affected[0].location = combat_types[number(0, TABLESIZE(combat_types) - 1)];
obj->affected[0].modifier = number(1, 1 + (level / 6));
break;
case 3:
obj->affected[0].location = power_types[number(0, TABLESIZE(power_types) - 1)];
obj->affected[0].modifier = MAX(1, number(level / 2, level + 1)) + (quality_table[qlty].bonus / 2);
break;
}
if (obj->affected[0].location == APPLY_AC || obj->affected[0].location == APPLY_SAVING_SPELL )
obj->affected[0].modifier *= -1;
SET_BIT(GET_OBJ_EXTRA(obj), ITEM_MAGIC);
}
return (obj);
}
OBJ_DATA *create_rand_helm(int level, bool magic)
{
OBJ_DATA *obj = NULL;
char buf[MAX_STRING_LENGTH], buf2[MAX_STRING_LENGTH];
int qlty = 0, type = 0;
qlty = number(0, MAX_QLTY);
type = number(0, TABLESIZE(rand_helm_table) -1);
obj = base_rand_obj(level, qlty);
sprintf(buf, "%s", rand_helm_table[type].name);
obj->name = str_dup(buf);
sprintf(buf2, "%s", AN(rand_helm_table[type].name));
CAP(buf2);
CREATE(obj->ex_description, EXTRA_DESCR, 1);
obj->ex_description->next = NULL;
obj->ex_description->keyword = str_dup(buf);
sprintf(buf, "%s %s quality %s created by the god of casuality.", buf2,
quality_table[qlty].descr, rand_helm_table[type].name);
obj->ex_description->description = str_dup(buf);
sprintf(buf, "%s %s", AN(rand_helm_table[type].name), rand_helm_table[type].name);
obj->short_description = str_dup(buf);
switch (number(1, 3))
{
case 1:
sprintf(buf, "%s %s lies here.", buf2, rand_helm_table[type].name);
break;
case 2:
sprintf(buf, "%s %s is resting here.", buf2, rand_helm_table[type].name);
break;
case 3:
sprintf(buf, "%s %s has been dropped here.", buf2, rand_helm_table[type].name);
break;
}
obj->description = str_dup(buf);
GET_OBJ_TYPE(obj) = ITEM_ARMOR;
GET_OBJ_VAL(obj, 0) = (quality_table[qlty].bonus + rand_helm_table[type].protect_mod + (level / 2)) / 2;
SET_BIT(GET_OBJ_WEAR(obj), rand_helm_table[type].wear_loc | ITEM_WEAR_TAKE);
if (magic)
{
static int attrib_types[] = {APPLY_STR, APPLY_STR, APPLY_DEX, APPLY_INT, APPLY_INT, APPLY_WIS, APPLY_DEX, APPLY_CON, APPLY_CON };
static int combat_types[] = {APPLY_HITROLL, APPLY_HITROLL, APPLY_DAMROLL, APPLY_SAVING_SPELL, APPLY_DAMROLL };
static int power_types[] = {APPLY_MANA, APPLY_HIT, APPLY_MOVE, APPLY_AC, APPLY_HIT };
switch (number(1, 3))
{
case 1:
obj->affected[0].location = attrib_types[number(0, TABLESIZE(attrib_types) - 1)];
obj->affected[0].modifier = number(1,2);
break;
case 2:
obj->affected[0].location = combat_types[number(0, TABLESIZE(combat_types) - 1)];
obj->affected[0].modifier = number(1, 1 + (level / 6));
break;
case 3:
obj->affected[0].location = power_types[number(0, TABLESIZE(power_types) - 1)];
obj->affected[0].modifier = MAX(1, number(level / 2, level + 1)) + (quality_table[qlty].bonus / 2);
break;
}
if (obj->affected[0].location == APPLY_AC || obj->affected[0].location == APPLY_SAVING_SPELL )
obj->affected[0].modifier *= -1;
SET_BIT(GET_OBJ_EXTRA(obj), ITEM_MAGIC);
}
return (obj);
}
OBJ_DATA *create_rand_worn(int level, bool magic)
{
OBJ_DATA *obj = NULL;
char buf[MAX_STRING_LENGTH], buf2[MAX_STRING_LENGTH];
int qlty = 0, type = 0;
qlty = number(0, 5);
type = number(0, TABLESIZE(rand_worn_table) -1);
obj = base_rand_obj(level, qlty);
sprintf(buf, "%s", rand_worn_table[type].name);
obj->name = str_dup(buf);
sprintf(buf2, "%s", AN(rand_worn_table[type].name));
CAP(buf2);
CREATE(obj->ex_description, EXTRA_DESCR, 1);
obj->ex_description->next = NULL;
obj->ex_description->keyword = str_dup(buf);
sprintf(buf, "%s %s quality %s created by the gods.", buf2,
quality_table[qlty].descr, rand_worn_table[type].name);
obj->ex_description->description = str_dup(buf);
sprintf(buf, "%s %s", AN(rand_worn_table[type].name), rand_worn_table[type].name);
obj->short_description = str_dup(buf);
sprintf(buf, "%s %s has been left here.", buf2, rand_worn_table[type].name);
obj->description = str_dup(buf);
GET_OBJ_TYPE(obj) = ITEM_WORN;
SET_BIT(GET_OBJ_EXTRA(obj), rand_worn_table[type].extra_flags);
SET_BIT(GET_OBJ_WEAR(obj), rand_worn_table[type].wear_loc | ITEM_WEAR_TAKE);
if (magic && rand_worn_table[type].magic_mod > 0)
{
static int attrib_types[] = { APPLY_STR, APPLY_STR, APPLY_DEX, APPLY_INT, APPLY_CON, APPLY_WIS, APPLY_INT, APPLY_DEX, APPLY_CON };
static int combat_types[] = { APPLY_HITROLL, APPLY_HITROLL, APPLY_DAMROLL, APPLY_DAMROLL };
static int power_types[] = { APPLY_MANA, APPLY_HIT, APPLY_AC, APPLY_AC, APPLY_HIT };
switch (number(1, 3))
{
case 1:
obj->affected[0].location = attrib_types[number(0, TABLESIZE(attrib_types) - 1)];
obj->affected[0].modifier = number(1, rand_worn_table[type].magic_mod);
break;
case 2:
obj->affected[0].location = combat_types[number(0, TABLESIZE(combat_types) - 1)];
obj->affected[0].modifier = number(1, level / 8 + 1);
break;
case 3:
obj->affected[0].location = power_types[number(0, TABLESIZE(power_types) - 1)];
obj->affected[0].modifier = MAX(1, number(level / 2, level)) + (quality_table[qlty].bonus / 2);
break;
}
if (obj->affected[0].location == APPLY_AC || obj->affected[0].location == APPLY_SAVING_SPELL )
obj->affected[0].modifier *= -1;
SET_BIT(GET_OBJ_EXTRA(obj), ITEM_MAGIC);
}
return (obj);
}
OBJ_DATA *create_rand_weapon(int level, bool magic)
{
OBJ_DATA *obj = NULL;
char buf[MAX_STRING_LENGTH], buf2[MAX_STRING_LENGTH];
int qlty = 0, type = 0;
qlty = number(0, 5);
type = number(0, TABLESIZE(rand_weapon_table) -1);
obj = base_rand_obj(level, qlty);
sprintf(buf, "%s", rand_weapon_table[type].name);
obj->name = str_dup(buf);
sprintf(buf2, "%s", AN(rand_weapon_table[type].name));
CAP(buf2);
CREATE(obj->ex_description, EXTRA_DESCR, 1);
obj->ex_description->next = NULL;
obj->ex_description->keyword = str_dup(buf);
sprintf(buf, "%s %s quality %s created by the gods.", buf2,
quality_table[qlty].descr, rand_weapon_table[type].name);
obj->ex_description->description = str_dup(buf);
sprintf(buf, "%s %s", AN(rand_weapon_table[type].name), rand_weapon_table[type].name);
obj->short_description = str_dup(buf);
sprintf(buf, "%s %s lies here.", buf2, rand_weapon_table[type].name);
obj->description = str_dup(buf);
GET_OBJ_TYPE(obj) = ITEM_WEAPON;
SET_BIT(GET_OBJ_WEAR(obj), ITEM_WEAR_TAKE | ITEM_WEAR_WIELD);
GET_OBJ_VAL(obj, 0) = 0;
GET_OBJ_VAL(obj, 1) = (level / 10) + 2 + (quality_table[qlty].bonus / 2);
GET_OBJ_VAL(obj, 2) = number(3, 3 + rand_weapon_table[type].damage_mod + (quality_table[qlty].bonus / 3));
GET_OBJ_VAL(obj, 3) = rand_weapon_table[type].damage_type - TYPE_HIT;
// if (magic && rand_weapon_table[type].magic_mod > 0) {
if (magic)
{
static int attrib_types[] = { APPLY_STR, APPLY_STR, APPLY_DEX, APPLY_INT, APPLY_STR, APPLY_WIS, APPLY_DEX, APPLY_DEX, APPLY_CON };
static int combat_types[] = { APPLY_HITROLL, APPLY_HITROLL, APPLY_DAMROLL, APPLY_DAMROLL };
static int power_types[] = { APPLY_MANA, APPLY_HIT, APPLY_HIT, APPLY_AC, APPLY_HIT };
switch (number(1, 3))
{
case 1:
obj->affected[0].location = attrib_types[number(0, TABLESIZE(attrib_types) - 1)];
obj->affected[0].modifier = number(1, rand_weapon_table[type].magic_mod);
break;
case 2:
obj->affected[0].location = combat_types[number(0, TABLESIZE(combat_types) - 1)];
obj->affected[0].modifier = number(1, level / 8 + 1);
break;
case 3:
obj->affected[0].location = power_types[number(0, TABLESIZE(power_types) - 1)];
obj->affected[0].modifier = MAX(1, number(level / 2, level)) + (quality_table[qlty].bonus / 2);
break;
}
if (obj->affected[0].location == APPLY_AC || obj->affected[0].location == APPLY_SAVING_SPELL )
obj->affected[0].modifier *= -1;
SET_BIT(GET_OBJ_EXTRA(obj), ITEM_MAGIC);
}
return (obj);
}
/* =============================================================== */
/* C O M A N D I */
/* =============================================================== */
ACMD(do_rand_armor)
{
OBJ_DATA *obj = NULL;
char arg1[MAX_INPUT_LENGTH];
char arg2[MAX_INPUT_LENGTH];
char arg3[MAX_INPUT_LENGTH];
bool ismagic = FALSE;
int level = 0;
argument = two_arguments(argument, arg1, arg2);
argument = one_argument(argument, arg3);
if (!*arg1)
{
send_to_char("Usage: &b&7randarmor <armor type> <level> <magical>&0\r\n\r\n", ch);
send_to_char("Valid armor types are:\r\n&b&7armor, helm, shield, arms, legs, hands, feets, belt&0\r\n\r\n", ch);
send_to_char("Valid level value is from 1 to 30.\r\n\r\n", ch);
send_to_char("If you want a magical armor, write 'magic', otherwise, don't write anything.\r\n", ch);
return;
}
if (!*arg2)
level = number(1, 30);
else
{
level = atoi(arg2);
if (level < 1 || level > 30)
level = number(1, 30);
}
if (!*arg3)
ismagic = FALSE;
else
{
if (!str_cmp(arg3, "magic"))
ismagic = TRUE;
}
if (!str_cmp(arg1, "armor"))
obj = create_rand_armor(level, ismagic);
else if (!str_cmp(arg1, "helm"))
obj = create_rand_helm(level, ismagic);
else if (!str_cmp(arg1, "shield"))
obj = create_rand_shield(level, ismagic);
else if (!str_cmp(arg1, "arms"))
obj = create_rand_arms(level, ismagic);
else if (!str_cmp(arg1, "legs"))
obj = create_rand_legs(level, ismagic);
else if (!str_cmp(arg1, "hands"))
obj = create_rand_hands(level, ismagic);
else if (!str_cmp(arg1, "feets"))
obj = create_rand_feets(level, ismagic);
else if (!str_cmp(arg1, "belt"))
obj = create_rand_belt(level, ismagic);
else
{
send_to_char("Valid armor types are:\r\n&b&7armor, helm, shield, arms, legs, hands, feets, belt&0\r\n\r\n", ch);
return;
}
if (obj)
{
obj_to_room(obj, IN_ROOM(ch));
send_to_char("Done.\r\n", ch);
}
else
log("SYSERR: null obj pointer returned in do_randarmor");
}
ACMD(do_rand_weapon)
{
OBJ_DATA *obj = NULL;
obj = create_rand_weapon(number(1, 30), FALSE);
obj_to_room(obj, IN_ROOM(ch));
send_to_char("Done.\r\n", ch);
}