diff options
author | Bryan Bishop <kanzure@gmail.com> | 2013-11-13 19:02:23 -0600 |
---|---|---|
committer | Bryan Bishop <kanzure@gmail.com> | 2013-11-13 19:02:23 -0600 |
commit | 8be80027e87c80678b1d0a453c866d79a9af47b2 (patch) | |
tree | 13a5469cedb76fd2c52dddd7efbbbcf5118c6be3 | |
parent | b44e7b6dee19c9029e68747315e4fc84e741a86b (diff) | |
parent | 4a002c193b2225f9e370bf640b0c547252e42cd1 (diff) |
Merge branch 'master' into battle-handling
-rw-r--r-- | pokemontools/data/__init__.py | 15 | ||||
-rw-r--r-- | pokemontools/data/pokecrystal/wram.asm | 2293 | ||||
-rw-r--r-- | pokemontools/vba/vba.py | 2 | ||||
-rw-r--r-- | pokemontools/wram.py | 17 |
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 |