-
Notifications
You must be signed in to change notification settings - Fork 0
/
TetrisLogic.h
167 lines (141 loc) · 4.99 KB
/
TetrisLogic.h
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
159
160
161
162
163
164
165
166
167
#ifndef __TETRISLOGIC_H__
#define __TETRISLOGIC_H__
/**
* TetrisLogic.h
*
* $Revision$
* $Id$
*
* Pitää sisällään / vastaa luonnista ja tuhoamisesta:
* - TetrisBoard gameBoard
* - Tetromino currentTetromino
* - Tetromino[] nextTetrominoes
* - Timer -> logiikka rekisteröityy timerille tick-kuuntelijaksi
* -
*/
#include "CommandListener.h"
#include "Observable.h"
#include "TickListener.h"
#include "TickTask.h"
#include "TetrisStats.h"
#include "TetrisBoard.h"
#include "Tetromino.h"
#include "TetrisCommon.h"
#include "TetrominoFactory.h"
#include "GameStateListener.h"
//#define PREVIEW_TETROMINOES 3
#define GAMEBOARD_WIDTH 12
#define GAMEBOARD_HEIGHT 20
//#define PREVIEWBOARD_WIDTH 4
//#define PREVIEWBOARD_HEIGHT 20 //jahas tätä ei käytetä missään
class CTetrisLogic : public VObservable<VGameStateListener>, public VCommandListener, public VTickListener {
friend class VObservable<VGameStateListener>;
public:
CTetrisLogic();
CTetrisLogic(const int gameboardWidth, const int gameboardHeight);
virtual ~CTetrisLogic();
/**
* reset()
*
* @deprecated revision 72 jälkeen logiikkaa ei enää voi resetoida, luonnit
* hoidetaan konstruktorissa ja tuhoamiset destruktorissa.
* Uuden pelin aloittamiseksi luodaan kokonaan uusi TetrisLogic.
*/
// void reset(void);
/**
* start()
*
* Asettaa pelin ajotilaan.
*/
bool start(void);
/**
* getGameBoard()
*
* @return TetrisBoard, jossa peli tapahtuu
*/
inline CTetrisBoard* getGameBoard(void) {
return m_gameBoard;
}
/**
* getPreviewBoard()
*
* @return TetrisBoard, jossa preview-palikat ovat kiinni
*/
inline CTetrisBoard* getPreviewBoard(void) {
return m_previewBoard;
}
/**
* getStats()
*
* @return TetrisStats -luokka, joka tietää pelitilanteen (statsit)
*/
inline CTetrisStats* getStats(void) {
return m_stats;
}
/**
* handleKeyCommand()
*
* @see CommandListener.h
*/
virtual void handleCommand(VCommandListener::COMMAND cmd);
/**
* tick()
*
* Toiminta timerin antaman tickin aikana
* Tickissä logiikka:
* - yrittää tiputtaa nykyistä palikkaa
* - jos nykyinen palikka ei voi enään tippua (block->hasLanded = true)
* - nykyinen palikka tuhotaan
* - preview-palikoista seuraava siirretään nykyiseksi
* - luodaan uusi preview-palikka poistetun tilalle
* - nostetaan jäljellejääneiden preview-palikoiden sijaintia
* preview-boardissa
* - liitetään uusi preview-palikka preview-lautaan
* - käskee lautaa tyhjäämään täydet rivit
* - mikäli uusi palikka on otettu käyttöön, lisätään se (block->attach())
* (nimenomaan vasta täysien rivien tyhjennyksen jälkeen??)
* - säädetään tickin timeria laudan räjäytettyjen rivien perusteella
* tai pelissä olleiden palikoiden mukaan
*/
int handleTick(void);
inline bool isRunning() { return m_running; }
// ==================== PRIVATE ====================
private:
SConfig *settings;
int m_previewBoardSize;
//int m_previewBoardHeight;
int m_previewBoardWidth;
// räjäytetyt rivit saadaan boardilta kysymällä
CTetrisBoard *m_gameBoard; // pelilauta, jossa pelaaminen tapahtuu
CTetrisBoard *m_previewBoard; // previewBoard, jossa näkyy seuraavat palikat
CTetromino *m_currentTetromino; // nykyinen palikka, kiinnitetty pelilautaan
//CTetromino *m_previewTetrominoes[m_previewBoardSize];
CTetromino *m_previewTetrominoes[3]; //TODO: yhyy miksi nämä on tehty arraynä, kun ei voida lukea arvoa configista tähän ennen tätä määrittelyä!
CTetrisStats *m_stats;
bool m_gameOver;
bool m_running;
bool m_moveLock; // true = nykyistä palikkaa ei voida liikuttaa
CTetrominoFactory *m_factory;
CTickTask *myTickTask; // ei vastaa tämän tuhoamisesta
int m_previewSpacingY;
int m_previewCount;
// CTetrisTimer m_timer; // timer, joka osaa kutsua tämän luokan tick():ä ja jota voi säätää
/**
* rotateTetrominoes()
*
* Pyöräyttää palikkajonoa yhdellä eteenpäin:
* - Tuhoaa nykyisen pelipalikan (currentTetromino), ja ottaa
* previewTetromino-taulukosta seuraavaksi vuorossa olevan nykyiseksi.
* - Irrottaa seuraavaksi vuorossa olevan preview-palikan previewBoardista
* - Kiinnittää uuden nykyisen gameBoardiin
* - Nostaa jäljelle jääneiden preview-palikoiden vuoronumeroa yhdellä.
* - Nostaa jäljelle jääneiden preview-palikoiden sijaintia previewBoardissa
* - Luo preview-taulun loppuun uuden palikan.
* - Kiinnittää preview-taulun loppuun luodun palikan previewBoardiin
* omalle paikalleen
*/
void rotateTetrominoes(void);
void initialize(void);
void notifyGameState(VGameStateListener::GAMESTATE state);
};
#endif // __TETRISLOGIC_H__