OSDN Git Service

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