OSDN Git Service

Merge pull request #3814 from Slimebreath6078/feature/Add_Laffey_II
[hengbandforosx/hengbandosx.git] / src / mind / mind-cavalry.cpp
1 /*!
2  * @brief 騎兵のレイシャルパワー処理
3  * @date 2020/05/16
4  * @author Hourier
5  */
6
7 #include "mind/mind-cavalry.h"
8 #include "cmd-action/cmd-pet.h"
9 #include "monster-race/monster-race.h"
10 #include "monster/monster-describer.h"
11 #include "monster/monster-info.h"
12 #include "monster/monster-status-setter.h"
13 #include "monster/smart-learn-types.h"
14 #include "pet/pet-fall-off.h"
15 #include "player/player-skill.h"
16 #include "system/angband-system.h"
17 #include "system/floor-type-definition.h"
18 #include "system/monster-entity.h"
19 #include "system/monster-race-info.h"
20 #include "system/player-type-definition.h"
21 #include "view/display-messages.h"
22
23 /*!
24  * 荒馬慣らし
25  * @param player_ptr プレイヤーへの参照ポインタ
26  * @return 結果はどうあれ騎乗したらTRUE
27  */
28 bool rodeo(PlayerType *player_ptr)
29 {
30     if (player_ptr->riding) {
31         msg_print(_("今は乗馬中だ。", "You ARE riding."));
32         return false;
33     }
34
35     if (!do_cmd_riding(player_ptr, true)) {
36         return true;
37     }
38
39     auto *m_ptr = &player_ptr->current_floor_ptr->m_list[player_ptr->riding];
40     auto *r_ptr = &m_ptr->get_monrace();
41     const auto m_name = monster_desc(player_ptr, m_ptr, 0);
42     msg_format(_("%sに乗った。", "You ride on %s."), m_name.data());
43
44     if (m_ptr->is_pet()) {
45         return true;
46     }
47
48     auto rlev = r_ptr->level;
49
50     if (r_ptr->kind_flags.has(MonsterKindType::UNIQUE)) {
51         rlev = rlev * 3 / 2;
52     }
53     if (rlev > 60) {
54         rlev = 60 + (rlev - 60) / 2;
55     }
56     if ((randint1(player_ptr->skill_exp[PlayerSkillKindType::RIDING] / 120 + player_ptr->lev * 2 / 3) > rlev) && one_in_(2) &&
57         !player_ptr->current_floor_ptr->inside_arena && !AngbandSystem::get_instance().is_phase_out() && r_ptr->misc_flags.has_not(MonsterMiscType::GUARDIAN) && r_ptr->misc_flags.has_not(MonsterMiscType::QUESTOR) &&
58         (rlev < player_ptr->lev * 3 / 2 + randint0(player_ptr->lev / 5))) {
59         msg_format(_("%sを手なずけた。", "You tame %s."), m_name.data());
60         set_pet(player_ptr, m_ptr);
61     } else {
62         msg_format(_("%sに振り落とされた!", "You have been thrown off by %s."), m_name.data());
63         process_fall_off_horse(player_ptr, 1, true);
64
65         /* 落馬処理に失敗してもとにかく乗馬解除 */
66         player_ptr->riding = 0;
67     }
68
69     return true;
70 }