summaryrefslogtreecommitdiffstats
path: root/trunk/source/itemname.cc
diff options
context:
space:
mode:
authorpeterb12 <peterb12@c06c8d41-db1a-0410-9941-cceddc491573>2005-07-21 02:34:44 +0000
committerpeterb12 <peterb12@c06c8d41-db1a-0410-9941-cceddc491573>2005-07-21 02:34:44 +0000
commit673bdae75485d14f759af597c3c62b99601f9a43 (patch)
tree368103f29fe0ce5dcf98060d9b5faa04590085fb /trunk/source/itemname.cc
parent7e900be770db24b0405fd2162491c405a425873e (diff)
downloadcrawl-ref-673bdae75485d14f759af597c3c62b99601f9a43.tar.gz
crawl-ref-673bdae75485d14f759af597c3c62b99601f9a43.zip
Initial revision
git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@3 c06c8d41-db1a-0410-9941-cceddc491573
Diffstat (limited to 'trunk/source/itemname.cc')
-rw-r--r--trunk/source/itemname.cc3196
1 files changed, 3196 insertions, 0 deletions
diff --git a/trunk/source/itemname.cc b/trunk/source/itemname.cc
new file mode 100644
index 0000000000..98737c7896
--- /dev/null
+++ b/trunk/source/itemname.cc
@@ -0,0 +1,3196 @@
+/*
+ * File: itemname.cc
+ * Summary: Misc functions.
+ * Written by: Linley Henzell
+ *
+ * Change History (most recent first):
+ *
+ * <4> 9/09/99 BWR Added hands_required function
+ * <3> 6/13/99 BWR Upped the base AC for heavy armour
+ * <2> 5/20/99 BWR Extended screen lines support
+ * <1> -/--/-- LRH Created
+ */
+
+#include "AppHdr.h"
+#include "itemname.h"
+
+#include <ctype.h>
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+#ifdef DOS
+#include <conio.h>
+#endif
+
+#include "externs.h"
+
+#include "macro.h"
+#include "mon-util.h"
+#include "randart.h"
+#include "skills2.h"
+#include "stuff.h"
+#include "wpn-misc.h"
+#include "view.h"
+
+
+char id[4][50];
+int prop[4][50][3];
+FixedArray < int, 20, 50 > mss;
+
+static bool is_random_name_vowel(unsigned char let);
+static char item_name_2( const item_def &item, char buff[ ITEMNAME_SIZE ], bool terse );
+
+char reduce(unsigned char reducee);
+char retbit(char sed);
+char retvow(char sed);
+
+bool is_vowel( const char chr )
+{
+ const char low = tolower( chr );
+
+ return (low == 'a' || low == 'e' || low == 'i' || low == 'o' || low == 'u');
+}
+
+// Some convenient functions to hide the bit operations and create
+// an interface layer between the code and the data in case this
+// gets changed again. -- bwr
+bool item_cursed( const item_def &item )
+{
+ return (item.flags & ISFLAG_CURSED);
+}
+
+bool item_uncursed( const item_def &item )
+{
+ return !(item.flags & ISFLAG_CURSED);
+}
+
+bool item_known_cursed( const item_def &item )
+{
+ return ((item.flags & ISFLAG_KNOW_CURSE) && (item.flags & ISFLAG_CURSED));
+}
+
+bool item_known_uncursed( const item_def &item )
+{
+ return ((item.flags & ISFLAG_KNOW_CURSE) && !(item.flags & ISFLAG_CURSED));
+}
+
+#if 0
+// currently unused
+bool fully_identified( const item_def &item )
+{
+ return ((item.flags & ISFLAG_IDENT_MASK) == ISFLAG_IDENT_MASK);
+}
+#endif
+
+bool item_ident( const item_def &item, unsigned long flags )
+{
+ return (item.flags & flags);
+}
+
+bool item_not_ident( const item_def &item, unsigned long flags )
+{
+ return ( !(item.flags & flags) );
+}
+
+void do_curse_item( item_def &item )
+{
+ item.flags |= ISFLAG_CURSED;
+}
+
+void do_uncurse_item( item_def &item )
+{
+ item.flags &= (~ISFLAG_CURSED);
+}
+
+void set_ident_flags( item_def &item, unsigned long flags )
+{
+ item.flags |= flags;
+}
+
+void unset_ident_flags( item_def &item, unsigned long flags )
+{
+ item.flags &= (~flags);
+}
+
+// These six functions might seem silly, but they provide a nice layer
+// for later changes to these systems. -- bwr
+unsigned long get_equip_race( const item_def &item )
+{
+ return (item.flags & ISFLAG_RACIAL_MASK);
+}
+
+unsigned long get_equip_desc( const item_def &item )
+{
+ return (item.flags & ISFLAG_COSMETIC_MASK);
+}
+
+bool cmp_equip_race( const item_def &item, unsigned long val )
+{
+ return (get_equip_race( item ) == val);
+}
+
+bool cmp_equip_desc( const item_def &item, unsigned long val )
+{
+ return (get_equip_desc( item ) == val);
+}
+
+void set_equip_race( item_def &item, unsigned long flags )
+{
+ ASSERT( (flags & ~ISFLAG_RACIAL_MASK) == 0 );
+
+ // first check for base-sub pairs that can't ever have racial types
+ switch (item.base_type)
+ {
+ case OBJ_WEAPONS:
+ if (item.sub_type == WPN_GIANT_CLUB
+ || item.sub_type == WPN_GIANT_SPIKED_CLUB
+ || item.sub_type == WPN_KATANA
+ || item.sub_type == WPN_SLING
+ || item.sub_type == WPN_KNIFE
+ || item.sub_type == WPN_QUARTERSTAFF
+ || item.sub_type == WPN_DEMON_BLADE
+ || item.sub_type == WPN_DEMON_WHIP
+ || item.sub_type == WPN_DEMON_TRIDENT)
+ {
+ return;
+ }
+ break;
+
+ case OBJ_ARMOUR:
+ if (item.sub_type >= ARM_DRAGON_HIDE)
+ {
+ return;
+ }
+ break;
+
+ case OBJ_MISSILES:
+ if (item.sub_type == MI_STONE || item.sub_type == MI_LARGE_ROCK)
+ {
+ return;
+ }
+ break;
+
+ default:
+ return;
+ }
+
+ // check that item is appropriate for racial type
+ switch (flags)
+ {
+ case ISFLAG_ELVEN:
+ if (item.base_type == OBJ_ARMOUR
+ && (item.sub_type == ARM_SPLINT_MAIL
+ || item.sub_type == ARM_BANDED_MAIL
+ || item.sub_type == ARM_PLATE_MAIL))
+ {
+ return;
+ }
+ break;
+
+ case ISFLAG_DWARVEN:
+ if (item.base_type == OBJ_ARMOUR
+ && (item.sub_type == ARM_ROBE
+ || item.sub_type == ARM_LEATHER_ARMOUR))
+ {
+ return;
+ }
+ break;
+
+ case ISFLAG_ORCISH:
+ default:
+ break;
+ }
+
+ item.flags &= ~ISFLAG_RACIAL_MASK; // delete previous
+ item.flags |= flags;
+}
+
+void set_equip_desc( item_def &item, unsigned long flags )
+{
+ ASSERT( (flags & ~ISFLAG_COSMETIC_MASK) == 0 );
+
+ item.flags &= ~ISFLAG_COSMETIC_MASK; // delete previous
+ item.flags |= flags;
+}
+
+short get_helmet_type( const item_def &item )
+{
+ ASSERT( item.base_type == OBJ_ARMOUR && item.sub_type == ARM_HELMET );
+
+ return (item.plus2 & THELM_TYPE_MASK);
+}
+
+short get_helmet_desc( const item_def &item )
+{
+ ASSERT( item.base_type == OBJ_ARMOUR && item.sub_type == ARM_HELMET );
+
+ return (item.plus2 & THELM_DESC_MASK);
+}
+
+void set_helmet_type( item_def &item, short type )
+{
+ ASSERT( (type & ~THELM_TYPE_MASK) == 0 );
+ ASSERT( item.base_type == OBJ_ARMOUR && item.sub_type == ARM_HELMET );
+
+ item.plus2 &= ~THELM_TYPE_MASK;
+ item.plus2 |= type;
+}
+
+void set_helmet_desc( item_def &item, short type )
+{
+ ASSERT( (type & ~THELM_DESC_MASK) == 0 );
+ ASSERT( item.base_type == OBJ_ARMOUR && item.sub_type == ARM_HELMET );
+
+ item.plus2 &= ~THELM_DESC_MASK;
+ item.plus2 |= type;
+}
+
+void set_helmet_random_desc( item_def &item )
+{
+ ASSERT( item.base_type == OBJ_ARMOUR && item.sub_type == ARM_HELMET );
+
+ item.plus2 &= ~THELM_DESC_MASK;
+ item.plus2 |= (random2(8) << 8);
+}
+
+bool cmp_helmet_type( const item_def &item, short val )
+{
+ ASSERT( item.base_type == OBJ_ARMOUR && item.sub_type == ARM_HELMET );
+
+ return (get_helmet_type( item ) == val);
+}
+
+bool cmp_helmet_desc( const item_def &item, short val )
+{
+ ASSERT( item.base_type == OBJ_ARMOUR && item.sub_type == ARM_HELMET );
+
+ return (get_helmet_desc( item ) == val);
+}
+
+bool set_item_ego_type( item_def &item, int item_type, int ego_type )
+{
+ if (item.base_type == item_type
+ && !is_random_artefact( item )
+ && !is_fixed_artefact( item ))
+ {
+ item.special = ego_type;
+ return (true);
+ }
+
+ return (false);
+}
+
+int get_weapon_brand( const item_def &item )
+{
+ // Weapon ego types are "brands", so we do the randart lookup here.
+
+ // Staves "brands" handled specially
+ if (item.base_type != OBJ_WEAPONS)
+ return (SPWPN_NORMAL);
+
+ if (is_fixed_artefact( item ))
+ {
+ switch (item.special)
+ {
+ case SPWPN_SWORD_OF_CEREBOV:
+ return (SPWPN_FLAMING);
+
+ case SPWPN_STAFF_OF_OLGREB:
+ return (SPWPN_VENOM);
+
+ case SPWPN_VAMPIRES_TOOTH:
+ return (SPWPN_VAMPIRICISM);
+
+ default:
+ return (SPWPN_NORMAL);
+ }
+ }
+ else if (is_random_artefact( item ))
+ {
+ return (randart_wpn_property( item, RAP_BRAND ));
+ }
+
+ return (item.special);
+}
+
+int get_ammo_brand( const item_def &item )
+{
+ // no artefact arrows yet -- bwr
+ if (item.base_type != OBJ_MISSILES || is_random_artefact( item ))
+ return (SPMSL_NORMAL);
+
+ return (item.special);
+}
+
+int get_armour_ego_type( const item_def &item )
+{
+ // artefact armours have no ego type, must look up powers separately
+ if (item.base_type != OBJ_ARMOUR
+ || (is_random_artefact( item ) && !is_unrandom_artefact( item )))
+ {
+ return (SPARM_NORMAL);
+ }
+
+ return (item.special);
+}
+
+bool item_is_rod( const item_def &item )
+{
+ return (item.base_type == OBJ_STAVES
+ && item.sub_type >= STAFF_SMITING && item.sub_type < STAFF_AIR);
+}
+
+bool item_is_staff( const item_def &item )
+{
+ // Isn't De Morgan's law wonderful. -- bwr
+ return (item.base_type == OBJ_STAVES
+ && (item.sub_type < STAFF_SMITING || item.sub_type >= STAFF_AIR));
+}
+
+// it_name() and in_name() are now somewhat obsolete now that itemname
+// takes item_def, so consider them depricated.
+void it_name( int itn, char des, char buff[ ITEMNAME_SIZE ], bool terse )
+{
+ item_name( mitm[itn], des, buff, terse );
+} // end it_name()
+
+
+void in_name( int inn, char des, char buff[ ITEMNAME_SIZE ], bool terse )
+{
+ item_name( you.inv[inn], des, buff, terse );
+} // end in_name()
+
+// quant_name is usful since it prints out a different number of items
+// than the item actually contains.
+void quant_name( const item_def &item, int quant, char des,
+ char buff[ ITEMNAME_SIZE ], bool terse )
+{
+ // item_name now requires a "real" item, so we'll mangle a tmp
+ item_def tmp = item;
+ tmp.quantity = quant;
+
+ item_name( tmp, des, buff, terse );
+} // end quant_name()
+
+char item_name( const item_def &item, char descrip, char buff[ ITEMNAME_SIZE ],
+ bool terse )
+{
+ const int item_clas = item.base_type;
+ const int item_typ = item.sub_type;
+ const int it_quant = item.quantity;
+
+ char tmp_quant[20];
+ char itm_name[ ITEMNAME_SIZE ] = "";
+
+ item_name_2( item, itm_name, terse );
+
+ buff[0] = '\0';
+
+ if (descrip == DESC_INVENTORY_EQUIP || descrip == DESC_INVENTORY)
+ {
+ if (item.x == -1 && item.y == -1) // actually in inventory
+ snprintf( buff, ITEMNAME_SIZE, (terse) ? "%c) " : "%c - ",
+ index_to_letter( item.link ) );
+ else
+ descrip = DESC_CAP_A;
+ }
+
+ if (terse)
+ descrip = DESC_PLAIN;
+
+ if (item_clas == OBJ_ORBS
+ || (item_ident( item, ISFLAG_KNOW_TYPE )
+ && ((item_clas == OBJ_MISCELLANY
+ && item_typ == MISC_HORN_OF_GERYON)
+ || (is_fixed_artefact( item )
+ || (is_random_artefact( item ))))))
+ {
+ // artefacts always get "the" unless we just want the plain name
+ switch (descrip)
+ {
+ case DESC_CAP_A:
+ case DESC_CAP_YOUR:
+ case DESC_CAP_THE:
+ strncat(buff, "The ", ITEMNAME_SIZE );
+ break;
+ case DESC_NOCAP_A:
+ case DESC_NOCAP_YOUR:
+ case DESC_NOCAP_THE:
+ case DESC_NOCAP_ITS:
+ case DESC_INVENTORY_EQUIP:
+ case DESC_INVENTORY:
+ strncat(buff, "the ", ITEMNAME_SIZE );
+ break;
+ default:
+ case DESC_PLAIN:
+ break;
+ }
+ }
+ else if (it_quant > 1)
+ {
+ switch (descrip)
+ {
+ case DESC_CAP_THE:
+ strncat(buff, "The ", ITEMNAME_SIZE );
+ break;
+ case DESC_NOCAP_THE:
+ strncat(buff, "the ", ITEMNAME_SIZE );
+ break;
+ case DESC_CAP_A:
+ case DESC_NOCAP_A:
+ case DESC_INVENTORY_EQUIP:
+ case DESC_INVENTORY:
+ break;
+ case DESC_CAP_YOUR:
+ strncat(buff, "Your ", ITEMNAME_SIZE );
+ break;
+ case DESC_NOCAP_YOUR:
+ strncat(buff, "your ", ITEMNAME_SIZE );
+ break;
+ case DESC_NOCAP_ITS:
+ strncat(buff, "its ", ITEMNAME_SIZE );
+ break;
+ case DESC_PLAIN:
+ default:
+ break;
+ }
+
+ itoa(it_quant, tmp_quant, 10);
+ strncat(buff, tmp_quant, ITEMNAME_SIZE );
+ strncat(buff, " ", ITEMNAME_SIZE );
+ }
+ else
+ {
+ switch (descrip)
+ {
+ case DESC_CAP_THE:
+ strncat(buff, "The ", ITEMNAME_SIZE );
+ break;
+ case DESC_NOCAP_THE:
+ strncat(buff, "the ", ITEMNAME_SIZE );
+ break;
+ case DESC_CAP_A:
+ strncat(buff, "A", ITEMNAME_SIZE );
+
+ if (itm_name[0] == 'a' || itm_name[0] == 'e' || itm_name[0] == 'i'
+ || itm_name[0] == 'o' || itm_name[0] == 'u')
+ {
+ strncat(buff, "n", ITEMNAME_SIZE );
+ }
+
+ strncat(buff, " ", ITEMNAME_SIZE );
+ break; // A/An
+
+ case DESC_NOCAP_A:
+ case DESC_INVENTORY_EQUIP:
+ case DESC_INVENTORY:
+ strncat(buff, "a", ITEMNAME_SIZE );
+
+ if (itm_name[0] == 'a' || itm_name[0] == 'e' || itm_name[0] == 'i'
+ || itm_name[0] == 'o' || itm_name[0] == 'u')
+ {
+ strncat(buff, "n", ITEMNAME_SIZE );
+ }
+
+ strncat(buff, " ", ITEMNAME_SIZE );
+ break; // a/an
+
+ case DESC_CAP_YOUR:
+ strncat(buff, "Your ", ITEMNAME_SIZE );
+ break;
+ case DESC_NOCAP_YOUR:
+ strncat(buff, "your ", ITEMNAME_SIZE );
+ break;
+ case DESC_NOCAP_ITS:
+ strncat(buff, "its ", ITEMNAME_SIZE );
+ break;
+ case DESC_PLAIN:
+ default:
+ break;
+ }
+ } // end of else
+
+ strncat(buff, itm_name, ITEMNAME_SIZE );
+
+ if (descrip == DESC_INVENTORY_EQUIP && item.x == -1 && item.y == -1)
+ {
+ ASSERT( item.link != -1 );
+
+ if (item.link == you.equip[EQ_WEAPON])
+ {
+ if (you.inv[ you.equip[EQ_WEAPON] ].base_type == OBJ_WEAPONS
+ || item_is_staff( you.inv[ you.equip[EQ_WEAPON] ] ))
+ {
+ strncat( buff, " (weapon)", ITEMNAME_SIZE );
+ }
+ else
+ {
+ strncat( buff, " (in hand)", ITEMNAME_SIZE );
+ }
+ }
+ else if (item.link == you.equip[EQ_CLOAK]
+ || item.link == you.equip[EQ_HELMET]
+ || item.link == you.equip[EQ_GLOVES]
+ || item.link == you.equip[EQ_BOOTS]
+ || item.link == you.equip[EQ_SHIELD]
+ || item.link == you.equip[EQ_BODY_ARMOUR])
+ {
+ strncat( buff, " (worn)", ITEMNAME_SIZE );
+ }
+ else if (item.link == you.equip[EQ_LEFT_RING])
+ {
+ strncat( buff, " (left hand)", ITEMNAME_SIZE );
+ }
+ else if (item.link == you.equip[EQ_RIGHT_RING])
+ {
+ strncat( buff, " (right hand)", ITEMNAME_SIZE );
+ }
+ else if (item.link == you.equip[EQ_AMULET])
+ {
+ strncat( buff, " (around neck)", ITEMNAME_SIZE );
+ }
+ }
+
+ return (1);
+} // end item_name()
+
+
+// Note that "terse" is only currently used for the "in hand" listing on
+// the game screen.
+static char item_name_2( const item_def &item, char buff[ITEMNAME_SIZE],
+ bool terse )
+{
+ const int item_clas = item.base_type;
+ const int item_typ = item.sub_type;
+ const int it_plus = item.plus;
+ const int item_plus2 = item.plus2;
+ const int it_quant = item.quantity;
+
+ char tmp_quant[20];
+ char tmp_buff[ITEMNAME_SIZE];
+ int brand;
+ unsigned char sparm;
+
+ buff[0] = '\0';
+
+ switch (item_clas)
+ {
+ case OBJ_WEAPONS:
+ if (item_ident( item, ISFLAG_KNOW_CURSE ) && !terse)
+ {
+ // We don't bother printing "uncursed" if the item is identified
+ // for pluses (it's state should be obvious), this is so that
+ // the weapon name is kept short (there isn't a lot of room
+ // for the name on the main screen). If you're going to change
+ // this behaviour, *please* make it so that there is an option
+ // that maintains this behaviour. -- bwr
+ if (item_cursed( item ))
+ strncat(buff, "cursed ", ITEMNAME_SIZE );
+ else if (Options.show_uncursed
+ && item_not_ident( item, ISFLAG_KNOW_PLUSES ))
+ {
+ strncat(buff, "uncursed ", ITEMNAME_SIZE );
+ }
+ }
+
+ if (item_ident( item, ISFLAG_KNOW_PLUSES ))
+ {
+ if (it_plus == 0 && item_plus2 == 0)
+ strncat(buff, "+0 ", ITEMNAME_SIZE );
+ else
+ {
+ if (it_plus >= 0)
+ strncat( buff, "+" , ITEMNAME_SIZE );
+
+ itoa( it_plus, tmp_quant, 10 );
+ strncat( buff, tmp_quant , ITEMNAME_SIZE );
+
+ if (it_plus != item_plus2 || !terse)
+ {
+ strncat( buff, "," , ITEMNAME_SIZE );
+
+ if (item_plus2 >= 0)
+ strncat(buff, "+", ITEMNAME_SIZE );
+
+ itoa( item_plus2, tmp_quant, 10 );
+ strncat( buff, tmp_quant , ITEMNAME_SIZE );
+ }
+
+ strncat( buff, " " , ITEMNAME_SIZE );
+ }
+ }
+
+ if (is_random_artefact( item ))
+ {
+ strncat( buff, randart_name(item), ITEMNAME_SIZE );
+ break;
+ }
+
+ if (is_fixed_artefact( item ))
+ {
+ if (item_ident( item, ISFLAG_KNOW_TYPE ))
+ {
+ strncat(buff,
+ (item.special == SPWPN_SINGING_SWORD) ? "Singing Sword" :
+ (item.special == SPWPN_WRATH_OF_TROG) ? "Wrath of Trog" :
+ (item.special == SPWPN_SCYTHE_OF_CURSES) ? "Scythe of Curses" :
+ (item.special == SPWPN_MACE_OF_VARIABILITY) ? "Mace of Variability" :
+ (item.special == SPWPN_GLAIVE_OF_PRUNE) ? "Glaive of Prune" :
+ (item.special == SPWPN_SCEPTRE_OF_TORMENT) ? "Sceptre of Torment" :
+ (item.special == SPWPN_SWORD_OF_ZONGULDROK) ? "Sword of Zonguldrok" :
+ (item.special == SPWPN_SWORD_OF_CEREBOV) ? "Sword of Cerebov" :
+ (item.special == SPWPN_STAFF_OF_DISPATER) ? "Staff of Dispater" :
+ (item.special == SPWPN_SCEPTRE_OF_ASMODEUS) ? "Sceptre of Asmodeus" :
+ (item.special == SPWPN_SWORD_OF_POWER) ? "Sword of Power" :
+ (item.special == SPWPN_KNIFE_OF_ACCURACY) ? "Knife of Accuracy" :
+ (item.special == SPWPN_STAFF_OF_OLGREB) ? "Staff of Olgreb" :
+ (item.special == SPWPN_VAMPIRES_TOOTH) ? "Vampire's Tooth" :
+ (item.special == SPWPN_STAFF_OF_WUCAD_MU) ? "Staff of Wucad Mu"
+ : "Brodale's Buggy Bola",
+ ITEMNAME_SIZE );
+ }
+ else
+ {
+ strncat(buff,
+ (item.special == SPWPN_SINGING_SWORD) ? "golden long sword" :
+ (item.special == SPWPN_WRATH_OF_TROG) ? "bloodstained battleaxe" :
+ (item.special == SPWPN_SCYTHE_OF_CURSES) ? "warped scythe" :
+ (item.special == SPWPN_MACE_OF_VARIABILITY) ? "shimmering mace" :
+ (item.special == SPWPN_GLAIVE_OF_PRUNE) ? "purple glaive" :
+ (item.special == SPWPN_SCEPTRE_OF_TORMENT) ? "jeweled golden mace" :
+ (item.special == SPWPN_SWORD_OF_ZONGULDROK) ? "bone long sword" :
+ (item.special == SPWPN_SWORD_OF_CEREBOV) ? "great serpentine sword" :
+ (item.special == SPWPN_STAFF_OF_DISPATER) ? "golden staff" :
+ (item.special == SPWPN_SCEPTRE_OF_ASMODEUS) ? "ruby sceptre" :
+ (item.special == SPWPN_SWORD_OF_POWER) ? "chunky great sword" :
+ (item.special == SPWPN_KNIFE_OF_ACCURACY) ? "thin dagger" :
+ (item.special == SPWPN_STAFF_OF_OLGREB) ? "green glowing staff" :
+ (item.special == SPWPN_VAMPIRES_TOOTH) ? "ivory dagger" :
+ (item.special == SPWPN_STAFF_OF_WUCAD_MU) ? "quarterstaff"
+ : "buggy bola",
+ ITEMNAME_SIZE );
+ }
+ break;
+ }
+
+ // Now that we can have "glowing elven" weapons, it's
+ // probably a good idea to cut out the descriptive
+ // term once it's become obsolete. -- bwr
+ if (item_not_ident( item, ISFLAG_KNOW_PLUSES ) && !terse)
+ {
+ switch (get_equip_desc( item ))
+ {
+ case ISFLAG_RUNED:
+ strncat(buff, "runed ", ITEMNAME_SIZE );
+ break;
+ case ISFLAG_GLOWING:
+ strncat(buff, "glowing ", ITEMNAME_SIZE );
+ break;
+ }
+ }
+
+ // always give racial type (it does have game effects)
+
+ switch (get_equip_race( item ))
+ {
+ case ISFLAG_ORCISH:
+ strncat( buff, (terse) ? "orc " : "orcish ", ITEMNAME_SIZE );
+ break;
+ case ISFLAG_ELVEN:
+ strncat( buff, (terse) ? "elf " : "elven ", ITEMNAME_SIZE );
+ break;
+ case ISFLAG_DWARVEN:
+ strncat( buff, (terse) ? "dwarf " : "dwarven ", ITEMNAME_SIZE );
+ break;
+ }
+
+ brand = get_weapon_brand( item );
+
+ if (item_ident( item, ISFLAG_KNOW_TYPE ) && !terse)
+ {
+ if (brand == SPWPN_VAMPIRICISM)
+ strncat(buff, "vampiric ", ITEMNAME_SIZE );
+ } // end if
+
+ standard_name_weap( item_typ, tmp_buff );
+ strncat( buff, tmp_buff, ITEMNAME_SIZE );
+
+ if (item_ident( item, ISFLAG_KNOW_TYPE ))
+ {
+ switch (brand)
+ {
+ case SPWPN_NORMAL:
+ break;
+ case SPWPN_FLAMING:
+ strncat(buff, (terse) ? " (flame)" : " of flaming", ITEMNAME_SIZE );
+ break;
+ case SPWPN_FREEZING:
+ strncat(buff, (terse) ? " (freeze)" : " of freezing", ITEMNAME_SIZE );
+ break;
+ case SPWPN_HOLY_WRATH:
+ strncat(buff, (terse) ? " (holy)" : " of holy wrath", ITEMNAME_SIZE );
+ break;
+ case SPWPN_ELECTROCUTION:
+ strncat(buff, (terse) ? " (elec)" : " of electrocution", ITEMNAME_SIZE );
+ break;
+ case SPWPN_ORC_SLAYING:
+ strncat(buff, (terse) ? " (slay orc)" : " of orc slaying", ITEMNAME_SIZE );
+ break;
+ case SPWPN_VENOM:
+ strncat(buff, (terse) ? " (venom)" : " of venom", ITEMNAME_SIZE );
+ break;
+ case SPWPN_PROTECTION:
+ strncat(buff, (terse) ? " (protect)" : " of protection", ITEMNAME_SIZE );
+ break;
+ case SPWPN_DRAINING:
+ strncat(buff, (terse) ? " (drain)" : " of draining", ITEMNAME_SIZE );
+ break;
+ case SPWPN_SPEED:
+ strncat(buff, (terse) ? " (speed)" : " of speed", ITEMNAME_SIZE );
+ break;
+ case SPWPN_VORPAL:
+ switch (damage_type(item_clas, item_typ))
+ {
+ case DVORP_CRUSHING:
+ strncat(buff, (terse) ? " (crush)" : " of crushing", ITEMNAME_SIZE );
+ break;
+ case DVORP_SLICING:
+ strncat(buff, (terse) ? " (slice)" : " of slicing", ITEMNAME_SIZE );
+ break;
+ case DVORP_PIERCING:
+ strncat(buff, (terse) ? " (pierce)" : " of piercing", ITEMNAME_SIZE );
+ break;
+ case DVORP_CHOPPING:
+ strncat(buff, (terse) ? " (chop)" : " of chopping", ITEMNAME_SIZE );
+ break;
+ }
+ break;
+
+ case SPWPN_FLAME:
+ strncat(buff, (terse) ? " (flame)" : " of flame", ITEMNAME_SIZE );
+ break; // bows/xbows
+
+ case SPWPN_FROST:
+ strncat(buff, (terse) ? " (frost)" : " of frost", ITEMNAME_SIZE );
+ break; // bows/xbows
+
+ case SPWPN_VAMPIRICISM:
+ if (terse)
+ strncat( buff, " (vamp)", ITEMNAME_SIZE );
+ break;
+
+ case SPWPN_DISRUPTION:
+ strncat(buff, (terse) ? " (disrupt)" : " of disruption", ITEMNAME_SIZE );
+ break;
+ case SPWPN_PAIN:
+ strncat(buff, (terse) ? " (pain)" : " of pain", ITEMNAME_SIZE );
+ break;
+ case SPWPN_DISTORTION:
+ strncat(buff, (terse) ? " (distort)" : " of distortion", ITEMNAME_SIZE );
+ break;
+
+ case SPWPN_REACHING:
+ strncat(buff, (terse) ? " (reach)" : " of reaching", ITEMNAME_SIZE );
+ break;
+
+ /* 25 - 29 are randarts */
+ }
+ }
+
+ if (item_ident(item, ISFLAG_KNOW_CURSE) && item_cursed(item) && terse)
+ strncat( buff, " (curse)", ITEMNAME_SIZE );
+ break;
+
+ case OBJ_MISSILES:
+ brand = get_ammo_brand( item );
+
+ if (brand == SPMSL_POISONED || brand == SPMSL_POISONED_II)
+ {
+ strncat( buff, (terse) ? "poison " : "poisoned ", ITEMNAME_SIZE );
+ }
+
+ if (item_ident( item, ISFLAG_KNOW_PLUSES ))
+ {
+ if (it_plus >= 0)
+ strncat(buff, "+", ITEMNAME_SIZE );
+
+ itoa( it_plus, tmp_quant, 10 );
+
+ strncat(buff, tmp_quant, ITEMNAME_SIZE );
+ strncat(buff, " ", ITEMNAME_SIZE );
+ }
+
+ if (get_equip_race( item ))
+ {
+ int dwpn = get_equip_race( item );
+
+ strncat(buff,
+ (dwpn == ISFLAG_ORCISH) ? ((terse) ? "orc " : "orcish ") :
+ (dwpn == ISFLAG_ELVEN) ? ((terse) ? "elf " : "elven ") :
+ (dwpn == ISFLAG_DWARVEN) ? ((terse) ? "dwarf " : "dwarven ")
+ : "buggy ",
+ ITEMNAME_SIZE);
+ }
+
+ strncat(buff, (item_typ == MI_STONE) ? "stone" :
+ (item_typ == MI_ARROW) ? "arrow" :
+ (item_typ == MI_BOLT) ? "bolt" :
+ (item_typ == MI_DART) ? "dart" :
+ (item_typ == MI_NEEDLE) ? "needle" :
+ (item_typ == MI_EGGPLANT) ? "eggplant" :
+ (item_typ == MI_LARGE_ROCK) ? "large rock" : "", ITEMNAME_SIZE);
+ // this should probably be "" {dlb}
+
+ if (it_quant > 1)
+ strncat(buff, "s", ITEMNAME_SIZE );
+
+ if (item_ident( item, ISFLAG_KNOW_TYPE ))
+ {
+ strncat( buff,
+ (brand == SPMSL_FLAME) ? ((terse) ? " (flame)" : " of flame") :
+ (brand == SPMSL_ICE) ? ((terse) ? " (ice)" : " of ice") :
+ (brand == SPMSL_NORMAL) ? "" :
+ (brand == SPMSL_POISONED) ? "" :
+ (brand == SPMSL_POISONED_II) ? "" : " (buggy)", ITEMNAME_SIZE );
+ }
+ break;
+
+ case OBJ_ARMOUR:
+ if (item_ident( item, ISFLAG_KNOW_CURSE ) && !terse)
+ {
+ if (item_cursed( item ))
+ strncat(buff, "cursed ", ITEMNAME_SIZE );
+ else if (Options.show_uncursed
+ && item_not_ident( item, ISFLAG_KNOW_PLUSES ))
+ {
+ strncat(buff, "uncursed ", ITEMNAME_SIZE );
+ }
+ }
+
+ if (item_ident( item, ISFLAG_KNOW_PLUSES ))
+ {
+ if (it_plus >= 0)
+ strncat(buff, "+", ITEMNAME_SIZE );
+
+ itoa( it_plus, tmp_quant, 10 );
+
+ strncat(buff, tmp_quant, ITEMNAME_SIZE );
+ strncat(buff, " ", ITEMNAME_SIZE );
+ }
+
+ if (item_typ == ARM_GLOVES
+ || (item_typ == ARM_BOOTS && item_plus2 == TBOOT_BOOTS))
+ {
+ strncat( buff, "pair of ", ITEMNAME_SIZE );
+ }
+
+ if (is_random_artefact( item ))
+ {
+ strncat(buff, randart_armour_name(item), ITEMNAME_SIZE);
+ break;
+ }
+
+ // Now that we can have "glowing elven" armour, it's
+ // probably a good idea to cut out the descriptive
+ // term once it's become obsolete. -- bwr
+ if (item_not_ident( item, ISFLAG_KNOW_PLUSES ) && !terse)
+ {
+ switch (get_equip_desc( item ))
+ {
+ case ISFLAG_EMBROIDERED_SHINY:
+ if (item_typ == ARM_ROBE || item_typ == ARM_CLOAK
+ || item_typ == ARM_GLOVES || item_typ == ARM_BOOTS)
+ {
+ strncat(buff, "embroidered ", ITEMNAME_SIZE );
+ }
+ else if (item_typ != ARM_LEATHER_ARMOUR
+ && item_typ != ARM_ANIMAL_SKIN)
+ {
+ strncat(buff, "shiny ", ITEMNAME_SIZE );
+ }
+ break;
+
+ case ISFLAG_RUNED:
+ strncat(buff, "runed ", ITEMNAME_SIZE );
+ break;
+
+ case ISFLAG_GLOWING:
+ strncat(buff, "glowing ", ITEMNAME_SIZE );
+ break;
+ }
+ }
+
+ // always give racial description (has game effects)
+ switch (get_equip_race( item ))
+ {
+ case ISFLAG_ELVEN:
+ strncat(buff, (terse) ? "elf " :"elven ", ITEMNAME_SIZE );
+ break;
+ case ISFLAG_DWARVEN:
+ strncat(buff, (terse) ? "dwarf " : "dwarven ", ITEMNAME_SIZE );
+ break;
+ case ISFLAG_ORCISH:
+ strncat(buff, (terse) ? "orc " : "orcish ", ITEMNAME_SIZE );
+ break;
+ } // end switch
+
+ standard_name_armour( item, tmp_buff ); // in randart.cc
+ strncat( buff, tmp_buff, ITEMNAME_SIZE );
+
+ sparm = get_armour_ego_type( item );
+
+ if (item_ident( item, ISFLAG_KNOW_TYPE ) && sparm != SPARM_NORMAL)
+ {
+ if (!terse)
+ {
+ strncat(buff, " of ", ITEMNAME_SIZE );
+
+ strncat(buff, (sparm == SPARM_RUNNING) ? "running" :
+ (sparm == SPARM_FIRE_RESISTANCE) ? "fire resistance" :
+ (sparm == SPARM_COLD_RESISTANCE) ? "cold resistance" :
+ (sparm == SPARM_POISON_RESISTANCE) ? "poison resistance" :
+ (sparm == SPARM_SEE_INVISIBLE) ? "see invisible" :
+ (sparm == SPARM_DARKNESS) ? "darkness" :
+ (sparm == SPARM_STRENGTH) ? "strength" :
+ (sparm == SPARM_DEXTERITY) ? "dexterity" :
+ (sparm == SPARM_INTELLIGENCE) ? "intelligence" :
+ (sparm == SPARM_PONDEROUSNESS) ? "ponderousness" :
+ (sparm == SPARM_LEVITATION) ? "levitation" :
+ (sparm == SPARM_MAGIC_RESISTANCE) ? "magic resistance" :
+ (sparm == SPARM_PROTECTION) ? "protection" :
+ (sparm == SPARM_STEALTH) ? "stealth" :
+ (sparm == SPARM_RESISTANCE) ? "resistance" :
+ (sparm == SPARM_POSITIVE_ENERGY) ? "positive energy" :
+ (sparm == SPARM_ARCHMAGI) ? "the Archmagi" :
+ (sparm == SPARM_PRESERVATION) ? "preservation"
+ : "bugginess",
+ ITEMNAME_SIZE);
+ }
+ else
+ {
+ strncat(buff, (sparm == SPARM_RUNNING) ? " (run)" :
+ (sparm == SPARM_FIRE_RESISTANCE) ? " (R-fire)" :
+ (sparm == SPARM_COLD_RESISTANCE) ? " (R-cold)" :
+ (sparm == SPARM_POISON_RESISTANCE) ? " (R-poison)" :
+ (sparm == SPARM_SEE_INVISIBLE) ? " (see invis)" :
+ (sparm == SPARM_DARKNESS) ? " (darkness)" :
+ (sparm == SPARM_STRENGTH) ? " (str)" :
+ (sparm == SPARM_DEXTERITY) ? " (dex)" :
+ (sparm == SPARM_INTELLIGENCE) ? " (int)" :
+ (sparm == SPARM_PONDEROUSNESS) ? " (ponderous)" :
+ (sparm == SPARM_LEVITATION) ? " (levitate)" :
+ (sparm == SPARM_MAGIC_RESISTANCE) ? " (R-magic)" :
+ (sparm == SPARM_PROTECTION) ? " (protect)" :
+ (sparm == SPARM_STEALTH) ? " (stealth)" :
+ (sparm == SPARM_RESISTANCE) ? " (resist)" :
+ (sparm == SPARM_POSITIVE_ENERGY) ? " (R-neg)" : // ha ha
+ (sparm == SPARM_ARCHMAGI) ? " (Archmagi)" :
+ (sparm == SPARM_PRESERVATION) ? " (preserve)"
+ : " (buggy)",
+ ITEMNAME_SIZE);
+ }
+ }
+
+ if (item_ident(item, ISFLAG_KNOW_CURSE) && item_cursed(item) && terse)
+ strncat( buff, " (curse)", ITEMNAME_SIZE );
+ break;
+
+ // compacted 15 Apr 2000 {dlb}:
+ case OBJ_WANDS:
+ if (id[ IDTYPE_WANDS ][item_typ] == ID_KNOWN_TYPE
+ || item_ident( item, ISFLAG_KNOW_TYPE ))
+ {
+ strncat(buff, "wand of ", ITEMNAME_SIZE );
+ strncat(buff, (item_typ == WAND_FLAME) ? "flame" :
+ (item_typ == WAND_FROST) ? "frost" :
+ (item_typ == WAND_SLOWING) ? "slowing" :
+ (item_typ == WAND_HASTING) ? "hasting" :
+ (item_typ == WAND_MAGIC_DARTS) ? "magic darts" :
+ (item_typ == WAND_HEALING) ? "healing" :
+ (item_typ == WAND_PARALYSIS) ? "paralysis" :
+ (item_typ == WAND_FIRE) ? "fire" :
+ (item_typ == WAND_COLD) ? "cold" :
+ (item_typ == WAND_CONFUSION) ? "confusion" :
+ (item_typ == WAND_INVISIBILITY) ? "invisibility" :
+ (item_typ == WAND_DIGGING) ? "digging" :
+ (item_typ == WAND_FIREBALL) ? "fireball" :
+ (item_typ == WAND_TELEPORTATION) ? "teleportation" :
+ (item_typ == WAND_LIGHTNING) ? "lightning" :
+ (item_typ == WAND_POLYMORPH_OTHER) ? "polymorph other" :
+ (item_typ == WAND_ENSLAVEMENT) ? "enslavement" :
+ (item_typ == WAND_DRAINING) ? "draining" :
+ (item_typ == WAND_RANDOM_EFFECTS) ? "random effects" :
+ (item_typ == WAND_DISINTEGRATION) ? "disintegration"
+ : "bugginess",
+ ITEMNAME_SIZE );
+ }
+ else
+ {
+ char primary = (item.special % 12);
+ char secondary = (item.special / 12);
+
+ strncat(buff,(secondary == 0) ? "" : // hope this works {dlb}
+ (secondary == 1) ? "jeweled" :
+ (secondary == 2) ? "curved" :
+ (secondary == 3) ? "long" :
+ (secondary == 4) ? "short" :
+ (secondary == 5) ? "twisted" :
+ (secondary == 6) ? "crooked" :
+ (secondary == 7) ? "forked" :
+ (secondary == 8) ? "shiny" :
+ (secondary == 9) ? "blackened" :
+ (secondary == 10) ? "tapered" :
+ (secondary == 11) ? "glowing" :
+ (secondary == 12) ? "worn" :
+ (secondary == 13) ? "encrusted" :
+ (secondary == 14) ? "runed" :
+ (secondary == 15) ? "sharpened" : "buggily", ITEMNAME_SIZE);
+
+ if (secondary != 0)
+ strncat(buff, " ", ITEMNAME_SIZE );
+
+ strncat(buff, (primary == 0) ? "iron" :
+ (primary == 1) ? "brass" :
+ (primary == 2) ? "bone" :
+ (primary == 3) ? "wooden" :
+ (primary == 4) ? "copper" :
+ (primary == 5) ? "gold" :
+ (primary == 6) ? "silver" :
+ (primary == 7) ? "bronze" :
+ (primary == 8) ? "ivory" :
+ (primary == 9) ? "glass" :
+ (primary == 10) ? "lead" :
+ (primary == 11) ? "plastic" : "buggy", ITEMNAME_SIZE);
+
+ strncat(buff, " wand", ITEMNAME_SIZE );
+
+ if (id[ IDTYPE_WANDS ][item_typ] == ID_TRIED_TYPE)
+ {
+ strncat( buff, " {tried}" , ITEMNAME_SIZE );
+ }
+ }
+
+ if (item_ident( item, ISFLAG_KNOW_PLUSES ))
+ {
+ strncat(buff, " (", ITEMNAME_SIZE );
+ itoa( it_plus, tmp_quant, 10 );
+ strncat(buff, tmp_quant, ITEMNAME_SIZE );
+ strncat(buff, ")", ITEMNAME_SIZE);
+ }
+ break;
+
+ // NB: potions, food, and scrolls stack on the basis of class and
+ // type ONLY !!!
+
+ // compacted 15 Apr 2000 {dlb}:
+ case OBJ_POTIONS:
+ if (id[ IDTYPE_POTIONS ][item_typ] == ID_KNOWN_TYPE
+ || item_ident( item, ISFLAG_KNOW_TYPE ))
+ {
+ strncat(buff, "potion", ITEMNAME_SIZE );
+ strncat(buff, (it_quant == 1) ? " " : "s ", ITEMNAME_SIZE);
+ strncat(buff, "of ", ITEMNAME_SIZE );
+ strncat(buff, (item_typ == POT_HEALING) ? "healing" :
+ (item_typ == POT_HEAL_WOUNDS) ? "heal wounds" :
+ (item_typ == POT_SPEED) ? "speed" :
+ (item_typ == POT_MIGHT) ? "might" :
+ (item_typ == POT_GAIN_STRENGTH) ? "gain strength" :
+ (item_typ == POT_GAIN_DEXTERITY) ? "gain dexterity" :
+ (item_typ == POT_GAIN_INTELLIGENCE) ? "gain intelligence" :
+ (item_typ == POT_LEVITATION) ? "levitation" :
+ (item_typ == POT_POISON) ? "poison" :
+ (item_typ == POT_SLOWING) ? "slowing" :
+ (item_typ == POT_PARALYSIS) ? "paralysis" :
+ (item_typ == POT_CONFUSION) ? "confusion" :
+ (item_typ == POT_INVISIBILITY) ? "invisibility" :
+ (item_typ == POT_PORRIDGE) ? "porridge" :
+ (item_typ == POT_DEGENERATION) ? "degeneration" :
+ (item_typ == POT_DECAY) ? "decay" :
+ (item_typ == POT_WATER) ? "water" :
+ (item_typ == POT_EXPERIENCE) ? "experience" :
+ (item_typ == POT_MAGIC) ? "magic" :
+ (item_typ == POT_RESTORE_ABILITIES) ? "restore abilities" :
+ (item_typ == POT_STRONG_POISON) ? "strong poison" :
+ (item_typ == POT_BERSERK_RAGE) ? "berserk rage" :
+ (item_typ == POT_CURE_MUTATION) ? "cure mutation" :
+ (item_typ == POT_MUTATION) ? "mutation" : "bugginess",
+ ITEMNAME_SIZE);
+ }
+ else
+ {
+ char primary = item.special / 14;
+ char secondary = item.special % 14;
+
+ strncat(buff,
+ (primary == 0) ? "" :
+ (primary == 1) ? "bubbling " :
+ (primary == 2) ? "lumpy " :
+ (primary == 3) ? "fuming " :
+ (primary == 4) ? "smoky " :
+ (primary == 5) ? "fizzy " :
+ (primary == 6) ? "glowing " :
+ (primary == 7) ? "sedimented " :
+ (primary == 8) ? "metallic " :
+ (primary == 9) ? "murky " :
+ (primary == 10) ? "gluggy " :
+ (primary == 11) ? "viscous " :
+ (primary == 12) ? "oily " :
+ (primary == 13) ? "slimy " :
+ (primary == 14) ? "emulsified " : "buggy ", ITEMNAME_SIZE);
+
+ strncat(buff,
+ (secondary == 0) ? "clear" :
+ (secondary == 1) ? "blue" :
+ (secondary == 2) ? "black" :
+ (secondary == 3) ? "silvery" :
+ (secondary == 4) ? "cyan" :
+ (secondary == 5) ? "purple" :
+ (secondary == 6) ? "orange" :
+ (secondary == 7) ? "inky" :
+ (secondary == 8) ? "red" :
+ (secondary == 9) ? "yellow" :
+ (secondary == 10) ? "green" :
+ (secondary == 11) ? "brown" :
+ (secondary == 12) ? "pink" :
+ (secondary == 13) ? "white" : "buggy", ITEMNAME_SIZE);
+
+ strncat(buff, " potion", ITEMNAME_SIZE );
+
+ if (it_quant > 1)
+ strncat(buff, "s", ITEMNAME_SIZE );
+
+ if (id[ IDTYPE_POTIONS ][item_typ] == ID_TRIED_TYPE)
+ {
+ strncat( buff, " {tried}" , ITEMNAME_SIZE );
+ }
+ }
+ break;
+
+ // NB: adding another food type == must set for carnivorous chars
+ // (Kobolds and mutants)
+ case OBJ_FOOD:
+ switch (item_typ)
+ {
+ case FOOD_MEAT_RATION:
+ strncat(buff, "meat ration", ITEMNAME_SIZE );
+ break;
+ case FOOD_BREAD_RATION:
+ strncat(buff, "bread ration", ITEMNAME_SIZE );
+ break;
+ case FOOD_PEAR:
+ strncat(buff, "pear", ITEMNAME_SIZE );
+ break;
+ case FOOD_APPLE: // make this less common
+ strncat(buff, "apple", ITEMNAME_SIZE );
+ break;
+ case FOOD_CHOKO:
+ strncat(buff, "choko", ITEMNAME_SIZE );
+ break;
+ case FOOD_HONEYCOMB:
+ strncat(buff, "honeycomb", ITEMNAME_SIZE );
+ break;
+ case FOOD_ROYAL_JELLY:
+ strncat(buff, "royal jell", ITEMNAME_SIZE );
+ break;
+ case FOOD_SNOZZCUMBER:
+ strncat(buff, "snozzcumber", ITEMNAME_SIZE );
+ break;
+ case FOOD_PIZZA:
+ strncat(buff, "slice of pizza", ITEMNAME_SIZE );
+ break;
+ case FOOD_APRICOT:
+ strncat(buff, "apricot", ITEMNAME_SIZE );
+ break;
+ case FOOD_ORANGE:
+ strncat(buff, "orange", ITEMNAME_SIZE );
+ break;
+ case FOOD_BANANA:
+ strncat(buff, "banana", ITEMNAME_SIZE );
+ break;
+ case FOOD_STRAWBERRY:
+ strncat(buff, "strawberr", ITEMNAME_SIZE );
+ break;
+ case FOOD_RAMBUTAN:
+ strncat(buff, "rambutan", ITEMNAME_SIZE );
+ break;
+ case FOOD_LEMON:
+ strncat(buff, "lemon", ITEMNAME_SIZE );
+ break;
+ case FOOD_GRAPE:
+ strncat(buff, "grape", ITEMNAME_SIZE );
+ break;
+ case FOOD_SULTANA:
+ strncat(buff, "sultana", ITEMNAME_SIZE );
+ break;
+ case FOOD_LYCHEE:
+ strncat(buff, "lychee", ITEMNAME_SIZE );
+ break;
+ case FOOD_BEEF_JERKY:
+ strncat(buff, "beef jerk", ITEMNAME_SIZE );
+ break;
+ case FOOD_CHEESE:
+ strncat(buff, "cheese", ITEMNAME_SIZE );
+ break;
+ case FOOD_SAUSAGE:
+ strncat(buff, "sausage", ITEMNAME_SIZE );
+ break;
+ case FOOD_CHUNK:
+ moname( it_plus, true, DESC_PLAIN, tmp_buff );
+
+ if (item.special < 100)
+ strncat(buff, "rotting ", ITEMNAME_SIZE );
+
+ strncat(buff, "chunk", ITEMNAME_SIZE );
+
+ if (it_quant > 1)
+ strncat(buff, "s", ITEMNAME_SIZE );
+
+ strncat(buff, " of ", ITEMNAME_SIZE );
+ strncat(buff, tmp_buff, ITEMNAME_SIZE );
+ strncat(buff, " flesh", ITEMNAME_SIZE );
+ break;
+
+ }
+
+ if (item_typ == FOOD_ROYAL_JELLY || item_typ == FOOD_STRAWBERRY
+ || item_typ == FOOD_BEEF_JERKY)
+ strncat(buff, (it_quant > 1) ? "ie" : "y", ITEMNAME_SIZE );
+ break;
+
+ // compacted 15 Apr 2000 {dlb}:
+ case OBJ_SCROLLS:
+ strncat(buff, "scroll", ITEMNAME_SIZE );
+ strncat(buff, (it_quant == 1) ? " " : "s ", ITEMNAME_SIZE);
+
+ if (id[ IDTYPE_SCROLLS ][item_typ] == ID_KNOWN_TYPE
+ || item_ident( item, ISFLAG_KNOW_TYPE ))
+ {
+ strncat(buff, "of ", ITEMNAME_SIZE );
+ strncat(buff, (item_typ == SCR_IDENTIFY) ? "identify" :
+ (item_typ == SCR_TELEPORTATION) ? "teleportation" :
+ (item_typ == SCR_FEAR) ? "fear" :
+ (item_typ == SCR_NOISE) ? "noise" :
+ (item_typ == SCR_REMOVE_CURSE) ? "remove curse" :
+ (item_typ == SCR_DETECT_CURSE) ? "detect curse" :
+ (item_typ == SCR_SUMMONING) ? "summoning" :
+ (item_typ == SCR_ENCHANT_WEAPON_I) ? "enchant weapon I" :
+ (item_typ == SCR_ENCHANT_ARMOUR) ? "enchant armour" :
+ (item_typ == SCR_TORMENT) ? "torment" :
+ (item_typ == SCR_RANDOM_USELESSNESS) ? "random uselessness" :
+ (item_typ == SCR_CURSE_WEAPON) ? "curse weapon" :
+ (item_typ == SCR_CURSE_ARMOUR) ? "curse armour" :
+ (item_typ == SCR_IMMOLATION) ? "immolation" :
+ (item_typ == SCR_BLINKING) ? "blinking" :
+ (item_typ == SCR_PAPER) ? "paper" :
+ (item_typ == SCR_MAGIC_MAPPING) ? "magic mapping" :
+ (item_typ == SCR_FORGETFULNESS) ? "forgetfulness" :
+ (item_typ == SCR_ACQUIREMENT) ? "acquirement" :
+ (item_typ == SCR_ENCHANT_WEAPON_II) ? "enchant weapon II" :
+ (item_typ == SCR_VORPALISE_WEAPON) ? "vorpalise weapon" :
+ (item_typ == SCR_RECHARGING) ? "recharging" :
+ //(item_typ == 23) ? "portal travel" :
+ (item_typ == SCR_ENCHANT_WEAPON_III) ? "enchant weapon III"
+ : "bugginess",
+ ITEMNAME_SIZE);
+ }
+ else
+ {
+ strncat(buff, "labeled ", ITEMNAME_SIZE );
+ char buff3[ ITEMNAME_SIZE ];
+
+ make_name( item.special, it_plus, item_clas, 2, buff3 );
+ strncat( buff, buff3 , ITEMNAME_SIZE );
+
+ if (id[ IDTYPE_SCROLLS ][item_typ] == ID_TRIED_TYPE)
+ {
+ strncat( buff, " {tried}" , ITEMNAME_SIZE );
+ }
+ }
+ break;
+
+ // compacted 15 Apr 2000 {dlb}: -- on hold ... what a mess!
+ case OBJ_JEWELLERY:
+ // not using {tried} here because there are some confusing
+ // issues to work out with how we want to handle jewellery
+ // artefacts and base type id. -- bwr
+ if (item_ident( item, ISFLAG_KNOW_CURSE ))
+ {
+ if (item_cursed( item ))
+ strncat(buff, "cursed ", ITEMNAME_SIZE );
+ else if (Options.show_uncursed
+ && item_not_ident( item, ISFLAG_KNOW_PLUSES ))
+ {
+ strncat(buff, "uncursed ", ITEMNAME_SIZE );
+ }
+ }
+
+ if (is_random_artefact( item ))
+ {
+ strncat(buff, randart_ring_name(item), ITEMNAME_SIZE);
+ break;
+ }
+
+ if (id[ IDTYPE_JEWELLERY ][item_typ] == ID_KNOWN_TYPE
+ || item_ident( item, ISFLAG_KNOW_TYPE ))
+ {
+
+ if (item_ident( item, ISFLAG_KNOW_PLUSES )
+ && (item_typ == RING_PROTECTION || item_typ == RING_STRENGTH
+ || item_typ == RING_SLAYING || item_typ == RING_EVASION
+ || item_typ == RING_DEXTERITY
+ || item_typ == RING_INTELLIGENCE))
+ {
+ char gokh = it_plus;
+
+ if (gokh >= 0)
+ strncat( buff, "+" , ITEMNAME_SIZE );
+
+ itoa( gokh, tmp_quant, 10 );
+ strncat( buff, tmp_quant , ITEMNAME_SIZE );
+
+ if (item_typ == RING_SLAYING)
+ {
+ strncat( buff, "," , ITEMNAME_SIZE );
+
+ if (item_plus2 >= 0)
+ strncat(buff, "+", ITEMNAME_SIZE );
+
+ itoa( item_plus2, tmp_quant, 10 );
+ strncat( buff, tmp_quant , ITEMNAME_SIZE );
+ }
+
+ strncat(buff, " ", ITEMNAME_SIZE );
+ }
+
+ switch (item_typ)
+ {
+ case RING_REGENERATION:
+ strncat(buff, "ring of regeneration", ITEMNAME_SIZE );
+ break;
+ case RING_PROTECTION:
+ strncat(buff, "ring of protection", ITEMNAME_SIZE );
+ break;
+ case RING_PROTECTION_FROM_FIRE:
+ strncat(buff, "ring of protection from fire", ITEMNAME_SIZE );
+ break;
+ case RING_POISON_RESISTANCE:
+ strncat(buff, "ring of poison resistance", ITEMNAME_SIZE );
+ break;
+ case RING_PROTECTION_FROM_COLD:
+ strncat(buff, "ring of protection from cold", ITEMNAME_SIZE );
+ break;
+ case RING_STRENGTH:
+ strncat(buff, "ring of strength", ITEMNAME_SIZE );
+ break;
+ case RING_SLAYING:
+ strncat(buff, "ring of slaying", ITEMNAME_SIZE );
+ break;
+ case RING_SEE_INVISIBLE:
+ strncat(buff, "ring of see invisible", ITEMNAME_SIZE );
+ break;
+ case RING_INVISIBILITY:
+ strncat(buff, "ring of invisibility", ITEMNAME_SIZE );
+ break;
+ case RING_HUNGER:
+ strncat(buff, "ring of hunger", ITEMNAME_SIZE );
+ break;
+ case RING_TELEPORTATION:
+ strncat(buff, "ring of teleportation", ITEMNAME_SIZE );
+ break;
+ case RING_EVASION:
+ strncat(buff, "ring of evasion", ITEMNAME_SIZE );
+ break;
+ case RING_SUSTAIN_ABILITIES:
+ strncat(buff, "ring of sustain abilities", ITEMNAME_SIZE );
+ break;
+ case RING_SUSTENANCE:
+ strncat(buff, "ring of sustenance", ITEMNAME_SIZE );
+ break;
+ case RING_DEXTERITY:
+ strncat(buff, "ring of dexterity", ITEMNAME_SIZE );
+ break;
+ case RING_INTELLIGENCE:
+ strncat(buff, "ring of intelligence", ITEMNAME_SIZE );
+ break;
+ case RING_WIZARDRY:
+ strncat(buff, "ring of wizardry", ITEMNAME_SIZE );
+ break;
+ case RING_MAGICAL_POWER:
+ strncat(buff, "ring of magical power", ITEMNAME_SIZE );
+ break;
+ case RING_LEVITATION:
+ strncat(buff, "ring of levitation", ITEMNAME_SIZE );
+ break;
+ case RING_LIFE_PROTECTION:
+ strncat(buff, "ring of life protection", ITEMNAME_SIZE );
+ break;
+ case RING_PROTECTION_FROM_MAGIC:
+ strncat(buff, "ring of protection from magic", ITEMNAME_SIZE );
+ break;
+ case RING_FIRE:
+ strncat(buff, "ring of fire", ITEMNAME_SIZE );
+ break;
+ case RING_ICE:
+ strncat(buff, "ring of ice", ITEMNAME_SIZE );
+ break;
+ case RING_TELEPORT_CONTROL:
+ strncat(buff, "ring of teleport control", ITEMNAME_SIZE );
+ break;
+ case AMU_RAGE:
+ strncat(buff, "amulet of rage", ITEMNAME_SIZE );
+ break;
+ case AMU_RESIST_SLOW:
+ strncat(buff, "amulet of resist slowing", ITEMNAME_SIZE );
+ break;
+ case AMU_CLARITY:
+ strncat(buff, "amulet of clarity", ITEMNAME_SIZE );
+ break;
+ case AMU_WARDING:
+ strncat(buff, "amulet of warding", ITEMNAME_SIZE );
+ break;
+ case AMU_RESIST_CORROSION:
+ strncat(buff, "amulet of resist corrosion", ITEMNAME_SIZE );
+ break;
+ case AMU_THE_GOURMAND:
+ strncat(buff, "amulet of the gourmand", ITEMNAME_SIZE );
+ break;
+ case AMU_CONSERVATION:
+ strncat(buff, "amulet of conservation", ITEMNAME_SIZE );
+ break;
+ case AMU_CONTROLLED_FLIGHT:
+ strncat(buff, "amulet of controlled flight", ITEMNAME_SIZE );
+ break;
+ case AMU_INACCURACY:
+ strncat(buff, "amulet of inaccuracy", ITEMNAME_SIZE );
+ break;
+ case AMU_RESIST_MUTATION:
+ strncat(buff, "amulet of resist mutation", ITEMNAME_SIZE );
+ break;
+ }
+ /* ? of imputed learning - 100% exp from tames/summoned kills */
+ break;
+ }
+
+ if (item_typ < AMU_RAGE) // rings
+ {
+ if (is_random_artefact( item ))
+ {
+ strncat(buff, randart_ring_name(item), ITEMNAME_SIZE);
+ break;
+ }
+
+ switch (item.special / 13) // secondary characteristic of ring
+ {
+ case 1:
+ strncat(buff, "encrusted ", ITEMNAME_SIZE );
+ break;
+ case 2:
+ strncat(buff, "glowing ", ITEMNAME_SIZE );
+ break;
+ case 3:
+ strncat(buff, "tubular ", ITEMNAME_SIZE );
+ break;
+ case 4:
+ strncat(buff, "runed ", ITEMNAME_SIZE );
+ break;
+ case 5:
+ strncat(buff, "blackened ", ITEMNAME_SIZE );
+ break;
+ case 6:
+ strncat(buff, "scratched ", ITEMNAME_SIZE );
+ break;
+ case 7:
+ strncat(buff, "small ", ITEMNAME_SIZE );
+ break;
+ case 8:
+ strncat(buff, "large ", ITEMNAME_SIZE );
+ break;
+ case 9:
+ strncat(buff, "twisted ", ITEMNAME_SIZE );
+ break;
+ case 10:
+ strncat(buff, "shiny ", ITEMNAME_SIZE );
+ break;
+ case 11:
+ strncat(buff, "notched ", ITEMNAME_SIZE );
+ break;
+ case 12:
+ strncat(buff, "knobbly ", ITEMNAME_SIZE );
+ break;
+ }
+
+ switch (item.special % 13)
+ {
+ case 0:
+ strncat(buff, "wooden ring", ITEMNAME_SIZE );
+ break;
+ case 1:
+ strncat(buff, "silver ring", ITEMNAME_SIZE );
+ break;
+ case 2:
+ strncat(buff, "golden ring", ITEMNAME_SIZE );
+ break;
+ case 3:
+ strncat(buff, "iron ring", ITEMNAME_SIZE );
+ break;
+ case 4:
+ strncat(buff, "steel ring", ITEMNAME_SIZE );
+ break;
+ case 5:
+ strncat(buff, "bronze ring", ITEMNAME_SIZE );
+ break;
+ case 6:
+ strncat(buff, "brass ring", ITEMNAME_SIZE );
+ break;
+ case 7:
+ strncat(buff, "copper ring", ITEMNAME_SIZE );
+ break;
+ case 8:
+ strncat(buff, "granite ring", ITEMNAME_SIZE );
+ break;
+ case 9:
+ strncat(buff, "ivory ring", ITEMNAME_SIZE );
+ break;
+ case 10:
+ strncat(buff, "bone ring", ITEMNAME_SIZE );
+ break;
+ case 11:
+ strncat(buff, "marble ring", ITEMNAME_SIZE );
+ break;
+ case 12:
+ strncat(buff, "jade ring", ITEMNAME_SIZE );
+ break;
+ case 13:
+ strncat(buff, "glass ring", ITEMNAME_SIZE );
+ break;
+ }
+ } // end of rings
+ else // ie is an amulet
+ {
+ if (is_random_artefact( item ))
+ {
+ strncat(buff, randart_ring_name(item), ITEMNAME_SIZE);
+ break;
+ }
+
+ if (item.special > 13)
+ {
+ switch (item.special / 13) // secondary characteristic of amulet
+ {
+ case 0:
+ strncat(buff, "dented ", ITEMNAME_SIZE );
+ break;
+ case 1:
+ strncat(buff, "square ", ITEMNAME_SIZE );
+ break;
+ case 2:
+ strncat(buff, "thick ", ITEMNAME_SIZE );
+ break;
+ case 3:
+ strncat(buff, "thin ", ITEMNAME_SIZE );
+ break;
+ case 4:
+ strncat(buff, "runed ", ITEMNAME_SIZE );
+ break;
+ case 5:
+ strncat(buff, "blackened ", ITEMNAME_SIZE );
+ break;
+ case 6:
+ strncat(buff, "glowing ", ITEMNAME_SIZE );
+ break;
+ case 7:
+ strncat(buff, "small ", ITEMNAME_SIZE );
+ break;
+ case 8:
+ strncat(buff, "large ", ITEMNAME_SIZE );
+ break;
+ case 9:
+ strncat(buff, "twisted ", ITEMNAME_SIZE );
+ break;
+ case 10:
+ strncat(buff, "tiny ", ITEMNAME_SIZE );
+ break;
+ case 11:
+ strncat(buff, "triangular ", ITEMNAME_SIZE );
+ break;
+ case 12:
+ strncat(buff, "lumpy ", ITEMNAME_SIZE );
+ break;
+ }
+ }
+
+ switch (item.special % 13)
+ {
+ case 0:
+ strncat(buff, "zirconium amulet", ITEMNAME_SIZE );
+ break;
+ case 1:
+ strncat(buff, "sapphire amulet", ITEMNAME_SIZE );
+ break;
+ case 2:
+ strncat(buff, "golden amulet", ITEMNAME_SIZE );
+ break;
+ case 3:
+ strncat(buff, "emerald amulet", ITEMNAME_SIZE );
+ break;
+ case 4:
+ strncat(buff, "garnet amulet", ITEMNAME_SIZE );
+ break;
+ case 5:
+ strncat(buff, "bronze amulet", ITEMNAME_SIZE );
+ break;
+ case 6:
+ strncat(buff, "brass amulet", ITEMNAME_SIZE );
+ break;
+ case 7:
+ strncat(buff, "copper amulet", ITEMNAME_SIZE );
+ break;
+ case 8:
+ strncat(buff, "ruby amulet", ITEMNAME_SIZE );
+ break;
+ case 9:
+ strncat(buff, "ivory amulet", ITEMNAME_SIZE );
+ break;
+ case 10:
+ strncat(buff, "bone amulet", ITEMNAME_SIZE );
+ break;
+ case 11:
+ strncat(buff, "platinum amulet", ITEMNAME_SIZE );
+ break;
+ case 12:
+ strncat(buff, "jade amulet", ITEMNAME_SIZE );
+ break;
+ case 13:
+ strncat(buff, "plastic amulet", ITEMNAME_SIZE );
+ break;
+ }
+ } // end of amulets
+ break;
+
+ // compacted 15 Apr 2000 {dlb}:
+ case OBJ_MISCELLANY:
+ switch (item_typ)
+ {
+ case MISC_RUNE_OF_ZOT:
+ strncat( buff, (it_plus == RUNE_DIS) ? "iron" :
+ (it_plus == RUNE_GEHENNA) ? "obsidian" :
+ (it_plus == RUNE_COCYTUS) ? "icy" :
+ (it_plus == RUNE_TARTARUS) ? "bone" :
+ (it_plus == RUNE_SLIME_PITS) ? "slimy" :
+ (it_plus == RUNE_VAULTS) ? "silver" :
+ (it_plus == RUNE_SNAKE_PIT) ? "serpentine" :
+ (it_plus == RUNE_ELVEN_HALLS) ? "elven" :
+ (it_plus == RUNE_TOMB) ? "golden" :
+ (it_plus == RUNE_SWAMP) ? "decaying" :
+
+ // pandemonium and abyss runes:
+ (it_plus == RUNE_DEMONIC) ? "demonic" :
+ (it_plus == RUNE_ABYSSAL) ? "abyssal" :
+
+ // special pandemonium runes:
+ (it_plus == RUNE_MNOLEG) ? "glowing" :
+ (it_plus == RUNE_LOM_LOBON) ? "magical" :
+ (it_plus == RUNE_CEREBOV) ? "fiery" :
+ (it_plus == RUNE_GLOORX_VLOQ) ? "dark"
+ : "buggy",
+ ITEMNAME_SIZE);
+
+ strncat(buff, " ", ITEMNAME_SIZE );
+ strncat(buff, "rune", ITEMNAME_SIZE );
+
+ if (it_quant > 1)
+ strncat(buff, "s", ITEMNAME_SIZE );
+
+ if (item_ident( item, ISFLAG_KNOW_TYPE ))
+ strncat(buff, " of Zot", ITEMNAME_SIZE );
+ break;
+
+ case MISC_DECK_OF_POWER:
+ case MISC_DECK_OF_SUMMONINGS:
+ case MISC_DECK_OF_TRICKS:
+ case MISC_DECK_OF_WONDERS:
+ strncat(buff, "deck of ", ITEMNAME_SIZE );
+ strncat(buff, item_not_ident( item, ISFLAG_KNOW_TYPE ) ? "cards" :
+ (item_typ == MISC_DECK_OF_WONDERS) ? "wonders" :
+ (item_typ == MISC_DECK_OF_SUMMONINGS) ? "summonings" :
+ (item_typ == MISC_DECK_OF_TRICKS) ? "tricks" :
+ (item_typ == MISC_DECK_OF_POWER) ? "power"
+ : "bugginess",
+ ITEMNAME_SIZE);
+ break;
+
+ case MISC_CRYSTAL_BALL_OF_ENERGY:
+ case MISC_CRYSTAL_BALL_OF_FIXATION:
+ case MISC_CRYSTAL_BALL_OF_SEEING:
+ strncat(buff, "crystal ball", ITEMNAME_SIZE );
+ if (item_ident( item, ISFLAG_KNOW_TYPE ))
+ {
+ strncat(buff, " of ", ITEMNAME_SIZE );
+ strncat(buff,
+ (item_typ == MISC_CRYSTAL_BALL_OF_SEEING) ? "seeing" :
+ (item_typ == MISC_CRYSTAL_BALL_OF_ENERGY) ? "energy" :
+ (item_typ == MISC_CRYSTAL_BALL_OF_FIXATION) ? "fixation"
+ : "bugginess",
+ ITEMNAME_SIZE);
+ }
+ break;
+
+ case MISC_BOX_OF_BEASTS:
+ if (item_ident( item, ISFLAG_KNOW_TYPE ))
+ strncat(buff, "box of beasts", ITEMNAME_SIZE );
+ else
+ strncat(buff, "small ebony casket", ITEMNAME_SIZE );
+ break;
+
+ case MISC_EMPTY_EBONY_CASKET:
+ if (item_ident( item, ISFLAG_KNOW_TYPE ))
+ strncat(buff, "empty ebony casket", ITEMNAME_SIZE );
+ else
+ strncat(buff, "small ebony casket", ITEMNAME_SIZE );
+ break;
+
+ case MISC_AIR_ELEMENTAL_FAN:
+ if (item_ident( item, ISFLAG_KNOW_TYPE ))
+ strncat(buff, "air elemental ", ITEMNAME_SIZE );
+ strncat(buff, "fan", ITEMNAME_SIZE );
+ break;
+
+ case MISC_LAMP_OF_FIRE:
+ strncat(buff, "lamp", ITEMNAME_SIZE );
+ if (item_ident( item, ISFLAG_KNOW_TYPE ))
+ strncat(buff, " of fire", ITEMNAME_SIZE );
+ break;
+
+ case MISC_LANTERN_OF_SHADOWS:
+ if (item_not_ident( item, ISFLAG_KNOW_TYPE ))
+ strncat(buff, "bone ", ITEMNAME_SIZE );
+ strncat(buff, "lantern", ITEMNAME_SIZE );
+
+ if (item_ident( item, ISFLAG_KNOW_TYPE ))
+ strncat(buff, " of shadows", ITEMNAME_SIZE );
+ break;
+
+ case MISC_HORN_OF_GERYON:
+ if (item_not_ident( item, ISFLAG_KNOW_TYPE ))
+ strncat(buff, "silver ", ITEMNAME_SIZE );
+ strncat(buff, "horn", ITEMNAME_SIZE );
+
+ if (item_ident( item, ISFLAG_KNOW_TYPE ))
+ strncat(buff, " of Geryon", ITEMNAME_SIZE );
+ break;
+
+ case MISC_DISC_OF_STORMS:
+ if (item_not_ident( item, ISFLAG_KNOW_TYPE ))
+ strncat(buff, "grey ", ITEMNAME_SIZE );
+ strncat(buff, "disc", ITEMNAME_SIZE );
+
+ if (item_ident( item, ISFLAG_KNOW_TYPE ))
+ strncat(buff, " of storms", ITEMNAME_SIZE );
+ break;
+
+ case MISC_STONE_OF_EARTH_ELEMENTALS:
+ if (item_not_ident( item, ISFLAG_KNOW_TYPE ))
+ strncat(buff, "nondescript ", ITEMNAME_SIZE );
+ strncat(buff, "stone", ITEMNAME_SIZE );
+
+ if (item_ident( item, ISFLAG_KNOW_TYPE ))
+ strncat(buff, " of earth elementals", ITEMNAME_SIZE );
+ break;
+
+ case MISC_BOTTLED_EFREET:
+ strncat(buff, (item_not_ident( item, ISFLAG_KNOW_TYPE ))
+ ? "sealed bronze flask" : "bottled efreet",
+ ITEMNAME_SIZE );
+ break;
+
+ case MISC_PORTABLE_ALTAR_OF_NEMELEX:
+ strncat(buff, "portable altar of Nemelex", ITEMNAME_SIZE );
+ break;
+
+ default:
+ strncat(buff, "buggy miscellaneous item", ITEMNAME_SIZE );
+ break;
+ }
+ break;
+
+ // compacted 15 Apr 2000 {dlb}:
+ case OBJ_BOOKS:
+ if (item_not_ident( item, ISFLAG_KNOW_TYPE ))
+ {
+ char primary = (item.special / 10);
+ char secondary = (item.special % 10);
+
+ strncat(buff, (primary == 0) ? "" :
+ (primary == 1) ? "chunky " :
+ (primary == 2) ? "thick " :
+ (primary == 3) ? "thin " :
+ (primary == 4) ? "wide " :
+ (primary == 5) ? "glowing " :
+ (primary == 6) ? "dog-eared " :
+ (primary == 7) ? "oblong " :
+ (primary == 8) ? "runed " :
+
+ // these last three were single spaces {dlb}
+ (primary == 9) ? "" :
+ (primary == 10) ? "" : (primary == 11) ? "" : "buggily ",
+ ITEMNAME_SIZE);
+
+ strncat(buff, (secondary == 0) ? "paperback " :
+ (secondary == 1) ? "hardcover " :
+ (secondary == 2) ? "leatherbound " :
+ (secondary == 3) ? "metal-bound " :
+ (secondary == 4) ? "papyrus " :
+ // these two were single spaces, too {dlb}
+ (secondary == 5) ? "" :
+ (secondary == 6) ? "" : "buggy ", ITEMNAME_SIZE);
+
+ strncat(buff, "book", ITEMNAME_SIZE );
+ }
+ else if (item_typ == BOOK_MANUAL)
+ {
+ strncat(buff, "manual of ", ITEMNAME_SIZE );
+ strncat(buff, skill_name(it_plus), ITEMNAME_SIZE );
+ }
+ else if (item_typ == BOOK_NECRONOMICON)
+ strncat(buff, "Necronomicon", ITEMNAME_SIZE );
+ else if (item_typ == BOOK_DESTRUCTION)
+ strncat(buff, "tome of Destruction", ITEMNAME_SIZE );
+ else if (item_typ == BOOK_YOUNG_POISONERS)
+ strncat(buff, "Young Poisoner's Handbook", ITEMNAME_SIZE );
+ else if (item_typ == BOOK_BEASTS)
+ strncat(buff, "Monster Manual", ITEMNAME_SIZE );
+ else
+ {
+ strncat(buff, "book of ", ITEMNAME_SIZE );
+ strncat(buff, (item_typ == BOOK_MINOR_MAGIC_I
+ || item_typ == BOOK_MINOR_MAGIC_II
+ || item_typ == BOOK_MINOR_MAGIC_III) ? "Minor Magic" :
+ (item_typ == BOOK_CONJURATIONS_I
+ || item_typ == BOOK_CONJURATIONS_II) ? "Conjurations" :
+ (item_typ == BOOK_FLAMES) ? "Flames" :
+ (item_typ == BOOK_FROST) ? "Frost" :
+ (item_typ == BOOK_SUMMONINGS) ? "Summonings" :
+ (item_typ == BOOK_FIRE) ? "Fire" :
+ (item_typ == BOOK_ICE) ? "Ice" :
+ (item_typ == BOOK_SURVEYANCES) ? "Surveyances" :
+ (item_typ == BOOK_SPATIAL_TRANSLOCATIONS) ? "Spatial Translocations" :
+ (item_typ == BOOK_ENCHANTMENTS) ? "Enchantments" :
+ (item_typ == BOOK_TEMPESTS) ? "the Tempests" :
+ (item_typ == BOOK_DEATH) ? "Death" :
+ (item_typ == BOOK_HINDERANCE) ? "Hinderance" :
+ (item_typ == BOOK_CHANGES) ? "Changes" :
+ (item_typ == BOOK_TRANSFIGURATIONS) ? "Transfigurations" :
+ (item_typ == BOOK_PRACTICAL_MAGIC) ? "Practical Magic" :
+ (item_typ == BOOK_WAR_CHANTS) ? "War Chants" :
+ (item_typ == BOOK_CLOUDS) ? "Clouds" :
+ (item_typ == BOOK_HEALING) ? "Healing" :
+ (item_typ == BOOK_NECROMANCY) ? "Necromancy" :
+ (item_typ == BOOK_CALLINGS) ? "Callings" :
+ (item_typ == BOOK_CHARMS) ? "Charms" :
+ (item_typ == BOOK_DEMONOLOGY) ? "Demonology" :
+ (item_typ == BOOK_AIR) ? "Air" :
+ (item_typ == BOOK_SKY) ? "the Sky" :
+ (item_typ == BOOK_DIVINATIONS) ? "Divinations" :
+ (item_typ == BOOK_WARP) ? "the Warp" :
+ (item_typ == BOOK_ENVENOMATIONS) ? "Envenomations" :
+ (item_typ == BOOK_ANNIHILATIONS) ? "Annihilations" :
+ (item_typ == BOOK_UNLIFE) ? "Unlife" :
+ (item_typ == BOOK_CONTROL) ? "Control" :
+ (item_typ == BOOK_MUTATIONS) ? "Morphology" :
+ (item_typ == BOOK_TUKIMA) ? "Tukima" :
+ (item_typ == BOOK_GEOMANCY) ? "Geomancy" :
+ (item_typ == BOOK_EARTH) ? "the Earth" :
+ (item_typ == BOOK_WIZARDRY) ? "Wizardry" :
+ (item_typ == BOOK_POWER) ? "Power" :
+ (item_typ == BOOK_CANTRIPS) ? "Cantrips" :
+ (item_typ == BOOK_PARTY_TRICKS) ? "Party Tricks" :
+ (item_typ == BOOK_STALKING) ? "Stalking"
+ : "Bugginess",
+ ITEMNAME_SIZE );
+ }
+ break;
+
+ // compacted 15 Apr 2000 {dlb}:
+ case OBJ_STAVES:
+ if (item_not_ident( item, ISFLAG_KNOW_TYPE ))
+ {
+ strncat(buff, (item.special == 0) ? "curved" :
+ (item.special == 1) ? "glowing" :
+ (item.special == 2) ? "thick" :
+ (item.special == 3) ? "thin" :
+ (item.special == 4) ? "long" :
+ (item.special == 5) ? "twisted" :
+ (item.special == 6) ? "jeweled" :
+ (item.special == 7) ? "runed" :
+ (item.special == 8) ? "smoking" :
+ (item.special == 9) ? "gnarled" : // was "" {dlb}
+ (item.special == 10) ? "" :
+ (item.special == 11) ? "" :
+ (item.special == 12) ? "" :
+ (item.special == 13) ? "" :
+ (item.special == 14) ? "" :
+ (item.special == 15) ? "" :
+ (item.special == 16) ? "" :
+ (item.special == 17) ? "" :
+ (item.special == 18) ? "" :
+ (item.special == 19) ? "" :
+ (item.special == 20) ? "" :
+ (item.special == 21) ? "" :
+ (item.special == 22) ? "" :
+ (item.special == 23) ? "" :
+ (item.special == 24) ? "" :
+ (item.special == 25) ? "" :
+ (item.special == 26) ? "" :
+ (item.special == 27) ? "" :
+ (item.special == 28) ? "" :
+ (item.special == 29) ? "" : "buggy", ITEMNAME_SIZE);
+ strncat(buff, " ", ITEMNAME_SIZE );
+ }
+
+ strncat( buff, (item_is_rod( item ) ? "rod" : "staff"), ITEMNAME_SIZE );
+
+ if (item_ident( item, ISFLAG_KNOW_TYPE ))
+ {
+ strncat(buff, " of ", ITEMNAME_SIZE );
+
+ strncat(buff, (item_typ == STAFF_WIZARDRY) ? "wizardry" :
+ (item_typ == STAFF_POWER) ? "power" :
+ (item_typ == STAFF_FIRE) ? "fire" :
+ (item_typ == STAFF_COLD) ? "cold" :
+ (item_typ == STAFF_POISON) ? "poison" :
+ (item_typ == STAFF_ENERGY) ? "energy" :
+ (item_typ == STAFF_DEATH) ? "death" :
+ (item_typ == STAFF_CONJURATION) ? "conjuration" :
+ (item_typ == STAFF_ENCHANTMENT) ? "enchantment" :
+ (item_typ == STAFF_SMITING) ? "smiting" :
+ (item_typ == STAFF_STRIKING) ? "striking" :
+ (item_typ == STAFF_WARDING) ? "warding" :
+ (item_typ == STAFF_DISCOVERY) ? "discovery" :
+ (item_typ == STAFF_DEMONOLOGY) ? "demonology" :
+ (item_typ == STAFF_AIR) ? "air" :
+ (item_typ == STAFF_EARTH) ? "earth" :
+ (item_typ == STAFF_SUMMONING
+ || item_typ == STAFF_SPELL_SUMMONING) ? "summoning" :
+ (item_typ == STAFF_DESTRUCTION_I
+ || item_typ == STAFF_DESTRUCTION_II
+ || item_typ == STAFF_DESTRUCTION_III
+ || item_typ == STAFF_DESTRUCTION_IV) ? "destruction" :
+ (item_typ == STAFF_CHANNELING) ? "channeling"
+ : "bugginess", ITEMNAME_SIZE );
+ }
+ break;
+
+
+ // rearranged 15 Apr 2000 {dlb}:
+ case OBJ_ORBS:
+ strncpy( buff, "Orb of ", ITEMNAME_SIZE );
+ strncat( buff, (item_typ == ORB_ZOT) ? "Zot" :
+/* ******************************************************************
+ (item_typ == 1) ? "Zug" :
+ (item_typ == 2) ? "Xob" :
+ (item_typ == 3) ? "Ix" :
+ (item_typ == 4) ? "Xug" :
+ (item_typ == 5) ? "Zob" :
+ (item_typ == 6) ? "Ik" :
+ (item_typ == 7) ? "Grolp" :
+ (item_typ == 8) ? "fo brO ehT" :
+ (item_typ == 9) ? "Plob" :
+ (item_typ == 10) ? "Zuggle-Glob" :
+ (item_typ == 11) ? "Zin" :
+ (item_typ == 12) ? "Qexigok" :
+ (item_typ == 13) ? "Bujuk" :
+ (item_typ == 14) ? "Uhen Tiquritu" :
+ (item_typ == 15) ? "Idohoxom Sovuf" :
+ (item_typ == 16) ? "Voc Vocilicoso" :
+ (item_typ == 17) ? "Chanuaxydiviha" :
+ (item_typ == 18) ? "Ihexodox" :
+ (item_typ == 19) ? "Rynok Pol" :
+ (item_typ == 20) ? "Nemelex" :
+ (item_typ == 21) ? "Sif Muna" :
+ (item_typ == 22) ? "Okawaru" :
+ (item_typ == 23) ? "Kikubaaqudgha" :
+****************************************************************** */
+ "Bugginess", ITEMNAME_SIZE ); // change back to "Zot" if source of problems cannot be found {dlb}
+ break;
+
+ case OBJ_GOLD:
+ strncat(buff, "gold piece", ITEMNAME_SIZE );
+ break;
+
+ // still not implemented, yet:
+ case OBJ_GEMSTONES:
+ break;
+
+ // rearranged 15 Apr 2000 {dlb}:
+ case OBJ_CORPSES:
+ if (item_typ == CORPSE_BODY && item.special < 100)
+ strncat(buff, "rotting ", ITEMNAME_SIZE );
+
+ moname( it_plus, true, DESC_PLAIN, tmp_buff );
+
+ strncat(buff, tmp_buff, ITEMNAME_SIZE );
+ strncat(buff, " ", ITEMNAME_SIZE );
+ strncat(buff, (item_typ == CORPSE_BODY) ? "corpse" :
+ (item_typ == CORPSE_SKELETON) ? "skeleton" : "corpse bug",
+ ITEMNAME_SIZE );
+ break;
+
+ default:
+ strncat(buff, "!", ITEMNAME_SIZE );
+ } // end of switch?
+
+ // debugging output -- oops, I probably block it above ... dang! {dlb}
+ if (strlen(buff) < 3)
+ {
+ char ugug[20];
+
+ strncat(buff, "bad item (cl:", ITEMNAME_SIZE );
+ itoa(item_clas, ugug, 10);
+ strncat(buff, ugug, ITEMNAME_SIZE );
+ strncat(buff, ",ty:", ITEMNAME_SIZE );
+ itoa(item_typ, ugug, 10);
+ strncat(buff, ugug, ITEMNAME_SIZE );
+ strncat(buff, ",pl:", ITEMNAME_SIZE );
+ itoa(it_plus, ugug, 10);
+ strncat(buff, ugug, ITEMNAME_SIZE );
+ strncat(buff, ",pl2:", ITEMNAME_SIZE );
+ itoa(item_plus2, ugug, 10);
+ strncat(buff, ugug, ITEMNAME_SIZE );
+ strncat(buff, ",sp:", ITEMNAME_SIZE );
+ itoa(item.special, ugug, 10);
+ strncat(buff, ugug, ITEMNAME_SIZE );
+ strncat(buff, ",qu:", ITEMNAME_SIZE );
+ itoa(it_quant, ugug, 10);
+ strncat(buff, ugug, ITEMNAME_SIZE );
+ strncat(buff, ")", ITEMNAME_SIZE );
+ }
+
+ // hackish {dlb}
+ if (it_quant > 1
+ && item_clas != OBJ_MISSILES
+ && item_clas != OBJ_SCROLLS
+ && item_clas != OBJ_POTIONS
+ && item_clas != OBJ_MISCELLANY
+ && (item_clas != OBJ_FOOD || item_typ != FOOD_CHUNK))
+ {
+ strncat(buff, "s", ITEMNAME_SIZE );
+ }
+
+ return 1;
+} // end item_name_2()
+
+void save_id(char identy[4][50])
+{
+ char x = 0, jx = 0;
+
+ for (x = 0; x < 4; x++)
+ {
+ for (jx = 0; jx < 50; jx++)
+ {
+ identy[x][jx] = id[x][jx];
+ }
+ }
+} // end save_id()
+
+void clear_ids(void)
+{
+
+ char i = 0, j = 0;
+
+ for (i = 0; i < 4; i++)
+ {
+ for (j = 0; j < 50; j++)
+ {
+ id[i][j] = ID_UNKNOWN_TYPE;
+ }
+ }
+
+} // end clear_ids()
+
+
+void set_ident_type( char cla, char ty, char setting, bool force )
+{
+ // Don't allow overwriting of known type with tried unless forced.
+ if (!force
+ && setting == ID_TRIED_TYPE
+ && get_ident_type( cla, ty ) == ID_KNOWN_TYPE)
+ {
+ return;
+ }
+
+ switch (cla)
+ {
+ case OBJ_WANDS:
+ id[ IDTYPE_WANDS ][ty] = setting;
+ break;
+
+ case OBJ_SCROLLS:
+ id[ IDTYPE_SCROLLS ][ty] = setting;
+ break;
+
+ case OBJ_JEWELLERY:
+ id[ IDTYPE_JEWELLERY ][ty] = setting;
+ break;
+
+ case OBJ_POTIONS:
+ id[ IDTYPE_POTIONS ][ty] = setting;
+ break;
+
+ default:
+ break;
+ }
+} // end set_ident_type()
+
+char get_ident_type(char cla, char ty)
+{
+ switch (cla)
+ {
+ case OBJ_WANDS:
+ return id[ IDTYPE_WANDS ][ty];
+
+ case OBJ_SCROLLS:
+ return id[ IDTYPE_SCROLLS ][ty];
+
+ case OBJ_JEWELLERY:
+ return id[ IDTYPE_JEWELLERY ][ty];
+
+ case OBJ_POTIONS:
+ return id[ IDTYPE_POTIONS ][ty];
+
+ default:
+ return (ID_UNKNOWN_TYPE);
+ }
+} // end get_ident_type()
+
+int property( const item_def &item, int prop_type )
+{
+ switch (item.base_type)
+ {
+ case OBJ_ARMOUR:
+ case OBJ_WEAPONS:
+ case OBJ_MISSILES:
+ return (prop[ item.base_type ][ item.sub_type ][ prop_type ]);
+
+ case OBJ_STAVES:
+ if (item_is_staff( item ))
+ return (prop[ OBJ_WEAPONS ][ WPN_QUARTERSTAFF ][ prop_type ]);
+ else if (prop_type == PWPN_SPEED) // item is rod
+ return (10); // extra protection against speed 0
+ else
+ return (0);
+
+ default:
+ return (0);
+ }
+}
+
+int mass_item( const item_def &item )
+{
+ int unit_mass = 0;
+
+ if (item.base_type == OBJ_GOLD)
+ {
+ unit_mass = 0;
+ }
+ else if (item.base_type == OBJ_CORPSES)
+ {
+ unit_mass = mons_weight( item.plus );
+
+ if (item.sub_type == CORPSE_SKELETON)
+ unit_mass /= 2;
+ }
+ else
+ {
+ unit_mass = mss[ item.base_type ][ item.sub_type ];
+ }
+
+ return (unit_mass > 0 ? unit_mass : 0);
+}
+
+void init_properties(void)
+{
+ prop[OBJ_ARMOUR][ARM_ROBE][PARM_AC] = 1;
+ prop[OBJ_ARMOUR][ARM_ROBE][PARM_EVASION] = 0;
+ mss[OBJ_ARMOUR][ARM_ROBE] = 60;
+
+ prop[OBJ_ARMOUR][ARM_LEATHER_ARMOUR][PARM_AC] = 2;
+ prop[OBJ_ARMOUR][ARM_LEATHER_ARMOUR][PARM_EVASION] = -1;
+ mss[OBJ_ARMOUR][ARM_LEATHER_ARMOUR] = 150;
+
+ prop[OBJ_ARMOUR][ARM_RING_MAIL][PARM_AC] = 4;
+ prop[OBJ_ARMOUR][ARM_RING_MAIL][PARM_EVASION] = -2;
+ mss[OBJ_ARMOUR][ARM_RING_MAIL] = 300;
+
+ prop[OBJ_ARMOUR][ARM_SCALE_MAIL][PARM_AC] = 5;
+ prop[OBJ_ARMOUR][ARM_SCALE_MAIL][PARM_EVASION] = -2;
+ mss[OBJ_ARMOUR][ARM_SCALE_MAIL] = 400;
+
+ prop[OBJ_ARMOUR][ARM_CHAIN_MAIL][PARM_AC] = 6;
+ prop[OBJ_ARMOUR][ARM_CHAIN_MAIL][PARM_EVASION] = -3;
+ mss[OBJ_ARMOUR][ARM_CHAIN_MAIL] = 450;
+
+ prop[OBJ_ARMOUR][ARM_SPLINT_MAIL][PARM_AC] = 8;
+ prop[OBJ_ARMOUR][ARM_SPLINT_MAIL][PARM_EVASION] = -5;
+ mss[OBJ_ARMOUR][ARM_SPLINT_MAIL] = 550;
+
+ prop[OBJ_ARMOUR][ARM_BANDED_MAIL][PARM_AC] = 7;
+ prop[OBJ_ARMOUR][ARM_BANDED_MAIL][PARM_EVASION] = -4;
+ mss[OBJ_ARMOUR][ARM_BANDED_MAIL] = 500;
+
+ prop[OBJ_ARMOUR][ARM_PLATE_MAIL][PARM_AC] = 9;
+ prop[OBJ_ARMOUR][ARM_PLATE_MAIL][PARM_EVASION] = -5;
+ mss[OBJ_ARMOUR][ARM_PLATE_MAIL] = 650;
+
+ prop[OBJ_ARMOUR][ARM_DRAGON_HIDE][PARM_AC] = 2;
+ prop[OBJ_ARMOUR][ARM_DRAGON_HIDE][PARM_EVASION] = -2;
+ mss[OBJ_ARMOUR][ARM_DRAGON_HIDE] = 220;
+
+ prop[OBJ_ARMOUR][ARM_TROLL_HIDE][PARM_AC] = 1;
+ prop[OBJ_ARMOUR][ARM_TROLL_HIDE][PARM_EVASION] = -1;
+ mss[OBJ_ARMOUR][ARM_TROLL_HIDE] = 180;
+
+ prop[OBJ_ARMOUR][ARM_CRYSTAL_PLATE_MAIL][PARM_AC] = 16;
+ prop[OBJ_ARMOUR][ARM_CRYSTAL_PLATE_MAIL][PARM_EVASION] = -8;
+ mss[OBJ_ARMOUR][ARM_CRYSTAL_PLATE_MAIL] = 1200;
+
+ prop[OBJ_ARMOUR][ARM_DRAGON_ARMOUR][PARM_AC] = 8;
+ prop[OBJ_ARMOUR][ARM_DRAGON_ARMOUR][PARM_EVASION] = -2;
+ mss[OBJ_ARMOUR][ARM_DRAGON_ARMOUR] = 220;
+
+ prop[OBJ_ARMOUR][ARM_TROLL_LEATHER_ARMOUR][PARM_AC] = 3;
+ prop[OBJ_ARMOUR][ARM_TROLL_LEATHER_ARMOUR][PARM_EVASION] = -1;
+ mss[OBJ_ARMOUR][ARM_TROLL_LEATHER_ARMOUR] = 180;
+
+ prop[OBJ_ARMOUR][ARM_ICE_DRAGON_HIDE][PARM_AC] = 2;
+ prop[OBJ_ARMOUR][ARM_ICE_DRAGON_HIDE][PARM_EVASION] = -2;
+ mss[OBJ_ARMOUR][ARM_ICE_DRAGON_HIDE] = 220;
+
+ prop[OBJ_ARMOUR][ARM_ICE_DRAGON_ARMOUR][PARM_AC] = 9;
+ prop[OBJ_ARMOUR][ARM_ICE_DRAGON_ARMOUR][PARM_EVASION] = -2;
+ mss[OBJ_ARMOUR][ARM_ICE_DRAGON_ARMOUR] = 220;
+
+ prop[OBJ_ARMOUR][ARM_STEAM_DRAGON_HIDE][PARM_AC] = 0;
+ prop[OBJ_ARMOUR][ARM_STEAM_DRAGON_HIDE][PARM_EVASION] = 0;
+ mss[OBJ_ARMOUR][ARM_STEAM_DRAGON_HIDE] = 120;
+
+ prop[OBJ_ARMOUR][ARM_STEAM_DRAGON_ARMOUR][PARM_AC] = 3;
+ prop[OBJ_ARMOUR][ARM_STEAM_DRAGON_ARMOUR][PARM_EVASION] = 0;
+ mss[OBJ_ARMOUR][ARM_STEAM_DRAGON_ARMOUR] = 120;
+
+ prop[OBJ_ARMOUR][ARM_MOTTLED_DRAGON_HIDE][PARM_AC] = 1;
+ prop[OBJ_ARMOUR][ARM_MOTTLED_DRAGON_HIDE][PARM_EVASION] = -1;
+ mss[OBJ_ARMOUR][ARM_MOTTLED_DRAGON_HIDE] = 150;
+
+ prop[OBJ_ARMOUR][ARM_MOTTLED_DRAGON_ARMOUR][PARM_AC] = 5;
+ prop[OBJ_ARMOUR][ARM_MOTTLED_DRAGON_ARMOUR][PARM_EVASION] = -1;
+ mss[OBJ_ARMOUR][ARM_MOTTLED_DRAGON_ARMOUR] = 150;
+
+ prop[OBJ_ARMOUR][ARM_STORM_DRAGON_HIDE][PARM_AC] = 2;
+ prop[OBJ_ARMOUR][ARM_STORM_DRAGON_HIDE][PARM_EVASION] = -5;
+ mss[OBJ_ARMOUR][ARM_STORM_DRAGON_HIDE] = 400;
+
+ prop[OBJ_ARMOUR][ARM_STORM_DRAGON_ARMOUR][PARM_AC] = 10;
+ prop[OBJ_ARMOUR][ARM_STORM_DRAGON_ARMOUR][PARM_EVASION] = -5;
+ mss[OBJ_ARMOUR][ARM_STORM_DRAGON_ARMOUR] = 400;
+
+ prop[OBJ_ARMOUR][ARM_GOLD_DRAGON_HIDE][PARM_AC] = 2;
+ prop[OBJ_ARMOUR][ARM_GOLD_DRAGON_HIDE][PARM_EVASION] = -10;
+ mss[OBJ_ARMOUR][ARM_GOLD_DRAGON_HIDE] = 1100;
+
+ prop[OBJ_ARMOUR][ARM_GOLD_DRAGON_ARMOUR][PARM_AC] = 13;
+ prop[OBJ_ARMOUR][ARM_GOLD_DRAGON_ARMOUR][PARM_EVASION] = -10;
+ mss[OBJ_ARMOUR][ARM_GOLD_DRAGON_ARMOUR] = 1100;
+
+ prop[OBJ_ARMOUR][ARM_ANIMAL_SKIN][PARM_AC] = 1;
+ prop[OBJ_ARMOUR][ARM_ANIMAL_SKIN][PARM_EVASION] = 0;
+ mss[OBJ_ARMOUR][ARM_ANIMAL_SKIN] = 100;
+
+ prop[OBJ_ARMOUR][ARM_SWAMP_DRAGON_HIDE][PARM_AC] = 1;
+ prop[OBJ_ARMOUR][ARM_SWAMP_DRAGON_HIDE][PARM_EVASION] = -2;
+ mss[OBJ_ARMOUR][ARM_SWAMP_DRAGON_HIDE] = 200;
+
+ prop[OBJ_ARMOUR][ARM_SWAMP_DRAGON_ARMOUR][PARM_AC] = 7;
+ prop[OBJ_ARMOUR][ARM_SWAMP_DRAGON_ARMOUR][PARM_EVASION] = -2;
+ mss[OBJ_ARMOUR][ARM_SWAMP_DRAGON_ARMOUR] = 200;
+
+ prop[OBJ_ARMOUR][ARM_SHIELD][PARM_AC] = 0;
+ prop[OBJ_ARMOUR][ARM_SHIELD][PARM_EVASION] = 0;
+ mss[OBJ_ARMOUR][ARM_SHIELD] = 100;
+
+ prop[OBJ_ARMOUR][ARM_CLOAK][PARM_AC] = 1;
+ prop[OBJ_ARMOUR][ARM_CLOAK][PARM_EVASION] = 0;
+ mss[OBJ_ARMOUR][ARM_CLOAK] = 20;
+
+ prop[OBJ_ARMOUR][ARM_HELMET][PARM_AC] = 1;
+ prop[OBJ_ARMOUR][ARM_HELMET][PARM_EVASION] = 0;
+ mss[OBJ_ARMOUR][ARM_HELMET] = 80;
+
+ prop[OBJ_ARMOUR][ARM_GLOVES][PARM_AC] = 1;
+ prop[OBJ_ARMOUR][ARM_GLOVES][PARM_EVASION] = 0;
+ mss[OBJ_ARMOUR][ARM_GLOVES] = 20;
+
+ prop[OBJ_ARMOUR][ARM_BOOTS][PARM_AC] = 1;
+ prop[OBJ_ARMOUR][ARM_BOOTS][PARM_EVASION] = 0;
+ mss[OBJ_ARMOUR][ARM_BOOTS] = 40;
+
+ prop[OBJ_ARMOUR][ARM_BUCKLER][PARM_AC] = 0;
+ prop[OBJ_ARMOUR][ARM_BUCKLER][PARM_EVASION] = 0;
+ mss[OBJ_ARMOUR][ARM_BUCKLER] = 50;
+
+ prop[OBJ_ARMOUR][ARM_LARGE_SHIELD][PARM_AC] = 0;
+ prop[OBJ_ARMOUR][ARM_LARGE_SHIELD][PARM_EVASION] = 0;
+ mss[OBJ_ARMOUR][ARM_LARGE_SHIELD] = 250;
+
+ int i = 0;
+
+ for (i = 0; i < 50; i++)
+ {
+ mss[OBJ_WANDS][i] = 100;
+ mss[OBJ_FOOD][i] = 100;
+ mss[OBJ_UNKNOWN_I][i] = 200; // labeled as "books" elsewhere
+
+ //jmf: made scrolls, jewellery and potions weigh less.
+ mss[OBJ_SCROLLS][i] = 20;
+ mss[OBJ_JEWELLERY][i] = 10;
+ mss[OBJ_POTIONS][i] = 40;
+ mss[OBJ_UNKNOWN_II][i] = 5; // "gems"
+ mss[OBJ_BOOKS][i] = 70;
+
+ mss[OBJ_STAVES][i] = 130;
+ mss[OBJ_ORBS][i] = 300;
+ mss[OBJ_MISCELLANY][i] = 100;
+ mss[OBJ_CORPSES][i] = 100;
+ }
+
+ // rods are lighter than staves
+ for (i = STAFF_SMITING; i < STAFF_AIR; i++)
+ {
+ mss[OBJ_STAVES][i] = 70;
+ }
+
+ // this is food, right?
+ mss[OBJ_FOOD][FOOD_MEAT_RATION] = 80;
+ mss[OBJ_FOOD][FOOD_BREAD_RATION] = 80;
+ mss[OBJ_FOOD][FOOD_PEAR] = 20;
+ mss[OBJ_FOOD][FOOD_APPLE] = 20;
+ mss[OBJ_FOOD][FOOD_CHOKO] = 30;
+ mss[OBJ_FOOD][FOOD_HONEYCOMB] = 40;
+ mss[OBJ_FOOD][FOOD_ROYAL_JELLY] = 55;
+ mss[OBJ_FOOD][FOOD_SNOZZCUMBER] = 50;
+ mss[OBJ_FOOD][FOOD_PIZZA] = 40;
+ mss[OBJ_FOOD][FOOD_APRICOT] = 15;
+ mss[OBJ_FOOD][FOOD_ORANGE] = 20;
+ mss[OBJ_FOOD][FOOD_BANANA] = 20;
+ mss[OBJ_FOOD][FOOD_STRAWBERRY] = 5;
+ mss[OBJ_FOOD][FOOD_RAMBUTAN] = 10;
+ mss[OBJ_FOOD][FOOD_LEMON] = 20;
+ mss[OBJ_FOOD][FOOD_GRAPE] = 5;
+ mss[OBJ_FOOD][FOOD_SULTANA] = 3;
+ mss[OBJ_FOOD][FOOD_LYCHEE] = 10;
+ mss[OBJ_FOOD][FOOD_BEEF_JERKY] = 20;
+ mss[OBJ_FOOD][FOOD_CHEESE] = 40;
+ mss[OBJ_FOOD][FOOD_SAUSAGE] = 40;
+ mss[OBJ_FOOD][FOOD_CHUNK] = 100;
+ /* mss [OBJ_FOOD] [21] = 40;
+ mss [OBJ_FOOD] [22] = 50;
+ mss [OBJ_FOOD] [23] = 60;
+ mss [OBJ_FOOD] [24] = 60;
+ mss [OBJ_FOOD] [25] = 100; */
+
+ mss[OBJ_MISCELLANY][MISC_BOTTLED_EFREET] = 250;
+
+ mss[OBJ_MISCELLANY][MISC_CRYSTAL_BALL_OF_SEEING] = 200;
+ mss[OBJ_MISCELLANY][MISC_CRYSTAL_BALL_OF_ENERGY] = 200;
+ mss[OBJ_MISCELLANY][MISC_CRYSTAL_BALL_OF_FIXATION] = 200;
+
+ // weapons: blunt weapons are first to help grouping them together
+ // note: AC prop can't be 0 or less because of division.
+ // If it's 1, makes no difference
+
+ // NOTE: I have *removed* AC bit for weapons - just doesn't work
+ // prop [x] [2] is speed
+
+ prop[OBJ_WEAPONS][WPN_CLUB][PWPN_DAMAGE] = 5;
+ prop[OBJ_WEAPONS][WPN_CLUB][PWPN_HIT] = 4; // helps to get past evasion
+ prop[OBJ_WEAPONS][WPN_CLUB][PWPN_SPEED] = 12;
+ mss[OBJ_WEAPONS][WPN_CLUB] = 50;
+
+ prop[OBJ_WEAPONS][WPN_MACE][PWPN_DAMAGE] = 8;
+ prop[OBJ_WEAPONS][WPN_MACE][PWPN_HIT] = 3; // helps to get past evasion
+ prop[OBJ_WEAPONS][WPN_MACE][PWPN_SPEED] = 14;
+ mss[OBJ_WEAPONS][WPN_MACE] = 140;
+
+ prop[OBJ_WEAPONS][WPN_GREAT_MACE][PWPN_DAMAGE] = 16;
+ prop[OBJ_WEAPONS][WPN_GREAT_MACE][PWPN_HIT] = -3;
+ prop[OBJ_WEAPONS][WPN_GREAT_MACE][PWPN_SPEED] = 18;
+ mss[OBJ_WEAPONS][WPN_GREAT_MACE] = 260;
+
+ prop[OBJ_WEAPONS][WPN_FLAIL][PWPN_DAMAGE] = 9;
+ prop[OBJ_WEAPONS][WPN_FLAIL][PWPN_HIT] = 2; // helps to get past evasion
+ prop[OBJ_WEAPONS][WPN_FLAIL][PWPN_SPEED] = 15;
+ mss[OBJ_WEAPONS][WPN_FLAIL] = 150;
+
+ prop[OBJ_WEAPONS][WPN_SPIKED_FLAIL][PWPN_DAMAGE] = 12;
+ prop[OBJ_WEAPONS][WPN_SPIKED_FLAIL][PWPN_HIT] = 1;
+ prop[OBJ_WEAPONS][WPN_SPIKED_FLAIL][PWPN_SPEED] = 16;
+ mss[OBJ_WEAPONS][WPN_SPIKED_FLAIL] = 170;
+
+ prop[OBJ_WEAPONS][WPN_GREAT_FLAIL][PWPN_DAMAGE] = 17;
+ prop[OBJ_WEAPONS][WPN_GREAT_FLAIL][PWPN_HIT] = -4;
+ prop[OBJ_WEAPONS][WPN_GREAT_FLAIL][PWPN_SPEED] = 19;
+ mss[OBJ_WEAPONS][WPN_GREAT_FLAIL] = 300;
+
+ prop[OBJ_WEAPONS][WPN_DAGGER][PWPN_DAMAGE] = 3;
+ prop[OBJ_WEAPONS][WPN_DAGGER][PWPN_HIT] = 6; // helps to get past evasion
+ prop[OBJ_WEAPONS][WPN_DAGGER][PWPN_SPEED] = 11;
+ mss[OBJ_WEAPONS][WPN_DAGGER] = 20;
+
+ prop[OBJ_WEAPONS][WPN_KNIFE][PWPN_DAMAGE] = 2;
+ prop[OBJ_WEAPONS][WPN_KNIFE][PWPN_HIT] = 0; // helps to get past evasion
+ prop[OBJ_WEAPONS][WPN_KNIFE][PWPN_SPEED] = 11;
+ mss[OBJ_WEAPONS][WPN_KNIFE] = 10;
+
+ prop[OBJ_WEAPONS][WPN_MORNINGSTAR][PWPN_DAMAGE] = 10;
+ prop[OBJ_WEAPONS][WPN_MORNINGSTAR][PWPN_HIT] = 2;
+ prop[OBJ_WEAPONS][WPN_MORNINGSTAR][PWPN_SPEED] = 15;
+ mss[OBJ_WEAPONS][WPN_MORNINGSTAR] = 150;
+
+ prop[OBJ_WEAPONS][WPN_SHORT_SWORD][PWPN_DAMAGE] = 6;
+ prop[OBJ_WEAPONS][WPN_SHORT_SWORD][PWPN_HIT] = 5;
+ prop[OBJ_WEAPONS][WPN_SHORT_SWORD][PWPN_SPEED] = 12;
+ mss[OBJ_WEAPONS][WPN_SHORT_SWORD] = 100;
+
+ prop[OBJ_WEAPONS][WPN_LONG_SWORD][PWPN_DAMAGE] = 10;
+ prop[OBJ_WEAPONS][WPN_LONG_SWORD][PWPN_HIT] = 3;
+ prop[OBJ_WEAPONS][WPN_LONG_SWORD][PWPN_SPEED] = 14;
+ mss[OBJ_WEAPONS][WPN_LONG_SWORD] = 160;
+
+ prop[OBJ_WEAPONS][WPN_GREAT_SWORD][PWPN_DAMAGE] = 16;
+ prop[OBJ_WEAPONS][WPN_GREAT_SWORD][PWPN_HIT] = -1;
+ prop[OBJ_WEAPONS][WPN_GREAT_SWORD][PWPN_SPEED] = 17;
+ mss[OBJ_WEAPONS][WPN_GREAT_SWORD] = 250;
+
+ prop[OBJ_WEAPONS][WPN_FALCHION][PWPN_DAMAGE] = 8;
+ prop[OBJ_WEAPONS][WPN_FALCHION][PWPN_HIT] = 2;
+ prop[OBJ_WEAPONS][WPN_FALCHION][PWPN_SPEED] = 13;
+ mss[OBJ_WEAPONS][WPN_FALCHION] = 130;
+
+ prop[OBJ_WEAPONS][WPN_SCIMITAR][PWPN_DAMAGE] = 11;
+ prop[OBJ_WEAPONS][WPN_SCIMITAR][PWPN_HIT] = 1;
+ prop[OBJ_WEAPONS][WPN_SCIMITAR][PWPN_SPEED] = 14;
+ mss[OBJ_WEAPONS][WPN_SCIMITAR] = 170;
+
+ prop[OBJ_WEAPONS][WPN_HAND_AXE][PWPN_DAMAGE] = 7;
+ prop[OBJ_WEAPONS][WPN_HAND_AXE][PWPN_HIT] = 2;
+ prop[OBJ_WEAPONS][WPN_HAND_AXE][PWPN_SPEED] = 13;
+ mss[OBJ_WEAPONS][WPN_HAND_AXE] = 110;
+
+ prop[OBJ_WEAPONS][WPN_WAR_AXE][PWPN_DAMAGE] = 11;
+ prop[OBJ_WEAPONS][WPN_WAR_AXE][PWPN_HIT] = 0;
+ prop[OBJ_WEAPONS][WPN_WAR_AXE][PWPN_SPEED] = 16;
+ mss[OBJ_WEAPONS][WPN_WAR_AXE] = 150;
+
+ prop[OBJ_WEAPONS][WPN_BROAD_AXE][PWPN_DAMAGE] = 14;
+ prop[OBJ_WEAPONS][WPN_BROAD_AXE][PWPN_HIT] = 1;
+ prop[OBJ_WEAPONS][WPN_BROAD_AXE][PWPN_SPEED] = 17;
+ mss[OBJ_WEAPONS][WPN_BROAD_AXE] = 180;
+
+ prop[OBJ_WEAPONS][WPN_BATTLEAXE][PWPN_DAMAGE] = 17;
+ prop[OBJ_WEAPONS][WPN_BATTLEAXE][PWPN_HIT] = -2;
+ prop[OBJ_WEAPONS][WPN_BATTLEAXE][PWPN_SPEED] = 18;
+ mss[OBJ_WEAPONS][WPN_BATTLEAXE] = 200;
+
+ prop[OBJ_WEAPONS][WPN_SPEAR][PWPN_DAMAGE] = 5;
+ prop[OBJ_WEAPONS][WPN_SPEAR][PWPN_HIT] = 3;
+ prop[OBJ_WEAPONS][WPN_SPEAR][PWPN_SPEED] = 13;
+ mss[OBJ_WEAPONS][WPN_SPEAR] = 50;
+
+ prop[OBJ_WEAPONS][WPN_TRIDENT][PWPN_DAMAGE] = 9;
+ prop[OBJ_WEAPONS][WPN_TRIDENT][PWPN_HIT] = -2;
+ prop[OBJ_WEAPONS][WPN_TRIDENT][PWPN_SPEED] = 17;
+ mss[OBJ_WEAPONS][WPN_TRIDENT] = 160;
+
+ prop[OBJ_WEAPONS][WPN_DEMON_TRIDENT][PWPN_DAMAGE] = 15;
+ prop[OBJ_WEAPONS][WPN_DEMON_TRIDENT][PWPN_HIT] = -2;
+ prop[OBJ_WEAPONS][WPN_DEMON_TRIDENT][PWPN_SPEED] = 17;
+ mss[OBJ_WEAPONS][WPN_DEMON_TRIDENT] = 160;
+
+ prop[OBJ_WEAPONS][WPN_HALBERD][PWPN_DAMAGE] = 13;
+ prop[OBJ_WEAPONS][WPN_HALBERD][PWPN_HIT] = -3;
+ prop[OBJ_WEAPONS][WPN_HALBERD][PWPN_SPEED] = 19;
+ mss[OBJ_WEAPONS][WPN_HALBERD] = 200;
+
+ // sling
+ // - the three properties are _not_ irrelevant here
+ // - when something hits something else (either may be you)
+ // in melee, these are used.
+ prop[OBJ_WEAPONS][WPN_SLING][PWPN_DAMAGE] = 1;
+ prop[OBJ_WEAPONS][WPN_SLING][PWPN_HIT] = -1;
+ prop[OBJ_WEAPONS][WPN_SLING][PWPN_SPEED] = 11;
+ mss[OBJ_WEAPONS][WPN_SLING] = 10;
+
+ prop[OBJ_WEAPONS][WPN_BOW][PWPN_DAMAGE] = 2;
+ prop[OBJ_WEAPONS][WPN_BOW][PWPN_HIT] = -3; // helps to get past evasion
+ prop[OBJ_WEAPONS][WPN_BOW][PWPN_SPEED] = 11;
+ mss[OBJ_WEAPONS][WPN_BOW] = 100;
+
+ prop[OBJ_WEAPONS][WPN_BLOWGUN][PWPN_DAMAGE] = 1;
+ prop[OBJ_WEAPONS][WPN_BLOWGUN][PWPN_HIT] = 0; // helps to get past evasion
+ prop[OBJ_WEAPONS][WPN_BLOWGUN][PWPN_SPEED] = 10;
+ mss[OBJ_WEAPONS][WPN_BLOWGUN] = 50;
+
+ prop[OBJ_WEAPONS][WPN_CROSSBOW][PWPN_DAMAGE] = 2;
+ prop[OBJ_WEAPONS][WPN_CROSSBOW][PWPN_HIT] = -1;
+ prop[OBJ_WEAPONS][WPN_CROSSBOW][PWPN_SPEED] = 15;
+ mss[OBJ_WEAPONS][WPN_CROSSBOW] = 250;
+
+ prop[OBJ_WEAPONS][WPN_HAND_CROSSBOW][PWPN_DAMAGE] = 1;
+ prop[OBJ_WEAPONS][WPN_HAND_CROSSBOW][PWPN_HIT] = -1;
+ prop[OBJ_WEAPONS][WPN_HAND_CROSSBOW][PWPN_SPEED] = 15;
+ mss[OBJ_WEAPONS][WPN_HAND_CROSSBOW] = 70;
+
+ prop[OBJ_WEAPONS][WPN_GLAIVE][PWPN_DAMAGE] = 15;
+ prop[OBJ_WEAPONS][WPN_GLAIVE][PWPN_HIT] = -3;
+ prop[OBJ_WEAPONS][WPN_GLAIVE][PWPN_SPEED] = 18;
+ mss[OBJ_WEAPONS][WPN_GLAIVE] = 200;
+
+ // staff - hmmm
+ prop[OBJ_WEAPONS][WPN_QUARTERSTAFF][PWPN_DAMAGE] = 7;
+ prop[OBJ_WEAPONS][WPN_QUARTERSTAFF][PWPN_HIT] = 6;
+ prop[OBJ_WEAPONS][WPN_QUARTERSTAFF][PWPN_SPEED] = 12;
+ mss[OBJ_WEAPONS][WPN_QUARTERSTAFF] = 130;
+
+ prop[OBJ_WEAPONS][WPN_SCYTHE][PWPN_DAMAGE] = 14;
+ prop[OBJ_WEAPONS][WPN_SCYTHE][PWPN_HIT] = -4;
+ prop[OBJ_WEAPONS][WPN_SCYTHE][PWPN_SPEED] = 22;
+ mss[OBJ_WEAPONS][WPN_SCYTHE] = 230;
+
+ // these two should have the same speed because of 2-h ogres.
+ prop[OBJ_WEAPONS][WPN_GIANT_CLUB][PWPN_DAMAGE] = 15;
+ prop[OBJ_WEAPONS][WPN_GIANT_CLUB][PWPN_HIT] = -5;
+ prop[OBJ_WEAPONS][WPN_GIANT_CLUB][PWPN_SPEED] = 16;
+ mss[OBJ_WEAPONS][WPN_GIANT_CLUB] = 750;
+
+ prop[OBJ_WEAPONS][WPN_GIANT_SPIKED_CLUB][PWPN_DAMAGE] = 18;
+ prop[OBJ_WEAPONS][WPN_GIANT_SPIKED_CLUB][PWPN_HIT] = -6;
+ prop[OBJ_WEAPONS][WPN_GIANT_SPIKED_CLUB][PWPN_SPEED] = 17;
+ mss[OBJ_WEAPONS][WPN_GIANT_SPIKED_CLUB] = 850;
+ // these two should have the same speed because of 2-h ogres.
+
+ prop[OBJ_WEAPONS][WPN_EVENINGSTAR][PWPN_DAMAGE] = 12;
+ prop[OBJ_WEAPONS][WPN_EVENINGSTAR][PWPN_HIT] = 2;
+ prop[OBJ_WEAPONS][WPN_EVENINGSTAR][PWPN_SPEED] = 15;
+ mss[OBJ_WEAPONS][WPN_EVENINGSTAR] = 150;
+
+ prop[OBJ_WEAPONS][WPN_QUICK_BLADE][PWPN_DAMAGE] = 5;
+ prop[OBJ_WEAPONS][WPN_QUICK_BLADE][PWPN_HIT] = 6;
+ prop[OBJ_WEAPONS][WPN_QUICK_BLADE][PWPN_SPEED] = 7;
+ mss[OBJ_WEAPONS][WPN_QUICK_BLADE] = 100;
+
+ prop[OBJ_WEAPONS][WPN_KATANA][PWPN_DAMAGE] = 13;
+ prop[OBJ_WEAPONS][WPN_KATANA][PWPN_HIT] = 4;
+ prop[OBJ_WEAPONS][WPN_KATANA][PWPN_SPEED] = 13;
+ mss[OBJ_WEAPONS][WPN_KATANA] = 160;
+
+ prop[OBJ_WEAPONS][WPN_EXECUTIONERS_AXE][PWPN_DAMAGE] = 20;
+ prop[OBJ_WEAPONS][WPN_EXECUTIONERS_AXE][PWPN_HIT] = -4;
+ prop[OBJ_WEAPONS][WPN_EXECUTIONERS_AXE][PWPN_SPEED] = 20;
+ mss[OBJ_WEAPONS][WPN_EXECUTIONERS_AXE] = 320;
+
+ prop[OBJ_WEAPONS][WPN_DOUBLE_SWORD][PWPN_DAMAGE] = 15;
+ prop[OBJ_WEAPONS][WPN_DOUBLE_SWORD][PWPN_HIT] = 3;
+ prop[OBJ_WEAPONS][WPN_DOUBLE_SWORD][PWPN_SPEED] = 16;
+ mss[OBJ_WEAPONS][WPN_DOUBLE_SWORD] = 220;
+
+ prop[OBJ_WEAPONS][WPN_TRIPLE_SWORD][PWPN_DAMAGE] = 19;
+ prop[OBJ_WEAPONS][WPN_TRIPLE_SWORD][PWPN_HIT] = -1;
+ prop[OBJ_WEAPONS][WPN_TRIPLE_SWORD][PWPN_SPEED] = 19;
+ mss[OBJ_WEAPONS][WPN_TRIPLE_SWORD] = 300;
+
+ prop[OBJ_WEAPONS][WPN_HAMMER][PWPN_DAMAGE] = 7;
+ prop[OBJ_WEAPONS][WPN_HAMMER][PWPN_HIT] = 2;
+ prop[OBJ_WEAPONS][WPN_HAMMER][PWPN_SPEED] = 13;
+ mss[OBJ_WEAPONS][WPN_HAMMER] = 130;
+
+ prop[OBJ_WEAPONS][WPN_ANCUS][PWPN_DAMAGE] = 9;
+ prop[OBJ_WEAPONS][WPN_ANCUS][PWPN_HIT] = 1;
+ prop[OBJ_WEAPONS][WPN_ANCUS][PWPN_SPEED] = 14;
+ mss[OBJ_WEAPONS][WPN_ANCUS] = 160;
+
+ prop[OBJ_WEAPONS][WPN_WHIP][PWPN_DAMAGE] = 3;
+ prop[OBJ_WEAPONS][WPN_WHIP][PWPN_HIT] = 1; // helps to get past evasion
+ prop[OBJ_WEAPONS][WPN_WHIP][PWPN_SPEED] = 14;
+ mss[OBJ_WEAPONS][WPN_WHIP] = 30;
+
+ prop[OBJ_WEAPONS][WPN_SABRE][PWPN_DAMAGE] = 7;
+ prop[OBJ_WEAPONS][WPN_SABRE][PWPN_HIT] = 4;
+ prop[OBJ_WEAPONS][WPN_SABRE][PWPN_SPEED] = 12;
+ mss[OBJ_WEAPONS][WPN_SABRE] = 110;
+
+ prop[OBJ_WEAPONS][WPN_DEMON_BLADE][PWPN_DAMAGE] = 13;
+ prop[OBJ_WEAPONS][WPN_DEMON_BLADE][PWPN_HIT] = 2;
+ prop[OBJ_WEAPONS][WPN_DEMON_BLADE][PWPN_SPEED] = 15;
+ mss[OBJ_WEAPONS][WPN_DEMON_BLADE] = 200;
+
+ prop[OBJ_WEAPONS][WPN_DEMON_WHIP][PWPN_DAMAGE] = 10;
+ prop[OBJ_WEAPONS][WPN_DEMON_WHIP][PWPN_HIT] = 1;
+ prop[OBJ_WEAPONS][WPN_DEMON_WHIP][PWPN_SPEED] = 14;
+ mss[OBJ_WEAPONS][WPN_DEMON_WHIP] = 30;
+
+
+ // MISSILES:
+
+ prop[OBJ_MISSILES][MI_STONE][PWPN_DAMAGE] = 2;
+ prop[OBJ_MISSILES][MI_STONE][PWPN_HIT] = 4;
+ mss[OBJ_MISSILES][MI_STONE] = 5;
+
+ prop[OBJ_MISSILES][MI_ARROW][PWPN_DAMAGE] = 2;
+ prop[OBJ_MISSILES][MI_ARROW][PWPN_HIT] = 6;
+ mss[OBJ_MISSILES][MI_ARROW] = 10;
+
+ prop[OBJ_MISSILES][MI_NEEDLE][PWPN_DAMAGE] = 0;
+ prop[OBJ_MISSILES][MI_NEEDLE][PWPN_HIT] = 1;
+ mss[OBJ_MISSILES][MI_NEEDLE] = 1;
+
+ prop[OBJ_MISSILES][MI_BOLT][PWPN_DAMAGE] = 2;
+ prop[OBJ_MISSILES][MI_BOLT][PWPN_HIT] = 8;
+ mss[OBJ_MISSILES][MI_BOLT] = 12;
+
+ prop[OBJ_MISSILES][MI_DART][PWPN_DAMAGE] = 2;
+ prop[OBJ_MISSILES][MI_DART][PWPN_HIT] = 4; //whatever - for hand crossbow
+ mss[OBJ_MISSILES][MI_DART] = 5;
+
+ // large rock
+ prop[OBJ_MISSILES][MI_LARGE_ROCK][PWPN_DAMAGE] = 20;
+ prop[OBJ_MISSILES][MI_LARGE_ROCK][PWPN_HIT] = 10;
+ mss[OBJ_MISSILES][MI_LARGE_ROCK] = 1000;
+}
+
+
+unsigned char check_item_knowledge(void)
+{
+ char st_pass[ITEMNAME_SIZE] = "";
+ int i, j;
+ char lines = 0;
+ unsigned char anything = 0;
+ int ft = 0;
+ int max = 0;
+ int yps = 0;
+ int inv_count = 0;
+ unsigned char ki = 0;
+
+ const int num_lines = get_number_of_lines();
+
+#ifdef DOS_TERM
+ char buffer[2400];
+
+ gettext(35, 1, 80, 25, buffer);
+#endif
+
+#ifdef DOS_TERM
+ window(35, 1, 80, 25);
+#endif
+
+ clrscr();
+
+ for (i = 0; i < 4; i++)
+ {
+ for (j = 0; j < 30; j++)
+ {
+ if (id[i][j] == ID_KNOWN_TYPE)
+ inv_count++;
+ }
+ }
+
+ if (inv_count == 0)
+ {
+ cprintf("You don't recognise anything yet!");
+ if (getch() == 0)
+ getch();
+ goto putty;
+ }
+
+ textcolor(BLUE);
+ cprintf(" You recognise:");
+ textcolor(LIGHTGREY);
+ lines++;
+
+ for (i = 0; i < 4; i++)
+ {
+ switch (i)
+ {
+ case IDTYPE_WANDS:
+ ft = OBJ_WANDS;
+ max = NUM_WANDS;
+ break;
+ case IDTYPE_SCROLLS:
+ ft = OBJ_SCROLLS;
+ max = NUM_SCROLLS;
+ break;
+ case IDTYPE_JEWELLERY:
+ ft = OBJ_JEWELLERY;
+ max = NUM_JEWELLERY;
+ break;
+ case IDTYPE_POTIONS:
+ ft = OBJ_POTIONS;
+ max = NUM_POTIONS;
+ break;
+ }
+
+ for (j = 0; j < max; j++)
+ {
+ if (lines > num_lines - 2 && inv_count > 0)
+ {
+ gotoxy(1, num_lines);
+ cprintf("-more-");
+
+ ki = getch();
+
+ if (ki == ESCAPE)
+ {
+#ifdef DOS_TERM
+ puttext(35, 1, 80, 25, buffer);
+#endif
+ return ESCAPE;
+ }
+ if (ki >= 'A' && ki <= 'z')
+ {
+#ifdef DOS_TERM
+ puttext(35, 1, 80, 25, buffer);
+#endif
+ return ki;
+ }
+
+ if (ki == 0)
+ ki = getch();
+
+ lines = 0;
+ clrscr();
+ gotoxy(1, 1);
+ anything = 0;
+ }
+
+ int ident_level = get_ident_type( ft, j );
+
+ if (ident_level == ID_KNOWN_TYPE)
+ {
+ anything++;
+
+ if (lines > 0)
+ cprintf(EOL);
+ lines++;
+ cprintf(" ");
+
+ yps = wherey();
+
+ // item_name now requires a "real" item, so we'll create a tmp
+ item_def tmp = { ft, j, 0, 0, 0, 1, 0, 0, 0, 0, 0 };
+ item_name( tmp, DESC_PLAIN, st_pass );
+
+ cprintf(st_pass);
+
+ inv_count--;
+
+ if (wherey() != yps)
+ lines++;
+ }
+ } // end of j loop
+ }
+
+ if (anything > 0)
+ {
+ ki = getch();
+ //ki = getch();
+ //ki = anything;
+
+ if (ki >= 'A' && ki <= 'z')
+ {
+#ifdef DOS_TERM
+ puttext(35, 1, 80, 25, buffer);
+#endif
+ return ki;
+ }
+
+ if (ki == 0)
+ ki = getch();
+#ifdef DOS_TERM
+ puttext(35, 1, 80, 25, buffer);
+#endif
+ return anything;
+ }
+
+ putty:
+#ifdef DOS_TERM
+ puttext(35, 1, 80, 25, buffer);
+#endif
+
+ return ki;
+} // end check_item_knowledge()
+
+
+// must be certain that you are passing the subtype
+// to an OBJ_ARMOUR and nothing else, or as they say,
+// "Bad Things Will Happen" {dlb}:
+bool hide2armour( unsigned char *which_subtype )
+{
+ switch (*which_subtype)
+ {
+ case ARM_DRAGON_HIDE:
+ *which_subtype = ARM_DRAGON_ARMOUR;
+ return true;
+ case ARM_TROLL_HIDE:
+ *which_subtype = ARM_TROLL_LEATHER_ARMOUR;
+ return true;
+ case ARM_ICE_DRAGON_HIDE:
+ *which_subtype = ARM_ICE_DRAGON_ARMOUR;
+ return true;
+ case ARM_MOTTLED_DRAGON_HIDE:
+ *which_subtype = ARM_MOTTLED_DRAGON_ARMOUR;
+ return true;
+ case ARM_STORM_DRAGON_HIDE:
+ *which_subtype = ARM_STORM_DRAGON_ARMOUR;
+ return true;
+ case ARM_GOLD_DRAGON_HIDE:
+ *which_subtype = ARM_GOLD_DRAGON_ARMOUR;
+ return true;
+ case ARM_SWAMP_DRAGON_HIDE:
+ *which_subtype = ARM_SWAMP_DRAGON_ARMOUR;
+ return true;
+ case ARM_STEAM_DRAGON_HIDE:
+ *which_subtype = ARM_STEAM_DRAGON_ARMOUR;
+ return true;
+ default:
+ return false;
+ }
+} // end hide2armour()
+
+
+void make_name(unsigned char var1, unsigned char var2, unsigned char var3,
+ char ncase, char buff[ITEMNAME_SIZE])
+{
+ char name[ ITEMNAME_SIZE ] = "";
+ FixedVector < unsigned char, 15 > numb;
+ char len;
+ char i = 0;
+ char nexty = 0;
+ char j = 0;
+ char igo = 0;
+
+ int x = 0;
+
+ numb[0] = var1 * var2;
+ numb[1] = var1 * var3;
+ numb[2] = var2 * var3;
+ numb[3] = var1 * var2 * var3;
+ numb[4] = var1 + var2;
+ numb[5] = var2 + var3;
+ numb[6] = var1 * var2 + var3;
+ numb[7] = var1 * var3 + var2;
+ numb[8] = var2 * var3 + var1;
+ numb[9] = var1 * var2 * var3 - var1;
+ numb[10] = var1 + var2 + var2;
+ numb[11] = var2 + var3 * var1;
+ numb[12] = var1 * var2 * var3;
+ numb[13] = var1 * var3 * var1;
+ numb[14] = var2 * var3 * var3;
+
+ for (i = 0; i < 15; i++)
+ {
+ while (numb[i] >= 25)
+ {
+ numb[i] -= 25;
+ }
+ }
+
+ j = numb[6];
+
+ len = reduce(numb[reduce(numb[11]) / 2]);
+
+ while (len < 5 && j < 10)
+ {
+ len += 1 + reduce(1 + numb[j]);
+ j++;
+ }
+
+ while (len > 14)
+ {
+ len -= 8;
+ }
+
+ nexty = retbit(numb[4]);
+
+ char k = 0;
+
+ j = 0;
+
+ for (i = 0; i < len; i++)
+ {
+ j++;
+
+ if (j >= 15)
+ {
+ j = 0;
+
+ k++;
+
+ if (k > 9)
+ break;
+ }
+
+ if (nexty == 1 || (i > 0 && !is_random_name_vowel(name[i])))
+ {
+ name[i] = retvow(numb[j]);
+ if ((i == 0 || i == len - 1) && name[i] == 32)
+ {
+ i--;
+ continue;
+ }
+ }
+ else
+ {
+ if (numb[i / 2] <= 1 && i > 3 && is_random_name_vowel(name[i]))
+ goto two_letter;
+ else
+ name[i] = numb[j];
+
+ hello:
+ igo++;
+ }
+
+ if ((nexty == 0 && is_random_name_vowel(name[i]))
+ || (nexty == 1 && !is_random_name_vowel(name[i])))
+ {
+ if (nexty == 1 && i > 0 && !is_random_name_vowel(name[i - 1]))
+ i--;
+
+ i--;
+ continue;
+ }
+
+ if (!is_random_name_vowel(name[i]))
+ nexty = 1;
+ else
+ nexty = 0;
+
+ x++;
+ }
+
+ switch (ncase)
+ {
+ case 2:
+ for (i = 0; i < len + 1; i++)
+ {
+ if (i > 3 && name[i] == 0 && name[i + 1] == 0)
+ {
+ name[i] = 0;
+ if (name[i - 1] == 32)
+ name[i - 1] = 0;
+ break;
+ }
+ if (name[i] != 32 && name[i] < 30)
+ name[i] += 65;
+ if (name[i] > 96)
+ name[i] -= 32;
+ }
+ break;
+
+ case 3:
+ for (i = 0; i < len + 0; i++)
+ {
+ if (i != 0 && name[i] >= 65 && name[i] < 97)
+ {
+ if (name[i - 1] == 32)
+ name[i] += 32;
+ }
+
+ if (name[i] > 97)
+ {
+ if (i == 0 || name[i - 1] == 32)
+ name[i] -= 32;
+ }
+
+ if (name[i] < 30)
+ {
+ if (i == 0 || (name[i] != 32 && name[i - 1] == 32))
+ name[i] += 65;
+ else
+ name[i] += 97;
+ }
+ }
+ break;
+
+ case 0:
+ for (i = 0; i < len; i++)
+ {
+ if (name[i] != 32 && name[i] < 30)
+ name[i] += 97;
+ }
+ break;
+
+ case 1:
+ name[i] += 65;
+
+ for (i = 1; i < len; i++)
+ {
+ if (name[i] != 32 && name[i] < 30)
+ name[i] += 97; //97;
+ }
+ break;
+ }
+
+ if (strlen( name ) == 0)
+ strncpy( buff, "Plog", 80 );
+ else
+ strncpy( buff, name, 80 );
+
+ buff[79] = '\0';
+ return;
+
+ two_letter:
+ if (nexty == 1)
+ goto hello;
+
+ if (!is_random_name_vowel(name[i - 1]))
+ goto hello;
+
+ i++;
+
+ switch (i * (retbit(j) + 1))
+ {
+ case 0:
+ strcat(name, "sh");
+ break;
+ case 1:
+ strcat(name, "ch");
+ break;
+ case 2:
+ strcat(name, "tz");
+ break;
+ case 3:
+ strcat(name, "ts");
+ break;
+ case 4:
+ strcat(name, "cs");
+ break;
+ case 5:
+ strcat(name, "cz");
+ break;
+ case 6:
+ strcat(name, "xt");
+ break;
+ case 7:
+ strcat(name, "xk");
+ break;
+ case 8:
+ strcat(name, "kl");
+ break;
+ case 9:
+ strcat(name, "cl");
+ break;
+ case 10:
+ strcat(name, "fr");
+ break;
+ case 11:
+ strcat(name, "sh");
+ break;
+ case 12:
+ strcat(name, "ch");
+ break;
+ case 13:
+ strcat(name, "gh");
+ break;
+ case 14:
+ strcat(name, "pr");
+ break;
+ case 15:
+ strcat(name, "tr");
+ break;
+ case 16:
+ strcat(name, "mn");
+ break;
+ case 17:
+ strcat(name, "ph");
+ break;
+ case 18:
+ strcat(name, "pn");
+ break;
+ case 19:
+ strcat(name, "cv");
+ break;
+ case 20:
+ strcat(name, "zx");
+ break;
+ case 21:
+ strcat(name, "xz");
+ break;
+ case 23:
+ strcat(name, "dd");
+ break;
+ case 24:
+ strcat(name, "tt");
+ break;
+ case 25:
+ strcat(name, "ll");
+ break;
+ //case 26: strcat(name, "sh"); break;
+ //case 12: strcat(name, "sh"); break;
+ //case 13: strcat(name, "sh"); break;
+ default:
+ i--;
+ goto hello;
+ }
+
+ x += 2;
+
+ goto hello;
+} // end make_name()
+
+
+char reduce(unsigned char reducee)
+{
+ while (reducee >= 26)
+ {
+ reducee -= 26;
+ }
+
+ return reducee;
+} // end reduce()
+
+bool is_random_name_vowel(unsigned char let)
+{
+ return (let == 0 || let == 4 || let == 8 || let == 14 || let == 20
+ || let == 24 || let == 32);
+} // end is_random_name_vowel()
+
+char retvow(char sed)
+{
+
+ while (sed > 6)
+ sed -= 6;
+
+ switch (sed)
+ {
+ case 0:
+ return 0;
+ case 1:
+ return 4;
+ case 2:
+ return 8;
+ case 3:
+ return 14;
+ case 4:
+ return 20;
+ case 5:
+ return 24;
+ case 6:
+ return 32;
+ }
+
+ return 0;
+} // end retvow()
+
+char retbit(char sed)
+{
+ return (sed % 2);
+} // end retbit()