wings/src/wings.c

203 lines
5.0 KiB
C
Raw Normal View History

2017-04-17 16:55:21 +02:00
#include "wings.h"
2017-04-20 12:44:09 +02:00
#include "maths.h"
2017-04-17 16:55:21 +02:00
#include "display.h" // bopti.h => images // tales.h => fonts
#include "keyboard.h"
2017-04-18 21:46:27 +02:00
#include "timer.h"
2017-04-19 20:30:58 +02:00
#include "gray.h"
2017-04-18 21:46:27 +02:00
2017-04-17 16:55:21 +02:00
#include "stdio.h"
#include "stdlib.h"
2017-04-20 14:37:02 +02:00
#define SIZE_MAP_X 256
#define SIZE_MAP_Y 256
2017-04-19 20:30:58 +02:00
#define MAX_PLANES 3
2017-04-19 22:43:18 +02:00
Plane planes[MAX_PLANES]; // number of planes in the map (with us)
//others planes are controlled by the AI
2017-04-18 21:46:27 +02:00
2017-04-17 16:55:21 +02:00
extern image_t plane;
2017-04-18 21:46:27 +02:00
extern image_t img_menu;
2017-04-19 20:30:58 +02:00
extern image_t cloud;
2017-04-18 22:03:51 +02:00
2017-04-17 16:55:21 +02:00
int main()
{
2017-04-18 21:46:27 +02:00
menu();
2017-04-17 16:55:21 +02:00
return 1;
}
2017-04-19 20:30:58 +02:00
void init()
{
unsigned char i;
2017-04-19 22:43:18 +02:00
planes[0].x = 56;
planes[0].y = 24;
planes[0].dir = 0;
planes[0].life = 100;
for(i = 1; i < MAX_PLANES; i++)
2017-04-19 20:30:58 +02:00
{
planes[i].x = 10 + 16 * i;
2017-04-20 14:37:02 +02:00
planes[i].y = 12 + i;
2017-04-19 20:30:58 +02:00
planes[i].dir = i;
planes[i].life = 100;
}
}
2017-04-17 16:55:21 +02:00
void menu()
{
2017-04-18 21:46:27 +02:00
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)
{
2017-04-19 20:30:58 +02:00
case KEY_UP : case KEY_DOWN : menu = !menu; break;
2017-04-18 21:46:27 +02:00
case KEY_EXE :
{
2017-04-18 22:03:51 +02:00
if (!menu)
2017-04-18 21:46:27 +02:00
{
2017-04-18 22:03:51 +02:00
game(); break;
2017-04-18 21:46:27 +02:00
}
else return 1;
}
case KEY_EXIT : return 1;
}
}
}
2017-04-19 22:43:18 +02:00
void update_frame()
2017-04-18 21:46:27 +02:00
{
2017-04-20 12:44:09 +02:00
static unsigned char i,j;
2017-04-20 14:37:02 +02:00
static short decalx = 0;
static short decaly = 0;
2017-04-19 20:30:58 +02:00
2017-04-19 22:43:18 +02:00
gclear();
2017-04-19 20:30:58 +02:00
2017-04-19 22:43:18 +02:00
switch(planes[0].dir)
2017-04-19 20:30:58 +02:00
{
2017-04-20 12:44:09 +02:00
case 0 : decalx--; break;
2017-04-19 20:30:58 +02:00
case 1 : decalx--; decaly++; break;
2017-04-20 12:44:09 +02:00
case 2 : decaly++; break;
case 3 : decalx++; decaly++; break;
case 4 : decalx++; break;
2017-04-19 21:38:38 +02:00
case 5 : decalx++; decaly--; break;
2017-04-20 12:44:09 +02:00
case 6 : decaly--; break;
case 7 : decalx--; decaly--; break;
2017-04-19 20:30:58 +02:00
}
2017-04-19 21:38:38 +02:00
2017-04-20 14:37:02 +02:00
if(decalx < - SIZE_MAP_X || decalx > SIZE_MAP_X || decaly < - SIZE_MAP_Y || decaly > SIZE_MAP_Y)
{
gtext(10, 10, "You are going to dead");
}
2017-04-19 22:43:18 +02:00
2017-04-20 14:37:02 +02:00
gimage_part(planes[0].x, planes[0].y, &plane, 16*planes[0].dir, 0, 16, 16);
2017-04-19 20:30:58 +02:00
2017-04-19 22:43:18 +02:00
for(i = 1; i < MAX_PLANES; i++)
2017-04-19 20:30:58 +02:00
{
2017-04-20 14:37:02 +02:00
// print condition
if(planes[i].x + decalx > -16 || planes[i].x + decalx < 144 || planes[i].y + decaly > -16 || planes[i].y + decaly < 80)
{
gimage_part(planes[i].x + decalx, planes[i].y + decaly, &plane, 16*planes[i].dir, 0, 16, 16);
}
2017-04-19 20:30:58 +02:00
}
2017-04-20 14:37:02 +02:00
gimage(10 + decalx, 10 + decaly, &cloud);
2017-04-19 22:43:18 +02:00
for (i = 0; i < MAX_PLANES; i++)
{
for(j = 0; j < MAX_MISSILES; j++)
{
2017-04-20 12:44:09 +02:00
if(planes[i].missiles.distance[j] > 0) // we load the missile to reach the target
2017-04-19 22:43:18 +02:00
{
2017-04-20 12:44:09 +02:00
gpixel(planes[i].x + 8 + planes[i].missiles.distance[j] * cos(planes[i].missiles.dir[j] * pi_4), planes[i].y + 8 - planes[i].missiles.distance[j] * sin(planes[i].missiles.dir[j] * pi_4), color_black);
planes[i].missiles.distance[j]++;
2017-04-19 22:43:18 +02:00
}
}
}
2017-04-19 20:30:58 +02:00
gupdate();
2017-04-18 21:46:27 +02:00
}
2017-04-18 22:03:51 +02:00
int game()
2017-04-18 21:46:27 +02:00
{
2017-04-19 08:27:56 +02:00
2017-04-19 22:43:18 +02:00
//int dir = 0;
2017-04-19 20:30:58 +02:00
2017-04-18 21:46:27 +02:00
unsigned char fire = 0; // fire disable
2017-04-19 20:30:58 +02:00
unsigned char sum = 0;
2017-04-19 08:27:56 +02:00
2017-04-19 22:43:18 +02:00
int keys[3];
2017-04-19 08:27:56 +02:00
2017-04-20 14:37:02 +02:00
unsigned char i,j = 0;
2017-04-18 21:46:27 +02:00
timer_t *timer = NULL;
timer = timer_create(40, 0);
2017-04-19 22:43:18 +02:00
timer_attach(timer, update_frame, NULL);
2017-04-18 21:46:27 +02:00
timer_start(timer);
2017-04-19 20:30:58 +02:00
gray_start(); // gray engine running
2017-04-20 12:44:09 +02:00
2017-04-19 20:30:58 +02:00
init(); // initialisation
2017-04-18 21:46:27 +02:00
while(1)
{
2017-04-19 22:43:18 +02:00
multigetkey(keys, 3, 0);
2017-04-18 21:46:27 +02:00
2017-04-18 22:03:51 +02:00
sum = 0;
2017-04-18 21:46:27 +02:00
for(i = 0; i < 3; i++)
{
2017-04-18 22:03:51 +02:00
switch(keys[i])
2017-04-18 21:46:27 +02:00
{
2017-04-18 22:03:51 +02:00
case KEY_UP : case KEY_DOWN : case KEY_LEFT : case KEY_RIGHT :
{
2017-04-19 08:27:56 +02:00
sum += keys[i]; // to know which replay keys pressed
2017-04-18 22:03:51 +02:00
}
break;
2017-04-19 08:27:56 +02:00
case KEY_SHIFT : fire = 1; break; // fire enable
2017-04-19 20:30:58 +02:00
case KEY_EXIT :
{
gray_stop(); // gray engine stopped
2017-04-19 22:43:18 +02:00
timer_stop(timer); // virtual timer stopped
2017-04-19 20:30:58 +02:00
return 1; // good bye, see you soon
}
2017-04-18 21:46:27 +02:00
}
}
2017-04-18 22:03:51 +02:00
2017-04-20 12:44:09 +02:00
// we determine the direction of the plane
2017-04-18 22:03:51 +02:00
2017-04-18 21:46:27 +02:00
switch(sum)
{
2017-04-20 12:44:09 +02:00
case KEY_RIGHT : planes[0].dir = 0; break;
2017-04-19 22:43:18 +02:00
case KEY_UP + KEY_RIGHT : planes[0].dir = 1; break;
2017-04-20 12:44:09 +02:00
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;
2017-04-19 22:43:18 +02:00
case KEY_DOWN + KEY_LEFT : planes[0].dir = 5;break;
2017-04-20 12:44:09 +02:00
case KEY_DOWN : planes[0].dir = 6; break;
case KEY_DOWN + KEY_RIGHT : planes[0].dir = 7; break;
2017-04-19 22:43:18 +02:00
}
if(fire) // put the screen on fire !
{
2017-04-20 12:44:09 +02:00
planes[0].missiles.dir[j] = planes[0].dir;
planes[0].missiles.distance[j] = 12; // fire unlimited (nearly)
j = (j < MAX_MISSILES ? j + 1 : 0);
2017-04-20 14:37:02 +02:00
fire = 0; // fire disable, shoot one by one // this code line will depend if we shoot in continue
2017-04-18 21:46:27 +02:00
}
}
2017-04-17 16:55:21 +02:00
}