363 lines
9.4 KiB
C++
363 lines
9.4 KiB
C++
int CargaPaleta(char *file );
|
||
|
||
#include <dos.h>
|
||
#include <mem.h>
|
||
#include <stdio.h>
|
||
#include <conio.h>
|
||
#include <alloc.h>
|
||
//#include <graphics.h>
|
||
|
||
#define NUM_MOVES 4 // Numero de movimientos por secuencia
|
||
|
||
#define IZQUIERDA 0
|
||
#define DERECHA 1
|
||
#define ARRIBA 2
|
||
#define ABAJO 3
|
||
#define IZQARR 4
|
||
#define IZQABJ 5
|
||
#define DERARR 6
|
||
#define DERABJ 7
|
||
|
||
#define OK 0
|
||
#define ERROR 1
|
||
|
||
#define SIZE_PERSONAJE (59*33)
|
||
|
||
typedef unsigned char DacPalette256[256][3];
|
||
|
||
void setvgapalette256(DacPalette256 *PalBuf);
|
||
|
||
|
||
|
||
unsigned char far *video_buffer = (char far *)0xA0000000L; // vram byte ptr
|
||
|
||
void putpixel( int x, int y, int color)
|
||
{
|
||
video_buffer[((y<<8) + (y<<6)) + x] = color;
|
||
};
|
||
|
||
typedef struct
|
||
{
|
||
unsigned char Frame[NUM_MOVES][SIZE_PERSONAJE];
|
||
} Pmovim;
|
||
|
||
/*Pmovim *Personaje;*/
|
||
|
||
typedef struct pcx_header_typ
|
||
{
|
||
char manufacturer;
|
||
char version;
|
||
char encoding;
|
||
char bits_per_pixel;
|
||
int x,y;
|
||
int width,height;
|
||
int horz_res;
|
||
int vert_res;
|
||
char ega_palette[48];
|
||
char reserved;
|
||
char num_color_planes;
|
||
int bytes_per_line;
|
||
int palette_type;
|
||
char padding[58];
|
||
|
||
} PCX_HEADER;
|
||
|
||
Pmovim far *Jugador;
|
||
|
||
#define PALETTE_MASK 0x3c6
|
||
#define PALETTE_REGISTER_RD 0x3c7
|
||
#define PALETTE_REGISTER_WR 0x3c8
|
||
#define PALETTE_DATA 0x3c9
|
||
// this structure holds a RGB triple in three bytes
|
||
|
||
typedef struct RGB_color_typ
|
||
{
|
||
|
||
unsigned char red; // red component of color 0-63
|
||
unsigned char green; // green component of color 0-63
|
||
unsigned char blue; // blue component of color 0-63
|
||
|
||
} RGB_color, *RGB_color_ptr;
|
||
|
||
void Set_Palette_Register(int index, RGB_color_ptr color)
|
||
{
|
||
// this function sets a single color look up table value indexed by index
|
||
// with the value in the color structure
|
||
|
||
// tell VGA card we are going to update a pallete register
|
||
|
||
outport(PALETTE_MASK,0xff);
|
||
|
||
// tell vga card which register we will be updating
|
||
|
||
outport(PALETTE_REGISTER_WR, index);
|
||
|
||
// now update the RGB triple, note the same port is used each time
|
||
|
||
outport(PALETTE_DATA,color->red);
|
||
outport(PALETTE_DATA,color->green);
|
||
outport(PALETTE_DATA,color->blue);
|
||
|
||
}; // end Set_Palette_Color
|
||
|
||
|
||
int IniciaJugador( Pmovim far **JUgador, int Direcciones, char *PCX, long PorDonde )
|
||
{
|
||
FILE *PCX_ptr;
|
||
PCX_HEADER pcx_header;
|
||
int alto, ancho, movimiento;
|
||
int desplaz, contador;
|
||
unsigned char byte;
|
||
int color = -1;
|
||
int contar = -1;
|
||
|
||
//Asignamos memoria para los movimientos del jugador
|
||
// if ( ( (*Jugador) = (Pmovim far *)farmalloc( sizeof(Pmovim)*Direcciones ) ) == NULL ) return ERROR;
|
||
|
||
// Abrimos el fichero de los movimientos
|
||
if ( ( PCX_ptr = fopen( PCX, "rb" ) ) == NULL ) return ERROR;
|
||
|
||
// Nos posicionamos en el lugar de comienzo del PCX
|
||
fseek( PCX_ptr, PorDonde, SEEK_SET );
|
||
|
||
// Leemos la cabecera
|
||
fread( &pcx_header, sizeof(PCX_HEADER), 1, PCX_ptr );
|
||
|
||
// Comprobamos que sea un PCX
|
||
if ( pcx_header.manufacturer == 10 )
|
||
{
|
||
for(alto=0; alto<pcx_header.height; alto++)
|
||
{
|
||
for(ancho=0; ancho<pcx_header.width; )
|
||
{
|
||
byte=getc(PCX_ptr);
|
||
if(byte<=0xC0)
|
||
{
|
||
for ( movimiento = 0; movimiento < NUM_MOVES; movimiento++ )
|
||
if ( alto >= (47+82*movimiento) && alto < (106+82*movimiento) )
|
||
{
|
||
for ( desplaz = 0; desplaz < Direcciones; desplaz++ )
|
||
if ( ancho >= (80+71*desplaz) && ancho < (113+71*desplaz) )
|
||
{
|
||
Jugador[desplaz]./*->*/ Frame[movimiento][ (ancho-(80+71*desplaz)) + 33 * (alto-(47+82*movimiento)) ] = byte;
|
||
break;
|
||
}
|
||
break;
|
||
}
|
||
ancho++;
|
||
}
|
||
else
|
||
{
|
||
contador=byte&0x3F; byte=getc(PCX_ptr);
|
||
for(; contador>0; contador--)
|
||
{
|
||
for ( movimiento = 0; movimiento < NUM_MOVES; movimiento++ )
|
||
if ( alto >= (47+82*movimiento) && alto < (106+82*movimiento) )
|
||
{
|
||
for ( desplaz = 0; desplaz < Direcciones; desplaz++ )
|
||
if ( ancho >= (80+71*desplaz) && ancho < (113+71*desplaz) )
|
||
{
|
||
Jugador[desplaz]./*->*/ Frame[movimiento][ (ancho-(80+71*desplaz)) + 33 * (alto-(47+82*movimiento)) ] = byte;
|
||
break;
|
||
}
|
||
break;
|
||
}
|
||
ancho++;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
CargaPaleta( PCX );
|
||
|
||
// Cerramos el fichero de movimientos
|
||
fclose( PCX_ptr );
|
||
|
||
return OK;
|
||
};
|
||
|
||
void MuestraJugador( unsigned char *BitMap_Ptr, int Px, int Py, char FILL )
|
||
{
|
||
int x, y;
|
||
static color = -1;
|
||
|
||
if ( color == -1 ) color = *(BitMap_Ptr);
|
||
|
||
for ( x = 0; x < 33; x++ )
|
||
for ( y = 0; y < 59; y++ )
|
||
if ( 1 || *(BitMap_Ptr + x + y*33) != color )
|
||
if ( FILL==1 )
|
||
putpixel( x+Px, y+Py, 0 );
|
||
else
|
||
putpixel( x+Px, y+Py, *(BitMap_Ptr + x + y*33) );
|
||
else
|
||
putpixel( x+Px, y+Py, 0 );
|
||
}
|
||
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<63>n para asignar el modo de video */
|
||
};
|
||
|
||
void main(void)
|
||
{
|
||
Pmovim far *Figuras;
|
||
int Direccion, O_K = 0;
|
||
float MovAct;
|
||
|
||
float x, y;
|
||
// Inicializamos la Pantalla
|
||
asigna_modo_video(0x13);
|
||
|
||
|
||
|
||
if ( ( (Jugador) = (Pmovim far *)farmalloc( sizeof(Pmovim)*8 ) ) == NULL ) return ;
|
||
|
||
if ( ( (Figuras) = (Pmovim far *)farcalloc( 8, sizeof(Pmovim) ) ) == NULL ) return ;
|
||
|
||
if ( IniciaJugador( &Figuras, 8, "moves.pcx", 0 ) != OK ) return;
|
||
|
||
// Mostramos los personajes en la pantalla
|
||
|
||
Direccion = 0;
|
||
MovAct = 0;
|
||
float Incx=0, Incy=0;
|
||
x = 0; y = 0;
|
||
do
|
||
{
|
||
if ( kbhit() )
|
||
if ( getch() == 0 )
|
||
{
|
||
switch( getch() )
|
||
{
|
||
case 72: //ARRIBA
|
||
Direccion = 4;
|
||
Incx = 0;
|
||
Incy = -8;
|
||
break;
|
||
case 80: //ABAJO
|
||
Direccion = 0;
|
||
Incx = 0;
|
||
Incy = 8;
|
||
break;
|
||
case 75: //IZQ
|
||
Direccion = 2;
|
||
Incx = -8;
|
||
Incy = 0;
|
||
break;
|
||
case 77: //DER
|
||
Direccion = 6;
|
||
Incx = 8;
|
||
Incy = 0;
|
||
break;
|
||
case 71:
|
||
Direccion = 3;
|
||
Incx = -5;
|
||
Incy = -5;
|
||
break;
|
||
case 73:
|
||
Direccion = 5;
|
||
Incx = 2;
|
||
Incy = -2;
|
||
break;
|
||
case 81:
|
||
Direccion = 7;
|
||
Incx = 2;
|
||
Incy = 2;
|
||
break;
|
||
case 79:
|
||
Direccion = 2;
|
||
Incx = -2;
|
||
Incy = 2;
|
||
break;
|
||
|
||
default:
|
||
O_K = 1;
|
||
break;
|
||
}
|
||
|
||
}
|
||
// memset( video_buffer, 254, 320*200 );
|
||
|
||
MuestraJugador( Jugador[Direccion].Frame[(int)MovAct], x, y, 1 );
|
||
x += Incx; y += Incy; MovAct = (MovAct+=1); if ( MovAct >= 4 ) MovAct = 0;
|
||
if ( x > 320-33 ) x = 320-33; if ( x < 0 ) x = 0;
|
||
if ( y > 200-59 ) y = 200-59; if ( y < 0 ) y = 0;
|
||
MuestraJugador( Jugador[Direccion].Frame[(int)MovAct], x, y, 0 );
|
||
delay(100);
|
||
} while( !O_K );
|
||
|
||
farfree( Figuras );
|
||
// Volvemos la pantalla a su estado normal
|
||
asigna_modo_video(0x3);
|
||
|
||
}
|
||
|
||
|
||
|
||
/**************************************************************************\
|
||
|* *|
|
||
|* CargaPaleta *|
|
||
|* *|
|
||
|* Descripci<63>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 )
|
||
{
|
||
DacPalette256 Palette256;
|
||
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
|
||
Palette256[index][0] = getc(fp) >> 2;
|
||
Palette256[index][1] = getc(fp) >> 2;
|
||
Palette256[index][2] = getc(fp) >> 2;
|
||
} // end for index
|
||
|
||
}
|
||
setvgapalette256( &Palette256 );
|
||
|
||
|
||
fclose( fp );
|
||
return OK;
|
||
}
|
||
|
||
/* Setvgapalette256 sets the entire 256 color palette */
|
||
/* PalBuf contains RGB values for all 256 colors */
|
||
/* R,G,B values range from 0 to 63 */
|
||
/* Usage: */
|
||
/* DacPalette256 dac256; */
|
||
/* */
|
||
/* setvgapalette256(&dac256); */
|
||
void setvgapalette256(DacPalette256 *PalBuf)
|
||
{
|
||
struct REGPACK reg;
|
||
|
||
reg.r_ax = 0x1012;
|
||
reg.r_bx = 0;
|
||
reg.r_cx = 256;
|
||
reg.r_es = FP_SEG(PalBuf);
|
||
reg.r_dx = FP_OFF(PalBuf);
|
||
intr(0x10,®);
|
||
}
|