summaryrefslogtreecommitdiffstats
path: root/crawl-ref/source/itemname.cc
diff options
context:
space:
mode:
Diffstat (limited to 'crawl-ref/source/itemname.cc')
-rw-r--r--crawl-ref/source/itemname.cc1792
1 files changed, 457 insertions, 1335 deletions
diff --git a/crawl-ref/source/itemname.cc b/crawl-ref/source/itemname.cc
index b92dcfc387..4524ab919b 100644
--- a/crawl-ref/source/itemname.cc
+++ b/crawl-ref/source/itemname.cc
@@ -28,25 +28,28 @@
#include "externs.h"
#include "invent.h"
+#include "itemprop.h"
#include "macro.h"
#include "mon-util.h"
+#include "notes.h"
#include "randart.h"
#include "skills2.h"
#include "stuff.h"
-#include "wpn-misc.h"
#include "view.h"
+#include "items.h"
+char id[NUM_IDTYPE][MAX_SUBTYPES];
-char id[4][50];
-int prop[4][50][3];
-FixedArray < int, 20, 50 > mss;
+static bool is_random_name_space( char let );
+static bool is_random_name_vowel( char let);
+static const char *item_name_2(
+ const item_def &item, char buff[ ITEMNAME_SIZE ], bool terse );
-static bool is_random_name_vowel(unsigned char let);
-static char item_name_2( const item_def &item, char buff[ ITEMNAME_SIZE ], bool terse );
+static char retvow(int sed);
+static char retlet(int sed );
-char reduce(unsigned char reducee);
-char retbit(char sed);
-char retvow(char sed);
+// [dshaligram] For calls to item_name without a pre-allocated buffer.
+static char default_itembuf[ITEMNAME_SIZE];
bool is_vowel( const char chr )
{
@@ -55,42 +58,6 @@ bool is_vowel( const char 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_type_known( const item_def &item )
{
return item_ident(item, ISFLAG_KNOW_TYPE)
@@ -98,293 +65,35 @@ bool item_type_known( const item_def &item )
&& id[IDTYPE_JEWELLERY][item.sub_type] == ID_KNOWN_TYPE);
}
-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 )
+// takes item_def, so consider them deprecated.
+const char *it_name( int itn, char des, char *buff, bool terse )
{
- item_name( mitm[itn], des, buff, terse );
+ return item_name( mitm[itn], des, buff, terse );
} // end it_name()
-void in_name( int inn, char des, char buff[ ITEMNAME_SIZE ], bool terse )
+const char *in_name( int inn, char des, char *buff, bool terse )
{
- item_name( you.inv[inn], des, buff, terse );
+ return 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,
+const char *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 );
+ return item_name( tmp, des, buff, terse );
} // end quant_name()
-char item_name( const item_def &item, char descrip, char buff[ ITEMNAME_SIZE ],
- bool terse )
+// buff must be at least ITEMNAME_SIZE if non-NULL. If NULL, a static
+// item buffer will be used.
+const char *item_name( const item_def &item, char descrip,
+ char *buff, bool terse )
{
const int item_clas = item.base_type;
const int item_typ = item.sub_type;
@@ -393,6 +102,9 @@ char item_name( const item_def &item, char descrip, char buff[ ITEMNAME_SIZE ],
char tmp_quant[20];
char itm_name[ ITEMNAME_SIZE ] = "";
+ if (!buff)
+ buff = default_itembuf;
+
item_name_2( item, itm_name, terse );
buff[0] = '\0';
@@ -400,7 +112,7 @@ char item_name( const item_def &item, char descrip, char buff[ ITEMNAME_SIZE ],
if (descrip == DESC_INVENTORY_EQUIP || descrip == DESC_INVENTORY)
{
if (in_inventory(item)) // actually in inventory
- snprintf( buff, ITEMNAME_SIZE, (terse) ? "%c) " : "%c - ",
+ snprintf( buff, ITEMNAME_SIZE, (terse) ? "%c) " : "%c - ",
index_to_letter( item.link ) );
else
descrip = DESC_CAP_A;
@@ -561,15 +273,24 @@ char item_name( const item_def &item, char descrip, char buff[ ITEMNAME_SIZE ],
strncat( buff, " (around neck)", ITEMNAME_SIZE );
}
}
+ /*** HP CHANGE -- warning -- possible stack overflow error ***/
+ if ( item.inscription.size() > 0 ) // has an inscription
+ {
+ strncat( buff, " {", 2 );
+ strncat( buff, item.inscription.c_str(), ITEMNAME_SIZE );
+ strncat( buff, "}", 1 );
+ }
- return (1);
+ return (buff);
} // 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 )
+static const 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;
@@ -598,7 +319,7 @@ static char item_name_2( const item_def &item, char buff[ITEMNAME_SIZE],
if (item_cursed( item ))
strncat(buff, "cursed ", ITEMNAME_SIZE );
else if (Options.show_uncursed
- && item_not_ident( item, ISFLAG_KNOW_PLUSES ))
+ && !item_ident( item, ISFLAG_KNOW_PLUSES ))
{
strncat(buff, "uncursed ", ITEMNAME_SIZE );
}
@@ -687,7 +408,7 @@ static char item_name_2( const item_def &item, char buff[ITEMNAME_SIZE],
// 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)
+ if (!item_ident( item, ISFLAG_KNOW_PLUSES ) && !terse)
{
switch (get_equip_desc( item ))
{
@@ -760,7 +481,14 @@ static char item_name_2( const item_def &item, char buff[ITEMNAME_SIZE],
strncat(buff, (terse) ? " (speed)" : " of speed", ITEMNAME_SIZE );
break;
case SPWPN_VORPAL:
- switch (damage_type(item_clas, item_typ))
+ if (is_range_weapon( item ))
+ {
+ strncat(buff, (terse) ? " (velocity)" : " of velocity",
+ ITEMNAME_SIZE );
+ break;
+ }
+
+ switch (get_vorpal_type(item))
{
case DVORP_CRUSHING:
strncat(buff, (terse) ? " (crush)" : " of crushing", ITEMNAME_SIZE );
@@ -774,6 +502,12 @@ static char item_name_2( const item_def &item, char buff[ITEMNAME_SIZE],
case DVORP_CHOPPING:
strncat(buff, (terse) ? " (chop)" : " of chopping", ITEMNAME_SIZE );
break;
+ case DVORP_SLASHING:
+ strncat(buff, (terse) ? " (slash)" : " of slashing", ITEMNAME_SIZE );
+ break;
+ case DVORP_STABBING:
+ strncat(buff, (terse) ? " (stab)" : " of stabbing", ITEMNAME_SIZE );
+ break;
}
break;
@@ -819,6 +553,11 @@ static char item_name_2( const item_def &item, char buff[ITEMNAME_SIZE],
{
strncat( buff, (terse) ? "poison " : "poisoned ", ITEMNAME_SIZE );
}
+
+ if (brand == SPMSL_CURARE)
+ {
+ strncat( buff, (terse) ? "curare " : "curare-tipped ", ITEMNAME_SIZE);
+ }
if (item_ident( item, ISFLAG_KNOW_PLUSES ))
{
@@ -848,8 +587,8 @@ static char item_name_2( const item_def &item, char buff[ITEMNAME_SIZE],
(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);
+ (item_typ == MI_LARGE_ROCK) ? "large rock" :
+ "hysterical raisin", ITEMNAME_SIZE);
// this should probably be "" {dlb}
if (it_quant > 1)
@@ -862,7 +601,9 @@ static char item_name_2( const item_def &item, char buff[ITEMNAME_SIZE],
(brand == SPMSL_ICE) ? ((terse) ? " (ice)" : " of ice") :
(brand == SPMSL_NORMAL) ? "" :
(brand == SPMSL_POISONED) ? "" :
- (brand == SPMSL_POISONED_II) ? "" : " (buggy)", ITEMNAME_SIZE );
+ (brand == SPMSL_POISONED_II) ? "" :
+ (brand == SPMSL_CURARE) ? "" :
+ " (buggy)", ITEMNAME_SIZE );
}
break;
@@ -872,7 +613,7 @@ static char item_name_2( const item_def &item, char buff[ITEMNAME_SIZE],
if (item_cursed( item ))
strncat(buff, "cursed ", ITEMNAME_SIZE );
else if (Options.show_uncursed
- && item_not_ident( item, ISFLAG_KNOW_PLUSES ))
+ && !item_ident( item, ISFLAG_KNOW_PLUSES ))
{
strncat(buff, "uncursed ", ITEMNAME_SIZE );
}
@@ -889,8 +630,7 @@ static char item_name_2( const item_def &item, char buff[ITEMNAME_SIZE],
strncat(buff, " ", ITEMNAME_SIZE );
}
- if (item_typ == ARM_GLOVES
- || (item_typ == ARM_BOOTS && item_plus2 == TBOOT_BOOTS))
+ if (item_typ == ARM_GLOVES || item_typ == ARM_BOOTS)
{
strncat( buff, "pair of ", ITEMNAME_SIZE );
}
@@ -904,7 +644,7 @@ static char item_name_2( const item_def &item, char buff[ITEMNAME_SIZE],
// 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)
+ if (!item_ident( item, ISFLAG_KNOW_PLUSES ) && !terse)
{
switch (get_equip_desc( item ))
{
@@ -1129,43 +869,36 @@ static char item_name_2( const item_def &item, char buff[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 );
+ int pqual = PQUAL(item.special);
+ int pcolour = PCOLOUR(item.special);
+
+ static const char *potion_qualifiers[] = {
+ "", "bubbling ", "fuming ", "fizzy ", "viscous ", "lumpy ",
+ "smoky ", "glowing ", "sedimented ", "metallic ", "murky ",
+ "gluggy ", "oily ", "slimy ", "emulsified "
+ };
+ ASSERT( sizeof(potion_qualifiers) / sizeof(*potion_qualifiers)
+ == PDQ_NQUALS );
+
+ static const char *potion_colours[] = {
+ "clear", "blue", "black", "silvery", "cyan", "purple",
+ "orange", "inky", "red", "yellow", "green", "brown", "pink",
+ "white"
+ };
+ ASSERT( sizeof(potion_colours) / sizeof(*potion_colours)
+ == PDC_NCOLOURS );
+
+ const char *qualifier =
+ (pqual < 0 || pqual >= PDQ_NQUALS)? "bug-filled "
+ : potion_qualifiers[pqual];
+
+ const char *colour =
+ (pcolour < 0 || pcolour >= PDC_NCOLOURS)? "bogus"
+ : potion_colours[pcolour];
+
+ strncat(buff, qualifier, ITEMNAME_SIZE - strlen(buff));
+ strncat(buff, colour, ITEMNAME_SIZE - strlen(buff));
+ strncat(buff, " potion", ITEMNAME_SIZE - strlen(buff) );
if (it_quant > 1)
strncat(buff, "s", ITEMNAME_SIZE );
@@ -1309,7 +1042,11 @@ static char item_name_2( const item_def &item, char buff[ITEMNAME_SIZE],
strncat(buff, "labeled ", ITEMNAME_SIZE );
char buff3[ ITEMNAME_SIZE ];
- make_name( item.special, it_plus, item_clas, 2, buff3 );
+ const unsigned long sseed =
+ item.special
+ + static_cast<unsigned long>(it_plus)
+ + (static_cast<unsigned long>(item_clas) << 16);
+ make_name( sseed, true, buff3 );
strncat( buff, buff3 , ITEMNAME_SIZE );
if (id[ IDTYPE_SCROLLS ][item_typ] == ID_TRIED_TYPE)
@@ -1328,8 +1065,14 @@ static char item_name_2( const item_def &item, char buff[ITEMNAME_SIZE],
{
if (item_cursed( item ))
strncat(buff, "cursed ", ITEMNAME_SIZE );
- else if (Options.show_uncursed
- && item_not_ident( item, ISFLAG_KNOW_PLUSES ))
+ else if (Options.show_uncursed
+ && !terse
+ && (!ring_has_pluses(item)
+ || !item_ident(item, ISFLAG_KNOW_PLUSES))
+
+ // If the item is worn, its curse status is known,
+ // no need to belabour the obvious.
+ && get_equip_slot( &item ) == -1)
{
strncat(buff, "uncursed ", ITEMNAME_SIZE );
}
@@ -1683,7 +1426,7 @@ static char item_name_2( const item_def &item, char buff[ITEMNAME_SIZE],
switch (item_typ)
{
case MISC_RUNE_OF_ZOT:
- strncat( buff, (it_plus == RUNE_DIS) ? "iron" :
+ strncat(buff, (it_plus == RUNE_DIS) ? "iron" :
(it_plus == RUNE_GEHENNA) ? "obsidian" :
(it_plus == RUNE_COCYTUS) ? "icy" :
(it_plus == RUNE_TARTARUS) ? "bone" :
@@ -1721,7 +1464,7 @@ static char item_name_2( const item_def &item, char buff[ITEMNAME_SIZE],
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" :
+ strncat(buff, !item_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" :
@@ -1773,7 +1516,7 @@ static char item_name_2( const item_def &item, char buff[ITEMNAME_SIZE],
break;
case MISC_LANTERN_OF_SHADOWS:
- if (item_not_ident( item, ISFLAG_KNOW_TYPE ))
+ if (!item_ident( item, ISFLAG_KNOW_TYPE ))
strncat(buff, "bone ", ITEMNAME_SIZE );
strncat(buff, "lantern", ITEMNAME_SIZE );
@@ -1782,7 +1525,7 @@ static char item_name_2( const item_def &item, char buff[ITEMNAME_SIZE],
break;
case MISC_HORN_OF_GERYON:
- if (item_not_ident( item, ISFLAG_KNOW_TYPE ))
+ if (!item_ident( item, ISFLAG_KNOW_TYPE ))
strncat(buff, "silver ", ITEMNAME_SIZE );
strncat(buff, "horn", ITEMNAME_SIZE );
@@ -1791,7 +1534,7 @@ static char item_name_2( const item_def &item, char buff[ITEMNAME_SIZE],
break;
case MISC_DISC_OF_STORMS:
- if (item_not_ident( item, ISFLAG_KNOW_TYPE ))
+ if (!item_ident( item, ISFLAG_KNOW_TYPE ))
strncat(buff, "grey ", ITEMNAME_SIZE );
strncat(buff, "disc", ITEMNAME_SIZE );
@@ -1800,7 +1543,7 @@ static char item_name_2( const item_def &item, char buff[ITEMNAME_SIZE],
break;
case MISC_STONE_OF_EARTH_ELEMENTALS:
- if (item_not_ident( item, ISFLAG_KNOW_TYPE ))
+ if (!item_ident( item, ISFLAG_KNOW_TYPE ))
strncat(buff, "nondescript ", ITEMNAME_SIZE );
strncat(buff, "stone", ITEMNAME_SIZE );
@@ -1809,7 +1552,7 @@ static char item_name_2( const item_def &item, char buff[ITEMNAME_SIZE],
break;
case MISC_BOTTLED_EFREET:
- strncat(buff, (item_not_ident( item, ISFLAG_KNOW_TYPE ))
+ strncat(buff, (!item_ident( item, ISFLAG_KNOW_TYPE ))
? "sealed bronze flask" : "bottled efreet",
ITEMNAME_SIZE );
break;
@@ -1826,7 +1569,7 @@ static char item_name_2( const item_def &item, char buff[ITEMNAME_SIZE],
// compacted 15 Apr 2000 {dlb}:
case OBJ_BOOKS:
- if (item_not_ident( item, ISFLAG_KNOW_TYPE ))
+ if (!item_ident( item, ISFLAG_KNOW_TYPE ))
{
char primary = (item.special / 10);
char secondary = (item.special % 10);
@@ -1923,7 +1666,7 @@ static char item_name_2( const item_def &item, char buff[ITEMNAME_SIZE],
// compacted 15 Apr 2000 {dlb}:
case OBJ_STAVES:
- if (item_not_ident( item, ISFLAG_KNOW_TYPE ))
+ if (!item_ident( item, ISFLAG_KNOW_TYPE ))
{
strncat(buff, (item.special == 0) ? "curved" :
(item.special == 1) ? "glowing" :
@@ -1989,6 +1732,19 @@ static char item_name_2( const item_def &item, char buff[ITEMNAME_SIZE],
(item_typ == STAFF_CHANNELING) ? "channeling"
: "bugginess", ITEMNAME_SIZE );
}
+
+ if (item_is_rod( item ) && item.sub_type != STAFF_STRIKING
+ && item_ident( item, ISFLAG_KNOW_TYPE ))
+ {
+ strncat( buff, " (", ITEMNAME_SIZE );
+ itoa( item.plus / ROD_CHARGE_MULT, tmp_quant, 10 );
+ strncat( buff, tmp_quant, ITEMNAME_SIZE );
+ strncat( buff, "/", ITEMNAME_SIZE );
+ itoa( item.plus2 / ROD_CHARGE_MULT, tmp_quant, 10 );
+ strncat( buff, tmp_quant, ITEMNAME_SIZE );
+ strncat( buff, ")", ITEMNAME_SIZE );
+ }
+
break;
@@ -2133,7 +1889,7 @@ static char item_name_2( const item_def &item, char buff[ITEMNAME_SIZE],
strncat(buff, "s", ITEMNAME_SIZE );
}
- return 1;
+ return (buff);
} // end item_name_2()
void save_id(char identy[4][50])
@@ -2219,1035 +1975,401 @@ char get_ident_type(char cla, int ty)
}
} // end get_ident_type()
-int property( const item_def &item, int prop_type )
+static MenuEntry *discoveries_item_mangle(MenuEntry *me)
{
- 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);
- }
+ InvEntry *ie = dynamic_cast<InvEntry*>(me);
+ MenuEntry *newme = new MenuEntry;
+ std::string txt = item_name(*ie->item, DESC_PLAIN);
+ newme->text = " " + txt;
+ newme->quantity = 0;
+ delete me;
+
+ return (newme);
}
-int mass_item( const item_def &item )
+void check_item_knowledge()
{
- int unit_mass = 0;
-
- if (item.base_type == OBJ_GOLD)
- {
- unit_mass = 0;
+ int i,j;
+
+ std::vector<const item_def*> items;
+
+ int idx_to_objtype[4] = { OBJ_WANDS, OBJ_SCROLLS,
+ OBJ_JEWELLERY, OBJ_POTIONS };
+ int idx_to_maxtype[4] = { NUM_WANDS, NUM_SCROLLS,
+ NUM_JEWELLERY, NUM_POTIONS };
+
+ for (i = 0; i < 4; i++) {
+ for (j = 0; j < idx_to_maxtype[i]; j++) {
+ if (id[i][j] == ID_KNOWN_TYPE) {
+ item_def* ptmp = new item_def;
+ if ( ptmp != 0 ) {
+ ptmp->base_type = idx_to_objtype[i];
+ ptmp->sub_type = j;
+ ptmp->colour = 1;
+ ptmp->quantity = 1;
+ items.push_back(ptmp);
+ }
+ }
+ }
}
- 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 ];
+ if (items.empty())
+ mpr("You don't recognise anything yet!");
+ else {
+ InvMenu menu;
+ menu.set_title("You recognise:");
+ menu.load_items(items, discoveries_item_mangle);
+ menu.set_flags(MF_NOSELECT);
+ menu.show();
+ redraw_screen();
+
+ for ( std::vector<const item_def*>::iterator iter = items.begin();
+ iter != items.end(); ++iter )
+ delete *iter;
}
+} // end check_item_knowledge()
- return (unit_mass > 0 ? unit_mass : 0);
-}
-void init_properties(void)
+// Used for: Pandemonium demonlords, shopkeepers, scrolls, random artefacts
+int make_name( unsigned long seed, bool all_cap, char buff[ ITEMNAME_SIZE ] )
{
- 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;
+ char name[ITEMNAME_SIZE];
+ int numb[17];
int i = 0;
+ bool want_vowel = false;
+ bool has_space = false;
+
+ for (i = 0; i < ITEMNAME_SIZE; i++)
+ name[i] = '\0';
+
+ const int var1 = (seed & 0xFF);
+ const int var2 = ((seed >> 8) & 0xFF);
+ const int var3 = ((seed >> 16) & 0xFF);
+ const int var4 = ((seed >> 24) & 0xFF);
+
+ numb[0] = 373 * var1 + 409 * var2 + 281 * var3;
+ numb[1] = 163 * var4 + 277 * var2 + 317 * var3;
+ numb[2] = 257 * var1 + 179 * var4 + 83 * var3;
+ numb[3] = 61 * var1 + 229 * var2 + 241 * var4;
+ numb[4] = 79 * var1 + 263 * var2 + 149 * var3;
+ numb[5] = 233 * var4 + 383 * var2 + 311 * var3;
+ numb[6] = 199 * var1 + 211 * var4 + 103 * var3;
+ numb[7] = 139 * var1 + 109 * var2 + 349 * var4;
+ numb[8] = 43 * var1 + 389 * var2 + 359 * var3;
+ numb[9] = 367 * var4 + 101 * var2 + 251 * var3;
+ numb[10] = 293 * var1 + 59 * var4 + 151 * var3;
+ numb[11] = 331 * var1 + 107 * var2 + 307 * var4;
+ numb[12] = 73 * var1 + 157 * var2 + 347 * var3;
+ numb[13] = 379 * var4 + 353 * var2 + 227 * var3;
+ numb[14] = 181 * var1 + 173 * var4 + 193 * var3;
+ numb[15] = 131 * var1 + 167 * var2 + 53 * var4;
+ numb[16] = 313 * var1 + 127 * var2 + 401 * var3 + 337 * var4;
+
+ int len = 3 + numb[0] % 5 + ((numb[1] % 5 == 0) ? numb[2] % 6 : 1);
+
+ if (all_cap)
+ len += 6;
+
+ int j = numb[3] % 17;
+ const int k = numb[4] % 17;
+ int count = 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 (i = 0; i < len; i++)
{
- for (j = 0; j < 30; j++)
+ j = (j + 1) % 17;
+ if (j == 0)
{
- if (id[i][j] == ID_KNOWN_TYPE)
- inv_count++;
+ count++;
+ if (count > 9)
+ break;
}
- }
-
- 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)
+ if (!has_space && i > 5 && i < len - 4
+ && (numb[(k + 10 * j) % 17] % 5) != 3)
{
- 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;
+ want_vowel = true;
+ name[i] = ' ';
}
-
- for (j = 0; j < max; j++)
+ else if (i > 0
+ && (want_vowel
+ || (i > 1
+ && is_random_name_vowel( name[i - 1] )
+ && !is_random_name_vowel( name[i - 2] )
+ && (numb[(k + 4 * j) % 17] % 5) <= 1 )))
{
- if (lines > num_lines - 2 && inv_count > 0)
- {
- gotoxy(1, num_lines);
- cprintf("-more-");
-
- ki = getch();
+ want_vowel = true;
+ name[i] = retvow( numb[(k + 7 * j) % 17] );
- if (ki == ESCAPE)
+ if (is_random_name_space( name[i] ))
+ {
+ if (i == 0)
{
-#ifdef DOS_TERM
- puttext(35, 1, 80, 25, buffer);
-#endif
- return ESCAPE;
+ want_vowel = false;
+ name[i] = retlet( numb[(k + 14 * j) % 17] );
}
- if (ki >= 'A' && ki <= 'z')
+ else if (len < 7
+ || i <= 2 || i >= len - 3
+ || is_random_name_space( name[i - 1] )
+ || (i > 1 && is_random_name_space( name[i - 2] ))
+ || (i > 2
+ && !is_random_name_vowel( name[i - 1] )
+ && !is_random_name_vowel( name[i - 2] )))
{
-#ifdef DOS_TERM
- puttext(35, 1, 80, 25, buffer);
-#endif
- return ki;
+ i--;
+ continue;
}
-
- 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)
+ else if (i > 1
+ && name[i] == name[i - 1]
+ && (name[i] == 'y' || name[i] == 'i'
+ || (numb[(k + 12 * j) % 17] % 5) <= 1))
{
- 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, 0, 0, 0 };
- tmp.base_type = ft;
- tmp.sub_type = j;
- tmp.colour = 1;
-
- item_name( tmp, DESC_PLAIN, st_pass );
-
- cprintf(st_pass);
-
- inv_count--;
-
- if (wherey() != yps)
- lines++;
+ i--;
+ continue;
}
- } // 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;
- int len;
- int i = 0;
- int nexty = 0;
- int j = 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)
+ else
{
- 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;
+ if ((len > 3 || i != 0)
+ && (numb[(k + 13 * j) % 17] % 7) <= 1
+ && (i < len - 2 || (i > 0 && !is_random_name_space(name[i - 1]))))
+ {
+ const bool beg = ((i < 1) || is_random_name_space(name[i - 1]));
+ const bool end = (i >= len - 2);
- j = 0;
+ const int first = (beg ? 0 : (end ? 14 : 0));
+ const int last = (beg ? 27 : (end ? 56 : 67));
- for (i = 0; i < len; i++)
- {
- j++;
-
- if (j >= 15)
- {
- j = 0;
+ const int num = last - first;
- k++;
+ i++;
- 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)
+ switch (numb[(k + 11 * j) % 17] % num + first)
+ {
+ // start, middle
+ case 0: strcat(name, "kl"); break;
+ case 1: strcat(name, "gr"); break;
+ case 2: strcat(name, "cl"); break;
+ case 3: strcat(name, "cr"); break;
+ case 4: strcat(name, "fr"); break;
+ case 5: strcat(name, "pr"); break;
+ case 6: strcat(name, "tr"); break;
+ case 7: strcat(name, "tw"); break;
+ case 8: strcat(name, "br"); break;
+ case 9: strcat(name, "pl"); break;
+ case 10: strcat(name, "bl"); break;
+ case 11: strcat(name, "str"); i++; len++; break;
+ case 12: strcat(name, "shr"); i++; len++; break;
+ case 13: strcat(name, "thr"); i++; len++; break;
+ // start, middle, end
+ case 14: strcat(name, "sm"); break;
+ case 15: strcat(name, "sh"); break;
+ case 16: strcat(name, "ch"); break;
+ case 17: strcat(name, "th"); break;
+ case 18: strcat(name, "ph"); break;
+ case 19: strcat(name, "pn"); break;
+ case 20: strcat(name, "kh"); break;
+ case 21: strcat(name, "gh"); break;
+ case 22: strcat(name, "mn"); break;
+ case 23: strcat(name, "ps"); break;
+ case 24: strcat(name, "st"); break;
+ case 25: strcat(name, "sk"); break;
+ case 26: strcat(name, "sch"); i++; len++; break;
+ // middle, end
+ case 27: strcat(name, "ts"); break;
+ case 28: strcat(name, "cs"); break;
+ case 29: strcat(name, "xt"); break;
+ case 30: strcat(name, "nt"); break;
+ case 31: strcat(name, "ll"); break;
+ case 32: strcat(name, "rr"); break;
+ case 33: strcat(name, "ss"); break;
+ case 34: strcat(name, "wk"); break;
+ case 35: strcat(name, "wn"); break;
+ case 36: strcat(name, "ng"); break;
+ case 37: strcat(name, "cw"); break;
+ case 38: strcat(name, "mp"); break;
+ case 39: strcat(name, "ck"); break;
+ case 40: strcat(name, "nk"); break;
+ case 41: strcat(name, "dd"); break;
+ case 42: strcat(name, "tt"); break;
+ case 43: strcat(name, "bb"); break;
+ case 44: strcat(name, "pp"); break;
+ case 45: strcat(name, "nn"); break;
+ case 46: strcat(name, "mm"); break;
+ case 47: strcat(name, "kk"); break;
+ case 48: strcat(name, "gg"); break;
+ case 49: strcat(name, "ff"); break;
+ case 50: strcat(name, "pt"); break;
+ case 51: strcat(name, "tz"); break;
+ case 52: strcat(name, "dgh"); i++; len++; break;
+ case 53: strcat(name, "rgh"); i++; len++; break;
+ case 54: strcat(name, "rph"); i++; len++; break;
+ case 55: strcat(name, "rch"); i++; len++; break;
+ // middle only
+ case 56: strcat(name, "cz"); break;
+ case 57: strcat(name, "xk"); break;
+ case 58: strcat(name, "zx"); break;
+ case 59: strcat(name, "xz"); break;
+ case 60: strcat(name, "cv"); break;
+ case 61: strcat(name, "vv"); break;
+ case 62: strcat(name, "nl"); break;
+ case 63: strcat(name, "rh"); break;
+ case 64: strcat(name, "dw"); break;
+ case 65: strcat(name, "nw"); break;
+ case 66: strcat(name, "khl"); i++; len++; break;
+ default:
+ i--;
+ break;
+ }
+ }
+ else
{
- i--;
- continue;
+ if (i == 0)
+ {
+ name[i] = 'a' + (numb[(k + 8 * j) % 17] % 26);
+ want_vowel = is_random_name_vowel( name[i] );
+ }
+ else
+ {
+ name[i] = retlet( numb[(k + 3 * j) % 17] );
+ }
}
}
- else
+
+ if (name[i] == '\0')
{
- if (numb[i / 2] <= 1 && i > 3 && is_random_name_vowel(name[i]))
- goto two_letter;
- else
- name[i] = numb[j];
+ i--;
+ continue;
}
- hello:
-
- if ((nexty == 0 && is_random_name_vowel(name[i]))
- || (nexty == 1 && !is_random_name_vowel(name[i])))
+ if (want_vowel && !is_random_name_vowel( name[i] )
+ || (!want_vowel && 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;
+ if (is_random_name_space( name[i] ))
+ has_space = true;
+
+ if (!is_random_name_vowel( name[i] ))
+ want_vowel = true;
else
- nexty = 0;
+ want_vowel = false;
+ }
- x++;
+ // catch break and try to give a final letter
+ if (i > 0
+ && !is_random_name_space( name[i - 1] )
+ && name[i - 1] != 'y'
+ && is_random_name_vowel( name[i - 1] )
+ && (count > 9 || (i < 8 && numb[16] % 3)))
+ {
+ name[i] = retlet( numb[j] );
}
+
+ len = strlen( name );
- switch (ncase)
+ if (len)
{
- case 2:
- for (i = 0; i < len + 1; i++)
+ for (i = len - 1; i > 0; i--)
{
- if (i > 3 && name[i] == 0 && name[i + 1] == 0)
- {
- name[i] = 0;
- if (name[i - 1] == 32)
- name[i - 1] = 0;
+ if (!isspace( name[i] ))
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)
+ else
{
- 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;
+ name[i] = '\0';
+ len--;
}
}
- 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 );
+ if (len >= 3)
+ strncpy( buff, name, ITEMNAME_SIZE );
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;
+ {
+ strncpy( buff, "plog", ITEMNAME_SIZE );
+ len = 4;
+ }
- i++;
+ buff[ ITEMNAME_SIZE - 1 ] = '\0';
- switch (i * (retbit(j) + 1))
+ for (i = 0; i < len; i++)
{
- 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;
+ if (all_cap || i == 0 || buff[i - 1] == ' ')
+ buff[i] = toupper( buff[i] );
}
- x += 2;
-
- goto hello;
+ return (len);
} // end make_name()
-
-char reduce(unsigned char reducee)
+bool is_random_name_space(char let)
{
- while (reducee >= 26)
- {
- reducee -= 26;
- }
-
- return reducee;
-} // end reduce()
+ return (let == ' ');
+}
-bool is_random_name_vowel(unsigned char let)
+static bool is_random_name_vowel( char let )
{
- return (let == 0 || let == 4 || let == 8 || let == 14 || let == 20
- || let == 24 || let == 32);
+ return (let == 'a' || let == 'e' || let == 'i' || let == 'o' || let == 'u'
+ || let == 'y' || let == ' ');
} // end is_random_name_vowel()
-char retvow(char sed)
+static char retvow( int sed )
{
+ static const char vowels[] = "aeiouaeiouaeiouy ";
+ return (vowels[ sed % (sizeof(vowels) - 1) ]);
+} // end retvow()
- while (sed > 6)
- sed -= 6;
+static char retlet( int sed )
+{
+ static const char consonants[] = "bcdfghjklmnpqrstvwxzcdfghlmnrstlmnrst";
+ return (consonants[ sed % (sizeof(consonants) - 1) ]);
+}
- 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;
- }
+bool is_interesting_item( const item_def& item ) {
+ if ( is_random_artefact(item) ||
+ is_unrandom_artefact(item) ||
+ is_fixed_artefact(item) )
+ return true;
- return 0;
-} // end retvow()
+ char name[ITEMNAME_SIZE];
+ item_name(item, DESC_PLAIN, name, false);
+ std::string iname(name);
+ for (unsigned i = 0; i < Options.note_items.size(); ++i)
+ if (Options.note_items[i].matches(iname))
+ return true;
+ return false;
+}
-char retbit(char sed)
-{
- return (sed % 2);
-} // end retbit()
+bool fully_identified( const item_def& item ) {
+ long flagset = ISFLAG_IDENT_MASK;
+ switch ( item.base_type ) {
+ case OBJ_BOOKS:
+ case OBJ_MISCELLANY:
+ case OBJ_ORBS:
+ case OBJ_SCROLLS:
+ case OBJ_POTIONS:
+ flagset = ISFLAG_KNOW_TYPE;
+ break;
+ case OBJ_FOOD:
+ flagset = 0;
+ break;
+ case OBJ_WANDS:
+ flagset = (ISFLAG_KNOW_TYPE | ISFLAG_KNOW_PLUSES);
+ break;
+ case OBJ_JEWELLERY:
+ flagset = (ISFLAG_KNOW_CURSE | ISFLAG_KNOW_TYPE);
+ if ( ring_has_pluses(item) )
+ flagset |= ISFLAG_KNOW_PLUSES;
+ break;
+ default:
+ break;
+ }
+ if ( is_random_artefact(item) ||
+ is_fixed_artefact(item) ||
+ is_unrandom_artefact(item) )
+ flagset |= ISFLAG_KNOW_PROPERTIES;
+
+ return item_ident( item, flagset );
+}