Go Back   The PokéCommunity Forums > ROM Hacking > ROM Hacking Hub
Reload this Page [ARCHIVE] Simple Questions (SEARCH BEFORE ASKING A QUESTION)

Notices
For all updates, view the main page.

ROM Hacking Hub General discussions about ROM Hacking and Emulation. Not sure where to start? This is the place for you.
Posting links to ROMs is illegal and is not tolerated anywhere on the forum.
New threads in this forum are to be approved by a moderator before they are displayed.



Closed Thread
 
Thread Tools
  #14776    
Old May 29th, 2010 (01:55 PM). Edited May 29th, 2010 by Loaf.
Loaf's Avatar
Loaf
Just loafing around...
 
Join Date: May 2010
Location: New Zealand
Gender: Male
Nature: Calm
Try here, it helped me:

pokecommunity.com/showthread.php?t=128125

Oh, another question. Is there an easier way to test out changes you make to the game? I don't want to have to keep going through the Professor Oak intro. If I save, change the game, then load, certain things don't appear (like events) which is to be expected.
  #14777    
Old May 29th, 2010 (03:19 PM).
Buizark's Avatar
Buizark
Always looking for an OU match
 
Join Date: Dec 2009
Gender: Male
Nature: Calm
Leave and re-enter the map.The new events will load.
__________________
  #14778    
