OSDN Git Service

[Refactor] #38862 Moved floor*.c to floor/
[hengband/hengband.git] / src / core / turn-compensator.c
1 #include "angband.h"
2 #include "core/turn-compensator.h"
3 #include "world/world.h"
4 #include "floor/floor-town.h"
5 #include "market/store-owners.h"
6 #include "market/store-util.h"
7 #include "market/store.h"
8
9 /*!
10  * @brief ゲームターンからの実時間換算を行うための補正をかける
11  * @param hoge ゲームターン
12  * @details アンデッド種族は18:00からゲームを開始するので、この修正を予め行う。
13  * @return 修正をかけた後のゲームターン
14  */
15 s32b turn_real(player_type* player_ptr, s32b hoge)
16 {
17     switch (player_ptr->start_race) {
18     case RACE_VAMPIRE:
19     case RACE_SKELETON:
20     case RACE_ZOMBIE:
21     case RACE_SPECTRE:
22         return hoge - (TURNS_PER_TICK * TOWN_DAWN * 3 / 4);
23     default:
24         return hoge;
25     }
26 }
27
28 /*!
29  * @brief ターンのオーバーフローに対する対処
30  * @param player_ptr プレーヤーへの参照ポインタ
31  * @details ターン及びターンを記録する変数をターンの限界の1日前まで巻き戻す.
32  * @return 修正をかけた後のゲームターン
33  */
34 void prevent_turn_overflow(player_type* player_ptr)
35 {
36     if (current_world_ptr->game_turn < current_world_ptr->game_turn_limit)
37         return;
38
39     int rollback_days = 1 + (current_world_ptr->game_turn - current_world_ptr->game_turn_limit) / (TURNS_PER_TICK * TOWN_DAWN);
40     s32b rollback_turns = TURNS_PER_TICK * TOWN_DAWN * rollback_days;
41
42     if (current_world_ptr->game_turn > rollback_turns)
43         current_world_ptr->game_turn -= rollback_turns;
44     else
45         current_world_ptr->game_turn = 1;
46     floor_type* floor_ptr = player_ptr->current_floor_ptr;
47     if (floor_ptr->generated_turn > rollback_turns)
48         floor_ptr->generated_turn -= rollback_turns;
49     else
50         floor_ptr->generated_turn = 1;
51     if (current_world_ptr->arena_start_turn > rollback_turns)
52         current_world_ptr->arena_start_turn -= rollback_turns;
53     else
54         current_world_ptr->arena_start_turn = 1;
55     if (player_ptr->feeling_turn > rollback_turns)
56         player_ptr->feeling_turn -= rollback_turns;
57     else
58         player_ptr->feeling_turn = 1;
59
60     for (int i = 1; i < max_towns; i++) {
61         for (int j = 0; j < MAX_STORES; j++) {
62             store_type* store_ptr = &town_info[i].store[j];
63
64             if (store_ptr->last_visit > -10L * TURNS_PER_TICK * STORE_TICKS) {
65                 store_ptr->last_visit -= rollback_turns;
66                 if (store_ptr->last_visit < -10L * TURNS_PER_TICK * STORE_TICKS)
67                     store_ptr->last_visit = -10L * TURNS_PER_TICK * STORE_TICKS;
68             }
69
70             if (store_ptr->store_open) {
71                 store_ptr->store_open -= rollback_turns;
72                 if (store_ptr->store_open < 1)
73                     store_ptr->store_open = 1;
74             }
75         }
76     }
77 }