summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.github/workflows/main.yml54
-rw-r--r--.travis.yml25
-rw-r--r--README.md6
-rw-r--r--constants/map_constants.asm76
-rw-r--r--constants/map_data_constants.asm3
-rw-r--r--data/maps/sprite_sets.asm210
-rw-r--r--data/overworld_sprites.asm102
-rw-r--r--engine/sprites/sprites.asm292
-rw-r--r--layout.link8
-rw-r--r--ram/wram.asm11
-rwxr-xr-xshim.sym7
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
diff --git a/README.md b/README.md
index fb8d773..8f90017 100644
--- a/README.md
+++ b/README.md
@@ -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::
diff --git a/shim.sym b/shim.sym
index 5d9261e..a2f9e4e 100755
--- a/shim.sym
+++ b/shim.sym
@@ -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