File: engine.c | Size: 3,565 bytes | Download file | Back to directory listing | BWPOW's homepage
#include <string.h>
#include <stdio.h>
#include <allegro.h>
 
#include "engine.h"
#include "headers.h"
#include "main.h"
 
#include "fonty.h"
extern MINFO minfo;
extern MAP map[MAP_W][MAP_H];
extern LEVELS levels[32];
 
XY calc;
XY xy_table[40][40];
 
#define ENG_X 16
#define ENG_Y 16
 
BITMAP *ebmp;
 
void engine_to_3d(int x,int y)
{
	calc.x=(x+y)+320;
	calc.y=((y-x)>>1)+200;
}
 
 
void init_engine(void)
{
	int x,y;
 
	for(y=-ENG_Y;y<=ENG_Y;y++)
		for(x=-ENG_X;x<=ENG_X;x++){
 
			engine_to_3d(x*32,y*32);
			xy_table[x+ENG_X][y+ENG_Y]=calc;
 
		}
	ebmp=create_bitmap(640,400);
 
}
 
int engine_prekryva_sa(int x1,int y1,int x2,int y2)
{
	if(x1>minfo.px2) return 0;
	if(y1>minfo.py2) return 0;
	if(x2<minfo.px1) return 0;
	if(y2<minfo.py2) return 0;
	return 1;
}
 
void engine_zakresli(RLE_SPRITE *spr,int x,int y,char co)
{
	if(x>640) return;
	if(y>400) return;
	if(x+spr->w<0) return;
	if(y+spr->h<0) return;
 
	if(co>0&&engine_prekryva_sa(x,y,x+spr->w,y+spr->h)){
/*
		if(co==1) draw_rle_sprite(ebmp,wtex[0].dat,x,y);
		if(co==2) draw_rle_sprite(ebmp,wtex[1].dat,x,y);
		if(co==3) draw_rle_sprite(ebmp,gtex[0].dat,x,y);
*/
		draw_trans_rle_sprite(ebmp,spr,x,y);
	}
	else
		draw_rle_sprite(ebmp,spr,x,y);
}
 
void engine_kresli_stenu(int mx,int my,int px,int py,int h,int ta,int tb)
{
	int a,b;
 
	if(mx>0&&mx<=MAP_W&&my>=0&&my<MAP_H) a=map[mx-1][my].h;
	else a=h;
 
	if(my<MAP_H-1&&my>=-1&&mx>=0&&mx<MAP_W) b=map[mx][my+1].h;
	else b=h;
 
	if(a<h) engine_zakresli(wtex[(ta<<1)].dat,px,py-h,1);
	if(b<h) engine_zakresli(wtex[(tb<<1)+1].dat,px+32,py-h,2);
 
	if(a+80<h) engine_zakresli(wtex[(ta<<1)].dat,px,py-h+80,1);
	if(b+80<h) engine_zakresli(wtex[(tb<<1)+1].dat,px+32,py-h+80,2);
 
}
 
void engine_draw(int map_x,int map_y)
{
   int x,y,xx,yy,px,py,a;
   int mx,my;
 
	xx=ENG_X<<1;
	yy=ENG_Y<<1;
 
	clear(ebmp);
 
	minfo.px1=-100;
	minfo.py1=-100;
 
	minfo.px2=-101;
	minfo.py2=-101;
 
	for(x=xx-1;x>=0;x--)
		for(y=0;y<yy;y++){
			px=xy_table[x][y].x;
			py=xy_table[x][y].y;
 
			mx=map_x+x-ENG_X;
			my=map_y+y-ENG_Y;
 
			if(mx>=0&&my>=0&&mx<MAP_W&&my<MAP_H){
				engine_zakresli(gtex[map[mx][my].ground].dat,px,py-16-map[mx][my].h,3);
				engine_kresli_stenu(mx,my,px,py,map[mx][my].h,map[mx][my].tex[0],map[mx][my].tex[1]);
 
			}
			else{
				a=7+abs(mx)%2+((abs(my)%2)<<1);
				engine_zakresli(gtex[a].dat,px,py-96,3);
 				engine_kresli_stenu(mx,my,px,py,80,18,18);
			}
		}
 
}
 
void game_load_level(int c)
{
	FILE *s;
	char tbuf[256];
	int a;
 
	strcpy(minfo.fcia,"game_load_level");
 
	sprintf(tbuf,"./levels/%s",levels[c].file);
	s=fopen(tbuf,"rb");
	if(s==0) main_koniec("Chyba pri nacitavani levelu!");
 
	fread(tbuf,1,8,s);
	if(memcmp(tbuf,"Matalyza",8)) main_koniec("Chyba v subore! Nahrajte ich este raz!");
	a=fgetc(s);
	if(a>1) main_koniec("Nepodporovana verzia levelu!");
 
	a=fgetc(s); // dlzka nazvu
	fread(tbuf,1,a,s);
	if(memcmp(tbuf,levels[c].name,a)) main_koniec("Chyba v hlavicke levelu!");
 
	fread(map,sizeof(MAP),MAP_W*MAP_H,s);
 
	fclose(s); // zatvorenie suboru
}
 
void game(void)
{
	int mx=0,my=0;
 
	clear_to_color(screen,makecol(255,255,0));
/*
	map[3][3].ground=1;
	map[3][3].h=80;
	map[3][3].tex[0]=24;
	map[3][3].tex[1]=24;
 
 
	map[2][3].ground=1;
*/
	main_set_track(2);
	game_load_level(0);
 
	while(1){
		engine_draw(mx,my);
 
		vline(ebmp,320,0,400,minfo.green);
		hline(ebmp,0,200,640,minfo.green);
 
		blit(ebmp,screen,0,0,0,0,640,400);
 
		if(key[KEY_RIGHT]){
			mx++;my++;
		}
		if(key[KEY_LEFT]){
			mx--;my--;
		}
 
		if(key[KEY_UP]){
			mx++;my--;
		}
		if(key[KEY_DOWN]){
			mx--;my++;
		}
 
		if(key[KEY_ESC]) break;
		main_loop_music();
	}
}