File: SMKENG.C | Size: 16,557 bytes | Download file | Back to directory listing | BWPOW's homepage
// This file is by Sam Kupka
#include <stdlib.h>
#include <allegro.h>
#include <tdgui.h>
#include "data.h"
#include "sachy.h"
//#define vav
 
char pass[20]="Idea";
//extern POLICKO sachovnica[8][8];
unsigned char col[2];
BITMAP *logo,*tguess;
BITMAP *but1,*but2;
 
typedef struct VERTEX{
  int x,y;
  float vx,vy,vz;
}VERTEX;
 
VERTEX vtx[400];
 
typedef struct VF{
  int x,y,f,p;
  float vx,vy,vz;
}VF;
 
VF vtp[32];
 
int w,b,v,vp;
DATAFILE *data;
 
typedef struct FACE{
  int v1,v2,v3,v4;
}FACE;
 
FACE face[70];
/*
void initial_positions()
{
  int x,y,z;
  for (x=0;x<=1;x++)
  {
    y = (x==0)?7:0;
    sachovnica[0][y].figurka = 2;
    sachovnica[0][y].farba = x;
    sachovnica[1][y].figurka = 3;
    sachovnica[1][y].farba = x;
    sachovnica[2][y].figurka = 4;
    sachovnica[2][y].farba = x;
    sachovnica[3][y].figurka = 5;
    sachovnica[3][y].farba = x;
    sachovnica[4][y].figurka = 6;
    sachovnica[4][y].farba = x;
    sachovnica[5][y].figurka = 4;
    sachovnica[5][y].farba = x;
    sachovnica[6][y].figurka = 3;
    sachovnica[6][y].farba = x;
    sachovnica[7][y].figurka = 2;
    sachovnica[7][y].farba = x;
    y = (x==0)?6:1;
    for (z=0;z<=7;z++){
      sachovnica[z][y].figurka = 1;
      sachovnica[z][y].farba = x;}
  }
}
*/
void _thinking()
{
  tdbox(screen,270,230,100,20,6);
  text_mode(-1);
  textout_centre(screen,font,"Thinking...",320,237,0);
}
 
 
 
