* @param dam 固定値
* @return フォーマットに従い整形された文字列
*/
-concptr info_multi_damage(HIT_POINT dam)
+concptr info_multi_damage(int dam)
{
return format(_("損傷:各%d", "dam %d each"), dam);
}
* @param use_realm 魔法領域ID
* @return 失敗率(%)
*/
-static bool spell_okay(player_type *player_ptr, int spell, bool learned, bool study_pray, int use_realm)
+static bool spell_okay(PlayerType *player_ptr, int spell, bool learned, bool study_pray, int use_realm)
{
const magic_type *s_ptr;
return false;
}
- if (player_ptr->pclass == PlayerClassType::SORCERER)
- return true;
- if (player_ptr->pclass == PlayerClassType::RED_MAGE)
+ if (PlayerClass(player_ptr).is_every_magic()) {
return true;
+ }
/* Spell is learned */
if ((use_realm == player_ptr->realm2) ? (player_ptr->spell_learned2 & (1UL << spell)) : (player_ptr->spell_learned1 & (1UL << spell))) {
/* Always true */
- return (!study_pray);
+ return !study_pray;
}
/* Okay to study, not to cast */
- return (!learned);
+ return !learned;
}
/*!
* The "known" should be TRUE for cast/pray, FALSE for study
* </pre>
*/
-static int get_spell(player_type *player_ptr, SPELL_IDX *sn, concptr prompt, OBJECT_SUBTYPE_VALUE sval, bool learned, int16_t use_realm)
+static int get_spell(PlayerType *player_ptr, SPELL_IDX *sn, concptr prompt, OBJECT_SUBTYPE_VALUE sval, bool learned, int16_t use_realm)
{
int i;
SPELL_IDX spell = -1;
/* No "okay" spells */
if (!okay)
return false;
- if (((use_realm) != player_ptr->realm1) && ((use_realm) != player_ptr->realm2) && (player_ptr->pclass != PlayerClassType::SORCERER) && (player_ptr->pclass != PlayerClassType::RED_MAGE))
+
+ PlayerClass pc(player_ptr);
+ auto is_every_magic = pc.is_every_magic();
+ if (((use_realm) != player_ptr->realm1) && ((use_realm) != player_ptr->realm2) && !is_every_magic)
return false;
- if (((player_ptr->pclass == PlayerClassType::SORCERER) || (player_ptr->pclass == PlayerClassType::RED_MAGE)) && !is_magic(use_realm))
+ if (is_every_magic && !is_magic(use_realm))
return false;
- if ((player_ptr->pclass == PlayerClassType::RED_MAGE) && ((use_realm) != REALM_ARCANE) && (sval > 1))
+ if (pc.equals(PlayerClassType::RED_MAGE) && ((use_realm) != REALM_ARCANE) && (sval > 1))
return false;
/* Assume cancelled */
#ifdef JP
jverb(prompt, jverb_buf, JVERB_AND);
/* 英日切り替え機能に対応 */
- (void)strnfmt(tmp_val, 78, "%s(MP%d, 失敗率%d%%)を%sますか? ", exe_spell(player_ptr, use_realm, spell, SPELL_NAME), need_mana,
+ (void)strnfmt(tmp_val, 78, "%s(MP%d, 失敗率%d%%)を%sますか? ", exe_spell(player_ptr, use_realm, spell, SpellProcessType::NAME), need_mana,
spell_chance(player_ptr, spell, use_realm), jverb_buf);
#else
- (void)strnfmt(tmp_val, 78, "%^s %s (%d mana, %d%% fail)? ", prompt, exe_spell(player_ptr, use_realm, spell, SPELL_NAME), need_mana,
+ (void)strnfmt(tmp_val, 78, "%^s %s (%d mana, %d%% fail)? ", prompt, exe_spell(player_ptr, use_realm, spell, SpellProcessType::NAME), need_mana,
spell_chance(player_ptr, spell, use_realm));
#endif
* @param browse_only 魔法と技能の閲覧を行うならばTRUE
* @return 魔道書を一冊も持っていないならTRUEを返す
*/
-static void confirm_use_force(player_type *player_ptr, bool browse_only)
+static void confirm_use_force(PlayerType *player_ptr, bool browse_only)
{
char which;
COMMAND_CODE code;
}
}
-static FuncItemTester get_castable_spellbook_tester(player_type *player_ptr)
+static FuncItemTester get_castable_spellbook_tester(PlayerType *player_ptr)
{
return FuncItemTester([](auto p_ptr, auto o_ptr) { return check_book_realm(p_ptr, o_ptr->tval, o_ptr->sval); }, player_ptr);
}
-static FuncItemTester get_learnable_spellbook_tester(player_type *player_ptr)
+static FuncItemTester get_learnable_spellbook_tester(PlayerType *player_ptr)
{
if (player_ptr->realm2 == REALM_NONE) {
return get_castable_spellbook_tester(player_ptr);
* and in the dark, primarily to allow browsing in stores.
* </pre>
*/
-void do_cmd_browse(player_type *player_ptr)
+void do_cmd_browse(PlayerType *player_ptr)
{
OBJECT_IDX item;
OBJECT_SUBTYPE_VALUE sval;
SPELL_IDX spells[64];
char temp[62 * 4];
- object_type *o_ptr;
+ ObjectType *o_ptr;
concptr q, s;
/* Warriors are illiterate */
- if (!(player_ptr->realm1 || player_ptr->realm2) && (player_ptr->pclass != PlayerClassType::SORCERER) && (player_ptr->pclass != PlayerClassType::RED_MAGE)) {
+ PlayerClass pc(player_ptr);
+ if (!(player_ptr->realm1 || player_ptr->realm2) && !pc.is_every_magic()) {
msg_print(_("本を読むことができない!", "You cannot read books!"));
return;
}
- PlayerClass(player_ptr).break_samurai_stance({ SamuraiStance::MUSOU });
+ pc.break_samurai_stance({ SamuraiStanceType::MUSOU });
- if (player_ptr->pclass == PlayerClassType::FORCETRAINER) {
+ if (pc.equals(PlayerClassType::FORCETRAINER)) {
if (player_has_no_spellbooks(player_ptr)) {
confirm_use_force(player_ptr, true);
return;
q = _("どの本を読みますか? ", "Browse which book? ");
s = _("読める本がない。", "You have no books that you can read.");
- o_ptr = choose_object(player_ptr, &item, q, s, (USE_INVEN | USE_FLOOR | (player_ptr->pclass == PlayerClassType::FORCETRAINER ? USE_FORCE : 0)), item_tester);
+ o_ptr = choose_object(player_ptr, &item, q, s, USE_INVEN | USE_FLOOR | (pc.equals(PlayerClassType::FORCETRAINER) ? USE_FORCE : 0), item_tester);
if (!o_ptr) {
if (item == INVEN_FORCE) /* the_force */
term_erase(14, 12, 255);
term_erase(14, 11, 255);
- shape_buffer(exe_spell(player_ptr, use_realm, spell, SPELL_DESCRIPTION), 62, temp, sizeof(temp));
+ shape_buffer(exe_spell(player_ptr, use_realm, spell, SpellProcessType::DESCRIPTION), 62, temp, sizeof(temp));
for (j = 0, line = 11; temp[j]; j += 1 + strlen(&temp[j])) {
prt(&temp[j], line, 15);
* @param player_ptr プレイヤーへの参照ポインタ
* @param next_realm 変更先の魔法領域ID
*/
-static void change_realm2(player_type *player_ptr, int16_t next_realm)
+static void change_realm2(PlayerType *player_ptr, int16_t next_realm)
{
int i, j = 0;
char tmp[80];
player_ptr->spell_order[j] = 99;
for (i = 32; i < 64; i++) {
- player_ptr->spell_exp[i] = PlayerSkill::spell_exp_at(EXP_LEVEL_UNSKILLED);
+ player_ptr->spell_exp[i] = PlayerSkill::spell_exp_at(PlayerSkillRank::UNSKILLED);
}
player_ptr->spell_learned2 = 0L;
player_ptr->spell_worked2 = 0L;
* @brief 魔法を学習するコマンドのメインルーチン /
* Study a book to gain a new spell/prayer
*/
-void do_cmd_study(player_type *player_ptr)
+void do_cmd_study(PlayerType *player_ptr)
{
int i;
OBJECT_IDX item;
/* Spells of realm2 will have an increment of +32 */
SPELL_IDX spell = -1;
concptr p = spell_category_name(mp_ptr->spell_book);
- object_type *o_ptr;
+ ObjectType *o_ptr;
concptr q, s;
if (!player_ptr->realm1) {
return;
}
- PlayerClass(player_ptr).break_samurai_stance({ SamuraiStance::MUSOU });
+ PlayerClass(player_ptr).break_samurai_stance({ SamuraiStanceType::MUSOU });
#ifdef JP
if (player_ptr->new_spells < 10) {
}
if (learned) {
- auto max_exp = PlayerSkill::spell_exp_at((spell < 32) ? EXP_LEVEL_MASTER : EXP_LEVEL_EXPERT);
+ auto max_exp = PlayerSkill::spell_exp_at((spell < 32) ? PlayerSkillRank::MASTER : PlayerSkillRank::EXPERT);
int old_exp = player_ptr->spell_exp[spell];
- concptr name = exe_spell(player_ptr, increment ? player_ptr->realm2 : player_ptr->realm1, spell % 32, SPELL_NAME);
+ concptr name = exe_spell(player_ptr, increment ? player_ptr->realm2 : player_ptr->realm1, spell % 32, SpellProcessType::NAME);
if (old_exp >= max_exp) {
msg_format(_("その%sは完全に使いこなせるので学ぶ必要はない。", "You don't need to study this %s anymore."), p);
}
auto new_rank = PlayerSkill(player_ptr).gain_spell_skill_exp_over_learning(spell);
- msg_format(_("%sの熟練度が%sに上がった。", "Your proficiency of %s is now %s rank."), name, exp_level_str[new_rank]);
+ auto new_rank_str = PlayerSkill::skill_rank_str(new_rank);
+ msg_format(_("%sの熟練度が%sに上がった。", "Your proficiency of %s is now %s rank."), name, new_rank_str);
} else {
/* Find the next open entry in "player_ptr->spell_order[]" */
for (i = 0; i < 64; i++) {
#ifdef JP
/* 英日切り替え機能に対応 */
if (mp_ptr->spell_book == ItemKindType::MUSIC_BOOK) {
- msg_format("%sを学んだ。", exe_spell(player_ptr, increment ? player_ptr->realm2 : player_ptr->realm1, spell % 32, SPELL_NAME));
+ msg_format("%sを学んだ。", exe_spell(player_ptr, increment ? player_ptr->realm2 : player_ptr->realm1, spell % 32, SpellProcessType::NAME));
} else {
- msg_format("%sの%sを学んだ。", exe_spell(player_ptr, increment ? player_ptr->realm2 : player_ptr->realm1, spell % 32, SPELL_NAME), p);
+ msg_format("%sの%sを学んだ。", exe_spell(player_ptr, increment ? player_ptr->realm2 : player_ptr->realm1, spell % 32, SpellProcessType::NAME), p);
}
#else
- msg_format("You have learned the %s of %s.", p, exe_spell(player_ptr, increment ? player_ptr->realm2 : player_ptr->realm1, spell % 32, SPELL_NAME));
+ msg_format("You have learned the %s of %s.", p, exe_spell(player_ptr, increment ? player_ptr->realm2 : player_ptr->realm1, spell % 32, SpellProcessType::NAME));
#endif
}
* @param player_ptr プレイヤーへの参照ポインタ
* @return 詠唱したらtrue
*/
-bool do_cmd_cast(player_type *player_ptr)
+bool do_cmd_cast(PlayerType *player_ptr)
{
OBJECT_IDX item;
OBJECT_SUBTYPE_VALUE sval;
MANA_POINT need_mana;
concptr prayer;
- object_type *o_ptr;
+ ObjectType *o_ptr;
const magic_type *s_ptr;
concptr q, s;
bool over_exerted = false;
/* Require spell ability */
- if (!player_ptr->realm1 && (player_ptr->pclass != PlayerClassType::SORCERER) && (player_ptr->pclass != PlayerClassType::RED_MAGE)) {
+ PlayerClass pc(player_ptr);
+ auto is_every_magic = pc.is_every_magic();
+ if (!player_ptr->realm1 && !is_every_magic) {
msg_print(_("呪文を唱えられない!", "You cannot cast spells!"));
return false;
}
if (player_ptr->blind || no_lite(player_ptr)) {
- if (player_ptr->pclass == PlayerClassType::FORCETRAINER)
+ if (pc.equals(PlayerClassType::FORCETRAINER))
confirm_use_force(player_ptr, false);
else {
msg_print(_("目が見えない!", "You cannot see!"));
}
}
- if (player_ptr->pclass == PlayerClassType::FORCETRAINER) {
+ if (pc.equals(PlayerClassType::FORCETRAINER)) {
if (player_has_no_spellbooks(player_ptr)) {
confirm_use_force(player_ptr, false);
return true; //!< 錬気キャンセル時の処理がない
auto item_tester = get_castable_spellbook_tester(player_ptr);
- o_ptr = choose_object(player_ptr, &item, q, s, (USE_INVEN | USE_FLOOR | (player_ptr->pclass == PlayerClassType::FORCETRAINER ? USE_FORCE : 0)), item_tester);
+ o_ptr = choose_object(player_ptr, &item, q, s, USE_INVEN | USE_FLOOR | (pc.equals(PlayerClassType::FORCETRAINER) ? USE_FORCE : 0), item_tester);
if (!o_ptr) {
if (item == INVEN_FORCE) /* the_force */
{
/* Access the item's sval */
sval = o_ptr->sval;
- if ((player_ptr->pclass != PlayerClassType::SORCERER) && (player_ptr->pclass != PlayerClassType::RED_MAGE) && (o_ptr->tval == get_realm2_book(player_ptr)))
+ if (!is_every_magic && (o_ptr->tval == get_realm2_book(player_ptr)))
increment = 32;
/* Track the object kind */
object_kind_track(player_ptr, o_ptr->k_idx);
handle_stuff(player_ptr);
- if ((player_ptr->pclass == PlayerClassType::SORCERER) || (player_ptr->pclass == PlayerClassType::RED_MAGE))
+ if (is_every_magic)
realm = tval2realm(o_ptr->tval);
else if (increment)
realm = player_ptr->realm2;
}
/* Failure casting may activate some side effect */
- exe_spell(player_ptr, realm, spell, SPELL_FAIL);
+ exe_spell(player_ptr, realm, spell, SpellProcessType::FAIL);
if ((o_ptr->tval == ItemKindType::CHAOS_BOOK) && (randint1(100) < spell)) {
msg_print(_("カオス的な効果を発生した!", "You produce a chaotic effect!"));
/* Process spell */
else {
/* Canceled spells cost neither a turn nor mana */
- if (!exe_spell(player_ptr, realm, spell, SPELL_CAST))
+ if (!exe_spell(player_ptr, realm, spell, SpellProcessType::CAST))
return false;
if (randint1(100) < chance)
chg_virtue(player_ptr, V_CHANCE, 1);
/* A spell was cast */
- if (!(increment ? (player_ptr->spell_worked2 & (1UL << spell)) : (player_ptr->spell_worked1 & (1UL << spell))) && (player_ptr->pclass != PlayerClassType::SORCERER) && (player_ptr->pclass != PlayerClassType::RED_MAGE)) {
+ if (!(increment ? (player_ptr->spell_worked2 & (1UL << spell)) : (player_ptr->spell_worked1 & (1UL << spell))) && !is_every_magic) {
int e = s_ptr->sexp;
/* The spell worked */