|
|
@ -1,10 +1,9 @@ |
|
|
|
#include "wings.h" |
|
|
|
//#include "maths.h" |
|
|
|
|
|
|
|
#include "display.h" // bopti.h => images // tales.h => fonts |
|
|
|
#include "keyboard.h" |
|
|
|
#include "timer.h" |
|
|
|
#include "gray.h" |
|
|
|
#include "events.h" |
|
|
|
|
|
|
|
#include "stdio.h" |
|
|
|
#include "stdlib.h" |
|
|
@ -13,7 +12,7 @@ |
|
|
|
#define MAP_SIZE_Y 256 |
|
|
|
|
|
|
|
#define MAX_PLANES 2 |
|
|
|
#define MAX_CLOUDS 2 |
|
|
|
#define MAX_CLOUDS 15 |
|
|
|
|
|
|
|
Plane planes[MAX_PLANES]; // number of planes in the map (with us) |
|
|
|
//others planes are controlled by the AI |
|
|
@ -24,7 +23,7 @@ Cloud clouds[MAX_CLOUDS]; //number of clouds in this beautifull sky |
|
|
|
extern image_t plane; |
|
|
|
extern image_t img_menu; |
|
|
|
extern image_t cloud; |
|
|
|
extern image_t missiles; |
|
|
|
extern image_t missile; |
|
|
|
|
|
|
|
int main() |
|
|
|
{ |
|
|
@ -40,14 +39,13 @@ void init() |
|
|
|
{ |
|
|
|
planes[i].x = 56 + 16 * i; |
|
|
|
planes[i].y = 24 + i; |
|
|
|
planes[i].dir = i; |
|
|
|
planes[i].life = 100; |
|
|
|
planes[i].reload = 6; |
|
|
|
planes[i].bullets = 6; |
|
|
|
planes[i].dir.dx = i; |
|
|
|
planes[i].dir.dy = i; |
|
|
|
|
|
|
|
for(j = 0; j < MAX_MISSILES; j++) |
|
|
|
{ |
|
|
|
|
|
|
|
//planes[i].missiles[j].distance = 0; |
|
|
|
planes[i].missiles[j].dir = planes[i].dir; |
|
|
|
planes[i].missiles[j].type = 0; |
|
|
|
} |
|
|
@ -60,30 +58,9 @@ void init() |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// void infos() |
|
|
|
// { |
|
|
|
// unsigned int key = 0; |
|
|
|
// |
|
|
|
// while(key != KEY_SHIFT) |
|
|
|
// { |
|
|
|
// dclear(); |
|
|
|
// |
|
|
|
// dtext(1, 1, "All informations"); |
|
|
|
// dprint(1, 10, "life : %d", planes[0].life); |
|
|
|
// dprint(1, 20, "shoot : %d", planes[0].reload); |
|
|
|
// dtext(1,54,"F1 to leave"); |
|
|
|
// dupdate(); |
|
|
|
// |
|
|
|
// key = getkey(); |
|
|
|
// } |
|
|
|
// } |
|
|
|
|
|
|
|
int menu() |
|
|
|
{ |
|
|
|
unsigned char menu = 0; |
|
|
|
unsigned int key = 0; |
|
|
|
|
|
|
|
//extern image_t img_menu; |
|
|
|
|
|
|
|
while(1) |
|
|
|
{ |
|
|
@ -94,128 +71,118 @@ int menu() |
|
|
|
|
|
|
|
dupdate(); |
|
|
|
|
|
|
|
key = getkey(); |
|
|
|
|
|
|
|
switch (key) |
|
|
|
switch(getkey()) |
|
|
|
{ |
|
|
|
case KEY_UP : case KEY_DOWN : menu = !menu; break; |
|
|
|
case KEY_EXE : |
|
|
|
{ |
|
|
|
if (!menu) |
|
|
|
{ |
|
|
|
if (!menu) |
|
|
|
{ |
|
|
|
game(); break; |
|
|
|
} |
|
|
|
else return 1; |
|
|
|
game(); break; |
|
|
|
} |
|
|
|
else return 1; |
|
|
|
} |
|
|
|
case KEY_EXIT : return 1; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
char get_decal(unsigned char dir, Type type) |
|
|
|
{ |
|
|
|
char dx[4] = {-1, -1 , 0, 1}; |
|
|
|
char n = 1; |
|
|
|
|
|
|
|
dir += type; |
|
|
|
|
|
|
|
while(dir >=4) |
|
|
|
{ |
|
|
|
dir-=4; |
|
|
|
n = -n; |
|
|
|
} |
|
|
|
return n*dx[dir]; |
|
|
|
} |
|
|
|
|
|
|
|
void *update_frame() |
|
|
|
void *update_frame(Direction *map_dir) |
|
|
|
{ |
|
|
|
static unsigned char i,j; |
|
|
|
|
|
|
|
dclear(); |
|
|
|
|
|
|
|
dprint(1, 1, "s:%d l:%d", planes[0].reload, planes[0].life); |
|
|
|
//dprint(1, 20, "(%d,%d)", get_decal(planes[0].dir, dX), get_decal(planes[0].dir, dY)); |
|
|
|
dprint(1, 1, "s:%d l:%d", planes[0].bullets, planes[0].life); |
|
|
|
dprint(1, 10, "(%d,%d)", map_dir->dx, map_dir->dy); |
|
|
|
//dprint(1,10, "(x,y)(%d,%d)", planes[1].x + decalx, planes[1].y + decaly); |
|
|
|
|
|
|
|
for(i = 0; i < MAX_CLOUDS; i++) |
|
|
|
{ |
|
|
|
clouds[i].x += map_dir->dx; |
|
|
|
clouds[i].y += map_dir->dy; |
|
|
|
dimage(clouds[i].x, clouds[i].y, &cloud); |
|
|
|
clouds[i].x += get_decal(planes[0].dir, dX); |
|
|
|
clouds[i].y += get_decal(planes[0].dir, dY); |
|
|
|
} |
|
|
|
|
|
|
|
for (i = 0; i < MAX_PLANES; i++) |
|
|
|
{ |
|
|
|
if(i > 0) |
|
|
|
{ |
|
|
|
planes[i].x += get_decal(planes[0].dir, dX); |
|
|
|
planes[i].y += get_decal(planes[0].dir, dY); |
|
|
|
planes[i].x += map_dir->dx + planes[i].dir.dx; |
|
|
|
planes[i].y += map_dir->dy + planes[i].dir.dy; |
|
|
|
} |
|
|
|
|
|
|
|
dimage_part(planes[i].x, planes[i].y, &plane, 16*planes[i].dir, 0, 16, 16); |
|
|
|
|
|
|
|
dimage_part(planes[i].x, planes[i].y, &plane, 16*(1 - planes[i].dir.dx), 16 * (1 - planes[i].dir.dy), 16, 16); |
|
|
|
|
|
|
|
for(j = 0; j < MAX_MISSILES; j++) |
|
|
|
{ |
|
|
|
planes[i].missiles[j].x -= get_decal(planes[i].missiles[j].dir, dX); |
|
|
|
planes[i].missiles[j].y -= get_decal(planes[i].missiles[j].dir, dY); |
|
|
|
planes[i].missiles[j].x += map_dir->dx - 2 * planes[i].missiles[j].dir.dx; |
|
|
|
planes[i].missiles[j].y += map_dir->dy - 2 * planes[i].missiles[j].dir.dy; |
|
|
|
|
|
|
|
dimage_part(planes[i].missiles[j].x, planes[i].missiles[j].y ,&missiles, 8 * planes[i].missiles[j].dir, 0, 8, 8); |
|
|
|
dimage_part(planes[i].missiles[j].x, planes[i].missiles[j].y ,&missile, 8 * (1 - planes[i].missiles[j].dir.dx), 8 * (1 - planes[i].missiles[j].dir.dy), 8, 8); |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
dupdate(); |
|
|
|
} |
|
|
|
|
|
|
|
#define MAX_KEYS 4 |
|
|
|
|
|
|
|
int game() |
|
|
|
{ |
|
|
|
unsigned char fire = 0; // fire disable |
|
|
|
unsigned char sum = 0; |
|
|
|
unsigned char fire = 0, j = 0; // fire disable |
|
|
|
|
|
|
|
unsigned int sum_keys[8] = { KEY_RIGHT, KEY_RIGHT + KEY_UP, KEY_UP, KEY_LEFT + KEY_UP, KEY_LEFT, KEY_LEFT + KEY_DOWN, KEY_DOWN, KEY_RIGHT + KEY_DOWN }; |
|
|
|
//direction for the map |
|
|
|
Direction map_dir, dir_requested; |
|
|
|
|
|
|
|
int keys[MAX_KEYS]; |
|
|
|
|
|
|
|
unsigned char i; |
|
|
|
unsigned char j; |
|
|
|
|
|
|
|
j = 0; |
|
|
|
|
|
|
|
init(); // initialisation |
|
|
|
init(); |
|
|
|
|
|
|
|
timer_t *timer = NULL; |
|
|
|
|
|
|
|
timer = timer_create(40, 0); |
|
|
|
timer_attach(timer, update_frame, NULL); |
|
|
|
timer_attach(timer, update_frame, &map_dir); |
|
|
|
timer_start(timer); |
|
|
|
|
|
|
|
while(1) |
|
|
|
{ |
|
|
|
multigetkey(keys, MAX_KEYS, 0); |
|
|
|
event_t events; |
|
|
|
|
|
|
|
sum = 0; |
|
|
|
map_dir.dx = dir_requested.dx = 0; |
|
|
|
map_dir.dy = dir_requested.dy = 0; |
|
|
|
|
|
|
|
while(1) |
|
|
|
{ |
|
|
|
events = waitevent(); |
|
|
|
|
|
|
|
for(i = 0; i < MAX_KEYS; i++) |
|
|
|
if(events.type >= event_key_press && events.type <= event_key_release) |
|
|
|
{ |
|
|
|
switch(keys[i]) |
|
|
|
switch(events.key.code) |
|
|
|
{ |
|
|
|
case KEY_UP : case KEY_DOWN : case KEY_LEFT : case KEY_RIGHT : |
|
|
|
case KEY_UP : |
|
|
|
{ |
|
|
|
dir_requested.dy += 3 - events.type; |
|
|
|
break; |
|
|
|
} |
|
|
|
case KEY_DOWN : |
|
|
|
{ |
|
|
|
sum += keys[i]; |
|
|
|
dir_requested.dy -= 3 - events.type; |
|
|
|
break; |
|
|
|
} |
|
|
|
case KEY_LEFT : |
|
|
|
{ |
|
|
|
dir_requested.dx += 3 - events.type; |
|
|
|
break; |
|
|
|
} |
|
|
|
case KEY_RIGHT : |
|
|
|
{ |
|
|
|
dir_requested.dx -= 3 - events.type; |
|
|
|
break; |
|
|
|
} |
|
|
|
|
|
|
|
case KEY_SHIFT : |
|
|
|
{ |
|
|
|
if(planes[0].reload > 0) |
|
|
|
|
|
|
|
fire = 1; |
|
|
|
/*if(planes[0].bullets > 0) |
|
|
|
{ |
|
|
|
planes[0].bullets = planes[0].bullets - 1; |
|
|
|
fire = 1; |
|
|
|
//planes[0].reload = planes[0].reload - 1; |
|
|
|
} |
|
|
|
break; // fire enable |
|
|
|
}*/ |
|
|
|
break; // fire enable |
|
|
|
} |
|
|
|
|
|
|
|
case KEY_EXIT : |
|
|
@ -223,47 +190,23 @@ int game() |
|
|
|
timer_destroy(timer); //destroy the virtual timer |
|
|
|
return 1; // good bye, see you soon |
|
|
|
} |
|
|
|
|
|
|
|
// case KEY_OPTN : |
|
|
|
// { |
|
|
|
// timer_stop(timer); // virtual timer stopped |
|
|
|
// |
|
|
|
// infos(); |
|
|
|
// |
|
|
|
// //timer = timer_create(40, 0); |
|
|
|
// //timer_attach(timer, &update_frame, NULL); |
|
|
|
// timer_start(timer); |
|
|
|
// break; |
|
|
|
// } |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// we determine the direction of the plane |
|
|
|
|
|
|
|
for(i = 0; i < 8; i++) |
|
|
|
if(dir_requested.dx != 0 || dir_requested.dy != 0) |
|
|
|
{ |
|
|
|
if(sum == sum_keys[i]) |
|
|
|
{ |
|
|
|
planes[0].dir = i; |
|
|
|
break; |
|
|
|
} |
|
|
|
map_dir = dir_requested; |
|
|
|
planes[0].dir = dir_requested; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if(fire == 1) // put the screen on fire ! |
|
|
|
if(fire) |
|
|
|
{ |
|
|
|
planes[0].missiles[j].x = planes[0].x; |
|
|
|
planes[0].missiles[j].y = planes[0].y; |
|
|
|
planes[0].missiles[j].dir = planes[0].dir; // the missile take the direction of the plane |
|
|
|
|
|
|
|
j = j + 1; |
|
|
|
planes[0].missiles[0].dir = planes[0].dir; |
|
|
|
|
|
|
|
if(j >= MAX_MISSILES) |
|
|
|
{ |
|
|
|
j = 0; |
|
|
|
} |
|
|
|
planes[0].missiles[0].x = 60 - 6 * planes[0].missiles[0].dir.dx; |
|
|
|
planes[0].missiles[0].y = 28 - 6 * planes[0].missiles[0].dir.dy; |
|
|
|
|
|
|
|
fire = 0; // fire disable, shoot one by one // this code line will depend if we shoot in continue |
|
|
|
fire = 0; |
|
|
|
} |
|
|
|
} |
|
|
|
} |