Permalink
Newer
100644
385 lines (305 sloc)
9.55 KB
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"
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
27
void drawStageNum(s16 num);
28
void startLevel();
29
void joyEventGame(u16 joy, u16 changed, u16 state);
34
void sleepFrames(u16 i) {
35
u16 a;
36
for (a = 0; a < i; a++) {
37
VDP_waitVSync();
38
}
46
// main.c
47
extern void battlecity_init();
48
extern void tank1990_init();
49
extern void mods_mode_init();
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);
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;
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;
125
if ((config.game_mode == MODE_CUSTOM || config.game_mode == MODE_MODS) && config.random_mods)
126
initMods();
127
if (config.mods_inc_lvl != 0) {
133
134
drawStageNum(stage_ctr + 1);
135
updateSprite();
136
joy = JOY_readJoypad(JOY_1);
137
149
sleepFrames(10);
150
drawStageNum(stage_ctr + 1);
151
}
152
if (joy & BUTTON_C) {
153
stage_ctr--;
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
175
176
SND_startPlay_PCM(snd_begin, sizeof(snd_begin), SOUND_RATE_22050, SOUND_PAN_CENTER, 0);
177
startTimer(0);
178
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) {
196
if (config.game_mode == MODE_MODS || config.game_mode == MODE_CUSTOM)
197
showModText();
209
// VDP_fillTileMapRect(PLAN_B, 0, 0, 0, planWidth, planHeight);
210
VDP_fillTileMapRect(PLAN_A, RES_TILE_GREY, 0, 0, 32, 28);
273
const u16 player_index = (joy == JOY_1) ? 0 : 1;
274
275
if ((pressed & BUTTON_START) /*&& !gameover*/ && level_timer > 180) {
284
if (state & BUTTON_A) {
285
bonus.type = BONUS_GRENADE;
286
setBonus(player_index);
302
u16 fire_buttons = BUTTON_A | BUTTON_C;
303
if (!config.turbo_b) {
304
fire_buttons |= BUTTON_B;
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--;
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);
323
}
324
}
325
}
326
327
328
void drawGameover() {
329
330
s16 word_x = MAP_W / 2 * 8 - 16;
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);
345
346
if ((game_player[0].hitpoint || game_player[1].hitpoint) && GLog_victoryTimer() == 0) speed = 1;
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) {
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) {
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);