summaryrefslogtreecommitdiffstats
path: root/crawl-ref/source/losparam.h
blob: 15f1cc860ad7a1656e5f39a238a23978ca45af36 (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
/*
 *  File:       losparam.h
 *  Summary:    Parameters for the LOS algorithm
 */

#ifndef LOSPARAM_H
#define LOSPARAM_H

enum opacity_type
{
    OPC_CLEAR,
    OPC_HALF,    // for opaque clouds; two or more block
    OPC_OPAQUE,
     
    NUM_OPACITIES
};

// Subclasses of this are passed to losight() to modify the
// LOS calculation. Implementations will have to translate between
// relative coordinates (-8,-8)..(8,8) and real coordinates,
// specify how opaque the cells are and determine what values
// are written to the visible cells.
struct los_param
{
    virtual ~los_param() {}

    // Whether the translated coordinate lies in the map (including boundary)
    virtual bool map_bounds(const coord_def& p) const = 0;

    // appearance(p) will be copied to show(p) for visible p.
    virtual unsigned appearance(const coord_def& p) const = 0;

    virtual opacity_type opacity(const coord_def& p) const = 0;
};

// Provides translation to given center and bounds checking.
struct los_param_trans : los_param
{
    coord_def center;

    los_param_trans(const coord_def& c);

    coord_def trans(const coord_def& p) const;

    bool map_bounds(const coord_def& p) const;
};

// Everything is visible.
struct los_param_permissive : los_param_trans
{
    los_param_permissive(const coord_def& c);

    unsigned appearance(const coord_def& p) const;
    opacity_type opacity(const coord_def& p) const;
};

// A complete base implementation that does standard visibility
// based on env.grid.
struct los_param_base : los_param_trans
{
    los_param_base(const coord_def& c);

    dungeon_feature_type feature(const coord_def& p) const;
    unsigned appearance(const coord_def& p) const;
    unsigned short cloud_idx(const coord_def& p) const;
    opacity_type opacity(const coord_def& p) const;
};

// Provides a compatible set of parameters for use with the
// legacy losight() function.
struct los_param_compat : los_param_base
{
    feature_grid grid;
    bool solid_blocks;
    bool ignore_clouds;

    los_param_compat(const feature_grid& gr, const coord_def& c,
                     bool sb, bool ic);

    dungeon_feature_type feature(const coord_def& p) const;
    unsigned appearance(const coord_def& p) const;
    opacity_type opacity(const coord_def& p) const;
};

#endif