Doom Browser!

Sub-fórum especial para usuários que querem discutir/aprender programação, como as linguagens C/C++/C#, Java, HTML, e por aí vai...
Avatar do usuário
Fabio914
Mensagens: 1757
Registrado em: Dom Mai 21, 2006 4:38 pm
Answers: 0
17
Localização: Sampa/Sanca
Contato:

Doom Browser!

Mensagem por Fabio914 »

Isto não é um projeto...

Como eu estava fazendo um trabalho de faculdade (de implementação de Árvore-B para manipulação de de indices de arquivos), e portanto eu tava mexendo com arquivos; me veio a idéia de fazer um tool (inútil) para brincar com arquivos. Então eu fiz um pequeno leitor de wads agora de noite, com ele é possível ver o conteúdo de um wad e recuperar um lump (gravar este lump em um arquivo separado). Eu testei esse tool com o Doom2.wad e deu certo... Divirtam-se...

Compilando no Windows (coloque gcc no PATH antes):

Código: Selecionar todos

gcc.exe db.c -o db.exe -ansi -O2
Compilando no Linux:

Código: Selecionar todos

gcc db.c -o db -ansi -O2
db.c

Código: Selecionar todos

/*************************************************************
 * Doom Browser!                                             *
 *                                                           *
 * Criado por Fabio de Albuquerque Dela Antonio              *
 * (fabio914)                                                *
 *                                                           *
 * Versao 0.1                                                *
 *                                                           *
 * ATENCAO: NAO ME RESPONSABILIZO POR EVENTUAIS DANOS QUE    *
 * ESTE PROGRAMA POSSA CAUSAR AO SEU COMPUTADOR.             *
 *                                                           *
 * VOCE E LIVRE PARA EDITAR, DISTRIBUIR E REUTILIZAR         *
 * ESTE PROGRAMA, DESDE QUE MANTENHA MEU NOME NOS            *
 * CREDITOS.                                                 *
 *                                                           *
 * Descricao: Programa para visualizar e recuperar dados     *
 * de um arquivo wad.                                        *
 *                                                           *
 * OBSERVACAO: Nao eh possivel recuperar dados de mapas      *
 * (pois sao lumps com nomes repetidos).                     *
 *                                                           * 
 * fabio914@gmail.com
 *                                                           *
 *************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define PROG_NOME "Doom Browser"
#define VER_NOME  "0.1"

typedef struct {
   long filepos;
   int size;
   char name[9];
} Referencia;

#define IWAD 1
#define PWAD 2

#define OK   1
#define ERRO 0

int RecebeTipo(FILE **wad){

   char tipo[5];

   fseek(*wad,0,SEEK_SET);
   fread(tipo,sizeof(char),4,*wad);
   tipo[4] = '\0';

   return (strcmp(tipo,"IWAD")==0) ? IWAD : PWAD;

}

int MontaTabelaRefs(FILE **wad,Referencia **tabela,int *n_lumps){

   long offset_primeira_pos;
   int i;

   fseek(*wad,4,SEEK_SET);
   fread(n_lumps,4,1,*wad);
   fread(&offset_primeira_pos,4,1,*wad);

   (*tabela) = (Referencia *)malloc((*n_lumps)*sizeof(Referencia));

   if( (*tabela) == NULL ) return ERRO;

   fseek(*wad,offset_primeira_pos,SEEK_SET);
   for(i=0;i<(*n_lumps);i++){
      fread(&((*tabela)[i].filepos),4,1,*wad);
      fread(&((*tabela)[i].size),4,1,*wad);
      fread(((*tabela)[i].name),sizeof(char),8,*wad);
      (*tabela)[i].name[8] = '\0';
   }

   return OK;

}

#define ENCONTRADO	1
#define NAO_ENCONTRADO	0

/* Busca sequencial sucks! */
int BuscaRef(char name[9], Referencia **tabela, int *n_lumps, long *filepos, int *size) {

   int i;

   for(i=0;i<(*n_lumps);i++){
      if(strcmp(name,(*tabela)[i].name)==0){
         (*filepos) = (*tabela)[i].filepos;
         (*size) = (*tabela)[i].size;
         return ENCONTRADO;
      }
   }

   return NAO_ENCONTRADO;

}

