1 #include "system/angband.h"
2 #include "birth/birth-stat.h"
3 #include "sv-definition/sv-weapon-types.h"
4 #include "player/player-personality.h"
5 #include "player/player-personalities-types.h"
6 #include "player/player-skill.h"
7 #include "spell/spells-status.h"
8 #include "player/player-race-types.h"
11 * @brief プレイヤーの能力値表現に基づいて加減算を行う。
13 * @param amount 加減算する値
16 int adjust_stat(int value, int amount)
19 for (int i = 0; i < (0 - amount); i++) {
20 if (value >= 18 + 10) {
22 } else if (value > 18) {
24 } else if (value > 3) {
28 } else if (amount > 0) {
29 for (int i = 0; i < amount; i++) {
42 * @brief プレイヤーの能力値を一通りロールする。 / Roll for a characters stats
43 * @param creature_ptr プレーヤーへの参照ポインタ
46 * calc_bonuses()による、独立ステータスからの副次ステータス算出も行っている。
47 * For efficiency, we include a chunk of "calc_bonuses()".\n
49 void get_stats(player_type* creature_ptr)
53 for (int i = 0; i < 2; i++) {
54 s32b tmp = randint0(60 * 60 * 60);
57 /* Extract 5 + 1d3 + 1d4 + 1d5 */
67 creature_ptr->stat_cur[3 * i] = creature_ptr->stat_max[3 * i] = val;
69 /* Extract 5 + 1d3 + 1d4 + 1d5 */
79 creature_ptr->stat_cur[3 * i + 1] = creature_ptr->stat_max[3 * i + 1] = val;
86 val += (BASE_STATUS)tmp;
89 creature_ptr->stat_cur[3 * i + 2] = creature_ptr->stat_max[3 * i + 2] = val;
92 if ((sum > 42 + 5 * 6) && (sum < 57 + 5 * 6))
98 * @brief その他「オートローラ中は算出の対象にしない」副次ステータスを処理する / Roll for some info that the auto-roller ignores
101 void get_extra(player_type* creature_ptr, bool roll_hitdie)
103 if (creature_ptr->prace == RACE_ANDROID)
104 creature_ptr->expfact = rp_ptr->r_exp;
106 creature_ptr->expfact = rp_ptr->r_exp + cp_ptr->c_exp;
108 if (((creature_ptr->pclass == CLASS_MONK) || (creature_ptr->pclass == CLASS_FORCETRAINER) || (creature_ptr->pclass == CLASS_NINJA)) && ((creature_ptr->prace == RACE_KLACKON) || (creature_ptr->prace == RACE_SPRITE)))
109 creature_ptr->expfact -= 15;
111 /* Reset record of race/realm changes */
112 creature_ptr->start_race = creature_ptr->prace;
113 creature_ptr->old_race1 = 0L;
114 creature_ptr->old_race2 = 0L;
115 creature_ptr->old_realm = 0;
117 for (int i = 0; i < 64; i++) {
118 if (creature_ptr->pclass == CLASS_SORCERER)
119 creature_ptr->spell_exp[i] = SPELL_EXP_MASTER;
120 else if (creature_ptr->pclass == CLASS_RED_MAGE)
121 creature_ptr->spell_exp[i] = SPELL_EXP_SKILLED;
123 creature_ptr->spell_exp[i] = SPELL_EXP_UNSKILLED;
126 for (int i = 0; i < 5; i++)
127 for (int j = 0; j < 64; j++)
128 creature_ptr->weapon_exp[i][j] = s_info[creature_ptr->pclass].w_start[i][j];
130 if ((creature_ptr->pseikaku == PERSONALITY_SEXY) && (creature_ptr->weapon_exp[TV_HAFTED - TV_WEAPON_BEGIN][SV_WHIP] < WEAPON_EXP_BEGINNER)) {
131 creature_ptr->weapon_exp[TV_HAFTED - TV_WEAPON_BEGIN][SV_WHIP] = WEAPON_EXP_BEGINNER;
134 for (int i = 0; i < GINOU_MAX; i++)
135 creature_ptr->skill_exp[i] = s_info[creature_ptr->pclass].s_start[i];
137 if (creature_ptr->pclass == CLASS_SORCERER)
138 creature_ptr->hitdie = rp_ptr->r_mhp / 2 + cp_ptr->c_mhp + ap_ptr->a_mhp;
140 creature_ptr->hitdie = rp_ptr->r_mhp + cp_ptr->c_mhp + ap_ptr->a_mhp;
143 roll_hitdice(creature_ptr, SPOP_NO_UPDATE);
145 creature_ptr->mhp = creature_ptr->player_hp[0];
149 * @brief プレイヤーの限界ステータスを決める。
150 * @param creature_ptr プレーヤーへの参照ポインタ
152 * @details 新生の薬やステータスシャッフルでもこの関数が呼ばれる
154 void get_max_stats(player_type* creature_ptr)
159 for (int i = 0; i < A_MAX; i++) {
160 dice[i] = randint1(7);
168 for (int i = 0; i < A_MAX; i++) {
169 BASE_STATUS max_max = 18 + 60 + dice[i] * 10;
170 creature_ptr->stat_max_max[i] = max_max;
171 if (creature_ptr->stat_max[i] > max_max)
172 creature_ptr->stat_max[i] = max_max;
173 if (creature_ptr->stat_cur[i] > max_max)
174 creature_ptr->stat_cur[i] = max_max;
177 creature_ptr->knowledge &= ~(KNOW_STAT);
178 creature_ptr->redraw |= (PR_STATS);