-+-+-+-+-+-+-+-+ START OF PART 35 -+-+-+-+-+-+-+-+ X register inven_type *t_ptr; X int known1p, always_known1p; X#ifdef ATARIST_MWC X int32u holder; X#endif X X typ = i_ptr->tval; X subt = i_ptr->subval; X known1p = known1_p (i_ptr); X always_known1p = (object_offset (i_ptr) == -1); X /* Now, check to see if player can carry object */ X for (locn = 0; ; locn++) X `7B X t_ptr = &inventory`5Blocn`5D; X if ((typ == t_ptr->tval) && (subt == t_ptr->subval) X`09 && (subt >= ITEM_SINGLE_STACK_MIN) && X`09 ((int)t_ptr->number + (int)i_ptr->number < 256) && X`09 ((subt < ITEM_GROUP_MIN) `7C`7C (t_ptr->p1 == i_ptr->p1)) && X`09 /* only stack if both or neither are identified */ X`09 (known1p == known1_p(t_ptr))) X`09`7B X`09 t_ptr->number += i_ptr->number; X`09 break; X`09`7D X /* For items which are always known1p, i.e. never have a 'color', X`09 insert them into the inventory in sorted order. */ X else if ((typ == t_ptr->tval && subt < t_ptr->subval X`09`09&& always_known1p) X`09 `7C`7C (typ > t_ptr->tval)) X`09`7B X`09 for (i = inven_ctr - 1; i >= locn; i--) X`09 inventory`5Bi+1`5D = inventory`5Bi`5D; X`09 inventory`5Blocn`5D = *i_ptr; X`09 inven_ctr++; X`09 break; X`09`7D X `7D X X inven_weight += i_ptr->number*i_ptr->weight; X#ifdef ATARIST_MWC X py.flags.status `7C= (holder = PY_STR_WGT); X#else X py.flags.status `7C= PY_STR_WGT; X#endif X return locn; X`7D X X X/* Returns spell chance of failure for spell`09`09-RAK-`09*/ Xint spell_chance(spell) Xint spell; X`7B X register spell_type *s_ptr; X register int chance; X register int stat; X X s_ptr = &magic_spell`5Bpy.misc.pclass-1`5D`5Bspell`5D; X chance = s_ptr->sfail - 3*(py.misc.lev-s_ptr->slevel); X if (class`5Bpy.misc.pclass`5D.spell == MAGE) X stat = A_INT; X else X stat = A_WIS; X chance -= 3 * (stat_adj(stat)-1); X if (s_ptr->smana > py.misc.cmana) X chance += 5 * (s_ptr->smana-py.misc.cmana); X if (chance > 95) X chance = 95; X else if (chance < 5) X chance = 5; X return chance; X`7D X X X/* Print list of spells`09`09`09`09`09-RAK-`09*/ X/* if nonconsec is -1: spells numbered consecutively from 'a' to 'a'+num X >=0: spells numbered by offset from nonconsec */ Xvoid print_spells(spell, num, comment, nonconsec) Xint *spell; Xregister int num; Xint comment, nonconsec; X`7B X register int i, j; X vtype out_val; X register spell_type *s_ptr; X int col, offset; X char *p; X char spell_char; X X if (comment) X col = 22; X else X col = 31; X offset = (class`5Bpy.misc.pclass`5D.spell==MAGE ? SPELL_OFFSET : PRAYER_OF VFSET); X erase_line(1, col); X put_buffer("Name", 1, col+5); X put_buffer("Lv Mana Fail", 1, col+35); X /* only show the first 22 choices */ X if (num > 22) X num = 22; X for (i = 0; i < num; i++) X `7B X j = spell`5Bi`5D; X s_ptr = &magic_spell`5Bpy.misc.pclass-1`5D`5Bj`5D; X if (comment == FALSE) X`09p = ""; X else if ((spell_forgotten & (1L << j)) != 0) X`09p = " forgotten"; X else if ((spell_learned & (1L << j)) == 0) X`09p = " unknown"; X else if ((spell_worked & (1L << j)) == 0) X`09p = " untried"; X else X`09p = ""; X /* determine whether or not to leave holes in character choices, X`09 nonconsec -1 when learning spells, consec offset>=0 when asking which X`09 spell to cast */ X if (nonconsec == -1) X`09spell_char = 'a' + i; X else X`09spell_char = 'a' + j - nonconsec; X (void) sprintf(out_val, " %c) %-30s%2d %4d %3d%%%s", spell_char, X`09`09 spell_names`5Bj+offset`5D, s_ptr->slevel, s_ptr->smana, X`09`09 spell_chance (j), p); X prt(out_val, 2+i, col); X `7D X`7D X X X/* Returns spell pointer`09`09`09`09-RAK-`09*/ Xint get_spell(spell, num, sn, sc, prompt, first_spell) Xint *spell; Xregister int num; Xregister int *sn, *sc; Xchar *prompt; Xint first_spell; X`7B X register spell_type *s_ptr; X int flag, redraw, offset, i; X char choice; X vtype out_str, tmp_str; X X *sn = -1; X flag = FALSE; X (void) sprintf(out_str, "(Spells %c-%c, *=List, =exit) %s", X`09`09 spell`5B0`5D+'a'-first_spell, spell`5Bnum-1`5D+'a'-first_spell, X`09`09 prompt); X redraw = FALSE; X offset = (class`5Bpy.misc.pclass`5D.spell==MAGE ? SPELL_OFFSET : PRAYER_OF VFSET); X while (flag == FALSE && get_com (out_str, &choice)) X `7B X if (isupper((int)choice)) X`09`7B X`09 *sn = choice-'A'+first_spell; X`09 /* verify that this is in spell`5B`5D, at most 22 entries in spell`5B`5 VD */ X`09 for (i = 0; i < num; i++) X`09 if (*sn == spell`5Bi`5D) X`09 break; X`09 if (i == num) X`09 *sn = -2; X`09 else X`09 `7B X`09 s_ptr = &magic_spell`5Bpy.misc.pclass-1`5D`5B*sn`5D; X`09 (void) sprintf (tmp_str, "Cast %s (%d mana, %d%% fail)?", X`09`09`09 spell_names`5B*sn+offset`5D, s_ptr->smana, X`09`09`09 spell_chance (*sn)); X`09 if (get_check (tmp_str)) X`09`09flag = TRUE; X`09 else X`09`09*sn = -1; X`09 `7D X`09`7D X else if (islower((int)choice)) X`09`7B X`09 *sn = choice-'a'+first_spell; X`09 /* verify that this is in spell`5B`5D, at most 22 entries in spell`5B`5 VD */ X`09 for (i = 0; i < num; i++) X`09 if (*sn == spell`5Bi`5D) X`09 break; X`09 if (i == num) X`09 *sn = -2; X`09 else X`09 flag = TRUE; X`09`7D X else if (choice == '*') X`09`7B X`09 /* only do this drawing once */ X`09 if (!redraw) X`09 `7B X`09 save_screen (); X`09 redraw = TRUE; X`09 print_spells (spell, num, FALSE, first_spell); X`09 `7D X`09`7D X else if (isalpha((int)choice)) X`09*sn = -2; X else X`09`7B X`09 *sn = -1; X`09 bell(); X`09`7D X if (*sn == -2) X`09`7B X`09 (void) sprintf (tmp_str, "You don't know that %s.", X`09`09`09 (offset == SPELL_OFFSET ? "spell" : "prayer")); X`09 msg_print(tmp_str); X`09`7D X `7D X if (redraw) X restore_screen (); X X erase_line(MSG_LINE, 0); X if (flag) X *sc = spell_chance (*sn); X X return(flag); X`7D X X X/* calculate number of spells player should have, and learn forget spells X until that number is met -JEW- */ Xvoid calc_spells(stat) Xint stat; X`7B X register int i; X register int32u mask; X int32u spell_flag; X int j, offset; X int num_allowed, new_spells, num_known, levels; X vtype tmp_str; X char *p; X register struct misc *p_ptr; X register spell_type *msp_ptr; X X p_ptr = &py.misc; X msp_ptr = &magic_spell`5Bp_ptr->pclass-1`5D`5B0`5D; X if (stat == A_INT) X `7B X p = "spell"; X offset = SPELL_OFFSET; X `7D X else X `7B X p = "prayer"; X offset = PRAYER_OFFSET; X `7D X X /* check to see if know any spells greater than level, eliminate them */ X for (i = 31, mask = 0x80000000L; mask; mask >>= 1, i--) X if (mask & spell_learned) X `7B X`09if (msp_ptr`5Bi`5D.slevel > p_ptr->lev) X`09 `7B X`09 spell_learned &= `7Emask; X`09 spell_forgotten `7C= mask; X`09 (void) sprintf(tmp_str, "You have forgotten the %s of %s.", p, X`09`09`09 spell_names`5Bi+offset`5D); X`09 msg_print(tmp_str); X`09 `7D X`09else X`09 break; X `7D X X /* calc number of spells allowed */ X levels = p_ptr->lev - class`5Bp_ptr->pclass`5D.first_spell_lev + 1; X switch(stat_adj(stat)) X `7B X case 0:`09`09 num_allowed = 0; break; X case 1: case 2: case 3: num_allowed = 1 * levels; break; X case 4: case 5:`09 num_allowed = 3 * levels / 2; break; X case 6:`09`09 num_allowed = 2 * levels; break; X case 7:`09`09 num_allowed = 5 * levels / 2; break; X `7D X X num_known = 0; X for (mask = 0x1; mask; mask <<= 1) X if (mask & spell_learned) X num_known++; X new_spells = num_allowed - num_known; X X if (new_spells > 0) X `7B X /* remember forgotten spells while forgotten spells exist of new_spell Vs X`09 positive, remember the spells in the order that they were learned */ X for (i = 0; (spell_forgotten && new_spells X`09`09 && (i < num_allowed) && (i < 32)); i++) X`09`7B X`09 /* j is (i+1)th spell learned */ X`09 j = spell_order`5Bi`5D; X`09 /* shifting by amounts greater than number of bits in long gives X`09 an undefined result, so don't shift for unknown spells */ X`09 if (j == 99) X`09 mask = 0x0; X`09 else X`09 mask = 1L << j; X`09 if (mask & spell_forgotten) X`09 `7B X`09 if (msp_ptr`5Bj`5D.slevel <= p_ptr->lev) X`09`09`7B X`09`09 new_spells--; X`09`09 spell_forgotten &= `7Emask; X`09`09 spell_learned `7C= mask; X`09`09 (void) sprintf(tmp_str, "You have remembered the %s of %s.", X`09`09`09`09 p, spell_names`5Bj+offset`5D); X`09`09 msg_print(tmp_str); X`09`09`7D X`09 else X`09`09num_allowed++; X`09 `7D X`09`7D X X if (new_spells > 0) X`09`7B X`09 /* determine which spells player can learn */ X`09 /* must check all spells here, in gain_spell() we actually check X`09 if the books are present */ X`09 spell_flag = 0x7FFFFFFFL & `7Espell_learned; X X`09 mask = 0x1; X`09 i = 0; X`09 for (j = 0, mask = 0x1; spell_flag; mask <<= 1, j++) X`09 if (spell_flag & mask) X`09 `7B X`09`09spell_flag &= `7Emask; X`09`09if (msp_ptr`5Bj`5D.slevel <= p_ptr->lev) X`09`09 i++; X`09 `7D X X`09 if (new_spells > i) X`09 new_spells = i; X`09`7D X `7D X else if (new_spells < 0) X `7B X /* forget spells until new_spells zero or no more spells know, spells X`09 are forgotten in the opposite order that they were learned */ X for (i = 31; new_spells && spell_learned; i--) X`09`7B X`09 /* j is the (i+1)th spell learned */ X`09 j = spell_order`5Bi`5D; X`09 /* shifting by amounts greater than number of bits in long gives X`09 an undefined result, so don't shift for unknown spells */ X`09 if (j == 99) X`09 mask = 0x0; X`09 else X`09 mask = 1L << j; X`09 if (mask & spell_learned) X`09 `7B X`09 spell_learned &= `7Emask; X`09 spell_forgotten `7C= mask; X`09 new_spells++; X`09 (void) sprintf(tmp_str, "You have forgotten the %s of %s.", p, X`09`09`09 spell_names`5Bj+offset`5D); X`09 msg_print(tmp_str); X`09 `7D X`09`7D X X new_spells = 0; X `7D X X if (new_spells != py.flags.new_spells) X `7B X if (new_spells > 0 && py.flags.new_spells == 0) X`09`7B X`09 (void) sprintf(tmp_str, "You can learn some new %ss now.", p); X`09 msg_print(tmp_str); X`09`7D X X py.flags.new_spells = new_spells; X py.flags.status `7C= PY_STUDY; X `7D X`7D X X X/* gain spells when player wants to`09`09- jw */ Xvoid gain_spells() X`7B X char query; X int stat, diff_spells, new_spells; X int spells`5B31`5D, offset, last_known; X register int i, j; X register int32u spell_flag, mask; X vtype tmp_str; X struct misc *p_ptr; X register spell_type *msp_ptr; X X /* Priests don't need light because they get spells from their god, X so only fail when can't see if player has MAGE spells. This check X is done below. */ X if (py.flags.confused > 0) X `7B X msg_print("You are too confused."); X return; X `7D X X new_spells = py.flags.new_spells; X diff_spells = 0; X p_ptr = &py.misc; X msp_ptr = &magic_spell`5Bp_ptr->pclass-1`5D`5B0`5D; X if (class`5Bp_ptr->pclass`5D.spell == MAGE) X `7B X stat = A_INT; X offset = SPELL_OFFSET; X X /* People with MAGE spells can't learn spells if they can't read their X`09 books. */ X if (py.flags.blind > 0) X`09`7B X`09 msg_print("You can't see to read your spell book!"); X`09 return; X`09`7D X else if (no_light()) X`09`7B X`09 msg_print("You have no light to read by."); X`09 return; X`09`7D X `7D X else X `7B X stat = A_WIS; X offset = PRAYER_OFFSET; X `7D X X for (last_known = 0; last_known < 32; last_known++) X if (spell_order`5Blast_known`5D == 99) X break; X X if (!new_spells) X `7B X (void) sprintf(tmp_str, "You can't learn any new %ss!", X`09`09 (stat == A_INT ? "spell" : "prayer")); X msg_print(tmp_str); X free_turn_flag = TRUE; X `7D X else X `7B X /* determine which spells player can learn */ X /* mages need the book to learn a spell, priests do not need the book V */ X if (stat == A_INT) X`09`7B X`09 spell_flag = 0; X`09 for (i = 0; i < inven_ctr; i++) X`09 if (inventory`5Bi`5D.tval == TV_MAGIC_BOOK) X`09 spell_flag `7C= inventory`5Bi`5D.flags; X`09`7D X else X`09spell_flag = 0x7FFFFFFF; X X /* clear bits for spells already learned */ X spell_flag &= `7Espell_learned; X X mask = 0x1; X i = 0; X for (j = 0, mask = 0x1; spell_flag; mask <<= 1, j++) X`09if (spell_flag & mask) X`09 `7B X`09 spell_flag &= `7Emask; X`09 if (msp_ptr`5Bj`5D.slevel <= p_ptr->lev) X`09 `7B X`09`09spells`5Bi`5D = j; X`09`09i++; X`09 `7D X`09 `7D X X if (new_spells > i) X`09`7B X`09 msg_print("You seem to be missing a book."); X`09 diff_spells = new_spells - i; X`09 new_spells = i; X`09`7D X if (new_spells == 0) X`09; X else if (stat == A_INT) X`09`7B X`09 /* get to choose which mage spells will be learned */ X`09 save_screen(); X`09 print_spells (spells, i, FALSE, -1); X`09 while (new_spells && get_com ("Learn which spell?", &query)) X`09 `7B X`09 j = query - 'a'; X`09 /* test j < 23 in case i is greater than 22, only 22 spells X`09`09 are actually shown on the screen, so limit choice to those */ X`09 if (j >= 0 && j < i && j < 22) X`09`09`7B X`09`09 new_spells--; X`09`09 spell_learned `7C= 1L << spells`5Bj`5D; X`09`09 spell_order`5Blast_known++`5D = spells`5Bj`5D; X`09`09 for (; j <= i-1; j++) X`09`09 spells`5Bj`5D = spells`5Bj+1`5D; X`09`09 i--; X`09`09 erase_line (j+1, 31); X`09`09 print_spells (spells, i, FALSE, -1); X`09`09`7D X`09 else X`09`09bell(); X`09 `7D X`09 restore_screen(); X`09`7D X else X`09`7B X`09 /* pick a prayer at random */ X`09 while (new_spells) X`09 `7B X`09 j = randint(i) - 1; X`09 spell_learned `7C= 1L << spells`5Bj`5D; X`09 spell_order`5Blast_known++`5D = spells`5Bj`5D; X`09 (void) sprintf (tmp_str, X`09`09`09 "You have learned the prayer of %s.", X`09`09`09 spell_names`5Bspells`5Bj`5D+offset`5D); +-+-+-+-+-+-+-+- END OF PART 35 +-+-+-+-+-+-+-+-