Old May 29th, 2010 (03:21 PM).
SonicBlazePlatinum's Avatar
SonicBlazePlatinum
/)^3^(\
Community Supporter
 
Join Date: Oct 2007
Location: Ponyville, Equestria
Age: 19
Gender: Male
Nature: Relaxed
The thing is after I edit the text and save it, then look at it again it's unedited. What do I do?
__________________
Also known as SentryBronyPlatinum or Copyright Infringement.
  #14779    
Old May 29th, 2010 (03:27 PM).
Chaos Rush's Avatar
Chaos Rush
im sexy and i know it
 
Join Date: May 2007
Location: Taylor Swift
Gender: Male
Nature: Adamant
Quote originally posted by Darksun:
Thanks! And damn. I've tried searching the forum for a while now, but I can't seem to find out where the graphics are located, and how to fix it with a hex editor.
I don't know if the graphics are compressed or uncompressed, but if they're uncompressed, you could use the same method as what this tutorial does.
__________________
  #14780    
Old May 29th, 2010 (03:46 PM).
Shiny Quagsire's Avatar
Shiny Quagsire
Working on KARL3DS
 
Join Date: May 2009
Location: Hoenn Safari Zone
Age: 17
Gender: Male
Nature: Jolly
Quote originally posted by SonicBlazePlatinum:
How do I use XSE with AdvanceMap? I edit text on a sign in Littleroot and it still says what it originally said.
Go to settings>Choose script editor. Click Yes on the dialog box that pops up. Now when you double click on a person or sign, XSE should pop up and show the script.
__________________



  #14781    
Old May 29th, 2010 (04:01 PM).
altariaking's Avatar
altariaking
Needs NO VMs...
 
Join Date: Dec 2009
Location: Scotland, Lesmahagow
Age: 40
Gender: Male
Nature: Naive
Send a message via Windows Live Messenger to altariaking
does anyone know the offset that tells the game your bag is too full? i'm trying to give the bag unlimited space.
it's for firered by the way.
__________________
http://www.pokecommunity.com/member.php?u=253113
  #14782    
Old May 29th, 2010 (04:46 PM).
mattattack's Avatar
mattattack
Huh, Son?
 
Join Date: Apr 2008
Location: Why would you care?
Nature: Jolly
Are there any good ASM tuts out there? I want to recreate a rom not 'edit' it. (Also, I'm doing this because I wish to hack the second gen games.)
__________________
Sometimes...it's hell before you get to heaven...

My Trainer Card


Help me raise my pokemon!

Cre....Creselia!!?!?!?!?!?!
  #14783    
Old May 29th, 2010 (05:03 PM).
Loaf's Avatar
Loaf
Just loafing around...
 
Join Date: May 2010
Location: New Zealand
Gender: Male
Nature: Calm
@the guy who can't get XSE to work

The way I get it working is to go Open > pokemon.rom
Add the script there (you'll need to know how to script, follow the link I gave) then compile it. Go back into Advance Map, and add the byte number into the script offset textbox in each event (for example: $8005BE).
Its all there in that tutorial.
  #14784    
Old May 29th, 2010 (05:48 PM).
Chaos Rush's Avatar
Chaos Rush
im sexy and i know it
 
Join Date: May 2007
Location: Taylor Swift
Gender: Male
Nature: Adamant
How do you add level scripts in G/S/C?
__________________
  #14785    
Old May 29th, 2010 (06:16 PM).
Binary's Avatar
Binary
え?
 
Join Date: Aug 2007
Age: 20
Quote originally posted by mattattack:
Are there any good ASM tuts out there? I want to recreate a rom not 'edit' it. (Also, I'm doing this because I wish to hack the second gen games.)
Google is your friend. You can also view Hackmew's tutorial if you're starting out.
__________________
  #14786    
Old May 29th, 2010 (06:25 PM).
melosfox
Beginning Trainer
 
Join Date: May 2010
Gender: Male
What are possible reasons for white screen EXCLUDING having the Wrong ROM version, or Overwriting of important code? I've created a standard battle encounter in Emerald, but it causes a white screen upon compiling.
  #14787    
Old May 29th, 2010 (06:48 PM).
sonlen
Hacking Noob
 
Join Date: Nov 2009
Gender: Male
Ok, I have been looking around the internet all day, and apparently I have missed something so obvious or I am making things harder then they should be, I want to make a title screen for a hack im making using a ruby rom, and I can't find a good tutorial at all, does anyone know of a great detailed tutorial. All help is appreciated.
__________________
Currently working on: Pokemon Moonlight
  #14788    
Old May 29th, 2010 (07:39 PM).
colcolstyles's Avatar
colcolstyles
Yours truly
 
Join Date: May 2008
Location: The Bay Area
Gender: Male
Nature: Lonely
Quote originally posted by melosfox:
What are possible reasons for white screen EXCLUDING having the Wrong ROM version, or Overwriting of important code? I've created a standard battle encounter in Emerald, but it causes a white screen upon compiling.
If you have your emulator set to the incorrect Save Type, then you'll experience problems. Go to "Options > Emulator > Save Type" and select "Flash 128k".
__________________

Brother of Vrai
  #14789    
Old May 29th, 2010 (07:56 PM).
melosfox
Beginning Trainer
 
Join Date: May 2010
Gender: Male
Yeah, that's not a problem either. I can run the ROMs well until I compile the script.
  #14790    
Old May 29th, 2010 (07:59 PM).
colcolstyles's Avatar
colcolstyles
Yours truly
 
Join Date: May 2008
Location: The Bay Area
Gender: Male
Nature: Lonely
Quote originally posted by melosfox:
Yeah, that's not a problem either. I can run the ROMs well until I compile the script.
Then my first guess would be that you overwrote something important. To what address are you compiling the script?
__________________

Brother of Vrai
  #14791    
Old May 29th, 2010 (08:12 PM).
melosfox
Beginning Trainer
 
Join Date: May 2010
Gender: Male
Quote originally posted by colcolstyles:
Then my first guess would be that you overwrote something important. To what address are you compiling the script?
I was fairly certain I hadn't. I used the free space finder to make sure. The main one was written to E3CF64
  #14792    
Old May 29th, 2010 (08:36 PM).
colcolstyles's Avatar
colcolstyles
Yours truly
 
Join Date: May 2008
Location: The Bay Area
Gender: Male
Nature: Lonely
Quote originally posted by melosfox:
I was fairly certain I hadn't. I used the free space finder to make sure. The main one was written to E3CF64
Well everything should be working fine if you did, in fact, compile your script to that address. Are you sure that it's the script that's causing the problem? Have you made any other changes to your ROM since it was last working fine?
__________________

Brother of Vrai
  #14793    
Old May 29th, 2010 (08:38 PM).
melosfox
Beginning Trainer
 
Join Date: May 2010
Gender: Male
Quote originally posted by colcolstyles:
Well everything should be working fine if you did, in fact, compile your script to that address. Are you sure that it's the script that's causing the problem? Have you made any other changes to your ROM since it was last working fine?
No, the script is the only change.

I did add a person to a map, and gave it the script, but after adding the person, I tested the ROM before adding the script. As soon as it was compiled, I got the white screen.
  #14794    
Old May 29th, 2010 (08:50 PM).
colcolstyles's Avatar
colcolstyles
Yours truly
 
Join Date: May 2008
Location: The Bay Area
Gender: Male
Nature: Lonely
Quote originally posted by melosfox:
No, the script is the only change.

I did add a person to a map, and gave it the script, but after adding the person, I tested the ROM before adding the script. As soon as it was compiled, I got the white screen.
Could you post the entire script here please?
__________________

Brother of Vrai
  #14795    
Old May 29th, 2010 (09:36 PM). Edited May 29th, 2010 by sonlen.
sonlen
Hacking Noob
 
Join Date: Nov 2009
Gender: Male
OK, so I have all I need but the raw file for groudon, if anyone knows or can help me find out what it is on unLZ.GBA then I think I can finish it off. Thanks ahead of time.

Edit: Finally after at least 12 hours of looking, researching, and even more paitience then I ever knew I had, I have found it.
__________________
Currently working on: Pokemon Moonlight
  #14796    
Old May 29th, 2010 (10:39 PM).
melosfox
Beginning Trainer
 
Join Date: May 2010
Gender: Male
Quote originally posted by colcolstyles:
Could you post the entire script here please?
Here it is, with dynamics deleted.

Spoiler:
'-----------------------
#dynamic 0x800000
#org @start
lockall
faceplayer
checksound
msgbox 0x8000001 '"It... moved?!"
callstd 0x6
cry 0x96 0x2
pause 0x28
waitcry
startwildbattle 0x96 0x50 0x0
setflag 0x1001
special 0x13B
clearflag 0x1001
special2 LASTRESULT 0xB7
compare LASTRESULT 0x1
if 0x1 goto 0x0000000
compare LASTRESULT 0x4
if 0x1 goto 0x0000001
compare LASTRESULT 0x5
if 0x1 goto 0x0000001
setflag 0x1002
releaseall
end

'-----------------------
#org 0x0000000
setflag 0x1002
'-----------------------
#org 0x0000001
setvar 0x8004 0x96

'---------
' Strings
'---------
#org 0x1
= It... moved?!
  #14797    
Old May 29th, 2010 (10:51 PM). Edited May 29th, 2010 by colcolstyles.
colcolstyles's Avatar
colcolstyles
Yours truly
 
Join Date: May 2008
Location: The Bay Area
Gender: Male
Nature: Lonely
Quote originally posted by melosfox:
Here it is, with dynamics deleted.

Spoiler:
'-----------------------
#dynamic 0x800000
#org @start
lockall
faceplayer
checksound
msgbox 0x8000001 '"It... moved?!"
callstd 0x6
cry 0x96 0x2
pause 0x28
waitcry
startwildbattle 0x96 0x50 0x0
setflag 0x1001
special 0x13B
clearflag 0x1001
special2 LASTRESULT 0xB7
compare LASTRESULT 0x1
if 0x1 goto 0x0000000
compare LASTRESULT 0x4
if 0x1 goto 0x0000001
compare LASTRESULT 0x5
if 0x1 goto 0x0000001
setflag 0x1002
releaseall
end

'-----------------------
#org 0x0000000
setflag 0x1002
'-----------------------
#org 0x0000001
setvar 0x8004 0x96

'---------
' Strings
'---------
#org 0x1
= It... moved?!
The problem, as I see it, is that when you use "#org 0xXXXXXX", it tells XSE to compile that portion of the script to that address. So when you put "#org 0x000000", it places that part of the script at the address 0x000000 which, as you might imagine, overwrites some pretty crucial data seeing how it's the first address in the ROM. Instead of "#org 0xXXXXXX" and "goto 0xXXXXXX", I would recommend using something like "#org @script" and "goto @script". Also, the address 0x800000 is free space in Fire Red & Leaf Green but not in Ruby, Sapphire & Emerald.
__________________

Brother of Vrai
  #14798    
Old May 30th, 2010 (01:39 AM).
Sawakita's Avatar
Sawakita
Not Invented Here
 
Join Date: May 2010
Gender: Male
Quote originally posted by Sawakita:
Do you know how to turn an image (.gif or .jpg or .png) like this
Attachment 54206
into hexcode like this
(hexcode of compressed image of "bulbasaur")
Spoiler:
557D 3C25 4CDF AAE5 3C0A 9A55 56CA
5052 97FF 5385 B429 27EB 9622 157A 3093
0BF5 AB74 6048 9092 7FE9 2962 6F48 51B2
25B7 8204 8811 A2D6 A308 C2A8 12B0 B5E0
8626 25B5 0530 9CB8 A6A2 671E 0812 D08B
A496 3182 38E2 2088 8D11 4E55 F52A 3A5A
314C 3B90 4861 4E48 88C2 74A6 D148 5918
DD4A 8B7E 2D08 6306 A14C 1068 8A08 B52A
21B5 A220 8148 759A 2152 174C 1252 EA16
2621 FF25 A236 18B7 6962 7414 D60B 858C
5614 D392 193B 7EA3 8204 8816 681C 9626
308E 3541 D48E 50F2 5E0A 0495 8A4E 1C70
E782 0B46 19A5 4652 2637 B696 41C6 2A25
1504


I found a program written in C that decompress front&back pics from pokemon red
Spoiler:

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

///// Necessary Structures

#define WIDTHBYTES(w,bpp)  (((w*bpp+31)>>5)<<2)

#ifdef BIGENDIAN
#define SWAPWORD(a) \
   ((WORD) ((((a)>>8)&0x00FF))\
          |((((a)<<8)&0xFF00)))
#define SWAPDWORD(a) \
  ((DWORD) ((((a)>>24)&0x000000FF))\
          |((((a)>>8) &0x0000FF00))\
          |((((a)<<8) &0x00FF0000))\
          |((((a)<<24)&0xFF000000)))
#else
#define SWAPWORD(a)  a
#define SWAPDWORD(a)  a
#endif

typedef unsigned char BYTE;
typedef unsigned short WORD;
typedef unsigned long DWORD;
typedef signed long LONG;
typedef int BOOL;

#define TRUE 1
#define FALSE 0

#pragma pack(1)
typedef struct tagBITMAPINFOHEADER {
   DWORD  biSize; 
   LONG   biWidth; 
   LONG   biHeight; 
   WORD   biPlanes; 
   WORD   biBitCount;
   DWORD  biCompression; 
   DWORD  biSizeImage; 
   LONG   biXPelsPerMeter; 
   LONG   biYPelsPerMeter; 
   DWORD  biClrUsed; 
   DWORD  biClrImportant; 
} BITMAPINFOHEADER; 


typedef struct tagBITMAPFILEHEADER {
  WORD    bfType; 
  DWORD   bfSize; 
  WORD    bfReserved1; 
  WORD    bfReserved2; 
  DWORD   bfOffBits; 
} BITMAPFILEHEADER; 
#pragma pack()

/////  GB Graphics to Bitmap Files

void GbSetTile(
 BYTE *tile,
 BYTE *data,
 DWORD stride,
 BYTE clrOrigin
){
 int y;
 BYTE k1,k2;
 BYTE * bits;
 for(y=0;y<8;y++){
  k1=tile[2*y];
  k2=tile[2*y+1];
  bits=data+y*stride;
  bits[0]=clrOrigin|((k1&0x80)>>7)|((k2&0x80)>>6);
  bits[1]=clrOrigin|((k1&0x40)>>6)|((k2&0x40)>>5);
  bits[2]=clrOrigin|((k1&0x20)>>5)|((k2&0x20)>>4);
  bits[3]=clrOrigin|((k1&0x10)>>4)|((k2&0x10)>>3);
  bits[4]=clrOrigin|((k1&0x08)>>3)|((k2&0x08)>>2);
  bits[5]=clrOrigin|((k1&0x04)>>2)|((k2&0x04)>>1);
  bits[6]=clrOrigin|((k1&0x02)>>1)|((k2&0x02)   );
  bits[7]=clrOrigin|((k1&0x01)   )|((k2&0x01)<<1);
 }
}

void SaveGbBitmapTiles(
  char *filename,
  BYTE *buffer,
  DWORD sz,
  DWORD cxTile,
  DWORD cyTile,
  BOOL orient // TRUE - ltr/utd; FALSE - utd/ltr
){
 int i;
 DWORD xx=0,yy=0;
 BITMAPINFOHEADER *ret;
 BITMAPFILEHEADER bfh;
 FILE *h;
 BYTE *bits;
 DWORD stride;
 DWORD neededsz;
 DWORD numtiles=cxTile*cyTile;
 LONG width=cxTile*8;
 LONG height=cyTile*8;
 DWORD bminfo;
 BYTE *ctbl;
 bminfo=sizeof(BITMAPINFOHEADER)+1024;//header and palette
 stride=WIDTHBYTES(width,8);
 neededsz=bminfo+stride*height; //add image size
 ret=malloc(neededsz);
 if(!ret)return;
 memset(ret,0,neededsz);
 ret->biSize=sizeof(BITMAPINFOHEADER);
 ret->biWidth=width;
 ret->biHeight=-height;
 ret->biPlanes=SWAPWORD(1);
 ret->biBitCount=SWAPWORD(8);
 ret->biSize=SWAPDWORD(ret->biSize);
 ret->biWidth=SWAPDWORD(ret->biWidth);
 ret->biHeight=SWAPDWORD(ret->biHeight);
 // Calculate color table
 ctbl=((BYTE*)ret)+sizeof(BITMAPINFOHEADER);
 ctbl[0]=ctbl[1]=ctbl[2]   =0xFF;
 ctbl[4]=ctbl[5]=ctbl[6]   =0xAA;
 ctbl[8]=ctbl[9]=ctbl[10]  =0x55;
 ctbl[12]=ctbl[13]=ctbl[14]=0x00;
 // Calculate pointer to image
 bits=((BYTE*)ret)+bminfo;
 for(i=0;i<numtiles;i++){
  BYTE *d=bits+(yy<<3)*stride+(xx<<3);
  GbSetTile(buffer,d,stride,0);
  buffer+=16;
  if(orient){
   xx++;if(xx==cxTile){xx=0;yy++;}
  } else {
   yy++;if(yy==cyTile){yy=0;xx++;}
  }
 }
 bfh.bfType='B'|('M'<<8);
 bfh.bfSize=sizeof(BITMAPFILEHEADER)+neededsz;
 bfh.bfReserved1=0;
 bfh.bfReserved2=0;
 bfh.bfOffBits=sizeof(BITMAPFILEHEADER)+bminfo;
 bfh.bfType=SWAPWORD(bfh.bfType);
 bfh.bfSize=SWAPDWORD(bfh.bfSize);
 bfh.bfOffBits=SWAPDWORD(bfh.bfOffBits);
 h=fopen(filename,"wb");
 if(!h)return;
 fwrite(&bfh,sizeof(BITMAPFILEHEADER),1,h);
 fwrite(ret,neededsz,1,h);
 fclose(h);
 free(ret);
}

/////  Helper function

int xgetc(FILE *f, DWORD o){
 DWORD sav=ftell(f);
 int c;
 fseek(f,o,SEEK_SET);
 c=getc(f);
 fseek(f,sav,SEEK_SET);
 return c;
}

/////  Graphics compression

#define RLC(a) \
  ( (((a)&0x7F)<<1)|(((a)&0x80)>>7) )

#define RRC(a) \
  ( (((a)&0xFE)>>1)|(((a)&0x01)<<7) )

#define SWAP(a) \
  ( (((a)&0xF0)>>4)|(((a)&0x0F)<<4) )


#define SLA(a) \
  (((a)<<1)&0xFE)

#define SLA16(a) \
  (((a)<<1)&0xFFFE)

typedef struct{
 BYTE *ptr;
 BYTE cursize1;
 BYTE cursize2;
 BYTE size1;
 BYTE size2;
 BYTE curbyte;
 BYTE curbit;
 BYTE d084;
 BYTE d085;
 BYTE d086;
 BYTE d087;
 WORD o;
 WORD pos0;
 WORD pos1;
 WORD table1;
 WORD table2;
 WORD maxsize;
 WORD error;
} GGCONTEXT;

WORD BitMaskTable[]={
 0x0001,
 0x0003,
 0x0007,
 0x000F,
 0x001F,
 0x003F,
 0x007F,
 0x00FF,
 0x01FF,
 0x03FF,
 0x07FF,
 0x0FFF,
 0x1FFF,
 0x3FFF,
 0x7FFF,
 0xFFFF
};
BYTE BitTables[4][8]={
 {0x08,0xC4,0xE6,0x2A,0xF7,0x3B,0x19,0xD5},
 {0xF7,0x3B,0x19,0xD5,0x08,0xC4,0xE6,0x2A},
 {0x01,0x32,0x76,0x45,0xFE,0xCD,0x89,0xBA},
 {0xFE,0xCD,0x89,0xBA,0x01,0x32,0x76,0x45} 
};

BYTE Tables2[16]={
 0x00,0x08,0x04,0x0C,0x02,0x0A,0x06,0x0E,
 0x01,0x09,0x05,0x0D,0x03,0x0B,0x07,0x0F
};

#define TESTPOS(ggc,x)\
 if(x>=(ggc)->maxsize){\
  (ggc)->error=1;\
  return 0;\
 }

#define NEXTBIT(x) \
 do{\
  if(!(--ggc.curbit)){\
   ggc.curbyte=xgetc(f,offset+(ggc.o++));\
   ggc.curbit=8;\
  }\
  ggc.curbyte=RLC(ggc.curbyte);\
  x=ggc.curbyte&0x01;\
 }while(0)

#define PUTTEMP(tmp) \
 do{\
  e=tmp;\
  switch(ggc.d084){\
   case 1:\
    e=SLA(e);e=SLA(e);break;\
   case 2:\
    e=SWAP(e);break;\
   case 3:\
    e=RRC(e);e=RRC(e);break;\
  }\
  TESTPOS(&ggc,ggc.pos0);\
  ggc.ptr[ggc.pos0]|=e;\
 }while(0)

#define INCPTR  \
 do{\
  ggc.cursize2++;\
  if(ggc.cursize2!=ggc.size2){\
   ggc.pos0++;\
  } else {\
   ggc.cursize2=0;\
   if(ggc.d084){\
    ggc.d084--;\
    ggc.pos0=ggc.pos1;\
   } else {\
    ggc.d084=3;\
    ggc.cursize1+=0x08;\
    if(ggc.cursize1!=ggc.size1){\
     ggc.pos0++;\
     ggc.pos1=ggc.pos0;\
    } else {\
     ggc.cursize1=0;\
     if(!(ggc.d085&0x02)){\
      ggc.d085^=0x01;\
      ggc.d085|=0x02;\
      goto label2574;\
     } else {\
      done=TRUE;\
     }\
    }\
   }\
  }\
 }while(0)

int GetGraphicsRoutine1(GGCONTEXT *ggc, WORD hl){
 BYTE b;
 BYTE tmp,c,d;
 BOOL d087Old;
 WORD a;
 BYTE e;
 WORD i,j;
 ggc->cursize1=ggc->cursize2=0;
 ggc->pos0=ggc->pos1=hl;
 if(ggc->d087){
  ggc->table1=0;
  ggc->table2=1;
 } else {
  ggc->table1=2;
  ggc->table2=3;
 }
 e=0;
 do{
  do{
   BYTE bit;
   TESTPOS(ggc,ggc->pos0);
   a=b=ggc->ptr[ggc->pos0];
   a=SWAP(a)&0x0F;
   c=a&0x01;
   a>>=1;
   bit=(ggc->d087)?(e&0x04):(e&0x01);
   if(bit){
    a=BitTables[ggc->table2][a];
   } else {
    a=BitTables[ggc->table1][a];
   }
   if(!(c&0x01))a=SWAP(a);
   a&=0x0F;
   e=a;
   d=SWAP(a);
   a=b&0x0F;
   c=a&0x01;
   a>>=1;
   bit=(ggc->d087)?(e&0x04):(e&0x01);
   if(bit){
    a=BitTables[ggc->table2][a];
   } else {
    a=BitTables[ggc->table1][a];
   }
   if(!(c&0x01))a=SWAP(a);
   a&=0x0F;
   e=a;
   a|=d;
   TESTPOS(ggc,ggc->pos0);
   ggc->ptr[ggc->pos0]=a;
   ggc->pos0+=ggc->size1;
   ggc->cursize1+=0x08;
  }while(ggc->cursize1!=ggc->size1);
  e=0;
  ggc->cursize1=0;
  ggc->cursize2++;
  if(ggc->cursize2!=ggc->size2){
   ggc->pos1++;
   ggc->pos0=ggc->pos1;
  }
 }while(ggc->cursize2!=ggc->size2);
 ggc->cursize2=0;
 return !(ggc->error);
}

int GetGraphicsRoutine2(GGCONTEXT *ggc){
 BYTE b;
 BYTE tmp,c;
 BOOL d087Old;
 WORD a;
 WORD mask,de,hl;
 BYTE e;
 WORD i,j;
 ggc->cursize1=ggc->cursize2=0;
 ggc->pos0=(ggc->d085&0x01)?0:0x188;
 ggc->pos1=(ggc->d085&0x01)?0x188:0;
 GetGraphicsRoutine1(ggc,ggc->pos0);
 ggc->pos0=(ggc->d085&0x01)?0:0x188;
 ggc->pos1=(ggc->d085&0x01)?0x188:0;
 hl=ggc->pos0; 
 de=ggc->pos1;
 do{
  do{
   if(ggc->d087){
    TESTPOS(ggc,de);
    a=ggc->ptr[de];
    b=a;
    a=SWAP(a)&0x0F;
    c=Tables2[a];
    c=SWAP(c);
    a=b&0x0F;
    a=Tables2[a];
    a|=c;
    ggc->ptr[de]=a;
   }
   TESTPOS(ggc,hl);
   TESTPOS(ggc,de);
   a=ggc->ptr[hl++]^ggc->ptr[de];
   ggc->ptr[de++]=a;
   ggc->cursize2++;
  }while(ggc->cursize2!=ggc->size2);
  ggc->cursize2=0;
  ggc->cursize1+=0x08;
 }while(ggc->cursize1!=ggc->size1);
 ggc->cursize1=0;
 return !(ggc->error);
}

int GetGraphics(
 FILE *f,
 DWORD offset,
 BYTE *ptr,
 DWORD sz
){
 GGCONTEXT ggc;
 BYTE b;
 BYTE tmp,c;
 BOOL d087Old;
 WORD a;
 WORD mask,de,hl;
 BYTE e;
 WORD i,j;
 BOOL done=FALSE;
 BYTE tmpbuf[0x310];
 ggc.size1=0;
 ggc.size2=0;
 ggc.cursize1=0;
 ggc.cursize2=0;
 ggc.curbit=1;
 ggc.d085=0;
 ggc.d086=1;
 ggc.d084=3;
 ggc.d087=0;
 ggc.pos0=0;
 ggc.pos1=0;
 ggc.ptr=tmpbuf;
 ggc.table1=0;
 ggc.table2=0;
 ggc.o=0;
 ggc.maxsize=0x310;
 ggc.error=0;
 ggc.curbyte=xgetc(f,offset+(ggc.o++));
 if(ggc.curbyte!=0x44
  &&ggc.curbyte!=0x55
  &&ggc.curbyte!=0x66
  &&ggc.curbyte!=0x77)return 0;
 b=ggc.curbyte;
 ggc.size1=(b&0x0F)*8;
 b=SWAP(b);
 ggc.size2=(b&0x0F)*8;
 memset(tmpbuf,0,0x310);
 NEXTBIT(tmp);
 ggc.d085=tmp;
label2574:
 ggc.pos0=ggc.pos1=(ggc.d085&0x01)?0x188:0;
 if(ggc.d085&0x02){
  NEXTBIT(tmp);
  if(tmp){
   NEXTBIT(tmp);
   tmp++;
  }
  ggc.d086=tmp;
 }
 NEXTBIT(tmp);
 while(!done){
  if(tmp){
   while(1){
    NEXTBIT(tmp);
    c=tmp;
    NEXTBIT(tmp);
    tmp|=SLA(c);
    if(tmp){
     PUTTEMP(tmp);
     INCPTR;
    } else break;
   }
  }
  if(done)break;
  c=0;
  do{
   NEXTBIT(tmp);
   if(tmp)c++;
  }while(tmp);
  mask=BitMaskTable[c];
  de=0;
  c++;
  do{
   NEXTBIT(tmp);
   de=tmp|de;
   if(--c){
    de=SLA16(de);
   }
  }while(c);
  de+=mask;
  do{
   tmp=0;
   PUTTEMP(tmp);
   INCPTR;
   if(done)break;
   de--;
   if(de==0){
    tmp=1;//to continue upper loop
    break;
   }  
  }while(1);
 }
 if(ggc.d086==0){
  GetGraphicsRoutine1(&ggc,0);
  GetGraphicsRoutine1(&ggc,0x188);
 } else if(ggc.d086==1){
  GetGraphicsRoutine2(&ggc);  
 } else {
  ggc.pos0=(ggc.d085&0x01)?0:0x188;
  ggc.pos1=(ggc.d085&0x01)?0x188:0;
  d087Old=ggc.d087;
  ggc.d087=0;
  GetGraphicsRoutine1(&ggc,ggc.pos1);
  ggc.pos0=(ggc.d085&0x01)?0:0x188;
  ggc.pos1=(ggc.d085&0x01)?0x188:0;
  ggc.d087=d087Old;
  GetGraphicsRoutine2(&ggc);
 }
 for(i=0;i<0x188;i++){
  ptr[(i<<1)]=ggc.ptr[i];
  ptr[(i<<1)|1]=ggc.ptr[0x188+i];
 }
 return !(ggc.error);
}

int NumberToIndex(BYTE *ord,DWORD len,int n){
 int i;
 for(i=0;i<len;i++){
  if(ord[i]==n)return i;
 }
 return -1;
}

void RedBlueGraphics(FILE *f){
 int i;
 BYTE rbpkdx[28];
 BYTE buffer[1024];
 BYTE bmp[256];
 BYTE pb[256];
 WORD pal[4];
 BYTE palno;
 fseek(f,0x41024,SEEK_SET);
 fread(pb,256,1,f); // read internal order
 for(i=1;i<=151;i++){
  DWORD wBack,wFront;
  WORD bSize;
  DWORD o1=0x24000;
  BOOL have=TRUE;
  DWORD bank;
  int j=NumberToIndex(pb,0xBE,i)+1;
  if(i==151){
   fseek(f,0x425b,SEEK_SET);
  } else {
   DWORD o=0x383de;
   fseek(f,o+((i-1)*28),SEEK_SET);
  }
  if(j==0x15){
   bank=1;
  } else if(j==0xB6){
   bank=0x0B;
  } else if(j<0x1F){
   bank=0x09;
  } else if(j<0x4A){
   bank=0x0A;
  } else if(j<0x74){
   bank=0x0B;
  } else if(j<0x99){
   bank=0x0C;
  } else {
   bank=0x0D;
  }
  o1=(bank-1)<<14;
  fread(rbpkdx,28,1,f);
  bSize=rbpkdx[10]&0x0F;
  wFront=rbpkdx[11]|(rbpkdx[12]<<8);
  wBack=rbpkdx[13]|(rbpkdx[14]<<8);
  memset(buffer,0,1024);
  // Get front graphic
  have=GetGraphics(f,o1+wFront,buffer,1024);
  if(!have)continue;
  sprintf(bmp,"%03d.bmp",i);
  SaveGbBitmapTiles(bmp,buffer,bSize*bSize*16,bSize,bSize,FALSE);
  // Get back graphic
  have=GetGraphics(f,o1+wBack,buffer,1024);
  sprintf(bmp,"%03db.bmp",i);
  SaveGbBitmapTiles(bmp,buffer,16*16,4,4,FALSE);
 }
}

int main(int argc,char **argv){
 FILE *f=fopen("red.gb","rb");
 if(!f){
  printf("Can't open Pokemon Red English ROM.  Please name the ROM red.gb and try again.\r\n");
  return 1;
 }
 RedBlueGraphics(f);
 fclose(f);
 return 0;
}

but i need to know the reverse process (i.e. compressing).
Anyone can help me? Thanks
__________________



| 1st Gen Hacking: Useful Links | A good example of REAL ROM Hacking |
  #14799    
Old May 30th, 2010 (02:06 AM).
Darksun's Avatar
Darksun
triple rainbow, yo
 
Join Date: Jul 2008
Location: 22nd floor of the Carrot Tower in Setagaya, Tokyo, Japan
Gender: Male
Nature: Relaxed
Quote originally posted by Chaos Rush:
I don't know if the graphics are compressed or uncompressed, but if they're uncompressed, you could use the same method as what this tutorial does.
I really appreciate that you're helping me, but that didn't work either. D: I feel kinda doomed right now.. Any ways I can transfer all my data from this rom to another? It would be best to fix my current problem, but that seems too hard.
__________________

  #14800    
Old May 30th, 2010 (02:12 AM).
SonicBlazePlatinum's Avatar
SonicBlazePlatinum
/)^3^(\
Community Supporter
 
Join Date: Oct 2007
Location: Ponyville, Equestria
Age: 19
Gender: Male
Nature: Relaxed
I tried to edit text with XSE, after I edit, save and look at it again/ see how it appears on the ROM, it's unedited even though I changed it. Can someone help me?
__________________
Also known as SentryBronyPlatinum or Copyright Infringement.
Closed Thread
Quick Reply

Sponsored Links
Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are UTC -8. The time now is 03:25 AM.