diff options
-rw-r--r-- | .github/workflows/main.yml | 54 | ||||
-rw-r--r-- | .travis.yml | 25 | ||||
-rw-r--r-- | README.md | 6 | ||||
-rw-r--r-- | constants/map_constants.asm | 76 | ||||
-rw-r--r-- | constants/map_data_constants.asm | 3 | ||||
-rw-r--r-- | data/maps/sprite_sets.asm | 210 | ||||
-rw-r--r-- | data/overworld_sprites.asm | 102 | ||||
-rw-r--r-- | engine/sprites/sprites.asm | 292 | ||||
-rw-r--r-- | layout.link | 8 | ||||
-rw-r--r-- | ram/wram.asm | 11 | ||||
-rwxr-xr-x | shim.sym | 7 |
11 files changed, 616 insertions, 178 deletions
diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml new file mode 100644 index 0000000..8cac4e7 --- /dev/null +++ b/.github/workflows/main.yml @@ -0,0 +1,54 @@ +name: CI + +on: + push: + branches: [ master ] + pull_request: + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@master + + - name: Checkout rgbds + uses: actions/checkout@master + with: + path: rgbds + ref: v0.5.1 + repository: gbdev/rgbds + + - name: Install rgbds + working-directory: rgbds + run: | + sudo make install + + - name: Remove rgbds + run: | + rm -rf rgbds + + - name: Cache baserom + id: cache-baserom + uses: actions/cache@master + with: + path: baserom.gb + key: ${{ runner.os }}-baserom + + - name: Download baserom + if: steps.cache-baserom.outputs.cache-hit != 'true' + run: | + sudo apt-get install wget p7zip-full + wget -O roms.7z 'https://tcrf.net/images/3/33/Pok%C3%A9mon_Gold_-_Spaceworld_1997_Demo_%28Debug%29.7z' + 7z e roms.7z + mv P*\(Debug\).sgb baserom.gb + rm -f roms.7z P*\(Header\ Fixed\).sgb + + - name: Compare + run: | + make -j$(nproc) compare + if ! git diff-index --quiet HEAD --; then + echo 'Uncommitted changes detected:' + git diff-index HEAD -- + return 1 + fi diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 0af363d..0000000 --- a/.travis.yml +++ /dev/null @@ -1,25 +0,0 @@ -language: c -os: linux -install: - - |- - ( cd - git clone -b v0.5.1 --depth=1 https://github.com/gbdev/rgbds - sudo make -C rgbds install - rm -rf rgbds - sudo apt-get install wget p7zip-full - ) -before_script: - - |- - function check_status() { - if ! git diff-index --quiet --ignore-submodules=all HEAD --; then - echo 'Uncommitted changes detected:'; - git diff-index HEAD --; - return 1; - fi; - } - - wget -O roms.7z 'https://tcrf.net/images/3/33/Pok%C3%A9mon_Gold_-_Spaceworld_1997_Demo_%28Debug%29.7z' - - 7z e roms.7z - - mv P*\(Debug\).sgb baserom.gb - - rm -f roms.7z P*\(Header\ Fixed\).sgb -script: - - make -j2 compare @@ -1,4 +1,4 @@ -# Pokémon Gold and Silver: Space World 1997 Demo [![Build Status][travis-badge]][travis] +# Pokémon Gold and Silver: Space World 1997 Demo [![Build Status][ci-badge]][ci] This is a work-in-progress disassembly of the Pokémon Gold and Pokémon Silver prototypes demoed at Space World 1997. @@ -38,5 +38,5 @@ Other disassembly projects: [pokeemerald]: https://github.com/pret/pokeemerald [discord]: https://discord.gg/d5dubZ3 [irc]: https://kiwiirc.com/client/irc.freenode.net/?#pret -[travis]: https://travis-ci.org/pret/pokegold-spaceworld -[travis-badge]: https://travis-ci.org/pret/pokegold-spaceworld.svg?branch=master +[ci]: https://github.com/pret/pokegold-spaceworld/actions +[ci-badge]: https://github.com/pret/pokegold-spaceworld/actions/workflows/main.yml/badge.svg diff --git a/constants/map_constants.asm b/constants/map_constants.asm index da632fb..1c5c4a0 100644 --- a/constants/map_constants.asm +++ b/constants/map_constants.asm @@ -1,5 +1,7 @@ newgroup: MACRO const_value = const_value + 1 +CURRENT_NUM_MAPGROUP_MAPS EQUS "NUM_\1_MAPS" +MAPGROUP_\1 EQU const_value __map_value__ = 1 ENDM @@ -14,11 +16,15 @@ __map_value__ = __map_value__ + 1 \1_HEIGHT EQU \3 ENDM +endgroup: MACRO +{CURRENT_NUM_MAPGROUP_MAPS} EQU __map_value__ - 1 +PURGE CURRENT_NUM_MAPGROUP_MAPS +ENDM + ; map ids const_def - newgroup ; 1 - + newgroup SILENT ; 1 map_const ROUTE_1_P1, 15, 9 ; 1 map_const ROUTE_1_P2, 10, 18 ; 2 map_const ROUTE_SILENT_EAST, 30, 9 ; 3 @@ -34,9 +40,9 @@ ENDM map_const SILENT_HILL_LAB_BACK, 4, 4 ; 13 map_const UNUSED_MAP_13, 4, 4 ; 14 map_const SHIZUKANA_OKA, 25, 18 ; 15 + endgroup - newgroup ; 2 - + newgroup OLD ; 2 map_const ROUTE_2, 15, 9 ; 1 map_const OLD_CITY, 20, 18 ; 2 map_const ROUTE_2_GATE_1F, 5, 4 ; 3 @@ -59,9 +65,9 @@ ENDM map_const OLD_CITY_POKECENTER_TIME_MACHINE, 8, 4 ; 20 map_const OLD_CITY_KURTS_HOUSE, 8, 4 ; 21 map_const OLD_CITY_SCHOOL, 4, 8 ; 22 + endgroup - newgroup ; 3 - + newgroup WEST ; 3 map_const WEST, 20, 18 ; 1 map_const WEST_MART_1F, 8, 4 ; 2 map_const WEST_MART_2F, 8, 4 ; 3 @@ -81,9 +87,9 @@ ENDM map_const WEST_GYM, 5, 9 ; 17 map_const WEST_HOUSE_1, 5, 4 ; 18 map_const WEST_HOUSE_2, 5, 4 ; 19 + endgroup - newgroup ; 4 - + newgroup HAITEKU ; 4 map_const HAITEKU_WEST_ROUTE, 25, 9 ; 1 map_const HAITEKU_WEST_ROUTE_OCEAN, 10, 27 ; 2 map_const HAITEKU, 20, 18 ; 3 @@ -98,9 +104,9 @@ ENDM map_const HAITEKU_IMPOSTER_OAK_HOUSE, 5, 4 ; 12 map_const HAITEKU_AQUARIUM_1F, 8, 4 ; 13 map_const HAITEKU_AQUARIUM_2F, 8, 4 ; 14 + endgroup - newgroup ; 5 - + newgroup FONTO ; 5 map_const FONTO_ROUTE_1, 35, 9 ; 1 map_const FONTO_ROUTE_2, 10, 18 ; 2 map_const FONTO_ROUTE_3, 25, 9 ; 3 @@ -117,9 +123,9 @@ ENDM map_const FONTO_POKECENTER_1F, 8, 4 ; 14 map_const FONTO_POKECENTER_2F, 8, 4 ; 15 map_const FONTO_LAB, 5, 4 ; 16 + endgroup - newgroup ; 6 - + newgroup BAADON ; 6 map_const BAADON_ROUTE_1, 10, 27 ; 1 map_const BAADON_ROUTE_2, 50, 9 ; 2 map_const BAADON_ROUTE_3, 10, 18 ; 3 @@ -134,9 +140,9 @@ ENDM map_const BAADON_HOUSE_2, 5, 4 ; 12 map_const BAADON_LEAGUE_1F, 4, 8 ; 13 map_const BAADON_LEAGUE_2F, 5, 9 ; 14 + endgroup - newgroup ; 7 - + newgroup NEWTYPE ; 7 map_const ROUTE_15, 15, 9 ; 1 map_const NEWTYPE_ROUTE, 15, 9 ; 2 map_const ROUTE_18, 10, 45 ; 3 @@ -157,9 +163,9 @@ ENDM map_const NEWTYPE_DINER, 4, 4 ; 18 map_const NEWTYPE_HOUSE_2, 5, 4 ; 19 map_const NEWTYPE_HOUSE_3, 5, 4 ; 20 + endgroup - newgroup ; 8 - + newgroup SUGAR ; 8 map_const SUGAR_ROUTE, 10, 27 ; 1 map_const SUGAR, 10, 9 ; 2 map_const SUGAR_ROUTE_GATE, 5, 4 ; 3 @@ -168,9 +174,9 @@ ENDM map_const SUGAR_MART, 8, 4 ; 6 map_const SUGAR_POKECENTER_1F, 8, 4 ; 7 map_const SUGAR_POKECENTER_2F, 8, 4 ; 8 + endgroup - newgroup ; 9 - + newgroup BULL ; 9 map_const BULL_FOREST_ROUTE_1, 25, 9 ; 1 map_const BULL_FOREST_ROUTE_2, 10, 27 ; 2 map_const BULL_FOREST_ROUTE_3, 10, 27 ; 3 @@ -186,9 +192,9 @@ ENDM map_const BULL_LEAGUE_1F, 4, 8 ; 13 map_const BULL_LEAGUE_2F, 5, 9 ; 14 map_const BULL_HOUSE_4, 5, 4 ; 15 + endgroup - newgroup ; 10 - + newgroup STAND ; 10 map_const STAND_ROUTE, 10, 27 ; 1 map_const STAND, 20, 18 ; 2 map_const STAND_ROUTE_GATE_KANTO, 5, 4 ; 3 @@ -202,9 +208,9 @@ ENDM map_const STAND_ROCKET_HOUSE_2F, 8, 4 ; 11 map_const STAND_LEAGUE_1F, 4, 8 ; 12 map_const STAND_LEAGUE_2F, 5, 9 ; 13 + endgroup - newgroup ; 11 - + newgroup KANTO ; 11 map_const KANTO_EAST_ROUTE, 20, 9 ; 1 map_const KANTO, 30, 27 ; 2 map_const KANTO_CERULEAN_HOUSE, 5, 4 ; 3 @@ -243,37 +249,37 @@ ENDM map_const KANTO_LEAGUE_2_1F, 4, 8 ; 36 map_const KANTO_LEAGUE_2_2F, 5, 9 ; 37 map_const KANTO_FISHING_GURU, 5, 4 ; 38 + endgroup - newgroup ; 12 - + newgroup PRINCE ; 12 map_const PRINCE_ROUTE, 10, 5 ; 1 map_const PRINCE, 10, 9 ; 2 + endgroup - newgroup ; 13 - + newgroup MT_FUJI ; 13 map_const MT_FUJI_ROUTE, 10, 5 ; 1 map_const MT_FUJI, 10, 9 ; 2 + endgroup - newgroup ; 14 - + newgroup SOUTH ; 14 map_const SOUTH, 20, 18 ; 1 map_const SOUTH_HOUSE_1, 5, 4 ; 2 map_const SOUTH_POKECENTER_1F, 8, 4 ; 3 map_const SOUTH_POKECENTER_2F, 8, 4 ; 4 map_const SOUTH_MART, 8, 4 ; 5 map_const SOUTH_HOUSE_2, 5, 4 ; 6 + endgroup - newgroup ; 15 - + newgroup NORTH ; 15 map_const NORTH, 10, 9 ; 1 map_const NORTH_HOUSE_1, 5, 4 ; 2 map_const NORTH_MART, 6, 4 ; 3 map_const NORTH_HOUSE_2, 5, 4 ; 4 map_const NORTH_POKECENTER_1F, 8, 4 ; 5 map_const NORTH_POKECENTER_2F, 8, 4 ; 6 + endgroup - newgroup ; 16 - + newgroup MISC ; 16 map_const POWER_PLANT_1, 10, 9 ; 1 map_const POWER_PLANT_2, 10, 9 ; 2 map_const POWER_PLANT_3, 15, 18 ; 3 @@ -292,5 +298,9 @@ ENDM map_const OFFICE_3, 10, 18 ; 16 map_const SLOWPOKE_WELL_ENTRANCE, 10, 9 ; 17 map_const SLOWPOKE_WELL_MAIN, 10, 18 ; 18 + endgroup + + newgroup EMPTY ; 17 + endgroup -NUM_MAP_GROUPS EQU const_value ; 16 +NUM_MAP_GROUPS EQU const_value diff --git a/constants/map_data_constants.asm b/constants/map_data_constants.asm index cc29753..85be273 100644 --- a/constants/map_data_constants.asm +++ b/constants/map_data_constants.asm @@ -72,3 +72,6 @@ NUM_SPAWNS EQU 18 ; size of each spawn point data SPAWN_POINT_SIZE EQU 4 + +; size of sprite sets (see data/maps/sprite_sets.asm) +SPRITE_SET_LENGTH EQU 10 diff --git a/data/maps/sprite_sets.asm b/data/maps/sprite_sets.asm new file mode 100644 index 0000000..b4712e8 --- /dev/null +++ b/data/maps/sprite_sets.asm @@ -0,0 +1,210 @@ +; Usable sprite IDs for outdoor map groups + +; Sprites outside of whatever is defined in its map group will be rendered +; as the player sprite. + +INCLUDE "constants.asm" + +SECTION "data/maps/sprite_sets.asm", ROMX + +MapGroupSpriteSets: + db $01 ; MAPGROUP_SILENT + db $02 ; MAPGROUP_OLD + db $03 ; MAPGROUP_WEST + db $04 ; MAPGROUP_HAITEKU + db $05 ; MAPGROUP_FONTO + db $06 ; MAPGROUP_BAADON + db $07 ; MAPGROUP_NEWTYPE + db $08 ; MAPGROUP_SUGAR + db $0e ; MAPGROUP_BULL + db $09 ; MAPGROUP_STAND + db $0a ; MAPGROUP_KANTO + db $0b ; MAPGROUP_PRINCE + db $0d ; MAPGROUP_MT_FUJI + db $0c ; MAPGROUP_SOUTH + db $0e ; MAPGROUP_NORTH + db $01 ; MAPGROUP_MISC + db $01 ; MAPGROUP_EMPTY + db $01 + db $01 + db $01 + db $01 + db $01 + db $01 + db $01 + db $01 + db $01 + db $01 + db $01 + +SpriteSets: +; Each sprite set is 10 entries long, instead of 11 entries like in Gen I / II. + +; sprite set $01 + db SPRITE_BLUE + db SPRITE_SILVER + db SPRITE_OFFICER + db SPRITE_TEACHER + db SPRITE_SUPER_NERD + db SPRITE_YOUNGSTER + db SPRITE_FISHER + db SPRITE_RHYDON + db SPRITE_POKE_BALL + db SPRITE_POKEDEX + +; sprite set $02 + db SPRITE_GRAMPS + db SPRITE_TWIN + db SPRITE_BUG_CATCHER_BOY + db SPRITE_YOUNGSTER + db SPRITE_TEACHER + db SPRITE_SUPER_NERD + db SPRITE_GRANNY + db SPRITE_RHYDON + db SPRITE_POKE_BALL + db SPRITE_POKEDEX + +; sprite set $03 + db SPRITE_LASS + db SPRITE_COOLTRAINER_F + db SPRITE_ROCKER + db SPRITE_SAILOR + db SPRITE_GENTLEMAN + db SPRITE_36 + db SPRITE_FISHER + db SPRITE_CLEFAIRY + db SPRITE_POKE_BALL + db SPRITE_POKEDEX + +; sprite set $04 + db SPRITE_SILVER + db SPRITE_TWIN + db SPRITE_SAILOR + db SPRITE_POKEFAN_M + db SPRITE_SWIMMER_M + db SPRITE_SWIMMER_F + db SPRITE_FISHER + db SPRITE_RHYDON + db SPRITE_POKE_BALL + db SPRITE_POKEDEX + +; sprite set $05 + db SPRITE_LASS + db SPRITE_BUG_CATCHER_BOY + db SPRITE_YOUNGSTER + db SPRITE_SAILOR + db SPRITE_GYM_GUY + db SPRITE_SWIMMER_M + db SPRITE_SWIMMER_F + db SPRITE_RHYDON + db SPRITE_POKE_BALL + db SPRITE_POKEDEX + +; sprite set $06 + db SPRITE_36 + db SPRITE_LASS + db SPRITE_YOUNGSTER + db SPRITE_24 + db SPRITE_POKEFAN_M + db SPRITE_ROCKET_F + db SPRITE_FISHER + db SPRITE_RHYDON + db SPRITE_POKE_BALL + db SPRITE_POKEDEX + +; sprite set $07 + db SPRITE_SILVER + db SPRITE_YOUNGSTER + db SPRITE_GIRL + db SPRITE_ROCKER + db SPRITE_POKEFAN_M + db SPRITE_GENTLEMAN + db SPRITE_FISHER + db SPRITE_SAILOR + db SPRITE_POKE_BALL + db SPRITE_POKEDEX + +; sprite set $08 + db SPRITE_TWIN + db SPRITE_BUG_CATCHER_BOY + db SPRITE_GRAMPS + db SPRITE_GRANNY + db SPRITE_SWIMMER_M + db SPRITE_SWIMMER_F + db SPRITE_FISHER + db SPRITE_RHYDON + db SPRITE_POKE_BALL + db SPRITE_POKEDEX + +; sprite set $09 + db SPRITE_SAKAKI + db SPRITE_CAPTAIN + db SPRITE_TWIN + db SPRITE_TEACHER + db SPRITE_ROCKER + db SPRITE_RHYDON + db SPRITE_CLEFAIRY + db SPRITE_PIDGEY + db SPRITE_POKE_BALL + db SPRITE_POKEDEX + +; sprite set $0a + db SPRITE_LASS + db SPRITE_YOUNGSTER + db SPRITE_COOLTRAINER_F + db SPRITE_24 + db SPRITE_POKEFAN_M + db SPRITE_GENTLEMAN + db SPRITE_FISHER + db SPRITE_RHYDON + db SPRITE_POKE_BALL + db SPRITE_POKEDEX + +; sprite set $0b + db SPRITE_OKIDO + db SPRITE_TWIN + db SPRITE_BUG_CATCHER_BOY + db SPRITE_SUPER_NERD + db SPRITE_POKEFAN_F + db SPRITE_GRAMPS + db SPRITE_GRANNY + db SPRITE_CLEFAIRY + db SPRITE_POKE_BALL + db SPRITE_POKEDEX + +; sprite set $0c + db SPRITE_SILVER + db SPRITE_TWIN + db SPRITE_TEACHER + db SPRITE_ROCKER + db SPRITE_FISHING_GURU + db SPRITE_SWIMMER_M + db SPRITE_SWIMMER_F + db SPRITE_FISHER + db SPRITE_POKE_BALL + db SPRITE_POKEDEX + +; sprite set $0d + db SPRITE_YOUNGSTER + db SPRITE_GIRL + db SPRITE_24 + db SPRITE_SCIENTIST + db SPRITE_CAPTAIN + db SPRITE_46 + db SPRITE_FISHER + db SPRITE_RHYDON + db SPRITE_POKE_BALL + db SPRITE_POKEDEX + +; sprite set $0e + db SPRITE_SILVER + db SPRITE_TWIN + db SPRITE_YOUNGSTER + db SPRITE_TEACHER + db SPRITE_SUPER_NERD + db SPRITE_LASS + db SPRITE_SWIMMER_M + db SPRITE_SWIMMER_F + db SPRITE_POKE_BALL + db SPRITE_POKEDEX + diff --git a/data/overworld_sprites.asm b/data/overworld_sprites.asm new file mode 100644 index 0000000..09135d0 --- /dev/null +++ b/data/overworld_sprites.asm @@ -0,0 +1,102 @@ +INCLUDE "constants.asm" + +SECTION "data/overworld_sprites.asm", ROMX + +overworld_sprite: MACRO +; pointer, length, bank + dw \1 + db \2 tiles, BANK(\1) +ENDM + +OverworldSprites:: + overworld_sprite GoldSpriteGFX, 12 + overworld_sprite GoldBikeSpriteGFX, 12 + overworld_sprite GoldSkateboardSpriteGFX, 12 + overworld_sprite SilverSpriteGFX, 12 + overworld_sprite OkidoSpriteGFX, 12 + overworld_sprite RedSpriteGFX, 12 + overworld_sprite BlueSpriteGFX, 12 + overworld_sprite MasakiSpriteGFX, 12 + overworld_sprite ElderSpriteGFX, 12 + overworld_sprite SakakiSpriteGFX, 12 + overworld_sprite GantetsuSpriteGFX, 12 + overworld_sprite MomSpriteGFX, 12 + overworld_sprite SilversMomSpriteGFX, 12 + overworld_sprite RedsMomSpriteGFX, 12 + overworld_sprite RedsMomSpriteGFX, 12 + overworld_sprite NanamiSpriteGFX, 12 + overworld_sprite EvilOkidoSpriteGFX, 12 + overworld_sprite KikukoSpriteGFX, 12 + overworld_sprite HayatoSpriteGFX, 12 + overworld_sprite TsukushiSpriteGFX, 12 + overworld_sprite TsukushiSpriteGFX, 12 + overworld_sprite EnokiSpriteGFX, 12 + overworld_sprite MikanSpriteGFX, 12 + overworld_sprite MikanSpriteGFX, 12 + overworld_sprite CooltrainerMSpriteGFX, 12 + overworld_sprite CooltrainerMSpriteGFX, 12 + overworld_sprite CooltrainerMSpriteGFX, 12 + overworld_sprite CooltrainerMSpriteGFX, 12 + overworld_sprite CooltrainerMSpriteGFX, 12 + overworld_sprite CooltrainerMSpriteGFX, 12 + overworld_sprite CooltrainerMSpriteGFX, 12 + overworld_sprite CooltrainerMSpriteGFX, 12 + overworld_sprite CooltrainerMSpriteGFX, 12 + overworld_sprite CooltrainerMSpriteGFX, 12 + overworld_sprite CooltrainerMSpriteGFX, 12 + overworld_sprite CooltrainerMSpriteGFX, 12 + overworld_sprite CooltrainerFSpriteGFX, 12 + overworld_sprite BugCatcherBoySpriteGFX, 12 + overworld_sprite TwinSpriteGFX, 12 + overworld_sprite YoungsterSpriteGFX, 12 + overworld_sprite LassSpriteGFX, 12 + overworld_sprite TeacherSpriteGFX, 12 + overworld_sprite GirlSpriteGFX, 12 + overworld_sprite SuperNerdSpriteGFX, 12 + overworld_sprite RockerSpriteGFX, 12 + overworld_sprite PokefanMSpriteGFX, 12 + overworld_sprite PokefanFSpriteGFX, 12 + overworld_sprite GrampsSpriteGFX, 12 + overworld_sprite GrannySpriteGFX, 12 + overworld_sprite SwimmerMSpriteGFX, 12 + overworld_sprite SwimmerFSpriteGFX, 12 + overworld_sprite RocketMSpriteGFX, 12 + overworld_sprite RocketMSpriteGFX, 12 + overworld_sprite RocketMSpriteGFX, 12 + overworld_sprite RocketFSpriteGFX, 12 + overworld_sprite NurseSpriteGFX, 12 + overworld_sprite LinkReceptionistSpriteGFX, 12 + overworld_sprite ClerkSpriteGFX, 12 + overworld_sprite FisherSpriteGFX, 12 + overworld_sprite FishingGuruSpriteGFX, 12 + overworld_sprite ScientistSpriteGFX, 12 + overworld_sprite MediumSpriteGFX, 12 + overworld_sprite SageSpriteGFX, 12 + overworld_sprite FrowningManSpriteGFX, 12 + overworld_sprite GentlemanSpriteGFX, 12 + overworld_sprite BlackbeltSpriteGFX, 12 + overworld_sprite ReceptionistSpriteGFX, 12 + overworld_sprite OfficerSpriteGFX, 12 + overworld_sprite CaptainSpriteGFX, 12 + overworld_sprite CaptainSpriteGFX, 12 + overworld_sprite CaptainSpriteGFX, 12 + overworld_sprite MohawkSpriteGFX, 12 + overworld_sprite GymGuySpriteGFX, 12 + overworld_sprite SailorSpriteGFX, 12 + overworld_sprite HelmetSpriteGFX, 12 + overworld_sprite BurglarSpriteGFX, 12 + overworld_sprite RhydonSpriteGFX, 12 + overworld_sprite ClefairySpriteGFX, 12 + overworld_sprite PidgeySpriteGFX, 12 + overworld_sprite CharizardSpriteGFX, 12 + overworld_sprite SnorlaxSpriteGFX, 4 + overworld_sprite SeelSpriteGFX, 12 + overworld_sprite PoliwrathSpriteGFX, 12 + overworld_sprite LaprasSpriteGFX, 12 + overworld_sprite PokeBallSpriteGFX, 4 + overworld_sprite PokedexSpriteGFX, 4 + overworld_sprite PaperSpriteGFX, 4 + overworld_sprite OldLinkReceptionistSpriteGFX, 4 + overworld_sprite OldLinkReceptionistSpriteGFX, 4 + overworld_sprite EggSpriteGFX, 4 + overworld_sprite BoulderSpriteGFX, 4 diff --git a/engine/sprites/sprites.asm b/engine/sprites/sprites.asm index 1c97321..87bf7b3 100644 --- a/engine/sprites/sprites.asm +++ b/engine/sprites/sprites.asm @@ -1,6 +1,195 @@ INCLUDE "constants.asm" -SECTION "engine/sprites/sprites.asm@LoadOverworldSprite", ROMX +SECTION "engine/sprites/sprites.asm@RefreshSprites", ROMX + +RefreshSprites: + call GetPlayerSprite + call CheckInteriorMap + jr c, .outdoor + call AddIndoorSprites + call LoadUsedSpritesGfx + ret +.outdoor + call AddOutdoorSprites + call LoadUsedSpritesGfx + ret + +CheckInteriorMap: + call GetMapEnvironment + cp TOWN + jr z, .got_outdoor + cp ROUTE + jr z, .got_outdoor + xor a + ret +.got_outdoor + scf + ret + +AddIndoorSprites: + ld hl, wUsedNPCSprites + ld bc, SPRITE_SET_LENGTH + xor a + call ByteFill + ld a, [wPlayerObjectSprite] + ld [wUsedSprites], a + ld hl, wMap2ObjectSprite + ld a, 2 +.asm_14070 + push af + ld a, [hl] + and a + jr z, .asm_1408d + ld c, a + call IsAnimatedSprite + jr nc, .static_sprite + ld de, wUsedStaticSprites + ld b, 2 + call Function14099 + jr .asm_1408d +.static_sprite + ld de, wUsedNPCSprites + ld b, 8 + call Function14099 +.asm_1408d + ld de, $10 + add hl, de + pop af + inc a + cp $10 + jp nz, .asm_14070 + ret + +Function14099: +.loop + ld a, [de] + and a + jr z, .asm_140a5 + cp c + ret z + dec b + jr z, .asm_140a8 + inc de + jr .loop + +.asm_140a5 + ld a, c + ld [de], a + ret + +.asm_140a8 + scf + ret + + +AddOutdoorSprites: + ld a, [wPlayerObjectSprite] + ld [wUsedSprites], a + ld a, [wMapGroup] + dec a + ld c, a + ld b, 0 + ld hl, MapGroupSpriteSets + add hl, bc + ld a, [hl] + push af + dec a + ld hl, SpriteSets + ld bc, SPRITE_SET_LENGTH + call AddNTimes + ld de, wUsedNPCSprites + ld bc, SPRITE_SET_LENGTH + call CopyBytes + ld a, [wd642] + ld c, a + pop af + ld [wd642], a + ret + +Function140d9: + ld hl, wcdaf + ld a, [hl] + push af + res 7, [hl] + set 6, [hl] + call LoadUsedSpritesGfx + pop af + ld [wcdaf], a + ret + +Function140ea: + ld hl, wcdaf + ld a, [hl] + push af + set 7, [hl] + res 6, [hl] + call LoadUsedSpritesGfx + pop af + ld [wcdaf], a + ret + +LoadUsedSpritesGfx: + ld hl, vNPCSprites + ld de, wUsedSprites + ld b, SPRITE_SET_LENGTH + ld c, 0 +.asm_14105 + push bc + push de + push hl + ld a, [de] + and a + jr z, .asm_1410f + call LoadOverworldSprite +.asm_1410f + pop hl + ld bc, $c0 + add hl, bc + pop de + inc de + pop bc + inc c + dec b + jr nz, .asm_14105 + ld a, [de] + and a + jr z, .asm_14127 + push de + ld hl, vNPCSprites + $780 + call LoadOverworldSprite + pop de +.asm_14127 + inc de + ld a, [de] + and a + jr z, .asm_14132 + ld hl, vNPCSprites + $7c0 + call LoadOverworldSprite +.asm_14132 + ret + +Function14133: + swap b + ld a, b + and $f0 + ld e, a + ld a, b + and $f + ld d, a + ld hl, vNPCSprites + add hl, de + ld a, c + jr LoadOverworldSprite + +Function14144: + ld a, c + ld hl, vNPCSprites + jr LoadOverworldSprite + +Function1414a: + ld a, c + ld hl, vNPCSprites + $c0 + jr LoadOverworldSprite LoadOverworldSprite: push af @@ -52,104 +241,3 @@ GetOverworldSpriteData: ld b, [hl] pop hl ret - -SECTION "engine/sprites/sprites.asm@OverworldSprites", ROMX - -overworld_sprite: MACRO -; pointer, length, bank - dw \1 - db \2 tiles, BANK(\1) -ENDM - -OverworldSprites:: - overworld_sprite GoldSpriteGFX, 12 - overworld_sprite GoldBikeSpriteGFX, 12 - overworld_sprite GoldSkateboardSpriteGFX, 12 - overworld_sprite SilverSpriteGFX, 12 - overworld_sprite OkidoSpriteGFX, 12 - overworld_sprite RedSpriteGFX, 12 - overworld_sprite BlueSpriteGFX, 12 - overworld_sprite MasakiSpriteGFX, 12 - overworld_sprite ElderSpriteGFX, 12 - overworld_sprite SakakiSpriteGFX, 12 - overworld_sprite GantetsuSpriteGFX, 12 - overworld_sprite MomSpriteGFX, 12 - overworld_sprite SilversMomSpriteGFX, 12 - overworld_sprite RedsMomSpriteGFX, 12 - overworld_sprite RedsMomSpriteGFX, 12 - overworld_sprite NanamiSpriteGFX, 12 - overworld_sprite EvilOkidoSpriteGFX, 12 - overworld_sprite KikukoSpriteGFX, 12 - overworld_sprite HayatoSpriteGFX, 12 - overworld_sprite TsukushiSpriteGFX, 12 - overworld_sprite TsukushiSpriteGFX, 12 - overworld_sprite EnokiSpriteGFX, 12 - overworld_sprite MikanSpriteGFX, 12 - overworld_sprite MikanSpriteGFX, 12 - overworld_sprite CooltrainerMSpriteGFX, 12 - overworld_sprite CooltrainerMSpriteGFX, 12 - overworld_sprite CooltrainerMSpriteGFX, 12 - overworld_sprite CooltrainerMSpriteGFX, 12 - overworld_sprite CooltrainerMSpriteGFX, 12 - overworld_sprite CooltrainerMSpriteGFX, 12 - overworld_sprite CooltrainerMSpriteGFX, 12 - overworld_sprite CooltrainerMSpriteGFX, 12 - overworld_sprite CooltrainerMSpriteGFX, 12 - overworld_sprite CooltrainerMSpriteGFX, 12 - overworld_sprite CooltrainerMSpriteGFX, 12 - overworld_sprite CooltrainerMSpriteGFX, 12 - overworld_sprite CooltrainerFSpriteGFX, 12 - overworld_sprite BugCatcherBoySpriteGFX, 12 - overworld_sprite TwinSpriteGFX, 12 - overworld_sprite YoungsterSpriteGFX, 12 - overworld_sprite LassSpriteGFX, 12 - overworld_sprite TeacherSpriteGFX, 12 - overworld_sprite GirlSpriteGFX, 12 - overworld_sprite SuperNerdSpriteGFX, 12 - overworld_sprite RockerSpriteGFX, 12 - overworld_sprite PokefanMSpriteGFX, 12 - overworld_sprite PokefanFSpriteGFX, 12 - overworld_sprite GrampsSpriteGFX, 12 - overworld_sprite GrannySpriteGFX, 12 - overworld_sprite SwimmerMSpriteGFX, 12 - overworld_sprite SwimmerFSpriteGFX, 12 - overworld_sprite RocketMSpriteGFX, 12 - overworld_sprite RocketMSpriteGFX, 12 - overworld_sprite RocketMSpriteGFX, 12 - overworld_sprite RocketFSpriteGFX, 12 - overworld_sprite NurseSpriteGFX, 12 - overworld_sprite LinkReceptionistSpriteGFX, 12 - overworld_sprite ClerkSpriteGFX, 12 - overworld_sprite FisherSpriteGFX, 12 - overworld_sprite FishingGuruSpriteGFX, 12 - overworld_sprite ScientistSpriteGFX, 12 - overworld_sprite MediumSpriteGFX, 12 - overworld_sprite SageSpriteGFX, 12 - overworld_sprite FrowningManSpriteGFX, 12 - overworld_sprite GentlemanSpriteGFX, 12 - overworld_sprite BlackbeltSpriteGFX, 12 - overworld_sprite ReceptionistSpriteGFX, 12 - overworld_sprite OfficerSpriteGFX, 12 - overworld_sprite CaptainSpriteGFX, 12 - overworld_sprite CaptainSpriteGFX, 12 - overworld_sprite CaptainSpriteGFX, 12 - overworld_sprite MohawkSpriteGFX, 12 - overworld_sprite GymGuySpriteGFX, 12 - overworld_sprite SailorSpriteGFX, 12 - overworld_sprite HelmetSpriteGFX, 12 - overworld_sprite BurglarSpriteGFX, 12 - overworld_sprite RhydonSpriteGFX, 12 - overworld_sprite ClefairySpriteGFX, 12 - overworld_sprite PidgeySpriteGFX, 12 - overworld_sprite CharizardSpriteGFX, 12 - overworld_sprite SnorlaxSpriteGFX, 4 - overworld_sprite SeelSpriteGFX, 12 - overworld_sprite PoliwrathSpriteGFX, 12 - overworld_sprite LaprasSpriteGFX, 12 - overworld_sprite PokeBallSpriteGFX, 4 - overworld_sprite PokedexSpriteGFX, 4 - overworld_sprite PaperSpriteGFX, 4 - overworld_sprite OldLinkReceptionistSpriteGFX, 4 - overworld_sprite OldLinkReceptionistSpriteGFX, 4 - overworld_sprite EggSpriteGFX, 4 - overworld_sprite BoulderSpriteGFX, 4 diff --git a/layout.link b/layout.link index 471d714..ed3c411 100644 --- a/layout.link +++ b/layout.link @@ -178,10 +178,10 @@ ROMX $04 ROMX $05 org $4000 "engine/overworld/player_movement.asm@_RedrawPlayerSprite" - org $4150 - "engine/sprites/sprites.asm@LoadOverworldSprite" - org $423b - "engine/sprites/sprites.asm@OverworldSprites" + org $4036 + "engine/sprites/sprites.asm@RefreshSprites" + "data/maps/sprite_sets.asm" + "data/overworld_sprites.asm" org $477d "engine/events/pokecenter_pc.asm" diff --git a/ram/wram.asm b/ram/wram.asm index e6c6d34..1ba561b 100644 --- a/ram/wram.asm +++ b/ram/wram.asm @@ -1312,16 +1312,19 @@ SECTION "D637", WRAM0[$D637] wd637:: db ;OW battle state? $3 wild battle, $8 is trainer battle $4 is left battle, $B is load overworld? $0 is in overworld wd638:: db ;wd637's last written-to value -SECTION "Used sprites", WRAM0[$D643] - +SECTION "Used sprites", WRAM0[$D642] +wd642:: db wBGMapAnchor:: dw wUsedSprites:: - dw ; This is for the player + ds 2 wUsedNPCSprites:: - ds 2 * 5 ; This is for the NPCs + ds 8 + +wUsedStaticSprites:: + ds 2 wUsedSpritesEnd:: @@ -1,10 +1,3 @@ -05:4036 RefreshSprites -05:404C CheckInteriorMap -05:405B AddIndoorSprites -05:40AA AddOutdoorSprites -05:40D9 Function140d9 -05:40EA Function140ea -05:40FB LoadUsedSpritesGfx ; TODO: maybe there's a better name 05:43B6 InitAllSRAMBanks 05:43E0 Function143e0 05:457A Function1457a |