1 #include "birth/history-generator.h"
2 #include "birth/history.h"
3 #include "player-info/race-types.h"
4 #include "system/player-type-definition.h"
5 #include "util/buffer-shaper.h"
6 #include "util/string-processor.h"
11 static int get_history_chart(PlayerType *player_ptr)
13 switch (player_ptr->prace) {
14 case PlayerRaceType::AMBERITE:
16 case PlayerRaceType::HUMAN:
17 case PlayerRaceType::BARBARIAN:
18 case PlayerRaceType::DUNADAN:
20 case PlayerRaceType::HALF_ELF:
22 case PlayerRaceType::ELF:
23 case PlayerRaceType::HIGH_ELF:
25 case PlayerRaceType::HOBBIT:
27 case PlayerRaceType::GNOME:
29 case PlayerRaceType::DWARF:
31 case PlayerRaceType::HALF_ORC:
33 case PlayerRaceType::HALF_TROLL:
35 case PlayerRaceType::DARK_ELF:
37 case PlayerRaceType::HALF_OGRE:
39 case PlayerRaceType::HALF_GIANT:
41 case PlayerRaceType::HALF_TITAN:
43 case PlayerRaceType::CYCLOPS:
45 case PlayerRaceType::YEEK:
47 case PlayerRaceType::KOBOLD:
49 case PlayerRaceType::KLACKON:
51 case PlayerRaceType::NIBELUNG:
53 case PlayerRaceType::DRACONIAN:
55 case PlayerRaceType::MIND_FLAYER:
57 case PlayerRaceType::IMP:
59 case PlayerRaceType::GOLEM:
61 case PlayerRaceType::SKELETON:
63 case PlayerRaceType::ZOMBIE:
65 case PlayerRaceType::VAMPIRE:
67 case PlayerRaceType::SPECTRE:
69 case PlayerRaceType::SPRITE:
71 case PlayerRaceType::BEASTMAN:
73 case PlayerRaceType::ENT:
75 case PlayerRaceType::ARCHON:
77 case PlayerRaceType::BALROG:
79 case PlayerRaceType::S_FAIRY:
81 case PlayerRaceType::KUTAR:
83 case PlayerRaceType::ANDROID:
85 case PlayerRaceType::MERFOLK:
93 * @brief 生い立ちを画面に表示しつつ、種族から社会的地位を決定する
94 * @param player_ptr プレイヤーへの参照ポインタ
96 static std::string decide_social_class(PlayerType *player_ptr)
98 short social_class = randint1(4);
99 auto chart = get_history_chart(player_ptr);
100 std::stringstream ss;
103 auto roll = randint1(100);
104 while ((chart != backgrounds[i].chart) || (roll > backgrounds[i].roll)) {
108 ss << backgrounds[i].info;
109 social_class += static_cast<short>(backgrounds[i].bonus) - 50;
110 chart = backgrounds[i].next;
113 if (social_class > 100) {
115 } else if (social_class < 1) {
119 player_ptr->sc = social_class;
124 * @brief プレイヤーの生い立ちの自動生成を行う
125 * @param player_ptr プレイヤーへの参照ポインタ
127 void get_history(PlayerType *player_ptr)
129 constexpr auto lines = 4;
130 for (int i = 0; i < lines; i++) {
131 player_ptr->history[i][0] = '\0';
134 auto social_class = decide_social_class(player_ptr);
135 constexpr auto max_line_len = sizeof(player_ptr->history[0]);
136 const auto history_lines = shape_buffer(social_class.data(), max_line_len);
137 const auto max_lines = std::min<int>(lines, history_lines.size());
138 for (auto i = 0; i < max_lines; ++i) {
139 angband_strcpy(player_ptr->history[i], history_lines[i], max_line_len);