• Our software update is now concluded. You will need to reset your password to log in. In order to do this, you will have to click "Log in" in the top right corner and then "Forgot your password?".
  • Forum moderator applications are now open! Click here for details.
  • Welcome to PokéCommunity! Register now and join one of the best fan communities on the 'net to talk Pokémon and more! We are not affiliated with The Pokémon Company or Nintendo.

Quick Research & Development Thread

JPAN

pokemon rom researcher
104
Posts
15
Years
  • Seen Jul 2, 2016
Ok, I finished a preliminary version of a replacement for the unsafe Variables. Depending on if you want, or not, to replace the Variable system, there are two features you can get.
First, the new block saved at the end of the Flash ROM, that contains 4096 bytes of usable, saveable space. That block is located at 0x0203e000 (as it seems free on both Fire Red and Emerald), and can be accessed alone by the use of the byte manipulating commands (in the 0x10 range).
Second, the ability to use that new area as Variables. The current solution destroys the access to the old ones, So if you're not OK with it, I'm sure we can work something out (after all, we still have 0x9000-0xffff to work with).
Installing informations are inside the Zip below, as well as the source code.

Before you go and install that directly in your Hack, I only tested it slightly. The save-load function alone is harmless, but the Variable one needs further testing. So, if you could, please test it in a normal ROM and see if it doesn't break anything.
 
Last edited:

Sierraffinity

Desperately trying to retire from ROM hacking
1,069
Posts
16
Years
Ok, I finished a preliminary version of a replacement for the unsafe Variables. Depending on if you want, or not, to replace the Variable system, there are two features you can get.
First, the new block saved at the end of the Flash ROM, that contains 4096 bytes of usable, saveable space. That block is located at 0x0203e000 (as it seems free on both Fire Red and Emerald), and can be accessed alone by the use of the byte manipulating commands (in the 0x10 range).
Second, the ability to use that new area as Variables. The current solution destroys the access to the old ones, So if you're not OK with it, I'm sure we can work something out (after all, we still have 0x9000-0xffff to work with).
Installing informations are inside the Zip below, as well as the source code.

Before you go and install that directly in your Hack, I only tested it slightly. The save-load function alone is harmless, but the Variable one needs further testing. So, if you could, please test it in a normal ROM and see if it doesn't break anything.
The hack (the one that makes the new variables work) broke my ROM. I couldn't start the game (once I pressed Continue, it crashed), I couldn't load my save states (take one step, it freezes) and other stuff.
My ROM is Emerald.
 

JPAN

pokemon rom researcher
104
Posts
15
Years
  • Seen Jul 2, 2016
The hack (the one that makes the new variables work) broke my ROM. I couldn't start the game (once I pressed Continue, it crashed), I couldn't load my save states (take one step, it freezes) and other stuff.
My ROM is Emerald.
Sorry about that. It seems I forgot to include some steps in the Emerald aplication. The problem comes from the Emerald Var_decrypt function being too simple, and not pushing r4-r6. Fixed instructions are posted.
 

Sierraffinity

Desperately trying to retire from ROM hacking
1,069
Posts
16
Years
Sorry about that. It seems I forgot to include some steps in the Emerald aplication. The problem comes from the Emerald Var_decrypt function being too simple, and not pushing r4-r6. Fixed instructions are posted.
There, it seems to be working fine now. :D
I was testing this out awhile, and so far, it seems to be working fine.
Of course, all of my variables (0x5000 and up) were set to 0x0, which told me it was repointed.
It works great! :D
 

Sierraffinity

Desperately trying to retire from ROM hacking
1,069
Posts
16
Years
JPAN! I have a HUGE problem!!
It appears that the RAM address you specified (0x0203E000) is used by the D/N system!!
What would be a good RAM address to use instead? (This is using BPEE)
EDIT: Also, the RAM address I changed it to doesn't seem to get refreshed upon starting a new game, with a game already having been saved!
 
Last edited:

JPAN

pokemon rom researcher
104
Posts
15
Years
  • Seen Jul 2, 2016
