OSDN Git Service

[Refactor] #37353 forget_lite() を floor_event() に移動。
[hengband/hengband.git] / src / floor-save.c
index 122a56d..b224c2a 100644 (file)
 
 #include "angband.h"
 #include "floor.h"
+#include "floor-events.h"
 #include "generate.h"
 #include "grid.h"
 #include "monster.h"
 #include "quest.h"
 #include "wild.h"
 #include "spells-floor.h"
-
+#include "monster-status.h"
+#include "object-hook.h"
+#include "cmd-pet.h"
+#include "cmd-basic.h"
 
 static FLOOR_IDX new_floor_id;  /*!<次のフロアのID / floor_id of the destination */
 static u32b change_floor_mode;  /*!<フロア移行処理に関するフラグ / Mode flags for changing floor */
@@ -194,8 +198,6 @@ saved_floor_type *get_sf_ptr(FLOOR_IDX floor_id)
 static void kill_saved_floor(saved_floor_type *sf_ptr)
 {
        char floor_savefile[1024];
-
-       /* Paranoia */
        if (!sf_ptr) return;
 
        /* Already empty */
@@ -396,7 +398,7 @@ static void preserve_pet(void)
                {
                        monster_type *m_ptr = &current_floor_ptr->m_list[i];
 
-                       if (!m_ptr->r_idx) continue;
+                       if (!monster_is_valid(m_ptr)) continue;
                        if (!is_pet(m_ptr)) continue;
                        if (i == p_ptr->riding) continue;
 
@@ -446,7 +448,7 @@ static void preserve_pet(void)
                        monster_type *m_ptr = &current_floor_ptr->m_list[i];
                        GAME_TEXT m_name[MAX_NLEN];
 
-                       if (!m_ptr->r_idx) continue;
+                       if (!monster_is_valid(m_ptr)) continue;
                        if (!is_pet(m_ptr)) continue;
                        if (!m_ptr->nickname) continue;
                        if (p_ptr->riding == i) continue;
@@ -497,7 +499,7 @@ void precalc_cur_num_of_pet(void)
                m_ptr = &party_mon[i];
 
                /* Skip empty monsters */
-               if (!m_ptr->r_idx) continue;
+               if (!monster_is_valid(m_ptr)) continue;
 
                /* Hack -- Increase the racial counter */
                real_r_ptr(m_ptr)->cur_num++;
@@ -564,8 +566,6 @@ static void place_pet(void)
                        m_ptr->fx = cx;
                        m_ptr->ml = TRUE;
                        m_ptr->mtimed[MTIMED_CSLEEP] = 0;
-
-                       /* Paranoia */
                        m_ptr->hold_o_idx = 0;
                        m_ptr->target_y = 0;
 
@@ -636,8 +636,7 @@ static void update_unique_artifact(s16b cur_floor_id)
                monster_race *r_ptr;
                monster_type *m_ptr = &current_floor_ptr->m_list[i];
 
-               /* Skip dead monsters */
-               if (!m_ptr->r_idx) continue;
+               if (!monster_is_valid(m_ptr)) continue;
 
                /* Extract real monster race */
                r_ptr = real_r_ptr(m_ptr);
@@ -737,12 +736,6 @@ static void get_out_monster(void)
 }
 
 /*!
- * マス構造体のspecial要素を利用する地形かどうかを判定するマクロ / Is this feature has special meaning (except floor_id) with g_ptr->special?
- */
-#define feat_uses_special(F) (have_flag(f_info[(F)].flags, FF_SPECIAL))
-
-
-/*!
  * @brief 新フロアに移動元フロアに繋がる階段を配置する / Virtually teleport onto the stairs that is connecting between two floors.
  * @param sf_ptr 移動元の保存フロア構造体参照ポインタ
  * @return なし
@@ -893,8 +886,7 @@ void leave_floor(void)
                monster_race *r_ptr;
                monster_type *m_ptr = &current_floor_ptr->m_list[i];
 
-               /* Skip dead monsters */
-               if (!m_ptr->r_idx) continue;
+               if (!monster_is_valid(m_ptr)) continue;
 
                /* Only maintain quest monsters */
                if (quest_r_idx != m_ptr->r_idx) continue;
@@ -1098,7 +1090,7 @@ void change_floor(void)
        panel_col_max = 0;
 
        /* Mega-Hack -- not ambushed on the wildness? */
-       ambush_flag = FALSE;
+       p_ptr->ambush_flag = FALSE;
 
        /* No saved floors (On the surface etc.) */
        if (!(change_floor_mode & CFM_SAVE_FLOORS) &&
@@ -1203,8 +1195,7 @@ void change_floor(void)
                                monster_race *r_ptr;
                                monster_type *m_ptr = &current_floor_ptr->m_list[i];
 
-                               /* Skip dead monsters */
-                               if (!m_ptr->r_idx) continue;
+                               if (!monster_is_valid(m_ptr)) continue;
 
                                if (!is_pet(m_ptr))
                                {
@@ -1386,10 +1377,10 @@ void change_floor(void)
                wiz_lite((bool)(p_ptr->pclass == CLASS_NINJA));
 
        /* Remember when this level was "created" */
-       old_turn = current_world_ptr->game_turn;
+       current_floor_ptr->generated_turn = current_world_ptr->game_turn;
 
        /* No dungeon feeling yet */
-       p_ptr->feeling_turn = old_turn;
+       p_ptr->feeling_turn = current_floor_ptr->generated_turn;
        p_ptr->feeling = 0;
 
        /* Clear all flags */
@@ -1397,130 +1388,3 @@ void change_floor(void)
 
        select_floor_music();
 }
-
-/*!
- * @brief プレイヤーの手による能動的な階段生成処理 /
- * Create stairs at or move previously created stairs into the player location.
- * @return なし
- */
-void stair_creation(void)
-{
-       saved_floor_type *sf_ptr;
-       saved_floor_type *dest_sf_ptr;
-
-       bool up = TRUE;
-       bool down = TRUE;
-       FLOOR_IDX dest_floor_id = 0;
-
-
-       /* Forbid up staircases on Ironman mode */
-       if (ironman_downward) up = FALSE;
-
-       /* Forbid down staircases on quest level */
-       if (quest_number(current_floor_ptr->dun_level) || (current_floor_ptr->dun_level >= d_info[p_ptr->dungeon_idx].maxdepth)) down = FALSE;
-
-       /* No effect out of standard dungeon floor */
-       if (!current_floor_ptr->dun_level || (!up && !down) ||
-           (p_ptr->inside_quest && is_fixed_quest_idx(p_ptr->inside_quest)) ||
-           p_ptr->inside_arena || p_ptr->inside_battle)
-       {
-               /* arena or quest */
-               msg_print(_("効果がありません!", "There is no effect!"));
-               return;
-       }
-
-       /* Artifacts resists */
-       if (!cave_valid_bold(p_ptr->y, p_ptr->x))
-       {
-               msg_print(_("床上のアイテムが呪文を跳ね返した。", "The object resists the spell."));
-               return;
-       }
-
-       /* Destroy all objects in the grid */
-       delete_object(p_ptr->y, p_ptr->x);
-
-       /* Extract current floor data */
-       sf_ptr = get_sf_ptr(p_ptr->floor_id);
-
-       /* Paranoia */
-       if (!sf_ptr)
-       {
-               /* No floor id? -- Create now! */
-               p_ptr->floor_id = get_new_floor_id();
-               sf_ptr = get_sf_ptr(p_ptr->floor_id);
-       } 
-
-       /* Choose randomly */
-       if (up && down)
-       {
-               if (randint0(100) < 50) up = FALSE;
-               else down = FALSE;
-       }
-
-       /* Destination is already fixed */
-       if (up)
-       {
-               if (sf_ptr->upper_floor_id) dest_floor_id = sf_ptr->upper_floor_id;
-       }
-       else
-       {
-               if (sf_ptr->lower_floor_id) dest_floor_id = sf_ptr->lower_floor_id;
-       }
-
-
-       /* Search old stairs leading to the destination */
-       if (dest_floor_id)
-       {
-               POSITION x, y;
-
-               for (y = 0; y < current_floor_ptr->height; y++)
-               {
-                       for (x = 0; x < current_floor_ptr->width; x++)
-                       {
-                               grid_type *g_ptr = &current_floor_ptr->grid_array[y][x];
-
-                               if (!g_ptr->special) continue;
-                               if (feat_uses_special(g_ptr->feat)) continue;
-                               if (g_ptr->special != dest_floor_id) continue;
-
-                               /* Remove old stairs */
-                               g_ptr->special = 0;
-                               cave_set_feat(y, x, feat_ground_type[randint0(100)]);
-                       }
-               }
-       }
-
-       /* No old destination -- Get new one now */
-       else
-       {
-               dest_floor_id = get_new_floor_id();
-
-               /* Fix it */
-               if (up)
-                       sf_ptr->upper_floor_id = dest_floor_id;
-               else
-                       sf_ptr->lower_floor_id = dest_floor_id;
-       }
-
-       /* Extract destination floor data */
-       dest_sf_ptr = get_sf_ptr(dest_floor_id);
-
-
-       /* Create a staircase */
-       if (up)
-       {
-               cave_set_feat(p_ptr->y, p_ptr->x,
-                       (dest_sf_ptr->last_visit && (dest_sf_ptr->dun_level <= current_floor_ptr->dun_level - 2)) ?
-                       feat_state(feat_up_stair, FF_SHAFT) : feat_up_stair);
-       }
-       else
-       {
-               cave_set_feat(p_ptr->y, p_ptr->x,
-                       (dest_sf_ptr->last_visit && (dest_sf_ptr->dun_level >= current_floor_ptr->dun_level + 2)) ?
-                       feat_state(feat_down_stair, FF_SHAFT) : feat_down_stair);
-       }
-
-
-       /* Connect this stairs to the destination */
-       current_floor_ptr->grid_array[p_ptr->y][p_ptr->x].special = dest_floor_id;
-}