summaryrefslogtreecommitdiffstats
path: root/crawl-ref/source/spl-mis.h
blob: 781e99979546dfe6a990b9dc166922d4eba166bc (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
/*
 *  File:       spl-mis.h
 *  Summary:    Spell miscast class.
 *  Written by: Matthew Cline
 *
 *  Modified for Crawl Reference by $Author$ on $Date: 2008-06-28 22:
16:39 -0700 (Sat, 28 Jun 2008) $
 */

#ifndef SPL_MIS_H
#define SPL_MIS_H

// last updated 23jul2008 {mpc}
/* ***********************************************************************
 * called from: decks - effects - fight - item_use - it_use2 - it_use3 -
 *              item_use - monstuff - religion - spells2 - spells4 -
 *              spl-book - spl-cast - traps - xom
 * *********************************************************************** */

#include "enum.h"

#include "beam.h"
#include "mpr.h"
#include "spl-util.h"

#define ZOT_TRAP_MISCAST     (NON_MONSTER + 1)
#define WIELD_MISCAST        (NON_MONSTER + 2)
#define MELEE_MISCAST        (NON_MONSTER + 3)
#define MISC_KNOWN_MISCAST   (NON_MONSTER + 4)
#define MISC_UNKNOWN_MISCAST (NON_MONSTER + 5)

enum nothing_happens_when_type
{
    NH_DEFAULT,
    NH_NEVER,
    NH_ALWAYS
};

class actor;

class MiscastEffect
{
public:
    MiscastEffect(actor* _target, int _source, spell_type _spell, int _pow,
                  int _fail, std::string _cause = "",
                  nothing_happens_when_type _nothing_happens = NH_DEFAULT,
                  std::string _hand_str = "", bool _can_plural_hand = true);
    MiscastEffect(actor* _target, int _source, spschool_flag_type _school,
                  int _level, std::string _cause,
                  nothing_happens_when_type _nothing_happens = NH_DEFAULT,
                  std::string _hand_str = "", bool _can_plural_hand = true);
    MiscastEffect(actor* _target, int _source, spschool_flag_type _school,
                  int _pow, int _fail, std::string _cause,
                  nothing_happens_when_type _nothing_happens = NH_DEFAULT,
                  std::string _hand_str = "", bool _can_plural_hand = true);

    void do_miscast();

private:
    actor* target;
    int    source;

    std::string cause;

    spell_type         spell;
    spschool_flag_type school;

    int pow;
    int fail;
    int level;

private:
    kill_category kc;
    killer_type   kt;

    monsters* mon_target;
    monsters* mon_source;

    nothing_happens_when_type nothing_happens_when;

    std::string hand_str;
    bool        can_plural_hand;

    int    kill_source;
    actor* act_source;

    bool source_known;
    bool target_known;

    bolt beam;

    std::string all_msg;
    std::string you_msg;
    std::string mon_msg;
    std::string mon_msg_seen;
    std::string mon_msg_unseen;

    msg_channel_type msg_ch;

private:
    void init();
    std::string get_default_cause();

    bool neither_end_silenced();

    void do_msg(bool suppress_nothing_happens = false);
    void _ouch(int dam, beam_type flavour = BEAM_NONE);
    void _explosion();
    void _potion_effect(int pot_eff, int pow);
    bool _create_monster(monster_type what, int abj_deg, bool alert = false);
    void send_abyss();

    void _conjuration(int severity);
    void _enchantment(int severity);
    void _translocation(int severity);
    void _summoning(int severity);
    void _divination_you(int severity);
    void _divination_mon(int severity);
    void _necromancy(int severity);
    void _transmigration(int severity);
    void _fire(int severity);
    void _ice(int severity);
    void _earth(int severity);
    void _air(int severity);
    void _poison(int severity);
};

#endif