JPAN! I have a HUGE problem!!
It appears that the RAM address you specified (0x0203E000) is used by the D/N system!!
What would be a good RAM address to use instead? (This is using BPEE)
EDIT: Also, the RAM address I changed it to doesn't seem to get refreshed upon starting a new game, with a game already having been saved!
Well, 0x0203e000 is the start, but in Emerald, all up to 0x0203ffff seems free. So, just choose 0x1000 area or Ram from where the D/N lets up and use that.
Also, Emerald appears to load Flash-to-RAM only once, at the start of the first screen. Previously unused areas of the RAM shouldn't be deleted by themselves on New Game. So, use a script that only happens on the new game (set by one of the old 0x40xx variables, that the game clears for you) that clears the entire memory area for you.
 

Sierraffinity

Desperately trying to retire from ROM hacking
1,069
Posts
16
Years
Well, 0x0203e000 is the start, but in Emerald, all up to 0x0203ffff seems free. So, just choose 0x1000 area or Ram from where the D/N lets up and use that.
Also, Emerald appears to load Flash-to-RAM only once, at the start of the first screen. Previously unused areas of the RAM shouldn't be deleted by themselves on New Game. So, use a script that only happens on the new game (set by one of the old 0x40xx variables, that the game clears for you) that clears the entire memory area for you.
Okay then. Thanks for the fast response.
But, my question is:
How would I go about writing a script (or an ASM routine, if necessary) that clears the RAM?
I remember seeing something about ldstia or something like that in some ASM routines, and heard it does something with an increasing value... Would that help?
 

JPAN

pokemon rom researcher
104
Posts
15
Years
  • Seen Jul 2, 2016
You can use this routine to clear 0x1000 bytes. Just replace the last pointer for the one you will be using.
Code:
.align 2
.thumb
Fill_memory: push {r4-r7, lr}
    mov r4, #0x10
    lsl r4, r4, #0x8 /*value = 0x1000*/
    ldr r5, start_addr
    add r4, r5, r4
    mov r0, #0x0
    mov r1, #0x0
    mov r2, #0x0
    mov r3, #0x0
fill_loop:  stmia r5!, {r0-r3}
    cmp r4, r5
    bgt fill_loop
    pop {r4-r7,pc}
.hword 0x0000    
start_addr:  .word 0x0203f000 /*change as needed*/
or, in byte code, this:
Code:
f0 b5 [B]10[/B] 24 240205 4d 2c 19 00 20 00 21 00 22
00 23 0f c5 ac 42 fc dc f0 bd 00 00 [B]00 f0 03 02[/B]
The last bolded bytes are the pointer you wish to use. replace for your own. The bolded number above is the instruction needed to replace to make different sizes. For instance, if your replace 10 with 20, you will clear 0x2000 bytes. This code will always cover 0x100 bytes minimum (0x1).
 

Shiny Quagsire

I'm Still Alive, Elsewhere
697
Posts
14
Years
Alright, this question is mostly directed to JPAN, but anyone can answer.
In your berry system, you said htis:

JPAN said:
There is a limit of 256 different berry slots, each identified in the person id by the table number 0xfe.

What exactly does that mean? I've tried everything I could to understand, but the sentence is kinda smeared out in my mind. :\
 

JPAN

pokemon rom researcher
104
Posts
15
Years
  • Seen Jul 2, 2016
Alright, this question is mostly directed to JPAN, but anyone can answer.
In your berry system, you said htis:

There is a limit of 256 different berry slots, each identified in the person id by the table number 0xfe.


What exactly does that mean? I've tried everything I could to understand, but the sentence is kinda smeared out in my mind. :\
This means that each of the variables is linked to a specific OW number (person ID wasn't the best choice of words in this one, here it means the Sprite OW) And as OW sprite numbers are limited to a byte (0xfe, the table number, indicating that it is a berry tree), you only have 256 slots where you can have berries.
 

Shiny Quagsire

