Rev 7493 | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
1805 | yogev_ezra | 1 | /* Rocket Forces |
2 | * Filename: rforces.cpp |
||
7494 | leency | 3 | * Version 0.1 |
1805 | yogev_ezra | 4 | * Copyright (c) Serial 2007 |
5 | */ |
||
6 | |||
7494 | leency | 7 | /* Version 0.2 |
8 | * Copyright (c) Leency 2018 |
||
9 | */ |
||
1805 | yogev_ezra | 10 | |
7494 | leency | 11 | |
1805 | yogev_ezra | 12 | #include |
13 | |||
14 | #include "kosSyst.h" |
||
15 | #include "kosFile.h" |
||
16 | #include "mymath.h" |
||
17 | #include "properties.h" |
||
18 | #include "objects.h" |
||
19 | #include "rforces.h" |
||
20 | |||
21 | |||
22 | const char header[] = GAME_NAME; |
||
23 | cCursor *cursor; |
||
24 | cGun *gun = new cGun; |
||
25 | cCross **crosses = new cCross*[R_COUNT]; |
||
26 | cRocket **rockets = new cRocket*[R_COUNT]; |
||
27 | cBomb **bombs = new cBomb*[B_COUNT]; |
||
28 | cExplode **explodes = new cExplode*[R_COUNT + B_COUNT]; |
||
29 | cBuilding *house = new cBuilding(); |
||
30 | Dword *cur_handle; |
||
31 | int score, health; |
||
32 | |||
7494 | leency | 33 | bool game_over; |
34 | |||
1805 | yogev_ezra | 35 | struct MouseState |
36 | { |
||
37 | int x, y, lbclick; |
||
38 | Dword buttons; |
||
39 | } ms; |
||
40 | |||
41 | |||
42 | void kos_Main() |
||
43 | { |
||
44 | Dword frame_start, frame_end; |
||
45 | OnStart(); |
||
46 | Menu(); |
||
7484 | leency | 47 | kos_SetMaskForEvents(EVM_REDRAW + EVM_KEY + EVM_BUTTON + EVM_MOUSE + EVM_MOUSE_FILTER); |
1805 | yogev_ezra | 48 | for (;;) |
49 | { |
||
50 | frame_start = kos_GetTime(); |
||
51 | switch (kos_CheckForEvent()) |
||
52 | { |
||
7484 | leency | 53 | case EM_KEY_PRESS: |
1805 | yogev_ezra | 54 | Byte keyCode; |
55 | kos_GetKey(keyCode); |
||
56 | if (keyCode == 27) |
||
57 | { |
||
7494 | leency | 58 | kos_ExitApp(); |
1805 | yogev_ezra | 59 | } |
60 | if (keyCode == 51) |
||
61 | { |
||
62 | OnStart(); |
||
63 | } |
||
64 | break; |
||
7494 | leency | 65 | case EM_BUTTON_CLICK: |
66 | Dword btn_id; |
||
7493 | leency | 67 | if (kos_GetButtonID(btn_id)) { |
7494 | leency | 68 | if (btn_id == 1) kos_ExitApp(); |
7493 | leency | 69 | } |
1805 | yogev_ezra | 70 | break; |
7494 | leency | 71 | case EM_MOUSE_EVENT: |
1805 | yogev_ezra | 72 | OnMouseMove(); |
73 | if (ms.lbclick == 1) |
||
74 | { |
||
75 | OnLMBClick(); |
||
76 | } |
||
77 | break; |
||
7494 | leency | 78 | case EM_WINDOW_REDRAW: |
79 | DrawWindow(); |
||
80 | break; |
||
7493 | leency | 81 | default: |
7494 | leency | 82 | if (game_over) break; |
7493 | leency | 83 | DrawBombs(); |
84 | DrawRocketsAndCrosses(); |
||
85 | DrawExplodes(); |
||
7494 | leency | 86 | DrawStats(); |
7493 | leency | 87 | frame_end = kos_GetTime(); |
7494 | leency | 88 | if (frame_end - frame_start < FRAME_TIME) { |
7493 | leency | 89 | kos_Pause(FRAME_TIME - (frame_end - frame_start)); |
90 | } |
||
7494 | leency | 91 | if (health <= 0) GameOver(); |
1805 | yogev_ezra | 92 | } |
93 | } |
||
94 | } |
||
95 | |||
96 | void DrawWindow() |
||
97 | { |
||
98 | kos_WindowRedrawStatus(1); |
||
7494 | leency | 99 | kos_DefineAndDrawWindow(10, 40, WINDOW_WIDTH + 12, |
100 | WINDOW_HEIGHT + kos_GetSkinHeight() + 12, 0x34, |
||
101 | BG_COLOR, 0, 0, (Dword)header); |
||
1805 | yogev_ezra | 102 | kos_WindowRedrawStatus(2); |
103 | |||
7494 | leency | 104 | DrawStats(); |
105 | if (health <= 0) GameOver(); |
||
1805 | yogev_ezra | 106 | |
107 | // Draw buildings |
||
108 | for (int i = 20; i < 5 * 50; i += 50) |
||
109 | { |
||
110 | house->Draw(i, 467, H_COLOR); |
||
111 | } |
||
112 | for (int i = 8 * 50; i < 13 * 50; i += 50) |
||
113 | { |
||
114 | house->Draw(i, 467, H_COLOR); |
||
115 | } |
||
116 | |||
117 | } |
||
118 | |||
119 | void DrawBombs() |
||
120 | { |
||
121 | for (int i = 0; i < B_COUNT; i++) |
||
122 | { |
||
123 | if (bombs[i]->IsEnabled() == 0) |
||
124 | { |
||
125 | int rnd; |
||
126 | rnd = rtlRand() % B_POSSIBILITY; |
||
127 | if (rnd == 1) |
||
128 | { |
||
129 | rnd = 10 + rtlRand() % 620; |
||
130 | bombs[i]->Enable(rnd, 0, 4, 9, rnd + 2, 0); |
||
131 | } |
||
132 | } |
||
133 | else |
||
134 | { |
||
135 | if (bombs[i]->cy > gun->cy + 5) |
||
136 | { |
||
137 | health -= 5; |
||
138 | if (explodes[R_COUNT + i]->IsEnabled() == 1) |
||
139 | { |
||
140 | explodes[R_COUNT + i]->Disable(BG_COLOR); |
||
141 | } |
||
142 | explodes[R_COUNT + i]->Enable(bombs[i]->cx, bombs[i]->cy); |
||
143 | bombs[i]->Disable(BG_COLOR); |
||
144 | } |
||
145 | else |
||
146 | { |
||
147 | bombs[i]->cy += B_SPEED; |
||
148 | bombs[i]->DrawAngle(bombs[i]->cx, 639, B_COLOR); |
||
149 | } |
||
150 | } |
||
151 | } |
||
152 | } |
||
153 | |||
154 | void DrawRocketsAndCrosses() |
||
155 | { |
||
156 | double a; |
||
157 | for (int i = 0; i < R_COUNT; i++) |
||
158 | { |
||
159 | if (crosses[i]->IsEnabled() == 1) |
||
160 | { |
||
161 | if (sqrt(((long int) (crosses[i]->x - rockets[i]->cx) * (crosses[i]->x - rockets[i]->cx)) + ((long int) (crosses[i]->y - rockets[i]->cy) * (crosses[i]->y - rockets[i]->cy))) < 5) |
||
162 | { |
||
163 | if (explodes[i]->IsEnabled() == 1) |
||
164 | { |
||
165 | explodes[i]->Disable(BG_COLOR); |
||
166 | } |
||
167 | explodes[i]->Enable(crosses[i]->x, crosses[i]->y); |
||
168 | crosses[i]->Disable(BG_COLOR); |
||
169 | rockets[i]->Disable(BG_COLOR); |
||
170 | } |
||
171 | else |
||
172 | { |
||
173 | crosses[i]->Draw(CROSS_COLOR); |
||
174 | if (rockets[i]->cx - crosses[i]->x == 0) |
||
175 | { |
||
176 | a = M_PI / 2; |
||
177 | } |
||
178 | else |
||
179 | { |
||
180 | a = atan((double)(rockets[i]->cy - crosses[i]->y) / (double)(rockets[i]->cx - crosses[i]->x)); |
||
181 | if (rockets[i]->cx - crosses[i]->x < 0) a += M_PI; |
||
182 | } |
||
183 | rockets[i]->cx = round_int(rockets[i]->cx - R_SPEED * cos(a)); |
||
184 | rockets[i]->cy = round_int(rockets[i]->cy - R_SPEED * sin(a)); |
||
185 | rockets[i]->DrawAngle(crosses[i]->x, crosses[i]->y, R_COLOR); |
||
186 | } |
||
187 | } |
||
188 | } |
||
189 | } |
||
190 | |||
191 | void DrawExplodes() |
||
192 | { |
||
193 | for (int i = 0; i < R_COUNT + B_COUNT; i++) |
||
194 | { |
||
195 | if (explodes[i]->IsEnabled() == 1) |
||
196 | { |
||
197 | explodes[i]->DrawNext(EXP_COLOR); |
||
198 | for (int j = 0; j < B_COUNT; j++) |
||
199 | { |
||
200 | if ( bombs[j]->IsEnabled() == 1 && |
||
201 | bombs[j]->cx > explodes[i]->cx - explodes[i]->step - 1 && bombs[j]->cx < explodes[i]->cx + explodes[i]->step + 1 && |
||
202 | bombs[j]->cy + 5 > explodes[i]->cy - explodes[i]->step - 1 && bombs[j]->cy + 5 < explodes[i]->cy + explodes[i]->step + 1 |
||
203 | ) |
||
204 | { |
||
205 | score += B_COUNT + 2; |
||
206 | if (explodes[R_COUNT + j]->IsEnabled() == 1) |
||
207 | { |
||
208 | explodes[R_COUNT + j]->Disable(BG_COLOR); |
||
209 | } |
||
210 | explodes[R_COUNT + j]->Enable(bombs[j]->cx, bombs[j]->cy); |
||
211 | bombs[j]->Disable(BG_COLOR); |
||
212 | } |
||
213 | } |
||
214 | } |
||
215 | } |
||
216 | } |
||
217 | |||
218 | void OnMouseMove() |
||
219 | { |
||
220 | Dword old_buttons = ms.buttons; |
||
221 | kos_GetMouseWindowXY(ms.x, ms.y); |
||
222 | kos_GetMouseButtonsState(ms.buttons); |
||
7494 | leency | 223 | |
224 | if (health <= 0) return; |
||
225 | |||
226 | //restore mouse cursor when it over Window Header |
||
227 | if (ms.y > 5000) RestoreSystemCursor(); else SetGameCursor(); |
||
228 | |||
1805 | yogev_ezra | 229 | if ((old_buttons & 0x00000001) == 0 && (ms.buttons & 0x00000001) == 1) |
230 | { |
||
231 | ms.lbclick = 1; |
||
232 | } |
||
233 | else |
||
234 | { |
||
235 | ms.lbclick = 0; |
||
236 | } |
||
237 | |||
238 | if (ms.x >= 0 && ms.x < WINDOW_WIDTH && ms.y >= 0 && ms.y < WINDOW_HEIGHT) |
||
239 | { |
||
240 | gun->DrawAngle(ms.x, ms.y, G_COLOR); |
||
241 | } |
||
242 | |||
243 | if (HARDWARE_CURSOR == 0) |
||
244 | { |
||
245 | cursor->Draw(ms.x, ms.y, CUR_COLOR); |
||
246 | } |
||
247 | |||
248 | /*if (DEBUG == 1) |
||
249 | { |
||
250 | kos_DisplayNumberToWindowBg(ms.x, 3, WINDOW_WIDTH - 30, 10, TEXT_COLOR, BG_COLOR, nbDecimal, false); |
||
251 | kos_DisplayNumberToWindowBg(ms.y, 3, WINDOW_WIDTH - 30, 22, TEXT_COLOR, BG_COLOR, nbDecimal, false); |
||
252 | kos_DisplayNumberToWindowBg(ms.buttons, 1, WINDOW_WIDTH - 30, 34, TEXT_COLOR, BG_COLOR, nbDecimal, false); |
||
253 | }*/ |
||
7494 | leency | 254 | } |
1805 | yogev_ezra | 255 | |
7494 | leency | 256 | void DrawStats() |
257 | { |
||
258 | kos_WriteTextWithBg(8, 10, 0xC0, TEXT_COLOR, 0, "Population:", 11); |
||
259 | kos_WriteTextWithBg(8+15*6, 9, 0xC0, TEXT_COLOR, 0, "%", 1); |
||
260 | kos_WriteTextWithBg(8, 22, 0xC0, TEXT_COLOR, 0, "Score:", 6); |
||
261 | kos_DisplayNumberToWindowBg(health, 3, 79, 10, TEXT_COLOR, BG_COLOR, nbDecimal, false); |
||
262 | kos_DisplayNumberToWindowBg(score, 4, 49, 22, TEXT_COLOR, BG_COLOR, nbDecimal, false); |
||
1805 | yogev_ezra | 263 | } |
264 | |||
265 | void OnLMBClick() |
||
266 | { |
||
267 | if (ms.y < gun->cy - 10) |
||
268 | { |
||
269 | double a; |
||
270 | int j = -1; |
||
271 | for (int i = 0; i < R_COUNT; i++) |
||
272 | { |
||
273 | if (crosses[i]->IsEnabled() == 0) |
||
274 | { |
||
275 | if (j >= -1) j = i; |
||
276 | } |
||
277 | else if (ms.x > crosses[i]->x - 10 && ms.x < crosses[i]->x + 10 && ms.y > crosses[i]->y - 10 && ms.y < crosses[i]->y + 10) |
||
278 | { |
||
279 | j = -2; |
||
280 | break; |
||
281 | } |
||
282 | } |
||
283 | if (j >= 0) |
||
284 | { |
||
285 | if (score > 0) score -= 1; |
||
286 | crosses[j]->Enable(ms.x, ms.y); |
||
287 | if (gun->cx - ms.x == 0) |
||
288 | { |
||
289 | a = M_PI/2; |
||
290 | } |
||
291 | else |
||
292 | { |
||
293 | a = atan((double)gun->cy - ms.y / (double) gun->cx - ms.x); |
||
294 | if (gun->cx - ms.x < 0) a += M_PI; |
||
295 | } |
||
296 | rockets[j]->Enable(round_int(gun->cx - 15 * cos(a)) - 2, round_int(gun->cy - 15 * sin(a)) - 5, 3, 6, round_int(gun->cx - 15 * cos(a)), round_int(gun->cy - 15 * sin(a))); |
||
297 | } |
||
298 | } |
||
299 | } |
||
300 | |||
7494 | leency | 301 | void SetGameCursor() |
1805 | yogev_ezra | 302 | { |
303 | Dword *cur = new Dword[1024]; |
||
304 | for (int i = 0; i < 1024; i++) |
||
305 | { |
||
306 | cur[i] = 0x00000000; |
||
307 | } |
||
308 | if (HARDWARE_CURSOR == 1) |
||
309 | { |
||
310 | Dword cur_color = 0xFF000000 | CUR_COLOR; |
||
311 | cur[0 * 32 + 5] = cur_color; |
||
312 | cur[1 * 32 + 5] = cur_color; |
||
313 | cur[2 * 32 + 5] = cur_color; |
||
314 | cur[2 * 32 + 3] = cur_color; |
||
315 | cur[2 * 32 + 4] = cur_color; |
||
316 | cur[2 * 32 + 6] = cur_color; |
||
317 | cur[3 * 32 + 2] = cur_color; |
||
318 | cur[4 * 32 + 2] = cur_color; |
||
319 | cur[5 * 32 + 2] = cur_color; |
||
320 | cur[5 * 32 + 1] = cur_color; |
||
321 | cur[5 * 32 + 0] = cur_color; |
||
322 | |||
323 | cur[5 * 32 + 5] = cur_color; |
||
324 | |||
325 | cur[8 * 32 + 4] = cur_color; |
||
326 | cur[8 * 32 + 5] = cur_color; |
||
327 | cur[8 * 32 + 6] = cur_color; |
||
328 | cur[8 * 32 + 7] = cur_color; |
||
329 | cur[9 * 32 + 5] = cur_color; |
||
330 | cur[10 * 32 + 5] = cur_color; |
||
331 | cur[7 * 32 + 8] = cur_color; |
||
332 | cur[6 * 32 + 8] = cur_color; |
||
333 | cur[5 * 32 + 8] = cur_color; |
||
334 | cur[5 * 32 + 9] = cur_color; |
||
335 | cur[5 * 32 + 10] = cur_color; |
||
336 | } |
||
337 | cur_handle = kos_LoadMouseCursor(cur, 0x05050002); |
||
338 | delete[] cur; |
||
339 | kos_SetMouseCursor(cur_handle); |
||
340 | } |
||
341 | |||
7494 | leency | 342 | void RestoreSystemCursor() |
343 | { |
||
344 | if (cur_handle) kos_SetMouseCursor(0); |
||
345 | cur_handle=0; |
||
346 | } |
||
347 | |||
1805 | yogev_ezra | 348 | void Menu() |
349 | { |
||
350 | NewGame(); |
||
351 | } |
||
352 | |||
353 | void NewGame() |
||
354 | { |
||
355 | gun->DrawAngle((WINDOW_WIDTH / 2) - 5, WINDOW_HEIGHT - 20, G_COLOR); |
||
356 | } |
||
357 | |||
358 | void OnStart() |
||
359 | { |
||
360 | if (HARDWARE_CURSOR == 0) |
||
361 | { |
||
362 | cursor = new cCursor(); |
||
363 | } |
||
7494 | leency | 364 | SetGameCursor(); |
1805 | yogev_ezra | 365 | |
366 | gun->Enable((WINDOW_WIDTH / 2) - 10, WINDOW_HEIGHT - 30, 10, 20, (WINDOW_WIDTH / 2) - 5, WINDOW_HEIGHT - 20); |
||
367 | |||
368 | for (int i = 0; i < R_COUNT; i++) |
||
369 | { |
||
370 | crosses[i] = new cCross(); |
||
371 | rockets[i] = new cRocket(); |
||
372 | } |
||
373 | for (int i = 0; i < B_COUNT; i++) |
||
374 | { |
||
375 | bombs[i] = new cBomb(); |
||
376 | } |
||
377 | for (int i = 0; i < R_COUNT + B_COUNT; i++) |
||
378 | { |
||
379 | explodes[i] = new cExplode(); |
||
380 | } |
||
381 | |||
382 | health = 100; |
||
383 | score = 0; |
||
384 | |||
7494 | leency | 385 | game_over = false; |
386 | |||
1805 | yogev_ezra | 387 | rtlSrand(kos_GetTime()); |
388 | |||
389 | DrawWindow(); |
||
390 | } |
||
391 | |||
7494 | leency | 392 | void GameOver() |
1805 | yogev_ezra | 393 | { |
7494 | leency | 394 | int xcenter = WINDOW_WIDTH / 2; |
395 | int y = WINDOW_HEIGHT/ 2 - 40; |
||
396 | kos_WriteTextToWindow(xcenter-50, y, 0x81, TEXT_COLOR, "Game Over", 9); |
||
397 | kos_WriteTextToWindow(xcenter-43, y+36, 0x80, TEXT_COLOR, "[F2] - New game", 0); |
||
398 | kos_WriteTextToWindow(xcenter-43, y+53, 0x80, TEXT_COLOR, "[Ecs] - Exit", 0); |
||
399 | // |
||
400 | RestoreSystemCursor(); |
||
401 | game_over = true; |
||
1805 | yogev_ezra | 402 | }>>>>>>>>>>>=>>>>>>>>>>>=>=>> |