X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=src%2Fdungeon.c;h=9485be2d8b14a2a384d50d795ebb9c8234189a71;hb=4c1a6c7f571b1ba707fbc5f5dd0d35b6e3b275b4;hp=2f772a1a009715dc72ab5d7a5473f9195e15c624;hpb=5cf15a682d7377bfa5b3e98f4a1c7a01ae74b2d0;p=hengband%2Fhengband.git diff --git a/src/dungeon.c b/src/dungeon.c index 2f772a1a0..9485be2d8 100644 --- a/src/dungeon.c +++ b/src/dungeon.c @@ -869,9 +869,10 @@ static void regenhp(int percent) /* * Regenerate mana points */ -static void regenmana(int percent) +static void regenmana(int upkeep_factor, int regen_amount) { s32b old_csp = p_ptr->csp; + s32b regen_rate = regen_amount * 100 - upkeep_factor * PY_REGEN_NORMAL; /* * Excess mana will decay 32 times faster than normal @@ -898,11 +899,11 @@ static void regenmana(int percent) } /* Regenerating mana (unless the player has excess mana) */ - else if (percent > 0) + else if (regen_rate > 0) { /* (percent/100) is the Regen factor in unit (1/2^16) */ s32b new_mana = 0; - u32b new_mana_frac = (p_ptr->msp * percent / 100 + PY_REGEN_MNBASE); + u32b new_mana_frac = (p_ptr->msp * regen_rate / 100 + PY_REGEN_MNBASE); /* Convert the unit (1/2^16) to (1/2^32) */ s64b_LSHIFT(new_mana, new_mana_frac, 16); @@ -920,11 +921,11 @@ static void regenmana(int percent) /* Reduce mana (even when the player has excess mana) */ - if (percent < 0) + if (regen_rate < 0) { /* PY_REGEN_NORMAL is the Regen factor in unit (1/2^16) */ s32b reduce_mana = 0; - u32b reduce_mana_frac = (p_ptr->msp * PY_REGEN_NORMAL + PY_REGEN_MNBASE); + u32b reduce_mana_frac = (p_ptr->msp * (-1) * regen_rate / 100 + PY_REGEN_MNBASE); /* Convert the unit (1/2^16) to (1/2^32) */ s64b_LSHIFT(reduce_mana, reduce_mana_frac, 16); @@ -959,17 +960,22 @@ static void regenmana(int percent) /* * Regenerate magic + * regen_amount: PY_REGEN_NORMAL * 2 (if resting) * 2 (if having regenarate) */ -static void regenmagic(int percent) +static void regenmagic(int regen_amount) { - s32b new_mana; + s32b new_mana; int i; + int dev = 30; + int mult = (dev + adj_mag_mana[p_ptr->stat_ind[A_INT]]); /* x1 to x2 speed bonus for recharging */ for (i = 0; i < EATER_EXT*2; i++) { if (!p_ptr->magic_num2[i]) continue; if (p_ptr->magic_num1[i] == ((long)p_ptr->magic_num2[i] << 16)) continue; - new_mana = ((long)p_ptr->magic_num2[i]+adj_mag_mana[A_INT]+13) * percent / 8; + + /* Increase remaining charge number like float value */ + new_mana = (regen_amount * mult * ((long)p_ptr->magic_num2[i] + 13)) / (dev * 8); p_ptr->magic_num1[i] += new_mana; /* Check maximum charge */ @@ -983,7 +989,13 @@ static void regenmagic(int percent) { if (!p_ptr->magic_num1[i]) continue; if (!p_ptr->magic_num2[i]) continue; - p_ptr->magic_num1[i] -= (long)(p_ptr->magic_num2[i] * (adj_mag_mana[A_INT] + 10)) * EATER_ROD_CHARGE/16; + + /* Decrease remaining period for charging */ + new_mana = (regen_amount * mult * ((long)p_ptr->magic_num2[i] + 10) * EATER_ROD_CHARGE) + / (dev * 16 * PY_REGEN_NORMAL); + p_ptr->magic_num1[i] -= new_mana; + + /* Check minimum remaining period for charging */ if (p_ptr->magic_num1[i] < 0) p_ptr->magic_num1[i] = 0; wild_regen = 20; } @@ -1173,17 +1185,50 @@ void leave_quest_check(void) { quest[leaving_quest].status = QUEST_STATUS_FAILED; quest[leaving_quest].complev = (byte)p_ptr->lev; - if (quest[leaving_quest].type == QUEST_TYPE_RANDOM) + + /* Additional settings */ + switch (quest[leaving_quest].type) { + case QUEST_TYPE_TOWER: + quest[QUEST_TOWER1].status = QUEST_STATUS_FAILED; + quest[QUEST_TOWER1].complev = (byte)p_ptr->lev; + break; + case QUEST_TYPE_FIND_ARTIFACT: + a_info[quest[leaving_quest].k_idx].gen_flags &= ~(TRG_QUESTITEM); + break; + case QUEST_TYPE_RANDOM: r_info[quest[leaving_quest].r_idx].flags1 &= ~(RF1_QUESTOR); - if (record_rand_quest) - do_cmd_write_nikki(NIKKI_RAND_QUEST_F, leaving_quest, NULL); /* Floor of random quest will be blocked */ prepare_change_floor_mode(CFM_NO_RETURN); + break; + } + + /* Record finishing a quest */ + if (quest[leaving_quest].type == QUEST_TYPE_RANDOM) + { + if (record_rand_quest) do_cmd_write_nikki(NIKKI_RAND_QUEST_F, leaving_quest, NULL); + } + else + { + if (record_fix_quest) do_cmd_write_nikki(NIKKI_FIX_QUEST_F, leaving_quest, NULL); + } + } +} + +void leave_tower_check(void) +{ + leaving_quest = p_ptr->inside_quest; + /* Check for Tower Quest */ + if (leaving_quest && + (quest[leaving_quest].type == QUEST_TYPE_TOWER) && + (quest[QUEST_TOWER1].status != QUEST_STATUS_COMPLETED)) + { + if(quest[leaving_quest].type == QUEST_TYPE_TOWER) + { + quest[QUEST_TOWER1].status = QUEST_STATUS_FAILED; + quest[QUEST_TOWER1].complev = (byte)p_ptr->lev; } - else if (record_fix_quest) - do_cmd_write_nikki(NIKKI_FIX_QUEST_F, leaving_quest, NULL); } } @@ -1374,7 +1419,7 @@ static void recharged_notice(object_type *o_ptr) static void check_music(void) { - magic_type *s_ptr; + const magic_type *s_ptr; int spell; s32b need_mana; u32b need_mana_frac; @@ -1466,6 +1511,17 @@ static object_type *choose_cursed_obj_name(u32b flag) choices[number] = i; number++; } + else if ((flag == TRC_ADD_L_CURSE) || (flag == TRC_ADD_H_CURSE)) + { + u32b cf = (flag == TRC_ADD_L_CURSE) ? TR_ADD_L_CURSE : TR_ADD_H_CURSE; + u32b flgs[4]; + object_flags(o_ptr, flgs); + if (have_flag(flgs, cf)) + { + choices[number] = i; + number++; + } + } } /* Choice one of them */ @@ -1481,7 +1537,6 @@ static void process_world_aux_hp_and_sp(void) feature_type *f_ptr = &f_info[cave[py][px].feat]; bool cave_no_regen = FALSE; int upkeep_factor = 0; - int upkeep_regen; /* Default regeneration */ int regen_amount = PY_REGEN_NORMAL; @@ -1820,8 +1875,7 @@ take_hit(DAMAGE_NOESCAPE, damage, " } /* Regenerate the mana */ - upkeep_regen = (100 - upkeep_factor) * regen_amount; - regenmana(upkeep_regen); + regenmana(upkeep_factor, regen_amount); /* Recharge magic eater's power */ @@ -2850,7 +2904,6 @@ static void process_world_aux_mutation(void) } } - /* * Handle curse effects once every 10 game turns */ @@ -3274,13 +3327,10 @@ static void process_world_aux_movement(void) disturb(0, 0); /* Determine the level */ - if (dun_level || p_ptr->inside_quest) + if (dun_level || p_ptr->inside_quest || p_ptr->enter_dungeon) { -#ifdef JP -msg_print("¾å¤Ë°ú¤ÃÄ¥¤ê¤¢¤²¤é¤ì¤ë´¶¤¸¤¬¤¹¤ë¡ª"); -#else - msg_print("You feel yourself yanked upwards!"); -#endif + msg_print(_("¾å¤Ë°ú¤ÃÄ¥¤ê¤¢¤²¤é¤ì¤ë´¶¤¸¤¬¤¹¤ë¡ª", + "You feel yourself yanked upwards!")); if (dungeon_type) p_ptr->recall_dungeon = dungeon_type; if (record_stair) @@ -3290,6 +3340,7 @@ msg_print(" dungeon_type = 0; leave_quest_check(); + leave_tower_check(); p_ptr->inside_quest = 0; @@ -3297,11 +3348,8 @@ msg_print(" } else { -#ifdef JP -msg_print("²¼¤Ë°ú¤­¤º¤ê¹ß¤í¤µ¤ì¤ë´¶¤¸¤¬¤¹¤ë¡ª"); -#else - msg_print("You feel yourself yanked downwards!"); -#endif + msg_print(_("²¼¤Ë°ú¤­¤º¤ê¹ß¤í¤µ¤ì¤ë´¶¤¸¤¬¤¹¤ë¡ª", + "You feel yourself yanked downwards!")); dungeon_type = p_ptr->recall_dungeon; @@ -4771,7 +4819,7 @@ msg_print(" else if (p_ptr->pclass == CLASS_SMITH) do_cmd_kaji(TRUE); else if (p_ptr->pclass == CLASS_MAGIC_EATER) - do_cmd_magic_eater(TRUE); + do_cmd_magic_eater(TRUE, FALSE); else if (p_ptr->pclass == CLASS_SNIPER) do_cmd_snipe_browse(); else do_cmd_browse(); @@ -4873,7 +4921,7 @@ msg_print(" else if (p_ptr->pclass == CLASS_IMITATOR) do_cmd_mane(FALSE); else if (p_ptr->pclass == CLASS_MAGIC_EATER) - do_cmd_magic_eater(FALSE); + do_cmd_magic_eater(FALSE, FALSE); else if (p_ptr->pclass == CLASS_SAMURAI) do_cmd_hissatsu(); else if (p_ptr->pclass == CLASS_BLUE_MAGE) @@ -5435,6 +5483,34 @@ static void pack_overflow(void) } } +/* + * process the effects per 100 energy at player speed. + */ +static void process_upkeep_with_speed(void) +{ + /* Give the player some energy */ + if (!load && p_ptr->enchant_energy_need > 0 && !p_ptr->leaving) + { + p_ptr->enchant_energy_need -= SPEED_TO_ENERGY(p_ptr->pspeed); + } + + /* No turn yet */ + if (p_ptr->enchant_energy_need > 0) return; + + while (p_ptr->enchant_energy_need <= 0) + { + /* Handle the player song */ + if (!load) check_music(); + + /* Hex - Handle the hex spells */ + if (!load) check_hex(); + if (!load) revenge_spell(); + + /* There is some randomness of needed energy */ + p_ptr->enchant_energy_need += ENERGY_NEED(); + } +} + /* * Process the player @@ -5675,14 +5751,7 @@ msg_print(" /* Handle "p_ptr->update" and "p_ptr->redraw" and "p_ptr->window" */ handle_stuff(); } - - /* Handle the player song */ - if (!load) check_music(); - - /* Hex - Handle the hex spells */ - if (!load) check_hex(); - if (!load) revenge_spell(); - + load = FALSE; /* Fast */ @@ -6270,9 +6339,11 @@ msg_print(" /* Hack -- Compress the object list occasionally */ if (o_cnt + 32 < o_max) compact_objects(0); - + /* Process the player */ process_player(); + + process_upkeep_with_speed(); /* Handle "p_ptr->notice" */ notice_stuff();