#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "emlen.h"
#define ARC 8
int headp;
int bodyp;
int legsp;
int armsp;
bool
onepass_grab_armor (CHAR_DATA * ch, int attack_type)
{
SINGLE_OBJECT *o;
I_ARMOR *r;
int protect = 0;
int mod = 10;
int tprotect = 0;
if (attack_type > 1000)
attack_type -= 1000;
if (IS_PLAYER (ch))
{
tprotect = (100 - ch->armor) / ARC;
headp = tprotect;
bodyp = tprotect;
legsp = tprotect;
armsp = tprotect;
}
if (HAS_HANDS_ARMOR_IMPLANT (ch))
armsp += 3;
if (HAS_BODY_ARMOR_IMPLANT (ch))
bodyp += 3;
for (o = ch->carrying; o != NULL; o = o->next_content)
{
if (o->wear_loc == -1)
continue;
if (o->pIndexData->item_type != ITEM_ARMOR)
continue;
r = (I_ARMOR *) o->more;
if (r->protects_arms > 0)
{
if (attack_type < 0)
mod = 10;
else if (attack_type == 1 || attack_type == 3)
mod = r->slash_rating;
else if (attack_type == 2 || attack_type == 11)
mod = r->pierce_rating;
else if (attack_type == 4)
mod = 10;
else
mod = r->pound_rating;
protect = (r->protects_arms * mod) / 10;
if (r->max_condition == 0)
armsp += protect;
else
armsp += ((protect * ((r->condition_now * 10) / r->max_condition)) / 10);
}
if (r->protects_legs > 0)
{
if (attack_type < 0)
mod = 10;
else if (attack_type == 1 || attack_type == 3)
mod = r->slash_rating;
else if (attack_type == 2 || attack_type == 11)
mod = r->pierce_rating;
else if (attack_type == 4)
mod = 10;
else
mod = r->pound_rating;
protect = (r->protects_legs * mod) / 10;
if (r->max_condition == 0)
legsp += protect;
else
legsp += ((protect * ((r->condition_now * 10) / r->max_condition)) / 10);
}
if (r->protects_head > 0)
{
if (attack_type < 0)
mod = 10;
else if (attack_type == 1 || attack_type == 3)
mod = r->slash_rating;
else if (attack_type == 2 || attack_type == 11)
mod = r->pierce_rating;
else if (attack_type == 4)
mod = 10;
else
mod = r->pound_rating;
protect = (r->protects_head * mod) / 10;
if (r->max_condition == 0)
headp += protect;
else
headp += ((protect * ((r->condition_now * 10) / r->max_condition)) / 10);
}
if (r->protects_body > 0)
{
if (attack_type < 0)
mod = 10;
else if (attack_type == 1 || attack_type == 3)
mod = r->slash_rating;
else if (attack_type == 2 || attack_type == 11)
mod = r->pierce_rating;
else if (attack_type == 4)
mod = 10;
else
mod = r->pound_rating;
protect = (r->protects_body * mod) / 10;
if (r->max_condition == 0)
bodyp += protect;
else
bodyp += ((protect * ((r->condition_now * 10) / r->max_condition)) / 10);
}
}
return (armsp + legsp + headp + bodyp) / 4;
}
int
find_arm_protection (CHAR_DATA * ch, int attack_type)
{
SINGLE_OBJECT *o;
I_ARMOR *r;
int protect = 0;
int mod = 10;
int tprotect = 0;
if (attack_type > 1000)
attack_type -= 1000;
if (IS_PLAYER (ch))
tprotect = (100 - ch->armor) / ARC;
if (HAS_HANDS_ARMOR_IMPLANT (ch))
tprotect += 3;
for (o = ch->carrying; o != NULL; o = o->next_content)
{
if (o->wear_loc == -1)
continue;
if (o->pIndexData->item_type != ITEM_ARMOR)
continue;
r = (I_ARMOR *) o->more;
if (r->protects_arms < 1)
continue;
if (attack_type < 0)
mod = 10;
else if (attack_type == 1 || attack_type == 3)
mod = r->slash_rating;
else if (attack_type == 2 || attack_type == 11)
mod = r->pierce_rating;
else if (attack_type == 4)
mod = 10;
else
mod = r->pound_rating;
protect = (r->protects_arms * mod) / 10;
if (r->max_condition == 0)
tprotect += protect;
else
tprotect += ((protect * ((r->condition_now * 10) / r->max_condition)) / 10);
}
return tprotect;
}
int
find_leg_protection (CHAR_DATA * ch, int attack_type)
{
SINGLE_OBJECT *o;
I_ARMOR *r;
int protect = 0;
int mod = 10;
int tprotect = 0;
if (attack_type > 1000)
attack_type -= 1000;
if (IS_PLAYER (ch))
tprotect = (100 - ch->armor) / ARC;
for (o = ch->carrying; o != NULL; o = o->next_content)
{
if (o->wear_loc == -1)
continue;
if (o->pIndexData->item_type != ITEM_ARMOR)
continue;
r = (I_ARMOR *) o->more;
if (r->protects_legs < 1)
continue;
if (attack_type < 0)
mod = 10;
else if (attack_type == 1 || attack_type == 3)
mod = r->slash_rating;
else if (attack_type == 2 || attack_type == 11)
mod = r->pierce_rating;
else if (attack_type == 4)
mod = 10;
else
mod = r->pound_rating;
protect = (r->protects_legs * mod) / 10;
if (r->max_condition == 0)
tprotect += protect;
else
tprotect += ((protect * ((r->condition_now * 10) / r->max_condition)) / 10);
}
return tprotect;
}
int
find_body_protection (CHAR_DATA * ch, int attack_type)
{
SINGLE_OBJECT *o;
I_ARMOR *r;
int protect = 0;
int mod = 10;
int tprotect = 0;
if (attack_type > 1000)
attack_type -= 1000;
if (IS_PLAYER (ch))
tprotect = (100 - ch->armor) / ARC;
if (HAS_BODY_ARMOR_IMPLANT (ch))
tprotect += 3;
for (o = ch->carrying; o != NULL; o = o->next_content)
{
if (o->wear_loc == -1)
continue;
if (o->pIndexData->item_type != ITEM_ARMOR)
continue;
r = (I_ARMOR *) o->more;
if (r->protects_body < 1)
continue;
if (attack_type < 0)
mod = 10;
else if (attack_type == 1 || attack_type == 3)
mod = r->slash_rating;
else if (attack_type == 2 || attack_type == 11)
mod = r->pierce_rating;
else if (attack_type == 4)
mod = 10;
else
mod = r->pound_rating;
protect = (r->protects_body * mod) / 10;
if (r->max_condition == 0)
tprotect += protect;
else
tprotect += ((protect * ((r->condition_now * 10) / r->max_condition)) / 10);
}
return tprotect;
}
int
find_head_protection (CHAR_DATA * ch, int attack_type)
{
SINGLE_OBJECT *o;
I_ARMOR *r;
int protect = 0;
int mod = 10;
int tprotect = 0;
if (attack_type > 1000)
attack_type -= 1000;
if (IS_PLAYER (ch))
tprotect = (100 - ch->armor) / ARC;
for (o = ch->carrying; o != NULL; o = o->next_content)
{
if (o->wear_loc == -1)
continue;
if (o->pIndexData->item_type != ITEM_ARMOR)
continue;
r = (I_ARMOR *) o->more;
if (r->protects_head < 1)
continue;
if (attack_type < 0)
mod = 10;
else if (attack_type == 1 || attack_type == 3)
mod = r->slash_rating;
else if (attack_type == 2 || attack_type == 11)
mod = r->pierce_rating;
else if (attack_type == 4)
mod = 10;
else
mod = r->pound_rating;
protect = (r->protects_head * mod) / 10;
if (r->max_condition == 0)
tprotect += protect;
else
tprotect += ((protect * ((r->condition_now * 10) / r->max_condition)) / 10);
}
return tprotect;
}
int
general_ac (CHAR_DATA * ch)
{
return onepass_grab_armor (ch, -1);
}
int
new_damage_2 (CHAR_DATA * ch, int damage, int hit_loc, int dt)
{
int i = 0;
int prot;
if (hit_loc == STRIKE_BODY)
i = find_body_protection (ch, dt);
if (hit_loc == STRIKE_HEAD)
i = find_head_protection (ch, dt);
if (hit_loc == STRIKE_LEGS)
i = find_head_protection (ch, dt);
if (hit_loc == STRIKE_ARMS)
i = find_head_protection (ch, dt);
if (IS_MOB (ch))
{
i += ((60 - ch->armor) / 12);
if (i < 0)
return damage;
}
if (i > 9)
i = 8;
prot = number_range (0, i);
if (prot >= damage)
return 1;
return (damage - prot);
}
int
new_damage (CHAR_DATA * ch, int damage, int hit_loc, int dt)
{
int i = 0;
int prot;
if (hit_loc == STRIKE_BODY)
i = find_body_protection (ch, dt);
if (hit_loc == STRIKE_HEAD)
i = find_head_protection (ch, dt);
if (hit_loc == STRIKE_LEGS)
i = find_head_protection (ch, dt);
if (hit_loc == STRIKE_ARMS)
i = find_head_protection (ch, dt);
if (IS_MOB (ch))
{
i += ((60 - ch->armor) / 12);
if (i < 0)
return damage;
}
prot = number_range (0, i);
if (prot >= damage)
return 1;
return (damage - prot);
}
char *
pval (int i)
{
static char rv[50];
int j;
rv[0] = '\0';
for (j = 0; j < 20; j++)
{
if (pow.armor_lev_word[j] && i >= pow.armor_lev_min[j] && i <= pow.armor_lev_max[j])
{
sprintf (rv, pow.armor_lev_word[j]);
return rv;
}
}
return rv;
}
void
do_armor (CHAR_DATA * ch, char *argy)
{
char tmp[500];
int head;
int body;
int legs;
int arms;
int tt;
DEFINE_COMMAND ("armor", do_armor, POSITION_DEAD, 0, LOG_NORMAL, "This command shows your current armor protection levels.")
tt = onepass_grab_armor (ch, -1);
sprintf (tmp, " O <-- Head/Neck: %s\n\r", pval (headp));
send_to_char (tmp, ch);
sprintf (tmp, "/--|--\\ <-- Arms/Hands: %s\n\r", pval (armsp));
send_to_char (tmp, ch);
sprintf (tmp, " | <-- Body/Waist: %s\n\r", pval (bodyp));
send_to_char (tmp, ch);
sprintf (tmp, " / \\ <-- Legs/Feet: %s\n\r", pval (legsp));
send_to_char (tmp, ch);
sprintf (tmp, "_/ \\_ ------------------------\n\r");
send_to_char (tmp, ch);
sprintf (tmp, " %s\n\r", (pval (tt)));
send_to_char (tmp, ch);
if (IS_PLAYER (ch) && (ch->pcdata->implants_1 != 0 || ch->pcdata->implants_2 != 0))
{
send_to_char ("Implants:\n\r", ch);
if (HAS_ARMS_STRENGTH_IMPLANT (ch))
send_to_char ("Enhanced Arm Strength.\n\r", ch);
if (HAS_LEGS_STRENGTH_IMPLANT (ch))
send_to_char ("Enhanced Leg Strength.\n\r", ch);
if (HAS_HANDS_STRENGTH_IMPLANT (ch))
send_to_char ("Enhanced Hand Strength.\n\r", ch);
if (HAS_BODY_STRENGTH_IMPLANT (ch))
send_to_char ("Enhanced Body/Torso Muscle.\n\r", ch);
if (HAS_ARMS_DEXTERITY_IMPLANT (ch))
send_to_char ("Enhanced Dexterity in Arms.\n\r", ch);
if (HAS_LEGS_RUNNING_IMPLANT (ch))
send_to_char ("Enhanced Leg Durability.\n\r", ch);
if (HAS_HEAD_BRAIN_IMPLANT (ch))
send_to_char ("Intelli+ Brain Microchip.\n\r", ch);
if (HAS_FEET_IMPLANT (ch))
send_to_char ("Bionic Feet and Ankles.\n\r", ch);
if (HAS_HANDS_ARMOR_IMPLANT (ch))
send_to_char ("Sub-Dermal Metal Hand Plates.\n\r", ch);
if (HAS_BODY_ARMOR_IMPLANT (ch))
send_to_char ("Titanium Sternum and Rib Replacement.\n\r", ch);
}
return;
}
void
get_condition (SINGLE_OBJECT * obj)
{
char buf[500];
condition_var[0] = '\0';
if (obj->pIndexData->item_type == ITEM_ARMOR)
{
I_ARMOR *armor = (I_ARMOR *) obj->more;
int percent;
strcpy (buf, "Unknown");
if (armor->max_condition == 0 && armor->condition_now == 0)
strcpy (buf, "Indestructable");
else
{
percent = PERCENTAGE (armor->condition_now, armor->max_condition);
if (percent < 10)
strcpy (buf, "Almost unusable");
else if (percent < 30)
strcpy (buf, "Falling apart");
else if (percent < 50)
strcpy (buf, "Poor condition");
else if (percent < 65)
strcpy (buf, "Fair condition");
else if (percent < 90)
strcpy (buf, "Good condition");
else
strcpy (buf, "Brand new");
}
}
if (obj->pIndexData->item_type == ITEM_WEAPON)
{
I_WEAPON *weap = (I_WEAPON *) obj->more;
if (weap->damage_p < 3)
strcpy (buf, "Broken");
else if (weap->damage_p < 10)
strcpy (buf, "Almost broken");
else if (weap->damage_p < 40)
strcpy (buf, "Badly damaged");
else if (weap->damage_p < 70)
strcpy (buf, "Damaged");
else if (weap->damage_p < 90)
strcpy (buf, "Good condition");
else
strcpy (buf, "Brand new");
}
strcpy (condition_var, buf);
return;
}
char *
format_obj_to (SINGLE_OBJECT * obj, CHAR_DATA * ch, bool fShort)
{
static char buf[STD_LENGTH];
buf[0] = '\0';
if (fShort)
{
char duh[500];
sprintf (duh, "%s\x1B[37;0m", ans_uppercase (OOSTR (obj, short_descr)));
strcat (buf, duh);
if (obj->pIndexData->item_type == ITEM_ARMOR)
{
I_ARMOR *armor = (I_ARMOR *) obj->more;
int percent;
if (armor->max_condition == 0 && armor->condition_now == 0)
strcat (buf, " (indestructable)");
else
{
percent = PERCENTAGE (armor->condition_now, armor->max_condition);
if (percent < 10)
strcat (buf, " (almost unusable)");
else if (percent < 30)
strcat (buf, " (falling apart)");
else if (percent < 50)
strcat (buf, " (poor condition)");
else if (percent < 65)
strcat (buf, " (fair condition)");
else if (percent < 90)
strcat (buf, " (good condition)");
else
strcat (buf, " (brand new)");
}
}
if (obj->pIndexData->item_type == ITEM_WEAPON)
{
I_WEAPON *weap = (I_WEAPON *) obj->more;
if (weap->damage_p < 1)
strcat (buf, " (broken)");
else if (weap->damage_p < 10)
strcat (buf, " (almst broken)");
else if (weap->damage_p < 40)
strcat (buf, " (badly damged)");
else if (weap->damage_p < 64)
strcat (buf, " (damaged)");
else if (weap->damage_p < 90)
strcat (buf, " (good cond)");
else
strcat (buf, " (brand new)");
}
if (obj->pIndexData->item_type == ITEM_GEM)
{
I_GEM *gem = (I_GEM *) obj->more;
if (gem->mana_now < 10)
strcat (buf, " (very dim)");
else if (gem->mana_now < 20)
strcat (buf, " (dim)");
else if (gem->mana_now < 65)
strcat (buf, " (soft glow)");
else if (gem->mana_now < 100)
strcat (buf, " (bright glow)");
else if (gem->mana_now < 140)
strcat (buf, " (intense glow)");
else
strcat (buf, " (radiating power)");
}
if (obj->pIndexData->item_type == ITEM_LIGHT && IS_LIT (obj))
{
int percent;
I_LIGHT *lgt = (I_LIGHT *) obj->more;
percent = (PERCENTAGE (lgt->light_now, lgt->max_light) / 10);
switch (percent)
{
case 0:
strcat (buf, " (very dim)");
break;
case 1:
strcat (buf, " (dim)");
break;
case 2:
strcat (buf, " (flickering)");
break;
default:
strcat (buf, "\x1B[33;1m (brightly lit)\x1B[37;0m");
break;
}
}
if (obj->pIndexData->item_type == ITEM_WAND || obj->pIndexData->item_type == ITEM_STAFF)
{
I_WAND *ws = (I_WAND *) obj->more;
int percent;
percent = ws->current_charges;
switch (percent)
{
case 0:
strcat (buf, " (powerless)");
break;
case 1:
strcat (buf, " (dim glow)");
break;
case 2:
strcat (buf, " (glowing)");
break;
default:
strcat (buf, "\x1B[33;1m (bright glow)\x1B[37;0m");
break;
}
}
strcat (buf, "\x1B[0m");
if (!(IS_OBJ_STAT (obj, ITEM_GLOW) || IS_OBJ_STAT (obj, ITEM_HUM) || IS_OBJ_STAT (obj, ITEM_INVIS) || IS_OBJ_STAT (obj, ITEM_UNSEEN)))
strcat (buf, "\n\r");
}
else
{
if (obj->pIndexData->item_type == ITEM_LIGHT && IS_LIT (obj))
{
I_LIGHT *light = (I_LIGHT *) obj->more;
int percent;
percent = (PERCENTAGE (light->light_now, light->max_light) / 10);
switch (percent)
{
case 0:
strcat (buf, "(Very dim)-> ");
break;
case 1:
strcat (buf, "(Dim)-> ");
break;
case 2:
strcat (buf, "(Flickering)-> ");
break;
default:
strcat (buf, "\x1B[33;1m(Brightly lit)->\x1B[36;0m ");
break;
}
}
strcat (buf, STR (obj, description));
}
if (!IS_OBJ_STAT (obj, ITEM_INVIS) && !IS_OBJ_STAT (obj, ITEM_UNSEEN) &&
(!(IS_AFFECTED (ch, AFF_DETECT_EVIL) && IS_OBJ_STAT (obj, ITEM_EVIL))) &&
(!(IS_AFFECTED (ch, AFF_DETECT_GOOD) && IS_OBJ_STAT (obj, ITEM_GOOD))) &&
(!(IS_AFFECTED (ch, AFF_DETECT_MAGIC) && IS_OBJ_STAT (obj, ITEM_MAGIC)))
&& !IS_OBJ_STAT (obj, ITEM_GLOW) && !IS_OBJ_STAT (obj, ITEM_HUM)
&& !IS_OBJ_STAT (obj, ITEM_UNSEEN)
)
return buf;
if (IS_OBJ_STAT (obj, ITEM_GLOW) && IS_OBJ_STAT (obj, ITEM_HUM))
{
strcat (buf, "\x1B[1m..it Glows and Hums with power! \x1B[0m");
}
else
{
if (IS_OBJ_STAT (obj, ITEM_GLOW))
strcat (buf, "\x1B[1m..it Glows with energy! \x1B[0m");
if (IS_OBJ_STAT (obj, ITEM_HUM))
strcat (buf, "\x1B[1m..it Hums with power! \x1B[0m");
}
if (!IS_OBJ_STAT (obj, ITEM_INVIS) && !IS_OBJ_STAT (obj, ITEM_UNSEEN) &&
(!(IS_AFFECTED (ch, AFF_DETECT_EVIL) && IS_OBJ_STAT (obj, ITEM_EVIL))) &&
(!(IS_AFFECTED (ch, AFF_DETECT_GOOD) && IS_OBJ_STAT (obj, ITEM_GOOD))) &&
(!(IS_AFFECTED (ch, AFF_DETECT_MAGIC) && IS_OBJ_STAT (obj, ITEM_MAGIC))))
{
strcat (buf, "\n\r");
return buf;
}
if (IS_OBJ_STAT (obj, ITEM_INVIS))
{
strcat (buf, "\x1B[1;30m (Invis) \x1B[0m");
if (!IS_OBJ_STAT (obj, ITEM_UNSEEN) &&
(!(IS_AFFECTED (ch, AFF_DETECT_EVIL) && IS_OBJ_STAT (obj, ITEM_EVIL))) &&
(!(IS_AFFECTED (ch, AFF_DETECT_GOOD) && IS_OBJ_STAT (obj, ITEM_GOOD))) &&
(!(IS_AFFECTED (ch, AFF_DETECT_MAGIC) && IS_OBJ_STAT (obj, ITEM_MAGIC))))
{
strcat (buf, "\n\r");
return buf;
}
}
if (IS_OBJ_STAT (obj, ITEM_UNSEEN))
{
strcat (buf, "\x1B[1;30m (Unseen) \x1B[0m");
if (
(!(IS_AFFECTED (ch, AFF_DETECT_EVIL) && IS_OBJ_STAT (obj, ITEM_EVIL))) &&
(!(IS_AFFECTED (ch, AFF_DETECT_GOOD) && IS_OBJ_STAT (obj, ITEM_GOOD))) &&
(!(IS_AFFECTED (ch, AFF_DETECT_MAGIC) && IS_OBJ_STAT (obj, ITEM_MAGIC))))
{
strcat (buf, "\n\r");
return buf;
}
}
if (IS_AFFECTED (ch, AFF_DETECT_GOOD)
&& IS_OBJ_STAT (obj, ITEM_GOOD))
{
strcat (buf, "\x1B[33;1m (Gold Aura) \x1B[0m");
if (
(!(IS_AFFECTED (ch, AFF_DETECT_EVIL) && IS_OBJ_STAT (obj, ITEM_EVIL))) &&
(!(IS_AFFECTED (ch, AFF_DETECT_MAGIC) && IS_OBJ_STAT (obj, ITEM_MAGIC))))
{
strcat (buf, "\n\r");
return buf;
}
}
if (IS_AFFECTED (ch, AFF_DETECT_EVIL)
&& IS_OBJ_STAT (obj, ITEM_EVIL))
{
strcat (buf, "\x1B[31m (Red Aura) \x1B[0m");
if ((!(IS_AFFECTED (ch, AFF_DETECT_MAGIC) && IS_OBJ_STAT (obj, ITEM_MAGIC))))
{
strcat (buf, "\n\r");
return buf;
}
}
if (IS_AFFECTED (ch, AFF_DETECT_MAGIC)
&& IS_OBJ_STAT (obj, ITEM_MAGIC))
strcat (buf, "\x1B[33;1m (Magical) \x1B[0m\n\r");
return buf;
}