#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(); } }