File: Resource.h

package info (click to toggle)
spring 106.0%2Bdfsg-4
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 55,316 kB
  • sloc: cpp: 543,954; ansic: 44,800; python: 12,575; java: 12,201; awk: 5,889; sh: 1,796; asm: 1,546; xml: 655; perl: 405; php: 211; objc: 194; makefile: 76; sed: 2
file content (127 lines) | stat: -rw-r--r-- 2,852 bytes parent folder | download | duplicates (5)
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
/* This file is part of the Spring engine (GPL v2 or later), see LICENSE.html */

#ifndef _RESOURCE_H
#define _RESOURCE_H

#include <string>
#include <iterator>
#include "System/creg/creg_cond.h"


struct SResourcePack {
	static const int MAX_RESOURCES = 2;

	union {
		float res[MAX_RESOURCES];
		struct { float metal, energy; };
		struct { float res1, res2; };
	};

public:
	SResourcePack() : res1(0.0f), res2(0.0f) {}
	SResourcePack(const float m, const float e) : metal(m), energy(e) {}
	CR_DECLARE_STRUCT(SResourcePack)

	bool empty() const {
		for (int i = 0; i < MAX_RESOURCES; ++i) {
			if (res[i] != 0.0f) return false;
		}
		return true;
	}

	decltype(std::begin(res)) begin() { return std::begin(res); }
	decltype(std::end(res)) end() { return std::end(res); }

	float& operator[](const size_t i) {
		return res[i];
	}
	const float& operator[](const size_t i) const {
		return res[i];
	}

	bool operator<=(const SResourcePack& other) const {
		for (int i = 0; i < MAX_RESOURCES; ++i) {
			if (res[i] > other.res[i]) return false;
		}
		return true;
	}
	bool operator>=(const SResourcePack& other) const {
		for (int i = 0; i < MAX_RESOURCES; ++i) {
			if (res[i] < other.res[i]) return false;
		}
		return true;
	}

	SResourcePack operator+(const SResourcePack& other) const {
		SResourcePack out = *this;
		for (int i = 0; i < MAX_RESOURCES; ++i) {
			out[i] += other.res[i];
		}
		return out;
	}

	SResourcePack& operator+=(const SResourcePack& other) {
		for (int i = 0; i < MAX_RESOURCES; ++i) {
			res[i] += other.res[i];
		}
		return *this;
	}
	SResourcePack& operator-=(const SResourcePack& other) {
		for (int i = 0; i < MAX_RESOURCES; ++i) {
			res[i] -= other.res[i];
		}
		return *this;
	}

	SResourcePack& operator*=(float scale) {
		for (int i = 0; i < MAX_RESOURCES; ++i) {
			res[i] *= scale;
		}
		return *this;
	}
};


struct SResourceOrder {
	SResourcePack use;
	SResourcePack add;

	//! allow to split a resource when storage is empty/full?
	bool quantum;

	//! allow excessing when storages are full (only matters when quantum := true)
	bool overflow;

	//! handle resources separate, i.e. when metal storage is full still allow energy one to be filled?
	bool separate;

public:
	SResourceOrder() : quantum(false), overflow(false), separate(false) {}
	CR_DECLARE_STRUCT(SResourceOrder)
};


class CResourceDescription
{
public:
	CR_DECLARE_STRUCT(CResourceDescription)

	CResourceDescription();
	~CResourceDescription();

	/// The name of this resource, eg. "Energy" or "Metal"
	std::string name;
	std::string description;

	/// The optimum value for this resource, eg. 0 for "Waste" or FLT_MAX for "Metal"
	float optimum;

	/// The default extractor radius for the resource map, 0.0f if non applicable
	float extractorRadius;

	/// What value 255 in the resource map is worth
	float maxWorth;
};


#endif // _RESOURCE_H