OSDN Git Service

In Vault Quest, target weapons must not be auto-picked by diceboost.
[hengband/hengband.git] / src / dungeon.c
index 2f772a1..9485be2 100644 (file)
@@ -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();