ROM Hacking Need a helping hand? You can get help on any ROM Hacking-related problems or questions you have here.

Closed Thread
 
Thread Tools
  #14776    
Old May 29th, 2010 (1:55 PM). Edited May 29th, 2010 by Loaf.
Loaf's Avatar
Loaf Loaf is offline
Just loafing around...
     
    Join Date: May 2010
    Location: New Zealand
    Gender: Male
    Nature: Calm
    Posts: 13
    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.

    Relevant Advertising!

      #14777    
    Old May 29th, 2010 (3:19 PM).
    Buizark's Avatar
    Buizark Buizark is offline
    Always looking for an OU match
       
      Join Date: Dec 2009
      Gender: Male
      Nature: Calm
      Posts: 72
      Leave and re-enter the map.The new events will load.
      __________________
        #14778    
      Old May 29th, 2010 (3:21 PM).
      SonicBlazePlatinum's Avatar
      SonicBlazePlatinum SonicBlazePlatinum is offline
      /)^3^(\
      • Silver Tier
       
      Join Date: Oct 2007
      Location: Cloudsdale, Equestria
      Age: 21
      Gender: Male
      Nature: Relaxed
      Posts: 1,012
      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 Shadowbolt Pegasus.
        #14779    
      Old May 29th, 2010 (3:27 PM).
      Chaos Rush's Avatar
      Chaos Rush Chaos Rush is offline
      im sexy and i know it
         
        Join Date: May 2007
        Location: Taylor Swift
        Gender: Male
        Nature: Adamant
        Posts: 1,296
        Quote:
        Originally Posted by Darksun View Post
        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.
        __________________

        My projects:
        Untitled Pokémon fangame (pictured above) | Final Fantasy II NES retranslation | Mother 1/EarthBound Beginnings Color Restoration for GBA
        Non-Pokémon hacks I support:
        Sonic Classic Heroes
        Sonic 3 Complete
          #14780    
        Old May 29th, 2010 (3:46 PM).
        Shiny Quagsire's Avatar
        Shiny Quagsire Shiny Quagsire is offline
        I'm Still Alive, Elsewhere
           
          Join Date: May 2009
          Location: Hoenn Safari Zone
          Age: 19
          Gender: Male
          Nature: Jolly
          Posts: 700
          Quote:
          Originally Posted by SonicBlazePlatinum View Post
          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 (4:01 PM).
          altariaking's Avatar
          altariaking altariaking is offline
          Needs NO VMs...
             
            Join Date: Dec 2009
            Location: Scotland, Lesmahagow
            Age: 42
            Gender: Male
            Nature: Naive
            Posts: 1,098
            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 (4:46 PM).
            mattattack's Avatar
            mattattack mattattack is offline
            Huh, Son?
               
              Join Date: Apr 2008
              Location: Why would you care?
              Nature: Jolly
              Posts: 183
              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 (5:03 PM).
              Loaf's Avatar
              Loaf Loaf is offline
              Just loafing around...
                 
                Join Date: May 2010
                Location: New Zealand
                Gender: Male
                Nature: Calm
                Posts: 13
                @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 (5:48 PM).
                Chaos Rush's Avatar
                Chaos Rush Chaos Rush is offline
                im sexy and i know it
                   
                  Join Date: May 2007
                  Location: Taylor Swift
                  Gender: Male
                  Nature: Adamant
                  Posts: 1,296
                  How do you add level scripts in G/S/C?
                  __________________

                  My projects:
                  Untitled Pokémon fangame (pictured above) | Final Fantasy II NES retranslation | Mother 1/EarthBound Beginnings Color Restoration for GBA
                  Non-Pokémon hacks I support:
                  Sonic Classic Heroes
                  Sonic 3 Complete
                    #14785    
                  Old May 29th, 2010 (6:16 PM).
                  Binary's Avatar
                  Binary Binary is offline
                  え?
                     
                    Join Date: Aug 2007
                    Age: 22
                    Posts: 3,993
                    Quote:
                    Originally Posted by mattattack View Post
                    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 (6:25 PM).
                    melosfox melosfox is offline
                       
                      Join Date: May 2010
                      Gender: Male
                      Posts: 23
                      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 (6:48 PM).
                      sonlen sonlen is offline
                      Hacking Noob
                         
                        Join Date: Nov 2009
                        Gender: Male
                        Posts: 66
                        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 (7:39 PM).
                        colcolstyles's Avatar
                        colcolstyles colcolstyles is offline
                        Yours truly
                        • Crystal Tier
                         
                        Join Date: May 2008
                        Location: The Bay Area
                        Gender: Male
                        Nature: Lonely
                        Posts: 1,584
                        Quote:
                        Originally Posted by melosfox View Post
                        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 (7:56 PM).
                        melosfox melosfox is offline
                           
                          Join Date: May 2010
                          Gender: Male
                          Posts: 23
                          Yeah, that's not a problem either. I can run the ROMs well until I compile the script.
                            #14790    
                          Old May 29th, 2010 (7:59 PM).
                          colcolstyles's Avatar
                          colcolstyles colcolstyles is offline
                          Yours truly
                          • Crystal Tier
                           
                          Join Date: May 2008
                          Location: The Bay Area
                          Gender: Male
                          Nature: Lonely
                          Posts: 1,584
                          Quote:
                          Originally Posted by melosfox View Post
                          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 (8:12 PM).
                          melosfox melosfox is offline
                             
                            Join Date: May 2010
                            Gender: Male
                            Posts: 23
                            Quote:
                            Originally Posted by colcolstyles View Post
                            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 (8:36 PM).
                            colcolstyles's Avatar
                            colcolstyles colcolstyles is offline
                            Yours truly
                            • Crystal Tier
                             
                            Join Date: May 2008
                            Location: The Bay Area
                            Gender: Male
                            Nature: Lonely
                            Posts: 1,584
                            Quote:
                            Originally Posted by melosfox View Post
                            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 (8:38 PM).
                            melosfox melosfox is offline
                               
                              Join Date: May 2010
                              Gender: Male
                              Posts: 23
                              Quote:
                              Originally Posted by colcolstyles View Post
                              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 (8:50 PM).
                              colcolstyles's Avatar
                              colcolstyles colcolstyles is offline
                              Yours truly
                              • Crystal Tier
                               
                              Join Date: May 2008
                              Location: The Bay Area
                              Gender: Male
                              Nature: Lonely
                              Posts: 1,584
                              Quote:
                              Originally Posted by melosfox View Post
                              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 (9:36 PM). Edited May 29th, 2010 by sonlen.
                              sonlen sonlen is offline
                              Hacking Noob
                                 
                                Join Date: Nov 2009
                                Gender: Male
                                Posts: 66
                                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 melosfox is offline
                                   
                                  Join Date: May 2010
                                  Gender: Male
                                  Posts: 23
                                  Quote:
                                  Originally Posted by colcolstyles View Post
                                  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 colcolstyles is offline
                                  Yours truly
                                  • Crystal Tier
                                   
                                  Join Date: May 2008
                                  Location: The Bay Area
                                  Gender: Male
                                  Nature: Lonely
                                  Posts: 1,584
                                  Quote:
                                  Originally Posted by melosfox View Post
                                  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 (1:39 AM).
                                  Sawakita's Avatar
                                  Sawakita Sawakita is offline
                                  Not Invented Here
                                     
                                    Join Date: May 2010
                                    Gender: Male
                                    Posts: 180
                                    Quote:
                                    Originally Posted by Sawakita View Post
                                    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 (2:06 AM).
                                    Darksun's Avatar
                                    Darksun Darksun is offline
                                    triple rainbow, yo
                                       
                                      Join Date: Jul 2008
                                      Location: 22nd floor of the Carrot Tower in Setagaya, Tokyo, Japan
                                      Gender: Male
                                      Nature: Relaxed
                                      Posts: 123
                                      Quote:
                                      Originally Posted by Chaos Rush View Post
                                      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 (2:12 AM).
                                      SonicBlazePlatinum's Avatar
                                      SonicBlazePlatinum SonicBlazePlatinum is offline
                                      /)^3^(\
                                      • Silver Tier
                                       
                                      Join Date: Oct 2007
                                      Location: Cloudsdale, Equestria
                                      Age: 21
                                      Gender: Male
                                      Nature: Relaxed
                                      Posts: 1,012
                                      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 Shadowbolt Pegasus.
                                      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 GMT -8. The time now is 4:43 AM.