File: DRAW_MAP.C | Size: 4,021 bytes | Download file | Back to directory listing | BWPOW's homepage
#include <all312.h>
#include "map.h"
#include "sprite.h"
 
V3D vtx[4]={
{0,0,0,  0,  0,0x00FF00},
{0,0,0, 64,  0,0x0000FF},
{0,0,0, 64,128,0xFF0000},
{0,0,0,  0,128,0x00FFFF}
};
 
static V3D_f zem[4]={
{ 0, 0,0,  0,  0,0},
{64, 0,0,128,  0,0},
{64,64,0,128,128,0},
{ 0,64,0,  0,128,0},
};
 
static V3D_f strop[4]={
{ 10, 10,0,  0, 0,0},
{ 54, 10,0, 32, 0,0},
{ 54, 54,0, 32,32,0},
{ 10, 54,0,  0,32,0},
};
 
static V3D_f stena1[4]={
{ 10, 10,128, 0, 0,0},
{ 54, 10,128,32, 0,0},
{ 54, 10,200,32,64,0},
{ 10, 10,200, 0,64,0},
};
 
static V3D_f stena2[4]={
{ 10, 54,128, 0, 0,0},
{ 54, 54,128,32, 0,0},
{ 54, 54,200,32,64,0},
{ 10, 54,200, 0,64,0},
};
 
static V3D_f stena4[4]={
{ 54, 10,128, 0, 0,0},
{ 54, 54,128,32, 0,0},
{ 54, 54,200,32,64,0},
{ 54, 10,200, 0,64,0},
};
static V3D_f stena3[4]={
{ 10, 10,128, 0, 0,0},
{ 10, 54,128,32, 0,0},
{ 10, 54,200,32,64,0},
{ 10, 10,200, 0,64,0},
};
 
static char vyska[16]={64,52,45,64,61,44,46,49,57,45,65,62,56,69,44,50};
 
static inline void _draw_tile(BITMAP *bmp,int mx,int my,int sx,int sy,char ax,char ay)
{
  unsigned char i,vsk;
  char x,y;
 
//  if((mx<0)||(mx>9)) return;
  if((my<0)||(my>=2000)) return;
  if(map[mx][my]==0) return;
  if(ax==0&&ay==0){
    if(sx%64>32) ax--;
    if(sy%64>32) ay--;
  }
 
  x=map[mx][my]%20-10;
  y=(map[mx][my]>>1)%20-10;
 
  for(i=0;i<4;i++){
    vsk=200;
    if(i<2)
      vsk=200-vyska[map[mx][my]>>4];
    if(ax>=0) persp_project(itofix(stena3[i].x+sx-x),itofix(stena3[i].y+sy-y),itofix(vsk),&vtx[i].x,&vtx[i].y);
    if(ax<0) persp_project(itofix(stena4[i].x+sx-x),itofix(stena4[i].y+sy-y),itofix(vsk),&vtx[i].x,&vtx[i].y);
    vtx[i].u=itofix(stena3[i].u);
    vtx[i].v=itofix(stena3[i].v);
    vtx[i].c=(200-vsk)<<1;
  }
  quad3d(bmp,7,tex[(map[mx][my]%16)>>1].dat,&vtx[0],&vtx[1],&vtx[2],&vtx[3]);
 
  for(i=0;i<4;i++){
    vsk=200;
    if(i<2)
      vsk=200-vyska[map[mx][my]>>4];
    if(ay>=0) persp_project(itofix(stena1[i].x+sx-x),itofix(stena1[i].y+sy-y),itofix(vsk),&vtx[i].x,&vtx[i].y);
    if(ay<0) persp_project(itofix(stena2[i].x+sx-x),itofix(stena2[i].y+sy-y),itofix(vsk),&vtx[i].x,&vtx[i].y);
    vtx[i].u=itofix(stena1[i].u);
    vtx[i].v=itofix(stena1[i].v);
    vtx[i].c=(200-vsk)<<1;
  }
  quad3d(bmp,7,tex[(map[mx][my]%16)>>1].dat,&vtx[0],&vtx[1],&vtx[2],&vtx[3]);
 
  for(i=0;i<4;i++){
    persp_project(itofix(strop[i].x+sx-x),itofix(strop[i].y+sy-y),itofix(200-vyska[map[mx][my]>>4]),&vtx[i].x,&vtx[i].y);
    vtx[i].u=itofix(strop[i].u);
    vtx[i].v=itofix(strop[i].v);
    vtx[i].c=vyska[map[mx][my]>>4]<<1;
  }
  quad3d(bmp,7,tex[map[mx][my]%2+9].dat,&vtx[0],&vtx[1],&vtx[2],&vtx[3]);
}
/*
static inline void _draw_zem(BITMAP *bmp,int mx,int my,int sx,int sy,char ax,char ay)
{
  char i;
  if((mx<0)||(mx>9)) return;
  if((my<0)||(my>=2000)) return;
 
  for(i=0;i<4;i++)
    persp_project_f(zem[i].x+sx,zem[i].y+sy,200,&vtx[i].x,&vtx[i].y);
  quad3d_f(bmp,3,tilegfx[tile[mx][my]].dat,&vtx[0],&vtx[1],&vtx[2],&vtx[3]);
}
*/
unsigned char col;
 
static inline void draw_map(BITMAP *bmp,short mx,short my,char sx,char sy)
{
  char x,y;
 
  if(!col) col=makecol(74,74,74);
  clear_to_color(bmp,col);
//  for(x=-4;x<=4;x++) for(y=-4;y<=3;y++)
//      _draw_zem(bmp,mx+x,my+y,(x<<6)-sx,(y<<6)-sy,x,y);
 
  for(y=-4;y<=0;y++) for(x=-4;x<=0;x++)
      _draw_tile(bmp,mx+x,my+y,(x<<6)-sx,(y<<6)-sy,x,y);
 
  for(x=4;x>=0;x--) for(y=-4;y<=0;y++)
      _draw_tile(bmp,mx+x,my+y,(x<<6)-sx,(y<<6)-sy,x,y);
 
  for(x=-4;x<=0;x++) for(y=3;y>=0;y--)
      _draw_tile(bmp,mx+x,my+y,(x<<6)-sx,(y<<6)-sy,x,y);
 
  for(x=4;x>=0;x--) for(y=3;y>=0;y--)
      _draw_tile(bmp,mx+x,my+y,(x<<6)-sx,(y<<6)-sy,x,y);
 
//  hline(bmp,0,240,480,65535);
//  vline(bmp,240,0,480,65535);
}
 
//short amx=352;
int amy=1996*64;
 
void zobraz(BITMAP *bmp)
{
//  if(x<50) amx-=15;
//  if(x>430) amx+=15;
 
//  if(amx<256) amx=256;
//  if(amx>384) amx=384;
 
  draw_map(bmp,5,amy>>6,32,amy%64);
 
  amy-=8;
}