File: TurnInfo.h

package info (click to toggle)
vcmi 1.6.5%2Bdfsg-2
  • links: PTS, VCS
  • area: contrib
  • in suites: forky, sid, trixie
  • size: 32,060 kB
  • sloc: cpp: 238,971; python: 265; sh: 224; xml: 157; ansic: 78; objc: 61; makefile: 49
file content (84 lines) | stat: -rw-r--r-- 2,109 bytes parent folder | download
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
/*
 * TurnInfo.h, part of VCMI engine
 *
 * Authors: listed in file AUTHORS in main folder
 *
 * License: GNU General Public License v2.0 or later
 * Full text of license available in license.txt file, in main folder
 *
 */
#pragma once

#include "../bonuses/Bonus.h"
#include "../bonuses/BonusSelector.h"
#include "../bonuses/BonusCache.h"

VCMI_LIB_NAMESPACE_BEGIN

class CGHeroInstance;

class TurnInfoBonusList
{
	TConstBonusListPtr bonusList;
	std::mutex bonusListMutex;
	std::atomic<int64_t> bonusListVersion = 0;
public:
	TConstBonusListPtr getBonusList(const CGHeroInstance * target, const CSelector & bonusSelector);
};

struct TurnInfoCache
{
	TurnInfoBonusList waterWalking;
	TurnInfoBonusList flyingMovement;
	TurnInfoBonusList noTerrainPenalty;
	TurnInfoBonusList freeShipBoarding;
	TurnInfoBonusList roughTerrainDiscount;
	TurnInfoBonusList movementPointsLimitLand;
	TurnInfoBonusList movementPointsLimitWater;

	const CGHeroInstance * target;

	mutable std::atomic<int64_t> heroLowestSpeedVersion = 0;
	mutable std::atomic<int64_t> heroLowestSpeedValue = 0;

	explicit TurnInfoCache(const CGHeroInstance * target):
		target(target)
	{}
};

class DLL_LINKAGE TurnInfo
{
private:
	const CGHeroInstance * target;

	// stores cached values per each terrain
	std::vector<bool> noterrainPenalty;

	int flyingMovementValue;
	int waterWalkingValue;
	int roughTerrainDiscountValue;
	int movePointsLimitLand;
	int movePointsLimitWater;

	bool waterWalkingTest;
	bool flyingMovementTest;
	bool freeShipBoardingTest;

public:
	int hasWaterWalking() const;
	int hasFlyingMovement() const;
	int hasNoTerrainPenalty(const TerrainId & terrain) const;
	int hasFreeShipBoarding() const;

	int getFlyingMovementValue() const;
	int getWaterWalkingValue() const;
	int getRoughTerrainDiscountValue() const;
	int getMovePointsLimitLand() const;
	int getMovePointsLimitWater() const;

	TurnInfo(TurnInfoCache * sharedCache, const CGHeroInstance * target, int Turn);
	bool isLayerAvailable(const EPathfindingLayer & layer) const;
	int getMaxMovePoints(const EPathfindingLayer & layer) const;
};

VCMI_LIB_NAMESPACE_END