// 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); }