int RecuperaLump(char name[9], FILE **wad, Referencia **tabela, int *n_lumps){

   long filepos;
   int size;
   FILE *lump;
   char file_name[15];
   char *dados;

   if(BuscaRef(name,tabela,n_lumps,&filepos,&size)){

      if(size == 0) return ERRO;      

      sprintf(file_name,"%s.lmp",name);
      lump = fopen(file_name,"wb");
      dados = (char *)malloc(size*sizeof(char));

      if(dados == NULL) return ERRO;

      fseek(*wad,filepos,SEEK_SET);
      fread(dados,sizeof(char),size,*wad);
      fwrite(dados,sizeof(char),size,lump);
      free(dados);
      fflush(lump);
      fclose(lump);
      return OK;

   } else return ERRO;

}

void ListaRefs(Referencia **tabela, int *n_lumps){

   int i;
   char c;

   printf("Conteudo do WAD:\n");
   
   for(i=0;i<(*n_lumps);i++){
      if(i==0) scanf("%c",&c);
      if((i % 80)==0 && i!=0) { printf("Pressione qualquer tecla para continuar...\n"); scanf("%c",&c); }
      if((*tabela)[i].size == 0) printf("%s \(marcador\)\n",(*tabela)[i].name);
      else printf("%s\n",(*tabela)[i].name);
   }

}

int main(int argc, char *argv[]){

   if(argc < 2){
      printf("Uso: db <aquivowad>.wad\n");
      exit(ERRO);
   }

   printf("Inicializando %s! v.%s.\n",PROG_NOME,VER_NOME);

   FILE *wad;
   int tipo;
   Referencia *tabela;
   int n_lumps;
   
   long lump_pos;
   int size_lump;

   char comando[10];
   char argumento[9];

   int sair = 0;

   wad = fopen(argv[1],"rb");

   if(wad == NULL) { printf("Erro: Impossivel abrir arquivo %s.\n",argv[1]); exit(ERRO); }
   printf("Lido: %s.\n",argv[1]);
 
   tipo = RecebeTipo(&wad);

   if(tipo == IWAD) printf("Tipo: IWAD.\n");
   else printf("Tipo: PWAD.\n");

   printf("Montando tabela de referencias.\n");

   if(MontaTabelaRefs(&wad,&tabela,&n_lumps))
      printf("Lido: %d lumps.\n",n_lumps);
   else { printf("Erro: Impossivel alocar tabela de referencias!\n"); fclose(wad); exit(ERRO); }

   printf("Digite HELP para lista de comandos disponiveis.\n");

   do {
      printf("%s$>",argv[1]);
      scanf("%s",comando);

      if(strcmp(comando,"HELP")==0){
         printf("BUSCA <lump> : Busca lump no arquivo.\n");
         printf("HELP : Mostra comandos disponiveis.\n");
         printf("LISTA : Lista lumps do arquivo.\n");
         printf("RECUPERA <lump> : Grava lump em arquivo separado.\n");
         printf("SAIR : Sai do programa.\n");
      }

      else if(strcmp(comando,"BUSCA")==0){
         if(scanf("%s",argumento)!=EOF){
            if(BuscaRef(argumento,&tabela,&n_lumps,&lump_pos,&size_lump))
               printf("Encontrado: %s.\nTamanho: %d bytes.\nPosicao: 0x%x.\n",argumento,size_lump,(unsigned int)lump_pos);
            else printf("Erro: Lump nao encontrado!\n");
         } else printf("Erro: Impossivel ler nome do lump.\n");
      }

      else if(strcmp(comando,"RECUPERA")==0){
         if(scanf("%s",argumento)!=EOF){
            if(RecuperaLump(argumento,&wad,&tabela,&n_lumps))
               printf("Recuperado: %s.\n",argumento);
            else printf("Erro: Impossivel recuperar lump!\n");
         } else printf("Erro: Impossivel ler nome do lump.\n");
      }

      else if(strcmp(comando,"LISTA")==0){
         ListaRefs(&tabela,&n_lumps);
      }

      else if(strcmp(comando,"SAIR")==0) sair = 1;

      else printf("Comando invalido!\n");
      
   } while(!sair);

   fclose(wad);

   printf("Arquivo %s fechado.\n",argv[1]);

   free(tabela);

   printf("Tabela desmontada.\n");

   return 0;

}
Projetos em andamento
the Core
Eclipse

