├── .gitignore ├── Makefile ├── SRC ├── bank_000.asm ├── bank_001.asm ├── bank_002.asm ├── bank_003.asm ├── bank_004.asm ├── bank_005.asm ├── bank_006.asm ├── bank_007.asm ├── bank_008.asm ├── constants.asm ├── data │ ├── credits.asm │ ├── enemies.csv │ ├── enemyHeaders.asm │ ├── enemyHitboxes.asm │ ├── enemy_damageValues.asm │ ├── enemy_headerPointers.asm │ ├── enemy_hitboxPointers.asm │ ├── enemy_nameConstants.asm │ ├── enemy_spritePointers.asm │ ├── initialSave.asm │ ├── itemNames.asm │ ├── sprites_credits.asm │ ├── sprites_enemies.asm │ ├── sprites_samus.asm │ └── title_tilemap.asm ├── game.asm ├── gfx │ ├── commonItems.chr │ ├── enemies │ │ ├── arachnus.chr │ │ ├── enemiesA.chr │ │ ├── enemiesB.chr │ │ ├── enemiesC.chr │ │ ├── enemiesD.chr │ │ ├── enemiesE.chr │ │ ├── enemiesF.chr │ │ ├── metAlpha.chr │ │ ├── metGamma.chr │ │ ├── metOmega.chr │ │ ├── metZeta.chr │ │ ├── queenSPR.chr │ │ └── surfaceSPR.chr │ ├── itemOrb.chr │ ├── items.chr │ ├── samus │ │ ├── beamIce.chr │ │ ├── beamSpazerPlasma.chr │ │ ├── beamWave.chr │ │ ├── cannonBeam.chr │ │ ├── cannonMissile.chr │ │ ├── samusPowerSuit.chr │ │ ├── samusVariaSuit.chr │ │ ├── spinScrewBottom.chr │ │ ├── spinScrewTop.chr │ │ ├── spinSpaceBottom.chr │ │ ├── spinSpaceScrewBottom.chr │ │ ├── spinSpaceScrewTop.chr │ │ ├── spinSpaceTop.chr │ │ ├── springBallBottom.chr │ │ └── springBallTop.chr │ └── titleCredits │ │ ├── creditsFont.chr │ │ ├── creditsNumbers.chr │ │ ├── creditsSprTiles.chr │ │ ├── itemFont.chr │ │ ├── theEnd.chr │ │ └── titleScreen.chr ├── hardware.inc ├── macros.asm ├── maps │ ├── bank_009.asm │ ├── bank_00a.asm │ ├── bank_00b.asm │ ├── bank_00c.asm │ ├── bank_00d.asm │ ├── bank_00e.asm │ ├── bank_00f.asm │ ├── door macros.asm │ ├── doors.asm │ └── enemyData.asm ├── ram │ ├── hram.asm │ ├── sram.asm │ ├── vram.asm │ └── wram.asm ├── samus │ ├── readme.md │ ├── samus.csv │ ├── samus_bgHitboxTop.asm │ ├── samus_blockReformHeightTable.asm │ ├── samus_bombPoseTransitionTable.asm │ ├── samus_bombedFallingPoseTransitionTable.asm │ ├── samus_cannonYOffsetByPose.asm │ ├── samus_damagePoseTransitionTable.asm │ ├── samus_drawJumpTable.asm │ ├── samus_horizontalYOffsets.asm │ ├── samus_poseConstants.asm │ ├── samus_poseJumpTable.asm │ ├── samus_possibleShotDirections.asm │ └── samus_spriteHitboxTopTable.asm └── tilesets │ ├── caveFirst.chr │ ├── caveFirst_collision.asm │ ├── caveFirst_metatiles.asm │ ├── finalLab.chr │ ├── finalLab_collision.asm │ ├── finalLab_metatiles.asm │ ├── lavaCavesA.chr │ ├── lavaCavesB.chr │ ├── lavaCavesC.chr │ ├── lavaCavesEmpty_metatiles.asm │ ├── lavaCavesFull_metatiles.asm │ ├── lavaCavesMid_metatiles.asm │ ├── lavaCaves_collision.asm │ ├── plantBubbles.chr │ ├── plantBubbles_collision.asm │ ├── plantBubbles_metatiles.asm │ ├── queenBG.chr │ ├── queen_collision.asm │ ├── queen_metatiles.asm │ ├── ruinsExt.chr │ ├── ruinsExt_collision.asm │ ├── ruinsExt_metatiles.asm │ ├── ruinsInside.chr │ ├── ruinsInside_collision.asm │ ├── ruinsInside_metatiles.asm │ ├── solidityValues.asm │ ├── surfaceBG.chr │ ├── surface_collision.asm │ └── surface_metatiles.asm ├── build.bat ├── build.py ├── docs ├── Bank 2 Map.md ├── Enemy BG Collision.md ├── Enemy Headers.md ├── ROM Tour.md ├── Style Guide.md └── graphics pointers.txt ├── patches ├── Vertical Enemy Loading Fix.asm ├── improvedSpiderBall.asm ├── intersectionTransition.asm └── queen pause.md ├── readme.md └── scripts ├── enemy_csv2asm.py ├── extract_chr.py ├── extract_credits.py ├── extract_data.py ├── extract_doors.py ├── extract_enHeaders.py ├── extract_enHitboxes.py ├── extract_enemyData.py ├── extract_itemNames.py ├── extract_metasprites.py ├── extract_sfxOptionSets.py ├── extract_songData.py └── samus_csv2asm.py /.gitignore: -------------------------------------------------------------------------------- 1 | out/* 2 | scripts/*.asm 3 | *.gb 4 | 5 | rgbasm.exe 6 | rgbfix.exe 7 | rgbgfx.exe 8 | rgblink.exe 9 | zlib1.dll 10 | libpng16.dll -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | all: out/M2RoS.gb 2 | 3 | #%.2bpp: %.png 4 | # rgbgfx -o $@ $< 5 | 6 | #%.1bpp: %.png 7 | # rgbgfx -d 1 -o $@ $< 8 | 9 | out/game.o: SRC/game.asm SRC/bank_*.asm out 10 | rgbasm -L -o out/game.o -i SRC/ SRC/game.asm 11 | 12 | out/M2RoS.gb: out/game.o out 13 | rgblink -n out/M2RoS.sym -m out/M2RoS.map -o $@ $< 14 | #rgbfix -v -p 255 $@ #Nope 15 | 16 | md5sum $@ 17 | 18 | out: 19 | mkdir $@ 20 | 21 | clean: 22 | # rm -f game.o game.gb game.sym game.map 23 | # find . \( -iname '*.1bpp' -o -iname '*.2bpp' \) -exec rm {} + 24 | -------------------------------------------------------------------------------- /SRC/bank_006.asm: -------------------------------------------------------------------------------- 1 | ; Disassembly of "Metroid2.gb" 2 | ; This file was created with: 3 | ; mgbdis v1.4 - Game Boy ROM disassembler by Matt Currie and contributors. 4 | ; https://github.com/mattcurrie/mgbdis 5 | 6 | SECTION "ROM Bank $006", ROMX[$4000], BANK[$6] 7 | 8 | ; Patched in at runtime 9 | gfx_cannonBeam:: incbin "gfx/samus/cannonBeam.chr" 10 | gfx_cannonMissile:: incbin "gfx/samus/cannonMissile.chr" 11 | 12 | ; These graphics are patched into VRAM when loading a save or collecting the item 13 | gfx_beamIce:: incbin "gfx/samus/beamIce.chr" 14 | gfx_beamWave:: incbin "gfx/samus/beamWave.chr" 15 | gfx_beamSpazer:: ; Stub for an enterprising modder 16 | gfx_beamPlasma:: incbin "gfx/samus/beamSpazerPlasma.chr" 17 | 18 | gfx_spinSpaceTop:: incbin "gfx/samus/spinSpaceTop.chr" 19 | gfx_spinSpaceBottom:: incbin "gfx/samus/spinSpaceBottom.chr" 20 | 21 | gfx_spinScrewTop:: incbin "gfx/samus/spinScrewTop.chr" 22 | gfx_spinScrewBottom:: incbin "gfx/samus/spinScrewBottom.chr" 23 | 24 | gfx_spinSpaceScrewTop:: incbin "gfx/samus/spinSpaceScrewTop.chr" 25 | gfx_spinSpaceScrewBottom:: incbin "gfx/samus/spinSpaceScrewBottom.chr" 26 | 27 | gfx_springBallTop:: incbin "gfx/samus/springBallTop.chr" 28 | gfx_springBallBottom:: incbin "gfx/samus/springBallBottom.chr" 29 | 30 | ; 06:4320 - Power suit and common sprite graphics 31 | gfx_samusPowerSuit:: incbin "gfx/samus/samusPowerSuit.chr" 32 | 33 | ; 06:4E20 34 | gfx_samusVariaSuit:: incbin "gfx/samus/samusVariaSuit.chr" 35 | 36 | ; 06:5920 - Enemy graphics pages -- 64 tiles each 37 | gfx_enemiesA:: incbin "gfx/enemies/enemiesA.chr",0,$400 38 | gfx_enemiesB:: incbin "gfx/enemies/enemiesB.chr",0,$400 39 | gfx_enemiesC:: incbin "gfx/enemies/enemiesC.chr",0,$400 40 | gfx_enemiesD:: incbin "gfx/enemies/enemiesD.chr",0,$400 41 | gfx_enemiesE:: incbin "gfx/enemies/enemiesE.chr",0,$400 42 | gfx_enemiesF:: incbin "gfx/enemies/enemiesF.chr",0,$400 43 | gfx_arachnus:: incbin "gfx/enemies/arachnus.chr",0,$400 44 | gfx_surfaceSPR:: incbin "gfx/enemies/surfaceSPR.chr",0,$400 45 | 46 | ; 06:7920 47 | creditsText: include "data/credits.asm" 48 | 49 | spiderBallOrientationTable:: ;{ 06:7E03 50 | ; Given an input and a collision state, this produces a rotational direction for the spider ball 51 | ; - Note that this only considers cardinal directions. Perhaps, by adding 52 | ; data for diagonal directions, the controls of the spider ball could be improved 53 | ; 54 | ; Values 55 | ; 0: Don't move 56 | ; 1: Move counter-clockwise 57 | ; 2: Move clockwise 58 | ; ______________________________________________ 0: No input 59 | ; | ___________________________________________ 1: Right 60 | ; | | ________________________________________ 2: Left 61 | ; | | | _____________________________________ 3: X: R+L 62 | ; | | | | __________________________________ 4: Up 63 | ; | | | | | _______________________________ 5: R+U 64 | ; | | | | | | ____________________________ 6: L+U 65 | ; | | | | | | | _________________________ 7: X: R+L+U 66 | ; | | | | | | | | ______________________ 8: Down 67 | ; | | | | | | | | | ___________________ 9: D+R 68 | ; | | | | | | | | | | ________________ A: D+L 69 | ; | | | | | | | | | | | _____________ B: X: R+L+U 70 | ; | | | | | | | | | | | | __________ C: X: U+D 71 | ; | | | | | | | | | | | | | _______ D: X: R+U+D 72 | ; | | | | | | | | | | | | | | ____ E: X: L+U+D 73 | ; | | | | | | | | | | | | | | | _ F: X: R+L+U+D 74 | ; | | | | | | | | | | | | | | | | 75 | db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ; 0: In air 76 | db 0, 2, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ; 1: Outside corner: Of left-facing wall and ceiling 77 | db 0, 1, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0 ; 2: Outside corner: Of left-facing wall and floor 78 | db 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0 ; 3: Flat surface: Left-facing wall 79 | db 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ; 4: Outside corner: Of right-facing wall and ceiling 80 | db 0, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ; 5: Flat surface: Ceiling 81 | db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ; 6: Unused: Top-left and bottom-right corners of ball in contact 82 | db 0, 0, 1, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0 ; 7: Inside corner: Of left-facing wall and ceiling 83 | db 0, 0, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 ; 8: Outside corner: Of right-facing wall and floor 84 | db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ; 9: Unused: Bottom-left and top-right corners of ball in contact 85 | db 0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ; A: Flat surface: Floor 86 | db 0, 0, 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ; B: Inside corner: Of left-facing wall and floor 87 | db 0, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 ; C: Flat surface: Right-facing wall 88 | db 0, 2, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 ; D: Inside corner: Of right-facing wall and ceiling 89 | db 0, 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ; E: Inside corner: Of right-facing wall and floor 90 | db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ; F: Unused: Embedded in solid 91 | ;} 92 | 93 | bank6_freespace: ; 06:7F03 - Freespace -------------------------------------------------------------------------------- /SRC/bank_007.asm: -------------------------------------------------------------------------------- 1 | ; Disassembly of "Metroid2.gb" 2 | ; This file was created with: 3 | ; mgbdis v1.4 - Game Boy ROM disassembler by Matt Currie and contributors. 4 | ; https://github.com/mattcurrie/mgbdis 5 | 6 | SECTION "ROM Bank $007", ROMX[$4000], BANK[$7] 7 | 8 | gfx_plantBubbles:: incbin "tilesets/plantBubbles.chr",0,$800 9 | gfx_ruinsInside:: incbin "tilesets/ruinsInside.chr", 0,$800 10 | gfx_queenBG:: incbin "tilesets/queenBG.chr", 0,$800 11 | gfx_caveFirst:: incbin "tilesets/caveFirst.chr", 0,$800 12 | gfx_surfaceBG:: incbin "tilesets/surfaceBG.chr", 0,$800 13 | gfx_lavaCavesA:: incbin "tilesets/lavaCavesA.chr", 0,$530 14 | gfx_lavaCavesB:: incbin "tilesets/lavaCavesB.chr", 0,$530 15 | gfx_lavaCavesC:: incbin "tilesets/lavaCavesC.chr", 0,$530 16 | 17 | ; 7:7790 - Item graphics (0x40 each) 18 | ; Plasma Beam, Ice Beam, Wave Beam, Spazer Beam 19 | ; Bombs, Screw Attack, Varia Suit, High Jump Boots 20 | ; Space Jump, Spider Ball, Spring Ball 21 | gfx_items:: incbin "gfx/items.chr" 22 | 23 | ; 7:7A50 - Item Orb 24 | gfx_itemOrb:: incbin "gfx/itemOrb.chr" 25 | 26 | ; 7:7A90 - Missile Tank, Door, Missile Block, Refills 27 | gfx_commonItems:: incbin "gfx/commonItems.chr" 28 | 29 | bank7_freespace: ; 7:7B90 -- Freespace 30 | -------------------------------------------------------------------------------- /SRC/bank_008.asm: -------------------------------------------------------------------------------- 1 | ; Disassembly of "Metroid2.gb" 2 | ; This file was created with: 3 | ; mgbdis v1.4 - Game Boy ROM disassembler by Matt Currie and contributors. 4 | ; https://github.com/mattcurrie/mgbdis 5 | 6 | SECTION "ROM Bank $008", ROMX[$4000], BANK[$8] 7 | 8 | bg_queenHead:: 9 | .row1: 10 | db $b0, $b1, $b2, $b3, $b4, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff 11 | db $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff 12 | .row2: ;bg_queenHeadRow2:: 13 | db $c0, $c1, $c2, $c3, $c4, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff 14 | db $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff 15 | .row3: ;bg_queenHeadRow3:: 16 | db $d0, $d1, $d2, $d3, $d4, $d5, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff 17 | db $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff 18 | .row4: ;bg_queenHeadRow4:: 19 | db $e2, $e3, $e4, $e5, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff 20 | db $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff 21 | 22 | collision_finalLab: include "tilesets/finalLab_collision.asm" 23 | collision_plantBubbles: include "tilesets/plantBubbles_collision.asm" 24 | collision_ruinsInside: include "tilesets/ruinsInside_collision.asm" 25 | collision_queen: include "tilesets/queen_collision.asm" 26 | collision_caveFirst: include "tilesets/caveFirst_collision.asm" 27 | collision_surface: include "tilesets/surface_collision.asm" 28 | collision_lavaCaves: include "tilesets/lavaCaves_collision.asm" 29 | collision_ruinsExt: include "tilesets/ruinsExt_collision.asm" 30 | 31 | metatiles_plantBubbles: include "tilesets/plantBubbles_metatiles.asm" 32 | metatiles_ruinsInside: include "tilesets/ruinsInside_metatiles.asm" 33 | metatiles_finalLab: include "tilesets/finalLab_metatiles.asm" 34 | metatiles_queen: include "tilesets/queen_metatiles.asm" 35 | metatiles_caveFirst: include "tilesets/caveFirst_metatiles.asm" 36 | metatiles_surface: include "tilesets/surface_metatiles.asm" 37 | metatiles_lavaCavesMid: include "tilesets/lavaCavesMid_metatiles.asm" 38 | metatiles_lavaCavesEmpty: include "tilesets/lavaCavesEmpty_metatiles.asm" 39 | metatiles_lavaCavesFull: include "tilesets/lavaCavesFull_metatiles.asm" 40 | metatiles_ruinsExt: include "tilesets/ruinsExt_metatiles.asm" 41 | 42 | gfx_metAlpha:: incbin "gfx/enemies/metAlpha.chr",0,$400 43 | gfx_metGamma:: incbin "gfx/enemies/metGamma.chr",0,$400 44 | gfx_metZeta:: incbin "gfx/enemies/metZeta.chr",0,$400 45 | gfx_metOmega:: incbin "gfx/enemies/metOmega.chr",0,$400 46 | gfx_ruinsExt:: incbin "tilesets/ruinsExt.chr",0,$800 47 | gfx_finalLab:: incbin "tilesets/finalLab.chr",0,$800 48 | gfx_queenSPR:: incbin "gfx/enemies/queenSPR.chr",0,$500 49 | 50 | ; Check if killed target number of metroids 51 | earthquakeCheck:: ;{ 08:7EBC: 52 | ld hl, .thresholds 53 | 54 | .loop: 55 | ; If we have reached the end of .thresholds, then return 56 | ld a, [hl+] 57 | cp $ff 58 | jr z, .return 59 | 60 | ; If metroidCountReal = .thresholds[hl], then branch ahead to set the timer 61 | ld b, a 62 | ld a, [metroidCountReal] 63 | cp b 64 | jr z, .setTimer 65 | jr .loop 66 | 67 | .setTimer: 68 | ; If more than 1 Metroid is left, set timer to 3 and exit 69 | ld a, $03 70 | ld [nextEarthquakeTimer], a 71 | ld a, [metroidCountReal] 72 | cp $01 73 | ret nz 74 | 75 | ; If only 1 metroid (the queen) is left, set timer to 1 76 | ld a, $01 77 | ld [nextEarthquakeTimer], a 78 | .return: 79 | ret 80 | 81 | ; Earthquake threshholds (terminated with $FF) 82 | .thresholds: 83 | db $46, $42, $34, $24, $23, $21, $14, $13, $12, $09, $01, $ff 84 | ;} 85 | 86 | ; 8:7EEA - Collision Table Pointers 87 | collisionPointerTable:: 88 | dw collision_plantBubbles ; 0 89 | dw collision_ruinsInside ; 1 90 | dw collision_queen ; 2 91 | dw collision_caveFirst ; 3 92 | dw collision_surface ; 4 93 | dw collision_lavaCaves ; 5 94 | dw collision_ruinsExt ; 6 95 | dw collision_finalLab ; 7 96 | 97 | ; 8:7EFA Solidity threshholds 98 | solidityIndexTable:: include "tilesets/solidityValues.asm" 99 | 100 | ; 8:7F1A Metatile definition pointers 101 | metatilePointerTable:: 102 | dw metatiles_finalLab ; 0 - 2 103 | dw metatiles_ruinsInside ; 1 - 1 104 | dw metatiles_plantBubbles ; 2 - 0 105 | dw metatiles_queen ; 3 - 3 106 | dw metatiles_caveFirst ; 4 - 4 107 | dw metatiles_surface ; 5 - 5 108 | dw metatiles_lavaCavesEmpty ; 6 - 7 109 | dw metatiles_lavaCavesFull ; 7 - 8 110 | dw metatiles_lavaCavesMid ; 8 - 6 111 | dw metatiles_ruinsExt ; 9 - 9 112 | 113 | bank8_freespace: ; 7:7B90 - Freespace (filled with $00) 114 | -------------------------------------------------------------------------------- /SRC/constants.asm: -------------------------------------------------------------------------------- 1 | ; Constants 2 | 3 | ; Hardware related constants (not covered by hardware.inc) 4 | def rMBC_BANK_REG = $2100 ; Dunno why it just doesn't use $2000 5 | 6 | 7 | def METASPRITE_END = $FF ; I recommend setting this to $80 (-128) if you plan on doing your own sprite editing 8 | 9 | ; Map related memory locations (fixed in each bank) 10 | def map_screenPointers = $4000 ; $200 bytes 11 | def map_scrollData = $4200 ; $100 bytes 12 | def map_doorIndexes = $4300 ; $200 bytes - Also contains sprite priority bits per screen 13 | ; Note: Map data starts at $4500 14 | 15 | ; Scrolling Directions (bitfields and bit numbers) 16 | def scrollDir_right = $10 17 | def scrollDir_left = $20 18 | def scrollDir_up = $40 19 | def scrollDir_down = $80 20 | def scrollDirBit_right = 4 21 | def scrollDirBit_left = 5 22 | def scrollDirBit_up = 6 23 | def scrollDirBit_down = 7 24 | 25 | ; Samus physics constants 26 | def samus_jumpArrayBaseOffset = $40 27 | def samus_unmorphJumpTime = $10 28 | 29 | ; Samus' Gear constants 30 | ; Bitfields 31 | def itemMask_bomb = %00000001 ; 01: Bombs 32 | def itemMask_hiJump = %00000010 ; 02: Hi-jump 33 | def itemMask_screw = %00000100 ; 04: Screw attack 34 | def itemMask_space = %00001000 ; 08: Space jump 35 | def itemMask_spring = %00010000 ; 10: Spring ball 36 | def itemMask_spider = %00100000 ; 20: Spider ball 37 | def itemMask_varia = %01000000 ; 40: Varia suit 38 | def itemMask_UNUSED = %10000000 ; 80: Unused 39 | ; Bit Numbers 40 | def itemBit_bomb = 0 41 | def itemBit_hiJump = 1 42 | def itemBit_screw = 2 43 | def itemBit_space = 3 44 | def itemBit_spring = 4 45 | def itemBit_spider = 5 46 | def itemBit_varia = 6 47 | def itemBit_UNUSED = 7 48 | 49 | ; Collision block-type bit numbers 50 | def blockType_water = 0 ;Water (also causes morph ball sound effect glitch) 51 | def blockType_up = 1 ;Half-solid floor (can jump through) 52 | def blockType_down = 2 ;Half-solid ceiling (can fall through) 53 | def blockType_spike = 3 ;Spike 54 | def blockType_acid = 4 ;Acid 55 | def blockType_shot = 5 ;Shot block 56 | def blockType_bomb = 6 ;Bomb block 57 | def blockType_save = 7 ;Save pillar 58 | 59 | ; Samus' pose constants ($D020) 60 | include "samus/samus_poseConstants.asm" 61 | 62 | 63 | 64 | ; Queen related constants 65 | 66 | ; First and last tiles to be clear by disintegration animation 67 | def queenDeath_firstTile = $8B10 68 | def queenDeath_lastTile = $9570 69 | def queenDeath_bodyStart = $99A0 70 | def queenDeath_bodyEnd = $9A80 71 | -------------------------------------------------------------------------------- /SRC/data/credits.asm: -------------------------------------------------------------------------------- 1 | ; Credits text - 06:7920 2 | NEWCHARMAP creditsText 3 | CHARMAP "", $F0 4 | CHARMAP "\n", $F1 5 | CHARMAP "-", $5E 6 | CHARMAP ":", $1B 7 | 8 | ; Standard ASCII characters 9 | CHARMAP " ", $20 10 | CHARMAP "A", $41 11 | CHARMAP "B", $42 12 | CHARMAP "C", $43 13 | CHARMAP "D", $44 14 | CHARMAP "E", $45 15 | CHARMAP "F", $46 16 | CHARMAP "G", $47 17 | CHARMAP "H", $48 18 | CHARMAP "I", $49 19 | CHARMAP "J", $4A 20 | CHARMAP "K", $4B 21 | CHARMAP "L", $4C 22 | CHARMAP "M", $4D 23 | CHARMAP "N", $4E 24 | CHARMAP "O", $4F 25 | CHARMAP "P", $50 26 | CHARMAP "Q", $51 27 | CHARMAP "R", $52 28 | CHARMAP "S", $53 29 | CHARMAP "T", $54 30 | CHARMAP "U", $55 31 | CHARMAP "V", $56 32 | CHARMAP "W", $57 33 | CHARMAP "X", $58 34 | CHARMAP "Y", $59 35 | CHARMAP "Z", $5A 36 | 37 | 38 | 39 | 40 | db "\n" 41 | db "\n" 42 | db "\n" 43 | db "\n" 44 | db "\n" 45 | db "\n" 46 | db "\n" 47 | db "\n" 48 | db "\n" 49 | db "\n" 50 | db "\n" 51 | db " STAFF \n" 52 | db "\n" 53 | db "\n" 54 | db "\n" 55 | db "\n" 56 | db "\n" 57 | db "\n" 58 | db " -- TEAM METROID -- \n" 59 | db "\n" 60 | db "\n" 61 | db "\n" 62 | db "\n" 63 | db " PRODUCER \n" 64 | db "\n" 65 | db " GUNPEI YOKOI \n" 66 | db "\n" 67 | db "\n" 68 | db "\n" 69 | db "\n" 70 | db "\n" 71 | db "\n" 72 | db " DIRECTOR \n" 73 | db "\n" 74 | db " HIROJI KIYOTAKE \n" 75 | db "\n" 76 | db " HIROYUKI KIMURA \n" 77 | db "\n" 78 | db "\n" 79 | db "\n" 80 | db "\n" 81 | db "\n" 82 | db "\n" 83 | db " MAIN PROGRAMMER \n" 84 | db "\n" 85 | db " TAKAHIRO HARADA \n" 86 | db "\n" 87 | db "\n" 88 | db "\n" 89 | db "\n" 90 | db "\n" 91 | db "\n" 92 | db " PROGRAMMER \n" 93 | db "\n" 94 | db " MASARU YAMANAKA \n" 95 | db " MASAO YAMAMOTO \n" 96 | db " ISAO HIRANO \n" 97 | db "\n" 98 | db "\n" 99 | db "\n" 100 | db "\n" 101 | db "\n" 102 | db " GRAPHIC DESIGNER \n" 103 | db "\n" 104 | db " HIROJI KIYOTAKE \n" 105 | db " HIROYUKI KIMURA \n" 106 | db "\n" 107 | db "\n" 108 | db "\n" 109 | db "\n" 110 | db "\n" 111 | db " PROGRAM ASSISTANT \n" 112 | db "\n" 113 | db " YUZURU OGAWA \n" 114 | db " NOBUHIRO OZAKI \n" 115 | db "\n" 116 | db "\n" 117 | db "\n" 118 | db "\n" 119 | db "\n" 120 | db " SOUND PROGRAMMER \n" 121 | db "\n" 122 | db " RYOHJI YOSHITOMI \n" 123 | db "\n" 124 | db "\n" 125 | db "\n" 126 | db "\n" 127 | db "\n" 128 | db " DESIGNER \n" 129 | db "\n" 130 | db " MAKOTO KANOH \n" 131 | db " MASAFUMI SAKASHITA\n" 132 | db " TOMOYOSHI YAMANE \n" 133 | db " TAKEHIKO HOSOKAWA \n" 134 | db " YASUO INOUE \n" 135 | db "\n" 136 | db "\n" 137 | db "\n" 138 | db "\n" 139 | db "\n" 140 | db " DEBUGGER \n" 141 | db "\n" 142 | db " MASARU OKADA \n" 143 | db " KENJI NISHIZAWA \n" 144 | db " HIROFUMI MATSUOKA \n" 145 | db " TOHRU OHSAWA \n" 146 | db " KOHTA FUKUI \n" 147 | db " KEISUKE TERASAKI \n" 148 | db " KENICHI SUGINO \n" 149 | db " HITOSHI YAMAGAMI \n" 150 | db " KATSUYA YAMANO \n" 151 | db " YUJI HORI \n" 152 | db "\n" 153 | db "\n" 154 | db "\n" 155 | db "\n" 156 | db "\n" 157 | db "\n" 158 | db "\n" 159 | db " - SPECIAL THANKS - \n" 160 | db " TO \n" 161 | db "\n" 162 | db " TAKEHIRO IZUSHI \n" 163 | db " PHIL SANDHOP \n" 164 | db " TONY STANCZYK \n" 165 | db " YUKA NAKATA \n" 166 | db " HIRO YAMADA \n" 167 | db " DAN OWSEN \n" 168 | db " DYLAN CUTHBERT \n" 169 | db " SACHIE INOKE \n" 170 | db "\n" 171 | db "\n" 172 | db "\n" 173 | db "\n" 174 | db "\n" 175 | db "\n" 176 | db "\n" 177 | db "\n" 178 | db "\n" 179 | db "\n" 180 | db "\n" 181 | db "\n" 182 | db "\n" 183 | db " PRESENTED \n" 184 | db " BY \n" 185 | db " NINTENDO \n" 186 | db "\n" 187 | db "\n" 188 | db "\n" 189 | db "\n" 190 | db "\n" 191 | db "\n" 192 | db "\n" 193 | db "\n" 194 | db "\n" 195 | db "\n" 196 | db "\n" 197 | db "\n" 198 | db "\n" 199 | db "\n" 200 | db "\n" 201 | db "\n" 202 | db " ",$21,$22,$23,$20,$24,$25,$20,$26," " ; Implicit newline 203 | db " ",$27,$28,$29,$2A,$2B,$2C,$2D,$2E," \n" 204 | db "\n" 205 | db "\n" 206 | db "\n" 207 | db "\n" 208 | db " TIME : \n" 209 | db "\n" 210 | db "\n" 211 | db "" 212 | -------------------------------------------------------------------------------- /SRC/data/enemyHeaders.asm: -------------------------------------------------------------------------------- 1 | ; Enemy headers { 2 | ; v--- Working address in HRAM 3 | ; ______________________________ $FFE4 - Base sprite attributes - not modified during runtime (apparently) 4 | ; | ___________________________ $FFE5 - Sprite attributes (flipping, etc.) - modified during runtime 5 | ; | | ________________________ $FFE6 - Stun counter? (dummy value in header) 6 | ; | | | _____________________ $FFE7 - General variable (dummy value in header) 7 | ; | | | | __________________ $FFE8 - Upper nybble - directional invulnerability flags, lower nybble - flip related? 8 | ; | | | | | _______________ $FFE9 - Not a dummy value? 9 | ; | | | | | | ____________ $FFEA - Not a dummy value? 10 | ; | | | | | | | _________ $FFEB - Ice counter (dummy value in header) 11 | ; | | | | | | | | ______ $FFEC - Health (also determines drop type?) 12 | ; | | | | | | | | | ___ AI pointer (bank 2) 13 | ; | | | | | | | | | | 14 | enHead_NULL: ; Default - 03:64FE 15 | db $00,$00,$00,$00,$00,$00,$00,$00,$00 16 | dw enAI_NULL 17 | enHead_crawlerRight: ; Enemy 0/20h (tsumari / needler facing right) 18 | db $00,$20,$00,$00,$00,$FF,$00,$00,$01 19 | dw enAI_crawlerA ;$57DE 20 | enHead_crawlerLeft: ; Enemy 1/21h (tsumari / needler facing left) 21 | db $00,$00,$00,$00,$02,$FF,$00,$00,$01 22 | dw enAI_crawlerB 23 | enHead_skreek: ; Enemy 4 (skreek) 24 | db $80,$00,$00,$00,$00,$00,$00,$00,$0B 25 | dw enAI_skreek 26 | enHead_drivel: ; Enemy 9 (drivel) 27 | db $00,$00,$00,$00,$00,$10,$00,$00,$0A 28 | dw enAI_drivel 29 | enHead_smallBug: ; Enemy 12h (yumbo) 30 | db $00,$00,$00,$00,$00,$00,$00,$00,$01 31 | dw enAI_smallBug ; The things the flit back and forth 32 | enHead_hornoad: ; Enemy 14h (hornoad) 33 | db $00,$20,$00,$00,$00,$00,$02,$00,$02 34 | dw enAI_hopper 35 | enHead_senjoo: ; Enemy 16h (senjoo) 36 | db $00,$00,$00,$00,$00,$00,$00,$00,$06 37 | dw enAI_senjooShirk 38 | enHead_pipeBug: ; Enemy 19h/1Ah/3Ch/3Dh (gawron/yumee spawner (pipe bugs)) 39 | db $80,$00,$00,$00,$00,$00,$00,$00,$FF 40 | dw enAI_pipeBug 41 | enHead_chuteLeech: ; Enemy 1Bh (chute leech) 42 | db $00,$00,$00,$00,$00,$00,$00,$00,$03 43 | dw enAI_chuteLeech 44 | enHead_autrackFlipped: ; Enemy 1Eh (autrack (flipped)) 45 | db $00,$20,$00,$00,$08,$00,$00,$00,$0F 46 | dw enAI_autrack 47 | enHead_wallfireFlipped: ; Enemy 1Fh (wallfire (flipped)) 48 | db $00,$20,$00,$00,$00,$00,$00,$00,$FF 49 | dw enAI_wallfire 50 | 51 | enHead_skorpUp: ; Enemy 28h (skorp (vertical, upwards)) 52 | db $80,$00,$00,$00,$00,$00,$00,$00,$04 53 | dw enAI_skorpVert 54 | enHead_skorpDown: ; Enemy 29h (skorp (vertical, downwards)) 55 | db $80,$40,$00,$00,$00,$00,$00,$00,$04 56 | dw enAI_skorpVert 57 | enHead_skorpRight: ; Enemy 2Ah (skorp (horizontal, rightwards)) 58 | db $80,$00,$00,$00,$00,$00,$00,$00,$04 59 | dw enAI_skorpHori 60 | enHead_skorpLeft: ; Enemy 2Bh (skorp (horizontal, leftwards)) 61 | db $80,$20,$00,$00,$00,$00,$00,$00,$04 62 | dw enAI_skorpHori 63 | 64 | enHead_moheekRight: ; Enemy 30h (moheek facing right) 65 | db $00,$20,$00,$00,$00,$FF,$00,$00,$05 66 | dw enAI_crawlerA 67 | enHead_moheekLeft: ; Enemy 31h (moheek facing left) 68 | db $00,$00,$00,$00,$02,$FF,$00,$00,$05 69 | dw enAI_crawlerB 70 | enHead_octroll: ; Enemy 40h (octroll) 71 | db $00,$00,$00,$00,$00,$00,$00,$00,$0F 72 | dw enAI_chuteLeech 73 | enHead_autrack: ; Enemy 41h (autrack) 74 | db $00,$00,$00,$00,$08,$00,$00,$00,$0F 75 | dw enAI_autrack 76 | enHead_autoad: ; Enemy 46h (autoad) 77 | db $00,$20,$00,$00,$00,$00,$02,$00,$0E 78 | dw enAI_hopper 79 | enHead_wallfire: ; Enemy 4Ah (wallfire) 80 | db $00,$00,$00,$00,$00,$00,$00,$00,$FF 81 | dw enAI_wallfire 82 | enHead_gunzoo: ; Enemy 51h (gunzoo) 83 | db $00,$00,$00,$00,$01,$00,$00,$00,$15 84 | dw enAI_gunzoo 85 | enHead_autom: ; Enemy 5Ch (autom) 86 | db $00,$00,$00,$00,$00,$00,$00,$00,$FF 87 | dw enAI_autom 88 | enHead_shirk: ; Enemy 63h (shirk) 89 | db $00,$00,$00,$00,$00,$00,$00,$00,$0A 90 | dw enAI_senjooShirk 91 | enHead_septogg: ; Enemy 65h (septogg) 92 | db $00,$00,$00,$00,$00,$00,$00,$00,$FF 93 | dw enAI_septogg 94 | enHead_moto: ; Enemy 68h (moto) 95 | db $00,$20,$00,$00,$20,$00,$00,$00,$11 96 | dw enAI_moto 97 | enHead_halzyn: ; Enemy 6Ah (halzyn) 98 | db $00,$00,$00,$00,$30,$00,$00,$00,$03 99 | dw enAI_halzyn 100 | enHead_ramulken: ; Enemy 6Bh (ramulken) 101 | db $00,$20,$00,$00,$B0,$00,$02,$00,$0C 102 | dw enAI_hopper 103 | 104 | enHead_metroidStinger: ; Enemy 6Dh - Metroid stinger event 105 | db $00,$00,$00,$00,$00,$00,$00,$00,$FF 106 | dw enAI_metroidStinger 107 | enHead_proboscumFlipped: ; Enemy 6Eh (proboscum (flipped)) 108 | db $00,$20,$00,$00,$00,$00,$00,$00,$FF 109 | dw enAI_proboscum 110 | enHead_proboscum: ; Enemy 72h (proboscum) 111 | db $00,$00,$00,$00,$00,$00,$00,$00,$FF 112 | dw enAI_proboscum 113 | enHead_missileBlock: ; Enemy 75h (missile block) 114 | db $00,$00,$00,$00,$00,$00,$00,$00,$FF 115 | dw enAI_missileBlock 116 | enHead_flittVanishing: ; Enemy D0h (flitt) (vanishing type) 117 | db $00,$00,$00,$00,$00,$00,$00,$00,$FF 118 | dw enAI_flittVanishing 119 | enHead_flittMoving: ; Enemy D1h (flitt) (moving type) 120 | db $00,$00,$00,$00,$00,$00,$00,$00,$FF 121 | dw enAI_flittMoving 122 | enHead_gravitt: ; Enemy D3h (gravitt) 123 | db $80,$00,$00,$00,$80,$00,$00,$00,$05 124 | dw enAI_gravitt 125 | enHead_gullugg: ; Enemy D8h (gullugg) 126 | db $00,$00,$00,$00,$00,$00,$00,$00,$04 127 | dw enAI_gullugg 128 | enHead_missileDoor: ; Enemy F8h (missile door) 129 | db $00,$00,$00,$00,$00,$00,$00,$00,$FF 130 | dw enAI_missileDoor 131 | 132 | enHead_alphaHatching: ; Enemy A0h (hatching alpha metroid) 133 | db $00,$00,$00,$00,$FF,$00,$00,$00,$05 134 | dw enAI_hatchingAlpha 135 | enHead_alphaMetroid: ; Enemy A4h (alpha metroid) 136 | db $00,$00,$00,$00,$FF,$00,$00,$00,$05 137 | dw enAI_alphaMetroid 138 | enHead_gammaMetroid: ; Enemy A3h (gamma metroid) 139 | db $00,$00,$00,$00,$FF,$00,$00,$00,$0A 140 | dw enAI_gammaMetroid 141 | enHead_zetaMetroid: ; Enemy ADh (zeta metroid) 142 | db $00,$00,$00,$00,$FF,$00,$00,$00,$14 143 | dw enAI_zetaMetroid 144 | enHead_omegaMetroid: ; Enemy B3h (omega metroid hatching) 145 | db $00,$00,$00,$00,$FF,$00,$00,$00,$28 146 | dw enAI_omegaMetroid 147 | enHead_metroid: ; Enemy CEh (normal metroid) 148 | db $00,$00,$00,$00,$FF,$10,$10,$00,$05 149 | dw enAI_normalMetroid 150 | enHead_babyMetroid: ; Enemy A6h (baby metroid) 151 | db $80,$00,$00,$00,$FF,$00,$00,$00,$FF 152 | dw enAI_babyMetroid 153 | 154 | enHead_item: ; Enemy 80h..99h/9Bh/9Dh (item / item orb / enemy/missile refill) 155 | db $80,$00,$00,$00,$00,$00,$00,$00,$FF 156 | dw enAI_itemOrb 157 | enHead_itemFlipped: ; Unused (item, but horizontally flipped) 158 | db $00,$00,$00,$00,$00,$00,$00,$00,$FF 159 | dw enAI_itemOrb 160 | enHead_blobThrower: ; Enemy 9Ah (blob thrower?) 161 | db $00,$00,$00,$00,$70,$00,$00,$00,$15 162 | dw enAI_blobThrower 163 | enHead_glowFly: ; Enemy 2Ch (glow fly) 164 | db $00,$00,$00,$00,$00,$00,$00,$00,$03 165 | dw enAI_glowFly 166 | enHead_rockIcicle: ; Enemy 34h (rock icicle) 167 | db $00,$00,$00,$00,$00,$00,$00,$00,$01 168 | dw enAI_rockIcicle 169 | enHead_arachnus: ; Enemy 76h..7Ah (Arachnus) 170 | db $00,$00,$00,$00,$00,$00,$00,$00,$FD 171 | dw enAI_arachnus 172 | enHead_arachnusOrb: ; Enemy 9Ch (Arachnus orb) 173 | db $00,$00,$00,$00,$00,$00,$00,$00,$FD 174 | dw enAI_arachnus 175 | ;} -------------------------------------------------------------------------------- /SRC/data/enemyHitboxes.asm: -------------------------------------------------------------------------------- 1 | ; Enemy Hitboxes { 2 | ; Top, bottom, left, right 3 | 4 | ; Only used on intangible things, but technically still a point 5 | hitbox_point: db 0, 0, 0, 0 6 | hitbox_refill: db 1, 1, 1, 1 7 | hitbox_tile: db -4, 3, -4, 3 8 | 9 | hitbox6A43: db -4, 3, -8, 7 10 | hitbox6A47: db -4, 3, -12, 11 11 | hitbox6A4B: db -4, 3, -16, 15 12 | hitbox6A4F: db -4, 3, -20, 19 13 | hitbox6A53: db -4, 3, -24, 23 14 | hitbox6A57: db -4, 3, -28, 27 15 | hitbox6A5B: db -8, 0, -8, 16 16 | hitbox6A5F: db -4, 3, -12, 3 17 | hitbox6A63: db -4, 3, -20, 3 18 | hitbox6A67: db -8, 7, -4, 3 19 | 20 | hitbox_block: db -8, 7, -8, 7 21 | hitbox6A6F: db -8, 7, -12, 11 22 | hitbox_octroll: db -8, 7, -16, 15 23 | hitbox6A77: db -4, 11, -8, 7 24 | hitbox6A7B: db -12, 3, -12, 11 25 | hitbox6A7F: db -4, 11, -12, 11 26 | hitbox6A83: db -4, 11, -12, 3 ; Unused? 27 | hitbox_metroid: db -11, 9, -12, 11 28 | hitbox6A8B: db 0, 15, 0, 7 29 | hitbox6A8F: db -12, 11, -4, 3 30 | hitbox6A93: db -12, 11, -8, 7 31 | hitbox6A97: db -12, 11, -12, 11 32 | hitbox_alphaMetroid: db -12, 11, -16, 15 33 | hitbox6A9F: db -12, 11, -20, 19 34 | hitbox_autrackMid: db -16, 7, -8, 7 35 | hitbox6AA7: db -20, 3, -4, 19 36 | hitbox6AAB: db 0, 19, 0, 8 37 | hitbox6AAF: db -4, 19, -12, 3 38 | hitbox_omegaMetroid: db -12, 19, -8, 7 39 | hitbox6AB7: db -16, 15, -4, 3 40 | hitbox6ABB: db -16, 15, -12, 11 41 | hitbox6ABF: db -16, 15, -16, 15 42 | hitbox6AC3: db -16, 15, -20, 19 43 | hitbox_autrackTall: db -24, 7, -8, 7 44 | hitbox6ACB: db 0, 33, 0, 18 45 | hitbox6ACF: db -20, 19, -4, 3 46 | hitbox6AD3: db -20, 19, -20, 19 47 | hitbox6AD7: db 0, 39, 0, 31 48 | hitbox6ADB: db -24, 23, -4, 3 49 | hitbox_missileDoor: db -24, 23, -24, 23 50 | hitbox6AE3: db 0, 55, 0, 47 51 | ;} -------------------------------------------------------------------------------- /SRC/data/enemy_damageValues.asm: -------------------------------------------------------------------------------- 1 | ; This file was automatically generated from enemies.csv. Please do not edit this directly. 2 | db $08 ; Tsumari 3 | db $08 ; Tsumari 4 | db $08 ; Tsumari 5 | db $08 ; Tsumari 6 | db $10 ; Skreek 7 | db $10 ; Skreek 8 | db $10 ; Skreek 9 | db $10 ; Skreek 10 | db $03 ; Skreek projectile 11 | db $10 ; Drivel 12 | db $10 ; Drivel 13 | db $10 ; Drivel 14 | db $03 ; Drivel projectile 15 | db $03 ; Drivel projectile 16 | db $03 ; Drivel projectile 17 | db $03 ; Drivel projectile 18 | db $03 ; Drivel projectile 19 | db $03 ; Drivel projectile 20 | db $05 ; Small bugs 21 | db $05 ; Small bugs 22 | db $10 ; Hornoad 23 | db $10 ; Hornoad 24 | db $15 ; Senjoo 25 | db $08 ; Gawron 26 | db $08 ; Gawron 27 | db $00 ; Gawron spawner? 28 | db $00 ; Gawron spawner? 29 | db $12 ; Chute leech 30 | db $12 ; Chute leech 31 | db $12 ; Chute leech 32 | db $15 ; (uses same spritemap as 41h autrack) 33 | db $15 ; (uses same spritemap as 4Ah wallfire) 34 | db $10 ; Needler 35 | db $10 ; Needler 36 | db $10 ; Needler 37 | db $10 ; Needler 38 | db $00 ; (no graphics) 39 | db $00 ; (no graphics) 40 | db $00 ; (no graphics) 41 | db $00 ; (no graphics) 42 | db $11 ; Skorp 43 | db $11 ; Skorp 44 | db $11 ; Skorp 45 | db $11 ; Skorp 46 | db $10 ; Glow fly 47 | db $10 ; Glow fly 48 | db $10 ; Glow fly 49 | db $10 ; Glow fly 50 | db $13 ; Moheek 51 | db $13 ; Moheek 52 | db $13 ; Moheek 53 | db $13 ; Moheek 54 | db $00 ; Rock icicle 55 | db $08 ; Rock icicle 56 | db $08 ; Rock icicle 57 | db $08 ; Rock icicle 58 | db $12 ; Yumee 59 | db $12 ; Yumee 60 | db $12 ; Yumee 61 | db $12 ; Yumee 62 | db $00 ; Yumee spawner? 63 | db $00 ; Yumee spawner? 64 | db $20 ; Octroll 65 | db $20 ; Octroll 66 | db $20 ; Octroll 67 | db $15 ; Autrack 68 | db $15 ; Autrack 69 | db $15 ; Autrack 70 | db $15 ; Autrack 71 | db $10 ; Autrack projectile 72 | db $15 ; Autoad 73 | db $15 ; Autoad 74 | db $00 ; Sideways Autoad (unused) 75 | db $00 ; Sideways Autoad (unused) 76 | db $15 ; Wallfire 77 | db $15 ; Wallfire 78 | db $FF ; Wallfire 79 | db $10 ; Wallfire projectile 80 | db $10 ; Wallfire projectile 81 | db $10 ; Wallfire projectile 82 | db $10 ; Wallfire projectile 83 | db $15 ; Gunzoo 84 | db $15 ; Gunzoo 85 | db $15 ; Gunzoo 86 | db $08 ; Gunzoo diagonal projectile 87 | db $08 ; Gunzoo diagonal projectile 88 | db $08 ; Gunzoo diagonal projectile 89 | db $08 ; Gunzoo horizontal projectile 90 | db $08 ; Gunzoo horizontal projectile (unused frame) 91 | db $08 ; Gunzoo horizontal projectile 92 | db $08 ; Gunzoo horizontal projectile 93 | db $08 ; Gunzoo horizontal projectile 94 | db $15 ; Autom 95 | db $15 ; Autom 96 | db $10 ; Autom projectile 97 | db $10 ; Autom projectile 98 | db $10 ; Autom projectile 99 | db $10 ; Autom projectile 100 | db $10 ; Autom projectile 101 | db $15 ; Shirk 102 | db $15 ; Shirk 103 | db $FF ; Septogg 104 | db $FF ; Septogg 105 | db $20 ; Moto 106 | db $20 ; Moto 107 | db $20 ; Moto 108 | db $10 ; Halzyn 109 | db $20 ; Ramulken 110 | db $20 ; Ramulken 111 | db $00 ; Musical stinger event trigger 112 | db $FF ; (uses same spritemap as 72h proboscum) 113 | db $00 ; (no graphics) 114 | db $00 ; (no graphics) 115 | db $00 ; (no graphics) 116 | db $FF ; Proboscum 117 | db $00 ; Proboscum 118 | db $00 ; Proboscum 119 | db $FF ; Missile block 120 | db $20 ; Arachnus 121 | db $20 ; Arachnus 122 | db $20 ; Arachnus 123 | db $20 ; Arachnus 124 | db $20 ; Arachnus 125 | db $02 ; Arachnus projectile 126 | db $02 ; Arachnus projectile 127 | db $00 ; (no graphics) 128 | db $00 ; (no graphics) 129 | db $00 ; (no graphics) 130 | db $FF ; Plasma beam orb 131 | db $00 ; Plasma beam 132 | db $FF ; Ice beam orb (and bent neck of Queen’s vomiting pose!?) 133 | db $00 ; Ice beam 134 | db $FF ; Wave beam orb 135 | db $00 ; Wave beam 136 | db $FF ; Spazer beam orb 137 | db $00 ; Spazer beam 138 | db $FF ; Bombs orb 139 | db $00 ; Bombs 140 | db $FF ; Screw attack orb 141 | db $00 ; Screw attack 142 | db $FF ; Varia suit orb 143 | db $00 ; Varia suit 144 | db $FF ; Hi-jump boots orb 145 | db $00 ; Hi-jump boots 146 | db $FF ; Space jump orb 147 | db $00 ; Space jump 148 | db $FF ; (spider ball orb?) 149 | db $00 ; Spider ball 150 | db $FF ; (spring ball orb?) 151 | db $00 ; Spring ball 152 | db $FF ; (energy tank orb?) 153 | db $00 ; Energy tank 154 | db $FF ; (missile tank orb?) 155 | db $00 ; Missile tank 156 | db $30 ; Blob thrower (sprite is written to WRAM) 157 | db $00 ; Energy refill 158 | db $FF ; Arachnus orb 159 | db $00 ; Missile refill 160 | db $10 ; Blob thrower projectile 161 | db $10 ; Blob thrower projectile 162 | db $FE ; Metroid 163 | db $00 ; Metroid hatching 164 | db $00 ; (no graphics) 165 | db $10 ; Alpha metroid 166 | db $10 ; Alpha metroid 167 | db $FF ; Baby metroid egg 168 | db $FF ; Baby metroid egg 169 | db $FF ; Baby metroid egg 170 | db $00 ; Baby metroid 171 | db $00 ; Baby metroid 172 | db $00 ; (no graphics) 173 | db $00 ; (no graphics) 174 | db $00 ; (no graphics) 175 | db $15 ; Gamma metroid 176 | db $15 ; Gamma metroid projectile 177 | db $15 ; Gamma metroid projectile 178 | db $15 ; Gamma metroid 179 | db $00 ; (no graphics) 180 | db $00 ; Gamma metroid shell 181 | db $20 ; Zeta metroid hatching 182 | db $20 ; Zeta metroid 183 | db $20 ; Zeta metroid 184 | db $20 ; Zeta metroid 185 | db $20 ; Zeta metroid 186 | db $20 ; Zeta metroid 187 | db $20 ; Zeta metroid 188 | db $00 ; Zeta metroid 189 | db $00 ; Zeta metroid 190 | db $00 ; Zeta metroid 191 | db $00 ; Zeta metroid 192 | db $10 ; Zeta metroid projectile 193 | db $25 ; Omega metroid 194 | db $25 ; Omega metroid 195 | db $25 ; Omega metroid 196 | db $25 ; Omega metroid 197 | db $25 ; Omega metroid 198 | db $00 ; Omega metroid 199 | db $00 ; Omega metroid 200 | db $12 ; Omega metroid projectile 201 | db $12 ; Omega metroid projectile 202 | db $12 ; Omega metroid projectile 203 | db $12 ; Omega metroid projectile 204 | db $12 ; Omega metroid projectile 205 | db $12 ; Omega metroid projectile 206 | db $12 ; Omega metroid projectile 207 | db $12 ; (omega metroid projectile?) 208 | db $FE ; Metroid 209 | db $FE ; Metroid (hurt) 210 | db $FF ; Flitt 211 | db $FF ; Flitt 212 | db $00 ; Stalagtite (unused) 213 | db $10 ; Gravitt 214 | db $10 ; Gravitt 215 | db $10 ; Gravitt 216 | db $10 ; Gravitt 217 | db $10 ; Gravitt 218 | db $12 ; Gullugg 219 | db $12 ; Gullugg 220 | db $12 ; Gullugg 221 | db $00 ; Baby metroid egg preview 222 | db $00 ; (no graphics) 223 | db $00 ; (no graphics) 224 | db $00 ; (no graphics) 225 | db $00 ; (no graphics) 226 | db $00 ; Small health drop 227 | db $00 ; Small health drop 228 | db $00 ; Metroid death / missile door / screw attack explosion 229 | db $00 ; Metroid death / missile door / screw attack explosion 230 | db $00 ; Metroid death / missile door / screw attack explosion 231 | db $00 ; Metroid death / missile door / screw attack explosion 232 | db $00 ; Metroid death / missile door / screw attack explosion 233 | db $00 ; Metroid death / missile door / screw attack explosion 234 | db $00 ; Enemy death explosion 235 | db $00 ; Enemy death explosion 236 | db $00 ; Enemy death explosion 237 | db $00 ; Enemy death explosion (extra frame for enemies not dropping small health) 238 | db $00 ; Big energy drop 239 | db $00 ; Big energy drop 240 | db $00 ; Missile drop 241 | db $00 ; Missile drop 242 | db $40 ; Metroid Queen neck (no graphics) 243 | db $40 ; Metroid Queen head left half (no graphics) 244 | db $20 ; Metroid Queen projectile/head right half (no graphics) 245 | db $40 ; Metroid Queen body (no graphics) 246 | db $00 ; (no graphics) 247 | db $40 ; Metroid Queen mouth closed (no graphics) 248 | db $40 ; Metroid Queen mouth open (no graphics) 249 | db $FF ; Metroid Queen mouth stunned (no graphics) 250 | db $FF ; Missile door 251 | db $FF ; (no graphics) 252 | db $FF ; (no graphics) 253 | db $00 ; (no graphics) 254 | db $00 ; (no graphics) 255 | db $00 ; Nothing - flitt (no graphics) 256 | db $00 ; ? 257 | -------------------------------------------------------------------------------- /SRC/data/enemy_nameConstants.asm: -------------------------------------------------------------------------------- 1 | ; This file was automatically generated from enemies.csv. Please do not edit this directly. 2 | def SPRITE_SKREEK_1 = $04 ; Skreek 3 | def SPRITE_SKREEK_3 = $06 ; Skreek 4 | def SPRITE_SKREEK_4 = $07 ; Skreek 5 | def SPRITE_SKREEK_SPIT = $08 ; Skreek projectile 6 | def SPRITE_DRIVEL_1 = $09 ; Drivel 7 | def SPRITE_DRIVEL_3 = $0B ; Drivel 8 | def SPRITE_DRIVEL_SPIT_3 = $0E ; Drivel projectile 9 | def SPRITE_DRIVEL_SPIT_4 = $0F ; Drivel projectile 10 | def SPRITE_DRIVEL_SPIT_6 = $11 ; Drivel projectile 11 | def SPRITE_GAWRON_1 = $17 ; Gawron 12 | def SPRITE_GAWRON_2 = $18 ; Gawron 13 | def SPRITE_CHUTELEECH_1 = $1B ; Chute leech 14 | def SPRITE_CHUTELEECH_2 = $1C ; Chute leech 15 | def SPRITE_CHUTELEECH_3 = $1D ; Chute leech 16 | def SPRITE_AUTRACK_FLIPPED = $1E ; (uses same spritemap as 41h autrack) 17 | def SPRITE_WALLFIRE_FLIPPED = $1F ; (uses same spritemap as 4Ah wallfire) 18 | def SPRITE_GLOWFLY_IDLE_1 = $2C ; Glow fly 19 | def SPRITE_GLOWFLY_IDLE_2 = $2D ; Glow fly 20 | def SPRITE_GLOWFLY_WINDUP = $2E ; Glow fly 21 | def SPRITE_GLOWFLY_MOVING = $2F ; Glow fly 22 | def SPRITE_ROCKICICLE_IDLE_1 = $34 ; Rock icicle 23 | def SPRITE_ROCKICICLE_IDLE_2 = $35 ; Rock icicle 24 | def SPRITE_ROCKICICLE_MOVING_1 = $36 ; Rock icicle 25 | def SPRITE_ROCKICICLE_MOVING_2 = $37 ; Rock icicle 26 | def SPRITE_YUMEE_1 = $38 ; Yumee 27 | def SPRITE_YUMEE_2 = $39 ; Yumee 28 | def SPRITE_YUMEE_3 = $3A ; Yumee 29 | def SPRITE_YUMEE_SPAWNER = $3C ; Yumee spawner? 30 | def SPRITE_OCTROLL_1 = $3E ; Octroll 31 | def SPRITE_OCTROLL_3 = $40 ; Octroll 32 | def SPRITE_AUTRACK_1 = $41 ; Autrack 33 | def SPRITE_AUTRACK_3 = $43 ; Autrack 34 | def SPRITE_AUTRACK_4 = $44 ; Autrack 35 | def SPRITE_AUTRACK_LASER = $45 ; Autrack projectile 36 | def SPRITE_AUTOAD_2 = $47 ; Autoad 37 | def SPRITE_WALLFIRE_1 = $4A ; Wallfire 38 | def SPRITE_WALLFIRE_2 = $4B ; Wallfire 39 | def SPRITE_WALLFIRE_DEAD = $4C ; Wallfire 40 | def SPRITE_WALLFIRE_SHOT_1 = $4D ; Wallfire projectile 41 | def SPRITE_WALLFIRE_SHOT_3 = $4F ; Wallfire projectile 42 | def SPRITE_WALLFIRE_SHOT_4 = $50 ; Wallfire projectile 43 | def SPRITE_GUNZOO_1 = $51 ; Gunzoo 44 | def SPRITE_GUNZOO_3 = $53 ; Gunzoo 45 | def SPRITE_GUNZOO_DIAGSHOT_1 = $54 ; Gunzoo diagonal projectile 46 | def SPRITE_GUNZOO_DIAGSHOT_2 = $55 ; Gunzoo diagonal projectile 47 | def SPRITE_GUNZOO_DIAGSHOT_3 = $56 ; Gunzoo diagonal projectile 48 | def SPRITE_GUNZOO_HSHOT_1 = $57 ; Gunzoo horizontal projectile 49 | def SPRITE_GUNZOO_HSHOT_3 = $59 ; Gunzoo horizontal projectile 50 | def SPRITE_GUNZOO_HSHOT_5 = $5B ; Gunzoo horizontal projectile 51 | def SPRITE_AUTOM_1 = $5C ; Autom 52 | def SPRITE_AUTOM_2 = $5D ; Autom 53 | def SPRITE_AUTOM_SHOT_1 = $5E ; Autom projectile 54 | def SPRITE_AUTOM_SHOT_3 = $60 ; Autom projectile 55 | def SPRITE_SHIRK_1 = $63 ; Shirk 56 | def SPRITE_SHIRK_2 = $64 ; Shirk 57 | def SPRITE_MOTO_2 = $68 ; Moto 58 | def SPRITE_PROBOSCUM_FLIPPED = $6E ; (uses same spritemap as 72h proboscum) 59 | def SPRITE_PROBOSCUM_1 = $72 ; Proboscum 60 | def SPRITE_PROBOSCUM_2 = $73 ; Proboscum 61 | def SPRITE_PROBOSCUM_3 = $74 ; Proboscum 62 | def SPRITE_ARACHNUS_ROLL_1 = $76 ; Arachnus 63 | def SPRITE_ARACHNUS_UPRIGHT_1 = $78 ; Arachnus 64 | def SPRITE_ARACHNUS_UPRIGHT_2 = $79 ; Arachnus 65 | def SPRITE_ARACHNUS_UPRIGHT_3 = $7A ; Arachnus 66 | def SPRITE_ARACHNUS_FIREBALL_1 = $7B ; Arachnus projectile 67 | def SPRITE_ARACHNUS_FIREBALL_2 = $7C ; Arachnus projectile 68 | def SPRITE_ITEM_BASE_ID = $81 ; Plasma beam 69 | def QUEEN_ACTOR_BENT_NECK = $82 ; Ice beam orb (and bent neck of Queen’s vomiting pose!?) 70 | def SPRITE_SPRING_BALL_ITEM = $95 ; Spring ball 71 | def SPRITE_ENERGY_REFILL = $9B ; Energy refill 72 | def SPRITE_MISSILE_REFILL = $9D ; Missile refill 73 | def SPRITE_BLOB_1 = $9E ; Blob thrower projectile 74 | def SPRITE_BLOB_2 = $9F ; Blob thrower projectile 75 | def SPRITE_METROID_1 = $A0 ; Metroid 76 | def METROID_SPRITES_START = $A0 ; Metroid 77 | def SPRITE_ALPHA_FACE = $A1 ; Metroid hatching 78 | def SPRITE_ALPHA_1 = $A3 ; Alpha metroid 79 | def SPRITE_ALPHA_2 = $A4 ; Alpha metroid 80 | def SPRITE_EGG_1 = $A5 ; Baby metroid egg 81 | def SPRITE_EGG_2 = $A6 ; Baby metroid egg 82 | def SPRITE_EGG_3 = $A7 ; Baby metroid egg 83 | def SPRITE_BABY_1 = $A8 ; Baby metroid 84 | def SPRITE_GAMMA_1 = $AD ; Gamma metroid 85 | def SPRITE_GAMMA_BOLT_1 = $AE ; Gamma metroid projectile 86 | def SPRITE_GAMMA_BOLT_2 = $AF ; Gamma metroid projectile 87 | def SPRITE_GAMMA_2 = $B0 ; Gamma metroid 88 | def SPRITE_GAMMA_HUSK = $B2 ; Gamma metroid shell 89 | def SPRITE_ZETA_1 = $B3 ; Zeta metroid hatching 90 | def SPRITE_ZETA_4 = $B6 ; Zeta metroid 91 | def SPRITE_ZETA_5 = $B7 ; Zeta metroid 92 | def SPRITE_ZETA_6 = $B8 ; Zeta metroid 93 | def SPRITE_ZETA_8 = $BA ; Zeta metroid 94 | def SPRITE_ZETA_B = $BD ; Zeta metroid 95 | def SPRITE_ZETA_SHOT = $BE ; Zeta metroid projectile 96 | def SPRITE_OMEGA_1 = $BF ; Omega metroid 97 | def SPRITE_OMEGA_2 = $C0 ; Omega metroid 98 | def SPRITE_OMEGA_3 = $C1 ; Omega metroid 99 | def SPRITE_OMEGA_5 = $C3 ; Omega metroid 100 | def SPRITE_OMEGA_SHOT_1 = $C6 ; Omega metroid projectile 101 | def SPRITE_OMEGA_SHOT_3 = $C8 ; Omega metroid projectile 102 | def SPRITE_OMEGA_SHOT_7 = $CC ; Omega metroid projectile 103 | def SPRITE_METROID_2 = $CE ; Metroid 104 | def SPRITE_METROID_3 = $CF ; Metroid (hurt) 105 | def METROID_SPRITES_END = $CF ; Metroid (hurt) 106 | def SPRITE_FLITT_1 = $D0 ; Flitt 107 | def SPRITE_FLITT_2 = $D1 ; Flitt 108 | def SPRITE_GRAVITT_1 = $D3 ; Gravitt 109 | def SPRITE_GRAVITT_5 = $D7 ; Gravitt 110 | def SPRITE_GULLUGG_1 = $D8 ; Gullugg 111 | def SPRITE_GULLUGG_3 = $DA ; Gullugg 112 | def SPRITE_SMALL_HEALTH = $E0 ; Small health drop 113 | def SPRITE_SCREW_EXPLOSION_START = $E2 ; Metroid death / missile door / screw attack explosion 114 | def SPRITE_SCREW_EXPLOSION_END = $E7 ; Metroid death / missile door / screw attack explosion 115 | def SPRITE_NORMAL_EXPLOSION_START = $E8 ; Enemy death explosion 116 | def SPRITE_NORMAL_EXPLOSION_END = $EA ; Enemy death explosion 117 | def SPRITE_BIG_HEALTH = $EC ; Big energy drop 118 | def SPRITE_MISSILE_DROP = $EE ; Missile drop 119 | def QUEEN_ACTOR_NECK = $F0 ; Metroid Queen neck (no graphics) 120 | def QUEEN_ACTOR_HEAD_LEFT = $F1 ; Metroid Queen head left half (no graphics) 121 | def QUEEN_ACTOR_HEAD_RIGHT = $F2 ; Metroid Queen projectile/head right half (no graphics) 122 | def QUEEN_ACTOR_PROJECTILE = $F2 ; Metroid Queen projectile/head right half (no graphics) 123 | def QUEEN_ACTOR_BODY = $F3 ; Metroid Queen body (no graphics) 124 | def QUEEN_ACTOR_MOUTH_CLOSED = $F5 ; Metroid Queen mouth closed (no graphics) 125 | def QUEEN_ACTOR_MOUTH_OPEN = $F6 ; Metroid Queen mouth open (no graphics) 126 | def QUEEN_ACTOR_MOUTH_STUNNED = $F7 ; Metroid Queen mouth stunned (no graphics) 127 | def SPRITE_MISSILE_DOOR = $F8 ; Missile door 128 | def SPRITE_FLITT_INVISIBLE = $FD ; Nothing - flitt (no graphics) 129 | -------------------------------------------------------------------------------- /SRC/data/initialSave.asm: -------------------------------------------------------------------------------- 1 | dw $07D4 ; Samus' Y position 2 | dw $0648 ; Samus' X position 3 | dw $07C0 ; Screen Y position 4 | dw $0640 ; Screen X position 5 | 6 | ; No bank for enemy graphics 7 | dw gfx_surfaceSPR ; Enemy tiles source address 8 | db BANK(gfx_surfaceBG) ; Background tiles source bank 9 | dw gfx_surfaceBG ; Background tiles source address 10 | ; No bank for metatiles 11 | dw metatiles_surface ; Metatile definitions source address 12 | ; No bank for collision 13 | dw collision_surface ; Collision data source address 14 | db $0F ; Bank for current room 15 | 16 | db $64 ; Samus solid block threshold 17 | db $64 ; Enemy solid block threshold 18 | db $64 ; Projectile solid block threshold 19 | 20 | db $00 ; Samus' equipment 21 | db $00 ; Samus' beam 22 | db $00 ; Samus' energy tanks 23 | dw $0099 ; Samus' health 24 | dw $0030 ; Samus' max missiles 25 | dw $0030 ; Samus' missiles 26 | 27 | db $01 ; Direction Samus is facing 28 | db $02 ; Acid damage 29 | db $08 ; Spike damage 30 | db $47 ; Real number of Metroids remaining 31 | db $04 ; Song for room 32 | db $00 ; In-game timer, minutes 33 | db $00 ; In-game timer, hours 34 | db $39 ; Number of Metroids remaining -------------------------------------------------------------------------------- /SRC/data/itemNames.asm: -------------------------------------------------------------------------------- 1 | ; Item Names and Messages - 01:5911 2 | 3 | dw itemName_00 4 | dw itemName_01 5 | dw itemName_02 6 | dw itemName_03 7 | dw itemName_04 8 | dw itemName_05 9 | dw itemName_06 10 | dw itemName_07 11 | dw itemName_08 12 | dw itemName_09 13 | dw itemName_0A 14 | dw itemName_0B 15 | dw itemName_0C 16 | dw itemName_0D 17 | dw itemName_0E 18 | dw itemName_0F 19 | 20 | NEWCHARMAP itemNames 21 | CHARMAP "A", $C0 22 | CHARMAP "B", $C1 23 | CHARMAP "C", $C2 24 | CHARMAP "D", $C3 25 | CHARMAP "E", $C4 26 | CHARMAP "F", $C5 27 | CHARMAP "G", $C6 28 | CHARMAP "H", $C7 29 | CHARMAP "I", $C8 30 | CHARMAP "J", $C9 31 | CHARMAP "K", $CA 32 | CHARMAP "L", $CB 33 | CHARMAP "M", $CC 34 | CHARMAP "N", $CD 35 | CHARMAP "O", $CE 36 | CHARMAP "P", $CF 37 | CHARMAP "Q", $D0 38 | CHARMAP "R", $D1 39 | CHARMAP "S", $D2 40 | CHARMAP "T", $D3 41 | CHARMAP "U", $D4 42 | CHARMAP "V", $D5 43 | CHARMAP "W", $D6 44 | CHARMAP "X", $D7 45 | CHARMAP "Y", $D8 46 | CHARMAP "Z", $D9 47 | CHARMAP "<", $DE 48 | CHARMAP ">", $DF 49 | CHARMAP " ", $FF 50 | 51 | itemName_00: db " SAVE<> " 52 | itemName_01: db " PLASMA BEAM" 53 | itemName_02: db " ICE BEAM " 54 | itemName_03: db " WAVE BEAM " 55 | itemName_04: db " SPAZER " 56 | itemName_05: db " BOMB " 57 | itemName_06: db " SCREW ATTACK" 58 | itemName_07: db " VARIA " 59 | itemName_08: db " HIGH JUMP BOOTS" 60 | itemName_09: db " SPACE JUMP " 61 | itemName_0A: db " SPIDER BALL " 62 | itemName_0B: db " SPRING BALL " 63 | itemName_0C: db " ENERGY TANK " 64 | itemName_0D: db " MISSILE TANK" 65 | itemName_0E: db " ENERGY " 66 | itemName_0F: db " MISSILES " 67 | 68 | ; End of item names 69 | -------------------------------------------------------------------------------- /SRC/data/title_tilemap.asm: -------------------------------------------------------------------------------- 1 | ; Title Screen Tilemap 2 | 3 | db $45, $FF, $42, $FF, $FF, $FF, $FF, $41, $FF, $FF, $FF, $FF, $40, $42, $FF, $FF, $FF, $FF, $43, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF 4 | db $41, $40, $FF, $FF, $43, $FF, $FF, $DD, $DE, $DF, $E0, $E1, $E2, $FF, $FF, $44, $42, $FF, $FF, $40, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF 5 | db $FF, $FF, $FF, $FF, $FF, $FF, $FF, $46, $E3, $E4, $E5, $E6, $47, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF 6 | db $44, $FF, $81, $82, $83, $84, $85, $86, $87, $88, $89, $8A, $8B, $8C, $8D, $8E, $8F, $D0, $D1, $D2, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF 7 | db $FF, $90, $91, $92, $93, $94, $95, $96, $97, $98, $99, $9A, $9B, $9C, $9D, $9E, $9F, $D3, $D4, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF 8 | db $FF, $A0, $A1, $A2, $A3, $A4, $A5, $A6, $A7, $A8, $A9, $AA, $AB, $AC, $AD, $AE, $AF, $D5, $D6, $D7, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF 9 | db $80, $B0, $B1, $B2, $B3, $B4, $B5, $B6, $B7, $B8, $B9, $BA, $BB, $BC, $BD, $BE, $BF, $D8, $D9, $DA, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF 10 | db $C1, $C0, $FF, $C2, $C3, $C4, $C5, $C6, $C7, $C8, $C9, $CA, $CB, $CC, $CD, $CE, $CF, $DB, $DC, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF 11 | db $FF, $FF, $FF, $FF, $FF, $FF, $FF, $E7, $E8, $E9, $EA, $EB, $EC, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF 12 | db $45, $FF, $00, $01, $02, $03, $04, $05, $06, $07, $08, $09, $0A, $0B, $0C, $0D, $0E, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF 13 | db $FF, $FF, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $1A, $1B, $1C, $1D, $1E, $FF, $FF, $41, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF 14 | db $42, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $45, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF 15 | db $FF, $40, $45, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $41, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF 16 | db $45, $44, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $44, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF 17 | db $FF, $42, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $42, $FF, $FF, $40, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF 18 | db $40, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $45, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF 19 | db $FF, $FF, $41, $FF, $0F, $1F, $3E, $3E, $3F, $FF, $4A, $4B, $4C, $4D, $4E, $4F, $FF, $FF, $44, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF 20 | db $42, $44, $FF, $FF, $41, $FF, $FF, $FF, $FF, $43, $FF, $41, $FF, $FF, $FF, $FF, $42, $FF, $FF, $43, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF 21 | db $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF 22 | db $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF 23 | db $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF 24 | db $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF 25 | db $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF 26 | db $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF 27 | db $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF 28 | db $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF 29 | db $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF 30 | db $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF 31 | db $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF 32 | db $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF 33 | db $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF 34 | db $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF 35 | 36 | -------------------------------------------------------------------------------- /SRC/game.asm: -------------------------------------------------------------------------------- 1 | ; Disassembly of "Metroid2.gb" 2 | ; This file was created with: 3 | ; mgbdis v1.4 - Game Boy ROM disassembler by Matt Currie and contributors. 4 | ; https://github.com/mattcurrie/mgbdis 5 | 6 | INCLUDE "hardware.inc" 7 | 8 | INCLUDE "constants.asm" 9 | INCLUDE "data/enemy_nameConstants.asm" 10 | INCLUDE "macros.asm" 11 | 12 | ; RAM definitions 13 | INCLUDE "ram/vram.asm" 14 | INCLUDE "ram/sram.asm" 15 | INCLUDE "ram/wram.asm" 16 | INCLUDE "ram/hram.asm" 17 | 18 | ; ROM start 19 | INCLUDE "bank_000.asm" 20 | INCLUDE "bank_001.asm" 21 | INCLUDE "bank_002.asm" 22 | INCLUDE "bank_003.asm" 23 | INCLUDE "bank_004.asm" 24 | INCLUDE "bank_005.asm" 25 | INCLUDE "bank_006.asm" 26 | INCLUDE "bank_007.asm" 27 | INCLUDE "bank_008.asm" 28 | ; Level Data banks 29 | INCLUDE "maps/bank_009.asm" 30 | INCLUDE "maps/bank_00a.asm" 31 | INCLUDE "maps/bank_00b.asm" 32 | INCLUDE "maps/bank_00c.asm" 33 | INCLUDE "maps/bank_00d.asm" 34 | INCLUDE "maps/bank_00e.asm" 35 | INCLUDE "maps/bank_00f.asm" -------------------------------------------------------------------------------- /SRC/gfx/commonItems.chr: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alex-west/M2RoS/946d74e8f8b6bef9d82339ac6b038d23c79495e5/SRC/gfx/commonItems.chr -------------------------------------------------------------------------------- /SRC/gfx/enemies/arachnus.chr: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alex-west/M2RoS/946d74e8f8b6bef9d82339ac6b038d23c79495e5/SRC/gfx/enemies/arachnus.chr -------------------------------------------------------------------------------- /SRC/gfx/enemies/enemiesA.chr: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alex-west/M2RoS/946d74e8f8b6bef9d82339ac6b038d23c79495e5/SRC/gfx/enemies/enemiesA.chr -------------------------------------------------------------------------------- /SRC/gfx/enemies/enemiesB.chr: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alex-west/M2RoS/946d74e8f8b6bef9d82339ac6b038d23c79495e5/SRC/gfx/enemies/enemiesB.chr -------------------------------------------------------------------------------- /SRC/gfx/enemies/enemiesC.chr: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alex-west/M2RoS/946d74e8f8b6bef9d82339ac6b038d23c79495e5/SRC/gfx/enemies/enemiesC.chr -------------------------------------------------------------------------------- /SRC/gfx/enemies/enemiesD.chr: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alex-west/M2RoS/946d74e8f8b6bef9d82339ac6b038d23c79495e5/SRC/gfx/enemies/enemiesD.chr -------------------------------------------------------------------------------- /SRC/gfx/enemies/enemiesE.chr: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alex-west/M2RoS/946d74e8f8b6bef9d82339ac6b038d23c79495e5/SRC/gfx/enemies/enemiesE.chr -------------------------------------------------------------------------------- /SRC/gfx/enemies/enemiesF.chr: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alex-west/M2RoS/946d74e8f8b6bef9d82339ac6b038d23c79495e5/SRC/gfx/enemies/enemiesF.chr -------------------------------------------------------------------------------- /SRC/gfx/enemies/metAlpha.chr: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alex-west/M2RoS/946d74e8f8b6bef9d82339ac6b038d23c79495e5/SRC/gfx/enemies/metAlpha.chr -------------------------------------------------------------------------------- /SRC/gfx/enemies/metGamma.chr: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alex-west/M2RoS/946d74e8f8b6bef9d82339ac6b038d23c79495e5/SRC/gfx/enemies/metGamma.chr -------------------------------------------------------------------------------- /SRC/gfx/enemies/metOmega.chr: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alex-west/M2RoS/946d74e8f8b6bef9d82339ac6b038d23c79495e5/SRC/gfx/enemies/metOmega.chr -------------------------------------------------------------------------------- /SRC/gfx/enemies/metZeta.chr: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alex-west/M2RoS/946d74e8f8b6bef9d82339ac6b038d23c79495e5/SRC/gfx/enemies/metZeta.chr -------------------------------------------------------------------------------- /SRC/gfx/enemies/queenSPR.chr: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alex-west/M2RoS/946d74e8f8b6bef9d82339ac6b038d23c79495e5/SRC/gfx/enemies/queenSPR.chr -------------------------------------------------------------------------------- /SRC/gfx/enemies/surfaceSPR.chr: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alex-west/M2RoS/946d74e8f8b6bef9d82339ac6b038d23c79495e5/SRC/gfx/enemies/surfaceSPR.chr -------------------------------------------------------------------------------- /SRC/gfx/itemOrb.chr: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alex-west/M2RoS/946d74e8f8b6bef9d82339ac6b038d23c79495e5/SRC/gfx/itemOrb.chr -------------------------------------------------------------------------------- /SRC/gfx/items.chr: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alex-west/M2RoS/946d74e8f8b6bef9d82339ac6b038d23c79495e5/SRC/gfx/items.chr -------------------------------------------------------------------------------- /SRC/gfx/samus/beamIce.chr: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alex-west/M2RoS/946d74e8f8b6bef9d82339ac6b038d23c79495e5/SRC/gfx/samus/beamIce.chr -------------------------------------------------------------------------------- /SRC/gfx/samus/beamSpazerPlasma.chr: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alex-west/M2RoS/946d74e8f8b6bef9d82339ac6b038d23c79495e5/SRC/gfx/samus/beamSpazerPlasma.chr -------------------------------------------------------------------------------- /SRC/gfx/samus/beamWave.chr: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alex-west/M2RoS/946d74e8f8b6bef9d82339ac6b038d23c79495e5/SRC/gfx/samus/beamWave.chr -------------------------------------------------------------------------------- /SRC/gfx/samus/cannonBeam.chr: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alex-west/M2RoS/946d74e8f8b6bef9d82339ac6b038d23c79495e5/SRC/gfx/samus/cannonBeam.chr -------------------------------------------------------------------------------- /SRC/gfx/samus/cannonMissile.chr: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alex-west/M2RoS/946d74e8f8b6bef9d82339ac6b038d23c79495e5/SRC/gfx/samus/cannonMissile.chr -------------------------------------------------------------------------------- /SRC/gfx/samus/samusPowerSuit.chr: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alex-west/M2RoS/946d74e8f8b6bef9d82339ac6b038d23c79495e5/SRC/gfx/samus/samusPowerSuit.chr -------------------------------------------------------------------------------- /SRC/gfx/samus/samusVariaSuit.chr: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alex-west/M2RoS/946d74e8f8b6bef9d82339ac6b038d23c79495e5/SRC/gfx/samus/samusVariaSuit.chr -------------------------------------------------------------------------------- /SRC/gfx/samus/spinScrewBottom.chr: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alex-west/M2RoS/946d74e8f8b6bef9d82339ac6b038d23c79495e5/SRC/gfx/samus/spinScrewBottom.chr -------------------------------------------------------------------------------- /SRC/gfx/samus/spinScrewTop.chr: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alex-west/M2RoS/946d74e8f8b6bef9d82339ac6b038d23c79495e5/SRC/gfx/samus/spinScrewTop.chr -------------------------------------------------------------------------------- /SRC/gfx/samus/spinSpaceBottom.chr: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alex-west/M2RoS/946d74e8f8b6bef9d82339ac6b038d23c79495e5/SRC/gfx/samus/spinSpaceBottom.chr -------------------------------------------------------------------------------- /SRC/gfx/samus/spinSpaceScrewBottom.chr: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alex-west/M2RoS/946d74e8f8b6bef9d82339ac6b038d23c79495e5/SRC/gfx/samus/spinSpaceScrewBottom.chr -------------------------------------------------------------------------------- /SRC/gfx/samus/spinSpaceScrewTop.chr: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alex-west/M2RoS/946d74e8f8b6bef9d82339ac6b038d23c79495e5/SRC/gfx/samus/spinSpaceScrewTop.chr -------------------------------------------------------------------------------- /SRC/gfx/samus/spinSpaceTop.chr: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alex-west/M2RoS/946d74e8f8b6bef9d82339ac6b038d23c79495e5/SRC/gfx/samus/spinSpaceTop.chr -------------------------------------------------------------------------------- /SRC/gfx/samus/springBallBottom.chr: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alex-west/M2RoS/946d74e8f8b6bef9d82339ac6b038d23c79495e5/SRC/gfx/samus/springBallBottom.chr -------------------------------------------------------------------------------- /SRC/gfx/samus/springBallTop.chr: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alex-west/M2RoS/946d74e8f8b6bef9d82339ac6b038d23c79495e5/SRC/gfx/samus/springBallTop.chr -------------------------------------------------------------------------------- /SRC/gfx/titleCredits/creditsFont.chr: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alex-west/M2RoS/946d74e8f8b6bef9d82339ac6b038d23c79495e5/SRC/gfx/titleCredits/creditsFont.chr -------------------------------------------------------------------------------- /SRC/gfx/titleCredits/creditsNumbers.chr: -------------------------------------------------------------------------------- 1 | |ffff~8~~`f~| >N~|LL~|@~N~|@~ff~| |L~NN~~F~B$$BB$$BB$$BB$$B -------------------------------------------------------------------------------- /SRC/gfx/titleCredits/creditsSprTiles.chr: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alex-west/M2RoS/946d74e8f8b6bef9d82339ac6b038d23c79495e5/SRC/gfx/titleCredits/creditsSprTiles.chr -------------------------------------------------------------------------------- /SRC/gfx/titleCredits/itemFont.chr: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alex-west/M2RoS/946d74e8f8b6bef9d82339ac6b038d23c79495e5/SRC/gfx/titleCredits/itemFont.chr -------------------------------------------------------------------------------- /SRC/gfx/titleCredits/theEnd.chr: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alex-west/M2RoS/946d74e8f8b6bef9d82339ac6b038d23c79495e5/SRC/gfx/titleCredits/theEnd.chr -------------------------------------------------------------------------------- /SRC/gfx/titleCredits/titleScreen.chr: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alex-west/M2RoS/946d74e8f8b6bef9d82339ac6b038d23c79495e5/SRC/gfx/titleCredits/titleScreen.chr -------------------------------------------------------------------------------- /SRC/macros.asm: -------------------------------------------------------------------------------- 1 | ; macros.asm 2 | 3 | ; Call a function in another bank 4 | MACRO callFar 5 | ld a, BANK(\1) 6 | ld [bankRegMirror], a 7 | ld [rMBC_BANK_REG], a 8 | call \1 9 | ENDM 10 | 11 | ; Jump to a function in another bank 12 | MACRO jpLong 13 | ld a, BANK(\1) 14 | ld [bankRegMirror], a 15 | ld [rMBC_BANK_REG], a 16 | jp \1 17 | ENDM 18 | 19 | ; Switch active bank to another bank (based off of label) 20 | MACRO switchBank 21 | ld a, BANK(\1) 22 | ld [bankRegMirror], a 23 | ld [rMBC_BANK_REG], a 24 | ENDM 25 | 26 | ; Switch to another bank (based off some other expression) 27 | MACRO switchBankVar 28 | ld a, \1 29 | ld [bankRegMirror], a 30 | ld [rMBC_BANK_REG], a 31 | ENDM 32 | 33 | 34 | macro LengthDutyOptions ; [sound length], [wave duty] 35 | static_assert \1 < $40, "Invalid sound length" 36 | static_assert \2 < 4, "Invalid wave duty" 37 | 38 | db \1 | \2 << 6 39 | endm 40 | 41 | macro EnvelopeOptions ; [number of envelope sweeps], [envelope sweep direction], [initial envelope] 42 | static_assert \1 < 8, "Invalid number of envelope sweeps" 43 | static_assert \2 < 2, "Invalid envelope sweep direction" 44 | static_assert \3 < $10, "Invalid initial envelope" 45 | 46 | db \1 | \2 << 3 | \3 << 4 47 | endm 48 | 49 | macro DescendingEnvelopeOptions ; [number of envelope sweeps], [initial envelope] 50 | EnvelopeOptions \1, 0, \2 51 | endm 52 | 53 | macro AscendingEnvelopeOptions ; [number of envelope sweeps], [initial envelope] 54 | EnvelopeOptions \1, 1, \2 55 | endm 56 | 57 | macro FrequencyOptions ; [initial frequency], [sound stops flag] 58 | static_assert \1 < $800, "Invalid initial frequency" 59 | static_assert \2 < 2, "Invalid sound stops flag" 60 | 61 | dw \1 | \2 << $E | 1 << $F 62 | endm 63 | 64 | macro SweepOptions ; [number of sweeps], [sweep direction], [sweep time] 65 | static_assert \1 < 8, "Invalid number of sweeps" 66 | static_assert \2 < 2, "Invalid sweep direction" 67 | static_assert \3 < 8, "Invalid sweep time" 68 | 69 | db \1 | \2 << 3 | \3 << 4 70 | endm 71 | 72 | macro AscendingSweepOptions ; [number of sweeps], [sweep time] 73 | SweepOptions \1, 0, \2 74 | endm 75 | 76 | macro DescendingSweepOptions ; [number of sweeps], [sweep time] 77 | SweepOptions \1, 1, \2 78 | endm 79 | 80 | macro LengthOptions ; [sound length] 81 | static_assert \1 < $40, "Invalid sound length" 82 | 83 | db \1 84 | endm 85 | 86 | macro PolynomialCounterOptions ; [frequency mantissa], [counter width], [frequency exponent] 87 | static_assert \1 < 8, "Invalid frequency mantissa" 88 | static_assert \2 < 2, "Invalid counter width" 89 | static_assert \3 < $10, "Invalid frequency exponent" 90 | 91 | db \1 | \2 << 3 | \3 << 4 92 | endm 93 | 94 | macro CounterControlOptions ; [sound stops flag] 95 | static_assert \1 < 2, "Invalid sound stops flag" 96 | 97 | db \1 << 6 | 1 << 7 98 | endm 99 | 100 | macro WaveOptions ; [wave pattern data pointer], [volume], [unused] 101 | static_assert \1 < $10000, "Invalid wave pattern data pointer" 102 | static_assert \2 < 4, "Invalid volume" 103 | static_assert \3 < $20, "Invalid unused" 104 | 105 | dw \1 106 | db \2 << 5 | \3 107 | endm 108 | 109 | macro SongHeader ; [music note offset], [CF01], [tone/sweep channel pointer], [tone channel pointer], [wave channel pointer], [noise channel pointer] 110 | static_assert \1 < $100, "Invalid music note offset" 111 | static_assert \2 < $10000, "Invalid CF01" 112 | assert \3 < $10000, "Invalid tone/sweep channel pointer" 113 | assert \4 < $10000, "Invalid tone channel pointer" 114 | assert \5 < $10000, "Invalid wave channel pointer" 115 | assert \6 < $10000, "Invalid noise channel pointer" 116 | 117 | db \1 118 | dw \2, \3, \4, \5, \6 119 | endm 120 | 121 | macro SongEnd 122 | db $00 123 | endm 124 | 125 | macro SongRest 126 | db $01 127 | endm 128 | 129 | macro Echo1 130 | db $03 131 | endm 132 | 133 | macro Echo2 134 | db $05 135 | endm 136 | 137 | macro SongNote ; [note name in "[A-G]b?[2-7]" format] 138 | def _note equs strsub(\1, 0, strlen(\1) - 1) 139 | def _octave equs strsub(\1, -1, 1) 140 | 141 | def _i_octave equ _octave - 2 142 | static_assert _i_octave < 6, "Invalid note octave" 143 | 144 | if strcmp("\"{_note}\"", "\"C\"") == 0 145 | def _i_note equ 0 146 | elif strcmp("\"{_note}\"", "\"Db\"") == 0 147 | def _i_note equ 1 148 | elif strcmp("\"{_note}\"", "\"D\"") == 0 149 | def _i_note equ 2 150 | elif strcmp("\"{_note}\"", "\"Eb\"") == 0 151 | def _i_note equ 3 152 | elif strcmp("\"{_note}\"", "\"E\"") == 0 153 | def _i_note equ 4 154 | elif strcmp("\"{_note}\"", "\"F\"") == 0 155 | def _i_note equ 5 156 | elif strcmp("\"{_note}\"", "\"Gb\"") == 0 157 | def _i_note equ 6 158 | elif strcmp("\"{_note}\"", "\"G\"") == 0 159 | def _i_note equ 7 160 | elif strcmp("\"{_note}\"", "\"Ab\"") == 0 161 | def _i_note equ 8 162 | elif strcmp("\"{_note}\"", "\"A\"") == 0 163 | def _i_note equ 9 164 | elif strcmp("\"{_note}\"", "\"Bb\"") == 0 165 | def _i_note equ $A 166 | elif strcmp("\"{_note}\"", "\"B\"") == 0 167 | def _i_note equ $B 168 | else 169 | fail "Invalid note name" 170 | endc 171 | 172 | db (_i_octave * $C + _i_note + 1) * 2 173 | 174 | purge _note, _octave, _i_octave, _i_note 175 | endm 176 | 177 | macro SongNoiseNote ; [note index] 178 | static_assert \1 < $2A, "Invalid noise note index" 179 | db \1 * 4 180 | endm 181 | 182 | macro SongNoteLength ; [note length index] 183 | static_assert \1 < $20, "Invalid note length index" 184 | db \1 | $A0 185 | endm 186 | 187 | def SongNoteLength_Hemidemisemiquaver equs "SongNoteLength 0" 188 | def SongNoteLength_Demisemiquaver equs "SongNoteLength 1" 189 | def SongNoteLength_Semiquaver equs "SongNoteLength 2" 190 | def SongNoteLength_Quaver equs "SongNoteLength 3" 191 | def SongNoteLength_Crochet equs "SongNoteLength 4" 192 | def SongNoteLength_Minum equs "SongNoteLength 5" 193 | def SongNoteLength_DottedSemiquaver equs "SongNoteLength 6" 194 | def SongNoteLength_DottedQuaver equs "SongNoteLength 7" 195 | def SongNoteLength_DottedCrochet equs "SongNoteLength 8" 196 | def SongNoteLength_TripletSemiquaver equs "SongNoteLength 9" 197 | def SongNoteLength_TripletQuaver equs "SongNoteLength $A" 198 | def SongNoteLength_Semihemidemisemiquaver equs "SongNoteLength $B" 199 | def SongNoteLength_Semibreve equs "SongNoteLength $C" 200 | 201 | macro SongOptions 202 | db $F1 203 | endm 204 | 205 | macro SongTempo ; [tempo] 206 | static_assert \1 < $10000, "Invalid tempo" 207 | db $F2 208 | dw \1 209 | endm 210 | 211 | macro SongTranspose ; [transpose] 212 | static_assert \1 < $100, "Invalid transpose" 213 | db $F3 214 | db \1 215 | endm 216 | 217 | macro SongRepeatSetup ; [repetitions] 218 | static_assert \1 < $100, "Invalid number of repetitions" 219 | db $F4 220 | db \1 221 | endm 222 | 223 | macro SongRepeat 224 | db $F5 225 | endm 226 | -------------------------------------------------------------------------------- /SRC/maps/door macros.asm: -------------------------------------------------------------------------------- 1 | ; Door macros 2 | 3 | MACRO COPY_DATA 4 | db $00 5 | db BANK(\1), LOW(\1), HIGH(\1) 6 | dw \2 7 | dw \3 8 | ENDM 9 | 10 | MACRO COPY_BG 11 | db $01 12 | db BANK(\1), LOW(\1), HIGH(\1) 13 | dw \2 14 | dw \3 15 | ENDM 16 | 17 | MACRO COPY_SPR 18 | db $02 19 | db BANK(\1), LOW(\1), HIGH(\1) 20 | dw \2 21 | dw \3 22 | ENDM 23 | 24 | MACRO TILETABLE 25 | db $10 | (LOW(\1) & $0F) 26 | ENDM 27 | 28 | MACRO COLLISION 29 | db $20 | (LOW(\1) & $0F) 30 | ENDM 31 | 32 | MACRO SOLIDITY 33 | db $30 | (LOW(\1) & $0F) 34 | ENDM 35 | 36 | MACRO WARP 37 | db $40 | (LOW(\1) & $0F) 38 | db LOW(\2) 39 | ENDM 40 | 41 | MACRO ESCAPE_QUEEN 42 | db $50 43 | ENDM 44 | 45 | MACRO DAMAGE 46 | db $60, (\1), (\2) 47 | ENDM 48 | 49 | MACRO EXIT_QUEEN 50 | db $70 51 | ENDM 52 | 53 | MACRO ENTER_QUEEN 54 | db $80 | ((\1) & $0F) 55 | dw (\2),(\3) 56 | dw (\4),(\5) 57 | ENDM 58 | 59 | MACRO IF_MET_LESS 60 | db $90 61 | db (\1) 62 | dw (\2) 63 | ENDM 64 | 65 | MACRO FADEOUT 66 | db $A0 67 | ENDM 68 | 69 | MACRO LOAD_BG 70 | db $B1 71 | db BANK(\1), LOW(\1), HIGH(\1) 72 | ENDM 73 | 74 | MACRO LOAD_SPR 75 | db $B2 76 | db BANK(\1), LOW(\1), HIGH(\1) 77 | ENDM 78 | 79 | MACRO SONG 80 | db $C0 | ((\1) & $0F) 81 | ENDM 82 | 83 | MACRO ITEM 84 | db $D0 | ((\1) & $0F) 85 | ENDM 86 | 87 | MACRO END_DOOR 88 | db $FF 89 | ENDM -------------------------------------------------------------------------------- /SRC/ram/sram.asm: -------------------------------------------------------------------------------- 1 | ; SRAM Defines 2 | ;;; $A000..BFFF: SRAM ;;; 3 | 4 | section "SRAM", sram[$A000], bank[0] 5 | 6 | saveData_baseAddr:: 7 | saveData1:: ds $40 ;$A000..3F: SRAM slot 1 8 | saveData2:: ds $40 ;$A040..7F: SRAM slot 2 9 | saveData3:: ds $40 ;$A080..BF: SRAM slot 3 10 | ;{ 11 | ; + 0..7: 0123456789ABCDEF 12 | ; + 8: Samus' Y position 13 | ; + Ah: Samus' X position 14 | ; + Ch: Screen Y position 15 | ; + Eh: Screen X position 16 | ; + 10h: Enemy tiles source address (2 bytes) 17 | ; + 12h: Background tiles source bank 18 | ; + 13h: Background tiles source address (2 bytes) 19 | ; + 15h: Metatile definitions source address (bank 8, 2 bytes) 20 | ; + 17h: Tile properties source address (bank 8, 2 bytes) 21 | ; + 19h: Bank for current room 22 | ; + 1Ah: Samus solid block threshold 23 | ; + 1Bh: Enemy solid block threshold 24 | ; + 1Ch: Projectile solid block threshold 25 | ; + 1Dh: Samus' equipment 26 | ; + 1Eh: Samus' beam 27 | ; + 1Fh: Samus' energy tanks 28 | ; + 20h: Samus' health 29 | ; + 22h: Samus' max missiles 30 | ; + 24h: Samus' missiles 31 | ; + 26h: Direction Samus is facing 32 | ; + 27h: Acid damage 33 | ; + 28h: Spike damage 34 | ; + 29h: Real number of Metroids remaining 35 | ; + 2Ah: Song for room 36 | ; + 2Bh: In-game timer, minutes 37 | ; + 2Ch: In-game timer, hours 38 | ; + 2Dh: Number of Metroids remaining 39 | ; 2Eh-3F: Unused 40 | ;} 41 | 42 | saveLastSlot: ds 1;$A0C0: Last used save slot 43 | 44 | ; Over $700 bytes of freespace 45 | 46 | section "SRAM Credits", sram[$A800], bank[0] 47 | creditsTextBuffer:: ds $800 ; Written to in credits from [$6:7920..7E02] 48 | 49 | section "SRAM Object Lists", sram[$B000], bank[0] 50 | ; Object permanence lists (per save file) 51 | saveData_objList_baseAddr:: 52 | saveData1_objList: ds $200 ;$B000..B1BF: SRAM slot 1 53 | saveData2_objList: ds $200 ;$B200..B3BF: SRAM slot 2 54 | saveData3_objList: ds $200 ;$B400..B5BF: SRAM slot 3 55 | ; $40 bytes per map, 7 maps ($40 unused between files) 56 | ; Enough leftover space to easily handle 16 maps worth of save data (WRAM permitting) 57 | 58 | ; $BFFF - End of SRAM 59 | ; EoF -------------------------------------------------------------------------------- /SRC/ram/vram.asm: -------------------------------------------------------------------------------- 1 | ; VRAM defines 2 | 3 | section "VRAM", vram[$8000], BANK[0] 4 | 5 | ; Sprite-only tiles - $8000 - $10 bytes/tile 6 | 7 | def vramDest_creditsSpriteChr = $8000 ; 256 tiles 8 | 9 | def vramDest_samus = $8000 ; $B00 bytes 10 | ; Tile patch-in destinations 11 | def vramDest_cannon = $8080 ; 2 tiles 12 | def vramDest_spinTop = $8500 ; 7 tiles 13 | def vramDest_spinBottom = $8600 ; 5 tiles 14 | def vramDest_ballTop = $8590 ; 2 tiles 15 | def vramDest_ballBottom = $8690 ; 2 tiles 16 | def vramDest_beam = $87E0 ; 2 tiles 17 | 18 | ; Shared Tiles - $8800 19 | def vramDest_titleChr = $8800 20 | 21 | def vramDest_enemies = $8B00 ; 64 tiles 22 | ; item orb = $8B00 ; 4 tiles 23 | def vramDest_item = $8B40 ; 4 tiles 24 | def vramDest_itemFont = $8C00 ; ? tiles 25 | def vramDest_commonItems = $8F00 ; 16 tiles 26 | 27 | def vramDest_creditsNumbers = $8F00 ; 16 tiles 28 | 29 | ; BG Only Tiles - $9000 30 | def vramDest_theEnd = $9000 ; 16 tiles 31 | 32 | def vramDest_bgTiles = $9000 ; 128 tiles 33 | def vramDest_creditsFont = $9200 ; 32 tiles 34 | 35 | ; Background Tilemap - $9800-$9BFF - $20 bytes/row 36 | def vramDest_queenFeet = $9A00 37 | def vramDest_queenStatusBar = $9BE0 38 | 39 | ; Window Tilemap - $9C00-9FFF - $20 bytes/row 40 | def vramDest_statusBar = $9C00 41 | def vramDest_itemText = $9C20 42 | ; Queen's head row 3 43 | ; Queen's head row 4 44 | -------------------------------------------------------------------------------- /SRC/samus/readme.md: -------------------------------------------------------------------------------- 1 | # samus.csv 2 | 3 | The file `samus.csv` contains all of the tables in the game that are indexed by the variable `samusPose`. 4 | 5 | The script `scripts/samus_csv2asm.py` is used to convert `samus.csv` into several `.asm` files that are included in various places in the project. 6 | 7 | Note that there are a handful of tables that do not fill out a row for every single pose. This is undeniably bad practice, but I suppose the original devs decided to shave a few extra bytes because those rows are not relavent when being eaten by the Queen. 8 | 9 | If you want to add a another pose-indexed table to the game, simply insert a named column using your spreadsheet software of choice to `samus.csv`, and then add the name of the column to either the `wordLists` or `byteLists` lists in `samus_csv2asm.py` (depending on whether the value is 2 bytes or 1 bytes). More sophisticated pose-indexed tables (such as `horizontalYOffset` one) will require the addition of bespoke code to the script. 10 | 11 | Adding a new pose to the game is just a matter of adding a new row to the spreadsheet, and filling out all of the columns. Make sure in particular to have `poseJumpTable` and `drawJumpTable` reference actual labels in the game's source code, and please avoid leaving any cells blank. The unused poses `$14`-`$17` are perhaps a good place to start. 12 | 13 | Shuffling the order of the rows in the spreadsheet should work just fine, with only a couple caveats: (a) the zeroeth pose `pose_standing` is sometimes referenced in code using `xor a` instead of `ld a, pose_standing`, and (b) the range of poses relating to being eaten by the Queen are special cased using `cp pose_beingEaten` so standard poses should not be put within that range. 14 | 15 | Note that the `number` column in the spreadsheet is for convenience, and not referenced by any code in `samus_csv2asm.py`. It can be deleted without consequence. 16 | 17 | Have fun adding fun, new characters to the game! 18 | -------------------------------------------------------------------------------- /SRC/samus/samus.csv: -------------------------------------------------------------------------------- 1 | Number,poseComments,poseConstants,poseJumpTable,drawJumpTable,bombPoseTransitionTable,bombedFallingPoseTransitionTable,damagePoseTransitionTable,possibleShotDirections,cannonYOffsetByPose,blockReformHeightTable,spriteHitboxTopTable,bgHitboxTop,horizontalYOffsetA,horizontalYOffsetB,horizontalYOffsetC,horizontalYOffsetD,horizontalYOffsetE,horizontalYOffsetF,horizontalYOffsetG,horizontalYOffsetH 2 | $00,Standing,pose_standing ,poseFunc_standing ,drawSamus_standing ,pose_bombed ,pose_standing ,pose_hurt ,$07,$17,$20,$EC,$08,$10, $18, $20, $28, $2A, $80,0,0 3 | $01,Jumping,pose_jump ,poseFunc_jump ,drawSamus_jump ,pose_bombed ,pose_standing ,pose_hurt ,$0F,$1F,$20,$F4,$14,$14, $18, $20, $28, $2A, $80,0,0 4 | $02,Spin-jumping,pose_spinJump ,poseFunc_spinJump ,drawSamus_spinJump ,pose_bombed ,pose_standing ,pose_hurt ,$00,$00,$20,$FC,$1A,$1A, $20, $28, $2A, $80,0,0,0 5 | $03,Running,pose_run ,poseFunc_running ,drawSamus_run ,pose_bombed ,pose_standing ,pose_hurt ,$07,$14,$20,$EC,$08,$10, $18, $20, $28, $2A, $80,0,0 6 | $04,Crouching,pose_crouch ,poseFunc_crouch ,drawSamus_crouch ,pose_bombed ,pose_standing ,pose_hurt ,$03,$21,$20,$F6,$10,$10, $18, $20, $28, $2A, $80,0,0 7 | $05,Morphball,pose_morph ,poseFunc_morphBall ,drawSamus_morph ,pose_morphBombed,pose_standing ,pose_morphHurt ,$80,$00,$10,$04,$20,$20, $25, $2A, $80,0,0,0,0 8 | $06,Morphball jumping,pose_morphJump ,poseFunc_morphJump ,drawSamus_morph ,pose_morphBombed,pose_standing ,pose_morphHurt ,$80,$00,$10,$04,$20,$20, $25, $2A, $80,0,0,0,0 9 | $07,Falling,pose_fall ,poseFunc_fall ,drawSamus_jump ,pose_bombed ,pose_standing ,pose_hurt ,$0F,$1D,$20,$EC,$10,$10, $18, $20, $28, $2A, $80,0,0 10 | $08,Morphball falling,pose_morphFall ,poseFunc_morphFall ,drawSamus_morph ,pose_morphBombed,pose_standing ,pose_morphHurt ,$80,$00,$10,$04,$20,$20, $25, $2A, $80,0,0,0,0 11 | $09,Starting to jump,pose_nJumpStart ,poseFunc_jumpStart ,drawSamus_jumpStart ,pose_bombed ,pose_standing ,pose_hurt ,$0F,$15,$20,$EC,$10,$10, $18, $20, $28, $2A, $80,0,0 12 | $0A,Starting to spin-jump,pose_spinStart ,poseFunc_jumpStart ,drawSamus_jumpStart ,pose_bombed ,pose_standing ,pose_hurt ,$0F,$15,$20,$EC,$10,$10, $18, $20, $28, $2A, $80,0,0 13 | $0B,Spider ball rolling,pose_spiderRoll ,poseFunc_spiderRoll ,drawSamus_spider ,pose_morphBombed,pose_standing ,pose_morphHurt ,$80,$00,$10,$04,$20,$20, $25, $2B, $80,0,0,0,0 14 | $0C,Spider ball falling,pose_spiderFall ,poseFunc_spiderFall ,drawSamus_spider ,pose_morphBombed,pose_standing ,pose_morphHurt ,$80,$00,$10,$04,$20,$20, $25, $2B, $80,0,0,0,0 15 | $0D,Spider ball jumping,pose_spiderJump ,poseFunc_spiderJump ,drawSamus_spider ,pose_morphBombed,pose_standing ,pose_morphHurt ,$80,$00,$10,$04,$20,$20, $25, $2B, $80,0,0,0,0 16 | $0E,Spider ball,pose_spider ,poseFunc_spiderBall ,drawSamus_spider ,pose_morphBombed,pose_standing ,pose_morphHurt ,$80,$00,$10,$04,$20,$20, $25, $2B, $80,0,0,0,0 17 | $0F,Knockback,pose_hurt ,poseFunc_hurt ,drawSamus_knockback ,pose_bombed ,pose_fall ,pose_hurt ,$0F,$1F,$20,$EC,$10,$14, $18, $20, $28, $2A, $80,0,0 18 | $10,Morphball knockback,pose_morphHurt ,poseFunc_morphHurt ,drawSamus_morph ,pose_morphBombed,pose_morphFall ,pose_morphHurt ,$80,$00,$10,$04,$20,$20, $25, $2A, $80,0,0,0,0 19 | $11,Standing bombed,pose_bombed ,poseFunc_bombed ,drawSamus_knockback ,pose_bombed ,pose_fall ,pose_hurt ,$0F,$1F,$20,$EC,$10,$10, $18, $20, $28, $2A, $80,0,0 20 | $12,Morphball bombed,pose_morphBombed,poseFunc_morphBombed,drawSamus_morph ,pose_morphBombed,pose_morphFall ,pose_morphHurt ,$80,$00,$10,$04,$20,$20, $25, $2A, $80,0,0,0,0 21 | $13,Facing screen,pose_faceScreen ,poseFunc_faceScreen ,drawSamus_faceScreen,pose_bombed ,pose_standing ,pose_hurt ,$00,,,$EC,$08,$10, $18, $20, $28, $2A, $80,0,0 22 | $14,Unused,pose_unusedA ,poseFunc_faceScreen ,drawSamus_faceScreen,pose_standing ,pose_standing ,pose_standing ,$00,,,$04,$20,0,0,0,0,0,0,0,0 23 | $15,Unused,pose_unusedB ,poseFunc_faceScreen ,drawSamus_faceScreen,pose_standing ,pose_standing ,pose_standing ,$00,,,,$20,0,0,0,0,0,0,0,0 24 | $16,Unused,pose_unusedC ,poseFunc_faceScreen ,drawSamus_faceScreen,pose_standing ,pose_standing ,pose_standing ,$00,,,,,0,0,0,0,0,0,0,0 25 | $17,Unused,pose_unusedD ,poseFunc_faceScreen ,drawSamus_faceScreen,pose_standing ,pose_standing ,pose_standing ,$00,,,,,0,0,0,0,0,0,0,0 26 | $18,Being eaten by Metroid Queen,pose_beingEaten ,poseFunc_beingEaten ,drawSamus_morph ,pose_morphBombed,pose_beingEaten ,pose_morphHurt ,$00,,,,,$20, $25, $2A, $80,0,0,0,0 27 | $19,In Metroid Queen's mouth,pose_inMouth ,poseFunc_inMouth ,drawSamus_morph ,pose_morphBombed,pose_inMouth ,pose_morphHurt ,$80,,,,,$20, $25, $2A, $80,0,0,0,0 28 | $1A,Being swallowed by Metroid Queen,pose_toStomach ,poseFunc_toStomach ,drawSamus_morph ,pose_toStomach ,pose_toStomach ,pose_toStomach ,$00,,,,,$20, $25, $2A, $80,0,0,0,0 29 | $1B,In Metroid Queen's stomach,pose_inStomach ,poseFunc_inStomach ,drawSamus_morph ,pose_inStomach ,pose_inStomach ,pose_inStomach ,$80,,,,,$20, $25, $2A, $80,0,0,0,0 30 | $1C,Escaping Metroid Queen,pose_outStomach ,poseFunc_outStomach ,drawSamus_morph ,pose_outStomach ,pose_outStomach ,pose_outStomach ,$00,,,,,$20, $25, $2A, $80,0,0,0,0 31 | $1D,Escaped Metroid Queen,pose_exitQueen ,poseFunc_morphBombed,drawSamus_morph ,pose_exitQueen ,pose_morphFall ,pose_exitQueen ,$80,,,,,$20, $25, $2A, $80,0,0,0,0 32 | -------------------------------------------------------------------------------- /SRC/samus/samus_bgHitboxTop.asm: -------------------------------------------------------------------------------- 1 | ; This file was automatically generated from samus.csv. Please edit that file instead of this one. 2 | db $08 ; $00 - Standing 3 | db $14 ; $01 - Jumping 4 | db $1A ; $02 - Spin-jumping 5 | db $08 ; $03 - Running 6 | db $10 ; $04 - Crouching 7 | db $20 ; $05 - Morphball 8 | db $20 ; $06 - Morphball jumping 9 | db $10 ; $07 - Falling 10 | db $20 ; $08 - Morphball falling 11 | db $10 ; $09 - Starting to jump 12 | db $10 ; $0A - Starting to spin-jump 13 | db $20 ; $0B - Spider ball rolling 14 | db $20 ; $0C - Spider ball falling 15 | db $20 ; $0D - Spider ball jumping 16 | db $20 ; $0E - Spider ball 17 | db $10 ; $0F - Knockback 18 | db $20 ; $10 - Morphball knockback 19 | db $10 ; $11 - Standing bombed 20 | db $20 ; $12 - Morphball bombed 21 | db $08 ; $13 - Facing screen 22 | db $20 ; $14 - Unused 23 | db $20 ; $15 - Unused 24 | -------------------------------------------------------------------------------- /SRC/samus/samus_blockReformHeightTable.asm: -------------------------------------------------------------------------------- 1 | ; This file was automatically generated from samus.csv. Please edit that file instead of this one. 2 | db $20 ; $00 - Standing 3 | db $20 ; $01 - Jumping 4 | db $20 ; $02 - Spin-jumping 5 | db $20 ; $03 - Running 6 | db $20 ; $04 - Crouching 7 | db $10 ; $05 - Morphball 8 | db $10 ; $06 - Morphball jumping 9 | db $20 ; $07 - Falling 10 | db $10 ; $08 - Morphball falling 11 | db $20 ; $09 - Starting to jump 12 | db $20 ; $0A - Starting to spin-jump 13 | db $10 ; $0B - Spider ball rolling 14 | db $10 ; $0C - Spider ball falling 15 | db $10 ; $0D - Spider ball jumping 16 | db $10 ; $0E - Spider ball 17 | db $20 ; $0F - Knockback 18 | db $10 ; $10 - Morphball knockback 19 | db $20 ; $11 - Standing bombed 20 | db $10 ; $12 - Morphball bombed 21 | -------------------------------------------------------------------------------- /SRC/samus/samus_bombPoseTransitionTable.asm: -------------------------------------------------------------------------------- 1 | ; This file was automatically generated from samus.csv. Please edit that file instead of this one. 2 | db pose_bombed ; $00 - Standing 3 | db pose_bombed ; $01 - Jumping 4 | db pose_bombed ; $02 - Spin-jumping 5 | db pose_bombed ; $03 - Running 6 | db pose_bombed ; $04 - Crouching 7 | db pose_morphBombed ; $05 - Morphball 8 | db pose_morphBombed ; $06 - Morphball jumping 9 | db pose_bombed ; $07 - Falling 10 | db pose_morphBombed ; $08 - Morphball falling 11 | db pose_bombed ; $09 - Starting to jump 12 | db pose_bombed ; $0A - Starting to spin-jump 13 | db pose_morphBombed ; $0B - Spider ball rolling 14 | db pose_morphBombed ; $0C - Spider ball falling 15 | db pose_morphBombed ; $0D - Spider ball jumping 16 | db pose_morphBombed ; $0E - Spider ball 17 | db pose_bombed ; $0F - Knockback 18 | db pose_morphBombed ; $10 - Morphball knockback 19 | db pose_bombed ; $11 - Standing bombed 20 | db pose_morphBombed ; $12 - Morphball bombed 21 | db pose_bombed ; $13 - Facing screen 22 | db pose_standing ; $14 - Unused 23 | db pose_standing ; $15 - Unused 24 | db pose_standing ; $16 - Unused 25 | db pose_standing ; $17 - Unused 26 | db pose_morphBombed ; $18 - Being eaten by Metroid Queen 27 | db pose_morphBombed ; $19 - In Metroid Queen's mouth 28 | db pose_toStomach ; $1A - Being swallowed by Metroid Queen 29 | db pose_inStomach ; $1B - In Metroid Queen's stomach 30 | db pose_outStomach ; $1C - Escaping Metroid Queen 31 | db pose_exitQueen ; $1D - Escaped Metroid Queen 32 | -------------------------------------------------------------------------------- /SRC/samus/samus_bombedFallingPoseTransitionTable.asm: -------------------------------------------------------------------------------- 1 | ; This file was automatically generated from samus.csv. Please edit that file instead of this one. 2 | db pose_standing ; $00 - Standing 3 | db pose_standing ; $01 - Jumping 4 | db pose_standing ; $02 - Spin-jumping 5 | db pose_standing ; $03 - Running 6 | db pose_standing ; $04 - Crouching 7 | db pose_standing ; $05 - Morphball 8 | db pose_standing ; $06 - Morphball jumping 9 | db pose_standing ; $07 - Falling 10 | db pose_standing ; $08 - Morphball falling 11 | db pose_standing ; $09 - Starting to jump 12 | db pose_standing ; $0A - Starting to spin-jump 13 | db pose_standing ; $0B - Spider ball rolling 14 | db pose_standing ; $0C - Spider ball falling 15 | db pose_standing ; $0D - Spider ball jumping 16 | db pose_standing ; $0E - Spider ball 17 | db pose_fall ; $0F - Knockback 18 | db pose_morphFall ; $10 - Morphball knockback 19 | db pose_fall ; $11 - Standing bombed 20 | db pose_morphFall ; $12 - Morphball bombed 21 | db pose_standing ; $13 - Facing screen 22 | db pose_standing ; $14 - Unused 23 | db pose_standing ; $15 - Unused 24 | db pose_standing ; $16 - Unused 25 | db pose_standing ; $17 - Unused 26 | db pose_beingEaten ; $18 - Being eaten by Metroid Queen 27 | db pose_inMouth ; $19 - In Metroid Queen's mouth 28 | db pose_toStomach ; $1A - Being swallowed by Metroid Queen 29 | db pose_inStomach ; $1B - In Metroid Queen's stomach 30 | db pose_outStomach ; $1C - Escaping Metroid Queen 31 | db pose_morphFall ; $1D - Escaped Metroid Queen 32 | -------------------------------------------------------------------------------- /SRC/samus/samus_cannonYOffsetByPose.asm: -------------------------------------------------------------------------------- 1 | ; This file was automatically generated from samus.csv. Please edit that file instead of this one. 2 | db $17 ; $00 - Standing 3 | db $1F ; $01 - Jumping 4 | db $00 ; $02 - Spin-jumping 5 | db $14 ; $03 - Running 6 | db $21 ; $04 - Crouching 7 | db $00 ; $05 - Morphball 8 | db $00 ; $06 - Morphball jumping 9 | db $1D ; $07 - Falling 10 | db $00 ; $08 - Morphball falling 11 | db $15 ; $09 - Starting to jump 12 | db $15 ; $0A - Starting to spin-jump 13 | db $00 ; $0B - Spider ball rolling 14 | db $00 ; $0C - Spider ball falling 15 | db $00 ; $0D - Spider ball jumping 16 | db $00 ; $0E - Spider ball 17 | db $1F ; $0F - Knockback 18 | db $00 ; $10 - Morphball knockback 19 | db $1F ; $11 - Standing bombed 20 | db $00 ; $12 - Morphball bombed 21 | -------------------------------------------------------------------------------- /SRC/samus/samus_damagePoseTransitionTable.asm: -------------------------------------------------------------------------------- 1 | ; This file was automatically generated from samus.csv. Please edit that file instead of this one. 2 | db pose_hurt ; $00 - Standing 3 | db pose_hurt ; $01 - Jumping 4 | db pose_hurt ; $02 - Spin-jumping 5 | db pose_hurt ; $03 - Running 6 | db pose_hurt ; $04 - Crouching 7 | db pose_morphHurt ; $05 - Morphball 8 | db pose_morphHurt ; $06 - Morphball jumping 9 | db pose_hurt ; $07 - Falling 10 | db pose_morphHurt ; $08 - Morphball falling 11 | db pose_hurt ; $09 - Starting to jump 12 | db pose_hurt ; $0A - Starting to spin-jump 13 | db pose_morphHurt ; $0B - Spider ball rolling 14 | db pose_morphHurt ; $0C - Spider ball falling 15 | db pose_morphHurt ; $0D - Spider ball jumping 16 | db pose_morphHurt ; $0E - Spider ball 17 | db pose_hurt ; $0F - Knockback 18 | db pose_morphHurt ; $10 - Morphball knockback 19 | db pose_hurt ; $11 - Standing bombed 20 | db pose_morphHurt ; $12 - Morphball bombed 21 | db pose_hurt ; $13 - Facing screen 22 | db pose_standing ; $14 - Unused 23 | db pose_standing ; $15 - Unused 24 | db pose_standing ; $16 - Unused 25 | db pose_standing ; $17 - Unused 26 | db pose_morphHurt ; $18 - Being eaten by Metroid Queen 27 | db pose_morphHurt ; $19 - In Metroid Queen's mouth 28 | db pose_toStomach ; $1A - Being swallowed by Metroid Queen 29 | db pose_inStomach ; $1B - In Metroid Queen's stomach 30 | db pose_outStomach ; $1C - Escaping Metroid Queen 31 | db pose_exitQueen ; $1D - Escaped Metroid Queen 32 | -------------------------------------------------------------------------------- /SRC/samus/samus_drawJumpTable.asm: -------------------------------------------------------------------------------- 1 | ; This file was automatically generated from samus.csv. Please edit that file instead of this one. 2 | dw drawSamus_standing ; $00 - Standing 3 | dw drawSamus_jump ; $01 - Jumping 4 | dw drawSamus_spinJump ; $02 - Spin-jumping 5 | dw drawSamus_run ; $03 - Running 6 | dw drawSamus_crouch ; $04 - Crouching 7 | dw drawSamus_morph ; $05 - Morphball 8 | dw drawSamus_morph ; $06 - Morphball jumping 9 | dw drawSamus_jump ; $07 - Falling 10 | dw drawSamus_morph ; $08 - Morphball falling 11 | dw drawSamus_jumpStart ; $09 - Starting to jump 12 | dw drawSamus_jumpStart ; $0A - Starting to spin-jump 13 | dw drawSamus_spider ; $0B - Spider ball rolling 14 | dw drawSamus_spider ; $0C - Spider ball falling 15 | dw drawSamus_spider ; $0D - Spider ball jumping 16 | dw drawSamus_spider ; $0E - Spider ball 17 | dw drawSamus_knockback ; $0F - Knockback 18 | dw drawSamus_morph ; $10 - Morphball knockback 19 | dw drawSamus_knockback ; $11 - Standing bombed 20 | dw drawSamus_morph ; $12 - Morphball bombed 21 | dw drawSamus_faceScreen ; $13 - Facing screen 22 | dw drawSamus_faceScreen ; $14 - Unused 23 | dw drawSamus_faceScreen ; $15 - Unused 24 | dw drawSamus_faceScreen ; $16 - Unused 25 | dw drawSamus_faceScreen ; $17 - Unused 26 | dw drawSamus_morph ; $18 - Being eaten by Metroid Queen 27 | dw drawSamus_morph ; $19 - In Metroid Queen's mouth 28 | dw drawSamus_morph ; $1A - Being swallowed by Metroid Queen 29 | dw drawSamus_morph ; $1B - In Metroid Queen's stomach 30 | dw drawSamus_morph ; $1C - Escaping Metroid Queen 31 | dw drawSamus_morph ; $1D - Escaped Metroid Queen 32 | -------------------------------------------------------------------------------- /SRC/samus/samus_horizontalYOffsets.asm: -------------------------------------------------------------------------------- 1 | ; This file was automatically generated from samus.csv. Please edit that file instead of this one. 2 | db $10, $18, $20, $28, $2A, $80, 0, 0 ; $00 - Standing 3 | db $14, $18, $20, $28, $2A, $80, 0, 0 ; $01 - Jumping 4 | db $1A, $20, $28, $2A, $80, 0, 0, 0 ; $02 - Spin-jumping 5 | db $10, $18, $20, $28, $2A, $80, 0, 0 ; $03 - Running 6 | db $10, $18, $20, $28, $2A, $80, 0, 0 ; $04 - Crouching 7 | db $20, $25, $2A, $80, 0, 0, 0, 0 ; $05 - Morphball 8 | db $20, $25, $2A, $80, 0, 0, 0, 0 ; $06 - Morphball jumping 9 | db $10, $18, $20, $28, $2A, $80, 0, 0 ; $07 - Falling 10 | db $20, $25, $2A, $80, 0, 0, 0, 0 ; $08 - Morphball falling 11 | db $10, $18, $20, $28, $2A, $80, 0, 0 ; $09 - Starting to jump 12 | db $10, $18, $20, $28, $2A, $80, 0, 0 ; $0A - Starting to spin-jump 13 | db $20, $25, $2B, $80, 0, 0, 0, 0 ; $0B - Spider ball rolling 14 | db $20, $25, $2B, $80, 0, 0, 0, 0 ; $0C - Spider ball falling 15 | db $20, $25, $2B, $80, 0, 0, 0, 0 ; $0D - Spider ball jumping 16 | db $20, $25, $2B, $80, 0, 0, 0, 0 ; $0E - Spider ball 17 | db $14, $18, $20, $28, $2A, $80, 0, 0 ; $0F - Knockback 18 | db $20, $25, $2A, $80, 0, 0, 0, 0 ; $10 - Morphball knockback 19 | db $10, $18, $20, $28, $2A, $80, 0, 0 ; $11 - Standing bombed 20 | db $20, $25, $2A, $80, 0, 0, 0, 0 ; $12 - Morphball bombed 21 | db $10, $18, $20, $28, $2A, $80, 0, 0 ; $13 - Facing screen 22 | db 0, 0, 0, 0, 0, 0, 0, 0 ; $14 - Unused 23 | db 0, 0, 0, 0, 0, 0, 0, 0 ; $15 - Unused 24 | db 0, 0, 0, 0, 0, 0, 0, 0 ; $16 - Unused 25 | db 0, 0, 0, 0, 0, 0, 0, 0 ; $17 - Unused 26 | db $20, $25, $2A, $80, 0, 0, 0, 0 ; $18 - Being eaten by Metroid Queen 27 | db $20, $25, $2A, $80, 0, 0, 0, 0 ; $19 - In Metroid Queen's mouth 28 | db $20, $25, $2A, $80, 0, 0, 0, 0 ; $1A - Being swallowed by Metroid Queen 29 | db $20, $25, $2A, $80, 0, 0, 0, 0 ; $1B - In Metroid Queen's stomach 30 | db $20, $25, $2A, $80, 0, 0, 0, 0 ; $1C - Escaping Metroid Queen 31 | db $20, $25, $2A, $80, 0, 0, 0, 0 ; $1D - Escaped Metroid Queen 32 | -------------------------------------------------------------------------------- /SRC/samus/samus_poseConstants.asm: -------------------------------------------------------------------------------- 1 | ; This file was automatically generated from samus.csv. Please edit that file instead of this one. 2 | def pose_standing = $00 ; Standing 3 | def pose_jump = $01 ; Jumping 4 | def pose_spinJump = $02 ; Spin-jumping 5 | def pose_run = $03 ; Running 6 | def pose_crouch = $04 ; Crouching 7 | def pose_morph = $05 ; Morphball 8 | def pose_morphJump = $06 ; Morphball jumping 9 | def pose_fall = $07 ; Falling 10 | def pose_morphFall = $08 ; Morphball falling 11 | def pose_nJumpStart = $09 ; Starting to jump 12 | def pose_spinStart = $0A ; Starting to spin-jump 13 | def pose_spiderRoll = $0B ; Spider ball rolling 14 | def pose_spiderFall = $0C ; Spider ball falling 15 | def pose_spiderJump = $0D ; Spider ball jumping 16 | def pose_spider = $0E ; Spider ball 17 | def pose_hurt = $0F ; Knockback 18 | def pose_morphHurt = $10 ; Morphball knockback 19 | def pose_bombed = $11 ; Standing bombed 20 | def pose_morphBombed = $12 ; Morphball bombed 21 | def pose_faceScreen = $13 ; Facing screen 22 | def pose_unusedA = $14 ; Unused 23 | def pose_unusedB = $15 ; Unused 24 | def pose_unusedC = $16 ; Unused 25 | def pose_unusedD = $17 ; Unused 26 | def pose_beingEaten = $18 ; Being eaten by Metroid Queen 27 | def pose_inMouth = $19 ; In Metroid Queen's mouth 28 | def pose_toStomach = $1A ; Being swallowed by Metroid Queen 29 | def pose_inStomach = $1B ; In Metroid Queen's stomach 30 | def pose_outStomach = $1C ; Escaping Metroid Queen 31 | def pose_exitQueen = $1D ; Escaped Metroid Queen 32 | -------------------------------------------------------------------------------- /SRC/samus/samus_poseJumpTable.asm: -------------------------------------------------------------------------------- 1 | ; This file was automatically generated from samus.csv. Please edit that file instead of this one. 2 | dw poseFunc_standing ; $00 - Standing 3 | dw poseFunc_jump ; $01 - Jumping 4 | dw poseFunc_spinJump ; $02 - Spin-jumping 5 | dw poseFunc_running ; $03 - Running 6 | dw poseFunc_crouch ; $04 - Crouching 7 | dw poseFunc_morphBall ; $05 - Morphball 8 | dw poseFunc_morphJump ; $06 - Morphball jumping 9 | dw poseFunc_fall ; $07 - Falling 10 | dw poseFunc_morphFall ; $08 - Morphball falling 11 | dw poseFunc_jumpStart ; $09 - Starting to jump 12 | dw poseFunc_jumpStart ; $0A - Starting to spin-jump 13 | dw poseFunc_spiderRoll ; $0B - Spider ball rolling 14 | dw poseFunc_spiderFall ; $0C - Spider ball falling 15 | dw poseFunc_spiderJump ; $0D - Spider ball jumping 16 | dw poseFunc_spiderBall ; $0E - Spider ball 17 | dw poseFunc_hurt ; $0F - Knockback 18 | dw poseFunc_morphHurt ; $10 - Morphball knockback 19 | dw poseFunc_bombed ; $11 - Standing bombed 20 | dw poseFunc_morphBombed ; $12 - Morphball bombed 21 | dw poseFunc_faceScreen ; $13 - Facing screen 22 | dw poseFunc_faceScreen ; $14 - Unused 23 | dw poseFunc_faceScreen ; $15 - Unused 24 | dw poseFunc_faceScreen ; $16 - Unused 25 | dw poseFunc_faceScreen ; $17 - Unused 26 | dw poseFunc_beingEaten ; $18 - Being eaten by Metroid Queen 27 | dw poseFunc_inMouth ; $19 - In Metroid Queen's mouth 28 | dw poseFunc_toStomach ; $1A - Being swallowed by Metroid Queen 29 | dw poseFunc_inStomach ; $1B - In Metroid Queen's stomach 30 | dw poseFunc_outStomach ; $1C - Escaping Metroid Queen 31 | dw poseFunc_morphBombed ; $1D - Escaped Metroid Queen 32 | -------------------------------------------------------------------------------- /SRC/samus/samus_possibleShotDirections.asm: -------------------------------------------------------------------------------- 1 | ; This file was automatically generated from samus.csv. Please edit that file instead of this one. 2 | db $07 ; $00 - Standing 3 | db $0F ; $01 - Jumping 4 | db $00 ; $02 - Spin-jumping 5 | db $07 ; $03 - Running 6 | db $03 ; $04 - Crouching 7 | db $80 ; $05 - Morphball 8 | db $80 ; $06 - Morphball jumping 9 | db $0F ; $07 - Falling 10 | db $80 ; $08 - Morphball falling 11 | db $0F ; $09 - Starting to jump 12 | db $0F ; $0A - Starting to spin-jump 13 | db $80 ; $0B - Spider ball rolling 14 | db $80 ; $0C - Spider ball falling 15 | db $80 ; $0D - Spider ball jumping 16 | db $80 ; $0E - Spider ball 17 | db $0F ; $0F - Knockback 18 | db $80 ; $10 - Morphball knockback 19 | db $0F ; $11 - Standing bombed 20 | db $80 ; $12 - Morphball bombed 21 | db $00 ; $13 - Facing screen 22 | db $00 ; $14 - Unused 23 | db $00 ; $15 - Unused 24 | db $00 ; $16 - Unused 25 | db $00 ; $17 - Unused 26 | db $00 ; $18 - Being eaten by Metroid Queen 27 | db $80 ; $19 - In Metroid Queen's mouth 28 | db $00 ; $1A - Being swallowed by Metroid Queen 29 | db $80 ; $1B - In Metroid Queen's stomach 30 | db $00 ; $1C - Escaping Metroid Queen 31 | db $80 ; $1D - Escaped Metroid Queen 32 | -------------------------------------------------------------------------------- /SRC/samus/samus_spriteHitboxTopTable.asm: -------------------------------------------------------------------------------- 1 | ; This file was automatically generated from samus.csv. Please edit that file instead of this one. 2 | db $EC ; $00 - Standing 3 | db $F4 ; $01 - Jumping 4 | db $FC ; $02 - Spin-jumping 5 | db $EC ; $03 - Running 6 | db $F6 ; $04 - Crouching 7 | db $04 ; $05 - Morphball 8 | db $04 ; $06 - Morphball jumping 9 | db $EC ; $07 - Falling 10 | db $04 ; $08 - Morphball falling 11 | db $EC ; $09 - Starting to jump 12 | db $EC ; $0A - Starting to spin-jump 13 | db $04 ; $0B - Spider ball rolling 14 | db $04 ; $0C - Spider ball falling 15 | db $04 ; $0D - Spider ball jumping 16 | db $04 ; $0E - Spider ball 17 | db $EC ; $0F - Knockback 18 | db $04 ; $10 - Morphball knockback 19 | db $EC ; $11 - Standing bombed 20 | db $04 ; $12 - Morphball bombed 21 | db $EC ; $13 - Facing screen 22 | db $04 ; $14 - Unused 23 | -------------------------------------------------------------------------------- /SRC/tilesets/caveFirst.chr: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alex-west/M2RoS/946d74e8f8b6bef9d82339ac6b038d23c79495e5/SRC/tilesets/caveFirst.chr -------------------------------------------------------------------------------- /SRC/tilesets/caveFirst_collision.asm: -------------------------------------------------------------------------------- 1 | ; collision_caveFirst 2 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 3 | db $80, $80, $80, $80, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 4 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $01, $01, $01, $01 5 | db $01, $01, $01, $01, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 6 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 7 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $04, $04, $04, $04, $00, $01, $01 8 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $01, $00, $00 9 | db $00, $00, $00, $00, $01, $01, $01, $01, $00, $00, $00, $00, $00, $00, $00, $00 10 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 11 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 12 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 13 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 14 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 15 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 16 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 17 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 18 | -------------------------------------------------------------------------------- /SRC/tilesets/caveFirst_metatiles.asm: -------------------------------------------------------------------------------- 1 | ; metatiles_caveFirst 2 | db $00, $01, $02, $03, $04, $05, $06, $07, $08, $09, $0a, $0b, $ff, $ff, $78, $79 3 | db $ff, $ff, $7a, $7b, $61, $74, $5d, $5e, $75, $62, $5f, $60, $28, $29, $29, $28 4 | db $ff, $ff, $ff, $ff, $18, $19, $1a, $1b, $63, $64, $65, $66, $0c, $0d, $0f, $0e 5 | db $34, $35, $38, $39, $36, $37, $3a, $3b, $3c, $3d, $40, $41, $3e, $3f, $42, $43 6 | db $0c, $0d, $0e, $0f, $ff, $ff, $6c, $6c, $6c, $6c, $6d, $6d, $6d, $6d, $6d, $6d 7 | db $30, $33, $29, $2c, $6d, $6d, $30, $33, $6d, $6d, $32, $31, $32, $31, $2d, $28 8 | db $28, $29, $29, $2a, $28, $29, $2b, $28, $28, $2a, $29, $2e, $2b, $29, $2f, $28 9 | db $28, $2e, $29, $2e, $2f, $29, $2f, $28, $28, $2c, $29, $28, $2d, $29, $29, $28 10 | db $30, $31, $29, $28, $30, $33, $29, $2e, $32, $31, $2f, $28, $7f, $7e, $7d, $7c 11 | db $7f, $7e, $7d, $0c, $7f, $7e, $0d, $7c, $7f, $0e, $7d, $7c, $0f, $7e, $7d, $7c 12 | db $ff, $7e, $7d, $7c, $7f, $ff, $7d, $7c, $7f, $7e, $ff, $7c, $7f, $7e, $7d, $ff 13 | db $ff, $7e, $ff, $7c, $7f, $ff, $7d, $ff, $ff, $ff, $7d, $7c, $7f, $7e, $ff, $ff 14 | db $61, $74, $5d, $76, $75, $62, $77, $60, $6e, $6f, $6f, $6e, $70, $71, $72, $73 15 | db $28, $29, $ff, $ff, $ff, $ff, $29, $28, $28, $ff, $29, $ff, $ff, $29, $ff, $28 16 | db $ff, $ff, $ff, $0c, $ff, $ff, $0d, $ff, $ff, $0e, $ff, $ff, $0f, $ff, $ff, $ff 17 | db $20, $21, $22, $23, $6d, $6d, $30, $31, $1c, $1d, $1e, $1f, $67, $67, $67, $67 18 | db $17, $58, $4e, $4f, $58, $17, $ff, $58, $17, $4f, $4f, $ff, $59, $5a, $ff, $ff 19 | db $5b, $5c, $ff, $ff, $ff, $ff, $10, $11, $12, $13, $14, $15, $14, $15, $14, $15 20 | db $44, $47, $48, $4b, $44, $45, $48, $49, $46, $45, $4a, $49, $46, $47, $4a, $4b 21 | db $4c, $4d, $4c, $4d, $4e, $4f, $ff, $ff, $68, $69, $68, $69, $6a, $6b, $6a, $6b 22 | db $24, $25, $27, $26, $26, $27, $25, $24, $26, $27, $ff, $24, $24, $25, $25, $ff 23 | db $26, $27, $16, $24, $24, $25, $25, $16, $24, $25, $ff, $ff, $26, $27, $ff, $ff 24 | db $16, $ff, $ff, $ff, $ff, $16, $ff, $ff, $50, $56, $51, $57, $56, $50, $57, $51 25 | db $52, $53, $54, $55, $54, $55, $52, $53, $28, $29, $59, $5a, $28, $29, $5b, $5c 26 | db $54, $55, $54, $55, $56, $56, $57, $57, $52, $53, $1c, $1d, $1e, $1f, $52, $53 27 | db $1e, $1f, $1c, $1d, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff 28 | db $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff 29 | db $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff 30 | db $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff 31 | db $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff 32 | db $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff 33 | db $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff 34 | -------------------------------------------------------------------------------- /SRC/tilesets/finalLab.chr: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alex-west/M2RoS/946d74e8f8b6bef9d82339ac6b038d23c79495e5/SRC/tilesets/finalLab.chr -------------------------------------------------------------------------------- /SRC/tilesets/finalLab_collision.asm: -------------------------------------------------------------------------------- 1 | ; collision_finalLab 2 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 3 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 4 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 5 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $08, $00, $00, $00, $00, $00 6 | db $00, $00, $08, $08, $04, $04, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 7 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 8 | db $00, $00, $00, $00, $00, $00, $04, $04, $04, $04, $00, $08, $00, $00, $00, $00 9 | db $00, $00, $00, $00, $04, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 10 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 11 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 12 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 13 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 14 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 15 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 16 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 17 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 18 | -------------------------------------------------------------------------------- /SRC/tilesets/finalLab_metatiles.asm: -------------------------------------------------------------------------------- 1 | ; metatiles_finalLab 2 | db $00, $01, $02, $03, $04, $05, $06, $07, $08, $09, $0a, $0b, $58, $59, $5a, $5b 3 | db $5c, $5d, $5e, $5f, $6c, $6d, $6e, $6f, $6a, $6a, $6a, $6a, $0c, $0f, $0c, $0f 4 | db $ff, $ff, $ff, $ff, $52, $53, $ff, $ff, $0c, $0d, $ff, $ff, $0e, $0d, $ff, $ff 5 | db $0e, $0f, $ff, $ff, $6a, $6a, $ff, $ff, $ff, $6a, $ff, $ff, $6a, $ff, $ff, $ff 6 | db $ff, $ff, $ff, $76, $ff, $ff, $77, $ff, $10, $11, $14, $15, $12, $13, $16, $17 7 | db $18, $19, $1c, $1d, $1a, $1b, $1e, $1f, $ff, $ff, $20, $21, $ff, $ff, $7b, $ff 8 | db $22, $23, $27, $28, $24, $25, $29, $2a, $26, $ff, $2b, $2c, $ff, $ff, $79, $7a 9 | db $36, $37, $1c, $1d, $38, $ff, $1e, $1f, $26, $ff, $2b, $7d, $ff, $ff, $75, $75 10 | db $ff, $ff, $7d, $75, $ff, $ff, $75, $7d, $ff, $ff, $2d, $78, $2e, $2f, $32, $33 11 | db $30, $31, $34, $35, $3b, $3b, $3b, $3c, $3b, $3b, $3c, $3c, $3b, $3c, $3c, $3c 12 | db $48, $49, $4c, $4d, $4a, $4b, $4e, $4f, $70, $49, $72, $4d, $4a, $71, $4e, $73 13 | db $ff, $7c, $7c, $ff, $7c, $ff, $7c, $ff, $ff, $7c, $ff, $7c, $7c, $7c, $ff, $7c 14 | db $56, $60, $57, $61, $60, $60, $61, $61, $60, $56, $61, $57, $54, $55, $40, $41 15 | db $42, $42, $43, $43, $74, $74, $74, $74, $46, $47, $54, $55, $46, $47, $40, $41 16 | db $44, $ff, $74, $45, $ff, $45, $44, $74, $ff, $ff, $3a, $3a, $6b, $6b, $74, $74 17 | db $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $0c, $0f, $ff, $ff, $7c, $7c, $7c, $7c 18 | db $50, $51, $52, $53, $51, $52, $ff, $51, $50, $53, $53, $ff, $3d, $3e, $7f, $3e 19 | db $3e, $3e, $3e, $3e, $3e, $3f, $3e, $7e, $62, $63, $5a, $5b, $5c, $5d, $64, $65 20 | db $0c, $0d, $0c, $0f, $0e, $0f, $0c, $0d, $0c, $0d, $0e, $0f, $0e, $0f, $0c, $0f 21 | db $6a, $6a, $ff, $6a, $6a, $6a, $6a, $ff, $ff, $6a, $6a, $6a, $6a, $ff, $6a, $6a 22 | db $ff, $6a, $ff, $6a, $6a, $ff, $6a, $ff, $ff, $70, $ff, $72, $71, $ff, $73, $ff 23 | db $ff, $ff, $62, $63, $64, $65, $ff, $ff, $ff, $ff, $39, $21, $3a, $3a, $6b, $6b 24 | db $66, $67, $ff, $ff, $68, $69, $ff, $ff, $50, $51, $66, $67, $50, $51, $68, $69 25 | db $74, $74, $42, $42, $43, $43, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff 26 | db $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff 27 | db $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff 28 | db $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff 29 | db $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff 30 | db $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff 31 | db $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff 32 | db $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff 33 | db $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff 34 | -------------------------------------------------------------------------------- /SRC/tilesets/lavaCavesA.chr: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alex-west/M2RoS/946d74e8f8b6bef9d82339ac6b038d23c79495e5/SRC/tilesets/lavaCavesA.chr -------------------------------------------------------------------------------- /SRC/tilesets/lavaCavesB.chr: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alex-west/M2RoS/946d74e8f8b6bef9d82339ac6b038d23c79495e5/SRC/tilesets/lavaCavesB.chr -------------------------------------------------------------------------------- /SRC/tilesets/lavaCavesC.chr: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alex-west/M2RoS/946d74e8f8b6bef9d82339ac6b038d23c79495e5/SRC/tilesets/lavaCavesC.chr -------------------------------------------------------------------------------- /SRC/tilesets/lavaCavesEmpty_metatiles.asm: -------------------------------------------------------------------------------- 1 | ; metatiles_lavaCavesEmpty 2 | db $00, $01, $02, $03, $04, $05, $06, $07, $08, $09, $0A, $0B, $47, $47, $3A, $3A 3 | db $20, $21, $22, $23, $20, $21, $22, $23, $20, $21, $22, $23, $20, $21, $26, $27 4 | db $24, $25, $26, $27, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF 5 | db $FF, $FF, $46, $46, $46, $46, $46, $46, $32, $33, $33, $32, $32, $33, $33, $32 6 | db $32, $33, $37, $36, $36, $37, $37, $36, $32, $35, $35, $FF, $36, $39, $39, $46 7 | db $34, $33, $FF, $34, $38, $37, $46, $38, $47, $47, $3A, $3A, $48, $48, $3B, $3B 8 | db $3C, $3C, $49, $49, $3C, $3C, $49, $49, $3D, $3D, $4A, $4A, $FF, $30, $FF, $FF 9 | db $30, $FF, $FF, $FF, $FF, $30, $FF, $FF, $30, $FF, $FF, $FF, $46, $31, $46, $46 10 | db $31, $46, $46, $46, $28, $29, $2A, $2B, $28, $29, $2A, $2B, $28, $29, $2A, $2B 11 | db $28, $29, $2E, $2F, $2C, $2D, $2E, $2F, $20, $29, $22, $2B, $20, $29, $22, $2B 12 | db $20, $29, $22, $2B, $20, $29, $26, $2F, $24, $2D, $26, $2F, $28, $21, $2A, $23 13 | db $28, $21, $2A, $23, $28, $21, $2A, $23, $28, $21, $2E, $27, $2C, $25, $2E, $27 14 | db $FF, $FF, $4B, $4C, $FF, $FF, $4D, $4E, $10, $42, $14, $15, $43, $13, $16, $17 15 | db $FF, $FF, $4B, $4C, $FF, $FF, $4D, $4E, $10, $42, $14, $15, $43, $13, $16, $17 16 | db $FF, $FF, $4B, $4C, $FF, $FF, $4D, $4E, $10, $42, $14, $15, $43, $13, $16, $17 17 | db $0C, $0D, $0E, $0F, $32, $33, $33, $32, $32, $35, $35, $FF, $34, $33, $FF, $34 18 | db $3E, $3F, $40, $41, $3E, $3F, $40, $41, $3E, $3F, $40, $41, $3E, $3F, $19, $1A 19 | db $11, $12, $19, $1A 20 | -------------------------------------------------------------------------------- /SRC/tilesets/lavaCavesFull_metatiles.asm: -------------------------------------------------------------------------------- 1 | ; metatiles_lavaCavesFull 2 | db $00, $01, $02, $03, $04, $05, $06, $07, $08, $09, $0A, $0B, $48, $48, $3B, $3B 3 | db $24, $25, $26, $27, $24, $25, $26, $27, $24, $25, $26, $27, $24, $25, $26, $27 4 | db $24, $25, $26, $27, $46, $46, $46, $46, $46, $46, $46, $46, $46, $46, $46, $46 5 | db $46, $46, $46, $46, $46, $46, $46, $46, $36, $37, $37, $36, $36, $37, $37, $36 6 | db $36, $37, $37, $36, $36, $37, $37, $36, $36, $39, $39, $46, $36, $39, $39, $46 7 | db $38, $37, $46, $38, $38, $37, $46, $38, $48, $48, $3B, $3B, $48, $48, $3B, $3B 8 | db $3D, $3D, $4A, $4A, $3D, $3D, $4A, $4A, $3D, $3D, $4A, $4A, $46, $31, $46, $46 9 | db $31, $46, $46, $46, $46, $31, $46, $46, $31, $46, $46, $46, $46, $31, $46, $46 10 | db $31, $46, $46, $46, $2C, $2D, $2E, $2F, $2C, $2D, $2E, $2F, $2C, $2D, $2E, $2F 11 | db $2C, $2D, $2E, $2F, $2C, $2D, $2E, $2F, $24, $2D, $26, $2F, $24, $2D, $26, $2F 12 | db $24, $2D, $26, $2F, $24, $2D, $26, $2F, $24, $2D, $26, $2F, $2C, $25, $2E, $27 13 | db $2C, $25, $2E, $27, $2C, $25, $2E, $27, $2C, $25, $2E, $27, $2C, $25, $2E, $27 14 | db $46, $46, $4F, $50, $46, $46, $51, $52, $18, $44, $1C, $1D, $45, $1B, $1E, $1F 15 | db $46, $46, $4F, $50, $46, $46, $51, $52, $18, $44, $1C, $1D, $45, $1B, $1E, $1F 16 | db $46, $46, $4F, $50, $46, $46, $51, $52, $18, $44, $1C, $1D, $45, $1B, $1E, $1F 17 | db $0C, $0D, $0E, $0F, $36, $37, $37, $36, $36, $39, $39, $46, $38, $37, $46, $38 18 | db $11, $12, $19, $1A, $11, $12, $19, $1A, $11, $12, $19, $1A, $11, $12, $19, $1A 19 | db $11, $12, $19, $1A -------------------------------------------------------------------------------- /SRC/tilesets/lavaCavesMid_metatiles.asm: -------------------------------------------------------------------------------- 1 | ; metatiles_lavaCavesMid 2 | db $00, $01, $02, $03, $04, $05, $06, $07, $08, $09, $0a, $0b, $47, $47, $3a, $3a 3 | db $20, $21, $22, $23, $20, $21, $26, $27, $24, $25, $26, $27, $24, $25, $26, $27 4 | db $24, $25, $26, $27, $ff, $ff, $ff, $ff, $ff, $ff, $46, $46, $46, $46, $46, $46 5 | db $46, $46, $46, $46, $46, $46, $46, $46, $32, $33, $37, $36, $36, $37, $37, $36 6 | db $36, $37, $37, $36, $36, $37, $37, $36, $36, $39, $39, $46, $36, $39, $39, $46 7 | db $38, $37, $46, $38, $38, $37, $46, $38, $48, $48, $3b, $3b, $48, $48, $3b, $3b 8 | db $3c, $3c, $49, $49, $3d, $3d, $4a, $4a, $3d, $3d, $4a, $4a, $ff, $30, $ff, $ff 9 | db $30, $ff, $ff, $ff, $46, $31, $46, $46, $31, $46, $46, $46, $46, $31, $46, $46 10 | db $31, $46, $46, $46, $28, $29, $2a, $2b, $28, $29, $2e, $2f, $2c, $2d, $2e, $2f 11 | db $2c, $2d, $2e, $2f, $2c, $2d, $2e, $2f, $20, $29, $22, $2b, $20, $29, $26, $2f 12 | db $24, $2d, $26, $2f, $24, $2d, $26, $2f, $24, $2d, $26, $2f, $28, $21, $2a, $23 13 | db $28, $21, $2e, $27, $2c, $25, $2e, $27, $2c, $25, $2e, $27, $2c, $25, $2e, $27 14 | db $ff, $ff, $4b, $4c, $ff, $ff, $4d, $4e, $10, $42, $14, $15, $43, $13, $16, $17 15 | db $ff, $ff, $4b, $4c, $ff, $ff, $4d, $4e, $10, $42, $1c, $1d, $43, $13, $1e, $1f 16 | db $46, $46, $4f, $50, $46, $46, $51, $52, $18, $44, $1c, $1d, $45, $1b, $1e, $1f 17 | db $0c, $0d, $0e, $0f, $32, $33, $33, $32, $32, $35, $35, $ff, $34, $33, $ff, $34 18 | db $3e, $3f, $40, $41, $3e, $3f, $19, $1a, $11, $12, $19, $1a, $11, $12, $19, $1a 19 | db $11, $12, $19, $1a 20 | -------------------------------------------------------------------------------- /SRC/tilesets/lavaCaves_collision.asm: -------------------------------------------------------------------------------- 1 | ; collision_lavaCaves 2 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $80, $80, $80, $80 3 | db $00, $10, $10, $00, $00, $01, $01, $00, $10, $10, $10, $10, $10, $11, $11, $10 4 | db $00, $00, $00, $00, $10, $10, $10, $10, $00, $00, $00, $00, $10, $10, $10, $10 5 | db $00, $10, $00, $00, $00, $00, $10, $10, $10, $10, $0a, $0a, $0c, $0c, $00, $00 6 | db $00, $00, $01, $01, $01, $01, $10, $00, $10, $00, $10, $00, $00, $00, $00, $10 7 | db $10, $10, $10, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 8 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 9 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 10 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 11 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 12 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 13 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 14 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 15 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 16 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 17 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 18 | -------------------------------------------------------------------------------- /SRC/tilesets/plantBubbles.chr: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alex-west/M2RoS/946d74e8f8b6bef9d82339ac6b038d23c79495e5/SRC/tilesets/plantBubbles.chr -------------------------------------------------------------------------------- /SRC/tilesets/plantBubbles_collision.asm: -------------------------------------------------------------------------------- 1 | ; collision_plantBubbles 2 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $80, $80, $80, $80 3 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $6a, $6a, $6a, $6a 4 | db $00, $00, $00, $00, $00, $00, $6a, $6a, $6a, $6a, $00, $00, $00, $00, $00, $00 5 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 6 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $6a, $6a, $6a, $6a 7 | db $6c, $6c, $6c, $6c, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 8 | db $00, $68, $68, $00, $00, $00, $00, $01, $01, $60, $60, $60, $60, $60, $00, $00 9 | db $01, $01, $01, $01, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 10 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 11 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 12 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 13 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 14 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 15 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 16 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 17 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 18 | -------------------------------------------------------------------------------- /SRC/tilesets/plantBubbles_metatiles.asm: -------------------------------------------------------------------------------- 1 | ; metatiles_plantBubbles 2 | db $00, $01, $02, $03, $04, $05, $06, $07, $08, $09, $0a, $0b, $ff, $ff, $74, $75 3 | db $ff, $ff, $76, $77, $65, $70, $63, $67, $71, $66, $68, $64, $16, $17, $18, $19 4 | db $ff, $ff, $ff, $ff, $58, $5b, $5c, $5f, $1a, $1a, $60, $60, $60, $60, $60, $60 5 | db $79, $7b, $79, $7b, $ff, $7a, $78, $7b, $79, $79, $79, $79, $7b, $79, $7b, $79 6 | db $38, $39, $3a, $3b, $6e, $6e, $6f, $6f, $6f, $6f, $6f, $6f, $ff, $ff, $6e, $6e 7 | db $78, $ff, $79, $78, $ff, $78, $78, $79, $78, $78, $79, $79, $7a, $ff, $7b, $78 8 | db $65, $70, $63, $72, $71, $66, $73, $64, $58, $5b, $5c, $5f, $26, $27, $28, $29 9 | db $2a, $2b, $2c, $2d, $2c, $2d, $2c, $2d, $34, $35, $36, $37, $30, $31, $32, $33 10 | db $2e, $2e, $2f, $2f, $1c, $1d, $1e, $1f, $2c, $2d, $20, $21, $50, $51, $52, $53 11 | db $54, $55, $54, $55, $56, $57, $56, $57, $54, $55, $56, $57, $56, $57, $54, $55 12 | db $58, $59, $5c, $5d, $5a, $5b, $5e, $5f, $5a, $59, $5e, $5d, $58, $5b, $5c, $5f 13 | db $69, $69, $69, $69, $3c, $3d, $3e, $3f, $ff, $ff, $2a, $2b, $20, $21, $ff, $ff 14 | db $ff, $ff, $46, $47, $48, $49, $4a, $4b, $4c, $4d, $4e, $4f, $42, $43, $44, $45 15 | db $ff, $69, $69, $69, $69, $ff, $69, $69, $69, $69, $ff, $69, $69, $69, $69, $ff 16 | db $25, $ff, $ff, $ff, $ff, $25, $ff, $ff, $ff, $ff, $25, $ff, $ff, $ff, $ff, $25 17 | db $22, $23, $ff, $ff, $22, $24, $ff, $ff, $24, $23, $ff, $ff, $24, $24, $ff, $ff 18 | db $22, $24, $22, $23, $24, $23, $22, $24, $22, $24, $24, $23, $24, $23, $22, $23 19 | db $22, $23, $22, $23, $10, $11, $12, $13, $13, $11, $11, $13, $10, $11, $3a, $3b 20 | db $ff, $ff, $22, $23, $ff, $ff, $22, $24, $ff, $ff, $24, $23, $ff, $ff, $24, $24 21 | db $ff, $ff, $ff, $22, $ff, $ff, $23, $ff, $24, $24, $2a, $2b, $40, $41, $41, $40 22 | db $69, $69, $ff, $ff, $ff, $ff, $69, $69, $ff, $69, $ff, $69, $69, $ff, $69, $ff 23 | db $ff, $79, $ff, $79, $79, $ff, $79, $ff, $ff, $78, $ff, $79, $ff, $ff, $78, $ff 24 | db $6a, $ff, $61, $ff, $61, $ff, $6b, $ff, $61, $ff, $61, $ff, $ff, $6c, $ff, $62 25 | db $ff, $62, $ff, $6d, $ff, $62, $ff, $62, $ff, $79, $78, $79, $79, $ff, $79, $78 26 | db $ff, $ff, $0c, $0d, $0e, $0f, $14, $15, $14, $15, $14, $15, $25, $79, $ff, $79 27 | db $79, $25, $79, $ff, $25, $79, $79, $79, $79, $25, $79, $79, $ff, $ff, $ff, $ff 28 | db $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff 29 | db $7c, $7d, $7e, $7f, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff 30 | db $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff 31 | db $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff 32 | db $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff 33 | db $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff 34 | -------------------------------------------------------------------------------- /SRC/tilesets/queenBG.chr: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alex-west/M2RoS/946d74e8f8b6bef9d82339ac6b038d23c79495e5/SRC/tilesets/queenBG.chr -------------------------------------------------------------------------------- /SRC/tilesets/queen_collision.asm: -------------------------------------------------------------------------------- 1 | ; collision_queen 2 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 3 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 4 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 5 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 6 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 7 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $04, $00, $00, $00, $00 8 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 9 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 10 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 11 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 12 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 13 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $04, $00, $00, $00, $00 14 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 15 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 16 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 17 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 18 | -------------------------------------------------------------------------------- /SRC/tilesets/queen_metatiles.asm: -------------------------------------------------------------------------------- 1 | ; metatiles_queen 2 | db $ff, $ff, $ff, $ff, $57, $58, $ff, $0b, $57, $58, $0c, $0d, $ff, $ff, $14, $15 3 | db $06, $07, $16, $17, $08, $09, $18, $19, $0a, $ff, $1a, $ff, $20, $21, $30, $31 4 | db $22, $23, $32, $33, $24, $25, $34, $35, $26, $27, $36, $37, $28, $29, $38, $39 5 | db $2a, $ff, $3a, $ff, $40, $41, $50, $51, $42, $43, $52, $53, $44, $45, $54, $55 6 | db $46, $47, $56, $13, $48, $49, $fe, $f9, $4a, $ff, $f4, $ff, $ff, $ff, $af, $9e 7 | db $ff, $ff, $af, $9f, $ff, $ff, $9e, $af, $ff, $ff, $af, $ff, $ff, $ff, $ff, $9e 8 | db $ff, $ff, $af, $af, $ff, $b0, $ff, $b0, $ff, $b0, $ff, $e9, $ff, $e9, $ff, $e9 9 | db $57, $58, $59, $5a, $57, $58, $ff, $ff, $b0, $b0, $b0, $b0, $b0, $b0, $5b, $b0 10 | db $b0, $b0, $5b, $5b, $5b, $5b, $ff, $ff, $b0, $5b, $5b, $ff, $5e, $5e, $59, $5a 11 | db $5d, $5e, $59, $5a, $5c, $5c, $5c, $5c, $57, $58, $5c, $5c, $5d, $5e, $ff, $ff 12 | db $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff 13 | db $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff 14 | db $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff 15 | db $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff 16 | db $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff 17 | db $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff 18 | db $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff 19 | db $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff 20 | db $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff 21 | db $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff 22 | db $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff 23 | db $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff 24 | db $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff 25 | db $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff 26 | db $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff 27 | db $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff 28 | db $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff 29 | db $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff 30 | db $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff 31 | db $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff 32 | db $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff 33 | db $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff 34 | -------------------------------------------------------------------------------- /SRC/tilesets/ruinsExt.chr: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alex-west/M2RoS/946d74e8f8b6bef9d82339ac6b038d23c79495e5/SRC/tilesets/ruinsExt.chr -------------------------------------------------------------------------------- /SRC/tilesets/ruinsExt_collision.asm: -------------------------------------------------------------------------------- 1 | ; collision_ruinsExt 2 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $08, $08, $08, $08 3 | db $40, $40, $40, $40, $08, $08, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 4 | db $00, $00, $00, $00, $00, $00, $00, $08, $08, $08, $08, $00, $00, $00, $00, $00 5 | db $00, $00, $00, $00, $00, $00, $00, $00, $08, $08, $10, $10, $00, $00, $00, $00 6 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $02, $02, $02, $02 7 | db $00, $00, $60, $60, $03, $03, $00, $00, $00, $00, $60, $60, $71, $71, $71, $71 8 | db $71, $71, $71, $71, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 9 | db $01, $01, $01, $01, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 10 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 11 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 12 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 13 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 14 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 15 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 16 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 17 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 18 | -------------------------------------------------------------------------------- /SRC/tilesets/ruinsExt_metatiles.asm: -------------------------------------------------------------------------------- 1 | ; metatiles_ruinsExt 2 | db $00, $01, $02, $03, $04, $05, $06, $07, $08, $09, $0A, $0B, $FF, $FF, $74, $75 3 | db $FF, $FF, $76, $77, $58, $70, $56, $54, $71, $59, $55, $57, $18, $19, $19, $18 4 | db $FF, $FF, $FF, $FF, $3E, $3F, $3C, $3D, $1A, $1D, $1E, $21, $1A, $1B, $1E, $1F 5 | db $1C, $1B, $20, $1F, $1C, $1D, $20, $21, $22, $23, $25, $24, $24, $25, $23, $22 6 | db $44, $45, $46, $47, $5E, $5F, $63, $62, $2B, $2C, $2D, $2E, $2D, $2E, $2D, $2E 7 | db $7A, $7B, $7B, $7A, $7B, $7A, $7A, $7B, $78, $7B, $79, $7A, $7B, $78, $7A, $79 8 | db $58, $70, $56, $72, $71, $59, $73, $57, $3C, $3D, $3E, $3F, $2F, $2F, $2F, $2F 9 | db $4A, $48, $FF, $4A, $49, $48, $48, $49, $49, $4B, $4B, $FF, $6C, $6D, $6E, $6F 10 | db $FF, $FF, $4A, $4B, $FF, $64, $4A, $48, $65, $64, $49, $48, $65, $FF, $49, $4B 11 | db $FF, $FF, $6E, $6F, $6C, $6D, $FF, $FF, $FF, $6D, $FF, $6F, $6C, $FF, $6E, $FF 12 | db $63, $62, $66, $66, $18, $19, $17, $16, $FF, $60, $66, $66, $61, $FF, $66, $66 13 | db $5A, $5B, $5B, $5A, $31, $32, $30, $31, $31, $32, $32, $31, $31, $32, $32, $30 14 | db $31, $32, $FF, $31, $31, $32, $32, $FF, $65, $64, $30, $31, $65, $64, $32, $30 15 | db $64, $65, $32, $31, $31, $32, $FF, $FF, $30, $FF, $FF, $FF, $FF, $30, $FF, $FF 16 | db $33, $34, $36, $35, $35, $36, $34, $33, $33, $34, $37, $35, $35, $36, $34, $37 17 | db $FF, $FF, $3E, $3F, $FF, $FF, $3C, $3D, $FF, $FF, $66, $66, $2F, $2F, $2F, $2F 18 | db $5E, $5F, $5F, $5E, $60, $61, $5F, $5E, $5E, $5F, $5C, $5D, $FF, $61, $60, $5E 19 | db $60, $FF, $5F, $61, $5C, $5F, $FF, $5D, $5E, $5D, $5C, $FF, $FF, $FF, $60, $61 20 | db $5C, $5D, $FF, $FF, $FF, $61, $FF, $5E, $60, $FF, $5F, $FF, $2F, $2F, $2F, $2F 21 | db $68, $68, $68, $68, $4C, $4D, $6B, $6B, $4E, $4F, $6B, $6B, $6B, $6B, $6B, $6B 22 | db $FF, $7E, $38, $27, $FF, $FF, $FF, $38, $7E, $FF, $27, $39, $14, $28, $FF, $7F 23 | db $FF, $FF, $39, $FF, $28, $15, $7F, $FF, $39, $FF, $29, $7C, $FF, $14, $FF, $FF 24 | db $29, $7C, $15, $FF, $FF, $38, $7D, $2A, $15, $FF, $FF, $FF, $7D, $2A, $FF, $14 25 | db $66, $66, $67, $67, $67, $67, $67, $67, $16, $17, $17, $16, $52, $53, $53, $52 26 | db $FF, $FF, $0C, $0D, $0E, $0F, $50, $51, $50, $51, $50, $51, $FF, $42, $FF, $FF 27 | db $43, $FF, $FF, $FF, $42, $19, $FF, $42, $18, $43, $43, $FF, $10, $11, $12, $13 28 | db $2F, $2F, $2F, $2F, $4A, $48, $4A, $49, $49, $4B, $48, $4B, $3A, $3A, $3B, $3B 29 | db $69, $6A, $6A, $69, $FF, $FF, $64, $65, $FF, $FF, $FF, $64, $FF, $FF, $65, $FF 30 | db $24, $25, $FF, $22, $22, $23, $23, $FF, $24, $25, $26, $22, $22, $23, $23, $26 31 | db $FF, $64, $25, $22, $65, $64, $23, $24, $65, $64, $26, $22, $65, $FF, $23, $26 32 | db $22, $23, $FF, $FF, $24, $25, $FF, $FF, $26, $FF, $FF, $FF, $FF, $26, $FF, $FF 33 | db $FF, $FF, $FF, $40, $FF, $FF, $41, $FF, $FF, $40, $40, $18, $41, $FF, $19, $41 34 | -------------------------------------------------------------------------------- /SRC/tilesets/ruinsInside.chr: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alex-west/M2RoS/946d74e8f8b6bef9d82339ac6b038d23c79495e5/SRC/tilesets/ruinsInside.chr -------------------------------------------------------------------------------- /SRC/tilesets/ruinsInside_collision.asm: -------------------------------------------------------------------------------- 1 | ; collision_ruinsInside 2 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $80, $80, $80, $80 3 | db $00, $00, $00, $00, $00, $08, $08, $00, $00, $08, $08, $00, $00, $00, $00, $00 4 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $60, $00 5 | db $40, $40, $40, $40, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 6 | db $00, $00, $00, $00, $60, $60, $60, $60, $80, $80, $40, $40, $40, $40, $40, $40 7 | db $00, $00, $00, $00, $00, $00, $60, $60, $00, $00, $00, $00, $00, $00, $00, $00 8 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 9 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 10 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 11 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 12 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 13 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 14 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 15 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 16 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 17 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 18 | -------------------------------------------------------------------------------- /SRC/tilesets/ruinsInside_metatiles.asm: -------------------------------------------------------------------------------- 1 | ; metatiles_ruinsInside 2 | db $00, $01, $02, $03, $04, $05, $06, $07, $08, $09, $0a, $0b, $ff, $ff, $74, $75 3 | db $ff, $ff, $76, $77, $58, $70, $5c, $5a, $71, $59, $5b, $5d, $34, $35, $36, $37 4 | db $ff, $ff, $ff, $ff, $3c, $3d, $3e, $3f, $38, $39, $3a, $3b, $2d, $2d, $2d, $2d 5 | db $42, $43, $42, $43, $54, $55, $55, $54, $ff, $ff, $ff, $ff, $1d, $1e, $1d, $1e 6 | db $30, $31, $32, $33, $4a, $4b, $4a, $4b, $56, $57, $57, $56, $34, $35, $3a, $3b 7 | db $44, $45, $46, $47, $2e, $2e, $2e, $2e, $4c, $4d, $4e, $4f, $7f, $7f, $ff, $ff 8 | db $58, $70, $5c, $72, $71, $59, $73, $5d, $68, $69, $68, $69, $15, $16, $15, $16 9 | db $19, $1a, $19, $1a, $5e, $5f, $5e, $5f, $6a, $6b, $6b, $6a, $ff, $ff, $ff, $ff 10 | db $42, $43, $ff, $ff, $ff, $ff, $42, $43, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff 11 | db $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff 12 | db $ff, $ff, $0c, $0d, $0e, $0f, $48, $49, $40, $41, $41, $40, $48, $49, $48, $49 13 | db $48, $49, $40, $41, $40, $41, $67, $40, $40, $41, $41, $67, $ff, $ff, $ff, $ff 14 | db $67, $67, $67, $67, $62, $62, $63, $64, $65, $63, $64, $65, $63, $64, $66, $66 15 | db $6c, $6d, $6e, $6f, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff 16 | db $50, $51, $50, $51, $52, $53, $52, $53, $52, $51, $52, $51, $78, $78, $79, $79 17 | db $79, $79, $79, $79, $ff, $ff, $78, $78, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff 18 | db $22, $23, $27, $28, $24, $25, $29, $2a, $26, $ff, $2b, $2c, $18, $7c, $1c, $7e 19 | db $7d, $1b, $2f, $1f, $ff, $ff, $20, $21, $10, $11, $14, $7a, $12, $13, $7b, $17 20 | db $ff, $ff, $ff, $60, $ff, $ff, $61, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff 21 | db $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff 22 | db $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff 23 | db $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff 24 | db $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff 25 | db $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff 26 | db $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff 27 | db $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff 28 | db $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff 29 | db $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff 30 | db $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff 31 | db $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff 32 | db $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff 33 | db $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff 34 | -------------------------------------------------------------------------------- /SRC/tilesets/solidityValues.asm: -------------------------------------------------------------------------------- 1 | ; 8:7EFA - Solidity threshholds 2 | db $69, $63, $6e, $ff ; 0 - plantBubbles 3 | db $5e, $54, $5e, $ff ; 1 - ruinsInside 4 | db $f0, $f0, $f0, $ff ; 2 - queen 5 | db $63, $5d, $63, $ff ; 3 - caveFirst 6 | db $69, $69, $69, $ff ; 4 - surface 7 | db $42, $42, $42, $ff ; 5 - lavaCaves 8 | db $5c, $54, $64, $ff ; 6 - ruinsExt 9 | db $75, $75, $75, $ff ; 7 - finalLab -------------------------------------------------------------------------------- /SRC/tilesets/surfaceBG.chr: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alex-west/M2RoS/946d74e8f8b6bef9d82339ac6b038d23c79495e5/SRC/tilesets/surfaceBG.chr -------------------------------------------------------------------------------- /SRC/tilesets/surface_collision.asm: -------------------------------------------------------------------------------- 1 | ; collision_surface 2 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 3 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 4 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 5 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 6 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 7 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $08, $08, $08, $00, $00, $08, $00 8 | db $08, $08, $08, $08, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 9 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 10 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 11 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 12 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 13 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $10 14 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 15 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 16 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 17 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 18 | -------------------------------------------------------------------------------- /SRC/tilesets/surface_metatiles.asm: -------------------------------------------------------------------------------- 1 | ; metatiles_surface 2 | db $00, $01, $02, $03, $04, $05, $06, $07, $08, $09, $0a, $0b, $5e, $5e, $5e, $5e 3 | db $60, $61, $62, $63, $47, $48, $e2, $ff, $49, $4a, $ff, $ff, $4b, $ff, $ff, $ff 4 | db $ff, $ff, $ff, $16, $ff, $10, $17, $18, $13, $14, $19, $1a, $11, $ff, $1b, $5f 5 | db $ff, $12, $5f, $1c, $13, $14, $1a, $1d, $15, $ff, $1e, $1f, $ff, $ff, $20, $ff 6 | db $ff, $ff, $16, $23, $21, $e8, $e8, $e1, $e1, $e1, $e1, $e1, $e9, $ea, $e1, $74 7 | db $eb, $ec, $75, $76, $ed, $ee, $77, $78, $ef, $70, $79, $7a, $71, $72, $7b, $e1 8 | db $73, $22, $e1, $73, $ff, $ff, $24, $20, $ff, $21, $29, $1a, $1a, $25, $1a, $1a 9 | db $26, $7c, $1a, $e1, $7d, $e1, $c0, $c1, $e1, $da, $c2, $c3, $db, $dc, $c4, $c5 10 | db $e6, $e7, $c6, $c7, $dd, $de, $c8, $c9, $df, $e1, $ca, $cb, $e1, $7e, $cc, $cd 11 | db $7f, $27, $e1, $1a, $28, $1a, $1a, $1a, $22, $ff, $1a, $2a, $2b, $32, $ff, $ff 12 | db $32, $32, $ff, $ff, $2c, $2d, $ff, $ff, $2e, $ce, $34, $35, $cf, $d0, $36, $37 13 | db $d1, $d2, $38, $39, $d3, $d4, $3a, $3b, $d5, $d6, $3c, $3d, $d7, $d8, $3e, $3f 14 | db $d9, $2f, $40, $41, $30, $31, $ff, $ff, $32, $32, $ff, $ff, $32, $33, $ff, $ff 15 | db $ff, $42, $ff, $ff, $43, $44, $ff, $ff, $45, $46, $ff, $e2, $e3, $e3, $e2, $e2 16 | db $0c, $0d, $0e, $0f, $5c, $5c, $5d, $5d, $5d, $5d, $5d, $5d, $6f, $6e, $6d, $6c 17 | db $ff, $ff, $e0, $e0, $e5, $e5, $e5, $e5, $bf, $bf, $6b, $6b, $bf, $bf, $bf, $bf 18 | db $be, $bc, $bd, $be, $ff, $bb, $bc, $be, $67, $68, $ff, $ff, $65, $66, $67, $68 19 | db $bb, $ff, $bd, $be, $bc, $bb, $ff, $be, $ba, $be, $be, $ff, $ff, $bd, $be, $bb 20 | db $ff, $ff, $bd, $be, $bc, $bb, $ff, $ff, $be, $ff, $bb, $ff, $ff, $bb, $ff, $bc 21 | db $ff, $ff, $ff, $bc, $ff, $ff, $bb, $ff, $ff, $bd, $ff, $ff, $ba, $ff, $ff, $ff 22 | db $4c, $54, $56, $58, $54, $54, $58, $58, $54, $4d, $58, $57, $56, $58, $56, $58 23 | db $58, $57, $58, $57, $56, $58, $4e, $55, $58, $58, $55, $55, $58, $57, $55, $4f 24 | db $58, $58, $58, $58, $50, $58, $58, $58, $58, $51, $58, $58, $58, $58, $52, $58 25 | db $58, $58, $58, $53, $59, $59, $59, $59, $59, $5a, $59, $5a, $0c, $0d, $0f, $0e 26 | db $0f, $6e, $6d, $6c, $6f, $0e, $6d, $6c, $6f, $6e, $0d, $6c, $6f, $6e, $6d, $0c 27 | db $0f, $ff, $ff, $ff, $ff, $0e, $ff, $ff, $ff, $ff, $0d, $ff, $ff, $ff, $ff, $0c 28 | db $ff, $6e, $6d, $6c, $6f, $ff, $6d, $6c, $6f, $6e, $ff, $6c, $6f, $6e, $6d, $ff 29 | db $ff, $6e, $ff, $6c, $6f, $ff, $6d, $ff, $ff, $ff, $6d, $6c, $6f, $6e, $ff, $ff 30 | db $e4, $e4, $e5, $e5, $ff, $ff, $e4, $e4, $ff, $e4, $ff, $e5, $e4, $ff, $e5, $ff 31 | db $e5, $e5, $e4, $e4, $ff, $ff, $ff, $e4, $ff, $ff, $e4, $ff, $65, $68, $68, $ff 32 | db $66, $65, $ff, $66, $ff, $64, $ff, $64, $64, $ff, $64, $ff, $64, $64, $ff, $ff 33 | db $ff, $64, $ff, $ff, $64, $ff, $ff, $ff, $64, $64, $64, $64, $ff, $ff, $ff, $ff 34 | -------------------------------------------------------------------------------- /build.bat: -------------------------------------------------------------------------------- 1 | @echo off 2 | 3 | if not exist out mkdir out 4 | 5 | echo. Running scripts 6 | python .\scripts\enemy_csv2asm.py -i .\SRC\data\enemies.csv -o .\SRC\data 7 | if errorlevel 1 goto errorSCRIPT 8 | python.exe .\scripts\samus_csv2asm.py -i .\SRC\samus\samus.csv -o .\SRC\samus 9 | if errorlevel 1 goto errorSCRIPT 10 | echo. Success 11 | echo. 12 | 13 | :checkRGBDS 14 | where rgbasm 15 | if ERRORLEVEL 1 ( 16 | echo. 17 | echo RGBDS not detected. Downloading... 18 | echo. 19 | curl -LJO "https://github.com/gbdev/rgbds/releases/download/v0.9.1/rgbds-0.9.1-win32.zip" 20 | echo. 21 | tar -xvf rgbds-0.9.1-win32.zip 22 | echo. 23 | goto checkRGBDS 24 | ) 25 | 26 | echo. RGBDS detected 27 | echo. Assembling .asm files 28 | rgbasm -o out/game.o -i SRC/ SRC/game.asm 29 | if errorlevel 1 goto errorASM 30 | echo. Success 31 | echo. 32 | 33 | echo. Linking .o files 34 | rgblink -n out/M2RoS.sym -m out/M2RoS.map -o out/M2RoS.gb out/game.o 35 | if errorlevel 1 goto errorLINK 36 | echo. Success 37 | echo. 38 | 39 | echo. Fixing header 40 | rgbfix -v out/M2RoS.gb 41 | if errorlevel 1 goto errorFIX 42 | echo. Done 43 | echo. 44 | 45 | certutil -hashfile out/M2RoS.gb MD5 46 | echo. 47 | fc /b Metroid2.gb out\M2RoS.gb 48 | goto assembledDone 49 | 50 | :errorSCRIPT 51 | echo. 52 | echo. Script Error. 53 | echo. 54 | goto errorDone 55 | :errorASM 56 | echo. 57 | echo. Assembler Error. 58 | echo. 59 | goto errorDone 60 | :errorLINK 61 | echo. 62 | echo. Linker Error. 63 | echo. 64 | goto errorDone 65 | :errorFIX 66 | echo. 67 | echo. RGBFIX Error. 68 | echo. 69 | goto errorDone 70 | 71 | :assembledDone 72 | if not [%1] == [yes] pause 73 | exit 0 74 | 75 | :errorDone 76 | pause 77 | exit 1 78 | -------------------------------------------------------------------------------- /build.py: -------------------------------------------------------------------------------- 1 | import os 2 | import subprocess 3 | import hashlib 4 | 5 | def run_or_exit(args, err): 6 | completed_process = subprocess.run(args, shell=True) 7 | if completed_process.returncode != 0: 8 | print("\n" + err + "\n") 9 | exit(completed_process.returncode) 10 | 11 | 12 | if not os.path.exists('out/'): 13 | os.mkdir('out/') 14 | 15 | print('Running scripts') 16 | run_or_exit("python ./scripts/enemy_csv2asm.py -i ./SRC/data/enemies.csv -o ./SRC/data", "Script Error.") 17 | run_or_exit("python ./scripts/samus_csv2asm.py -i ./SRC/samus/samus.csv -o ./SRC/samus", "Script Error.") 18 | print('Success\n') 19 | 20 | completed_process = subprocess.run("rgbasm -V", shell=True) 21 | if completed_process.returncode != 0: 22 | print("RGBDS not detected. Downloading...") 23 | run_or_exit("curl -LJO \"https://github.com/gbdev/rgbds/releases/download/v0.9.0/rgbds-0.9.0-win32.zip\"", "Failed to download.") 24 | run_or_exit("tar -xvf rgbds-0.9.0-win32.zip", "Failed to extract RGBDS archive.") 25 | run_or_exit("rgbasm -V", "Unable to use downloaded RGBDS.") 26 | 27 | print('RGBDS detected') 28 | print('Assembling .asm files') 29 | run_or_exit("rgbasm -o out/game.o -I SRC/ SRC/game.asm", "Assembler Error.") 30 | print('Success\n') 31 | 32 | print('Linking .o files') 33 | run_or_exit("rgblink -n out/M2RoS.sym -m out/M2RoS.map -o out/M2RoS.gb out/game.o", "Linker Error.") 34 | print('Success\n') 35 | 36 | print('Fixing header') 37 | run_or_exit("rgbfix -v out/M2RoS.gb", "RGBFIX Error.") 38 | print('Done\n') 39 | 40 | with open("out/M2RoS.gb", "rb") as f: 41 | md5_hash_generated = hashlib.md5(f.read()) 42 | print('MD5 hash: ' + md5_hash_generated.hexdigest()) 43 | 44 | try: 45 | with open("Metroid2.gb", "rb") as f: 46 | md5_hash_expected = hashlib.md5(f.read()) 47 | if md5_hash_generated.hexdigest() == md5_hash_expected.hexdigest(): 48 | print("Hash matches vanilla ROM.") 49 | else: 50 | print("Hash does not match vanilla ROM.") 51 | except FileNotFoundError: 52 | print("Could not check hash against vanilla ROM.") 53 | -------------------------------------------------------------------------------- /docs/Bank 2 Map.md: -------------------------------------------------------------------------------- 1 | # Bank 2 Status Report 2 | 3 | Legend 4 | - S - Satisfactory (possibly improvable, but low priority) 5 | - NW - Needs Work (comments, label names, etc.) 6 | - X - Critical Errors (e.g. pointers need to be converted to labels) 7 | 8 | | Code | Addr | Status (comment) | 9 | |-------------------------|-------|--------------------------------| 10 | | Core Enemy Routines | $4000 | S (good except for collision vars) | 11 | | Main Enemy Loop | $409E | S | 12 | | Load Enemy Flags | $412F | S | 13 | | Save/Load Enemy Flags | $418C | S | 14 | | Deactivate All Enemies | $4217 | S | 15 | | Enemy Drop/Damage proc | $4239 | NW (weird exit) | 16 | | Directional Vuln. Check | $43A9 | S | 17 | | Weapon Damage Table | $43C8 | S | 18 | | Move from WRAM to HRAM | $43D2 | S | 19 | | Move from HRAM to WRAM | $4421 | S | 20 | | Delete Offscreen Enemy | $4464 | S | 21 | | Reactivate Enemy | $44C0 | S | 22 | | Deactivate Enemy | $452E | S | 23 | | Update Scroll History | $45CA | NW (don't other functions do this too?) | 24 | | Unused Functions | $45E4 | S | 25 | | Enemy BG Collision | $4608 | S (condense code w/macros) | 26 | | Load Blob Thrower Spr. | $4DB1 | S | 27 | | Item Orb AI | $4DD3 | S | 28 | | Blob Thrower AI | $4EA1 | S | 29 | | Arachnus AI | $5109 | S | 30 | | Blob Projectile | $536F | S | 31 | | Glow Fly AI | $54A1 | S | 32 | | Rock Icicle AI | $5542 | S | 33 | | Common Enemy Handler | $5630 | S | 34 | | Crawler AI (type A) | $57DE | S | 35 | | Shared Crawler Code | $5895 | S | 36 | | Crawler AI (type B) | $58DE | S | 37 | | Skreek Projectile | $59A6 | S | 38 | | Skreek AI | $59C7 | S | 39 | | Small Bug AI | $5ABF | S | 40 | | Drivel AI | $5AE2 | S | 41 | | Drivel Projectile | $5BD4 | S | 42 | | Senjoo/Shirk AI | $5C36 | S | 43 | | Gullugg AI | $5CE0 | S | 44 | | Chute Leech AI | $5E0B | S | 45 | | Pipe Bug AI | $5F67 | S | 46 | | Skorp AI (vertical) | $60AB | S | 47 | | Skorp AI (horizontal) | $60F8 | S | 48 | | Autrack AI | $6145 | S | 49 | | Hornoad/Hopper AI | $61DB | S | 50 | | Wallfire AI | $62B4 | S | 51 | | Gunzoo AI | $638C | S | 52 | | Autom AI | $6540 | S | 53 | | Proboscum AI | $65D5 | S | 54 | | Missile Block AI | $6622 | S | 55 | | Moto AI | $66F3 | S | 56 | | Halzyn AI | $6746 | S | 57 | | Septogg AI | $6841 | S | 58 | | Flitt AI (vanishing) | $68A0 | S | 59 | | Flitt AI (moving) | $68FC | S | 60 | | Gravitt AI | $695F | S | 61 | | Missile Door AI | $6A14 | S | 62 | | Accel Forwards | $6A7B | S | 63 | | Accel Backwards | $6AAE | S | 64 | | Unknown Function | $6AE1 | S (good enough) | 65 | | Common Enemy Routines | $6B21 | S | 66 | | Musical Sting Trigger | $6B83 | S | 67 | | First Alpha Metroid | $6BB2 | S | 68 | | Alpha Metroid AI | $6C44 | S | 69 | | Gamma Metroid AI | $6F60 | S | 70 | | Zeta Metroid AI | $7276 | S | 71 | | Omega Metroid AI | $7631 | S | 72 | | Normal Metroid AI | $7A4F | S | 73 | | Baby Metroid AI | $7BE5 | S | 74 | | Common Enemy Code | $7DA0 | S | 75 | -------------------------------------------------------------------------------- /docs/Enemy BG Collision.md: -------------------------------------------------------------------------------- 1 | # Enemy Tilemap Collision Procedures 2 | 3 | Rather than a data-based approach, this game just has several routines for enemies to check background collision. 4 | 5 | Here is a list of every one of those functions, along with the collision points they test as (x,y) pairs. 6 | 7 | ## Routines to check the right side of enemies 8 | Return value = $11 9 | 10 | 8 routines (2 unused) 11 | 12 | Call_002_4608 - Near, Small 13 | - (3,-3) 14 | - (3, 3) 15 | 16 | 02:4635 - Unused - Mid, Small 17 | - (7,-3) 18 | - (7, 3) 19 | 20 | Call_002_4662 - Mid, Medium 21 | - (7,-6) 22 | - (7, 0) 23 | - (7, 6) 24 | 25 | Call_002_46ac - Far, Medium 26 | - (11,-7) 27 | - (11, 0) 28 | - (11, 7) 29 | 30 | 02:46E9 - Unused - Mid, Wide 31 | - (7,-11) 32 | - (7, -3) 33 | - (7, 3) 34 | - (7, 11) 35 | 36 | Call_002_4736 - Far, Wide 37 | - (11,-11) 38 | - (11. -3) 39 | - (11, 3) 40 | - (11, 11) 41 | 42 | Call_002_4783 - Crawl A 43 | - (7,-8) 44 | - (7, 7) 45 | 46 | Call_002_47b4 - Crawl B 47 | - (7,-7) 48 | - (7, 8) 49 | 50 | ## Routines to check the left side of enemies ( 51 | Return value = $44 52 | 53 | 8 functions (2 unused) 54 | 55 | Call_002_47e1 - Near, Small 56 | - (-3,-3) 57 | - (-3, 3) 58 | 59 | ; 02:480E - Unused - Mid, Small 60 | - (-7,-3) 61 | - (-7, 3) 62 | 63 | Call_002_483b - Mid, Medium 64 | - (-7,-6) 65 | - (-7, 0) 66 | - (-7, 6) 67 | 68 | Call_002_4885 - Far, Medium 69 | - (-11,-7) 70 | - (-11, 0) 71 | - (-11, 7) 72 | 73 | 02:48C2 - Unused - Mid, Wide 74 | - (-7,-11) 75 | - (-7, -3) 76 | - (-7, 3) 77 | - (-7, 11) 78 | 79 | Call_002_490f - Far, Wide 80 | - (-11,-11) 81 | - (-11, -3) 82 | - (-11, 3) 83 | - (-11, 11) 84 | 85 | Call_002_495c - Crawl A 86 | - (-9,-7) 87 | - (-9, 8) 88 | 89 | Call_002_498d - Crawl B 90 | - (-9,-8) 91 | - (-9, 7) 92 | 93 | ## Routines to check the bottom edge of enemies 94 | Return value = $22 95 | 96 | 9 functions (2 unused) 97 | 98 | Call_002_49ba - Near, Small 99 | - (-3,3) 100 | - ( 3,3) 101 | 102 | 02:49E7 - Unused - Near, Medium 103 | - (-7,3) 104 | - ( 0,3) 105 | - ( 7,3) 106 | 107 | Call_002_4a28 - Mid, Medium 108 | - (-6,7) 109 | - ( 0,7) 110 | - ( 6,7) 111 | 112 | 02:4A6E - Unused - Mid, Wide 113 | - (-11,7) 114 | - ( -3,7) 115 | - ( 3,7) 116 | - ( 11,7) 117 | 118 | Call_002_4abb - One Point 119 | - (0,11) 120 | 121 | Call_002_4ad6 - Far, Medium 122 | - (-7,11) 123 | - ( 0,11) 124 | - ( 7,11) 125 | 126 | Call_002_4b17 - Far, Wide 127 | - (-11,11) 128 | - ( -3,11) 129 | - ( 3,11) 130 | - ( 11,11) 131 | 132 | Call_002_4b64 - Crawl A 133 | - (-8,8) 134 | - ( 7,8) 135 | 136 | Call_002_4b91 - Crawl B 137 | - (-9,8) 138 | - ( 6,8) 139 | 140 | ## Routines to check the top edge of enemies 141 | Return value = $88 142 | 143 | 8 functions (3 unused) 144 | 145 | Call_002_4bc2 - Near, Small 146 | - (-3,-3) 147 | - ( 3,-3) 148 | 149 | 02:4BEF - Unused - Near, Medium 150 | - (-7,-3) 151 | - ( 0,-3) 152 | - ( 7,-3) 153 | 154 | Call_002_4c30 - Mid, Medium 155 | - (-6,-7) 156 | - ( 0,-7) 157 | - ( 6,-7) 158 | 159 | 02:4C76 - Unused - Mid, Wide 160 | - (-11,-7) 161 | - ( -3,-7) 162 | - ( 3,-7) 163 | - ( 11,-7) 164 | 165 | 02:4CC3 - Unused - Far, Medium 166 | - (-7,-11) 167 | - ( 0,-11) 168 | - ( 7,-11) 169 | 170 | Call_002_4d04 - Far, Wide 171 | - (-11,-11) 172 | - ( -3,-11) 173 | - ( 3,-11) 174 | - ( 11,-11) 175 | 176 | Call_002_4d51 - Crawl A 177 | - (-9,-8) 178 | - ( 6,-8) 179 | 180 | Call_002_4d7f - Crawl B 181 | - (-8,-8) 182 | - ( 7,-8) -------------------------------------------------------------------------------- /docs/Enemy Headers.md: -------------------------------------------------------------------------------- 1 | # Enemy Headers and Enemies in RAM 2 | 3 | ## RAM 4 | Enemies are in RAM in two places. Canonically, they are stored in an array at $C600. When it's an enemy's turn to be processed, it's information is copied to a working location in HRAM, and then copied back when finished. 5 | 6 | Note that there are 10 bytes in each enemy's WRAM slot that are unused due to space constraints in HRAM. 7 | 8 | ## Headers 9 | There are three types of enemy headers that are copied to WRAM when an enemy is spawned. 10 | 11 | - Normal headers are what are used in loading in a enemy from the map, and are located in Bank 3. The Y position, X position, and sprite number are supplied by the enemy map data itself. 12 | 13 | - Long headers are used by some enemies when spawning projectiles. The parent enemy needs to supply an X and Y position, but the sprite number is in the header itself. These headers intermingled with the enemy code in Bank 2. 14 | 15 | - Short headers are also used by enemies to spawn projectiles. In this case, however, the sprite number and sprite attributes must also be provided by the parent enemy. 16 | 17 | ## Tabular Representation 18 | | WRAM | HRAM | Normal | Long | Short | Purpose | 19 | |------|------|--------|------|-------|---------------------------| 20 | | C600 | E0 | x | x | x | Status | 21 | | C601 | E1 | x | x | x | Y Position (camera-space) | 22 | | C602 | E2 | x | x | x | X Position (camera-space) | 23 | | C603 | E3 | x | 0 | x | Sprite Number | 24 | | C604 | E4 | 0 | 1 | x | Base Sprite Attributes | 25 | | C605 | E5 | 1 | 2 | x | Sprite Attributes | 26 | | C606 | E6 | 2 | 3 | 0 | Stun Counter | 27 | | C607 | E7 | 3 | 4 | 1 | General? | 28 | | C608 | E8 | 4 | 5 | 2 | Directional Flags | 29 | | C609 | E9 | 5 | 6 | 3 | General? | 30 | | C60A | EA | 6 | 7 | 4 | General? | 31 | | C60B | EB | 7 | 8 | 5 | Ice Counter | 32 | | C60C | EC | 8 | 9 | 6 | Health | 33 | | C60D | ED | x | x | x | Drop Type | 34 | | C60E | EE | x | x | x | Explosion Flag | 35 | | C60F | F3 | x | x | x | Y Position (screens away) | 36 | | C610 | F4 | x | x | x | X Position (screens away) | 37 | | C611 | F5 | 8 | 9 | 6 | Initial Health | 38 | | C612 | x | x | x | x | - | 39 | | C613 | x | x | x | x | - | 40 | | C614 | x | x | x | x | - | 41 | | C615 | x | x | x | x | - | 42 | | C616 | x | x | x | x | - | 43 | | C617 | x | x | x | x | - | 44 | | C618 | x | x | x | x | - | 45 | | C619 | x | x | x | x | - | 46 | | C61A | x | x | x | x | - | 47 | | C61B | x | x | x | x | - | 48 | | C61C | EF | x | x | x | Spawn Flag | 49 | | C61D | F0 | x | 10 | 7 | Spawn Number | 50 | | C61E | F1 | 9 | 11 | 8 | AI Pointer Low | 51 | | C61F | F2 | 10 | 12 | 9 | AI Pointer High | 52 | | x | FC | - | - | - | WRAM Addr Low | 53 | | x | FD | - | - | - | WRAM Addr High | 54 | 55 | ### Explanations 56 | #### Status 57 | Values: 58 | - $00: Enemy is active 59 | - $01: Enemy is offscreen 60 | - $8x: Enemy is invisible 61 | - $FF: Enemy slot is unused 62 | 63 | Invalid values appear to crash the game back to the title screen. 64 | 65 | #### Positions 66 | The X and Y positions are in pixels relative to the camera. There are no sub-pixels. The game automatically updates the positions as the camera moves. 67 | 68 | Enemies also have memory addresses that keep track of which screen they are on, relative to the camera. If either value is non-zero, then the enemy is considered offscreen and it's AI routine is not executed for the given frame. If the enemy is more than a couple screens away in any direction, it is automatically unloaded. 69 | 70 | #### Sprite Number 71 | The sprite number determines which metasprite is used to render the enemy (based on the enemy sprite pointer table), as well as which hitbox and damage value to use. Note that while the enemy type in the map data determines the initial sprite an enemy uses, enemies are free to change their displayed sprite to anything at runtime. 72 | 73 | #### Sprite Attributes 74 | The base sprite attributes determine the attribute flags for an enemy. They are never modified during runtime, though this mostly appears to be a matter of convention. Directly after that is a mutable version of the sprite attributes. These two values are XOR'd together at render-time to determine the visual attributes of the sprites. (The stun counter also factors into this calculation.) 75 | 76 | #### Stun Counter 77 | Used to have make the enemy stunned for a few frames when shot. 78 | 79 | Values: 80 | - $00: Default (no effect) 81 | - $10: Palette changed, but value does not increment (used for visual component of ice beam) 82 | - $11-$13: Stunned (increments each frame until $13, then it returns to $00) 83 | 84 | #### Directional Flags 85 | The upper nybble encodes directional vulnerabilities of the enemy: 86 | - %0001xxxx - resists rightward shots 87 | - %0010xxxx - left 88 | - %0100xxxx - up 89 | - %1000xxxx - down 90 | 91 | The lower nybble is sometimes used to indicate which direction the enemy is logically going (being distinct from its visual direction). 92 | 93 | #### General Variables 94 | HRAM addresses $FFE7, $FFE9, and $FFEA are general purpose variables used in enemy AI routines. They tend to be counters or states of some sort. 95 | 96 | Note: $FFE9 and $FFEA might have currently undocumented purposes in the enemy header. 97 | 98 | #### Ice Counter 99 | Used by the ice beam to determine how frozen an enemy is. A value of 0 indicates the enemy is unfrozen. 100 | 101 | Odd values result in frozen enemies vulnerable to screw attack (normal behavior), while (non-zero) even values result in enemies invulnerable to screw attack (possibly unused). 102 | 103 | #### Health 104 | 105 | The enemy's health. The values $FD, $FE, and $FF are special cases. 106 | 107 | The initial health of an enemy is kept because it determines what the enemy drops. It is referenced when setting the explosion flag, which in turn is referenced when setting the drop type itself. 108 | 109 | Rules: 110 | - If $FD or $FE - No drops, ever. 111 | - If value is even, drop missile 112 | - If value is >$0A, drop large health 113 | - Else, drop small health 114 | - Note: All drops have a 50% chance of happening or being nothing 115 | 116 | #### Drop Type 117 | Values: 118 | - 0: None 119 | - 1: Small health 120 | - 2: Large health 121 | - 4 (or otherwise): missile drop 122 | 123 | #### Explosion Flag 124 | Contains the current explosion status and the future-drop status (based on the initial health of the enemy). 125 | 126 | Values: 127 | - Non-zero - Explosion happening 128 | - $1x - Explosion type A (normal death) 129 | - $2x - Explosion type B (screw attack death) 130 | - $x0 - No drop 131 | - $x1 - Small health 132 | - $x2 - Large health 133 | - $x4 - Missile drop 134 | 135 | Note: $FFE9 is used as an explosion timer when exploding. 136 | 137 | #### Spawn Flag and Number 138 | An enemy's spawn number and flag are used to keep track of whether or not a specific enemy on the current map have been killed. Enemies with spawn numbers in the range of 0x40-0x7F have their spawn flags saved when killed (e.g. metroids, items, etc.). 139 | 140 | The are multiple possible values for spawn flags besides "dead" and "alive." 141 | - $01 - Alive 142 | - $02 - Permanently Dead (if spawn number is in savable range) 143 | - $03 - Inactive and waiting for child object (i.e. a projectile) to die 144 | - $04 - Has been seen before (used to skip Metroid intro animations) 145 | - $05 - Has been seen before and has a child object 146 | - $06 - Enemy projectile 147 | - $x0 - Enemy projectile that links back to its parent object 148 | 149 | #### AI Pointer 150 | Points to an AI routine in bank 2. 151 | 152 | #### WRAM Addr 153 | A value in HRAM that points to the canonical WRAM location of the enemy being currently worked on. 154 | -------------------------------------------------------------------------------- /docs/ROM Tour.md: -------------------------------------------------------------------------------- 1 | # ROM Tour 2 | ### A High-Level Look of the Game's Structure 3 | 4 | ## Bank 0 5 | Progress: 30% 6 | 7 | Relocatable: Yes 8 | 9 | - Main game engine 10 | - Samus control routines 11 | - Common collision routines 12 | - Door transition script interpreter 13 | - Stubs used for jumping between banks 14 | 15 | ## Bank 1 16 | Progress: 40% 17 | 18 | Relocatable: Yes 19 | 20 | - Samus metasprite data 21 | - Samus drawing routines 22 | - Save/load routines 23 | - Initial savegame data 24 | - Bomb/beam routines 25 | - Destructible block routines 26 | - Enemy metasprite data 27 | - Alpha/Gamma Metroid movement routines 28 | - Title/credits metasprite data 29 | - Earthquake animation routine 30 | 31 | ## Bank 2 32 | Progress: 60% 33 | 34 | Relocatable: Yes 35 | 36 | - Main enemy handler 37 | - Enemy specific collision routines 38 | - Enemy AI code 39 | 40 | ## Bank 3 41 | Progress: 15% 42 | 43 | Relocatable: Yes 44 | 45 | - Enemy loading routines 46 | - Enemy position data 47 | - Enemy headers 48 | - Enemy damage table 49 | - Enemy hitboxes 50 | - Metroid seeking routine 51 | - Enemy Scrolling Routine 52 | - Queen AI 53 | - LCD Interrupt Handler 54 | 55 | ## Bank 4 56 | Progress: 1% 57 | 58 | Relocatable: No 59 | 60 | - Everything related to sound. 61 | 62 | ## Bank 5 63 | Progress: 90% 64 | 65 | Relocatable: Yes 66 | 67 | - Title screen code 68 | - Credits code 69 | - Door transition scripts 70 | - Title screen and ending graphics 71 | 72 | TODO: Giving proper names to labels and some variables. 73 | 74 | ## Bank 6 75 | Progress: 95% 76 | 77 | Relocatable: Yes 78 | 79 | - Graphics for the arm cannon and beams. 80 | - Various suit graphics that get swapped in when upgrades are collected. 81 | - Samus' power suit graphics, along with common HUD and sprite elements. 82 | - Samus' Varia Suit graphics 83 | - Sprite graphics for the all non-Metroid enemies, and the landing site. 84 | - The text of the credits 85 | - Spider ball orientation table 86 | 87 | TODO: Converting graphics to an editable format. 88 | 89 | ## Bank 7 90 | Progress: 95% 91 | 92 | Relocatable: Yes 93 | 94 | - Tile graphics for the majority of the game's areas. 95 | - Graphics for each major item, and the item orb. 96 | - Some common sprite graphics. 97 | 98 | TODO: Converting graphics to an editable format. 99 | 100 | ## Bank 8 101 | Progress: 95% 102 | 103 | Relocatable: Yes 104 | 105 | - Base tilemap for the Queen's head. 106 | - Collision tables for each tileset. 107 | - Metatile definitions for each tileset. 108 | - Enemy graphics for the different metroid types 109 | - A couple of spare area tilesets. 110 | - A subroutine that checks if an earthquake should happen. 111 | - A table of solidity thresholds for each tileset. 112 | 113 | TODO: Converting graphics to an editable format. 114 | 115 | ## Level Data Banks 116 | Progress: 100% 117 | 118 | Relocatable: N/A 119 | 120 | The last 7 banks of the game contain the game's map data. Each bank is a 16x16 screen map capable of having 59 unique screens. Rooms are arranged in these maps like tetrominos, and glued together via the door transition scripts in bank 5. 121 | 122 | The enemy placement data is contained separately in bank 123 | 124 | ### Bank 9 125 | - The main caverns for the game's four main ruins. 126 | 127 | ### Bank A 128 | - The large, free-scrolling caves with acid. 129 | - The first underground room in the game. 130 | - The horizontal corridors from the last cave (with the pit traps) 131 | - A couple Metroid fight rooms. 132 | - A screen that accidentally point to the beginning of the ROM somehow. 133 | 134 | ### Bank B 135 | - Horizontally scrolling rooms from just about every area of the game, except for the Omega Metroids' area and the ruins' interiors 136 | - One Omega Metroid fight room 137 | - The second save room from the Omegas Metroid area. 138 | 139 | ### Bank C 140 | - Vertically oriented rooms from just about every area in the game. 141 | 142 | ### Bank D 143 | - Interiors of Ruins 1 and 2. 144 | - Vertical rooms from the Queen's area (labs). 145 | 146 | ### Bank E 147 | - Interiors of Ruins 3 and 4 148 | - Horizontal rooms from the Queen's area (labs). 149 | - Two metroid fight rooms 150 | - The broken statue room 151 | - The last refill room (happens to be a filler screen) 152 | 153 | ### Bank F 154 | - The landing site from the beginning of the game (with a huge unused portion) 155 | - The landing site from the end of the game, w/the exit from the last area 156 | - Horizontal corridors from the introductory area 157 | - Horizontal corridors from the Omegas' area 158 | - The large cavern from the last area (with the sludge pit) 159 | - The Queen's rooms (before/during/after) 160 | -------------------------------------------------------------------------------- /docs/Style Guide.md: -------------------------------------------------------------------------------- 1 | # Style Guide 2 | 3 | A rough style for keeping the contributors to this project on the same page. Contact the maintainer of this repository if you need clarification or have ideas for improvement. 4 | 5 | Note that some parts of this disassembly were made before these rules were adopted. Feel free to submit a pull request to correct them. 6 | 7 | ## Naming Conventions 8 | 9 | Variable and label names should use the `camelCase` convention. `ALL_CAPS` is reserved for hardware registers. 10 | 11 | The underscore `_` can be used as an informal class or namespace marker. For example, the main pose-handler for Samus could be named `samus_poseHandler`. 12 | 13 | Label names inside of functions should begin with a period `.likeThis` so they are scoped as local labels by the assembler. If for whatever reason they need to be referenced outside of the function, you can use the function name like so: `function.likeThis`. 14 | 15 | Variables in HRAM should be prefixed with `h`, such as `hVBlankDoneFlag`. 16 | 17 | ## Labelling and Indentation 18 | 19 | Many assembly-level expressions have rough equivalents to higher-level concepts. When possible, use labelling and indentation to make the connections clearer. Use `.localLabels` when at all possible. 20 | 21 | If a jump cannot be expressed in terms of a simple, high-level control flow concept, give it a `.descriptiveName`. 22 | 23 | ### If Statements 24 | 25 | ``` 26 | cp $ff 27 | jr z, .endIf 28 | code 29 | code 30 | .endIf: 31 | 32 | more code 33 | ``` 34 | 35 | If a function has multiple if statements, then post-fix each with an underscore `_` and letter. For instance: 36 | 37 | ``` 38 | jr z, .endIf_A 39 | code 40 | .endIf_A: 41 | 42 | more code 43 | jr z, .endIf_B 44 | more code 45 | .endIf_B: 46 | ``` 47 | 48 | ### If-Else 49 | 50 | If-Else statements occur when two branches of code are mutually exclusive, like so: 51 | 52 | ``` 53 | jr z, .else 54 | code 55 | jr .endIf 56 | .else: 57 | more code 58 | .endIf: 59 | 60 | more code 61 | ``` 62 | 63 | If there are multiple if statements in a function, the letter appended to the `.else_A` and `.endIf_A` labels should match whenever possible. 64 | 65 | ### If-Then 66 | 67 | If-Then statements are similar to If-Else statements, except the branches in them are not mutually exclusive. Rather, if either condition is properly met, then the code following the `.then:` label is executed. 68 | 69 | ``` 70 | jr z, .then 71 | code 72 | jr z, .endIf 73 | .then: 74 | more code 75 | .endIf: 76 | 77 | more code 78 | ``` 79 | 80 | ### Returns 81 | 82 | The `ret` function should be unindented when it is at the end of a function. 83 | 84 | ``` 85 | function: 86 | code 87 | code 88 | code 89 | ret 90 | ``` 91 | 92 | However, if the function ends with an If-Else statement, both occurrances should remain indented, and an unindented comment should be left to indicate the end of the function. 93 | 94 | ``` 95 | jr z, .else 96 | code 97 | ret 98 | .else: 99 | more code 100 | ret 101 | ; end proc 102 | ``` 103 | 104 | ### Loops 105 | 106 | ``` 107 | .loop: 108 | code 109 | jr z. .loop 110 | ``` 111 | 112 | It is often useful to give loops meaningful names, such as `.clearLoop` or `.enemyLoop`. 113 | 114 | Sometimes loops end with unconditional jumps, and the exit point is embedded within the loop itself: 115 | 116 | ``` 117 | .loop: 118 | code 119 | jr z, .break 120 | more code 121 | jr .loop 122 | .break: 123 | ``` 124 | 125 | ### Conditional Returns, Calls, Jumps, etc. 126 | 127 | Conditional returns and calls, and goto-like jumps should be indented. 128 | 129 | ``` 130 | cmp [var] 131 | ret z 132 | cmp [var] 133 | call z, function 134 | cmp [var] 135 | jr z, trickyLabel 136 | ``` 137 | 138 | ### Switch-Like Statements 139 | 140 | ``` 141 | ld a, [foo] 142 | and a 143 | jr z, .case_doThing 144 | inc a 145 | jr z, .case_doOtherThing 146 | inc a 147 | jr z, .case_doAnotherThing 148 | ; etc. 149 | 150 | ; Do default thing 151 | code 152 | 153 | .case_doThing: 154 | code 155 | .case_doAnotherThing: 156 | code 157 | .case_doOtherThing: 158 | code 159 | ``` 160 | 161 | ### Splitting Labels 162 | 163 | Sometimes a labels end up serving multiple purposes, such as being then end of an if statement and the start of a loop, like so: 164 | 165 | ``` 166 | jr z, .label 167 | code 168 | .label 169 | code 170 | jr z, .label 171 | ``` 172 | 173 | Consider splitting the label into two labels for clarity: 174 | 175 | ``` 176 | jr z, .endIf 177 | code 178 | .endIf 179 | 180 | .loop 181 | code 182 | jr z, .loop 183 | ``` 184 | 185 | ### Multiple-Entry Points 186 | 187 | Sometimes a block of code might have multiple entry points. This is a very difficult problem to work around, and no single solution necessarily works in all possible cases. 188 | 189 | When the entrances are mutually exclusive, this approach is worth considering: 190 | 191 | ``` 192 | function: 193 | .left: 194 | code 195 | jr start 196 | .right: 197 | code 198 | .start: 199 | code 200 | ``` 201 | 202 | This function can thus be called with both `call function.left` and `call function.right`. 203 | -------------------------------------------------------------------------------- /docs/graphics pointers.txt: -------------------------------------------------------------------------------- 1 | Graphics Pointers Referenced by Room Transition Scripts 2 | 3 | Source Pointers: (GB bank format) 4 | 065920 - gfx_enemiesA 5 | 065D20 - gfx_enemiesB 6 | 066120 - gfx_enemiesC 7 | 066520 - gfx_enemiesD 8 | 066920 - gfx_enemiesE 9 | 066D20 - gfx_enemiesF 10 | 067120 - gfx_arachnus 11 | 067520 - gfx_surfaceSPR 12 | 13 | 074000 - gfx_plantBubbles 14 | 074800 - gfx_ruinsInside 15 | 075000 - gfx_queenBG 16 | 075800 - gfx_caveFirst 17 | 076000 - gfx_surfaceBG 18 | 076800 - gfx_lavaCavesA 19 | 076D30 - gfx_lavaCavesB 20 | 077260 - gfx_lavaCavesC 21 | 077A90 - gfx_commonItems 22 | 23 | 084000 - bg_queenHead 24 | 084020 - (bg_queenHead+0x20) (row2) 25 | 084040 - (bg_queenHead+0x40) (row3) 26 | 084060 - (bg_queenHead+0x60) (row4) 27 | 0859BC - gfx_metAlpha 28 | 085DBC - gfx_metGamma 29 | 0861BC - gfx_metZeta 30 | 0865BC - gfx_metOmega 31 | 0869BC - gfx_ruinsExt 32 | 0871BC - gfx_finalLab 33 | 0879BC - gfx_queenSPR (16x5 tiles) 34 | 35 | Source Pointers: (ROM offsets) 36 | 019920 - gfx_enemiesA 37 | 019D20 - gfx_enemiesB 38 | 01A120 - gfx_enemiesC 39 | 01A520 - gfx_enemiesD 40 | 01A920 - gfx_enemiesE 41 | 01AD20 - gfx_enemiesF 42 | 01B120 - gfx_arachnus 43 | 01B520 - gfx_surfaceSPR 44 | 45 | 01C000 - gfx_plantBubbles 46 | 01C800 - gfx_ruinsInside 47 | 01D000 - gfx_queenBG 48 | 01D800 - gfx_caveFirst 49 | 01E000 - gfx_surfaceBG 50 | 01E800 - gfx_lavaCavesA 51 | 01ED30 - gfx_lavaCavesB 52 | 01F260 - gfx_lavaCavesC 53 | 01FA90 - gfx_commonItems 54 | 55 | 020000 - bg_queenHead 56 | 020020 - (bg_queenHead+0x20) 57 | 020040 - (bg_queenHead+0x40) 58 | 020060 - (bg_queenHead+0x60) 59 | 0219BC - gfx_metAlpha 60 | 021DBC - gfx_metGamma 61 | 0221BC - gfx_metZeta 62 | 0225BC - gfx_metOmega 63 | 0229BC - gfx_ruinsExt 64 | 0231BC - gfx_finalLab 65 | 0239BC - gfx_queenSPR (16x5 tiles) 66 | 67 | Destination Pointers: 68 | 8B00 - _VRAM_sprTiles 69 | 8F00 - _VRAM_bgTiles 70 | 9C00 - _SCRN1 71 | 9C20 - (_SCRN1+0x20) 72 | 9C40 - (_SCRN1+0x40) 73 | 9C60 - (_SCRN1+0x60) 74 | 75 | Other Destination Pointers: (not from transitions) 76 | 9200 - Credits font 77 | 78 | 9A00 - Queen's Feet Base Address 79 | -------------------------------------------------------------------------------- /patches/Vertical Enemy Loading Fix.asm: -------------------------------------------------------------------------------- 1 | ; Vertical enemy loading fix 2 | ; This modifies the vertical enemy loading code so that it doesn't run 3 | ; on the assumption that horizontally connected screens contain contiguous 4 | ; data, allowing for more tightly packed enemy data. This comes at the minor 5 | ; cost of needing to explicitly deference the adjacent screen's pointer 6 | ; (the horizontal loading case already does this though). 7 | 8 | ;03:4135: ; Hijack point, if that's necessary for your purposes 9 | jp verticalCheck_hijack 10 | nop 11 | nop 12 | nop 13 | nop 14 | hijack_return: 15 | 16 | ;------ 17 | 18 | verticalCheck_hijack: ; 03:7DAD from 03:4135 19 | ; Check if the left and right screen are the same, exit if so 20 | ld a, [rightEdge_screen] 21 | ld c, a 22 | ld a, [leftEdge_screen] 23 | cp c 24 | ret z 25 | ld a, c 26 | ; Iterate to the bottom screen (properly) 27 | call loadEnemy_getBankOffset 28 | call loadEnemy_getPointer.screen 29 | jp hijack_return ; 03:413C -------------------------------------------------------------------------------- /patches/improvedSpiderBall.asm: -------------------------------------------------------------------------------- 1 | spiderBallOrientationTable: ; 06:7E03 (0x1BE03) 2 | ; Given an input and a spider ball collision state, this table 3 | ; produces a rotational direction for the spider ball. 4 | ; - Values 5 | ; 0: Don't move 6 | ; 1: Move counter-clockwise 7 | ; 2: Move clockwise 8 | ; (Note: "clockwise" here assumes that the ball rolling inside a box) 9 | ; 10 | ; The original table only filled in two entries per row, resulting 11 | ; in some really awkward fiddliness if you happen to stop on a corner. 12 | ; 13 | ; This new table fills in six entries per row, allowing for diagonal 14 | ; inputs and secondary directions where it would make sense. I would 15 | ; have filled in all 8 valid inputs per row, but in every case I determined 16 | ; that the result would have been unintuitive. 17 | 18 | ; U U D D <- Inputs States -\ 19 | ; x R L x U R L x D R L x x x x x | 20 | db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ; 0: In air v 21 | db 0, 2, 1, 0, 1, 0, 1, 0, 2, 2, 0, 0, 0, 0, 0, 0 ; 1: Outside corner: Of left-facing wall and ceiling 22 | db 0, 1, 2, 0, 1, 1, 0, 0, 2, 0, 2, 0, 0, 0, 0, 0 ; 2: Outside corner: Of left-facing wall and floor 23 | db 0, 0, 0, 0, 1, 1, 1, 0, 2, 2, 2, 0, 0, 0, 0, 0 ; 3: Flat surface: Left-facing wall 24 | db 0, 2, 1, 0, 2, 2, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0 ; 4: Outside corner: Of right-facing wall and ceiling 25 | db 0, 2, 1, 0, 0, 2, 1, 0, 0, 2, 1, 0, 0, 0, 0, 0 ; 5: Flat surface: Ceiling 26 | db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ; 6: Unused: Top-left and bottom-right corners of ball in contact 27 | db 0, 2, 1, 0, 1, 0, 1, 0, 2, 2, 0, 0, 0, 0, 0, 0 ; 7: Inside corner: Of left-facing wall and ceiling 28 | db 0, 1, 2, 0, 2, 0, 2, 0, 1, 1, 0, 0, 0, 0, 0, 0 ; 8: Outside corner: Of right-facing wall and floor 29 | db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ; 9: Unused: Bottom-left and top-right corners of ball in contact 30 | db 0, 1, 2, 0, 0, 1, 2, 0, 0, 1, 2, 0, 0, 0, 0, 0 ; A: Flat surface: Floor 31 | db 0, 1, 2, 0, 1, 1, 0, 0, 2, 0, 2, 0, 0, 0, 0, 0 ; B: Inside corner: Of left-facing wall and floor 32 | db 0, 0, 0, 0, 2, 2, 2, 0, 1, 1, 1, 0, 0, 0, 0, 0 ; C: Flat surface: Right-facing wall 33 | db 0, 2, 1, 0, 2, 2, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0 ; D: Inside corner: Of right-facing wall and ceiling 34 | db 0, 1, 2, 0, 2, 0, 2, 0, 1, 1, 0, 0, 0, 0, 0, 0 ; E: Inside corner: Of right-facing wall and floor 35 | db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ; F: Unused: Embedded in solid 36 | 37 | ; Notes about the collision state: 38 | ; 39 | ; When using the spider ball, the game checks the collision state 40 | ; of 8 points along its perimeter. For each point that is in contact 41 | ; with a solid surface, the following bitmasks are applied (OR'd) 42 | ; to the spider ball's collision state: 43 | ; 44 | ; Point Bitmasks 45 | ; 0 %0001 46 | ; 1 %0010 2 _6_ 0 47 | ; 2 %0100 / \ 48 | ; 3 %1000 5| |4 49 | ; 4 %0011 \___/ 50 | ; 5 %1100 3 7 1 51 | ; 6 %0101 52 | ; 7 %1010 53 | ; 54 | ; Notice that the bitmasks for the sides are the OR'd sum of the bitmasks their 55 | ; adjacent corners. 56 | 57 | ; List of all changed bytes (original values are all zero): 58 | ; 0x1BE15: 01 59 | ; 0x1BE19: 01 60 | ; 0x1BE1B: 02 61 | ; 0x1BE1C: 02 62 | 63 | ; 0x1BE25: 02 64 | ; 0x1BE27: 01 65 | ; 0x1BE28: 01 66 | ; 0x1BE2D: 02 67 | 68 | ; 0x1BE38: 01 69 | ; 0x1BE39: 01 70 | ; 0x1BE3C: 02 71 | ; 0x1BE3D: 02 72 | 73 | ; 0x1BE44: 02 74 | ; 0x1BE48: 02 75 | ; 0x1BE4B: 01 76 | ; 0x1BE4D: 01 77 | 78 | ; 0x1BE58: 02 79 | ; 0x1BE59: 01 80 | ; 0x1BE5C: 02 81 | ; 0x1BE5D: 01 82 | 83 | ; 0x1BE74: 02 84 | ; 0x1BE77: 01 85 | ; 0x1BE79: 01 86 | ; 0x1BE7C: 02 87 | 88 | ; 0x1BE84: 01 89 | ; 0x1BE87: 02 90 | ; 0x1BE89: 02 91 | ; 0x1BE8C: 01 92 | 93 | ; 0x1BEA8: 01 94 | ; 0x1BEA9: 02 95 | ; 0x1BEAC: 01 96 | ; 0x1BEAD: 02 97 | 98 | ; 0x1BEB4: 01 99 | ; 0x1BEB8: 01 100 | ; 0x1BEBB: 02 101 | ; 0x1BEBD: 02 102 | 103 | ; 0x1BEC8: 02 104 | ; 0x1BEC9: 02 105 | ; 0x1BECC: 01 106 | ; 0x1BECD: 01 107 | 108 | ; 0x1BED5: 01 109 | ; 0x1BED7: 02 110 | ; 0x1BED8: 02 111 | ; 0x1BEDD: 01 112 | 113 | ; 0x1BEE5: 02 114 | ; 0x1BEE9: 02 115 | ; 0x1BEEB: 01 116 | ; 0x1BEEC: 01 117 | 118 | ; EoF -------------------------------------------------------------------------------- /patches/intersectionTransition.asm: -------------------------------------------------------------------------------- 1 | ; Intersection Transition 2 | ; This is the code for a custom intersection transition that 3 | ; allows for 4 transitions on a single screen 4 | ; The syntax is: 5 | ; $E0 6 | ; $AAAA - Index of Right transition 7 | ; $BBBB - Index of Left transition 8 | ; $CCCC - Index of Up transition 9 | ; 10 | ; For down it will just continue the current transition 11 | 12 | 13 | 14 | ; Change 15 | .doorToken_item: 16 | cp $d0 ; ITEM { 17 | jp nz, .nextToken 18 | ; To the following 19 | .doorToken_item: 20 | cp $d0 ; ITEM { 21 | jp nz, .doorToken_intersection 22 | 23 | 24 | 25 | 26 | ; Then above the .nextToken: label insert this code: 27 | 28 | .doorToken_intersection: 29 | cp $E0 ; { You can change this to anything with $EX if needed 30 | jp nz, .nextToken 31 | ; Compare the current scrolling direction 32 | ; 1 Right, 2 Left, 4 Up, 8 Down 33 | ld a, [doorScrollDirection] 34 | cp $1 35 | jr nz, .checkScrollLeft ;check if scrolling right 36 | jr .loadNewTransition 37 | .checkScrollLeft 38 | inc hl 39 | inc hl 40 | cp $2 41 | jr nz, .checkScrollUp ;check if scrolling left 42 | jr .loadNewTransition 43 | .checkScrollUp: ;check if scrolling up 44 | inc hl 45 | inc hl 46 | cp $4 47 | jr nz, .executeScrollDown 48 | jr .loadNewTransition 49 | .executeScrollDown: ;at this point the scrolling has to be down 50 | inc hl 51 | inc hl 52 | inc hl 53 | ; to save on space, we will just continue the standard transition 54 | jr .nextToken 55 | ;} 56 | 57 | ; Subroutine to load new Transition from a Transition index in the next two bytes at HL 58 | .loadNewTransition: 59 | inc HL 60 | ; Load door index 61 | ld a, [hl+] 62 | ld [doorIndexLow], a 63 | ld a, [hl] 64 | ld [doorIndexHigh], a 65 | ; Execute it 66 | jp executeDoorScript -------------------------------------------------------------------------------- /patches/queen pause.md: -------------------------------------------------------------------------------- 1 | Changes to allow pausing during the Metroid Queen fight: 2 | 3 | 1. In Bank 0, remove the following lines to allow pausing: 4 | ``` 5 | tryPausing: ; 00:2C79 6 | ; Don't try pausing unless start is pressed 7 | ldh a, [hInputRisingEdge] 8 | cp PADF_START 9 | ret nz 10 | - ; Exit if in Queen's room 11 | - ld a, [$d08b] 12 | - cp $11 13 | - ret z 14 | ; No pausing if facing the screen 15 | ld a, [samusPose] 16 | cp pose_faceScreen 17 | ret z 18 | ``` 19 | 20 | 2. In Bank 3, add this game mode check to the queen_drawFeet function, to prevent the feet from animating when paused: 21 | ``` 22 | ldh a, [gameMode] 23 | cp $08 24 | ret z 25 | ``` 26 | Putting it after the first if statement works well enough, and allows for the head to finish drawing if a frame was only half-drawn. 27 | 28 | 3. In Bank 3, in the function LCDCInterruptHandler, make this change to allow the palette for the bottom half of the screen to be corrected: 29 | ``` 30 | .case_2: 31 | ld a, [scrollX] 32 | ld [rSCX], a 33 | + ld a, [bg_palette] 34 | - ld a, $93 ; FIXME: Causes palette issues if pausing is enabled 35 | ld [rBGP], a 36 | ; end case 37 | ``` 38 | Note that this comes with the minor side-effect of the palette for the lower half of the screen being updated a frame early. At 60 FPS, this isn't too noticeable, but in the future a more robust solution might be found. -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # Return of Samus Disassembly 2 | 3 | A disassembly of one of my favorite Game Boy games. A first-pass over every function of code has been completed, but there are still plenty of improvements to be made to make the code more intelligible and usable. Feel free to contribute. 4 | 5 | ## Build Instructions 6 | 7 | 1. Install [rgbds](https://github.com/rednex/rgbds#1-installing-rgbds) 8 | 2. Install [Python](https://www.python.org/downloads/) 9 | 3. Either run `make all`, `build.bat`, or `build.py`, depending on your preference. 10 | 4. The assembled game and a [BGB](http://bgb.bircd.org/) compatible `.sym` file will appear in the `out` folder. 11 | 12 | The resultant file should have this hash: `md5: 9639948ad274fa15281f549e5f9c4d87` 13 | 14 | This project uses rgbds v0.9.1 and Python 3.13. Compatibility with other versions of these tools is not guaranteed. 15 | 16 | ## How to Contribute 17 | 18 | 1. Fork this repository (if you please). 19 | 2. Make something better. Perhaps start by doing something like: 20 | - Checking the issue tracker. 21 | - Giving a function or variable a (better) name. 22 | - Properly defining a RAM address (eg. labelName: ds 1). 23 | - Turning a magic number into a constant. 24 | - Turning a raw pointer (eg. $4242) into a proper label (eg. enemyAI_squeek). 25 | - Adding a missing label. 26 | - Adding informative comments. 27 | - etc. 28 | 3. Verify that your changes still result in a byte-for-byte identical game. 29 | 4. Submit a pull request. 30 | 31 | Please refrain from moving any chunk of code into a separate file without first discussing it in the issue tracker. 32 | 33 | If you have questions or comments, please drop by the #metroid-ii channel on the [MetConst Discord](https://discord.gg/xDwaaqa). 34 | 35 | ## Directory Structure 36 | 37 | Subject to change. 38 | 39 | - `docs` - Assorted notes regarding the game's formats and structure 40 | - `out` - Output directory for the build process 41 | - `scripts` - Various scripts to extra data from the game 42 | - `patches` - Basic modifications to improve or change the game. 43 | - `SRC` - Top level source code 44 | - `SRC/data` - General data that hasn't been or can't be categorized elsewhere 45 | - `SRC/gfx` - Generic tile data 46 | - `SRC/maps` - Level data banks, along with the associated enemy data and door scripts 47 | - `SRC/ram` - Definitions/declarations for VRAM, SRAM, WRAM, and HRAM. 48 | - `SRC/tilesets` - Tile graphics, metatile definitions, and collision tables for each tileset 49 | 50 | ## Resources 51 | 52 | - [mgbdis](https://github.com/mattcurrie/mgbdis) - The disassember used to create this project. 53 | - [PJ's Bank Logs](http://patrickjohnston.org/ASM/ROM%20data/RoS/) - A rather extensive, but unbuildable, disassembly of the game. 54 | - [MetConst Wiki](https://wiki.metroidconstruction.com/doku.php?id=return_of_samus) - Some of the information here is outdated. 55 | - [M2 Music Tools](https://github.com/kkzero241/M2MusicTools) - A song extractor written by kkzero. 56 | - [LA DX Disassembly](https://github.com/zladx/LADX-Disassembly) - A disassembly project of another game that also uses rgbds. 57 | 58 | ### Editors 59 | 60 | - [M2Edit](https://m2sw.zophar.net/m2edit/) - Abandoned editor from 2004. Stable, but closed source and lacks enemy and door editing capabilities. 61 | - [ROSE](https://github.com/liamnajor/ROSE) - WIP editor. Web based. 62 | - [LAMP](https://github.com/LAMP-Platform/LAMP) - Feature rich, Windows only, editor with support for this disassembly. 63 | - [2DEd](https://metroidconstruction.com/resource.php?id=730) - Lightweight editor, designed to be used with this disassembly. -------------------------------------------------------------------------------- /scripts/enemy_csv2asm.py: -------------------------------------------------------------------------------- 1 | # Script by Alex W 2 | 3 | import argparse 4 | import csv 5 | 6 | def csv2asm(infile, outdir): 7 | spriteFile = open(outdir+'/enemy_spritePointers.asm', 'w') 8 | headerFile = open(outdir+'/enemy_headerPointers.asm', 'w') 9 | hitboxFile = open(outdir+'/enemy_hitboxPointers.asm', 'w') 10 | damageFile = open(outdir+'/enemy_damageValues.asm', 'w') 11 | constFile = open(outdir+'/enemy_nameConstants.asm', 'w') 12 | 13 | spriteFile.write('; This file was automatically generated from enemies.csv. Please do not edit this directly.\n') 14 | headerFile.write('; This file was automatically generated from enemies.csv. Please do not edit this directly.\n') 15 | hitboxFile.write('; This file was automatically generated from enemies.csv. Please do not edit this directly.\n') 16 | damageFile.write('; This file was automatically generated from enemies.csv. Please do not edit this directly.\n') 17 | constFile.write('; This file was automatically generated from enemies.csv. Please do not edit this directly.\n') 18 | 19 | with open(infile, newline='') as f: 20 | i = 0 21 | reader = csv.reader(f) 22 | for row in reader: 23 | spriteFile.write(' dw '+row[0]+' ; '+row[6]+'\n') 24 | headerFile.write(' dw '+row[1]+' ; '+row[6]+'\n') 25 | hitboxFile.write(' dw '+row[2]+' ; '+row[6]+'\n') 26 | damageFile.write(' db '+row[3]+' ; '+row[6]+'\n') 27 | if row[4] != '': 28 | constFile.write('def '+row[4]+' = ${:02X} ; '.format(i)+row[6]+'\n') 29 | if row[5] != '': 30 | constFile.write('def '+row[5]+' = ${:02X} ; '.format(i)+row[6]+'\n') 31 | i += 1 32 | 33 | 34 | def main(): 35 | ap = argparse.ArgumentParser() 36 | ap.add_argument('-i','--infile', default='enemies.csv', help='Input CSV file') 37 | ap.add_argument('-o','--outdir', default='.', help='Output directory for the asm files') 38 | args = ap.parse_args() 39 | 40 | csv2asm(args.infile, args.outdir) 41 | 42 | 43 | if __name__ == "__main__": 44 | main() 45 | -------------------------------------------------------------------------------- /scripts/extract_chr.py: -------------------------------------------------------------------------------- 1 | # Script by Alex W 2 | # Thanks to PJ for the lambda functions 3 | 4 | # Tool for extracting chr data into a binary file 5 | 6 | gb2hex = lambda gb: gb >> 2 & ~0x3FFF | gb & 0x3FFF 7 | hex2gb = lambda hex: hex << 2 & ~0xFFFF | hex & 0x3FFF | 0x4000 8 | romRead = lambda n: sum([ord(rom.read(1)) << i*8 for i in range(n)]) 9 | readLongPointer = lambda: (romRead(1) << 16) | romRead(2) 10 | 11 | def write_chr(entry): 12 | rom.seek(gb2hex(entry[0])) 13 | chr = rom.read(entry[2]) 14 | with open("../out/chr/"+entry[1]+".chr", "wb") as f: 15 | f.write(chr) 16 | 17 | gfx_list = [ 18 | [0x055f34, "titleScreen" ,0xA00], 19 | [0x056934, "creditsFont" ,0x300], 20 | [0x056c34, "itemFont" ,0x200], 21 | [0x056e34, "creditsNumbers" ,0x100], 22 | [0x056f34, "creditsSprTiles",0xF00], 23 | [0x057e34, "theEnd" ,0x100], 24 | 25 | [0x064000, "cannonBeam" ,0x20 ], 26 | [0x064020, "cannonMissile" ,0x20 ], 27 | [0x064040, "beamIce" ,0x20 ], 28 | [0x064060, "beamWave" ,0x20 ], 29 | [0x064080, "beamSpazerPlasma" ,0x20 ], 30 | [0x0640a0, "spinSpaceTop" ,0x70 ], 31 | [0x064110, "spinSpaceBottom" ,0x50 ], 32 | [0x064160, "spinScrewTop" ,0x70 ], 33 | [0x0641d0, "spinScrewBottom" ,0x50 ], 34 | [0x064220, "spinSpaceScrewTop" ,0x70 ], 35 | [0x064290, "spinSpaceScrewBottom",0x50 ], 36 | [0x0642e0, "springBallTop" ,0x20 ], 37 | [0x064300, "springBallBottom" ,0x20 ], 38 | [0x064320, "samusPowerSuit" ,0xB00], 39 | [0x064e20, "samusVariaSuit" ,0xB00], 40 | [0x065920, "enemiesA" ,0x400], 41 | [0x065d20, "enemiesB" ,0x400], 42 | [0x066120, "enemiesC" ,0x400], 43 | [0x066520, "enemiesD" ,0x400], 44 | [0x066920, "enemiesE" ,0x400], 45 | [0x066d20, "enemiesF" ,0x400], 46 | [0x067120, "arachnus" ,0x400], 47 | [0x067520, "surfaceSPR" ,0x400], 48 | 49 | [0x074000, "plantBubbles", 0x800], 50 | [0x074800, "ruinsInside", 0x800], 51 | [0x075000, "queenBG", 0x800], 52 | [0x075800, "caveFirst", 0x800], 53 | [0x076000, "surfaceBG", 0x800], 54 | [0x076800, "lavaCavesA", 0x530], 55 | [0x076d30, "lavaCavesB", 0x530], 56 | [0x077260, "lavaCavesC", 0x530], 57 | [0x077790, "items", 0x2C0 ], 58 | [0x077a50, "itemOrb", 0x40 ], 59 | [0x077a90, "commonItems", 0x100 ], 60 | 61 | [0x0859bc, "metAlpha", 0x400], 62 | [0x085dbc, "metGamma", 0x400], 63 | [0x0861bc, "metZeta", 0x400], 64 | [0x0865bc, "metOmega", 0x400], 65 | [0x0869bc, "ruinsExt", 0x800], 66 | [0x0871bc, "finalLab", 0x800], 67 | [0x0879bc, "queenSPR", 0x500], 68 | ] 69 | 70 | rom = open("../Metroid2.gb", "rb") 71 | 72 | for thing in gfx_list: 73 | write_chr(thing) 74 | 75 | # EoF -------------------------------------------------------------------------------- /scripts/extract_credits.py: -------------------------------------------------------------------------------- 1 | # Script by Alex W 2 | # Thanks to PJ for the lambda functions 3 | 4 | gb2hex = lambda gb: gb >> 2 & ~0x3FFF | gb & 0x3FFF 5 | hex2gb = lambda hex: hex << 2 & ~0xFFFF | hex & 0x3FFF | 0x4000 6 | romRead = lambda n: sum([ord(rom.read(1)) << i*8 for i in range(n)]) 7 | readLongPointer = lambda: (romRead(1) << 16) | romRead(2) 8 | 9 | rom = open("../Metroid2.gb", "rb") 10 | creditsBegin = gb2hex(0x067920) 11 | 12 | rom.seek(creditsBegin) 13 | temp = romRead(1) 14 | 15 | print(" db \"", end="") 16 | while temp != 0xF0: 17 | if temp == 0xF1: # Newline 18 | print("\\n\"\n db \"", end="") 19 | elif temp == 0x5E: # Dashes aren't ^s 20 | print("-", end="") 21 | elif temp == 0x1B: # Colon for time 22 | print(":", end="") 23 | elif (temp > 0x20) & (temp < 0x30): # For the "The End" tilemap 24 | print("\",", end="") 25 | while (temp > 0x20) & (temp < 0x30): 26 | print("${:02X},".format(temp), end="") 27 | temp = romRead(1) 28 | print("\"", end="") 29 | rom.seek(rom.tell()-1) # Undo the previous read (because we don't have goto) 30 | else: 31 | print(bytearray.fromhex("{:X}".format(temp)).decode(), end="") 32 | 33 | temp = romRead(1) 34 | 35 | print("\"") 36 | 37 | -------------------------------------------------------------------------------- /scripts/extract_data.py: -------------------------------------------------------------------------------- 1 | # Script by Alex W 2 | # Thanks to PJ for the lambda functions 3 | 4 | import argparse 5 | 6 | # Tool for extracting generic tables of bytes and words from a binary file 7 | 8 | gb2hex = lambda gb: gb >> 2 & ~0x3FFF | gb & 0x3FFF 9 | hex2gb = lambda hex: hex << 2 & ~0xFFFF | hex & 0x3FFF | (0x4000 if (hex >= 0x4000) else 0) 10 | romRead = lambda n: sum([ord(rom.read(1)) << i*8 for i in range(n)]) 11 | readLongPointer = lambda: (romRead(1) << 16) | romRead(2) 12 | 13 | def printBytes(numBytes, perRow): 14 | for x in range(0, numBytes): 15 | if (x % perRow) == 0: 16 | print("\n db ", end="") 17 | print("${:02X}".format(romRead(1)), end="") 18 | if (((x+1) % perRow) != 0) & (x != numBytes-1): 19 | print(", ", end="") 20 | print("\n") 21 | 22 | def printWords(numWords, perRow): 23 | for x in range(0, numWords): 24 | if (x % perRow) == 0: 25 | print("\n dw ", end="") 26 | print("${:04X}".format(romRead(2)), end="") 27 | if (((x+1) % perRow) != 0) & (x != numWords-1): 28 | print(", ", end="") 29 | print("\n") 30 | 31 | rom = open("../Metroid2.gb", "rb") 32 | 33 | def main(): 34 | ap = argparse.ArgumentParser() 35 | ap.add_argument('-a', '--addrmode', choices=['g', 'h'], help='use GB bank addresses or hex rom offsets') 36 | ap.add_argument('-o', '--outmode', choices=['b', 'w']) 37 | ap.add_argument('-l', '--length', type=int, help='number of bytes/words to print') 38 | ap.add_argument('-w', '--width', type=int, default=16, help='width of output columns (default 16)') 39 | ap.add_argument('source', help='source address in hex') 40 | 41 | args = ap.parse_args() 42 | 43 | args.source = int(args.source, 16) 44 | 45 | if (args.addrmode == None) | (args.addrmode == "g"): 46 | source = gb2hex(args.source) 47 | 48 | rom.seek(source) 49 | 50 | print("; Data: {:06X}".format( hex2gb(rom.tell()) ) ) 51 | if (args.outmode == None) | (args.outmode == 'b'): 52 | printBytes(args.length, args.width) 53 | elif args.outmode == 'w': 54 | printWords(args.length, args.width) 55 | print("; End Data: {:06X}".format( hex2gb(rom.tell()) ) ) 56 | 57 | 58 | if __name__ == "__main__": 59 | main() 60 | 61 | -------------------------------------------------------------------------------- /scripts/extract_doors.py: -------------------------------------------------------------------------------- 1 | # Script adapted from: 2 | # http://patrickjohnston.org/ASM/ROM%20data/RoS/print%20update%20commands.py 3 | 4 | gb2hex = lambda gb: gb >> 2 & ~0x3FFF | gb & 0x3FFF 5 | hex2gb = lambda hex: hex << 2 & ~0xFFFF | hex & 0x3FFF | 0x4000 6 | romRead = lambda n: sum([ord(rom.read(1)) << i*8 for i in range(n)]) 7 | readLongPointer = lambda: (romRead(1) << 16) | romRead(2) 8 | 9 | pointerDict = { #Source Pointers (GB Bank Format) 10 | 0x065920: "gfx_enemiesA", 11 | 0x065D20: "gfx_enemiesB", 12 | 0x066120: "gfx_enemiesC", 13 | 0x066520: "gfx_enemiesD", 14 | 0x066920: "gfx_enemiesE", 15 | 0x066D20: "gfx_enemiesF", 16 | 0x067120: "gfx_arachnus", 17 | 0x067520: "gfx_surfaceSPR", 18 | 0x074000: "gfx_plantBubbles", 19 | 0x074800: "gfx_ruinsInside", 20 | 0x075000: "gfx_queenBG", 21 | 0x075800: "gfx_caveFirst", 22 | 0x076000: "gfx_surfaceBG", 23 | 0x076800: "gfx_lavaCavesA", 24 | 0x076D30: "gfx_lavaCavesB", 25 | 0x077260: "gfx_lavaCavesC", 26 | 0x077A90: "gfx_commonItems", 27 | 0x084000: "bg_queenHead.row1", 28 | 0x084020: "bg_queenHead.row2", 29 | 0x084040: "bg_queenHead.row3", 30 | 0x084060: "bg_queenHead.row4", 31 | 0x0859BC: "gfx_metAlpha", 32 | 0x085DBC: "gfx_metGamma", 33 | 0x0861BC: "gfx_metZeta", 34 | 0x0865BC: "gfx_metOmega", 35 | 0x0869BC: "gfx_ruinsExt", 36 | 0x0871BC: "gfx_finalLab", 37 | 0x0879BC: "gfx_queenSPR", 38 | 39 | # Destination Pointers 40 | 0x8B00: "vramDest_enemies", 41 | 0x8F00: "vramDest_commonItems", 42 | 0x9C00: "_SCRN1", 43 | 0x9C20: "(_SCRN1+$20)", 44 | 0x9C40: "(_SCRN1+$40)", 45 | 0x9C60: "(_SCRN1+$60)" 46 | } 47 | 48 | rom = open("../Metroid2.gb", "rb") 49 | doorPointersBegin = gb2hex(0x0542E5) 50 | doorDataBegin = gb2hex(0x0546E5) 51 | end = gb2hex(0x0555A3) 52 | freespace = gb2hex(0x057F34) 53 | 54 | doorPointers = [] 55 | #Read doors and give each a name 56 | rom.seek(doorPointersBegin) 57 | i = 0 58 | while rom.tell() < doorDataBegin: 59 | temp = gb2hex(0x050000+romRead(2)) 60 | doorPointers.append( (temp, "door{:03X}".format(i)) ) 61 | i += 1 62 | 63 | #Write the doorPointerTable with label names 64 | i = 0 65 | #print(" dw ", end="") 66 | for d in doorPointers: 67 | if(i%16 == 0): 68 | print("\n dw ", end="") 69 | else: 70 | print(", ", end="") 71 | 72 | if d[0] == freespace: 73 | print("bank5_freespace", end="") 74 | else: 75 | print(d[1], end="") 76 | i += 1 77 | print("\n") 78 | 79 | #Read the transition data 80 | srcPointerSet = set([]) 81 | destPointerSet = set([]) 82 | 83 | rom.seek(doorDataBegin) 84 | door = 0 85 | while rom.tell() < end: 86 | #print("ROM{:X}:{:X} dx ".format(hex2gb(rom.tell()) >> 16, hex2gb(rom.tell()) & 0xFFFF), end="") 87 | #print("DoorNum{:03X}:".format(door)) 88 | for d in doorPointers: 89 | if rom.tell() == d[0]: 90 | print(d[1]+":") 91 | 92 | type = romRead(1) 93 | while type != 0xFF: 94 | if type >> 4 == 0x0: 95 | srcPointer = readLongPointer() 96 | srcPointerSet.add(srcPointer) 97 | 98 | destPointer = romRead(2) 99 | destPointerSet.add(destPointer) 100 | 101 | moveLength = romRead(2) 102 | if type == 0x01: 103 | print(" COPY_BG {0}, {1}, ${2:04X}".format(pointerDict[srcPointer], pointerDict[destPointer], moveLength)) 104 | #print(" COPY_BG {0:06X}, {1:04X}, {2:04X}".format(srcPointer, destPointer, moveLength)) 105 | elif type == 0x02: 106 | print(" COPY_SPR {0}, {1}, ${2:04X}".format(pointerDict[srcPointer], pointerDict[destPointer], moveLength)) 107 | #print(" COPY_SPR {0:06X}, {1:04X}, {2:04X}".format(srcPointer, destPointer, moveLength)) 108 | else: 109 | print(" COPY_DATA {0}, {1}, ${2:04X}".format(pointerDict[srcPointer], pointerDict[destPointer], moveLength)) 110 | #print(" COPY_DATA {0:06X}, {1:04X}, {2:04X}".format(srcPointer, destPointer, moveLength)) 111 | #print(" BLOCK_COPY {0:02X},{1:02X}:{3:02X}{2:02X},{5:02X}{4:02X},{7:02X}{6:02X}".format(type, ord(rom.read(1)), ord(rom.read(1)), ord(rom.read(1)), ord(rom.read(1)), ord(rom.read(1)), ord(rom.read(1)), ord(rom.read(1)))) 112 | 113 | elif type >> 4 == 0x1: 114 | tiletable = type&0x0F 115 | print(" TILETABLE ${:X}".format(tiletable)) 116 | 117 | elif type >> 4 == 0x2: 118 | collisionTable = type&0x0F 119 | print(" COLLISION ${:X}".format(collisionTable)) 120 | 121 | elif type >> 4 == 0x3: 122 | solidityTable = type&0x0F 123 | print(" SOLIDITY ${:X}".format(solidityTable)) 124 | 125 | elif type >> 4 == 0x4: 126 | warpBank = type&0x0F 127 | temp = romRead(1) 128 | warpY = temp >> 4 129 | warpX = temp&0x0F 130 | #print(" WARP {:X}, {:X},{:X}".format(warpBank, warpY, warpX)) 131 | print(" WARP ${:X}, ${:X}".format(warpBank, temp)) 132 | 133 | elif type >> 4 == 0x5: 134 | print(" ESCAPE_QUEEN") 135 | 136 | elif type >> 4 == 0x6: 137 | damageAcid = romRead(1) 138 | damageSpike = romRead(1) 139 | print(" DAMAGE ${:02X}, ${:02X}".format(damageAcid, damageSpike)) 140 | 141 | elif type >> 4 == 0x7: 142 | print(" EXIT_QUEEN") 143 | 144 | elif type >> 4 == 0x8: 145 | enterBank = type&0x0F 146 | scrollY = romRead(2) 147 | scrollX = romRead(2) 148 | samusY = romRead(2) 149 | samusX = romRead(2) 150 | print(" ENTER_QUEEN ${0:X}, ${1:04X}, ${2:04X}, ${3:04X}, ${4:04X}".format(enterBank, scrollY, scrollX, samusY, samusX)) 151 | 152 | elif type >> 4 == 0x9: 153 | metNum = romRead(1) 154 | transIndex = romRead(2) 155 | print(" IF_MET_LESS ${0:02X}, ${1:04X}".format(metNum, transIndex)) 156 | 157 | elif type >> 4 == 0xA: 158 | print(" FADEOUT") 159 | 160 | elif type >> 4 == 0xB: 161 | srcPointer = readLongPointer() 162 | srcPointerSet.add(srcPointer) 163 | 164 | if type == 0xB1: 165 | print(" LOAD_BG {:}".format(pointerDict[srcPointer])) 166 | #print(" LOAD_BG {0:06X}".format(srcPointer)) 167 | elif type == 0xB2: 168 | print(" LOAD_SPR {:}".format(pointerDict[srcPointer])) 169 | #print(" LOAD_SPR {0:06X}".format(srcPointer)) 170 | else: 171 | print(" UNKNOWN_LOAD {:}".format(pointerDict[srcPointer])) 172 | 173 | elif type >> 4 == 0xC: 174 | songIndex = type&0x0F 175 | print(" SONG ${:X}".format(songIndex)) 176 | 177 | elif type >> 4 == 0xD: 178 | itemIndex = type&0x0F 179 | print(" ITEM ${:X}".format(itemIndex)) 180 | 181 | elif type >> 4 == 0xE: 182 | print(" INVALID ${:X}".format(type)) 183 | type = ord(rom.read(1)) 184 | print(" END_DOOR\n") 185 | door += 1 186 | 187 | for d in doorPointers: 188 | if rom.tell() == d[0]: 189 | print(d[1]+":") 190 | 191 | ''' 192 | print("Source Pointers:") 193 | for ptr in srcPointerSet: 194 | print("{:06X}".format( gb2hex(ptr) )) 195 | print("Destination Pointers:") 196 | for ptr in destPointerSet: 197 | print("{:04X}".format(ptr)) 198 | ''' -------------------------------------------------------------------------------- /scripts/extract_enHeaders.py: -------------------------------------------------------------------------------- 1 | # Script by Alex W 2 | # Thanks to PJ for the lambda functions 3 | 4 | gb2hex = lambda gb: gb >> 2 & ~0x3FFF | gb & 0x3FFF 5 | hex2gb = lambda hex: hex << 2 & ~0xFFFF | hex & 0x3FFF | 0x4000 6 | romRead = lambda n: sum([ord(rom.read(1)) << i*8 for i in range(n)]) 7 | readLongPointer = lambda: (romRead(1) << 16) | romRead(2) 8 | 9 | rom = open("../Metroid2.gb", "rb") 10 | 11 | pointersBegin = gb2hex(0x036300) 12 | numPointers = 255 13 | perRow = 16 14 | headersBegin = gb2hex(0x0364FE) 15 | headersEnd = gb2hex(0x03673A) 16 | 17 | rom.seek(pointersBegin) 18 | for x in range(0, numPointers): 19 | if (x % perRow) == 0: 20 | print("\n dw ", end="") 21 | print("en{:04X}".format(romRead(2)), end="") 22 | if (((x+1) % perRow) != 0) & (x != numPointers-1): 23 | print(", ", end="") 24 | print("\n") 25 | 26 | rom.seek(headersBegin) 27 | while rom.tell() < headersEnd: 28 | print("en{:04X}:\n db ".format(rom.tell()-0x8000), end="") 29 | print("${:02X},".format(romRead(1)), end="") 30 | print("${:02X},".format(romRead(1)), end="") 31 | print("${:02X},".format(romRead(1)), end="") 32 | print("${:02X},".format(romRead(1)), end="") 33 | print("${:02X},".format(romRead(1)), end="") 34 | print("${:02X},".format(romRead(1)), end="") 35 | print("${:02X},".format(romRead(1)), end="") 36 | print("${:02X},".format(romRead(1)), end="") 37 | print("${:02X}".format(romRead(1))) 38 | print(" dw ${:04X}".format(romRead(2))) 39 | 40 | -------------------------------------------------------------------------------- /scripts/extract_enHitboxes.py: -------------------------------------------------------------------------------- 1 | # Script by Alex W 2 | # Thanks to PJ for the lambda functions 3 | 4 | gb2hex = lambda gb: gb >> 2 & ~0x3FFF | gb & 0x3FFF 5 | hex2gb = lambda hex: hex << 2 & ~0xFFFF | hex & 0x3FFF | 0x4000 6 | romRead = lambda n: sum([ord(rom.read(1)) << i*8 for i in range(n)]) 7 | readLongPointer = lambda: (romRead(1) << 16) | romRead(2) 8 | 9 | rom = open("../Metroid2.gb", "rb") 10 | 11 | pointersBegin = gb2hex(0x036839) 12 | numPointers = 255 13 | perRow = 16 14 | hitboxesBegin = gb2hex(0x036A37) 15 | hitboxesEnd = gb2hex(0x036AE7) 16 | 17 | rom.seek(pointersBegin) 18 | for x in range(0, numPointers): 19 | if (x % perRow) == 0: 20 | print("\n dw ", end="") 21 | print("hitbox{:04X}".format(romRead(2)), end="") 22 | if (((x+1) % perRow) != 0) & (x != numPointers-1): 23 | print(", ", end="") 24 | print("\n") 25 | 26 | rom.seek(hitboxesBegin) 27 | while rom.tell() < hitboxesEnd: 28 | print("hitbox{:04X}: db".format(rom.tell()-0x8000), end="") 29 | 30 | # I just futzed with the rjust() values until the output looked good, okay? 31 | print("{:},".format(int.from_bytes(rom.read(1), byteorder='little', signed=True)).rjust(5), end="") 32 | print("{:},".format(int.from_bytes(rom.read(1), byteorder='little', signed=True)).rjust(4), end="") 33 | print("{:},".format(int.from_bytes(rom.read(1), byteorder='little', signed=True)).rjust(5), end="") 34 | print("{:}".format(int.from_bytes(rom.read(1), byteorder='little', signed=True)).rjust(3)) 35 | -------------------------------------------------------------------------------- /scripts/extract_enemyData.py: -------------------------------------------------------------------------------- 1 | # Script by Alex W 2 | # Thanks to PJ for the lambda functions 3 | 4 | gb2hex = lambda gb: gb >> 2 & ~0x3FFF | gb & 0x3FFF 5 | hex2gb = lambda hex: hex << 2 & ~0xFFFF | hex & 0x3FFF | 0x4000 6 | romRead = lambda n: sum([ord(rom.read(1)) << i*8 for i in range(n)]) 7 | readLongPointer = lambda: (romRead(1) << 16) | romRead(2) 8 | 9 | rom = open("../Metroid2.gb", "rb") 10 | enemyPointersBegin = gb2hex(0x0342E0) 11 | enemyDataBegin = gb2hex(0x0350E0) 12 | end = gb2hex(0x036244) 13 | 14 | #Read enemy pointers and give each a name 15 | enemyPointers = [] 16 | rom.seek(enemyPointersBegin) 17 | bank = 9 18 | x = 0 19 | y = 0 20 | while rom.tell() < enemyDataBegin: 21 | temp = gb2hex(0x030000+romRead(2)) 22 | enemyPointers.append( (temp, "enemyBank{:X}_{:X}{:X}".format(bank,y,x), bank) ) 23 | x += 1 24 | if x == 0x10: 25 | x = 0 26 | y += 1 27 | if y == 0x10: 28 | y = 0 29 | bank += 1 30 | 31 | #Write the enemyPointerTable with label names 32 | i = 0 33 | bank = 9 34 | lastBank = 0 35 | for d in enemyPointers: 36 | bank = d[2] 37 | if(bank != lastBank): 38 | print("\n\n; Enemy Data Pointers for Bank {:X}".format(bank), end="") 39 | 40 | if(i%16 == 0): 41 | print("\n dw ", end="") 42 | else: 43 | print(", ", end="") 44 | 45 | lastBank = bank 46 | print(d[1], end="") 47 | i += 1 48 | print("\n") 49 | 50 | # Read the enemy data 51 | print("\n\n; Enemy Data for Banks 9-F") 52 | rom.seek(enemyDataBegin) 53 | enemy = 0 54 | while rom.tell() < end: 55 | 56 | for d in enemyPointers: 57 | if rom.tell() == d[0]: 58 | print(d[1]+": db ", end="") 59 | 60 | number = romRead(1) 61 | while number != 0xFF: 62 | print("${:02X},".format(number), end="") 63 | 64 | type = romRead(1) 65 | print("${:02X},".format(type), end="") 66 | 67 | xPos = romRead(1) 68 | print("${:02X},".format(xPos), end="") 69 | 70 | yPos = romRead(1) 71 | print("${:02X}, ".format(yPos), end="") 72 | 73 | number = romRead(1) 74 | 75 | print("$FF") 76 | enemy += 1 77 | 78 | # EoF -------------------------------------------------------------------------------- /scripts/extract_itemNames.py: -------------------------------------------------------------------------------- 1 | # Script by Alex W 2 | # Thanks to PJ for the lambda functions 3 | 4 | gb2hex = lambda gb: gb >> 2 & ~0x3FFF | gb & 0x3FFF 5 | hex2gb = lambda hex: hex << 2 & ~0xFFFF | hex & 0x3FFF | 0x4000 6 | romRead = lambda n: sum([ord(rom.read(1)) << i*8 for i in range(n)]) 7 | readLongPointer = lambda: (romRead(1) << 16) | romRead(2) 8 | 9 | rom = open("../Metroid2.gb", "rb") 10 | namesBegin = gb2hex(0x015911) 11 | 12 | rom.seek(namesBegin) 13 | 14 | print("; Item Names and Messages - 01:5911\n") 15 | 16 | # Print pointers 17 | for itemNum in range(0,16): 18 | print(" dw itemName_{:02X}".format(itemNum)) 19 | print("") 20 | 21 | # Print charmap 22 | print("NEWCHARMAP itemNames") 23 | for x in range(0, 26): 24 | # Apologies for this one-liner 25 | print("CHARMAP \"{0}\", ${1:02X}".format( bytearray.fromhex( "{:X}".format(x+0x41) ).decode() , x+0xC0)) 26 | 27 | print("CHARMAP \"<\", $DE") 28 | print("CHARMAP \">\", $DF") 29 | print("CHARMAP \" \", $FF") 30 | print("") 31 | 32 | # Print Item names with labels 33 | for itemNum in range(0,16): 34 | print("itemName_{:02X}: db \"".format(itemNum), end="") 35 | for charNum in range(0,16): 36 | temp = romRead(1) 37 | if temp == 0xFF: 38 | print(" ", end="") 39 | elif temp == 0xDE: 40 | print("<", end="") 41 | elif temp == 0xDF: 42 | print(">", end="") 43 | else: 44 | print(bytearray.fromhex("{:X}".format(temp-(0xC0-0x41))).decode(), end="") 45 | print("\"") 46 | 47 | print("\n; End of item names") 48 | 49 | -------------------------------------------------------------------------------- /scripts/extract_metasprites.py: -------------------------------------------------------------------------------- 1 | # Script by Alex W 2 | # Thanks to PJ for the lambda functions 3 | 4 | gb2hex = lambda gb: gb >> 2 & ~0x3FFF | gb & 0x3FFF 5 | hex2gb = lambda hex: hex << 2 & ~0xFFFF | hex & 0x3FFF | 0x4000 6 | romRead = lambda n: sum([ord(rom.read(1)) << i*8 for i in range(n)]) 7 | readLongPointer = lambda: (romRead(1) << 16) | romRead(2) 8 | 9 | rom = open("../Metroid2.gb", "rb") 10 | 11 | spriteSet = 3 12 | 13 | if spriteSet == 1: 14 | spritePointersBegin = gb2hex(0x014000) 15 | spriteDataBegin = gb2hex(0x01408A) 16 | end = gb2hex(0x01493E) 17 | elif spriteSet == 2: 18 | spritePointersBegin = gb2hex(0x015AB1) 19 | spriteDataBegin = gb2hex(0x015CAF) 20 | end = gb2hex(0x0170BA) 21 | elif spriteSet == 3: 22 | spritePointersBegin = gb2hex(0x01744A) 23 | spriteDataBegin = gb2hex(0x017496) 24 | end = gb2hex(0x0179EF) 25 | 26 | #Add each pointer to a set, and print it 27 | rom.seek(spritePointersBegin) 28 | print("; Sprite Pointers\n") 29 | spritePointers = set([]) 30 | i = 0 31 | while rom.tell() < spriteDataBegin: 32 | gbAddr = romRead(2) 33 | spritePointers.add(gbAddr) 34 | print(" dw sprite{:04X} ; ${:02X}".format(gbAddr, i)) 35 | i += 1 36 | 37 | # Read the sprite data 38 | print("\n\n; Metasprite Data:") 39 | rom.seek(spriteDataBegin) 40 | sprite = 0 41 | while rom.tell() < end: 42 | tempPointer = hex2gb(rom.tell()) & 0xFFFF 43 | if tempPointer in spritePointers: 44 | print("sprite{:04X}:".format(tempPointer)) 45 | else: 46 | print("; 01:{:04X} - Unreferenced sprite".format(tempPointer)) 47 | 48 | yPos = rom.read(1) 49 | while ord(yPos) != 0xFF: 50 | print(" db ", end="") 51 | print("{:},".format(int.from_bytes(yPos, byteorder='little', signed=True)).rjust(4), end="") 52 | 53 | xPos = rom.read(1) 54 | print("{:},".format(int.from_bytes(xPos, byteorder='little', signed=True)).rjust(4), end="") 55 | 56 | tile = romRead(1) 57 | print(" ${:02X}, ".format(tile), end="") 58 | 59 | attr = romRead(1) 60 | print("${:02X}".format(attr)) 61 | 62 | yPos = rom.read(1) 63 | 64 | print(" db $FF") 65 | sprite += 1 66 | 67 | ''' 68 | # EoF 69 | ''' -------------------------------------------------------------------------------- /scripts/samus_csv2asm.py: -------------------------------------------------------------------------------- 1 | # Script by Alex W 2 | 3 | import argparse 4 | import csv 5 | 6 | autoWarning = '; This file was automatically generated from samus.csv. Please edit that file instead of this one.\n' 7 | 8 | def csv2asm(infile, outdir): 9 | # All of these strings must correlate to column headings 10 | # Words 11 | wordLists = [ 'poseJumpTable', 12 | 'drawJumpTable' 13 | ] 14 | # Bytes 15 | byteLists = [ 'bombPoseTransitionTable', 16 | 'bombedFallingPoseTransitionTable', 17 | 'damagePoseTransitionTable', 18 | 'bgHitboxTop', 19 | 'spriteHitboxTopTable', 20 | 'blockReformHeightTable', 21 | 'cannonYOffsetByPose', 22 | 'possibleShotDirections' 23 | ] 24 | # Horizontal Collision Y-Offsets 25 | offsetLists = [ 'horizontalYOffsetA', 26 | 'horizontalYOffsetB', 27 | 'horizontalYOffsetC', 28 | 'horizontalYOffsetD', 29 | 'horizontalYOffsetE', 30 | 'horizontalYOffsetF', 31 | 'horizontalYOffsetG', 32 | 'horizontalYOffsetH'] 33 | 34 | # Open File 35 | f = open(infile) 36 | csvReader = csv.DictReader(f) 37 | 38 | # Initialize Tables 39 | listDictionary = {} 40 | poseComments = [] 41 | poseConstants = [] 42 | for wordType in wordLists: 43 | listDictionary[wordType] = [] 44 | for byteType in byteLists: 45 | listDictionary[byteType] = [] 46 | for offsetType in offsetLists: 47 | listDictionary[offsetType] = [] 48 | 49 | # Read Rows 50 | for row in csvReader: 51 | poseComments.append(row['poseComments']) 52 | poseConstants.append(row['poseConstants']) 53 | for wordType in wordLists: 54 | listDictionary[wordType].append(row[wordType]) 55 | for byteType in byteLists: 56 | listDictionary[byteType].append(row[byteType]) 57 | for offsetType in offsetLists: 58 | listDictionary[offsetType].append(row[offsetType]) 59 | 60 | # Transpose Y Offset Lists 61 | offsetListsList = [] 62 | for oneList in offsetLists: 63 | offsetListsList.append(listDictionary[oneList]) 64 | transposedOffsets = [[row[i] for row in offsetListsList] for i in range(len(offsetListsList[0]))] 65 | 66 | # Write Lists to Separate ASM files 67 | writeConstantsToAsm(outdir, poseConstants, 'poseConstants', poseComments) 68 | for wordType in wordLists: 69 | writeWordTableToAsm(outdir, listDictionary[wordType], wordType, poseComments) 70 | for byteType in byteLists: 71 | writeByteTableToAsm(outdir, listDictionary[byteType], byteType, poseComments) 72 | writeOffsetTableToAsm(outdir, transposedOffsets, 'horizontalYOffsets', poseComments) 73 | 74 | 75 | def writeConstantsToAsm(outdir, table, fileName, comments): 76 | outFile = open(outdir+'/samus_'+fileName+'.asm', 'w') 77 | outFile.write(autoWarning) 78 | 79 | i = 0 80 | for item in table: 81 | if (item != ''): 82 | outFile.write('def '+item+' = ${:02X} ; '.format(i)+comments[i]+'\n') 83 | i += 1 84 | 85 | outFile.close() 86 | 87 | def writeWordTableToAsm(outdir, table, fileName, comments): 88 | outFile = open(outdir+'/samus_'+fileName+'.asm', 'w') 89 | outFile.write(autoWarning) 90 | 91 | i = 0 92 | for item in table: 93 | if (item != ''): 94 | outFile.write(' dw '+item+' ; ${:02X} - '.format(i)+comments[i]+'\n') 95 | i += 1 96 | 97 | outFile.close() 98 | 99 | def writeByteTableToAsm(outdir, table, fileName, comments): 100 | outFile = open(outdir+'/samus_'+fileName+'.asm', 'w') 101 | outFile.write(autoWarning) 102 | 103 | i = 0 104 | for item in table: 105 | if (item != ''): 106 | outFile.write(' db '+item+' ; ${:02X} - '.format(i)+comments[i]+'\n') 107 | i += 1 108 | 109 | outFile.close() 110 | 111 | def writeOffsetTableToAsm(outdir, table, fileName, comments): 112 | outFile = open(outdir+'/samus_'+fileName+'.asm', 'w') 113 | outFile.write(autoWarning) 114 | 115 | i = 0 116 | for row in table: 117 | outFile.write(' db '+', '.join(row)+' ; ${:02X} - '.format(i)+comments[i]+'\n') 118 | i += 1 119 | 120 | outFile.close() 121 | 122 | def main(): 123 | ap = argparse.ArgumentParser() 124 | ap.add_argument('-i','--infile', default='samus.csv', help='Input CSV file') 125 | ap.add_argument('-o','--outdir', default='.', help='Output directory for the asm files') 126 | args = ap.parse_args() 127 | 128 | csv2asm(args.infile, args.outdir) 129 | 130 | if __name__ == "__main__": 131 | main() 132 | --------------------------------------------------------------------------------