-+-+-+-+-+-+-+-+ START OF PART 36 -+-+-+-+-+-+-+-+ X`09 msg_print(tmp_str); X`09 for (; j <= i-1; j++) X`09`09spells`5Bj`5D = spells`5Bj+1`5D; X`09 i--; X`09 new_spells--; X`09 `7D X`09`7D X py.flags.new_spells = new_spells + diff_spells; X if (py.flags.new_spells == 0) X`09py.flags.status `7C= PY_STUDY; X /* set the mana for first level characters when they learn their X`09 first spell */ X if (py.misc.mana == 0) X`09calc_mana(stat); X `7D X`7D X X X/* Gain some mana if you know at least one spell`09-RAK-`09*/ Xvoid calc_mana(stat) Xint stat; X`7B X register int new_mana, levels; X register struct misc *p_ptr; X register int32 value; X#ifdef ATARIST_MWC X int32u holder; X#endif X X p_ptr = &py.misc; X if (spell_learned != 0) X `7B X levels = p_ptr->lev - class`5Bp_ptr->pclass`5D.first_spell_lev + 1; X switch(stat_adj(stat)) X`09`7B X`09case 0: new_mana = 0; break; X`09case 1: case 2: new_mana = 1 * levels; break; X`09case 3: new_mana = 3 * levels / 2; break; X`09case 4: new_mana = 2 * levels; break; X`09case 5: new_mana = 5 * levels / 2; break; X`09case 6: new_mana = 3 * levels; break; X`09case 7: new_mana = 4 * levels; break; X`09`7D X /* increment mana by one, so that first level chars have 2 mana */ X if (new_mana > 0) X`09new_mana++; X X /* mana can be zero when creating character */ X if (p_ptr->mana != new_mana) X`09`7B X`09 if (p_ptr->mana != 0) X`09 `7B X`09 /* change current mana proportionately to change of max mana, X`09`09 divide first to avoid overflow, little loss of accuracy */ X`09 value = (((long)p_ptr->cmana << 16) + p_ptr->cmana_frac) X`09`09/ p_ptr->mana * new_mana; X`09 p_ptr->cmana = value >> 16; X`09 p_ptr->cmana_frac = value & 0xFFFF; X`09 `7D X`09 else X`09 `7B X`09 p_ptr->cmana = new_mana; X`09 p_ptr->cmana_frac = 0; X`09 `7D X`09 p_ptr->mana = new_mana; X`09 /* can't print mana here, may be in store or inventory mode */ X#ifdef ATARIST_MWC X`09 py.flags.status `7C= (holder = PY_MANA); X#else X`09 py.flags.status `7C= PY_MANA; X#endif X`09`7D X `7D X else if (p_ptr->mana != 0) X `7B X p_ptr->mana = 0; X p_ptr->cmana = 0; X /* can't print mana here, may be in store or inventory mode */ X#ifdef ATARIST_MWC X py.flags.status `7C= (holder = PY_MANA); X#else X py.flags.status `7C= PY_MANA; X#endif X `7D X`7D X X X/* Increases hit points and level`09`09`09-RAK-`09*/ Xstatic void gain_level() X`7B X register int32 dif_exp, need_exp; X vtype out_val; X register struct misc *p_ptr; X register class_type *c_ptr; X X p_ptr = &py.misc; X p_ptr->lev++; X (void) sprintf(out_val, "Welcome to level %d.", (int)p_ptr->lev); X msg_print(out_val); X calc_hitpoints(); X X need_exp = player_exp`5Bp_ptr->lev-1`5D * p_ptr->expfact / 100; X if (p_ptr->exp > need_exp) X `7B X /* lose some of the 'extra' exp when gain a level */ X dif_exp = p_ptr->exp - need_exp; X p_ptr->exp = need_exp + (dif_exp / 2); X `7D X prt_level(); X prt_title(); X c_ptr = &class`5Bp_ptr->pclass`5D; X if (c_ptr->spell == MAGE) X `7B X calc_spells(A_INT); X calc_mana(A_INT); X `7D X else if (c_ptr->spell == PRIEST) X `7B X calc_spells(A_WIS); X calc_mana(A_WIS); X `7D X`7D X X/* Prints experience`09`09`09`09`09-RAK-`09*/ Xvoid prt_experience() X`7B X register struct misc *p_ptr; X X p_ptr = &py.misc; X if (p_ptr->exp > MAX_EXP) X p_ptr->exp = MAX_EXP; X X if (p_ptr->lev < MAX_PLAYER_LEVEL) X while ((player_exp`5Bp_ptr->lev-1`5D * p_ptr->expfact / 100) <= p_ptr->e Vxp) X gain_level(); X X if (p_ptr->exp > p_ptr->max_exp) X p_ptr->max_exp = p_ptr->exp; X X prt_long(p_ptr->exp, 14, STAT_COLUMN+6); X`7D X X X/* Calculate the players hit points */ Xvoid calc_hitpoints() X`7B X register int hitpoints; X register struct misc *p_ptr; X register int32 value; X#ifdef ATARIST_MWC X int32u holder; X#endif X X p_ptr = &py.misc; X hitpoints = player_hp`5Bp_ptr->lev-1`5D + (con_adj() * p_ptr->lev); X /* always give at least one point per level + 1 */ X if (hitpoints < (p_ptr->lev + 1)) X hitpoints = p_ptr->lev + 1; X X if (py.flags.status & PY_HERO) X hitpoints += 10; X if (py.flags.status & PY_SHERO) X hitpoints += 20; X X /* mhp can equal zero while character is being created */ X if ((hitpoints != p_ptr->mhp) && (p_ptr->mhp != 0)) X `7B X /* change current hit points proportionately to change of mhp, X`09 divide first to avoid overflow, little loss of accuracy */ X value = (((long)p_ptr->chp << 16) + p_ptr->chp_frac) / p_ptr->mhp X`09* hitpoints; X p_ptr->chp = value >> 16; X p_ptr->chp_frac = value & 0xFFFF; X p_ptr->mhp = hitpoints; X X /* can't print hit points here, may be in store or inventory mode */ X#ifdef ATARIST_MWC X py.flags.status `7C= (holder = PY_HP); X#else X py.flags.status `7C= PY_HP; X#endif X `7D X`7D X X X/* Inserts a string into a string`09`09`09`09*/ Xvoid insert_str(object_str, mtc_str, insert) Xchar *object_str, *mtc_str, *insert; X`7B X int obj_len; X char *bound, *pc; X register int i, mtc_len; X register char *temp_obj, *temp_mtc; X char out_val`5B80`5D; X X mtc_len = strlen(mtc_str); X obj_len = strlen(object_str); X bound = object_str + obj_len - mtc_len; X for (pc = object_str; pc <= bound; pc++) X `7B X temp_obj = pc; X temp_mtc = mtc_str; X for (i = 0; i < mtc_len; i++) X`09if (*temp_obj++ != *temp_mtc++) X`09 break; X if (i == mtc_len) X`09break; X `7D X X if (pc <= bound) X `7B X#ifdef __TURBOC__ X /* Avoid complaint about possible loss of significance. */ X (void) strncpy(out_val, object_str, (size_t)(pc-object_str)); X#else X (void) strncpy(out_val, object_str, (pc-object_str)); X#endif X /* Turbo C needs int for array index. */ X out_val`5B(int)(pc-object_str)`5D = '\0'; X if (insert) X`09(void) strcat(out_val, insert); X (void) strcat(out_val, (char *)(pc+mtc_len)); X (void) strcpy(object_str, out_val); X `7D X`7D X X X#if 0 X/* this is no longer used anywhere */ X/* Inserts a number into a string`09`09`09`09*/ Xvoid insert_num(object_str, mtc_str, number, show_sign) Xchar *object_str; Xregister char *mtc_str; Xint number; Xint show_sign; X`7B X int mlen; X vtype str1, str2; X register char *string, *tmp_str; X int flag; X X flag = 1; X mlen = strlen(mtc_str); X tmp_str = object_str; X do X `7B X string = index(tmp_str, mtc_str`5B0`5D); X if (string == CNIL) X`09flag = 0; X else X`09`7B X`09 flag = strncmp(string, mtc_str, mlen); X`09 if (flag) X`09 tmp_str = string+1; X`09`7D X `7D X while (flag); X if (string) X `7B X#ifdef __TURBOC__ X /* Avoid complaint about possible loss of significance. */ X (void) strncpy(str1, object_str, (size_t)(string - object_str)); X#else X (void) strncpy(str1, object_str, string - object_str); X#endif X /* Turbo C needs int for array index. */ X str1`5B(int)(string - object_str)`5D = '\0'; X (void) strcpy(str2, string + mlen); X if ((number >= 0) && (show_sign)) X`09(void) sprintf(object_str, "%s+%d%s", str1, number, str2); X else X`09(void) sprintf(object_str, "%s%d%s", str1, number, str2); X `7D X`7D X#endif X Xvoid insert_lnum(object_str, mtc_str, number, show_sign) Xchar *object_str; Xregister char *mtc_str; Xint32 number; Xint show_sign; X`7B X int mlen; X vtype str1, str2; X register char *string, *tmp_str; X int flag; X X flag = 1; X mlen = strlen(mtc_str); X tmp_str = object_str; X do X `7B X string = index(tmp_str, mtc_str`5B0`5D); X if (string == 0) X`09flag = 0; X else X`09`7B X`09 flag = strncmp(string, mtc_str, mlen); X`09 if (flag) X`09 tmp_str = string+1; X`09`7D X `7D X while (flag); X if (string) X `7B X (void) strncpy(str1, object_str, string - object_str); X str1`5Bstring - object_str`5D = '\0'; X (void) strcpy(str2, string + mlen); X if ((number >= 0) && (show_sign)) X`09(void) sprintf(object_str, "%s+%ld%s", str1, number, str2); X else X`09(void) sprintf(object_str, "%s%ld%s", str1, number, str2); X `7D X`7D X X X/* lets anyone enter wizard mode after a disclaimer...`09`09- JEW - */ Xint enter_wiz_mode() X`7B X register int answer; X X if (!noscore) X `7B X msg_print("Wizard mode is for debugging and experimenting."); X answer = get_check( X`09"The game will not be scored if you enter wizard mode. Are you sure?"); X `7D X if (noscore `7C`7C answer) X `7B X noscore `7C= 0x2; X wizard = TRUE; X return(TRUE); X `7D X return(FALSE); X`7D X X X/* Weapon weight VS strength and dexterity`09`09-RAK-`09*/ Xint attack_blows(weight, wtohit) Xint weight; Xint *wtohit; X`7B X register int adj_weight; X register int str_index, dex_index, s, d; X X s = py.stats.use_stat`5BA_STR`5D; X d = py.stats.use_stat`5BA_DEX`5D; X if (s * 15 < weight) X `7B X *wtohit = s * 15 - weight; X return 1; X `7D X else X `7B X *wtohit = 0; X if (d < 10)`09 dex_index = 0; X else if (d < 19)`09 dex_index = 1; X else if (d < 68)`09 dex_index = 2; X else if (d < 108)`09 dex_index = 3; X else if (d < 118)`09 dex_index = 4; X else`09`09 dex_index = 5; X adj_weight = (s * 10 / weight); X if (adj_weight < 2)`09str_index = 0; X else if (adj_weight < 3)`09str_index = 1; X else if (adj_weight < 4)`09str_index = 2; X else if (adj_weight < 5)`09str_index = 3; X else if (adj_weight < 7)`09str_index = 4; X else if (adj_weight < 9)`09str_index = 5; X else`09`09`09str_index = 6; X return (int)blows_table`5Bstr_index`5D`5Bdex_index`5D; X `7D X`7D X X X/* Special damage due to magical abilities of object`09-RAK-`09*/ Xint tot_dam(i_ptr, tdam, monster) Xregister inven_type *i_ptr; Xregister int tdam; Xint monster; X`7B X register creature_type *m_ptr; X register recall_type *r_ptr; X#ifdef ATARIST_MWC X int32u holder; X#endif X X#ifdef ATARIST_MWC X if ((i_ptr->flags & (holder = TR_EGO_WEAPON)) && X#else X if ((i_ptr->flags & TR_EGO_WEAPON) && X#endif X (((i_ptr->tval >= TV_SLING_AMMO) && (i_ptr->tval <= TV_ARROW)) `7C`7C X ((i_ptr->tval >= TV_HAFTED) && (i_ptr->tval <= TV_SWORD)) `7C`7C X (i_ptr->tval == TV_FLASK))) X `7B X m_ptr = &c_list`5Bmonster`5D; X r_ptr = &c_recall`5Bmonster`5D; X /* Slay Dragon */ X if ((m_ptr->cdefense & CD_DRAGON) && (i_ptr->flags & TR_SLAY_DRAGON)) X`09`7B X`09 tdam = tdam * 4; X`09 r_ptr->r_cdefense `7C= CD_DRAGON; X`09`7D X /* Slay Undead */ X#ifdef ATARIST_MWC X else if ((m_ptr->cdefense & CD_UNDEAD) X`09 && (i_ptr->flags & (holderr = TR_SLAY_UNDEAD))) X#else X else if ((m_ptr->cdefense & CD_UNDEAD) X`09 && (i_ptr->flags & TR_SLAY_UNDEAD)) X#endif X`09`7B X`09 tdam = tdam * 3; X`09 r_ptr->r_cdefense `7C= CD_UNDEAD; X`09`7D X /* Slay Animal */ X else if ((m_ptr->cdefense & CD_ANIMAL) X`09 && (i_ptr->flags & TR_SLAY_ANIMAL)) X`09`7B X`09 tdam = tdam * 2; X`09 r_ptr->r_cdefense `7C= CD_ANIMAL; X`09`7D X /* Slay Evil */ X else if ((m_ptr->cdefense & CD_EVIL) && (i_ptr->flags & TR_SLAY_EVIL)) X`09`7B X`09 tdam = tdam * 2; X`09 r_ptr->r_cdefense `7C= CD_EVIL; X`09`7D X /* Frost`09 */ X#ifdef ATARIST_MWC X else if ((m_ptr->cdefense & CD_FROST) X`09 && (i_ptr->flags & (holder = TR_FROST_BRAND))) X#else X else if ((m_ptr->cdefense & CD_FROST) X`09 && (i_ptr->flags & TR_FROST_BRAND)) X#endif X`09`7B X`09 tdam = tdam * 3 / 2; X`09 r_ptr->r_cdefense `7C= CD_FROST; X`09`7D X /* Fire`09 */ X#ifdef ATARIST_MWC X else if ((m_ptr->cdefense & CD_FIRE) X`09 && (i_ptr->flags & (holder = TR_FLAME_TONGUE))) X#else X else if ((m_ptr->cdefense & CD_FIRE) X`09 && (i_ptr->flags & TR_FLAME_TONGUE)) X#endif X`09`7B X`09 tdam = tdam * 3 / 2; X`09 r_ptr->r_cdefense `7C= CD_FIRE; X`09`7D X `7D X return(tdam); X`7D X X X/* Critical hits, Nasty way to die.`09`09`09-RAK-`09*/ Xint critical_blow(weight, plus, dam, attack_type) Xregister int weight, plus, dam; Xint attack_type; X`7B X register int critical; X X critical = dam; X /* Weight of weapon, plusses to hit, and character level all`09 */ X /* contribute to the chance of a critical`09`09`09 */ X if (randint(5000) <= (int)(weight + 5 * plus X`09`09`09 + (class_level_adj`5Bpy.misc.pclass`5D`5Battack_type`5D X`09`09`09`09* py.misc.lev))) X `7B X weight += randint(650); X if (weight < 400) X`09`7B X`09 critical = 2*dam + 5; X`09 msg_print("It was a good hit! (x2 damage)"); X`09`7D X else if (weight < 700) X`09`7B X`09 critical = 3*dam + 10; X`09 msg_print("It was an excellent hit! (x3 damage)"); X`09`7D X else if (weight < 900) X`09`7B X`09 critical = 4*dam + 15; X`09 msg_print("It was a superb hit! (x4 damage)"); X`09`7D X else X`09`7B X`09 critical = 5*dam + 20; X`09 msg_print("It was a *GREAT* hit! (x5 damage)"); X`09`7D X `7D X return(critical); X`7D X X X/* Given direction "dir", returns new row, column location -RAK- */ Xint mmove(dir, y, x) Xint dir; Xregister int *y, *x; X`7B X register int new_row, new_col; X int bool; X X switch(dir) X `7B X case 1: X new_row = *y + 1; X new_col = *x - 1; X break; X case 2: X new_row = *y + 1; X new_col = *x; X break; X case 3: X new_row = *y + 1; X new_col = *x + 1; X break; X case 4: X new_row = *y; X new_col = *x - 1; X break; X case 5: X new_row = *y; X new_col = *x; X break; X case 6: X new_row = *y; X new_col = *x + 1; X break; X case 7: X new_row = *y - 1; X new_col = *x - 1; X break; X case 8: X new_row = *y - 1; X new_col = *x; X break; X case 9: X new_row = *y - 1; X new_col = *x + 1; X break; X `7D X bool = FALSE; X if ((new_row >= 0) && (new_row < cur_height) +-+-+-+-+-+-+-+- END OF PART 36 +-+-+-+-+-+-+-+-