OSDN Git Service

[Refactor] #2444 item-magic-applier.cpp/h をクラス化した
[hengbandforosx/hengbandosx.git] / src / status / experience.cpp
1 #include "status/experience.h"
2 #include "player-base/player-race.h"
3 #include "player/player-status.h"
4 #include "system/player-type-definition.h"
5 #include "view/display-messages.h"
6
7 /*
8  * Gain experience
9  */
10 void gain_exp_64(PlayerType *player_ptr, int32_t amount, uint32_t amount_frac)
11 {
12     if (player_ptr->is_dead) {
13         return;
14     }
15     if (PlayerRace(player_ptr).equals(PlayerRaceType::ANDROID)) {
16         return;
17     }
18
19     s64b_add(&(player_ptr->exp), &(player_ptr->exp_frac), amount, amount_frac);
20
21     if (player_ptr->exp < player_ptr->max_exp) {
22         player_ptr->max_exp += amount / 5;
23     }
24
25     check_experience(player_ptr);
26 }
27
28 /*
29  * Gain experience
30  */
31 void gain_exp(PlayerType *player_ptr, int32_t amount)
32 {
33     gain_exp_64(player_ptr, amount, 0L);
34 }
35
36 /*
37  * Lose experience
38  */
39 void lose_exp(PlayerType *player_ptr, int32_t amount)
40 {
41     if (PlayerRace(player_ptr).equals(PlayerRaceType::ANDROID)) {
42         return;
43     }
44     if (amount > player_ptr->exp) {
45         amount = player_ptr->exp;
46     }
47
48     player_ptr->exp -= amount;
49
50     check_experience(player_ptr);
51 }
52
53 /*
54  * Restores any drained experience
55  */
56 bool restore_level(PlayerType *player_ptr)
57 {
58     if (player_ptr->exp < player_ptr->max_exp) {
59         msg_print(_("経験値が戻ってきた気がする。", "You feel your experience returning."));
60         player_ptr->exp = player_ptr->max_exp;
61         check_experience(player_ptr);
62         return true;
63     }
64
65     return false;
66 }
67
68 /*
69  * Drain experience
70  * If resisted to draining, return FALSE
71  */
72 bool drain_exp(PlayerType *player_ptr, int32_t drain, int32_t slip, int hold_exp_prob)
73 {
74     if (PlayerRace(player_ptr).equals(PlayerRaceType::ANDROID)) {
75         return false;
76     }
77
78     if (player_ptr->hold_exp && (randint0(100) < hold_exp_prob)) {
79         msg_print(_("しかし自己の経験値を守りきった!", "You keep hold of your experience!"));
80         return false;
81     }
82
83     if (player_ptr->hold_exp) {
84         msg_print(_("経験値を少し吸い取られた気がする!", "You feel your experience slipping away!"));
85         lose_exp(player_ptr, slip);
86     } else {
87         msg_print(_("経験値が体から吸い取られた気がする!", "You feel your experience draining away!"));
88         lose_exp(player_ptr, drain);
89     }
90
91     return true;
92 }