void _sbut(BITMAP *bmp,int m)
{
  int x=0,y=0,w=249,h=35;
  clear(bmp);
  vline(bmp,x,y,y+h,254);
  vline(bmp,x+w,y,y+h-20,254);
  hline(bmp,x,y,x+w,254);
  hline(bmp,x,y+h,x+w-20,254);
  line(bmp,x+w-20,y+h,x+w,y+h-20,254);
  if(m==1) floodfill(bmp,x+1,y+1,255);
  else floodfill(bmp,x+1,y+1,250);
}
 
 
void SMKstart()
{
  BITMAP *b;
  int x,y,i;
  int h[4];
  FACE zak[8]={
    { 0, 1,10, 9},
    { 9,10,19,18},
    {18,19,19,18},
  };
 
 
  tguess=create_bitmap(320,240);
  buffer=create_bitmap(640,480);
  moves_bmp=create_bitmap(40,480);
 
  but1=create_bitmap(251,36);
  but2=create_bitmap(251,36);
  _sbut(but1,1);
  _sbut(but2,0);
 
  packfile_password(pass);
  data=load_datafile("chess.dat");
  if(data==NULL){
    allegro_exit();
    printf("Error loading CHESS.DAT!\n");
    exit(10);
  }
 
  set_palette((RGB *)data[zpal].dat);
 
  col[1]=255;
  col[0]=48;
 
 
  clear(logo);
  text_mode(-1);
  blit(data[zlogo].dat,logo,0,0,0,0,64,64);
  textout_centre(logo,data[zfont].dat,"IdeaZ",31,51, 50);
  textout_centre(logo,data[zfont].dat,"IdeaZ",32,52,150);
  textout_centre(logo,data[zfont].dat,"IdeaZ",33,53,250);
 
 
 
 
  for (x=0;x<=5;x++)
  {
    figurky_biele[x]=create_bitmap(34,24);
    blit(data[zpanaky].dat,figurky_biele[x],x*36+1,1,0,0,34,24);
  }
  for (x=0;x<=5;x++)
  {
    figurky_cierne[x]=create_bitmap(34,24);
    blit(data[zpanaky].dat,figurky_cierne[x],x*36+1,27,0,0,34,24);
  }
  //34x24
 
  w=0;b=0;
  v=0;
  for(y=0;y<9;y++)
    for(x=0;x<9;x++){
      vtx[v].x=x*64-256;
      vtx[v].y=y*64-256;
      v++;
    }
 
  vtx[v].x=-274;
  vtx[v].y=-256;
  v++;
 
  vtx[v].x=-274;
  vtx[v].y=256;
  v++;
 
  vtx[v].x=-256;
  vtx[v].y=276;
  v++;
 
  vtx[v].x=256;
  vtx[v].y=276;
  v++;
 
  vtx[v].x=276;
  vtx[v].y=-256;
  v++;
 
  vtx[v].x=276;
  vtx[v].y=256;
  v++;
 
  vtx[v].x=256;
  vtx[v].y=-276;
  v++;
 
  vtx[v].x=-256;
  vtx[v].y=-276;
  v++;
 
 
 
 
 
  set_projection_viewport(0,-130,640,640);
 
  for(i=1;i<8;i++){
    zak[i].v1=zak[i-1].v1+9;
    zak[i].v2=zak[i-1].v2+9;
    zak[i].v3=zak[i-1].v3+9;
    zak[i].v4=zak[i-1].v4+9;
  }
 
  for(y=0;y<8;y++){
    face[y*8].v1=zak[y].v1;
    face[y*8].v2=zak[y].v2;
    face[y*8].v3=zak[y].v3;
    face[y*8].v4=zak[y].v4;
    for(x=1;x<8;x++){
       face[y*8+x].v1=face[y*8+x-1].v1+1;
       face[y*8+x].v2=face[y*8+x-1].v2+1;
       face[y*8+x].v3=face[y*8+x-1].v3+1;
       face[y*8+x].v4=face[y*8+x-1].v4+1;
    }
  }
 
//  face[64].v1=71;
 
  face[64].v1=81;
  face[64].v2=0;
  face[64].v3=72;
  face[64].v4=82;
 
  face[65].v1=72;
  face[65].v2=80;
  face[65].v3=84;
  face[65].v4=83;
 
  face[66].v1=86;
  face[66].v2=80;
  face[66].v3=8;
  face[66].v4=85;
 
  face[67].v1=8;
  face[67].v2=0;
  face[67].v3=88;
  face[67].v4=87;
//  face[64].v4=72;
 
}
 
void SMKend()
{
  unload_datafile(data);
  destroy_bitmap(buffer);
}
 
void SMKpanaky()
{
  int x,y;
  vp=0;
  for(y=0;y<8;y++)
    for(x=0;x<8;x++){
      if(sachovnica[x][y].figurka>0){
       vtp[vp].x=x*64-224;
       vtp[vp].y=y*64-224;
       vtp[vp].f=sachovnica[x][y].farba;
       vtp[vp].p=sachovnica[x][y].figurka;
       vp++;
      }
    }
}
 
typedef struct {
  int size;
  int pos;
} Item;
 
int qsort_helper_by_size(const void *e1,const void *e2)
{
  return ((Item *)e2)->size - ((Item *)e1)->size;
}
 
MATRIX_f transform;
void SMKmguess()
{
  int i;
  V3D_f vv[4]={
    {0,0,0,  0,  0,0},
    {0,0,0, 64,  0,0},
    {0,0,0, 64, 64,0},
    {0,0,0,  0, 64,0}
  };
 
  clear(tguess);
  for(i=0;i<64;i++){
    vv[0].x=vtx[face[i].v1].vx/2;
    vv[0].y=vtx[face[i].v1].vy/2;
    vv[0].z=vtx[face[i].v1].vz;
 
    vv[1].x=vtx[face[i].v2].vx/2;
    vv[1].y=vtx[face[i].v2].vy/2;
    vv[1].z=vtx[face[i].v2].vz;
 
    vv[2].x=vtx[face[i].v3].vx/2;
    vv[2].y=vtx[face[i].v3].vy/2;
    vv[2].z=vtx[face[i].v3].vz;
 
    vv[3].x=vtx[face[i].v4].vx/2;
    vv[3].y=vtx[face[i].v4].vy/2;
    vv[3].z=vtx[face[i].v4].vz;
 
    vv[0].c=i+1;
    vv[1].c=i+1;
    vv[2].c=i+1;
    vv[3].c=i+1;
    quad3d_f(tguess,0,0,&vv[0],&vv[1],&vv[2],&vv[3]);
  }
 
}
 
