OSDN Git Service

Merge pull request #719 from sikabane-works/feature/add-cheat-immortal
[hengbandforosx/hengbandosx.git] / src / birth / game-play-initializer.cpp
1 #include "birth/game-play-initializer.h"
2 #include "info-reader/fixed-map-parser.h"
3 #include "dungeon/dungeon.h"
4 #include "dungeon/quest.h"
5 #include "floor/floor-util.h"
6 #include "game-option/birth-options.h"
7 #include "game-option/cheat-options.h"
8 #include "inventory/inventory-slot-types.h"
9 #include "market/arena.h"
10 #include "monster-race/monster-race.h"
11 #include "monster-race/race-flags1.h"
12 #include "monster-race/race-flags7.h"
13 #include "object/object-generator.h"
14 #include "object/object-kind.h"
15 #include "pet/pet-util.h"
16 #include "player/player-race-types.h"
17 #include "system/artifact-type-definition.h"
18 #include "system/floor-type-definition.h"
19 #include "system/system-variables.h"
20 #include "world/world.h"
21
22 /*!
23  * @brief ベースアイテム構造体の鑑定済みフラグをリセットする。
24  * @return なし
25  * @details
26  * 不具合対策で0からリセットする(セーブは0から)
27  */
28 static void k_info_reset(void)
29 {
30     for (int i = 0; i < max_k_idx; i++) {
31         object_kind *k_ptr = &k_info[i];
32         k_ptr->tried = FALSE;
33         k_ptr->aware = FALSE;
34     }
35 }
36
37 /*!
38  * @brief プレイヤー構造体の内容を初期値で消去する(名前を除く) / Clear all the global "character" data (without name)
39  * @param creature_ptr プレーヤーへの参照ポインタ
40  * @return なし
41  * @details 少し長いが、これ1つで処理が完結しているので分割は見送る
42  */
43 void player_wipe_without_name(player_type *creature_ptr)
44 {
45     player_type tmp;
46
47 #ifdef SET_UID
48     int uid = creature_ptr->player_uid;
49 #endif
50     COPY(&tmp, creature_ptr, player_type);
51     if (creature_ptr->last_message)
52         string_free(creature_ptr->last_message);
53
54     if (creature_ptr->inventory_list != NULL)
55         C_KILL(creature_ptr->inventory_list, INVEN_TOTAL, object_type);
56
57     (void)WIPE(creature_ptr, player_type);
58
59     //TODO: キャラ作成からゲーム開始までに  current_floor_ptr を参照しなければならない処理は今後整理して外す。
60     creature_ptr->current_floor_ptr = &floor_info;
61     C_MAKE(creature_ptr->inventory_list, INVEN_TOTAL, object_type);
62     for (int i = 0; i < 4; i++)
63         strcpy(creature_ptr->history[i], "");
64
65     for (int i = 0; i < max_q_idx; i++) {
66         quest_type *const q_ptr = &quest[i];
67         q_ptr->status = QUEST_STATUS_UNTAKEN;
68         q_ptr->cur_num = 0;
69         q_ptr->max_num = 0;
70         q_ptr->type = 0;
71         q_ptr->level = 0;
72         q_ptr->r_idx = 0;
73         q_ptr->complev = 0;
74         q_ptr->comptime = 0;
75     }
76
77     creature_ptr->inven_cnt = 0;
78     creature_ptr->equip_cnt = 0;
79     for (int i = 0; i < INVEN_TOTAL; i++)
80         object_wipe(&creature_ptr->inventory_list[i]);
81
82     for (int i = 0; i < max_a_idx; i++) {
83         artifact_type *a_ptr = &a_info[i];
84         a_ptr->cur_num = 0;
85     }
86
87     k_info_reset();
88     for (int i = 1; i < max_r_idx; i++) {
89         monster_race *r_ptr = &r_info[i];
90         r_ptr->cur_num = 0;
91         r_ptr->max_num = 100;
92         if (r_ptr->flags1 & RF1_UNIQUE)
93             r_ptr->max_num = 1;
94         else if (r_ptr->flags7 & RF7_NAZGUL)
95             r_ptr->max_num = MAX_NAZGUL_NUM;
96
97         r_ptr->r_pkills = 0;
98         r_ptr->r_akills = 0;
99     }
100
101     creature_ptr->food = PY_FOOD_FULL - 1;
102     if (creature_ptr->pclass == CLASS_SORCERER) {
103         creature_ptr->spell_learned1 = creature_ptr->spell_learned2 = 0xffffffffL;
104         creature_ptr->spell_worked1 = creature_ptr->spell_worked2 = 0xffffffffL;
105     } else {
106         creature_ptr->spell_learned1 = creature_ptr->spell_learned2 = 0L;
107         creature_ptr->spell_worked1 = creature_ptr->spell_worked2 = 0L;
108     }
109
110     creature_ptr->spell_forgotten1 = creature_ptr->spell_forgotten2 = 0L;
111     for (int i = 0; i < 64; i++)
112         creature_ptr->spell_order[i] = 99;
113
114     creature_ptr->learned_spells = 0;
115     creature_ptr->add_spells = 0;
116     creature_ptr->knowledge = 0;
117     creature_ptr->mutant_regenerate_mod = 100;
118
119     cheat_peek = FALSE;
120     cheat_hear = FALSE;
121     cheat_room = FALSE;
122     cheat_xtra = FALSE;
123     cheat_know = FALSE;
124     cheat_live = FALSE;
125     cheat_save = FALSE;
126     cheat_diary_output = FALSE;
127     cheat_turn = FALSE;
128     cheat_immortal = FALSE;
129
130     current_world_ptr->total_winner = FALSE;
131     creature_ptr->timewalk = FALSE;
132     creature_ptr->panic_save = 0;
133
134     current_world_ptr->noscore = 0;
135     current_world_ptr->wizard = FALSE;
136     creature_ptr->wait_report_score = FALSE;
137     creature_ptr->pet_follow_distance = PET_FOLLOW_DIST;
138     creature_ptr->pet_extra_flags = (PF_TELEPORT | PF_ATTACK_SPELL | PF_SUMMON_SPELL);
139
140     for (int i = 0; i < current_world_ptr->max_d_idx; i++)
141         max_dlv[i] = 0;
142
143     creature_ptr->visit = 1;
144     creature_ptr->wild_mode = FALSE;
145
146     for (int i = 0; i < MAX_SPELLS; i++) {
147         creature_ptr->magic_num1[i] = 0;
148         creature_ptr->magic_num2[i] = 0;
149     }
150
151     creature_ptr->max_plv = creature_ptr->lev = 1;
152     creature_ptr->arena_number = 0;
153     creature_ptr->current_floor_ptr->inside_arena = FALSE;
154     creature_ptr->current_floor_ptr->inside_quest = 0;
155     for (int i = 0; i < MAX_MANE; i++) {
156         creature_ptr->mane_spell[i] = RF_ABILITY::MAX;
157         creature_ptr->mane_dam[i] = 0;
158     }
159
160     creature_ptr->mane_num = 0;
161     creature_ptr->exit_bldg = TRUE;
162     creature_ptr->today_mon = 0;
163     update_gambling_monsters(creature_ptr);
164     creature_ptr->muta.clear();
165
166     for (int i = 0; i < 8; i++)
167         creature_ptr->virtues[i] = 0;
168
169     creature_ptr->dungeon_idx = 0;
170     if (vanilla_town || ironman_downward) {
171         creature_ptr->recall_dungeon = DUNGEON_ANGBAND;
172     } else {
173         creature_ptr->recall_dungeon = DUNGEON_GALGALS;
174     }
175
176     memcpy(creature_ptr->name, tmp.name, sizeof(tmp.name));
177
178 #ifdef SET_UID
179     creature_ptr->player_uid = uid;
180 #endif
181 }
182
183 /*!
184  * @brief ダンジョン内部のクエストを初期化する / Initialize random quests and final quests
185  * @param creature_ptr プレーヤーへの参照ポインタ
186  * @return なし
187  */
188 void init_dungeon_quests(player_type *creature_ptr)
189 {
190     int number_of_quests = MAX_RANDOM_QUEST - MIN_RANDOM_QUEST + 1;
191     init_flags = INIT_ASSIGN;
192     floor_type *floor_ptr = creature_ptr->current_floor_ptr;
193     floor_ptr->inside_quest = MIN_RANDOM_QUEST;
194     parse_fixed_map(creature_ptr, "q_info.txt", 0, 0, 0, 0);
195     floor_ptr->inside_quest = 0;
196     for (int i = MIN_RANDOM_QUEST + number_of_quests - 1; i >= MIN_RANDOM_QUEST; i--) {
197         quest_type *q_ptr = &quest[i];
198         monster_race *quest_r_ptr;
199         q_ptr->status = QUEST_STATUS_TAKEN;
200         determine_random_questor(creature_ptr, q_ptr);
201         quest_r_ptr = &r_info[q_ptr->r_idx];
202         quest_r_ptr->flags1 |= RF1_QUESTOR;
203         q_ptr->max_num = 1;
204     }
205
206     init_flags = INIT_ASSIGN;
207     floor_ptr->inside_quest = QUEST_OBERON;
208     parse_fixed_map(creature_ptr, "q_info.txt", 0, 0, 0, 0);
209     quest[QUEST_OBERON].status = QUEST_STATUS_TAKEN;
210
211     floor_ptr->inside_quest = QUEST_SERPENT;
212     parse_fixed_map(creature_ptr, "q_info.txt", 0, 0, 0, 0);
213     quest[QUEST_SERPENT].status = QUEST_STATUS_TAKEN;
214     floor_ptr->inside_quest = 0;
215 }
216
217 /*!
218  * @brief ゲームターンを初期化する / Reset turn
219  * @param creature_ptr プレーヤーへの参照ポインタ
220  * @return なし
221  * @details アンデッド系種族は開始時刻を夜からにする / Undead start just sunset
222  * @details
223  */
224 void init_turn(player_type *creature_ptr)
225 {
226     if ((creature_ptr->prace == RACE_VAMPIRE) || (creature_ptr->prace == RACE_SKELETON) || (creature_ptr->prace == RACE_ZOMBIE) || (creature_ptr->prace == RACE_SPECTRE)) {
227         current_world_ptr->game_turn = (TURNS_PER_TICK * 3 * TOWN_DAWN) / 4 + 1;
228         current_world_ptr->game_turn_limit = TURNS_PER_TICK * TOWN_DAWN * MAX_DAYS + TURNS_PER_TICK * TOWN_DAWN * 3 / 4;
229     } else {
230         current_world_ptr->game_turn = 1;
231         current_world_ptr->game_turn_limit = TURNS_PER_TICK * TOWN_DAWN * (MAX_DAYS - 1) + TURNS_PER_TICK * TOWN_DAWN * 3 / 4;
232     }
233
234     current_world_ptr->dungeon_turn = 1;
235     current_world_ptr->dungeon_turn_limit = TURNS_PER_TICK * TOWN_DAWN * (MAX_DAYS - 1) + TURNS_PER_TICK * TOWN_DAWN * 3 / 4;
236 }