Login

Subversion Repositories NedoOS

Rev

Blame | Last modification | View Log | Download | RSS feed

#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;
}