From a680933bab3354d1aff06786013b1be5a1093e1a Mon Sep 17 00:00:00 2001 From: jdg Date: Sun, 12 Sep 2021 19:51:12 +0200 Subject: [PATCH] First commit 17/01/1997 --- PINBALL.CPP | 711 ++++++++++++++++++++++++++++++++++++++++++++++++++++ PINBALL.EXE | Bin 0 -> 38216 bytes PINBALL.FNT | Bin 0 -> 4096 bytes README.md | 9 + 4 files changed, 720 insertions(+) create mode 100644 PINBALL.CPP create mode 100644 PINBALL.EXE create mode 100644 PINBALL.FNT create mode 100644 README.md 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 0000000000000000000000000000000000000000..bc124adb6c05e344ec434a2b717504c4170d8ed9 GIT binary patch literal 38216 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 Dc>PQq literal 0 HcmV?d00001 diff --git a/PINBALL.FNT b/PINBALL.FNT new file mode 100644 index 0000000000000000000000000000000000000000..f0b651ec1fb8d9f4a8929902628ad1ee161d841c GIT binary patch literal 4096 zcmZuzy=xpt6dx%NIpl44P5LM+5pQfE|2TO7N2Gq>~R&5^efv%mM=yziMk#%#)- z|Ni{V(eq4mv-({dr^U<*QVR!ZAQe)r;4KsoGv(G=N z^5=61&?Zhdu(>S+L^iCuV0|)1l{7y-y*xAH$wwT>m`DmYhzc9Kq`j>$E-LpH+M7>G zm&$`^Qj&3H^8x}O@gyLmasa98kI(h4#gT0bV!H{mjn$&9r+gM572-!wlx zJ)I;d=MccWC=kzuNQE#4Ljm(f&Sx3Jd5BBYubw|Ga=HIl^bx~Z26x6E zOdpVm=aviQB=tTMaT1F&+ciNH zoB$G_iq9NqcCsg^n5hd7?Rh-q{GN{(`~#W$PGQo2#-RU|xjzBNc8g#;sSh0HU-`FY zo?4vGI5+bN&6eK`^e=^=f_RU%PIBcy3T3yK2)a)1V_a+7`!nCy?apt?-`;s~{W=Cpdf zmV>a>X^+~S$A||#_{9Z}W?UTpe06Z}LPNIhIHBi7h-H82fd_2WSM{Id2iS^#oUE0S zp$(3+mHh1Ou{nSX>t^5<)tPI3_yqu;C-Xt6$K$b)!OxYIl@*E~{5Aag&X)%tYM#Ph z{bnve__)#eU^lwMSHtcNtSOkX!-Jf zEm!MpAN8B~?(2NidY^CU{c7Ffw*1O`uavxIS4;a*zma47O7F_(t9WW-ud##rdcTfe zVHiWp-{vO9tMhC077NL@;cqSNM|+ES{N?&C_Y3P+FOiN0Ec=H0j@RDKG{@OLJUkp}1Z!t7_+Fcn?9>B7 zdCTc) zdAsc+4tEqGW|?{rJ5JwmSRb+HtT`URfSfgg*RNf3V1pq*L-^_;Nn=DFy>{UbrO~Sh n-ZK24a|rqmDs9x1 literal 0 HcmV?d00001 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")