506 lines
13 KiB
C++
506 lines
13 KiB
C++
![]() |
#define UNPACK2 0
|
|||
|
#define WIN32_LEAN_AND_MEAN
|
|||
|
#include "../systeminc/version.h"
|
|||
|
#include "../systeminc/system.h"
|
|||
|
#include "../systeminc/loadrealbin.h"
|
|||
|
#include "../systeminc/unpack.h"
|
|||
|
|
|||
|
#include <io.h>
|
|||
|
#include <time.h>
|
|||
|
#include <sys\types.h>
|
|||
|
#include <sys\stat.h>
|
|||
|
#include <stdio.h>
|
|||
|
#include <stdlib.h>
|
|||
|
|
|||
|
unsigned char autoMapColorTbl[MAX_GRAPHICS]; // ???????<3F><>??????<3F><>????
|
|||
|
|
|||
|
#ifdef _STONDEBUG_
|
|||
|
extern int g_iMallocCount;
|
|||
|
#endif
|
|||
|
|
|||
|
unsigned long bitmapnumbertable[MAX_GRAPHICS];
|
|||
|
|
|||
|
#ifdef _PTTERN_SEPARATION_BIN
|
|||
|
extern int MaxAdrnID;
|
|||
|
FILE *Realbinfp[MAX_GRAPHICS] = {NULL};
|
|||
|
#else
|
|||
|
FILE *Realbinfp;
|
|||
|
#endif
|
|||
|
|
|||
|
FILE *Addrbinfp;
|
|||
|
ADRNBIN adrnbuff[MAX_GRAPHICS];
|
|||
|
#ifdef _READ16BITBMP
|
|||
|
AddressBin_s adrntruebuff[MAX_GRAPHICS_24];
|
|||
|
HANDLE hAdrntrueFile;
|
|||
|
HANDLE hRealtrueFile;
|
|||
|
RGBQUAD g_rgbPal[256];
|
|||
|
#endif
|
|||
|
void initAutoMapColor( char *addrbinfilename )
|
|||
|
{
|
|||
|
char *filename = "data\\auto.dat";
|
|||
|
if( readAutoMapColor( filename, addrbinfilename ) == 0 ){
|
|||
|
makeAutoMapColor();
|
|||
|
writeAutoMapColor( filename, addrbinfilename );
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
void makeAutoMapColor( void )
|
|||
|
{
|
|||
|
unsigned int i;
|
|||
|
int chgTbl[20] = {
|
|||
|
166, 61, 80, 112, 96, 189, 112, 60, 164, 164,
|
|||
|
111, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
|
|||
|
for( i = 0; i < MAX_GRAPHICS; i++ ){
|
|||
|
if( adrnbuff[i].attr.bmpnumber != 0 ){
|
|||
|
if( 100 <= adrnbuff[i].attr.bmpnumber && adrnbuff[i].attr.bmpnumber <= 19999 ){
|
|||
|
autoMapColorTbl[adrnbuff[i].attr.bmpnumber] = getAutoMapColor( adrnbuff[i].bitmapno );
|
|||
|
}else if( 60 <= adrnbuff[i].attr.bmpnumber && adrnbuff[i].attr.bmpnumber <= 79 ){
|
|||
|
autoMapColorTbl[adrnbuff[i].attr.bmpnumber] = (unsigned char)chgTbl[adrnbuff[i].attr.bmpnumber-60];
|
|||
|
}else{
|
|||
|
autoMapColorTbl[adrnbuff[i].attr.bmpnumber] = 0;
|
|||
|
}
|
|||
|
}else{
|
|||
|
autoMapColorTbl[adrnbuff[i].attr.bmpnumber] = 0;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
int writeAutoMapColor( char *wFName, char *addrbinfilename )
|
|||
|
{
|
|||
|
FILE *wfp, *rfp;
|
|||
|
int rfh;
|
|||
|
struct _stat statBuf;
|
|||
|
int adrnNo;
|
|||
|
unsigned int adrnTime;
|
|||
|
unsigned short autoMapColorVersion = 4;
|
|||
|
char *tmpStr;
|
|||
|
|
|||
|
// adrn.bin??????<3F>k?????
|
|||
|
tmpStr = strstr( addrbinfilename, "adrn" );
|
|||
|
if( tmpStr == NULL )
|
|||
|
return 0; // <20><>??<3F><>????<3F><>??
|
|||
|
if( tmpStr[4] == '.' )
|
|||
|
adrnNo = 0; // ?????????
|
|||
|
else{
|
|||
|
adrnNo = -1;
|
|||
|
sscanf_s( tmpStr, "adrn_%d.bin", &adrnNo );
|
|||
|
if( adrnNo < 0 )
|
|||
|
return 0;
|
|||
|
}
|
|||
|
// adrn.bin??<3F>ΦT????
|
|||
|
if( (rfp = fopen( addrbinfilename, "rb" )) == NULL )
|
|||
|
return 0;
|
|||
|
rfh = _fileno( rfp );
|
|||
|
if( _fstat( rfh, &statBuf ) < 0 ){
|
|||
|
fclose( rfp );
|
|||
|
return 0;
|
|||
|
}
|
|||
|
adrnTime = (UINT)statBuf.st_ctime;
|
|||
|
fclose( rfp );
|
|||
|
// ???????
|
|||
|
if( (wfp = fopen( wFName, "wb" )) == NULL )
|
|||
|
return 0;
|
|||
|
fwrite( &autoMapColorVersion, sizeof( autoMapColorVersion ), 1, wfp );
|
|||
|
fwrite( &adrnNo, sizeof( adrnNo ), 1, wfp );
|
|||
|
fwrite( &adrnTime, sizeof( adrnTime ), 1, wfp );
|
|||
|
fwrite( &autoMapColorTbl, sizeof( autoMapColorTbl ), 1, wfp );
|
|||
|
fclose( wfp );
|
|||
|
return 1;
|
|||
|
}
|
|||
|
|
|||
|
int readAutoMapColor( char *wFName, char *addrbinfilename )
|
|||
|
{
|
|||
|
FILE *rfp;
|
|||
|
int rfh;
|
|||
|
struct _stat statBuf;
|
|||
|
int adrnNo, rAdrnNo;
|
|||
|
unsigned int adrnTime, rAdrnTime;
|
|||
|
unsigned short autoMapColorVersion = 4, rAutoMapColorVersion;
|
|||
|
char *tmpStr;
|
|||
|
// adrn.bin??????<3F>k?<3F><><EFBFBD>x
|
|||
|
tmpStr = strstr( addrbinfilename, "adrn" );
|
|||
|
if( tmpStr == NULL )
|
|||
|
return 0; // <20><>??<3F><>????<3F><>??
|
|||
|
if( tmpStr[4] == '.' )
|
|||
|
adrnNo = 0; // ?????????
|
|||
|
else{
|
|||
|
adrnNo = -1;
|
|||
|
sscanf_s( tmpStr, "adrn_%d.bin", &adrnNo );
|
|||
|
if( adrnNo < 0 )
|
|||
|
return 0;
|
|||
|
}
|
|||
|
// adrn.bin??<3F>ΦT<CEA6><54><EFBFBD>x
|
|||
|
if( (rfp = fopen( addrbinfilename, "rb" )) == NULL )
|
|||
|
return 0;
|
|||
|
rfh = _fileno( rfp );
|
|||
|
if( _fstat( rfh, &statBuf ) < 0 ){
|
|||
|
fclose( rfp );
|
|||
|
return 0;
|
|||
|
}
|
|||
|
adrnTime = (UINT)statBuf.st_ctime;
|
|||
|
fclose( rfp );
|
|||
|
if( (rfp = fopen( wFName, "rb" )) == NULL )
|
|||
|
return 0;
|
|||
|
|
|||
|
if( fread( &rAutoMapColorVersion, sizeof( rAutoMapColorVersion ), 1, rfp ) != 1 ){
|
|||
|
fclose( rfp );
|
|||
|
return 0;
|
|||
|
}
|
|||
|
if( autoMapColorVersion != rAutoMapColorVersion ){
|
|||
|
fclose( rfp );
|
|||
|
return 0;
|
|||
|
}
|
|||
|
// adrn.bin?????<3F><>???
|
|||
|
if( fread( &rAdrnNo, sizeof( rAdrnNo ), 1, rfp ) != 1 ){
|
|||
|
fclose( rfp );
|
|||
|
return 0;
|
|||
|
}
|
|||
|
if( adrnNo != rAdrnNo ){
|
|||
|
fclose( rfp );
|
|||
|
return 0;
|
|||
|
}
|
|||
|
// adrn.bin??<3F><>???
|
|||
|
if( fread( &rAdrnTime, sizeof( rAdrnTime ), 1, rfp ) != 1 ){
|
|||
|
fclose( rfp );
|
|||
|
return 0;
|
|||
|
}
|
|||
|
if( adrnTime != rAdrnTime ){
|
|||
|
fclose( rfp );
|
|||
|
return 0;
|
|||
|
}
|
|||
|
if( fread( &autoMapColorTbl, sizeof( autoMapColorTbl ), 1, rfp ) != 1 ){
|
|||
|
fclose( rfp );
|
|||
|
return 0;
|
|||
|
}
|
|||
|
fclose( rfp );
|
|||
|
return TRUE;
|
|||
|
}
|
|||
|
|
|||
|
BOOL initRealbinFileOpen(char *realbinfilename, char *addrbinfilename)
|
|||
|
{
|
|||
|
ADRNBIN tmpadrnbuff;
|
|||
|
if ((Addrbinfp = fopen(addrbinfilename, "rb"))==NULL)
|
|||
|
return FALSE;
|
|||
|
#ifdef _PTTERN_SEPARATION_BIN
|
|||
|
FILE *Realfp;
|
|||
|
if ((Realfp = fopen(realbinfilename, "rb"))==NULL)
|
|||
|
return FALSE;
|
|||
|
#else
|
|||
|
if ((fopen_s(&Realbinfp,realbinfilename, "rb"))!=NULL)
|
|||
|
return FALSE;
|
|||
|
#endif
|
|||
|
//adrn.bin
|
|||
|
while(!feof(Addrbinfp)){
|
|||
|
fread(&tmpadrnbuff, sizeof(tmpadrnbuff), 1, Addrbinfp);
|
|||
|
adrnbuff[tmpadrnbuff.bitmapno] = tmpadrnbuff;
|
|||
|
|
|||
|
#ifdef _PTTERN_SEPARATION_BIN
|
|||
|
Realbinfp[tmpadrnbuff.bitmapno] = Realfp;
|
|||
|
if((ULONG)MaxAdrnID < tmpadrnbuff.bitmapno){
|
|||
|
MaxAdrnID = tmpadrnbuff.bitmapno;
|
|||
|
}
|
|||
|
#endif
|
|||
|
if( tmpadrnbuff.attr.bmpnumber != 0 ){
|
|||
|
if( (12802 <= tmpadrnbuff.attr.bmpnumber && tmpadrnbuff.attr.bmpnumber <= 12811)
|
|||
|
|| (10132 <= tmpadrnbuff.attr.bmpnumber && tmpadrnbuff.attr.bmpnumber <= 10136) ){
|
|||
|
adrnbuff[tmpadrnbuff.bitmapno].attr.hit =
|
|||
|
300 + (adrnbuff[tmpadrnbuff.bitmapno].attr.hit % 100);
|
|||
|
}
|
|||
|
if( tmpadrnbuff.attr.bmpnumber<=33 && tmpadrnbuff.bitmapno>230000){//<2F><><EFBFBD><EFBFBD>ħ<EFBFBD><C4A7>ͼ<EFBFBD>Ÿ<EFBFBD><C5B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>bug
|
|||
|
continue;
|
|||
|
}
|
|||
|
bitmapnumbertable[tmpadrnbuff.attr.bmpnumber] = tmpadrnbuff.bitmapno;
|
|||
|
}else
|
|||
|
bitmapnumbertable[tmpadrnbuff.attr.bmpnumber] = 0;
|
|||
|
}
|
|||
|
fclose(Addrbinfp);
|
|||
|
return TRUE;
|
|||
|
}
|
|||
|
|
|||
|
void cleanupRealbin(void)
|
|||
|
{
|
|||
|
#ifdef _PTTERN_SEPARATION_BIN
|
|||
|
for(int i = 0; i < MAX_GRAPHICS; i ++){
|
|||
|
if(Realbinfp[i] != NULL){
|
|||
|
fclose(Realbinfp[i]);
|
|||
|
Realbinfp[i] = NULL;
|
|||
|
}
|
|||
|
}
|
|||
|
#else
|
|||
|
fclose(Realbinfp);
|
|||
|
#endif
|
|||
|
|
|||
|
#ifdef _READ16BITBMP
|
|||
|
CloseHandle(hRealtrueFile);
|
|||
|
#endif
|
|||
|
}
|
|||
|
|
|||
|
BOOL realGetPos(U4 GraphicNo , S2 *x , S2 *y)
|
|||
|
{
|
|||
|
#ifndef _READ16BITBMP
|
|||
|
if(GraphicNo<0 || GraphicNo>=MAX_GRAPHICS){*x=0;*y=0;return FALSE;}
|
|||
|
*x = adrnbuff[GraphicNo].xoffset;
|
|||
|
*y = adrnbuff[GraphicNo].yoffset;
|
|||
|
#else
|
|||
|
if(GraphicNo < 0) {*x=0;*y=0;return FALSE;}
|
|||
|
if(GraphicNo >= OLD_GRAPHICS_START){
|
|||
|
if(GraphicNo > MAX_GRAPHICS) {*x=0;*y=0;return FALSE;}
|
|||
|
*x = adrntruebuff[GraphicNo - OLD_GRAPHICS_START].xoffset;
|
|||
|
*y = adrntruebuff[GraphicNo - OLD_GRAPHICS_START].yoffset;
|
|||
|
}
|
|||
|
else{
|
|||
|
*x = adrnbuff[GraphicNo].xoffset;
|
|||
|
*y = adrnbuff[GraphicNo].yoffset;
|
|||
|
}
|
|||
|
#endif
|
|||
|
return TRUE;
|
|||
|
}
|
|||
|
|
|||
|
BOOL realGetWH(U4 GraphicNo , S2 *w , S2 *h)
|
|||
|
{
|
|||
|
#ifndef _READ16BITBMP
|
|||
|
if(GraphicNo<0 || GraphicNo>=MAX_GRAPHICS){*w=0;*h=0;return FALSE;}
|
|||
|
*w = adrnbuff[GraphicNo].width;
|
|||
|
*h = adrnbuff[GraphicNo].height;
|
|||
|
#else
|
|||
|
if(GraphicNo < 0){*w=0;*h=0;return FALSE;}
|
|||
|
if(GraphicNo >= OLD_GRAPHICS_START){
|
|||
|
if(GraphicNo > MAX_GRAPHICS) {*w=0;*h=0;return FALSE;}
|
|||
|
*w = adrntruebuff[GraphicNo - OLD_GRAPHICS_START].width;
|
|||
|
*h = adrntruebuff[GraphicNo - OLD_GRAPHICS_START].height;
|
|||
|
}
|
|||
|
else{
|
|||
|
*w = adrnbuff[GraphicNo].width;
|
|||
|
*h = adrnbuff[GraphicNo].height;
|
|||
|
}
|
|||
|
#endif
|
|||
|
|
|||
|
return TRUE;
|
|||
|
}
|
|||
|
|
|||
|
BOOL realGetHitPoints(U4 GraphicNo , S2 *HitX , S2 *HitY)
|
|||
|
{
|
|||
|
if(GraphicNo<0 || GraphicNo>=MAX_GRAPHICS){*HitX=0;*HitY=0;return FALSE;}
|
|||
|
|
|||
|
*HitX = adrnbuff[GraphicNo].attr.atari_x;
|
|||
|
*HitY = adrnbuff[GraphicNo].attr.atari_y;
|
|||
|
|
|||
|
return TRUE;
|
|||
|
}
|
|||
|
|
|||
|
BOOL realGetHitFlag(U4 GraphicNo , S2 *Hit)
|
|||
|
{
|
|||
|
if(GraphicNo<0 || GraphicNo>=MAX_GRAPHICS){
|
|||
|
*Hit=0;
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
|
|||
|
if ((GraphicNo >= 369715 && GraphicNo <= 369847) || GraphicNo == 369941)//ǿ<>Ƶر<C6B5><D8B1><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
*Hit = 1;
|
|||
|
else if (GraphicNo >= 369641 && GraphicNo <= 369654)
|
|||
|
*Hit = 1;
|
|||
|
else
|
|||
|
*Hit = (adrnbuff[GraphicNo].attr.hit % 100);
|
|||
|
|
|||
|
return TRUE;
|
|||
|
}
|
|||
|
|
|||
|
BOOL realGetPrioType(U4 GraphicNo , S2 *prioType)
|
|||
|
{
|
|||
|
if(GraphicNo<0 || GraphicNo>=MAX_GRAPHICS){
|
|||
|
*prioType=0;
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
|
|||
|
*prioType = (adrnbuff[GraphicNo].attr.hit / 100);
|
|||
|
return TRUE;
|
|||
|
}
|
|||
|
|
|||
|
BOOL realGetHeightFlag(U4 GraphicNo , S2 *Height)
|
|||
|
{
|
|||
|
if(GraphicNo<0 || GraphicNo>=MAX_GRAPHICS){*Height=0;return FALSE;}
|
|||
|
*Height = adrnbuff[GraphicNo].attr.height;
|
|||
|
|
|||
|
return TRUE;
|
|||
|
}
|
|||
|
|
|||
|
int realGetSoundEffect(U4 GraphicNo)
|
|||
|
{
|
|||
|
if(GraphicNo<0 || GraphicNo>=MAX_GRAPHICS)return FALSE;
|
|||
|
return adrnbuff[bitmapnumbertable[GraphicNo]].attr.effect1;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
BOOL realGetWalkSoundEffect(U4 GraphicNo )
|
|||
|
{
|
|||
|
if(GraphicNo<0 || GraphicNo>=MAX_GRAPHICS){return FALSE;}
|
|||
|
return adrnbuff[GraphicNo].attr.effect2;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
BOOL realGetNo( U4 CharAction , U4 *GraphicNo )
|
|||
|
{
|
|||
|
#ifndef _READ16BITBMP
|
|||
|
if(CharAction<0 || CharAction>=MAX_GRAPHICS){*GraphicNo=0;return FALSE;}
|
|||
|
*GraphicNo = bitmapnumbertable[CharAction];
|
|||
|
return TRUE;
|
|||
|
#else
|
|||
|
if(CharAction < 0){
|
|||
|
*GraphicNo = 0;
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
if(CharAction >= OLD_GRAPHICS_START){
|
|||
|
if(CharAction >= MAX_GRAPHICS){
|
|||
|
*GraphicNo = 0;
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
*GraphicNo = CharAction;
|
|||
|
return TRUE;
|
|||
|
}
|
|||
|
else *GraphicNo = bitmapnumbertable[CharAction];
|
|||
|
return TRUE;
|
|||
|
#endif
|
|||
|
}
|
|||
|
|
|||
|
int realGetBitmapNo( int num )
|
|||
|
{
|
|||
|
#ifndef _READ16BITBMP
|
|||
|
if( num < 0 || num >= MAX_GRAPHICS ) return -1;
|
|||
|
return adrnbuff[num].attr.bmpnumber;
|
|||
|
#else
|
|||
|
if(num < 0) return -1;
|
|||
|
if(num >= OLD_GRAPHICS_START){
|
|||
|
if(num >= MAX_GRAPHICS) return -1;
|
|||
|
return adrntruebuff[num - OLD_GRAPHICS_START].bitmapno;
|
|||
|
}
|
|||
|
else return adrnbuff[num].attr.bmpnumber;
|
|||
|
#endif
|
|||
|
}
|
|||
|
|
|||
|
///////////////////////////////////////////////////////////////////??????????
|
|||
|
#define REALGETIMAGEMAXSIZE 1600*1600
|
|||
|
BYTE g_realgetimagebuf[REALGETIMAGEMAXSIZE];
|
|||
|
BYTE g_realgetimagebuf2[REALGETIMAGEMAXSIZE];
|
|||
|
#ifdef _NEW_COLOR_
|
|||
|
int NewColor16Flg;
|
|||
|
#endif
|
|||
|
BOOL realGetImage( int graphicNo, unsigned char **bmpdata, int *width, int *height)
|
|||
|
{
|
|||
|
#ifdef _NEW_COLOR_
|
|||
|
NewColor16Flg=0;
|
|||
|
#endif
|
|||
|
ADRNBIN adrdata;
|
|||
|
if(graphicNo<0 || graphicNo>=MAX_GRAPHICS)return FALSE;
|
|||
|
adrdata=adrnbuff[graphicNo];
|
|||
|
#ifdef _PTTERN_SEPARATION_BIN
|
|||
|
if (Realbinfp[graphicNo]==NULL) return FALSE;
|
|||
|
fseek(Realbinfp[graphicNo], adrdata.adder, SEEK_SET);//real.bin???????????
|
|||
|
if( fread(&g_realgetimagebuf, adrdata.size, 1, Realbinfp[graphicNo] ) != 1 )
|
|||
|
return FALSE;
|
|||
|
#else
|
|||
|
fseek(Realbinfp, adrdata.adder, SEEK_SET);//real.bin???????????
|
|||
|
if( fread(&g_realgetimagebuf, adrdata.size, 1, Realbinfp ) != 1 )
|
|||
|
return FALSE;
|
|||
|
#endif
|
|||
|
unsigned int len;
|
|||
|
*bmpdata = g_realgetimagebuf2;
|
|||
|
if( decoder( g_realgetimagebuf, bmpdata,
|
|||
|
(unsigned int*)width, (unsigned int*)height, &len ) == NULL ){
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
return TRUE;
|
|||
|
}
|
|||
|
|
|||
|
#ifdef _READ16BITBMP
|
|||
|
int InitRealTruebinFileOpen(char *szRealTrueBinFileName,char *szAdrnTruebinFileName)
|
|||
|
{
|
|||
|
BOOL bReadReturn;
|
|||
|
AddressBin_s Addr;
|
|||
|
DWORD dwReadByte;
|
|||
|
|
|||
|
ZeroMemory(adrntruebuff,sizeof(adrntruebuff));
|
|||
|
// <20><><EFBFBD><EFBFBD>
|
|||
|
hAdrntrueFile = CreateFile(szAdrnTruebinFileName,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
|
|||
|
if(hAdrntrueFile == INVALID_HANDLE_VALUE) return -1;
|
|||
|
hRealtrueFile = CreateFile(szRealTrueBinFileName,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
|
|||
|
if(hRealtrueFile == INVALID_HANDLE_VALUE){
|
|||
|
CloseHandle(hAdrntrueFile);
|
|||
|
return -2;
|
|||
|
}
|
|||
|
|
|||
|
while(1){
|
|||
|
// <20>ѵ<EFBFBD><D1B5><EFBFBD><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD>϶<EFBFBD><CFB6><EFBFBD>
|
|||
|
bReadReturn = ReadFile(hAdrntrueFile,&Addr,sizeof(AddressBin_s),&dwReadByte,NULL);
|
|||
|
// <20><><EFBFBD>϶<EFBFBD><CFB6><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
if(bReadReturn && dwReadByte == 0) break;
|
|||
|
// <20><><EFBFBD><EFBFBD>
|
|||
|
if(dwReadByte == 0) break;
|
|||
|
memcpy(&adrntruebuff[Addr.bitmapno],&Addr,sizeof(AddressBin_s));
|
|||
|
}
|
|||
|
CloseHandle(hAdrntrueFile);
|
|||
|
return 0;
|
|||
|
}
|
|||
|
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>BmpNo ֵ<><D6B5><EFBFBD><EFBFBD><EFBFBD>Ǽ<EFBFBD>ȥ OLD_GRAPHICS_START <20><><EFBFBD><EFBFBD>ֵ,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȫ<EFBFBD>ʵ<EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD>ͼ
|
|||
|
BOOL Read16BMP(int BmpNo,unsigned char **BmpData,int *width,int *height,BYTE **AlphaData,BOOL *useAlpha)
|
|||
|
{
|
|||
|
BOOL bRet = TRUE,bReadReturn;
|
|||
|
AddressBin_s *pAddr;
|
|||
|
unsigned char *pBmpData;
|
|||
|
unsigned int len,iw = 0,ih = 0;
|
|||
|
DWORD dwReadByte;
|
|||
|
|
|||
|
if(BmpNo > MAX_GRAPHICS_24) return FALSE;
|
|||
|
pAddr = &adrntruebuff[BmpNo];
|
|||
|
// <20>Ƶ<EFBFBD>Ҫ<EFBFBD><D2AA>ȡ<EFBFBD><C8A1>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>
|
|||
|
SetFilePointer(hRealtrueFile,pAddr->adder,NULL,FILE_BEGIN);
|
|||
|
pBmpData = (unsigned char*)MALLOC(pAddr->size);
|
|||
|
#ifdef _STONDEBUG_
|
|||
|
g_iMallocCount++;
|
|||
|
#endif
|
|||
|
if(pBmpData == NULL) return FALSE;
|
|||
|
else{
|
|||
|
memset(g_rgbPal,0,sizeof(g_rgbPal));
|
|||
|
// <20>ȶ<EFBFBD><C8B6><EFBFBD>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
bReadReturn = ReadFile(hRealtrueFile,g_rgbPal,pAddr->palSize+sizeof(RGBQUAD),&dwReadByte,NULL);
|
|||
|
// <20><><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>
|
|||
|
if(bReadReturn && dwReadByte == 0) bRet = FALSE;
|
|||
|
// <20><>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD>϶<EFBFBD><CFB6><EFBFBD>
|
|||
|
bReadReturn = ReadFile(hRealtrueFile,pBmpData,pAddr->size,&dwReadByte,NULL);
|
|||
|
// <20><><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>
|
|||
|
if(bReadReturn && dwReadByte == 0) bRet = FALSE;
|
|||
|
else{
|
|||
|
*BmpData = g_realgetimagebuf2;
|
|||
|
if(decoder(pBmpData,BmpData,(unsigned int*)width,(unsigned int*)height,&len) == NULL) bRet = FALSE;
|
|||
|
}
|
|||
|
FREE(pBmpData);
|
|||
|
#ifdef _STONDEBUG_
|
|||
|
g_iMallocCount--;
|
|||
|
#endif
|
|||
|
// <20><>alpha<68><61><EFBFBD>϶<EFBFBD><CFB6><EFBFBD>
|
|||
|
*useAlpha = FALSE;
|
|||
|
if(pAddr->alpha_size > 0){
|
|||
|
pBmpData = (unsigned char*)MALLOC(pAddr->alpha_size);
|
|||
|
#ifdef _STONDEBUG_
|
|||
|
g_iMallocCount++;
|
|||
|
#endif
|
|||
|
if(pBmpData == NULL) return FALSE;
|
|||
|
bReadReturn = ReadFile(hRealtrueFile,pBmpData,pAddr->alpha_size,&dwReadByte,NULL);
|
|||
|
// <20><><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>
|
|||
|
if(bReadReturn && dwReadByte == 0) bRet = FALSE;
|
|||
|
else{
|
|||
|
*AlphaData = g_realgetimagebuf;
|
|||
|
if(decoder(pBmpData,AlphaData,&iw,&ih,&len) == NULL) bRet = FALSE;
|
|||
|
}
|
|||
|
FREE(pBmpData);
|
|||
|
#ifdef _STONDEBUG_
|
|||
|
g_iMallocCount--;
|
|||
|
#endif
|
|||
|
*useAlpha = TRUE;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return bRet;
|
|||
|
}
|
|||
|
#endif
|