commit a680933bab3354d1aff06786013b1be5a1093e1a Author: jdg Date: Sun Sep 12 19:51:12 2021 +0200 First commit 17/01/1997 diff --git a/PINBALL.CPP b/PINBALL.CPP new file mode 100644 index 0000000..d207d60 --- /dev/null +++ b/PINBALL.CPP @@ -0,0 +1,711 @@ +#include +#include +#include +#include +#include + + +// S T R U C T U R E S ////////////////////////////////////////////////////// +char far *MemTexto = (char far *)0xB8000000; + +typedef struct worm_typ + { + int y; // current y position of worm + int color; // color of worm + int speed; // speed of worm + int counter; // counter + + } worm, *worm_ptr; + +worm worms[90]; // used to make the screen melt + +unsigned int far *clock = (unsigned int far *)0x0000046C; // pointer to internal + // 18.2 clicks/sec + +////////////////////////////////////////////////////////////////////////////// + + + +char ptr_char[4096]; + +typedef struct + { + int x, y; // Coordenadas iniciales de muestreo + char ndigitos; // n£mero de digitos a mostrar + char AX, AY; // factor de espaciado + char C1, C2, C3; // colores de fondo, texto, borde + + // Datos privados y uso interno exclusivamente + unsigned int Flen; // longitud de la frase actual + char BitByte; // bit del byte por el que va en el recorrido + char currByte; // byte actual dentro de la frase + + + + // Datos no validos para el nuevo formato de frase + char FraseBit[110][16]; + char Frase1[100]; + + char Flen1; + +} p_Ampliada; + +void LeeFuentes(char *file); +void FuenteAmplia( char *Frase, p_Ampliada far *FA, char ini ); +void aFuenteAmplia( char *Frase, p_Ampliada far *FA ); + +p_Ampliada sPinBall = { 2, 0, 3, 1, 1, BLACK, BLUE, BLUE }; +p_Ampliada sPinBallC = { 12, 1, 7, 1, 1, BLACK, BLUE, BLUE }; +p_Ampliada sPinBallB = { 12,12, 7, 1, 1, BLACK, BLUE, BLUE }; + + +#define IZQUIERDO 1 +#define DERECHO 0 + +#define RELAX 0 +#define PULSO 1 + +#define RESET 0 +#define OK 1 + +#define SUBE 1 +#define BAJA -1 + +struct Petaco +{ + char Petaco[3][10]; +}; + +struct Petaco PetacoI[4] = { {"(\\\\ ", + " \\\\ ", + " \\\\ "}, + + {"(\\\\ ", + " \\\\ ", + " == "}, + + {"(\\\\ ", + " ==== ", + " "}, + + {"(====== ", + " ", + " "} }; + +struct Petaco PetacoD[4] = { + {" //)", + " // ", + " // "}, + {" //)", + " // ", + " == "}, + {" //)", + " ==== ", + " "}, + {" ======)", + " ", + " "} }; + + +void DibujaPetaco( char CUAL, char PulsoRelax ); +void ProcesaLuzTirador( char OkReset ); +void DistorsionaFondoInfo( void ); +void AccionaTirador( char Como ); +void DibujaTablero( void ); +void Melt( void ); + +void main(void) +{ + int ok, key; + char buffer[4096], y; + y = (char)wherey(); + gettext(1, 1, 80, 25, buffer); + + + Melt(); + _setcursortype(_NOCURSOR); + + LeeFuentes( "PinBall.Fnt" ); + + DibujaTablero(); + + DibujaPetaco( IZQUIERDO, PULSO ); + DibujaPetaco( DERECHO , PULSO ); + ProcesaLuzTirador( RESET ); + + ok = 0; + do { + if ( kbhit() ) + switch( getch() ) + { + case '1': + DibujaPetaco( IZQUIERDO, PULSO ); + break; + case '2': + DibujaPetaco( DERECHO, PULSO ); + break; + case 27: + ok = 1; + break; + + + case 0: + switch( getch() ) + { + // Tirador + case 80: + AccionaTirador(1); + break; + + } + break; + } + + AccionaTirador(0); + DistorsionaFondoInfo(); + DibujaPetaco( IZQUIERDO, RELAX ); + DibujaPetaco( DERECHO , RELAX ); + ProcesaLuzTirador( OK ); + aFuenteAmplia( "Jose David Guillen", &sPinBall ); + delay(50); + } while( !ok ); + + _setcursortype(_NORMALCURSOR); + puttext(1, 1, 80, 25, buffer); + gotoxy( 1, y ); printf( "\n" ); + printf( "UPAD:\n" ); + printf( " Un pinBALL algo diferente \n" ); + printf( " JD Soft. _-ùFuTuRe ViSiOnù-_\n" ); + +} + +void AccionaTirador( char Como ) +{ + static char Posicion = 6, SubeBaja = BAJA; + + // Inicializamos el movimiento + if ( Como == 1 ) + { + Posicion = 6; + SubeBaja = BAJA; + } else { + if ( SubeBaja == SUBE && Posicion == 6 ) + return; + } + + if ( Posicion != 0 ) + { + Posicion+= SubeBaja; if ( Posicion == 0 ) SubeBaja = SUBE; + } + + textcolor( WHITE ); + switch( (SubeBaja == BAJA ? Posicion : ( 6 - Posicion )) ) + { + case 6: + gotoxy( 73, 21 ); cprintf( "~Â~" ); + gotoxy( 73, 22 ); cprintf( " ³ " ); + gotoxy( 73, 23 ); cprintf( "ÄÛÄ" ); + gotoxy( 73, 24 ); cprintf( " " ); + break; + case 5: + gotoxy( 73, 21 ); cprintf( "~^~" ); + gotoxy( 73, 22 ); cprintf( " ³ " ); + gotoxy( 73, 23 ); cprintf( "ÄÛÄ" ); + gotoxy( 73, 24 ); cprintf( " " ); + break; + case 4: + gotoxy( 73, 21 ); cprintf( "~_~" ); + gotoxy( 73, 22 ); cprintf( " ³ " ); + gotoxy( 73, 23 ); cprintf( "ÄÛÄ" ); + gotoxy( 73, 24 ); cprintf( " " ); + break; + case 3: + gotoxy( 73, 21 ); cprintf( "~ ~" ); + gotoxy( 73, 22 ); cprintf( "  " ); + gotoxy( 73, 23 ); cprintf( "ijÄ" ); + gotoxy( 73, 24 ); cprintf( " Û " ); + break; + case 2: + gotoxy( 73, 21 ); cprintf( "~ ~" ); + gotoxy( 73, 22 ); cprintf( " _ " ); + gotoxy( 73, 23 ); cprintf( "ijÄ" ); + gotoxy( 73, 24 ); cprintf( " Û " ); + break; + case 1: + gotoxy( 73, 21 ); cprintf( "~ ~" ); + gotoxy( 73, 22 ); cprintf( " " ); + gotoxy( 73, 23 ); cprintf( "ÄÂÄ" ); + gotoxy( 73, 24 ); cprintf( " Û " ); + break; + } + +} + +void DibujaPetaco( char CUAL, char PulsoRelax ) +{ + static char PetacoID[2] = { 0,0 }; + static char ActividadID[2] = { 0,0 }; + int i; + + if ( PulsoRelax == PULSO ) // Actividad del petaco: + ActividadID[CUAL] = 1; // AVANCE + + if ( ActividadID[CUAL] == 1 ) + { + PetacoID[CUAL] ++; + if ( PetacoID[CUAL] > 2 ) // Maxima extenci¢n del petaco + ActividadID[CUAL] = -1; // empezamos a contraerlo + } else + if ( ActividadID[CUAL] == -1 ) + { + PetacoID[CUAL] --; + if ( PetacoID[CUAL] < 0 ) // Llegamos a su origen... + ActividadID[CUAL] = 0; // ...asi que paramos. + } + + // Iniciamos el dibujo del petaco + if ( ActividadID[CUAL] != 0 && PetacoID[CUAL] < 4 ) + { + textbackground(BLACK); + textcolor(YELLOW); + for ( i = 0; i < 3; i++ ) + { + gotoxy( CUAL ? 41 : 49, 19+i ); + cprintf( "%s", CUAL ? + PetacoI[PetacoID[CUAL]].Petaco[i] + : + PetacoD[PetacoID[CUAL]].Petaco[i] + ); + if ( CUAL == IZQUIERDO ) + { + gotoxy( 29, 11+i ); + cprintf( "%s", PetacoI[PetacoID[CUAL]].Petaco[i] ); + } + + } + } + +} + + +void DibujaTablero( void ) +{ + int i; + + textbackground(BLACK); + textcolor( WHITE ); + gotoxy( 1, 1); + + cprintf( " ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ \r\n" ); + cprintf( " TextoPinBALL ! ³_----- (30,23) + + // NOTA: La coordenada inicial de la memoria de video no monocroma es B800 + + // Barrido vertical + for ( i = 0; i < 24; i++ ) + { + k = i*80*2; + // Barrido horizontal + for ( j = 9; j < 27; j++ ) + { + COLOR1 = (j-9+COLOR)%7; + // Creo que primero va el texto asi que por eso lo del +1 + MemTexto[ k + j*2 +1] &= 0xE0; + MemTexto[ k + j*2 +1] |= (COLOR1&0x0F); + } + } + + COLOR ++; + +} + + + +//////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////// + +void aFuenteAmplia( char *Frase, p_Ampliada far *FA ) +{ + int i; + char j, j1; + + char c_elec; + char bit_s; + char far *Frase_seg; + + // Rotamos la frase + int i1; + char cont; + + char FrBit_tmp[16]; +// C A R T E L D I G I T A L +//*// ( 27 ) - 2 ===> 25 [ Fuente de 8x8 ] +//* ^___ El tama¤o ha sido reoptimizado para que sea variable seg£n las +//* necesidades de cada programador. ( cuando AX = AY = 1 --> T^ ) +//* ........ . . . o . . . . o o o o o o . . +//* ........ . . o . o . . . . o . . . . o . +//* ........ . o . . . o . . . o . . . . o . +//* ........ o . . . . . o . . o o o o o . . +//* ........ o o o o o o o . . o . . . . o . +//* ........ o . . . . . o . . o . . . . o . +//* ........ o . . . . . o . . o . . . o . . +//* ........ o . . . . . o . o o o o o . . . +//* + textbackground(BLACK); + + Frase_seg = FA -> Frase1; + +if ( _fstrcmp( FA -> Frase1, Frase ) != 0 ) + { + _fstrncpy( FA -> Frase1, Frase, 99 ); + FA -> Frase1[99] = '\0'; + j = i = _fstrlen( Frase ); + FA -> Flen = i * 8; + cont = 0; + + if ( i < FA -> ndigitos ) + i += FA -> ndigitos - i; + else + i += 5; + + FA -> Flen1 = i; + + //strcat( FA->Frase_seg, " " ); + + // Almacenamos en la Frase a Bit's la FRASE A BIT'S + while( cont <= i ) + { + + // Descomponemos cada caracter en un patron de BIT's + if ( (cont - j) >= 0 ) + { + for( j1=0; j1<16; j1++) + FA -> FraseBit[cont][j1]= 0; + } else + + for( j1=0;j1<16; j1++) + FA -> FraseBit[cont][j1]= ptr_char[ ( *(Frase_seg) ) * 16 + j1 ]; + + cont++; + Frase_seg++; + } + } else { + // Almacenamos el 1er bit que vamos a perder... + for ( j1=0; j1<16; j1++ ) + FrBit_tmp[j1] = 0x01 & ( FA -> FraseBit[0][j1] >> 7 ); + + for ( j=0; j Flen1; j++ ) + { + for ( j1=0; j1<16; j1++ ) + FA -> FraseBit[ j][j1] = FA -> FraseBit[ j][ j1] << 1; + for ( j1=0; j1<16; j1++ ) + FA -> FraseBit[j][j1] = ( FA -> FraseBit[j][j1] & 0xFE ) | (0x01 & (FA -> FraseBit[j+1][j1] >> 7 ) ); + } + for ( j1=0; j1<16; j1++ ) + FA -> FraseBit[FA -> Flen1-1][j1] = ( FA -> FraseBit[FA -> Flen1-1][j1] & 0xFE ) | FrBit_tmp[j1]; + } + +// . . . . . . +// .ï ï. .ï ï. .ï ï. +// . . . . . +// __________.________________________.______________________.______________ +// . . . . . . +// . . . . . . +// ' .. ' ' .. ' ' .. ' +// +// . . +// . ï ï . +// . . +// ____________________._____________________.______________________________ +// . . ` ï +// . . ` ï +// . . ` ï +// . . . ` ï +// ` . . ï +// ndigitos --> m x. = 40 + //float i1; + + for ( i=0, i1=2; i < FA->ndigitos; (i) ++ ) + { + for ( j=0, j1=0; j1<8; /*j+=2*FA->AX*/j++, j1++ ) + { + // Analizamos el patron de BIT's y lo imprimimos + // FraseBit[cont][0] + // ^ ^----- N£mero de byte del digito ( 8x8 ) + // |_________ N£mero de digito alfa-numerico + for ( bit_s = 0; bit_s < 8; bit_s++, i1++/*+=.02*/ ) + { + if ( FA -> FraseBit[i][bit_s] & ( (char)0x01 << (7- j1) ) ) c_elec = FA->C2; else c_elec = FA->C1; + //putpixel ( FA->x + j + bit_s*2 + i*8*2*FA->AX, FA->y + sin( i1 )*20 + 2*bit_s*FA->AY, c_elec ); + + textcolor( c_elec ); + //PutPixel ( FA->x +j + i*8*2*FA->AX, FA->y + 2* bit_s*FA->AY, c_elec ); +// gotoxy ( FA->x +j + i*8/**2*FA->AX*/, FA->y + bit_s/**2*FA->AY*/ ); + gotoxy ( ( FA->x + bit_s), 8*FA->ndigitos -( FA->y +j + i*8 ) ); + if ( (j + i*8) < 8 ) + { + cprintf( "³" ); + } else + if ( (j + i*8) > 16 ) + { + cprintf( "Û" ); + } else + cprintf( "±" ); + } + +//y--> TabS[(i+j+bit_s) MOD FLen1] +//x--> + + } + } +} + + + + +void LeeFuentes(char *file) +{ +FILE *fich; + /* Reservamos 4 Kb. para cargar la fuente en memoria */ + + /* Abrimos el fichero de la fuente */ + + if ((fich=fopen(file,"rb"))==NULL) { + printf("\a\nArchivo %s no encontrado.\n",file); + return; + } + + fseek(fich, SEEK_SET, 0); /* Nos colocamos al principio del fichero */ + fread(ptr_char,1,4096,fich); /* Cargamos en memoria 4096 bytes del fichero */ + fclose(fich); /* Cerramos el fichero */ +} + + + + +//////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////// +#define TAMx 8 +#define TAMy 8 +void FuenteAmplia( char *Frase, p_Ampliada far *FA, char ini ) +{ + int i, j, k; // Variables de avance + int c_elec; // Color en el momento de imprimir + int PosX, PosY; // Posicion fisica final + char LCaract; // Caracter de linea a tratar + + if ( ini ) // Reseteamos las variables de control interno + { + // Obtenemos la longitud de la frase. ( En d¡gitos ) + FA -> Flen = _fstrlen( Frase ); + // Contador de digito actual a cero + FA -> BitByte = 0; + // Posicion dentro de la frase + FA -> currByte = 0; + return; + } + + // Avance horizontal de bit's ( avance de digitos ) + for ( i = 0; i < ( TAMx * (FA -> ndigitos) ); i++ ) + { + k = ( Frase[ ( (i+FA->BitByte)/TAMx + FA -> currByte ) % FA->Flen ] ) << 4; + LCaract = ( (char)0x01 << (7 - (i+FA->BitByte)%TAMx) ); + PosX = FA -> x + FA->AX * i; // Posicion f¡sica horizontal + // Avance vertical de bit's + for ( j = 0; j < TAMy; j ++ ) + { + PosY = FA -> y + FA->AY * j; // Posicion f¡sica vertical + + if ( ptr_char[ k + j ] & LCaract ) + c_elec = FA->C2; + else + c_elec = FA->C1; + + textbackground(BLACK); + textcolor( c_elec ); + gotoxy ( PosX, PosY ); cprintf( "±" ); + } + } + // Tenemos en cuenta el avance dentro de la frase + if ( ( FA -> BitByte ++ ) >= 7 ) + { + FA -> BitByte = 0; FA -> currByte ++; + if ( FA -> currByte >= FA -> Flen ) + FA -> currByte = 0; + } + +} +#undef TAMy +#undef TAMx + + + + +void Melt( void ) +{ + +int index,ticks=0; + +textbackground( BLACK ); +textcolor( MAGENTA ); + + +for (index=1; index< 81; index++) + { + worms[index].speed = 3 + rand()%9; + worms[index].y = 0; + worms[index].counter = 0; + gotoxy( index, 1 ); + cprintf(" "); + } + +while(++ticks<290) + { + delay(10); + + for (index=1; index<81; index++) + { + if (++worms[index].counter == worms[index].speed) + { + worms[index].counter = 0; + if (worms[index].y < 25) + { + gotoxy( index, worms[index].y ); + cprintf("þ"); + gotoxy( index, worms[index].y-1 ); + cprintf(" "); + worms[index].y++; + } else { + gotoxy( index, 24 ); + cprintf(" "); + } + } + } + if (!(ticks % 500)) + { + for (index=1; index<81; index++) + worms[index].speed--; + } + } +} diff --git a/PINBALL.EXE b/PINBALL.EXE new file mode 100644 index 0000000..bc124ad Binary files /dev/null and b/PINBALL.EXE differ diff --git a/PINBALL.FNT b/PINBALL.FNT new file mode 100644 index 0000000..f0b651e Binary files /dev/null and b/PINBALL.FNT differ diff --git a/README.md b/README.md new file mode 100644 index 0000000..87c2bba --- /dev/null +++ b/README.md @@ -0,0 +1,9 @@ +#PINBALL + + +*17/01/1997* + +ToDo: wwtcf? + + +![screenshot](/PINBALL.png "Screenshot")