I'm Still Alive, Elsewhere
697
Posts
14
Years
This means that each of the variables is linked to a specific OW number (person ID wasn't the best choice of words in this one, here it means the Sprite OW) And as OW sprite numbers are limited to a byte (0xfe, the table number, indicating that it is a berry tree), you only have 256 slots where you can have berries.

So to turn the overworld into a berry tree, I'd use your OW hack, set the table # to 0xFE. But where does the variable come in? I'm not quite sure what you mean by the OW number. (Sorry if I'm frustrating you, it's just harder to understand when there's just text :p)

Wait, do you mean set the sprite to the desired variable index?
 

HackMew

Mewtwo Strikes Back
1,314
Posts
17
Years
  • Seen Oct 26, 2011
You can use this routine to clear 0x1000 bytes. Just replace the last pointer for the one you will be using.
Code:
.align 2
.thumb
Fill_memory: push {r4-r7, lr}
    mov r4, #0x10
    lsl r4, r4, #0x8 /*value = 0x1000*/
    ldr r5, start_addr
    add r4, r5, r4
    mov r0, #0x0
    mov r1, #0x0
    mov r2, #0x0
    mov r3, #0x0
fill_loop:  stmia r5!, {r0-r3}
    cmp r4, r5
    bgt fill_loop
    pop {r4-r7,pc}
.hword 0x0000    
start_addr:  .word 0x0203f000 /*change as needed*/

I really don't understand why would you push r6 and r7 when they're not even used, and not pushing r0-r3 instead, which might be needed depending from where the routine is called. Either way, there are better and faster ways to do that:

Code:
.text
.align 2
.thumb
.thumb_func
.global EraseMemory

main:
	push {r0-r3, lr}
	ldr r0, .START_ADDRESS
	mov r1, #0x0
	str r1, [r0]
	add r1, r0, #0x0
	ldr r2, .LENGTH
	swi #0xC
	pop {r0-r3, pc}
	
.align 2
.START_ADDRESS:
	.word 0x0203F000
.LENGTH:
	.word 0x01000400

In the code above, 0x01000400 stands for 0x400 words, and the 1 is for memory filling, rather then copying (the default behavior). Note that due to the way the SWI 0xC works, the word count (total amount of bytes / 4) must be a multiple of 8.

JPAN, what about the flags? Is there a way to fix the flags above 0x900 or something?

FYI, the address of the hypotetical flag 0x900 overlaps the one used by variable 0x4000. I guess I'll be able to tell you more when I implement the safe variables myself (sorry JPAN, but your code is just too messy).

EDIT: I did some research, and I think I found some safe areas to store the new variables in. For FR/LG, the whole area between 0x0203C000 - 0x0203EFFF appears to be totally unused. I somewhat confirmed it by putting a breakpoint on read/write on the whole area. I wasn't able to get the debugger to break yet. Also, here's a list I made, which clearly shows my theory:

Code:
02030000
02030001
02030003
02030014
0203001C
02030020
02030023
02030028
0203002F
02030032
02030040
02030050
0203005F
02030064
02030073
02030076
0203007E
0203009F
020300CD
020300DB
020300DF
020300F5
020300F9
02030101
02030103
02030104
02030120
02030201
02030202
0203022F
0203025F
02030400
02030401
02030405
0203043F
020304C0
020304FF
02030502
0203050A
02030614
0203081D
0203083E
02030908
02031022
02031036
020310B8
02031208
02031764
02031C8C
02031C90
02031C94
02031CCC
02031DA4
02031DA8
02031DAC
02031DB0
02031DB4
02031DBC
02031DC4
02031DCC
02031DD4
02031DD8
02031DDA
02031DDC
02031DE0
02031DE4
02031DE8
02031DEA
02031DEC
02031DFC
020320AF
020324C9
0203281E
0203303A
0203306F
020330BB
020330F8
020340FB
02034B41
02035046
020350E3
02036DFC
02036E18
02036E24
02036E28
02036E2C
02036E30
02036E34
02036E38
02037003
02037044
02037078
02037098
0203709A
0203709C
020370A0
020370A4
020370A8
020370AC
020370AE
020370B0
020370B2
020370B4
020370B6
020370B8
020370BA
020370BC
020370BE
020370C0
020370C2
020370C4
020370C6
020370C8
020370CA
020370CC
020370CE
020370D0
020370D2
020370D4
020370D6
020370D8
020370DA
020370DC
020370DE
020370E0
020370F0
020370F4
020370F5
020370F6
020370FF
02037100
02037101
02037104
02037108
020371F8
020371FA
02037218
02037238
02037258
02037278
02037398
020373F8
02037408
020375F8
020375FA
02037638
020376B0
020377F8
02037850
020379F8
02037AB8
02037AC8
02037ACC
02037ECC
02037ED0
02037ED4
02037ED8
02037EDC
02037EE0
02037EE1
02037EE2
02037EE3
02037EE4
02037EE8
02037EEC
02037EEE
02037EFE
02037F00
02037F02
02037F12
02037F14
02037F16
02037F17
02037F18
02037F1A
02037F1B
02037F1C
02037F24
02037F28
02037F30
02037F34
02038134
02038208
02038394
02038684
020386A4
020386A8
020386AC
020386AE
020386B0
020386B4
020386B8
020386BC
020386C0
020386C4
020386C8
020386CC
020386D0
020386DC
020386E0
02038700
02038702
02038704
02038980
02038E80
02038FC0
02039600
0203961C
02039620
02039624
02039638
0203963A
02039654
020397A4
020397A8
020397AC
020397B0
020397B4
020397B5
020397B6
020397B7
020397B8
020397BA
020397BC
02039820
02039821
02039822
02039823
02039824
02039825
02039826
02039828
0203982C
02039830
02039870
02039874
02039878
02039879
02039882
02039884
02039888
0203988C
020398A4
020398AC
020398B4
020398B8
020398BA
02039934
02039942
02039950
02039954
02039958
0203995C
02039960
02039964
02039968
0203996C
02039984
02039988
0203998C
02039990
02039994
02039996
02039998
0203999C
020399A4
020399B4
020399B8
020399BC
020399C0
020399C4
020399C8
020399CC
020399D0
020399D4
020399D8
020399DC
020399E0
020399E4
020399E8
020399EC
020399F0
020399FC
02039A00
02039A04
02039A0C
02039A0E
02039A10
02039A14
02039A18
02039A1A
02039A1B
02039A1C
02039A20
02039A24
02039A28
02039A2C
02039A30
02039A34
02039A38
0203A066
0203AA3C
0203AAB0
0203AAB4
0203AAB8
0203AABC
0203AAC0
0203AAC4
0203AAC6
0203AAD4
0203AB00
0203AB02
0203AB04
0203AB06
0203AB08
0203AB0A
0203AB0C
0203AB0E
0203AB10
0203AB12
0203AB14
0203AB16
0203AB18
0203AB1A
0203AB1C
0203AB1E
0203AB20
0203AB22
0203AB24
0203AB28
0203AB2C
0203AB30
0203AB34
0203AB38
0203AB3C
0203AB40
0203AB44
0203AB48
0203AB4C
0203AB50
0203AB54
0203AB58
0203AB5C
0203AB60
0203ABE0
0203ABE4
0203ABE8
0203ABEC
0203ABED
0203ABF0
0203AC08
0203ACE4
0203ACE8
0203ACEC
0203ACF0
0203ACF4
0203ACFC
0203AD02
0203AD04
0203AD0A
0203AD10
0203AD14
0203AD18
0203AD1C
0203AD20
0203AD24
0203AD28
0203AD2C
0203AD30
0203AD34
0203AD40
0203AD58
0203ADB8
0203ADBC
0203ADC0
0203ADC4
0203ADC8
0203ADCC
0203ADD0
0203ADD8
0203ADDC
0203ADE0
0203ADE4
0203ADF0
0203ADF2
0203ADF3
0203ADF4
0203ADF8
0203ADF9
0203ADFA
0203ADFC
0203ADFE
0203AE04
0203AE08
0203AE0C
0203AE8C
0203AE90
0203AE94
0203AE98
0203AF98
0203AF9A
0203B01A
0203B01C
0203B01E
0203B020
0203B024
0203B044
0203B048
0203B049
0203B04A
0203B04B
0203B04C
0203B058
0203B059
0203B05C
0203B064
0203B068
0203B06A
0203B06C
0203B084
0203B088
0203B08C
0203B090
0203B094
0203B098
0203B09C
0203B0A0
0203B0A9
0203B0AE
0203B0B4
0203B0B8
0203B0BC
0203B0C0
0203B0C1
0203B0C4
0203B0C8
0203B0CC
0203B0D0
0203B0D4
0203B0D8
0203B0DC
0203B0E0
0203B0E4
0203B0E8
0203B0EC
0203B0EE
0203B0F0
0203B0F4
0203B0F8
0203B0FC
0203B100
0203B104
0203B108
0203B10C
0203B116
0203B118
0203B11C
0203B120
0203B124
0203B128
0203B12C
0203B130
0203B140
0203B144
0203B148
0203B158
0203B15C
0203B160
0203B164
0203B168
0203B16C
0203B16D
0203B16E
0203B170
0203B174
0203F174
0203F175
0203F176
0203F177
0203F178
0203F18A
0203F190
0203F1AC
0203F34C
0203F36C
0203F370
0203F37A
0203F37C
0203F380
0203F384
0203F388
0203F38C
0203F39C
0203F3A0
0203F3A4
0203F3A8
0203F3AE
0203F3B0
0203F3B8
0203F3BC
0203F3C0
0203F3C4
0203F3C8
0203F3CC
0203F3D0
0203F3D4
0203F3D8
0203F3DC
0203F3E0
0203F3E4
0203F3F8
0203F400
0203F42C
0203F43C
0203F440
0203F444
0203F44A
0203F450
0203F454
0203F458
0203F45C
0203F464
0203F754
0203F758
0203F76C
0203F774
0203FB74
0203FB78
0203FB7C
0203FB80
0203FB84
0203FB88
0203FC00

As for Emerald, the whole 0x0203XXXX area is mostly used by the game already. So my suggestion is to try the 0x0202XXXX area, in particular anything between 0x02027000 - 0x02027FFF, or 0x0202A000 - 0x0202AFFF, or 0x0202D000 - 0x0202DFFF, or 0x0202F000 - 0x0202FFFF.

Code:
02020000
02020001
02020004
020200AC
020200C6
020200FF
02020100
02020101
02020102
02020103
02020180
02020184
02020188
0202018C
020201B0
02020201
02020202
02020203
0202022F
02020242
02020243
02020244
020202F0
02020400
02020401
0202043F
020204C0
020204FF
02020609
02020630
02020638
0202064C
0202065E
02020706
02020810
02020815
02020827
02020857
02020859
0202085C
020208A6
02020908
02020E00
02021774
020217F4
02021834
02021835
02021838
02021B38
02021B3A
02021B3C
02021BBC
02021BBE
02021BC0
02021CC0
02021CC4
02021DC4
02021EC4
02021FC4
02022212
020223AC
020223BC
020223BD
020223C0
020223C4
020223C8
020228C4
020229C4
020229C6
020229C8
020229CC
020229E8
020229F0
02022A0C
02022A74
02022B00
02022B08
02022B0C
02022B10
02022B14
02022B22
02022B2C
02022B44
02022C20
02022C2C
02022C2D
02022C30
02022C38
02022C3C
02022C3E
02022C40
02022C58
02022C60
02022C64
02022C68
02022C6C
02022C70
02022C74
02022C78
02022C7C
02022C80
02022C84
02022C88
02022C8C
02022C90
02022C94
02022C98
02022C9C
02022CB0
02022CB8
02022CE4
02022CF4
02022CF8
02022CFC
02022D00
02022D04
02022D06
02022D08
02022D09
02022D0A
02022D0C
02022D10
02022E10
02022E14
02022E16
02022E18
02022E1A
02022E1C
02022E1E
02022E20
02022E22
02022E24
02022E26
02022E28
02022E2A
02022E2C
02022F58
02022F5A
02022F5C
02022F68
02022F6A
02022F78
02022F88
02022FEC
02022FF0
02022FF4
02022FF8
02023058
0202305C
02023060
02023064
02023066
02023067
02023068
020235DB
020237AA
02023864
02023868
02024064
02024068
0202406C
0202406E
02024076
0202407A
0202407E
02024082
02024083
02024084
02024090
0202409C
020240A8
020240AC
020240B4
020240CC
020240D0
020240D4
020241E4
020241E8
020241E9
020241EA
020241EC
020241EE
020241F0
020241F1
020241F3
020241F4
020241F8
02024208
0202420A
0202420B
0202420C
0202420D
0202420E
0202420F
02024210
02024211
02024212
02024214
0202421C
02024220
02024230
02024240
02024248
02024250
02024258
02024260
02024268
02024270
02024274
0202427C
02024280
02024284
02024288
0202428C
0202428E
02024294
020242AC
020242BC
0202432C
0202432E
02024330
02024332
02024333
02024335
02024337
0202433A
0202433C
0202437C
020243CC
020243D0
020243FC
020243FE
02024400
02024402
02024404
0202440C
02024474
02024478
0202447C
02024482
02024483
02024484
02024487
02024488
0202448A
0202448B
0202448C
0202448D
0202448E
0202448F
02024492
0202449C
020244A0
020244A4
020244A8
020244AC
020244B0
020244B4
020244B8
020244B9
020244BC
020244CC
020244D0
020244D4
020244D8
020244DC
020244E0
020244E2
020244E4
020244E8
020244E9
020244EA
020244EC
02024550
020245B4
02024618
0202467C
020246E0
02024744
020247A8
0202480C
02024870
020248D4
02024938
0202499C
020249B4
020249BC
020249C0
020249C4
02024A28
02024A30
02024A38
02024A4C
02024A54
02024C08
02025301
02025A00
02025E62
02026B6C
02026C04
0202800D
02029808
0202BF21
0202CAAC
0202E82A

As for R/S, the whole are between 0x0203B000 - 0x0x0203DFFF should be safe.

Code:
02030000
02030001
02030004
02030009
02030012
02030014
0203001C
02030020
02030022
02030023
02030028
0203002F
02030032
02030034
02030040
02030043
02030044
02030050
0203005F
02030064
02030066
02030073
02030077
0203007E
020300A0
020300A4
020300AC
020300CC
020300DD
020300DF
020300F9
02030101
02030104
02030120
02030200
02030202
02030203
02030206
02030208
0203022F
0203025F
0203026F
020302B3
02030303
02030400
02030401
02030405
0203043F
020304C0
020304FF
02030502
0203050A
02030604
02030647
02030800
0203081D
0203083D
02030908
02030A27
02030DD2
02030DDD
0203100E
02031016
02031022
0203104A
02031068
0203106F
02031096
02032053
020320CE
0203281E
02032EAA
020330D2
020330D5
020330EE
0203323F
02033301
020340FB
02034B41
02035046
02035100
02037044
02037850
02038208
020383E4
02038470
02038473
02038474
02038478
0203847C
0203847D
0203847E
0203847F
02038480
020384E4
020384E5
020384E6
020384E7
020384E8
020384E9
020384EA
020384EC
020384F0
020384F4
020384F8
02038538
0203853C
02038540
02038544
02038550
02038554
02038558
02038559
0203855A
0203855B
0203855C
0203855E
02038560
02038561
02038562
02038563
02038564
02038568
0203856C
02038570
02038572
0203857D
0203858E
02038596
02038670
02038678
02038680
02038688
02038690
02038694
02038695
02038696
0203869A
0203869B
0203869C
0203869E
020386A0
020386A4
020386A8
020386AA
02038724
02038730
02038731
02038734
02038738
020387B0
020387B1
020387B2
020387B3
020387B4
020387D8
020387D9
020387DC
020387E0
020387E2
020387E4
020387E8
020387EC
020387F0
02038800
02038804
02038808
0203880A
0203880C
02038814
020388AC
020388B0
020388B4
020388B8
020388BC
020388C0
020388C4
020388CC
020388D0
020388D4
020388D5
020388D6
020388E6
020388F2
020388F3
020388F4
020388F5
020388F6
020388F7
02038900
02038984
02039184
020391A4
020391A6
020391A8
020391A9
020391AA
020391AC
020391B4
02039234
02039238
0203923C
02039244
02039248
0203924C
02039250
02039251
02039254
02039258
02039259
0203925A
0203925B
0203925C
02039260
02039262
02039264
02039266
02039268
0203926A
0203926C
02039270
02039274
02039278
02039279
0203927A
0203927B
0203927C
0203927D
02039284
02039288
020392FC
02039302
02039304
02039308
0203930C
02039310
02039312
02039314
02039318
0203931A
0203931C
02039320
02039322
02039324
02039325
02039328
0203932A
0203932C
0203932E
02039338
0203933C
0203933E
02039350
02039358
0203935A
0203935C
02039360
02039460
02039629
02039760
0203A360
0203A380
0203A3D0
0203A3D1
0203A3D2
0203A3D3
0203A3D4
0203A602
0203E006
0203E0ED
0203F07F

Although I made those lists as accurate as possible, please note that they're only approximative; testing is always a must. Especially if you're using R/S/E, because I didn't test them.
 
Last edited:
2,048
Posts
16
Years
  • Age 31
  • Seen Sep 7, 2023
Not really that advanced compared to what you guys have been up to, but I was asked whether I knew where Steven's double battle team in Emerald was located. A bit of digging later, and I found it. It's not quite in the same format as normal trainers.

Metang: 0x5dd6d0
Skarmory: 0x5dd6e4
Aggron: 0x5dd6f8

Format:
Species (2 bytes)
IVs (1 byte)
Level (1 byte)
Nature? (1 byte) - unconfirmed; check this (Metang should be Lonely, Skarmory Impish, and Aggron Adamant)?
EVs? (6 bytes) - unconfirmed; check this?
Padding (1 byte)
Moves (8 bytes)

Unlike ordinary trainers (as far as I can remember), Steven's data appears to include nature and EVs. I bet this could be used to add opposing trainers with stronger Pokémon somehow.

Anyway, a question: this isn't really useful for ROM hacking, but it's related. Could somebody find the formula used to calculate the PIDs of eggs in Emerald if the mother is holding an Everstone? I know the formula without the Everstone already, but I'm stumped as to what happens when one is used.
 

colcolstyles

Yours truly
1,588
Posts
15
Years
If anyone's interested, here's a tiny little morsel of information that I found recently. At the address '0x3A72A0' in Fire Red, you will find two bytes: '0xCD' and '0xFF'. These two bytes are used whenever the player is given two or more of some item using the 'giveitem' construct. The '0xCD' corresponds to an uppercase 'S' while the '0xFF' is the terminator byte, signifying the end of the string. If you change the byte from '0xCD' to '0xE7', the 'S' will become a lowercase 's'. I figure this might come in handy for those de-capitalization patches because it's really annoying to see "Player received the Poké BallS!" every time the player receives more than one of an item.
 
106
Posts
15
Years
  • Seen May 29, 2019
Realistically, how much work would be needed to change the 64x64 pixel limit in the 3rd generation games to the 80x80 pixel limit used in the 4th generation games? Please don't tell me it's hard or a lot of work. I'm genuinely interested in what would have to be done to increase the limit as it would be extremely beneficial to lots of people, especially as it would allow much higher quality sprites to be used as well as being able to import the 4th and 5th generation pokémon without (too much) resizing.
 

Shiny Quagsire

I'm Still Alive, Elsewhere
697
Posts
14
Years
Realistically, how much work would be needed to change the 64x64 pixel limit in the 3rd generation games to the 80x80 pixel limit used in the 4th generation games? Please don't tell me it's hard or a lot of work. I'm genuinely interested in what would have to be done to increase the limit as it would be extremely beneficial to lots of people, especially as it would allow much higher quality sprites to be used as well as being able to import the 4th and 5th generation pokémon without (too much) resizing.

You would need to modify the games ASM code, which would be a pain and would be way too hard. And, the sprites would go outside the picture box in the status screen. In other words, it's really hard, and it's just not worth it.
 
Back
Top