about summary refs log tree commit diff
path: root/src/game/server/entity.hpp
blob: debe57b6a9b5a9da952b238ca7c960c6f9ab1c66 (plain)
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
#ifndef GAME_SERVER_ENTITY_H
#define GAME_SERVER_ENTITY_H

#include <new>
#include <base/vmath.hpp>

#define MACRO_ALLOC_HEAP() \
	public: \
	void *operator new(size_t size) \
	{ \
		void *p = mem_alloc(size, 1); \
		/*dbg_msg("", "++ %p %d", p, size);*/ \
		mem_zero(p, size); \
		return p; \
	} \
	void operator delete(void *p) \
	{ \
		/*dbg_msg("", "-- %p", p);*/ \
		mem_free(p); \
	} \
	private:

#define MACRO_ALLOC_POOL_ID() \
	public: \
	void *operator new(size_t size, int id); \
	void operator delete(void *p); \
	private:
	
#define MACRO_ALLOC_POOL_ID_IMPL(POOLTYPE, poolsize) \
	static char pool_data_##POOLTYPE[poolsize][sizeof(POOLTYPE)] = {{0}}; \
	static int pool_used_##POOLTYPE[poolsize] = {0}; \
	void *POOLTYPE::operator new(size_t size, int id) \
	{ \
		dbg_assert(sizeof(POOLTYPE) == size, "size error"); \
		dbg_assert(!pool_used_##POOLTYPE[id], "already used"); \
		/*dbg_msg("pool", "++ %s %d", #POOLTYPE, id);*/ \
		pool_used_##POOLTYPE[id] = 1; \
		mem_zero(pool_data_##POOLTYPE[id], size); \
		return pool_data_##POOLTYPE[id]; \
	} \
	void POOLTYPE::operator delete(void *p) \
	{ \
		int id = (POOLTYPE*)p - (POOLTYPE*)pool_data_##POOLTYPE; \
		dbg_assert(pool_used_##POOLTYPE[id], "not used"); \
		/*dbg_msg("pool", "-- %s %d", #POOLTYPE, id);*/ \
		pool_used_##POOLTYPE[id] = 0; \
		mem_zero(pool_data_##POOLTYPE[id], sizeof(POOLTYPE)); \
	}
	
/*
	Class: Entity
		Basic entity class.
*/
class ENTITY
{
	MACRO_ALLOC_HEAP()
private:
	friend class GAMEWORLD; // thy these?
	ENTITY *prev_entity;
	ENTITY *next_entity;

	ENTITY *prev_type_entity;
	ENTITY *next_type_entity;
protected:
	bool marked_for_destroy;
	int id;
	int objtype;
public:
	ENTITY(int objtype);
	virtual ~ENTITY();
	
	ENTITY *typenext() { return next_type_entity; }
	ENTITY *typeprev() { return prev_type_entity; }

	/*
		Function: destroy
			Destorys the entity.
	*/
	virtual void destroy() { delete this; }
		
	/*
		Function: reset
			Called when the game resets the map. Puts the entity
			back to it's starting state or perhaps destroys it.
	*/
	virtual void reset() {}
	
	/*
		Function: tick
			Called progress the entity to the next tick. Updates
			and moves the entity to it's new state and position.
	*/
	virtual void tick() {}

	/*
		Function: tick_defered
			Called after all entities tick() function has been called.
	*/
	virtual void tick_defered() {}
	
	/*
		Function: snap
			Called when a new snapshot is being generated for a specific
			client.
		
		Arguments:
			snapping_client - ID of the client which snapshot is
				being generated. Could be -1 to create a complete
				snapshot of everything in the game for demo
				recording.
	*/
	virtual void snap(int snapping_client) {}
	
	/*
		Function: networkclipped(int snapping_client)
			Performs a series of test to see if a client can see the
			entity.

		Arguments:
			snapping_client - ID of the client which snapshot is
				being generated. Could be -1 to create a complete
				snapshot of everything in the game for demo
				recording.
			
		Returns:
			Non-zero if the entity doesn't have to be in the snapshot.
	*/
	int networkclipped(int snapping_client);
	int networkclipped(int snapping_client, vec2 check_pos);
		

	/*
		Variable: proximity_radius
			Contains the physical size of the entity.
	*/
	float proximity_radius;
	
	/*
		Variable: pos
			Contains the current posititon of the entity.
	*/
	vec2 pos;
};

#endif