/*
* Space force
* (c) Haakon Lorentzen 1999
*
* simple arcade shoot'em up
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <conio.h>
//#include <math.h>
#include <allegro.h>
#include "main.h"
RGB_MAP rgb_table;
COLOR_MAP light_table;
DATAFILE *data;
BITMAP *buffer;
int width=640;
int height=480;
int textcol=4;
char highscorebuf[20];
FILE *hscore;
int frame_number;
int finished=0;
volatile int fps;
volatile int last_frame;
//char intro_logo[80];
//char intro_name[80];
char finalscore[30];
char fpstxt[20];
char msg[20];
char healthtxt[20];
char pausetxt[10];
char pausetxt2[30];
int health=10;
int x_pos=300;
int speed=6;
int x_alien;
int y_alien=10;
int x_bullet;
int y_bullet=430;
int skyt;
int x_abullet=0;
int y_abullet=0;
int skyt2;
int score=0;
/* variabler for stjernene. */
/* stars=antall stjerner */
/* d=en dummy for for-looper etc */
/* sx & sy=stjernenes x- og y-posisjoner */
/* ssp=farta p� stjernene */
int ns;
int d;
int sx[2000];
int sy[2000];
int ssp[2000];
int resolution(void)
{
int q;
printf("\nChoose your resolution: ");
printf("\n640x480: Press 1");
printf("\n800x600: Press 2");
printf("\n1024x768: Press 3");
printf("\n1280x1024: Press 4\n");
scanf("%i", &q);
if(q==1)
{
width=640;
height=480;
}
if(q==2)
{
width=800;
height=600;
}
if(q==3)
{
width=1024;
height=768;
}
if(q==4)
{
width=1280;
height=1024;
}
}
int movie()
{
if(width==640)
{ draw_sprite(screen,data[intro640].dat, 0, 0); }
if(width==800)
{ draw_sprite(screen,data[intro800].dat, 0, 0); }
if(width==1024)
{ draw_sprite(screen,data[intro1024].dat, 0, 0); }
if(width==1280)
{ draw_sprite(screen,data[intro1024].dat, 128, 128); }
textout(screen, font, "You are a member of Space Force, a peacekeeping policeforce in the 21st century.",1,10,textcol);
rest(4000);
clear(screen);
if(width==640)
{ draw_sprite(screen,data[intro640].dat, 0, 0); }
if(width==800)
{ draw_sprite(screen,data[intro800].dat, 0, 0); }
if(width==1024)
{ draw_sprite(screen,data[intro1024].dat, 0, 0); }
if(width==1280)
{ draw_sprite(screen,data[intro1024].dat, 128, 128); }
textout(screen, font, "Your mission: To blow the alien pirates to smithereens!",1,10,textcol);
rest(4000);
ns=1000;
clear(screen);
}
int intro(void)
{
fade_in(data[pal].dat, 10);
textout_centre(screen, data[stor1].dat, "Space Force", SCREEN_W/2, 50, textcol);
rest(1000);
textout_centre(screen, data[liten1].dat, "(c) Haakon Lorentzen", SCREEN_W/2, 100, textcol);
rest(1000);
textout_centre(screen, data[liten1].dat, "press any key...", SCREEN_W/2, 150, textcol);
readkey();
fade_out(1);
clear(screen);
fade_in(data[pal].dat, 64);
return;
}
int highscore(void)
{
hscore=fopen("high.hsl","a");
fprintf(hscore, "%d\n", score);
fclose(hscore);
}
END_OF_FUNCTION(highscore);
int lyd(void)
{
play_sample(data[rakettlyd].dat,255,120,1000,0);
return;
}
int musikk(void)
{
play_midi(data[musikk1].dat, TRUE);
return;
}
void frames(void)
{
last_frame=fps;
fps=0;
}
END_OF_FUNCTION(frames);
int screenshot(char *filename)
{
BITMAP *vis;
int ret;
get_pallete(pal);
vis=create_sub_bitmap(screen, 0, 0, SCREEN_W, SCREEN_H);
textout(buffer, data[liten1].dat, "Screenshot taken", 1, SCREEN_H-20, textcol);
if(vis==NULL)
{
ret=save_bitmap(filename,screen,pal);
}
else
{
ret=save_bitmap(filename,vis,pal);
destroy_bitmap(vis);
}
return ret==0;
}
END_OF_FUNCTION(screenshot);
void flytt_spiller(void)
{
if((key[KEY_LEFT]) && (x_pos>0))
{
x_pos=x_pos-speed;
}
if((key[KEY_RIGHT]) && (x_pos<SCREEN_W-50))
{
x_pos=x_pos+speed;
}
for (d=1; d<ns; d++)
{
sy[d] = sy[d] + ssp[d];
if (sy[d] >= SCREEN_H)
sy[d] = 0;
_putpixel(buffer, sx[d], sy[d], 215);
}
draw_rle_sprite(buffer,data[skip1].dat,x_pos,SCREEN_H-60);
if((y_alien<=SCREEN_H) && (y_alien+50>=SCREEN_H-10))
{
if((x_alien+50>=x_pos) && (x_alien<=x_pos+50))
{
health-=2;
y_alien=0;
x_alien=rand()%SCREEN_W-25;
}
}
if((key[KEY_SPACE]) && (skyt!=TRUE))
{
skyt = TRUE;
skyt2 = TRUE;
lyd();
x_bullet=x_pos+20;
x_abullet=x_alien+20;
y_abullet=y_alien+50;
}
if (skyt!=FALSE)
{
draw_rle_sprite(buffer,data[rakett].dat,x_bullet,y_bullet);
y_bullet-=4;
}
if(y_bullet<0)
{
x_bullet=0;
y_bullet=SCREEN_H-60;
skyt=FALSE;
}
if(skyt!=FALSE)
{
if((y_bullet>=y_alien) && (y_bullet+20<=y_alien+50))
{
if((x_bullet>=x_alien) && (x_bullet+10<=x_alien+50))
{
skyt=FALSE;
play_sample(data[eksplosjon].dat,255,120,1000,0);
y_bullet=SCREEN_H-60;
y_alien=0;
x_alien=rand()%SCREEN_W-25;
score++;
}
}
}
return;
}
void flytt_alien()
{
draw_rle_sprite(buffer,data[skip].dat,x_alien,y_alien);
y_alien+=4;
if (skyt2!=FALSE)
{
draw_rle_sprite(buffer,data[rakett2].dat,x_abullet,y_abullet);
y_abullet+=6;
}
if(y_abullet>SCREEN_H)
{
skyt2=FALSE;
}
if(skyt2!=FALSE)
{
if((y_abullet>=SCREEN_H-60) && (y_abullet+20<=SCREEN_H-60+50))
{
if((x_abullet>=x_pos) && (x_abullet+10<=x_pos+50))
{
skyt2=FALSE;
health--;
}
}
}
if (y_alien >=SCREEN_H)
{
y_alien=0;
x_alien=rand()%SCREEN_W-25;
score--;
}
if(x_alien+25>x_pos+50)
{
x_alien--;
}
if(x_alien+25<x_pos)
{
x_alien++;
}
}
int spill(void)
{
while(!key[KEY_ESC])
{
flytt_spiller();
flytt_alien();
while(key[KEY_S])
{
screenshot("screenshot.pcx");
break;
}
if(health<=0)
return;
sprintf(msg, "score = %-5d", score);
textout(buffer, data[liten1].dat, msg, 1, 1, textcol);
sprintf(healthtxt, "health = %-5d", health);
textout_centre(buffer, data[liten1].dat, healthtxt, SCREEN_W/2 ,1, textcol);
sprintf(fpstxt, "fps = %-5d",last_frame);
textout(buffer, data[liten1].dat, fpstxt, SCREEN_W-150, 1, textcol);
if(!key[KEY_F])
{
vsync();
}
if(key[KEY_P])
{
sprintf(pausetxt, "Pause");
sprintf(pausetxt2, "Press 'up' to continue...");
while(!key[KEY_UP])
{
textout_centre(screen, data[stor1].dat, pausetxt, SCREEN_W/2, SCREEN_H/2, textcol);
textout_centre(screen, data[liten1].dat, pausetxt2, SCREEN_W/2, SCREEN_H/2+40, textcol);
}
}
blit(buffer,screen,0,0,0,0,SCREEN_W,SCREEN_H);
fps++;
clear(buffer);
}
}
int main(void)
{
x_pos=SCREEN_W/2;
y_bullet=SCREEN_H-60;
srand((unsigned)time(NULL));
resolution();
allegro_init();
install_keyboard();
install_timer();
install_int(frames, 1000);
if((data=load_datafile("main.dat"))==NULL)
{
allegro_exit();
printf("Hey! Are you stupid, or what? You can't start the game without \"main.dat\". Duh!\n%s\n\n", allegro_error);
exit(1);
}
printf("Initializing sound...\n");
if(install_sound(DIGI_AUTODETECT,MIDI_AUTODETECT,NULL) !=0)
{
allegro_exit();
printf("Can't set up the sound\n%s\n\n", allegro_error);
exit(1);
}
set_color_depth(8);
if(set_gfx_mode(GFX_AUTODETECT,width,height,0,0) !=0)
{
allegro_exit();
printf("can't set up graphics\n%s\n\n", allegro_error);
exit(1);
}
set_pallete(data[pal].dat);
buffer=create_bitmap(width,height);
clear(buffer);
create_rgb_table(&rgb_table, pal, NULL);
rgb_map = &rgb_table;
create_light_table(&light_table, pal, 0, 0, 0, NULL);
color_map = &light_table;
fade_in(data[pal].dat,5);
movie();
intro();
for(d=0; d<ns; d++)
{
sx[d] = rand() % SCREEN_W;
sy[d] = rand() % SCREEN_H;
ssp[d] = rand() % 3 + 1;
}
musikk();
spill();
fade_out(5);
clear(buffer);
clear(screen);
fade_in(data[pal].dat,5);
textout_centre(screen, data[stor1].dat, "Game over", SCREEN_W/2, 50, textcol);
sprintf(finalscore, "You got %-5d points!", score);
textout_centre(screen, data[liten1].dat, finalscore, SCREEN_W/2, 100, textcol);
rest(1000);
readkey();
fade_out(1);
allegro_exit();
highscore();
}