/*****************************************************************************/ /* TECNICA FILMATION (1¦ PARTE) */ /* */ /* por: Jos‚ Antonio Acedo Mart¡n-Grande, miembro de "GOLDY GAMES" */ /* */ /* TEL: (91) 6 11 72 71 (MADRID) */ /*****************************************************************************/ /**************************** FICHEROS A INCLUIR ****************************/ #include #include #include #include #include #include /******************************* DEFINICIONES ********************************/ #define ALFANUMERICO 3 #define GRAFICO 19 #define COLOR 0 #define ULTIMO -1 /*********************** DECLARACIONES DE FUNCIONES **************************/ void BORRA_ZONA_MEMORIA(char *, int); void COPIA_ZONA_MEMORIA(char *, char *); void DIBUJA_BLOQUE (int *, char *, char *); void DIBUJA_BLOQUE_CUT(int *, char *, char *); void VUELCA_PANTALLA(int,int, int,int, int,int, char *); void SET_VECTORES(volatile char *); void UNSET_VECTORES(void); void asigna_modo_video(char); void lee_ficheros(const char *, char *); void descomprime_dibujo(char *); void asigna_rgb(char *); void asigna_memoria(void); void libera_memoria(void); void error_memoria(void); void error_fichero(void); void salir_al_dos(void); /*************************** VARIABLES GLOBALES /*****************************/ char *dir_carga_dibujos; char *dir_dibujo1; char *dir_muestra_dibujo1; char *dir_zona_pantalla; FILE *handle_dibujos; char mapa_teclado[256]; char dibujo1[] = "filma_1.pcx"; int logotipo_filmation [6] = { 0,31, 0,182, 133,14 }; int logotipo_parte1 [6] = { 133,31, 0, 0, 64,18 }; int logotipo_goldy_games[6] = { 0,46, 206,182, 114,18 }; int mapa_zona_1[][6] = { 0, 0, 144, 36, 32,15, /* suelo rojo */ 0, 0, 112, 52, 32,15, 0, 0, 144, 52, 32,15, 0, 0, 176, 52, 32,15, 0, 0, 80, 68, 32,15, 0, 0, 112, 68, 32,15, 0, 0, 144, 68, 32,15, 0, 0, 176, 68, 32,15, 0, 0, 208, 68, 32,15, 0, 0, 48, 84, 32,15, 0, 0, 80, 84, 32,15, 0, 0, 112, 84, 32,15, 0, 0, 144, 84, 32,15, 0, 0, 176, 84, 32,15, 0, 0, 208, 84, 32,15, 0, 0, 240, 84, 32,15, 0, 0, 16,100, 32,15, 0, 0, 48,100, 32,15, 0, 0, 80,100, 32,15, 0, 0, 112,100, 32,15, 0, 0, 144,100, 32,15, 0, 0, 176,100, 32,15, 0, 0, 208,100, 32,15, 0, 0, 240,100, 32,15, 0, 0, 272,100, 32,15, 0, 0, 16,116, 32,15, 0, 0, 48,116, 32,15, 0, 0, 80,116, 32,15, 0, 0, 112,116, 32,15, 0, 0, 144,116, 32,15, 0, 0, 176,116, 32,15, 0, 0, 208,116, 32,15, 0, 0, 240,116, 32,15, 0, 0, 272,116, 32,15, 0, 0, 48,132, 32,15, 0, 0, 80,132, 32,15, 0, 0, 112,132, 32,15, 0, 0, 144,132, 32,15, 0, 0, 176,132, 32,15, 0, 0, 208,132, 32,15, 0, 0, 240,132, 32,15, 0, 0, 80,148, 32,15, 0, 0, 112,148, 32,15, 0, 0, 144,148, 32,15, 0, 0, 176,148, 32,15, 0, 0, 208,148, 32,15, 0, 0, 112,164, 32,15, 0, 0, 144,164, 32,15, 0, 0, 176,164, 32,15, 0, 0, 144,180, 32,15, 32, 0, 128, 44, 32,15, /* suelo amarillo */ 32, 0, 160, 44, 32,15, 32, 0, 96, 60, 32,15, 32, 0, 128, 60, 32,15, 32, 0, 160, 60, 32,15, 32, 0, 192, 60, 32,15, 32, 0, 64, 76, 32,15, 32, 0, 96, 76, 32,15, 32, 0, 128, 76, 32,15, 32, 0, 160, 76, 32,15, 32, 0, 192, 76, 32,15, 32, 0, 224, 76, 32,15, 32, 0, 32, 92, 32,15, 32, 0, 64, 92, 32,15, 32, 0, 96, 92, 32,15, 32, 0, 128, 92, 32,15, 32, 0, 160, 92, 32,15, 32, 0, 192, 92, 32,15, 32, 0, 224, 92, 32,15, 32, 0, 256, 92, 32,15, 32, 0, 0,108, 32,15, 32, 0, 32,108, 32,15, 32, 0, 64,108, 32,15, 32, 0, 96,108, 32,15, 32, 0, 128,108, 32,15, 32, 0, 160,108, 32,15, 32, 0, 192,108, 32,15, 32, 0, 224,108, 32,15, 32, 0, 256,108, 32,15, 32, 0, 288,108, 32,15, 32, 0, 32,124, 32,15, 32, 0, 64,124, 32,15, 32, 0, 96,124, 32,15, 32, 0, 128,124, 32,15, 32, 0, 160,124, 32,15, 32, 0, 192,124, 32,15, 32, 0, 224,124, 32,15, 32, 0, 256,124, 32,15, 32, 0, 64,140, 32,15, 32, 0, 96,140, 32,15, 32, 0, 128,140, 32,15, 32, 0, 160,140, 32,15, 32, 0, 192,140, 32,15, 32, 0, 224,140, 32,15, 32, 0, 96,156, 32,15, 32, 0, 128,156, 32,15, 32, 0, 160,156, 32,15, 32, 0, 192,156, 32,15, 32, 0, 128,172, 32,15, 32, 0, 160,172, 32,15, 0, 15, 0,116, 16,12, /* borde suelo izq */ 0, 15, 16,124, 16,12, 0, 15, 32,132, 16,12, 0, 15, 48,140, 16,12, 0, 15, 64,148, 16,12, 0, 15, 80,156, 16,12, 0, 15, 96,164, 16,12, 0, 15, 112,172, 16,12, 0, 15, 128,180, 16,12, 0, 15, 144,188, 16,12, 16, 15, 304,116, 16,12, /* borde suelo der */ 16, 15, 288,124, 16,12, 16, 15, 272,132, 16,12, 16, 15, 256,140, 16,12, 16, 15, 240,148, 16,12, 16, 15, 224,156, 16,12, 16, 15, 208,164, 16,12, 16, 15, 192,172, 16,12, 16, 15, 176,180, 16,12, 16, 15, 160,188, 16,12, 288, 0, 128,-28, 32,79, /* pared izq */ 288, 0, 96,-12, 32,79, 288, 0, 64, 4, 32,79, 288, 0, 32, 20, 32,79, 288, 0, 0, 36, 32,79, 256, 0, 160,-28, 32,79, /* pared der */ 256, 0, 192,-12, 32,79, 256, 0, 224, 4, 32,79, 256, 0, 256, 20, 32,79, 256, 0, 288, 36, 32,79, ULTIMO }; int objetos_zona_1[6]; /* array para las coordenadas de los cubos */ int xyz_objetos_zona_1[][8] = { 64,0, 0, 0, 0, 32,30, +2, /* cubo rojo */ 96,0, 8, 0,24, 32,30, +2, /* cubo verde */ 128,0, 16, 0,48, 32,30, -2, /* cubo azul */ 160,0, 24, 0,72, 32,30, +2, /* cubo marr¢n */ ULTIMO }; /********************************* PROGRAMA **********************************/ void main(void) { int bloq, cubo, x, y, z; asigna_memoria(); asigna_modo_video(GRAFICO); lee_ficheros(dibujo1, dir_dibujo1); SET_VECTORES(mapa_teclado); BORRA_ZONA_MEMORIA(dir_muestra_dibujo1, COLOR); DIBUJA_BLOQUE(logotipo_filmation, dir_dibujo1, dir_muestra_dibujo1); DIBUJA_BLOQUE(logotipo_parte1, dir_dibujo1, dir_muestra_dibujo1); DIBUJA_BLOQUE(logotipo_goldy_games, dir_dibujo1, dir_muestra_dibujo1); for(bloq=0; mapa_zona_1[bloq][0]!=ULTIMO; bloq++) DIBUJA_BLOQUE_CUT(&mapa_zona_1[bloq][0], dir_dibujo1, dir_muestra_dibujo1); while(mapa_teclado[0]==0) { COPIA_ZONA_MEMORIA(dir_muestra_dibujo1, dir_zona_pantalla); for(bloq=0; xyz_objetos_zona_1[bloq][0]!=ULTIMO; bloq++) { x=xyz_objetos_zona_1[bloq][2]; y=xyz_objetos_zona_1[bloq][3]; z=xyz_objetos_zona_1[bloq][4]; objetos_zona_1[0]=xyz_objetos_zona_1[bloq][0]; objetos_zona_1[1]=xyz_objetos_zona_1[bloq][1]; objetos_zona_1[2]=144+((x-z) << 1); objetos_zona_1[3]= 21+ (x+z)-(y << 1); objetos_zona_1[4]=xyz_objetos_zona_1[bloq][5]; objetos_zona_1[5]=xyz_objetos_zona_1[bloq][6]; DIBUJA_BLOQUE_CUT(objetos_zona_1, dir_dibujo1, dir_zona_pantalla); } VUELCA_PANTALLA(0,0, 0,0, 320,200, dir_zona_pantalla); for(cubo=0; xyz_objetos_zona_1[cubo][0]!=ULTIMO; cubo++) { if(xyz_objetos_zona_1[cubo][2]==0) { xyz_objetos_zona_1[cubo][7]=+2; sound(1000+(500*cubo)); delay(10); nosound(); } else if(xyz_objetos_zona_1[cubo][2]==72) { xyz_objetos_zona_1[cubo][7]=-2; sound(2000+(500*cubo)); delay(10); nosound(); } xyz_objetos_zona_1[cubo][2]+=xyz_objetos_zona_1[cubo][7]; } } salir_al_dos(); } void salir_al_dos(void) { asigna_modo_video(ALFANUMERICO); libera_memoria(); UNSET_VECTORES(); textcolor(WHITE); textbackground(BLUE); cprintf("Copyright (c) Goldy Games 1994. Jos‚ Antonio Acedo Mart¡n-Grande. Continuar  ..."); gotoxy(1,24); exit(0); } void asigna_memoria(void) { if((dir_carga_dibujos =(char *)malloc(320*200))==NULL) error_memoria(); if((dir_dibujo1 =(char *)malloc(320*200))==NULL) error_memoria(); if((dir_muestra_dibujo1=(char *)malloc(320*200))==NULL) error_memoria(); if((dir_zona_pantalla =(char *)malloc(320*200))==NULL) error_memoria(); } void libera_memoria(void) { free(dir_carga_dibujos); free(dir_dibujo1); free(dir_muestra_dibujo1); free(dir_zona_pantalla); } void error_memoria(void) { asigna_modo_video(ALFANUMERICO); libera_memoria(); printf("No hay suficiente memoria. Libere programas residentes."); exit(1); } void error_fichero(void) { asigna_modo_video(ALFANUMERICO); libera_memoria(); printf("Error leyendo fichero .PCX"); exit(1); } void asigna_modo_video(char modo) /* asigna el modo de v¡deo indicado */ { /* en la variable "modo" */ union REGS ent, sal; ent.h.al = modo; ent.h.ah = 0; int86(16, &ent, &sal); /* funci¢n para asignar el modo de video */ } void lee_ficheros(const char *file, char *dir_dibujo) { char *dir; dir=dir_carga_dibujos; if((handle_dibujos = fopen(file, "rb"))==NULL) error_fichero(); while(!feof(handle_dibujos)) { *dir++=getc(handle_dibujos); } fclose(handle_dibujos); descomprime_dibujo(dir_dibujo); } void descomprime_dibujo(char *dir_escritura) { unsigned char byte; char *dir_lectura; int columnas, filas, contador; dir_lectura=dir_carga_dibujos+128; /* inicio del dibujo comprimido */ for(filas=200; filas>0; filas--) { columnas=320; dir_escritura-=columnas; dir_escritura+=320; while(columnas>0) { byte=(unsigned)*dir_lectura++; if(byte<=192) { *dir_escritura++=byte; columnas--; } else { contador=byte&63; byte=*dir_lectura++; for(; contador>0; contador--) { *dir_escritura++=byte; columnas--; } } } } asigna_rgb(dir_lectura+1); /* remapea los 256 colores del dibujo */ } void asigna_rgb(char *dir_lectura) { struct SREGS seg; union REGS ent, sal; unsigned int n; long int dir; char *dir_col; dir_col=dir_lectura; /* divide entre */ for(n=256*3; n>0; n--) { /* 4 los colores */ *dir_col=*dir_col >> 2; dir_col++; } dir =(long)dir_lectura; /* obtiene el segmento */ seg.es=(int)(dir >> 16); /* donde estan los colores */ ent.h.al = 18; ent.h.ah = 16; ent.x.bx = 0; ent.x.cx = 256; ent.x.dx = (int)dir_lectura; /* offset de los colores */ int86x(0x10, &ent, &sal, &seg); /* funci¢n para asignar los colores */ }