int SMKget(int x,int y)
{
  x/=2;y/=2;
  return getpixel(tguess,x,y)-1;
}
 
void SMKdraw(BITMAP *bmp,int a,int b)
{
  int i,t,c;
  float x,y,z;
  Item item[32];
  V3D_f vv[4]={
    {0,0,0,  0,  0,0},
    {0,0,0, 64,  0,0},
    {0,0,0, 64, 64,0},
    {0,0,0,  0, 64,0}
  };
 
  V3D_f vv1[4]={
    {0,0,0,  0,  0,0},
    {0,0,0,  7,  0,0},
    {0,0,0,  7,255,0},
    {0,0,0,  0,255,0}
  };
 
  V3D_f vv2[4]={
    {0,0,0,  0, -1,0},
    {0,0,0,255, -1,0},
    {0,0,0,255,  7,0},
    {0,0,0,  0,  7,0}
  };
 
 
  get_transformation_matrix_f(&transform, 1, b, 0, a, 0, 0, 500);
 
  for (i=0; i<v; i++){
	 apply_matrix_f(&transform, vtx[i].x, vtx[i].y, 0, &x, &y, &z);
	 persp_project_f(x, y, z, &vtx[i].vx, &vtx[i].vy);
    vtx[i].vz=z;
  }
  for (i=0; i<vp; i++){
	 apply_matrix_f(&transform, vtp[i].x, vtp[i].y, 0, &x, &y, &z);
	 persp_project_f(x, y, z, &vtp[i].vx, &vtp[i].vy);
    vtp[i].vz=z;
  }
 
  t=1;
  for(i=0;i<64;i++){
    vv[0].x=vtx[face[i].v1].vx;
    vv[0].y=vtx[face[i].v1].vy;
    vv[0].z=vtx[face[i].v1].vz;
 
    vv[1].x=vtx[face[i].v2].vx;
    vv[1].y=vtx[face[i].v2].vy;
    vv[1].z=vtx[face[i].v2].vz;
 
    vv[2].x=vtx[face[i].v3].vx;
    vv[2].y=vtx[face[i].v3].vy;
    vv[2].z=vtx[face[i].v3].vz;
 
    vv[3].x=vtx[face[i].v4].vx;
    vv[3].y=vtx[face[i].v4].vy;
    vv[3].z=vtx[face[i].v4].vz;
 
    if(w<4) quad3d_f(bmp,3,data[w+t*6].dat,&vv[0],&vv[1],&vv[2],&vv[3]);
    else{
      vv[0].c=col[t];
      vv[1].c=col[t];
      vv[2].c=col[t];
      vv[3].c=col[t];
      quad3d_f(bmp,0,0,&vv[0],&vv[1],&vv[2],&vv[3]);
    }
 
    t=!t;if((i+1)%8==0) t=!t;
  }
 
    vv1[0].x=vtx[face[64].v1].vx;
    vv1[0].y=vtx[face[64].v1].vy;
    vv1[0].z=vtx[face[64].v1].vz;
 
    vv1[1].x=vtx[face[64].v2].vx;
    vv1[1].y=vtx[face[64].v2].vy;
    vv1[1].z=vtx[face[64].v2].vz;
 
    vv1[2].x=vtx[face[64].v3].vx;
    vv1[2].y=vtx[face[64].v3].vy;
    vv1[2].z=vtx[face[64].v3].vz;
 
    vv1[3].x=vtx[face[64].v4].vx;
    vv1[3].y=vtx[face[64].v4].vy;
    vv1[3].z=vtx[face[64].v4].vz;
    quad3d_f(bmp,4,cisla,&vv1[0],&vv1[1],&vv1[2],&vv1[3]);
 
    vv2[0].x=vtx[face[65].v1].vx;
    vv2[0].y=vtx[face[65].v1].vy;
    vv2[0].z=vtx[face[65].v1].vz;
 
    vv2[1].x=vtx[face[65].v2].vx;
    vv2[1].y=vtx[face[65].v2].vy;
    vv2[1].z=vtx[face[65].v2].vz;
 
    vv2[2].x=vtx[face[65].v3].vx;
    vv2[2].y=vtx[face[65].v3].vy;
    vv2[2].z=vtx[face[65].v3].vz;
 
    vv2[3].x=vtx[face[65].v4].vx;
    vv2[3].y=vtx[face[65].v4].vy;
    vv2[3].z=vtx[face[65].v4].vz;
    quad3d_f(bmp,4,pismena,&vv2[0],&vv2[1],&vv2[2],&vv2[3]);
 
    vv1[0].x=vtx[face[66].v1].vx;
    vv1[0].y=vtx[face[66].v1].vy;
    vv1[0].z=vtx[face[66].v1].vz;
 
    vv1[1].x=vtx[face[66].v2].vx;
    vv1[1].y=vtx[face[66].v2].vy;
    vv1[1].z=vtx[face[66].v2].vz;
 
    vv1[2].x=vtx[face[66].v3].vx;
    vv1[2].y=vtx[face[66].v3].vy;
    vv1[2].z=vtx[face[66].v3].vz;
 
    vv1[3].x=vtx[face[66].v4].vx;
    vv1[3].y=vtx[face[66].v4].vy;
    vv1[3].z=vtx[face[66].v4].vz;
    quad3d_f(bmp,4,cisla1,&vv1[0],&vv1[1],&vv1[2],&vv1[3]);
 
    vv2[0].x=vtx[face[67].v1].vx;
    vv2[0].y=vtx[face[67].v1].vy;
    vv2[0].z=vtx[face[67].v1].vz;
 
    vv2[1].x=vtx[face[67].v2].vx;
    vv2[1].y=vtx[face[67].v2].vy;
    vv2[1].z=vtx[face[67].v2].vz;
 
    vv2[2].x=vtx[face[67].v3].vx;
    vv2[2].y=vtx[face[67].v3].vy;
    vv2[2].z=vtx[face[67].v3].vz;
 
    vv2[3].x=vtx[face[67].v4].vx;
    vv2[3].y=vtx[face[67].v4].vy;
    vv2[3].z=vtx[face[67].v4].vz;
    quad3d_f(bmp,4,pismena1,&vv2[0],&vv2[1],&vv2[2],&vv2[3]);
 
  for(i=0;i<vp;i++){
    item[i].size=vtp[i].vz;
    item[i].pos=i;
  }
 
  qsort(item, vp, sizeof(Item),qsort_helper_by_size);
 
  x=34;y=20;
//  z=0.5;
//  x*=z;y*=z;
  for(i=0;i<vp;i++){
    c=item[i].pos;
    if(vtp[c].f==0)
      draw_sprite(bmp,figurky_biele[vtp[c].p-1],vtp[c].vx-x/2,vtp[c].vy-y);
    else
      draw_sprite(bmp,figurky_cierne[vtp[c].p-1],vtp[c].vx-x/2,vtp[c].vy-y);
 
  }
 
}
 
