marek677
07-22-2014, 03:09 PM
Could anybody check if my code is correcct?
#include "mylib.h"
#include "mem.h"
void parseflag(void* data, unsigned char arg);
short int* sprites;
int spriteID = 0;
void getUnusedSprites(){
short int max;
int i,j;
for(i=0;i<spriteID;i++)
if(max<sprites[i])
max = sprites[i];
fprintf(stderr,"\nMax sprite value:%d",max);
printf("\n\nUnused:\n");
int found;
for(j=0x1F;j<max;j++){
found=0;
for(i=0;i<spriteID;i++)
if(sprites[i]==j){found=1; break;}
if(found!=1) printf("%d ",j);
}
}
int main(int argc,char** argv){
size_t datasize;
void* data = readfile("tibia.dat",&datasize);
setptr(data);
fprintf(stderr,"ver:%d\n",getU32());
short int items = getU16();
short int monsters = getU16();
short int effects = getU16();
short int distance = getU16();
sprites = malloc((items+monsters+effects+distance)*sizeof(sh ort int)*12); //allocate more memory then needed?
fprintf(stderr,"items:%d\n",items);
fprintf(stderr,"Monsters:0x%x\n",monsters);
fprintf(stderr,"Effects:0x%x\n",effects);
fprintf(stderr,"Distanceeffects:0x%x\n",distance);
int padding = 0;
int i;
for(;;){
parseflag(data,getU8());
if(getptr()>(data+datasize))
break;
}
fprintf(stderr,"\nReading done.");
getUnusedSprites();
fprintf(stderr,"\nParsing done.");
return 0;
}
void parseflag(void* data,unsigned char arg){
int width, height, blend,divx,divy,divz,animation;
int i ; //for a loop
switch(arg){
case 0x00: //Ground
//getU16(); //speed
//wasnt workin, so i deleted it
break;
case 0x01: //Top Order 1
case 0x02: //Top Order 2
case 0x03: //Top Order 3
case 0x04: //Container
case 0x05: //Stackable
case 0x06: //Corpse
case 0x07: //Useable
case 0x08: //Rune
break;
case 0x09: //Writeable
case 0x0A: //Readable
getU16(); //Text limit
break;
case 0x0B: //Fluid
case 0x0C: //Splash
case 0x0D: //Blocking
case 0x0E: //Immoble
case 0x0F: //Block Missle
case 0x10: //Blocks path
case 0x11: //Pickupable
case 0x12: //Hangable
case 0x13: //Horizontal (whatever it is)
case 0x14: //Vertical
case 0x15: //Rotatable
break;
case 0x16: //Light
getU16();//level
getU16();//color
break;
case 0x18://Floorchange
break;
case 0x19: //Offset
getU8(); //x
getU8(); //y
break;
case 0x1A:// Heighted
getU16(); //amount of pixel raised
break;
case 0x1B:// Layer(Player Appear on top)
case 0x1C:// Idle Animation
break;
case 0x1D:// Minimap
getU16(); //color
break;
case 0x1E:// floor change
/*86 - openable holes,
77 - can be used to go down,
76 - can be used to go up,
82 - stairs up,
79 - switch*/
getU8();
getU8(); //Returns 4... always.
break;
case 0x1F: //unknown
break;
case 0xFF: // End of flags, time to parse
width = getU8();
height = getU8();
if(width!=1 || height!=1) getU8(); //is this correct?
blend = getU8(); // is this correct?
divx = getU8();
divy = getU8();
divz = getU8();
animation = getU8();
printf("\n%d: Prev: 0x%.2x Width:%d Height:%d blendframes:%d divx:%d divy:%d divz:%d animation:%d\n",
spriteID++,*(unsigned char*)(getptr()-2),width,height,blend,divx,divy,divz,animation);
//if(width!=1 || height!=1) blend=1;
for(i=1;i<=width*height*blend*divx*divy*divz*animation;i++){
unsigned short int sprite = getU16();
sprites[spriteID-1] = sprite;
printf("%.5d ",sprite);
if(sprite>37000) exit(7);
// just some eye-candy, which makes readin it easier
if(i%8==0 && i!=0) printf("\n");
if(i%4==0 && i%8!=0 && i!=0) printf(" ");
}
printf("\n\tEnded at:%x\n",getptr()-1-data); // just some debug usefull info
break;
default:
printf("0x%x:Unknown value:0x%.2x Last byte 0x%.2x \n",
getptr()-data-1,arg,*(unsigned char*)(getptr()-2));
break;
}
}
}
It works kinda good, but it crashes in the midle of the file. Have i mismatched some adresses?
Thanks in advance,
Marek677
@edit
My point of viev:
[bytes] comment
[4] file version
[2] Items
[2] Outfits
[2] Effect
[2] Distance effects
[x] - sooome stuff and flags
[1] - 0xFF
[2] - Width
[2] - Height
[2] - Blendedframes (some things mismatched with that shit?)
[2] - divx
[2] - divy
[2] - divz
[2] - animation
[2*animation*divx*divy*divz*width*height*blendedfra mes] - sprite numbers
[x] - soome stuff flags //again
The tibia ver is 860
#include "mylib.h"
#include "mem.h"
void parseflag(void* data, unsigned char arg);
short int* sprites;
int spriteID = 0;
void getUnusedSprites(){
short int max;
int i,j;
for(i=0;i<spriteID;i++)
if(max<sprites[i])
max = sprites[i];
fprintf(stderr,"\nMax sprite value:%d",max);
printf("\n\nUnused:\n");
int found;
for(j=0x1F;j<max;j++){
found=0;
for(i=0;i<spriteID;i++)
if(sprites[i]==j){found=1; break;}
if(found!=1) printf("%d ",j);
}
}
int main(int argc,char** argv){
size_t datasize;
void* data = readfile("tibia.dat",&datasize);
setptr(data);
fprintf(stderr,"ver:%d\n",getU32());
short int items = getU16();
short int monsters = getU16();
short int effects = getU16();
short int distance = getU16();
sprites = malloc((items+monsters+effects+distance)*sizeof(sh ort int)*12); //allocate more memory then needed?
fprintf(stderr,"items:%d\n",items);
fprintf(stderr,"Monsters:0x%x\n",monsters);
fprintf(stderr,"Effects:0x%x\n",effects);
fprintf(stderr,"Distanceeffects:0x%x\n",distance);
int padding = 0;
int i;
for(;;){
parseflag(data,getU8());
if(getptr()>(data+datasize))
break;
}
fprintf(stderr,"\nReading done.");
getUnusedSprites();
fprintf(stderr,"\nParsing done.");
return 0;
}
void parseflag(void* data,unsigned char arg){
int width, height, blend,divx,divy,divz,animation;
int i ; //for a loop
switch(arg){
case 0x00: //Ground
//getU16(); //speed
//wasnt workin, so i deleted it
break;
case 0x01: //Top Order 1
case 0x02: //Top Order 2
case 0x03: //Top Order 3
case 0x04: //Container
case 0x05: //Stackable
case 0x06: //Corpse
case 0x07: //Useable
case 0x08: //Rune
break;
case 0x09: //Writeable
case 0x0A: //Readable
getU16(); //Text limit
break;
case 0x0B: //Fluid
case 0x0C: //Splash
case 0x0D: //Blocking
case 0x0E: //Immoble
case 0x0F: //Block Missle
case 0x10: //Blocks path
case 0x11: //Pickupable
case 0x12: //Hangable
case 0x13: //Horizontal (whatever it is)
case 0x14: //Vertical
case 0x15: //Rotatable
break;
case 0x16: //Light
getU16();//level
getU16();//color
break;
case 0x18://Floorchange
break;
case 0x19: //Offset
getU8(); //x
getU8(); //y
break;
case 0x1A:// Heighted
getU16(); //amount of pixel raised
break;
case 0x1B:// Layer(Player Appear on top)
case 0x1C:// Idle Animation
break;
case 0x1D:// Minimap
getU16(); //color
break;
case 0x1E:// floor change
/*86 - openable holes,
77 - can be used to go down,
76 - can be used to go up,
82 - stairs up,
79 - switch*/
getU8();
getU8(); //Returns 4... always.
break;
case 0x1F: //unknown
break;
case 0xFF: // End of flags, time to parse
width = getU8();
height = getU8();
if(width!=1 || height!=1) getU8(); //is this correct?
blend = getU8(); // is this correct?
divx = getU8();
divy = getU8();
divz = getU8();
animation = getU8();
printf("\n%d: Prev: 0x%.2x Width:%d Height:%d blendframes:%d divx:%d divy:%d divz:%d animation:%d\n",
spriteID++,*(unsigned char*)(getptr()-2),width,height,blend,divx,divy,divz,animation);
//if(width!=1 || height!=1) blend=1;
for(i=1;i<=width*height*blend*divx*divy*divz*animation;i++){
unsigned short int sprite = getU16();
sprites[spriteID-1] = sprite;
printf("%.5d ",sprite);
if(sprite>37000) exit(7);
// just some eye-candy, which makes readin it easier
if(i%8==0 && i!=0) printf("\n");
if(i%4==0 && i%8!=0 && i!=0) printf(" ");
}
printf("\n\tEnded at:%x\n",getptr()-1-data); // just some debug usefull info
break;
default:
printf("0x%x:Unknown value:0x%.2x Last byte 0x%.2x \n",
getptr()-data-1,arg,*(unsigned char*)(getptr()-2));
break;
}
}
}
It works kinda good, but it crashes in the midle of the file. Have i mismatched some adresses?
Thanks in advance,
Marek677
@edit
My point of viev:
[bytes] comment
[4] file version
[2] Items
[2] Outfits
[2] Effect
[2] Distance effects
[x] - sooome stuff and flags
[1] - 0xFF
[2] - Width
[2] - Height
[2] - Blendedframes (some things mismatched with that shit?)
[2] - divx
[2] - divy
[2] - divz
[2] - animation
[2*animation*divx*divy*divz*width*height*blendedfra mes] - sprite numbers
[x] - soome stuff flags //again
The tibia ver is 860