Project::OSiRiON - Git repositories
Project::OSiRiON
News . About . Screenshots . Downloads . Forum . Wiki . Tracker . Git
summaryrefslogtreecommitdiff
blob: 0513bc3fe8a651cf93026e1f6abaa8c0f0c28cc0 (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
146
147
148
149
150
151
152
153
154
155
156
157
158
/*
   base/faction.h
   This file is part of the Osirion project and is distributed under
   the terms and conditions of the GNU General Public License version 2
*/

#ifndef __INCLUDED_BASE_FACTION_H__
#define __INCLUDED_BASE_FACTION_H__

#include <list>

#include "math/color.h"
#include "core/entity.h"
#include "core/info.h"
#include "core/reputation.h"

namespace game
{
	
class Faction : public core::Info {
public:
	Faction();
	virtual ~Faction();
	
	/* --- inspectors ------------------------------------------------- */
	
	inline const math::Color & color() const
	{
		return faction_color;
	}
	
	inline const math::Color & color_second() const
	{
		return faction_color_second;
	}

	/**
	 * @brief faction reputation 
	 * */
	inline const core::Reputation & reputation() const
	{
		return faction_reputation;
	}
	
	/**
	 * @brief faction reputation 
	 * */
	inline core::Reputation & reputation()
	{
		return faction_reputation;
	}
	
	/**
	 * @brief player reputation with a specific faction
	 * */
	inline const float reputation(const core::Info *faction) const
	{
		if (faction == this) {
			return 100.0f;
		} else {
			return faction_reputation.reputation(faction);
		}
	}
	
	/* --- actors ----------------------------------------------------- */

	/**
	 * @brief apply faction colors to an entity
	 */
	void apply(core::Entity *entity) const;

	/* --- mutators --------------------------------------------------- */
	
	inline void set_color(const math::Color &color)
	{
		faction_color.assign(color);
	}
	
	inline void set_color_second(const math::Color &color_second)
	{
		faction_color_second.assign(color_second);
	}
	
	/**
	 * @brief adjust player reputation for a kill of a member of this faction
	 */
	void apply_kill(core::Player *player) const;
	
	/**
	 * @brief adjust player reputation for buying from/selling to this faction
	 */
	void apply_sale(core::Player *player, const float amount) const;
	
	virtual void print() const;
	
	/* --- static ----------------------------------------------------- */
	
	/**
	 * @brief initialize Faction infotype and read factions.init
	 */
	static bool init();
	
	/**
	 * @brief cleanup routines
	 */
	static void done();
	
	/**
	 * @brief list available factions
	 */
	static void list();
	
	/**
	 * @brief returns a pointer to the faction with the given label, returns 0 if not found.
	 * */
	static Faction *find(const std::string & label);
	
	/**
	 * @brief apply default reputation
	 * */
	static void apply_default(core::Reputation & reputation);
		
	/**
	 * @brief faction info type
	 * */
	static inline const core::InfoType *infotype() {
		return faction_infotype;
	}
	
	/**
	 * @brief default faction
	 * This faction represents the default player reputation.
	 * No ships should be a member of this faction, not even player ships.
	 * */
	static inline const Faction *default_faction()
	{
		return faction_default;
	}
	
private:
	
	/* --- attributes ------------------------------------------------- */
	
	math::Color		faction_color;
	math::Color		faction_color_second;
	
	core::Reputation	faction_reputation;
	
	/* --- static ----------------------------------------------------- */

	static core::InfoType *faction_infotype;
	
	static Faction *faction_default;
};

} // namespace game

#endif // __INCLUDED_BASE_FACTION_H__