void one_button(BITMAP *bmp,FONT *fnt,char text[50],int x,int y,int w,int h,char m)
{
  y+=30;
 
  if(m==1) blit(but1,bmp,0,0,x,y,w+1,h+1);
  else blit(but2,bmp,0,0,x,y,w+1,h+1);
 
  textout_centre(bmp,fnt,text,w/2+x-1,y+h/2-text_height(fnt)/2-1,1);
  textout_centre(bmp,fnt,text,w/2+x,y+h/2-text_height(fnt)/2,254);
 
 
}
 
void SMKmenu(BITMAP *bmp,int m,int me)
{
  clear(bmp);
  text_mode(-1);
//  tdbox(bmp,0,0,250,250,6);
  if(me==0){
    textout_centre(bmp,data[zfont].dat,"MAIN MENU",125,0,255);
    one_button(bmp,data[zfont].dat,"NEW GAME",     0,  0,249,35,m+1);
    one_button(bmp,data[zfont].dat,"VISUALISATION",0, 40,249,35,m);
    one_button(bmp,data[zfont].dat,"FAMOUS GAMES", 0, 80,249,35,m-1);
    one_button(bmp,data[zfont].dat,"ABOUT",        0,120,249,35,m-2);
    one_button(bmp,data[zfont].dat,"EXIT",         0,160,249,35,m-3);
  }
  if(me==1){
    textout_centre(bmp,data[zfont].dat,"GAME TYPE",125,0,255);
    one_button(bmp,data[zfont].dat,"WHITE",     0,  0,249,35,m+1);
    one_button(bmp,data[zfont].dat,"BLACK",     0, 40,249,35,m);
    one_button(bmp,data[zfont].dat,"HUMANS",    0, 80,249,35,m-1);
    one_button(bmp,data[zfont].dat,"CONTINUE",  0,120,249,35,m-2);
    one_button(bmp,data[zfont].dat,"BACK",      0,160,249,35,m-3);
  }
  if(me==2){
    textout_centre(bmp,data[zfont].dat,"CHESSBOARD",125,0,255);
    one_button(bmp,data[zfont].dat,"SURFACE1",0,  0,249,35,m+1);
    one_button(bmp,data[zfont].dat,"SURFACE2",0, 40,249,35,m);
    one_button(bmp,data[zfont].dat,"SURFACE3",0, 80,249,35,m-1);
    one_button(bmp,data[zfont].dat,"SURFACE4",0,120,249,35,m-2);
    one_button(bmp,data[zfont].dat,"SURFACE5",0,160,249,35,m-3);
  }
  if(me==3){
    textout_centre(bmp,data[zfont].dat,"-EMPTY-",125,0,255);
    one_button(bmp,data[zfont].dat,"game1",0,  0,249,35,m+1);
    one_button(bmp,data[zfont].dat,"game2",0, 40,249,35,m);
    one_button(bmp,data[zfont].dat,"game3",0, 80,249,35,m-1);
    one_button(bmp,data[zfont].dat,"game4",0,120,249,35,m-2);
    one_button(bmp,data[zfont].dat,"BACK", 0,160,249,35,m-3);
  }
 
  if(me==4||me==5){
    textout_centre(bmp,data[zfont].dat,"DIFFICULTY",125,0,255);
#ifdef vav
    one_button(bmp,data[zfont].dat,"MiEro",0,  0,249,35,m+1);
    one_button(bmp,data[zfont].dat,"Dany",0, 40,249,35,m);
    one_button(bmp,data[zfont].dat,"Veronika",0, 80,249,35,m-1);
    one_button(bmp,data[zfont].dat,"Vikina",0,120,249,35,m-2);
    one_button(bmp,data[zfont].dat,"BACK", 0,160,249,35,m-3);
#else
    one_button(bmp,data[zfont].dat,"MiEro",0,  0,249,35,m+1);
    one_button(bmp,data[zfont].dat,"Dany",0, 40,249,35,m);
    one_button(bmp,data[zfont].dat,"Sam",0, 80,249,35,m-1);
    one_button(bmp,data[zfont].dat,"MarianD",0,120,249,35,m-2);
    one_button(bmp,data[zfont].dat,"BACK", 0,160,249,35,m-3);
#endif
  }
//  textout_centre(bmp,data[zfont].dat,"Chess",240,100,1);
 
 
 
 
 
 
}
 
 
void main(void)
{
  BITMAP *buff;
  BITMAP *bmp;
  int a=0,b=0,o=0,y,i;
  char k=0,m=0,an;
  char tbuf[3];
  allegro_init();
 
  check_cpu();
  if(cpu_fpu==FALSE){
    allegro_exit();
    printf("FPU required!\n");
    exit(3);
  }
  install_keyboard();
  install_timer();
  if(install_mouse()==-1){
    allegro_exit();
    printf("Install mouse before running this software!\n");
    exit(4);
  }
  set_color_depth(8);
  if(set_gfx_mode(0,640,480,0,0)!=0){
    allegro_exit();
    printf("Error init gfx 640x480 8bit\n");
    exit(2);
  }
  set_gfx_mode(0,640,480,0,0);
//  buff=create_bitmap(640,480);
  bmp=create_bitmap(250,230);
  logo=create_bitmap(64,128);
 
  cisla=create_bitmap(8,256);
  pismena=create_bitmap(256,8);
 
  clear(cisla);
  for(i=0;i<8;i++){
    sprintf(tbuf,"%d",8-i);
    textout(cisla,font,tbuf,0,32*i+12,155);
  }
 
  clear(pismena);
  for(i=0;i<8;i++){
    sprintf(tbuf,"%c",i+'A');
    textout(pismena,font,tbuf,32*i+12,0,155);
  }
 
 
  cisla1=create_bitmap(8,256);
  pismena1=create_bitmap(256,8);
 
  clear(cisla1);
  for(i=0;i<8;i++){
    sprintf(tbuf,"%d",i+1);
    textout(cisla1,font,tbuf,0,32*i+12,155);
  }
 
  clear(pismena1);
  for(i=0;i<8;i++){
    sprintf(tbuf,"%c",'H'-i);
    textout(pismena1,font,tbuf,32*i+12,0,155);
  }
 
 
  initial_positions();
  SMKstart();
  SMKpanaky();
  SMKmenu(bmp,0,0);
//  set_mouse_sprite(figurky_biele[0]);
//  set_mouse_sprite_focus(32,24);
  while(k!=1){
 
    clear(buffer);
    SMKdraw(buffer,a,48);
    draw_sprite(buffer,bmp,195,105);
    blit(logo,buffer,0,0,0,0,128,128);
    vsync();
    show_mouse(buffer);
    blit(buffer,screen,0,0,0,0,640,480);
    show_mouse(0);
 
    a+=2;
    if(mouse_x>195&&mouse_x<445)
      if(mouse_y>135&&mouse_y<335){
        y=mouse_y-135;
        y/=40;
        if(y!=o){
         SMKmenu(bmp,y,m);
         o=y;
        }
      }
    if(mouse_b>0){
      while(mouse_b);
      if(m==0&&o>=0){
        if(o==4) k=1;
        if(o==0){m=1;o=-1;}
        if(o==1){m=2;o=-1;}
        if(o==2){m=3;o=-1;}
        if(o==3){
          clear(bmp);
          tdbox(bmp,10,0,230,30,6);
          textout_centre(bmp,data[zfont].dat,"PinChess 1.2 by",125,0,0);
 
          blit(logo,bmp,0,0,93,30,64,128);
 
          tdbox(bmp,10,110,230,45,6);
          textout_centre(bmp,font,"Lead programming and AI",125,114,1);
          textout_centre(bmp,font,"MARIAN DVORSKY",125,124,1);
          textout_centre(bmp,font,"Programming and artwork",125,134,1);
          textout_centre(bmp,font,"SAMUEL KUPKA",125,144,1);
 
 
          clear_keybuf();
          while(!keypressed()&&!mouse_b){
            clear(buffer);
            SMKdraw(buffer,a,48);
            draw_sprite(buffer,bmp,195,135);
            vsync();
            blit(buffer,screen,0,0,0,0,640,480);
            a+=2;
          }
          m=0;o=-1;
          while(mouse_b);
 
        }
      }
      if(m==1&&o>=0){
//        if(o==0){o=-1;initial_positions();marian_main(0,0);}
//        if(o==1){o=-1;initial_positions();marian_main(1,0);}
        if(o==0){o=-1;m=4;}
        if(o==1){o=-1;m=5;}
        if(o==2){o=-1;initial_positions();marian_main(-1,0,-1);}
        if(o==3){o=-1;marian_main(0,1,-1);}
        if(o==4){m=0;o=-1;}
      }
      if(m==2&&o>=0){
        if(o==0){w=0;b=0;}
        if(o==1){w=1;b=1;}
        if(o==2){w=2;b=2;}
        if(o==3){w=3;b=3;}
        if(o==4){w=4;b=4;}
        m=0;o=-1;
      }
      if(m==3&&o>=0){
        if(o==4){m=0;o=-1;}
      }
 
      if(m==4&&o>=0){
        if(o<4){initial_positions();marian_main(0,0,o);o=-1;m=1;}
        if(o==4){m=0;o=-1;}
        m=1;o=-1;
      }
      if(m==5&&o>=0){
        if(o<4){initial_positions();marian_main(1,0,o);o=-1;m=1;}
        if(o==4){m=0;o=-1;}
        m=1;o=-1;
      }
    }
 
  }
  SMKend();
 
  allegro_exit();
  exit(0);
}