/**************************************************************************\ |* *| |* DYNA_TBL *| |* *| |* Descripci¢n: *| |* M¢dulo encargado de cargar los elementos del tablero y *| |* enemigos del juegos. Tambi‚n se encarga de generar el *| |* tablero seg£n preferencias de usuario... *| |* *| |* Fecha: 17-07-96 00.08 / 01.34 *| |* 18-07-96 12.51 / 14.24 *| |* 15.10 / *| |* *| \**************************************************************************/ #include #include #include "..\modex\modex.h" #include "..\modex\c_utils.h" #include #include #define ERROR 0 #define OK 1 // Defino las posiciones dentro de Sprite que ocupan los distintos elementos // y el tipo de Sprite del que se trata #define POS_NUMEROS 0 #define POS_ELEM_MAPA 1 #define POS_POWERUP 2 #define POS_BOMBA 3 #define POS_TELEPORT 4 #define POS_GLOBO 5 #define POS_GOSTH 6 #define POS_ESTRELLA 7 #define POS_BAQUERO 8 #define POS_PLATANO 9 #define POS_BOSQUE 18 #define SPR_NUMEROS 3 #define SPR_ELEM_MAPA 2 #define SPR_POWERUP 0 #define SPR_BOMBA 4 #define SPR_TELEPORT 4 #define SPR_GLOBO 5 #define SPR_GOSTH 5 #define SPR_ESTRELLA 6 #define SPR_BAQUERO 5 #define SPR_PLATANO 5 int CargaPaleta(char *file); void ProcesaPuntoBasico( int x, int y, char color ); int MuestraImagen( char *file, int page, int col_Inv ); int CargaObjetosBasicos( void ); int InsertaObjetosBase( int Objetos ); int InicializaElementosBasicos( void ); int MemoriaBitmap( int Pos, int TipoSprite ); void LiberaMemoriaObjetos(void); void InicializaJuego(void); typedef struct { char Entorno; } PREFERENCIAS; typedef struct { char NDirecciones; // # de direcciones // Inicio del Despl a... char Inicios[5]; // Izq, Der, Arr, Abj, Muerte char Movimientos[5]; // Movimientos por cada direcci¢n unsigned char Ancho, Alto; // Dimensiones del objeto } DatosTipo; typedef struct EnemigO { char Tipo; // Cada tipo de enemigo tiene un codigo // de ajuste... char *Sprite[5]; // 5 puteros por direccion + muerte } SPRITE; SPRITE *Sprite; int NObjetos=0; // # de objetos ya contenidos en Sprite // Establece preferencias PREFERENCIAS Pref = { POS_BOSQUE }; // Esta informaci¢n es constante y sirve para saber como tratar a los Sprite's const DatosTipo InfoSprites[] = { // 00 > Cuadros est ticos 16x16 ( Power UPs ) 0x02, { 0x00, 0x00, 0x00, 0x00, 0x00 }, { 0x12, 0x00, 0x00, 0x00, 0x00 }, 0x10, 0x10, // 01 > Cuadros est ticos 16x16 ( Unidades ) 0x02, { 0x00, 0x00, 0x00, 0x00, 0x00 }, { 0x01, 0x00, 0x00, 0x00, 0x00 }, 0x10, 0x10, // 02 > Cuadros est ticos 16x16 ( Mapas ) 0x02, { 0x00, 0x00, 0x00, 0x00, 0x00 }, { 0x2D, 0x00, 0x00, 0x00, 0x00 }, 0x10, 0x10, // 03 > Cuadros est ticos 16x18 ( Numeros ) 0x02, { 0x00, 0x00, 0x00, 0x00, 0x00 }, { 0x0A, 0x00, 0x00, 0x00, 0x00 }, 0x10, 0x12, // 04 > Anim. como Bomba, TelePort... 16x18 0x02, { 0x00, 0x00, 0x00, 0x00, 0x00 }, { 0x03, 0x03, 0x03, 0x03, 0x03 }, 0x10, 0x12, // 05 > Monstruos como Globo y Fantasma 16x18 0x02, { 0x00, 0x00, 0x00, 0x00, 0x03 }, { 0x03, 0x03, 0x03, 0x03, 0x06 }, 0x10, 0x12, // 06 > Monstruos 4dir. Estrella... 16x18 0x05, { 0x00, 0x03, 0x06, 0x09, 0x0C }, { 0x03, 0x03, 0x03, 0x03, 0x06 }, 0x10, 0x12, }; char prt_tbl[13][21] = { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0 }, { 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0 }, { 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0 }, { 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0 }, { 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0 }, { 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0 }, { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0 }, { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }; void Error(int code) { set_video_mode (3); LiberaMemoriaObjetos(); exit(code); }; int MuestraMenu(void) { return ERROR; }; void ComienzaJuego(void) {}; int MuestraMensajeCargando(void) { if ( MuestraImagen( "images\\dyna_car.pcx", 1, -1 ) == ERROR ) Error(0x12); copy_page(1, 2); copy_bitmap ( 2, 81, 85, 108, 112, 1, 81, 175 ); if ( CargaPaleta( "images\\dyna_car.pcx" ) !=OK ) Error(0x11); copy_page(1, 0); // if ( InicializaSonidos() != OK ) Error(0x20); copy_bitmap ( 2, 81, 175, 108, 202, 0, 81, 85 ); if ( CargaObjetosBasicos() != OK ) Error(0x12); copy_bitmap ( 2, 81, 175, 108, 202, 0, 81, 128 ); // Inicializa mapa copy_bitmap ( 2, 81, 175, 108, 202, 0, 81, 175 ); return OK; }; int main( void ) { printf( "\n> Inicializando ModoX" ); printf( "\n> Jos‚ David Guillen" ); init_random (); if (set_vga_modex( Mode_360x240, 360, 240, 3) == 0) Error(0x00); if ( MuestraMensajeCargando() != OK ) Error(0x10); /* while ( MuestraMenu() == OK ) { */ InicializaJuego(); set_display_page( 2 ); if ( CargaPaleta("images\\dyna_tbl.pcx") !=OK ) Error(0x11); while( getch()!=27 ) { InicializaJuego(); }; /* copy_page( 2, 1 ); copy_page( 2, 0 ); ComienzaJuego(); }; */ set_video_mode (3); LiberaMemoriaObjetos(); printf( "\n> Gracias a todos los que han echo posible este juego. " ); printf( "\n> En especial a mi hermano Antonio. " ); printf( "\n> Jos‚ David Guillen || _-ù FuTuRe ViSiOn ù-_ || InfoMundo" ); printf( "\n>_ " ); fflush( stdin ); return OK; } /**************************************************************************\ |* *| |* CargaObjetosBasicos *| |* *| |* Descripci¢n: *| |* Carga los objetos Basicos del fichero Dyna_tbl.PCX *| |* *| |* *| |* Entradas: (ninguna) *| |* *| |* Salidas: OK Todo ha ido bien *| |* ERROR Algo va mal *| |* *| \**************************************************************************/ int CargaObjetosBasicos( void ) { FILE *fp; int ancho, alto; int contador; unsigned char byte; // Pido memoria para los elementos b sicos if ( InicializaElementosBasicos() != OK ) return ERROR; // Abrimos el fichero if ( (fp = fopen("images\\dyna_tbl.pcx","rb")) == NULL ) return ERROR; // Saltamos la cabecera fseek( fp, 128, SEEK_SET ); for(alto=0; alto<200; alto++) { for(ancho=0; ancho<320; ) { byte=getc(fp); if(byte<=0xC0) { byte = byte == 254 ? 0 : byte; ProcesaPuntoBasico( ancho, alto, byte ); ancho++; } else { contador=byte&0x3F; byte=getc(fp); byte = byte == 254 ? 0 : byte; for(; contador>0; contador--) { ProcesaPuntoBasico( ancho, alto, byte ); ancho++; } } } } return OK; } /**************************************************************************\ |* *| |* ProcesaPuntoBasico *| |* *| |* Descripci¢n: *| |* inserta la imagen en su lugar correspondiente *| |* *| |* Entradas: x,y coordenadas actuales del punto *| |* byte color *| |* Salidas: (ninguna) *| |* *| \**************************************************************************/ void ProcesaPuntoBasico( int x, int y, char color ) { int i, j, Xw, Yw; // þþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþ // Guarda al Globo 16x18 Xw = InfoSprites[ SPR_GLOBO ].Ancho; Yw = InfoSprites[ SPR_GLOBO ].Alto; for ( i=0; i<3; i++ ) if ( x >= (0 + (Xw+1)*i) && x < (Xw + (Xw+1)*i) && y >= 0 && y < 18 ) Sprite[POS_GLOBO].Sprite[0][( ( x - (Xw+1)*i ) + (Xw*y) ) + (Xw*Yw*i)] = color; for ( i=3; i<9; i++ ) if ( x >= (0 + (Xw+1)*i) && x < (Xw + (Xw+1)*i) && y >= 0 && y < 18 ) Sprite[POS_GLOBO].Sprite[4][( ( x - (Xw+1)*i ) + (Xw*y) ) + (Xw*Yw*(i-3))] = color; // þþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþ // Guarda al Fantasma 16x18 Xw = InfoSprites[ SPR_GOSTH ].Ancho; Yw = InfoSprites[ SPR_GOSTH ].Alto; for ( i=0; i<3; i++ ) if ( x >= (0 + (Xw+1)*i) && x < (Xw + (Xw+1)*i) && y >= 19 && y < 37 ) Sprite[POS_GOSTH].Sprite[0][( ( x - (Xw+1)*i ) + (Xw*(y-19)) ) + (Xw*Yw*i)] = color; for ( i=3; i<9; i++ ) if ( x >= (0 + (Xw+1)*i) && x < (Xw + (Xw+1)*i) && y >= 19 && y < 37 ) Sprite[POS_GOSTH].Sprite[4][( ( x - (Xw+1)*i ) + (Xw*(y-19)) ) + (Xw*Yw*(i-3))] = color; // þþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþ // Guarda al Baquero 16x18 Xw = InfoSprites[ SPR_BAQUERO ].Ancho; Yw = InfoSprites[ SPR_BAQUERO ].Alto; for ( i=0; i<3; i++ ) if ( x >= (0 + (Xw+1)*(i+9)) && x < (Xw + (Xw+1)*(i+9)) && y >= 0 && y < 18 ) Sprite[POS_BAQUERO].Sprite[0][( ( x - (Xw+1)*(i+9) ) + (Xw*y) ) + (Xw*Yw*i)] = color; for ( i=3; i<9; i++ ) if ( x >= (0 + (Xw+1)*(i+9)) && x < (Xw + (Xw+1)*(i+9)) && y >= 0 && y < 18 ) Sprite[POS_BAQUERO].Sprite[4][( ( x - (Xw+1)*(i+9) ) + (Xw*y) ) + (Xw*Yw*(i-3))] = color; // þþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþ // Guarda al Platano 16x18 Xw = InfoSprites[ SPR_PLATANO ].Ancho; Yw = InfoSprites[ SPR_PLATANO ].Alto; for ( i=0; i<3; i++ ) if ( x >= (0 + (Xw+1)*(i+9)) && x < (Xw + (Xw+1)*(i+9)) && y >= 19 && y < 37 ) Sprite[POS_PLATANO].Sprite[0][( ( x - (Xw+1)*(i+9) ) + (Xw*(y-19)) ) + (Xw*Yw*i)] = color; for ( i=3; i<9; i++ ) if ( x >= (0 + (Xw+1)*(i+9)) && x < (Xw + (Xw+1)*(i+9)) && y >= 19 && y < 37 ) Sprite[POS_PLATANO].Sprite[4][( ( x - (Xw+1)*(i+9) ) + (Xw*(y-19)) ) + (Xw*Yw*(i-3))] = color; // þþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþ // Guarda la Bomba 16x18 Xw = InfoSprites[ SPR_BOMBA ].Ancho; Yw = InfoSprites[ SPR_BOMBA ].Alto; for ( i=0; i<3; i++ ) if ( x >= (0 + (Xw+1)*i) && x < (Xw + (Xw+1)*i) && y >= 38 && y < 56 ) Sprite[POS_BOMBA].Sprite[0][( ( x - (Xw+1)*i) + (Xw*(y-38)) ) + (Xw*Yw*i)] = color; // þþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþ // Guarda el TelePort 16x18 Xw = InfoSprites[ SPR_TELEPORT ].Ancho; Yw = InfoSprites[ SPR_TELEPORT ].Alto; for ( i=0; i<3; i++ ) if ( x >= (0 + (Xw+1)*(i+3)) && x < (Xw + (Xw+1)*(i+3)) && y >= 38 && y < 56 ) Sprite[POS_TELEPORT].Sprite[0][( ( x - (Xw+1)*(i+3)) + (Xw*(y-38)) ) + (Xw*Yw*i)] = color; // þþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþ // Guarda los Numeros 16x18 Xw = InfoSprites[ SPR_NUMEROS ].Ancho; Yw = InfoSprites[ SPR_NUMEROS ].Alto; for ( i=0; i<10; i++ ) if ( x >= (0 + (Xw+1)*i) && x < (Xw + (Xw+1)*i) && y >= 76 && y < 94 ) Sprite[POS_NUMEROS].Sprite[0][( ( x - (Xw+1)*i) + (Xw*(y-76)) ) + (Xw*Yw*i)] = color; // þþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþ // Guarda los PowerUps Xw = InfoSprites[ SPR_POWERUP ].Ancho; Yw = InfoSprites[ SPR_POWERUP ].Alto; for ( j=0; j<2; j++ ) for ( i=0; i<9; i++ ) if ( x >= (0 + (Xw+1)*i) && x < (Xw + (Xw+1)*i) && y >= 114+17*j && y < 130+17*j ) Sprite[POS_POWERUP].Sprite[0][( ( x - (Xw+1)*i) + (Xw*(y-(114+16*j))) ) + (Xw*Yw*(i+j*9))] = color; // þþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþ // Guarda los Mapas Xw = InfoSprites[ SPR_ELEM_MAPA ].Ancho; Yw = InfoSprites[ SPR_ELEM_MAPA ].Alto; for ( j=0; j<5; j++ ) for ( i=0; i<9; i++ ) if ( x >= (0 + (Xw+1)*(i+9)) && x < (Xw + (Xw+1)*(i+9)) && y >= 114+17*j && y < 130+17*j ) Sprite[POS_ELEM_MAPA].Sprite[0][( ( x - (Xw+1)*(i+9)) + (Xw*(y-(114+17*j))) ) + (Xw*Yw*(i+9*j))] = color; } /**************************************************************************\ |* *| |* InicializaElementosBasicos *| |* *| |* Descripci¢n: *| |* Pide memoria para los 9 elementos b sicos... *| |* *| |* Entradas: (ninguna) *| |* *| |* Salidas: OK Todo ha ido bien *| |* ERROR Algo va mal *| |* *| \**************************************************************************/ int InicializaElementosBasicos( void ) { // Pedimos memoria base para if ( InsertaObjetosBase( 10) != OK ) return ERROR; // Pide espacio para el BitMap del objeto, incluida animaci¢n: if ( // Numeros MemoriaBitmap( POS_NUMEROS, SPR_NUMEROS ) != OK || // Elementos del Mapa MemoriaBitmap( POS_ELEM_MAPA, SPR_ELEM_MAPA ) != OK || // Power Ups ( peque¤os ) MemoriaBitmap( POS_POWERUP, SPR_POWERUP ) != OK || // Bomba MemoriaBitmap( POS_BOMBA, SPR_BOMBA ) != OK || // TelePort MemoriaBitmap( POS_TELEPORT, SPR_TELEPORT ) != OK || // Globo MemoriaBitmap( POS_GLOBO, SPR_GLOBO ) != OK || // Fantasma MemoriaBitmap( POS_GOSTH, SPR_GOSTH ) != OK || // Estrella MemoriaBitmap( POS_ESTRELLA, SPR_ESTRELLA ) != OK || // Baquero MemoriaBitmap( POS_BAQUERO, SPR_BAQUERO ) != OK || // Platano MemoriaBitmap( POS_PLATANO, SPR_PLATANO ) != OK ) return ERROR; return OK; } /**************************************************************************\ |* *| |* InsertaObjetosBase *| |* *| |* Descripci¢n: *| |* Pide memoria para las estructuras de soporte de SPRITE *| |* *| |* Entradas: Estructuras de SPRITE a insertar *| |* *| |* Salidas: OK Todo ha ido bien *| |* ERROR Algo va mal *| |* *| \**************************************************************************/ int InsertaObjetosBase( int Objetos ) { // Si no hay ningun elemento, solo pido los reclamados if ( Sprite == NULL ) { if ( (Sprite = (SPRITE *)calloc( Objetos, sizeof(SPRITE) )) == NULL ) return ERROR; NObjetos = Objetos; } else { NObjetos += Objetos; if ( (Sprite = (SPRITE *)realloc( Sprite, sizeof(SPRITE)*NObjetos ) ) == NULL ) return NULL; } return OK; } /**************************************************************************\ |* *| |* MemoriaBitmap *| |* *| |* Descripci¢n: *| |* Libera la memoria asignada para los objetos *| |* *| |* Entradas: ( ninguna ) *| |* Salidas: ( ninguna ) *| |* *| \**************************************************************************/ int MemoriaBitmap( int Pos, int TipoSprite ) { int i; // Rango no valido if ( Pos >= NObjetos ) return ERROR; // El sprite que ocupa esa posici¢n esta ocupado if ( Sprite[Pos].Sprite[0] == NULL ) { // Por cada direccion, miro cuantos sprites le corresponden. for ( i = 0; i < InfoSprites[TipoSprite].NDirecciones - 1 && i < 4; i++) if ( InfoSprites[TipoSprite].Movimientos[i] != 0 ) if ( ( Sprite[Pos].Sprite[i] = (char *)malloc( sizeof(char)*InfoSprites[TipoSprite].Movimientos[i]*InfoSprites[TipoSprite].Ancho*InfoSprites[TipoSprite].Alto ) ) == NULL ) return ERROR; // La muerte siempre esta en el punto 5 if ( InfoSprites[TipoSprite].Movimientos[4] != 0 ) if ( ( Sprite[Pos].Sprite[4] = (char *)malloc( sizeof(char)*InfoSprites[TipoSprite].Movimientos[4]*InfoSprites[TipoSprite].Ancho*InfoSprites[TipoSprite].Alto ) ) == NULL ) return ERROR; } else return ERROR; return OK; } /**************************************************************************\ |* *| |* LiberaMemoriaObjetos *| |* *| |* Descripci¢n: *| |* Libera la memoria asignada para los objetos *| |* *| |* Entradas: ( ninguna ) *| |* Salidas: ( ninguna ) *| |* *| \**************************************************************************/ void LiberaMemoriaObjetos(void) { int Objeto, DirObjeto; // Este proceso empieza desde los mas enraizados punteros hacia afuera // Recorre cada objeto de la estructura para eliminar su doble puntero for ( Objeto=0; Objeto < NObjetos; Objeto++ ) { // Recorro cada direcci¢n del objeto for ( DirObjeto=0; DirObjeto < InfoSprites[Sprite[Objeto].Tipo].NDirecciones; DirObjeto++ ) free( Sprite[Objeto].Sprite[DirObjeto] ); } // Ya podemos eliminar la estructura. free ( Sprite ); } /**************************************************************************\ |* *| |* CargaPaleta *| |* *| |* Descripci¢n: *| |* Carga la paleta con los colores por defecto *| |* *| |* *| |* Entradas: achivo PCX de donde cargar la paleta *| |* *| |* Salidas: OK Todo ha ido bien *| |* ERROR Algo va mal *| |* *| \**************************************************************************/ int CargaPaleta(char *file ) { int index; FILE *fp; if ( (fp=fopen( file, "rb" ) ) == NULL ) return ERROR; if ( fseek( fp, -768L, SEEK_END ) == 0 ) { for (index=0; index<256; index++) { // get the red component // get the green component // get the blue component // set components set_dac_register ( index, (getc(fp) >> 2), (getc(fp) >> 2), (getc(fp) >> 2) ); } // end for index } fclose( fp ); return OK; } /**************************************************************************\ |* *| |* InicializaJuego *| |* *| |* Descripci¢n: *| |* Inicializa el tablero de juego segun se especifique en *| |* puntero de tablero. *| |* *| |* Entradas: (ninguna) *| |* *| |* Salidas: OK Todo ha ido bien *| |* ERROR Algo va mal *| |* *| \**************************************************************************/ void InicializaJuego(void) { int j, i; int Xw, Yw; int Elecc = 0; set_active_page(2); // 1§ Relleno el suelo Xw = InfoSprites[SPR_ELEM_MAPA].Ancho; Yw = InfoSprites[SPR_ELEM_MAPA].Alto; for( j = 0; j < 350; j+=16 ) for ( i = 0; i < 230; i+=16 ) draw_bitmap ((char far*)( Sprite[POS_ELEM_MAPA].Sprite[0] + Xw * Yw * (Pref.Entorno+4) ), j, i, Xw, Yw ); // 2§ Pongo el marco al tablero MuestraImagen( "images\\dyna_fnd.pcx", 2, 255 ); // 3§ Coloco los cuadros indestructibles for ( i = 0; i < 21; i++ ) for ( j = 0; j < 13; j++ ) { if ( prt_tbl[j][i] == 1 ) { tdraw_bitmap ((char far*)( Sprite[POS_ELEM_MAPA].Sprite[0] + Xw * Yw * (Pref.Entorno+Elecc) ), 12+i*16, 20+j*16, Xw, Yw ); Elecc = random_int(2); } } char prt_tbl2[13][21]; for ( j = 0; j<13; j++) for ( i = 0; i<21; i++) prt_tbl2[j][i] = prt_tbl[j][i]; // 4§ Coloco los cuadros destructibles // Uno los dos intentos, para reforzar el n§ de arboles que aparecen // >>>>>>>> 1§ intento del algoritmo que soporta 4 for ( i = 0; i<21*13; i++) { Elecc = random_int(2); j = random_int(21*13); if ( prt_tbl[j/21][j%21] == 0 ) { tdraw_bitmap ((char far*)( Sprite[POS_ELEM_MAPA].Sprite[0] + Xw * Yw * (Pref.Entorno+2+Elecc) ), 12+(j%21)*16, 20+(j/21)*16, Xw, Yw ); prt_tbl[j/21][j%21] = 2; } } // >>>>>>>> 2§ intento del algoritmo que soporta 4 for ( i = 0; i < 21; i++ ) for ( j = 0; j < 13; j++ ) { Elecc = random_int(2); if ( prt_tbl[j][i] == 0 && random_int(5)%2 ) { tdraw_bitmap ((char far*)( Sprite[POS_ELEM_MAPA].Sprite[0] + Xw * Yw * (Pref.Entorno+2+Elecc) ), 12+i*16, 20+j*16, Xw, Yw ); prt_tbl[j][i] = 2; } } // Dejo respirar a los jugadores prt_tbl[ 0][ 0] = 0; prt_tbl[ 0][ 1] = 0; prt_tbl[ 1][ 0] = 0; draw_bitmap ((char far*)( Sprite[POS_ELEM_MAPA].Sprite[0] + Xw * Yw * (Pref.Entorno+4) ), 12+16* 0, 20+16* 0, Xw, Yw ); draw_bitmap ((char far*)( Sprite[POS_ELEM_MAPA].Sprite[0] + Xw * Yw * (Pref.Entorno+4) ), 12+16* 0, 20+16* 1, Xw, Yw ); draw_bitmap ((char far*)( Sprite[POS_ELEM_MAPA].Sprite[0] + Xw * Yw * (Pref.Entorno+4) ), 12+16* 1, 20+16* 0, Xw, Yw ); prt_tbl[ 0][12] = 0; prt_tbl[ 1][12] = 0; prt_tbl[ 0][11] = 0; draw_bitmap ((char far*)( Sprite[POS_ELEM_MAPA].Sprite[0] + Xw * Yw * (Pref.Entorno+4) ), 12+16* 0, 20+16* 12, Xw, Yw ); draw_bitmap ((char far*)( Sprite[POS_ELEM_MAPA].Sprite[0] + Xw * Yw * (Pref.Entorno+4) ), 12+16* 1, 20+16* 12, Xw, Yw ); draw_bitmap ((char far*)( Sprite[POS_ELEM_MAPA].Sprite[0] + Xw * Yw * (Pref.Entorno+4) ), 12+16* 0, 20+16* 11, Xw, Yw ); prt_tbl[20][ 0] = 0; prt_tbl[19][ 0] = 0; prt_tbl[20][ 1] = 0; draw_bitmap ((char far*)( Sprite[POS_ELEM_MAPA].Sprite[0] + Xw * Yw * (Pref.Entorno+4) ), 12+16* 20, 20+16* 0, Xw, Yw ); draw_bitmap ((char far*)( Sprite[POS_ELEM_MAPA].Sprite[0] + Xw * Yw * (Pref.Entorno+4) ), 12+16* 19, 20+16* 0, Xw, Yw ); draw_bitmap ((char far*)( Sprite[POS_ELEM_MAPA].Sprite[0] + Xw * Yw * (Pref.Entorno+4) ), 12+16* 20, 20+16* 1, Xw, Yw ); prt_tbl[20][12] = 0; prt_tbl[20][11] = 0; prt_tbl[19][12] = 0; draw_bitmap ((char far*)( Sprite[POS_ELEM_MAPA].Sprite[0] + Xw * Yw * (Pref.Entorno+4) ), 12+16* 20, 20+16* 12, Xw, Yw ); draw_bitmap ((char far*)( Sprite[POS_ELEM_MAPA].Sprite[0] + Xw * Yw * (Pref.Entorno+4) ), 12+16* 20, 20+16* 11, Xw, Yw ); draw_bitmap ((char far*)( Sprite[POS_ELEM_MAPA].Sprite[0] + Xw * Yw * (Pref.Entorno+4) ), 12+16* 19, 20+16* 12, Xw, Yw ); // 1 cuadro indestructible // 2 cuadro destructible // A jugador A 1 // B jugador B 2 // C jugador C 3 // D jugador D 4 for ( j = 0; j<13; j++) for ( i = 0; i<21; i++) prt_tbl[j][i] = prt_tbl2[j][i]; }; /**************************************************************************\ |* *| |* MuestraImagen *| |* *| |* Descripci¢n: *| |* Descomprime y copia a la pagina indicada un PCX *| |* *| |* Entradas: nombre de la imagen *| |* pagina *| |* color_invisible ( -1 si ninguno ) *| |* *| |* *| |* Salidas: OK Todo ha ido bien *| |* ERROR Algo va mal *| |* *| \**************************************************************************/ int MuestraImagen( char *file, int page, int col_Inv ) { int curr_page; FILE *fp; int alto, ancho, contador; unsigned char byte; if ( (fp = fopen( file,"rb")) != NULL ) { curr_page = get_active_page(); set_active_page(page); // Saltamos la cabecera fseek( fp, 128, SEEK_SET ); for(alto=0; alto<240; alto++) { for(ancho=0; ancho<360; ) { byte=getc(fp); if(byte<=0xC0) { if ( col_Inv < 0 || byte != col_Inv ) set_point (ancho, alto, byte); ancho++; } else { contador=byte&0x3F; byte=getc(fp); for(; contador>0; contador--) { if ( col_Inv < 0 || byte != col_Inv ) set_point (ancho, alto, byte); ancho++; } } } } fclose(fp); } else return ERROR; set_active_page(curr_page); return OK; }