#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
unsigned int read_dword(unsigned char* data)
{
return data[0]+(data[1]<<8)+(data[2]<<16)+(data[3]<<24);
}
unsigned int read_word(unsigned char* data)
{
return data[0]+(data[1]<<8);
}
bool get_bmp_dimensions(const char* filename,unsigned int& wdt,unsigned int& hgt)
{
FILE *fin;
int bpp,rle;
unsigned char data[34];
fin=fopen(filename,"rb");
if(!fin) return false;
fread(data,sizeof(data),1,fin);
fclose(fin);
bpp=read_word (&data[28]);
rle=read_dword(&data[30]);
if(bpp!=8||rle) return false;
wdt=read_dword(&data[18]);
hgt=read_dword(&data[22]);
if((wdt&15)||(hgt&15)) return false;
return true;
}
void make_define(char *line)
{
unsigned int i;
for(i=0;i<strlen(line);i++)
{
if(line[i]>='0'&&line[i]<='9') continue;
if(line[i]>='A'&&line[i]<='Z') continue;
if(line[i]>='a'&&line[i]<='z')
{
line[i]-=32;
continue;
}
line[i]='_';
}
}
void make_defines(FILE *fout,char* filename,char* prefix)
{
FILE *fin;
char line[1024];
unsigned int i,id;
fin=fopen(filename,"rt");
if(!fin) return;
id=0;
while(fgets(line,sizeof(line),fin)!=NULL)
{
if(!memcmp(line,"rem",3)||!memcmp(line,":",1)) continue;
line[strlen(line)-2]=0;
i=strlen(line)-1;
while(--i)
{
if(line[i]=='.')
{
line[i]=0;
break;
}
}
i=strlen(line)-1;
while(--i)
{
if(line[i]=='\\'||line[i]=='/')
{
strcpy(line,&line[i+1]);
break;
}
}
make_define(line);
fprintf(fout,"#define %s%s\t%i\n",prefix,line,id);
id++;
}
fprintf(fout,"\n");
fclose(fin);
}
void make_defines_sprites(FILE *fout,char* filename,char* prefix)
{
FILE *fin;
char line[1024];
unsigned int i,wdt,hgt,spr;
fin=fopen(filename,"rt");
if(!fin) return;
spr=0;
while(fgets(line,sizeof(line),fin)!=NULL)
{
if(!memcmp(line,"rem",3)) continue;
line[strlen(line)-1]=0;
if(!get_bmp_dimensions(line,wdt,hgt)) continue;
i=strlen(line)-1;
while(--i)
{
if(line[i]=='.')
{
line[i]=0;
break;
}
}
i=strlen(line)-1;
while(--i)
{
if(line[i]=='\\'||line[i]=='/')
{
strcpy(line,&line[i+1]);
break;
}
}
make_define(line);
fprintf(fout,"#define %s%s\t%i\n",prefix,line,spr);
spr+=(hgt>>4)*(wdt>>4);
}
fprintf(fout,"\n");
fclose(fin);
}
int skip_effect(int fxn,unsigned char *buf,int size)
{
int pp,it,noise;
pp=0;
while(pp<size)
{
it=buf[pp++];
if(it&(1<<5)) pp+=2;
if(it&(1<<6))
{
noise=buf[pp++];
if(it==0xd0&&noise>=0x20) break;
}
}
return pp;
}
void make_defines_sounds(FILE *fout,const char* filename,const char* prefix)
{
FILE *fin;
unsigned char* data;
int i,off,len,rlen,size,effects_all;
char line[1024];
fin=fopen(filename,"rb");
if(!fin) return;
fseek(fin,0,SEEK_END);
size=ftell(fin);
fseek(fin,0,SEEK_SET);
data=(unsigned char*)malloc(size);
fread(data,size,1,fin);
fclose(fin);
effects_all=data[0];
for(i=0;i<effects_all;++i)
{
off=read_word(&data[1+i*2])+2+i*2;
if(i<effects_all-1)
{
len=read_word(&data[3+i*2])+4+i*2-off;
}
else
{
len=size-off;
}
rlen=skip_effect(i,&data[off],len);
if(rlen!=len)
{
strcpy(line,(const char*)&data[off+rlen]);
}
else
{
sprintf(line,"noname%3.3i",i+1);
}
make_define(line);
fprintf(fout,"#define %s%s\t%i\n",prefix,line,i);
}
free(data);
}
int main(int argc,char* argv[])
{
FILE *fout;
if(argc!=7) return 1;
fout=fopen("resources.h","wt");
if(!fout) return 1;
fprintf(fout,"//└тЄюьрЄшўхёъш ухэхЁшЁєхь√х шфхэЄшЇшърЄюЁ√ ЁхёєЁёют\n\n");
make_defines(fout,argv[1],"IMG_");
make_defines(fout,argv[2],"PAL_");
make_defines(fout,argv[3],"MUS_");
make_defines(fout,argv[4],"SMP_");
make_defines_sprites(fout,argv[5],"SPR_");
make_defines_sounds(fout,argv[6],"SFX_");
fclose(fout);
return 0;
}