mirror of
https://github.com/pret/pokered.git
synced 2024-10-23 06:58:24 +00:00
4452acb021
swap LEFT and RIGHT FACE is better named STAY because sprites that have no range do not necessarily face any direction STAY has been renamed to NONE because sprites that use this will spin randomly, except for the item/voltorb/electrode sprite I never should have listened to https://github.com/iimarckus/pokered/issues/89
623 lines
9.9 KiB
NASM
623 lines
9.9 KiB
NASM
|
|
text EQUS "db $00," ; Start writing text.
|
|
next EQUS "db $4e," ; Move a line down.
|
|
line EQUS "db $4f," ; Start writing at the bottom line.
|
|
para EQUS "db $51," ; Start a new paragraph.
|
|
cont EQUS "db $55," ; Scroll to the next line.
|
|
done EQUS "db $57" ; End a text box.
|
|
prompt EQUS "db $58" ; Prompt the player to end a text box (initiating some other event).
|
|
|
|
page EQUS "db $49," ; Start a new Pokedex page.
|
|
dex EQUS "db $5f, $50" ; End a Pokedex entry.
|
|
|
|
|
|
percent EQUS "* $ff / 100"
|
|
|
|
lb: MACRO ; r, hi, lo
|
|
ld \1, (\2) << 8 + (\3)
|
|
ENDM
|
|
|
|
|
|
; Constant enumeration is useful for monsters, items, moves, etc.
|
|
const_def: MACRO
|
|
const_value = 0
|
|
ENDM
|
|
|
|
const: MACRO
|
|
\1 EQU const_value
|
|
const_value = const_value + 1
|
|
ENDM
|
|
|
|
|
|
homecall: MACRO
|
|
ld a, [H_LOADEDROMBANK]
|
|
push af
|
|
ld a, BANK(\1)
|
|
ld [H_LOADEDROMBANK], a
|
|
ld [MBC1RomBank], a
|
|
call \1
|
|
pop af
|
|
ld [H_LOADEDROMBANK], a
|
|
ld [MBC1RomBank], a
|
|
ENDM
|
|
|
|
callba: MACRO
|
|
ld b, BANK(\1)
|
|
ld hl, \1
|
|
call Bankswitch
|
|
ENDM
|
|
|
|
callab: MACRO
|
|
ld hl, \1
|
|
ld b, BANK(\1)
|
|
call Bankswitch
|
|
ENDM
|
|
|
|
bcd2: MACRO
|
|
dn ((\1) / 1000) % 10, ((\1) / 100) % 10
|
|
dn ((\1) / 10) % 10, (\1) % 10
|
|
ENDM
|
|
|
|
bcd3: MACRO
|
|
dn ((\1) / 100000) % 10, ((\1) / 10000) % 10
|
|
dn ((\1) / 1000) % 10, ((\1) / 100) % 10
|
|
dn ((\1) / 10) % 10, (\1) % 10
|
|
ENDM
|
|
|
|
coins equs "bcd2"
|
|
money equs "bcd3"
|
|
|
|
;\1 = r
|
|
;\2 = X
|
|
;\3 = Y
|
|
coord: MACRO
|
|
ld \1, wTileMap + 20 * \3 + \2
|
|
ENDM
|
|
|
|
;\1 = X
|
|
;\2 = Y
|
|
aCoord: MACRO
|
|
ld a, [wTileMap + 20 * \2 + \1]
|
|
ENDM
|
|
|
|
;\1 = X
|
|
;\2 = Y
|
|
Coorda: MACRO
|
|
ld [wTileMap + 20 * \2 + \1], a
|
|
ENDM
|
|
|
|
;\1 = X
|
|
;\2 = Y
|
|
dwCoord: MACRO
|
|
dw wTileMap + 20 * \2 + \1
|
|
ENDM
|
|
|
|
;\1 = Map Width
|
|
;\2 = Rows above (Y-blocks)
|
|
;\3 = X movement (X-blocks)
|
|
EVENT_DISP: MACRO
|
|
dw (wOverworldMap + 7 + (\1) + ((\1) + 6) * ((\2) >> 1) + ((\3) >> 1)) ; Ev.Disp
|
|
db \2,\3 ;Y,X
|
|
ENDM
|
|
|
|
FLYWARP_DATA: MACRO
|
|
EVENT_DISP \1,\2,\3
|
|
db ((\2) & $01) ;sub-block Y
|
|
db ((\3) & $01) ;sub-block X
|
|
ENDM
|
|
|
|
; external map entry macro
|
|
EMAP: MACRO ; emap x-coordinate,y-coordinate,textpointer
|
|
; the appearance of towns and routes in the town map, indexed by map id
|
|
; nybble: y-coordinate
|
|
; nybble: x-coordinate
|
|
; word : pointer to map name
|
|
db (\1 + (\2 << 4))
|
|
dw \3
|
|
ENDM
|
|
|
|
; internal map entry macro
|
|
IMAP: MACRO ; imap mapid_less_than,x-coordinate,y-coordinate,textpointer
|
|
; the appearance of buildings and dungeons in the town map
|
|
; byte : maximum map id subject to this rule
|
|
; nybble: y-coordinate
|
|
; nybble: x-coordinate
|
|
; word : pointer to map name
|
|
db \1 + 1
|
|
db \2 + \3 << 4
|
|
dw \4
|
|
ENDM
|
|
|
|
; tilesets' headers macro
|
|
tileset: MACRO
|
|
db BANK(\2) ; BANK(GFX)
|
|
dw \1, \2, \3 ; Block, GFX, Coll
|
|
db \4, \5, \6 ; counter tiles
|
|
db \7 ; grass tile
|
|
db \8 ; permission (indoor, cave, outdoor)
|
|
ENDM
|
|
|
|
INDOOR EQU 0
|
|
CAVE EQU 1
|
|
OUTDOOR EQU 2
|
|
|
|
; macro for two nibbles
|
|
dn: MACRO
|
|
db (\1 << 4 | \2)
|
|
ENDM
|
|
|
|
; macro for putting a byte then a word
|
|
dbw: MACRO
|
|
db \1
|
|
dw \2
|
|
ENDM
|
|
|
|
; data format macros
|
|
RGB: MACRO
|
|
dw (\3 << 10 | \2 << 5 | \1)
|
|
ENDM
|
|
|
|
; text macros
|
|
TX_NUM: MACRO
|
|
; print a big-endian decimal number.
|
|
; \1: address to read from
|
|
; \2: number of bytes to read
|
|
; \3: number of digits to display
|
|
db $09
|
|
dw \1
|
|
db \2 << 4 | \3
|
|
ENDM
|
|
|
|
TX_FAR: MACRO
|
|
db $17
|
|
dw \1
|
|
db BANK(\1)
|
|
ENDM
|
|
|
|
; text engine command $1
|
|
TX_RAM: MACRO
|
|
; prints text to screen
|
|
; \1: RAM address to read from
|
|
db $1
|
|
dw \1
|
|
ENDM
|
|
|
|
TX_BCD: MACRO
|
|
db $2
|
|
dw \1
|
|
db \2
|
|
ENDM
|
|
|
|
TX_ASM: MACRO
|
|
db $08
|
|
ENDM
|
|
|
|
; Predef macro.
|
|
add_predef: MACRO
|
|
\1Predef::
|
|
db BANK(\1)
|
|
dw \1
|
|
ENDM
|
|
|
|
predef_id: MACRO
|
|
ld a, (\1Predef - PredefPointers) / 3
|
|
ENDM
|
|
|
|
predef: MACRO
|
|
predef_id \1
|
|
call Predef
|
|
ENDM
|
|
|
|
predef_jump: MACRO
|
|
predef_id \1
|
|
jp Predef
|
|
ENDM
|
|
|
|
|
|
add_tx_pre: MACRO
|
|
\1_id:: dw \1
|
|
ENDM
|
|
|
|
tx_pre_id: MACRO
|
|
ld a, (\1_id - TextPredefs) / 2 + 1
|
|
ENDM
|
|
|
|
tx_pre: MACRO
|
|
tx_pre_id \1
|
|
call PrintPredefTextID
|
|
ENDM
|
|
|
|
tx_pre_jump: MACRO
|
|
tx_pre_id \1
|
|
jp PrintPredefTextID
|
|
ENDM
|
|
|
|
WALK EQU $FE
|
|
STAY EQU $FF
|
|
|
|
DOWN EQU $D0
|
|
UP EQU $D1
|
|
LEFT EQU $D2
|
|
RIGHT EQU $D3
|
|
NONE EQU $FF
|
|
|
|
;\1 sprite id
|
|
;\2 x position
|
|
;\3 y position
|
|
;\4 movement (WALK/STAY)
|
|
;\5 range or direction
|
|
;\6 text id
|
|
;\7 items only: item id
|
|
;\7 trainers only: trainer class/pokemon id
|
|
;\8 trainers only: trainer number/pokemon level
|
|
object: MACRO
|
|
db \1
|
|
db \3 + 4
|
|
db \2 + 4
|
|
db \4
|
|
db \5
|
|
IF (_NARG > 7)
|
|
db TRAINER | \6
|
|
db \7
|
|
db \8
|
|
ELSE
|
|
IF (_NARG > 6)
|
|
db ITEM | \6
|
|
db \7
|
|
ELSE
|
|
db \6
|
|
ENDC
|
|
ENDC
|
|
ENDM
|
|
|
|
|
|
;1_channel EQU $00
|
|
;2_channels EQU $40
|
|
;3_channels EQU $80
|
|
;4_channels EQU $C0
|
|
|
|
CH0 EQU 0
|
|
CH1 EQU 1
|
|
CH2 EQU 2
|
|
CH3 EQU 3
|
|
CH4 EQU 4
|
|
CH5 EQU 5
|
|
CH6 EQU 6
|
|
CH7 EQU 7
|
|
|
|
unknownsfx0x10: MACRO
|
|
db $10
|
|
db \1
|
|
ENDM
|
|
|
|
unknownsfx0x20: MACRO
|
|
db $20 | \1
|
|
db \2
|
|
db \3
|
|
db \4
|
|
ENDM
|
|
|
|
unknownnoise0x20: MACRO
|
|
db $20 | \1
|
|
db \2
|
|
db \3
|
|
ENDM
|
|
|
|
;format: pitch length (in 16ths)
|
|
C_: MACRO
|
|
db $00 | (\1 - 1)
|
|
ENDM
|
|
|
|
C#: MACRO
|
|
db $10 | (\1 - 1)
|
|
ENDM
|
|
|
|
D_: MACRO
|
|
db $20 | (\1 - 1)
|
|
ENDM
|
|
|
|
D#: MACRO
|
|
db $30 | (\1 - 1)
|
|
ENDM
|
|
|
|
E_: MACRO
|
|
db $40 | (\1 - 1)
|
|
ENDM
|
|
|
|
F_: MACRO
|
|
db $50 | (\1 - 1)
|
|
ENDM
|
|
|
|
F#: MACRO
|
|
db $60 | (\1 - 1)
|
|
ENDM
|
|
|
|
G_: MACRO
|
|
db $70 | (\1 - 1)
|
|
ENDM
|
|
|
|
G#: MACRO
|
|
db $80 | (\1 - 1)
|
|
ENDM
|
|
|
|
A_: MACRO
|
|
db $90 | (\1 - 1)
|
|
ENDM
|
|
|
|
A#: MACRO
|
|
db $A0 | (\1 - 1)
|
|
ENDM
|
|
|
|
B_: MACRO
|
|
db $B0 | (\1 - 1)
|
|
ENDM
|
|
|
|
;format: instrument length (in 16ths)
|
|
snare1: MACRO
|
|
db $B0 | (\1 - 1)
|
|
db $01
|
|
ENDM
|
|
|
|
snare2: MACRO
|
|
db $B0 | (\1 - 1)
|
|
db $02
|
|
ENDM
|
|
|
|
snare3: MACRO
|
|
db $B0 | (\1 - 1)
|
|
db $03
|
|
ENDM
|
|
|
|
snare4: MACRO
|
|
db $B0 | (\1 - 1)
|
|
db $04
|
|
ENDM
|
|
|
|
snare5: MACRO
|
|
db $B0 | (\1 - 1)
|
|
db $05
|
|
ENDM
|
|
|
|
triangle1: MACRO
|
|
db $B0 | (\1 - 1)
|
|
db $06
|
|
ENDM
|
|
|
|
triangle2: MACRO
|
|
db $B0 | (\1 - 1)
|
|
db $07
|
|
ENDM
|
|
|
|
snare6: MACRO
|
|
db $B0 | (\1 - 1)
|
|
db $08
|
|
ENDM
|
|
|
|
snare7: MACRO
|
|
db $B0 | (\1 - 1)
|
|
db $09
|
|
ENDM
|
|
|
|
snare8: MACRO
|
|
db $B0 | (\1 - 1)
|
|
db $0A
|
|
ENDM
|
|
|
|
snare9: MACRO
|
|
db $B0 | (\1 - 1)
|
|
db $0B
|
|
ENDM
|
|
|
|
cymbal1: MACRO
|
|
db $B0 | (\1 - 1)
|
|
db $0C
|
|
ENDM
|
|
|
|
cymbal2: MACRO
|
|
db $B0 | (\1 - 1)
|
|
db $0D
|
|
ENDM
|
|
|
|
cymbal3: MACRO
|
|
db $B0 | (\1 - 1)
|
|
db $0E
|
|
ENDM
|
|
|
|
mutedsnare1: MACRO
|
|
db $B0 | (\1 - 1)
|
|
db $0F
|
|
ENDM
|
|
|
|
triangle3: MACRO
|
|
db $B0 | (\1 - 1)
|
|
db $10
|
|
ENDM
|
|
|
|
mutedsnare2: MACRO
|
|
db $B0 | (\1 - 1)
|
|
db $11
|
|
ENDM
|
|
|
|
mutedsnare3: MACRO
|
|
db $B0 | (\1 - 1)
|
|
db $12
|
|
ENDM
|
|
|
|
mutedsnare4: MACRO
|
|
db $B0 | (\1 - 1)
|
|
db $13
|
|
ENDM
|
|
|
|
;format: rest length (in 16ths)
|
|
rest: MACRO
|
|
db $C0 | (\1 - 1)
|
|
ENDM
|
|
|
|
; format: notetype speed, volume, fade
|
|
notetype: MACRO
|
|
db $D0 | \1
|
|
db (\2 << 4) | \3
|
|
ENDM
|
|
|
|
dspeed: MACRO
|
|
db $D0 | \1
|
|
ENDM
|
|
|
|
octave: MACRO
|
|
db $E8 - \1
|
|
ENDM
|
|
|
|
toggleperfectpitch: MACRO
|
|
db $E8
|
|
ENDM
|
|
|
|
;format: vibrato delay, rate, depth
|
|
vibrato: MACRO
|
|
db $EA
|
|
db \1
|
|
db (\2 << 4) | \3
|
|
ENDM
|
|
|
|
pitchbend: MACRO
|
|
db $EB
|
|
db \1
|
|
db \2
|
|
ENDM
|
|
|
|
duty: MACRO
|
|
db $EC
|
|
db \1
|
|
ENDM
|
|
|
|
tempo: MACRO
|
|
db $ED
|
|
db \1 / $100
|
|
db \1 % $100
|
|
ENDM
|
|
|
|
stereopanning: MACRO
|
|
db $EE
|
|
db \1
|
|
ENDM
|
|
|
|
volume: MACRO
|
|
db $F0
|
|
db (\1 << 4) | \2
|
|
ENDM
|
|
|
|
executemusic: MACRO
|
|
db $F8
|
|
ENDM
|
|
|
|
dutycycle: MACRO
|
|
db $FC
|
|
db \1
|
|
ENDM
|
|
|
|
;format: callchannel address
|
|
callchannel: MACRO
|
|
db $FD
|
|
dw \1
|
|
ENDM
|
|
|
|
;format: loopchannel count, address
|
|
loopchannel: MACRO
|
|
db $FE
|
|
db \1
|
|
dw \2
|
|
ENDM
|
|
|
|
endchannel: MACRO
|
|
db $FF
|
|
ENDM
|
|
|
|
|
|
;\1 (byte) = current map id
|
|
;\2 (byte) = connected map id
|
|
;\3 (byte) = x movement of connection strip
|
|
;\4 (byte) = connection strip offset
|
|
;\5 (word) = connected map blocks pointer
|
|
NORTH_MAP_CONNECTION: MACRO
|
|
db \2 ; map id
|
|
dw \5 + (\2_WIDTH * (\2_HEIGHT - 3)) + \4; "Connection Strip" location
|
|
dw wOverworldMap + 3 + \3 ; current map position
|
|
IF (\1_WIDTH < \2_WIDTH)
|
|
db \1_WIDTH - \3 + 3 ; width of connection strip
|
|
ELSE
|
|
db \2_WIDTH - \4 ; width of connection strip
|
|
ENDC
|
|
db \2_WIDTH ; map width
|
|
db (\2_HEIGHT * 2) - 1 ; y alignment (y coordinate of player when entering map)
|
|
db (\3 - \4) * -2 ; x alignment (x coordinate of player when entering map)
|
|
dw wOverworldMap + 1 + (\2_HEIGHT * (\2_WIDTH + 6)) ; window (position of the upper left block after entering the map)
|
|
ENDM
|
|
|
|
;\1 (byte) = current map id
|
|
;\2 (byte) = connected map id
|
|
;\3 (byte) = x movement of connection strip
|
|
;\4 (byte) = connection strip offset
|
|
;\5 (word) = connected map blocks pointer
|
|
;\6 (flag) = add 3 to width of connection strip (why?)
|
|
SOUTH_MAP_CONNECTION: MACRO
|
|
db \2 ; map id
|
|
dw \5 + \4 ; "Conection Strip" location
|
|
dw wOverworldMap + 3 + (\1_HEIGHT + 3) * (\1_WIDTH + 6) + \3 ; current map position
|
|
IF (\1_WIDTH < \2_WIDTH)
|
|
IF (_NARG > 5)
|
|
db \1_WIDTH - \3 + 3 ; width of connection strip
|
|
ELSE
|
|
db \1_WIDTH - \3 ; width of connection strip
|
|
ENDC
|
|
ELSE
|
|
db \2_WIDTH - \4 ; width of connection strip
|
|
ENDC
|
|
db \2_WIDTH ; map width
|
|
db 0 ; y alignment (y coordinate of player when entering map)
|
|
db (\3 - \4) * -2 ; x alignment (x coordinate of player when entering map)
|
|
dw wOverworldMap + 7 + \2_WIDTH ; window (position of the upper left block after entering the map)
|
|
ENDM
|
|
|
|
;\1 (byte) = current map id
|
|
;\2 (byte) = connected map id
|
|
;\3 (byte) = y movement of connection strip
|
|
;\4 (byte) = connection strip offset
|
|
;\5 (word) = connected map blocks pointer
|
|
WEST_MAP_CONNECTION: MACRO
|
|
db \2 ; map id
|
|
dw \5 + (\2_WIDTH * \4) + \2_WIDTH - 3 ; "Connection Strip" location
|
|
dw wOverworldMap + (\1_WIDTH + 6) * (\3 + 3) ; current map position
|
|
IF (\1_HEIGHT < \2_HEIGHT)
|
|
db \1_HEIGHT - \3 + 3 ; height of connection strip
|
|
ELSE
|
|
db \2_HEIGHT - \4 ; height of connection strip
|
|
ENDC
|
|
db \2_WIDTH ; map width
|
|
db (\3 - \4) * -2 ; y alignment
|
|
db (\2_WIDTH * 2) - 1 ; x alignment
|
|
dw wOverworldMap + 6 + (2 * \2_WIDTH) ; window (position of the upper left block after entring the map)
|
|
ENDM
|
|
|
|
;\1 (byte) = current map id
|
|
;\2 (byte) = connected map id
|
|
;\3 (byte) = y movement of connection strip
|
|
;\4 (byte) = connection strip offset
|
|
;\5 (word) = connected map blocks pointer
|
|
;\6 (flag) = add 3 to height of connection strip (why?)
|
|
EAST_MAP_CONNECTION: MACRO
|
|
db \2 ; map id
|
|
dw \5 + (\2_WIDTH * \4) ; "Connection Strip" location
|
|
dw wOverworldMap - 3 + (\1_WIDTH + 6) * (\3 + 4) ; current map position
|
|
IF (\1_HEIGHT < \2_HEIGHT)
|
|
IF (_NARG > 5)
|
|
db \1_HEIGHT - \3 + 3 ; height of connection strip
|
|
ELSE
|
|
db \1_HEIGHT - \3 ; height of connection strip
|
|
ENDC
|
|
ELSE
|
|
db \2_HEIGHT - \4 ; height of connection strip
|
|
ENDC
|
|
db \2_WIDTH ; map width
|
|
db (\3 - \4) * -2 ; y alignment
|
|
db 0 ; x alignment
|
|
dw wOverworldMap + 7 + \2_WIDTH ; window (position of the upper left block after entering the map)
|
|
ENDM
|