Projetos parados
Doom 3 on GZDoom
FSD Project

PC
AMD Athlon 64 X2 5200+ (2x 2.6Ghz)
2GB RAM (2x 1GB DDR2)
240GB (160GB SATA + 80GB SATA)
XFX nVidia GeForce 8600 GT (600mhz 256mb)
Placa Mãe ASUS M2N4 SLI (2x PCI-E 16x SLI, 4x DDR2 800, nForce 4)
Fonte 500W reais (esqueci o nome da marca)
Monitor LG Flatron 19'' LCD
Wa59
Mensagens: 983
Registrado em: Sex Abr 21, 2006 9:54 pm
Answers: 0
17
Localização: Jundiaí - SP
Contato:

Re: Doom Browser!

Mensagem por Wa59 »

Não compilou com o gcc 3.3 =/
Edit: besteira minha, tava indo com unicode mesmo você tendo colocado ansi ali.

Legal o programa.
Swim... Swim... Hungry...
Dopefish lives.
Avatar do usuário
Fabio914
Mensagens: 1757
Registrado em: Dom Mai 21, 2006 4:38 pm
Answers: 0
17
Localização: Sampa/Sanca
Contato:

Re: Doom Browser!

Mensagem por Fabio914 »

Wa59 escreveu:Não compilou com o gcc 3.3 =/
Edit: besteira minha, tava indo com unicode mesmo você tendo colocado ansi ali.
Eu não testei no Windows com ansi, mas acho que era pra funcionar, você usa Windows? Eu compilei e testei no Ubuntu só...
Wa59 escreveu: Legal o programa.
Valew! :wink:
Projetos em andamento
the Core
Eclipse

Projetos parados
Doom 3 on GZDoom
FSD Project

PC
AMD Athlon 64 X2 5200+ (2x 2.6Ghz)
2GB RAM (2x 1GB DDR2)
240GB (160GB SATA + 80GB SATA)
XFX nVidia GeForce 8600 GT (600mhz 256mb)
Placa Mãe ASUS M2N4 SLI (2x PCI-E 16x SLI, 4x DDR2 800, nForce 4)
Fonte 500W reais (esqueci o nome da marca)
Monitor LG Flatron 19'' LCD
Wa59
Mensagens: 983
Registrado em: Sex Abr 21, 2006 9:54 pm
Answers: 0
17
Localização: Jundiaí - SP
Contato:

Re: Doom Browser!

Mensagem por Wa59 »

Fabio914 escreveu:
Wa59 escreveu:Não compilou com o gcc 3.3 =/
Edit: besteira minha, tava indo com unicode mesmo você tendo colocado ansi ali.
Eu não testei no Windows com ansi, mas acho que era pra funcionar, você usa Windows? Eu compilei e testei no Ubuntu só...
Wa59 escreveu: Legal o programa.
Valew! :wink:
Compilei no arch linux, foi de boa.
Swim... Swim... Hungry...
Dopefish lives.
Rico
Mensagens: 2354
Registrado em: Dom Set 10, 2006 11:49 am
Answers: 0
17
Localização: Atrás do DU0
Contato:

Re: Doom Browser!

Mensagem por Rico »

Já testou em wads com 2000 lumps ou mais?
Eu nem continuei porque to estudando para facul ;)
[xfire]p0br3[/xfire]
Futuro PC:

