OSDN Git Service

[Refactor] #38862 Moved angband.h, h-*.h and system-variables.c/h
[hengband/hengband.git] / src / spell / music-checker.c
1 #include "system/angband.h"
2 #include "spell/music-checker.h"
3 #include "realm/realm-song.h"
4 #include "spell/spells3.h"
5 #include "player/player-skill.h"
6 #include "spell/spells-execution.h"
7
8 /*!
9  * @brief プレイヤーの歌に関する継続処理
10  * @return なし
11  */
12 void check_music(player_type* caster_ptr)
13 {
14     if (caster_ptr->pclass != CLASS_BARD)
15         return;
16     if (!SINGING_SONG_EFFECT(caster_ptr) && !INTERUPTING_SONG_EFFECT(caster_ptr))
17         return;
18
19     if (caster_ptr->anti_magic) {
20         stop_singing(caster_ptr);
21         return;
22     }
23
24     int spell = SINGING_SONG_ID(caster_ptr);
25     const magic_type* s_ptr;
26     s_ptr = &technic_info[REALM_MUSIC - MIN_TECHNIC][spell];
27
28     MANA_POINT need_mana = mod_need_mana(caster_ptr, s_ptr->smana, spell, REALM_MUSIC);
29     u32b need_mana_frac = 0;
30
31     s64b_RSHIFT(need_mana, need_mana_frac, 1);
32     if (s64b_cmp(caster_ptr->csp, caster_ptr->csp_frac, need_mana, need_mana_frac) < 0) {
33         stop_singing(caster_ptr);
34         return;
35     } else {
36         s64b_sub(&(caster_ptr->csp), &(caster_ptr->csp_frac), need_mana, need_mana_frac);
37
38         caster_ptr->redraw |= PR_MANA;
39         if (INTERUPTING_SONG_EFFECT(caster_ptr)) {
40             SINGING_SONG_EFFECT(caster_ptr) = INTERUPTING_SONG_EFFECT(caster_ptr);
41             INTERUPTING_SONG_EFFECT(caster_ptr) = MUSIC_NONE;
42             msg_print(_("歌を再開した。", "You restart singing."));
43             caster_ptr->action = ACTION_SING;
44             caster_ptr->update |= (PU_BONUS | PU_HP | PU_MONSTERS);
45             caster_ptr->redraw |= (PR_MAP | PR_STATUS | PR_STATE);
46             caster_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
47         }
48     }
49
50     if (caster_ptr->spell_exp[spell] < SPELL_EXP_BEGINNER)
51         caster_ptr->spell_exp[spell] += 5;
52     else if (caster_ptr->spell_exp[spell] < SPELL_EXP_SKILLED) {
53         if (one_in_(2) && (caster_ptr->current_floor_ptr->dun_level > 4) && ((caster_ptr->current_floor_ptr->dun_level + 10) > caster_ptr->lev))
54             caster_ptr->spell_exp[spell] += 1;
55     } else if (caster_ptr->spell_exp[spell] < SPELL_EXP_EXPERT) {
56         if (one_in_(5) && ((caster_ptr->current_floor_ptr->dun_level + 5) > caster_ptr->lev) && ((caster_ptr->current_floor_ptr->dun_level + 5) > s_ptr->slevel))
57             caster_ptr->spell_exp[spell] += 1;
58     } else if (caster_ptr->spell_exp[spell] < SPELL_EXP_MASTER) {
59         if (one_in_(5) && ((caster_ptr->current_floor_ptr->dun_level + 5) > caster_ptr->lev) && (caster_ptr->current_floor_ptr->dun_level > s_ptr->slevel))
60             caster_ptr->spell_exp[spell] += 1;
61     }
62
63     exe_spell(caster_ptr, REALM_MUSIC, spell, SPELL_CONT);
64 }