OSDN Git Service

[Refactor] #39970 Reshaped world-movement-processor.c
authorHourier <hourier@users.sourceforge.jp>
Sun, 10 May 2020 13:14:01 +0000 (22:14 +0900)
committerHourier <hourier@users.sourceforge.jp>
Sun, 10 May 2020 13:14:01 +0000 (22:14 +0900)
src/world/world-movement-processor.c

index 6b338a3..afd42dc 100644 (file)
  * / Handle involuntary movement once every 10 game turns
  * @param creature_ptr プレーヤーへの参照ポインタ
  * @return なし
+ * @details
+ * Autosave BEFORE resetting the recall counter (rr9)
+ * The player is yanked up/down as soon as he loads the autosaved game.
  */
 void execute_recall(player_type* creature_ptr)
 {
+    if (creature_ptr->word_recall == 0)
+        return;
+
+    if (autosave_l && (creature_ptr->word_recall == 1) && !creature_ptr->phase_out)
+        do_cmd_save_game(creature_ptr, TRUE);
+
+    creature_ptr->word_recall--;
+    creature_ptr->redraw |= (PR_STATUS);
+    if (creature_ptr->word_recall != 0)
+        return;
+
+    disturb(creature_ptr, FALSE, TRUE);
     floor_type* floor_ptr = creature_ptr->current_floor_ptr;
-    if (creature_ptr->word_recall) {
-        /*
-                * HACK: Autosave BEFORE resetting the recall counter (rr9)
-                * The player is yanked up/down as soon as
-                * he loads the autosaved game.
-                */
-        if (autosave_l && (creature_ptr->word_recall == 1) && !creature_ptr->phase_out)
-            do_cmd_save_game(creature_ptr, TRUE);
-
-        creature_ptr->word_recall--;
-        creature_ptr->redraw |= (PR_STATUS);
-        if (!creature_ptr->word_recall) {
-            disturb(creature_ptr, FALSE, TRUE);
-            if (floor_ptr->dun_level || creature_ptr->current_floor_ptr->inside_quest || creature_ptr->enter_dungeon) {
-                msg_print(_("上に引っ張りあげられる感じがする!", "You feel yourself yanked upwards!"));
-                if (creature_ptr->dungeon_idx)
-                    creature_ptr->recall_dungeon = creature_ptr->dungeon_idx;
-                if (record_stair)
-                    exe_write_diary(creature_ptr, DIARY_RECALL, floor_ptr->dun_level, NULL);
-
-                floor_ptr->dun_level = 0;
-                creature_ptr->dungeon_idx = 0;
-                leave_quest_check(creature_ptr);
-                leave_tower_check(creature_ptr);
-                creature_ptr->current_floor_ptr->inside_quest = 0;
-                creature_ptr->leaving = TRUE;
-            } else {
-                msg_print(_("下に引きずり降ろされる感じがする!", "You feel yourself yanked downwards!"));
-                creature_ptr->dungeon_idx = creature_ptr->recall_dungeon;
-                if (record_stair)
-                    exe_write_diary(creature_ptr, DIARY_RECALL, floor_ptr->dun_level, NULL);
-
-                floor_ptr->dun_level = max_dlv[creature_ptr->dungeon_idx];
-                if (floor_ptr->dun_level < 1)
-                    floor_ptr->dun_level = 1;
-                if (ironman_nightmare && !randint0(666) && (creature_ptr->dungeon_idx == DUNGEON_ANGBAND)) {
-                    if (floor_ptr->dun_level < 50) {
-                        floor_ptr->dun_level *= 2;
-                    } else if (floor_ptr->dun_level < 99) {
-                        floor_ptr->dun_level = (floor_ptr->dun_level + 99) / 2;
-                    } else if (floor_ptr->dun_level > 100) {
-                        floor_ptr->dun_level = d_info[creature_ptr->dungeon_idx].maxdepth - 1;
-                    }
-                }
-
-                if (creature_ptr->wild_mode) {
-                    creature_ptr->wilderness_y = creature_ptr->y;
-                    creature_ptr->wilderness_x = creature_ptr->x;
-                } else {
-                    creature_ptr->oldpx = creature_ptr->x;
-                    creature_ptr->oldpy = creature_ptr->y;
-                }
-
-                creature_ptr->wild_mode = FALSE;
-
-                /*
-                                * Clear all saved floors
-                                * and create a first saved floor
-                                */
-                prepare_change_floor_mode(creature_ptr, CFM_FIRST_FLOOR);
-                creature_ptr->leaving = TRUE;
-
-                if (creature_ptr->dungeon_idx == DUNGEON_ANGBAND) {
-                    for (int i = MIN_RANDOM_QUEST; i < MAX_RANDOM_QUEST + 1; i++) {
-                        quest_type* const q_ptr = &quest[i];
-                        if ((q_ptr->type == QUEST_TYPE_RANDOM) && (q_ptr->status == QUEST_STATUS_TAKEN) && (q_ptr->level < floor_ptr->dun_level)) {
-                            q_ptr->status = QUEST_STATUS_FAILED;
-                            q_ptr->complev = (byte)creature_ptr->lev;
-                            update_playtime();
-                            q_ptr->comptime = current_world_ptr->play_time;
-                            r_info[q_ptr->r_idx].flags1 &= ~(RF1_QUESTOR);
-                        }
-                    }
-                }
-            }
-
-            sound(SOUND_TPLEVEL);
+    if (floor_ptr->dun_level || creature_ptr->current_floor_ptr->inside_quest || creature_ptr->enter_dungeon) {
+        msg_print(_("上に引っ張りあげられる感じがする!", "You feel yourself yanked upwards!"));
+        if (creature_ptr->dungeon_idx)
+            creature_ptr->recall_dungeon = creature_ptr->dungeon_idx;
+        if (record_stair)
+            exe_write_diary(creature_ptr, DIARY_RECALL, floor_ptr->dun_level, NULL);
+
+        floor_ptr->dun_level = 0;
+        creature_ptr->dungeon_idx = 0;
+        leave_quest_check(creature_ptr);
+        leave_tower_check(creature_ptr);
+        creature_ptr->current_floor_ptr->inside_quest = 0;
+        creature_ptr->leaving = TRUE;
+        sound(SOUND_TPLEVEL);
+        return;
+    }
+
+    msg_print(_("下に引きずり降ろされる感じがする!", "You feel yourself yanked downwards!"));
+    creature_ptr->dungeon_idx = creature_ptr->recall_dungeon;
+    if (record_stair)
+        exe_write_diary(creature_ptr, DIARY_RECALL, floor_ptr->dun_level, NULL);
+
+    floor_ptr->dun_level = max_dlv[creature_ptr->dungeon_idx];
+    if (floor_ptr->dun_level < 1)
+        floor_ptr->dun_level = 1;
+    if (ironman_nightmare && !randint0(666) && (creature_ptr->dungeon_idx == DUNGEON_ANGBAND)) {
+        if (floor_ptr->dun_level < 50) {
+            floor_ptr->dun_level *= 2;
+        } else if (floor_ptr->dun_level < 99) {
+            floor_ptr->dun_level = (floor_ptr->dun_level + 99) / 2;
+        } else if (floor_ptr->dun_level > 100) {
+            floor_ptr->dun_level = d_info[creature_ptr->dungeon_idx].maxdepth - 1;
         }
     }
+
+    if (creature_ptr->wild_mode) {
+        creature_ptr->wilderness_y = creature_ptr->y;
+        creature_ptr->wilderness_x = creature_ptr->x;
+    } else {
+        creature_ptr->oldpx = creature_ptr->x;
+        creature_ptr->oldpy = creature_ptr->y;
+    }
+
+    creature_ptr->wild_mode = FALSE;
+
+    /*
+    * Clear all saved floors
+    * and create a first saved floor
+    */
+    prepare_change_floor_mode(creature_ptr, CFM_FIRST_FLOOR);
+    creature_ptr->leaving = TRUE;
+
+    if (creature_ptr->dungeon_idx != DUNGEON_ANGBAND) {
+        sound(SOUND_TPLEVEL);
+        return;
+    }
+
+    for (int i = MIN_RANDOM_QUEST; i < MAX_RANDOM_QUEST + 1; i++) {
+        quest_type* const q_ptr = &quest[i];
+        if ((q_ptr->type == QUEST_TYPE_RANDOM) && (q_ptr->status == QUEST_STATUS_TAKEN) && (q_ptr->level < floor_ptr->dun_level)) {
+            q_ptr->status = QUEST_STATUS_FAILED;
+            q_ptr->complev = (byte)creature_ptr->lev;
+            update_playtime();
+            q_ptr->comptime = current_world_ptr->play_time;
+            r_info[q_ptr->r_idx].flags1 &= ~(RF1_QUESTOR);
+        }
+    }
+
+    sound(SOUND_TPLEVEL);
 }
 
 /*!
@@ -108,28 +113,30 @@ void execute_recall(player_type* creature_ptr)
 void execute_floor_reset(player_type* creature_ptr)
 {
     floor_type* floor_ptr = creature_ptr->current_floor_ptr;
-    if (creature_ptr->alter_reality) {
-        if (autosave_l && (creature_ptr->alter_reality == 1) && !creature_ptr->phase_out)
-            do_cmd_save_game(creature_ptr, TRUE);
-
-        creature_ptr->alter_reality--;
-        creature_ptr->redraw |= (PR_STATUS);
-        if (!creature_ptr->alter_reality) {
-            disturb(creature_ptr, FALSE, TRUE);
-            if (!quest_number(creature_ptr, floor_ptr->dun_level) && floor_ptr->dun_level) {
-                msg_print(_("世界が変わった!", "The world changes!"));
-
-                /*
-                                * Clear all saved floors
-                                * and create a first saved floor
-                                */
-                prepare_change_floor_mode(creature_ptr, CFM_FIRST_FLOOR);
-                creature_ptr->leaving = TRUE;
-            } else {
-                msg_print(_("世界が少しの間変化したようだ。", "The world seems to change for a moment!"));
-            }
-
-            sound(SOUND_TPLEVEL);
-        }
+    if (creature_ptr->alter_reality == 0)
+        return;
+
+    if (autosave_l && (creature_ptr->alter_reality == 1) && !creature_ptr->phase_out)
+    do_cmd_save_game(creature_ptr, TRUE);
+
+    creature_ptr->alter_reality--;
+    creature_ptr->redraw |= (PR_STATUS);
+    if (creature_ptr->alter_reality != 0)
+        return;
+
+    disturb(creature_ptr, FALSE, TRUE);
+    if (!quest_number(creature_ptr, floor_ptr->dun_level) && floor_ptr->dun_level) {
+        msg_print(_("世界が変わった!", "The world changes!"));
+
+        /*
+         * Clear all saved floors
+         * and create a first saved floor
+         */
+        prepare_change_floor_mode(creature_ptr, CFM_FIRST_FLOOR);
+        creature_ptr->leaving = TRUE;
+    } else {
+        msg_print(_("世界が少しの間変化したようだ。", "The world seems to change for a moment!"));
     }
+
+    sound(SOUND_TPLEVEL);
 }