CPU: AMD Athlon x2 64Bits 7750 2.7GHz Black Edition
MoBo: Asus M2 ou M3.
VGA: XFX Geforce 9800 GTX 512MB ou 1GB/256Bits
HD: Seagate 1TB
PSU: ATX 600w REAIS
RAM: 4GB Ram DDR2 Kingstone @800MHz [2x2Gb]
Avatar do usuário
Fabio914
Mensagens: 1757
Registrado em: Dom Mai 21, 2006 4:38 pm
Answers: 0
17
Localização: Sampa/Sanca
Contato:

Re: Doom Browser!

Mensagem por Fabio914 »

Rico escreveu:Já testou em wads com 2000 lumps ou mais?
Eu nem continuei porque to estudando para facul ;)
Doom2.wad ?
Fabio914 escreveu:Eu testei esse tool com o Doom2.wad e deu certo... Divirtam-se...
Projetos em andamento
the Core
Eclipse

Projetos parados
Doom 3 on GZDoom
FSD Project

PC
AMD Athlon 64 X2 5200+ (2x 2.6Ghz)
2GB RAM (2x 1GB DDR2)
240GB (160GB SATA + 80GB SATA)
XFX nVidia GeForce 8600 GT (600mhz 256mb)
Placa Mãe ASUS M2N4 SLI (2x PCI-E 16x SLI, 4x DDR2 800, nForce 4)
Fonte 500W reais (esqueci o nome da marca)
Monitor LG Flatron 19'' LCD
Rico
Mensagens: 2354
Registrado em: Dom Set 10, 2006 11:49 am
Answers: 0
17
Localização: Atrás do DU0
Contato:

Re: Doom Browser!

Mensagem por Rico »

Blz entao, espero q q funfe certinho pq nao to em casa para testar isso :/
o meu codigo o problema maior era q eu n sabia como manusear memoria dinamica, mas ae eesse mes eu peguei e dei uma estudadinha... vc usou parte do meu codigo do C?? :}
[xfire]p0br3[/xfire]
Futuro PC:

CPU: AMD Athlon x2 64Bits 7750 2.7GHz Black Edition
MoBo: Asus M2 ou M3.
VGA: XFX Geforce 9800 GTX 512MB ou 1GB/256Bits
HD: Seagate 1TB
PSU: ATX 600w REAIS
RAM: 4GB Ram DDR2 Kingstone @800MHz [2x2Gb]
Avatar do usuário
Drak[X]
Mensagens: 816
Registrado em: Sáb Fev 04, 2006 3:16 pm
Answers: 0
18
Localização: São Paulo - Brasil
Contato:

Re: Doom Browser!

Mensagem por Drak[X] »

Hmmmmmmmmmmmm......

Alocação dinâmica de memória.......
Seria bacan unir os projetos e criar uma programa em JAVA (multiplataforma), permitindo usar o programa em modo grafico em qualquer sistema operacional (queria ver um editor de mapas pra Doom no iPhone!!!!) ;)
DOOM é eterno!!!
As informações que temos não é a que desejamos. A informação que desejamos não é a que precisamos. A informação que precisamos não está disponível (John Peers)
Wa59
Mensagens: 983
Registrado em: Sex Abr 21, 2006 9:54 pm
Answers: 0
17
Localização: Jundiaí - SP
Contato:

Re: Doom Browser!

Mensagem por Wa59 »

Java :=O:
Swim... Swim... Hungry...
Dopefish lives.
Avatar do usuário
DU0
Mensagens: 6689
Registrado em: Sáb Abr 01, 2006 6:59 am
Answers: 0
18
Localização: Deimos Lab.
Contato:

Re: Doom Browser!

Mensagem por DU0 »

Java é o futuro, dude
Jogando atualmente:
Xbox 360: Ninja Gaiden Black
Xbox One: Need for Speed: Hot Pursuit, Yakuza 3
PlayStation 2: Fatal Frame 3: The Tormented
PlayStation 3: RE: The Darkside Chronicles, RE: The Umbrella Chronicles
Nintendo Switch: Phantasy Star, SIFU