Skip to content
Permalink
Newer
Older
100644 385 lines (305 sloc) 9.55 KB
Apr 29, 2018
1
May 6, 2018
2
#include <genesis.h>
Apr 29, 2018
3
#include "game.h"
4
#include "map.h"
5
#include "resmap.h"
6
#include "map_editor.h"
7
#include "gameover.h"
8
#include "sprite.h"
9
#include "menu.h"
10
#include "collision.h"
11
#include "gamelogic.h"
12
#include "gamerender.h"
13
#include "defs.h"
14
#include "resources.h"
Apr 29, 2018
15
#include "option.h"
16
#include "mutator.h"
Apr 29, 2018
17
18
#define VDP_setTile(plan, tile, x, y) (VDP_setTileMapXY(plan, tile, x, y))
19
20
s16 selected_stage;
21
s16 game_over_timer = 0;
22
u8 playing_engine;
23
u8 start_snd_engine_once;
24
u8 stop_sound_engine;
25
26
void selectLevel();
Apr 29, 2018
27
void drawStageNum(s16 num);
28
void startLevel();
29
void joyEventGame(u16 joy, u16 changed, u16 state);
30
void drawGameover();
Apr 29, 2018
31
void updateAudio();
Apr 29, 2018
32
void soundPlayEngine();
Apr 29, 2018
33
34
void sleepFrames(u16 i) {
35
u16 a;
36
for (a = 0; a < i; a++) {
37
VDP_waitVSync();
38
}
Apr 29, 2018
39
}
40
May 6, 2018
41
u8 kills_1[5]; // 0-3 - Tanks, 4 - Bonus
42
u8 kills_2[5];
Apr 29, 2018
43
u32 top_scor;
44
u16 level_timer;
45
Apr 29, 2018
46
// main.c
47
extern void battlecity_init();
48
extern void tank1990_init();
49
extern void mods_mode_init();
Apr 29, 2018
50
51
void setGameMode() {
52
switch (config.game_mode) {
53
case MODE_BC:
54
battlecity_init();
55
break;
56
case MODE_TANK:
57
tank1990_init();
58
break;
59
case MODE_MODS:
60
mods_mode_init();
61
break;
62
case MODE_CUSTOM:
63
mods_mode_init();
64
customGameOption();
65
break;
66
}
67
}
68
69
void startGame() {
70
71
setGameMode();
72
73
VDP_setPalette(0, palette_black);
74
VDP_resetSprites();
75
VDP_updateSprites(1, TRUE);
76
VDP_fillTileMapRect(PLAN_B, 0, 0, 0, planWidth, planHeight);
Apr 29, 2018
77
78
VDP_setPalette(0, pal_red);
79
VDP_setPalette(1, pal_yellow);
80
VDP_setPalette(2, pal_green);
81
VDP_setPalette(3, pal_grey);
82
selected_stage = -1;
83
gameover = FALSE;
Apr 29, 2018
84
85
JOY_setEventHandler(joyEventGame);
86
87
while (!GLog_gameover()) {
88
level_timer = 0;
89
selectLevel();
90
startLevel();
91
92
if (!GLog_gameover()) {
93
showScore();
94
selected_stage++;
95
switch (config.levels_pack) {
96
case LEVELPACK_BC_TANK:
97
if (selected_stage == 35) setMapsData(maps_data2);
98
break;
99
case LEVELPACK_TANK_BC:
100
if (selected_stage == 35) setMapsData(maps_data);
101
break;
102
}
103
}
104
}
105
}
106
107
void selectLevel() {
108
109
u16 joy = 0;
110
s16 stage_ctr = 0;
111
u8 init_logic = FALSE;
Apr 29, 2018
112
113
start_snd_engine_once = FALSE;
114
stop_sound_engine = FALSE;
Apr 29, 2018
115
116
updateSprite();
117
118
if (selected_stage >= 0)
119
stage_ctr = selected_stage;
Apr 29, 2018
120
121
closeScreenEffect();
122
123
VDP_fillTileMapRectInc(PLAN_B, RES_TILE_STAGE, 12, 13, 5, 1);
Apr 29, 2018
124
125
if ((config.game_mode == MODE_CUSTOM || config.game_mode == MODE_MODS) && config.random_mods)
126
initMods();
127
if (config.mods_inc_lvl != 0) {
Apr 29, 2018
128
if ((stage_ctr + 1) % config.mods_inc_lvl == 0) {
129
if (config.mods_count < MAX_MODS_ON_LEVEL)
130
config.mods_count++;
Apr 29, 2018
131
}
Apr 29, 2018
133
134
drawStageNum(stage_ctr + 1);
135
updateSprite();
136
joy = JOY_readJoypad(JOY_1);
137
138
while (joy)
139
joy = JOY_readJoypad(JOY_1);
Apr 29, 2018
140
141
while (selected_stage < 0) {
142
init_logic = TRUE;
Apr 29, 2018
143
joy = JOY_readJoypad(JOY_1);
144
145
if (joy & BUTTON_B) {
146
stage_ctr++;
147
if (stage_ctr >= MAP_AVAILABLE)
148
stage_ctr = MAP_AVAILABLE - 1;
Apr 29, 2018
149
sleepFrames(10);
150
drawStageNum(stage_ctr + 1);
151
}
152
if (joy & BUTTON_C) {
153
stage_ctr--;
154
if (stage_ctr < 0)
155
stage_ctr = 0;
Apr 29, 2018
156
sleepFrames(10);
157
drawStageNum(stage_ctr + 1);
158
}
159
160
if (joy & BUTTON_START) {
161
selected_stage = stage_ctr;
162
}
163
}
164
165
while (config.game_mode == MODE_MODS || config.game_mode == MODE_CUSTOM) {
166
joy = JOY_readJoypad(JOY_1);
167
168
if (joy & BUTTON_START) {
169
break;
170
}
171
}
172
173
if (init_logic)
174
GLog_initGameLogic();
Apr 29, 2018
175
176
SND_startPlay_PCM(snd_begin, sizeof(snd_begin), SOUND_RATE_22050, SOUND_PAN_CENTER, 0);
177
startTimer(0);
178
179
sleepFrames(64);
Apr 29, 2018
180
startTimer(1);
181
}
182
183
void drawStageNum(s16 num) {
184
185
u16 num_1 = num / 10;
186
u16 num_2 = num % 10;
187
188
if (num_1 == 0) {
189
VDP_setTile(PLAN_B, RES_TILE_GREY, 18, 13);
Apr 29, 2018
190
}
191
else {
192
VDP_setTile(PLAN_B, RES_TILE_STAGE_NUM + num_1, 18, 13);
Apr 29, 2018
193
}
194
VDP_setTile(PLAN_B, RES_TILE_STAGE_NUM + num_2, 19, 13);
Apr 29, 2018
195
196
if (config.game_mode == MODE_MODS || config.game_mode == MODE_CUSTOM)
197
showModText();
Apr 29, 2018
198
}
199
200
void startLevel() {
201
Apr 29, 2018
203
204
for (i = 0; i < config.max_bullets; i++)
205
bullets[i].speed = 0;
206
for (i = 0; i < config.max_explode; i++)
207
explodes[i].type = 0;
Apr 29, 2018
208
209
// VDP_fillTileMapRect(PLAN_B, 0, 0, 0, planWidth, planHeight);
210
VDP_fillTileMapRect(PLAN_A, RES_TILE_GREY, 0, 0, 32, 28);
211
VDP_waitVSync();
212
213
VDP_resetSprites();
214
VDP_updateSprites(1, TRUE);
Apr 29, 2018
215
216
// Fake background for screen opening
Apr 29, 2018
217
if (map_editor_map_ready) {
218
setFakeMap(editor_map, MAP_GAMEMODE_UNCOMPRESSED);
Apr 29, 2018
219
} else {
220
setFakeMapLevel(selected_stage);
221
}
222
VDP_waitVSync();
Apr 29, 2018
223
224
// Screen opening
Apr 29, 2018
225
openScreenEffect();
226
227
game_over_timer = 0;
228
May 6, 2018
229
GLog_initLevel(selected_stage);
Apr 29, 2018
230
May 6, 2018
231
for (i = 0; i < sizeof(kills_1) / sizeof(kills_1[0]); i++) {
Apr 29, 2018
232
kills_1[i] = 0;
233
kills_2[i] = 0;
234
}
235
236
VDP_setPalette(0, pal_red);
237
238
JOY_setEventHandler(joyEventGame);
Apr 29, 2018
239
240
while (!GLog_victory()) {
241
if (config.show_fps)
242
VDP_showFPS(TRUE);
Apr 29, 2018
243
GLog_updateGame();
244
245
if (GLog_gameover()) {
246
SND_stopPlay_4PCM(SOUND_PCM_CH1);
Apr 29, 2018
247
248
drawGameover();
249
game_over_timer++;
250
if (game_over_timer >= 256)
251
break;
Apr 29, 2018
252
}
253
254
GRend_prepareRepaint();
255
updateAudio();
256
257
if (level_timer < 65000)
258
level_timer++;
Apr 30, 2018
260
GRend_repaint();
Apr 29, 2018
261
VDP_waitVSync();
262
}
263
264
JOY_setEventHandler(NULL);
Apr 29, 2018
265
}
266
267
void joyEventGame(u16 joy, u16 changed, u16 state) {
268
269
if (GLog_gameover())
270
return;
272
const u16 pressed = state & changed;
273
const u16 player_index = (joy == JOY_1) ? 0 : 1;
274
275
if ((pressed & BUTTON_START) /*&& !gameover*/ && level_timer > 180) {
Apr 29, 2018
276
pause = !pause;
277
if (pause) {
278
soundStopEngine();
279
soundPlay(snd_pause, sizeof(snd_pause), SOUND_PCM_CH1, FALSE);
Apr 29, 2018
280
}
281
else {
Apr 29, 2018
282
soundPlayEngine();
283
if (config.cheats_on) {
284
if (state & BUTTON_A) {
285
bonus.type = BONUS_GRENADE;
286
setBonus(player_index);
288
if (state & BUTTON_B) {
289
bonus.type = BONUS_GUN;
290
setBonus(player_index);
Apr 29, 2018
291
}
292
if (state & BUTTON_C) {
293
GLog_setVictory();
Apr 29, 2018
294
}
295
}
296
}
297
}
298
299
if (pause)
300
return;
Apr 29, 2018
301
302
u16 fire_buttons = BUTTON_A | BUTTON_C;
303
if (!config.turbo_b) {
304
fire_buttons |= BUTTON_B;
Apr 29, 2018
305
}
306
if (pressed & fire_buttons) {
307
game_player[player_index].fire = 1;
Apr 29, 2018
308
}
309
310
// Take life
311
if (menuGetSelectedItem() == ITEM_TWO_PLAYER && (state & BUTTON_A) && (state & BUTTON_B)) {
312
if (game_player[player_index ].lives == 0
313
&& game_player[player_index ^ 1].lives > 1
314
) {
315
game_player[player_index ].lives++;
316
game_player[player_index ^ 1].lives--;
Apr 29, 2018
317
}
318
}
319
320
if (pressed & (BUTTON_UP | BUTTON_DOWN | BUTTON_LEFT | BUTTON_RIGHT)) {
321
if (game_player[player_index].on_ice && !game_player[player_index].ice) {
322
soundPlay(snd_chuh, sizeof(snd_chuh), SOUND_PCM_CH3, FALSE);
Apr 29, 2018
323
}
324
}
325
}
326
327
328
void drawGameover() {
329
330
s16 word_x = MAP_W / 2 * 8 - 16;
331
s16 word_y = MAP_H * 8 - game_over_timer;
Apr 29, 2018
332
333
if (word_y < MAP_H / 2 * 8 - 14) word_y = MAP_H / 2 * 8 - 14;
334
drawSprite4x1( SPRITE_GAMEOVER | TILE_ATTR(PAL0, 1, 0, 0), word_x, word_y);
335
drawSprite4x1((SPRITE_GAMEOVER + 4) | TILE_ATTR(PAL0, 1, 0, 0), word_x, word_y + 8);
Apr 29, 2018
336
}
337
338
339
void updateAudio() {
340
u8 speed = 0;
Apr 29, 2018
341
342
if (GLog_gameover() || pause) {
343
return;
344
}
345
346
if ((game_player[0].hitpoint || game_player[1].hitpoint) && GLog_victoryTimer() == 0) speed = 1;
Apr 29, 2018
347
348
if (game_player[0].hitpoint && game_player[0].speed != 0) speed = 2;
349
if (game_player[1].hitpoint && game_player[1].speed != 0) speed = 2;
350
351
if (stop_sound_engine) {
352
if (!SND_isPlaying_4PCM(SOUND_PCM_CH1_MSK)) {
Apr 29, 2018
353
stop_sound_engine = FALSE;
354
}
355
}
356
357
if ((getTimer(0, FALSE) > 330000) && (!start_snd_engine_once)) {
358
soundStopEngine();
359
start_snd_engine_once = TRUE;
360
}
361
362
if (!stop_sound_engine) {
363
if (playing_engine != speed) {
364
if (speed == 0) SND_stopPlay_4PCM(SOUND_PCM_CH1);
365
if (speed == 1) soundPlay(snd_engine_stop, sizeof(snd_engine_stop), SOUND_PCM_CH1, TRUE);
366
if (speed == 2) soundPlay(snd_engine_move, sizeof(snd_engine_move), SOUND_PCM_CH1, TRUE);
Apr 29, 2018
367
playing_engine = speed;
368
stop_sound_engine = FALSE;
369
}
370
}
371
372
if (GLog_victory()) {// || GLog_gameover()) {
373
SND_stopPlay_4PCM(SOUND_PCM_CH1);
Apr 29, 2018
374
}
375
}
376
377
378
void soundStopEngine() {
379
stop_sound_engine = TRUE;
380
playing_engine = 0;
381
}
382
383
void soundPlayEngine() {
384
stop_sound_engine = FALSE;
385
}