?login_element?

Subversion Repositories NedoOS

Rev

Blame | Last modification | View Log | Download

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4. #include <string.h>
  5.  
  6.  
  7.  
  8. unsigned int read_dword(unsigned char* data)
  9. {
  10.         return data[0]+(data[1]<<8)+(data[2]<<16)+(data[3]<<24);
  11. }
  12.  
  13.  
  14.  
  15. unsigned int read_word(unsigned char* data)
  16. {
  17.         return data[0]+(data[1]<<8);
  18. }
  19.  
  20.  
  21.  
  22. bool get_bmp_dimensions(const char* filename,unsigned int& wdt,unsigned int& hgt)
  23. {
  24.         FILE *fin;
  25.         int bpp,rle;
  26.         unsigned char data[34];
  27.  
  28.         fin=fopen(filename,"rb");
  29.  
  30.         if(!fin) return false;
  31.  
  32.         fread(data,sizeof(data),1,fin);
  33.         fclose(fin);
  34.  
  35.         bpp=read_word (&data[28]);
  36.         rle=read_dword(&data[30]);
  37.  
  38.         if(bpp!=8||rle) return false;
  39.  
  40.         wdt=read_dword(&data[18]);
  41.         hgt=read_dword(&data[22]);
  42.  
  43.         if((wdt&15)||(hgt&15)) return false;
  44.  
  45.         return true;
  46. }
  47.  
  48.  
  49.  
  50. void make_define(char *line)
  51. {
  52.         unsigned int i;
  53.  
  54.         for(i=0;i<strlen(line);i++)
  55.         {
  56.                 if(line[i]>='0'&&line[i]<='9') continue;
  57.                 if(line[i]>='A'&&line[i]<='Z') continue;
  58.                 if(line[i]>='a'&&line[i]<='z')
  59.                 {
  60.                         line[i]-=32;
  61.                         continue;
  62.                 }
  63.                 line[i]='_';
  64.         }
  65. }
  66.  
  67.  
  68.  
  69. void make_defines(FILE *fout,char* filename,char* prefix)
  70. {
  71.         FILE *fin;
  72.         char line[1024];
  73.         unsigned int i,id;
  74.  
  75.         fin=fopen(filename,"rt");
  76.  
  77.         if(!fin) return;
  78.  
  79.         id=0;
  80.  
  81.         while(fgets(line,sizeof(line),fin)!=NULL)
  82.         {
  83.                 if(!memcmp(line,"rem",3)||!memcmp(line,":",1)) continue;
  84.  
  85.                 line[strlen(line)-2]=0;
  86.  
  87.                 i=strlen(line)-1;
  88.                 while(--i)
  89.                 {
  90.                         if(line[i]=='.')
  91.                         {
  92.                                 line[i]=0;
  93.                                 break;
  94.                         }
  95.                 }
  96.  
  97.                 i=strlen(line)-1;
  98.                 while(--i)
  99.                 {
  100.                         if(line[i]=='\\'||line[i]=='/')
  101.                         {
  102.                                 strcpy(line,&line[i+1]);
  103.                                 break;
  104.                         }
  105.                 }
  106.  
  107.                 make_define(line);
  108.  
  109.                 fprintf(fout,"#define %s%s\t%i\n",prefix,line,id);
  110.                 id++;
  111.         }
  112.  
  113.         fprintf(fout,"\n");
  114.         fclose(fin);
  115. }
  116.  
  117.  
  118.  
  119. void make_defines_sprites(FILE *fout,char* filename,char* prefix)
  120. {
  121.         FILE *fin;
  122.         char line[1024];
  123.         unsigned int i,wdt,hgt,spr;
  124.  
  125.         fin=fopen(filename,"rt");
  126.  
  127.         if(!fin) return;
  128.  
  129.         spr=0;
  130.  
  131.         while(fgets(line,sizeof(line),fin)!=NULL)
  132.         {
  133.                 if(!memcmp(line,"rem",3)) continue;
  134.  
  135.                 line[strlen(line)-1]=0;
  136.  
  137.                 if(!get_bmp_dimensions(line,wdt,hgt)) continue;
  138.  
  139.                 i=strlen(line)-1;
  140.                 while(--i)
  141.                 {
  142.                         if(line[i]=='.')
  143.                         {
  144.                                 line[i]=0;
  145.                                 break;
  146.                         }
  147.                 }
  148.  
  149.                 i=strlen(line)-1;
  150.                 while(--i)
  151.                 {
  152.                         if(line[i]=='\\'||line[i]=='/')
  153.                         {
  154.                                 strcpy(line,&line[i+1]);
  155.                                 break;
  156.                         }
  157.                 }
  158.  
  159.                 make_define(line);
  160.  
  161.                 fprintf(fout,"#define %s%s\t%i\n",prefix,line,spr);
  162.  
  163.                 spr+=(hgt>>4)*(wdt>>4);
  164.         }
  165.  
  166.         fprintf(fout,"\n");
  167.         fclose(fin);
  168. }
  169.  
  170.  
  171.  
  172. int skip_effect(int fxn,unsigned char *buf,int size)
  173. {
  174.         int pp,it,noise;
  175.        
  176.         pp=0;
  177.        
  178.         while(pp<size)
  179.         {
  180.                 it=buf[pp++];
  181.                
  182.                 if(it&(1<<5)) pp+=2;
  183.  
  184.                 if(it&(1<<6))
  185.                 {
  186.                         noise=buf[pp++];
  187.                         if(it==0xd0&&noise>=0x20) break;
  188.                 }
  189.         }
  190.        
  191.         return pp;
  192. }
  193.  
  194.  
  195.  
  196. void make_defines_sounds(FILE *fout,const char* filename,const char* prefix)
  197. {
  198.         FILE *fin;
  199.         unsigned char* data;
  200.         int i,off,len,rlen,size,effects_all;
  201.         char line[1024];
  202.  
  203.         fin=fopen(filename,"rb");
  204.  
  205.         if(!fin) return;
  206.  
  207.         fseek(fin,0,SEEK_END);
  208.         size=ftell(fin);
  209.         fseek(fin,0,SEEK_SET);
  210.         data=(unsigned char*)malloc(size);
  211.         fread(data,size,1,fin);
  212.         fclose(fin);
  213.  
  214.         effects_all=data[0];
  215.        
  216.         for(i=0;i<effects_all;++i)
  217.         {
  218.                 off=read_word(&data[1+i*2])+2+i*2;
  219.  
  220.                 if(i<effects_all-1)
  221.                 {
  222.                         len=read_word(&data[3+i*2])+4+i*2-off;
  223.                 }
  224.                 else
  225.                 {
  226.                         len=size-off;
  227.                 }
  228.  
  229.                 rlen=skip_effect(i,&data[off],len);
  230.                
  231.                 if(rlen!=len)
  232.                 {
  233.                         strcpy(line,(const char*)&data[off+rlen]);
  234.                 }
  235.                 else
  236.                 {
  237.                         sprintf(line,"noname%3.3i",i+1);
  238.                 }
  239.  
  240.                 make_define(line);
  241.  
  242.                 fprintf(fout,"#define %s%s\t%i\n",prefix,line,i);
  243.         }
  244.  
  245.         free(data);
  246. }
  247.  
  248.  
  249.  
  250. int main(int argc,char* argv[])
  251. {
  252.         FILE *fout;
  253.  
  254.         if(argc!=7) return 1;
  255.  
  256.         fout=fopen("resources.h","wt");
  257.  
  258.         if(!fout) return 1;
  259.  
  260.         fprintf(fout,"//└тЄюьрЄшўхёъш ухэхЁшЁєхь√х шфхэЄшЇшърЄюЁ√ ЁхёєЁёют\n\n");
  261.  
  262.         make_defines(fout,argv[1],"IMG_");
  263.         make_defines(fout,argv[2],"PAL_");
  264.         make_defines(fout,argv[3],"MUS_");
  265.         make_defines(fout,argv[4],"SMP_");
  266.         make_defines_sprites(fout,argv[5],"SPR_");
  267.         make_defines_sounds(fout,argv[6],"SFX_");
  268.  
  269.         fclose(fout);
  270.  
  271.         return 0;
  272. }
  273.