#include "birth/birth-stat.h"
#include "birth/auto-roller.h"
#include "core/player-redraw-types.h"
+#include "player-base/player-class.h"
+#include "player-base/player-race.h"
#include "player-info/class-info.h"
#include "player-info/race-info.h"
#include "player-info/race-types.h"
#include "system/player-type-definition.h"
/*! オートロール能力値の乱数分布 / emulate 5 + 1d3 + 1d4 + 1d5 by randint0(60) */
-BASE_STATUS rand3_4_5[60] = {
+short rand3_4_5[60] = {
8, 9, 9, 9, 10, 10, 10, 10, 10, 10, /*00-09*/
11, 11, 11, 11, 11, 11, 11, 11, 11, 12, /*10-19*/
12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /*20-29*/
* calc_bonuses()による、独立ステータスからの副次ステータス算出も行っている。
* For efficiency, we include a chunk of "calc_bonuses()".\n
*/
-void get_stats(player_type *player_ptr)
+void get_stats(PlayerType *player_ptr)
{
while (true) {
int sum = 0;
for (int i = 0; i < 2; i++) {
- int32_t tmp = randint0(60 * 60 * 60);
- BASE_STATUS val;
-
+ auto tmp = randint0(60 * 60 * 60);
for (int j = 0; j < 3; j++) {
int stat = i * 3 + j;
/* Extract 5 + 1d3 + 1d4 + 1d5 */
- val = rand3_4_5[tmp % 60];
+ auto val = rand3_4_5[tmp % 60];
sum += val;
player_ptr->stat_cur[stat] = player_ptr->stat_max[stat] = val;
}
}
- if ((sum > 42 + 5 * 6) && (sum < 57 + 5 * 6))
+ if ((sum > 42 + 5 * 6) && (sum < 57 + 5 * 6)) {
break;
+ }
}
}
/*!
* @brief 経験値修正の合計値を計算
*/
-uint16_t get_expfact(player_type *player_ptr)
+uint16_t get_expfact(PlayerType *player_ptr)
{
uint16_t expfact = rp_ptr->r_exp;
- if (player_ptr->prace != PlayerRaceType::ANDROID)
+ PlayerRace pr(player_ptr);
+ if (!pr.equals(PlayerRaceType::ANDROID)) {
expfact += cp_ptr->c_exp;
- if (((player_ptr->pclass == PlayerClassType::MONK) || (player_ptr->pclass == PlayerClassType::FORCETRAINER) || (player_ptr->pclass == PlayerClassType::NINJA))
- && ((player_ptr->prace == PlayerRaceType::KLACKON) || (player_ptr->prace == PlayerRaceType::SPRITE)))
+ }
+
+ auto is_race_gaining_additional_speed = pr.equals(PlayerRaceType::KLACKON) || pr.equals(PlayerRaceType::SPRITE);
+ auto is_class_gaining_additional_speed = PlayerClass(player_ptr).has_additional_speed();
+ if (is_race_gaining_additional_speed && is_class_gaining_additional_speed) {
expfact -= 15;
+ }
return expfact;
}
/*!
* @brief その他「オートローラ中は算出の対象にしない」副次ステータスを処理する / Roll for some info that the auto-roller ignores
*/
-void get_extra(player_type *player_ptr, bool roll_hitdie)
+void get_extra(PlayerType *player_ptr, bool roll_hitdie)
{
player_ptr->expfact = get_expfact(player_ptr);
player_ptr->old_race2 = 0L;
player_ptr->old_realm = 0;
+ PlayerClass pc(player_ptr);
+ auto is_sorcerer = pc.equals(PlayerClassType::SORCERER);
for (int i = 0; i < 64; i++) {
- if (player_ptr->pclass == PlayerClassType::SORCERER)
+ if (is_sorcerer) {
player_ptr->spell_exp[i] = PlayerSkill::spell_exp_at(PlayerSkillRank::MASTER);
- else if (player_ptr->pclass == PlayerClassType::RED_MAGE)
+ } else if (pc.equals(PlayerClassType::RED_MAGE)) {
player_ptr->spell_exp[i] = PlayerSkill::spell_exp_at(PlayerSkillRank::SKILLED);
- else
+ } else {
player_ptr->spell_exp[i] = PlayerSkill::spell_exp_at(PlayerSkillRank::UNSKILLED);
+ }
}
auto pclass = enum2i(player_ptr->pclass);
- player_ptr->weapon_exp = s_info[pclass].w_start;
+ player_ptr->weapon_exp = class_skills_info[pclass].w_start;
+ player_ptr->weapon_exp_max = class_skills_info[pclass].w_max;
if (player_ptr->ppersonality == PERSONALITY_SEXY) {
auto &whip_exp = player_ptr->weapon_exp[ItemKindType::HAFTED][SV_WHIP];
whip_exp = std::max(whip_exp, PlayerSkill::weapon_exp_at(PlayerSkillRank::BEGINNER));
}
- for (auto i : PLAYER_SKILL_KIND_TYPE_RANGE)
- player_ptr->skill_exp[i] = s_info[pclass].s_start[i];
-
- if (player_ptr->pclass == PlayerClassType::SORCERER)
- player_ptr->hitdie = rp_ptr->r_mhp / 2 + cp_ptr->c_mhp + ap_ptr->a_mhp;
- else
- player_ptr->hitdie = rp_ptr->r_mhp + cp_ptr->c_mhp + ap_ptr->a_mhp;
+ for (auto i : PLAYER_SKILL_KIND_TYPE_RANGE) {
+ player_ptr->skill_exp[i] = class_skills_info[pclass].s_start[i];
+ }
- if (roll_hitdie)
+ player_ptr->hitdie = cp_ptr->c_mhp + ap_ptr->a_mhp;
+ player_ptr->hitdie += is_sorcerer ? rp_ptr->r_mhp / 2 : rp_ptr->r_mhp;
+ if (roll_hitdie) {
roll_hitdice(player_ptr, SPOP_NO_UPDATE);
+ }
player_ptr->mhp = player_ptr->player_hp[0];
}
* @param player_ptr プレイヤーへの参照ポインタ
* @details 新生の薬やステータスシャッフルでもこの関数が呼ばれる
*/
-void get_max_stats(player_type *player_ptr)
+void get_max_stats(PlayerType *player_ptr)
{
- int dice[6];
+ int dice[6]{};
while (true) {
- int j = 0;
- for (int i = 0; i < A_MAX; i++) {
+ auto j = 0;
+ for (auto i = 0; i < A_MAX; i++) {
dice[i] = randint1(7);
j += dice[i];
}
- if (j == 24)
+ if (j == 24) {
break;
+ }
}
- for (int i = 0; i < A_MAX; i++) {
- BASE_STATUS max_max = 18 + 60 + dice[i] * 10;
+ for (auto i = 0; i < A_MAX; i++) {
+ short max_max = 18 + 60 + dice[i] * 10;
player_ptr->stat_max_max[i] = max_max;
- if (player_ptr->stat_max[i] > max_max)
+ if (player_ptr->stat_max[i] > max_max) {
player_ptr->stat_max[i] = max_max;
- if (player_ptr->stat_cur[i] > max_max)
+ }
+ if (player_ptr->stat_cur[i] > max_max) {
player_ptr->stat_cur[i] = max_max;
+ }
}
player_ptr->knowledge &= ~(KNOW_STAT);
- player_ptr->redraw |= (PR_STATS);
+ player_ptr->redraw |= (PR_ABILITY_SCORE);
}