Got a spare minute? The Archives need some love. See the to-do list to find a way to help.
If you upload a new image make sure you name and categorize it properly. If in doubt, ask an admin or see our FAQ page.

User:Ribose

From Bulbagarden Archives
Jump to navigationJump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

Nobody reads these anyways so here's how I make/verify G/S/C BACKsprites.

I'm using Script-Fu (GIMP) to crop and transparentize, Visual Boy Advance screenshots (I say it isn't illegal because I own all Gen I and II game carts), and Python to compare images.

The longest part is sitting here with GameShark codes and 3 VBA emulators (G, S, C) and modifying the species, switching the Pkmn out and taking screenshots every turn... 251 times x 2 for shinies (even though I've determined so far that G/S are almost always the same and G/S/C shiny are almost always the same, but I've found a couple exceptions!). Here are my notes:

GAMESHARK CODES G/S/C
=====================
PkMn Data Structure

[00] Species
[01] Held Item
[02] Attack 1
[03] Attack 2
[04] Attack 3
[05] Attack 4
[06] OT ID (2)
[07]
[08] Experience (3)
[09]
[0A]
[0B] EV data (10)
[0C]
[0D]
[0E]
[0F]
[10]
[11]
[12]
[13]
[14]
[15] DVs (2)
[16]
[17] PP1
[18] PP2
[19] PP3
[1A] PP4
[1B] Happiness
[1C] Pokérus
[1D] Caught data (2)
[1E]
[1F] Level
[20] Status
[21] ?
[22] Current HP (2)
[23]
[24] Total HP (2)
[25]
[26] Attack (2)
[27]
[28] Defense (2)
[29]
[2A] Speed (2)
[2B]
[2C] Sp. Attack (2)
[2D]
[2E] Sp. Defense (2)
[2F]

Offsets:
Poké 1    2    3    4    5    6
GS: DA2A DA5A DA8A DABA DAEA DB1A
C:  DCDF DD0F DD3F DD6F DD9F DDEF

Codes:
GAME/POKé: GS/1     GS/2      C/1      C/2
SPECIES:   01XX2ADA 01XX5ADA  91XXDFDC 91XX0FDD
HP 100:    01644DDA 01647DDA  916402DD 916432DD  
HPMAX 100: 01644FDA 01647FDA  916404DD 916434DD
DV NORMAL: 01FF3FDA           91FFF4DC 
           01FF40DA           91FFF5DC
DV SHINY:           01EA6FDA           91EA24DD
                    01AA70DA           91AA25DD

Generated:
gs:init
01644DDA 01647DDA 01644FDA 01647FDA 01FF3FDA 01FF40DA 01EA6FDA 01AA70DA
c:init
916402DD 916432DD 916404DD 916434DD 91FFF4DC 91FFF5DC 91EA24DD 91AA25DD

gs
01162ADA 01165ADA
c
9116DFDC 91160FDD


Script-Fu is Scheme:

(define (crop-sprite input) (let* (
   (img (car (file-png-load RUN-NONINTERACTIVE input input)))
   (dsp (car (gimp-display-new img)))
   (drw (car (gimp-image-get-active-drawable img)))
   (lyr (car (gimp-image-get-active-layer img)))
   )
   (gimp-image-crop img 58 57 7 39)
   (gimp-layer-add-alpha lyr)
   (gimp-fuzzy-select drw 0 0 15 CHANNEL-OP-ADD FALSE FALSE 0 FALSE)
   (gimp-edit-clear drw)
   ; actual position: 56x56, at x=8px y=40px
   (gimp-image-crop img 56 56 1 1)
   (file-png-save-defaults 1 img drw input input)
   (gimp-display-delete dsp)
   ;(gimp-image-delete img)
))

Python (with PIL) for compares (takes command line args for each image to compare "g_100" -> Spr b 2g 100.png, "c_100_s" -> Spr b 2c 100 s.png, etc):

import Image
import ImageChops
import sys

im_name = "Spr b 2"
ims = []

args = sys.argv
i = 0
if len(args) > 1:
    for arg in args:
        if i > 0:
            ims = ims + ["Spr_b_2" + arg + ".png"]
        i = i + 1

i = 0
for im in ims:
    ims[i] = ims[i].replace("_", " ")
    i = i + 1

imo = []
i = 0
for im in ims:
    imo = imo + [Image.open(im)]
    print ims[i],imo[i]
    i = i + 1

diffs = []
i = 0
for im in ims:
    if i > 0:
        diffs = diffs + [ImageChops.difference(imo[i - 1], imo[i])]
        if len(diffs[i-1].getcolors()) > 1:
            print ims[i-1]," and ",ims[i]," do not match: color count = ", len(diffs[i-1].getcolors())
            print diffs[i-1].getcolors()[0][0],diffs[i-1].getcolors()[1][0]
            diffs[i-1].show()
    i = i + 1

Sprites that need correction:

  • File:Spr b 2c 002.png (I can't overwrite the redirect with an image)