| 06fd7dec |
sago007 |
2016-04-04 17:53 |
1 |
/* |
| 06fd7dec |
sago007 |
2016-04-04 17:53 |
2 |
=========================================================================== |
| 06fd7dec |
sago007 |
2016-04-04 17:53 |
3 |
blockattack - Block Attack - Rise of the Blocks |
| 06fd7dec |
sago007 |
2016-04-04 17:53 |
4 |
Copyright (C) 2005-2016 Poul Sander |
| 06fd7dec |
sago007 |
2016-04-04 17:53 |
5 |
|
| 06fd7dec |
sago007 |
2016-04-04 17:53 |
6 |
This program is free software: you can redistribute it and/or modify |
| 06fd7dec |
sago007 |
2016-04-04 17:53 |
7 |
it under the terms of the GNU General Public License as published by |
| 06fd7dec |
sago007 |
2016-04-04 17:53 |
8 |
the Free Software Foundation, either version 2 of the License, or |
| 06fd7dec |
sago007 |
2016-04-04 17:53 |
9 |
(at your option) any later version. |
| 06fd7dec |
sago007 |
2016-04-04 17:53 |
10 |
|
| 06fd7dec |
sago007 |
2016-04-04 17:53 |
11 |
This program is distributed in the hope that it will be useful, |
| 06fd7dec |
sago007 |
2016-04-04 17:53 |
12 |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 06fd7dec |
sago007 |
2016-04-04 17:53 |
13 |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 06fd7dec |
sago007 |
2016-04-04 17:53 |
14 |
GNU General Public License for more details. |
| 06fd7dec |
sago007 |
2016-04-04 17:53 |
15 |
|
| 06fd7dec |
sago007 |
2016-04-04 17:53 |
16 |
You should have received a copy of the GNU General Public License |
| 06fd7dec |
sago007 |
2016-04-04 17:53 |
17 |
along with this program. If not, see http://www.gnu.org/licenses/ |
| 06fd7dec |
sago007 |
2016-04-04 17:53 |
18 |
|
| 06fd7dec |
sago007 |
2016-04-04 17:53 |
19 |
Source information and contacts persons can be found at |
| 810e1c2f |
sago007 |
2018-03-28 09:40 |
20 |
https://blockattack.net |
| 06fd7dec |
sago007 |
2016-04-04 17:53 |
21 |
=========================================================================== |
| 06fd7dec |
sago007 |
2016-04-04 17:53 |
22 |
*/ |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
23 |
|
| e8d66c68 |
sago007 |
2016-07-12 17:32 |
24 |
#include "BlockGame.hpp" |
| c310f8a5 |
sago007 |
2017-03-25 16:05 |
25 |
#include "global.hpp" |
| 343fbe43 |
sago007 |
2018-03-27 19:53 |
26 |
#include "sago/SagoTextField.hpp" |
| a3a8b2b4 |
Poul Sander |
2023-10-15 21:04 |
27 |
#include "BallManager.hpp" |
| a3a8b2b4 |
Poul Sander |
2023-10-15 21:04 |
28 |
#include "puzzlehandler.hpp" |
| a3a8b2b4 |
Poul Sander |
2023-10-15 21:04 |
29 |
|
| a3a8b2b4 |
Poul Sander |
2023-10-15 21:04 |
30 |
extern BallManager theBallManager; |
| a3a8b2b4 |
Poul Sander |
2023-10-15 21:04 |
31 |
|
| a3a8b2b4 |
Poul Sander |
2023-10-15 21:04 |
32 |
extern ExplosionManager theExplosionManager; |
| e8d66c68 |
sago007 |
2016-07-12 17:32 |
33 |
|
| 5d36f49f |
Poul Sander |
2023-07-11 22:38 |
34 |
|
| 343fbe43 |
sago007 |
2018-03-27 19:53 |
35 |
static void setScoreboardFont(const sago::SagoDataHolder* holder, sago::SagoTextField& field, const char* text){ |
| 343fbe43 |
sago007 |
2018-03-27 19:53 |
36 |
field.SetHolder(holder); |
| 343fbe43 |
sago007 |
2018-03-27 19:53 |
37 |
field.SetFont("penguinattack"); |
| 343fbe43 |
sago007 |
2018-03-27 19:53 |
38 |
field.SetColor({255,255,255,255}); |
| 343fbe43 |
sago007 |
2018-03-27 19:53 |
39 |
field.SetFontSize(20); |
| 343fbe43 |
sago007 |
2018-03-27 19:53 |
40 |
field.SetText(text); |
| 343fbe43 |
sago007 |
2018-03-27 19:53 |
41 |
} |
| e8d66c68 |
sago007 |
2016-07-12 17:32 |
42 |
|
| 871ce5d6 |
sago007 |
2018-03-28 12:36 |
43 |
static void setButtonFont(const sago::SagoDataHolder* holder, sago::SagoTextField& field, const char* text){ |
| 871ce5d6 |
sago007 |
2018-03-28 12:36 |
44 |
field.SetHolder(holder); |
| 871ce5d6 |
sago007 |
2018-03-28 12:36 |
45 |
field.SetFont("freeserif"); |
| 871ce5d6 |
sago007 |
2018-03-28 12:36 |
46 |
field.SetColor({255,255,255,255}); |
| 871ce5d6 |
sago007 |
2018-03-28 12:36 |
47 |
field.SetFontSize(24); |
| f6e8c704 |
sago007 |
2018-04-03 21:39 |
48 |
field.SetOutline(1, {64,64,64,255}); |
| 871ce5d6 |
sago007 |
2018-03-28 12:36 |
49 |
field.SetText(text); |
| 871ce5d6 |
sago007 |
2018-03-28 12:36 |
50 |
} |
| 871ce5d6 |
sago007 |
2018-03-28 12:36 |
51 |
|
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
52 |
class BlockGameSdl : public BlockGame { |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
53 |
public: |
| 343fbe43 |
sago007 |
2018-03-27 19:53 |
54 |
BlockGameSdl(int tx, int ty, const sago::SagoDataHolder* holder) { |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
55 |
topx = tx; |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
56 |
topy = ty; |
| 343fbe43 |
sago007 |
2018-03-27 19:53 |
57 |
setScoreboardFont(holder, scoreLabel, _("Score:")); |
| 343fbe43 |
sago007 |
2018-03-27 19:53 |
58 |
setScoreboardFont(holder, timeLabel, _("Time:")); |
| 343fbe43 |
sago007 |
2018-03-27 19:53 |
59 |
setScoreboardFont(holder, chainLabel, _("Chain:")); |
| 343fbe43 |
sago007 |
2018-03-27 19:53 |
60 |
setScoreboardFont(holder, speedLabel, _("Speed:")); |
| 871ce5d6 |
sago007 |
2018-03-28 12:36 |
61 |
setButtonFont(holder, buttonNext, _("Next")); |
| 871ce5d6 |
sago007 |
2018-03-28 12:36 |
62 |
setButtonFont(holder, buttonRetry, _("Retry")); |
| 871ce5d6 |
sago007 |
2018-03-28 12:36 |
63 |
setButtonFont(holder, buttonSkip, _("Skip")); |
| fc338170 |
sago007 |
2018-03-28 14:31 |
64 |
setButtonFont(holder, stopIntField, ""); |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
65 |
} |
| 7d649ca8 |
sago007 |
2016-10-02 16:43 |
66 |
|
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
67 |
|
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
68 |
void DrawImgBoard(const sago::SagoSprite& img, int x, int y) const { |
| 72383a9e |
sago007 |
2016-10-30 11:56 |
69 |
DrawIMG(img, globalData.screen, x+topx, y+topy); |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
70 |
} |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
71 |
|
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
72 |
void DrawImgBoardBounded(const sago::SagoSprite& img, int x, int y) const { |
| 5d36f49f |
Poul Sander |
2023-07-11 22:38 |
73 |
DrawIMG_Bounded(img, globalData.screen, x+topx, y+topy, topx, topy, topx + BOARD_WIDTH, topy + BOARD_HEIGHT); |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
74 |
} |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
75 |
|
| 871ce5d6 |
sago007 |
2018-03-28 12:36 |
76 |
void PrintTextCenteredBoard(int x, int y, sago::SagoTextField& field) { |
| 871ce5d6 |
sago007 |
2018-03-28 12:36 |
77 |
field.Draw(globalData.screen, x+topx+60, y+topy+20, |
| 871ce5d6 |
sago007 |
2018-03-28 12:36 |
78 |
sago::SagoTextField::Alignment::center, sago::SagoTextField::VerticalAlignment::center); |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
79 |
} |
| e8d66c68 |
sago007 |
2016-07-12 17:32 |
80 |
|
| 7d649ca8 |
sago007 |
2016-10-02 16:43 |
81 |
void SetTopXY(int tx, int ty) { |
| 7d649ca8 |
sago007 |
2016-10-02 16:43 |
82 |
topx = tx; |
| 7d649ca8 |
sago007 |
2016-10-02 16:43 |
83 |
topy = ty; |
| 7d649ca8 |
sago007 |
2016-10-02 16:43 |
84 |
} |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
85 |
|
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
86 |
int GetTopX() const { |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
87 |
return topx; |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
88 |
} |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
89 |
int GetTopY() const { |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
90 |
return topy; |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
91 |
} |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
92 |
|
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
93 |
/** |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
94 |
* Retrives the coordinate to a given brick based on mouse input. |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
95 |
* @param match true if the coordinate are within borders |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
96 |
* @param mousex mouse coordinate input |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
97 |
* @param mousey mouse coordiante input |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
98 |
* @param x brick x. Unchanged if outside border |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
99 |
* @param y brick y. Unchanged if outside border |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
100 |
*/ |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
101 |
void GetBrickCoordinateFromMouse(bool& match, int mousex, int mousey, int& x, int& y) const { |
| 706e81fe |
sago007 |
2016-04-05 19:17 |
102 |
if (!IsInTheBoard(mousex, mousey)) { |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
103 |
match = false; |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
104 |
return; |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
105 |
} |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
106 |
match = true; |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
107 |
x = (mousex-topx) / bsize; |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
108 |
y = (bsize*12+topy-mousey-pixels) / bsize; |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
109 |
} |
| 706e81fe |
sago007 |
2016-04-05 19:17 |
110 |
|
| 706e81fe |
sago007 |
2016-04-05 19:17 |
111 |
bool IsInTheBoard(int mousex, int mousey) const { |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
112 |
if (mousex < topx || mousex > topx+bsize*6 || mousey < topy || mousey > topy+bsize*12) { |
| 706e81fe |
sago007 |
2016-04-05 19:17 |
113 |
return false; |
| 706e81fe |
sago007 |
2016-04-05 19:17 |
114 |
} |
| 706e81fe |
sago007 |
2016-04-05 19:17 |
115 |
return true; |
| 706e81fe |
sago007 |
2016-04-05 19:17 |
116 |
} |
| 706e81fe |
sago007 |
2016-04-05 19:17 |
117 |
|
| 706e81fe |
sago007 |
2016-04-05 19:17 |
118 |
bool IsUnderTheBoard(int mousex, int mousey) const { |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
119 |
if (mousex < topx || mousex > topx+bsize*6 || mousey < topy+bsize*12) { |
| 706e81fe |
sago007 |
2016-04-05 19:17 |
120 |
return false; |
| 706e81fe |
sago007 |
2016-04-05 19:17 |
121 |
} |
| 706e81fe |
sago007 |
2016-04-05 19:17 |
122 |
return true; |
| 706e81fe |
sago007 |
2016-04-05 19:17 |
123 |
} |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
124 |
|
| 3f3ff0b6 |
sago007 |
2018-03-30 12:59 |
125 |
void AddText(int x, int y, unsigned int text, int time) const override { |
| c310f8a5 |
sago007 |
2017-03-25 16:05 |
126 |
globalData.theTextManager.addText(topx-10+x*bsize, topy+12*bsize-y*bsize, text, time); |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
127 |
} |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
128 |
|
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
129 |
void AddBall(int x, int y, bool right, int color) const override { |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
130 |
theBallManager.addBall(topx+40+x*bsize, topy+bsize*12-y*bsize, right, color); |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
131 |
} |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
132 |
|
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
133 |
void AddExplosion(int x, int y) const override { |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
134 |
theExplosionManager.addExplosion(topx-10+x*bsize, topy+bsize*12-10-y*bsize); |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
135 |
} |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
136 |
|
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
137 |
void PlayerWonEvent() const override { |
| 72383a9e |
sago007 |
2016-10-30 11:56 |
138 |
if (!globalData.SoundEnabled) { |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
139 |
return; |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
140 |
} |
| a3a8b2b4 |
Poul Sander |
2023-10-15 21:04 |
141 |
Mix_PlayChannel(1, globalData.applause.get(), 0); |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
142 |
} |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
143 |
|
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
144 |
void DrawEvent() const override { |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
145 |
Mix_HaltChannel(1); |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
146 |
} |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
147 |
|
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
148 |
void BlockPopEvent() const override { |
| 72383a9e |
sago007 |
2016-10-30 11:56 |
149 |
if (!globalData.SoundEnabled) { |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
150 |
return; |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
151 |
} |
| a3a8b2b4 |
Poul Sander |
2023-10-15 21:04 |
152 |
Mix_PlayChannel(0, globalData.boing.get(), 0); |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
153 |
} |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
154 |
|
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
155 |
void LongChainDoneEvent() const override { |
| 72383a9e |
sago007 |
2016-10-30 11:56 |
156 |
if (!globalData.SoundEnabled) { |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
157 |
return; |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
158 |
} |
| a3a8b2b4 |
Poul Sander |
2023-10-15 21:04 |
159 |
Mix_PlayChannel(1, globalData.applause.get(), 0); |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
160 |
} |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
161 |
|
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
162 |
void TimeTrialEndEvent() const override { |
| 72383a9e |
sago007 |
2016-10-30 11:56 |
163 |
if (!globalData.NoSound && globalData.SoundEnabled) { |
| a3a8b2b4 |
Poul Sander |
2023-10-15 21:04 |
164 |
Mix_PlayChannel(1,globalData.counterFinalChunk.get(),0); |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
165 |
} |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
166 |
} |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
167 |
|
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
168 |
void EndlessHighscoreEvent() const override { |
| 72383a9e |
sago007 |
2016-10-30 11:56 |
169 |
if (!globalData.SoundEnabled) { |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
170 |
return; |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
171 |
} |
| a3a8b2b4 |
Poul Sander |
2023-10-15 21:04 |
172 |
Mix_PlayChannel(1, globalData.applause.get(), 0); |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
173 |
} |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
174 |
private: |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
175 |
|
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
176 |
/** |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
177 |
This crops "dstrect" and "srcrect" to fit inside "bounds" |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
178 |
dstrect and srcrect are modified in place. |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
179 |
*/ |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
180 |
void CropTexture(SDL_Rect& dstrect, SDL_Rect& srcrect, const SDL_Rect& bounds) const { |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
181 |
if (dstrect.x > bounds.x+bounds.w) { |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
182 |
dstrect = {0,0,0,0}; |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
183 |
return; |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
184 |
} |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
185 |
if (dstrect.y > bounds.y+bounds.h) { |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
186 |
dstrect = {0,0,0,0}; |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
187 |
return; |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
188 |
} |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
189 |
if (dstrect.x+dstrect.w < bounds.x) { |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
190 |
dstrect = {0,0,0,0}; |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
191 |
return; |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
192 |
} |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
193 |
if (dstrect.y+dstrect.h < bounds.y) { |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
194 |
dstrect = {0,0,0,0}; |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
195 |
return; |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
196 |
} |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
197 |
if (dstrect.x < bounds.x) { |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
198 |
Sint16 absDiff = bounds.x-dstrect.x; |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
199 |
dstrect.x+=absDiff; |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
200 |
srcrect.x+=absDiff; |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
201 |
dstrect.w-=absDiff; |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
202 |
srcrect.w-=absDiff; |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
203 |
} |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
204 |
if (dstrect.y < bounds.y) { |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
205 |
Sint16 absDiff = bounds.y-dstrect.y; |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
206 |
dstrect.y+=absDiff; |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
207 |
srcrect.y+=absDiff; |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
208 |
dstrect.h-=absDiff; |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
209 |
srcrect.h-=absDiff; |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
210 |
} |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
211 |
if (dstrect.x+dstrect.w > bounds.x+bounds.w) { |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
212 |
Sint16 absDiff = dstrect.x+dstrect.w-(bounds.x+bounds.w); |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
213 |
dstrect.w -= absDiff; |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
214 |
srcrect.w -= absDiff; |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
215 |
} |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
216 |
if (dstrect.y+dstrect.h > bounds.y+bounds.h) { |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
217 |
Sint16 absDiff = dstrect.y+dstrect.h-(bounds.y+bounds.h); |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
218 |
dstrect.h -= absDiff; |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
219 |
srcrect.h -= absDiff; |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
220 |
} |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
221 |
} |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
222 |
|
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
223 |
/** |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
224 |
* Creates a new texture for a garabge block of size size_x*size_y at x,y and crops it. |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
225 |
* Also sets globalData.screen to point to the texture, so Draw now draws on the Texture. |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
226 |
*/ |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
227 |
SDL_Texture* CreateGarbageTexture(int x, int y, int size_x, int size_y, SDL_Rect& dstrect, SDL_Rect& srcrect) const { |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
228 |
dstrect = { x, y, size_x*bsize, size_y*bsize }; |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
229 |
srcrect = { 0, 0, size_x*bsize, size_y*bsize }; |
| 5d36f49f |
Poul Sander |
2023-07-11 22:38 |
230 |
SDL_Rect bound = {topx, topy, BOARD_WIDTH, BOARD_HEIGHT}; |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
231 |
CropTexture (dstrect, srcrect, bound); |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
232 |
SDL_Texture* mTexture = SDL_CreateTexture( globalData.screen, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, size_x*bsize, size_y*bsize ); |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
233 |
SDL_SetRenderTarget( globalData.screen, mTexture ); |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
234 |
|
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
235 |
SDL_SetRenderDrawBlendMode(globalData.screen, SDL_BLENDMODE_NONE); |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
236 |
SDL_SetTextureBlendMode(mTexture, SDL_BLENDMODE_BLEND); |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
237 |
SDL_SetRenderDrawColor(globalData.screen, 0, 0, 0, 0); |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
238 |
SDL_RenderFillRect(globalData.screen, NULL); |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
239 |
SDL_SetRenderDrawBlendMode(globalData.screen, SDL_BLENDMODE_BLEND); |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
240 |
return mTexture; |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
241 |
} |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
242 |
|
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
243 |
/** |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
244 |
Paints a garbage block of size size_x*size_y (size in blocks) at x,y (coordinates in pixels). |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
245 |
The garbage block will be painted on an internal texture and rendered to screen to protect against tearing. |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
246 |
The result will be cropped to the playable area. |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
247 |
*/ |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
248 |
void PaintGarbageBlock(int x, int y, int size_x, int size_y) const { |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
249 |
SDL_Rect dstrect ; |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
250 |
SDL_Rect srcrect ; |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
251 |
SDL_Texture* mTexture = CreateGarbageTexture(x, y, size_x, size_y, dstrect, srcrect); |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
252 |
const Sint32 draw_time = SDL_GetTicks(); |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
253 |
|
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
254 |
if (size_y == 1) { |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
255 |
//single line |
| a3a8b2b4 |
Poul Sander |
2023-10-15 21:04 |
256 |
globalData.garbageML.Draw(globalData.screen, draw_time, 0, 0); |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
257 |
for (int i = 1; i < size_x-1; ++i) { |
| a3a8b2b4 |
Poul Sander |
2023-10-15 21:04 |
258 |
globalData.garbageM.Draw(globalData.screen, draw_time, i*bsize, 0); |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
259 |
} |
| a3a8b2b4 |
Poul Sander |
2023-10-15 21:04 |
260 |
globalData.garbageMR.Draw(globalData.screen, draw_time, (size_x-1)*bsize, 0); |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
261 |
} |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
262 |
if (size_y > 1) { |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
263 |
// Top line |
| a3a8b2b4 |
Poul Sander |
2023-10-15 21:04 |
264 |
globalData.garbageTL.Draw(globalData.screen, draw_time, 0, 0); |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
265 |
for (int i = 1; i < size_x-1; ++i) { |
| a3a8b2b4 |
Poul Sander |
2023-10-15 21:04 |
266 |
globalData.garbageT.Draw(globalData.screen, draw_time, i*bsize, 0); |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
267 |
} |
| a3a8b2b4 |
Poul Sander |
2023-10-15 21:04 |
268 |
globalData.garbageTR.Draw(globalData.screen, draw_time, (size_x-1)*bsize, 0); |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
269 |
// Middle lines (if any) |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
270 |
for (int j=1; j < size_y-1; ++j) { |
| a3a8b2b4 |
Poul Sander |
2023-10-15 21:04 |
271 |
globalData.garbageL.Draw(globalData.screen, draw_time, 0, j*bsize); |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
272 |
for (int i = 1; i < size_x-1; ++i) { |
| a3a8b2b4 |
Poul Sander |
2023-10-15 21:04 |
273 |
globalData.garbageFill.Draw(globalData.screen, draw_time, i*bsize, j*bsize); |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
274 |
} |
| a3a8b2b4 |
Poul Sander |
2023-10-15 21:04 |
275 |
globalData.garbageR.Draw(globalData.screen, draw_time, (size_x-1)*bsize, j*bsize); |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
276 |
} |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
277 |
//Buttom line |
| a3a8b2b4 |
Poul Sander |
2023-10-15 21:04 |
278 |
globalData.garbageBL.Draw(globalData.screen, draw_time, 0, (size_y-1)*bsize); |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
279 |
for (int i = 1; i < size_x-1; ++i) { |
| a3a8b2b4 |
Poul Sander |
2023-10-15 21:04 |
280 |
globalData.garbageB.Draw(globalData.screen, draw_time, i*bsize, (size_y-1)*bsize); |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
281 |
} |
| a3a8b2b4 |
Poul Sander |
2023-10-15 21:04 |
282 |
globalData.garbageBR.Draw(globalData.screen, draw_time, (size_x-1)*bsize, (size_y-1)*bsize); |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
283 |
} |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
284 |
|
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
285 |
SDL_SetRenderTarget( globalData.screen, nullptr ); |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
286 |
SDL_RenderCopy( globalData.screen, mTexture, &srcrect, &dstrect ); |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
287 |
SDL_DestroyTexture(mTexture); |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
288 |
} |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
289 |
|
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
290 |
/** |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
291 |
Paints a grey garbage block of size size_x (size in blocks, always 6) at x,y (coordinates in pixels). |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
292 |
The result will be cropped to the playable area. |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
293 |
*/ |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
294 |
void PaintGreyGarbageBlock(int x, int y, int size_x) const { |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
295 |
const int size_y = bsize; |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
296 |
SDL_Rect dstrect ; |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
297 |
SDL_Rect srcrect ; |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
298 |
SDL_Texture* mTexture = CreateGarbageTexture(x, y, size_x, size_y, dstrect, srcrect); |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
299 |
const Sint32 draw_time = SDL_GetTicks(); |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
300 |
|
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
301 |
for (int j=0; j < size_y; ++j) { |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
302 |
if (j==0) { |
| a3a8b2b4 |
Poul Sander |
2023-10-15 21:04 |
303 |
globalData.garbageGML.Draw(globalData.screen, draw_time, j*bsize, 0); |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
304 |
} |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
305 |
else if (j==5) { |
| a3a8b2b4 |
Poul Sander |
2023-10-15 21:04 |
306 |
globalData.garbageGMR.Draw(globalData.screen, draw_time, j*bsize, 0); |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
307 |
} |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
308 |
else { |
| a3a8b2b4 |
Poul Sander |
2023-10-15 21:04 |
309 |
globalData.garbageGM.Draw(globalData.screen, draw_time, j*bsize, 0); |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
310 |
} |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
311 |
} |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
312 |
|
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
313 |
SDL_SetRenderTarget( globalData.screen, nullptr ); |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
314 |
SDL_RenderCopy( globalData.screen, mTexture, &srcrect, &dstrect ); |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
315 |
SDL_DestroyTexture(mTexture); |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
316 |
} |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
317 |
|
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
318 |
std::pair<int, int> getGarbageSize(int topx, int topy) const { |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
319 |
int size_x = 0; |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
320 |
int size_y = 0; |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
321 |
int number = board[topx][topy]; |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
322 |
for (int i=topy; i < 30 ; ++i) { |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
323 |
if(number == board[topx][i]) { |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
324 |
++size_y; |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
325 |
} |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
326 |
} |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
327 |
for (int i=topx; i < 7 ; ++i) { |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
328 |
if(number == board[i][topy]) { |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
329 |
++size_x; |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
330 |
} |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
331 |
} |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
332 |
return std::make_pair(size_x, size_y); |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
333 |
} |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
334 |
|
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
335 |
//Draws all the bricks to the board (including garbage) |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
336 |
void PaintBricks() const { |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
337 |
int lastGarbageNumber = 0; |
| 32754436 |
Poul Sander |
2020-08-15 15:12 |
338 |
for (int i=0; i<13; ++i) { |
| 32754436 |
Poul Sander |
2020-08-15 15:12 |
339 |
for (int j=0; j<6; ++j) { |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
340 |
int basicBrick = board[j][i]%10; //The basic brick, stored on the least significant digit |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
341 |
if ((basicBrick > -1) && (basicBrick < 7) && ((board[j][i]/1000000)%10==0)) { |
| a3a8b2b4 |
Poul Sander |
2023-10-15 21:04 |
342 |
DrawImgBoardBounded(globalData.bricks[basicBrick], j*bsize, bsize*12-i*bsize-pixels); |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
343 |
if ((board[j][i]/BLOCKWAIT)%10==1) { |
| a3a8b2b4 |
Poul Sander |
2023-10-15 21:04 |
344 |
DrawImgBoard(globalData.bomb, j*bsize, bsize*12-i*bsize-pixels); |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
345 |
} |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
346 |
if ((board[j][i]/BLOCKHANG)%10==1) { |
| a3a8b2b4 |
Poul Sander |
2023-10-15 21:04 |
347 |
DrawImgBoardBounded(globalData.ready, j*bsize, bsize*12-i*bsize-pixels); |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
348 |
} |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
349 |
|
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
350 |
} |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
351 |
if ((board[j][i]/1000000)%10==1) { |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
352 |
int number = board[j][i]; |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
353 |
if (number != lastGarbageNumber) { |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
354 |
const auto& garbage_size = getGarbageSize(j, i); |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
355 |
lastGarbageNumber = number; |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
356 |
PaintGarbageBlock(topx+j*bsize, topy+12*bsize-i*bsize-(garbage_size.second-1)*bsize -pixels, garbage_size.first, garbage_size.second); |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
357 |
} |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
358 |
} |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
359 |
if ((board[j][i]/1000000)%10==2) { |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
360 |
int number = board[j][i]; |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
361 |
if (number != lastGarbageNumber) { |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
362 |
const auto& garbage_size = getGarbageSize(j, i); |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
363 |
lastGarbageNumber = number; |
| e34256c1 |
Poul Sander |
2021-10-06 20:10 |
364 |
PaintGreyGarbageBlock(topx+j*bsize, topy+12*bsize-i*bsize-(garbage_size.second-1)*bsize -pixels, garbage_size.first); |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
365 |
} |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
366 |
} |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
367 |
} |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
368 |
} |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
369 |
const int j = 0; |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
370 |
|
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
371 |
int garbageSize=0; |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
372 |
for (int i=0; i<20; i++) { |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
373 |
if ((board[j][i]/1000000)%10==1) { |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
374 |
int left, right, over, under; |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
375 |
int number = board[j][i]; |
| 32754436 |
Poul Sander |
2020-08-15 15:12 |
376 |
left = -1; |
| 32754436 |
Poul Sander |
2020-08-15 15:12 |
377 |
right = board[j+1][i]; |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
378 |
if (i>28) { |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
379 |
over = -1; |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
380 |
} |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
381 |
else { |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
382 |
over = board[j][i+1]; |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
383 |
} |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
384 |
if (i<1) { |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
385 |
under = -1; |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
386 |
} |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
387 |
else { |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
388 |
under = board[j][i-1]; |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
389 |
} |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
390 |
if (((left != number)&&(right == number)&&(over != number)&&(under == number))&&(garbageSize>0)) { |
| a0c212cb |
Poul Sander |
2023-08-13 16:10 |
391 |
if (globalData.theme.decoration.decoration_sprites.size()) { |
| a0c212cb |
Poul Sander |
2023-08-13 16:10 |
392 |
const sago::SagoSprite& sprite = globalData.spriteHolder->GetSprite(globalData.theme.decoration.decoration_sprites[board[j][i]%globalData.theme.decoration.decoration_sprites.size()]); |
| a0c212cb |
Poul Sander |
2023-08-13 16:10 |
393 |
DrawImgBoardBounded(sprite, 2*bsize, 12*bsize-i*bsize-pixels+(bsize/2)*garbageSize); |
| a0c212cb |
Poul Sander |
2023-08-13 16:10 |
394 |
} |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
395 |
} |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
396 |
if (!((left != number)&&(right == number)&&(over == number)&&(under == number))) { //not in garbage |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
397 |
garbageSize=0; |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
398 |
} |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
399 |
else { |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
400 |
garbageSize++; |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
401 |
} |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
402 |
|
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
403 |
} |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
404 |
} |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
405 |
for (int i=0; i<6; i++) { |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
406 |
if (board[i][0]!=-1) { |
| a3a8b2b4 |
Poul Sander |
2023-10-15 21:04 |
407 |
DrawImgBoardBounded(globalData.transCover, i*bsize, 12*bsize-pixels); //Make the appering blocks transperant |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
408 |
} |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
409 |
} |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
410 |
|
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
411 |
} |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
412 |
public: |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
413 |
//Draws everything |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
414 |
void DoPaintJob() { |
| a3a8b2b4 |
Poul Sander |
2023-10-15 21:04 |
415 |
DrawIMG(globalData.boardBackBack,globalData.screen,this->GetTopX()-60,this->GetTopY()-68); |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
416 |
|
| 343fbe43 |
sago007 |
2018-03-27 19:53 |
417 |
this->scoreLabel.Draw(globalData.screen, this->GetTopX()+310,this->GetTopY()-68+148); |
| 343fbe43 |
sago007 |
2018-03-27 19:53 |
418 |
this->timeLabel.Draw(globalData.screen, this->GetTopX()+310,this->GetTopY()-68+197); |
| 343fbe43 |
sago007 |
2018-03-27 19:53 |
419 |
this->chainLabel.Draw(globalData.screen, this->GetTopX()+310,this->GetTopY()-68+246); |
| 343fbe43 |
sago007 |
2018-03-27 19:53 |
420 |
this->speedLabel.Draw(globalData.screen, this->GetTopX()+310,this->GetTopY()-68+295); |
| 8f0c9d80 |
Poul Sander |
2023-07-24 21:33 |
421 |
globalData.spriteHolder->GetSprite(globalData.theme.back_board).DrawScaled(globalData.screen, SDL_GetTicks(), this->GetTopX(),this->GetTopY(), BOARD_WIDTH, BOARD_HEIGHT); |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
422 |
|
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
423 |
PaintBricks(); |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
424 |
if (stageClear) { |
| a3a8b2b4 |
Poul Sander |
2023-10-15 21:04 |
425 |
DrawImgBoard(globalData.blackLine, 0, bsize*(12+2)+bsize*(stageClearLimit-linesCleared)-pixels-1); |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
426 |
} |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
427 |
if (puzzleMode&&(!bGameOver)) { |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
428 |
//We need to write nr. of moves left! |
| 549ecfae |
sago007 |
2016-10-09 08:37 |
429 |
strHolder = _("Moves left: ") + std::to_string(MovesLeft); |
| 810e1c2f |
sago007 |
2018-03-28 09:40 |
430 |
static sago::SagoTextField movesPuzzleLabel; |
| 810e1c2f |
sago007 |
2018-03-28 09:40 |
431 |
sagoTextSetHelpFont(movesPuzzleLabel); |
| 0b8fb137 |
sago007 |
2018-03-31 19:53 |
432 |
movesPuzzleLabel.SetText(strHolder); |
| 810e1c2f |
sago007 |
2018-03-28 09:40 |
433 |
movesPuzzleLabel.Draw(globalData.screen, topx+5, topy+5); |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
434 |
|
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
435 |
} |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
436 |
if (puzzleMode && stageButtonStatus == SBpuzzleMode) { |
| a3a8b2b4 |
Poul Sander |
2023-10-15 21:04 |
437 |
DrawImgBoard(globalData.bRetry, globalData.cordRetryButton.x, globalData.cordRetryButton.y); |
| a3a8b2b4 |
Poul Sander |
2023-10-15 21:04 |
438 |
PrintTextCenteredBoard(globalData.cordRetryButton.x, globalData.cordRetryButton.y, buttonRetry); |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
439 |
if (getLevel()<PuzzleGetNumberOfPuzzles()-1) { |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
440 |
if (hasWonTheGame) { |
| a3a8b2b4 |
Poul Sander |
2023-10-15 21:04 |
441 |
DrawImgBoard(globalData.bNext, globalData.cordNextButton.x, globalData.cordNextButton.y); |
| a3a8b2b4 |
Poul Sander |
2023-10-15 21:04 |
442 |
PrintTextCenteredBoard(globalData.cordNextButton.x, globalData.cordNextButton.y, buttonNext); |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
443 |
} |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
444 |
else { |
| a3a8b2b4 |
Poul Sander |
2023-10-15 21:04 |
445 |
DrawImgBoard(globalData.bSkip, globalData.cordNextButton.x, globalData.cordNextButton.y); |
| a3a8b2b4 |
Poul Sander |
2023-10-15 21:04 |
446 |
PrintTextCenteredBoard(globalData.cordNextButton.x, globalData.cordNextButton.y, buttonSkip); |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
447 |
} |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
448 |
} |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
449 |
else { |
| 810e1c2f |
sago007 |
2018-03-28 09:40 |
450 |
static sago::SagoTextField lastPuzzleLabel; |
| 810e1c2f |
sago007 |
2018-03-28 09:40 |
451 |
sagoTextSetHelpFont(lastPuzzleLabel); |
| 810e1c2f |
sago007 |
2018-03-28 09:40 |
452 |
lastPuzzleLabel.SetText(_("Last puzzle")); |
| 810e1c2f |
sago007 |
2018-03-28 09:40 |
453 |
lastPuzzleLabel.Draw(globalData.screen, topx+5, topy+5); |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
454 |
} |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
455 |
} |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
456 |
if (stageClear && stageButtonStatus == SBstageClear) { |
| a3a8b2b4 |
Poul Sander |
2023-10-15 21:04 |
457 |
DrawImgBoard(globalData.bRetry, globalData.cordRetryButton.x, globalData.cordRetryButton.y); |
| a3a8b2b4 |
Poul Sander |
2023-10-15 21:04 |
458 |
PrintTextCenteredBoard(globalData.cordRetryButton.x, globalData.cordRetryButton.y, buttonRetry); |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
459 |
if (getLevel()<50-1) { |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
460 |
if (hasWonTheGame) { |
| a3a8b2b4 |
Poul Sander |
2023-10-15 21:04 |
461 |
DrawImgBoard(globalData.bNext, globalData.cordNextButton.x, globalData.cordNextButton.y); |
| a3a8b2b4 |
Poul Sander |
2023-10-15 21:04 |
462 |
PrintTextCenteredBoard(globalData.cordNextButton.x, globalData.cordNextButton.y, buttonNext); |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
463 |
} |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
464 |
else { |
| a3a8b2b4 |
Poul Sander |
2023-10-15 21:04 |
465 |
DrawImgBoard(globalData.bSkip, globalData.cordNextButton.x, globalData.cordNextButton.y); |
| a3a8b2b4 |
Poul Sander |
2023-10-15 21:04 |
466 |
PrintTextCenteredBoard(globalData.cordNextButton.x, globalData.cordNextButton.y, buttonSkip); |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
467 |
} |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
468 |
} |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
469 |
else { |
| 810e1c2f |
sago007 |
2018-03-28 09:40 |
470 |
static sago::SagoTextField lastStageLabel; |
| 810e1c2f |
sago007 |
2018-03-28 09:40 |
471 |
sagoTextSetHelpFont(lastStageLabel); |
| 810e1c2f |
sago007 |
2018-03-28 09:40 |
472 |
lastStageLabel.SetText(_("Last stage")); |
| 810e1c2f |
sago007 |
2018-03-28 09:40 |
473 |
lastStageLabel.Draw(globalData.screen, topx+5, topy+5); |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
474 |
} |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
475 |
} |
| e8d66c68 |
sago007 |
2016-07-12 17:32 |
476 |
if (!bGameOver && stop > 20) { |
| 0b8fb137 |
sago007 |
2018-03-31 19:53 |
477 |
stopIntField.SetText(std::to_string(stop/10)); |
| fc338170 |
sago007 |
2018-03-28 14:31 |
478 |
stopIntField.Draw(globalData.screen, 240+topx, -40+topy); |
| e8d66c68 |
sago007 |
2016-07-12 17:32 |
479 |
} |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
480 |
|
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
481 |
#if DEBUG |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
482 |
if (AI_Enabled&&(!bGameOver)) { |
| e7e189c7 |
sago007 |
2018-03-31 15:30 |
483 |
sagoTextSetBlueFont(aiStatusField); |
| 549ecfae |
sago007 |
2016-10-09 08:37 |
484 |
strHolder = "AI_status: " + std::to_string(AIstatus)+ ", "+ std::to_string(AIlineToClear); |
| 0b8fb137 |
sago007 |
2018-03-31 19:53 |
485 |
aiStatusField.SetText(strHolder); |
| e7e189c7 |
sago007 |
2018-03-31 15:30 |
486 |
aiStatusField.Draw(globalData.screen, topx+5, topy+5); |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
487 |
} |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
488 |
#endif |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
489 |
if (!bGameOver) { |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
490 |
bool touched = false; |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
491 |
int mx = 0; |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
492 |
int my = 0; |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
493 |
this->GetMouseCursor(touched, mx, my); |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
494 |
if (touched) { |
| 72383a9e |
sago007 |
2016-10-30 11:56 |
495 |
DrawImgBoard(globalData.spriteHolder->GetSprite("touchcursor"),mx*bsize, 11*bsize-my*bsize-pixels); |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
496 |
} |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
497 |
else { |
| a3a8b2b4 |
Poul Sander |
2023-10-15 21:04 |
498 |
DrawImgBoard(globalData.cursor,cursorx*bsize,11*bsize-cursory*bsize-pixels); |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
499 |
} |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
500 |
} |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
501 |
if (ticks<gameStartedAt) { |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
502 |
int currentCounter = abs((int)ticks-(int)gameStartedAt)/1000; |
| 72383a9e |
sago007 |
2016-10-30 11:56 |
503 |
if ( (currentCounter!=lastCounter) && (globalData.SoundEnabled)&&(!globalData.NoSound)) { |
| a3a8b2b4 |
Poul Sander |
2023-10-15 21:04 |
504 |
Mix_PlayChannel(1, globalData.counterChunk.get(), 0); |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
505 |
} |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
506 |
lastCounter = currentCounter; |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
507 |
switch (currentCounter) { |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
508 |
case 2: |
| a3a8b2b4 |
Poul Sander |
2023-10-15 21:04 |
509 |
DrawImgBoard(globalData.counter[2], 2*bsize, 5*bsize); |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
510 |
break; |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
511 |
case 1: |
| a3a8b2b4 |
Poul Sander |
2023-10-15 21:04 |
512 |
DrawImgBoard(globalData.counter[1], 2*bsize, 5*bsize); |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
513 |
break; |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
514 |
case 0: |
| a3a8b2b4 |
Poul Sander |
2023-10-15 21:04 |
515 |
DrawImgBoard(globalData.counter[0], 2*bsize, 5*bsize); |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
516 |
break; |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
517 |
default: |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
518 |
break; |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
519 |
} |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
520 |
} |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
521 |
else { |
| 72383a9e |
sago007 |
2016-10-30 11:56 |
522 |
if (globalData.SoundEnabled&&(!globalData.NoSound)&&(timetrial)&&(ticks>gameStartedAt+10000)&&(!bGameOver)) { |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
523 |
int currentCounter = (ticks-(int)gameStartedAt)/1000; |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
524 |
if (currentCounter!=lastCounter) { |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
525 |
if (currentCounter>115 && currentCounter<120) { |
| a3a8b2b4 |
Poul Sander |
2023-10-15 21:04 |
526 |
Mix_PlayChannel(1, globalData.counterChunk.get(), 0); |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
527 |
} |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
528 |
} |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
529 |
lastCounter = currentCounter; |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
530 |
} |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
531 |
else { |
| 72383a9e |
sago007 |
2016-10-30 11:56 |
532 |
if ( (0==lastCounter) && (globalData.SoundEnabled)&&(!globalData.NoSound)) { |
| a3a8b2b4 |
Poul Sander |
2023-10-15 21:04 |
533 |
Mix_PlayChannel(1, globalData.counterFinalChunk.get(), 0); |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
534 |
} |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
535 |
lastCounter = -1; |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
536 |
} |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
537 |
} |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
538 |
|
| 2c6a4bae |
sago007 |
2018-05-11 15:20 |
539 |
if (bGameOver) { |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
540 |
if (hasWonTheGame) { |
| a3a8b2b4 |
Poul Sander |
2023-10-15 21:04 |
541 |
globalData.tbWinner.Draw(globalData.screen, topx+150, topy+200, sago::SagoTextField::Alignment::center); |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
542 |
} |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
543 |
else { |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
544 |
if (bDraw) { |
| a3a8b2b4 |
Poul Sander |
2023-10-15 21:04 |
545 |
globalData.tbDraw.Draw(globalData.screen, topx+150, topy+200, sago::SagoTextField::Alignment::center); |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
546 |
} |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
547 |
else { |
| a3a8b2b4 |
Poul Sander |
2023-10-15 21:04 |
548 |
globalData.tbGameOver.Draw(globalData.screen, topx+150, topy+200, sago::SagoTextField::Alignment::center); |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
549 |
} |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
550 |
} |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
551 |
} |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
552 |
} |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
553 |
|
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
554 |
private: |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
555 |
int topx, topy; |
| 343fbe43 |
sago007 |
2018-03-27 19:53 |
556 |
sago::SagoTextField scoreLabel; |
| 343fbe43 |
sago007 |
2018-03-27 19:53 |
557 |
sago::SagoTextField timeLabel; |
| 343fbe43 |
sago007 |
2018-03-27 19:53 |
558 |
sago::SagoTextField chainLabel; |
| 343fbe43 |
sago007 |
2018-03-27 19:53 |
559 |
sago::SagoTextField speedLabel; |
| 871ce5d6 |
sago007 |
2018-03-28 12:36 |
560 |
sago::SagoTextField buttonSkip; |
| 871ce5d6 |
sago007 |
2018-03-28 12:36 |
561 |
sago::SagoTextField buttonRetry; |
| 871ce5d6 |
sago007 |
2018-03-28 12:36 |
562 |
sago::SagoTextField buttonNext; |
| fc338170 |
sago007 |
2018-03-28 14:31 |
563 |
sago::SagoTextField stopIntField; |
| e7e189c7 |
sago007 |
2018-03-31 15:30 |
564 |
#if DEBUG |
| e7e189c7 |
sago007 |
2018-03-31 15:30 |
565 |
sago::SagoTextField aiStatusField; |
| e7e189c7 |
sago007 |
2018-03-31 15:30 |
566 |
#endif |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
567 |
}; |
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
568 |
|
| 8b1ab1cb |
sago007 |
2016-04-04 17:51 |
569 |
|
|
|
1970-01-01 00:00 |
570 |
|