Merge remote-tracking branch 'remotes/pokered/master'

This commit is contained in:
Rangi 2022-10-02 22:42:26 -04:00
commit 7dd9d7dc80
30 changed files with 725 additions and 1023 deletions

View File

@ -16,7 +16,7 @@ jobs:
uses: actions/checkout@master
with:
path: rgbds
ref: v0.5.2
ref: v0.6.0
repository: gbdev/rgbds
- name: Install rgbds

View File

@ -42,9 +42,9 @@ Run setup and leave the default settings. At the "**Select Packages**" step, cho
Double click on the text that says "**Skip**" next to each package to select the most recent version to install.
Then follow the [**rgbds** install instructions](https://rgbds.gbdev.io/install#pre-built) for Windows with Cygwin to install **rgbds 0.5.2**.
Then follow the [**rgbds** install instructions](https://rgbds.gbdev.io/install#pre-built) for Windows with Cygwin to install **rgbds 0.6.0**.
**Note:** If you already have an older rgbds, you will need to update to 0.5.2. Ignore this if you have never installed rgbds before. If a version newer than 0.5.2 does not work, try downloading 0.5.2.
**Note:** If you already have an older rgbds, you will need to update to 0.6.0. Ignore this if you have never installed rgbds before. If a version newer than 0.6.0 does not work, try downloading 0.6.0.
Now open the **Cygwin terminal** and enter the following commands.
@ -67,7 +67,7 @@ Install [**Homebrew**](https://brew.sh/). Follow the official instructions.
Open **Terminal** and prepare to enter commands.
Then follow the [**rgbds** instructions](https://rgbds.gbdev.io/install#pre-built) for macOS to install **rgbds 0.5.2**.
Then follow the [**rgbds** instructions](https://rgbds.gbdev.io/install#pre-built) for macOS to install **rgbds 0.6.0**.
Now you're ready to [build **pokeyellow**](#build-pokeyellow).
@ -84,7 +84,7 @@ To install the software required for **pokeyellow**:
sudo apt-get install make gcc git
```
Then follow the [**rgbds** instructions](https://rgbds.gbdev.io/install#building-from-source) to build **rgbds 0.5.2** from source.
Then follow the [**rgbds** instructions](https://rgbds.gbdev.io/install#building-from-source) to build **rgbds 0.6.0** from source.
### OpenSUSE
@ -94,7 +94,7 @@ To install the software required for **pokeyellow**:
sudo zypper install make gcc git
```
Then follow the [**rgbds** instructions](https://rgbds.gbdev.io/install#building-from-source) to build **rgbds 0.5.2** from source.
Then follow the [**rgbds** instructions](https://rgbds.gbdev.io/install#building-from-source) to build **rgbds 0.6.0** from source.
### Arch Linux
@ -104,9 +104,9 @@ To install the software required for **pokeyellow**:
sudo pacman -S make gcc git
```
Then follow the [**rgbds** instructions](https://rgbds.gbdev.io/install#pre-built) for Arch Linux to install **rgbds 0.5.2**.
Then follow the [**rgbds** instructions](https://rgbds.gbdev.io/install#pre-built) for Arch Linux to install **rgbds 0.6.0**.
If you want to compile and install **rgbds** yourself instead, then follow the [**rgbds** instructions](https://rgbds.gbdev.io/install#building-from-source) to build **rgbds 0.5.2** from source.
If you want to compile and install **rgbds** yourself instead, then follow the [**rgbds** instructions](https://rgbds.gbdev.io/install#building-from-source) to build **rgbds 0.6.0** from source.
### Termux
@ -122,7 +122,7 @@ To install **rgbds**:
sudo apt install rgbds
```
If you want to compile and install **rgbds** yourself instead, then follow the [**rgbds** instructions](https://rgbds.gbdev.io/install#building-from-source) to build **rgbds 0.5.2** from source.
If you want to compile and install **rgbds** yourself instead, then follow the [**rgbds** instructions](https://rgbds.gbdev.io/install#building-from-source) to build **rgbds 0.6.0** from source.
### Other distros
@ -133,7 +133,7 @@ If your distro is not listed here, try to find the required software in its repo
- `git`
- `rgbds`
If `rgbds` is not available, you'll need to follow the [**rgbds** instructions](https://rgbds.gbdev.io/install#building-from-source) to build **rgbds 0.5.2** from source.
If `rgbds` is not available, you'll need to follow the [**rgbds** instructions](https://rgbds.gbdev.io/install#building-from-source) to build **rgbds 0.6.0** from source.
Now you're ready to [build **pokeyellow**](#build-pokeyellow).
@ -155,8 +155,8 @@ make
### Build with a local rgbds version
If you have different projects that require different versions of `rgbds`, it might not be convenient to install rgbds 0.5.2 globally. Instead, you can put its files in a directory within pokeyellow, such as `pokeyellow/rgbds-0.5.2/`. Then specify it when you run `make`:
If you have different projects that require different versions of `rgbds`, it might not be convenient to install rgbds 0.6.0 globally. Instead, you can put its files in a directory within pokeyellow, such as `pokeyellow/rgbds-0.6.0/`. Then specify it when you run `make`:
```bash
make RGBDS=rgbds-0.5.2/
make RGBDS=rgbds-0.6.0/
```

View File

@ -81,7 +81,7 @@ tools:
$(MAKE) -C tools/
RGBASMFLAGS = -h -L -Weverything -Wnumeric-string=2 -Wtruncation=1
RGBASMFLAGS = -hL -Q8 -P includes.asm -Weverything -Wnumeric-string=2 -Wtruncation=1
# Create a sym/map for debug purposes if `make` run with `DEBUG=1`
ifeq ($(DEBUG),1)
RGBASMFLAGS += -E
@ -100,7 +100,7 @@ rgbdscheck.o: rgbdscheck.asm
# As a side effect, they're evaluated immediately instead of when the rule is invoked.
# It doesn't look like $(shell) can be deferred so there might not be a better way.
define DEP
$1: $2 $$(shell tools/scan_includes $2) | rgbdscheck.o
$1: $2 $$(shell tools/scan_includes $2) | includes.asm rgbdscheck.o
$$(RGBASM) $$(RGBASMFLAGS) -o $$@ $$<
endef
@ -116,8 +116,8 @@ $(foreach obj, $(pokeyellow_debug_obj), $(eval $(call DEP,$(obj),$(obj:_debug.o=
$(foreach obj, $(pokeyellow_vc_obj), $(eval $(call DEP,$(obj),$(obj:_vc.o=.asm))))
# Dependencies for VC files that need to run scan_includes
%.constants.sym: %.constants.asm $(shell tools/scan_includes %.constants.asm) | rgbdscheck.o
$(RGBASM) $< > $@
%.constants.sym: %.constants.asm $(shell tools/scan_includes %.constants.asm) | includes.asm rgbdscheck.o
$(RGBASM) $(RGBASMFLAGS) $< > $@
endif
@ -138,8 +138,8 @@ opts = -cjsv -k 01 -l 0x33 -m 0x1b -p 0 -r 03 -t "POKEMON YELLOW"
### Misc file-specific graphics rules
gfx/battle/attack_anim_1.2bpp: tools/gfx += --trim-whitespace
gfx/battle/attack_anim_2.2bpp: tools/gfx += --trim-whitespace
gfx/battle/move_anim_0.2bpp: tools/gfx += --trim-whitespace
gfx/battle/move_anim_1.2bpp: tools/gfx += --trim-whitespace
gfx/credits/the_end.2bpp: tools/gfx += --interleave --png=$<

View File

@ -1,6 +1,3 @@
INCLUDE "constants.asm"
SECTION "Sound Effect Headers 1", ROMX
INCLUDE "audio/headers/sfxheaders1.asm"

View File

@ -45,93 +45,96 @@ DEF FIRST_SE_ID EQU const_value
; subanimations that are part of move animations
; SubanimationPointers indexes (see data/battle_anims/subanimations.asm)
; The 0 or 1 in the name of a subanim indicates whether to use tileset 0 or 1 data/moves/animations.asm.
; "Both" indicates either can be used for different images using the same animation.
const_def
const SUBANIM_00
const SUBANIM_01
const SUBANIM_02
const SUBANIM_03
const SUBANIM_04
const SUBANIM_05
const SUBANIM_06
const SUBANIM_07
const SUBANIM_08
const SUBANIM_09
const SUBANIM_0A
const SUBANIM_0B
const SUBANIM_0C
const SUBANIM_0D
const SUBANIM_0E
const SUBANIM_0F
const SUBANIM_10
const SUBANIM_11
const SUBANIM_12
const SUBANIM_13
const SUBANIM_14
const SUBANIM_15
const SUBANIM_16
const SUBANIM_17
const SUBANIM_18
const SUBANIM_19
const SUBANIM_1A
const SUBANIM_1B
const SUBANIM_1C
const SUBANIM_1D
const SUBANIM_1E
const SUBANIM_1F
const SUBANIM_20
const SUBANIM_21
const SUBANIM_22
const SUBANIM_23
const SUBANIM_24
const SUBANIM_25
const SUBANIM_26
const SUBANIM_27
const SUBANIM_28
const SUBANIM_29
const SUBANIM_2A
const SUBANIM_2B
const SUBANIM_2C
const SUBANIM_2D
const SUBANIM_2E
const SUBANIM_2F
const SUBANIM_30
const SUBANIM_31
const SUBANIM_32
const SUBANIM_33
const SUBANIM_34
const SUBANIM_35
const SUBANIM_36
const SUBANIM_37
const SUBANIM_38
const SUBANIM_39
const SUBANIM_3A
const SUBANIM_3B
const SUBANIM_3C
const SUBANIM_3D
const SUBANIM_3E
const SUBANIM_3F
const SUBANIM_40
const SUBANIM_41
const SUBANIM_42
const SUBANIM_43
const SUBANIM_44
const SUBANIM_45
const SUBANIM_46
const SUBANIM_47
const SUBANIM_48
const SUBANIM_49
const SUBANIM_4A
const SUBANIM_4B
const SUBANIM_4C
const SUBANIM_4D
const SUBANIM_4E
const SUBANIM_4F
const SUBANIM_50
const SUBANIM_51
const SUBANIM_52
const SUBANIM_53
const SUBANIM_54
const SUBANIM_55
const SUBANIM_0_STAR
const SUBANIM_0_STAR_TWICE
const SUBANIM_0_STAR_THRICE
const SUBANIM_0_STAR_DESCENDING
const SUBANIM_1_STAR_BIG_MOVING
const SUBANIM_1_STAR_BIG
const SUBANIM_0_BALL_TOSS_HIGH
const SUBANIM_0_BALL_TOSS_MIDDLE
const SUBANIM_0_BALL_TOSS_LOW
const SUBANIM_0_BALL_SHAKE_ENEMY
const SUBANIM_0_BALL_POOF_ENEMY
const SUBANIM_0_BALL_BLOCK
const SUBANIM_1_FLAME_COLUMN_1
const SUBANIM_1_FLAME_COLUMN_2
const SUBANIM_1_FLAME_COLUMN_3
const SUBANIM_0_SCRATCHES
const SUBANIM_1_TORNADO
const SUBANIM_1_FLAMES
const SUBANIM_0_HEART_1_MUSIC
const SUBANIM_1_BLOB_TOSS
const SUBANIM_1_BLOB_DRIP_ENEMY
const SUBANIM_1_SHOUT
const SUBANIM_0_SLICE
const SUBANIM_0_BIRDIES_CIRCLING_ENEMY
const SUBANIM_1_SWORDS_CIRCLING
const SUBANIM_1_CLOUD_TOSS
const SUBANIM_0_WATER_COLUMNS
const SUBANIM_1_SEED_TOSS
const SUBANIM_1_SEED_LAND
const SUBANIM_0_ROCKS_LIFT
const SUBANIM_0_ROCKS_TOSS
const SUBANIM_1_FLAME_BEAM
const SUBANIM_1_FLAME_STAR
const SUBANIM_0_CIRCLES_1_SQUARES_CENTERING_ENEMY
const SUBANIM_0_CIRCLE_1_SQUARE_TOSS_BACK
const SUBANIM_0_BIND
const SUBANIM_0_STATUS_PARALYZED
const SUBANIM_0_STATUS_CONFUSED
const SUBANIM_0_STATUS_CONFUSED_ENEMY
const SUBANIM_0_STATUS_POISONED
const SUBANIM_1_SAND
const SUBANIM_1_LIGHTNING_BALL
const SUBANIM_0_SLICE_BOTH_SIDES
const SUBANIM_1_LIGHTNING
const SUBANIM_0_WATER_DROPLETS
const SUBANIM_0_CIRCLES_CENTERING
const SUBANIM_0_BEAM
const SUBANIM_0_ICE_RISE
const SUBANIM_0_ROCKS_FALL_ENEMY
const SUBANIM_0_SOUND_WAVE
const SUBANIM_0_CIRCLE_1_SQUARE_HALF_TOSS ; unused
const SUBANIM_1_BARRIER
const SUBANIM_1_SELFDESTRUCT
const SUBANIM_0_WATER_BUBBLES
const SUBANIM_0_CIRCLES_FALLING
const SUBANIM_0_STRING_SHOT
const SUBANIM_0_ICE_FALL
const SUBANIM_0_CIRCLE_1_SQUARE_APPEARS ; unused
const SUBANIM_0_STATUS_SLEEP
const SUBANIM_0_STATUS_SLEEP_ENEMY
const SUBANIM_0_WATER_1_FIRE_BARRIER ; unused
const SUBANIM_0_WATER_1_FIRE_GEYSER ; unused
const SUBANIM_1_STAR_BIG_TOSS
const SUBANIM_1_STARS_SMALL_TOSS
const SUBANIM_1_MUSIC_CIRCLING_ENEMY
const SUBANIM_1_CIRCLE_BLACK_TOSS
const SUBANIM_1_EXPLOSION_SMALL_ENEMY
const SUBANIM_0_CIRCLE_1_SQUARE_CLOSING
const SUBANIM_1_LEAVES_TOSS
const SUBANIM_0_HORN_JAB_TWICE
const SUBANIM_0_HORN_JAB_THRICE
const SUBANIM_0_BALL_POOF
const SUBANIM_2_TRADE_BALL_DROP
const SUBANIM_2_TRADE_BALL_SHAKE
const SUBANIM_2_TRADE_BALL_APPEAR
const SUBANIM_2_TRADE_BALL_POOF
const SUBANIM_0_EGG_SHAKING
const SUBANIM_1_TRIANGLE_TOSS
const SUBANIM_1_SPHERE_BIG
const SUBANIM_1_SPHERE_BIG_RISE
const SUBANIM_1_SPHERE_BIG_FALL
const SUBANIM_0_SHELL
const SUBANIM_0_COIN_BOUNCE
const SUBANIM_0_SAFARI_ROCK
const SUBANIM_0_SAFARI_BAIT
const SUBANIM_0_STAR_HIGH
DEF NUM_SUBANIMS EQU const_value
; types of subanimations

View File

@ -0,0 +1,41 @@
; sprite set ids
; indexes for SpriteSets (see data/maps/sprite_sets.asm)
; values for MapSpriteSets and SplitMapSpriteSets (see data/maps/sprite_sets.asm)
const_def 1
const SPRITESET_PALLET_VIRIDIAN ; 01
const SPRITESET_PEWTER_CERULEAN ; 02
const SPRITESET_LAVENDER ; 03
const SPRITESET_VERMILION ; 04
const SPRITESET_CELADON ; 05
const SPRITESET_INDIGO ; 06
const SPRITESET_SAFFRON ; 07
const SPRITESET_SILENCE_BRIDGE ; 08
const SPRITESET_CYCLING_ROAD ; 09
const SPRITESET_FUCHSIA ; 0a
DEF NUM_SPRITE_SETS EQU const_value - 1
; split sprite set ids
; indexes for SplitMapSpriteSets (see data/maps/sprite_sets.asm)
; values for MapSpriteSets (see data/maps/sprite_sets.asm)
const_next $f1
DEF FIRST_SPLIT_SET EQU const_value
const SPLITSET_ROUTE_2 ; f1
const SPLITSET_ROUTE_10 ; f2
const SPLITSET_ROUTE_11 ; f3
const SPLITSET_ROUTE_12 ; f4
const SPLITSET_ROUTE_15 ; f5
const SPLITSET_ROUTE_16 ; f6
const SPLITSET_ROUTE_18 ; f7
const SPLITSET_ROUTE_20 ; f8
const SPLITSET_ROUTE_5 ; f9
const SPLITSET_ROUTE_6 ; fa
const SPLITSET_ROUTE_7 ; fb
const SPLITSET_ROUTE_8 ; fc
DEF NUM_SPLIT_SETS EQU const_value - FIRST_SPLIT_SET
; split directions
DEF EAST_WEST EQU 1
DEF NORTH_SOUTH EQU 2
; each sprite set has 9 walking sprites and 2 still sprites
DEF SPRITE_SET_LENGTH EQU 9 + 2

View File

@ -1,91 +1,91 @@
SubanimationPointers:
table_width 2, SubanimationPointers
dw Subanimation00
dw Subanimation01
dw Subanimation02
dw Subanimation03
dw Subanimation04
dw Subanimation05
dw Subanimation06
dw Subanimation07
dw Subanimation08
dw Subanimation09
dw Subanimation0a
dw Subanimation0b
dw Subanimation0c
dw Subanimation0d
dw Subanimation0e
dw Subanimation0f
dw Subanimation10
dw Subanimation11
dw Subanimation12
dw Subanimation13
dw Subanimation14
dw Subanimation15
dw Subanimation16
dw Subanimation17
dw Subanimation18
dw Subanimation19
dw Subanimation1a
dw Subanimation1b
dw Subanimation1c
dw Subanimation1d
dw Subanimation1e
dw Subanimation1f
dw Subanimation20
dw Subanimation21
dw Subanimation22
dw Subanimation23
dw Subanimation24
dw Subanimation25
dw Subanimation26
dw Subanimation27
dw Subanimation28
dw Subanimation29
dw Subanimation2a
dw Subanimation2b
dw Subanimation2c
dw Subanimation2d
dw Subanimation2e
dw Subanimation2f
dw Subanimation30
dw Subanimation31
dw Subanimation32
dw Subanimation33
dw Subanimation34
dw Subanimation35
dw Subanimation36
dw Subanimation37
dw Subanimation38
dw Subanimation39
dw Subanimation3a
dw Subanimation3b
dw Subanimation3c
dw Subanimation3d
dw Subanimation3e
dw Subanimation3f
dw Subanimation40
dw Subanimation41
dw Subanimation42
dw Subanimation43
dw Subanimation44
dw Subanimation45
dw Subanimation46
dw Subanimation47
dw Subanimation48
dw Subanimation49
dw Subanimation4a
dw Subanimation4b
dw Subanimation4c
dw Subanimation4d
dw Subanimation4e
dw Subanimation4f
dw Subanimation50
dw Subanimation51
dw Subanimation52
dw Subanimation53
dw Subanimation54
dw Subanimation55
dw Subanim_0Star
dw Subanim_0StarTwice
dw Subanim_0StarThrice
dw Subanim_0StarDescending
dw Subanim_1StarBigMoving
dw Subanim_1StarBig
dw Subanim_0BallTossHigh
dw Subanim_0BallTossMiddle
dw Subanim_0BallTossLow
dw Subanim_0BallShakeEnemy
dw Subanim_0BallPoofEnemy
dw Subanim_0BallBlock
dw Subanim_1FlameColumn1
dw Subanim_1FlameColumn2
dw Subanim_1FlameColumn3
dw Subanim_0Scratches
dw Subanim_1Tornado
dw Subanim_1Flames
dw Subanim_0Heart_1Music
dw Subanim_1BlobToss
dw Subanim_1BlobDripEnemy
dw Subanim_1Shout
dw Subanim_0Slice
dw Subanim_0BirdiesCirclingEnemy
dw Subanim_1SwordsCircling
dw Subanim_1CloudToss
dw Subanim_0WaterColumns
dw Subanim_1SeedToss
dw Subanim_1SeedLand
dw Subanim_0RocksLift
dw Subanim_0RocksToss
dw Subanim_1FlameBeam
dw Subanim_1FlameStar
dw Subanim_0Circles_1Squares_CenteringEnemy
dw Subanim_0Circle_1Square_TossBack
dw Subanim_0Bind
dw Subanim_0StatusParalyzed
dw Subanim_0StatusConfused
dw Subanim_0StatusConfusedEnemy
dw Subanim_0StatusPoisoned
dw Subanim_1Sand
dw Subanim_1LightningBall
dw Subanim_0SliceBothSides
dw Subanim_1Lightning
dw Subanim_0WaterDroplets
dw Subanim_0CirclesCentering
dw Subanim_0Beam
dw Subanim_0IceRise
dw Subanim_0RocksFallEnemy
dw Subanim_0SoundWave
dw Subanim_0Circle_1Square_HalfToss ; unused
dw Subanim_1Barrier
dw Subanim_1Selfdestruct
dw Subanim_0WaterBubbles
dw Subanim_0CirclesFalling
dw Subanim_0StringShot
dw Subanim_0IceFall
dw Subanim_0Circle_1Square_Appears ; unused
dw Subanim_0StatusSleep
dw Subanim_0StatusSleepEnemy
dw Subanim_0Water_1Fire_Barrier ; unused
dw Subanim_0Water_1Fire_Geyser ; unused
dw Subanim_1StarBigToss
dw Subanim_1StarsSmallToss
dw Subanim_1MusicCirclingEnemy
dw Subanim_1CircleBlackToss
dw Subanim_1ExplosionSmallEnemy
dw Subanim_0Circle_1Square_Closing
dw Subanim_1LeavesToss
dw Subanim_0HornJabTwice
dw Subanim_0HornJabThrice
dw Subanim_0BallPoof
dw Subanim_2TradeBallDrop
dw Subanim_2TradeBallShake
dw Subanim_2TradeBallAppear
dw Subanim_2TradeBallPoof
dw Subanim_0EggShaking
dw Subanim_1TriangleToss
dw Subanim_1SphereBig
dw Subanim_1SphereBigRise
dw Subanim_1SphereBigFall
dw Subanim_0Shell
dw Subanim_0CoinBounce
dw Subanim_0SafariRock
dw Subanim_0SafariBait
dw Subanim_0StarHigh
assert_table_length NUM_SUBANIMS
; format:
@ -98,17 +98,17 @@ MACRO subanim
db (\1 << 5) | \2
ENDM
Subanimation04:
Subanim_1StarBigMoving:
subanim SUBANIMTYPE_HFLIP, 3
db FRAMEBLOCK_02, BASECOORD_1A, FRAMEBLOCKMODE_00
db FRAMEBLOCK_02, BASECOORD_10, FRAMEBLOCKMODE_00
db FRAMEBLOCK_02, BASECOORD_03, FRAMEBLOCKMODE_00
Subanimation05:
Subanim_1StarBig:
subanim SUBANIMTYPE_HFLIP, 1
db FRAMEBLOCK_02, BASECOORD_10, FRAMEBLOCKMODE_00
Subanimation08:
Subanim_0BallTossLow:
subanim SUBANIMTYPE_NORMAL, 11
db FRAMEBLOCK_03, BASECOORD_30, FRAMEBLOCKMODE_00
db FRAMEBLOCK_03, BASECOORD_44, FRAMEBLOCKMODE_00
@ -122,7 +122,7 @@ Subanimation08:
db FRAMEBLOCK_03, BASECOORD_A1, FRAMEBLOCKMODE_00
db FRAMEBLOCK_03, BASECOORD_34, FRAMEBLOCKMODE_00
Subanimation07:
Subanim_0BallTossMiddle:
subanim SUBANIMTYPE_NORMAL, 11
db FRAMEBLOCK_03, BASECOORD_30, FRAMEBLOCKMODE_00
db FRAMEBLOCK_03, BASECOORD_A2, FRAMEBLOCKMODE_00
@ -136,7 +136,7 @@ Subanimation07:
db FRAMEBLOCK_03, BASECOORD_A6, FRAMEBLOCKMODE_00
db FRAMEBLOCK_03, BASECOORD_34, FRAMEBLOCKMODE_00
Subanimation06:
Subanim_0BallTossHigh:
subanim SUBANIMTYPE_NORMAL, 11
db FRAMEBLOCK_03, BASECOORD_30, FRAMEBLOCKMODE_00
db FRAMEBLOCK_03, BASECOORD_A2, FRAMEBLOCKMODE_00
@ -150,14 +150,14 @@ Subanimation06:
db FRAMEBLOCK_03, BASECOORD_A9, FRAMEBLOCKMODE_00
db FRAMEBLOCK_03, BASECOORD_34, FRAMEBLOCKMODE_00
Subanimation09:
Subanim_0BallShakeEnemy:
subanim SUBANIMTYPE_NORMAL, 4
db FRAMEBLOCK_03, BASECOORD_21, FRAMEBLOCKMODE_04
db FRAMEBLOCK_04, BASECOORD_21, FRAMEBLOCKMODE_04
db FRAMEBLOCK_03, BASECOORD_21, FRAMEBLOCKMODE_04
db FRAMEBLOCK_05, BASECOORD_21, FRAMEBLOCKMODE_04
Subanimation0a:
Subanim_0BallPoofEnemy:
subanim SUBANIMTYPE_HFLIP, 6
db FRAMEBLOCK_06, BASECOORD_1B, FRAMEBLOCKMODE_00
db FRAMEBLOCK_07, BASECOORD_1B, FRAMEBLOCKMODE_00
@ -166,18 +166,18 @@ Subanimation0a:
db FRAMEBLOCK_0A, BASECOORD_15, FRAMEBLOCKMODE_00
db FRAMEBLOCK_0A, BASECOORD_15, FRAMEBLOCKMODE_00
Subanimation0b:
Subanim_0BallBlock:
subanim SUBANIMTYPE_NORMAL, 4
db FRAMEBLOCK_01, BASECOORD_2D, FRAMEBLOCKMODE_00
db FRAMEBLOCK_03, BASECOORD_2F, FRAMEBLOCKMODE_00
db FRAMEBLOCK_03, BASECOORD_35, FRAMEBLOCKMODE_00
db FRAMEBLOCK_03, BASECOORD_4D, FRAMEBLOCKMODE_00
Subanimation55:
Subanim_0StarHigh:
subanim SUBANIMTYPE_HFLIP, 1
db FRAMEBLOCK_01, BASECOORD_9D, FRAMEBLOCKMODE_00
Subanimation11:
Subanim_1Flames:
subanim SUBANIMTYPE_HFLIP, 12
db FRAMEBLOCK_0B, BASECOORD_26, FRAMEBLOCKMODE_00
db FRAMEBLOCK_0C, BASECOORD_26, FRAMEBLOCKMODE_00
@ -192,7 +192,7 @@ Subanimation11:
db FRAMEBLOCK_0B, BASECOORD_27, FRAMEBLOCKMODE_00
db FRAMEBLOCK_0C, BASECOORD_27, FRAMEBLOCKMODE_00
Subanimation2b:
Subanim_1Lightning:
subanim SUBANIMTYPE_HFLIP, 11
db FRAMEBLOCK_0D, BASECOORD_03, FRAMEBLOCKMODE_03
db FRAMEBLOCK_0E, BASECOORD_03, FRAMEBLOCKMODE_03
@ -206,7 +206,7 @@ Subanimation2b:
db FRAMEBLOCK_11, BASECOORD_1B, FRAMEBLOCKMODE_00
db FRAMEBLOCK_11, BASECOORD_1B, FRAMEBLOCKMODE_00
Subanimation2c:
Subanim_0WaterDroplets:
subanim SUBANIMTYPE_HFLIP, 12
db FRAMEBLOCK_12, BASECOORD_01, FRAMEBLOCKMODE_00
db FRAMEBLOCK_12, BASECOORD_0F, FRAMEBLOCKMODE_00
@ -221,7 +221,7 @@ Subanimation2c:
db FRAMEBLOCK_16, BASECOORD_38, FRAMEBLOCKMODE_00
db FRAMEBLOCK_16, BASECOORD_38, FRAMEBLOCKMODE_00
Subanimation12:
Subanim_0Heart_1Music:
subanim SUBANIMTYPE_COORDFLIP, 9
db FRAMEBLOCK_17, BASECOORD_30, FRAMEBLOCKMODE_00
db FRAMEBLOCK_17, BASECOORD_39, FRAMEBLOCKMODE_00
@ -233,35 +233,35 @@ Subanimation12:
db FRAMEBLOCK_17, BASECOORD_3F, FRAMEBLOCKMODE_00
db FRAMEBLOCK_17, BASECOORD_1F, FRAMEBLOCKMODE_00
Subanimation00:
Subanim_0Star:
subanim SUBANIMTYPE_HFLIP, 1
db FRAMEBLOCK_01, BASECOORD_17, FRAMEBLOCKMODE_00
Subanimation01:
Subanim_0StarTwice:
subanim SUBANIMTYPE_HFLIP, 2
db FRAMEBLOCK_01, BASECOORD_0F, FRAMEBLOCKMODE_00
db FRAMEBLOCK_01, BASECOORD_1D, FRAMEBLOCKMODE_00
Subanimation02:
Subanim_0StarThrice:
subanim SUBANIMTYPE_HFLIP, 3
db FRAMEBLOCK_01, BASECOORD_12, FRAMEBLOCKMODE_00
db FRAMEBLOCK_01, BASECOORD_15, FRAMEBLOCKMODE_00
db FRAMEBLOCK_01, BASECOORD_1C, FRAMEBLOCKMODE_00
Subanimation03:
Subanim_0StarDescending:
subanim SUBANIMTYPE_HFLIP, 4
db FRAMEBLOCK_01, BASECOORD_0B, FRAMEBLOCKMODE_00
db FRAMEBLOCK_01, BASECOORD_11, FRAMEBLOCKMODE_00
db FRAMEBLOCK_01, BASECOORD_18, FRAMEBLOCKMODE_00
db FRAMEBLOCK_01, BASECOORD_1D, FRAMEBLOCKMODE_00
Subanimation0c:
Subanim_1FlameColumn1:
subanim SUBANIMTYPE_HFLIP, 3
db FRAMEBLOCK_0C, BASECOORD_20, FRAMEBLOCKMODE_00
db FRAMEBLOCK_0C, BASECOORD_21, FRAMEBLOCKMODE_00
db FRAMEBLOCK_0C, BASECOORD_23, FRAMEBLOCKMODE_00
Subanimation0d:
Subanim_1FlameColumn2:
subanim SUBANIMTYPE_HFLIP, 6
db FRAMEBLOCK_0C, BASECOORD_20, FRAMEBLOCKMODE_02
db FRAMEBLOCK_0C, BASECOORD_15, FRAMEBLOCKMODE_00
@ -270,7 +270,7 @@ Subanimation0d:
db FRAMEBLOCK_0C, BASECOORD_23, FRAMEBLOCKMODE_02
db FRAMEBLOCK_0C, BASECOORD_19, FRAMEBLOCKMODE_00
Subanimation0e:
Subanim_1FlameColumn3:
subanim SUBANIMTYPE_HFLIP, 9
db FRAMEBLOCK_0C, BASECOORD_20, FRAMEBLOCKMODE_02
db FRAMEBLOCK_0C, BASECOORD_15, FRAMEBLOCKMODE_02
@ -282,7 +282,7 @@ Subanimation0e:
db FRAMEBLOCK_0C, BASECOORD_19, FRAMEBLOCKMODE_02
db FRAMEBLOCK_0C, BASECOORD_0C, FRAMEBLOCKMODE_00
Subanimation1f:
Subanim_1FlameBeam:
subanim SUBANIMTYPE_REVERSE, 5
db FRAMEBLOCK_0C, BASECOORD_30, FRAMEBLOCKMODE_03
db FRAMEBLOCK_0C, BASECOORD_40, FRAMEBLOCKMODE_03
@ -290,7 +290,7 @@ Subanimation1f:
db FRAMEBLOCK_0C, BASECOORD_42, FRAMEBLOCKMODE_03
db FRAMEBLOCK_0C, BASECOORD_21, FRAMEBLOCKMODE_00
Subanimation2e:
Subanim_0Beam:
subanim SUBANIMTYPE_HVFLIP, 14
db FRAMEBLOCK_18, BASECOORD_43, FRAMEBLOCKMODE_02
db FRAMEBLOCK_75, BASECOORD_52, FRAMEBLOCKMODE_04
@ -307,14 +307,14 @@ Subanimation2e:
db FRAMEBLOCK_1E, BASECOORD_43, FRAMEBLOCKMODE_02
db FRAMEBLOCK_75, BASECOORD_1B, FRAMEBLOCKMODE_00
Subanimation2f:
Subanim_0IceRise:
subanim SUBANIMTYPE_HFLIP, 4
db FRAMEBLOCK_1F, BASECOORD_24, FRAMEBLOCKMODE_00
db FRAMEBLOCK_20, BASECOORD_20, FRAMEBLOCKMODE_00
db FRAMEBLOCK_21, BASECOORD_1A, FRAMEBLOCKMODE_00
db FRAMEBLOCK_22, BASECOORD_15, FRAMEBLOCKMODE_00
Subanimation30:
Subanim_0RocksFallEnemy:
subanim SUBANIMTYPE_HFLIP, 18
db FRAMEBLOCK_23, BASECOORD_00, FRAMEBLOCKMODE_02
db FRAMEBLOCK_23, BASECOORD_02, FRAMEBLOCKMODE_02
@ -335,7 +335,7 @@ Subanimation30:
db FRAMEBLOCK_24, BASECOORD_28, FRAMEBLOCKMODE_00
db FRAMEBLOCK_24, BASECOORD_28, FRAMEBLOCKMODE_00
Subanimation0f:
Subanim_0Scratches:
subanim SUBANIMTYPE_HFLIP, 12
db FRAMEBLOCK_26, BASECOORD_0E, FRAMEBLOCKMODE_02
db FRAMEBLOCK_26, BASECOORD_16, FRAMEBLOCKMODE_02
@ -350,7 +350,7 @@ Subanimation0f:
db FRAMEBLOCK_29, BASECOORD_16, FRAMEBLOCKMODE_02
db FRAMEBLOCK_29, BASECOORD_1C, FRAMEBLOCKMODE_00
Subanimation16:
Subanim_0Slice:
subanim SUBANIMTYPE_HFLIP, 12
db FRAMEBLOCK_2A, BASECOORD_05, FRAMEBLOCKMODE_00
db FRAMEBLOCK_2B, BASECOORD_05, FRAMEBLOCKMODE_02
@ -365,7 +365,7 @@ Subanimation16:
db FRAMEBLOCK_2C, BASECOORD_00, FRAMEBLOCKMODE_02
db FRAMEBLOCK_2C, BASECOORD_00, FRAMEBLOCKMODE_00
Subanimation10:
Subanim_1Tornado:
subanim SUBANIMTYPE_REVERSE, 8
db FRAMEBLOCK_2D, BASECOORD_44, FRAMEBLOCKMODE_00
db FRAMEBLOCK_2E, BASECOORD_45, FRAMEBLOCKMODE_00
@ -376,7 +376,7 @@ Subanimation10:
db FRAMEBLOCK_2D, BASECOORD_2F, FRAMEBLOCKMODE_00
db FRAMEBLOCK_2E, BASECOORD_1A, FRAMEBLOCKMODE_00
Subanimation31:
Subanim_0SoundWave:
subanim SUBANIMTYPE_HVFLIP, 10
db FRAMEBLOCK_2F, BASECOORD_46, FRAMEBLOCKMODE_00
db FRAMEBLOCK_2F, BASECOORD_4A, FRAMEBLOCKMODE_00
@ -389,7 +389,7 @@ Subanimation31:
db FRAMEBLOCK_2F, BASECOORD_2E, FRAMEBLOCKMODE_00
db FRAMEBLOCK_2F, BASECOORD_51, FRAMEBLOCKMODE_00
Subanimation13:
Subanim_1BlobToss:
subanim SUBANIMTYPE_REVERSE, 6
db FRAMEBLOCK_30, BASECOORD_31, FRAMEBLOCKMODE_00
db FRAMEBLOCK_30, BASECOORD_32, FRAMEBLOCKMODE_00
@ -398,7 +398,7 @@ Subanimation13:
db FRAMEBLOCK_30, BASECOORD_0F, FRAMEBLOCKMODE_00
db FRAMEBLOCK_30, BASECOORD_10, FRAMEBLOCKMODE_00
Subanimation14:
Subanim_1BlobDripEnemy:
subanim SUBANIMTYPE_HFLIP, 9
db FRAMEBLOCK_30, BASECOORD_10, FRAMEBLOCKMODE_00
db FRAMEBLOCK_30, BASECOORD_10, FRAMEBLOCKMODE_03
@ -410,7 +410,7 @@ Subanimation14:
db FRAMEBLOCK_31, BASECOORD_22, FRAMEBLOCKMODE_04
db FRAMEBLOCK_31, BASECOORD_27, FRAMEBLOCKMODE_00
Subanimation41:
Subanim_1CircleBlackToss:
subanim SUBANIMTYPE_REVERSE, 5
db FRAMEBLOCK_03, BASECOORD_31, FRAMEBLOCKMODE_00
db FRAMEBLOCK_03, BASECOORD_32, FRAMEBLOCKMODE_00
@ -418,32 +418,32 @@ Subanimation41:
db FRAMEBLOCK_03, BASECOORD_0E, FRAMEBLOCKMODE_00
db FRAMEBLOCK_03, BASECOORD_10, FRAMEBLOCKMODE_00
Subanimation42:
Subanim_1ExplosionSmallEnemy:
subanim SUBANIMTYPE_HFLIP, 3
db FRAMEBLOCK_SMALL_BLACK_CIRCLE, BASECOORD_08, FRAMEBLOCKMODE_00
db FRAMEBLOCK_LARGE_BLACK_CIRCLE, BASECOORD_08, FRAMEBLOCKMODE_00
db FRAMEBLOCK_5A, BASECOORD_08, FRAMEBLOCKMODE_00
Subanimation15:
Subanim_1Shout:
subanim SUBANIMTYPE_HVFLIP, 2
db FRAMEBLOCK_35, BASECOORD_52, FRAMEBLOCKMODE_00
db FRAMEBLOCK_35, BASECOORD_53, FRAMEBLOCKMODE_00
Subanimation17:
Subanim_0BirdiesCirclingEnemy:
subanim SUBANIMTYPE_HFLIP, 4
db FRAMEBLOCK_36, BASECOORD_54, FRAMEBLOCKMODE_00
db FRAMEBLOCK_36, BASECOORD_55, FRAMEBLOCKMODE_00
db FRAMEBLOCK_37, BASECOORD_56, FRAMEBLOCKMODE_00
db FRAMEBLOCK_37, BASECOORD_57, FRAMEBLOCKMODE_00
Subanimation18:
Subanim_1SwordsCircling:
subanim SUBANIMTYPE_ENEMY, 4
db FRAMEBLOCK_36, BASECOORD_54, FRAMEBLOCKMODE_00
db FRAMEBLOCK_36, BASECOORD_55, FRAMEBLOCKMODE_00
db FRAMEBLOCK_37, BASECOORD_56, FRAMEBLOCKMODE_00
db FRAMEBLOCK_37, BASECOORD_57, FRAMEBLOCKMODE_00
Subanimation40:
Subanim_1MusicCirclingEnemy:
subanim SUBANIMTYPE_HFLIP, 6
db FRAMEBLOCK_17, BASECOORD_54, FRAMEBLOCKMODE_00
db FRAMEBLOCK_17, BASECOORD_55, FRAMEBLOCKMODE_00
@ -452,7 +452,7 @@ Subanimation40:
db FRAMEBLOCK_17, BASECOORD_57, FRAMEBLOCKMODE_00
db FRAMEBLOCK_17, BASECOORD_13, FRAMEBLOCKMODE_00
Subanimation19:
Subanim_1CloudToss:
subanim SUBANIMTYPE_REVERSE, 12
db FRAMEBLOCK_38, BASECOORD_31, FRAMEBLOCKMODE_00
db FRAMEBLOCK_39, BASECOORD_31, FRAMEBLOCKMODE_00
@ -467,7 +467,7 @@ Subanimation19:
db FRAMEBLOCK_38, BASECOORD_10, FRAMEBLOCKMODE_00
db FRAMEBLOCK_39, BASECOORD_10, FRAMEBLOCKMODE_00
Subanimation1a:
Subanim_0WaterColumns:
subanim SUBANIMTYPE_HFLIP, 16
db FRAMEBLOCK_3A, BASECOORD_08, FRAMEBLOCKMODE_00
db FRAMEBLOCK_3B, BASECOORD_08, FRAMEBLOCKMODE_00
@ -486,20 +486,20 @@ Subanimation1a:
db FRAMEBLOCK_3E, BASECOORD_0B, FRAMEBLOCKMODE_00
db FRAMEBLOCK_3F, BASECOORD_0B, FRAMEBLOCKMODE_00
Subanimation1b:
Subanim_1SeedToss:
subanim SUBANIMTYPE_REVERSE, 4
db FRAMEBLOCK_40, BASECOORD_31, FRAMEBLOCKMODE_00
db FRAMEBLOCK_40, BASECOORD_32, FRAMEBLOCKMODE_00
db FRAMEBLOCK_40, BASECOORD_92, FRAMEBLOCKMODE_00
db FRAMEBLOCK_40, BASECOORD_15, FRAMEBLOCKMODE_00
Subanimation1c:
Subanim_1SeedLand:
subanim SUBANIMTYPE_HFLIP, 3
db FRAMEBLOCK_41, BASECOORD_58, FRAMEBLOCKMODE_00
db FRAMEBLOCK_41, BASECOORD_59, FRAMEBLOCKMODE_00
db FRAMEBLOCK_41, BASECOORD_21, FRAMEBLOCKMODE_00
Subanimation1d:
Subanim_0RocksLift:
subanim SUBANIMTYPE_ENEMY, 15
db FRAMEBLOCK_24, BASECOORD_9A, FRAMEBLOCKMODE_00
db FRAMEBLOCK_23, BASECOORD_1B, FRAMEBLOCKMODE_02
@ -517,22 +517,22 @@ Subanimation1d:
db FRAMEBLOCK_25, BASECOORD_62, FRAMEBLOCKMODE_04
db FRAMEBLOCK_25, BASECOORD_99, FRAMEBLOCKMODE_03
Subanimation1e:
Subanim_0RocksToss:
subanim SUBANIMTYPE_NORMAL, 1
db FRAMEBLOCK_25, BASECOORD_75, FRAMEBLOCKMODE_00
Subanimation20:
Subanim_1FlameStar:
subanim SUBANIMTYPE_HFLIP, 2
db FRAMEBLOCK_42, BASECOORD_07, FRAMEBLOCKMODE_00
db FRAMEBLOCK_43, BASECOORD_07, FRAMEBLOCKMODE_00
Subanimation21:
Subanim_0Circles_1Squares_CenteringEnemy:
subanim SUBANIMTYPE_HFLIP, 3
db FRAMEBLOCK_44, BASECOORD_00, FRAMEBLOCKMODE_00
db FRAMEBLOCK_45, BASECOORD_08, FRAMEBLOCKMODE_00
db FRAMEBLOCK_46, BASECOORD_10, FRAMEBLOCKMODE_02
Subanimation22:
Subanim_0Circle_1Square_TossBack:
subanim SUBANIMTYPE_REVERSE, 11
db FRAMEBLOCK_47, BASECOORD_10, FRAMEBLOCKMODE_00
db FRAMEBLOCK_47, BASECOORD_56, FRAMEBLOCKMODE_00
@ -546,8 +546,8 @@ Subanimation22:
db FRAMEBLOCK_47, BASECOORD_89, FRAMEBLOCKMODE_00
db FRAMEBLOCK_47, BASECOORD_B0, FRAMEBLOCKMODE_00
Subanimation2d:
subanim SUBANIMTYPE_COORDFLIP, 6
Subanim_0CirclesCentering:
subanim SUBANIMTYPE_COORDFLIP, 6 ; should be SUBANIMTYPE_HVFLIP
db FRAMEBLOCK_44, BASECOORD_64, FRAMEBLOCKMODE_00
db FRAMEBLOCK_45, BASECOORD_65, FRAMEBLOCKMODE_00
db FRAMEBLOCK_46, BASECOORD_66, FRAMEBLOCKMODE_00
@ -555,15 +555,15 @@ Subanimation2d:
db FRAMEBLOCK_47, BASECOORD_66, FRAMEBLOCKMODE_00
db FRAMEBLOCK_47, BASECOORD_66, FRAMEBLOCKMODE_00
Subanimation39:
Subanim_0Circle_1Square_Appears:
subanim SUBANIMTYPE_COORDFLIP, 1
db FRAMEBLOCK_47, BASECOORD_67, FRAMEBLOCKMODE_00
Subanimation4e:
Subanim_1SphereBig:
subanim SUBANIMTYPE_HFLIP, 1
db FRAMEBLOCK_71, BASECOORD_0F, FRAMEBLOCKMODE_03
Subanimation4f:
Subanim_1SphereBigRise:
subanim SUBANIMTYPE_HFLIP, 7
db FRAMEBLOCK_71, BASECOORD_0F, FRAMEBLOCKMODE_00
db FRAMEBLOCK_71, BASECOORD_08, FRAMEBLOCKMODE_00
@ -573,7 +573,7 @@ Subanimation4f:
db FRAMEBLOCK_73, BASECOORD_95, FRAMEBLOCKMODE_00
db FRAMEBLOCK_74, BASECOORD_95, FRAMEBLOCKMODE_00
Subanimation50:
Subanim_1SphereBigFall:
subanim SUBANIMTYPE_HFLIP, 8
db FRAMEBLOCK_74, BASECOORD_95, FRAMEBLOCKMODE_00
db FRAMEBLOCK_73, BASECOORD_95, FRAMEBLOCKMODE_00
@ -584,7 +584,7 @@ Subanimation50:
db FRAMEBLOCK_71, BASECOORD_0F, FRAMEBLOCKMODE_00
db FRAMEBLOCK_71, BASECOORD_16, FRAMEBLOCKMODE_00
Subanimation29:
Subanim_1LightningBall:
subanim SUBANIMTYPE_HFLIP, 29
db FRAMEBLOCK_SMALL_BLACK_CIRCLE, BASECOORD_0F, FRAMEBLOCKMODE_00
db FRAMEBLOCK_4A, BASECOORD_68, FRAMEBLOCKMODE_03
@ -616,63 +616,63 @@ Subanimation29:
db FRAMEBLOCK_4D, BASECOORD_2A, FRAMEBLOCKMODE_03
db FRAMEBLOCK_LARGE_BLACK_CIRCLE, BASECOORD_6B, FRAMEBLOCKMODE_00
Subanimation2a:
Subanim_0SliceBothSides:
subanim SUBANIMTYPE_HFLIP, 4
db FRAMEBLOCK_4E, BASECOORD_2B, FRAMEBLOCKMODE_00
db FRAMEBLOCK_4F, BASECOORD_2B, FRAMEBLOCKMODE_00
db FRAMEBLOCK_50, BASECOORD_2B, FRAMEBLOCKMODE_00
db FRAMEBLOCK_50, BASECOORD_2B, FRAMEBLOCKMODE_00
Subanimation23:
Subanim_0Bind:
subanim SUBANIMTYPE_HFLIP, 2
db FRAMEBLOCK_51, BASECOORD_2D, FRAMEBLOCKMODE_00
db FRAMEBLOCK_51, BASECOORD_6E, FRAMEBLOCKMODE_00
Subanimation24:
Subanim_0StatusParalyzed:
subanim SUBANIMTYPE_ENEMY, 2
db FRAMEBLOCK_51, BASECOORD_2D, FRAMEBLOCKMODE_00
db FRAMEBLOCK_51, BASECOORD_6E, FRAMEBLOCKMODE_00
Subanimation25:
Subanim_0StatusConfused:
subanim SUBANIMTYPE_COORDFLIP, 2
db FRAMEBLOCK_52, BASECOORD_71, FRAMEBLOCKMODE_00
db FRAMEBLOCK_52, BASECOORD_72, FRAMEBLOCKMODE_00
Subanimation26:
Subanim_0StatusConfusedEnemy:
subanim SUBANIMTYPE_NORMAL, 2
db FRAMEBLOCK_52, BASECOORD_01, FRAMEBLOCKMODE_00
db FRAMEBLOCK_52, BASECOORD_2C, FRAMEBLOCKMODE_00
Subanimation3a:
Subanim_0StatusSleep:
subanim SUBANIMTYPE_COORDFLIP, 3
db FRAMEBLOCK_53, BASECOORD_71, FRAMEBLOCKMODE_00
db FRAMEBLOCK_53, BASECOORD_7F, FRAMEBLOCKMODE_00
db FRAMEBLOCK_53, BASECOORD_81, FRAMEBLOCKMODE_00
Subanimation3b:
Subanim_0StatusSleepEnemy:
subanim SUBANIMTYPE_NORMAL, 3
db FRAMEBLOCK_53, BASECOORD_01, FRAMEBLOCKMODE_00
db FRAMEBLOCK_53, BASECOORD_15, FRAMEBLOCKMODE_00
db FRAMEBLOCK_53, BASECOORD_2C, FRAMEBLOCKMODE_00
Subanimation27:
Subanim_0StatusPoisoned:
subanim SUBANIMTYPE_ENEMY, 2
db FRAMEBLOCK_54, BASECOORD_01, FRAMEBLOCKMODE_00
db FRAMEBLOCK_54, BASECOORD_2C, FRAMEBLOCKMODE_00
Subanimation28:
Subanim_1Sand:
subanim SUBANIMTYPE_HVFLIP, 3
db FRAMEBLOCK_55, BASECOORD_73, FRAMEBLOCKMODE_03
db FRAMEBLOCK_56, BASECOORD_73, FRAMEBLOCKMODE_03
db FRAMEBLOCK_57, BASECOORD_73, FRAMEBLOCKMODE_00
Subanimation32:
Subanim_0Circle_1Square_HalfToss:
subanim SUBANIMTYPE_COORDFLIP, 3
db FRAMEBLOCK_47, BASECOORD_74, FRAMEBLOCKMODE_00
db FRAMEBLOCK_47, BASECOORD_43, FRAMEBLOCKMODE_00
db FRAMEBLOCK_47, BASECOORD_75, FRAMEBLOCKMODE_00
Subanimation33:
Subanim_1Barrier:
subanim SUBANIMTYPE_HVFLIP, 6
db FRAMEBLOCK_58, BASECOORD_76, FRAMEBLOCKMODE_00
db FRAMEBLOCK_34, BASECOORD_76, FRAMEBLOCKMODE_00
@ -681,7 +681,7 @@ Subanimation33:
db FRAMEBLOCK_58, BASECOORD_76, FRAMEBLOCKMODE_00
db FRAMEBLOCK_34, BASECOORD_76, FRAMEBLOCKMODE_00
Subanimation3c:
Subanim_0Water_1Fire_Barrier:
subanim SUBANIMTYPE_COORDFLIP, 7
db FRAMEBLOCK_59, BASECOORD_79, FRAMEBLOCKMODE_03
db FRAMEBLOCK_59, BASECOORD_7B, FRAMEBLOCKMODE_03
@ -691,7 +691,7 @@ Subanimation3c:
db FRAMEBLOCK_59, BASECOORD_7C, FRAMEBLOCKMODE_03
db FRAMEBLOCK_59, BASECOORD_76, FRAMEBLOCKMODE_00
Subanimation3d:
Subanim_0Water_1Fire_Geyser:
subanim SUBANIMTYPE_NORMAL, 8
db FRAMEBLOCK_3A, BASECOORD_4D, FRAMEBLOCKMODE_00
db FRAMEBLOCK_3B, BASECOORD_4D, FRAMEBLOCKMODE_00
@ -702,7 +702,7 @@ Subanimation3d:
db FRAMEBLOCK_3E, BASECOORD_4D, FRAMEBLOCKMODE_00
db FRAMEBLOCK_3F, BASECOORD_4D, FRAMEBLOCKMODE_00
Subanimation34:
Subanim_1Selfdestruct:
subanim SUBANIMTYPE_HVFLIP, 21
db FRAMEBLOCK_SMALL_BLACK_CIRCLE, BASECOORD_7D, FRAMEBLOCKMODE_00
db FRAMEBLOCK_LARGE_BLACK_CIRCLE, BASECOORD_7D, FRAMEBLOCKMODE_00
@ -726,14 +726,14 @@ Subanimation34:
db FRAMEBLOCK_LARGE_BLACK_CIRCLE, BASECOORD_82, FRAMEBLOCKMODE_00
db FRAMEBLOCK_5A, BASECOORD_82, FRAMEBLOCKMODE_00
Subanimation35:
Subanim_0WaterBubbles:
subanim SUBANIMTYPE_HVFLIP, 4
db FRAMEBLOCK_5B, BASECOORD_83, FRAMEBLOCKMODE_03
db FRAMEBLOCK_5C, BASECOORD_84, FRAMEBLOCKMODE_03
db FRAMEBLOCK_5D, BASECOORD_85, FRAMEBLOCKMODE_03
db FRAMEBLOCK_5E, BASECOORD_09, FRAMEBLOCKMODE_00
Subanimation36:
Subanim_0CirclesFalling:
subanim SUBANIMTYPE_HFLIP, 8
db FRAMEBLOCK_5F, BASECOORD_2A, FRAMEBLOCKMODE_00
db FRAMEBLOCK_5F, BASECOORD_00, FRAMEBLOCKMODE_00
@ -744,7 +744,7 @@ Subanimation36:
db FRAMEBLOCK_62, BASECOORD_2A, FRAMEBLOCKMODE_00
db FRAMEBLOCK_62, BASECOORD_00, FRAMEBLOCKMODE_00
Subanimation37:
Subanim_0StringShot:
subanim SUBANIMTYPE_HVFLIP, 10
db FRAMEBLOCK_63, BASECOORD_89, FRAMEBLOCKMODE_00
db FRAMEBLOCK_64, BASECOORD_75, FRAMEBLOCKMODE_00
@ -757,7 +757,7 @@ Subanimation37:
db FRAMEBLOCK_65, BASECOORD_88, FRAMEBLOCKMODE_00
db FRAMEBLOCK_65, BASECOORD_1A, FRAMEBLOCKMODE_00
Subanimation38:
Subanim_0IceFall:
subanim SUBANIMTYPE_HFLIP, 16
db FRAMEBLOCK_66, BASECOORD_8A, FRAMEBLOCKMODE_00
db FRAMEBLOCK_66, BASECOORD_33, FRAMEBLOCKMODE_00
@ -776,7 +776,7 @@ Subanimation38:
db FRAMEBLOCK_66, BASECOORD_1E, FRAMEBLOCKMODE_04
db FRAMEBLOCK_67, BASECOORD_29, FRAMEBLOCKMODE_00
Subanimation3e:
Subanim_1StarBigToss:
subanim SUBANIMTYPE_REVERSE, 18
db FRAMEBLOCK_02, BASECOORD_31, FRAMEBLOCKMODE_00
db FRAMEBLOCK_34, BASECOORD_31, FRAMEBLOCKMODE_00
@ -797,7 +797,7 @@ Subanimation3e:
db FRAMEBLOCK_34, BASECOORD_10, FRAMEBLOCKMODE_00
db FRAMEBLOCK_02, BASECOORD_10, FRAMEBLOCKMODE_00
Subanimation3f:
Subanim_1StarsSmallToss:
subanim SUBANIMTYPE_COORDFLIP, 18
db FRAMEBLOCK_68, BASECOORD_4B, FRAMEBLOCKMODE_00
db FRAMEBLOCK_68, BASECOORD_8C, FRAMEBLOCKMODE_00
@ -818,7 +818,7 @@ Subanimation3f:
db FRAMEBLOCK_68, BASECOORD_23, FRAMEBLOCKMODE_00
db FRAMEBLOCK_68, BASECOORD_1F, FRAMEBLOCKMODE_00
Subanimation44:
Subanim_1LeavesToss:
subanim SUBANIMTYPE_HVFLIP, 12
db FRAMEBLOCK_69, BASECOORD_4B, FRAMEBLOCKMODE_00
db FRAMEBLOCK_69, BASECOORD_8C, FRAMEBLOCKMODE_00
@ -833,20 +833,20 @@ Subanimation44:
db FRAMEBLOCK_69, BASECOORD_0C, FRAMEBLOCKMODE_00
db FRAMEBLOCK_69, BASECOORD_06, FRAMEBLOCKMODE_00
Subanimation43:
Subanim_0Circle_1Square_Closing:
subanim SUBANIMTYPE_ENEMY, 3
db FRAMEBLOCK_6A, BASECOORD_07, FRAMEBLOCKMODE_00
db FRAMEBLOCK_6B, BASECOORD_0F, FRAMEBLOCKMODE_00
db FRAMEBLOCK_6C, BASECOORD_17, FRAMEBLOCKMODE_00
Subanimation45:
Subanim_0HornJabTwice:
subanim SUBANIMTYPE_HVFLIP, 4
db FRAMEBLOCK_6D, BASECOORD_8B, FRAMEBLOCKMODE_00
db FRAMEBLOCK_6D, BASECOORD_84, FRAMEBLOCKMODE_00
db FRAMEBLOCK_6D, BASECOORD_63, FRAMEBLOCKMODE_00
db FRAMEBLOCK_6D, BASECOORD_8C, FRAMEBLOCKMODE_00
Subanimation46:
Subanim_0HornJabThrice:
subanim SUBANIMTYPE_HVFLIP, 6
db FRAMEBLOCK_6D, BASECOORD_8B, FRAMEBLOCKMODE_00
db FRAMEBLOCK_6D, BASECOORD_84, FRAMEBLOCKMODE_00
@ -855,13 +855,13 @@ Subanimation46:
db FRAMEBLOCK_6D, BASECOORD_0A, FRAMEBLOCKMODE_00
db FRAMEBLOCK_6D, BASECOORD_89, FRAMEBLOCKMODE_00
Subanimation47:
Subanim_0BallPoof:
subanim SUBANIMTYPE_HVFLIP, 3
db FRAMEBLOCK_06, BASECOORD_82, FRAMEBLOCKMODE_00
db FRAMEBLOCK_07, BASECOORD_82, FRAMEBLOCKMODE_00
db FRAMEBLOCK_08, BASECOORD_96, FRAMEBLOCKMODE_00
Subanimation48:
Subanim_2TradeBallDrop:
subanim SUBANIMTYPE_NORMAL, 6
db FRAMEBLOCK_03, BASECOORD_41, FRAMEBLOCKMODE_04
db FRAMEBLOCK_03, BASECOORD_48, FRAMEBLOCKMODE_04
@ -870,24 +870,24 @@ Subanimation48:
db FRAMEBLOCK_05, BASECOORD_48, FRAMEBLOCKMODE_04
db FRAMEBLOCK_03, BASECOORD_48, FRAMEBLOCKMODE_03
Subanimation49:
Subanim_2TradeBallShake:
subanim SUBANIMTYPE_NORMAL, 4
db FRAMEBLOCK_04, BASECOORD_48, FRAMEBLOCKMODE_04
db FRAMEBLOCK_03, BASECOORD_48, FRAMEBLOCKMODE_04
db FRAMEBLOCK_05, BASECOORD_48, FRAMEBLOCKMODE_04
db FRAMEBLOCK_03, BASECOORD_48, FRAMEBLOCKMODE_03
Subanimation4a:
Subanim_2TradeBallAppear:
subanim SUBANIMTYPE_NORMAL, 1
db FRAMEBLOCK_04, BASECOORD_84, FRAMEBLOCKMODE_03
Subanimation4b:
Subanim_2TradeBallPoof:
subanim SUBANIMTYPE_NORMAL, 3
db FRAMEBLOCK_06, BASECOORD_72, FRAMEBLOCKMODE_00
db FRAMEBLOCK_07, BASECOORD_72, FRAMEBLOCKMODE_00
db FRAMEBLOCK_08, BASECOORD_72, FRAMEBLOCKMODE_00
Subanimation4c:
Subanim_0EggShaking:
subanim SUBANIMTYPE_COORDFLIP, 8
db FRAMEBLOCK_6F, BASECOORD_30, FRAMEBLOCKMODE_00
db FRAMEBLOCK_6E, BASECOORD_30, FRAMEBLOCKMODE_00
@ -898,7 +898,7 @@ Subanimation4c:
db FRAMEBLOCK_70, BASECOORD_30, FRAMEBLOCKMODE_00
db FRAMEBLOCK_6E, BASECOORD_30, FRAMEBLOCKMODE_00
Subanimation4d:
Subanim_1TriangleToss:
subanim SUBANIMTYPE_HVFLIP, 6
db FRAMEBLOCK_32, BASECOORD_4B, FRAMEBLOCKMODE_00
db FRAMEBLOCK_33, BASECOORD_4F, FRAMEBLOCKMODE_00
@ -907,7 +907,7 @@ Subanimation4d:
db FRAMEBLOCK_32, BASECOORD_19, FRAMEBLOCKMODE_00
db FRAMEBLOCK_33, BASECOORD_0D, FRAMEBLOCKMODE_00
Subanimation51:
Subanim_0Shell:
subanim SUBANIMTYPE_ENEMY, 6
db FRAMEBLOCK_76, BASECOORD_1B, FRAMEBLOCKMODE_00
db FRAMEBLOCK_34, BASECOORD_1B, FRAMEBLOCKMODE_00
@ -916,7 +916,7 @@ Subanimation51:
db FRAMEBLOCK_76, BASECOORD_1B, FRAMEBLOCKMODE_00
db FRAMEBLOCK_34, BASECOORD_1B, FRAMEBLOCKMODE_00
Subanimation52:
Subanim_0CoinBounce:
subanim SUBANIMTYPE_HFLIP, 7
db FRAMEBLOCK_77, BASECOORD_25, FRAMEBLOCKMODE_00
db FRAMEBLOCK_77, BASECOORD_9B, FRAMEBLOCKMODE_00
@ -926,7 +926,7 @@ Subanimation52:
db FRAMEBLOCK_77, BASECOORD_50, FRAMEBLOCKMODE_00
db FRAMEBLOCK_77, BASECOORD_8C, FRAMEBLOCKMODE_00
Subanimation53:
Subanim_0SafariRock:
subanim SUBANIMTYPE_NORMAL, 12
db FRAMEBLOCK_78, BASECOORD_30, FRAMEBLOCKMODE_00
db FRAMEBLOCK_78, BASECOORD_A2, FRAMEBLOCKMODE_00
@ -941,7 +941,7 @@ Subanimation53:
db FRAMEBLOCK_78, BASECOORD_34, FRAMEBLOCKMODE_00
db FRAMEBLOCK_01, BASECOORD_9E, FRAMEBLOCKMODE_00
Subanimation54:
Subanim_0SafariBait:
subanim SUBANIMTYPE_NORMAL, 11
db FRAMEBLOCK_79, BASECOORD_30, FRAMEBLOCKMODE_00
db FRAMEBLOCK_79, BASECOORD_A2, FRAMEBLOCKMODE_00

View File

@ -1,73 +1,71 @@
; Valid sprite IDs for each outdoor map.
MapSpriteSets:
table_width 1, MapSpriteSets
db $01 ; PALLET_TOWN
db $01 ; VIRIDIAN_CITY
db $02 ; PEWTER_CITY
db $02 ; CERULEAN_CITY
db $03 ; LAVENDER_TOWN
db $04 ; VERMILION_CITY
db $05 ; CELADON_CITY
db $0a ; FUCHSIA_CITY
db $01 ; CINNABAR_ISLAND
db $06 ; INDIGO_PLATEAU
db $07 ; SAFFRON_CITY
db $01 ; unused map ID
db $01 ; ROUTE_1
db $f1 ; ROUTE_2
db $02 ; ROUTE_3
db $02 ; ROUTE_4
db $f9 ; ROUTE_5
db $fa ; ROUTE_6
db $fb ; ROUTE_7
db $fc ; ROUTE_8
db $02 ; ROUTE_9
db $f2 ; ROUTE_10
db $f3 ; ROUTE_11
db $f4 ; ROUTE_12
db $08 ; ROUTE_13
db $08 ; ROUTE_14
db $f5 ; ROUTE_15
db $f6 ; ROUTE_16
db $09 ; ROUTE_17
db $f7 ; ROUTE_18
db $0a ; ROUTE_19
db $f8 ; ROUTE_20
db $01 ; ROUTE_21
db $01 ; ROUTE_22
db $06 ; ROUTE_23
db $02 ; ROUTE_24
db $02 ; ROUTE_25
db SPRITESET_PALLET_VIRIDIAN ; PALLET_TOWN
db SPRITESET_PALLET_VIRIDIAN ; VIRIDIAN_CITY
db SPRITESET_PEWTER_CERULEAN ; PEWTER_CITY
db SPRITESET_PEWTER_CERULEAN ; CERULEAN_CITY
db SPRITESET_LAVENDER ; LAVENDER_TOWN
db SPRITESET_VERMILION ; VERMILION_CITY
db SPRITESET_CELADON ; CELADON_CITY
db SPRITESET_FUCHSIA ; FUCHSIA_CITY
db SPRITESET_PALLET_VIRIDIAN ; CINNABAR_ISLAND
db SPRITESET_INDIGO ; INDIGO_PLATEAU
db SPRITESET_SAFFRON ; SAFFRON_CITY
db SPRITESET_PALLET_VIRIDIAN ; UNUSED_MAP_0B
db SPRITESET_PALLET_VIRIDIAN ; ROUTE_1
db SPLITSET_ROUTE_2 ; ROUTE_2
db SPRITESET_PEWTER_CERULEAN ; ROUTE_3
db SPRITESET_PEWTER_CERULEAN ; ROUTE_4
db SPLITSET_ROUTE_5 ; ROUTE_5
db SPLITSET_ROUTE_6 ; ROUTE_6
db SPLITSET_ROUTE_7 ; ROUTE_7
db SPLITSET_ROUTE_8 ; ROUTE_8
db SPRITESET_PEWTER_CERULEAN ; ROUTE_9
db SPLITSET_ROUTE_10 ; ROUTE_10
db SPLITSET_ROUTE_11 ; ROUTE_11
db SPLITSET_ROUTE_12 ; ROUTE_12
db SPRITESET_SILENCE_BRIDGE ; ROUTE_13
db SPRITESET_SILENCE_BRIDGE ; ROUTE_14
db SPLITSET_ROUTE_15 ; ROUTE_15
db SPLITSET_ROUTE_16 ; ROUTE_16
db SPRITESET_CYCLING_ROAD ; ROUTE_17
db SPLITSET_ROUTE_18 ; ROUTE_18
db SPRITESET_FUCHSIA ; ROUTE_19
db SPLITSET_ROUTE_20 ; ROUTE_20
db SPRITESET_PALLET_VIRIDIAN ; ROUTE_21
db SPRITESET_PALLET_VIRIDIAN ; ROUTE_22
db SPRITESET_INDIGO ; ROUTE_23
db SPRITESET_PEWTER_CERULEAN ; ROUTE_24
db SPRITESET_PEWTER_CERULEAN ; ROUTE_25
assert_table_length FIRST_INDOOR_MAP
DEF EAST_WEST EQU 1
DEF NORTH_SOUTH EQU 2
; Format:
; 00: determines whether the map is split EAST_WEST or NORTH_SOUTH
; 01: coordinate of dividing line
; 02: sprite set ID if in the West or North side
; 03: sprite set ID if in the East or South side
; #1: whether the map is split EAST_WEST or NORTH_SOUTH
; #2: coordinate of dividing line
; #3: sprite set ID if on the west or north side
; #4: sprite set ID if on the east or south side
SplitMapSpriteSets:
db NORTH_SOUTH, 37, $02, $01 ; $f1
db NORTH_SOUTH, 50, $02, $03 ; $f2
db EAST_WEST, 57, $04, $08 ; $f3
db NORTH_SOUTH, 21, $03, $08 ; $f4
db EAST_WEST, 8, $0A, $08 ; $f5
db EAST_WEST, 24, $09, $05 ; $f6
db EAST_WEST, 34, $09, $0A ; $f7
db EAST_WEST, 53, $01, $0A ; $f8
db NORTH_SOUTH, 33, $02, $07 ; $f9
db NORTH_SOUTH, 2, $07, $04 ; $fa
db EAST_WEST, 17, $05, $07 ; $fb
db EAST_WEST, 3, $07, $03 ; $fc
table_width 4, SplitMapSpriteSets
db NORTH_SOUTH, 37, SPRITESET_PEWTER_CERULEAN, SPRITESET_PALLET_VIRIDIAN ; SPLITSET_ROUTE_2
db NORTH_SOUTH, 50, SPRITESET_PEWTER_CERULEAN, SPRITESET_LAVENDER ; SPLITSET_ROUTE_10
db EAST_WEST, 57, SPRITESET_VERMILION, SPRITESET_SILENCE_BRIDGE ; SPLITSET_ROUTE_11
db NORTH_SOUTH, 21, SPRITESET_LAVENDER, SPRITESET_SILENCE_BRIDGE ; SPLITSET_ROUTE_12
db EAST_WEST, 8, SPRITESET_FUCHSIA, SPRITESET_SILENCE_BRIDGE ; SPLITSET_ROUTE_15
db EAST_WEST, 24, SPRITESET_CYCLING_ROAD, SPRITESET_CELADON ; SPLITSET_ROUTE_16
db EAST_WEST, 34, SPRITESET_CYCLING_ROAD, SPRITESET_FUCHSIA ; SPLITSET_ROUTE_18
db EAST_WEST, 53, SPRITESET_PALLET_VIRIDIAN, SPRITESET_FUCHSIA ; SPLITSET_ROUTE_20
db NORTH_SOUTH, 33, SPRITESET_PEWTER_CERULEAN, SPRITESET_SAFFRON ; SPLITSET_ROUTE_5
db NORTH_SOUTH, 2, SPRITESET_SAFFRON, SPRITESET_VERMILION ; SPLITSET_ROUTE_6
db EAST_WEST, 17, SPRITESET_CELADON, SPRITESET_SAFFRON ; SPLITSET_ROUTE_7
db EAST_WEST, 3, SPRITESET_SAFFRON, SPRITESET_LAVENDER ; SPLITSET_ROUTE_8
assert_table_length NUM_SPLIT_SETS
SpriteSets:
table_width SPRITE_SET_LENGTH, SpriteSets
; each sprite set has 9 walking sprites and 2 still sprites
DEF SPRITE_SET_LENGTH EQU 9 + 2
; sprite set $01
table_width 1
; SPRITESET_PALLET_VIRIDIAN
db SPRITE_PIKACHU
db SPRITE_BLUE
db SPRITE_YOUNGSTER
@ -79,10 +77,8 @@ DEF SPRITE_SET_LENGTH EQU 9 + 2
db SPRITE_SWIMMER
db SPRITE_POKE_BALL
db SPRITE_GAMBLER_ASLEEP
assert_table_length SPRITE_SET_LENGTH
; sprite set $02
table_width 1
; SPRITESET_PEWTER_CERULEAN
db SPRITE_PIKACHU
db SPRITE_YOUNGSTER
db SPRITE_ROCKET
@ -94,10 +90,8 @@ DEF SPRITE_SET_LENGTH EQU 9 + 2
db SPRITE_COOLTRAINER_M
db SPRITE_POKE_BALL
db SPRITE_UNUSED_GAMBLER_ASLEEP_2
assert_table_length SPRITE_SET_LENGTH
; sprite set $03
table_width 1
; SPRITESET_LAVENDER
db SPRITE_PIKACHU
db SPRITE_LITTLE_GIRL
db SPRITE_GIRL
@ -109,10 +103,8 @@ DEF SPRITE_SET_LENGTH EQU 9 + 2
db SPRITE_COOLTRAINER_M
db SPRITE_POKE_BALL
db SPRITE_UNUSED_GAMBLER_ASLEEP_2
assert_table_length SPRITE_SET_LENGTH
; sprite set $04
table_width 1
; SPRITESET_VERMILION
db SPRITE_PIKACHU
db SPRITE_OFFICER_JENNY
db SPRITE_SUPER_NERD
@ -124,10 +116,8 @@ DEF SPRITE_SET_LENGTH EQU 9 + 2
db SPRITE_COOLTRAINER_M
db SPRITE_POKE_BALL
db SPRITE_UNUSED_GAMBLER_ASLEEP_2
assert_table_length SPRITE_SET_LENGTH
; sprite set $05
table_width 1
; SPRITESET_CELADON
db SPRITE_PIKACHU
db SPRITE_LITTLE_GIRL
db SPRITE_LITTLE_BOY
@ -139,10 +129,8 @@ DEF SPRITE_SET_LENGTH EQU 9 + 2
db SPRITE_ROCKET
db SPRITE_POKE_BALL
db SPRITE_SNORLAX
assert_table_length SPRITE_SET_LENGTH
; sprite set $06
table_width 1
; SPRITESET_INDIGO
db SPRITE_PIKACHU
db SPRITE_GYM_GUIDE
db SPRITE_MONSTER
@ -154,10 +142,8 @@ DEF SPRITE_SET_LENGTH EQU 9 + 2
db SPRITE_GAMBLER
db SPRITE_POKE_BALL
db SPRITE_UNUSED_GAMBLER_ASLEEP_2
assert_table_length SPRITE_SET_LENGTH
; sprite set $07
table_width 1
; SPRITESET_SAFFRON
db SPRITE_PIKACHU
db SPRITE_ROCKET
db SPRITE_SCIENTIST
@ -169,10 +155,8 @@ DEF SPRITE_SET_LENGTH EQU 9 + 2
db SPRITE_COOLTRAINER_M
db SPRITE_POKE_BALL
db SPRITE_UNUSED_GAMBLER_ASLEEP_2
assert_table_length SPRITE_SET_LENGTH
; sprite set $08
table_width 1
; SPRITESET_SILENCE_BRIDGE
db SPRITE_PIKACHU
db SPRITE_BIKER
db SPRITE_SUPER_NERD
@ -184,10 +168,8 @@ DEF SPRITE_SET_LENGTH EQU 9 + 2
db SPRITE_ROCKER
db SPRITE_POKE_BALL
db SPRITE_SNORLAX
assert_table_length SPRITE_SET_LENGTH
; sprite set $09
table_width 1
; SPRITESET_CYCLING_ROAD
db SPRITE_PIKACHU
db SPRITE_BIKER
db SPRITE_COOLTRAINER_M
@ -199,10 +181,8 @@ DEF SPRITE_SET_LENGTH EQU 9 + 2
db SPRITE_MIDDLE_AGED_MAN
db SPRITE_POKE_BALL
db SPRITE_SNORLAX
assert_table_length SPRITE_SET_LENGTH
; sprite set $0a
table_width 1
; SPRITESET_FUCHSIA
db SPRITE_PIKACHU
db SPRITE_COOLTRAINER_M
db SPRITE_CHANSEY
@ -214,4 +194,5 @@ DEF SPRITE_SET_LENGTH EQU 9 + 2
db SPRITE_YOUNGSTER
db SPRITE_POKE_BALL
db SPRITE_FOSSIL
assert_table_length SPRITE_SET_LENGTH
assert_table_length NUM_SPRITE_SETS

File diff suppressed because it is too large Load Diff

View File

@ -275,7 +275,7 @@ PlayAnimation:
ld a, [wAnimPalette]
ldh [rOBP0], a
call UpdateGBCPal_OBP0
call LoadAnimationTileset
call LoadMoveAnimationTiles
call LoadSubanimation
call PlaySubanimation
pop af
@ -372,11 +372,11 @@ GetSubanimationTransform2:
ret
; loads tile patterns for battle animations
LoadAnimationTileset:
LoadMoveAnimationTiles:
ld a, [wWhichBattleAnimTileset]
add a
add a
ld hl, AnimationTilesetPointers
ld hl, MoveAnimationTilesPointers
ld e, a
ld d, 0
add hl, de
@ -387,7 +387,7 @@ LoadAnimationTileset:
ld a, [hl]
ld d, a ; de = address of tileset
ld hl, vSprites tile $31
ld b, BANK(AnimationTileset1) ; ROM bank
ld b, BANK(MoveAnimationTiles0) ; ROM bank
ld a, [wTempTilesetNumTiles]
ld c, a ; number of tiles
jp CopyVideoData ; load tileset
@ -398,17 +398,18 @@ MACRO anim_tileset
db -1 ; padding
ENDM
AnimationTilesetPointers:
MoveAnimationTilesPointers:
; number of tiles, gfx pointer
anim_tileset 79, AnimationTileset1
anim_tileset 79, AnimationTileset2
anim_tileset 64, AnimationTileset1
anim_tileset 79, MoveAnimationTiles0
anim_tileset 79, MoveAnimationTiles1
anim_tileset 64, MoveAnimationTiles2
AnimationTileset1:
INCBIN "gfx/battle/attack_anim_1.2bpp"
MoveAnimationTiles0:
MoveAnimationTiles2:
INCBIN "gfx/battle/move_anim_0.2bpp"
AnimationTileset2:
INCBIN "gfx/battle/attack_anim_2.2bpp"
MoveAnimationTiles1:
INCBIN "gfx/battle/move_anim_1.2bpp"
SlotMachineTiles2:
INCBIN "gfx/slots/slots_2.2bpp"
@ -1158,7 +1159,7 @@ AnimationWaterDropletsEverywhere:
; in Surf/Mist/Toxic.
xor a
ld [wWhichBattleAnimTileset], a
call LoadAnimationTileset
call LoadMoveAnimationTiles
ld d, 32
ld a, -16
ld [wBaseCoordX], a
@ -1720,7 +1721,7 @@ _AnimationShootBallsUpward:
push bc
xor a
ld [wWhichBattleAnimTileset], a
call LoadAnimationTileset
call LoadMoveAnimationTiles
pop bc
ld d, $7a ; ball tile
ld hl, wShadowOAM
@ -2234,7 +2235,7 @@ InitMultipleObjectsOAM:
push bc
push de
ld [wWhichBattleAnimTileset], a
call LoadAnimationTileset
call LoadMoveAnimationTiles
pop de
pop bc
xor a

View File

@ -5,13 +5,13 @@ LoadShootingStarGraphics:
ldh [rOBP1], a
call UpdateGBCPal_OBP0
call UpdateGBCPal_OBP1
ld de, AnimationTileset2 tile 3 ; star tile (top left quadrant)
ld de, MoveAnimationTiles1 tile 3 ; star tile (top left quadrant)
ld hl, vChars1 tile $20
lb bc, BANK(AnimationTileset2), 1
lb bc, BANK(MoveAnimationTiles1), 1
call CopyVideoData
ld de, AnimationTileset2 tile 19 ; star tile (bottom left quadrant)
ld de, MoveAnimationTiles1 tile 19 ; star tile (bottom left quadrant)
ld hl, vChars1 tile $21
lb bc, BANK(AnimationTileset2), 1
lb bc, BANK(MoveAnimationTiles1), 1
call CopyVideoData
ld de, FallingStar
ld hl, vChars1 tile $22

View File

@ -113,8 +113,8 @@ InitCutAnimOAM:
ret
LoadCutGrassAnimationTilePattern:
ld de, AnimationTileset2 tile 6 ; tile depicting a leaf
lb bc, BANK(AnimationTileset2), 1
ld de, MoveAnimationTiles1 tile 6 ; tile depicting a leaf
lb bc, BANK(MoveAnimationTiles1), 1
jp CopyVideoData
WriteCutOrBoulderDustAnimationOAMBlock:

View File

@ -11,7 +11,7 @@
_InitMapSprites::
call InitOutsideMapSprites
ret c ; return if the map is an outside map (already handled by above call)
; if the map is an inside map (i.e. mapID >= $25)
; if the map is an inside map (i.e. mapID >= FIRST_INDOOR_MAP)
call LoadSpriteSetFromMapHeader
call LoadMapSpriteTilePatterns
call Func_14150
@ -38,11 +38,11 @@ InitOutsideMapSprites:
dec a
ld c, a
ld b, 0
ld a, (wSpriteSetID - wSpriteSet)
ld a, wSpriteSetID - wSpriteSet
ld hl, SpriteSets
call AddNTimes ; get sprite set offset
ld de, wSpriteSet
ld bc, (wSpriteSetID - wSpriteSet)
ld bc, wSpriteSetID - wSpriteSet
call CopyData ; copy it to wSpriteSet
call LoadMapSpriteTilePatterns
.skipLoadingSpriteSet
@ -186,7 +186,7 @@ LoadWalkingTilePattern:
ld d, h
ld e, l
call GetSpriteVRAMAddress
set 3, h ; add $800 to hl
set 3, h ; add $80 tiles to hl
call CopyVideoDataAlternate
ret
@ -205,19 +205,17 @@ GetSpriteVRAMAddress:
ret
SpriteVRAMAddresses:
; Equivalent to multiplying $C0 (number of bytes in 12 tiles) times the VRAM
; slot and adding the result to $8000 (the VRAM base address).
dw vChars0 + $0c0
dw vChars0 + $180
dw vChars0 + $240
dw vChars0 + $300
dw vChars0 + $3c0
dw vChars0 + $480
dw vChars0 + $540
dw vChars0 + $600
dw vChars0 + $6c0
dw vChars0 + $780 ; 4-tile sprites
dw vChars0 + $7c0 ; 4-tile sprites
dw vChars0 + (1 * 12) tiles
dw vChars0 + (2 * 12) tiles
dw vChars0 + (3 * 12) tiles
dw vChars0 + (4 * 12) tiles
dw vChars0 + (5 * 12) tiles
dw vChars0 + (6 * 12) tiles
dw vChars0 + (7 * 12) tiles
dw vChars0 + (8 * 12) tiles
dw vChars0 + (9 * 12) tiles
dw vChars0 + (10 * 12) tiles ; 4-tile sprites
dw vChars0 + (10 * 12 + 4) tiles ; 4-tile sprites
ReadSpriteSheetData:
ldh a, [hVRAMSlot]
@ -263,7 +261,7 @@ Func_14150:
jr z, .spriteUnused
call Func_14179
push hl
ld de, (wSpritePlayerStateData2ImageBaseOffset) - (wSpriteStateData1) ; $10e
ld de, wSpritePlayerStateData2ImageBaseOffset - wSpriteStateData1
add hl, de ; [x#SPRITESTATEDATA2_IMAGEBASEOFFSET]
ld [hl], a ; write offset
pop hl
@ -304,11 +302,11 @@ GetSplitMapSpriteSetID:
ld hl, MapSpriteSets
add hl, de
ld a, [hl] ; a = spriteSetID
cp $f0 ; does the map have 2 sprite sets?
cp FIRST_SPLIT_SET - 1 ; does the map have 2 sprite sets?
ret c
; Chooses the correct sprite set ID depending on the player's position within
; the map for maps with two sprite sets.
cp $f8
cp SPLITSET_ROUTE_20
jr z, .route20
ld hl, SplitMapSpriteSets
and $0f
@ -320,8 +318,8 @@ GetSplitMapSpriteSetID:
jr nc, .noCarry
inc h
.noCarry
ld a, [hli] ; determines whether the map is split East/West or North/South
cp $01
ld a, [hli] ; whether the map is split EAST_WEST or NORTH_SOUTH
cp EAST_WEST
ld a, [hli] ; position of dividing line
ld b, a
jr z, .eastWestDivide
@ -333,35 +331,39 @@ GetSplitMapSpriteSetID:
.compareCoord
cp b
jr c, .loadSpriteSetID
; if in the East side or South side
; if in the east side or south side
inc hl
.loadSpriteSetID
ld a, [hl]
ret
; Uses sprite set $01 for West side and $0A for East side.
; Uses sprite set SPRITESET_PALLET_VIRIDIAN for west side and SPRITESET_FUCHSIA for east side.
; Route 20 is a special case because the two map sections have a more complex
; shape instead of the map simply being split horizontally or vertically.
.route20
ld hl, wXCoord
; Use SPRITESET_PALLET_VIRIDIAN if X < 43
ld a, [hl]
cp $2b
ld a, $01
cp 43
ld a, SPRITESET_PALLET_VIRIDIAN
ret c
; Use SPRITESET_FUCHSIA if X >= 62.
ld a, [hl]
cp $3e
ld a, $0a
cp 62
ld a, SPRITESET_FUCHSIA
ret nc
; If 55 <= X < 62, split Y at 8; else 43 <= X < 55, so split Y at 13
ld a, [hl]
cp $37
ld b, $08
cp 55
ld b, 8
jr nc, .next
ld b, $0d
ld b, 13
.next
; Use SPRITESET_FUCHSIA if Y < split; else use SPRITESET_PALLET_VIRIDIAN
ld a, [wYCoord]
cp b
ld a, $0a
ld a, SPRITESET_FUCHSIA
ret c
ld a, $01
ld a, SPRITESET_PALLET_VIRIDIAN
ret
INCLUDE "data/maps/sprite_sets.asm"

View File

Before

Width:  |  Height:  |  Size: 977 B

After

Width:  |  Height:  |  Size: 977 B

View File

Before

Width:  |  Height:  |  Size: 936 B

After

Width:  |  Height:  |  Size: 936 B

View File

@ -1,6 +1,3 @@
INCLUDE "constants.asm"
SECTION "NULL", ROM0
NULL::

View File

@ -1,6 +1,20 @@
INCLUDE "charmap.asm"
INCLUDE "macros.asm"
INCLUDE "macros/asserts.asm"
INCLUDE "macros/const.asm"
INCLUDE "macros/predef.asm"
INCLUDE "macros/farcall.asm"
INCLUDE "macros/data.asm"
INCLUDE "macros/code.asm"
INCLUDE "macros/gfx.asm"
INCLUDE "macros/coords.asm"
INCLUDE "macros/vc.asm"
INCLUDE "macros/scripts/audio.asm"
INCLUDE "macros/scripts/maps.asm"
INCLUDE "macros/scripts/events.asm"
INCLUDE "macros/scripts/text.asm"
INCLUDE "macros/scripts/gfx_anims.asm"
INCLUDE "constants/hardware_constants.asm"
INCLUDE "constants/oam_constants.asm"
@ -28,6 +42,7 @@ INCLUDE "constants/map_constants.asm"
INCLUDE "constants/map_data_constants.asm"
INCLUDE "constants/map_object_constants.asm"
INCLUDE "constants/hide_show_constants.asm"
INCLUDE "constants/sprite_set_constants.asm"
INCLUDE "constants/credits_constants.asm"
INCLUDE "constants/audio_constants.asm"
INCLUDE "constants/music_constants.asm"

View File

@ -1,15 +0,0 @@
INCLUDE "macros/asserts.asm"
INCLUDE "macros/const.asm"
INCLUDE "macros/predef.asm"
INCLUDE "macros/farcall.asm"
INCLUDE "macros/data.asm"
INCLUDE "macros/code.asm"
INCLUDE "macros/gfx.asm"
INCLUDE "macros/coords.asm"
INCLUDE "macros/vc.asm"
INCLUDE "macros/scripts/audio.asm"
INCLUDE "macros/scripts/maps.asm"
INCLUDE "macros/scripts/events.asm"
INCLUDE "macros/scripts/text.asm"
INCLUDE "macros/scripts/gfx_anims.asm"

View File

@ -71,10 +71,8 @@ MACRO dab ; dwb address, bank
ENDM
MACRO sine_table
; \1 samples of sin(x) from x=0 to x<32768 (pi radians)
DEF x = 0
REPT \1
dw (sin(x) + (sin(x) & $ff)) >> 8 ; round up
DEF x += DIV(32768, \1) ; a circle has 65536 "degrees"
ENDR
; \1 samples of sin(x) from x=0 to x<0.5 turns (pi radians)
for x, \1
dw sin(x * 0.5 / (\1))
endr
ENDM

View File

@ -1,6 +1,3 @@
INCLUDE "constants.asm"
SECTION "bank1", ROMX
INCLUDE "data/sprites/facings.asm"

View File

@ -1,6 +1,3 @@
INCLUDE "constants.asm"
SECTION "Maps 1", ROMX
INCLUDE "data/maps/headers/CeladonCity.asm"

View File

@ -1,5 +1,3 @@
INCLUDE "constants.asm"
INCLUDE "macros/ram.asm"

View File

@ -103,7 +103,7 @@ wSpriteStateData1::
; - E
; - F
wSpritePlayerStateData1:: spritestatedata1 wSpritePlayerStateData1 ; player is struct 0
; wSprite02StateData1 - wSprite15StateData1
; wSprite01StateData1 - wSprite14StateData1
FOR n, 1, NUM_SPRITESTATEDATA_STRUCTS - 1
wSprite{02d:n}StateData1:: spritestatedata1 wSprite{02d:n}StateData1
ENDR
@ -130,7 +130,7 @@ wSpriteStateData2::
; - E: sprite image base offset (in video ram, player always has value 1, used to compute sprite image index)
; - F
wSpritePlayerStateData2:: spritestatedata2 wSpritePlayerStateData2 ; player is struct 0
; wSprite02StateData2 - wSprite15StateData2
; wSprite01StateData2 - wSprite14StateData2
FOR n, 1, NUM_SPRITESTATEDATA_STRUCTS - 1
wSprite{02d:n}StateData2:: spritestatedata2 wSprite{02d:n}StateData2
ENDR

View File

@ -1,18 +1,16 @@
MAJOR EQU 0
MINOR EQU 5
PATCH EQU 2
MINOR EQU 6
PATCH EQU 0
MACRO wrong_rgbds
fail "pokeyellow requires rgbds v0.5.2 or newer."
ENDM
WRONG_RGBDS EQUS "fail \"pokeyellow requires rgbds v0.6.0 or newer.\""
IF !DEF(__RGBDS_MAJOR__) || !DEF(__RGBDS_MINOR__) || !DEF(__RGBDS_PATCH__)
wrong_rgbds
WRONG_RGBDS
ELSE
IF (__RGBDS_MAJOR__ < MAJOR) || \
(__RGBDS_MAJOR__ == MAJOR && __RGBDS_MINOR__ < MINOR) || \
(__RGBDS_MAJOR__ == MAJOR && __RGBDS_MINOR__ == MINOR && __RGBDS_PATCH__ < PATCH) || \
(__RGBDS_MAJOR__ == MAJOR && __RGBDS_MINOR__ == MINOR && __RGBDS_PATCH__ == PATCH && DEF(__RGBDS_RC__))
wrong_rgbds
WRONG_RGBDS
ENDC
ENDC

View File

@ -1,6 +1,3 @@
INCLUDE "constants.asm"
SECTION "Text 1", ROMX
INCLUDE "data/text/text_1.asm"

View File

@ -39,7 +39,7 @@ function register_bank(amount) {
}
}
rom_bank && toupper($0) ~ /^[ \t]*EMPTY/ {
rom_bank && toupper($0) ~ /^[ \t]*EMPTY$/ {
# Empty bank
register_bank(16384)
}

View File

@ -1,69 +0,0 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Usage: python3 free_space.py [BANK=none] [pokeyellow.map]
Calculate the free space in the ROM or its individual banks.
The BANK argument allows printing free space in one, all, or none of the ROM's banks.
Valid arguments are numbers (in decimal "42" or hexadecimal "0x2A"), "all" or "none".
If not specified, defaults to "none".
"""
import sys
from mapreader import MapReader
def main():
print_bank = 'none'
filename = 'pokeyellow.map'
for arg in sys.argv[1:]:
if arg.startswith('BANK='):
print_bank = arg.split('=', 1)[-1]
else:
filename = arg
if print_bank not in {'all', 'none'}:
try:
print_bank = (int(print_bank[2:], 16)
if print_bank.startswith('0x') or print_bank.startswith('0X')
else int(print_bank))
except ValueError:
error = f'Error: invalid BANK: {print_bank}'
if print_bank.isalnum():
error += f' (did you mean: 0x{print_bank}?)'
print(error, file=sys.stderr)
sys.exit(1)
num_banks = 0x80
bank_size = 0x4000 # bytes
total_size = num_banks * bank_size
reader = MapReader()
with open(filename, 'r', encoding='utf-8') as file:
reader.read_map_data(file.readlines())
free_space = 0
per_bank = []
default_bank_data = {'sections': [], 'used': 0, 'slack': bank_size}
for bank in range(num_banks):
bank_data = reader.bank_data['ROM0 bank' if bank == 0 else 'ROMX bank']
data = bank_data.get(bank, default_bank_data)
used, slack = data['used'], data['slack']
per_bank.append((used, slack))
free_space += slack
free_percent = 100 * free_space / total_size
print(f'Free space: {free_space}/{total_size} ({free_percent:.2f}%)')
if print_bank != 'none':
print()
print('bank, used, free')
for bank in range(num_banks):
used, slack = per_bank[bank]
if print_bank in {'all', bank}:
print(f'${bank:02X}, {used}, {slack}')
if __name__ == '__main__':
main()

View File

@ -1,173 +0,0 @@
# -*- coding: utf-8 -*-
# A library for parsing the pokeyellow.map file output by rgbds.
import re
class MapReader:
# {'ROM Bank': { 0: { 'sections': [ { 'beg': 1234,
# 'end': 5678,
# 'name': 'Section001',
# 'symbols': [ { 'symbol': 'Function1234',
# 'address: 1234,
# },
# ]
# },
# ],
# 'used': 1234,
# 'slack': 4567,
# },
# },
# 'OAM': { 'sections': [ { 'beg': 1234,
# 'end': 5678,
# 'name': 'Section002',
# 'symbols': [ { 'symbol': 'Data1234',
# 'address: 1234,
# },
# ]
# },
# ],
# 'used': 1234,
# 'slack': 4567,
# },
# }
#
bank_data = {}
bank_types = {
'HRAM' : { 'size': 0x80, 'banked': False, },
'OAM' : { 'size': 0xA0, 'banked': False, },
'ROM0 bank': { 'size': 0x4000, 'banked': True, },
'ROMX bank': { 'size': 0x4000, 'banked': True, },
'SRAM bank': { 'size': 0x2000, 'banked': True, },
'VRAM bank': { 'size': 0x1000, 'banked': True, },
'WRAM bank': { 'size': 0x2000, 'banked': True, },
}
# FSM states
INIT, BANK, SECTION = range(3)
# $506D-$519A ($012E bytes) ["Type Matchups"]
section_header_regex = re.compile('\$([0-9A-Fa-f]{4})-\$([0-9A-Fa-f]{4}) \(.*\) \["(.*)"\]')
# $506D = TypeMatchups
section_data_regex = re.compile('\$([0-9A-Fa-f]{4}) = (.*)')
# $3ED2 bytes
slack_regex = re.compile('\$([0-9A-Fa-f]{4}) bytes?')
def __init__(self, *args, **kwargs):
self.__dict__.update(kwargs)
def _parse_init(self, line):
line = line.split(':', 1)[0]
parts = line.split(' #', 1)
if (parts[0] in self.bank_types):
self._cur_bank_name = parts[0]
self._cur_bank_type = self.bank_types[self._cur_bank_name]
if (self._cur_bank_type['banked'] and len(parts) > 1):
parts[1] = parts[1].split(':', 1)[0]
parts[1] = parts[1].split(' ', 1)[0]
self._cur_bank = int(parts[1], 10)
if self._cur_bank_name not in self.bank_data:
self.bank_data[self._cur_bank_name] = {}
if self._cur_bank_type['banked']:
if self._cur_bank not in self.bank_data[self._cur_bank_name]:
self.bank_data[self._cur_bank_name][self._cur_bank] = {}
self._cur_data = self.bank_data[self._cur_bank_name][self._cur_bank]
else:
self._cur_data = self.bank_data[self._cur_bank_name]
if ({} == self._cur_data):
self._cur_data['sections'] = []
self._cur_data['used'] = 0
self._cur_data['slack'] = self._cur_bank_type['size']
return True
return False
def _parse_section_header(self, header):
section_data = self.section_header_regex.match(header)
if section_data is not None:
beg = int(section_data.group(1), 16)
end = int(section_data.group(2), 16)
name = section_data.group(3)
self._cur_section = {'beg': beg, 'end': end, 'name': name, 'symbols': []}
self._cur_data['sections'].append(self._cur_section)
return True
return False
def _parse_slack(self, data):
slack_data = self.slack_regex.match(data)
slack_bytes = int(slack_data.group(1), 16)
self._cur_data['slack'] = slack_bytes
used_bytes = 0
for s in self._cur_data['sections']:
used_bytes += s['end'] - s['beg'] + 1
self._cur_data['used'] = used_bytes
def read_map_data(self, map):
if type(map) is str:
map = map.split('\n')
self._state = MapReader.INIT
self._cur_bank_name = ''
self._cur_bank_type = {}
self._cur_bank = 0
self._cur_data = {}
for line in map:
line = line.rstrip()
if (MapReader.INIT == self._state):
if (self._parse_init(line)):
self._state = MapReader.BANK
elif (MapReader.BANK == self._state or MapReader.SECTION == self._state):
if ('' == line):
self._state = MapReader.INIT
else:
line = line.lstrip()
parts = line.split(': ', 1)
if (MapReader.SECTION == self._state):
section_data = self.section_data_regex.match(parts[0])
if section_data is not None:
address = int(section_data.group(1), 16)
name = section_data.group(2)
self._cur_section['symbols'].append({'name': name, 'address': address})
continue
if ('SECTION' == parts[0]):
if (self._parse_section_header(parts[1])):
self._state = MapReader.SECTION
elif ('SLACK' == parts[0]):
self._parse_slack(parts[1])
self._state = MapReader.INIT
elif ('EMPTY' == parts[0]):
self._cur_data = {'sections': [], 'used': 0, 'slack': self._cur_bank_type['size']}
self._state = MapReader.INIT
else:
pass
for k, v in self.bank_data.items():
if (self.bank_types[k]['banked']):
for _, vv in v.items():
vv['sections'].sort(key=lambda x: x['beg'])
for vvv in vv['sections']:
vvv['symbols'].sort(key=lambda x: x['address'])
else:
v['sections'].sort(key=lambda x: x['beg'])
for vv in v['sections']:
vv['symbols'].sort(key=lambda x: x['address'])

View File

@ -1,64 +0,0 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Usage: python used_space.py [pokeyellow.map] [used_space.png]
Generate a PNG visualizing the space used by each bank in the ROM.
"""
import sys
from colorsys import hls_to_rgb
import png
from mapreader import MapReader
def main():
mapfile = sys.argv[1] if len(sys.argv) >= 2 else 'pokeyellow.map'
outfile = sys.argv[2] if len(sys.argv) >= 3 else 'used_space.png'
num_banks = 0x80
bank_mask = 0x3FFF
bank_size = 0x4000 # bytes
bpp = 8 # bytes per pixel
height = 256 # pixels
assert bank_size % bpp == 0 and (bank_size // bpp) % height == 0
pixels_per_bank = bank_size // bpp # 2048 pixels
bank_width = pixels_per_bank // height # 8 pixels
width = bank_width * num_banks # 1024 pixels
reader = MapReader()
with open(mapfile, 'r', encoding='utf-8') as file:
reader.read_map_data(file.readlines())
hit_data = []
default_bank_data = {'sections': [], 'used': 0, 'slack': bank_size}
for bank in range(num_banks):
hits = [0] * pixels_per_bank
bank_data = reader.bank_data['ROM0 bank' if bank == 0 else 'ROMX bank']
data = bank_data.get(bank, default_bank_data)
for s in data['sections']:
beg = s['beg'] & bank_mask
end = s['end'] & bank_mask
for i in range(beg, end + 1):
hits[i // bpp] += 1
hit_data.append(hits)
pixels = [[(0xFF, 0xFF, 0xFF)] * width for _ in range(height)]
for bank, hits in enumerate(hit_data):
hue = 0 if bank == 0 else 210 if bank % 2 else 270
for i, hit in enumerate(hits):
x, y = i % bank_width + bank * bank_width, i // bank_width
hls = (hue / 360, 1 - (85 * hit / bpp) / 100, 1)
rgb = tuple(int(c * 0xFF) for c in hls_to_rgb(*hls))
pixels[y][x] = rgb
png_data = [tuple(c for pixel in row for c in pixel) for row in pixels]
with open(outfile, 'wb') as file:
writer = png.Writer(width, height, greyscale=False, bitdepth=8, compression=9)
writer.write(file, png_data)
if __name__ == '__main__':
main()

View File

@ -1,6 +1,4 @@
INCLUDE "constants.asm"
; These are all the asm constants needed to make the blue_vc patch.
; These are all the asm constants needed to make the yellow_vc patch.
MACRO vc_const
DEF x = \1