summaryrefslogtreecommitdiff
path: root/src/game-server/actor.hpp
blob: 0c116c534f2777ae5acefc41fddf2009ad94bd82 (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
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
/*
 *  The Mana World Server
 *  Copyright 2004 The Mana World Development Team
 *
 *  This file is part of The Mana World.
 *
 *  The Mana World  is free software; you can redistribute  it and/or modify it
 *  under the terms of the GNU General  Public License as published by the Free
 *  Software Foundation; either version 2 of the License, or any later version.
 *
 *  The Mana  World is  distributed in  the hope  that it  will be  useful, but
 *  WITHOUT ANY WARRANTY; without even  the implied warranty of MERCHANTABILITY
 *  or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
 *  more details.
 *
 *  You should  have received a  copy of the  GNU General Public  License along
 *  with The Mana  World; if not, write to the  Free Software Foundation, Inc.,
 *  59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 */

#ifndef ACTOR_H
#define ACTOR_H

#include "point.h"
#include "game-server/map.hpp"
#include "game-server/thing.hpp"

/**
 * Flags that are raised as necessary. They trigger messages that are sent to
 * the clients.
 */
enum
{
    UPDATEFLAG_NEW_ON_MAP = 1,
    UPDATEFLAG_NEW_DESTINATION = 2,
    UPDATEFLAG_ATTACK = 4,
    UPDATEFLAG_ACTIONCHANGE = 8,
    UPDATEFLAG_LOOKSCHANGE = 16,
    UPDATEFLAG_DIRCHANGE = 32,
    UPDATEFLAG_HEALTHCHANGE = 64
};

/**
 * Generic client-visible object. Keeps track of position, size and what to
 * update clients about.
 */
class Actor : public Thing
{
    public:
        /**
         * Constructor.
         */
        Actor(ThingType type)
          : Thing(type),
            mActionTime(0),
            mUpdateFlags(0),
            mPublicID(65535),
            mSize(0)
        {}

        /**
         * Sets the coordinates. Also updates the walkmap of the map the actor
         * is on.
         *
         * @param p the coordinates.
         */
        void setPosition(const Point &p);

        /**
         * Gets the coordinates.
         *
         * @return the coordinates.
         */
        const Point &getPosition() const
        { return mPos; }

        /**
         * Gets what changed in the actor.
         */
        int getUpdateFlags() const
        { return mUpdateFlags; }

        /**
         * Sets some changes in the actor.
         */
        void raiseUpdateFlags(int n)
        { mUpdateFlags |= n; }

        /**
         * Clears changes in the actor.
         */
        void clearUpdateFlags()
        { mUpdateFlags = 0; }

        /**
         * Sets actor bounding circle radius.
         */
        void setSize(int s) { mSize = s; }
        int getSize() const { return mSize; }

        /**
         * Get public ID.
         *
         * @return the public ID, 65535 if none yet.
         */
        int getPublicID() const
        { return mPublicID; }

        /**
         * Set public ID. The actor shall not have any public ID yet.
         */
        void setPublicID(int id)
        { mPublicID = id; }

        /**
         * Gets the way the actor blocks pathfinding for other actors.
         */
        virtual unsigned char getWalkMask() const
        { return 0x00; } //can walk through everything

        /**
         * Overridden in order to update the walkmap.
         */
        virtual void setMap(MapComposite *map);

    protected:
        /**
         * Gets the way the actor blocks pathfinding for other actors.
         */
        virtual Map::BlockType getBlockType() const
        { return Map::BLOCKTYPE_NONE; }

        unsigned short mActionTime; /**< Delay until next action. */

    private:
        char mUpdateFlags;          /**< Changes in actor status. */

        /** Actor ID sent to clients (unique with respect to the map). */
        unsigned short mPublicID;

        Point mPos;                 /**< Coordinates. */
        unsigned char mSize;        /**< Radius of bounding circle. */
};

#endif // ACTOR_H