wings/src/wings.c

288 lines
6.5 KiB
C

#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 "stdio.h"
#include "stdlib.h"
#define MAP_SIZE_X 256
#define MAP_SIZE_Y 256
#define MAX_PLANES 2
Plane planes[MAX_PLANES]; // number of planes in the map (with us)
//others planes are controlled by the AI
extern image_t plane;
extern image_t img_menu;
extern image_t cloud;
extern image_t missiles;
int main()
{
menu();
return 1;
}
void init()
{
unsigned char i,j;
for(i = 0; i < MAX_PLANES; i++)
{
planes[i].x = 56 + 16 * i;
planes[i].y = 24 + i;
planes[i].dir = i;
planes[i].life = 100;
planes[i].reload = 6;
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;
}
}
}
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;
while(1)
{
dclear();
dimage(0, 0, &img_menu);
drect(67 + menu * 19, 10 + menu * 27, 100 + menu * 19, 25 + menu * 27, color_invert);
dupdate();
key = getkey();
switch (key)
{
case KEY_UP : case KEY_DOWN : menu = !menu; break;
case KEY_EXE :
{
if (!menu)
{
game(); break;
}
else return 1;
}
case KEY_EXIT : return 1;
}
}
}
void *update_frame()
{
static unsigned char i,j;
static char decalx = -1;
static char decaly = 0;
dclear();
dprint(1, 1, "s:%d l:%d", planes[0].reload, planes[0].life);
dprint(1, 10, "(%d,%d)", decalx, decaly);
decalx = decaly = 0;
switch(planes[0].dir)
{
case 0 : decalx = -1; break;
case 1 : decalx = -1; decaly = 1; break;
case 2 : decaly = 1; break;
case 3 : decalx = 1; decaly = 1; break;
case 4 : decalx = 1; break;
case 5 : decalx = 1; decaly = -1; break;
case 6 : decaly = -1; break;
case 7 : decalx = -1; decaly = -1; break;
}
for(i = 0; i < MAX_PLANES; i++)
{
if(i > 0)
{
planes[i].x += decalx;
planes[i].y += decaly;
}
dimage_part(planes[i].x, planes[i].y, &plane, 16*planes[i].dir, 0, 16, 16);
}
//dprint(1,10, "(x,y)(%d,%d)", planes[1].x + decalx, planes[1].y + decaly);
dimage(10 + decalx, 10 + decaly, &cloud);
for (i = 0; i < MAX_PLANES; i++)
{
for(j = 0; j < MAX_MISSILES; j++)
{
dimage_part(planes[i].x + 4 + (planes[i].missiles[j].distance + 15) * fcos(planes[i].missiles[j].dir),
planes[i].y + 4 - (planes[i].missiles[j].distance + 15) * fsin(planes[i].missiles[j].dir),
&missiles, 8 * planes[i].missiles[j].dir, 0, 8, 8);
planes[i].missiles[j].distance ++;
}
}
dupdate();
return;
}
#define MAX_KEYS 4
int game()
{
unsigned char fire = 0; // fire disable
unsigned char sum = 0;
int keys[MAX_KEYS];
unsigned char i;
unsigned char j;
j = 0;
init(); // initialisation
timer_t *timer = NULL;
timer = timer_create(40, 0);
timer_attach(timer, update_frame, NULL);
timer_start(timer);
while(1)
{
multigetkey(keys, MAX_KEYS, 0);
sum = 0;
for(i = 0; i < MAX_KEYS; i++)
{
switch(keys[i])
{
case KEY_UP : case KEY_DOWN : case KEY_LEFT : case KEY_RIGHT :
{
sum += keys[i]; // to know which replay keys pressed
break;
}
case KEY_SHIFT :
{
if(planes[0].reload > 0)
{
fire = 1;
//planes[0].reload = planes[0].reload - 1;
}
break; // fire enable
}
case KEY_EXIT :
{
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
switch(sum)
{
case KEY_RIGHT :
{
planes[0].dir = 0;
break;
}
case KEY_UP + KEY_RIGHT :
{
planes[0].dir = 1;
break;
}
case KEY_UP :
{
planes[0].dir = 2;
break;
}
case KEY_UP + KEY_LEFT :
{
planes[0].dir = 3;
break;
}
case KEY_LEFT :
{
planes[0].dir = 4;
break;
}
case KEY_DOWN + KEY_LEFT :
{
planes[0].dir = 5;
break;
}
case KEY_DOWN :
{
planes[0].dir = 6;
break;
}
case KEY_DOWN + KEY_RIGHT :
{
planes[0].dir = 7;
break;
}
}
if(fire) // put the screen on fire !
{
planes[0].missiles[j].dir = planes[0].dir; // the missile take the direction of the plane
planes[0].missiles[j].distance = 0; // fire unlimited (nearly)
j = j + 1;
if(j >= MAX_MISSILES)
{
j = 0;
}
fire = 0; // fire disable, shoot one by one // this code line will depend if we shoot in continue
}
}
}