~kubuntu-members/killbots/4.11

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
/*
 *  Copyright 2006-2009  Parker Coates <coates@kde.org>
 *
 *  This file is part of Killbots.
 *
 *  Killbots 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
 *  (at your option) any later version.
 *
 *  Killbots 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 Killbots. If not, see <http://www.gnu.org/licenses/>.
 */

#ifndef KILLBOTS_ENGINE_H
#define KILLBOTS_ENGINE_H

#include "actions.h"
#include "ruleset.h"

#include <QtCore/QObject>
#include <QtCore/QHash>
class QPoint;

namespace Killbots
{
	class Coordinator;
	class Sprite;

	class Engine : public QObject
	{
		Q_OBJECT

	public: // functions
		explicit Engine( Coordinator * scene, QObject * parent = 0 );
		virtual ~Engine();

		void setRuleset( const Ruleset * ruleset );
		const Ruleset * ruleset() const;

		bool gameHasStarted() const;
		bool isRoundComplete() const;
		bool isHeroDead() const;
		bool isBoardFull() const;
		bool canSafeTeleport() const;
		bool canUseVaporizer() const;

		void startNewGame();
		void startNewRound( bool incrementRound = true, const QString & layout = QString() );

		bool moveHero( Killbots::HeroAction direction );
		bool teleportHero();
		bool teleportHeroSafely();
		bool useVaporizer();
		bool waitOutRound();

		void moveRobots( bool justFastbots = false );
		void assessDamage();
		void resetBotCounts();
		void endGame();

	signals:
		void roundChanged( int round );
		void scoreChanged( int score );
		void enemyCountChanged( int enemyCount );
		void energyChanged( int energy );
		void gameOver( int score, int round );

		void showNewGameMessage();
		void showRoundCompleteMessage();
		void showBoardFullMessage();
		void showGameOverMessage();

		void teleportAllowed( bool allowed );
		void teleportSafelyAllowed( bool allowed );
		void vaporizerAllowed( bool allowed );
		void waitOutRoundAllowed( bool allowed );

	private: // functions
		void refreshSpriteMap();
		int spriteTypeAt( const QPoint & cell ) const;
		QPoint offsetFromDirection( int direction ) const;
		QPoint randomEmptyCell() const;

		bool cellIsValid( const QPoint & cell ) const;
		bool moveIsValid( const QPoint & cell, HeroAction direction ) const;
		bool moveIsSafe( const QPoint &  cell, HeroAction direction ) const;
		bool canPushJunkheap( const Sprite * junkheap, HeroAction direction ) const;

		void pushJunkheap( Sprite * junkheap, HeroAction direction );
		void cleanUpRound();
		void destroySprite( Sprite * sprite, bool calculatePoints = true );
		bool destroyAllCollidingBots( const Sprite * sprite, bool calculatePoints = true );
		void updateScore( int changeInScore );
		void updateEnergy( int changeInEnergy );

		QString gridToString() const;

	private: // data members
		Coordinator * m_coordinator;

		Sprite * m_hero;
		QList<Sprite *> m_bots;
		QList<Sprite *> m_junkheaps;

		const Ruleset * m_rules;
		int m_round;
		int m_score;
		int m_energy;
		qreal m_maxEnergy;
		qreal m_robotCount;
		qreal m_fastbotCount;
		qreal m_junkheapCount;

		bool m_heroIsDead;
		bool m_waitingOutRound;

		QMultiHash<QPoint, Sprite *> m_spriteMap;

		friend class EngineTest;
	};
}

#endif