summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBryan Bishop <kanzure@gmail.com>2013-11-13 19:02:23 -0600
committerBryan Bishop <kanzure@gmail.com>2013-11-13 19:02:23 -0600
commit8be80027e87c80678b1d0a453c866d79a9af47b2 (patch)
tree13a5469cedb76fd2c52dddd7efbbbcf5118c6be3
parentb44e7b6dee19c9029e68747315e4fc84e741a86b (diff)
parent4a002c193b2225f9e370bf640b0c547252e42cd1 (diff)
Merge branch 'master' into battle-handling
-rw-r--r--pokemontools/data/__init__.py15
-rw-r--r--pokemontools/data/pokecrystal/wram.asm2293
-rw-r--r--pokemontools/vba/vba.py2
-rw-r--r--pokemontools/wram.py17
4 files changed, 2327 insertions, 0 deletions
diff --git a/pokemontools/data/__init__.py b/pokemontools/data/__init__.py
new file mode 100644
index 0000000..fcc59e9
--- /dev/null
+++ b/pokemontools/data/__init__.py
@@ -0,0 +1,15 @@
+"""
+Access to data files.
+"""
+
+# hide the os import
+import os as _os
+
+# path to where these files are located
+path = _os.path.abspath(_os.path.dirname(__file__))
+
+def join(filename, path=path):
+ """
+ Construct the absolute path to the file.
+ """
+ return _os.path.join(path, filename)
diff --git a/pokemontools/data/pokecrystal/wram.asm b/pokemontools/data/pokecrystal/wram.asm
new file mode 100644
index 0000000..3796969
--- /dev/null
+++ b/pokemontools/data/pokecrystal/wram.asm
@@ -0,0 +1,2293 @@
+SECTION "tiles0",VRAM[$8000],BANK[0]
+VTiles0:
+SECTION "tiles1",VRAM[$8800],BANK[0]
+VTiles1:
+SECTION "tiles2",VRAM[$9000],BANK[0]
+VTiles2:
+SECTION "bgmap0",VRAM[$9800],BANK[0]
+VBGMap0:
+SECTION "bgmap1",VRAM[$9C00],BANK[0]
+VBGMap1:
+
+
+
+SECTION "WRAMBank0",WRAM0[$c000]
+
+SECTION "stack",WRAM0[$c0ff]
+Stack: ; c0ff
+ ds -$100
+
+
+SECTION "audio",WRAM0[$c100]
+MusicPlaying: ; c100
+; nonzero if playing
+ ds 1
+
+Channels:
+Channel1:
+Channel1MusicID: ; c101
+ ds 2
+Channel1MusicBank: ; c103
+ ds 1
+Channel1Flags: ; c104
+; 0: on/off
+; 1: subroutine
+; 2:
+; 3:
+; 4: noise sampling on/off
+; 5:
+; 6:
+; 7:
+ ds 1
+Channel1Flags2: ; c105
+; 0: vibrato on/off
+; 1:
+; 2: duty cycle on/off
+; 3:
+; 4:
+; 5:
+; 6:
+; 7:
+ ds 1
+Channel1Flags3: ; c106
+; 0: vibrato up/down
+; 1:
+; 2:
+; 3:
+; 4:
+; 5:
+; 6:
+; 7:
+ ds 1
+Channel1MusicAddress: ; c107
+ ds 2
+Channel1LastMusicAddress: ; c109
+ ds 2
+; could have been meant as a third-level address
+ ds 2
+Channel1NoteFlags: ; c10d
+; 0:
+; 1:
+; 2:
+; 3:
+; 4:
+; 5: rest
+; 6:
+; 7:
+ ds 1
+Channel1Condition: ; c10e
+; used for conditional jumps
+ ds 1
+Channel1DutyCycle: ; c10f
+; uses top 2 bits only
+; 0: 12.5%
+; 1: 25%
+; 2: 50%
+; 3: 75%
+ ds 1
+Channel1Intensity: ; c110
+; hi: pressure
+; lo: velocity
+ ds 1
+Channel1Frequency:
+; 11 bits
+Channel1FrequencyLo: ; c111
+ ds 1
+Channel1FrequencyHi: ; c112
+ ds 1
+Channel1Pitch: ; c113
+; 0: rest
+; 1: C
+; 2: C#
+; 3: D
+; 4: D#
+; 5: E
+; 6: F
+; 7: F#
+; 8: G
+; 9: G#
+; a: A
+; b: A#
+; c: B
+ ds 1
+Channel1Octave: ; c114
+; 0: highest
+; 7: lowest
+ ds 1
+Channel1StartingOctave: ; c115
+; raises existing octaves by this value
+; used for repeating phrases in a higher octave to save space
+ ds 1
+Channel1NoteDuration: ; c116
+; number of frames remaining in the current note
+ ds 1
+; c117
+ ds 1
+; c118
+ ds 1
+Channel1LoopCount: ; c119
+ ds 1
+Channel1Tempo: ; c11a
+ ds 2
+Channel1Tracks: ; c11c
+; hi: l
+; lo: r
+ ds 1
+; c11d
+ ds 1
+
+Channel1VibratoDelayCount: ; c11e
+; initialized at the value in VibratoDelay
+; decrements each frame
+; at 0, vibrato starts
+ ds 1
+Channel1VibratoDelay: ; c11f
+; number of frames a note plays until vibrato starts
+ ds 1
+Channel1VibratoExtent: ; c120
+; difference in
+ ds 1
+Channel1VibratoRate: ; c121
+; counts down from a max of 15 frames
+; over which the pitch is alternated
+; hi: init frames
+; lo: frame count
+ ds 1
+
+; c122
+ ds 1
+; c123
+ ds 1
+; c124
+ ds 1
+; c125
+ ds 1
+; c126
+ ds 1
+; c127
+ ds 1
+Channel1CryPitch: ; c128
+ ds 1
+Channel1CryEcho: ; c129
+ ds 1
+ ds 4
+Channel1NoteLength: ; c12e
+; # frames per 16th note
+ ds 1
+; c12f
+ ds 1
+; c130
+ ds 1
+; c131
+ ds 1
+; c132
+ ds 1
+; end
+
+Channel2: ; c133
+ ds 50
+Channel3: ; c165
+ ds 50
+Channel4: ; c197
+ ds 50
+
+SFXChannels:
+Channel5: ; c1c9
+ ds 50
+Channel6: ; c1fb
+ ds 50
+Channel7: ; c22d
+ ds 50
+Channel8: ; c25f
+ ds 50
+
+; c291
+ ds 1
+; c292
+ ds 1
+; c293
+ ds 1
+; c294
+ ds 1
+; c295
+ ds 1
+; c296
+ ds 1
+; c297
+ ds 1
+
+CurMusicByte: ; c298
+ ds 1
+CurChannel: ; c299
+ ds 1
+Volume: ; c29a
+; corresponds to $ff24
+; Channel control / ON-OFF / Volume (R/W)
+; bit 7 - Vin->SO2 ON/OFF
+; bit 6-4 - SO2 output level (volume) (# 0-7)
+; bit 3 - Vin->SO1 ON/OFF
+; bit 2-0 - SO1 output level (volume) (# 0-7)
+ ds 1
+SoundOutput: ; c29b
+; corresponds to $ff25
+; bit 4-7: ch1-4 so2 on/off
+; bit 0-3: ch1-4 so1 on/off
+ ds 1
+SoundInput: ; c29c
+; corresponds to $ff26
+; bit 7: global on/off
+; bit 0: ch1 on/off
+; bit 1: ch2 on/off
+; bit 2: ch3 on/off
+; bit 3: ch4 on/off
+ ds 1
+
+MusicID:
+MusicIDLo: ; c29d
+ ds 1
+MusicIDHi: ; c29e
+ ds 1
+MusicBank: ; c29f
+ ds 1
+NoiseSampleAddress:
+NoiseSampleAddressLo: ; c2a0
+ ds 1
+NoiseSampleAddressHi: ; c2a1
+ ds 1
+; noise delay? ; c2a2
+ ds 1
+; c2a3
+ ds 1
+MusicNoiseSampleSet: ; c2a4
+ ds 1
+SFXNoiseSampleSet: ; c2a5
+ ds 1
+Danger: ; c2a6
+; bit 7: on/off
+; bit 4: pitch
+; bit 0-3: counter
+ ds 1
+MusicFade: ; c2a7
+; fades volume over x frames
+; bit 7: fade in/out
+; bit 0-5: number of frames for each volume level
+; $00 = none (default)
+ ds 1
+MusicFadeCount: ; c2a8
+ ds 1
+MusicFadeID:
+MusicFadeIDLo: ; c2a9
+ ds 1
+MusicFadeIDHi: ; c2aa
+ ds 1
+ ds 5
+CryPitch: ; c2b0
+ ds 1
+CryEcho: ; c2b1
+ ds 1
+CryLength: ; c2b2
+ ds 2
+LastVolume: ; c2b4
+ ds 1
+ ds 1
+SFXPriority: ; c2b6
+; if nonzero, turn off music when playing sfx
+ ds 1
+ ds 6
+CryTracks: ; c2bd
+; plays only in left or right track depending on what side the monster is on
+; both tracks active outside of battle
+ ds 1
+ ds 1
+CurSFX: ; c2bf
+; id of sfx currently playing
+ ds 1
+CurMusic: ; c2c0
+; id of music currently playing
+ ds 1
+
+SECTION "auto",WRAM0[$c2c7]
+InputType: ; c2c7
+ ds 1
+AutoInputAddress: ; c2c8
+ ds 2
+AutoInputBank: ; c2ca
+ ds 1
+AutoInputLength: ; c2cb
+ ds 1
+
+SECTION "linkbattle",WRAM0[$c2dc]
+InLinkBattle: ; c2dc
+; 0 not in link battle
+; 1 link battle
+; 4 mobile battle
+ ds 1
+
+SECTION "scriptengine",WRAM0[$c2dd]
+ScriptVar: ; c2dd
+ ds 1
+
+
+SECTION "tiles",WRAM0[$c2fa]
+TileDown: ; c2fa
+ ds 1
+TileUp: ; c2fb
+ ds 1
+TileLeft: ; c2fc
+ ds 1
+TileRight: ; c2fd
+ ds 1
+
+TilePermissions: ; c2fe
+; set if tile behavior prevents
+; you from walking in that direction
+; bit 3: down
+; bit 2: up
+; bit 1: left
+; bit 0: right
+ ds 1
+
+SECTION "icons",WRAM0[$c3b6]
+
+CurIcon: ; c3b6
+ ds 1
+
+SECTION "gfx",WRAM0[$c400]
+
+Sprites: ; c400
+; 4 bytes per sprite
+; 40 sprites
+; struct:
+; y in pixels
+; x in pixels
+; tile id
+; attributes:
+; bit 7: priority
+; bit 6: y flip
+; bit 5: x flip
+; bit 4: pal # (non-cgb)
+; bit 3: vram bank (cgb only)
+; bit 2-0: pal # (cgb only)
+ ds 160
+SpritesEnd:
+
+TileMap: ; c4a0
+; 20x18 grid of 8x8 tiles
+ ds 360
+
+
+SECTION "BattleMons",WRAM0[$c608]
+
+EnemyMoveStruct:
+EnemyMoveAnimation: ; c608
+ ds 1
+EnemyMoveEffect: ; c609
+ ds 1
+EnemyMovePower: ; c60a
+ ds 1
+EnemyMoveType: ; c60b
+ ds 1
+EnemyMoveAccuracy: ; c60c
+ ds 1
+EnemyMovePP: ; c60d
+ ds 1
+EnemyMoveEffectChance: ; c60e
+ ds 1
+
+PlayerMoveStruct:
+PlayerMoveAnimation: ; c60f
+ ds 1
+PlayerMoveEffect: ; c610
+ ds 1
+PlayerMovePower: ; c611
+ ds 1
+PlayerMoveType: ; c612
+ ds 1
+PlayerMoveAccuracy: ; c613
+ ds 1
+PlayerMovePP: ; c614
+ ds 1
+PlayerMoveEffectChance: ; c615
+ ds 1
+
+EnemyMonNick: ; c616
+ ds 11
+BattleMonNick: ; c621
+ ds 11
+
+
+BattleMonSpecies: ; c62c
+ ds 1
+BattleMonItem: ; c62d
+ ds 1
+
+BattleMonMoves:
+BattleMonMove1: ; c62e
+ ds 1
+BattleMonMove2: ; c62f
+ ds 1
+BattleMonMove3: ; c630
+ ds 1
+BattleMonMove4: ; c631
+ ds 1
+
+BattleMonDVs:
+BattleMonAtkDefDV: ; c632
+ ds 1
+BattleMonSpdSpclDV: ; c633
+ ds 1
+
+BattleMonPP:
+BattleMonPPMove1: ; c634
+ ds 1
+BattleMonPPMove2: ; c635
+ ds 1
+BattleMonPPMove3: ; c636
+ ds 1
+BattleMonPPMove4: ; c637
+ ds 1
+
+BattleMonHappiness: ; c638
+ ds 1
+BattleMonLevel: ; c639
+ ds 1
+
+BattleMonStatus: ; c63a
+ ds 2
+
+BattleMonHP: ; c63c
+ ds 2
+BattleMonMaxHP: ; c63e
+ ds 2
+
+BattleMonAtk: ; c640
+ ds 2
+BattleMonDef: ; c642
+ ds 2
+BattleMonSpd: ; c644
+ ds 2
+BattleMonSpclAtk: ; c646
+ ds 2
+BattleMonSpclDef: ; c648
+ ds 2
+
+BattleMonType1: ; c64a
+ ds 1
+BattleMonType2: ; c64b
+ ds 1
+
+ ds 10
+
+OTName: ; c656
+ ds 13
+
+CurOTMon: ; c663
+ ds 1
+
+ ds 1
+
+TypeModifier: ; c665
+; >10: super-effective
+; 10: normal
+; <10: not very effective
+
+; bit 7: stab
+ ds 1
+
+CriticalHit: ; c666
+; nonzero for a critical hit
+ ds 1
+
+AttackMissed: ; c667
+; nonzero for a miss
+ ds 1
+
+PlayerSubStatus1: ; c668
+; bit
+; 7 attract
+; 6 encore
+; 5 endure
+; 4 perish song
+; 3 identified
+; 2 protect
+; 1 curse
+; 0 nightmare
+ ds 1
+PlayerSubStatus2: ; c669
+; bit
+; 7
+; 6
+; 5
+; 4
+; 3
+; 2
+; 1
+; 0 curled
+ ds 1
+PlayerSubStatus3: ; c66a
+; bit
+; 7 confused
+; 6 flying
+; 5 underground
+; 4 charged
+; 3 flinch
+; 2
+; 1 rollout
+; 0 bide
+ ds 1
+PlayerSubStatus4: ; c66b
+; bit
+; 7 leech seed
+; 6 rage
+; 5 recharge
+; 4 substitute
+; 3
+; 2 focus energy
+; 1 mist
+; 0 bide: unleashed energy
+ ds 1
+PlayerSubStatus5: ; c66c
+; bit
+; 7 cant run
+; 6 destiny bond
+; 5 lock-on
+; 4
+; 3
+; 2
+; 1
+; 0 toxic
+ ds 1
+
+EnemySubStatus1: ; c66d
+; see PlayerSubStatus1
+ ds 1
+EnemySubStatus2: ; c66e
+; see PlayerSubStatus2
+ ds 1
+EnemySubStatus3: ; c66f
+; see PlayerSubStatus3
+ ds 1
+EnemySubStatus4: ; c670
+; see PlayerSubStatus4
+ ds 1
+EnemySubStatus5: ; c671
+; see PlayerSubStatus5
+ ds 1
+
+PlayerRolloutCount: ; c672
+ ds 1
+PlayerConfuseCount: ; c673
+ ds 1
+ ds 1
+PlayerDisableCount: ; c675
+ ds 1
+PlayerEncoreCount: ; c676
+ ds 1
+PlayerPerishCount: ; c677
+ ds 1
+PlayerFuryCutterCount: ; c678
+ ds 1
+PlayerProtectCount: ; c679
+ ds 1
+
+EnemyRolloutCount: ; c67a
+ ds 1
+EnemyConfuseCount: ; c67b
+ ds 1
+ ds 1
+EnemyDisableCount: ; c67d
+ ds 1
+EnemyEncoreCount: ; c67e
+ ds 1
+EnemyPerishCount: ; c67f
+ ds 1
+EnemyFuryCutterCount: ; c680
+ ds 1
+EnemyProtectCount: ; c681
+ ds 1
+
+PlayerDamageTaken: ; c682
+ ds 2
+EnemyDamageTaken: ; c684
+ ds 2
+
+ ds 3
+
+ ds 1
+
+BattleScriptBuffer: ; c68a
+ ds 40
+
+BattleScriptBufferLoc: ; c6b2
+ ds 2
+
+ ds 2
+
+PlayerStats: ; c6b6
+ ds 10
+ ds 1
+EnemyStats: ; c6c1
+ ds 10
+ ds 1
+
+PlayerStatLevels: ; c6cc
+; 07 neutral
+PlayerAtkLevel: ; c6cc
+ ds 1
+PlayerDefLevel: ; c6cd
+ ds 1
+PlayerSpdLevel: ; c6ce
+ ds 1
+PlayerSAtkLevel: ; c6cf
+ ds 1
+PlayerSDefLevel: ; c6d0
+ ds 1
+PlayerAccLevel: ; c6d1
+ ds 1
+PlayerEvaLevel: ; c6d2
+ ds 1
+; c6d3
+ ds 1
+PlayerStatLevelsEnd:
+
+EnemyStatLevels: ; c6d4
+; 07 neutral
+EnemyAtkLevel: ; c6d4
+ ds 1
+EnemyDefLevel: ; c6d5
+ ds 1
+EnemySpdLevel: ; c6d6
+ ds 1
+EnemySAtkLevel: ; c6d7
+ ds 1
+EnemySDefLevel: ; c6d8
+ ds 1
+EnemyAccLevel: ; c6d9
+ ds 1
+EnemyEvaLevel: ; c6da
+ ds 1
+; c6db
+ ds 1
+
+EnemyTurnsTaken: ; c6dc
+ ds 1
+PlayerTurnsTaken: ; c6dd
+ ds 1
+
+ ds 5
+
+CurPlayerMove: ; c6e3
+ ds 1
+CurEnemyMove: ; c6e4
+ ds 1
+
+LinkBattleRNCount: ; c6e5
+; how far through the prng stream
+ ds 1
+
+ ds 3
+
+CurEnemyMoveNum: ; c6e9
+ ds 1
+
+ ds 10
+
+AlreadyDisobeyed: ; c6f4
+ ds 1
+
+DisabledMove: ; c6f5
+ ds 1
+EnemyDisabledMove: ; c6f6
+ ds 1
+ ds 1
+
+; exists so you can't counter on switch
+LastEnemyCounterMove: ; c6f8
+ ds 1
+LastPlayerCounterMove: ; c6f9
+ ds 1
+
+ ds 1
+
+AlreadyFailed: ; c6fb
+ ds 1
+
+ ds 3
+
+PlayerScreens: ; c6ff
+; bit
+; 4 reflect
+; 3 light screen
+; 2 safeguard
+; 0 spikes
+ ds 1
+
+EnemyScreens: ; c700
+; see PlayerScreens
+ ds 1
+
+ ds 1
+
+PlayerLightScreenCount: ; c702
+ ds 1
+PlayerReflectCount: ; c703
+ ds 1
+
+ ds 2
+
+EnemyLightScreenCount: ; c706
+ ds 1
+EnemyReflectCount: ; c707
+ ds 1
+
+ ds 2
+
+Weather: ; c70a
+; 00 normal
+; 01 rain
+; 02 sun
+; 03 sandstorm
+; 04 rain stopped
+; 05 sunliight faded
+; 06 sandstorm subsided
+ ds 1
+
+WeatherCount: ; c70b
+; # turns remaining
+ ds 1
+
+LoweredStat: ; c70c
+ ds 1
+EffectFailed: ; c70d
+ ds 1
+FailedMessage: ; c70e
+ ds 1
+
+ ds 3
+
+PlayerUsedMoves: ; c712
+; add a move that has been used once by the player
+; added in order of use
+ ds 4
+
+ ds 5
+
+LastPlayerMove: ; c71b
+ ds 1
+LastEnemyMove: ; c71c
+ ds 1
+
+
+SECTION "battle",WRAM0[$c734]
+BattleEnded: ; c734
+ ds 1
+
+
+SECTION "overworldmap",WRAM0[$c800]
+OverworldMap: ; c800
+ ds 1300
+OverworldMapEnd:
+
+ ds 12
+
+SECTION "gfx2",WRAM0[$cd20]
+CreditsPos:
+BGMapBuffer: ; cd20
+ ds 2
+CreditsTimer: ; cd22
+ ds 1
+ ds 37
+
+BGMapPalBuffer: ; cd48
+ ds 40
+
+BGMapBufferPtrs: ; cd70
+; 20 bg map addresses (16x8 tiles)
+ ds 40
+
+SGBPredef: ; cd98
+ ds 1
+PlayerHPPal: ; cd99
+ ds 1
+EnemyHPPal: ; cd9a
+ ds 1
+
+ ds 62
+
+AttrMap: ; cdd9
+; 20x18 grid of palettes for 8x8 tiles
+; read horizontally from the top row
+; bit 3: vram bank
+; bit 0-2: palette id
+ ds 360
+
+ ds 30
+
+MonType: ; cf5f
+ ds 1
+
+CurSpecies: ; cf60
+ ds 1
+
+ ds 6
+
+Requested2bpp: ; cf67
+ ds 1
+Requested2bppSource: ; cf68
+ ds 2
+Requested2bppDest: ; cf6a
+ ds 2
+
+Requested1bpp: ; cf6c
+ ds 1
+Requested1bppSource: ; cf6d
+ ds 2
+Requested1bppDest: ; cf6f
+ ds 2
+
+ ds 3
+
+MenuSelection:; cf74
+ ds 1
+
+
+
+SECTION "VBlank",WRAM0[$cfb1]
+OverworldDelay: ; cfb1
+ ds 1
+TextDelayFrames: ; cfb2
+ ds 1
+VBlankOccurred: ; cfb3
+ ds 1
+
+PredefID: ; cfb4
+ ds 1
+PredefTemp: ; cfb5
+ ds 2
+PredefAddress: ; cfb7
+ ds 2
+
+ ds 3
+
+GameTimerPause: ; cfbc
+; bit 0
+ ds 1
+
+SECTION "Engine",WRAM0[$cfc2]
+FXAnimID:
+FXAnimIDLo: ; cfc2
+ ds 1
+FXAnimIDHi: ; cfc3
+ ds 1
+
+ ds 2
+
+TileAnimationTimer: ; cfc6
+ ds 1
+
+ ds 5
+
+Options: ; cfcc
+; bit 0-2: number of frames to delay when printing text
+; fast 1; mid 3; slow 5
+; bit 3: ?
+; bit 4: no text delay
+; bit 5: stereo off/on
+; bit 6: battle style shift/set
+; bit 7: battle scene off/on
+ ds 1
+
+ ds 1
+
+TextBoxFrame: ; cfce
+; bits 0-2: textbox frame 0-7
+ ds 1
+
+ ds 1
+
+GBPrinter: ; cfd0
+; bit 0-6: brightness
+; lightest: $00
+; lighter: $20
+; normal: $40 (default)
+; darker: $60
+; darkest: $7F
+ ds 1
+
+Options2: ; cfd1
+; bit 1: menu account off/on
+ ds 1
+
+ ds 46
+
+
+SECTION "WRAMBank1",WRAMX[$d000],BANK[1]
+
+ ds 2
+
+DefaultFlypoint: ; d002
+ ds 1
+; d003
+ ds 1
+; d004
+ ds 1
+StartFlypoint: ; d005
+ ds 1
+EndFlypoint: ; d006
+ ds 1
+
+MovementBuffer: ; d007
+
+ ds 55
+
+MenuItemsList:
+CurFruitTree:
+CurInput:
+EngineBuffer1: ; d03e
+ ds 1
+CurFruit: ; d03f
+ ds 1
+
+MartPointer: ; d040
+ ds 2
+
+MovementAnimation: ; d042
+ ds 1
+
+WalkingDirection: ; d043
+ ds 1
+
+FacingDirection: ; d044
+ ds 1
+
+WalkingX: ; d045
+ ds 1
+WalkingY: ; d046
+ ds 1
+WalkingTile: ; d047
+ ds 1
+
+ ds 43
+
+StringBuffer1: ; d073
+ ds 19
+StringBuffer2: ; d086
+ ds 19
+StringBuffer3: ; d099
+ ds 19
+StringBuffer4: ; d0ac
+ ds 19
+
+ ds 21
+
+CurBattleMon: ; d0d4
+ ds 1
+CurMoveNum: ; d0d5
+ ds 1
+
+ ds 23
+
+VramState: ; d0ed
+; bit 0: overworld sprite updating on/off
+; bit 6: something to do with text
+; bit 7: on when surf initiates
+; flickers when climbing waterfall
+ ds 1
+
+ ds 2
+
+CurMart: ; d0f0
+ ds 16
+CurMartEnd:
+
+ ds 6
+
+CurItem: ; d106
+ ds 1
+
+ ds 1
+
+CurPartySpecies: ; d108
+ ds 1
+
+CurPartyMon: ; d109
+; contains which monster in a party
+; is being dealt with at the moment
+; 0-5
+ ds 1
+
+ ds 4
+
+TempMon:
+TempMonSpecies: ; d10e
+ ds 1
+TempMonItem: ; d10f
+ ds 1
+TempMonMoves: ; d110
+TempMonMove1: ; d110
+ ds 1
+TempMonMove2: ; d111
+ ds 1
+TempMonMove3: ; d112
+ ds 1
+TempMonMove4: ; d113
+ ds 1
+TempMonID: ; d114
+ ds 2
+TempMonExp: ; d116
+ ds 3
+TempMonHPExp: ; d119
+ ds 2
+TempMonAtkExp: ; d11b
+ ds 2
+TempMonDefExp: ; d11d
+ ds 2
+TempMonSpdExp: ; d11f
+ ds 2
+TempMonSpclExp: ; d121
+ ds 2
+TempMonDVs: ; d123
+; hp = %1000 for each dv
+ ds 1 ; atk/def
+ ds 1 ; spd/spc
+TempMonPP: ; d125
+ ds 4
+TempMonHappiness: ; d129
+ ds 1
+TempMonPokerusStatus: ; d12a
+ ds 1
+TempMonCaughtData: ; d12b
+TempMonCaughtTime: ; d12b
+TempMonCaughtLevel: ; d12b
+ ds 1
+TempMonCaughtGender: ; d12c
+TempMonCaughtLocation: ; d12c
+ ds 1
+TempMonLevel: ; d12d
+ ds 1
+TempMonStatus: ; d12e
+ ds 1
+; d12f
+ ds 1
+TempMonCurHP: ; d130
+ ds 2
+TempMonMaxHP: ; d132
+ ds 2
+TempMonAtk: ; d134
+ ds 2
+TempMonDef: ; d136
+ ds 2
+TempMonSpd: ; d138
+ ds 2
+TempMonSpclAtk: ; d13a
+ ds 2
+TempMonSpclDef: ; d13c
+ ds 2
+TempMonEnd: ; d13e
+
+ ds 3
+
+PartyMenuActionText: ; d141
+ ds 1
+ ds 1
+
+CurPartyLevel: ; d143
+ ds 1
+
+
+SECTION "UsedSprites",WRAMX[$d154],BANK[1]
+UsedSprites: ; d154
+ ds 32
+
+SECTION "map",WRAMX[$d19d],BANK[1]
+
+; both are in blocks (2x2 walkable tiles, 4x4 graphics tiles)
+MapHeader: ; d19d
+MapBorderBlock: ; d19d
+ ds 1
+MapHeight: ; d19e
+ ds 1
+MapWidth: ; d19f
+ ds 1
+MapBlockDataBank: ; d1a0
+ ds 1
+MapBlockDataPointer: ; d1a1
+ ds 2
+MapScriptHeaderBank: ; d1a3
+ ds 1
+MapScriptHeaderPointer: ; d1a4
+ ds 2
+MapEventHeaderPointer: ; d1a6
+ ds 2
+; bit set
+MapConnections: ; d1a8
+ ds 1
+NorthMapConnection: ; d1a9
+NorthConnectedMapGroup: ; d1a9
+ ds 1
+NorthConnectedMapNumber: ; d1aa
+ ds 1
+NorthConnectionStripPointer: ; d1ab
+ ds 2
+NorthConnectionStripLocation: ; d1ad
+ ds 2
+NorthConnectionStripLength: ; d1af
+ ds 1
+NorthConnectedMapWidth: ; d1b0
+ ds 1
+NorthConnectionStripYOffset: ; d1b1
+ ds 1
+NorthConnectionStripXOffset: ; d1b2
+ ds 1
+NorthConnectionWindow: ; d1b3
+ ds 2
+
+SouthMapConnection: ; d1b5
+SouthConnectedMapGroup: ; d1b5
+ ds 1
+SouthConnectedMapNumber: ; d1b6
+ ds 1
+SouthConnectionStripPointer: ; d1b7
+ ds 2
+SouthConnectionStripLocation: ; d1b9
+ ds 2
+SouthConnectionStripLength: ; d1bb
+ ds 1
+SouthConnectedMapWidth: ; d1bc
+ ds 1
+SouthConnectionStripYOffset: ; d1bd
+ ds 1
+SouthConnectionStripXOffset: ; d1be
+ ds 1
+SouthConnectionWindow: ; d1bf
+ ds 2
+
+WestMapConnection: ; d1c1
+WestConnectedMapGroup: ; d1c1
+ ds 1
+WestConnectedMapNumber: ; d1c2
+ ds 1
+WestConnectionStripPointer: ; d1c3
+ ds 2
+WestConnectionStripLocation: ; d1c5
+ ds 2
+WestConnectionStripLength: ; d1c7
+ ds 1
+WestConnectedMapWidth: ; d1c8
+ ds 1
+WestConnectionStripYOffset: ; d1c9
+ ds 1
+WestConnectionStripXOffset: ; d1ca
+ ds 1
+WestConnectionWindow: ; d1cb
+ ds 2
+
+EastMapConnection: ; d1cd
+EastConnectedMapGroup: ; d1cd
+ ds 1
+EastConnectedMapNumber: ; d1ce
+ ds 1
+EastConnectionStripPointer: ; d1cf
+ ds 2
+EastConnectionStripLocation: ; d1d1
+ ds 2
+EastConnectionStripLength: ; d1d3
+ ds 1
+EastConnectedMapWidth: ; d1d4
+ ds 1
+EastConnectionStripYOffset: ; d1d5
+ ds 1
+EastConnectionStripXOffset: ; d1d6
+ ds 1
+EastConnectionWindow: ; d1d7
+ ds 2
+
+
+TilesetHeader:
+TilesetBank: ; d1d9
+ ds 1
+TilesetAddress: ; d1da
+ ds 2
+TilesetBlocksBank: ; d1dc
+ ds 1
+TilesetBlocksAddress: ; d1dd
+ ds 2
+TilesetCollisionBank: ; d1df
+ ds 1
+TilesetCollisionAddress: ; d1e0
+ ds 2
+TilesetAnim: ; d1e2
+; bank 3f
+ ds 2
+; unused ; d1e4
+ ds 2
+TilesetPalettes: ; d1e6
+; bank 3f
+ ds 2
+
+EvolvableFlags: ; d1e8
+ ds 1
+
+ ds 1
+
+MagikarpLength:
+Buffer1: ; d1ea
+ ds 1
+MovementType:
+Buffer2: ; d1eb
+ ds 1
+
+SECTION "BattleMons2",WRAMX[$d1fa],BANK[1]
+LinkBattleRNs: ; d1fa
+ ds 10
+
+TempEnemyMonSpecies: ; d204
+ ds 1
+TempBattleMonSpecies: ; d205
+ ds 1
+
+EnemyMon:
+EnemyMonSpecies: ; d206
+ ds 1
+EnemyMonItem: ; d207
+ ds 1
+
+EnemyMonMoves:
+EnemyMonMove1: ; d208
+ ds 1
+EnemyMonMove2: ; d209
+ ds 1
+EnemyMonMove3: ; d20a
+ ds 1
+EnemyMonMove4: ; d20b
+ ds 1
+EnemyMonMovesEnd:
+
+EnemyMonDVs:
+EnemyMonAtkDefDV: ; d20c
+ ds 1
+EnemyMonSpdSpclDV: ; d20d
+ ds 1
+
+EnemyMonPP:
+EnemyMonPPMove1: ; d20e
+ ds 1
+EnemyMonPPMove2: ; d20f
+ ds 1
+EnemyMonPPMove3: ; d210
+ ds 1
+EnemyMonPPMove4: ; d211
+ ds 1
+
+EnemyMonHappiness: ; d212
+ ds 1
+EnemyMonLevel: ; d213
+ ds 1
+
+EnemyMonStatus: ; d214
+ ds 2
+
+EnemyMonHP:
+EnemyMonHPHi: ; d216
+ ds 1
+EnemyMonHPLo: ; d217
+ ds 1
+
+EnemyMonMaxHP:
+EnemyMonMaxHPHi: ; d218
+ ds 1
+EnemyMonMaxHPLo: ; d219
+ ds 1
+
+EnemyMonStats:
+EnemyMonAtk: ; d21a
+ ds 2
+EnemyMonDef: ; d21c
+ ds 2
+EnemyMonSpd: ; d21e
+ ds 2
+EnemyMonSpclAtk: ; d220
+ ds 2
+EnemyMonSpclDef: ; d222
+ ds 2
+EnemyMonStatsEnd:
+
+EnemyMonType1: ; d224
+ ds 1
+EnemyMonType2: ; d225
+ ds 1
+
+EnemyMonBaseStats: ; d226
+ ds 5
+
+EnemyMonCatchRate: ; d22b
+ ds 1
+EnemyMonBaseExp: ; d22c
+ ds 1
+
+EnemyMonEnd:
+
+
+IsInBattle: ; d22d
+; 0: overworld
+; 1: wild battle
+; 2: trainer battle
+ ds 1
+
+ ds 1
+
+OtherTrainerClass: ; d22f
+; class (Youngster, Bug Catcher, etc.) of opposing trainer
+; 0 if opponent is a wild Pokémon, not a trainer
+ ds 1
+
+BattleType: ; d230
+; $00 normal
+; $01
+; $02
+; $03 dude
+; $04 fishing
+; $05 roaming
+; $06
+; $07 shiny
+; $08 headbutt/rock smash
+; $09
+; $0a force Item1
+; $0b
+; $0c suicune
+ ds 1
+
+OtherTrainerID: ; d231
+; which trainer of the class that you're fighting
+; (Joey, Mikey, Albert, etc.)
+ ds 1
+
+ ds 1
+
+TrainerClass: ; d233
+ ds 1
+
+UnownLetter: ; d234
+ ds 1
+
+ ds 1
+
+CurBaseData: ; d236
+BaseDexNo: ; d236
+ ds 1
+BaseStats: ; d237
+BaseHP: ; d237
+ ds 1
+BaseAttack: ; d238
+ ds 1
+BaseDefense: ; d239
+ ds 1
+BaseSpeed: ; d23a
+ ds 1
+BaseSpecialAttack: ; d23b
+ ds 1
+BaseSpecialDefense: ; d23c
+ ds 1
+BaseType: ; d23d
+BaseType1: ; d23d
+ ds 1
+BaseType2: ; d23e
+ ds 1
+BaseCatchRate: ; d23f
+ ds 1
+BaseExp: ; d240
+ ds 1
+BaseItems: ; d241
+ ds 2
+BaseGender: ; d243
+ ds 1
+BaseUnknown1: ; d244
+ ds 1
+BaseEggSteps: ; d245
+ ds 1
+BaseUnknown2: ; d246
+ ds 1
+BasePicSize: ; d247
+ ds 1
+BasePadding: ; d248
+ ds 4
+BaseGrowthRate: ; d24c
+ ds 1
+BaseEggGroups: ; d24d
+ ds 1
+BaseTMHM: ; d24e
+ ds 8
+
+
+CurDamage: ; d256
+ ds 2
+
+
+SECTION "TimeOfDay",WRAMX[$d269],BANK[1]
+
+TimeOfDay: ; d269
+ ds 1
+
+SECTION "OTParty",WRAMX[$d280],BANK[1]
+
+OTPartyCount: ; d280
+ ds 1 ; number of Pokémon in party
+OTPartySpecies: ; d281
+ ds 6 ; species of each Pokémon in party
+; d287
+ ds 1 ; any empty slots including the 7th must be FF
+ ; or the routine will keep going
+
+OTPartyMon1:
+OTPartyMon1Species: ; d288
+ ds 1
+OTPartyMon1Item: ; d289
+ ds 1
+
+OTPartyMon1Moves: ; d28a
+OTPartyMon1Move1: ; d28a
+ ds 1
+OTPartyMon1Move2: ; d28b
+ ds 1
+OTPartyMon1Move3: ; d28c
+ ds 1
+OTPartyMon1Move4: ; d28d
+ ds 1
+
+OTPartyMon1ID: ; d28e
+ ds 2
+OTPartyMon1Exp: ; d290
+ ds 3
+OTPartyMon1HPExp: ; d293
+ ds 2
+OTPartyMon1AtkExp: ; d295
+ ds 2
+OTPartyMon1DefExp: ; d297
+ ds 2
+OTPartyMon1SpdExp: ; d299
+ ds 2
+OTPartyMon1SpclExp: ; d29b
+ ds 2
+
+OTPartyMon1DVs: ; d29d
+OTPartyMon1AtkDefDV: ; d29d
+ ds 1
+OTPartyMon1SpdSpclDV: ; d29e
+ ds 1
+
+OTPartyMon1PP: ; d29f
+OTPartyMon1PPMove1: ; d29f
+ ds 1
+OTPartyMon1PPMove2: ; d2a0
+ ds 1
+OTPartyMon1PPMove3: ; d2a1
+ ds 1
+OTPartyMon1PPMove4: ; d2a2
+ ds 1
+
+OTPartyMon1Happiness: ; d2a3
+ ds 1
+OTPartyMon1PokerusStatus: ; d2a4
+ ds 1
+
+OTPartyMon1CaughtData: ; d2a5
+OTPartyMon1CaughtGender: ; d2a5
+OTPartyMon1CaughtLocation: ; d2a5
+ ds 1
+OTPartyMon1CaughtTime: ; d2a6
+ ds 1
+OTPartyMon1Level: ; d2a7
+ ds 1
+
+OTPartyMon1Status: ; d2a8
+ ds 1
+OTPartyMon1Unused: ; d2a9
+ ds 1
+OTPartyMon1CurHP: ; d2aa
+ ds 2
+OTPartyMon1MaxHP: ; d2ac
+ ds 2
+OTPartyMon1Atk: ; d2ae
+ ds 2
+OTPartyMon1Def: ; d2b0
+ ds 2
+OTPartyMon1Spd: ; d2b2
+ ds 2
+OTPartyMon1SpclAtk: ; d2b4
+ ds 2
+OTPartyMon1SpclDef: ; d2b6
+ ds 2
+
+OTPartyMon2: ; d2b8
+ ds 48
+OTPartyMon3: ; d2e8
+ ds 48
+OTPartyMon4: ; d318
+ ds 48
+OTPartyMon5: ; d348
+ ds 48
+OTPartyMon6: ; d378
+ ds 48
+
+
+OTPartyMonOT:
+OTPartyMon1OT: ; d3a8
+ ds 11
+OTPartyMon2OT: ; d3b3
+ ds 11
+OTPartyMon3OT: ; d3be
+ ds 11
+OTPartyMon4OT: ; d3c9
+ ds 11
+OTPartyMon5OT: ; d3d4
+ ds 11
+OTPartyMon6OT: ; d3df
+ ds 11
+
+OTPartyMonNicknames:
+OTPartyMon1Nickname: ; d3ea
+ ds 11
+OTPartyMon2Nickname: ; d3f5
+ ds 11
+OTPartyMon3Nickname: ; d400
+ ds 11
+OTPartyMon4Nickname: ; d40b
+ ds 11
+OTPartyMon5Nickname: ; d416
+ ds 11
+OTPartyMon6Nickname: ; d421
+ ds 11
+
+SECTION "Scripting",WRAMX[$d434],BANK[1]
+ScriptFlags: ; d434
+ ds 1
+ScriptFlags2: ; d435
+ ds 1
+ScriptFlags3: ; d436
+ ds 1
+
+ScriptMode: ; d437
+ ds 1
+ScriptRunning: ; d438
+ ds 1
+ScriptBank: ; d439
+ ds 1
+ScriptPos: ; d43a
+ ds 2
+
+ ds 17
+
+ScriptDelay: ; d44d
+ ds 1
+
+SECTION "Player",WRAMX[$d472],BANK[1]
+PlayerGender: ; d472
+; bit 0:
+; 0 male
+; 1 female
+ ds 1
+ ds 8
+PlayerID: ; d47b
+ ds 2
+
+PlayerName: ; d47d
+ ds 11
+MomsName: ; d488
+ ds 11
+RivalName: ; d493
+ ds 11
+RedsName: ; d49e
+ ds 11
+GreensName: ; d4a9
+ ds 11
+
+ ds 2
+
+; init time set at newgame
+StartDay: ; d4b6
+ ds 1
+StartHour: ; d4b7
+ ds 1
+StartMinute: ; d4b8
+ ds 1
+StartSecond: ; d4b9
+ ds 1
+
+ ds 9
+
+GameTimeCap: ; d4c3
+ ds 1
+GameTimeHours: ; d4c4
+ ds 2
+GameTimeMinutes: ; d4c6
+ ds 1
+GameTimeSeconds: ; d4c7
+ ds 1
+GameTimeFrames: ; d4c8
+ ds 1
+
+ ds 2
+
+CurDay: ; d4cb
+ ds 1
+
+ ds 10
+
+ ds 2
+
+PlayerSprite: ; d4d8
+ ds 1
+
+ ds 3
+
+PlayerPalette: ; d4dc
+ ds 1
+
+ ds 1
+
+PlayerDirection: ; d4de
+; uses bits 2 and 3 / $0c / %00001100
+; %00 down
+; %01 up
+; %10 left
+; $11 right
+ ds 1
+
+ ds 2
+
+PlayerAction: ; d4e1
+; 1 standing
+; 2 walking
+; 4 spinning
+; 6 fishing
+ ds 1
+
+ ds 2
+
+StandingTile: ; d4e4
+ ds 1
+StandingTile2: ; d4e5
+ ds 1
+
+; relative to the map struct including borders
+MapX: ; d4e6
+ ds 1
+MapY: ; d4e7
+ ds 1
+MapX2: ; d4e8
+ ds 1
+MapY2: ; d4e9
+ ds 1
+
+ ds 3
+
+; relative to the bg map, in px
+PlayerSpriteX: ; d4ed
+ ds 1
+PlayerSpriteY: ; d4ee
+ ds 1
+
+
+SECTION "Objects",WRAMX[$d71e],BANK[1]
+MapObjects: ; d71e
+ ds OBJECT_LENGTH * NUM_OBJECTS
+
+
+SECTION "VariableSprites",WRAMX[$d82e],BANK[1]
+VariableSprites: ; d82e
+ ds $10
+
+
+SECTION "Status",WRAMX[$d841],BANK[1]
+TimeOfDayPal: ; d841
+ ds 1
+ ds 4
+; d846
+ ds 1
+ ds 1
+CurTimeOfDay: ; d848
+ ds 1
+
+ ds 3
+
+StatusFlags: ; d84c
+ ds 1
+StatusFlags2: ; d84d
+ ds 1
+
+Money: ; d84e
+ ds 3
+
+ ds 4
+
+Coins: ; d855
+ ds 2
+
+Badges:
+JohtoBadges: ; d857
+ ds 1
+KantoBadges: ; d858
+ ds 1
+
+SECTION "Items",WRAMX[$d859],BANK[1]
+TMsHMs: ; d859
+ ds 57
+TMsHMsEnd:
+
+NumItems: ; d892
+ ds 1
+Items: ; d893
+ ds 41
+ItemsEnd:
+
+NumKeyItems: ; d8bc
+ ds 1
+KeyItems: ; d8bd
+ ds 26
+KeyItemsEnd:
+
+NumBalls: ; d8d7
+ ds 1
+Balls: ; d8d8
+ ds 25
+BallsEnd:
+
+PCItems: ; d8f1
+ ds 101
+PCItemsEnd:
+
+
+SECTION "overworld",WRAMX[$d95b],BANK[1]
+WhichRegisteredItem: ; d95b
+ ds 1
+RegisteredItem: ; d95c
+ ds 1
+
+PlayerState: ; d95d
+ ds 1
+
+SECTION "scriptram",WRAMX[$d962],BANK[1]
+MooMooBerries: ; d962
+ ds 1 ; how many berries fed to MooMoo
+UndergroundSwitchPositions: ; d963
+ ds 1 ; which positions the switches are in
+FarfetchdPosition: ; d964
+ ds 1 ; which position the ilex farfetch'd is in
+
+SECTION "Events",WRAMX[$da72],BANK[1]
+
+EventFlags: ; da72
+;RoomDecorations: ; dac6
+;TeamRocketAzaleaTownAttackEvent: ; db51
+;PoliceAtElmsLabEvent: ; db52
+;SalesmanMahoganyTownEvent: ; db5c
+;RedGyaradosEvent: ; db5c
+ ds 250
+; db6c
+
+SECTION "BoxNames",WRAMX[$db75],BANK[1]
+; 8 chars + $50
+Box1Name: ; db75
+ ds 9
+Box2Name: ; db7e
+ ds 9
+Box3Name: ; db87
+ ds 9
+Box4Name: ; db90
+ ds 9
+Box5Name: ; db99
+ ds 9
+Box6Name: ; dba2
+ ds 9
+Box7Name: ; dbab
+ ds 9
+Box8Name: ; dbb4
+ ds 9
+Box9Name: ; dbbd
+ ds 9
+Box10Name: ; dbc6
+ ds 9
+Box11Name: ; dbcf
+ ds 9
+Box12Name: ; dbd8
+ ds 9
+Box13Name: ; dbe1
+ ds 9
+Box14Name: ; dbea
+ ds 9
+
+SECTION "bike", WRAMX[$dbf5],BANK[1]
+BikeFlags: ; dbf5
+; bit 1: always on bike
+; bit 2: downhill
+ ds 1
+
+SECTION "decorations", WRAMX[$dc0f],BANK[1]
+; Sprite id of each decoration
+Bed: ; dc0f
+ ds 1
+Carpet: ; dc10
+ ds 1
+Plant: ; dc11
+ ds 1
+Poster: ; dc12
+ ds 1
+Console: ; dc13
+ ds 1
+LeftOrnament: ; dc14
+ ds 1
+RightOrnament: ; dc15
+ ds 1
+BigDoll: ; dc16
+ ds 1
+
+SECTION "fruittrees", WRAMX[$dc27],BANK[1]
+FruitTreeFlags: ; dc27
+ ds 1
+
+SECTION "steps", WRAMX[$dc73],BANK[1]
+StepCount: ; dc73
+ ds 1
+PoisonStepCount: ; dc74
+ ds 1
+
+SECTION "FlypointPermissions", WRAMX[$dca5],BANK[1]
+FlypointPerms: ; dca5
+ ds 4
+
+SECTION "BackupMapInfo", WRAMX[$dcad],BANK[1]
+
+; used on maps like second floor pokécenter, which are reused, so we know which
+; map to return to
+BackupMapGroup: ; dcad
+ ds 1
+BackupMapNumber: ; dcae
+ ds 1
+
+SECTION "PlayerMapInfo", WRAMX[$dcb4],BANK[1]
+
+WarpNumber: ; dcb4
+ ds 1
+MapGroup: ; dcb5
+ ds 1 ; map group of current map
+MapNumber: ; dcb6
+ ds 1 ; map number of current map
+YCoord: ; dcb7
+ ds 1 ; current y coordinate relative to top-left corner of current map
+XCoord: ; dcb8
+ ds 1 ; current x coordinate relative to top-left corner of current map
+
+SECTION "PlayerParty",WRAMX[$dcd7],BANK[1]
+
+PartyCount: ; dcd7
+ ds 1 ; number of Pokémon in party
+PartySpecies: ; dcd8
+ ds 6 ; species of each Pokémon in party
+PartyEnd: ; dcde
+ ds 1 ; legacy functions don't check PartyCount
+
+PartyMons:
+PartyMon1:
+PartyMon1Species: ; dcdf
+ ds 1
+PartyMon1Item: ; dce0
+ ds 1
+
+PartyMon1Moves: ; dce1
+PartyMon1Move1: ; dce1
+ ds 1
+PartyMon1Move2: ; dce2
+ ds 1
+PartyMon1Move3: ; dce3
+ ds 1
+PartyMon1Move4: ; dce4
+ ds 1
+
+PartyMon1ID: ; dce5
+ ds 2
+PartyMon1Exp: ; dce7
+ ds 3
+
+PartyMon1HPExp: ; dcea
+ ds 2
+PartyMon1AtkExp: ; dcec
+ ds 2
+PartyMon1DefExp: ; dcee
+ ds 2
+PartyMon1SpdExp: ; dcf0
+ ds 2
+PartyMon1SpclExp: ; dcf2
+ ds 2
+
+PartyMon1DVs: ; dcf4
+; hp = %1000 for each dv
+ ds 1 ; atk/def
+ ds 1 ; spd/spc
+PartyMon1PP: ; dcf6
+ ds 4
+PartyMon1Happiness: ; dcfa
+ ds 1
+PartyMon1PokerusStatus: ; dcfb
+ ds 1
+PartyMon1CaughtData: ; dcfc
+PartyMon1CaughtTime: ; dcfc
+PartyMon1CaughtLevel: ; dcfc
+ ds 1
+PartyMon1CaughtGender: ; dcfd
+PartyMon1CaughtLocation: ; dcfd
+ ds 1
+PartyMon1Level: ; dcfe
+ ds 1
+PartyMon1Status: ; dcff
+ ds 1
+; dd00 unused
+ ds 1
+PartyMon1CurHP: ; dd01
+ ds 2
+PartyMon1MaxHP: ; dd03
+ ds 2
+PartyMon1Atk: ; dd05
+ ds 2
+PartyMon1Def: ; dd07
+ ds 2
+PartyMon1Spd: ; dd09
+ ds 2
+PartyMon1SpclAtk: ; dd0b
+ ds 2
+PartyMon1SpclDef: ; dd0d
+ ds 2
+
+
+PartyMon2: ; dd0f
+ ds 48
+PartyMon3: ; dd3f
+ ds 48
+PartyMon4: ; dd6f
+ ds 48
+PartyMon5: ; dd9f
+ ds 48
+PartyMon6: ; ddcf
+ ds 48
+
+PartyMonOT:
+PartyMon1OT: ; ddff
+ ds 11
+PartyMon2OT: ; de0a
+ ds 11
+PartyMon3OT: ; de15
+ ds 11
+PartyMon4OT: ; de20
+ ds 11
+PartyMon5OT: ; de2b
+ ds 11
+PartyMon6OT: ; de36
+ ds 11
+
+PartyMonNicknames:
+PartyMon1Nickname: ; de41
+ ds 11
+PartyMon2Nickname: ; de4c
+ ds 11
+PartyMon3Nickname: ; de57
+ ds 11
+PartyMon4Nickname: ; de62
+ ds 11
+PartyMon5Nickname: ; de6d
+ ds 11
+PartyMon6Nickname: ; de78
+ ds 11
+PartyMonNicknamesEnd:
+
+SECTION "Pokedex",WRAMX[$de99],BANK[1]
+PokedexCaught: ; de99
+ ds 32
+EndPokedexCaught:
+PokedexSeen: ; deb9
+ ds 32
+EndPokedexSeen:
+UnownDex: ; ded9
+ ds 26
+UnlockedUnowns: ; def3
+ ds 1
+
+SECTION "Breeding",WRAMX[$def5],BANK[1]
+DaycareMan: ; def5
+; bit 7: active
+; bit 6: monsters are compatible
+; bit 5: egg ready
+; bit 0: monster 1 in daycare
+ ds 1
+
+BreedMon1:
+BreedMon1Nick: ; def6
+ ds 11
+BreedMon1OT: ; df01
+ ds 11
+BreedMon1Stats:
+BreedMon1Species: ; df0c
+ ds 1
+ ds 31
+
+DaycareLady: ; df2c
+; bit 7: active
+; bit 0: monster 2 in daycare
+ ds 1
+
+StepsToEgg: ; df2d
+ ds 1
+DittoInDaycare: ; df2e
+; z: yes
+; nz: no
+ ds 1
+
+BreedMon2:
+BreedMon2Nick: ; df2f
+ ds 11
+BreedMon2OT: ; df3a
+ ds 11
+BreedMon2Stats:
+BreedMon2Species: ; df45
+ ds 1
+ ds 31
+
+EggNick: ; df65
+; EGG@
+ ds 11
+EggOT: ; df70
+ ds 11
+EggStats:
+EggSpecies: ; df7b
+ ds 1
+ ds 31
+
+SECTION "RoamMons",WRAMX[$dfcf],BANK[1]
+RoamMon1Species: ; dfcf
+ ds 1
+RoamMon1Level: ; dfd0
+ ds 1
+RoamMon1MapGroup: ; dfd1
+ ds 1
+RoamMon1MapNumber: ; dfd2
+ ds 1
+RoamMon1CurHP: ; dfd3
+ ds 1
+RoamMon1DVs: ; dfd4
+ ds 2
+
+RoamMon2Species: ; dfd6
+ ds 1
+RoamMon2Level: ; dfd7
+ ds 1
+RoamMon2MapGroup: ; dfd8
+ ds 1
+RoamMon2MapNumber: ; dfd9
+ ds 1
+RoamMon2CurHP: ; dfda
+ ds 1
+RoamMon2DVs: ; dfdb
+ ds 2
+
+RoamMon3Species: ; dfdd
+ ds 1
+RoamMon3Level: ; dfde
+ ds 1
+RoamMon3MapGroup: ; dfdf
+ ds 1
+RoamMon3MapNumber: ; dfe0
+ ds 1
+RoamMon3CurHP: ; dfe1
+ ds 1
+RoamMon3DVs: ; dfe2
+ ds 2
+
+
+
+SECTION "WRAMBank5",WRAMX[$d000],BANK[5]
+
+; 8 4-color palettes
+Unkn1Pals: ; d000
+ ds $40
+Unkn2Pals: ; d040
+ ds $40
+BGPals: ; d080
+ ds $40
+OBPals: ; d0c0
+ ds $40
+
+LYOverrides: ; d100
+ ds 144
+LYOverridesEnd:
+
+
+SECTION "SRAMBank1",SRAM,BANK[1]
+
+SECTION "BoxMons",SRAM[$ad10],BANK[1]
+BoxCount: ; ad10
+ ds 1
+BoxSpecies: ; ad11
+ ds 20
+ ds 1
+BoxMons:
+BoxMon1:
+BoxMon1Species: ; ad26
+ ds 1
+BoxMon1Item: ; ad27
+ ds 1
+BoxMon1Moves: ; ad28
+ ds 4
+BoxMon1ID: ; ad2c
+ ds 2
+BoxMon1Exp: ; ad2e
+ ds 3
+BoxMon1HPExp: ; ad31
+ ds 2
+BoxMon1AtkExp: ; ad33
+ ds 2
+BoxMon1DefExp: ; ad35
+ ds 2
+BoxMon1SpdExp: ; ad37
+ ds 2
+BoxMon1SpcExp: ; ad39
+ ds 2
+BoxMon1DVs: ; ad3b
+ ds 2
+BoxMon1PP: ; ad3d
+ ds 4
+BoxMon1Happiness: ; ad41
+ ds 1
+BoxMon1PokerusStatus: ; ad42
+ ds 1
+BoxMon1CaughtData:
+BoxMon1CaughtTime:
+BoxMon1CaughtLevel: ; ad43
+ ds 1
+BoxMon1CaughtGender:
+BoxMon1CaughtLocation: ; ad44
+ ds 1
+BoxMon1Level: ; ad45
+ ds 1
+
+BoxMon2: ; ad46
+ ds 32
+BoxMon3: ; ad66
+ ds 32
+BoxMon4: ; ad86
+ ds 32
+BoxMon5: ; ada6
+ ds 32
+BoxMon6: ; adc6
+ ds 32
+BoxMon7: ; ade6
+ ds 32
+BoxMon8: ; ae06
+ ds 32
+BoxMon9: ; ae26
+ ds 32
+BoxMon10: ; ae46
+ ds 32
+BoxMon11: ; ae66
+ ds 32
+BoxMon12: ; ae86
+ ds 32
+BoxMon13: ; aea6
+ ds 32
+BoxMon14: ; aec6
+ ds 32
+BoxMon15: ; aee6
+ ds 32
+BoxMon16: ; af06
+ ds 32
+BoxMon17: ; af26
+ ds 32
+BoxMon18: ; af46
+ ds 32
+BoxMon19: ; af66
+ ds 32
+BoxMon20: ; af86
+ ds 32
+
+BoxMonOT:
+BoxMon1OT: ; afa6
+ ds 11
+BoxMon2OT: ; afb1
+ ds 11
+BoxMon3OT: ; afbc
+ ds 11
+BoxMon4OT: ; afc7
+ ds 11
+BoxMon5OT: ; afd2
+ ds 11
+BoxMon6OT: ; afdd
+ ds 11
+BoxMon7OT: ; afe8
+ ds 11
+BoxMon8OT: ; aff3
+ ds 11
+BoxMon9OT: ; affe
+ ds 11
+BoxMon10OT: ; b009
+ ds 11
+BoxMon11OT: ; b014
+ ds 11
+BoxMon12OT: ; b01f
+ ds 11
+BoxMon13OT: ; b02a
+ ds 11
+BoxMon14OT: ; b035
+ ds 11
+BoxMon15OT: ; b040
+ ds 11
+BoxMon16OT: ; b04b
+ ds 11
+BoxMon17OT: ; b056
+ ds 11
+BoxMon18OT: ; b061
+ ds 11
+BoxMon19OT: ; b06c
+ ds 11
+BoxMon20OT: ; b077
+ ds 11
+
+BoxMonNicknames:
+BoxMon1Nickname: ; b082
+ ds 11
+BoxMon2Nickname: ; b08d
+ ds 11
+BoxMon3Nickname: ; b098
+ ds 11
+BoxMon4Nickname: ; b0a3
+ ds 11
+BoxMon5Nickname: ; b0ae
+ ds 11
+BoxMon6Nickname: ; b0b9
+ ds 11
+BoxMon7Nickname: ; b0c4
+ ds 11
+BoxMon8Nickname: ; b0cf
+ ds 11
+BoxMon9Nickname: ; b0da
+ ds 11
+BoxMon10Nickname: ; b0e5
+ ds 11
+BoxMon11Nickname: ; b0f0
+ ds 11
+BoxMon12Nickname: ; b0fb
+ ds 11
+BoxMon13Nickname: ; b106
+ ds 11
+BoxMon14Nickname: ; b111
+ ds 11
+BoxMon15Nickname: ; b11c
+ ds 11
+BoxMon16Nickname: ; b127
+ ds 11
+BoxMon17Nickname: ; b132
+ ds 11
+BoxMon18Nickname: ; b13d
+ ds 11
+BoxMon19Nickname: ; b148
+ ds 11
+BoxMon20Nickname: ; b153
+ ds 11
+BoxMonNicknamesEnd:
+
diff --git a/pokemontools/vba/vba.py b/pokemontools/vba/vba.py
index e339f57..57e5e1b 100644
--- a/pokemontools/vba/vba.py
+++ b/pokemontools/vba/vba.py
@@ -1130,6 +1130,8 @@ class crystal(object):
if not wram:
self.inject_script_into_rom(asm=script, wram_address=address)
else:
+ # TODO: move this into a separate function. Maybe use a context
+ # manager to restore wram at the end.
mem = list(self.vba.memory)
backup_wram = mem[address : address + len(script)]
mem[address : address + len(script)] = script
diff --git a/pokemontools/wram.py b/pokemontools/wram.py
index 60001aa..e1b9212 100644
--- a/pokemontools/wram.py
+++ b/pokemontools/wram.py
@@ -5,6 +5,10 @@ RGBDS BSS section and constant parsing.
import os
+# TODO: parse these constants from constants.asm
+NUM_OBJECTS = 0x10
+OBJECT_LENGTH = 0x10
+
def make_wram_labels(wram_sections):
wram_labels = {}
for section in wram_sections:
@@ -108,6 +112,8 @@ class WRAMProcessor(object):
self.setup_hram_constants()
self.setup_gbhw_constants()
+ self.reformat_wram_labels()
+
def read_wram_sections(self):
"""
Opens the wram file and calls read_bss_sections.
@@ -162,3 +168,14 @@ class WRAMProcessor(object):
"""
self.gbhw_constants = self.read_gbhw_constants()
return self.gbhw_constants
+
+ def reformat_wram_labels(self):
+ """
+ Flips the wram_labels dictionary the other way around to access
+ addresses by label.
+ """
+ self.wram = {}
+
+ for (address, labels) in self.wram_labels.iteritems():
+ for label in labels:
+ self.wram[label] = address