--- src/externs.h.orig Thu Dec 11 15:32:40 2003 +++ src/externs.h Mon Feb 23 20:29:35 2004 @@ -1128,6 +1128,7 @@ extern char spell_txt[50]; extern bool grab_tval_desc(int tval); extern void init_match_theme(obj_theme theme); +extern bool kind_is_artifactable(int k_idx); extern bool kind_is_good(int k_idx); extern int kind_is_legal_special; extern bool kind_is_legal(int k_idx); --- src/object2.c.orig Thu Dec 11 15:32:40 2003 +++ src/object2.c Mon Feb 23 20:37:27 2004 @@ -4783,6 +4783,37 @@ return (FALSE); } +/* + * Hack -- determine if a template is suitable for building a randart + * --dsb + */ +bool kind_is_artifactable(int k_idx) +{ + object_kind *k_ptr = &k_info[k_idx]; + int i, j; + + if (!kind_is_good(k_idx)) return FALSE; + + /* We consider the item artifactable if there is at least one + * randart power in ra_info that could be added to this item. */ + for (i = 0; i < max_ra_idx; i++) + { + randart_part_type *ra_ptr = &ra_info[i]; + + for (j = 0; j < 20; j++) + { + if (ra_ptr->tval[j] != k_ptr->tval) continue; + if (ra_ptr->min_sval[j] > k_ptr->sval) continue; + if (ra_ptr->max_sval[j] < k_ptr->sval) continue; + /* We have a winner! */ + return TRUE; + } + } + + /* No match. Too bad. */ + return FALSE; +} + /* --- src/generate.c.orig Thu Dec 11 15:32:40 2003 +++ src/generate.c Mon Feb 23 20:38:00 2004 @@ -8051,47 +8051,20 @@ /* XXX XXX XXX Grant a randart */ if (fates[i].a_idx == 0) { - obj_theme theme; int obj_lev; s16b k_idx; - /* - * XXX XXX XXX Don't like to code - * 'kind_is_artefactable' - */ - - /* Narrower choices */ - theme.treasure = 0; - theme.combat = 50; - theme.magic = 50; - theme.tools = 0; - init_match_theme(theme); - /* Apply restriction */ - get_obj_num_hook = kind_is_good; + get_obj_num_hook = kind_is_artifactable; /* Object level a la find object fates */ obj_lev = max_dlv[dungeon_type] + randint(10); - /* XXX XXX XXX */ - while (1) - { - byte tval; - - /* Roll for an object */ - k_idx = get_obj_num(obj_lev); - - /* Access tval */ - tval = k_info[k_idx].tval; + /* Rebuild allocation table */ + get_obj_num_prep(); - /* XXX XXX XXX */ - if (tval == TV_ROD_MAIN) continue; - /* XXX XXX XXX */ - if ((tval >= TV_BOOK) && - (tval <= TV_DAEMON_BOOK)) continue; - /* Accept it */ - break; - } + /* Roll for an object */ + k_idx = get_obj_num(obj_lev); /* Reset restriction */ get_obj_num_hook = kind_is_legal;